Thread (20 messages) flat view 20 messages, 5 authors, 2021-08-14

Re: [PATCH v7 2/6] thermal: sy7636a: Add thermal driver for sy7636a

From: Alistair Francis <hidden>
Date: 2021-07-28 08:23:47
Also in: lkml

On Wed, Jul 21, 2021 at 1:02 AM Lee Jones [off-list ref] wrote:
On Thu, 08 Jul 2021, Alistair Francis wrote:
quoted
From: Lars Ivar Miljeteig <redacted>

Add thermal driver to enable kernel based polling
and shutdown of device for temperatures out of spec

Signed-off-by: Alistair Francis <redacted>
---
 drivers/thermal/Kconfig           |   7 ++
 drivers/thermal/Makefile          |   1 +
 drivers/thermal/sy7636a_thermal.c | 107 ++++++++++++++++++++++++++++++
 3 files changed, 115 insertions(+)
 create mode 100644 drivers/thermal/sy7636a_thermal.c
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index d7f44deab5b1..7112c63d9021 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -450,6 +450,13 @@ depends on (ARCH_STI || ARCH_STM32) && OF
 source "drivers/thermal/st/Kconfig"
 endmenu

+config SY7636A_THERMAL
+     tristate "SY7636A thermal management"
+     depends on MFD_SY7636A
+     help
+       Enable the sy7636a thermal driver, which supports the
+       temperature sensor embedded in Silabs SY7636A chip.
+
 source "drivers/thermal/tegra/Kconfig"

 config GENERIC_ADC_THERMAL
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index 82fc3e616e54..2e1aca8a0a09 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -51,6 +51,7 @@ obj-$(CONFIG_DA9062_THERMAL)        += da9062-thermal.o
 obj-y                                += intel/
 obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
 obj-y                                += st/
+obj-$(CONFIG_SY7636A_THERMAL)        += sy7636a_thermal.o
 obj-$(CONFIG_QCOM_TSENS)     += qcom/
 obj-y                                += tegra/
 obj-$(CONFIG_HISI_THERMAL)     += hisi_thermal.o
diff --git a/drivers/thermal/sy7636a_thermal.c b/drivers/thermal/sy7636a_thermal.c
new file mode 100644
index 000000000000..705a16fb1045
--- /dev/null
+++ b/drivers/thermal/sy7636a_thermal.c
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Functions to access SY3686A power management chip temperature
+//
+// Copyright (C) 2019 reMarkable AS - http://www.remarkable.com/
+//
+// Authors: Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>
+//          Alistair Francis <alistair@alistair23.me>
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/thermal.h>
+
+#include <linux/mfd/sy7636a.h>
+
+struct sy7636a_data {
+     struct sy7636a *sy7636a;
+     struct thermal_zone_device *thermal_zone_dev;
+};
+
+static int sy7636a_get_temp(void *arg, int *res)
+{
+     unsigned int reg_val, mode_ctr;
+     int ret;
+     struct sy7636a_data *data = arg;
+     bool isVoltageActive;
+
+     ret = regmap_read(data->sy7636a->regmap,
+                     SY7636A_REG_OPERATION_MODE_CRL, &mode_ctr);
+     if (ret)
+             return ret;
+
+     isVoltageActive = mode_ctr & SY7636A_OPERATION_MODE_CRL_ONOFF;
+
+     if (!isVoltageActive) {
+             ret = regmap_write(data->sy7636a->regmap,
+                             SY7636A_REG_OPERATION_MODE_CRL,
+                             mode_ctr | SY7636A_OPERATION_MODE_CRL_ONOFF);
+             if (ret)
+                     return ret;
+     }
+
+     ret = regmap_read(data->sy7636a->regmap,
+                     SY7636A_REG_TERMISTOR_READOUT, &reg_val);
+     if (ret)
+             return ret;
+
+     if (!isVoltageActive) {
+             ret = regmap_write(data->sy7636a->regmap,
+                             SY7636A_REG_OPERATION_MODE_CRL,
+                             mode_ctr);
+             if (ret)
+                     return ret;
+     }
+
+     *res = *((signed char*)&reg_val);
+     *res *= 1000;
+
+     return ret;
+}
+
+static const struct thermal_zone_of_device_ops ops = {
+     .get_temp       = sy7636a_get_temp,
+};
+
+static int sy7636a_thermal_probe(struct platform_device *pdev)
+{
+     struct sy7636a *sy7636a = dev_get_drvdata(pdev->dev.parent);
+     struct sy7636a_data *data;
+
+     if (!sy7636a)
+             return -EPROBE_DEFER;
How is this possible?
I'm not sure, I have removed this.
quoted
+     data = devm_kzalloc(&pdev->dev, sizeof(struct sy7636a_data), GFP_KERNEL);
sizeof(*data)
quoted
+     if (!data)
+             return -ENOMEM;
+
+     platform_set_drvdata(pdev, data);
+
+     data->sy7636a = sy7636a;
+     data->thermal_zone_dev = devm_thermal_zone_of_sensor_register(
+                     pdev->dev.parent,
+                     0,
+                     data,
Why don't you just pass in your initial ddata?
I'm not sure what you mean, which data?

Alistair
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help