From: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
To: Lee Jones <lee@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Guru Das Srinagesh <linux@gurudas.dev>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>
Cc: linux-arm-msm@vger.kernel.org, mfd@lists.linux.dev,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>,
Dhruvin Rajpura <drajpura@qti.qualcomm.com>,
Nihal Kumar Gupta <nihal.gupta@oss.qualcomm.com>,
Kamal Wadhwa <kamal.wadhwa@oss.qualcomm.com>,
Oleg Keri <okerixx@gmail.com>,
Burke Cates <burke.cates@gmail.com>,
Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
Subject: [PATCH v3 5/7] mfd: qcom-pm8008: Add PM8010 support
Date: Fri, 30 Oct 2026 11:50:53 +0530 [thread overview]
Message-ID: <20261030-pm8010_i2c_support-v3-5-995ed1ec7a72@oss.qualcomm.com> (raw)
In-Reply-To: <20261030-pm8010_i2c_support-v3-0-995ed1ec7a72@oss.qualcomm.com>
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 | 76 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 72 insertions(+), 4 deletions(-)
diff --git a/drivers/mfd/qcom-pm8008.c b/drivers/mfd/qcom-pm8008.c
index 2d6c01cf54f3..39fae8d48e46 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 = 1,
+ 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,43 @@ 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;
+ const void *match_data;
+ int num_mfd_cells;
char *name;
int ret;
+ match_data = of_device_get_match_data(dev);
+ if (!match_data) {
+ dev_err(dev, "Failed to get driver match data\n");
+ return -EINVAL;
+ }
+
+ pmic_type = (unsigned long)match_data;
+
+ 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 +300,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
next prev parent reply other threads:[~2026-10-30 6:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-30 6:20 [PATCH v3 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Jishnu Prakash
2026-10-30 6:20 ` [PATCH v3 1/7] dt-bindings: mfd: pm8008: Add qcom,pm8010-i2c compatible Jishnu Prakash
2026-10-30 6:20 ` [PATCH v3 2/7] regulator: pm8008: Add PM8010 support Jishnu Prakash
2026-10-30 6:20 ` [PATCH v3 3/7] regulator: pm8008: Add mode voting support for PM8010 Jishnu Prakash
2026-10-30 6:20 ` [PATCH v3 4/7] mfd: qcom-pm8008: Drop GPIO support Jishnu Prakash
2026-10-30 6:20 ` Jishnu Prakash [this message]
2026-10-30 6:20 ` [PATCH v3 6/7] dt-bindings: mfd: pm8008: Make interrupts optional Jishnu Prakash
2026-10-30 6:20 ` [PATCH v3 7/7] mfd: qcom-pm8008: Tolerate missing interrupt Jishnu Prakash
2026-10-31 16:24 ` [PATCH v3 0/7] mfd: qcom-pm8008: Add support for PM8010 over I2C Christian Cortner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261030-pm8010_i2c_support-v3-5-995ed1ec7a72@oss.qualcomm.com \
--to=jishnu.prakash@oss.qualcomm.com \
--cc=broonie@kernel.org \
--cc=burke.cates@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=drajpura@qti.qualcomm.com \
--cc=kamal.wadhwa@oss.qualcomm.com \
--cc=konrad.dybcio@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=lee@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@gurudas.dev \
--cc=mfd@lists.linux.dev \
--cc=nihal.gupta@oss.qualcomm.com \
--cc=okerixx@gmail.com \
--cc=robh@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®