Linux Hardware Monitor development
 help / color / mirror / Atom feed
* [PATCH 0/7] sy7636a: power the panel only during updates
@ 2026-10-26  0:39 Pablo Mazzini
  2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Pablo Mazzini @ 2026-10-26  0:39 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood, Guenter Roeck, Lee Jones, Frank Li,
	Sascha Hauer
  Cc: Pablo Mazzini, Alistair Francis, Andreas Kemnade,
	Pengutronix Kernel Team, Fabio Estevam, devicetree, imx,
	linux-arm-kernel, linux-hwmon, mfd, linux-kernel

The SY7636A hwmon driver keeps VCOM on from probe, so a display driver
can not power the panel only during updates.

Read the temperature in the regulator driver instead, as the TPS65185
and FP9931 drivers do, and remove the hwmon driver. Boards that relied
on VCOM staying on mark it always-on. The regulator also switches VCOM
with VCOM_EN, gains VCOM voltage control and binds to the I2C device
directly.

Tested on a PocketBook Verse (B288).

Pablo Mazzini (7):
  ARM: dts: imx: keep the SY7636A VCOM on
  regulator: sy7636a: fix the chip name
  regulator: sy7636a: add VCOM voltage control
  regulator: sy7636a: wait for power good, then switch VCOM_EN
  regulator: sy7636a: report the temperature
  regulator: sy7636a: bind to the I2C device directly
  ARM: imx_v6_v7_defconfig: drop the SY7636A MFD and hwmon options

 Documentation/hwmon/index.rst                 |   1 -
 Documentation/hwmon/sy7636a-hwmon.rst         |  26 --
 arch/arm/boot/dts/nxp/imx/e70k02.dtsi         |   1 +
 .../boot/dts/nxp/imx/imx7d-remarkable2.dts    |   1 +
 arch/arm/configs/imx_v6_v7_defconfig          |   2 -
 drivers/hwmon/Kconfig                         |  10 -
 drivers/hwmon/Makefile                        |   1 -
 drivers/hwmon/sy7636a-hwmon.c                 | 102 --------
 drivers/mfd/Kconfig                           |  10 -
 drivers/mfd/simple-mfd-i2c.c                  |  11 -
 drivers/regulator/Kconfig                     |   6 +-
 drivers/regulator/sy7636a-regulator.c         | 240 +++++++++++++++---
 include/linux/mfd/sy7636a.h                   |  34 ---
 13 files changed, 205 insertions(+), 240 deletions(-)
 delete mode 100644 Documentation/hwmon/sy7636a-hwmon.rst
 delete mode 100644 drivers/hwmon/sy7636a-hwmon.c
 delete mode 100644 include/linux/mfd/sy7636a.h


base-commit: aac26bee2287c88af5be5a5ff96d783b19a28790
-- 
2.52.0


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

