Commit 4c7d83e8 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/fix/88pm800',...

Merge remote-tracking branches 'regulator/fix/88pm800', 'regulator/fix/max8973', 'regulator/fix/s2mps11' and 'regulator/fix/supply' into regulator-linus
...@@ -130,7 +130,7 @@ struct pm800_regulators { ...@@ -130,7 +130,7 @@ struct pm800_regulators {
.owner = THIS_MODULE, \ .owner = THIS_MODULE, \
.n_voltages = ARRAY_SIZE(ldo_volt_table), \ .n_voltages = ARRAY_SIZE(ldo_volt_table), \
.vsel_reg = PM800_##vreg##_VOUT, \ .vsel_reg = PM800_##vreg##_VOUT, \
.vsel_mask = 0x1f, \ .vsel_mask = 0xf, \
.enable_reg = PM800_##ereg, \ .enable_reg = PM800_##ereg, \
.enable_mask = 1 << (ebit), \ .enable_mask = 1 << (ebit), \
.volt_table = ldo_volt_table, \ .volt_table = ldo_volt_table, \
......
...@@ -109,6 +109,7 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev, ...@@ -109,6 +109,7 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
static struct regulator *create_regulator(struct regulator_dev *rdev, static struct regulator *create_regulator(struct regulator_dev *rdev,
struct device *dev, struct device *dev,
const char *supply_name); const char *supply_name);
static void _regulator_put(struct regulator *regulator);
static const char *rdev_get_name(struct regulator_dev *rdev) static const char *rdev_get_name(struct regulator_dev *rdev)
{ {
...@@ -1105,6 +1106,9 @@ static int set_supply(struct regulator_dev *rdev, ...@@ -1105,6 +1106,9 @@ static int set_supply(struct regulator_dev *rdev,
rdev_info(rdev, "supplied by %s\n", rdev_get_name(supply_rdev)); rdev_info(rdev, "supplied by %s\n", rdev_get_name(supply_rdev));
if (!try_module_get(supply_rdev->owner))
return -ENODEV;
rdev->supply = create_regulator(supply_rdev, &rdev->dev, "SUPPLY"); rdev->supply = create_regulator(supply_rdev, &rdev->dev, "SUPPLY");
if (rdev->supply == NULL) { if (rdev->supply == NULL) {
err = -ENOMEM; err = -ENOMEM;
...@@ -1402,8 +1406,11 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) ...@@ -1402,8 +1406,11 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
/* Cascade always-on state to supply */ /* Cascade always-on state to supply */
if (_regulator_is_enabled(rdev)) { if (_regulator_is_enabled(rdev)) {
ret = regulator_enable(rdev->supply); ret = regulator_enable(rdev->supply);
if (ret < 0) if (ret < 0) {
if (rdev->supply)
_regulator_put(rdev->supply);
return ret; return ret;
}
} }
return 0; return 0;
......
...@@ -450,7 +450,7 @@ static struct max8973_regulator_platform_data *max8973_parse_dt( ...@@ -450,7 +450,7 @@ static struct max8973_regulator_platform_data *max8973_parse_dt(
pdata->control_flags |= MAX8973_CONTROL_FREQ_SHIFT_9PER_ENABLE; pdata->control_flags |= MAX8973_CONTROL_FREQ_SHIFT_9PER_ENABLE;
if (of_property_read_bool(np, "maxim,enable-bias-control")) if (of_property_read_bool(np, "maxim,enable-bias-control"))
pdata->control_flags |= MAX8973_BIAS_ENABLE; pdata->control_flags |= MAX8973_CONTROL_BIAS_ENABLE;
return pdata; return pdata;
} }
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s2mps14.h>
#include <linux/mfd/samsung/s2mpu02.h> #include <linux/mfd/samsung/s2mpu02.h>
/* The highest number of possible regulators for supported devices. */
#define S2MPS_REGULATOR_MAX S2MPS13_REGULATOR_MAX
struct s2mps11_info { struct s2mps11_info {
unsigned int rdev_num; unsigned int rdev_num;
int ramp_delay2; int ramp_delay2;
...@@ -49,7 +51,7 @@ struct s2mps11_info { ...@@ -49,7 +51,7 @@ struct s2mps11_info {
* One bit for each S2MPS13/S2MPS14/S2MPU02 regulator whether * One bit for each S2MPS13/S2MPS14/S2MPU02 regulator whether
* the suspend mode was enabled. * the suspend mode was enabled.
*/ */
unsigned long long s2mps14_suspend_state:50; DECLARE_BITMAP(suspend_state, S2MPS_REGULATOR_MAX);
/* Array of size rdev_num with GPIO-s for external sleep control */ /* Array of size rdev_num with GPIO-s for external sleep control */
int *ext_control_gpio; int *ext_control_gpio;
...@@ -500,7 +502,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev) ...@@ -500,7 +502,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
switch (s2mps11->dev_type) { switch (s2mps11->dev_type) {
case S2MPS13X: case S2MPS13X:
case S2MPS14X: case S2MPS14X:
if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev))) if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
val = S2MPS14_ENABLE_SUSPEND; val = S2MPS14_ENABLE_SUSPEND;
else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)])) else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
val = S2MPS14_ENABLE_EXT_CONTROL; val = S2MPS14_ENABLE_EXT_CONTROL;
...@@ -508,7 +510,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev) ...@@ -508,7 +510,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
val = rdev->desc->enable_mask; val = rdev->desc->enable_mask;
break; break;
case S2MPU02: case S2MPU02:
if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev))) if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
val = S2MPU02_ENABLE_SUSPEND; val = S2MPU02_ENABLE_SUSPEND;
else else
val = rdev->desc->enable_mask; val = rdev->desc->enable_mask;
...@@ -562,7 +564,7 @@ static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev) ...@@ -562,7 +564,7 @@ static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev)
if (ret < 0) if (ret < 0)
return ret; return ret;
s2mps11->s2mps14_suspend_state |= (1 << rdev_get_id(rdev)); set_bit(rdev_get_id(rdev), s2mps11->suspend_state);
/* /*
* Don't enable suspend mode if regulator is already disabled because * Don't enable suspend mode if regulator is already disabled because
* this would effectively for a short time turn on the regulator after * this would effectively for a short time turn on the regulator after
...@@ -960,18 +962,22 @@ static int s2mps11_pmic_probe(struct platform_device *pdev) ...@@ -960,18 +962,22 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
case S2MPS11X: case S2MPS11X:
s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators); s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators);
regulators = s2mps11_regulators; regulators = s2mps11_regulators;
BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
break; break;
case S2MPS13X: case S2MPS13X:
s2mps11->rdev_num = ARRAY_SIZE(s2mps13_regulators); s2mps11->rdev_num = ARRAY_SIZE(s2mps13_regulators);
regulators = s2mps13_regulators; regulators = s2mps13_regulators;
BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
break; break;
case S2MPS14X: case S2MPS14X:
s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators); s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators);
regulators = s2mps14_regulators; regulators = s2mps14_regulators;
BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
break; break;
case S2MPU02: case S2MPU02:
s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators); s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators);
regulators = s2mpu02_regulators; regulators = s2mpu02_regulators;
BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
break; break;
default: default:
dev_err(&pdev->dev, "Invalid device type: %u\n", dev_err(&pdev->dev, "Invalid device type: %u\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment