Merge remote-tracking branch 'regulator/topic/alias' into regulator-next
authorMark Brown <broonie@linaro.org>
Thu, 24 Oct 2013 10:11:32 +0000 (11:11 +0100)
committerMark Brown <broonie@linaro.org>
Thu, 24 Oct 2013 10:11:32 +0000 (11:11 +0100)
1  2 
drivers/regulator/palmas-regulator.c
drivers/regulator/ti-abb-regulator.c
drivers/regulator/wm831x-ldo.c
drivers/regulator/wm8350-regulator.c
include/linux/regulator/driver.h

@@@ -201,7 -201,13 +201,7 @@@ static unsigned int palmas_smps_ramp_de
  #define SMPS_CTRL_MODE_ECO            0x02
  #define SMPS_CTRL_MODE_PWM            0x03
  
 -/* These values are derived from the data sheet. And are the number of steps
 - * where there is a voltage change, the ranges at beginning and end of register
 - * max/min values where there are no change are ommitted.
 - *
 - * So they are basically (maxV-minV)/stepV
 - */
 -#define PALMAS_SMPS_NUM_VOLTAGES      117
 +#define PALMAS_SMPS_NUM_VOLTAGES      122
  #define PALMAS_SMPS10_NUM_VOLTAGES    2
  #define PALMAS_LDO_NUM_VOLTAGES               50
  
@@@ -856,7 -862,7 +856,7 @@@ static int palmas_regulators_probe(stru
                        if (ret < 0) {
                                dev_err(&pdev->dev,
                                        "reading TSTEP reg failed: %d\n", ret);
-                               goto err_unregister_regulator;
+                               return ret;
                        }
                        pmic->desc[id].ramp_delay =
                                        palmas_smps_ramp_delay[reg & 0x3];
                        reg_init = pdata->reg_init[id];
                        ret = palmas_smps_init(palmas, id, reg_init);
                        if (ret)
-                               goto err_unregister_regulator;
+                               return ret;
                }
  
                /* Register the regulators */
  
                        ret = palmas_smps_read(pmic->palmas, addr, &reg);
                        if (ret)
-                               goto err_unregister_regulator;
+                               return ret;
                        if (reg & PALMAS_SMPS12_VOLTAGE_RANGE)
                                pmic->range[id] = 1;
  
                        addr = palmas_regs_info[id].ctrl_addr;
                        ret = palmas_smps_read(pmic->palmas, addr, &reg);
                        if (ret)
-                               goto err_unregister_regulator;
+                               return ret;
                        pmic->current_reg_mode[id] = reg &
                                        PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
                }
                pmic->desc[id].supply_name = palmas_regs_info[id].sname;
                config.of_node = palmas_matches[id].of_node;
  
-               rdev = regulator_register(&pmic->desc[id], &config);
+               rdev = devm_regulator_register(&pdev->dev, &pmic->desc[id],
+                                              &config);
                if (IS_ERR(rdev)) {
                        dev_err(&pdev->dev,
                                "failed to register %s regulator\n",
                                pdev->name);
-                       ret = PTR_ERR(rdev);
-                       goto err_unregister_regulator;
+                       return PTR_ERR(rdev);
                }
  
                /* Save regulator for cleanup */
                        pmic->desc[id].min_uV = 900000;
                        pmic->desc[id].uV_step = 50000;
                        pmic->desc[id].linear_min_sel = 1;
 +                      pmic->desc[id].enable_time = 500;
                        pmic->desc[id].vsel_reg =
                                        PALMAS_BASE_TO_REG(PALMAS_LDO_BASE,
                                                palmas_regs_info[id].vsel_addr);
                                pmic->desc[id].min_uV = 450000;
                                pmic->desc[id].uV_step = 25000;
                        }
 +
 +                      /* LOD6 in vibrator mode will have enable time 2000us */
 +                      if (pdata && pdata->ldo6_vibrator &&
 +                              (id == PALMAS_REG_LDO6))
 +                              pmic->desc[id].enable_time = 2000;
                } else {
                        pmic->desc[id].n_voltages = 1;
                        pmic->desc[id].ops = &palmas_ops_extreg;
                pmic->desc[id].supply_name = palmas_regs_info[id].sname;
                config.of_node = palmas_matches[id].of_node;
  
-               rdev = regulator_register(&pmic->desc[id], &config);
+               rdev = devm_regulator_register(&pdev->dev, &pmic->desc[id],
+                                              &config);
                if (IS_ERR(rdev)) {
                        dev_err(&pdev->dev,
                                "failed to register %s regulator\n",
                                pdev->name);
-                       ret = PTR_ERR(rdev);
-                       goto err_unregister_regulator;
+                       return PTR_ERR(rdev);
                }
  
                /* Save regulator for cleanup */
                                else
                                        ret = palmas_extreg_init(palmas,
                                                        id, reg_init);
-                               if (ret) {
-                                       regulator_unregister(pmic->rdev[id]);
-                                       goto err_unregister_regulator;
-                               }
+                               if (ret)
+                                       return ret;
                        }
                }
        }
  
  
        return 0;
