Commit 5f1aa350 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/topic/mt6397', 'regulator/topic/of',...

Merge remote-tracking branches 'regulator/topic/mt6397', 'regulator/topic/of', 'regulator/topic/pfuze100', 'regulator/topic/pwm' and 'regulator/topic/qcom-smd' into regulator-next
...@@ -38,13 +38,18 @@ NB: To be clear, if voltage-table is provided, then the device will be used ...@@ -38,13 +38,18 @@ NB: To be clear, if voltage-table is provided, then the device will be used
in Voltage Table Mode. If no voltage-table is provided, then the device will in Voltage Table Mode. If no voltage-table is provided, then the device will
be used in Continuous Voltage Mode. be used in Continuous Voltage Mode.
Optional properties:
--------------------
- enable-gpios: GPIO to use to enable/disable the regulator
Any property defined as part of the core regulator binding can also be used. Any property defined as part of the core regulator binding can also be used.
(See: ../regulator/regulator.txt) (See: ../regulator/regulator.txt)
Continuous Voltage Example: Continuous Voltage With Enable GPIO Example:
pwm_regulator { pwm_regulator {
compatible = "pwm-regulator; compatible = "pwm-regulator;
pwms = <&pwm1 0 8448 0>; pwms = <&pwm1 0 8448 0>;
enable-gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>;
regulator-min-microvolt = <1016000>; regulator-min-microvolt = <1016000>;
regulator-max-microvolt = <1114000>; regulator-max-microvolt = <1114000>;
regulator-name = "vdd_logic"; regulator-name = "vdd_logic";
......
...@@ -552,12 +552,12 @@ config REGULATOR_PCF50633 ...@@ -552,12 +552,12 @@ config REGULATOR_PCF50633
on PCF50633 on PCF50633
config REGULATOR_PFUZE100 config REGULATOR_PFUZE100
tristate "Freescale PFUZE100/PFUZE200 regulator driver" tristate "Freescale PFUZE100/200/3000 regulator driver"
depends on I2C depends on I2C
select REGMAP_I2C select REGMAP_I2C
help help
Say y here to support the regulators found on the Freescale Say y here to support the regulators found on the Freescale
PFUZE100/PFUZE200 PMIC. PFUZE100/200/3000 PMIC.
config REGULATOR_PV88060 config REGULATOR_PV88060
tristate "Powerventure Semiconductor PV88060 regulator" tristate "Powerventure Semiconductor PV88060 regulator"
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
#include <linux/regulator/mt6397-regulator.h> #include <linux/regulator/mt6397-regulator.h>
#include <linux/regulator/of_regulator.h> #include <linux/regulator/of_regulator.h>
#define MT6397_BUCK_MODE_AUTO 0
#define MT6397_BUCK_MODE_FORCE_PWM 1
/* /*
* MT6397 regulators' information * MT6397 regulators' information
* *
...@@ -38,10 +41,14 @@ struct mt6397_regulator_info { ...@@ -38,10 +41,14 @@ struct mt6397_regulator_info {
u32 vselon_reg; u32 vselon_reg;
u32 vselctrl_reg; u32 vselctrl_reg;
u32 vselctrl_mask; u32 vselctrl_mask;
u32 modeset_reg;
u32 modeset_mask;
u32 modeset_shift;
}; };
#define MT6397_BUCK(match, vreg, min, max, step, volt_ranges, enreg, \ #define MT6397_BUCK(match, vreg, min, max, step, volt_ranges, enreg, \
vosel, vosel_mask, voselon, vosel_ctrl) \ vosel, vosel_mask, voselon, vosel_ctrl, _modeset_reg, \
_modeset_shift) \
[MT6397_ID_##vreg] = { \ [MT6397_ID_##vreg] = { \
.desc = { \ .desc = { \
.name = #vreg, \ .name = #vreg, \
...@@ -62,6 +69,9 @@ struct mt6397_regulator_info { ...@@ -62,6 +69,9 @@ struct mt6397_regulator_info {
.vselon_reg = voselon, \ .vselon_reg = voselon, \
.vselctrl_reg = vosel_ctrl, \ .vselctrl_reg = vosel_ctrl, \
.vselctrl_mask = BIT(1), \ .vselctrl_mask = BIT(1), \
.modeset_reg = _modeset_reg, \
.modeset_mask = BIT(_modeset_shift), \
.modeset_shift = _modeset_shift \
} }
#define MT6397_LDO(match, vreg, ldo_volt_table, enreg, enbit, vosel, \ #define MT6397_LDO(match, vreg, ldo_volt_table, enreg, enbit, vosel, \
...@@ -145,6 +155,63 @@ static const u32 ldo_volt_table7[] = { ...@@ -145,6 +155,63 @@ static const u32 ldo_volt_table7[] = {
1300000, 1500000, 1800000, 2000000, 2500000, 2800000, 3000000, 3300000, 1300000, 1500000, 1800000, 2000000, 2500000, 2800000, 3000000, 3300000,
}; };
static int mt6397_regulator_set_mode(struct regulator_dev *rdev,
unsigned int mode)
{
struct mt6397_regulator_info *info = rdev_get_drvdata(rdev);
int ret, val;
switch (mode) {
case REGULATOR_MODE_FAST:
val = MT6397_BUCK_MODE_FORCE_PWM;
break;
case REGULATOR_MODE_NORMAL:
val = MT6397_BUCK_MODE_AUTO;
break;
default:
ret = -EINVAL;
goto err_mode;
}
dev_dbg(&rdev->dev, "mt6397 buck set_mode %#x, %#x, %#x, %#x\n",
info->modeset_reg, info->modeset_mask,
info->modeset_shift, val);
val <<= info->modeset_shift;
ret = regmap_update_bits(rdev->regmap, info->modeset_reg,
info->modeset_mask, val);
err_mode:
if (ret != 0) {
dev_err(&rdev->dev,
"Failed to set mt6397 buck mode: %d\n", ret);
return ret;
}
return 0;
}
static unsigned int mt6397_regulator_get_mode(struct regulator_dev *rdev)
{
struct mt6397_regulator_info *info = rdev_get_drvdata(rdev);
int ret, regval;
ret = regmap_read(rdev->regmap, info->modeset_reg, &regval);
if (ret != 0) {
dev_err(&rdev->dev,
"Failed to get mt6397 buck mode: %d\n", ret);
return ret;
}
switch ((regval & info->modeset_mask) >> info->modeset_shift) {
case MT6397_BUCK_MODE_AUTO:
return REGULATOR_MODE_NORMAL;
case MT6397_BUCK_MODE_FORCE_PWM:
return REGULATOR_MODE_FAST;
default:
return -EINVAL;
}
}
static int mt6397_get_status(struct regulator_dev *rdev) static int mt6397_get_status(struct regulator_dev *rdev)
{ {
int ret; int ret;
...@@ -160,7 +227,7 @@ static int mt6397_get_status(struct regulator_dev *rdev) ...@@ -160,7 +227,7 @@ static int mt6397_get_status(struct regulator_dev *rdev)
return (regval & info->qi) ? REGULATOR_STATUS_ON : REGULATOR_STATUS_OFF; return (regval & info->qi) ? REGULATOR_STATUS_ON : REGULATOR_STATUS_OFF;
} }
static struct regulator_ops mt6397_volt_range_ops = { static const struct regulator_ops mt6397_volt_range_ops = {
.list_voltage = regulator_list_voltage_linear_range, .list_voltage = regulator_list_voltage_linear_range,
.map_voltage = regulator_map_voltage_linear_range, .map_voltage = regulator_map_voltage_linear_range,
.set_voltage_sel = regulator_set_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap,
...@@ -170,9 +237,11 @@ static struct regulator_ops mt6397_volt_range_ops = { ...@@ -170,9 +237,11 @@ static struct regulator_ops mt6397_volt_range_ops = {
.disable = regulator_disable_regmap, .disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap, .is_enabled = regulator_is_enabled_regmap,
.get_status = mt6397_get_status, .get_status = mt6397_get_status,
.set_mode = mt6397_regulator_set_mode,
.get_mode = mt6397_regulator_get_mode,
}; };
static struct regulator_ops mt6397_volt_table_ops = { static const struct regulator_ops mt6397_volt_table_ops = {
.list_voltage = regulator_list_voltage_table, .list_voltage = regulator_list_voltage_table,
.map_voltage = regulator_map_voltage_iterate, .map_voltage = regulator_map_voltage_iterate,
.set_voltage_sel = regulator_set_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap,
...@@ -184,7 +253,7 @@ static struct regulator_ops mt6397_volt_table_ops = { ...@@ -184,7 +253,7 @@ static struct regulator_ops mt6397_volt_table_ops = {
.get_status = mt6397_get_status, .get_status = mt6397_get_status,
}; };
static struct regulator_ops mt6397_volt_fixed_ops = { static const struct regulator_ops mt6397_volt_fixed_ops = {
.list_voltage = regulator_list_voltage_linear, .list_voltage = regulator_list_voltage_linear,
.enable = regulator_enable_regmap, .enable = regulator_enable_regmap,
.disable = regulator_disable_regmap, .disable = regulator_disable_regmap,
...@@ -196,28 +265,30 @@ static struct regulator_ops mt6397_volt_fixed_ops = { ...@@ -196,28 +265,30 @@ static struct regulator_ops mt6397_volt_fixed_ops = {
static struct mt6397_regulator_info mt6397_regulators[] = { static struct mt6397_regulator_info mt6397_regulators[] = {
MT6397_BUCK("buck_vpca15", VPCA15, 700000, 1493750, 6250, MT6397_BUCK("buck_vpca15", VPCA15, 700000, 1493750, 6250,
buck_volt_range1, MT6397_VCA15_CON7, MT6397_VCA15_CON9, 0x7f, buck_volt_range1, MT6397_VCA15_CON7, MT6397_VCA15_CON9, 0x7f,
MT6397_VCA15_CON10, MT6397_VCA15_CON5), MT6397_VCA15_CON10, MT6397_VCA15_CON5, MT6397_VCA15_CON2, 11),
MT6397_BUCK("buck_vpca7", VPCA7, 700000, 1493750, 6250, MT6397_BUCK("buck_vpca7", VPCA7, 700000, 1493750, 6250,
buck_volt_range1, MT6397_VPCA7_CON7, MT6397_VPCA7_CON9, 0x7f, buck_volt_range1, MT6397_VPCA7_CON7, MT6397_VPCA7_CON9, 0x7f,
MT6397_VPCA7_CON10, MT6397_VPCA7_CON5), MT6397_VPCA7_CON10, MT6397_VPCA7_CON5, MT6397_VPCA7_CON2, 8),
MT6397_BUCK("buck_vsramca15", VSRAMCA15, 700000, 1493750, 6250, MT6397_BUCK("buck_vsramca15", VSRAMCA15, 700000, 1493750, 6250,
buck_volt_range1, MT6397_VSRMCA15_CON7, MT6397_VSRMCA15_CON9, buck_volt_range1, MT6397_VSRMCA15_CON7, MT6397_VSRMCA15_CON9,
0x7f, MT6397_VSRMCA15_CON10, MT6397_VSRMCA15_CON5), 0x7f, MT6397_VSRMCA15_CON10, MT6397_VSRMCA15_CON5,
MT6397_VSRMCA15_CON2, 8),
MT6397_BUCK("buck_vsramca7", VSRAMCA7, 700000, 1493750, 6250, MT6397_BUCK("buck_vsramca7", VSRAMCA7, 700000, 1493750, 6250,
buck_volt_range1, MT6397_VSRMCA7_CON7, MT6397_VSRMCA7_CON9, buck_volt_range1, MT6397_VSRMCA7_CON7, MT6397_VSRMCA7_CON9,
0x7f, MT6397_VSRMCA7_CON10, MT6397_VSRMCA7_CON5), 0x7f, MT6397_VSRMCA7_CON10, MT6397_VSRMCA7_CON5,
MT6397_VSRMCA7_CON2, 8),
MT6397_BUCK("buck_vcore", VCORE, 700000, 1493750, 6250, MT6397_BUCK("buck_vcore", VCORE, 700000, 1493750, 6250,
buck_volt_range1, MT6397_VCORE_CON7, MT6397_VCORE_CON9, 0x7f, buck_volt_range1, MT6397_VCORE_CON7, MT6397_VCORE_CON9, 0x7f,
MT6397_VCORE_CON10, MT6397_VCORE_CON5), MT6397_VCORE_CON10, MT6397_VCORE_CON5, MT6397_VCORE_CON2, 8),
MT6397_BUCK("buck_vgpu", VGPU, 700000, 1493750, 6250, buck_volt_range1, MT6397_BUCK("buck_vgpu", VGPU, 700000, 1493750, 6250, buck_volt_range1,
MT6397_VGPU_CON7, MT6397_VGPU_CON9, 0x7f, MT6397_VGPU_CON7, MT6397_VGPU_CON9, 0x7f,
MT6397_VGPU_CON10, MT6397_VGPU_CON5), MT6397_VGPU_CON10, MT6397_VGPU_CON5, MT6397_VGPU_CON2, 8),
MT6397_BUCK("buck_vdrm", VDRM, 800000, 1593750, 6250, buck_volt_range2, MT6397_BUCK("buck_vdrm", VDRM, 800000, 1593750, 6250, buck_volt_range2,
MT6397_VDRM_CON7, MT6397_VDRM_CON9, 0x7f, MT6397_VDRM_CON7, MT6397_VDRM_CON9, 0x7f,
MT6397_VDRM_CON10, MT6397_VDRM_CON5), MT6397_VDRM_CON10, MT6397_VDRM_CON5, MT6397_VDRM_CON2, 8),
MT6397_BUCK("buck_vio18", VIO18, 1500000, 2120000, 20000, MT6397_BUCK("buck_vio18", VIO18, 1500000, 2120000, 20000,
buck_volt_range3, MT6397_VIO18_CON7, MT6397_VIO18_CON9, 0x1f, buck_volt_range3, MT6397_VIO18_CON7, MT6397_VIO18_CON9, 0x1f,
MT6397_VIO18_CON10, MT6397_VIO18_CON5), MT6397_VIO18_CON10, MT6397_VIO18_CON5, MT6397_VIO18_CON2, 8),
MT6397_REG_FIXED("ldo_vtcxo", VTCXO, MT6397_ANALDO_CON0, 10, 2800000), MT6397_REG_FIXED("ldo_vtcxo", VTCXO, MT6397_ANALDO_CON0, 10, 2800000),
MT6397_REG_FIXED("ldo_va28", VA28, MT6397_ANALDO_CON1, 14, 2800000), MT6397_REG_FIXED("ldo_va28", VA28, MT6397_ANALDO_CON1, 14, 2800000),
MT6397_LDO("ldo_vcama", VCAMA, ldo_volt_table1, MT6397_LDO("ldo_vcama", VCAMA, ldo_volt_table1,
......
...@@ -163,6 +163,9 @@ static void of_get_regulation_constraints(struct device_node *np, ...@@ -163,6 +163,9 @@ static void of_get_regulation_constraints(struct device_node *np,
"regulator-suspend-microvolt", &pval)) "regulator-suspend-microvolt", &pval))
suspend_state->uV = pval; suspend_state->uV = pval;
if (i == PM_SUSPEND_MEM)
constraints->initial_state = PM_SUSPEND_MEM;
of_node_put(suspend_np); of_node_put(suspend_np);
suspend_state = NULL; suspend_state = NULL;
suspend_np = NULL; suspend_np = NULL;
......
...@@ -70,6 +70,7 @@ struct pfuze_chip { ...@@ -70,6 +70,7 @@ struct pfuze_chip {
struct device *dev; struct device *dev;
struct pfuze_regulator regulator_descs[PFUZE100_MAX_REGULATOR]; struct pfuze_regulator regulator_descs[PFUZE100_MAX_REGULATOR];
struct regulator_dev *regulators[PFUZE100_MAX_REGULATOR]; struct regulator_dev *regulators[PFUZE100_MAX_REGULATOR];
struct pfuze_regulator *pfuze_regulators;
}; };
static const int pfuze100_swbst[] = { static const int pfuze100_swbst[] = {
...@@ -334,8 +335,6 @@ static struct pfuze_regulator pfuze3000_regulators[] = { ...@@ -334,8 +335,6 @@ static struct pfuze_regulator pfuze3000_regulators[] = {
PFUZE100_VGEN_REG(PFUZE3000, VLDO4, PFUZE100_VGEN6VOL, 1800000, 3300000, 100000), PFUZE100_VGEN_REG(PFUZE3000, VLDO4, PFUZE100_VGEN6VOL, 1800000, 3300000, 100000),
}; };
static struct pfuze_regulator *pfuze_regulators;
#ifdef CONFIG_OF #ifdef CONFIG_OF
/* PFUZE100 */ /* PFUZE100 */
static struct of_regulator_match pfuze100_matches[] = { static struct of_regulator_match pfuze100_matches[] = {
...@@ -563,21 +562,21 @@ static int pfuze100_regulator_probe(struct i2c_client *client, ...@@ -563,21 +562,21 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
/* use the right regulators after identify the right device */ /* use the right regulators after identify the right device */
switch (pfuze_chip->chip_id) { switch (pfuze_chip->chip_id) {
case PFUZE3000: case PFUZE3000:
pfuze_regulators = pfuze3000_regulators; pfuze_chip->pfuze_regulators = pfuze3000_regulators;
regulator_num = ARRAY_SIZE(pfuze3000_regulators); regulator_num = ARRAY_SIZE(pfuze3000_regulators);
sw_check_start = PFUZE3000_SW2; sw_check_start = PFUZE3000_SW2;
sw_check_end = PFUZE3000_SW2; sw_check_end = PFUZE3000_SW2;
sw_hi = 1 << 3; sw_hi = 1 << 3;
break; break;
case PFUZE200: case PFUZE200:
pfuze_regulators = pfuze200_regulators; pfuze_chip->pfuze_regulators = pfuze200_regulators;
regulator_num = ARRAY_SIZE(pfuze200_regulators); regulator_num = ARRAY_SIZE(pfuze200_regulators);
sw_check_start = PFUZE200_SW2; sw_check_start = PFUZE200_SW2;
sw_check_end = PFUZE200_SW3B; sw_check_end = PFUZE200_SW3B;
break; break;
case PFUZE100: case PFUZE100:
default: default:
pfuze_regulators = pfuze100_regulators; pfuze_chip->pfuze_regulators = pfuze100_regulators;
regulator_num = ARRAY_SIZE(pfuze100_regulators); regulator_num = ARRAY_SIZE(pfuze100_regulators);
sw_check_start = PFUZE100_SW2; sw_check_start = PFUZE100_SW2;
sw_check_end = PFUZE100_SW4; sw_check_end = PFUZE100_SW4;
...@@ -587,7 +586,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client, ...@@ -587,7 +586,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
(pfuze_chip->chip_id == PFUZE100) ? "100" : (pfuze_chip->chip_id == PFUZE100) ? "100" :
((pfuze_chip->chip_id == PFUZE200) ? "200" : "3000")); ((pfuze_chip->chip_id == PFUZE200) ? "200" : "3000"));
memcpy(pfuze_chip->regulator_descs, pfuze_regulators, memcpy(pfuze_chip->regulator_descs, pfuze_chip->pfuze_regulators,
sizeof(pfuze_chip->regulator_descs)); sizeof(pfuze_chip->regulator_descs));
ret = pfuze_parse_regulators_dt(pfuze_chip); ret = pfuze_parse_regulators_dt(pfuze_chip);
...@@ -631,7 +630,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client, ...@@ -631,7 +630,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
devm_regulator_register(&client->dev, desc, &config); devm_regulator_register(&client->dev, desc, &config);
if (IS_ERR(pfuze_chip->regulators[i])) { if (IS_ERR(pfuze_chip->regulators[i])) {
dev_err(&client->dev, "register regulator%s failed\n", dev_err(&client->dev, "register regulator%s failed\n",
pfuze_regulators[i].desc.name); pfuze_chip->pfuze_regulators[i].desc.name);
return PTR_ERR(pfuze_chip->regulators[i]); return PTR_ERR(pfuze_chip->regulators[i]);
} }
} }
...@@ -650,5 +649,5 @@ static struct i2c_driver pfuze_driver = { ...@@ -650,5 +649,5 @@ static struct i2c_driver pfuze_driver = {
module_i2c_driver(pfuze_driver); module_i2c_driver(pfuze_driver);
MODULE_AUTHOR("Robin Gong <b38343@freescale.com>"); MODULE_AUTHOR("Robin Gong <b38343@freescale.com>");
MODULE_DESCRIPTION("Regulator Driver for Freescale PFUZE100/PFUZE200 PMIC"); MODULE_DESCRIPTION("Regulator Driver for Freescale PFUZE100/200/3000 PMIC");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/pwm.h> #include <linux/pwm.h>
#include <linux/gpio/consumer.h>
struct pwm_regulator_data { struct pwm_regulator_data {
/* Shared */ /* Shared */
...@@ -38,6 +39,9 @@ struct pwm_regulator_data { ...@@ -38,6 +39,9 @@ struct pwm_regulator_data {
/* Continuous voltage */ /* Continuous voltage */
int volt_uV; int volt_uV;
/* Enable GPIO */
struct gpio_desc *enb_gpio;
}; };
struct pwm_voltages { struct pwm_voltages {
...@@ -94,6 +98,9 @@ static int pwm_regulator_enable(struct regulator_dev *dev) ...@@ -94,6 +98,9 @@ static int pwm_regulator_enable(struct regulator_dev *dev)
{ {
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev); struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
if (drvdata->enb_gpio)
gpiod_set_value_cansleep(drvdata->enb_gpio, 1);
return pwm_enable(drvdata->pwm); return pwm_enable(drvdata->pwm);
} }
...@@ -103,6 +110,9 @@ static int pwm_regulator_disable(struct regulator_dev *dev) ...@@ -103,6 +110,9 @@ static int pwm_regulator_disable(struct regulator_dev *dev)
pwm_disable(drvdata->pwm); pwm_disable(drvdata->pwm);
if (drvdata->enb_gpio)
gpiod_set_value_cansleep(drvdata->enb_gpio, 0);
return 0; return 0;
} }
...@@ -110,6 +120,9 @@ static int pwm_regulator_is_enabled(struct regulator_dev *dev) ...@@ -110,6 +120,9 @@ static int pwm_regulator_is_enabled(struct regulator_dev *dev)
{ {
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev); struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
if (drvdata->enb_gpio && !gpiod_get_value_cansleep(drvdata->enb_gpio))
return false;
return pwm_is_enabled(drvdata->pwm); return pwm_is_enabled(drvdata->pwm);
} }
...@@ -132,6 +145,7 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev, ...@@ -132,6 +145,7 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev,
unsigned int duty_pulse; unsigned int duty_pulse;
u64 req_period; u64 req_period;
u32 rem; u32 rem;
int old_uV = pwm_regulator_get_voltage(rdev);
int ret; int ret;
pwm_get_args(drvdata->pwm, &pargs); pwm_get_args(drvdata->pwm, &pargs);
...@@ -159,15 +173,14 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev, ...@@ -159,15 +173,14 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev,
return ret; return ret;
} }
ret = pwm_enable(drvdata->pwm);
if (ret) {
dev_err(&rdev->dev, "Failed to enable PWM: %d\n", ret);
return ret;
}
drvdata->volt_uV = min_uV; drvdata->volt_uV = min_uV;
/* Delay required by PWM regulator to settle to the new voltage */ if ((ramp_delay == 0) || !pwm_regulator_is_enabled(rdev))
usleep_range(ramp_delay, ramp_delay + 1000); return 0;
/* Ramp delay is in uV/uS. Adjust to uS and delay */
ramp_delay = DIV_ROUND_UP(abs(min_uV - old_uV), ramp_delay);
usleep_range(ramp_delay, ramp_delay + DIV_ROUND_UP(ramp_delay, 10));
return 0; return 0;
} }
...@@ -253,6 +266,7 @@ static int pwm_regulator_probe(struct platform_device *pdev) ...@@ -253,6 +266,7 @@ static int pwm_regulator_probe(struct platform_device *pdev)
struct regulator_dev *regulator; struct regulator_dev *regulator;
struct regulator_config config = { }; struct regulator_config config = { };
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
enum gpiod_flags gpio_flags;
int ret; int ret;
if (!np) { if (!np) {
...@@ -290,6 +304,18 @@ static int pwm_regulator_probe(struct platform_device *pdev) ...@@ -290,6 +304,18 @@ static int pwm_regulator_probe(struct platform_device *pdev)
return ret; return ret;
} }
if (init_data->constraints.boot_on || init_data->constraints.always_on)
gpio_flags = GPIOD_OUT_HIGH;
else
gpio_flags = GPIOD_OUT_LOW;
drvdata->enb_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",
gpio_flags);
if (IS_ERR(drvdata->enb_gpio)) {
ret = PTR_ERR(drvdata->enb_gpio);
dev_err(&pdev->dev, "Failed to get enable GPIO: %d\n", ret);
return ret;
}
/* /*
* FIXME: pwm_apply_args() should be removed when switching to the * FIXME: pwm_apply_args() should be removed when switching to the
* atomic PWM API. * atomic PWM API.
......
...@@ -152,7 +152,6 @@ static const struct regulator_ops rpm_smps_ldo_ops_fixed = { ...@@ -152,7 +152,6 @@ static const struct regulator_ops rpm_smps_ldo_ops_fixed = {
.enable = rpm_reg_enable, .enable = rpm_reg_enable,
.disable = rpm_reg_disable, .disable = rpm_reg_disable,
.is_enabled = rpm_reg_is_enabled, .is_enabled = rpm_reg_is_enabled,
.list_voltage = regulator_list_voltage_linear_range,
.get_voltage = rpm_reg_get_voltage, .get_voltage = rpm_reg_get_voltage,
.set_voltage = rpm_reg_set_voltage, .set_voltage = rpm_reg_set_voltage,
...@@ -212,7 +211,7 @@ static const struct regulator_desc pma8084_switch = { ...@@ -212,7 +211,7 @@ static const struct regulator_desc pma8084_switch = {
static const struct regulator_desc pm8x41_hfsmps = { static const struct regulator_desc pm8x41_hfsmps = {
.linear_ranges = (struct regulator_linear_range[]) { .linear_ranges = (struct regulator_linear_range[]) {
REGULATOR_LINEAR_RANGE( 375000, 0, 95, 12500), REGULATOR_LINEAR_RANGE( 375000, 0, 95, 12500),
REGULATOR_LINEAR_RANGE(1550000, 96, 158, 25000), REGULATOR_LINEAR_RANGE(1575000, 96, 158, 25000),
}, },
.n_linear_ranges = 2, .n_linear_ranges = 2,
.n_voltages = 159, .n_voltages = 159,
......
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