pmic: Convert pm8916 driver to a generic Qcom PMIC driver
Since both pm8916.c and pm8916_gpio.c are already supporting multiple
Qcom SoCs, it makes sense to rename these drivers to pmic_qcom.c and
qcom_pmic_gpio.c respectively. Also, these driver can be extended to
support additional functionality if required for other Qcom SoCs.
Along with this import latest DT binding: qcom,spmi-pmic.txt from Linux
kernel and thereby remove pm8916.txt.
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 7e4c357..c949f9d 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -303,14 +303,14 @@
legacy GPIO interface. Several subcommands are provided which mirror
the standard 'gpio' command. It should use that instead.
-config PM8916_GPIO
- bool "Qualcomm PM8916 PMIC GPIO/keypad driver"
- depends on DM_GPIO && PMIC_PM8916
+config QCOM_PMIC_GPIO
+ bool "Qualcomm generic PMIC GPIO/keypad driver"
+ depends on DM_GPIO && PMIC_QCOM
help
Support for GPIO pins and power/reset buttons found on
- Qualcomm PM8916 PMIC.
+ Qualcomm SoCs PMIC.
Default name for GPIO bank is "pm8916".
- Power and reset buttons are placed in "pm8916_key" bank and
+ Power and reset buttons are placed in "pwkey_qcom" bank and
have gpio numbers 0 and 1 respectively.
config PCF8575_GPIO
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 39762fa..9d718a5 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -63,7 +63,7 @@
obj-$(CONFIG_MVEBU_GPIO) += mvebu_gpio.o
obj-$(CONFIG_MSM_GPIO) += msm_gpio.o
obj-$(CONFIG_$(SPL_)PCF8575_GPIO) += pcf8575_gpio.o
-obj-$(CONFIG_$(SPL_TPL_)PM8916_GPIO) += pm8916_gpio.o
+obj-$(CONFIG_$(SPL_TPL_)QCOM_PMIC_GPIO) += qcom_pmic_gpio.o
obj-$(CONFIG_MT7620_GPIO) += mt7620_gpio.o
obj-$(CONFIG_MT7621_GPIO) += mt7621_gpio.o
obj-$(CONFIG_MSCC_SGPIO) += mscc_sgpio.o
diff --git a/drivers/gpio/pm8916_gpio.c b/drivers/gpio/qcom_pmic_gpio.c
similarity index 67%
rename from drivers/gpio/pm8916_gpio.c
rename to drivers/gpio/qcom_pmic_gpio.c
index 7ad9578..e9232a0 100644
--- a/drivers/gpio/pm8916_gpio.c
+++ b/drivers/gpio/qcom_pmic_gpio.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+
/*
- * Qualcomm pm8916 pmic gpio driver - part of Qualcomm PM8916 PMIC
+ * Qualcomm generic pmic gpio driver
*
* (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
*/
@@ -19,7 +19,7 @@
/* Register maps */
-/* Type and subtype are shared for all pm8916 peripherals */
+/* Type and subtype are shared for all PMIC peripherals */
#define REG_TYPE 0x4
#define REG_SUBTYPE 0x5
@@ -47,14 +47,14 @@
#define REG_EN_CTL 0x46
#define REG_EN_CTL_ENABLE (1 << 7)
-struct pm8916_gpio_bank {
+struct qcom_gpio_bank {
uint32_t pid; /* Peripheral ID on SPMI bus */
};
-static int pm8916_gpio_set_direction(struct udevice *dev, unsigned offset,
- bool input, int value)
+static int qcom_gpio_set_direction(struct udevice *dev, unsigned offset,
+ bool input, int value)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
uint32_t gpio_base = priv->pid + REG_OFFSET(offset);
int ret;
@@ -101,20 +101,20 @@
REG_EN_CTL_ENABLE);
}
-static int pm8916_gpio_direction_input(struct udevice *dev, unsigned offset)
+static int qcom_gpio_direction_input(struct udevice *dev, unsigned offset)
{
- return pm8916_gpio_set_direction(dev, offset, true, 0);
+ return qcom_gpio_set_direction(dev, offset, true, 0);
}
-static int pm8916_gpio_direction_output(struct udevice *dev, unsigned offset,
- int value)
+static int qcom_gpio_direction_output(struct udevice *dev, unsigned offset,
+ int value)
{
- return pm8916_gpio_set_direction(dev, offset, false, value);
+ return qcom_gpio_set_direction(dev, offset, false, value);
}
-static int pm8916_gpio_get_function(struct udevice *dev, unsigned offset)
+static int qcom_gpio_get_function(struct udevice *dev, unsigned offset)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
uint32_t gpio_base = priv->pid + REG_OFFSET(offset);
int reg;
@@ -134,9 +134,9 @@
}
}
-static int pm8916_gpio_get_value(struct udevice *dev, unsigned offset)
+static int qcom_gpio_get_value(struct udevice *dev, unsigned offset)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
uint32_t gpio_base = priv->pid + REG_OFFSET(offset);
int reg;
@@ -147,10 +147,10 @@
return !!(reg & REG_STATUS_VAL_MASK);
}
-static int pm8916_gpio_set_value(struct udevice *dev, unsigned offset,
- int value)
+static int qcom_gpio_set_value(struct udevice *dev, unsigned offset,
+ int value)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
uint32_t gpio_base = priv->pid + REG_OFFSET(offset);
/* Set the output value of the gpio */
@@ -158,17 +158,17 @@
REG_CTL_OUTPUT_MASK, !!value);
}
-static const struct dm_gpio_ops pm8916_gpio_ops = {
- .direction_input = pm8916_gpio_direction_input,
- .direction_output = pm8916_gpio_direction_output,
- .get_value = pm8916_gpio_get_value,
- .set_value = pm8916_gpio_set_value,
- .get_function = pm8916_gpio_get_function,
+static const struct dm_gpio_ops qcom_gpio_ops = {
+ .direction_input = qcom_gpio_direction_input,
+ .direction_output = qcom_gpio_direction_output,
+ .get_value = qcom_gpio_get_value,
+ .set_value = qcom_gpio_set_value,
+ .get_function = qcom_gpio_get_function,
};
-static int pm8916_gpio_probe(struct udevice *dev)
+static int qcom_gpio_probe(struct udevice *dev)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
int reg;
priv->pid = dev_read_addr(dev);
@@ -187,33 +187,33 @@
return 0;
}
-static int pm8916_gpio_of_to_plat(struct udevice *dev)
+static int qcom_gpio_of_to_plat(struct udevice *dev)
{
struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
uc_priv->gpio_count = dev_read_u32_default(dev, "gpio-count", 0);
uc_priv->bank_name = dev_read_string(dev, "gpio-bank-name");
if (uc_priv->bank_name == NULL)
- uc_priv->bank_name = "pm8916";
+ uc_priv->bank_name = "qcom_pmic";
return 0;
}
-static const struct udevice_id pm8916_gpio_ids[] = {
+static const struct udevice_id qcom_gpio_ids[] = {
{ .compatible = "qcom,pm8916-gpio" },
{ .compatible = "qcom,pm8994-gpio" }, /* 22 GPIO's */
{ .compatible = "qcom,pm8998-gpio" },
{ }
};
-U_BOOT_DRIVER(gpio_pm8916) = {
- .name = "gpio_pm8916",
+U_BOOT_DRIVER(qcom_pmic_gpio) = {
+ .name = "qcom_pmic_gpio",
.id = UCLASS_GPIO,
- .of_match = pm8916_gpio_ids,
- .of_to_plat = pm8916_gpio_of_to_plat,
- .probe = pm8916_gpio_probe,
- .ops = &pm8916_gpio_ops,
- .priv_auto = sizeof(struct pm8916_gpio_bank),
+ .of_match = qcom_gpio_ids,
+ .of_to_plat = qcom_gpio_of_to_plat,
+ .probe = qcom_gpio_probe,
+ .ops = &qcom_gpio_ops,
+ .priv_auto = sizeof(struct qcom_gpio_bank),
};
@@ -222,14 +222,14 @@
#define KPDPWR_ON_INT_BIT 0
#define RESIN_ON_INT_BIT 1
-static int pm8941_pwrkey_get_function(struct udevice *dev, unsigned offset)
+static int qcom_pwrkey_get_function(struct udevice *dev, unsigned offset)
{
return GPIOF_INPUT;
}
-static int pm8941_pwrkey_get_value(struct udevice *dev, unsigned offset)
+static int qcom_pwrkey_get_value(struct udevice *dev, unsigned offset)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
int reg = pmic_reg_read(dev->parent, priv->pid + PON_INT_RT_STS);
@@ -247,14 +247,14 @@
}
}
-static const struct dm_gpio_ops pm8941_pwrkey_ops = {
- .get_value = pm8941_pwrkey_get_value,
- .get_function = pm8941_pwrkey_get_function,
+static const struct dm_gpio_ops qcom_pwrkey_ops = {
+ .get_value = qcom_pwrkey_get_value,
+ .get_function = qcom_pwrkey_get_function,
};
-static int pm8941_pwrkey_probe(struct udevice *dev)
+static int qcom_pwrkey_probe(struct udevice *dev)
{
- struct pm8916_gpio_bank *priv = dev_get_priv(dev);
+ struct qcom_gpio_bank *priv = dev_get_priv(dev);
int reg;
priv->pid = dev_read_addr(dev);
@@ -273,31 +273,31 @@
return 0;
}
-static int pm8941_pwrkey_of_to_plat(struct udevice *dev)
+static int qcom_pwrkey_of_to_plat(struct udevice *dev)
{
struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
uc_priv->gpio_count = 2;
uc_priv->bank_name = dev_read_string(dev, "gpio-bank-name");
if (uc_priv->bank_name == NULL)
- uc_priv->bank_name = "pm8916_key";
+ uc_priv->bank_name = "pwkey_qcom";
return 0;
}
-static const struct udevice_id pm8941_pwrkey_ids[] = {
+static const struct udevice_id qcom_pwrkey_ids[] = {
{ .compatible = "qcom,pm8916-pwrkey" },
{ .compatible = "qcom,pm8994-pwrkey" },
{ .compatible = "qcom,pm8998-pwrkey" },
{ }
};
-U_BOOT_DRIVER(pwrkey_pm89xx) = {
- .name = "pwrkey_pm89xx",
+U_BOOT_DRIVER(pwrkey_qcom) = {
+ .name = "pwrkey_qcom",
.id = UCLASS_GPIO,
- .of_match = pm8941_pwrkey_ids,
- .of_to_plat = pm8941_pwrkey_of_to_plat,
- .probe = pm8941_pwrkey_probe,
- .ops = &pm8941_pwrkey_ops,
- .priv_auto = sizeof(struct pm8916_gpio_bank),
+ .of_match = qcom_pwrkey_ids,
+ .of_to_plat = qcom_pwrkey_of_to_plat,
+ .probe = qcom_pwrkey_probe,
+ .ops = &qcom_pwrkey_ops,
+ .priv_auto = sizeof(struct qcom_gpio_bank),
};
diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
index 66b16b0..0478f2a 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -216,10 +216,10 @@
- MUIC
- Others
-config PMIC_PM8916
- bool "Enable Driver Model for Qualcomm PM8916 PMIC"
+config PMIC_QCOM
+ bool "Enable Driver Model for Qualcomm generic PMIC"
---help---
- The PM8916 is a PMIC connected to one (or several) processors
+ The Qcom PMIC is connected to one (or several) processors
with SPMI bus. It has 2 slaves with several peripherals:
- 18x LDO
- 4x GPIO
@@ -229,7 +229,7 @@
- Vibrator drivers
- Others
- Driver binding info: doc/device-tree-bindings/pmic/pm8916.txt
+ Driver binding info: doc/device-tree-bindings/pmic/qcom,spmi-pmic.txt
config PMIC_RK8XX
bool "Enable support for Rockchip PMIC RK8XX"
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index f73b326..e1d3545 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -20,7 +20,7 @@
obj-$(CONFIG_PMIC_AS3722) += as3722.o as3722_gpio.o
obj-$(CONFIG_$(SPL_)PMIC_AXP) += axp.o
obj-$(CONFIG_PMIC_MAX8997) += max8997.o
-obj-$(CONFIG_PMIC_PM8916) += pm8916.o
+obj-$(CONFIG_PMIC_QCOM) += pmic_qcom.o
obj-$(CONFIG_$(SPL_TPL_)PMIC_RK8XX) += rk8xx.o
obj-$(CONFIG_PMIC_RN5T567) += rn5t567.o
obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
diff --git a/drivers/power/pmic/pm8916.c b/drivers/power/pmic/pm8916.c
deleted file mode 100644
index 5f4386d..0000000
--- a/drivers/power/pmic/pm8916.c
+++ /dev/null
@@ -1,86 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Qualcomm pm8916 pmic driver
- *
- * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
- */
-#include <common.h>
-#include <dm.h>
-#include <power/pmic.h>
-#include <spmi/spmi.h>
-
-#define PID_SHIFT 8
-#define PID_MASK (0xFF << PID_SHIFT)
-#define REG_MASK 0xFF
-
-struct pm8916_priv {
- uint32_t usid; /* Slave ID on SPMI bus */
-};
-
-static int pm8916_reg_count(struct udevice *dev)
-{
- return 0xFFFF;
-}
-
-static int pm8916_write(struct udevice *dev, uint reg, const uint8_t *buff,
- int len)
-{
- struct pm8916_priv *priv = dev_get_priv(dev);
-
- if (len != 1)
- return -EINVAL;
-
- return spmi_reg_write(dev->parent, priv->usid,
- (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK,
- *buff);
-}
-
-static int pm8916_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
-{
- struct pm8916_priv *priv = dev_get_priv(dev);
- int val;
-
- if (len != 1)
- return -EINVAL;
-
- val = spmi_reg_read(dev->parent, priv->usid,
- (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK);
-
- if (val < 0)
- return val;
- *buff = val;
- return 0;
-}
-
-static struct dm_pmic_ops pm8916_ops = {
- .reg_count = pm8916_reg_count,
- .read = pm8916_read,
- .write = pm8916_write,
-};
-
-static const struct udevice_id pm8916_ids[] = {
- { .compatible = "qcom,spmi-pmic" },
- { }
-};
-
-static int pm8916_probe(struct udevice *dev)
-{
- struct pm8916_priv *priv = dev_get_priv(dev);
-
- priv->usid = dev_read_addr(dev);
-
- if (priv->usid == FDT_ADDR_T_NONE)
- return -EINVAL;
-
- return 0;
-}
-
-U_BOOT_DRIVER(pmic_pm8916) = {
- .name = "pmic_pm8916",
- .id = UCLASS_PMIC,
- .of_match = pm8916_ids,
- .bind = dm_scan_fdt_dev,
- .probe = pm8916_probe,
- .ops = &pm8916_ops,
- .priv_auto = sizeof(struct pm8916_priv),
-};
diff --git a/drivers/power/pmic/pmic_qcom.c b/drivers/power/pmic/pmic_qcom.c
new file mode 100644
index 0000000..ad8daf4
--- /dev/null
+++ b/drivers/power/pmic/pmic_qcom.c
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Qualcomm generic pmic driver
+ *
+ * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
+ */
+#include <common.h>
+#include <dm.h>
+#include <power/pmic.h>
+#include <spmi/spmi.h>
+
+#define PID_SHIFT 8
+#define PID_MASK (0xFF << PID_SHIFT)
+#define REG_MASK 0xFF
+
+struct pmic_qcom_priv {
+ uint32_t usid; /* Slave ID on SPMI bus */
+};
+
+static int pmic_qcom_reg_count(struct udevice *dev)
+{
+ return 0xFFFF;
+}
+
+static int pmic_qcom_write(struct udevice *dev, uint reg, const uint8_t *buff,
+ int len)
+{
+ struct pmic_qcom_priv *priv = dev_get_priv(dev);
+
+ if (len != 1)
+ return -EINVAL;
+
+ return spmi_reg_write(dev->parent, priv->usid,
+ (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK,
+ *buff);
+}
+
+static int pmic_qcom_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
+{
+ struct pmic_qcom_priv *priv = dev_get_priv(dev);
+ int val;
+
+ if (len != 1)
+ return -EINVAL;
+
+ val = spmi_reg_read(dev->parent, priv->usid,
+ (reg & PID_MASK) >> PID_SHIFT, reg & REG_MASK);
+
+ if (val < 0)
+ return val;
+ *buff = val;
+ return 0;
+}
+
+static struct dm_pmic_ops pmic_qcom_ops = {
+ .reg_count = pmic_qcom_reg_count,
+ .read = pmic_qcom_read,
+ .write = pmic_qcom_write,
+};
+
+static const struct udevice_id pmic_qcom_ids[] = {
+ { .compatible = "qcom,spmi-pmic" },
+ { }
+};
+
+static int pmic_qcom_probe(struct udevice *dev)
+{
+ struct pmic_qcom_priv *priv = dev_get_priv(dev);
+
+ priv->usid = dev_read_addr(dev);
+
+ if (priv->usid == FDT_ADDR_T_NONE)
+ return -EINVAL;
+
+ return 0;
+}
+
+U_BOOT_DRIVER(pmic_qcom) = {
+ .name = "pmic_qcom",
+ .id = UCLASS_PMIC,
+ .of_match = pmic_qcom_ids,
+ .bind = dm_scan_fdt_dev,
+ .probe = pmic_qcom_probe,
+ .ops = &pmic_qcom_ops,
+ .priv_auto = sizeof(struct pmic_qcom_priv),
+};