- err_unregister_regulator:
-       while (--id >= 0)
-               regulator_unregister(pmic->rdev[id]);
-       return ret;
- }
- static int palmas_regulators_remove(struct platform_device *pdev)
- {
-       struct palmas_pmic *pmic = platform_get_drvdata(pdev);
-       int id;
-       for (id = 0; id < PALMAS_NUM_REGS; id++)
-               regulator_unregister(pmic->rdev[id]);
-       return 0;
  }
  
  static struct of_device_id of_palmas_match_tbl[] = {
@@@ -1083,7 -1066,6 +1066,6 @@@ static struct platform_driver palmas_dr
                .owner = THIS_MODULE,
        },
        .probe = palmas_regulators_probe,
-       .remove = palmas_regulators_remove,
  };
  
  static int __init palmas_init(void)
@@@ -279,12 -279,8 +279,12 @@@ static int ti_abb_set_opp(struct regula
        ti_abb_rmw(regs->opp_sel_mask, info->opp_sel, regs->control_reg,
                   abb->base);
  
 -      /* program LDO VBB vset override if needed */
 -      if (abb->ldo_base)
 +      /*
 +       * program LDO VBB vset override if needed for !bypass mode
 +       * XXX: Do not switch sequence - for !bypass, LDO override reset *must*
 +       * be performed *before* switch to bias mode else VBB glitches.
 +       */
 +      if (abb->ldo_base && info->opp_sel != TI_ABB_NOMINAL_OPP)
                ti_abb_program_ldovbb(dev, abb, info);
  
        /* Initiate ABB ldo change */
        if (ret)
                goto out;
  
 +      /*
 +       * Reset LDO VBB vset override bypass mode
 +       * XXX: Do not switch sequence - for bypass, LDO override reset *must*
 +       * be performed *after* switch to bypass else VBB glitches.
 +       */
 +      if (abb->ldo_base && info->opp_sel == TI_ABB_NOMINAL_OPP)
 +              ti_abb_program_ldovbb(dev, abb, info);
 +
  out:
        return ret;
  }
