diff mbox series

[v7,1/5] dt-bindings: thermal: tsens: Add ipq8074 compatible

Message ID 20220818220245.338396-1-robimarko@gmail.com
State Not Applicable, archived
Headers show
Series [v7,1/5] dt-bindings: thermal: tsens: Add ipq8074 compatible | expand

Checks

Context Check Description
robh/checkpatch success
robh/patch-applied success
robh/dtbs-check warning build log
robh/dt-meta-schema success

Commit Message

Robert Marko Aug. 18, 2022, 10:02 p.m. UTC
Qualcomm IPQ8074 has tsens v2.3.0 block, though unlike existing v2 IP it
only uses one IRQ, so tsens v2 compatible cannot be used as the fallback.

We also have to make sure that correct interrupts are set according to
compatibles, so populate interrupt information per compatibles.

Signed-off-by: Robert Marko <robimarko@gmail.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
Changes in v4:
* Add the forgotten Reviewed-by tag from Krzysztof

Changes in v3:
* Remove implied min/maxItem properties as pointed by Rob

Changes in v2:
* No need for a list in compatible check
* Specify minItems and maxItems for interrupt and interrupt-names
---
 .../bindings/thermal/qcom-tsens.yaml          | 76 ++++++++++++++++---
 1 file changed, 65 insertions(+), 11 deletions(-)

Comments

Daniel Lezcano Aug. 18, 2022, 10:49 p.m. UTC | #1
On 19/08/2022 00:02, Robert Marko wrote:
> 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>

I'll pick the patches 1-4 as soon as Bjorn gives its blessing for this one
Robert Marko Sept. 27, 2022, 7:34 a.m. UTC | #2
On Fri, 19 Aug 2022 at 00:49, Daniel Lezcano <daniel.lezcano@linaro.org> wrote:
>
> On 19/08/2022 00:02, Robert Marko wrote:
> > 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>
>
> I'll pick the patches 1-4 as soon as Bjorn gives its blessing for this one

Sounds good to me,

Bjorn can you please take a look?

Regards,
Robert
>
>
> --
> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
>
> Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
> <http://twitter.com/#!/linaroorg> Twitter |
> <http://www.linaro.org/linaro-blog/> Blog
Robert Marko Sept. 27, 2022, 8:23 a.m. UTC | #3
On Fri, 19 Aug 2022 at 00:49, Daniel Lezcano <daniel.lezcano@linaro.org> wrote:
>
> On 19/08/2022 00:02, Robert Marko wrote:
> > 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>
>
> I'll pick the patches 1-4 as soon as Bjorn gives its blessing for this one
Resending with Bjorns new email as Linaro one bounces.

Sounds good to me,

Bjorn can you please take a look?

