Merge branch 'regulator-5.3' into regulator-next
This commit is contained in:
@@ -34,7 +34,7 @@ struct s2mps11_info {
|
||||
enum sec_device_type dev_type;
|
||||
|
||||
/*
|
||||
* One bit for each S2MPS13/S2MPS14/S2MPU02 regulator whether
|
||||
* One bit for each S2MPS11/S2MPS13/S2MPS14/S2MPU02 regulator whether
|
||||
* the suspend mode was enabled.
|
||||
*/
|
||||
DECLARE_BITMAP(suspend_state, S2MPS_REGULATOR_MAX);
|
||||
@@ -70,10 +70,11 @@ static int s2mps11_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
|
||||
unsigned int new_selector)
|
||||
{
|
||||
struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
|
||||
int rdev_id = rdev_get_id(rdev);
|
||||
unsigned int ramp_delay = 0;
|
||||
int old_volt, new_volt;
|
||||
|
||||
switch (rdev_get_id(rdev)) {
|
||||
switch (rdev_id) {
|
||||
case S2MPS11_BUCK2:
|
||||
ramp_delay = s2mps11->ramp_delay2;
|
||||
break;
|
||||
@@ -111,9 +112,10 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
|
||||
struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
|
||||
unsigned int ramp_val, ramp_shift, ramp_reg = S2MPS11_REG_RAMP_BUCK;
|
||||
unsigned int ramp_enable = 1, enable_shift = 0;
|
||||
int rdev_id = rdev_get_id(rdev);
|
||||
int ret;
|
||||
|
||||
switch (rdev_get_id(rdev)) {
|
||||
switch (rdev_id) {
|
||||
case S2MPS11_BUCK1:
|
||||
if (ramp_delay > s2mps11->ramp_delay16)
|
||||
s2mps11->ramp_delay16 = ramp_delay;
|
||||
@@ -203,9 +205,8 @@ static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
|
||||
goto ramp_disable;
|
||||
|
||||
/* Ramp delay can be enabled/disabled only for buck[2346] */
|
||||
if ((rdev_get_id(rdev) >= S2MPS11_BUCK2 &&
|
||||
rdev_get_id(rdev) <= S2MPS11_BUCK4) ||
|
||||
rdev_get_id(rdev) == S2MPS11_BUCK6) {
|
||||
if ((rdev_id >= S2MPS11_BUCK2 && rdev_id <= S2MPS11_BUCK4) ||
|
||||
rdev_id == S2MPS11_BUCK6) {
|
||||
ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
|
||||
1 << enable_shift, 1 << enable_shift);
|
||||
if (ret) {
|
||||
@@ -224,27 +225,133 @@ ramp_disable:
|
||||
1 << enable_shift, 0);
|
||||
}
|
||||
|
||||
static int s2mps11_regulator_enable(struct regulator_dev *rdev)
|
||||
{
|
||||
struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
|
||||
int rdev_id = rdev_get_id(rdev);
|
||||
unsigned int val;
|
||||
|
||||
switch (s2mps11->dev_type) {
|
||||
case S2MPS11X:
|
||||
if (test_bit(rdev_id, s2mps11->suspend_state))
|
||||
val = S2MPS14_ENABLE_SUSPEND;
|
||||
else
|
||||
val = rdev->desc->enable_mask;
|
||||
break;
|
||||
case S2MPS13X:
|
||||
case S2MPS14X:
|
||||
if (test_bit(rdev_id, s2mps11->suspend_state))
|
||||
val = S2MPS14_ENABLE_SUSPEND;
|
||||
else if (s2mps11->ext_control_gpiod[rdev_id])
|
||||
val = S2MPS14_ENABLE_EXT_CONTROL;
|
||||
else
|
||||
val = rdev->desc->enable_mask;
|
||||
break;
|
||||
case S2MPU02:
|
||||
if (test_bit(rdev_id, s2mps11->suspend_state))
|
||||
val = S2MPU02_ENABLE_SUSPEND;
|
||||
else
|
||||
val = rdev->desc->enable_mask;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
|
||||
rdev->desc->enable_mask, val);
|
||||
}
|
||||
|
||||
static int s2mps11_regulator_set_suspend_disable(struct regulator_dev *rdev)
|
||||
{
|
||||
int ret;
|
||||
unsigned int val, state;
|
||||
struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
|
||||
int rdev_id = rdev_get_id(rdev);
|
||||
|
||||
/* Below LDO should be always on or does not support suspend mode. */
|
||||
switch (s2mps11->dev_type) {
|
||||
case S2MPS11X:
|
||||
switch (rdev_id) {
|
||||
case S2MPS11_LDO2:
|
||||
case S2MPS11_LDO36:
|
||||
case S2MPS11_LDO37:
|
||||
case S2MPS11_LDO38:
|
||||
return 0;
|
||||
default:
|
||||
state = S2MPS14_ENABLE_SUSPEND;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case S2MPS13X:
|
||||
case S2MPS14X:
|
||||
switch (rdev_id) {
|
||||
case S2MPS14_LDO3:
|
||||
return 0;
|
||||
default:
|
||||
state = S2MPS14_ENABLE_SUSPEND;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case S2MPU02:
|
||||
switch (rdev_id) {
|
||||
case S2MPU02_LDO13:
|
||||
case S2MPU02_LDO14:
|
||||
case S2MPU02_LDO15:
|
||||
case S2MPU02_LDO17:
|
||||
case S2MPU02_BUCK7:
|
||||
state = S2MPU02_DISABLE_SUSPEND;
|
||||
break;
|
||||
default:
|
||||
state = S2MPU02_ENABLE_SUSPEND;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
set_bit(rdev_id, s2mps11->suspend_state);
|
||||
/*
|
||||
* Don't enable suspend mode if regulator is already disabled because
|
||||
* this would effectively for a short time turn on the regulator after
|
||||
* resuming.
|
||||
* However we still want to toggle the suspend_state bit for regulator
|
||||
* in case if it got enabled before suspending the system.
|
||||
*/
|
||||
if (!(val & rdev->desc->enable_mask))
|
||||
return 0;
|
||||
|
||||
return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
|
||||
rdev->desc->enable_mask, state);
|
||||
}
|
||||
|
||||
static const struct regulator_ops s2mps11_ldo_ops = {
|
||||
.list_voltage = regulator_list_voltage_linear,
|
||||
.map_voltage = regulator_map_voltage_linear,
|
||||
.is_enabled = regulator_is_enabled_regmap,
|
||||
.enable = regulator_enable_regmap,
|
||||
.enable = s2mps11_regulator_enable,
|
||||
.disable = regulator_disable_regmap,
|
||||
.get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
.set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
.set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
.set_suspend_disable = s2mps11_regulator_set_suspend_disable,
|
||||
};
|
||||
|
||||
static const struct regulator_ops s2mps11_buck_ops = {
|
||||
.list_voltage = regulator_list_voltage_linear,
|
||||
.map_voltage = regulator_map_voltage_linear,
|
||||
.is_enabled = regulator_is_enabled_regmap,
|
||||
.enable = regulator_enable_regmap,
|
||||
.enable = s2mps11_regulator_enable,
|
||||
.disable = regulator_disable_regmap,
|
||||
.get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
.set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
.set_voltage_time_sel = s2mps11_regulator_set_voltage_time_sel,
|
||||
.set_ramp_delay = s2mps11_set_ramp_delay,
|
||||
.set_suspend_disable = s2mps11_regulator_set_suspend_disable,
|
||||
};
|
||||
|
||||
#define regulator_desc_s2mps11_ldo(num, step) { \
|
||||
@@ -507,101 +614,16 @@ static const struct regulator_desc s2mps13_regulators[] = {
|
||||
regulator_desc_s2mps13_buck8_10(10, MIN_500_MV, STEP_6_25_MV, 0x10),
|
||||
};
|
||||
|
||||
static int s2mps14_regulator_enable(struct regulator_dev *rdev)
|
||||
{
|
||||
struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
|
||||
unsigned int val;
|
||||
|
||||
switch (s2mps11->dev_type) {
|
||||
case S2MPS13X:
|
||||
case S2MPS14X:
|
||||
if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
|
||||
val = S2MPS14_ENABLE_SUSPEND;
|
||||
else if (s2mps11->ext_control_gpiod[rdev_get_id(rdev)])
|
||||
val = S2MPS14_ENABLE_EXT_CONTROL;
|
||||
else
|
||||
val = rdev->desc->enable_mask;
|
||||
break;
|
||||
case S2MPU02:
|
||||
if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
|
||||
val = S2MPU02_ENABLE_SUSPEND;
|
||||
else
|
||||
val = rdev->desc->enable_mask;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
|
||||
rdev->desc->enable_mask, val);
|
||||
}
|
||||
|
||||
static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev)
|
||||
{
|
||||
int ret;
|
||||
unsigned int val, state;
|
||||
struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
|
||||
int rdev_id = rdev_get_id(rdev);
|
||||
|
||||
/* Below LDO should be always on or does not support suspend mode. */
|
||||
switch (s2mps11->dev_type) {
|
||||
case S2MPS13X:
|
||||
case S2MPS14X:
|
||||
switch (rdev_id) {
|
||||
case S2MPS14_LDO3:
|
||||
return 0;
|
||||
default:
|
||||
state = S2MPS14_ENABLE_SUSPEND;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case S2MPU02:
|
||||
switch (rdev_id) {
|
||||
case S2MPU02_LDO13:
|
||||
case S2MPU02_LDO14:
|
||||
case S2MPU02_LDO15:
|
||||
case S2MPU02_LDO17:
|
||||
case S2MPU02_BUCK7:
|
||||
state = S2MPU02_DISABLE_SUSPEND;
|
||||
break;
|
||||
default:
|
||||
state = S2MPU02_ENABLE_SUSPEND;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
set_bit(rdev_get_id(rdev), s2mps11->suspend_state);
|
||||
/*
|
||||
* Don't enable suspend mode if regulator is already disabled because
|
||||
* this would effectively for a short time turn on the regulator after
|
||||
* resuming.
|
||||
* However we still want to toggle the suspend_state bit for regulator
|
||||
* in case if it got enabled before suspending the system.
|
||||
*/
|
||||
if (!(val & rdev->desc->enable_mask))
|
||||
return 0;
|
||||
|
||||
return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
|
||||
rdev->desc->enable_mask, state);
|
||||
}
|
||||
|
||||
static const struct regulator_ops s2mps14_reg_ops = {
|
||||
.list_voltage = regulator_list_voltage_linear,
|
||||
.map_voltage = regulator_map_voltage_linear,
|
||||
.is_enabled = regulator_is_enabled_regmap,
|
||||
.enable = s2mps14_regulator_enable,
|
||||
.enable = s2mps11_regulator_enable,
|
||||
.disable = regulator_disable_regmap,
|
||||
.get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
.set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
.set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
.set_suspend_disable = s2mps14_regulator_set_suspend_disable,
|
||||
.set_suspend_disable = s2mps11_regulator_set_suspend_disable,
|
||||
};
|
||||
|
||||
#define regulator_desc_s2mps14_ldo(num, min, step) { \
|
||||
@@ -828,7 +850,9 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
|
||||
0,
|
||||
GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
|
||||
"s2mps11-regulator");
|
||||
if (IS_ERR(gpio[reg])) {
|
||||
if (PTR_ERR(gpio[reg]) == -ENOENT)
|
||||
gpio[reg] = NULL;
|
||||
else if (IS_ERR(gpio[reg])) {
|
||||
dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
|
||||
reg, rdata[reg].name);
|
||||
gpio[reg] = NULL;
|
||||
@@ -864,8 +888,9 @@ static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
|
||||
static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
|
||||
{
|
||||
unsigned int ramp_val, ramp_shift, ramp_reg;
|
||||
int rdev_id = rdev_get_id(rdev);
|
||||
|
||||
switch (rdev_get_id(rdev)) {
|
||||
switch (rdev_id) {
|
||||
case S2MPU02_BUCK1:
|
||||
ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
|
||||
break;
|
||||
@@ -893,24 +918,24 @@ static const struct regulator_ops s2mpu02_ldo_ops = {
|
||||
.list_voltage = regulator_list_voltage_linear,
|
||||
.map_voltage = regulator_map_voltage_linear,
|
||||
.is_enabled = regulator_is_enabled_regmap,
|
||||
.enable = s2mps14_regulator_enable,
|
||||
.enable = s2mps11_regulator_enable,
|
||||
.disable = regulator_disable_regmap,
|
||||
.get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
.set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
.set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
.set_suspend_disable = s2mps14_regulator_set_suspend_disable,
|
||||
.set_suspend_disable = s2mps11_regulator_set_suspend_disable,
|
||||
};
|
||||
|
||||
static const struct regulator_ops s2mpu02_buck_ops = {
|
||||
.list_voltage = regulator_list_voltage_linear,
|
||||
.map_voltage = regulator_map_voltage_linear,
|
||||
.is_enabled = regulator_is_enabled_regmap,
|
||||
.enable = s2mps14_regulator_enable,
|
||||
.enable = s2mps11_regulator_enable,
|
||||
.disable = regulator_disable_regmap,
|
||||
.get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
.set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
.set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
.set_suspend_disable = s2mps14_regulator_set_suspend_disable,
|
||||
.set_suspend_disable = s2mps11_regulator_set_suspend_disable,
|
||||
.set_ramp_delay = s2mpu02_set_ramp_delay,
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user