diff options
Diffstat (limited to 'drivers/regulator')
-rw-r--r-- | drivers/regulator/core.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 671eb53b5cdc..b362dbde80f7 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -577,7 +577,9 @@ static void drms_uA_update(struct regulator_dev *rdev) | |||
577 | 577 | ||
578 | err = regulator_check_drms(rdev); | 578 | err = regulator_check_drms(rdev); |
579 | if (err < 0 || !rdev->desc->ops->get_optimum_mode || | 579 | if (err < 0 || !rdev->desc->ops->get_optimum_mode || |
580 | !rdev->desc->ops->get_voltage || !rdev->desc->ops->set_mode) | 580 | (!rdev->desc->ops->get_voltage && |
581 | !rdev->desc->ops->get_voltage_sel) || | ||
582 | !rdev->desc->ops->set_mode) | ||
581 | return; | 583 | return; |
582 | 584 | ||
583 | /* get output voltage */ | 585 | /* get output voltage */ |
@@ -1682,7 +1684,14 @@ EXPORT_SYMBOL_GPL(regulator_set_voltage); | |||
1682 | 1684 | ||
1683 | static int _regulator_get_voltage(struct regulator_dev *rdev) | 1685 | static int _regulator_get_voltage(struct regulator_dev *rdev) |
1684 | { | 1686 | { |
1685 | /* sanity check */ | 1687 | int sel; |
1688 | |||
1689 | if (rdev->desc->ops->get_voltage_sel) { | ||
1690 | sel = rdev->desc->ops->get_voltage_sel(rdev); | ||
1691 | if (sel < 0) | ||
1692 | return sel; | ||
1693 | return rdev->desc->ops->list_voltage(rdev, sel); | ||
1694 | } | ||
1686 | if (rdev->desc->ops->get_voltage) | 1695 | if (rdev->desc->ops->get_voltage) |
1687 | return rdev->desc->ops->get_voltage(rdev); | 1696 | return rdev->desc->ops->get_voltage(rdev); |
1688 | else | 1697 | else |
@@ -2191,7 +2200,7 @@ static int add_regulator_attributes(struct regulator_dev *rdev) | |||
2191 | int status = 0; | 2200 | int status = 0; |
2192 | 2201 | ||
2193 | /* some attributes need specific methods to be displayed */ | 2202 | /* some attributes need specific methods to be displayed */ |
2194 | if (ops->get_voltage) { | 2203 | if (ops->get_voltage || ops->get_voltage_sel) { |
2195 | status = device_create_file(dev, &dev_attr_microvolts); | 2204 | status = device_create_file(dev, &dev_attr_microvolts); |
2196 | if (status < 0) | 2205 | if (status < 0) |
2197 | return status; | 2206 | return status; |
@@ -2327,6 +2336,16 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, | |||
2327 | if (!init_data) | 2336 | if (!init_data) |
2328 | return ERR_PTR(-EINVAL); | 2337 | return ERR_PTR(-EINVAL); |
2329 | 2338 | ||
2339 | /* Only one of each should be implemented */ | ||
2340 | WARN_ON(regulator_desc->ops->get_voltage && | ||
2341 | regulator_desc->ops->get_voltage_sel); | ||
2342 | |||
2343 | /* If we're using selectors we must implement list_voltage. */ | ||
2344 | if (regulator_desc->ops->get_voltage_sel && | ||
2345 | !regulator_desc->ops->list_voltage) { | ||
2346 | return ERR_PTR(-EINVAL); | ||
2347 | } | ||
2348 | |||
2330 | rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL); | 2349 | rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL); |
2331 | if (rdev == NULL) | 2350 | if (rdev == NULL) |
2332 | return ERR_PTR(-ENOMEM); | 2351 | return ERR_PTR(-ENOMEM); |