Commit 58f253d2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'regulator-v4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator

Pull regulator updates from Mark Brown:
 "A quiet release for the regulator API, conference season must've been
  slowing everyone down:

   - a new interface allowing drivers to provide an interface for
     reading a more detailed description of error conditions which
     allows devices using these regulators to build

   - ACPI support for the fixed voltage regulator.

   - cleanups for the TI TWL drivers to reduce code duplication"

* tag 'regulator-v4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: (24 commits)
  regulator: tps65086: Fix 25mV ranges for BUCK regulators 1, 2, and 6
  regulator: Fix regulator_get_error_flags() signature mismatch
  regulator: core: add newline in debug message
  regulator: tps65086: Fix 25mV ranges for BUCK regulators
  regulator: core: Correct type of mode in regulator_mode_constrain
  regulator: max77620: add documentation for MPOK property
  regulator: max77620: add support to configure MPOK
  regulator: twl6030: Remove unused fields from struct twlreg_info
  regulator: twl: Remove unused fields from struct twlreg_info
  regulator: twl: split twl6030 logic into its own file
  regulator: twl: kill unused functions
  regulator: twl: make driver DT only
  regulator: twl-regulator: rework fixed regulator definition
  regulator: max77620: remove unused variable
  regulator: pwm: Add missing quotes to DT example
  regulator: stw481x-vmmc: fix ages old enable error
  regulator: gpio: properly check return value of of_get_named_gpio
  regulator: lp873x: Add support for populating input supply
  regulator: axp20x: Fix axp809 ldo_io registration error on cold boot
  regulators: helpers: Fix handling of bypass_val_on in get_bypass_regmap
  ...
