From: Alistair Francis <alistair@alistair23.me>
To: lee.jones@linaro.org, robh+dt@kernel.org, lgirdwood@gmail.com,
broonie@kernel.org, linux-imx@nxp.com, kernel@pengutronix.de
Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
alistair23@gmail.com,
Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.no>,
Alistair Francis <alistair@alistair23.me>
Subject: [PATCH v7 2/6] thermal: sy7636a: Add thermal driver for sy7636a
Date: Thu, 8 Jul 2021 21:58:00 +1000 [thread overview]
Message-ID: <20210708115804.212-2-alistair@alistair23.me> (raw)
In-Reply-To: <20210708115804.212-1-alistair@alistair23.me>
From: Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.no>
Add thermal driver to enable kernel based polling
and shutdown of device for temperatures out of spec
Signed-off-by: Alistair Francis <alistair@alistair23.me>
---
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, ®_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*)®_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;
+
+ data = devm_kzalloc(&pdev->dev, sizeof(struct sy7636a_data), GFP_KERNEL);
+ 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,
+ &ops);
+
+ return PTR_ERR_OR_ZERO(data->thermal_zone_dev);
+}
+
+static const struct platform_device_id sy7636a_thermal_id_table[] = {
+ { "sy7636a-thermal", },
+ { }
+};
+MODULE_DEVICE_TABLE(platform, sy7636a_thermal_id_table);
+
+static struct platform_driver sy7636a_thermal_driver = {
+ .driver = {
+ .name = "sy7636a-thermal",
+ },
+ .probe = sy7636a_thermal_probe,
+ .id_table = sy7636a_thermal_id_table,
+};
+module_platform_driver(sy7636a_thermal_driver);
+
+MODULE_AUTHOR("Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>");
+MODULE_DESCRIPTION("SY7636A thermal driver");
+MODULE_LICENSE("GPL v2");
--
2.31.1
next prev parent reply other threads:[~2021-07-08 11:58 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-08 11:57 [PATCH v7 1/6] mfd: sy7636a: Initial commit Alistair Francis
2021-07-08 11:58 ` Alistair Francis [this message]
2021-07-20 15:02 ` [PATCH v7 2/6] thermal: sy7636a: Add thermal driver for sy7636a Lee Jones
2021-07-28 8:23 ` Alistair Francis
2021-08-02 7:55 ` Lee Jones
2021-08-14 11:08 ` Daniel Lezcano
2021-07-08 11:58 ` [PATCH v7 3/6] hwmon: sy7636a: Add temperature " Alistair Francis
2021-07-20 14:59 ` Lee Jones
2021-08-02 9:48 ` Alistair Francis
2021-07-08 11:58 ` [PATCH v7 4/6] ARM: imx_v6_v7_defconfig: Enable silergy,sy7636a Alistair Francis
2021-07-08 11:58 ` [PATCH v7 5/6] ARM: dts: imx7d: remarkable2: " Alistair Francis
2021-07-08 11:58 ` [PATCH v7 6/6] ARM: dts: imx7d: remarkable2: Enable lcdif Alistair Francis
2021-07-20 14:53 ` [PATCH v7 1/6] mfd: sy7636a: Initial commit Lee Jones
2021-07-20 15:23 ` Mark Brown
2021-07-20 16:09 ` Lee Jones
2021-07-20 20:26 ` Mark Brown
2021-07-30 6:21 ` Alistair Francis
2021-07-30 11:13 ` Mark Brown
2021-08-02 9:26 ` Alistair Francis
2021-08-02 10:23 ` Lee Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210708115804.212-2-alistair@alistair23.me \
--to=alistair@alistair23.me \
--cc=alistair23@gmail.com \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=kernel@pengutronix.de \
--cc=lars.ivar.miljeteig@remarkable.no \
--cc=lee.jones@linaro.org \
--cc=lgirdwood@gmail.com \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.