Regards,
Robert
>
>
> --
> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
>
> Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
> <http://twitter.com/#!/linaroorg> Twitter |
> <http://www.linaro.org/linaro-blog/> Blog
Bjorn Andersson Oct. 17, 2022, 7:01 p.m. UTC | #4
On Fri, Aug 19, 2022 at 12:02:42AM +0200, Robert Marko wrote:
> 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>
> ---
> Changes in v7:
> * Rebase to apply on next-20220818
> 
> Changes in v6:
> * Check critical IRQ handler return, simplify up/low return
> ---
>  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(-)
> 
> diff --git a/drivers/thermal/qcom/tsens-8960.c b/drivers/thermal/qcom/tsens-8960.c
> index 67c1748cdf73..ee584e5b07e5 100644
> --- 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,
> diff --git a/drivers/thermal/qcom/tsens-v0_1.c b/drivers/thermal/qcom/tsens-v0_1.c
> index f136cb350238..6effb822bf3c 100644
> --- a/drivers/thermal/qcom/tsens-v0_1.c
> +++ b/drivers/thermal/qcom/tsens-v0_1.c
> @@ -539,6 +539,7 @@ static int calibrate_9607(struct tsens_priv *priv)
>  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,
> diff --git a/drivers/thermal/qcom/tsens-v1.c b/drivers/thermal/qcom/tsens-v1.c
> index 573e261ccca7..a4f561a6e582 100644
> --- a/drivers/thermal/qcom/tsens-v1.c
> +++ b/drivers/thermal/qcom/tsens-v1.c
> @@ -302,6 +302,7 @@ static int calibrate_8976(struct tsens_priv *priv)
>  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,
> diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c
> index b293ed32174b..129cdb247381 100644
> --- 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,
> diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
> index b1b10005fb28..816769af8813 100644
> --- a/drivers/thermal/qcom/tsens.c
> +++ b/drivers/thermal/qcom/tsens.c
> @@ -532,6 +532,27 @@ static irqreturn_t tsens_irq_thread(int irq, void *data)
>  	return IRQ_HANDLED;
>  }
>  
> +/**
> + * tsens_combined_irq_thread - Threaded interrupt handler for combined interrupts

This should have () after the function name. Perhaps Daniel could add
that as he picks the patch?

Reviewed-by: Bjorn Andersson <andersson@kernel.org>

Regards,
Bjorn

> + * @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;
> @@ -1071,13 +1092,18 @@ static int tsens_register(struct tsens_priv *priv)
>  				   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;
>  }
> diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h
> index ba05c8233356..1678c5e9e60b 100644
> --- a/drivers/thermal/qcom/tsens.h
> +++ b/drivers/thermal/qcom/tsens.h
> @@ -493,6 +493,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?
> @@ -502,6 +503,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;
> -- 
> 2.37.2
>
Bjorn Andersson Oct. 18, 2022, 3:14 a.m. UTC | #5
On Fri, 19 Aug 2022 00:02:41 +0200, Robert Marko wrote:
> Qualcomm IPQ8074 has tsens v2.3.0 block, though unlike existing v2 IP it
> only uses one IRQ, so tsens v2 compatible cannot be used as the fallback.
> 
> We also have to make sure that correct interrupts are set according to
> compatibles, so populate interrupt information per compatibles.
> 
> 
> [...]

Applied, thanks!

[5/5] arm64: dts: ipq8074: add thermal nodes
      commit: 887ac08946cc0f2a2b915140fcf8d4365ca9393d

Best regards,
Daniel Lezcano Oct. 21, 2022, 4:52 p.m. UTC | #6
On 17/10/2022 21:01, Bjorn Andersson wrote:

[ ... ]

> 
> This should have () after the function name. Perhaps Daniel could add
> that as he picks the patch?

Applied and parenthesis added

> Reviewed-by: Bjorn Andersson <andersson@kernel.org>
> 
> Regards,
> Bjorn
[ ... ]
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
index 038d81338fcf..fee2b6281417 100644
--- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
+++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
@@ -59,6 +59,10 @@  properties:
               - qcom,sm8350-tsens
           - const: qcom,tsens-v2
 
+      - description: v2 of TSENS with combined interrupt
+        enum:
+          - qcom,ipq8074-tsens
+
   reg:
     items:
       - description: TM registers
@@ -66,15 +70,11 @@  properties:
 
   interrupts:
     minItems: 1
-    items:
-      - description: Combined interrupt if upper or lower threshold crossed
-      - description: Interrupt if critical threshold crossed
+    maxItems: 2
 
   interrupt-names:
     minItems: 1
-    items:
-      - const: uplow
-      - const: critical
+    maxItems: 2
 
   nvmem-cells:
     minItems: 1
@@ -128,22 +128,61 @@  allOf:
     then:
       properties:
         interrupts:
-          maxItems: 1
+          items:
+            - description: Combined interrupt if upper or lower threshold crossed
         interrupt-names:
-          maxItems: 1
+          items:
+            - const: uplow
 
-    else:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,msm8953-tsens
+              - qcom,msm8996-tsens
+              - qcom,msm8998-tsens
+              - qcom,sc7180-tsens
+              - qcom,sc7280-tsens
+              - qcom,sc8180x-tsens
+              - qcom,sdm630-tsens
+              - qcom,sdm845-tsens
+              - qcom,sm8150-tsens
+              - qcom,sm8250-tsens
+              - qcom,sm8350-tsens
+              - qcom,tsens-v2
+    then:
+      properties:
+        interrupts:
+          items:
+            - description: Combined interrupt if upper or lower threshold crossed
+            - description: Interrupt if critical threshold crossed
+        interrupt-names:
+          items:
+            - const: uplow
+            - const: critical
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,ipq8074-tsens
+    then:
       properties:
         interrupts:
-          minItems: 2
+          items:
+            - description: Combined interrupt if upper, lower or critical thresholds crossed
         interrupt-names:
-          minItems: 2
+          items:
+            - const: combined
 
   - if:
       properties:
         compatible:
           contains:
             enum:
+              - qcom,ipq8074-tsens
               - qcom,tsens-v0_1
               - qcom,tsens-v1
               - qcom,tsens-v2
@@ -226,4 +265,19 @@  examples:
            #qcom,sensors = <13>;
            #thermal-sensor-cells = <1>;
     };
+
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    // Example 4 (for any IPQ8074 based SoC-s):
+    tsens4: thermal-sensor@4a9000 {
+           compatible = "qcom,ipq8074-tsens";
+           reg = <0x4a9000 0x1000>,
+                 <0x4a8000 0x1000>;
+
+           interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
+           interrupt-names = "combined";
+
+           #qcom,sensors = <16>;
+           #thermal-sensor-cells = <1>;
+    };
 ...