mfd: 88pm800: Add regulator sub device
authorChao Xie <chao.xie@marvell.com>
Fri, 14 Jun 2013 05:21:53 +0000 (01:21 -0400)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 18 Jun 2013 07:41:12 +0000 (09:41 +0200)
Signed-off-by: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/88pm800.c
include/linux/mfd/88pm80x.h

index a475fb3c2d0c415710485790c2b7bade86674532..6c954835d61ecb04dd0801ccae801033869f2b74 100644 (file)
@@ -157,6 +157,13 @@ static struct mfd_cell onkey_devs[] = {
         },
 };
 
+static struct mfd_cell regulator_devs[] = {
+       {
+        .name = "88pm80x-regulator",
+        .id = -1,
+       },
+};
+
 static const struct regmap_irq pm800_irqs[] = {
        /* INT0 */
        [PM800_IRQ_ONKEY] = {
@@ -339,6 +346,21 @@ static int device_rtc_init(struct pm80x_chip *chip,
        return 0;
 }
 
+static int device_regulator_init(struct pm80x_chip *chip,
+                                          struct pm80x_platform_data *pdata)
+{
+       int ret;
+
+       ret = mfd_add_devices(chip->dev, 0, &regulator_devs[0],
+                             ARRAY_SIZE(regulator_devs), NULL, 0, NULL);
+       if (ret) {
+               dev_err(chip->dev, "Failed to add regulator subdev\n");
+               return ret;
+       }
+
+       return 0;
+}
+
 static int device_irq_init_800(struct pm80x_chip *chip)
 {
        struct regmap *map = chip->regmap;
@@ -500,6 +522,12 @@ static int device_800_init(struct pm80x_chip *chip,
                goto out;
        }
 
+       ret = device_regulator_init(chip, pdata);
+       if (ret) {
+               dev_err(chip->dev, "Failed to add regulators subdev\n");
+               goto out;
+       }
+
        return 0;
 out_dev:
        mfd_remove_devices(chip->dev);
index 4a66a563303176cb55bd21f8e83558efced77ca9..97cb283cc8e112ef23a08ca2b03e9acfacd42669 100644 (file)
@@ -307,6 +307,14 @@ struct pm80x_chip {
 
 struct pm80x_platform_data {
        struct pm80x_rtc_pdata *rtc;
+       /*
+        * For the regulator not defined, set regulators[not_defined] to be
+        * NULL. num_regulators are the number of regulators supposed to be
+        * initialized. If all regulators are not defined, set num_regulators
+        * to be 0.
+        */
+       struct regulator_init_data *regulators[PM800_ID_RG_MAX];
+       unsigned int num_regulators;
        int irq_mode;           /* Clear interrupt by read/write(0/1) */
        int batt_det;           /* enable/disable */
        int (*plat_config)(struct pm80x_chip *chip,