Commit 6727479f authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/topic/act8865',...

Merge remote-tracking branches 'regulator/topic/act8865', 'regulator/topic/anatop', 'regulator/topic/arizona', 'regulator/topic/axp20x' and 'regulator/topic/bcm590xx' into regulator-next
...@@ -60,8 +60,8 @@ DCDC2 : DC-DC buck : vin2-supply ...@@ -60,8 +60,8 @@ DCDC2 : DC-DC buck : vin2-supply
DCDC3 : DC-DC buck : vin3-supply DCDC3 : DC-DC buck : vin3-supply
DCDC4 : DC-DC buck : vin4-supply DCDC4 : DC-DC buck : vin4-supply
DCDC5 : DC-DC buck : vin5-supply DCDC5 : DC-DC buck : vin5-supply
DC1SW : On/Off Switch : dcdc1-supply : DCDC1 secondary output DC1SW : On/Off Switch : : DCDC1 secondary output
DC5LDO : LDO : dcdc5-supply : input from DCDC5 DC5LDO : LDO : : input from DCDC5
ALDO1 : LDO : aldoin-supply : shared supply ALDO1 : LDO : aldoin-supply : shared supply
ALDO2 : LDO : aldoin-supply : shared supply ALDO2 : LDO : aldoin-supply : shared supply
ALDO3 : LDO : aldoin-supply : shared supply ALDO3 : LDO : aldoin-supply : shared supply
......
...@@ -8,6 +8,8 @@ Required properties: ...@@ -8,6 +8,8 @@ Required properties:
Optional properties: Optional properties:
- system-power-controller: Telling whether or not this pmic is controlling - system-power-controller: Telling whether or not this pmic is controlling
the system power. See Documentation/devicetree/bindings/power/power-controller.txt . the system power. See Documentation/devicetree/bindings/power/power-controller.txt .
- active-semi,vsel-high: Indicates the VSEL pin is high.
If this property is missing, assume the VSEL pin is low(0).
Optional input supply properties: Optional input supply properties:
- for act8600: - for act8600:
...@@ -49,6 +51,7 @@ Example: ...@@ -49,6 +51,7 @@ Example:
pmic: act8865@5b { pmic: act8865@5b {
compatible = "active-semi,act8865"; compatible = "active-semi,act8865";
reg = <0x5b>; reg = <0x5b>;
active-semi,vsel-high;
status = "disabled"; status = "disabled";
regulators { regulators {
......
...@@ -13,6 +13,7 @@ Optional properties: ...@@ -13,6 +13,7 @@ Optional properties:
- anatop-delay-reg-offset: Anatop MFD step time register offset - anatop-delay-reg-offset: Anatop MFD step time register offset
- anatop-delay-bit-shift: Bit shift for the step time register - anatop-delay-bit-shift: Bit shift for the step time register
- anatop-delay-bit-width: Number of bits used in the step time register - anatop-delay-bit-width: Number of bits used in the step time register
- vin-supply: The supply for this regulator
Any property defined as part of the core regulator Any property defined as part of the core regulator
binding, defined in regulator.txt, can also be used. binding, defined in regulator.txt, can also be used.
......
Cirrus Logic Arizona class audio SoCs
These devices are audio SoCs with extensive digital capabilities and a range
of analogue I/O.
This document lists regulator specific bindings, see the primary binding
document:
../mfd/arizona.txt
Optional properties:
- wlf,ldoena : GPIO specifier for the GPIO controlling LDOENA
Optional subnodes:
- ldo1 : Initial data for the LDO1 regulator, as covered in
Documentation/devicetree/bindings/regulator/regulator.txt
- micvdd : Initial data for the MICVDD regulator, as covered in
Documentation/devicetree/bindings/regulator/regulator.txt
...@@ -261,6 +261,16 @@ static const struct regulator_desc act8865_regulators[] = { ...@@ -261,6 +261,16 @@ static const struct regulator_desc act8865_regulators[] = {
ACT88xx_REG("LDO_REG4", ACT8865, LDO4, VSET, "inl67"), ACT88xx_REG("LDO_REG4", ACT8865, LDO4, VSET, "inl67"),
}; };
static const struct regulator_desc act8865_alt_regulators[] = {
ACT88xx_REG("DCDC_REG1", ACT8865, DCDC1, VSET2, "vp1"),
ACT88xx_REG("DCDC_REG2", ACT8865, DCDC2, VSET2, "vp2"),
ACT88xx_REG("DCDC_REG3", ACT8865, DCDC3, VSET2, "vp3"),
ACT88xx_REG("LDO_REG1", ACT8865, LDO1, VSET, "inl45"),
ACT88xx_REG("LDO_REG2", ACT8865, LDO2, VSET, "inl45"),
ACT88xx_REG("LDO_REG3", ACT8865, LDO3, VSET, "inl67"),
ACT88xx_REG("LDO_REG4", ACT8865, LDO4, VSET, "inl67"),
};
#ifdef CONFIG_OF #ifdef CONFIG_OF
static const struct of_device_id act8865_dt_ids[] = { static const struct of_device_id act8865_dt_ids[] = {
{ .compatible = "active-semi,act8600", .data = (void *)ACT8600 }, { .compatible = "active-semi,act8600", .data = (void *)ACT8600 },
...@@ -413,6 +423,7 @@ static int act8865_pmic_probe(struct i2c_client *client, ...@@ -413,6 +423,7 @@ static int act8865_pmic_probe(struct i2c_client *client,
struct act8865 *act8865; struct act8865 *act8865;
unsigned long type; unsigned long type;
int off_reg, off_mask; int off_reg, off_mask;
int voltage_select = 0;
pdata = dev_get_platdata(dev); pdata = dev_get_platdata(dev);
...@@ -424,6 +435,10 @@ static int act8865_pmic_probe(struct i2c_client *client, ...@@ -424,6 +435,10 @@ static int act8865_pmic_probe(struct i2c_client *client,
return -ENODEV; return -ENODEV;
type = (unsigned long) id->data; type = (unsigned long) id->data;
voltage_select = !!of_get_property(dev->of_node,
"active-semi,vsel-high",
NULL);
} else { } else {
type = i2c_id->driver_data; type = i2c_id->driver_data;
} }
...@@ -442,8 +457,13 @@ static int act8865_pmic_probe(struct i2c_client *client, ...@@ -442,8 +457,13 @@ static int act8865_pmic_probe(struct i2c_client *client,
off_mask = ACT8846_OFF_SYSMASK; off_mask = ACT8846_OFF_SYSMASK;
break; break;
case ACT8865: case ACT8865:
regulators = act8865_regulators; if (voltage_select) {
num_regulators = ARRAY_SIZE(act8865_regulators); regulators = act8865_alt_regulators;
num_regulators = ARRAY_SIZE(act8865_alt_regulators);
} else {
regulators = act8865_regulators;
num_regulators = ARRAY_SIZE(act8865_regulators);
}
off_reg = ACT8865_SYS_CTRL; off_reg = ACT8865_SYS_CTRL;
off_mask = ACT8865_MSTROFF; off_mask = ACT8865_MSTROFF;
break; break;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/regulator/driver.h> #include <linux/regulator/driver.h>
#include <linux/regulator/of_regulator.h> #include <linux/regulator/of_regulator.h>
#include <linux/regulator/machine.h>
#define LDO_RAMP_UP_UNIT_IN_CYCLES 64 /* 64 cycles per step */ #define LDO_RAMP_UP_UNIT_IN_CYCLES 64 /* 64 cycles per step */
#define LDO_RAMP_UP_FREQ_IN_MHZ 24 /* cycle based on 24M OSC */ #define LDO_RAMP_UP_FREQ_IN_MHZ 24 /* cycle based on 24M OSC */
...@@ -199,6 +200,7 @@ static int anatop_regulator_probe(struct platform_device *pdev) ...@@ -199,6 +200,7 @@ static int anatop_regulator_probe(struct platform_device *pdev)
rdesc->owner = THIS_MODULE; rdesc->owner = THIS_MODULE;
initdata = of_get_regulator_init_data(dev, np, rdesc); initdata = of_get_regulator_init_data(dev, np, rdesc);
initdata->supply_regulator = "vin";
sreg->initdata = initdata; sreg->initdata = initdata;
anatop_np = of_get_parent(np); anatop_np = of_get_parent(np);
...@@ -262,6 +264,7 @@ static int anatop_regulator_probe(struct platform_device *pdev) ...@@ -262,6 +264,7 @@ static int anatop_regulator_probe(struct platform_device *pdev)
rdesc->vsel_reg = sreg->control_reg; rdesc->vsel_reg = sreg->control_reg;
rdesc->vsel_mask = ((1 << sreg->vol_bit_width) - 1) << rdesc->vsel_mask = ((1 << sreg->vol_bit_width) - 1) <<
sreg->vol_bit_shift; sreg->vol_bit_shift;
rdesc->min_dropout_uV = 125000;
config.dev = &pdev->dev; config.dev = &pdev->dev;
config.init_data = initdata; config.init_data = initdata;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regulator/driver.h> #include <linux/regulator/driver.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
...@@ -189,13 +190,22 @@ static int arizona_ldo1_of_get_pdata(struct arizona *arizona, ...@@ -189,13 +190,22 @@ static int arizona_ldo1_of_get_pdata(struct arizona *arizona,
{ {
struct arizona_pdata *pdata = &arizona->pdata; struct arizona_pdata *pdata = &arizona->pdata;
struct arizona_ldo1 *ldo1 = config->driver_data; struct arizona_ldo1 *ldo1 = config->driver_data;
struct device_node *np = arizona->dev->of_node;
struct device_node *init_node, *dcvdd_node; struct device_node *init_node, *dcvdd_node;
struct regulator_init_data *init_data; struct regulator_init_data *init_data;
pdata->ldoena = arizona_of_get_named_gpio(arizona, "wlf,ldoena", true); pdata->ldoena = of_get_named_gpio(np, "wlf,ldoena", 0);
if (pdata->ldoena < 0) {
dev_warn(arizona->dev,
"LDOENA GPIO property missing/malformed: %d\n",
pdata->ldoena);
pdata->ldoena = 0;
} else {
config->ena_gpio_initialized = true;
}
init_node = of_get_child_by_name(arizona->dev->of_node, "ldo1"); init_node = of_get_child_by_name(np, "ldo1");
dcvdd_node = of_parse_phandle(arizona->dev->of_node, "DCVDD-supply", 0); dcvdd_node = of_parse_phandle(np, "DCVDD-supply", 0);
if (init_node) { if (init_node) {
config->of_node = init_node; config->of_node = init_node;
...@@ -245,6 +255,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev) ...@@ -245,6 +255,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
switch (arizona->type) { switch (arizona->type) {
case WM5102: case WM5102:
case WM8997: case WM8997:
case WM8998:
case WM1814:
desc = &arizona_ldo1_hc; desc = &arizona_ldo1_hc;
ldo1->init_data = arizona_ldo1_dvfs; ldo1->init_data = arizona_ldo1_dvfs;
break; break;
...@@ -272,8 +284,6 @@ static int arizona_ldo1_probe(struct platform_device *pdev) ...@@ -272,8 +284,6 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
ret = arizona_ldo1_of_get_pdata(arizona, &config, desc); ret = arizona_ldo1_of_get_pdata(arizona, &config, desc);
if (ret < 0) if (ret < 0)
return ret; return ret;
config.ena_gpio_initialized = true;
} }
} }
......
...@@ -196,10 +196,10 @@ static const struct regulator_desc axp22x_regulators[] = { ...@@ -196,10 +196,10 @@ static const struct regulator_desc axp22x_regulators[] = {
AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50, AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
AXP22X_DCDC5_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(5)), AXP22X_DCDC5_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(5)),
/* secondary switchable output of DCDC1 */ /* secondary switchable output of DCDC1 */
AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", "dcdc1", 1600, 3400, 100, AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", NULL, 1600, 3400, 100,
AXP22X_DCDC1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(7)), AXP22X_DCDC1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(7)),
/* LDO regulator internally chained to DCDC5 */ /* LDO regulator internally chained to DCDC5 */
AXP_DESC(AXP22X, DC5LDO, "dc5ldo", "dcdc5", 700, 1400, 100, AXP_DESC(AXP22X, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
AXP22X_DC5LDO_V_OUT, 0x7, AXP22X_PWR_OUT_CTRL1, BIT(0)), AXP22X_DC5LDO_V_OUT, 0x7, AXP22X_PWR_OUT_CTRL1, BIT(0)),
AXP_DESC(AXP22X, ALDO1, "aldo1", "aldoin", 700, 3300, 100, AXP_DESC(AXP22X, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
AXP22X_ALDO1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(6)), AXP22X_ALDO1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(6)),
...@@ -350,6 +350,8 @@ static int axp20x_regulator_probe(struct platform_device *pdev) ...@@ -350,6 +350,8 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
}; };
int ret, i, nregulators; int ret, i, nregulators;
u32 workmode; u32 workmode;
const char *axp22x_dc1_name = axp22x_regulators[AXP22X_DCDC1].name;
const char *axp22x_dc5_name = axp22x_regulators[AXP22X_DCDC5].name;
switch (axp20x->variant) { switch (axp20x->variant) {
case AXP202_ID: case AXP202_ID:
...@@ -371,8 +373,37 @@ static int axp20x_regulator_probe(struct platform_device *pdev) ...@@ -371,8 +373,37 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
axp20x_regulator_parse_dt(pdev); axp20x_regulator_parse_dt(pdev);
for (i = 0; i < nregulators; i++) { for (i = 0; i < nregulators; i++) {
rdev = devm_regulator_register(&pdev->dev, &regulators[i], const struct regulator_desc *desc = &regulators[i];
&config); struct regulator_desc *new_desc;
/*
* Regulators DC1SW and DC5LDO are connected internally,
* so we have to handle their supply names separately.
*
* We always register the regulators in proper sequence,
* so the supply names are correctly read. See the last
* part of this loop to see where we save the DT defined
* name.
*/
if (regulators == axp22x_regulators) {
if (i == AXP22X_DC1SW) {
new_desc = devm_kzalloc(&pdev->dev,
sizeof(*desc),
GFP_KERNEL);
*new_desc = regulators[i];
new_desc->supply_name = axp22x_dc1_name;
desc = new_desc;
} else if (i == AXP22X_DC5LDO) {
new_desc = devm_kzalloc(&pdev->dev,
sizeof(*desc),
GFP_KERNEL);
*new_desc = regulators[i];
new_desc->supply_name = axp22x_dc5_name;
desc = new_desc;
}
}
rdev = devm_regulator_register(&pdev->dev, desc, &config);
if (IS_ERR(rdev)) { if (IS_ERR(rdev)) {
dev_err(&pdev->dev, "Failed to register %s\n", dev_err(&pdev->dev, "Failed to register %s\n",
regulators[i].name); regulators[i].name);
...@@ -388,6 +419,21 @@ static int axp20x_regulator_probe(struct platform_device *pdev) ...@@ -388,6 +419,21 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to set workmode on %s\n", dev_err(&pdev->dev, "Failed to set workmode on %s\n",
rdev->desc->name); rdev->desc->name);
} }
/*
* Save AXP22X DCDC1 / DCDC5 regulator names for later.
*/
if (regulators == axp22x_regulators) {
/* Can we use rdev->constraints->name instead? */
if (i == AXP22X_DCDC1)
of_property_read_string(rdev->dev.of_node,
"regulator-name",
&axp22x_dc1_name);
else if (i == AXP22X_DCDC5)
of_property_read_string(rdev->dev.of_node,
"regulator-name",
&axp22x_dc5_name);
}
} }
return 0; return 0;
......
...@@ -244,7 +244,7 @@ static int bcm590xx_get_enable_register(int id) ...@@ -244,7 +244,7 @@ static int bcm590xx_get_enable_register(int id)
break; break;
case BCM590XX_REG_VBUS: case BCM590XX_REG_VBUS:
reg = BCM590XX_OTG_CTRL; reg = BCM590XX_OTG_CTRL;
}; }
return reg; return reg;
......
...@@ -245,6 +245,7 @@ enum regulator_type { ...@@ -245,6 +245,7 @@ enum regulator_type {
* @linear_min_sel: Minimal selector for starting linear mapping * @linear_min_sel: Minimal selector for starting linear mapping
* @fixed_uV: Fixed voltage of rails. * @fixed_uV: Fixed voltage of rails.
* @ramp_delay: Time to settle down after voltage change (unit: uV/us) * @ramp_delay: Time to settle down after voltage change (unit: uV/us)
* @min_dropout_uV: The minimum dropout voltage this regulator can handle
* @linear_ranges: A constant table of possible voltage ranges. * @linear_ranges: A constant table of possible voltage ranges.
* @n_linear_ranges: Number of entries in the @linear_ranges table. * @n_linear_ranges: Number of entries in the @linear_ranges table.
* @volt_table: Voltage mapping table (if table based mapping) * @volt_table: Voltage mapping table (if table based mapping)
...@@ -292,6 +293,7 @@ struct regulator_desc { ...@@ -292,6 +293,7 @@ struct regulator_desc {
unsigned int linear_min_sel; unsigned int linear_min_sel;
int fixed_uV; int fixed_uV;
unsigned int ramp_delay; unsigned int ramp_delay;
int min_dropout_uV;
const struct regulator_linear_range *linear_ranges; const struct regulator_linear_range *linear_ranges;
int n_linear_ranges; int n_linear_ranges;
......
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