mfd: pm8921-core: Add support for PMIC PM8922 chips
The PMIC PM8922 chip is very similar to the PM8921 chip. Modify
the pm8921-core driver so that it can also handle PM8922 chips.
Change-Id: Ibae402ff65d1af4e0f18e4a66304f7ac609065b4
Signed-off-by: David Collins <collinsd@codeaurora.org>
diff --git a/drivers/mfd/pm8921-core.c b/drivers/mfd/pm8921-core.c
index 51d2224..42f88d0 100644
--- a/drivers/mfd/pm8921-core.c
+++ b/drivers/mfd/pm8921-core.c
@@ -39,6 +39,7 @@
#define PM8921_VERSION_MASK 0xFFF0
#define PM8921_VERSION_VALUE 0x06F0
+#define PM8922_VERSION_VALUE 0x0AF0
#define PM8921_REVISION_MASK 0x000F
#define REG_PM8921_PON_CNTRL_3 0x01D
@@ -109,6 +110,9 @@
if ((pmic->rev_registers & PM8921_VERSION_MASK) == PM8921_VERSION_VALUE)
version = PM8XXX_VERSION_8921;
+ else if ((pmic->rev_registers & PM8921_VERSION_MASK)
+ == PM8922_VERSION_VALUE)
+ version = PM8XXX_VERSION_8922;
return version;
}
@@ -365,8 +369,11 @@
int ret = 0, irq_base = 0;
struct pm_irq_chip *irq_chip;
static struct mfd_cell *mfd_regulators;
+ enum pm8xxx_version version;
int i;
+ version = pm8xxx_get_version(pmic->dev);
+
if (pdata->irq_pdata) {
pdata->irq_pdata->irq_cdata.nirqs = PM8921_NR_IRQS;
pdata->irq_pdata->irq_cdata.base_addr = REG_IRQ_BASE;
@@ -619,6 +626,13 @@
[PM8XXX_REVISION_8921_3p0] = "3.0",
};
+static const char * const pm8922_rev_names[] = {
+ [PM8XXX_REVISION_8922_TEST] = "test",
+ [PM8XXX_REVISION_8922_1p0] = "1.0",
+ [PM8XXX_REVISION_8922_1p1] = "1.1",
+ [PM8XXX_REVISION_8922_2p0] = "2.0",
+};
+
static int __devinit pm8921_probe(struct platform_device *pdev)
{
const struct pm8921_platform_data *pdata = pdev->dev.platform_data;
@@ -665,13 +679,18 @@
/* Print out human readable version and revision names. */
version = pm8xxx_get_version(pmic->dev);
+ revision = pm8xxx_get_revision(pmic->dev);
if (version == PM8XXX_VERSION_8921) {
- revision = pm8xxx_get_revision(pmic->dev);
if (revision >= 0 && revision < ARRAY_SIZE(pm8921_rev_names))
revision_name = pm8921_rev_names[revision];
pr_info("PMIC version: PM8921 rev %s\n", revision_name);
+ } else if (version == PM8XXX_VERSION_8922) {
+ if (revision >= 0 && revision < ARRAY_SIZE(pm8922_rev_names))
+ revision_name = pm8922_rev_names[revision];
+ pr_info("PMIC version: PM8922 rev %s\n", revision_name);
} else {
- WARN_ON(version != PM8XXX_VERSION_8921);
+ WARN_ON(version != PM8XXX_VERSION_8921
+ && version != PM8XXX_VERSION_8922);
}
/* Log human readable restart reason */
diff --git a/drivers/mfd/pm8xxx-pwm.c b/drivers/mfd/pm8xxx-pwm.c
index 5b4f7e3..f65a183 100644
--- a/drivers/mfd/pm8xxx-pwm.c
+++ b/drivers/mfd/pm8xxx-pwm.c
@@ -1360,7 +1360,8 @@
version = pm8xxx_get_version(chip->dev->parent);
if (version == PM8XXX_VERSION_8921 ||
- version == PM8XXX_VERSION_8058) {
+ version == PM8XXX_VERSION_8058 ||
+ version == PM8XXX_VERSION_8922) {
chip->is_lpg_supported = 1;
}
if (chip->is_lpg_supported) {
diff --git a/include/linux/mfd/pm8xxx/core.h b/include/linux/mfd/pm8xxx/core.h
index f0a3278..9a46128 100644
--- a/include/linux/mfd/pm8xxx/core.h
+++ b/include/linux/mfd/pm8xxx/core.h
@@ -26,6 +26,7 @@
PM8XXX_VERSION_8921,
PM8XXX_VERSION_8821,
PM8XXX_VERSION_8018,
+ PM8XXX_VERSION_8922,
};
/* PMIC version specific silicon revisions */
@@ -56,6 +57,11 @@
#define PM8XXX_REVISION_8018_1p1 2
#define PM8XXX_REVISION_8018_2p0 3
+#define PM8XXX_REVISION_8922_TEST 0
+#define PM8XXX_REVISION_8922_1p0 1
+#define PM8XXX_REVISION_8922_1p1 2
+#define PM8XXX_REVISION_8922_2p0 3
+
struct pm8xxx_drvdata {
int (*pmic_readb) (const struct device *dev,
u16 addr, u8 *val);