* [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26  0:39 [PATCH 0/7] sy7636a: power the panel only during updates Pablo Mazzini
@ 2026-10-26  0:39 ` Pablo Mazzini
  2026-10-26  1:35   ` sashiko-bot
                     ` (2 more replies)
  2026-10-26  0:39 ` [PATCH 6/7] regulator: sy7636a: bind to the I2C device directly Pablo Mazzini
  2026-10-26  9:37 ` [PATCH 0/7] sy7636a: power the panel only during updates Andreas Kemnade
  2 siblings, 3 replies; 14+ messages in thread
From: Pablo Mazzini @ 2026-10-26  0:39 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood, Guenter Roeck, Lee Jones
  Cc: Pablo Mazzini, Alistair Francis, Andreas Kemnade, linux-hwmon,
	mfd, linux-kernel

The separate hwmon cell enables VCOM at probe. Report the temperature
from here, as the TPS65185 and FP9931 drivers do, and under the chip
name as they do: read it while the rails are on and return -ENODATA
otherwise. Boards that need the rails on mark VCOM always-on. Drop the
hwmon driver.

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 Documentation/hwmon/index.rst         |   1 -
 Documentation/hwmon/sy7636a-hwmon.rst |  26 -------
 drivers/hwmon/Kconfig                 |  10 ---
 drivers/hwmon/Makefile                |   1 -
 drivers/hwmon/sy7636a-hwmon.c         | 102 --------------------------
 drivers/mfd/simple-mfd-i2c.c          |   1 -
 drivers/regulator/Kconfig             |   1 +
 drivers/regulator/sy7636a-regulator.c |  56 ++++++++++++++
 8 files changed, 57 insertions(+), 141 deletions(-)
 delete mode 100644 Documentation/hwmon/sy7636a-hwmon.rst
 delete mode 100644 drivers/hwmon/sy7636a-hwmon.c

diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst
index 199ca79621e9..43aecc4e49cd 100644
--- a/Documentation/hwmon/index.rst
+++ b/Documentation/hwmon/index.rst
@@ -265,7 +265,6 @@ Hardware Monitoring Kernel Drivers
    sq24860
    stpddc60
    surface_fan
-   sy7636a-hwmon
    tc654
    tc74
    tda38740
diff --git a/Documentation/hwmon/sy7636a-hwmon.rst b/Documentation/hwmon/sy7636a-hwmon.rst
deleted file mode 100644
index 03d866aba6e8..000000000000
--- a/Documentation/hwmon/sy7636a-hwmon.rst
+++ /dev/null
@@ -1,26 +0,0 @@
-.. SPDX-License-Identifier: GPL-2.0-or-later
-
-Kernel driver sy7636a-hwmon
-===========================
-
-Supported chips:
-
- * Silergy SY7636A PMIC
-
-
-Description
------------
-
-This driver adds hardware temperature reading support for
-the Silergy SY7636A PMIC.
-
-The following sensors are supported
-
-  * Temperature
-      - Temperature of external NTC in milli-degree C
-
-sysfs-Interface
----------------
-
-temp1_input
-	- Temperature of external NTC (milli-degree C)
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 18c682e1a475..36e08c333e01 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -2104,16 +2104,6 @@ config SENSORS_SIS5595
 	  This driver can also be built as a module. If so, the module
 	  will be called sis5595.
 
-config SENSORS_SY7636A
-	tristate "Silergy SY7636A"
-	depends on MFD_SY7636A
-	help
-	  If you say yes here you get support for the thermistor readout of
-	  the Silergy SY7636A PMIC.
-
-	  This driver can also be built as a module.  If so, the module
-	  will be called sy7636a-hwmon.
-
 config SENSORS_DME1737
 	tristate "SMSC DME1737, SCH311x and compatibles"
 	depends on HAS_IOPORT
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index d4c345ed7261..537fb0bc1778 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -234,7 +234,6 @@ obj-$(CONFIG_SENSORS_SPD5118)	+= spd5118.o
 obj-$(CONFIG_SENSORS_STTS751)	+= stts751.o
 obj-$(CONFIG_SENSORS_SURFACE_FAN)+= surface_fan.o
 obj-$(CONFIG_SENSORS_SURFACE_TEMP)+= surface_temp.o
-obj-$(CONFIG_SENSORS_SY7636A)	+= sy7636a-hwmon.o
 obj-$(CONFIG_SENSORS_AMC6821)	+= amc6821.o
 obj-$(CONFIG_SENSORS_TC74)	+= tc74.o
 obj-$(CONFIG_SENSORS_THMC50)	+= thmc50.o
diff --git a/drivers/hwmon/sy7636a-hwmon.c b/drivers/hwmon/sy7636a-hwmon.c
deleted file mode 100644
index d51daaf63d63..000000000000
--- a/drivers/hwmon/sy7636a-hwmon.c
+++ /dev/null
@@ -1,102 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Functions to access SY3686A power management chip temperature
- *
- * Copyright (C) 2021 reMarkable AS - http://www.remarkable.com/
- *
- * Authors: Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>
- *          Alistair Francis <alistair@alistair23.me>
- */
-
-#include <linux/err.h>
-#include <linux/hwmon.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/regmap.h>
-#include <linux/regulator/machine.h>
-
-#include <linux/mfd/sy7636a.h>
-
-static int sy7636a_read(struct device *dev, enum hwmon_sensor_types type,
-			u32 attr, int channel, long *temp)
-{
-	struct regmap *regmap = dev_get_drvdata(dev);
-	int ret, reg_val;
-
-	ret = regmap_read(regmap,
-			  SY7636A_REG_TERMISTOR_READOUT, &reg_val);
-	if (ret)
-		return ret;
-
-	*temp = reg_val * 1000;
-
-	return 0;
-}
-
-static umode_t sy7636a_is_visible(const void *data,
-				  enum hwmon_sensor_types type,
-				  u32 attr, int channel)
-{
-	if (type != hwmon_temp)
-		return 0;
-
-	if (attr != hwmon_temp_input)
-		return 0;
-
-	return 0444;
-}
-
-static const struct hwmon_ops sy7636a_hwmon_ops = {
-	.is_visible = sy7636a_is_visible,
-	.read = sy7636a_read,
-};
-
-static const struct hwmon_channel_info * const sy7636a_info[] = {
-	HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
-	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
-	NULL
-};
-
-static const struct hwmon_chip_info sy7636a_chip_info = {
-	.ops = &sy7636a_hwmon_ops,
-	.info = sy7636a_info,
-};
-
-static int sy7636a_sensor_probe(struct platform_device *pdev)
-{
-	struct regmap *regmap = dev_get_regmap(pdev->dev.parent, NULL);
-	struct device *hwmon_dev;
-	int err;
-
-	if (!regmap)
-		return -EPROBE_DEFER;
-
-	err = devm_regulator_get_enable(&pdev->dev, "vcom");
-	if (err)
-		return err;
-
-	hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
-							 "sy7636a_temperature", regmap,
-							 &sy7636a_chip_info, NULL);
-
-	if (IS_ERR(hwmon_dev)) {
-		err = PTR_ERR(hwmon_dev);
-		dev_err(&pdev->dev, "Unable to register hwmon device, returned %d\n", err);
-		return err;
-	}
-
-	return 0;
-}
-
-static struct platform_driver sy7636a_sensor_driver = {
-	.probe = sy7636a_sensor_probe,
-	.driver = {
-		.name = "sy7636a-temperature",
-	},
-};
-module_platform_driver(sy7636a_sensor_driver);
-
-MODULE_DESCRIPTION("SY7636A sensor driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:sy7636a-temperature");
diff --git a/drivers/mfd/simple-mfd-i2c.c b/drivers/mfd/simple-mfd-i2c.c
index ef3ce4bdf98b..168b4cf49b8c 100644
--- a/drivers/mfd/simple-mfd-i2c.c
+++ b/drivers/mfd/simple-mfd-i2c.c
@@ -69,7 +69,6 @@ static int simple_mfd_i2c_probe(struct i2c_client *i2c)
 
 static const struct mfd_cell sy7636a_cells[] = {
 	{ .name = "sy7636a-regulator", },
-	{ .name = "sy7636a-temperature", },
 };
 
 static const struct simple_mfd_data silergy_sy7636a = {
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 88ba2770e378..f0d8d1319a1b 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -1624,6 +1624,7 @@ config REGULATOR_SY7636A
 	depends on MFD_SY7636A
 	help
 	  This driver supports Silergy SY7636A voltage regulator.
+	  If HWMON is enabled, it also provides temperature measurement.
 
 config REGULATOR_SY8106A
 	tristate "Silergy SY8106A regulator"
diff --git a/drivers/regulator/sy7636a-regulator.c b/drivers/regulator/sy7636a-regulator.c
index 5705599d1b55..816df7716c0e 100644
--- a/drivers/regulator/sy7636a-regulator.c
+++ b/drivers/regulator/sy7636a-regulator.c
@@ -9,6 +9,7 @@
 
 #include <linux/completion.h>
 #include <linux/gpio/consumer.h>
+#include <linux/hwmon.h>
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
 #include <linux/mfd/sy7636a.h>
@@ -147,6 +148,52 @@ static const struct regulator_desc desc = {
 	.of_match = of_match_ptr("vcom"),
 };
 
+static int sy7636a_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
+			      u32 attr, int channel, long *temp)
+{
+	struct sy7636a_data *data = dev_get_drvdata(dev);
+	unsigned int mode, val;
+	int ret;
+
+	ret = regmap_read(data->regmap, SY7636A_REG_OPERATION_MODE_CRL, &mode);
+	if (ret)
+		return ret;
+
+	/* the thermistor is only sampled while the rails are on */
+	if (!(mode & SY7636A_OPERATION_MODE_CRL_ONOFF))
+		return -ENODATA;
+
+	ret = regmap_read(data->regmap, SY7636A_REG_TERMISTOR_READOUT, &val);
+	if (ret)
+		return ret;
+
+	*temp = (s8)val * 1000;
+
+	return 0;
+}
+
+static umode_t sy7636a_hwmon_is_visible(const void *data, enum hwmon_sensor_types type,
+					u32 attr, int channel)
+{
+	return 0444;
+}
+
+static const struct hwmon_channel_info * const sy7636a_hwmon_info[] = {
+	HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
+	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
+	NULL
+};
+
+static const struct hwmon_ops sy7636a_hwmon_ops = {
+	.is_visible = sy7636a_hwmon_is_visible,
+	.read = sy7636a_hwmon_read,
+};
+
+static const struct hwmon_chip_info sy7636a_hwmon_chip_info = {
+	.ops = &sy7636a_hwmon_ops,
+	.info = sy7636a_hwmon_info,
+};
+
 static int sy7636a_regulator_probe(struct platform_device *pdev)
 {
 	struct regmap *regmap = dev_get_regmap(pdev->dev.parent, NULL);
@@ -235,6 +282,15 @@ static int sy7636a_regulator_probe(struct platform_device *pdev)
 		return PTR_ERR(rdev);
 	}
 
+	if (IS_REACHABLE(CONFIG_HWMON)) {
+		struct device *hwmon_dev;
+
+		hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "sy7636a", data,
+								 &sy7636a_hwmon_chip_info, NULL);
+		if (IS_ERR(hwmon_dev))
+			dev_notice(&pdev->dev, "failed to register hwmon\n");
+	}
+
 	return 0;
 }
 
-- 
2.52.0


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

* [PATCH 6/7] regulator: sy7636a: bind to the I2C device directly
  2026-10-26  0:39 [PATCH 0/7] sy7636a: power the panel only during updates Pablo Mazzini
  2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
@ 2026-10-26  0:39 ` Pablo Mazzini
  2026-10-26  1:26   ` sashiko-bot
  2026-10-26  9:37 ` [PATCH 0/7] sy7636a: power the panel only during updates Andreas Kemnade
  2 siblings, 1 reply; 14+ messages in thread
From: Pablo Mazzini @ 2026-10-26  0:39 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood, Lee Jones, Guenter Roeck
  Cc: Pablo Mazzini, Alistair Francis, Andreas Kemnade, mfd,
	linux-hwmon, linux-kernel

With the temperature reported here, the regulator is all that is left
behind simple-mfd-i2c. Bind to the chip directly, as the TPS65185 and
FP9931 drivers do, and drop the MFD glue and header. It now probes before
the GPIOs may be ready, so report the power good GPIO with
dev_err_probe().

Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
---
 drivers/mfd/Kconfig                   | 10 ----
 drivers/mfd/simple-mfd-i2c.c          | 10 ----
 drivers/regulator/Kconfig             |  3 +-
 drivers/regulator/sy7636a-regulator.c | 86 +++++++++++++++------------
 include/linux/mfd/sy7636a.h           | 34 -----------
 5 files changed, 50 insertions(+), 93 deletions(-)
 delete mode 100644 include/linux/mfd/sy7636a.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 0a2778052519..9130dac7a7ff 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1305,16 +1305,6 @@ config MFD_SPMI_PMIC
 	  Say M here if you want to include support for the SPMI PMIC
 	  series as a module.  The module will be called "qcom-spmi-pmic".
 
-config MFD_SY7636A
-	tristate "Silergy SY7636A voltage regulator"
-	depends on I2C
-	select MFD_SIMPLE_MFD_I2C
-	help
-	  Enable support for Silergy SY7636A voltage regulator.
-
-	  To enable support for building sub-devices as modules,
-	  choose M here.
-
 config MFD_RDC321X
 	tristate "RDC R-321x southbridge"
 	select MFD_CORE
diff --git a/drivers/mfd/simple-mfd-i2c.c b/drivers/mfd/simple-mfd-i2c.c
index 168b4cf49b8c..0c9162034899 100644
--- a/drivers/mfd/simple-mfd-i2c.c
+++ b/drivers/mfd/simple-mfd-i2c.c
@@ -67,15 +67,6 @@ static int simple_mfd_i2c_probe(struct i2c_client *i2c)
 	return ret;
 }
 
