linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] Add support for ipq8064 tsens
@ 2020-07-09 21:51 Ansuel Smith
  2020-07-09 21:51 ` [PATCH 1/6] drivers: thermal: tsens: load regmap from phandle for 8960 Ansuel Smith
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel

Ipq8064 SoCs tsens driver is based on 8960 tsens driver. This patchset expand
the 8960 unused driver with interrupt support and set_trip point.
Ipq8064 needs to registed with a syscon phandle as the tsens regs on
this platform are shared with the gcc controller.

Ansuel Smith (6):
  drivers: thermal: tsens: load regmap from phandle for 8960
  drivers: thermal: tsens: add ipq8064 support
  dt-bindings: thermal: tsens: document ipq8064 bindings
  drivers: thermal: tsens: add interrupt support for 9860 driver
  drivers: thermal: tsens: add support for custom set_trip function
  drivers: thermal: tsens: add set_trip support for 8960

 .../bindings/thermal/qcom-tsens.yaml          |  51 +++-
 drivers/thermal/qcom/tsens-8960.c             | 283 +++++++++++++++++-
 drivers/thermal/qcom/tsens.c                  |   7 +
 drivers/thermal/qcom/tsens.h                  |   3 +
 4 files changed, 321 insertions(+), 23 deletions(-)

-- 
2.27.0


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/6] drivers: thermal: tsens: load regmap from phandle for 8960
  2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
@ 2020-07-09 21:51 ` Ansuel Smith
  2020-07-09 21:51 ` [PATCH 2/6] drivers: thermal: tsens: add ipq8064 support Ansuel Smith
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-pm, linux-arm-msm, devicetree,
	linux-kernel

Devices based on 8060 tsens driver (ipq8064) use the reg of the gcc
driver. Permit to load the regmap from a syscon phandle instead of fail
as the reg are already used by another driver.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/thermal/qcom/tsens-8960.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/qcom/tsens-8960.c b/drivers/thermal/qcom/tsens-8960.c
index 2a28a5af209e..890baf1b5542 100644
--- a/drivers/thermal/qcom/tsens-8960.c
+++ b/drivers/thermal/qcom/tsens-8960.c
@@ -7,6 +7,7 @@
 #include <linux/delay.h>
 #include <linux/bitops.h>
 #include <linux/regmap.h>
+#include <linux/mfd/syscon.h>
 #include <linux/thermal.h>
 #include "tsens.h"
 
@@ -168,8 +169,12 @@ static int init_8960(struct tsens_priv *priv)
 	u32 reg_cntl;
 
 	priv->tm_map = dev_get_regmap(priv->dev, NULL);
-	if (!priv->tm_map)
-		return -ENODEV;
+	if (!priv->tm_map) {
+		priv->tm_map = syscon_regmap_lookup_by_phandle(
+			priv->dev->of_node, "regmap");
+		if (IS_ERR(priv->tm_map))
+			return -ENODEV;
+	}
 
 	/*
 	 * The status registers for each sensor are discontiguous
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/6] drivers: thermal: tsens: add ipq8064 support
  2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
  2020-07-09 21:51 ` [PATCH 1/6] drivers: thermal: tsens: load regmap from phandle for 8960 Ansuel Smith
