Merge remote-tracking branches 'regulator/topic/act8865', 'regulator/topic/anatop', 'regulator/topic/arizona', 'regulator/topic/axp20x' and 'regulator/topic/bcm590xx' into regulator-next
This commit is contained in:
commit
6727479f07
10 changed files with 116 additions and 14 deletions
|
@ -60,8 +60,8 @@ DCDC2 : DC-DC buck : vin2-supply
|
|||
DCDC3 : DC-DC buck : vin3-supply
|
||||
DCDC4 : DC-DC buck : vin4-supply
|
||||
DCDC5 : DC-DC buck : vin5-supply
|
||||
DC1SW : On/Off Switch : dcdc1-supply : DCDC1 secondary output
|
||||
DC5LDO : LDO : dcdc5-supply : input from DCDC5
|
||||
DC1SW : On/Off Switch : : DCDC1 secondary output
|
||||
DC5LDO : LDO : : input from DCDC5
|
||||
ALDO1 : LDO : aldoin-supply : shared supply
|
||||
ALDO2 : LDO : aldoin-supply : shared supply
|
||||
ALDO3 : LDO : aldoin-supply : shared supply
|
||||
|
|
|
@ -8,6 +8,8 @@ Required properties:
|
|||
Optional properties:
|
||||
- system-power-controller: Telling whether or not this pmic is controlling
|
||||
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:
|
||||
- for act8600:
|
||||
|
@ -49,6 +51,7 @@ Example:
|
|||
pmic: act8865@5b {
|
||||
compatible = "active-semi,act8865";
|
||||
reg = <0x5b>;
|
||||
active-semi,vsel-high;
|
||||
status = "disabled";
|
||||
|
||||
regulators {
|
||||
|
|
|
@ -13,6 +13,7 @@ Optional properties:
|
|||
- anatop-delay-reg-offset: Anatop MFD step time register offset
|
||||
- anatop-delay-bit-shift: Bit shift for 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
|
||||
binding, defined in regulator.txt, can also be used.
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
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[] = {
|
|||
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
|
||||
static const struct of_device_id act8865_dt_ids[] = {
|
||||
{ .compatible = "active-semi,act8600", .data = (void *)ACT8600 },
|
||||
|
@ -413,6 +423,7 @@ static int act8865_pmic_probe(struct i2c_client *client,
|
|||
struct act8865 *act8865;
|
||||
unsigned long type;
|
||||
int off_reg, off_mask;
|
||||
int voltage_select = 0;
|
||||
|
||||
pdata = dev_get_platdata(dev);
|
||||
|
||||
|
@ -424,6 +435,10 @@ static int act8865_pmic_probe(struct i2c_client *client,
|
|||
return -ENODEV;
|
||||
|
||||
type = (unsigned long) id->data;
|
||||
|
||||
voltage_select = !!of_get_property(dev->of_node,
|
||||
"active-semi,vsel-high",
|
||||
NULL);
|
||||
} else {
|
||||
type = i2c_id->driver_data;
|
||||
}
|
||||
|
@ -442,8 +457,13 @@ static int act8865_pmic_probe(struct i2c_client *client,
|
|||
off_mask = ACT8846_OFF_SYSMASK;
|
||||
break;
|
||||
case ACT8865:
|
||||
regulators = act8865_regulators;
|
||||
num_regulators = ARRAY_SIZE(act8865_regulators);
|
||||
if (voltage_select) {
|
||||
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_mask = ACT8865_MSTROFF;
|
||||
break;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/driver.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_FREQ_IN_MHZ 24 /* cycle based on 24M OSC */
|
||||
|
@ -199,6 +200,7 @@ static int anatop_regulator_probe(struct platform_device *pdev)
|
|||
rdesc->owner = THIS_MODULE;
|
||||
|
||||
initdata = of_get_regulator_init_data(dev, np, rdesc);
|
||||
initdata->supply_regulator = "vin";
|
||||
sreg->initdata = initdata;
|
||||
|
||||
anatop_np = of_get_parent(np);
|
||||
|
@ -262,6 +264,7 @@ static int anatop_regulator_probe(struct platform_device *pdev)
|
|||
rdesc->vsel_reg = sreg->control_reg;
|
||||
rdesc->vsel_mask = ((1 << sreg->vol_bit_width) - 1) <<
|
||||
sreg->vol_bit_shift;
|
||||
rdesc->min_dropout_uV = 125000;
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.init_data = initdata;
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
@ -189,13 +190,22 @@ static int arizona_ldo1_of_get_pdata(struct arizona *arizona,
|
|||
{
|
||||
struct arizona_pdata *pdata = &arizona->pdata;
|
||||
struct arizona_ldo1 *ldo1 = config->driver_data;
|
||||
struct device_node *np = arizona->dev->of_node;
|
||||
struct device_node *init_node, *dcvdd_node;
|
||||
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");
|
||||
dcvdd_node = of_parse_phandle(arizona->dev->of_node, "DCVDD-supply", 0);
|
||||
init_node = of_get_child_by_name(np, "ldo1");
|
||||
dcvdd_node = of_parse_phandle(np, "DCVDD-supply", 0);
|
||||
|
||||
if (init_node) {
|
||||
config->of_node = init_node;
|
||||
|
@ -245,6 +255,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
|
|||
switch (arizona->type) {
|
||||
case WM5102:
|
||||
case WM8997:
|
||||
case WM8998:
|
||||
case WM1814:
|
||||
desc = &arizona_ldo1_hc;
|
||||
ldo1->init_data = arizona_ldo1_dvfs;
|
||||
break;
|
||||
|
@ -272,8 +284,6 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
|
|||
ret = arizona_ldo1_of_get_pdata(arizona, &config, desc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
config.ena_gpio_initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -196,10 +196,10 @@ static const struct regulator_desc axp22x_regulators[] = {
|
|||
AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
|
||||
AXP22X_DCDC5_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(5)),
|
||||
/* 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)),
|
||||
/* 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)),
|
||||
AXP_DESC(AXP22X, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
|
||||
AXP22X_ALDO1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(6)),
|
||||
|
@ -350,6 +350,8 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
|
|||
};
|
||||
int ret, i, nregulators;
|
||||
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) {
|
||||
case AXP202_ID:
|
||||
|
@ -371,8 +373,37 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
|
|||
axp20x_regulator_parse_dt(pdev);
|
||||
|
||||
for (i = 0; i < nregulators; i++) {
|
||||
rdev = devm_regulator_register(&pdev->dev, ®ulators[i],
|
||||
&config);
|
||||
const struct regulator_desc *desc = ®ulators[i];
|
||||
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)) {
|
||||
dev_err(&pdev->dev, "Failed to register %s\n",
|
||||
regulators[i].name);
|
||||
|
@ -388,6 +419,21 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
|
|||
dev_err(&pdev->dev, "Failed to set workmode on %s\n",
|
||||
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;
|
||||
|
|
|
@ -244,7 +244,7 @@ static int bcm590xx_get_enable_register(int id)
|
|||
break;
|
||||
case BCM590XX_REG_VBUS:
|
||||
reg = BCM590XX_OTG_CTRL;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
return reg;
|
||||
|
|
|
@ -245,6 +245,7 @@ enum regulator_type {
|
|||
* @linear_min_sel: Minimal selector for starting linear mapping
|
||||
* @fixed_uV: Fixed voltage of rails.
|
||||
* @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.
|
||||
* @n_linear_ranges: Number of entries in the @linear_ranges table.
|
||||
* @volt_table: Voltage mapping table (if table based mapping)
|
||||
|
@ -292,6 +293,7 @@ struct regulator_desc {
|
|||
unsigned int linear_min_sel;
|
||||
int fixed_uV;
|
||||
unsigned int ramp_delay;
|
||||
int min_dropout_uV;
|
||||
|
||||
const struct regulator_linear_range *linear_ranges;
|
||||
int n_linear_ranges;
|
||||
|
|
Loading…
Reference in a new issue