@@@ -615,7 -603,7 +615,7 @@@ static int ti_abb_init_table(struct dev
                                        pname, *volt_table, vset_mask);
                        continue;
                }
 -              info->vset = efuse_val & vset_mask >> __ffs(vset_mask);
 +              info->vset = (efuse_val & vset_mask) >> __ffs(vset_mask);
                dev_dbg(dev, "[%d]v=%d vset=%x\n", i, *volt_table, info->vset);
  check_abb:
                switch (info->opp_sel) {
@@@ -708,39 -696,31 +708,31 @@@ static int ti_abb_probe(struct platform
        match = of_match_device(ti_abb_of_match, dev);
        if (!match) {
                /* We do not expect this to happen */
-               ret = -ENODEV;
                dev_err(dev, "%s: Unable to match device\n", __func__);
-               goto err;
+               return -ENODEV;
        }
        if (!match->data) {
-               ret = -EINVAL;
                dev_err(dev, "%s: Bad data in match\n", __func__);
-               goto err;
+               return -EINVAL;
        }
  
        abb = devm_kzalloc(dev, sizeof(struct ti_abb), GFP_KERNEL);
-       if (!abb) {
-               dev_err(dev, "%s: Unable to allocate ABB struct\n", __func__);
-               ret = -ENOMEM;
-               goto err;
-       }
+       if (!abb)
+               return -ENOMEM;
        abb->regs = match->data;
  
        /* Map ABB resources */
        pname = "base-address";
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname);
        abb->base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(abb->base)) {
-               ret = PTR_ERR(abb->base);
-               goto err;
-       }
+       if (IS_ERR(abb->base))
+               return PTR_ERR(abb->base);
  
        pname = "int-address";
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname);
        if (!res) {
                dev_err(dev, "Missing '%s' IO resource\n", pname);
-               ret = -ENODEV;
-               goto err;
+               return -ENODEV;
        }
        /*
         * We may have shared interrupt register offsets which are
                                             resource_size(res));
        if (!abb->int_base) {
                dev_err(dev, "Unable to map '%s'\n", pname);
-               ret = -ENOMEM;
-               goto err;
+               return -ENOMEM;
        }
  
        /* Map Optional resources */
                                               resource_size(res));
        if (!abb->efuse_base) {
                dev_err(dev, "Unable to map '%s'\n", pname);
-               ret = -ENOMEM;
-               goto err;
+               return -ENOMEM;
        }
  
        pname = "ldo-address";
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, pname);
        abb->ldo_base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(abb->ldo_base)) {
-               ret = PTR_ERR(abb->ldo_base);
-               goto err;
-       }
+       if (IS_ERR(abb->ldo_base))
+               return PTR_ERR(abb->ldo_base);
  
        /* IF ldo_base is set, the following are mandatory */
        pname = "ti,ldovbb-override-mask";
                                 &abb->ldovbb_override_mask);
        if (ret) {
                dev_err(dev, "Missing '%s' (%d)\n", pname, ret);
-               goto err;
+               return ret;
        }
        if (!abb->ldovbb_override_mask) {
                dev_err(dev, "Invalid property:'%s' set as 0!\n", pname);
-               ret = -EINVAL;
-               goto err;
+               return -EINVAL;
        }
  
        pname = "ti,ldovbb-vset-mask";
                                 &abb->ldovbb_vset_mask);
        if (ret) {
                dev_err(dev, "Missing '%s' (%d)\n", pname, ret);
-               goto err;
+               return ret;
        }
        if (!abb->ldovbb_vset_mask) {
                dev_err(dev, "Invalid property:'%s' set as 0!\n", pname);
-               ret = -EINVAL;
-               goto err;
+               return -EINVAL;
        }
  
  skip_opt:
                                 &abb->txdone_mask);
        if (ret) {
                dev_err(dev, "Missing '%s' (%d)\n", pname, ret);
-               goto err;
+               return ret;
        }
        if (!abb->txdone_mask) {
                dev_err(dev, "Invalid property:'%s' set as 0!\n", pname);
-               ret = -EINVAL;
-               goto err;
+               return -EINVAL;
        }
  
        initdata = of_get_regulator_init_data(dev, pdev->dev.of_node);
        if (!initdata) {
-               ret = -ENOMEM;
                dev_err(dev, "%s: Unable to alloc regulator init data\n",
                        __func__);
-               goto err;
+               return -ENOMEM;
        }
  
        /* init ABB opp_sel table */
        ret = ti_abb_init_table(dev, abb, initdata);
        if (ret)
-               goto err;
+               return ret;
  
        /* init ABB timing */
        ret = ti_abb_init_timings(dev, abb);
        if (ret)
-               goto err;
+               return ret;
  
        desc = &abb->rdesc;
        desc->name = dev_name(dev);
        config.driver_data = abb;
        config.of_node = pdev->dev.of_node;
  
-       rdev = regulator_register(desc, &config);
+       rdev = devm_regulator_register(dev, desc, &config);
        if (IS_ERR(rdev)) {
                ret = PTR_ERR(rdev);
                dev_err(dev, "%s: failed to register regulator(%d)\n",
                        __func__, ret);
-               goto err;
+               return ret;
        }
        platform_set_drvdata(pdev, rdev);
  
        ti_abb_rmw(abb->regs->sr2_en_mask, 1, abb->regs->setup_reg, abb->base);
  
        return 0;
- err:
-       dev_err(dev, "%s: Failed to initialize(%d)\n", __func__, ret);
-       return ret;
- }
- /**
-  * ti_abb_remove() - cleanups
-  * @pdev: ABB platform device
-  *
-  * Return: 0
-  */
- static int ti_abb_remove(struct platform_device *pdev)
- {
-       struct regulator_dev *rdev = platform_get_drvdata(pdev);
-       regulator_unregister(rdev);
-       return 0;
  }
  
  MODULE_ALIAS("platform:ti_abb");
  
  static struct platform_driver ti_abb_driver = {
        .probe = ti_abb_probe,
-       .remove = ti_abb_remove,
        .driver = {
                   .name = "ti_abb",
                   .owner = THIS_MODULE,
@@@ -63,7 -63,7 +63,7 @@@ static irqreturn_t wm831x_ldo_uv_irq(in
   */
  
  static const struct regulator_linear_range wm831x_gp_ldo_ranges[] = {
 -      { .min_uV =  900000, .max_uV = 1650000, .min_sel =  0, .max_sel = 14,
 +      { .min_uV =  900000, .max_uV = 1600000, .min_sel =  0, .max_sel = 14,
          .uV_step =  50000 },
        { .min_uV = 1700000, .max_uV = 3300000, .min_sel = 15, .max_sel = 31,
          .uV_step = 100000 },
@@@ -279,7 -279,8 +279,8 @@@ static int wm831x_gp_ldo_probe(struct p
        config.driver_data = ldo;
        config.regmap = wm831x->regmap;
  
-       ldo->regulator = regulator_register(&ldo->desc, &config);
+       ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
+                                                &config);
        if (IS_ERR(ldo->regulator)) {
                ret = PTR_ERR(ldo->regulator);
                dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
        }
  
        irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
-       ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
-                                  IRQF_TRIGGER_RISING, ldo->name,
-                                  ldo);
+       ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+                                       wm831x_ldo_uv_irq,
+                                       IRQF_TRIGGER_RISING, ldo->name,
+                                       ldo);
        if (ret != 0) {
                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
                        irq, ret);
-               goto err_regulator;
+               goto err;
        }
  
        platform_set_drvdata(pdev, ldo);
  
        return 0;
  
- err_regulator:
-       regulator_unregister(ldo->regulator);
  err:
        return ret;
  }
  
- static int wm831x_gp_ldo_remove(struct platform_device *pdev)
- {
-       struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
-       free_irq(wm831x_irq(ldo->wm831x,
-                           platform_get_irq_byname(pdev, "UV")), ldo);
-       regulator_unregister(ldo->regulator);
-       return 0;
- }
  static struct platform_driver wm831x_gp_ldo_driver = {
        .probe = wm831x_gp_ldo_probe,
-       .remove = wm831x_gp_ldo_remove,
        .driver         = {
                .name   = "wm831x-ldo",
                .owner  = THIS_MODULE,
   */
  
  static const struct regulator_linear_range wm831x_aldo_ranges[] = {
 -      { .min_uV = 1000000, .max_uV = 1650000, .min_sel =  0, .max_sel = 12,
 +      { .min_uV = 1000000, .max_uV = 1600000, .min_sel =  0, .max_sel = 12,
          .uV_step =  50000 },
        { .min_uV = 1700000, .max_uV = 3500000, .min_sel = 13, .max_sel = 31,
          .uV_step = 100000 },
@@@ -505,7 -493,8 +493,8 @@@ static int wm831x_aldo_probe(struct pla
        config.driver_data = ldo;
        config.regmap = wm831x->regmap;
  
-       ldo->regulator = regulator_register(&ldo->desc, &config);
+       ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
+                                                &config);
        if (IS_ERR(ldo->regulator)) {
                ret = PTR_ERR(ldo->regulator);
                dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
        }
  
        irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
-       ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
-                                  IRQF_TRIGGER_RISING, ldo->name, ldo);
+       ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+                                       wm831x_ldo_uv_irq,
+                                       IRQF_TRIGGER_RISING, ldo->name, ldo);
        if (ret != 0) {
                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
                        irq, ret);
-               goto err_regulator;
+               goto err;
        }
  
        platform_set_drvdata(pdev, ldo);
  
        return 0;
  
- err_regulator:
-       regulator_unregister(ldo->regulator);
  err:
        return ret;
  }
  
- static int wm831x_aldo_remove(struct platform_device *pdev)
- {
-       struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
-       free_irq(wm831x_irq(ldo->wm831x, platform_get_irq_byname(pdev, "UV")),
-                ldo);
-       regulator_unregister(ldo->regulator);
-       return 0;
- }
  static struct platform_driver wm831x_aldo_driver = {
        .probe = wm831x_aldo_probe,
-       .remove = wm831x_aldo_remove,
        .driver         = {
                .name   = "wm831x-aldo",
                .owner  = THIS_MODULE,
@@@ -663,7 -639,8 +639,8 @@@ static int wm831x_alive_ldo_probe(struc
        config.driver_data = ldo;
        config.regmap = wm831x->regmap;
  
-       ldo->regulator = regulator_register(&ldo->desc, &config);
+       ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
+                                                &config);
        if (IS_ERR(ldo->regulator)) {
                ret = PTR_ERR(ldo->regulator);
                dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
@@@ -679,18 -656,8 +656,8 @@@ err
        return ret;
  }
  
- static int wm831x_alive_ldo_remove(struct platform_device *pdev)
- {
-       struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
-       regulator_unregister(ldo->regulator);
-       return 0;
- }
  static struct platform_driver wm831x_alive_ldo_driver = {
        .probe = wm831x_alive_ldo_probe,
-       .remove = wm831x_alive_ldo_remove,
        .driver         = {
                .name   = "wm831x-alive-ldo",
                .owner  = THIS_MODULE,
@@@ -543,7 -543,7 +543,7 @@@ static int wm8350_dcdc_set_suspend_mode
  }
  
  static const struct regulator_linear_range wm8350_ldo_ranges[] = {
 -      { .min_uV =  900000, .max_uV = 1750000, .min_sel =  0, .max_sel = 15,
 +      { .min_uV =  900000, .max_uV = 1650000, .min_sel =  0, .max_sel = 15,
          .uV_step =  50000 },
        { .min_uV = 1800000, .max_uV = 3300000, .min_sel = 16, .max_sel = 31,
          .uV_step = 100000 },
@@@ -1206,7 -1206,8 +1206,8 @@@ static int wm8350_regulator_probe(struc
        config.regmap = wm8350->regmap;
  
        /* register regulator */
-       rdev = regulator_register(&wm8350_reg[pdev->id], &config);
+       rdev = devm_regulator_register(&pdev->dev, &wm8350_reg[pdev->id],
+                                      &config);
        if (IS_ERR(rdev)) {
                dev_err(&pdev->dev, "failed to register %s\n",
                        wm8350_reg[pdev->id].name);
        ret = wm8350_register_irq(wm8350, wm8350_reg[pdev->id].irq,
                                  pmic_uv_handler, 0, "UV", rdev);
        if (ret < 0) {
-               regulator_unregister(rdev);
                dev_err(&pdev->dev, "failed to register regulator %s IRQ\n",
                        wm8350_reg[pdev->id].name);
                return ret;
@@@ -1233,8 -1233,6 +1233,6 @@@ static int wm8350_regulator_remove(stru
  
        wm8350_free_irq(wm8350, wm8350_reg[pdev->id].irq, rdev);
  
-       regulator_unregister(rdev);
        return 0;
  }
  
@@@ -40,8 -40,6 +40,8 @@@ enum regulator_status 
  };
  
  /**
 + * struct regulator_linear_range - specify linear voltage ranges
 + *
   * Specify a range of voltages for regulator_map_linar_range() and
   * regulator_list_linear_range().
   *
@@@ -336,7 -334,12 +336,12 @@@ struct regulator_dev 
  struct regulator_dev *
  regulator_register(const struct regulator_desc *regulator_desc,
                   const struct regulator_config *config);
+ struct regulator_dev *
+ devm_regulator_register(struct device *dev,
+                       const struct regulator_desc *regulator_desc,
+                       const struct regulator_config *config);
  void regulator_unregister(struct regulator_dev *rdev);
+ void devm_regulator_unregister(struct device *dev, struct regulator_dev *rdev);
  
  int regulator_notifier_call_chain(struct regulator_dev *rdev,
                                  unsigned long event, void *data);