@ 2020-07-09 21:51 ` Ansuel Smith
  2020-07-09 21:51 ` [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings Ansuel Smith
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-pm, linux-arm-msm, devicetree,
	linux-kernel

Ipq8064 SoCs based use the same 8960 driver.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/thermal/qcom/tsens.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index 39c4462e38f6..2985a064a0d1 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -907,6 +907,9 @@ static const struct of_device_id tsens_table[] = {
 		.compatible = "qcom,msm8996-tsens",
 		.data = &data_8996,
 	}, {
+		.compatible = "qcom,ipq8064-tsens",
+		.data = &data_8060,
+	} {
 		.compatible = "qcom,tsens-v1",
 		.data = &data_tsens_v1,
 	}, {
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings
  2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
  2020-07-09 21:51 ` [PATCH 1/6] drivers: thermal: tsens: load regmap from phandle for 8960 Ansuel Smith
  2020-07-09 21:51 ` [PATCH 2/6] drivers: thermal: tsens: add ipq8064 support Ansuel Smith
@ 2020-07-09 21:51 ` Ansuel Smith
  2020-07-10 16:24   ` Rob Herring
  2020-07-10 16:26   ` Rob Herring
  2020-07-09 21:51 ` [PATCH 4/6] drivers: thermal: tsens: add interrupt support for 9860 driver Ansuel Smith
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-pm, linux-arm-msm, devicetree,
	linux-kernel

Document the use of regmap phandle for ipq8064 SoCs

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 .../bindings/thermal/qcom-tsens.yaml          | 51 ++++++++++++++++---
 1 file changed, 44 insertions(+), 7 deletions(-)

diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
index d7be931b42d2..5ceb5d720e16 100644
--- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
+++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
@@ -24,6 +24,7 @@ properties:
           - enum:
               - qcom,msm8916-tsens
               - qcom,msm8974-tsens
+              - qcom,ipq8064-tsens
           - const: qcom,tsens-v0_1
 
       - description: v1 of TSENS
@@ -47,6 +48,11 @@ properties:
       - description: TM registers
       - description: SROT registers
 
+  regmap:
+    description:
+      Phandle to the gcc. On ipq8064 SoCs gcc and tsense share the same regs.
+    $ref: /schemas/types.yaml#/definitions/phandle
+
   interrupts:
     minItems: 1
     items:
@@ -111,17 +117,48 @@ allOf:
         interrupt-names:
           minItems: 2
 
-required:
-  - compatible
-  - reg
-  - "#qcom,sensors"
-  - interrupts
-  - interrupt-names
-  - "#thermal-sensor-cells"
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,ipq8064-tsens
+    then:
+      required:
+        - compatible
+        - regmap
+        - "#qcom,sensors"
+        - interrupts
+        - interrupt-names
+        - "#thermal-sensor-cells"
+
+    else:
+      required:
+        - compatible
+        - reg
+        - "#qcom,sensors"
+        - interrupts
+        - interrupt-names
+        - "#thermal-sensor-cells"
 
 additionalProperties: false
 
 examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    // Example msm9860 based SoC (ipq8064):
+    tsens: thermal-sensor@900000 {
+           compatible = "qcom,ipq8064-tsens";
+           regmap = <&gcc>;
+
+           nvmem-cells = <&tsens_calib>, <&tsens_backup>;
+           nvmem-cell-names = "calib", "calib_backup";
+
+           interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
+
+           #thermal-sensor-cells = <1>;
+    };
+
   - |
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     // Example 1 (legacy: for pre v1 IP):
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/6] drivers: thermal: tsens: add interrupt support for 9860 driver
  2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
                   ` (2 preceding siblings ...)
  2020-07-09 21:51 ` [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings Ansuel Smith
@ 2020-07-09 21:51 ` Ansuel Smith
  2020-07-09 21:51 ` [PATCH 5/6] drivers: thermal: tsens: add support for custom set_trip function Ansuel Smith
  2020-07-09 21:51 ` [PATCH 6/6] drivers: thermal: tsens: add set_trip support for 8960 Ansuel Smith
  5 siblings, 0 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-arm-msm, linux-pm, devicetree,
	linux-kernel

Add interrupt support for 9860 tsens driver used to set thermal trip
point for the system.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/thermal/qcom/tsens-8960.c | 196 +++++++++++++++++++++++++++---
 drivers/thermal/qcom/tsens.h      |   1 +
 2 files changed, 183 insertions(+), 14 deletions(-)

diff --git a/drivers/thermal/qcom/tsens-8960.c b/drivers/thermal/qcom/tsens-8960.c
index 890baf1b5542..2dc670206896 100644
--- a/drivers/thermal/qcom/tsens-8960.c
+++ b/drivers/thermal/qcom/tsens-8960.c
@@ -8,6 +8,7 @@
 #include <linux/bitops.h>
 #include <linux/regmap.h>
 #include <linux/mfd/syscon.h>
+#include <linux/interrupt.h>
 #include <linux/thermal.h>
 #include "tsens.h"
 
@@ -27,7 +28,6 @@
 /* CNTL_ADDR bitmasks */
 #define EN			BIT(0)
 #define SW_RST			BIT(1)
-#define SENSOR0_EN		BIT(3)
 #define SLP_CLK_ENA		BIT(26)
 #define SLP_CLK_ENA_8660	BIT(24)
 #define MEASURE_PERIOD		1
@@ -41,14 +41,26 @@
 
 #define THRESHOLD_ADDR		0x3624
 /* THRESHOLD_ADDR bitmasks */
+#define THRESHOLD_MAX_CODE		0x20000
+#define THRESHOLD_MIN_CODE		0
 #define THRESHOLD_MAX_LIMIT_SHIFT	24
 #define THRESHOLD_MIN_LIMIT_SHIFT	16
 #define THRESHOLD_UPPER_LIMIT_SHIFT	8
 #define THRESHOLD_LOWER_LIMIT_SHIFT	0
+#define THRESHOLD_MAX_LIMIT_MASK	(THRESHOLD_MAX_CODE << \
+						THRESHOLD_MAX_LIMIT_SHIFT)
+#define THRESHOLD_MIN_LIMIT_MASK	(THRESHOLD_MAX_CODE << \
+						THRESHOLD_MIN_LIMIT_SHIFT)
+#define THRESHOLD_UPPER_LIMIT_MASK	(THRESHOLD_MAX_CODE << \
+						THRESHOLD_UPPER_LIMIT_SHIFT)
+#define THRESHOLD_LOWER_LIMIT_MASK	(THRESHOLD_MAX_CODE << \
+						THRESHOLD_LOWER_LIMIT_SHIFT)
 
 /* Initial temperature threshold values */
-#define LOWER_LIMIT_TH		0x50
-#define UPPER_LIMIT_TH		0xdf
+#define LOWER_LIMIT_TH_8960	0x50
+#define UPPER_LIMIT_TH_8960	0xdf
+#define LOWER_LIMIT_TH_8064	0x9d /* 95C */
+#define UPPER_LIMIT_TH_8064	0xa6 /* 105C */
 #define MIN_LIMIT_TH		0x0
 #define MAX_LIMIT_TH		0xff
 
@@ -57,6 +69,169 @@
 #define TRDY_MASK		BIT(7)
 #define TIMEOUT_US		100
 
+#define TSENS_EN		BIT(0)
+#define TSENS_SW_RST		BIT(1)
+#define TSENS_ADC_CLK_SEL	BIT(2)
+#define SENSOR0_EN		BIT(3)
+#define SENSOR1_EN		BIT(4)
+#define SENSOR2_EN		BIT(5)
+#define SENSOR3_EN		BIT(6)
+#define SENSOR4_EN		BIT(7)
+#define SENSORS_EN		(SENSOR0_EN | SENSOR1_EN | \
+				SENSOR2_EN | SENSOR3_EN | SENSOR4_EN)
+#define TSENS_8064_SENSOR5_EN				BIT(8)
+#define TSENS_8064_SENSOR6_EN				BIT(9)
+#define TSENS_8064_SENSOR7_EN				BIT(10)
+#define TSENS_8064_SENSOR8_EN				BIT(11)
+#define TSENS_8064_SENSOR9_EN				BIT(12)
+#define TSENS_8064_SENSOR10_EN				BIT(13)
+#define TSENS_8064_SENSORS_EN				(SENSORS_EN | \
+						TSENS_8064_SENSOR5_EN | \
+						TSENS_8064_SENSOR6_EN | \
+						TSENS_8064_SENSOR7_EN | \
+						TSENS_8064_SENSOR8_EN | \
+						TSENS_8064_SENSOR9_EN | \
+						TSENS_8064_SENSOR10_EN)
+
+u32 tsens_8960_slope[] = {
+			1176, 1176, 1154, 1176,
+			1111, 1132, 1132, 1199,
+			1132, 1199, 1132
+			};
+
+/* Temperature on y axis and ADC-code on x-axis */
+static inline int code_to_mdegC(u32 adc_code, const struct tsens_sensor *s)
+{
+	int slope, offset;
+
+	slope = thermal_zone_get_slope(s->tzd);
+	offset = CAL_MDEGC - slope * s->offset;
+
+	return adc_code * slope + offset;
+}
+
+static void notify_uspace_tsens_fn(struct work_struct *work)
+{
+	struct tsens_sensor *s = container_of(work, struct tsens_sensor,
+								notify_work);
+
+	sysfs_notify(&s->tzd->device.kobj, NULL, "type");
+}
+
+static void tsens_scheduler_fn(struct work_struct *work)
+{
+	struct tsens_priv *priv =
+		container_of(work, struct tsens_priv, tsens_work);
+	unsigned int threshold, threshold_low, code, reg, sensor, mask;
+	bool upper_th_x, lower_th_x;
+	int ret;
+
+	ret = regmap_read(priv->tm_map, STATUS_CNTL_ADDR_8064, &reg);
+	if (ret)
+		return;
+	reg = reg | LOWER_STATUS_CLR | UPPER_STATUS_CLR;
+	ret = regmap_write(priv->tm_map, STATUS_CNTL_ADDR_8064, reg);
+	if (ret)
+		return;
+
+	mask = ~(LOWER_STATUS_CLR | UPPER_STATUS_CLR);
+	ret = regmap_read(priv->tm_map, THRESHOLD_ADDR, &threshold);
+	if (ret)
+		return;
+	threshold_low = (threshold & THRESHOLD_LOWER_LIMIT_MASK) >>
+			THRESHOLD_LOWER_LIMIT_SHIFT;
+	threshold = (threshold & THRESHOLD_UPPER_LIMIT_MASK) >>
+		    THRESHOLD_UPPER_LIMIT_SHIFT;
+
+	ret = regmap_read(priv->tm_map, STATUS_CNTL_ADDR_8064, &reg);
+	if (ret)
+		return;
+
+	ret = regmap_read(priv->tm_map, CNTL_ADDR, &sensor);
+	if (ret)
+		return;
+	sensor &= (uint32_t)TSENS_8064_SENSORS_EN;
+	sensor >>= SENSOR0_SHIFT;
+
+	/* Constraint: There is only 1 interrupt control register for all
+	 * 11 temperature sensor. So monitoring more than 1 sensor based
+	 * on interrupts will yield inconsistent result. To overcome this
+	 * issue we will monitor only sensor 0 which is the master sensor.
+	 */
+
+	/* Skip if the sensor is disabled */
+	if (sensor & 1) {
+		ret = regmap_read(priv->tm_map, priv->sensor[0].status, &code);
+		if (ret)
+			return;
+		upper_th_x = code >= threshold;
+		lower_th_x = code <= threshold_low;
+		if (upper_th_x)
+			mask |= UPPER_STATUS_CLR;
+		if (lower_th_x)
+			mask |= LOWER_STATUS_CLR;
+		if (upper_th_x || lower_th_x) {
+			/* Notify user space */
+			schedule_work(&priv->sensor[0].notify_work);
+			pr_debug("Trigger (%d degrees) for sensor %d\n",
+				 code_to_mdegC(code, &priv->sensor[0]), 0);
+		}
+	}
+	regmap_write(priv->tm_map, STATUS_CNTL_ADDR_8064, reg & mask);
+}
+
+static irqreturn_t tsens_isr(int irq, void *data)
+{
+	struct tsens_priv *priv = data;
+
+	schedule_work(&priv->tsens_work);
+	return IRQ_HANDLED;
+}
+
+static void hw_init(struct tsens_priv *priv)
+{
+	int ret;
+	unsigned int reg_cntl = 0, reg_cfg = 0, reg_thr = 0;
+	unsigned int reg_status_cntl = 0;
+
+	regmap_read(priv->tm_map, CNTL_ADDR, &reg_cntl);
+	regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl | TSENS_SW_RST);
+
+	reg_cntl |= SLP_CLK_ENA | (MEASURE_PERIOD << 18) |
+		    (((1 << priv->num_sensors) - 1) << SENSOR0_SHIFT);
+	regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl);
+	regmap_read(priv->tm_map, STATUS_CNTL_ADDR_8064, &reg_status_cntl);
+	reg_status_cntl |= LOWER_STATUS_CLR | UPPER_STATUS_CLR |
+			   MIN_STATUS_MASK | MAX_STATUS_MASK;
+	regmap_write(priv->tm_map, STATUS_CNTL_ADDR_8064, reg_status_cntl);
+	reg_cntl |= TSENS_EN;
+	regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl);
+
+	regmap_read(priv->tm_map, CONFIG_ADDR, &reg_cfg);
+	if (priv->num_sensors > 1)
+		reg_cfg = (reg_cfg & ~CONFIG_MASK) | CONFIG;
+	else
+		reg_cfg = (reg_cfg & ~CONFIG_MASK) |
+			  (CONFIG << CONFIG_SHIFT_8660);
+	regmap_write(priv->tm_map, CONFIG_ADDR, reg_cfg);
+
+	reg_thr |= (LOWER_LIMIT_TH_8064 << THRESHOLD_LOWER_LIMIT_SHIFT) |
+		   (UPPER_LIMIT_TH_8064 << THRESHOLD_UPPER_LIMIT_SHIFT) |
+		   (MIN_LIMIT_TH << THRESHOLD_MIN_LIMIT_SHIFT) |
+		   (MAX_LIMIT_TH << THRESHOLD_MAX_LIMIT_SHIFT);
+
+	regmap_write(priv->tm_map, THRESHOLD_ADDR, reg_thr);
+
+	ret = devm_request_irq(priv->dev, priv->tsens_irq, tsens_isr,
+			       IRQF_TRIGGER_RISING, "tsens_interrupt", priv);
+	if (ret < 0) {
+		dev_err(priv->dev, "request_irq FAIL: %d", ret);
+		return;
+	}
+
+	INIT_WORK(&priv->tsens_work, tsens_scheduler_fn);
+}
+
 static int suspend_8960(struct tsens_priv *priv)
 {
 	int ret;
@@ -186,6 +361,8 @@ static int init_8960(struct tsens_priv *priv)
 		if (i >= 5)
 			priv->sensor[i].status = S0_STATUS_ADDR + 40;
 		priv->sensor[i].status += i * 4;
+		priv->sensor[i].slope = tsens_8960_slope[i];
+		INIT_WORK(&priv->sensor[i].notify_work, notify_uspace_tsens_fn);
 	}
 
 	reg_cntl = SW_RST;
@@ -236,18 +413,9 @@ static int calibrate_8960(struct tsens_priv *priv)
 
 	kfree(data);
 
-	return 0;
-}
-
-/* Temperature on y axis and ADC-code on x-axis */
-static inline int code_to_mdegC(u32 adc_code, const struct tsens_sensor *s)
-{
-	int slope, offset;
+	hw_init(priv);
 
-	slope = thermal_zone_get_slope(s->tzd);
-	offset = CAL_MDEGC - slope * s->offset;
-
-	return adc_code * slope + offset;
+	return 0;
 }
 
 static int get_temp_8960(const struct tsens_sensor *s, int *temp)
diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h
index 59d01162c66a..2f145001e4d5 100644
--- a/drivers/thermal/qcom/tsens.h
+++ b/drivers/thermal/qcom/tsens.h
@@ -48,6 +48,7 @@ enum tsens_irq_type {
 struct tsens_sensor {
 	struct tsens_priv		*priv;
 	struct thermal_zone_device	*tzd;
+	struct work_struct		notify_work;
 	int				offset;
 	unsigned int			hw_id;
 	int				slope;
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 5/6] drivers: thermal: tsens: add support for custom set_trip function
  2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
                   ` (3 preceding siblings ...)
  2020-07-09 21:51 ` [PATCH 4/6] drivers: thermal: tsens: add interrupt support for 9860 driver Ansuel Smith
@ 2020-07-09 21:51 ` Ansuel Smith
  2020-07-09 21:51 ` [PATCH 6/6] drivers: thermal: tsens: add set_trip support for 8960 Ansuel Smith
  5 siblings, 0 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-pm, linux-arm-msm, devicetree,
	linux-kernel

8960 tsens driver have a custom implementation to set set_trip function.
Permit the generic driver to use the custom function if provided.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/thermal/qcom/tsens.c | 4 ++++
 drivers/thermal/qcom/tsens.h | 2 ++
 2 files changed, 6 insertions(+)

diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index 2985a064a0d1..2b55b34d66fb 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -530,6 +530,10 @@ static int tsens_set_trips(void *_sensor, int low, int high)
 	int high_val, low_val, cl_high, cl_low;
 	u32 hw_id = s->hw_id;
 
+	// Use the driver set_trips if present
+	if (priv->ops->set_trip_temp)
+		return priv->ops->set_trip_temp(_sensor, low, high);
+
 	dev_dbg(dev, "[%u] %s: proposed thresholds: (%d:%d)\n",
 		hw_id, __func__, low, high);
 
diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h
index 2f145001e4d5..c27fae39d542 100644
--- a/drivers/thermal/qcom/tsens.h
+++ b/drivers/thermal/qcom/tsens.h
@@ -65,6 +65,7 @@ struct tsens_sensor {
  * @suspend: Function to suspend the tsens device
  * @resume: Function to resume the tsens device
  * @get_trend: Function to get the thermal/temp trend
+ * @set_trip_temp: Function to get trip temp
  */
 struct tsens_ops {
 	/* mandatory callbacks */
@@ -77,6 +78,7 @@ struct tsens_ops {
 	int (*suspend)(struct tsens_priv *priv);
 	int (*resume)(struct tsens_priv *priv);
 	int (*get_trend)(struct tsens_sensor *s, enum thermal_trend *trend);
+	int (*set_trip_temp)(void *data, int trip, int temp);
 };
 
 #define REG_FIELD_FOR_EACH_SENSOR11(_name, _offset, _startbit, _stopbit) \
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6/6] drivers: thermal: tsens: add set_trip support for 8960
  2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
                   ` (4 preceding siblings ...)
  2020-07-09 21:51 ` [PATCH 5/6] drivers: thermal: tsens: add support for custom set_trip function Ansuel Smith
@ 2020-07-09 21:51 ` Ansuel Smith
  5 siblings, 0 replies; 11+ messages in thread
From: Ansuel Smith @ 2020-07-09 21:51 UTC (permalink / raw)
  To: Amit Kucheria
  Cc: Ansuel Smith, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, Rob Herring, linux-pm, linux-arm-msm, devicetree,
	linux-kernel

Add custom set_trip function for 8960 needed to set trip point to the
tsens driver for 8960 driver.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/thermal/qcom/tsens-8960.c | 78 +++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/drivers/thermal/qcom/tsens-8960.c b/drivers/thermal/qcom/tsens-8960.c
index 2dc670206896..321791b8aabf 100644
--- a/drivers/thermal/qcom/tsens-8960.c
+++ b/drivers/thermal/qcom/tsens-8960.c
@@ -93,6 +93,15 @@
 						TSENS_8064_SENSOR9_EN | \
 						TSENS_8064_SENSOR10_EN)
 
+/* Trips: from very hot to very cold */
+enum tsens_trip_type {
+	TSENS_TRIP_STAGE3 = 0,
+	TSENS_TRIP_STAGE2,
+	TSENS_TRIP_STAGE1,
+	TSENS_TRIP_STAGE0,
+	TSENS_TRIP_NUM,
+};
+
 u32 tsens_8960_slope[] = {
 			1176, 1176, 1154, 1176,
 			1111, 1132, 1132, 1199,
@@ -110,6 +119,16 @@ static inline int code_to_mdegC(u32 adc_code, const struct tsens_sensor *s)
 	return adc_code * slope + offset;
 }
 
+static int mdegC_to_code(int degC, const struct tsens_sensor *s)
+{
+	int slope, offset;
+
+	slope = thermal_zone_get_slope(s->tzd);
+	offset = CAL_MDEGC - slope * s->offset;
+
+	return degC / slope - offset;
+}
+
 static void notify_uspace_tsens_fn(struct work_struct *work)
 {
 	struct tsens_sensor *s = container_of(work, struct tsens_sensor,
@@ -442,6 +461,64 @@ static int get_temp_8960(const struct tsens_sensor *s, int *temp)
 	return -ETIMEDOUT;
 }
 
+static int set_trip_temp_ipq8064(void *data, int trip, int temp)
+{
+	unsigned int reg_th, reg_cntl;
+	int ret, code, code_chk, hi_code, lo_code;
+	const struct tsens_sensor *s = data;
+	struct tsens_priv *priv = s->priv;
+
+	code = mdegC_to_code(temp, s);
+	code_chk = code;
+
+	if (code < THRESHOLD_MIN_CODE || code > THRESHOLD_MAX_CODE)
+		return -EINVAL;
+
+	ret = regmap_read(priv->tm_map, STATUS_CNTL_ADDR_8064, &reg_cntl);
+	if (ret)
+		return ret;
+
+	ret = regmap_read(priv->tm_map, THRESHOLD_ADDR, &reg_th);
+	if (ret)
+		return ret;
+
+	hi_code = (reg_th & THRESHOLD_UPPER_LIMIT_MASK)
+			>> THRESHOLD_UPPER_LIMIT_SHIFT;
+	lo_code = (reg_th & THRESHOLD_LOWER_LIMIT_MASK)
+			>> THRESHOLD_LOWER_LIMIT_SHIFT;
+
+	switch (trip) {
+	case TSENS_TRIP_STAGE3:
+		code <<= THRESHOLD_MAX_LIMIT_SHIFT;
+		reg_th &= ~THRESHOLD_MAX_LIMIT_MASK;
+		break;
+	case TSENS_TRIP_STAGE2:
+		if (code_chk <= lo_code)
+			return -EINVAL;
+		code <<= THRESHOLD_UPPER_LIMIT_SHIFT;
+		reg_th &= ~THRESHOLD_UPPER_LIMIT_MASK;
+		break;
+	case TSENS_TRIP_STAGE1:
+		if (code_chk >= hi_code)
+			return -EINVAL;
+		code <<= THRESHOLD_LOWER_LIMIT_SHIFT;
+		reg_th &= ~THRESHOLD_LOWER_LIMIT_MASK;
+		break;
+	case TSENS_TRIP_STAGE0:
+		code <<= THRESHOLD_MIN_LIMIT_SHIFT;
+		reg_th &= ~THRESHOLD_MIN_LIMIT_MASK;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	ret = regmap_write(priv->tm_map, THRESHOLD_ADDR, reg_th | code);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 static const struct tsens_ops ops_8960 = {
 	.init		= init_8960,
 	.calibrate	= calibrate_8960,
@@ -450,6 +527,7 @@ static const struct tsens_ops ops_8960 = {
 	.disable	= disable_8960,
 	.suspend	= suspend_8960,
 	.resume		= resume_8960,
+	.set_trip_temp	= set_trip_temp_ipq8064,
 };
 
 struct tsens_plat_data data_8960 = {
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings
  2020-07-09 21:51 ` [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings Ansuel Smith
@ 2020-07-10 16:24   ` Rob Herring
  2020-07-10 16:26   ` Rob Herring
  1 sibling, 0 replies; 11+ messages in thread
From: Rob Herring @ 2020-07-10 16:24 UTC (permalink / raw)
  To: Ansuel Smith
  Cc: Rob Herring, linux-arm-msm, linux-kernel, linux-pm,
	Amit Kucheria, Andy Gross, Zhang Rui, devicetree, Daniel Lezcano,
	Bjorn Andersson

On Thu, 09 Jul 2020 23:51:33 +0200, Ansuel Smith wrote:
> Document the use of regmap phandle for ipq8064 SoCs
> 
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
>  .../bindings/thermal/qcom-tsens.yaml          | 51 ++++++++++++++++---
>  1 file changed, 44 insertions(+), 7 deletions(-)
> 


My bot found errors running 'make dt_binding_check' on your patch:

Documentation/devicetree/bindings/thermal/qcom-tsens.example.dts:21.38-31.11: Warning (unit_address_vs_reg): /example-0/thermal-sensor@900000: node has a unit name, but no reg or ranges property
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: interrupts: [[0, 178, 4]] is too short
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: '#qcom,sensors' is a required property
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: 'interrupt-names' is a required property
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: compatible: ['qcom,ipq8064-tsens'] is not valid under any of the given schemas (Possible causes of the failure):
	/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: compatible: ['qcom,ipq8064-tsens'] is too short
	/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: compatible:0: 'qcom,ipq8064-tsens' is not one of ['qcom,msm8976-tsens', 'qcom,qcs404-tsens']
	/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: compatible:0: 'qcom,ipq8064-tsens' is not one of ['qcom,msm8996-tsens', 'qcom,msm8998-tsens', 'qcom,sc7180-tsens', 'qcom,sdm845-tsens']

/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/thermal/qcom-tsens.example.dt.yaml: thermal-sensor@900000: nvmem-cell-names:1: 'calib_sel' was expected


See https://patchwork.ozlabs.org/patch/1326228

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure dt-schema is up to date:

pip3 install git+https://github.com/devicetree-org/dt-schema.git@master --upgrade

Please check and re-submit.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings
  2020-07-09 21:51 ` [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings Ansuel Smith
  2020-07-10 16:24   ` Rob Herring
@ 2020-07-10 16:26   ` Rob Herring
  2020-07-10 20:07     ` R: " ansuelsmth
  1 sibling, 1 reply; 11+ messages in thread
From: Rob Herring @ 2020-07-10 16:26 UTC (permalink / raw)
  To: Ansuel Smith
  Cc: Amit Kucheria, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, linux-pm, linux-arm-msm, devicetree,
	linux-kernel

On Thu, Jul 09, 2020 at 11:51:33PM +0200, Ansuel Smith wrote:
> Document the use of regmap phandle for ipq8064 SoCs
> 
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
>  .../bindings/thermal/qcom-tsens.yaml          | 51 ++++++++++++++++---
>  1 file changed, 44 insertions(+), 7 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> index d7be931b42d2..5ceb5d720e16 100644
> --- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> +++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> @@ -24,6 +24,7 @@ properties:
>            - enum:
>                - qcom,msm8916-tsens
>                - qcom,msm8974-tsens
> +              - qcom,ipq8064-tsens
>            - const: qcom,tsens-v0_1
>  
>        - description: v1 of TSENS
> @@ -47,6 +48,11 @@ properties:
>        - description: TM registers
>        - description: SROT registers
>  
> +  regmap:
> +    description:
> +      Phandle to the gcc. On ipq8064 SoCs gcc and tsense share the same regs.
> +    $ref: /schemas/types.yaml#/definitions/phandle

Can't you make this a child of the gcc and drop this property?

> +
>    interrupts:
>      minItems: 1
>      items:
> @@ -111,17 +117,48 @@ allOf:
>          interrupt-names:
>            minItems: 2
>  
> -required:
> -  - compatible
> -  - reg
> -  - "#qcom,sensors"
> -  - interrupts
> -  - interrupt-names
> -  - "#thermal-sensor-cells"
> +  - if:
> +      properties:
> +        compatible:
> +          contains:
> +            enum:
> +              - qcom,ipq8064-tsens
> +    then:
> +      required:
> +        - compatible
> +        - regmap
> +        - "#qcom,sensors"
> +        - interrupts
> +        - interrupt-names
> +        - "#thermal-sensor-cells"
> +
> +    else:
> +      required:
> +        - compatible
> +        - reg
> +        - "#qcom,sensors"
> +        - interrupts
> +        - interrupt-names
> +        - "#thermal-sensor-cells"

Keep all the common required properties and just put reg/regmap in the 
if/then if this ends up staying.

Rob

^ permalink raw reply	[flat|nested] 11+ messages in thread

* R: [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings
  2020-07-10 16:26   ` Rob Herring
@ 2020-07-10 20:07     ` ansuelsmth
  2020-07-14 14:26       ` Rob Herring
  0 siblings, 1 reply; 11+ messages in thread
From: ansuelsmth @ 2020-07-10 20:07 UTC (permalink / raw)
  To: 'Rob Herring'
  Cc: 'Amit Kucheria', 'Andy Gross',
	'Bjorn Andersson', 'Zhang Rui',
	'Daniel Lezcano',
	linux-pm, linux-arm-msm, devicetree, linux-kernel



> -----Messaggio originale-----
> Da: Rob Herring <robh@kernel.org>
> Inviato: venerdì 10 luglio 2020 18:27
> A: Ansuel Smith <ansuelsmth@gmail.com>
> Cc: Amit Kucheria <amit.kucheria@linaro.org>; Andy Gross
> <agross@kernel.org>; Bjorn Andersson <bjorn.andersson@linaro.org>;
> Zhang Rui <rui.zhang@intel.com>; Daniel Lezcano
> <daniel.lezcano@linaro.org>; linux-pm@vger.kernel.org; linux-arm-
> msm@vger.kernel.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Oggetto: Re: [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064
> bindings
> 
> On Thu, Jul 09, 2020 at 11:51:33PM +0200, Ansuel Smith wrote:
> > Document the use of regmap phandle for ipq8064 SoCs
> >
> > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> > ---
> >  .../bindings/thermal/qcom-tsens.yaml          | 51 ++++++++++++++++---
> >  1 file changed, 44 insertions(+), 7 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > index d7be931b42d2..5ceb5d720e16 100644
> > --- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > +++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > @@ -24,6 +24,7 @@ properties:
> >            - enum:
> >                - qcom,msm8916-tsens
> >                - qcom,msm8974-tsens
> > +              - qcom,ipq8064-tsens
> >            - const: qcom,tsens-v0_1
> >
> >        - description: v1 of TSENS
> > @@ -47,6 +48,11 @@ properties:
> >        - description: TM registers
> >        - description: SROT registers
> >
> > +  regmap:
> > +    description:
> > +      Phandle to the gcc. On ipq8064 SoCs gcc and tsense share the same
> regs.
> > +    $ref: /schemas/types.yaml#/definitions/phandle
> 
> Can't you make this a child of the gcc and drop this property?
> 

Make the thermal a child of the gcc would be a little confusing. Anyway
making this
a child of gcc cause the not probing of the thermal driver as it's ignored
any child of
gcc. I pushed v2 with the fixed problem.

> > +
> >    interrupts:
> >      minItems: 1
> >      items:
> > @@ -111,17 +117,48 @@ allOf:
> >          interrupt-names:
> >            minItems: 2
> >
> > -required:
> > -  - compatible
> > -  - reg
> > -  - "#qcom,sensors"
> > -  - interrupts
> > -  - interrupt-names
> > -  - "#thermal-sensor-cells"
> > +  - if:
> > +      properties:
> > +        compatible:
> > +          contains:
> > +            enum:
> > +              - qcom,ipq8064-tsens
> > +    then:
> > +      required:
> > +        - compatible
> > +        - regmap
> > +        - "#qcom,sensors"
> > +        - interrupts
> > +        - interrupt-names
> > +        - "#thermal-sensor-cells"
> > +
> > +    else:
> > +      required:
> > +        - compatible
> > +        - reg
> > +        - "#qcom,sensors"
> > +        - interrupts
> > +        - interrupt-names
> > +        - "#thermal-sensor-cells"
> 
> Keep all the common required properties and just put reg/regmap in the
> if/then if this ends up staying.
> 
> Rob


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings
  2020-07-10 20:07     ` R: " ansuelsmth
@ 2020-07-14 14:26       ` Rob Herring
  0 siblings, 0 replies; 11+ messages in thread
From: Rob Herring @ 2020-07-14 14:26 UTC (permalink / raw)
  To: Ansuel Smith
  Cc: Amit Kucheria, Andy Gross, Bjorn Andersson, Zhang Rui,
	Daniel Lezcano, open list:THERMAL, linux-arm-msm, devicetree,
	linux-kernel

On Fri, Jul 10, 2020 at 2:07 PM <ansuelsmth@gmail.com> wrote:
>
>
>
> > -----Messaggio originale-----
> > Da: Rob Herring <robh@kernel.org>
> > Inviato: venerdì 10 luglio 2020 18:27
> > A: Ansuel Smith <ansuelsmth@gmail.com>
> > Cc: Amit Kucheria <amit.kucheria@linaro.org>; Andy Gross
> > <agross@kernel.org>; Bjorn Andersson <bjorn.andersson@linaro.org>;
> > Zhang Rui <rui.zhang@intel.com>; Daniel Lezcano
> > <daniel.lezcano@linaro.org>; linux-pm@vger.kernel.org; linux-arm-
> > msm@vger.kernel.org; devicetree@vger.kernel.org; linux-
> > kernel@vger.kernel.org
> > Oggetto: Re: [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064
> > bindings
> >
> > On Thu, Jul 09, 2020 at 11:51:33PM +0200, Ansuel Smith wrote:
> > > Document the use of regmap phandle for ipq8064 SoCs
> > >
> > > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> > > ---
> > >  .../bindings/thermal/qcom-tsens.yaml          | 51 ++++++++++++++++---
> > >  1 file changed, 44 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > > index d7be931b42d2..5ceb5d720e16 100644
> > > --- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > > +++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
> > > @@ -24,6 +24,7 @@ properties:
> > >            - enum:
> > >                - qcom,msm8916-tsens
> > >                - qcom,msm8974-tsens
> > > +              - qcom,ipq8064-tsens
> > >            - const: qcom,tsens-v0_1
> > >
> > >        - description: v1 of TSENS
> > > @@ -47,6 +48,11 @@ properties:
> > >        - description: TM registers
> > >        - description: SROT registers
> > >
> > > +  regmap:
> > > +    description:
> > > +      Phandle to the gcc. On ipq8064 SoCs gcc and tsense share the same
> > regs.
> > > +    $ref: /schemas/types.yaml#/definitions/phandle
> >
> > Can't you make this a child of the gcc and drop this property?
> >
>
> Make the thermal a child of the gcc would be a little confusing. Anyway
> making this
> a child of gcc cause the not probing of the thermal driver as it's ignored
> any child of
> gcc. I pushed v2 with the fixed problem.

Structure the DT as the h/w is structured, not what's convenient for the OS.

Either the GCC driver has to call of_platform_populate on the child
nodes or you can perhaps use 'simple-mfd'.

Rob

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-07-14 14:26 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-09 21:51 [PATCH 0/6] Add support for ipq8064 tsens Ansuel Smith
2020-07-09 21:51 ` [PATCH 1/6] drivers: thermal: tsens: load regmap from phandle for 8960 Ansuel Smith
2020-07-09 21:51 ` [PATCH 2/6] drivers: thermal: tsens: add ipq8064 support Ansuel Smith
2020-07-09 21:51 ` [PATCH 3/6] dt-bindings: thermal: tsens: document ipq8064 bindings Ansuel Smith
2020-07-10 16:24   ` Rob Herring
2020-07-10 16:26   ` Rob Herring
2020-07-10 20:07     ` R: " ansuelsmth
2020-07-14 14:26       ` Rob Herring
2020-07-09 21:51 ` [PATCH 4/6] drivers: thermal: tsens: add interrupt support for 9860 driver Ansuel Smith
2020-07-09 21:51 ` [PATCH 5/6] drivers: thermal: tsens: add support for custom set_trip function Ansuel Smith
2020-07-09 21:51 ` [PATCH 6/6] drivers: thermal: tsens: add set_trip support for 8960 Ansuel Smith

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).