parents 96955c96 d00b7461
...@@ -7,6 +7,9 @@ Required properties: ...@@ -7,6 +7,9 @@ Required properties:
- #gpio-cells: Should be two. The first cell is the pin number and - #gpio-cells: Should be two. The first cell is the pin number and
the second cell is used to specify flags. the second cell is used to specify flags.
See ../gpio/gpio.txt for more information. See ../gpio/gpio.txt for more information.
- xxx-in-supply: Phandle to parent supply node of each regulator
populated under regulators node. xxx can be
buck0, buck1, ldo0 or ldo1.
- regulators: List of child nodes that specify the regulator - regulators: List of child nodes that specify the regulator
initialization data. initialization data.
Example: Example:
...@@ -17,6 +20,11 @@ pmic: lp8733@60 { ...@@ -17,6 +20,11 @@ pmic: lp8733@60 {
gpio-controller; gpio-controller;
#gpio-cells = <2>; #gpio-cells = <2>;
buck0-in-supply = <&vsys_3v3>;
buck1-in-supply = <&vsys_3v3>;
ldo0-in-supply = <&vsys_3v3>;
ldo1-in-supply = <&vsys_3v3>;
regulators { regulators {
lp8733_buck0: buck0 { lp8733_buck0: buck0 {
regulator-name = "lp8733-buck0"; regulator-name = "lp8733-buck0";
......
...@@ -106,6 +106,18 @@ Here supported time periods by device in microseconds are as follows: ...@@ -106,6 +106,18 @@ Here supported time periods by device in microseconds are as follows:
MAX77620 supports 40, 80, 160, 320, 640, 1280, 2560 and 5120 microseconds. MAX77620 supports 40, 80, 160, 320, 640, 1280, 2560 and 5120 microseconds.
MAX20024 supports 20, 40, 80, 160, 320, 640, 1280 and 2540 microseconds. MAX20024 supports 20, 40, 80, 160, 320, 640, 1280 and 2540 microseconds.
-maxim,power-ok-control: configure map power ok bit
1: Enables POK(Power OK) to control nRST_IO and GPIO1
POK function.
0: Disables POK control.
if property missing, do not configure MPOK bit.
If POK mapping is enabled for GPIO1/nRST_IO then,
GPIO1/nRST_IO pins are HIGH only if all rails
that have POK control enabled are HIGH.
If any of the rails goes down(which are enabled for POK
control) then, GPIO1/nRST_IO goes LOW.
this property is valid for max20024 only.
For DT binding details of different sub modules like GPIO, pincontrol, For DT binding details of different sub modules like GPIO, pincontrol,
regulator, power, please refer respective device-tree binding document regulator, power, please refer respective device-tree binding document
under their respective sub-system directories. under their respective sub-system directories.
......
...@@ -23,7 +23,7 @@ Required properties: ...@@ -23,7 +23,7 @@ Required properties:
defined below. defined below.
Optional regulator properties: Optional regulator properties:
- ti,regulator-step-size-25mv : This is applicable for buck[1,2,6], set this - ti,regulator-step-size-25mv : This is applicable for buck[1-6], set this
if the regulator is factory set with a 25mv if the regulator is factory set with a 25mv
step voltage mapping. step voltage mapping.
- ti,regulator-decay : This is applicable for buck[1-6], set this if - ti,regulator-decay : This is applicable for buck[1-6], set this if
......
...@@ -59,7 +59,7 @@ Any property defined as part of the core regulator binding can also be used. ...@@ -59,7 +59,7 @@ Any property defined as part of the core regulator binding can also be used.
Continuous Voltage With Enable GPIO 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>; enable-gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>;
regulator-min-microvolt = <1016000>; regulator-min-microvolt = <1016000>;
...@@ -76,7 +76,7 @@ Continuous Voltage With Enable GPIO Example: ...@@ -76,7 +76,7 @@ Continuous Voltage With Enable GPIO Example:
Voltage Table Example: Voltage Table Example:
pwm_regulator { pwm_regulator {
compatible = "pwm-regulator; compatible = "pwm-regulator";
pwms = <&pwm1 0 8448 0>; pwms = <&pwm1 0 8448 0>;
regulator-min-microvolt = <1016000>; regulator-min-microvolt = <1016000>;
regulator-max-microvolt = <1114000>; regulator-max-microvolt = <1114000>;
......
...@@ -8761,6 +8761,7 @@ F: drivers/regulator/tps65217-regulator.c ...@@ -8761,6 +8761,7 @@ F: drivers/regulator/tps65217-regulator.c
F: drivers/regulator/tps65218-regulator.c F: drivers/regulator/tps65218-regulator.c
F: drivers/regulator/tps65910-regulator.c F: drivers/regulator/tps65910-regulator.c
F: drivers/regulator/twl-regulator.c F: drivers/regulator/twl-regulator.c
F: drivers/regulator/twl6030-regulator.c
F: include/linux/i2c-omap.h F: include/linux/i2c-omap.h
OMAP DEVICE TREE SUPPORT OMAP DEVICE TREE SUPPORT
......
...@@ -104,7 +104,7 @@ obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o ...@@ -104,7 +104,7 @@ obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
obj-$(CONFIG_REGULATOR_TPS80031) += tps80031-regulator.o obj-$(CONFIG_REGULATOR_TPS80031) += tps80031-regulator.o
obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o twl6030-regulator.o
obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress-regulator.o obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress-regulator.o
obj-$(CONFIG_REGULATOR_WM831X) += wm831x-dcdc.o obj-$(CONFIG_REGULATOR_WM831X) += wm831x-dcdc.o
obj-$(CONFIG_REGULATOR_WM831X) += wm831x-isink.o obj-$(CONFIG_REGULATOR_WM831X) += wm831x-isink.o
......
...@@ -130,6 +130,7 @@ static const struct regulator_desc arizona_ldo1_hc = { ...@@ -130,6 +130,7 @@ static const struct regulator_desc arizona_ldo1_hc = {
.uV_step = 50000, .uV_step = 50000,
.n_voltages = 8, .n_voltages = 8,
.enable_time = 1500, .enable_time = 1500,
.ramp_delay = 24000,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
...@@ -153,6 +154,7 @@ static const struct regulator_desc arizona_ldo1 = { ...@@ -153,6 +154,7 @@ static const struct regulator_desc arizona_ldo1 = {
.uV_step = 25000, .uV_step = 25000,
.n_voltages = 13, .n_voltages = 13,
.enable_time = 500, .enable_time = 500,
.ramp_delay = 24000,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
......
...@@ -337,10 +337,18 @@ static const struct regulator_desc axp809_regulators[] = { ...@@ -337,10 +337,18 @@ static const struct regulator_desc axp809_regulators[] = {
AXP22X_ELDO2_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(1)), AXP22X_ELDO2_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(1)),
AXP_DESC(AXP809, ELDO3, "eldo3", "eldoin", 700, 3300, 100, AXP_DESC(AXP809, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
AXP22X_ELDO3_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(2)), AXP22X_ELDO3_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(2)),
AXP_DESC_IO(AXP809, LDO_IO0, "ldo_io0", "ips", 700, 3300, 100, /*
* Note the datasheet only guarantees reliable operation up to
* 3.3V, this needs to be enforced via dts provided constraints
*/
AXP_DESC_IO(AXP809, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
AXP22X_LDO_IO0_V_OUT, 0x1f, AXP20X_GPIO0_CTRL, 0x07, AXP22X_LDO_IO0_V_OUT, 0x1f, AXP20X_GPIO0_CTRL, 0x07,
AXP22X_IO_ENABLED, AXP22X_IO_DISABLED), AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
AXP_DESC_IO(AXP809, LDO_IO1, "ldo_io1", "ips", 700, 3300, 100, /*
* Note the datasheet only guarantees reliable operation up to
* 3.3V, this needs to be enforced via dts provided constraints
*/
AXP_DESC_IO(AXP809, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
AXP22X_LDO_IO1_V_OUT, 0x1f, AXP20X_GPIO1_CTRL, 0x07, AXP22X_LDO_IO1_V_OUT, 0x1f, AXP20X_GPIO1_CTRL, 0x07,
AXP22X_IO_ENABLED, AXP22X_IO_DISABLED), AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
AXP_DESC_FIXED(AXP809, RTC_LDO, "rtc_ldo", "ips", 1800), AXP_DESC_FIXED(AXP809, RTC_LDO, "rtc_ldo", "ips", 1800),
......
...@@ -204,7 +204,7 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp ...@@ -204,7 +204,7 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp
regnode = of_parse_phandle(dev->of_node, prop_name, 0); regnode = of_parse_phandle(dev->of_node, prop_name, 0);
if (!regnode) { if (!regnode) {
dev_dbg(dev, "Looking up %s property in node %s failed", dev_dbg(dev, "Looking up %s property in node %s failed\n",
prop_name, dev->of_node->full_name); prop_name, dev->of_node->full_name);
return NULL; return NULL;
} }
...@@ -293,7 +293,8 @@ static int regulator_check_current_limit(struct regulator_dev *rdev, ...@@ -293,7 +293,8 @@ static int regulator_check_current_limit(struct regulator_dev *rdev,
} }
/* operating mode constraint check */ /* operating mode constraint check */
static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode) static int regulator_mode_constrain(struct regulator_dev *rdev,
unsigned int *mode)
{ {
switch (*mode) { switch (*mode) {
case REGULATOR_MODE_FAST: case REGULATOR_MODE_FAST:
...@@ -3359,6 +3360,39 @@ unsigned int regulator_get_mode(struct regulator *regulator) ...@@ -3359,6 +3360,39 @@ unsigned int regulator_get_mode(struct regulator *regulator)
} }
EXPORT_SYMBOL_GPL(regulator_get_mode); EXPORT_SYMBOL_GPL(regulator_get_mode);
static int _regulator_get_error_flags(struct regulator_dev *rdev,
unsigned int *flags)
{
int ret;
mutex_lock(&rdev->mutex);
/* sanity check */
if (!rdev->desc->ops->get_error_flags) {
ret = -EINVAL;
goto out;
}
ret = rdev->desc->ops->get_error_flags(rdev, flags);
out:
mutex_unlock(&rdev->mutex);
return ret;
}
/**
* regulator_get_error_flags - get regulator error information
* @regulator: regulator source
* @flags: pointer to store error flags
*
* Get the current regulator error information.
*/
int regulator_get_error_flags(struct regulator *regulator,
unsigned int *flags)
{
return _regulator_get_error_flags(regulator->rdev, flags);
}
EXPORT_SYMBOL_GPL(regulator_get_error_flags);
/** /**
* regulator_set_load - set regulator load * regulator_set_load - set regulator load
* @regulator: regulator source * @regulator: regulator source
......
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/regulator/of_regulator.h> #include <linux/regulator/of_regulator.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/acpi.h>
#include <linux/property.h>
#include <linux/gpio/consumer.h>
struct fixed_voltage_data { struct fixed_voltage_data {
struct regulator_desc desc; struct regulator_desc desc;
...@@ -94,6 +97,44 @@ of_get_fixed_voltage_config(struct device *dev, ...@@ -94,6 +97,44 @@ of_get_fixed_voltage_config(struct device *dev,
return config; return config;
} }
/**
* acpi_get_fixed_voltage_config - extract fixed_voltage_config structure info
* @dev: device requesting for fixed_voltage_config
* @desc: regulator description
*
* Populates fixed_voltage_config structure by extracting data through ACPI
* interface, returns a pointer to the populated structure of NULL if memory
* alloc fails.
*/
static struct fixed_voltage_config *
acpi_get_fixed_voltage_config(struct device *dev,
const struct regulator_desc *desc)
{
struct fixed_voltage_config *config;
const char *supply_name;
struct gpio_desc *gpiod;
int ret;
config = devm_kzalloc(dev, sizeof(*config), GFP_KERNEL);
if (!config)
return ERR_PTR(-ENOMEM);
ret = device_property_read_string(dev, "supply-name", &supply_name);
if (!ret)
config->supply_name = supply_name;
gpiod = gpiod_get(dev, "gpio", GPIOD_ASIS);
if (IS_ERR(gpiod))
return ERR_PTR(-ENODEV);
config->gpio = desc_to_gpio(gpiod);
config->enable_high = device_property_read_bool(dev,
"enable-active-high");
gpiod_put(gpiod);
return config;
}
static struct regulator_ops fixed_voltage_ops = { static struct regulator_ops fixed_voltage_ops = {
}; };
...@@ -114,6 +155,11 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -114,6 +155,11 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
&drvdata->desc); &drvdata->desc);
if (IS_ERR(config)) if (IS_ERR(config))
return PTR_ERR(config); return PTR_ERR(config);
} else if (ACPI_HANDLE(&pdev->dev)) {
config = acpi_get_fixed_voltage_config(&pdev->dev,
&drvdata->desc);
if (IS_ERR(config))
return PTR_ERR(config);
} else { } else {
config = dev_get_platdata(&pdev->dev); config = dev_get_platdata(&pdev->dev);
} }
......
...@@ -162,8 +162,8 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np, ...@@ -162,8 +162,8 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
of_property_read_u32(np, "startup-delay-us", &config->startup_delay); of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0); config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0);
if (config->enable_gpio == -EPROBE_DEFER) if (config->enable_gpio < 0 && config->enable_gpio != -ENOENT)
return ERR_PTR(-EPROBE_DEFER); return ERR_PTR(config->enable_gpio);
/* Fetch GPIOs. - optional property*/ /* Fetch GPIOs. - optional property*/
ret = of_gpio_count(np); ret = of_gpio_count(np);
...@@ -190,8 +190,11 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np, ...@@ -190,8 +190,11 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
for (i = 0; i < config->nr_gpios; i++) { for (i = 0; i < config->nr_gpios; i++) {
gpio = of_get_named_gpio(np, "gpios", i); gpio = of_get_named_gpio(np, "gpios", i);
if (gpio < 0) if (gpio < 0) {
if (gpio != -ENOENT)
return ERR_PTR(gpio);
break; break;
}
config->gpios[i].gpio = gpio; config->gpios[i].gpio = gpio;
if (proplen > 0) { if (proplen > 0) {
of_property_read_u32_index(np, "gpios-states", of_property_read_u32_index(np, "gpios-states",
......
...@@ -454,13 +454,17 @@ EXPORT_SYMBOL_GPL(regulator_set_bypass_regmap); ...@@ -454,13 +454,17 @@ EXPORT_SYMBOL_GPL(regulator_set_bypass_regmap);
int regulator_get_bypass_regmap(struct regulator_dev *rdev, bool *enable) int regulator_get_bypass_regmap(struct regulator_dev *rdev, bool *enable)
{ {
unsigned int val; unsigned int val;
unsigned int val_on = rdev->desc->bypass_val_on;
int ret; int ret;
ret = regmap_read(rdev->regmap, rdev->desc->bypass_reg, &val); ret = regmap_read(rdev->regmap, rdev->desc->bypass_reg, &val);
if (ret != 0) if (ret != 0)
return ret; return ret;
*enable = (val & rdev->desc->bypass_mask) == rdev->desc->bypass_val_on; if (!val_on)
val_on = rdev->desc->bypass_mask;
*enable = (val & rdev->desc->bypass_mask) == val_on;
return 0; return 0;
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
[_id] = { \ [_id] = { \
.desc = { \ .desc = { \
.name = _name, \ .name = _name, \
.supply_name = _of "-in", \
.id = _id, \ .id = _id, \
.of_match = of_match_ptr(_of), \ .of_match = of_match_ptr(_of), \
.regulators_node = of_match_ptr("regulators"),\ .regulators_node = of_match_ptr("regulators"),\
......
...@@ -73,7 +73,6 @@ struct max77620_regulator_info { ...@@ -73,7 +73,6 @@ struct max77620_regulator_info {
}; };
struct max77620_regulator_pdata { struct max77620_regulator_pdata {
struct regulator_init_data *reg_idata;
int active_fps_src; int active_fps_src;
int active_fps_pd_slot; int active_fps_pd_slot;
int active_fps_pu_slot; int active_fps_pu_slot;
...@@ -81,6 +80,7 @@ struct max77620_regulator_pdata { ...@@ -81,6 +80,7 @@ struct max77620_regulator_pdata {
int suspend_fps_pd_slot; int suspend_fps_pd_slot;
int suspend_fps_pu_slot; int suspend_fps_pu_slot;
int current_mode; int current_mode;
int power_ok;
int ramp_rate_setting; int ramp_rate_setting;
}; };
...@@ -351,11 +351,48 @@ static int max77620_set_slew_rate(struct max77620_regulator *pmic, int id, ...@@ -351,11 +351,48 @@ static int max77620_set_slew_rate(struct max77620_regulator *pmic, int id,
return 0; return 0;
} }
static int max77620_config_power_ok(struct max77620_regulator *pmic, int id)
{
struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
struct max77620_regulator_info *rinfo = pmic->rinfo[id];
struct max77620_chip *chip = dev_get_drvdata(pmic->dev->parent);
u8 val, mask;
int ret;
switch (chip->chip_id) {
case MAX20024:
if (rpdata->power_ok >= 0) {
if (rinfo->type == MAX77620_REGULATOR_TYPE_SD)
mask = MAX20024_SD_CFG1_MPOK_MASK;
else
mask = MAX20024_LDO_CFG2_MPOK_MASK;
val = rpdata->power_ok ? mask : 0;
ret = regmap_update_bits(pmic->rmap, rinfo->cfg_addr,
mask, val);
if (ret < 0) {
dev_err(pmic->dev, "Reg 0x%02x update failed %d\n",
rinfo->cfg_addr, ret);
return ret;
}
}
break;
default:
break;
}
return 0;
}
static int max77620_init_pmic(struct max77620_regulator *pmic, int id) static int max77620_init_pmic(struct max77620_regulator *pmic, int id)
{ {
struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id]; struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
int ret; int ret;
max77620_config_power_ok(pmic, id);
/* Update power mode */ /* Update power mode */
ret = max77620_regulator_get_power_mode(pmic, id); ret = max77620_regulator_get_power_mode(pmic, id);
if (ret < 0) if (ret < 0)
...@@ -595,6 +632,12 @@ static int max77620_of_parse_cb(struct device_node *np, ...@@ -595,6 +632,12 @@ static int max77620_of_parse_cb(struct device_node *np,
np, "maxim,suspend-fps-power-down-slot", &pval); np, "maxim,suspend-fps-power-down-slot", &pval);
rpdata->suspend_fps_pd_slot = (!ret) ? pval : -1; rpdata->suspend_fps_pd_slot = (!ret) ? pval : -1;
ret = of_property_read_u32(np, "maxim,power-ok-control", &pval);
if (!ret)
rpdata->power_ok = pval;
else
rpdata->power_ok = -1;
ret = of_property_read_u32(np, "maxim,ramp-rate-setting", &pval); ret = of_property_read_u32(np, "maxim,ramp-rate-setting", &pval);
rpdata->ramp_rate_setting = (!ret) ? pval : 0; rpdata->ramp_rate_setting = (!ret) ? pval : 0;
...@@ -807,6 +850,8 @@ static int max77620_regulator_resume(struct device *dev) ...@@ -807,6 +850,8 @@ static int max77620_regulator_resume(struct device *dev)
for (id = 0; id < MAX77620_NUM_REGS; id++) { for (id = 0; id < MAX77620_NUM_REGS; id++) {
reg_pdata = &pmic->reg_pdata[id]; reg_pdata = &pmic->reg_pdata[id];
max77620_config_power_ok(pmic, id);
max77620_regulator_set_fps_slots(pmic, id, false); max77620_regulator_set_fps_slots(pmic, id, false);
if (reg_pdata->active_fps_src < 0) if (reg_pdata->active_fps_src < 0)
continue; continue;
......
...@@ -47,7 +47,8 @@ static struct regulator_desc vmmc_regulator = { ...@@ -47,7 +47,8 @@ static struct regulator_desc vmmc_regulator = {
.volt_table = stw481x_vmmc_voltages, .volt_table = stw481x_vmmc_voltages,
.enable_time = 200, /* FIXME: look this up */ .enable_time = 200, /* FIXME: look this up */
.enable_reg = STW_CONF1, .enable_reg = STW_CONF1,
.enable_mask = STW_CONF1_PDN_VMMC, .enable_mask = STW_CONF1_PDN_VMMC | STW_CONF1_MMC_LS_STATUS,
.enable_val = STW_CONF1_PDN_VMMC,
.vsel_reg = STW_CONF1, .vsel_reg = STW_CONF1,
.vsel_mask = STW_CONF1_VMMC_MASK, .vsel_mask = STW_CONF1_VMMC_MASK,
}; };
......
...@@ -375,7 +375,7 @@ static struct tps6507x_board *tps6507x_parse_dt_reg_data( ...@@ -375,7 +375,7 @@ static struct tps6507x_board *tps6507x_parse_dt_reg_data(
struct device_node *np = pdev->dev.parent->of_node; struct device_node *np = pdev->dev.parent->of_node;
struct device_node *regulators; struct device_node *regulators;
struct of_regulator_match *matches; struct of_regulator_match *matches;
static struct regulator_init_data *reg_data; struct regulator_init_data *reg_data;
int idx = 0, count, ret; int idx = 0, count, ret;
tps_board = devm_kzalloc(&pdev->dev, sizeof(*tps_board), tps_board = devm_kzalloc(&pdev->dev, sizeof(*tps_board),
......
...@@ -71,7 +71,7 @@ struct tps65086_regulator { ...@@ -71,7 +71,7 @@ struct tps65086_regulator {
unsigned int decay_mask; unsigned int decay_mask;
}; };
static const struct regulator_linear_range tps65086_buck126_10mv_ranges[] = { static const struct regulator_linear_range tps65086_10mv_ranges[] = {
REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0), REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0),
REGULATOR_LINEAR_RANGE(410000, 0x1, 0x7F, 10000), REGULATOR_LINEAR_RANGE(410000, 0x1, 0x7F, 10000),
}; };
...@@ -82,7 +82,7 @@ static const struct regulator_linear_range tps65086_buck126_25mv_ranges[] = { ...@@ -82,7 +82,7 @@ static const struct regulator_linear_range tps65086_buck126_25mv_ranges[] = {
REGULATOR_LINEAR_RANGE(1025000, 0x19, 0x7F, 25000), REGULATOR_LINEAR_RANGE(1025000, 0x19, 0x7F, 25000),
}; };
static const struct regulator_linear_range tps65086_buck345_ranges[] = { static const struct regulator_linear_range tps65086_buck345_25mv_ranges[] = {
REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0), REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0),
REGULATOR_LINEAR_RANGE(425000, 0x1, 0x7F, 25000), REGULATOR_LINEAR_RANGE(425000, 0x1, 0x7F, 25000),
}; };
...@@ -125,27 +125,27 @@ static int tps65086_of_parse_cb(struct device_node *dev, ...@@ -125,27 +125,27 @@ static int tps65086_of_parse_cb(struct device_node *dev,
static struct tps65086_regulator regulators[] = { static struct tps65086_regulator regulators[] = {
TPS65086_REGULATOR("BUCK1", "buck1", BUCK1, 0x80, TPS65086_BUCK1CTRL, TPS65086_REGULATOR("BUCK1", "buck1", BUCK1, 0x80, TPS65086_BUCK1CTRL,
BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(0), BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(0),
tps65086_buck126_10mv_ranges, TPS65086_BUCK1CTRL, tps65086_10mv_ranges, TPS65086_BUCK1CTRL,
BIT(0)), BIT(0)),
TPS65086_REGULATOR("BUCK2", "buck2", BUCK2, 0x80, TPS65086_BUCK2CTRL, TPS65086_REGULATOR("BUCK2", "buck2", BUCK2, 0x80, TPS65086_BUCK2CTRL,
BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(1), BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(1),
tps65086_buck126_10mv_ranges, TPS65086_BUCK2CTRL, tps65086_10mv_ranges, TPS65086_BUCK2CTRL,
BIT(0)), BIT(0)),
TPS65086_REGULATOR("BUCK3", "buck3", BUCK3, 0x80, TPS65086_BUCK3VID, TPS65086_REGULATOR("BUCK3", "buck3", BUCK3, 0x80, TPS65086_BUCK3VID,
BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(2), BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(2),
tps65086_buck345_ranges, TPS65086_BUCK3DECAY, tps65086_10mv_ranges, TPS65086_BUCK3DECAY,
BIT(0)), BIT(0)),
TPS65086_REGULATOR("BUCK4", "buck4", BUCK4, 0x80, TPS65086_BUCK4VID, TPS65086_REGULATOR("BUCK4", "buck4", BUCK4, 0x80, TPS65086_BUCK4VID,
BUCK_VID_MASK, TPS65086_BUCK4CTRL, BIT(0), BUCK_VID_MASK, TPS65086_BUCK4CTRL, BIT(0),
tps65086_buck345_ranges, TPS65086_BUCK4VID, tps65086_10mv_ranges, TPS65086_BUCK4VID,
BIT(0)), BIT(0)),
TPS65086_REGULATOR("BUCK5", "buck5", BUCK5, 0x80, TPS65086_BUCK5VID, TPS65086_REGULATOR("BUCK5", "buck5", BUCK5, 0x80, TPS65086_BUCK5VID,
BUCK_VID_MASK, TPS65086_BUCK5CTRL, BIT(0), BUCK_VID_MASK, TPS65086_BUCK5CTRL, BIT(0),
tps65086_buck345_ranges, TPS65086_BUCK5CTRL, tps65086_10mv_ranges, TPS65086_BUCK5CTRL,
BIT(0)), BIT(0)),
TPS65086_REGULATOR("BUCK6", "buck6", BUCK6, 0x80, TPS65086_BUCK6VID, TPS65086_REGULATOR("BUCK6", "buck6", BUCK6, 0x80, TPS65086_BUCK6VID,
BUCK_VID_MASK, TPS65086_BUCK6CTRL, BIT(0), BUCK_VID_MASK, TPS65086_BUCK6CTRL, BIT(0),
tps65086_buck126_10mv_ranges, TPS65086_BUCK6CTRL, tps65086_10mv_ranges, TPS65086_BUCK6CTRL,
BIT(0)), BIT(0)),
TPS65086_REGULATOR("LDOA1", "ldoa1", LDOA1, 0xF, TPS65086_LDOA1CTRL, TPS65086_REGULATOR("LDOA1", "ldoa1", LDOA1, 0xF, TPS65086_LDOA1CTRL,
VDOA1_VID_MASK, TPS65086_LDOA1CTRL, BIT(0), VDOA1_VID_MASK, TPS65086_LDOA1CTRL, BIT(0),
...@@ -162,18 +162,6 @@ static struct tps65086_regulator regulators[] = { ...@@ -162,18 +162,6 @@ static struct tps65086_regulator regulators[] = {
TPS65086_SWITCH("VTT", "vtt", VTT, TPS65086_SWVTT_EN, BIT(4)), TPS65086_SWITCH("VTT", "vtt", VTT, TPS65086_SWVTT_EN, BIT(4)),
}; };
static inline bool has_25mv_mode(int id)
{
switch (id) {
case BUCK1:
case BUCK2:
case BUCK6:
return true;
default:
return false;
}
}
static int tps65086_of_parse_cb(struct device_node *dev, static int tps65086_of_parse_cb(struct device_node *dev,
const struct regulator_desc *desc, const struct regulator_desc *desc,
struct regulator_config *config) struct regulator_config *config)
...@@ -181,12 +169,27 @@ static int tps65086_of_parse_cb(struct device_node *dev, ...@@ -181,12 +169,27 @@ static int tps65086_of_parse_cb(struct device_node *dev,
int ret; int ret;
/* Check for 25mV step mode */ /* Check for 25mV step mode */
if (has_25mv_mode(desc->id) && if (of_property_read_bool(config->of_node, "ti,regulator-step-size-25mv")) {
of_property_read_bool(config->of_node, "ti,regulator-step-size-25mv")) { switch (desc->id) {
case BUCK1:
case BUCK2:
case BUCK6:
regulators[desc->id].desc.linear_ranges = regulators[desc->id].desc.linear_ranges =
tps65086_buck126_25mv_ranges; tps65086_buck126_25mv_ranges;
regulators[desc->id].desc.n_linear_ranges = regulators[desc->id].desc.n_linear_ranges =
ARRAY_SIZE(tps65086_buck126_25mv_ranges); ARRAY_SIZE(tps65086_buck126_25mv_ranges);
break;
case BUCK3:
case BUCK4:
case BUCK5:
regulators[desc->id].desc.linear_ranges =
tps65086_buck345_25mv_ranges;
regulators[desc->id].desc.n_linear_ranges =
ARRAY_SIZE(tps65086_buck345_25mv_ranges);
break;
default:
dev_warn(config->dev, "25mV step mode only valid for BUCK regulators\n");
}
} }
/* Check for decay mode */ /* Check for decay mode */
......
This diff is collapsed.
This diff is collapsed.
...@@ -180,6 +180,7 @@ ...@@ -180,6 +180,7 @@
#define MAX77620_SD_CFG1_FPWM_SD_MASK BIT(2) #define MAX77620_SD_CFG1_FPWM_SD_MASK BIT(2)
#define MAX77620_SD_CFG1_FPWM_SD_SKIP 0 #define MAX77620_SD_CFG1_FPWM_SD_SKIP 0
#define MAX77620_SD_CFG1_FPWM_SD_FPWM BIT(2) #define MAX77620_SD_CFG1_FPWM_SD_FPWM BIT(2)
#define MAX20024_SD_CFG1_MPOK_MASK BIT(1)
#define MAX77620_SD_CFG1_FSRADE_SD_MASK BIT(0) #define MAX77620_SD_CFG1_FSRADE_SD_MASK BIT(0)
#define MAX77620_SD_CFG1_FSRADE_SD_DISABLE 0 #define MAX77620_SD_CFG1_FSRADE_SD_DISABLE 0
#define MAX77620_SD_CFG1_FSRADE_SD_ENABLE BIT(0) #define MAX77620_SD_CFG1_FSRADE_SD_ENABLE BIT(0)
...@@ -187,6 +188,7 @@ ...@@ -187,6 +188,7 @@
/* LDO_CNFG2 */ /* LDO_CNFG2 */
#define MAX77620_LDO_POWER_MODE_MASK 0xC0 #define MAX77620_LDO_POWER_MODE_MASK 0xC0
#define MAX77620_LDO_POWER_MODE_SHIFT 6 #define MAX77620_LDO_POWER_MODE_SHIFT 6
#define MAX20024_LDO_CFG2_MPOK_MASK BIT(2)
#define MAX77620_LDO_CFG2_ADE_MASK BIT(1) #define MAX77620_LDO_CFG2_ADE_MASK BIT(1)
#define MAX77620_LDO_CFG2_ADE_DISABLE 0 #define MAX77620_LDO_CFG2_ADE_DISABLE 0
#define MAX77620_LDO_CFG2_ADE_ENABLE BIT(1) #define MAX77620_LDO_CFG2_ADE_ENABLE BIT(1)
......
...@@ -120,6 +120,25 @@ struct regmap; ...@@ -120,6 +120,25 @@ struct regmap;
#define REGULATOR_EVENT_PRE_DISABLE 0x400 #define REGULATOR_EVENT_PRE_DISABLE 0x400
#define REGULATOR_EVENT_ABORT_DISABLE 0x800 #define REGULATOR_EVENT_ABORT_DISABLE 0x800
/*
* Regulator errors that can be queried using regulator_get_error_flags
*
* UNDER_VOLTAGE Regulator output is under voltage.
* OVER_CURRENT Regulator output current is too high.
* REGULATION_OUT Regulator output is out of regulation.
* FAIL Regulator output has failed.
* OVER_TEMP Regulator over temp.
*
* NOTE: These errors can be OR'ed together.
*/
#define REGULATOR_ERROR_UNDER_VOLTAGE BIT(1)
#define REGULATOR_ERROR_OVER_CURRENT BIT(2)
#define REGULATOR_ERROR_REGULATION_OUT BIT(3)
#define REGULATOR_ERROR_FAIL BIT(4)
#define REGULATOR_ERROR_OVER_TEMP BIT(5)
/** /**
* struct pre_voltage_change_data - Data sent with PRE_VOLTAGE_CHANGE event * struct pre_voltage_change_data - Data sent with PRE_VOLTAGE_CHANGE event
* *
...@@ -237,6 +256,8 @@ int regulator_get_current_limit(struct regulator *regulator); ...@@ -237,6 +256,8 @@ int regulator_get_current_limit(struct regulator *regulator);
int regulator_set_mode(struct regulator *regulator, unsigned int mode); int regulator_set_mode(struct regulator *regulator, unsigned int mode);
unsigned int regulator_get_mode(struct regulator *regulator); unsigned int regulator_get_mode(struct regulator *regulator);
int regulator_get_error_flags(struct regulator *regulator,
unsigned int *flags);
int regulator_set_load(struct regulator *regulator, int load_uA); int regulator_set_load(struct regulator *regulator, int load_uA);
int regulator_allow_bypass(struct regulator *regulator, bool allow); int regulator_allow_bypass(struct regulator *regulator, bool allow);
...@@ -477,6 +498,12 @@ static inline unsigned int regulator_get_mode(struct regulator *regulator) ...@@ -477,6 +498,12 @@ static inline unsigned int regulator_get_mode(struct regulator *regulator)
return REGULATOR_MODE_NORMAL; return REGULATOR_MODE_NORMAL;
} }
static inline int regulator_get_error_flags(struct regulator *regulator,
unsigned int *flags)
{
return -EINVAL;
}
static inline int regulator_set_load(struct regulator *regulator, int load_uA) static inline int regulator_set_load(struct regulator *regulator, int load_uA)
{ {
return REGULATOR_MODE_NORMAL; return REGULATOR_MODE_NORMAL;
......
...@@ -100,6 +100,7 @@ struct regulator_linear_range { ...@@ -100,6 +100,7 @@ struct regulator_linear_range {
* *
* @set_mode: Set the configured operating mode for the regulator. * @set_mode: Set the configured operating mode for the regulator.
* @get_mode: Get the configured operating mode for the regulator. * @get_mode: Get the configured operating mode for the regulator.
* @get_error_flags: Get the current error(s) for the regulator.
* @get_status: Return actual (not as-configured) status of regulator, as a * @get_status: Return actual (not as-configured) status of regulator, as a
* REGULATOR_STATUS value (or negative errno) * REGULATOR_STATUS value (or negative errno)
* @get_optimum_mode: Get the most efficient operating mode for the regulator * @get_optimum_mode: Get the most efficient operating mode for the regulator
...@@ -169,6 +170,9 @@ struct regulator_ops { ...@@ -169,6 +170,9 @@ struct regulator_ops {
int (*set_mode) (struct regulator_dev *, unsigned int mode); int (*set_mode) (struct regulator_dev *, unsigned int mode);
unsigned int (*get_mode) (struct regulator_dev *); unsigned int (*get_mode) (struct regulator_dev *);
/* retrieve current error flags on the regulator */
int (*get_error_flags)(struct regulator_dev *, unsigned int *flags);
/* Time taken to enable or set voltage on the regulator */ /* Time taken to enable or set voltage on the regulator */
int (*enable_time) (struct regulator_dev *); int (*enable_time) (struct regulator_dev *);
int (*set_ramp_delay) (struct regulator_dev *, int ramp_delay); int (*set_ramp_delay) (struct regulator_dev *, int ramp_delay);
......
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