* [PATCH v2 1/7] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
@ 2026-10-14 10:31 ` Jishnu Prakash
2026-10-14 10:31 ` [PATCH v2 2/7] regulator: pm8008: Add PM8010 support Jishnu Prakash
` (5 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:31 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>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
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 [flat|nested] 12+ messages in thread* [PATCH v2 2/7] regulator: pm8008: Add PM8010 support
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
2026-10-14 10:31 ` [PATCH v2 1/7] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
@ 2026-10-14 10:31 ` Jishnu Prakash
2026-10-14 10:32 ` [PATCH v2 3/7] regulator: qcom-pm8008: Add PM8010 mode support Jishnu Prakash
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:31 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>
Tested-by: Oleg Keri <okerixx@gmail.com> # Lenovo Yoga Slim 7x Gen 11 (Glymur)
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 [flat|nested] 12+ messages in thread* [PATCH v2 3/7] regulator: qcom-pm8008: Add PM8010 mode support
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
2026-10-14 10:31 ` [PATCH v2 1/7] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
2026-10-14 10:31 ` [PATCH v2 2/7] regulator: pm8008: Add PM8010 support Jishnu Prakash
@ 2026-10-14 10:32 ` Jishnu Prakash
2026-10-14 10:32 ` [PATCH v2 4/7] mfd: qcom-pm8008: Drop GPIO support Jishnu Prakash
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:32 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>
Tested-by: Oleg Keri <okerixx@gmail.com> # Lenovo Yoga Slim 7x Gen 11 (Glymur)
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..ae5370770b2f 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(dev->parent->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 [flat|nested] 12+ messages in thread* [PATCH v2 4/7] mfd: qcom-pm8008: Drop GPIO support
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
` (2 preceding siblings ...)
2026-10-14 10:32 ` [PATCH v2 3/7] regulator: qcom-pm8008: Add PM8010 mode support Jishnu Prakash
@ 2026-10-14 10:32 ` Jishnu Prakash
2026-10-15 12:01 ` Konrad Dybcio
2026-10-14 10:32 ` [PATCH v2 5/7] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
` (2 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:32 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
GPIOs used on PM8008 and also the upcoming PM8010 have fixed
functions (reset and interrupt input functionality) so it is
not useful to expose them for general-purpose usage. Drop the
GPIO MFD cell and associated peripheral definitions.
Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
---
drivers/mfd/qcom-pm8008.c | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index 60204cc9a2dc..2d6c01cf54f3 100644
--- a/drivers/mfd/qcom-pm8008.c
+++ b/drivers/mfd/qcom-pm8008.c
@@ -31,19 +31,13 @@
enum {
PM8008_MISC,
PM8008_TEMP_ALARM,
- PM8008_GPIO1,
- PM8008_GPIO2,
PM8008_NUM_PERIPHS,
};
#define PM8008_PERIPH_0_BASE 0x900
#define PM8008_PERIPH_1_BASE 0x2400
-#define PM8008_PERIPH_2_BASE 0xc000
-#define PM8008_PERIPH_3_BASE 0xc100
#define PM8008_TEMP_ALARM_ADDR PM8008_PERIPH_1_BASE
-#define PM8008_GPIO1_ADDR PM8008_PERIPH_2_BASE
-#define PM8008_GPIO2_ADDR PM8008_PERIPH_3_BASE
/* PM8008 IRQ numbers */
#define PM8008_IRQ_MISC_UVLO 0
@@ -52,8 +46,6 @@ enum {
#define PM8008_IRQ_MISC_OTST3 3
#define PM8008_IRQ_MISC_LDO_OCP 4
#define PM8008_IRQ_TEMP_ALARM 5
-#define PM8008_IRQ_GPIO1 6
-#define PM8008_IRQ_GPIO2 7
enum {
SET_TYPE_INDEX,
@@ -84,15 +76,11 @@ static const struct regmap_irq pm8008_irqs[] = {
_IRQ(PM8008_IRQ_MISC_OTST3, PM8008_MISC, BIT(3), IRQ_TYPE_EDGE_RISING),
_IRQ(PM8008_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),
- _IRQ(PM8008_IRQ_GPIO1, PM8008_GPIO1, BIT(0), IRQ_TYPE_SENSE_MASK),
- _IRQ(PM8008_IRQ_GPIO2, PM8008_GPIO2, BIT(0), IRQ_TYPE_SENSE_MASK),
};
static const unsigned int pm8008_periph_base[] = {
PM8008_PERIPH_0_BASE,
PM8008_PERIPH_1_BASE,
- PM8008_PERIPH_2_BASE,
- PM8008_PERIPH_3_BASE,
};
static unsigned int pm8008_get_irq_reg(struct regmap_irq_chip_data *data,
@@ -180,7 +168,6 @@ static const struct resource pm8008_temp_res[] = {
static const struct mfd_cell pm8008_cells[] = {
MFD_CELL_NAME("pm8008-regulator"),
MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
- MFD_CELL_NAME("pm8008-gpio"),
};
static void devm_irq_domain_fwnode_release(void *data)
@@ -252,9 +239,6 @@ static int pm8008_probe(struct i2c_client *client)
return ret;
}
- /* 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,
regmap_irq_get_domain(irq_data));
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 4/7] mfd: qcom-pm8008: Drop GPIO support
2026-10-14 10:32 ` [PATCH v2 4/7] mfd: qcom-pm8008: Drop GPIO support Jishnu Prakash
@ 2026-10-15 12:01 ` Konrad Dybcio
0 siblings, 0 replies; 12+ messages in thread
From: Konrad Dybcio @ 2026-10-15 12: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, Dhruvin Rajpura,
Nihal Kumar Gupta, Kamal Wadhwa, Oleg Keri
On 10/14/26 12:32 PM, Jishnu Prakash wrote:
> GPIOs used on PM8008 and also the upcoming PM8010 have fixed
> functions (reset and interrupt input functionality) so it is
> not useful to expose them for general-purpose usage. Drop the
> GPIO MFD cell and associated peripheral definitions.
>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 5/7] mfd: qcom-pm8008: Add PM8010 support
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
` (3 preceding siblings ...)
2026-10-14 10:32 ` [PATCH v2 4/7] mfd: qcom-pm8008: Drop GPIO support Jishnu Prakash
@ 2026-10-14 10:32 ` Jishnu Prakash
2026-10-15 12:04 ` Konrad Dybcio
2026-10-14 10:32 ` [PATCH v2 6/7] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
2026-10-14 10:32 ` [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
6 siblings, 1 reply; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:32 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 | 69 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 65 insertions(+), 4 deletions(-)
diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index 2d6c01cf54f3..4179427f3891 100644
--- a/drivers/mfd/qcom-pm8008.c
+++ b/drivers/mfd/qcom-pm8008.c
@@ -34,6 +34,11 @@ enum {
PM8008_NUM_PERIPHS,
};
+enum pm8008_chip_type {
+ TYPE_PM8008,
+ TYPE_PM8010,
+};
+
#define PM8008_PERIPH_0_BASE 0x900
#define PM8008_PERIPH_1_BASE 0x2400
@@ -47,6 +52,9 @@ enum {
#define PM8008_IRQ_MISC_LDO_OCP 4
#define PM8008_IRQ_TEMP_ALARM 5
+#define PM8010_IRQ_MISC_MBG_FAULT 0
+#define PM8010_IRQ_MISC_LDO_OCP 4
+
enum {
SET_TYPE_INDEX,
POLARITY_HI_INDEX,
@@ -78,6 +86,12 @@ static const struct regmap_irq pm8008_irqs[] = {
_IRQ(PM8008_IRQ_TEMP_ALARM, PM8008_TEMP_ALARM,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,
@@ -146,6 +160,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 = PM8008_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 = PM8008_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,
@@ -170,6 +203,11 @@ static const struct mfd_cell pm8008_cells[] = {
MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
};
+static const struct mfd_cell pm8010_cells[] = {
+ MFD_CELL_NAME("pm8010-regulator"),
+ MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
+};
+
static void devm_irq_domain_fwnode_release(void *data)
{
struct fwnode_handle *fwnode = data;
@@ -180,14 +218,36 @@ 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 regmap_irq_chip *irq_chip_desc;
struct device *dev = &client->dev;
+ const struct mfd_cell *mfd_cells;
struct regmap *regmap, *regmap2;
struct fwnode_handle *fwnode;
struct i2c_client *dummy;
struct gpio_desc *reset;
+ unsigned long pmic_type;
+ int num_mfd_cells;
char *name;
int ret;
+ pmic_type = (unsigned long)of_device_get_match_data(dev);
+
+ switch (pmic_type) {
+ case TYPE_PM8008:
+ irq_chip_desc = &pm8008_irq_chip;
+ mfd_cells = pm8008_cells;
+ num_mfd_cells = ARRAY_SIZE(pm8008_cells);
+ break;
+ case TYPE_PM8010:
+ irq_chip_desc = &pm8010_irq_chip;
+ mfd_cells = pm8010_cells;
+ num_mfd_cells = ARRAY_SIZE(pm8010_cells);
+ break;
+ default:
+ dev_err(dev, "Unknown device type: %lu\n", pmic_type);
+ return -EINVAL;
+ }
+
dummy = devm_i2c_new_dummy_device(dev, client->adapter, client->addr + 1);
if (IS_ERR(dummy)) {
ret = PTR_ERR(dummy);
@@ -233,19 +293,20 @@ 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, irq_chip_desc, &irq_data);
if (ret) {
dev_err(dev, "failed to add IRQ chip: %d\n", ret);
return ret;
}
- 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, mfd_cells,
+ num_mfd_cells, NULL, 0,
regmap_irq_get_domain(irq_data));
}
static const struct of_device_id pm8008_match[] = {
- { .compatible = "qcom,pm8008", },
+ { .compatible = "qcom,pm8008", .data = (void *)TYPE_PM8008, },
+ { .compatible = "qcom,pm8010-i2c", .data = (void *)TYPE_PM8010, },
{ },
};
MODULE_DEVICE_TABLE(of, pm8008_match);
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 5/7] mfd: qcom-pm8008: Add PM8010 support
2026-10-14 10:32 ` [PATCH v2 5/7] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
@ 2026-10-15 12:04 ` Konrad Dybcio
0 siblings, 0 replies; 12+ messages in thread
From: Konrad Dybcio @ 2026-10-15 12:04 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 10/14/26 12:32 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.
[...]
> + pmic_type = (unsigned long)of_device_get_match_data(dev);
I don't understand why you changed my match_data_struct approach
here just to reconstruct the same data
Konrad
> +
> + switch (pmic_type) {
> + case TYPE_PM8008:
> + irq_chip_desc = &pm8008_irq_chip;
> + mfd_cells = pm8008_cells;
> + num_mfd_cells = ARRAY_SIZE(pm8008_cells);
> + break;
> + case TYPE_PM8010:
> + irq_chip_desc = &pm8010_irq_chip;
> + mfd_cells = pm8010_cells;
> + num_mfd_cells = ARRAY_SIZE(pm8010_cells);
> + break;
> + default:
> + dev_err(dev, "Unknown device type: %lu\n", pmic_type);
> + return -EINVAL;
> + }
> +
> dummy = devm_i2c_new_dummy_device(dev, client->adapter, client->addr + 1);
> if (IS_ERR(dummy)) {
> ret = PTR_ERR(dummy);
> @@ -233,19 +293,20 @@ 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, irq_chip_desc, &irq_data);
> if (ret) {
> dev_err(dev, "failed to add IRQ chip: %d\n", ret);
> return ret;
> }
>
> - 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, mfd_cells,
> + num_mfd_cells, NULL, 0,
> regmap_irq_get_domain(irq_data));
> }
>
> static const struct of_device_id pm8008_match[] = {
> - { .compatible = "qcom,pm8008", },
> + { .compatible = "qcom,pm8008", .data = (void *)TYPE_PM8008, },
> + { .compatible = "qcom,pm8010-i2c", .data = (void *)TYPE_PM8010, },
> { },
> };
> MODULE_DEVICE_TABLE(of, pm8008_match);
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 6/7] dt-bindings: mfd: pm8008: Make interrupts optional
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
` (4 preceding siblings ...)
2026-10-14 10:32 ` [PATCH v2 5/7] mfd: qcom-pm8008: Add PM8010 support Jishnu Prakash
@ 2026-10-14 10:32 ` Jishnu Prakash
2026-10-14 10:32 ` [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
6 siblings, 0 replies; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:32 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>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
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 [flat|nested] 12+ messages in thread* [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt
2026-10-14 10:31 [PATCH v2 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
` (5 preceding siblings ...)
2026-10-14 10:32 ` [PATCH v2 6/7] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
@ 2026-10-14 10:32 ` Jishnu Prakash
2026-10-15 11:00 ` Nihal Kumar Gupta
2026-10-15 12:05 ` Konrad Dybcio
6 siblings, 2 replies; 12+ messages in thread
From: Jishnu Prakash @ 2026-10-14 10:32 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 | 82 ++++++++++++++++++++++++++++++++++-------------
1 file changed, 60 insertions(+), 22 deletions(-)
diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index 4179427f3891..8b1bbb4052a7 100644
--- a/drivers/mfd/qcom-pm8008.c
+++ b/drivers/mfd/qcom-pm8008.c
@@ -208,6 +208,14 @@ static const struct mfd_cell pm8010_cells[] = {
MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
};
+static const struct mfd_cell pm8008_no_irq_cells[] = {
+ MFD_CELL_NAME("pm8008-regulator"),
+};
+
+static const struct mfd_cell pm8010_no_irq_cells[] = {
+ MFD_CELL_NAME("pm8010-regulator"),
+};
+
static void devm_irq_domain_fwnode_release(void *data)
{
struct fwnode_handle *fwnode = data;
@@ -215,19 +223,50 @@ static void devm_irq_domain_fwnode_release(void *data)
irq_domain_free_fwnode(fwnode);
}
+static int pm8008_irq_config(struct device *dev, int irq, struct regmap *regmap,
+ const struct regmap_irq_chip *irq_chip_desc,
+ struct regmap_irq_chip_data **irq_data)
+{
+ struct fwnode_handle *fwnode;
+ char *name;
+ int ret;
+
+ name = devm_kasprintf(dev, GFP_KERNEL, "%pOF-internal", dev->of_node);
+ if (!name)
+ return -ENOMEM;
+
+ name = strreplace(name, '/', ':');
+
+ 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_regmap_add_irq_chip_fwnode(dev, fwnode, regmap, irq,
+ IRQF_SHARED, 0, irq_chip_desc,
+ irq_data);
+ if (ret) {
+ dev_err(dev, "failed to add IRQ chip: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
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 regmap_irq_chip *irq_chip_desc;
struct device *dev = &client->dev;
const struct mfd_cell *mfd_cells;
struct regmap *regmap, *regmap2;
- struct fwnode_handle *fwnode;
struct i2c_client *dummy;
struct gpio_desc *reset;
unsigned long pmic_type;
int num_mfd_cells;
- char *name;
int ret;
pmic_type = (unsigned long)of_device_get_match_data(dev);
@@ -248,6 +287,19 @@ static int pm8008_probe(struct i2c_client *client)
return -EINVAL;
}
+ if (!client->irq) {
+ switch (pmic_type) {
+ case TYPE_PM8008:
+ mfd_cells = pm8008_no_irq_cells;
+ num_mfd_cells = ARRAY_SIZE(pm8008_no_irq_cells);
+ break;
+ case TYPE_PM8010:
+ mfd_cells = pm8010_no_irq_cells;
+ num_mfd_cells = ARRAY_SIZE(pm8010_no_irq_cells);
+ break;
+ }
+ }
+
dummy = devm_i2c_new_dummy_device(dev, client->adapter, client->addr + 1);
if (IS_ERR(dummy)) {
ret = PTR_ERR(dummy);
@@ -278,25 +330,11 @@ 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;
-
- name = strreplace(name, '/', ':');
-
- 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_regmap_add_irq_chip_fwnode(dev, fwnode, regmap, client->irq,
- IRQF_SHARED, 0, irq_chip_desc, &irq_data);
- if (ret) {
- dev_err(dev, "failed to add IRQ chip: %d\n", ret);
- return ret;
+ if (client->irq) {
+ ret = pm8008_irq_config(dev, client->irq, regmap, irq_chip_desc,
+ &irq_data);
+ if (ret)
+ return ret;
}
return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, mfd_cells,
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt
2026-10-14 10:32 ` [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
@ 2026-10-15 11:00 ` Nihal Kumar Gupta
2026-10-15 12:05 ` Konrad Dybcio
1 sibling, 0 replies; 12+ messages in thread
From: Nihal Kumar Gupta @ 2026-10-15 11:00 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, Kamal Wadhwa, Oleg Keri
On 14-10-2026 16:02, Jishnu Prakash wrote:
> Co-developed-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Tested-by: Nihal Kumar Gupta <nihal.gupta@oss.qualcomm.com> # Glymur CRD
> ---
> drivers/mfd/qcom-pm8008.c | 82 ++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 60 insertions(+), 22 deletions(-)
>
--
Regards,
Nihal Kumar Gupta
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt
2026-10-14 10:32 ` [PATCH v2 7/7] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
2026-10-15 11:00 ` Nihal Kumar Gupta
@ 2026-10-15 12:05 ` Konrad Dybcio
1 sibling, 0 replies; 12+ messages in thread
From: Konrad Dybcio @ 2026-10-15 12:05 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 10/14/26 12:32 PM, Jishnu Prakash wrote:
> 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 | 82 ++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 60 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
> index 4179427f3891..8b1bbb4052a7 100644
> --- a/drivers/mfd/qcom-pm8008.c
> +++ b/drivers/mfd/qcom-pm8008.c
> @@ -208,6 +208,14 @@ static const struct mfd_cell pm8010_cells[] = {
> MFD_CELL_RES("qpnp-temp-alarm", pm8008_temp_res),
> };
>
> +static const struct mfd_cell pm8008_no_irq_cells[] = {
> + MFD_CELL_NAME("pm8008-regulator"),
There's no reason to not register the temperature alarm driver
if we don't have an irq. It will not be able to carry out the
"alarm" part, but one can still poll on it.
Konrad
^ permalink raw reply [flat|nested] 12+ messages in thread