mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From e593e834fe8ba9bf314d8215ac05d8787f81efda Mon Sep 17 00:00:00 2001
 | |
| From: Robert Marko <robimarko@gmail.com>
 | |
| Date: Fri, 19 Aug 2022 00:02:42 +0200
 | |
| Subject: [PATCH] thermal/drivers/tsens: Add support for combined interrupt
 | |
| 
 | |
| Despite using tsens v2.3 IP, IPQ8074 and IPQ6018 only have one IRQ for
 | |
| signaling both up/low and critical trips.
 | |
| 
 | |
| Signed-off-by: Robert Marko <robimarko@gmail.com>
 | |
| Reviewed-by: Bjorn Andersson <andersson@kernel.org>
 | |
| Link: https://lore.kernel.org/r/20220818220245.338396-2-robimarko@gmail.com
 | |
| Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
 | |
| ---
 | |
|  drivers/thermal/qcom/tsens-8960.c |  1 +
 | |
|  drivers/thermal/qcom/tsens-v0_1.c |  1 +
 | |
|  drivers/thermal/qcom/tsens-v1.c   |  1 +
 | |
|  drivers/thermal/qcom/tsens-v2.c   |  1 +
 | |
|  drivers/thermal/qcom/tsens.c      | 38 ++++++++++++++++++++++++++-----
 | |
|  drivers/thermal/qcom/tsens.h      |  2 ++
 | |
|  6 files changed, 38 insertions(+), 6 deletions(-)
 | |
| 
 | |
| --- a/drivers/thermal/qcom/tsens-8960.c
 | |
| +++ b/drivers/thermal/qcom/tsens-8960.c
 | |
| @@ -269,6 +269,7 @@ static const struct tsens_ops ops_8960 =
 | |
|  static struct tsens_features tsens_8960_feat = {
 | |
|  	.ver_major	= VER_0,
 | |
|  	.crit_int	= 0,
 | |
| +	.combo_int	= 0,
 | |
|  	.adc		= 1,
 | |
|  	.srot_split	= 0,
 | |
|  	.max_sensors	= 11,
 | |
| --- a/drivers/thermal/qcom/tsens-v0_1.c
 | |
| +++ b/drivers/thermal/qcom/tsens-v0_1.c
 | |
| @@ -549,6 +549,7 @@ static int __init init_8939(struct tsens
 | |
|  static struct tsens_features tsens_v0_1_feat = {
 | |
|  	.ver_major	= VER_0_1,
 | |
|  	.crit_int	= 0,
 | |
| +	.combo_int	= 0,
 | |
|  	.adc		= 1,
 | |
|  	.srot_split	= 1,
 | |
|  	.max_sensors	= 11,
 | |
| --- a/drivers/thermal/qcom/tsens-v1.c
 | |
| +++ b/drivers/thermal/qcom/tsens-v1.c
 | |
| @@ -273,6 +273,7 @@ static int calibrate_8976(struct tsens_p
 | |
|  static struct tsens_features tsens_v1_feat = {
 | |
|  	.ver_major	= VER_1_X,
 | |
|  	.crit_int	= 0,
 | |
| +	.combo_int	= 0,
 | |
|  	.adc		= 1,
 | |
|  	.srot_split	= 1,
 | |
|  	.max_sensors	= 11,
 | |
| --- a/drivers/thermal/qcom/tsens-v2.c
 | |
| +++ b/drivers/thermal/qcom/tsens-v2.c
 | |
| @@ -31,6 +31,7 @@
 | |
|  static struct tsens_features tsens_v2_feat = {
 | |
|  	.ver_major	= VER_2_X,
 | |
|  	.crit_int	= 1,
 | |
| +	.combo_int	= 0,
 | |
|  	.adc		= 0,
 | |
|  	.srot_split	= 1,
 | |
|  	.max_sensors	= 16,
 | |
| --- a/drivers/thermal/qcom/tsens.c
 | |
| +++ b/drivers/thermal/qcom/tsens.c
 | |
| @@ -531,6 +531,27 @@ static irqreturn_t tsens_irq_thread(int
 | |
|  	return IRQ_HANDLED;
 | |
|  }
 | |
|  
 | |
| +/**
 | |
| + * tsens_combined_irq_thread() - Threaded interrupt handler for combined interrupts
 | |
| + * @irq: irq number
 | |
| + * @data: tsens controller private data
 | |
| + *
 | |
| + * Handle the combined interrupt as if it were 2 separate interrupts, so call the
 | |
| + * critical handler first and then the up/low one.
 | |
| + *
 | |
| + * Return: IRQ_HANDLED
 | |
| + */
 | |
| +static irqreturn_t tsens_combined_irq_thread(int irq, void *data)
 | |
| +{
 | |
| +	irqreturn_t ret;
 | |
| +
 | |
| +	ret = tsens_critical_irq_thread(irq, data);
 | |
| +	if (ret != IRQ_HANDLED)
 | |
| +		return ret;
 | |
| +
 | |
| +	return tsens_irq_thread(irq, data);
 | |
| +}
 | |
| +
 | |
|  static int tsens_set_trips(struct thermal_zone_device *tz, int low, int high)
 | |
|  {
 | |
|  	struct tsens_sensor *s = tz->devdata;
 | |
| @@ -1081,13 +1102,18 @@ static int tsens_register(struct tsens_p
 | |
|  				   tsens_mC_to_hw(priv->sensor, 0));
 | |
|  	}
 | |
|  
 | |
| -	ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
 | |
| -	if (ret < 0)
 | |
| -		return ret;
 | |
| +	if (priv->feat->combo_int) {
 | |
| +		ret = tsens_register_irq(priv, "combined",
 | |
| +					 tsens_combined_irq_thread);
 | |
| +	} else {
 | |
| +		ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
 | |
| +		if (ret < 0)
 | |
| +			return ret;
 | |
|  
 | |
| -	if (priv->feat->crit_int)
 | |
| -		ret = tsens_register_irq(priv, "critical",
 | |
| -					 tsens_critical_irq_thread);
 | |
| +		if (priv->feat->crit_int)
 | |
| +			ret = tsens_register_irq(priv, "critical",
 | |
| +						 tsens_critical_irq_thread);
 | |
| +	}
 | |
|  
 | |
|  	return ret;
 | |
|  }
 | |
| --- a/drivers/thermal/qcom/tsens.h
 | |
| +++ b/drivers/thermal/qcom/tsens.h
 | |
| @@ -495,6 +495,7 @@ enum regfield_ids {
 | |
|   * struct tsens_features - Features supported by the IP
 | |
|   * @ver_major: Major number of IP version
 | |
|   * @crit_int: does the IP support critical interrupts?
 | |
| + * @combo_int: does the IP use one IRQ for up, low and critical thresholds?
 | |
|   * @adc:      do the sensors only output adc code (instead of temperature)?
 | |
|   * @srot_split: does the IP neatly splits the register space into SROT and TM,
 | |
|   *              with SROT only being available to secure boot firmware?
 | |
| @@ -504,6 +505,7 @@ enum regfield_ids {
 | |
|  struct tsens_features {
 | |
|  	unsigned int ver_major;
 | |
|  	unsigned int crit_int:1;
 | |
| +	unsigned int combo_int:1;
 | |
|  	unsigned int adc:1;
 | |
|  	unsigned int srot_split:1;
 | |
|  	unsigned int has_watchdog:1;
 |