Merge branch 'syscore' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspen...
[pandora-kernel.git] / drivers / regulator / 88pm8607.c
index dd63084..8592512 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
+#include <linux/mfd/core.h>
 #include <linux/mfd/88pm860x.h>
 
 struct pm8607_regulator_info {
@@ -394,47 +395,48 @@ static struct pm8607_regulator_info pm8607_regulator_info[] = {
        PM8607_LDO(14,        LDO14, 0, 4, SUPPLIES_EN12, 6),
 };
 
-static inline struct pm8607_regulator_info *find_regulator_info(int id)
+static int __devinit pm8607_regulator_probe(struct platform_device *pdev)
 {
-       struct pm8607_regulator_info *info;
+       struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
+       struct pm8607_regulator_info *info = NULL;
+       struct regulator_init_data *pdata;
+       struct mfd_cell *cell;
        int i;
 
+       cell = pdev->dev.platform_data;
+       if (cell == NULL)
+               return -ENODEV;
+       pdata = cell->mfd_data;
+       if (pdata == NULL)
+               return -EINVAL;
+
        for (i = 0; i < ARRAY_SIZE(pm8607_regulator_info); i++) {
                info = &pm8607_regulator_info[i];
-               if (info->desc.id == id)
-                       return info;
+               if (!strcmp(info->desc.name, pdata->constraints.name))
+                       break;
        }
-       return NULL;
-}
-
-static int __devinit pm8607_regulator_probe(struct platform_device *pdev)
-{
-       struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
-       struct pm860x_platform_data *pdata = chip->dev->platform_data;
-       struct pm8607_regulator_info *info = NULL;
-
-       info = find_regulator_info(pdev->id);
-       if (info == NULL) {
-               dev_err(&pdev->dev, "invalid regulator ID specified\n");
+       if (i > ARRAY_SIZE(pm8607_regulator_info)) {
+               dev_err(&pdev->dev, "Failed to find regulator %s\n",
+                       pdata->constraints.name);
                return -EINVAL;
        }
 
        info->i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion;
        info->chip = chip;
 
+       /* check DVC ramp slope double */
+       if (!strcmp(info->desc.name, "BUCK3"))
+               if (info->chip->buck3_double)
+                       info->slope_double = 1;
+
        info->regulator = regulator_register(&info->desc, &pdev->dev,
-                                            pdata->regulator[pdev->id], info);
+                                            pdata, info);
        if (IS_ERR(info->regulator)) {
                dev_err(&pdev->dev, "failed to register regulator %s\n",
                        info->desc.name);
                return PTR_ERR(info->regulator);
        }
 
-       /* check DVC ramp slope double */
-       if (info->desc.id == PM8607_ID_BUCK3)
-               if (info->chip->buck3_double)
-                       info->slope_double = 1;
-
        platform_set_drvdata(pdev, info);
        return 0;
 }