Merge remote-tracking branches 'regulator/fix/88pm800', 'regulator/fix/max8973', 'regulator/fix/s2mps11' and 'regulator/fix/supply' into regulator-linus
This commit is contained in:
commit
4c7d83e8a8
4 changed files with 20 additions and 7 deletions
|
@ -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,
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
/* 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(
|
||||||
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 @@
|
||||||
#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 {
|
||||||
* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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",
|
||||||
|
|
Loading…
Add table
Reference in a new issue