aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator/lp8788-ldo.c
diff options
context:
space:
mode:
authorKim, Milo <Milo.Kim@ti.com>2013-02-18 01:51:02 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-03-03 21:37:57 -0500
commit407945fd78c3fddef83ba17bf2250112c07dc7c1 (patch)
tree28ed41bd35527cbd4df66701e096cc1068305385 /drivers/regulator/lp8788-ldo.c
parent7b74d149247c8972da1cec3e4c70b67049aaeb69 (diff)
regulator: lp8788-ldo: use ena_pin of regulator-core for external control
Regulator core driver provides enable GPIO control for enabling/disabling a regulator. Now, enable GPIO is shared among regulators. Use this internal working, so unnecessary code are removed. GPIO enable pin configurations are added in digital LDO and analog LDO drivers. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Reviewed-by: Axel Lin <axel.lin@ingics.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator/lp8788-ldo.c')
-rw-r--r--drivers/regulator/lp8788-ldo.c98
1 files changed, 17 insertions, 81 deletions
diff --git a/drivers/regulator/lp8788-ldo.c b/drivers/regulator/lp8788-ldo.c
index cd5a14ad9263..fcba90a4c26c 100644
--- a/drivers/regulator/lp8788-ldo.c
+++ b/drivers/regulator/lp8788-ldo.c
@@ -184,40 +184,6 @@ static enum lp8788_ldo_id lp8788_aldo_id[] = {
184 ALDO10, 184 ALDO10,
185}; 185};
186 186
187static int lp8788_ldo_enable(struct regulator_dev *rdev)
188{
189 struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
190
191 if (ldo->en_pin) {
192 gpio_set_value(ldo->en_pin->gpio, ENABLE);
193 return 0;
194 } else {
195 return regulator_enable_regmap(rdev);
196 }
197}
198
199static int lp8788_ldo_disable(struct regulator_dev *rdev)
200{
201 struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
202
203 if (ldo->en_pin) {
204 gpio_set_value(ldo->en_pin->gpio, DISABLE);
205 return 0;
206 } else {
207 return regulator_disable_regmap(rdev);
208 }
209}
210
211static int lp8788_ldo_is_enabled(struct regulator_dev *rdev)
212{
213 struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
214
215 if (ldo->en_pin)
216 return gpio_get_value(ldo->en_pin->gpio) ? 1 : 0;
217 else
218 return regulator_is_enabled_regmap(rdev);
219}
220
221static int lp8788_ldo_enable_time(struct regulator_dev *rdev) 187static int lp8788_ldo_enable_time(struct regulator_dev *rdev)
222{ 188{
223 struct lp8788_ldo *ldo = rdev_get_drvdata(rdev); 189 struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
@@ -253,17 +219,17 @@ static struct regulator_ops lp8788_ldo_voltage_table_ops = {
253 .list_voltage = regulator_list_voltage_table, 219 .list_voltage = regulator_list_voltage_table,
254 .set_voltage_sel = regulator_set_voltage_sel_regmap, 220 .set_voltage_sel = regulator_set_voltage_sel_regmap,
255 .get_voltage_sel = regulator_get_voltage_sel_regmap, 221 .get_voltage_sel = regulator_get_voltage_sel_regmap,
256 .enable = lp8788_ldo_enable, 222 .enable = regulator_enable_regmap,
257 .disable = lp8788_ldo_disable, 223 .disable = regulator_disable_regmap,
258 .is_enabled = lp8788_ldo_is_enabled, 224 .is_enabled = regulator_is_enabled_regmap,
259 .enable_time = lp8788_ldo_enable_time, 225 .enable_time = lp8788_ldo_enable_time,
260}; 226};
261 227
262static struct regulator_ops lp8788_ldo_voltage_fixed_ops = { 228static struct regulator_ops lp8788_ldo_voltage_fixed_ops = {
263 .get_voltage = lp8788_ldo_fixed_get_voltage, 229 .get_voltage = lp8788_ldo_fixed_get_voltage,
264 .enable = lp8788_ldo_enable, 230 .enable = regulator_enable_regmap,
265 .disable = lp8788_ldo_disable, 231 .disable = regulator_disable_regmap,
266 .is_enabled = lp8788_ldo_is_enabled, 232 .is_enabled = regulator_is_enabled_regmap,
267 .enable_time = lp8788_ldo_enable_time, 233 .enable_time = lp8788_ldo_enable_time,
268}; 234};
269 235
@@ -535,43 +501,10 @@ static struct regulator_desc lp8788_aldo_desc[] = {
535 }, 501 },
536}; 502};
537 503
538static int lp8788_gpio_request_ldo_en(struct platform_device *pdev,
539 struct lp8788_ldo *ldo,
540 enum lp8788_ext_ldo_en_id id)
541{
542 struct device *dev = &pdev->dev;
543 struct lp8788_ldo_enable_pin *pin = ldo->en_pin;
544 int ret, gpio, pinstate;
545 char *name[] = {
546 [EN_ALDO1] = "LP8788_EN_ALDO1",
547 [EN_ALDO234] = "LP8788_EN_ALDO234",
548 [EN_ALDO5] = "LP8788_EN_ALDO5",
549 [EN_ALDO7] = "LP8788_EN_ALDO7",
550 [EN_DLDO7] = "LP8788_EN_DLDO7",
551 [EN_DLDO911] = "LP8788_EN_DLDO911",
552 };
553
554 gpio = pin->gpio;
555 if (!gpio_is_valid(gpio)) {
556 dev_err(dev, "invalid gpio: %d\n", gpio);
557 return -EINVAL;
558 }
559
560 pinstate = pin->init_state;
561 ret = devm_gpio_request_one(dev, gpio, pinstate, name[id]);
562 if (ret == -EBUSY) {
563 dev_warn(dev, "gpio%d already used\n", gpio);
564 return 0;
565 }
566
567 return ret;
568}
569
570static int lp8788_config_ldo_enable_mode(struct platform_device *pdev, 504static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
571 struct lp8788_ldo *ldo, 505 struct lp8788_ldo *ldo,
572 enum lp8788_ldo_id id) 506 enum lp8788_ldo_id id)
573{ 507{
574 int ret;
575 struct lp8788 *lp = ldo->lp; 508 struct lp8788 *lp = ldo->lp;
576 struct lp8788_platform_data *pdata = lp->pdata; 509 struct lp8788_platform_data *pdata = lp->pdata;
577 enum lp8788_ext_ldo_en_id enable_id; 510 enum lp8788_ext_ldo_en_id enable_id;
@@ -613,14 +546,7 @@ static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
613 goto set_default_ldo_enable_mode; 546 goto set_default_ldo_enable_mode;
614 547
615 ldo->en_pin = pdata->ldo_pin[enable_id]; 548 ldo->en_pin = pdata->ldo_pin[enable_id];
616 549 return 0;
617 ret = lp8788_gpio_request_ldo_en(pdev, ldo, enable_id);
618 if (ret) {
619 ldo->en_pin = NULL;
620 goto set_default_ldo_enable_mode;
621 }
622
623 return ret;
624 550
625set_default_ldo_enable_mode: 551set_default_ldo_enable_mode:
626 return lp8788_update_bits(lp, LP8788_EN_SEL, en_mask[enable_id], 0); 552 return lp8788_update_bits(lp, LP8788_EN_SEL, en_mask[enable_id], 0);
@@ -644,6 +570,11 @@ static int lp8788_dldo_probe(struct platform_device *pdev)
644 if (ret) 570 if (ret)
645 return ret; 571 return ret;
646 572
573 if (ldo->en_pin) {
574 cfg.ena_gpio = ldo->en_pin->gpio;
575 cfg.ena_gpio_flags = ldo->en_pin->init_state;
576 }
577
647 cfg.dev = pdev->dev.parent; 578 cfg.dev = pdev->dev.parent;
648 cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL; 579 cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL;
649 cfg.driver_data = ldo; 580 cfg.driver_data = ldo;
@@ -700,6 +631,11 @@ static int lp8788_aldo_probe(struct platform_device *pdev)
700 if (ret) 631 if (ret)
701 return ret; 632 return ret;
702 633
634 if (ldo->en_pin) {
635 cfg.ena_gpio = ldo->en_pin->gpio;
636 cfg.ena_gpio_flags = ldo->en_pin->init_state;
637 }
638
703 cfg.dev = pdev->dev.parent; 639 cfg.dev = pdev->dev.parent;
704 cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL; 640 cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL;
705 cfg.driver_data = ldo; 641 cfg.driver_data = ldo;