-static const struct mfd_cell sy7636a_cells[] = {
-	{ .name = "sy7636a-regulator", },
-};
-
-static const struct simple_mfd_data silergy_sy7636a = {
-	.mfd_cell = sy7636a_cells,
-	.mfd_cell_size = ARRAY_SIZE(sy7636a_cells),
-};
-
 static const struct mfd_cell max5970_cells[] = {
 	{ .name = "max5970-regulator", },
 	{ .name = "max5970-iio", },
@@ -123,7 +114,6 @@ static const struct of_device_id simple_mfd_i2c_of_match[] = {
 	{ .compatible = "maxim,max5970", .data = &maxim_max5970 },
 	{ .compatible = "maxim,max5978", .data = &maxim_max5970 },
 	{ .compatible = "maxim,max77705-battery", .data = &maxim_mon_max77705 },
-	{ .compatible = "silergy,sy7636a", .data = &silergy_sy7636a },
 	{ .compatible = "spacemit,p1", .data = &spacemit_p1 },
 	{}
 };
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index f0d8d1319a1b..49b7c6dc541f 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -1621,7 +1621,8 @@ config REGULATOR_SUN20I
 
 config REGULATOR_SY7636A
 	tristate "Silergy SY7636A voltage regulator"
-	depends on MFD_SY7636A
+	depends on I2C
+	select REGMAP_I2C
 	help
 	  This driver supports Silergy SY7636A voltage regulator.
 	  If HWMON is enabled, it also provides temperature measurement.
diff --git a/drivers/regulator/sy7636a-regulator.c b/drivers/regulator/sy7636a-regulator.c
index 816df7716c0e..e170461a15ad 100644
--- a/drivers/regulator/sy7636a-regulator.c
+++ b/drivers/regulator/sy7636a-regulator.c
@@ -12,14 +12,23 @@
 #include <linux/hwmon.h>
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
-#include <linux/mfd/sy7636a.h>
 #include <linux/module.h>
-#include <linux/platform_device.h>
 #include <linux/regulator/consumer.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/regmap.h>
 
+#define SY7636A_REG_OPERATION_MODE_CRL		0x00
+#define SY7636A_OPERATION_MODE_CRL_VCOMCTL	BIT(6)
+#define SY7636A_OPERATION_MODE_CRL_ONOFF	BIT(7)
+#define SY7636A_REG_VCOM_ADJUST_CTRL_L		0x01
+#define SY7636A_REG_VCOM_ADJUST_CTRL_H		0x02
+#define SY7636A_REG_POWER_ON_DELAY_TIME		0x06
+#define SY7636A_REG_TERMISTOR_READOUT		0x08
+
+#define VCOM_ADJUST_CTRL_MASK	0x1ff
+#define VCOM_ADJUST_CTRL_SCAL	10000
+
 #define PGOOD_TIMEOUT_MSECS 200
 
 struct sy7636a_data {
@@ -194,49 +203,52 @@ static const struct hwmon_chip_info sy7636a_hwmon_chip_info = {
 	.info = sy7636a_hwmon_info,
 };
 
-static int sy7636a_regulator_probe(struct platform_device *pdev)
+static const struct regmap_config sy7636a_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+};
+
+static int sy7636a_regulator_probe(struct i2c_client *client)
 {
-	struct regmap *regmap = dev_get_regmap(pdev->dev.parent, NULL);
+	struct device *dev = &client->dev;
 	struct regulator_config config = { };
 	struct regulator_dev *rdev;
 	struct gpio_desc *gdp;
 	struct sy7636a_data *data;
+	struct regmap *regmap;
 	int irq, ret;
 
-	if (!regmap)
-		return -EPROBE_DEFER;
-
-	device_set_of_node_from_dev(&pdev->dev, pdev->dev.parent);
+	regmap = devm_regmap_init_i2c(client, &sy7636a_regmap_config);
+	if (IS_ERR(regmap))
+		return dev_err_probe(dev, PTR_ERR(regmap), "failed to allocate regmap\n");
 
-	gdp = devm_gpiod_get(&pdev->dev, "epd-pwr-good", GPIOD_IN);
-	if (IS_ERR(gdp)) {
-		dev_err(&pdev->dev, "Power good GPIO fault %ld\n", PTR_ERR(gdp));
-		return PTR_ERR(gdp);
-	}
+	gdp = devm_gpiod_get(dev, "epd-pwr-good", GPIOD_IN);
+	if (IS_ERR(gdp))
+		return dev_err_probe(dev, PTR_ERR(gdp), "Power good GPIO fault\n");
 
-	data = devm_kzalloc(&pdev->dev, sizeof(struct sy7636a_data), GFP_KERNEL);
+	data = devm_kzalloc(dev, sizeof(struct sy7636a_data), GFP_KERNEL);
 	if (!data)
 		return -ENOMEM;
 
 	data->regmap = regmap;
 	data->pgood_gpio = gdp;
 
-	ret = devm_regulator_get_enable_optional(&pdev->dev, "vin");
+	ret = devm_regulator_get_enable_optional(dev, "vin");
 	if (ret)
-		return dev_err_probe(&pdev->dev, ret,
+		return dev_err_probe(dev, ret,
 				     "failed to get vin regulator\n");
 
-	data->en_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",
+	data->en_gpio = devm_gpiod_get_optional(dev, "enable",
 						GPIOD_OUT_HIGH);
 	if (IS_ERR(data->en_gpio))
-		return dev_err_probe(&pdev->dev,
+		return dev_err_probe(dev,
 				     PTR_ERR(data->en_gpio),
 				     "failed to get en gpio\n");
 
-	data->vcom_en_gpio = devm_gpiod_get_optional(&pdev->dev,
+	data->vcom_en_gpio = devm_gpiod_get_optional(dev,
 						     "vcom-en", GPIOD_OUT_LOW);
 	if (IS_ERR(data->vcom_en_gpio))
-		return dev_err_probe(&pdev->dev,
+		return dev_err_probe(dev,
 				     PTR_ERR(data->vcom_en_gpio),
 				     "failed to get vcom-en gpio\n");
 
@@ -244,25 +256,24 @@ static int sy7636a_regulator_probe(struct platform_device *pdev)
 	if (data->en_gpio)
 		usleep_range(2500, 4000);
 
-	platform_set_drvdata(pdev, data);
+	i2c_set_clientdata(client, data);
 
 	ret = regmap_write(regmap, SY7636A_REG_POWER_ON_DELAY_TIME, 0x0);
 	if (ret) {
-		dev_err(pdev->dev.parent, "Failed to initialize regulator: %d\n", ret);
+		dev_err(dev, "Failed to initialize regulator: %d\n", ret);
 		return ret;
 	}
 
 	irq = gpiod_to_irq(data->pgood_gpio);
 	if (irq < 0)
-		return dev_err_probe(&pdev->dev, irq, "no power good interrupt\n");
+		return dev_err_probe(dev, irq, "no power good interrupt\n");
 
 	init_completion(&data->pgood_completion);
-	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, sy7636a_pgood_handler,
+	ret = devm_request_threaded_irq(dev, irq, NULL, sy7636a_pgood_handler,
 					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 					"sy7636a-pgood", data);
 	if (ret)
-		return dev_err_probe(&pdev->dev, ret,
-				     "failed to request power good interrupt\n");
+		return dev_err_probe(dev, ret, "failed to request power good interrupt\n");
 
 	/* VCOM switched by the VCOM_EN line; otherwise it follows the power on sequence */
 	if (data->vcom_en_gpio) {
@@ -272,43 +283,42 @@ static int sy7636a_regulator_probe(struct platform_device *pdev)
 			return ret;
 	}
 
-	config.dev = &pdev->dev;
+	config.dev = dev;
 	config.regmap = regmap;
 
-	rdev = devm_regulator_register(&pdev->dev, &desc, &config);
+	rdev = devm_regulator_register(dev, &desc, &config);
 	if (IS_ERR(rdev)) {
-		dev_err(pdev->dev.parent, "Failed to register %s regulator\n",
-			pdev->name);
+		dev_err(dev, "Failed to register %s regulator\n", desc.name);
 		return PTR_ERR(rdev);
 	}
 
 	if (IS_REACHABLE(CONFIG_HWMON)) {
 		struct device *hwmon_dev;
 
-		hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "sy7636a", data,
+		hwmon_dev = devm_hwmon_device_register_with_info(dev, "sy7636a", data,
 								 &sy7636a_hwmon_chip_info, NULL);
 		if (IS_ERR(hwmon_dev))
-			dev_notice(&pdev->dev, "failed to register hwmon\n");
+			dev_notice(dev, "failed to register hwmon\n");
 	}
 
 	return 0;
 }
 
-static const struct platform_device_id sy7636a_regulator_id_table[] = {
-	{ .name = "sy7636a-regulator" },
+static const struct of_device_id sy7636a_of_match[] = {
+	{ .compatible = "silergy,sy7636a" },
 	{ }
 };
-MODULE_DEVICE_TABLE(platform, sy7636a_regulator_id_table);
+MODULE_DEVICE_TABLE(of, sy7636a_of_match);
 
-static struct platform_driver sy7636a_regulator_driver = {
+static struct i2c_driver sy7636a_regulator_driver = {
 	.driver = {
 		.name = "sy7636a-regulator",
 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
+		.of_match_table = sy7636a_of_match,
 	},
 	.probe = sy7636a_regulator_probe,
-	.id_table = sy7636a_regulator_id_table,
 };
-module_platform_driver(sy7636a_regulator_driver);
+module_i2c_driver(sy7636a_regulator_driver);
 
 MODULE_AUTHOR("Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>");
 MODULE_DESCRIPTION("SY7636A voltage regulator driver");
diff --git a/include/linux/mfd/sy7636a.h b/include/linux/mfd/sy7636a.h
deleted file mode 100644
index 22f03b2f851e..000000000000
--- a/include/linux/mfd/sy7636a.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Functions to access SY3686A power management chip.
- *
- * Copyright (C) 2021 reMarkable AS - http://www.remarkable.com/
- */
-
-#ifndef __MFD_SY7636A_H
-#define __MFD_SY7636A_H
-
-#define SY7636A_REG_OPERATION_MODE_CRL		0x00
-/* It is set if a gpio is used to control the regulator */
-#define SY7636A_OPERATION_MODE_CRL_VCOMCTL	BIT(6)
-#define SY7636A_OPERATION_MODE_CRL_ONOFF	BIT(7)
-#define SY7636A_REG_VCOM_ADJUST_CTRL_L		0x01
-#define SY7636A_REG_VCOM_ADJUST_CTRL_H		0x02
-#define SY7636A_REG_VCOM_ADJUST_CTRL_MASK	0x01ff
-#define SY7636A_REG_VLDO_VOLTAGE_ADJULST_CTRL	0x03
-#define SY7636A_REG_POWER_ON_DELAY_TIME		0x06
-#define SY7636A_REG_FAULT_FLAG			0x07
-#define SY7636A_FAULT_FLAG_PG			BIT(0)
-#define SY7636A_REG_TERMISTOR_READOUT		0x08
-
-#define SY7636A_REG_MAX				0x08
-
-#define VCOM_ADJUST_CTRL_MASK	0x1ff
-// Used to shift the high byte
-#define VCOM_ADJUST_CTRL_SHIFT	8
-// Used to scale from VCOM_ADJUST_CTRL to mv
-#define VCOM_ADJUST_CTRL_SCAL	10000
-
-#define FAULT_FLAG_SHIFT	1
-
-#endif /* __LINUX_MFD_SY7636A_H */
-- 
2.52.0


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

* Re: [PATCH 6/7] regulator: sy7636a: bind to the I2C device directly
  2026-10-26  0:39 ` [PATCH 6/7] regulator: sy7636a: bind to the I2C device directly Pablo Mazzini
@ 2026-10-26  1:26   ` sashiko-bot
  0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-10-26  1:26 UTC (permalink / raw)
  To: Pablo Mazzini; +Cc: mfd, linux-hwmon, lee

> With the temperature reported here, the regulator is all that is left
> behind simple-mfd-i2c. Bind to the chip directly, as the TPS65185 and
> FP9931 drivers do, and drop the MFD glue and header. It now probes before
> the GPIOs may be ready, so report the power good GPIO with
> dev_err_probe().
> 
> Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>

Sashiko has reviewed this patch and found no issues.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261026003918.155321-1-pmazzini@gmail.com?part=6


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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
@ 2026-10-26  1:35   ` sashiko-bot
  2026-10-26  2:10     ` Pablo Mazzini
  2026-10-26  8:42   ` Andreas Kemnade
  2026-10-26 14:35   ` Guenter Roeck
  2 siblings, 1 reply; 14+ messages in thread
From: sashiko-bot @ 2026-10-26  1:35 UTC (permalink / raw)
  To: Pablo Mazzini; +Cc: linux-hwmon, mfd, lee

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] regulator: sy7636a: registering hwmon device outside drivers/hwmon/
--

commit 3011502577fb90233215473b5182522faa4b0058
Author: Pablo Mazzini <pmazzini@gmail.com>

regulator: sy7636a: report the temperature

This commit removes the dedicated sy7636a hardware monitoring driver and
moves temperature reporting into the sy7636a regulator driver, reading the
thermistor register only when the rails are enabled.

> diff --git a/drivers/regulator/sy7636a-regulator.c b/drivers/regulator/sy7636a-regulator.c
> index 5705599d1b55e..816df7716c0e0 100644
> --- a/drivers/regulator/sy7636a-regulator.c
> +++ b/drivers/regulator/sy7636a-regulator.c

[ ... ]

> @@ -147,6 +148,52 @@ static const struct regulator_desc desc = {
>  	.of_match = of_match_ptr("vcom"),
>  };
>  
> +static int sy7636a_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
> +			      u32 attr, int channel, long *temp)
> +{
> +	struct sy7636a_data *data = dev_get_drvdata(dev);
> +	unsigned int mode, val;
> +	int ret;
> +
> +	ret = regmap_read(data->regmap, SY7636A_REG_OPERATION_MODE_CRL, &mode);
> +	if (ret)
> +		return ret;
> +
> +	/* the thermistor is only sampled while the rails are on */
> +	if (!(mode & SY7636A_OPERATION_MODE_CRL_ONOFF))
> +		return -ENODATA;
> +
> +	ret = regmap_read(data->regmap, SY7636A_REG_TERMISTOR_READOUT, &val);
> +	if (ret)
> +		return ret;
> +
> +	*temp = (s8)val * 1000;
> +
> +	return 0;
> +}

[ ... ]

> @@ -235,6 +282,15 @@ static int sy7636a_regulator_probe(struct platform_device *pdev)
>  		return PTR_ERR(rdev);
>  	}
>  
> +	if (IS_REACHABLE(CONFIG_HWMON)) {
> +		struct device *hwmon_dev;
> +
> +		hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "sy7636a", data,
> +								 &sy7636a_hwmon_chip_info, NULL);
> +		if (IS_ERR(hwmon_dev))
> +			dev_notice(&pdev->dev, "failed to register hwmon\n");
> +	}

[Severity: Medium]
Should the hardware monitoring driver remain in drivers/hwmon/ rather than
calling devm_hwmon_device_register_with_info() directly from
sy7636a_regulator_probe() in drivers/regulator/sy7636a-regulator.c?

Hardware monitoring drivers are expected to reside in drivers/hwmon/, and
when a chip's primary functionality is in another subsystem, its hardware
monitoring support should be implemented as an auxiliary or subdevice driver
in drivers/hwmon/ rather than registering a hwmon device directly from
outside drivers/hwmon/.

While the follow-up commit ("regulator: sy7636a: bind to the i2c device
directly") removes the mfd cell table in drivers/mfd/simple-mfd-i2c.c,
sy7636a_hwmon_read() only accesses the shared regmap via regmap_read() and
does not depend on internal regulator driver state. Could the temperature
reading check be kept in drivers/hwmon/sy7636a-hwmon.c (for instance via an
auxiliary device registered by the regulator driver)?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261026003918.155321-1-pmazzini@gmail.com?part=5

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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26  1:35   ` sashiko-bot
@ 2026-10-26  2:10     ` Pablo Mazzini
  0 siblings, 0 replies; 14+ messages in thread
From: Pablo Mazzini @ 2026-10-26  2:10 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: linux-hwmon, mfd, lee

This follows the TPS65185 and FP9931 drivers, which register their
temperature sensor in the same way.

On Mon, Oct 26, 2026 at 1:35 AM <sashiko-bot@kernel.org> wrote:
>
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] regulator: sy7636a: registering hwmon device outside drivers/hwmon/
> --
>
> commit 3011502577fb90233215473b5182522faa4b0058
> Author: Pablo Mazzini <pmazzini@gmail.com>
>
> regulator: sy7636a: report the temperature
>
> This commit removes the dedicated sy7636a hardware monitoring driver and
> moves temperature reporting into the sy7636a regulator driver, reading the
> thermistor register only when the rails are enabled.
>
> > diff --git a/drivers/regulator/sy7636a-regulator.c b/drivers/regulator/sy7636a-regulator.c
> > index 5705599d1b55e..816df7716c0e0 100644
> > --- a/drivers/regulator/sy7636a-regulator.c
> > +++ b/drivers/regulator/sy7636a-regulator.c
>
> [ ... ]
>
> > @@ -147,6 +148,52 @@ static const struct regulator_desc desc = {
> >       .of_match = of_match_ptr("vcom"),
> >  };
> >
> > +static int sy7636a_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
> > +                           u32 attr, int channel, long *temp)
> > +{
> > +     struct sy7636a_data *data = dev_get_drvdata(dev);
> > +     unsigned int mode, val;
> > +     int ret;
> > +
> > +     ret = regmap_read(data->regmap, SY7636A_REG_OPERATION_MODE_CRL, &mode);
> > +     if (ret)
> > +             return ret;
> > +
> > +     /* the thermistor is only sampled while the rails are on */
> > +     if (!(mode & SY7636A_OPERATION_MODE_CRL_ONOFF))
> > +             return -ENODATA;
> > +
> > +     ret = regmap_read(data->regmap, SY7636A_REG_TERMISTOR_READOUT, &val);
> > +     if (ret)
> > +             return ret;
> > +
> > +     *temp = (s8)val * 1000;
> > +
> > +     return 0;
> > +}
>
> [ ... ]
>
> > @@ -235,6 +282,15 @@ static int sy7636a_regulator_probe(struct platform_device *pdev)
> >               return PTR_ERR(rdev);
> >       }
> >
> > +     if (IS_REACHABLE(CONFIG_HWMON)) {
> > +             struct device *hwmon_dev;
> > +
> > +             hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "sy7636a", data,
> > +                                                              &sy7636a_hwmon_chip_info, NULL);
> > +             if (IS_ERR(hwmon_dev))
> > +                     dev_notice(&pdev->dev, "failed to register hwmon\n");
> > +     }
>
> [Severity: Medium]
> Should the hardware monitoring driver remain in drivers/hwmon/ rather than
> calling devm_hwmon_device_register_with_info() directly from
> sy7636a_regulator_probe() in drivers/regulator/sy7636a-regulator.c?
>
> Hardware monitoring drivers are expected to reside in drivers/hwmon/, and
> when a chip's primary functionality is in another subsystem, its hardware
> monitoring support should be implemented as an auxiliary or subdevice driver
> in drivers/hwmon/ rather than registering a hwmon device directly from
> outside drivers/hwmon/.
>
> While the follow-up commit ("regulator: sy7636a: bind to the i2c device
> directly") removes the mfd cell table in drivers/mfd/simple-mfd-i2c.c,
> sy7636a_hwmon_read() only accesses the shared regmap via regmap_read() and
> does not depend on internal regulator driver state. Could the temperature
> reading check be kept in drivers/hwmon/sy7636a-hwmon.c (for instance via an
> auxiliary device registered by the regulator driver)?
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20261026003918.155321-1-pmazzini@gmail.com?part=5

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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
  2026-10-26  1:35   ` sashiko-bot
@ 2026-10-26  8:42   ` Andreas Kemnade
  2026-10-26 14:35   ` Guenter Roeck
  2 siblings, 0 replies; 14+ messages in thread
From: Andreas Kemnade @ 2026-10-26  8:42 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Mark Brown, Liam Girdwood, Guenter Roeck, Lee Jones,
	Alistair Francis, linux-hwmon, mfd, linux-kernel

On Mon, 26 Oct 2026 00:39:16 +0000
Pablo Mazzini <pmazzini@gmail.com> wrote:

> The separate hwmon cell enables VCOM at probe. Report the temperature
> from here, as the TPS65185 and FP9931 drivers do, and under the chip
> name as they do: read it while the rails are on and return -ENODATA
> otherwise. Boards that need the rails on mark VCOM always-on. Drop the
> hwmon driver.

This might deserve a Fixes: tag as it fixes a race condition in probe.
But then it depends on the 4/7 patch, so it would be quite massive.

[...]
> -
> -static int sy7636a_sensor_probe(struct platform_device *pdev)
> -{
> -	struct regmap *regmap = dev_get_regmap(pdev->dev.parent, NULL);
> -	struct device *hwmon_dev;
> -	int err;
> -
> -	if (!regmap)
> -		return -EPROBE_DEFER;
> -
> -	err = devm_regulator_get_enable(&pdev->dev, "vcom");
> -	if (err)
> -		return err;
> -
and has depended on the regulator being registered first, otherwise
a dummy regulator would be provided.

Regards,
Andreas

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

* Re: [PATCH 0/7] sy7636a: power the panel only during updates
  2026-10-26  0:39 [PATCH 0/7] sy7636a: power the panel only during updates Pablo Mazzini
  2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
  2026-10-26  0:39 ` [PATCH 6/7] regulator: sy7636a: bind to the I2C device directly Pablo Mazzini
@ 2026-10-26  9:37 ` Andreas Kemnade
  2026-10-26 11:28   ` Pablo Mazzini
  2 siblings, 1 reply; 14+ messages in thread
From: Andreas Kemnade @ 2026-10-26  9:37 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Mark Brown, Liam Girdwood, Guenter Roeck, Lee Jones, Frank Li,
	Sascha Hauer, Alistair Francis, Pengutronix Kernel Team,
	Fabio Estevam, devicetree, imx, linux-arm-kernel, linux-hwmon,
	mfd, linux-kernel

On Mon, 26 Oct 2026 00:39:11 +0000
Pablo Mazzini <pmazzini@gmail.com> wrote:

> The SY7636A hwmon driver keeps VCOM on from probe, so a display driver
> can not power the panel only during updates.
> 
Yes, that is the common use case, power things on, tune update process
to the temperature, update, power off. So it makes completely sense.

> Read the temperature in the regulator driver instead, as the TPS65185
> and FP9931 drivers do, and remove the hwmon driver. Boards that relied
> on VCOM staying on mark it always-on. The regulator also switches VCOM
> with VCOM_EN, gains VCOM voltage control and binds to the I2C device
> directly.
> 
> Tested on a PocketBook Verse (B288).
> 
Which kernel do you use? Just curious, maybe some further upstreaming
actions might be coordinated or cross-reviewed.
There was discussion about in-kernel hwmon readout interface like it
exists for iio.

Regards,
Andreas

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

* Re: [PATCH 0/7] sy7636a: power the panel only during updates
  2026-10-26  9:37 ` [PATCH 0/7] sy7636a: power the panel only during updates Andreas Kemnade
@ 2026-10-26 11:28   ` Pablo Mazzini
  0 siblings, 0 replies; 14+ messages in thread
From: Pablo Mazzini @ 2026-10-26 11:28 UTC (permalink / raw)
  To: Andreas Kemnade
  Cc: Mark Brown, Liam Girdwood, Guenter Roeck, Lee Jones, Frank Li,
	Sascha Hauer, Alistair Francis, Pengutronix Kernel Team,
	Fabio Estevam, devicetree, imx, linux-arm-kernel, linux-hwmon,
	mfd, linux-kernel

Mainline, on top of linux-next. I started looking at the hwmon IIO
bridge. Coordinating and cross-reviewing further work sounds good.

On Mon, Oct 26, 2026 at 9:37 AM Andreas Kemnade <andreas@kemnade.info> wrote:
>
> On Mon, 26 Oct 2026 00:39:11 +0000
> Pablo Mazzini <pmazzini@gmail.com> wrote:
>
> > The SY7636A hwmon driver keeps VCOM on from probe, so a display driver
> > can not power the panel only during updates.
> >
> Yes, that is the common use case, power things on, tune update process
> to the temperature, update, power off. So it makes completely sense.
>
> > Read the temperature in the regulator driver instead, as the TPS65185
> > and FP9931 drivers do, and remove the hwmon driver. Boards that relied
> > on VCOM staying on mark it always-on. The regulator also switches VCOM
> > with VCOM_EN, gains VCOM voltage control and binds to the I2C device
> > directly.
> >
> > Tested on a PocketBook Verse (B288).
> >
> Which kernel do you use? Just curious, maybe some further upstreaming
> actions might be coordinated or cross-reviewed.
> There was discussion about in-kernel hwmon readout interface like it
> exists for iio.
>
> Regards,
> Andreas

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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
  2026-10-26  1:35   ` sashiko-bot
  2026-10-26  8:42   ` Andreas Kemnade
@ 2026-10-26 14:35   ` Guenter Roeck
  2026-10-26 23:26     ` Andreas Kemnade
  2 siblings, 1 reply; 14+ messages in thread
From: Guenter Roeck @ 2026-10-26 14:35 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Mark Brown, Liam Girdwood, Lee Jones, Alistair Francis,
	Andreas Kemnade, linux-hwmon, mfd, linux-kernel

On Mon, Oct 26, 2026 at 12:39:16AM +0000, Pablo Mazzini wrote:
> The separate hwmon cell enables VCOM at probe. Report the temperature
> from here, as the TPS65185 and FP9931 drivers do, and under the chip
> name as they do: read it while the rails are on and return -ENODATA
> otherwise. Boards that need the rails on mark VCOM always-on. Drop the
> hwmon driver.

This is going the wrong way. The correct solution would be to convert
the hwmon driver to an auxiliary driver. I am not going to approve
this patch. I am not giving an official NACK (yet).

"Other drivers do the same wrong thing" is not an argument.

Guenter

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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26 14:35   ` Guenter Roeck
@ 2026-10-26 23:26     ` Andreas Kemnade
  2026-10-27  7:32       ` Pablo Mazzini
  0 siblings, 1 reply; 14+ messages in thread
From: Andreas Kemnade @ 2026-10-26 23:26 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Pablo Mazzini, Mark Brown, Liam Girdwood, Lee Jones,
	Alistair Francis, linux-hwmon, mfd, linux-kernel

On Mon, 26 Oct 2026 07:35:24 -0700
Guenter Roeck <linux@roeck-us.net> wrote:

> On Mon, Oct 26, 2026 at 12:39:16AM +0000, Pablo Mazzini wrote:
> > The separate hwmon cell enables VCOM at probe. Report the temperature
> > from here, as the TPS65185 and FP9931 drivers do, and under the chip
> > name as they do: read it while the rails are on and return -ENODATA
> > otherwise. Boards that need the rails on mark VCOM always-on. Drop the
> > hwmon driver.  
> 
> This is going the wrong way. The correct solution would be to convert
> the hwmon driver to an auxiliary driver. I am not going to approve
> this patch. I am not giving an official NACK (yet).
> 

First we need the problem defined, then the solution, and then we can
talk about what is the correct solution. The commit message does not
name a problem.

So what we have:
one bit to turn on a bunch of things,
after one time to sample (< 1ms), fresh values are provided on the ADC
register periodically.
after some more time (max. 50ms), several voltage outputs are ready.
Powering on those things is expensive, so you would not use this as an
ordinary temperature sensor.

The problems I see in the sensor driver this patch might want to solve:
- problems if the regulator driver is registered earlier.
- not having powered on the regulator all the time (that is described
  in the cover letter)

The way the patch handles it does not require any structural change,
availabitily of the regmap is given. So it would be a separate cleanup
patch. 

But it introduces another race condition.
The temperature might be read too early.
1ms delay should suffice.

The  SY7636A_OPERATION_MODE_CRL_ONOFF flag might be reset before 
reading the temperature. If that register does not reset to zero
but just keeps the temperature last read, then we have no problem.

If not, there needs to be some synchronisation between the regulator
part and the sensor part, probably a mutex saved in a common structure.
And in that case, structural change of the drivers is needed which
I see the following possibilities:

a) non-simple mfd driver
b) aux device as a child of the regulator driver.
c) regulator driver containing everything.

No strong personal opinion here.

Regards,
Andreas


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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-26 23:26     ` Andreas Kemnade
@ 2026-10-27  7:32       ` Pablo Mazzini
  2026-10-27  9:18         ` Andreas Kemnade
  0 siblings, 1 reply; 14+ messages in thread
From: Pablo Mazzini @ 2026-10-27  7:32 UTC (permalink / raw)
  To: Andreas Kemnade, Guenter Roeck
  Cc: Mark Brown, Liam Girdwood, Lee Jones, Alistair Francis,
	linux-hwmon, mfd, linux-kernel

Hi Guenter, Andreas,

On Mon, Oct 26, 2026 at 07:35:24AM -0700, Guenter Roeck wrote:
> This is going the wrong way. The correct solution would be to convert
> the hwmon driver to an auxiliary driver.

Understood. In v2 the hwmon driver stays in drivers/hwmon and becomes an
auxiliary driver of the regulator, which binds the I2C device directly.

On Tue, 27 Oct 2026 00:26:35 +0100, Andreas Kemnade wrote:
> But it introduces another race condition.
> The temperature might be read too early.
> 1ms delay should suffice.
>
> The  SY7636A_OPERATION_MODE_CRL_ONOFF flag might be reset before
> reading the temperature. If that register does not reset to zero
> but just keeps the temperature last read, then we have no problem.

Good points. For v2 I read power good (0x07) and the temperature (0x08)
in one I2C transfer, and return -ENODATA unless power good is set, so no
locking is needed.

Thanks,
Pablo

On Mon, Oct 26, 2026 at 11:26 PM Andreas Kemnade <andreas@kemnade.info> wrote:
>
> On Mon, 26 Oct 2026 07:35:24 -0700
> Guenter Roeck <linux@roeck-us.net> wrote:
>
> > On Mon, Oct 26, 2026 at 12:39:16AM +0000, Pablo Mazzini wrote:
> > > The separate hwmon cell enables VCOM at probe. Report the temperature
> > > from here, as the TPS65185 and FP9931 drivers do, and under the chip
> > > name as they do: read it while the rails are on and return -ENODATA
> > > otherwise. Boards that need the rails on mark VCOM always-on. Drop the
> > > hwmon driver.
> >
> > This is going the wrong way. The correct solution would be to convert
> > the hwmon driver to an auxiliary driver. I am not going to approve
> > this patch. I am not giving an official NACK (yet).
> >
>
> First we need the problem defined, then the solution, and then we can
> talk about what is the correct solution. The commit message does not
> name a problem.
>
> So what we have:
> one bit to turn on a bunch of things,
> after one time to sample (< 1ms), fresh values are provided on the ADC
> register periodically.
> after some more time (max. 50ms), several voltage outputs are ready.
> Powering on those things is expensive, so you would not use this as an
> ordinary temperature sensor.
>
> The problems I see in the sensor driver this patch might want to solve:
> - problems if the regulator driver is registered earlier.
> - not having powered on the regulator all the time (that is described
>   in the cover letter)
>
> The way the patch handles it does not require any structural change,
> availabitily of the regmap is given. So it would be a separate cleanup
> patch.
>
> But it introduces another race condition.
> The temperature might be read too early.
> 1ms delay should suffice.
>
> The  SY7636A_OPERATION_MODE_CRL_ONOFF flag might be reset before
> reading the temperature. If that register does not reset to zero
> but just keeps the temperature last read, then we have no problem.
>
> If not, there needs to be some synchronisation between the regulator
> part and the sensor part, probably a mutex saved in a common structure.
> And in that case, structural change of the drivers is needed which
> I see the following possibilities:
>
> a) non-simple mfd driver
> b) aux device as a child of the regulator driver.
> c) regulator driver containing everything.
>
> No strong personal opinion here.
>
> Regards,
> Andreas
>

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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-27  7:32       ` Pablo Mazzini
@ 2026-10-27  9:18         ` Andreas Kemnade
  2026-10-27 21:32           ` Andreas Kemnade
  0 siblings, 1 reply; 14+ messages in thread
From: Andreas Kemnade @ 2026-10-27  9:18 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Guenter Roeck, Mark Brown, Liam Girdwood, Lee Jones,
	Alistair Francis, linux-hwmon, mfd, linux-kernel

On Tue, 27 Oct 2026 07:32:14 +0000
Pablo Mazzini <pmazzini@gmail.com> wrote:

> Hi Guenter, Andreas,
> 
> On Mon, Oct 26, 2026 at 07:35:24AM -0700, Guenter Roeck wrote:
> > This is going the wrong way. The correct solution would be to convert
> > the hwmon driver to an auxiliary driver.  
> 
> Understood. In v2 the hwmon driver stays in drivers/hwmon and becomes an
> auxiliary driver of the regulator, which binds the I2C device directly.
> 
But that is a cleanup action, which is at least a separate patch (maybe
replacing and exending your patch 6). So the other patches can go into
their separate trees.

> On Tue, 27 Oct 2026 00:26:35 +0100, Andreas Kemnade wrote:
> > But it introduces another race condition.
> > The temperature might be read too early.
> > 1ms delay should suffice.
> >
> > The  SY7636A_OPERATION_MODE_CRL_ONOFF flag might be reset before
> > reading the temperature. If that register does not reset to zero
> > but just keeps the temperature last read, then we have no problem.  
> 
> Good points. For v2 I read power good (0x07) and the temperature (0x08)
> in one I2C transfer, and return -ENODATA unless power good is set, so no
> locking is needed.
> 
From the data sheet we can ensure that power good occurs guaranteed after
the first sampling, so this approach is fine for the most common
use case. It reduces the time window with readable temperature
a bit more than needed, but that should not matter.

Regards,
Andreas

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

* Re: [PATCH 5/7] regulator: sy7636a: report the temperature
  2026-10-27  9:18         ` Andreas Kemnade
