Devicetree
 help / color / mirror / Atom feed
* [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C
@ 2026-09-18 16:42 Jishnu Prakash
  2026-09-18 16:42 ` [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
                   ` (6 more replies)
  0 siblings, 7 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

PM8010 is the next generation PMIC following PM8008 and has similar
functionality, providing 7 LDOs that power camera sensors and associated
hardware, with some differences from PM8008 LDOs. The series also adds
support for skipping interrupt configurations which is needed to support
SoCs where the PMIC's interrupt pin is grounded, such as Glymur.

Patch 1 adds the new compatible string for PM8010 over I2C

Patch 2 adds PM8010 LDO support

Patch 3 adds mode voting support for PM8010, which is not supported on PM8008

Patch 4 adds PM8010 support in the MFD driver

Patch 5 updates documentation to make interrupt configuration optional

Patch 6 updates the MFD driver to tolerate a missing interrupt

Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
Dhruvin Rajpura (1):
      regulator: qcom-pm8008: Add PM8010 mode support

Konrad Dybcio (5):
      dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible
      regulator: pm8008: Add PM8010 support
      mfd: qcom-pm8008: Add PM8010 support
      dt-bindings: mfd: pm8008: Make interrupts optional
      mfd: qcom-pm8008: Tolerate missing interrupt

 .../devicetree/bindings/mfd/qcom,pm8008.yaml       |  10 +-
 drivers/mfd/qcom-pm8008.c                          | 108 +++++++++---
 drivers/regulator/qcom-pm8008-regulator.c          | 184 ++++++++++++++++++---
 3 files changed, 250 insertions(+), 52 deletions(-)
---
base-commit: fd73f4a6659897191fa0d40695fe370925dd3780
change-id: 20260915-pm8010_i2c_support-3062421372c3

Best regards,
--  
Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>


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

* [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
@ 2026-09-18 16:42 ` Jishnu Prakash
  2026-09-18 16:49   ` sashiko-bot
  2026-09-28 19:48   ` Rob Herring (Arm)
  2026-09-18 16:42 ` [PATCH 2/6] regulator: pm8008: Add PM8010 support Jishnu Prakash
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

The PM8010 can communicate over both SPMI and I2C, based on whether
GPIO1 is pulled high or low respectively. Since the qcom,pm8010
compatible is already taken in the SPMI PMIC bindings and that set of
properties is heavily tailored towards SPMI, introduce a secondary
compatible to handle the I2C case.

Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
 Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml b/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml
index 0c6e1870db1d..2701aa755f31 100644
--- a/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml
+++ b/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml
@@ -16,7 +16,9 @@ description: |
 
 properties:
   compatible:
-    const: qcom,pm8008
+    enum:
+      - qcom,pm8008
+      - qcom,pm8010-i2c
 
   reg:
     maxItems: 1

-- 
2.43.0


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

* [PATCH 2/6] regulator: pm8008: Add PM8010 support
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
  2026-09-18 16:42 ` [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
@ 2026-09-18 16:42 ` Jishnu Prakash
  2026-09-18 16:50   ` sashiko-bot
  2026-09-18 16:42 ` [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support Jishnu Prakash
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

PM8010 is effectively the next generation of PM8008.

Like PM8008, PM8010 also has 7 LDOs under it which are used to power
camera sensors. The PM8010 LDO are of different types from the PM8008
ones and have different voltage dropout values. PM8010 LDOs do not have
a voltage step rate configuration register.

Add the necessary changes to support PM8010 LDOs.

Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Co-developed-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Signed-off-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
 drivers/regulator/qcom-pm8008-regulator.c | 109 +++++++++++++++++++++++-------
 1 file changed, 85 insertions(+), 24 deletions(-)

diff --git a/drivers/regulator/qcom-pm8008-regulator.c b/drivers/regulator/qcom-pm8008-regulator.c
index 9c9b8be2e15a..b484c0f73eea 100644
--- a/drivers/regulator/qcom-pm8008-regulator.c
+++ b/drivers/regulator/qcom-pm8008-regulator.c
@@ -39,24 +39,59 @@ struct pm8008_regulator_data {
 	unsigned int			base;
 	int				min_dropout_uV;
 	const struct linear_range	*voltage_range;
+	int				n_linear_ranges;
 };
 
-static const struct linear_range nldo_ranges[] = {
+struct pm8008_match_data {
+	const bool has_stepper_ctl_reg;
+	const struct pm8008_regulator_data *regulator_data;
+	const int num_regulators;
+};
+
+static const struct linear_range pm8008_nldo_ranges[] = {
 	REGULATOR_LINEAR_RANGE(528000, 0, 122, 8000),
 };
 
-static const struct linear_range pldo_ranges[] = {
+static const struct linear_range pm8008_pldo_ranges[] = {
 	REGULATOR_LINEAR_RANGE(1504000, 0, 237, 8000),
 };
 
+static const struct linear_range pm8010_nldo_ranges[] = {
+	REGULATOR_LINEAR_RANGE(528000, 0, 127, 8000),
+};
+
+static const struct linear_range pm8010_pldo_ranges[] = {
+	REGULATOR_LINEAR_RANGE(1504000, 0, 255, 8000),
+};
+
+static const struct linear_range pm8010_pldo_lv_ranges[] = {
+	REGULATOR_LINEAR_RANGE(1800000, 0,  2,  200000),
+	REGULATOR_LINEAR_RANGE(2608000, 3,  28, 16000),
+	REGULATOR_LINEAR_RANGE(3104000, 29, 30, 96000),
+	REGULATOR_LINEAR_RANGE(3312000, 31, 31, 0),
+};
+
+#define PM8008_REGULATOR(_name, _supply, _base, _dropout, _range)	\
+	{ _name, _supply, _base, _dropout, _range, ARRAY_SIZE(_range) }
+
 static const struct pm8008_regulator_data pm8008_reg_data[] = {
-	{ "ldo1", "vdd-l1-l2", 0x4000, 225000, nldo_ranges, },
-	{ "ldo2", "vdd-l1-l2", 0x4100, 225000, nldo_ranges, },
-	{ "ldo3", "vdd-l3-l4", 0x4200, 300000, pldo_ranges, },
-	{ "ldo4", "vdd-l3-l4", 0x4300, 300000, pldo_ranges, },
-	{ "ldo5", "vdd-l5",    0x4400, 200000, pldo_ranges, },
-	{ "ldo6", "vdd-l6",    0x4500, 200000, pldo_ranges, },
-	{ "ldo7", "vdd-l7",    0x4600, 200000, pldo_ranges, },
+	PM8008_REGULATOR("ldo1", "vdd-l1-l2", 0x4000, 225000, pm8008_nldo_ranges),
+	PM8008_REGULATOR("ldo2", "vdd-l1-l2", 0x4100, 225000, pm8008_nldo_ranges),
+	PM8008_REGULATOR("ldo3", "vdd-l3-l4", 0x4200, 300000, pm8008_pldo_ranges),
+	PM8008_REGULATOR("ldo4", "vdd-l3-l4", 0x4300, 300000, pm8008_pldo_ranges),
+	PM8008_REGULATOR("ldo5", "vdd-l5",    0x4400, 200000, pm8008_pldo_ranges),
+	PM8008_REGULATOR("ldo6", "vdd-l6",    0x4500, 200000, pm8008_pldo_ranges),
+	PM8008_REGULATOR("ldo7", "vdd-l7",    0x4600, 200000, pm8008_pldo_ranges),
+};
+
+static const struct pm8008_regulator_data pm8010_reg_data[] = {
+	PM8008_REGULATOR("ldo1", "vdd-l1-l2", 0x4000, 172000, pm8010_nldo_ranges),
+	PM8008_REGULATOR("ldo2", "vdd-l1-l2", 0x4100, 172000, pm8010_nldo_ranges),
+	PM8008_REGULATOR("ldo3", "vdd-l3-l4", 0x4200, 80000, pm8010_pldo_lv_ranges),
+	PM8008_REGULATOR("ldo4", "vdd-l3-l4", 0x4300, 80000, pm8010_pldo_lv_ranges),
+	PM8008_REGULATOR("ldo5", "vdd-l5",    0x4400, 296000, pm8010_pldo_ranges),
+	PM8008_REGULATOR("ldo6", "vdd-l6",    0x4500, 80000, pm8010_pldo_lv_ranges),
+	PM8008_REGULATOR("ldo7", "vdd-l7",    0x4600, 296000, pm8010_pldo_ranges),
 };
 
 static int pm8008_regulator_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
@@ -100,7 +135,7 @@ static int pm8008_regulator_get_voltage_sel(struct regulator_dev *rdev)
 }
 
 static const struct regulator_ops pm8008_regulator_ops = {
-	.list_voltage		= regulator_list_voltage_linear,
+	.list_voltage		= regulator_list_voltage_linear_range,
 	.set_voltage_sel	= pm8008_regulator_set_voltage_sel,
 	.get_voltage_sel	= pm8008_regulator_get_voltage_sel,
 	.enable			= regulator_enable_regmap,
@@ -110,8 +145,10 @@ static const struct regulator_ops pm8008_regulator_ops = {
 
 static int pm8008_regulator_probe(struct platform_device *pdev)
 {
+	const struct pm8008_match_data *match_data;
 	const struct pm8008_regulator_data *data;
 	struct regulator_config config = {};
+	const struct platform_device_id *id;
 	struct device *dev = &pdev->dev;
 	struct pm8008_regulator *preg;
 	struct regulator_desc *desc;
@@ -120,12 +157,20 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
 	unsigned int val;
 	int ret, i;
 
+	id = platform_get_device_id(pdev);
+	if (!id)
+		return dev_err_probe(dev, -ENODEV, "Missing platform device id\n");
+
+	match_data = (const struct pm8008_match_data *)id->driver_data;
+	if (!match_data)
+		return dev_err_probe(dev, -ENODATA, "Missing driver match data\n");
+
 	regmap = dev_get_regmap(dev->parent, "secondary");
 	if (!regmap)
 		return -EINVAL;
 
-	for (i = 0; i < ARRAY_SIZE(pm8008_reg_data); i++) {
-		data = &pm8008_reg_data[i];
+	for (i = 0; i < match_data->num_regulators; i++) {
+		data = &match_data->regulator_data[i];
 
 		preg = devm_kzalloc(dev, sizeof(*preg), GFP_KERNEL);
 		if (!preg)
@@ -145,18 +190,21 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
 		desc->owner = THIS_MODULE;
 
 		desc->linear_ranges = data->voltage_range;
-		desc->n_linear_ranges = 1;
-		desc->uV_step = desc->linear_ranges[0].step;
-		desc->min_uV = desc->linear_ranges[0].min;
-		desc->n_voltages = linear_range_values_in_range(&desc->linear_ranges[0]);
-
-		ret = regmap_read(regmap, preg->base + LDO_STEPPER_CTL_REG, &val);
-		if (ret < 0) {
-			dev_err(dev, "failed to read step rate: %d\n", ret);
-			return ret;
+		desc->n_linear_ranges = data->n_linear_ranges;
+		desc->n_voltages = linear_range_values_in_range_array(desc->linear_ranges,
+								      desc->n_linear_ranges);
+
+		if (match_data->has_stepper_ctl_reg) {
+			ret = regmap_read(regmap, preg->base + LDO_STEPPER_CTL_REG, &val);
+			if (ret < 0) {
+				dev_err(dev, "failed to read step rate: %d\n", ret);
+				return ret;
+			}
+			val &= STEP_RATE_MASK;
+			desc->ramp_delay = DEFAULT_VOLTAGE_STEPPER_RATE >> val;
+		} else {
+			desc->ramp_delay = DEFAULT_VOLTAGE_STEPPER_RATE;
 		}
-		val &= STEP_RATE_MASK;
-		desc->ramp_delay = DEFAULT_VOLTAGE_STEPPER_RATE >> val;
 
 		desc->min_dropout_uV = data->min_dropout_uV;
 
@@ -179,8 +227,21 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct pm8008_match_data pm8008_data = {
+	.has_stepper_ctl_reg = true,
+	.regulator_data = pm8008_reg_data,
+	.num_regulators = ARRAY_SIZE(pm8008_reg_data),
+};
+
+static const struct pm8008_match_data pm8010_data = {
+	.has_stepper_ctl_reg = false,
+	.regulator_data = pm8010_reg_data,
+	.num_regulators = ARRAY_SIZE(pm8010_reg_data),
+};
+
 static const struct platform_device_id pm8008_regulator_id_table[] = {
-	{ .name = "pm8008-regulator" },
+	{ .name = "pm8008-regulator", .driver_data = (kernel_ulong_t)&pm8008_data },
+	{ .name = "pm8010-regulator", .driver_data = (kernel_ulong_t)&pm8010_data },
 	{ }
 };
 MODULE_DEVICE_TABLE(platform, pm8008_regulator_id_table);

-- 
2.43.0


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

* [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
  2026-09-18 16:42 ` [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
  2026-09-18 16:42 ` [PATCH 2/6] regulator: pm8008: Add PM8010 support Jishnu Prakash
@ 2026-09-18 16:42 ` Jishnu Prakash
  2026-09-18 16:52   ` sashiko-bot
  2026-09-18 16:42 ` [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

From: Dhruvin Rajpura <drajpura@qti.qualcomm.com>

Implement set_mode/get_mode support for PM8010 LDOs using the mode
control and status registers to allow clients to vote for LDO modes.
Mode voting is not supported in the PM8008 LDOs.

Signed-off-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
 drivers/regulator/qcom-pm8008-regulator.c | 75 ++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/drivers/regulator/qcom-pm8008-regulator.c b/drivers/regulator/qcom-pm8008-regulator.c
index b484c0f73eea..9758809a6322 100644
--- a/drivers/regulator/qcom-pm8008-regulator.c
+++ b/drivers/regulator/qcom-pm8008-regulator.c
@@ -8,6 +8,7 @@
 #include <linux/array_size.h>
 #include <linux/bits.h>
 #include <linux/device.h>
+#include <linux/i2c.h>
 #include <linux/math.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -24,9 +25,19 @@
 
 #define LDO_VSET_LB_REG			0x40
 
+#define LDO_MODE_CTL1_REG		0x45
+#define MODE_PRIMARY_MASK		GENMASK(2, 0)
+#define LDO_MODE_NPM			7
+#define LDO_MODE_LPM			4
+
 #define LDO_ENABLE_REG			0x46
 #define ENABLE_BIT			BIT(7)
 
+#define LDO_STATUS1_REG			0x08
+#define MODE_STATE_MASK			GENMASK(1, 0)
+#define MODE_STATE_NPM			3
+#define MODE_STATE_LPM			2
+
 struct pm8008_regulator {
 	struct regmap		*regmap;
 	struct regulator_desc	desc;
@@ -134,6 +145,51 @@ static int pm8008_regulator_get_voltage_sel(struct regulator_dev *rdev)
 	return regulator_map_voltage_linear_range(rdev, uV, INT_MAX);
 }
 
+static int pm8010_regulator_set_mode(struct regulator_dev *rdev, unsigned int mode)
+{
+	struct pm8008_regulator *preg = rdev_get_drvdata(rdev);
+	unsigned int val;
+
+	switch (mode) {
+	case REGULATOR_MODE_NORMAL:
+		val = LDO_MODE_NPM;
+		break;
+	case REGULATOR_MODE_IDLE:
+		val = LDO_MODE_LPM;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return regmap_update_bits(preg->regmap, preg->base + LDO_MODE_CTL1_REG,
+				   MODE_PRIMARY_MASK, val);
+}
+
+static unsigned int pm8010_regulator_get_mode(struct regulator_dev *rdev)
+{
+	struct pm8008_regulator *preg = rdev_get_drvdata(rdev);
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(preg->regmap, preg->base + LDO_STATUS1_REG, &val);
+	if (ret < 0)
+		return REGULATOR_MODE_INVALID;
+
+	return (val & MODE_STATE_MASK) == MODE_STATE_NPM ?
+		REGULATOR_MODE_NORMAL : REGULATOR_MODE_IDLE;
+}
+
+static unsigned int pm8010_regulator_of_map_mode(unsigned int mode)
+{
+	switch (mode) {
+	case REGULATOR_MODE_NORMAL:
+	case REGULATOR_MODE_IDLE:
+		return mode;
+	default:
+		return REGULATOR_MODE_INVALID;
+	}
+}
+
 static const struct regulator_ops pm8008_regulator_ops = {
 	.list_voltage		= regulator_list_voltage_linear_range,
 	.set_voltage_sel	= pm8008_regulator_set_voltage_sel,
@@ -143,6 +199,17 @@ static const struct regulator_ops pm8008_regulator_ops = {
 	.is_enabled		= regulator_is_enabled_regmap,
 };
 
+static const struct regulator_ops pm8010_regulator_ops = {
+	.list_voltage		= regulator_list_voltage_linear_range,
+	.set_voltage_sel	= pm8008_regulator_set_voltage_sel,
+	.get_voltage_sel	= pm8008_regulator_get_voltage_sel,
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.is_enabled		= regulator_is_enabled_regmap,
+	.set_mode		= pm8010_regulator_set_mode,
+	.get_mode		= pm8010_regulator_get_mode,
+};
+
 static int pm8008_regulator_probe(struct platform_device *pdev)
 {
 	const struct pm8008_match_data *match_data;
@@ -155,6 +222,7 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
 	struct regulator_dev *rdev;
 	struct regmap *regmap;
 	unsigned int val;
+	bool is_pm8010;
 	int ret, i;
 
 	id = platform_get_device_id(pdev);
@@ -169,6 +237,9 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
 	if (!regmap)
 		return -EINVAL;
 
+	is_pm8010 = of_device_is_compatible(to_i2c_client(dev->parent)->dev.of_node,
+					    "qcom,pm8010-i2c");
+
 	for (i = 0; i < match_data->num_regulators; i++) {
 		data = &match_data->regulator_data[i];
 
@@ -185,7 +256,9 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
 		desc->supply_name = data->supply_name;
 		desc->of_match = data->name;
 		desc->regulators_node = of_match_ptr("regulators");
-		desc->ops = &pm8008_regulator_ops;
+		desc->ops = is_pm8010 ? &pm8010_regulator_ops : &pm8008_regulator_ops;
+		if (is_pm8010)
+			desc->of_map_mode = pm8010_regulator_of_map_mode;
 		desc->type = REGULATOR_VOLTAGE;
 		desc->owner = THIS_MODULE;
 

-- 
2.43.0


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

* [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
                   ` (2 preceding siblings ...)
  2026-09-18 16:42 ` [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support Jishnu Prakash
@ 2026-09-18 16:42 ` Jishnu Prakash
  2026-09-18 16:51   ` sashiko-bot
  2026-09-21 13:33   ` Konrad Dybcio
  2026-09-18 16:42 ` [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

PM8010 is effectively the next generation of PM8008. The device is
generally designed to serve the exact same function - power camera
sensors and the associated supporting hardware.

PM8010 supports both I2C and SPMI communications. The latter case is
already handled, since it reuses the same peripherals as other PMICs.
The I2C front-end is more less the same to the one of PM8008.

Plumb in the necessary changes to support it.

Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Co-developed-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Signed-off-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
 drivers/mfd/qcom-pm8008.c | 67 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 63 insertions(+), 4 deletions(-)

diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index 60204cc9a2dc..ed656f0d6df2 100644
--- a/drivers/mfd/qcom-pm8008.c
+++ b/drivers/mfd/qcom-pm8008.c
@@ -34,6 +34,7 @@ enum {
 	PM8008_GPIO1,
 	PM8008_GPIO2,
 	PM8008_NUM_PERIPHS,
+	PM8010_NUM_PERIPHS = 2,
 };
 
 #define PM8008_PERIPH_0_BASE	0x900
@@ -55,6 +56,10 @@ enum {
 #define PM8008_IRQ_GPIO1	6
 #define PM8008_IRQ_GPIO2	7
 
+#define PM8010_IRQ_MISC_MBG_FAULT	0
+/* 1-3 are unused */
+#define PM8010_IRQ_MISC_LDO_OCP		4
+
 enum {
 	SET_TYPE_INDEX,
 	POLARITY_HI_INDEX,
@@ -88,6 +93,12 @@ static const struct regmap_irq pm8008_irqs[] = {
 	_IRQ(PM8008_IRQ_GPIO2,	      PM8008_GPIO2,	BIT(0), IRQ_TYPE_SENSE_MASK),
 };
 
+static const struct regmap_irq pm8010_irqs[] = {
+	_IRQ(PM8010_IRQ_MISC_MBG_FAULT, PM8008_MISC, BIT(0), IRQ_TYPE_EDGE_RISING),
+	_IRQ(PM8010_IRQ_MISC_LDO_OCP, PM8008_MISC, BIT(4), IRQ_TYPE_EDGE_RISING),
+	_IRQ(PM8008_IRQ_TEMP_ALARM, PM8008_TEMP_ALARM, BIT(0), IRQ_TYPE_SENSE_MASK),
+};
+
 static const unsigned int pm8008_periph_base[] = {
 	PM8008_PERIPH_0_BASE,
 	PM8008_PERIPH_1_BASE,
@@ -158,6 +169,25 @@ static const struct regmap_irq_chip pm8008_irq_chip = {
 	.get_irq_reg		= pm8008_get_irq_reg,
 };
 
+static const struct regmap_irq_chip pm8010_irq_chip = {
+	.name			= "pm8010",
+	.main_status		= I2C_INTR_STATUS_BASE,
+	.num_main_regs		= 1,
+	.irqs			= pm8010_irqs,
+	.num_irqs		= ARRAY_SIZE(pm8010_irqs),
+	.num_regs		= PM8010_NUM_PERIPHS,
+	.status_base		= INT_LATCHED_STS_OFFSET,
+	.mask_base		= INT_EN_CLR_OFFSET,
+	.unmask_base		= INT_EN_SET_OFFSET,
+	.mask_unmask_non_inverted = true,
+	.ack_base		= INT_LATCHED_CLR_OFFSET,
+	.config_base		= pm8008_config_regs,
+	.num_config_bases	= ARRAY_SIZE(pm8008_config_regs),
+	.num_config_regs	= PM8010_NUM_PERIPHS,
+	.set_type_config	= pm8008_set_type_config,
+	.get_irq_reg		= pm8008_get_irq_reg,
+};
+
 static const struct regmap_config qcom_mfd_regmap_cfg = {
 	.name		= "primary",
 	.reg_bits	= 16,
@@ -183,6 +213,17 @@ static const struct mfd_cell pm8008_cells[] = {
 	MFD_CELL_NAME("pm8008-gpio"),
 };
 
+static const struct mfd_cell pm8010_cells[] = {
+	MFD_CELL_NAME("pm8010-regulator"),
+	MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
+};
+
+struct pm8008_match_data {
+	const struct regmap_irq_chip *irq_chip_desc;
+	const struct mfd_cell *mfd_cells;
+	int num_mfd_cells;
+};
+
 static void devm_irq_domain_fwnode_release(void *data)
 {
 	struct fwnode_handle *fwnode = data;
@@ -193,6 +234,7 @@ static void devm_irq_domain_fwnode_release(void *data)
 static int pm8008_probe(struct i2c_client *client)
 {
 	struct regmap_irq_chip_data *irq_data;
+	const struct pm8008_match_data *data;
 	struct device *dev = &client->dev;
 	struct regmap *regmap, *regmap2;
 	struct fwnode_handle *fwnode;
@@ -201,6 +243,10 @@ static int pm8008_probe(struct i2c_client *client)
 	char *name;
 	int ret;
 
+	data = device_get_match_data(dev);
+	if (!data)
+		return dev_err_probe(dev, -ENODATA, "Missing driver match data\n");
+
 	dummy = devm_i2c_new_dummy_device(dev, client->adapter, client->addr + 1);
 	if (IS_ERR(dummy)) {
 		ret = PTR_ERR(dummy);
@@ -246,7 +292,7 @@ static int pm8008_probe(struct i2c_client *client)
 		return ret;
 
 	ret = devm_regmap_add_irq_chip_fwnode(dev, fwnode, regmap, client->irq,
-				IRQF_SHARED, 0, &pm8008_irq_chip, &irq_data);
+				IRQF_SHARED, 0, data->irq_chip_desc, &irq_data);
 	if (ret) {
 		dev_err(dev, "failed to add IRQ chip: %d\n", ret);
 		return ret;
@@ -255,13 +301,26 @@ static int pm8008_probe(struct i2c_client *client)
 	/* Needed by GPIO driver. */
 	dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
 
-	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, pm8008_cells,
-				ARRAY_SIZE(pm8008_cells), NULL, 0,
+	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, data->mfd_cells,
+				data->num_mfd_cells, NULL, 0,
 				regmap_irq_get_domain(irq_data));
 }
 
+static const struct pm8008_match_data pm8008_data = {
+	.irq_chip_desc = &pm8008_irq_chip,
+	.mfd_cells = pm8008_cells,
+	.num_mfd_cells = ARRAY_SIZE(pm8008_cells),
+};
+
+static const struct pm8008_match_data pm8010_data = {
+	.irq_chip_desc = &pm8010_irq_chip,
+	.mfd_cells = pm8010_cells,
+	.num_mfd_cells = ARRAY_SIZE(pm8010_cells),
+};
+
 static const struct of_device_id pm8008_match[] = {
-	{ .compatible = "qcom,pm8008", },
+	{ .compatible = "qcom,pm8008", .data = &pm8008_data },
+	{ .compatible = "qcom,pm8010-i2c", .data = &pm8010_data },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, pm8008_match);

-- 
2.43.0


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

* [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
                   ` (3 preceding siblings ...)
  2026-09-18 16:42 ` [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
@ 2026-09-18 16:42 ` Jishnu Prakash
  2026-09-18 16:50   ` sashiko-bot
  2026-09-28 19:49   ` Rob Herring (Arm)
  2026-09-18 16:42 ` [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
  2026-09-19 13:01 ` [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Oleg Keri
  6 siblings, 2 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

Some designs integrate the PMIC with the interrupt pin left
unconnected, deliberately. That of course compromises some
functionality, but the core function of programming the voltage
regulators remains there.

Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
 Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml b/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml
index 2701aa755f31..3c0febc8152b 100644
--- a/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml
+++ b/Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml
@@ -90,7 +90,6 @@ properties:
 required:
   - compatible
   - reg
-  - interrupts
   - vdd-l1-l2-supply
   - vdd-l3-l4-supply
   - vdd-l5-supply
@@ -99,10 +98,11 @@ required:
   - gpio-controller
   - "#gpio-cells"
   - gpio-ranges
-  - interrupt-controller
-  - "#interrupt-cells"
   - "#thermal-sensor-cells"
 
+dependencies:
+  interrupt-controller: [ interrupts, "#interrupt-cells" ]
+
 additionalProperties: false
 
 examples:

-- 
2.43.0


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

* [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
                   ` (4 preceding siblings ...)
  2026-09-18 16:42 ` [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
@ 2026-09-18 16:42 ` Jishnu Prakash
  2026-09-18 16:57   ` sashiko-bot
  2026-09-19 13:01 ` [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Oleg Keri
  6 siblings, 1 reply; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-18 16:42 UTC (permalink / raw)
  To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri,
	Jishnu Prakash

From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

PM8010 is often wired up with the interrupt pin tied to ground. Only
register the IRQ infrastructure if we have a parent irq.

Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Co-developed-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Signed-off-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
 drivers/mfd/qcom-pm8008.c | 45 ++++++++++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 21 deletions(-)

diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index ed656f0d6df2..77e4f6c04ac7 100644
--- a/drivers/mfd/qcom-pm8008.c
+++ b/drivers/mfd/qcom-pm8008.c
@@ -233,7 +233,7 @@ static void devm_irq_domain_fwnode_release(void *data)
 
 static int pm8008_probe(struct i2c_client *client)
 {
-	struct regmap_irq_chip_data *irq_data;
+	struct regmap_irq_chip_data *irq_data = NULL;
 	const struct pm8008_match_data *data;
 	struct device *dev = &client->dev;
 	struct regmap *regmap, *regmap2;
@@ -277,33 +277,36 @@ static int pm8008_probe(struct i2c_client *client)
 	 */
 	usleep_range(1000, 2000);
 
-	name = devm_kasprintf(dev, GFP_KERNEL, "%pOF-internal", dev->of_node);
-	if (!name)
-		return -ENOMEM;
+	if (client->irq) {
+		name = devm_kasprintf(dev, GFP_KERNEL, "%pOF-internal", dev->of_node);
+		if (!name)
+			return -ENOMEM;
 
-	name = strreplace(name, '/', ':');
+		name = strreplace(name, '/', ':');
 
-	fwnode = irq_domain_alloc_named_fwnode(name);
-	if (!fwnode)
-		return -ENOMEM;
+		fwnode = irq_domain_alloc_named_fwnode(name);
+		if (!fwnode)
+			return -ENOMEM;
 
-	ret = devm_add_action_or_reset(dev, devm_irq_domain_fwnode_release, fwnode);
-	if (ret)
-		return ret;
+		ret = devm_add_action_or_reset(dev, devm_irq_domain_fwnode_release, fwnode);
+		if (ret)
+			return ret;
 
-	ret = devm_regmap_add_irq_chip_fwnode(dev, fwnode, regmap, client->irq,
-				IRQF_SHARED, 0, data->irq_chip_desc, &irq_data);
-	if (ret) {
-		dev_err(dev, "failed to add IRQ chip: %d\n", ret);
-		return ret;
-	}
+		ret = devm_regmap_add_irq_chip_fwnode(dev, fwnode, regmap, client->irq,
+						      IRQF_SHARED, 0, data->irq_chip_desc,
+						      &irq_data);
+		if (ret) {
+			dev_err(dev, "failed to add IRQ chip: %d\n", ret);
+			return ret;
+		}
 
-	/* Needed by GPIO driver. */
-	dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
+		/* Needed by GPIO driver. */
+		dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
+	}
 
 	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, data->mfd_cells,
-				data->num_mfd_cells, NULL, 0,
-				regmap_irq_get_domain(irq_data));
+				    data->num_mfd_cells, NULL, 0,
+				    regmap_irq_get_domain(irq_data));
 }
 
 static const struct pm8008_match_data pm8008_data = {

-- 
2.43.0


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

* Re: [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible
  2026-09-18 16:42 ` [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
@ 2026-09-18 16:49   ` sashiko-bot
  2026-09-28 19:48   ` Rob Herring (Arm)
  1 sibling, 0 replies; 24+ messages in thread
From: sashiko-bot @ 2026-09-18 16:49 UTC (permalink / raw)
  To: Jishnu Prakash; +Cc: robh, conor+dt, lee, devicetree, mfd

> From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> The PM8010 can communicate over both SPMI and I2C, based on whether
> GPIO1 is pulled high or low respectively. Since the qcom,pm8010
> compatible is already taken in the SPMI PMIC bindings and that set of
> properties is heavily tailored towards SPMI, introduce a secondary
> compatible to handle the I2C case.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>

Sashiko has reviewed this patch and found no issues. It looks great!

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=1


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

* Re: [PATCH 2/6] regulator: pm8008: Add PM8010 support
  2026-09-18 16:42 ` [PATCH 2/6] regulator: pm8008: Add PM8010 support Jishnu Prakash
@ 2026-09-18 16:50   ` sashiko-bot
  0 siblings, 0 replies; 24+ messages in thread
From: sashiko-bot @ 2026-09-18 16:50 UTC (permalink / raw)
  To: Jishnu Prakash; +Cc: robh, conor+dt, lee, mfd, devicetree

> From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> PM8010 is effectively the next generation of PM8008.
> 
> Like PM8008, PM8010 also has 7 LDOs under it which are used to power
> camera sensors. The PM8010 LDO are of different types from the PM8008
> ones and have different voltage dropout values. PM8010 LDOs do not have
> a voltage step rate configuration register.
> 
> Add the necessary changes to support PM8010 LDOs.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Co-developed-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
> Signed-off-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
> Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>

Sashiko has reviewed this patch and found no issues. It looks great!

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=2


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

* Re: [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional
  2026-09-18 16:42 ` [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
@ 2026-09-18 16:50   ` sashiko-bot
  2026-09-28 19:49   ` Rob Herring (Arm)
  1 sibling, 0 replies; 24+ messages in thread
From: sashiko-bot @ 2026-09-18 16:50 UTC (permalink / raw)
  To: Jishnu Prakash; +Cc: robh, lee, devicetree, mfd, conor+dt

> From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> Some designs integrate the PMIC with the interrupt pin left
> unconnected, deliberately. That of course compromises some
> functionality, but the core function of programming the voltage
> regulators remains there.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>

Sashiko has reviewed this patch and found no issues. It looks great!

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=5


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

* Re: [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support
  2026-09-18 16:42 ` [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
@ 2026-09-18 16:51   ` sashiko-bot
  2026-09-23 10:17     ` Jishnu Prakash
  2026-09-21 13:33   ` Konrad Dybcio
  1 sibling, 1 reply; 24+ messages in thread
From: sashiko-bot @ 2026-09-18 16:51 UTC (permalink / raw)
  To: Jishnu Prakash; +Cc: lee, robh, mfd, conor+dt, devicetree

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] mfd: complex data passed via match table .data field
--

commit a6c2d131522cd1b3f195202001e9365b690fa7f6
Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

mfd: qcom-pm8008: Add PM8010 support

This commit adds support for the PM8010 device, which is the next
generation of the PM8008. It handles I2C and SPMI communications, plumbing
in the necessary IRQs and MFD cells to support the new device variants.

> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> index 60204cc9a2dc6..ed656f0d6df25 100644
> --- a/drivers/mfd/qcom-pm8008.c
> +++ b/drivers/mfd/qcom-pm8008.c
[ ... ]
> @@ -213,6 +213,17 @@ static const struct mfd_cell pm8008_cells[] = {
>  	MFD_CELL_NAME("pm8008-gpio"),
>  };
>  
> +static const struct mfd_cell pm8010_cells[] = {
> +	MFD_CELL_NAME("pm8010-regulator"),
> +	MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
> +};
> +
> +struct pm8008_match_data {
> +	const struct regmap_irq_chip *irq_chip_desc;
> +	const struct mfd_cell *mfd_cells;
> +	int num_mfd_cells;
> +};
> +

[Severity: Medium]
Does embedding the mfd_cell arrays inside a match data structure violate MFD
subsystem guidelines?

The MFD core documentation specifically requests that platform data for child
devices like mfd_cell arrays not be dynamically extracted from device match
tables to avoid memory safety hazards and initialization races.

[ ... ]
> @@ -243,6 +243,10 @@ static int pm8008_probe(struct i2c_client *client)
>  	char *name;
>  	int ret;
>  
> +	data = device_get_match_data(dev);
> +	if (!data)
> +		return dev_err_probe(dev, -ENODATA, "Missing driver match data\n");
> +

[Severity: Medium]
Since passing complex structure pointers via the match table is discouraged,
would it be better to retrieve an integer or enum ID here?

A standard pattern is to use a switch statement on the retrieved ID to select
the appropriate static const mfd_cell array directly within the probe function
rather than receiving a pointer to it.

[ ... ]
> +static const struct pm8008_match_data pm8008_data = {
> +	.irq_chip_desc = &pm8008_irq_chip,
> +	.mfd_cells = pm8008_cells,
> +	.num_mfd_cells = ARRAY_SIZE(pm8008_cells),
> +};
> +
> +static const struct pm8008_match_data pm8010_data = {
> +	.irq_chip_desc = &pm8010_irq_chip,
> +	.mfd_cells = pm8010_cells,
> +	.num_mfd_cells = ARRAY_SIZE(pm8010_cells),
> +};
> +
>  static const struct of_device_id pm8008_match[] = {
> -	{ .compatible = "qcom,pm8008", },
> +	{ .compatible = "qcom,pm8008", .data = &pm8008_data },
> +	{ .compatible = "qcom,pm8010-i2c", .data = &pm8010_data },
>  	{ },
>  };

[Severity: Medium]
Does this match table improperly embed complex pointers?

The MFD documentation explicitly flags passing complex pointers via the
.data field of match tables as a pattern to avoid. Using an ID enum
such as (void *)TYPE_PM8008 instead of passing the &pm8008_data pointer
would comply with the core subsystem patterns.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=4

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

* Re: [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support
  2026-09-18 16:42 ` [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support Jishnu Prakash
@ 2026-09-18 16:52   ` sashiko-bot
  2026-09-23 10:17     ` Jishnu Prakash
  0 siblings, 1 reply; 24+ messages in thread
From: sashiko-bot @ 2026-09-18 16:52 UTC (permalink / raw)
  To: Jishnu Prakash; +Cc: lee, robh, conor+dt, devicetree, mfd

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] redundant use of to_i2c_client() when accessing of_node
--

commit f34c6623337a92a1f38e24ae60d1ae6ced8eed2d
Author: Dhruvin Rajpura <drajpura@qti.qualcomm.com>

regulator: qcom-pm8008: Add PM8010 mode support

Implement set_mode/get_mode support for PM8010 LDOs using the mode
control and status registers to allow clients to vote for LDO modes.
Mode voting is not supported in the PM8008 LDOs.

> diff --git a/drivers/regulator/qcom-pm8008-regulator.c b/drivers/regulator/qcom-pm8008-regulator.c
> index b484c0f73eeac..9758809a6322d 100644
> --- a/drivers/regulator/qcom-pm8008-regulator.c
> +++ b/drivers/regulator/qcom-pm8008-regulator.c

[ ... ]

> @@ -169,6 +237,9 @@ static int pm8008_regulator_probe(struct platform_device *pdev)
>  	if (!regmap)
>  		return -EINVAL;
>  
> +	is_pm8010 = of_device_is_compatible(to_i2c_client(dev->parent)->dev.of_node,
> +					    "qcom,pm8010-i2c");
> +

[Severity: Low]
Is there a reason to use to_i2c_client() when accessing of_node in
pm8008_regulator_probe()?

Since to_i2c_client() is defined as container_of(d, struct i2c_client, dev),
accessing the dev member of the resulting structure evaluates back to the
exact original pointer (dev->parent).

The expression to_i2c_client(dev->parent)->dev.of_node is functionally
identical to simply using dev->parent->of_node, making the macro usage
entirely redundant.

>  	for (i = 0; i < match_data->num_regulators; i++) {
>  		data = &match_data->regulator_data[i];

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=3

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

* Re: [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt
  2026-09-18 16:42 ` [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
@ 2026-09-18 16:57   ` sashiko-bot
  2026-09-21 10:42     ` Lee Jones
  2026-09-23 10:17     ` Jishnu Prakash
  0 siblings, 2 replies; 24+ messages in thread
From: sashiko-bot @ 2026-09-18 16:57 UTC (permalink / raw)
  To: Jishnu Prakash; +Cc: devicetree, mfd, lee, conor+dt, robh

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] mfd: qcom-pm8008: bogus IRQ mappings for child cells when client->irq is 0
--

commit 2c273914596163e5696becde808ceb33d98f0fe8
Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>

mfd: qcom-pm8008: Tolerate missing interrupt

This commit modifies pm8008_probe() to only register the IRQ infrastructure
if the parent IRQ is present. This is intended to support devices like PM8010
where the interrupt pin is tied to ground.

> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> --- a/drivers/mfd/qcom-pm8008.c
> +++ b/drivers/mfd/qcom-pm8008.c
> @@ -233,7 +233,7 @@ static void devm_irq_domain_fwnode_release(void *data)
>  
>  static int pm8008_probe(struct i2c_client *client)
>  {
> -	struct regmap_irq_chip_data *irq_data;
> +	struct regmap_irq_chip_data *irq_data = NULL;
>  	const struct pm8008_match_data *data;

[ ... ]

> -	/* Needed by GPIO driver. */
> -	dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
> +		/* Needed by GPIO driver. */
> +		dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
> +	}
>  
>  	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, data->mfd_cells,
> -				data->num_mfd_cells, NULL, 0,
> -				regmap_irq_get_domain(irq_data));
> +				    data->num_mfd_cells, NULL, 0,
> +				    regmap_irq_get_domain(irq_data));

[Severity: Medium]
Will this lead to bogus IRQ mappings for child cells when client->irq is 0?

When the device has no IRQ, irq_data remains NULL, and we pass a NULL domain
to devm_mfd_add_devices() with an irq_base of 0.

The MFD cells (such as pm8008_temp_res for qpnp-temp-alarm) specify IRQ
resources using DEFINE_RES_IRQ() with hardcoded offsets, for example:

static const struct resource pm8008_temp_res[] = {
	DEFINE_RES_MEM(PM8008_TEMP_ALARM_ADDR, 0x100),
	DEFINE_RES_IRQ(PM8008_IRQ_TEMP_ALARM),
};

When mfd_add_device() processes these IRQ resources and the domain is NULL,
it falls back to assigning the IRQ as irq_base + start. Since irq_base is 0,
a child device like the temp alarm will be assigned a global physical Linux
IRQ matching its offset (e.g., 0 + 5 = 5).

If a child driver requests this IRQ, could it steal an interrupt from another
hardware device on the system, leading to unexpected behavior or resource
conflicts? Should the driver dynamically strip or adjust the IRQ resources
from the MFD cells when no parent IRQ is present?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=6

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

* Re: [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C
  2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
                   ` (5 preceding siblings ...)
  2026-09-18 16:42 ` [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
@ 2026-09-19 13:01 ` Oleg Keri
  6 siblings, 0 replies; 24+ messages in thread
From: Oleg Keri @ 2026-09-19 13:01 UTC (permalink / raw)
  To: Jishnu Prakash, Lee Jones, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Konrad Dybcio,
	Dhruvin Rajpura, Nihal Kumar Gupta, Kamal Wadhwa

Hi Jishnu,

On Fri, Sep 18, 2026, Jishnu Prakash wrote:
> PM8010 is the next generation PMIC following PM8008 and has similar
> functionality, providing 7 LDOs that power camera sensors and associated
> hardware, with some differences from PM8008 LDOs. The series also adds
> support for skipping interrupt configurations which is needed to support
> SoCs where the PMIC's interrupt pin is grounded, such as Glymur.

For the series:

Tested-by: Oleg Keri <okerixx@gmail.com> # Lenovo Yoga Slim 7x Gen 11 (Glymur)

PM8010 at 0x8 on the camera CCI bus with no interrupt line, on
next-20260918. The MFD and the regulator probe, L2, L4 and L7 power an
ov08x40 and the camera streams with libcamera.

Thanks,
Oleg

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

* Re: [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt
  2026-09-18 16:57   ` sashiko-bot
@ 2026-09-21 10:42     ` Lee Jones
  2026-09-23 10:17       ` Jishnu Prakash
  2026-09-23 10:17     ` Jishnu Prakash
  1 sibling, 1 reply; 24+ messages in thread
From: Lee Jones @ 2026-09-21 10:42 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: Jishnu Prakash, devicetree, mfd, conor+dt, robh

On Fri, 18 Sep 2026, sashiko-bot@kernel.org wrote:

> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] mfd: qcom-pm8008: bogus IRQ mappings for child cells when client->irq is 0

Please review, explain or fix the Sashiko review(s).

If this is a set, this request includes the other patches too.

> --
> 
> commit 2c273914596163e5696becde808ceb33d98f0fe8
> Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> mfd: qcom-pm8008: Tolerate missing interrupt
> 
> This commit modifies pm8008_probe() to only register the IRQ infrastructure
> if the parent IRQ is present. This is intended to support devices like PM8010
> where the interrupt pin is tied to ground.
> 
> > diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> > --- a/drivers/mfd/qcom-pm8008.c
> > +++ b/drivers/mfd/qcom-pm8008.c
> > @@ -233,7 +233,7 @@ static void devm_irq_domain_fwnode_release(void *data)
> >  
> >  static int pm8008_probe(struct i2c_client *client)
> >  {
> > -	struct regmap_irq_chip_data *irq_data;
> > +	struct regmap_irq_chip_data *irq_data = NULL;
> >  	const struct pm8008_match_data *data;
> 
> [ ... ]
> 
> > -	/* Needed by GPIO driver. */
> > -	dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
> > +		/* Needed by GPIO driver. */
> > +		dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
> > +	}
> >  
> >  	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, data->mfd_cells,
> > -				data->num_mfd_cells, NULL, 0,
> > -				regmap_irq_get_domain(irq_data));
> > +				    data->num_mfd_cells, NULL, 0,
> > +				    regmap_irq_get_domain(irq_data));
> 
> [Severity: Medium]
> Will this lead to bogus IRQ mappings for child cells when client->irq is 0?
> 
> When the device has no IRQ, irq_data remains NULL, and we pass a NULL domain
> to devm_mfd_add_devices() with an irq_base of 0.
> 
> The MFD cells (such as pm8008_temp_res for qpnp-temp-alarm) specify IRQ
> resources using DEFINE_RES_IRQ() with hardcoded offsets, for example:
> 
> static const struct resource pm8008_temp_res[] = {
> 	DEFINE_RES_MEM(PM8008_TEMP_ALARM_ADDR, 0x100),
> 	DEFINE_RES_IRQ(PM8008_IRQ_TEMP_ALARM),
> };
> 
> When mfd_add_device() processes these IRQ resources and the domain is NULL,
> it falls back to assigning the IRQ as irq_base + start. Since irq_base is 0,
> a child device like the temp alarm will be assigned a global physical Linux
> IRQ matching its offset (e.g., 0 + 5 = 5).
> 
> If a child driver requests this IRQ, could it steal an interrupt from another
> hardware device on the system, leading to unexpected behavior or resource
> conflicts? Should the driver dynamically strip or adjust the IRQ resources
> from the MFD cells when no parent IRQ is present?
> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/20260918-pm8010_i2c_support-v1-0-de33d78fad9d@oss.qualcomm.com?part=6

-- 
Lee Jones

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

* Re: [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support
  2026-09-18 16:42 ` [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
  2026-09-18 16:51   ` sashiko-bot
@ 2026-09-21 13:33   ` Konrad Dybcio
  2026-09-23 10:18     ` Jishnu Prakash
  1 sibling, 1 reply; 24+ messages in thread
From: Konrad Dybcio @ 2026-09-21 13:33 UTC (permalink / raw)
  To: Jishnu Prakash, Lee Jones, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Dhruvin Rajpura,
	Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri

On 9/18/26 6:42 PM, Jishnu Prakash wrote:
> From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> PM8010 is effectively the next generation of PM8008. The device is
> generally designed to serve the exact same function - power camera
> sensors and the associated supporting hardware.
> 
> PM8010 supports both I2C and SPMI communications. The latter case is
> already handled, since it reuses the same peripherals as other PMICs.
> The I2C front-end is more less the same to the one of PM8008.
> 
> Plumb in the necessary changes to support it.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Co-developed-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
> Signed-off-by: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
> Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> ---
>  drivers/mfd/qcom-pm8008.c | 67 ++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 63 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> index 60204cc9a2dc..ed656f0d6df2 100644
> --- a/drivers/mfd/qcom-pm8008.c
> +++ b/drivers/mfd/qcom-pm8008.c
> @@ -34,6 +34,7 @@ enum {
>  	PM8008_GPIO1,
>  	PM8008_GPIO2,
>  	PM8008_NUM_PERIPHS,
> +	PM8010_NUM_PERIPHS = 2,
>  };

diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index 8408d045e754..84c2d50545af 100644
--- a/drivers/mfd/qcom-pm8008.c
+++ b/drivers/mfd/qcom-pm8008.c
@@ -35,7 +35,9 @@
 enum {
        PM8008_MISC,
        PM8008_TEMP_ALARM,
-       PM8008_GPIO1,
+       /* The GPIOs on PM8010 are fixed-function */
+       PM8010_NUM_PERIPHS,
+       PM8008_GPIO1 = PM8010_NUM_PERIPHS,
        PM8008_GPIO2,
        PM8008_NUM_PERIPHS,


or drop the GPIO support altogether, if we conclude that they are
fixed-function on PM8008 too (I couldn't find clear info)

Konrad

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

* Re: [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support
  2026-09-18 16:52   ` sashiko-bot
@ 2026-09-23 10:17     ` Jishnu Prakash
  0 siblings, 0 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-23 10:17 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: lee, robh, conor+dt, devicetree, mfd

On 9/18/2026 10:22 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Low] redundant use of to_i2c_client() when accessing of_node
> --
> 
> commit f34c6623337a92a1f38e24ae60d1ae6ced8eed2d
> Author: Dhruvin Rajpura <drajpura@qti.qualcomm.com>
> 

...

>>  
>> +	is_pm8010 = of_device_is_compatible(to_i2c_client(dev->parent)->dev.of_node,
>> +					    "qcom,pm8010-i2c");
>> +
> 
> [Severity: Low]
> Is there a reason to use to_i2c_client() when accessing of_node in
> pm8008_regulator_probe()?
> 
> Since to_i2c_client() is defined as container_of(d, struct i2c_client, dev),
> accessing the dev member of the resulting structure evaluates back to the
> exact original pointer (dev->parent).
> 
> The expression to_i2c_client(dev->parent)->dev.of_node is functionally
> identical to simply using dev->parent->of_node, making the macro usage
> entirely redundant.

I'll make this fix in the next version of this series.

Thanks,
Jishnu


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

* Re: [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support
  2026-09-18 16:51   ` sashiko-bot
@ 2026-09-23 10:17     ` Jishnu Prakash
  0 siblings, 0 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-23 10:17 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: lee, robh, mfd, conor+dt, devicetree

On 9/18/2026 10:21 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] mfd: complex data passed via match table .data field
> --
> 
> commit a6c2d131522cd1b3f195202001e9365b690fa7f6
> Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> mfd: qcom-pm8008: Add PM8010 support
> 

...

> [ ... ]
>> +static const struct pm8008_match_data pm8008_data = {
>> +	.irq_chip_desc = &pm8008_irq_chip,
>> +	.mfd_cells = pm8008_cells,
>> +	.num_mfd_cells = ARRAY_SIZE(pm8008_cells),
>> +};
>> +
>> +static const struct pm8008_match_data pm8010_data = {
>> +	.irq_chip_desc = &pm8010_irq_chip,
>> +	.mfd_cells = pm8010_cells,
>> +	.num_mfd_cells = ARRAY_SIZE(pm8010_cells),
>> +};
>> +
>>  static const struct of_device_id pm8008_match[] = {
>> -	{ .compatible = "qcom,pm8008", },
>> +	{ .compatible = "qcom,pm8008", .data = &pm8008_data },
>> +	{ .compatible = "qcom,pm8010-i2c", .data = &pm8010_data },
>>  	{ },
>>  };
> 
> [Severity: Medium]
> Does this match table improperly embed complex pointers?
> 
> The MFD documentation explicitly flags passing complex pointers via the
> .data field of match tables as a pattern to avoid. Using an ID enum
> such as (void *)TYPE_PM8008 instead of passing the &pm8008_data pointer
> would comply with the core subsystem patterns.
> 

I'll make this fix in the next version of this series.

Thanks,
Jishnu


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

* Re: [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt
  2026-09-21 10:42     ` Lee Jones
@ 2026-09-23 10:17       ` Jishnu Prakash
  0 siblings, 0 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-23 10:17 UTC (permalink / raw)
  To: Lee Jones, sashiko-reviews; +Cc: devicetree, mfd, conor+dt, robh

Hi Lee,

On 9/21/2026 4:12 PM, Lee Jones wrote:
> On Fri, 18 Sep 2026, sashiko-bot@kernel.org wrote:
> 
>> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
>> - [Medium] mfd: qcom-pm8008: bogus IRQ mappings for child cells when client->irq is 0
> 
> Please review, explain or fix the Sashiko review(s).
> 
> If this is a set, this request includes the other patches too.
> 

It looks like the Sashiko review comments are all genuine, I'll
fix them in the next version of this series.

Thanks,
Jishnu

>> --
>>
>> commit 2c273914596163e5696becde808ceb33d98f0fe8
>> Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
>>
>> mfd: qcom-pm8008: Tolerate missing interrupt
>>
>> This commit modifies pm8008_probe() to only register the IRQ infrastructure
>> if the parent IRQ is present. This is intended to support devices like PM8010
>> where the interrupt pin is tied to ground.
>>

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

* Re: [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt
  2026-09-18 16:57   ` sashiko-bot
  2026-09-21 10:42     ` Lee Jones
@ 2026-09-23 10:17     ` Jishnu Prakash
  1 sibling, 0 replies; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-23 10:17 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: devicetree, mfd, lee, conor+dt, robh

On 9/18/2026 10:27 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] mfd: qcom-pm8008: bogus IRQ mappings for child cells when client->irq is 0
> --
> 
> commit 2c273914596163e5696becde808ceb33d98f0fe8
> Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> mfd: qcom-pm8008: Tolerate missing interrupt
> 

...

> [ ... ]
> 
>> -	/* Needed by GPIO driver. */
>> -	dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
>> +		/* Needed by GPIO driver. */
>> +		dev_set_drvdata(dev, regmap_irq_get_domain(irq_data));
>> +	}
>>  
>>  	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, data->mfd_cells,
>> -				data->num_mfd_cells, NULL, 0,
>> -				regmap_irq_get_domain(irq_data));
>> +				    data->num_mfd_cells, NULL, 0,
>> +				    regmap_irq_get_domain(irq_data));
> 
> [Severity: Medium]
> Will this lead to bogus IRQ mappings for child cells when client->irq is 0?
> 
> When the device has no IRQ, irq_data remains NULL, and we pass a NULL domain
> to devm_mfd_add_devices() with an irq_base of 0.
> 
> The MFD cells (such as pm8008_temp_res for qpnp-temp-alarm) specify IRQ
> resources using DEFINE_RES_IRQ() with hardcoded offsets, for example:
> 
> static const struct resource pm8008_temp_res[] = {
> 	DEFINE_RES_MEM(PM8008_TEMP_ALARM_ADDR, 0x100),
> 	DEFINE_RES_IRQ(PM8008_IRQ_TEMP_ALARM),
> };
> 
> When mfd_add_device() processes these IRQ resources and the domain is NULL,
> it falls back to assigning the IRQ as irq_base + start. Since irq_base is 0,
> a child device like the temp alarm will be assigned a global physical Linux
> IRQ matching its offset (e.g., 0 + 5 = 5).
> 
> If a child driver requests this IRQ, could it steal an interrupt from another
> hardware device on the system, leading to unexpected behavior or resource
> conflicts? Should the driver dynamically strip or adjust the IRQ resources
> from the MFD cells when no parent IRQ is present?

This sounds right, I'll make this fix in the next version of this series.

Thanks,
Jishnu

> 


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

* Re: [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support
  2026-09-21 13:33   ` Konrad Dybcio
@ 2026-09-23 10:18     ` Jishnu Prakash
  2026-10-01  8:29       ` Konrad Dybcio
  0 siblings, 1 reply; 24+ messages in thread
From: Jishnu Prakash @ 2026-09-23 10:18 UTC (permalink / raw)
  To: Konrad Dybcio, Lee Jones, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Dhruvin Rajpura,
	Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri

On 9/21/2026 7:03 PM, Konrad Dybcio wrote:
> On 9/18/26 6:42 PM, Jishnu Prakash wrote:

...

>>
>> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
>> index 60204cc9a2dc..ed656f0d6df2 100644
>> --- a/drivers/mfd/qcom-pm8008.c
>> +++ b/drivers/mfd/qcom-pm8008.c
>> @@ -34,6 +34,7 @@ enum {
>>  	PM8008_GPIO1,
>>  	PM8008_GPIO2,
>>  	PM8008_NUM_PERIPHS,
>> +	PM8010_NUM_PERIPHS = 2,
>>  };
> 
> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> index 8408d045e754..84c2d50545af 100644
> --- a/drivers/mfd/qcom-pm8008.c
> +++ b/drivers/mfd/qcom-pm8008.c
> @@ -35,7 +35,9 @@
>  enum {
>         PM8008_MISC,
>         PM8008_TEMP_ALARM,
> -       PM8008_GPIO1,
> +       /* The GPIOs on PM8010 are fixed-function */
> +       PM8010_NUM_PERIPHS,
> +       PM8008_GPIO1 = PM8010_NUM_PERIPHS,
>         PM8008_GPIO2,
>         PM8008_NUM_PERIPHS,
> 
> 
> or drop the GPIO support altogether, if we conclude that they are
> fixed-function on PM8008 too (I couldn't find clear info)
> 

Hi Konrad,

From what I could see in the relevant HW documents, the GPIO
functions are fixed on both PM8008 and PM8010, so it would
be best to drop it from the driver. I can a separate fix
change for this.

Do you think we also need to make binding and DT changes
for dropping this GPIO support?

Thanks,
Jishnu

> Konrad


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

* Re: [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible
  2026-09-18 16:42 ` [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
  2026-09-18 16:49   ` sashiko-bot
@ 2026-09-28 19:48   ` Rob Herring (Arm)
  1 sibling, 0 replies; 24+ messages in thread
From: Rob Herring (Arm) @ 2026-09-28 19:48 UTC (permalink / raw)
  To: Jishnu Prakash
  Cc: linux-kernel, mfd, Kamal Wadhwa, Oleg Keri, devicetree,
	Konrad Dybcio, linux-arm-msm, Nihal Kumar Gupta, Dhruvin Rajpura,
	Conor Dooley, Krzysztof Kozlowski, Liam Girdwood, Lee Jones,
	Guru Das Srinagesh, Mark Brown


On Fri, 18 Sep 2026 22:12:45 +0530, Jishnu Prakash wrote:
> From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> The PM8010 can communicate over both SPMI and I2C, based on whether
> GPIO1 is pulled high or low respectively. Since the qcom,pm8010
> compatible is already taken in the SPMI PMIC bindings and that set of
> properties is heavily tailored towards SPMI, introduce a secondary
> compatible to handle the I2C case.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> ---
>  Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 

Acked-by: Rob Herring (Arm) <robh@kernel.org>


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

* Re: [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional
  2026-09-18 16:42 ` [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
  2026-09-18 16:50   ` sashiko-bot
@ 2026-09-28 19:49   ` Rob Herring (Arm)
  1 sibling, 0 replies; 24+ messages in thread
From: Rob Herring (Arm) @ 2026-09-28 19:49 UTC (permalink / raw)
  To: Jishnu Prakash
  Cc: Mark Brown, Conor Dooley, Liam Girdwood, mfd, Guru Das Srinagesh,
	Nihal Kumar Gupta, Kamal Wadhwa, Krzysztof Kozlowski,
	Konrad Dybcio, Lee Jones, Oleg Keri, devicetree, Dhruvin Rajpura,
	linux-arm-msm, linux-kernel


On Fri, 18 Sep 2026 22:12:49 +0530, Jishnu Prakash wrote:
> From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> 
> Some designs integrate the PMIC with the interrupt pin left
> unconnected, deliberately. That of course compromises some
> functionality, but the core function of programming the voltage
> regulators remains there.
> 
> Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> ---
>  Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 

Acked-by: Rob Herring (Arm) <robh@kernel.org>


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

* Re: [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support
  2026-09-23 10:18     ` Jishnu Prakash
@ 2026-10-01  8:29       ` Konrad Dybcio
  0 siblings, 0 replies; 24+ messages in thread
From: Konrad Dybcio @ 2026-10-01  8:29 UTC (permalink / raw)
  To: Jishnu Prakash, Lee Jones, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Guru Das Srinagesh, Liam Girdwood, Mark Brown
  Cc: linux-arm-msm, mfd, devicetree, linux-kernel, Dhruvin Rajpura,
	Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri

On 9/23/26 12:18 PM, Jishnu Prakash wrote:
> On 9/21/2026 7:03 PM, Konrad Dybcio wrote:
>> On 9/18/26 6:42 PM, Jishnu Prakash wrote:

[...]

>> or drop the GPIO support altogether, if we conclude that they are
>> fixed-function on PM8008 too (I couldn't find clear info)
>>
> 
> Hi Konrad,
> 
> From what I could see in the relevant HW documents, the GPIO
> functions are fixed on both PM8008 and PM8010, so it would
> be best to drop it from the driver. I can a separate fix
> change for this.
> 
> Do you think we also need to make binding and DT changes
> for dropping this GPIO support?

It's okay for a driver to implement a subset of what the
bindings allow. Maybe there's some esoteric use case that
allows exercising these GPIOs, I don't know

Konrad

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

end of thread, other threads:[~2026-10-01  8:29 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-18 16:42 [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
2026-09-18 16:42 ` [PATCH 1/6] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
2026-09-18 16:49   ` sashiko-bot
2026-09-28 19:48   ` Rob Herring (Arm)
2026-09-18 16:42 ` [PATCH 2/6] regulator: pm8008: Add PM8010 support Jishnu Prakash
2026-09-18 16:50   ` sashiko-bot
2026-09-18 16:42 ` [PATCH 3/6] regulator: qcom-pm8008: Add PM8010 mode support Jishnu Prakash
2026-09-18 16:52   ` sashiko-bot
2026-09-23 10:17     ` Jishnu Prakash
2026-09-18 16:42 ` [PATCH 4/6] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
2026-09-18 16:51   ` sashiko-bot
2026-09-23 10:17     ` Jishnu Prakash
2026-09-21 13:33   ` Konrad Dybcio
2026-09-23 10:18     ` Jishnu Prakash
2026-10-01  8:29       ` Konrad Dybcio
2026-09-18 16:42 ` [PATCH 5/6] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
2026-09-18 16:50   ` sashiko-bot
2026-09-28 19:49   ` Rob Herring (Arm)
2026-09-18 16:42 ` [PATCH 6/6] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
2026-09-18 16:57   ` sashiko-bot
2026-09-21 10:42     ` Lee Jones
2026-09-23 10:17       ` Jishnu Prakash
2026-09-23 10:17     ` Jishnu Prakash
2026-09-19 13:01 ` [PATCH 0/6] mfd: qcom-pm8008: Add support for PM8010 over I2C Oleg Keri

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