diff options
author | Kim, Milo <Milo.Kim@ti.com> | 2013-02-18 01:51:02 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-03-03 21:37:57 -0500 |
commit | 407945fd78c3fddef83ba17bf2250112c07dc7c1 (patch) | |
tree | 28ed41bd35527cbd4df66701e096cc1068305385 /drivers/regulator/lp8788-ldo.c | |
parent | 7b74d149247c8972da1cec3e4c70b67049aaeb69 (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.c | 98 |
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 | ||
187 | static 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 | |||
199 | static 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 | |||
211 | static 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 | |||
221 | static int lp8788_ldo_enable_time(struct regulator_dev *rdev) | 187 | static 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 | ||
262 | static struct regulator_ops lp8788_ldo_voltage_fixed_ops = { | 228 | static 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 | ||
538 | static 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 | |||
570 | static int lp8788_config_ldo_enable_mode(struct platform_device *pdev, | 504 | static 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 | ||
625 | set_default_ldo_enable_mode: | 551 | set_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; |