@ 2026-10-27 21:32           ` Andreas Kemnade
  0 siblings, 0 replies; 14+ messages in thread
From: Andreas Kemnade @ 2026-10-27 21:32 UTC (permalink / raw)
  To: Pablo Mazzini
  Cc: Guenter Roeck, Mark Brown, Liam Girdwood, Lee Jones,
	Alistair Francis, linux-hwmon, mfd, linux-kernel

On Tue, 27 Oct 2026 10:18:52 +0100
Andreas Kemnade <andreas@kemnade.info> wrote:

> On Tue, 27 Oct 2026 07:32:14 +0000
> Pablo Mazzini <pmazzini@gmail.com> wrote:
> 
> > Hi Guenter, Andreas,
> > 
> > On Mon, Oct 26, 2026 at 07:35:24AM -0700, Guenter Roeck wrote:  
> > > This is going the wrong way. The correct solution would be to convert
> > > the hwmon driver to an auxiliary driver.    
> > 
> > Understood. In v2 the hwmon driver stays in drivers/hwmon and becomes an
> > auxiliary driver of the regulator, which binds the I2C device directly.
> >   
> But that is a cleanup action, which is at least a separate patch (maybe
> replacing and exending your patch 6). So the other patches can go into
> their separate trees.
> 
looked again, I was wrong here,  vin-supply should be enabled before
i2c transfers, so we need the aux device approach.

Regards,
Andreas

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

end of thread, other threads:[~2026-10-27 21:33 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-26  0:39 [PATCH 0/7] sy7636a: power the panel only during updates Pablo Mazzini
2026-10-26  0:39 ` [PATCH 5/7] regulator: sy7636a: report the temperature Pablo Mazzini
2026-10-26  1:35   ` sashiko-bot
2026-10-26  2:10     ` Pablo Mazzini
2026-10-26  8:42   ` Andreas Kemnade
2026-10-26 14:35   ` Guenter Roeck
2026-10-26 23:26     ` Andreas Kemnade
2026-10-27  7:32       ` Pablo Mazzini
2026-10-27  9:18         ` Andreas Kemnade
2026-10-27 21:32           ` Andreas Kemnade
2026-10-26  0:39 ` [PATCH 6/7] regulator: sy7636a: bind to the I2C device directly Pablo Mazzini
2026-10-26  1:26   ` sashiko-bot
2026-10-26  9:37 ` [PATCH 0/7] sy7636a: power the panel only during updates Andreas Kemnade
2026-10-26 11:28   ` Pablo Mazzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox