Commit f291c74a authored by Mark Brown's avatar Mark Brown

Merge branch 'topic/suspend' of...

Merge branch 'topic/suspend' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator into regulator-sky81452

Conflicts:
	drivers/regulator/sky81452-regulator.c
parents 8b7daad3 5e5e3a42
...@@ -19,6 +19,24 @@ Optional properties: ...@@ -19,6 +19,24 @@ Optional properties:
design requires. This property describes the total system ramp time design requires. This property describes the total system ramp time
required due to the combination of internal ramping of the regulator itself, required due to the combination of internal ramping of the regulator itself,
and board design issues such as trace capacitance and load on the supply. and board design issues such as trace capacitance and load on the supply.
- regulator-state-mem sub-root node for Suspend-to-RAM mode
: suspend to memory, the device goes to sleep, but all data stored in memory,
only some external interrupt can wake the device.
- regulator-state-disk sub-root node for Suspend-to-DISK mode
: suspend to disk, this state operates similarly to Suspend-to-RAM,
but includes a final step of writing memory contents to disk.
- regulator-state-[mem/disk] node has following common properties:
- regulator-on-in-suspend: regulator should be on in suspend state.
- regulator-off-in-suspend: regulator should be off in suspend state.
- regulator-suspend-microvolt: regulator should be set to this voltage
in suspend.
- regulator-mode: operating mode in the given suspend state.
The set of possible operating modes depends on the capabilities of
every hardware so the valid modes are documented on each regulator
device tree binding document.
- regulator-initial-mode: initial operating mode. The set of possible operating
modes depends on the capabilities of every hardware so each device binding
documentation explains which values the regulator supports.
Deprecated properties: Deprecated properties:
- regulator-compatible: If a regulator chip contains multiple - regulator-compatible: If a regulator chip contains multiple
...@@ -34,6 +52,10 @@ Example: ...@@ -34,6 +52,10 @@ Example:
regulator-max-microvolt = <2500000>; regulator-max-microvolt = <2500000>;
regulator-always-on; regulator-always-on;
vin-supply = <&vin>; vin-supply = <&vin>;
regulator-state-mem {
regulator-on-in-suspend;
};
}; };
Regulator Consumers: Regulator Consumers:
......
...@@ -330,7 +330,8 @@ static int pm8607_regulator_dt_init(struct platform_device *pdev, ...@@ -330,7 +330,8 @@ static int pm8607_regulator_dt_init(struct platform_device *pdev,
for_each_child_of_node(nproot, np) { for_each_child_of_node(nproot, np) {
if (!of_node_cmp(np->name, info->desc.name)) { if (!of_node_cmp(np->name, info->desc.name)) {
config->init_data = config->init_data =
of_get_regulator_init_data(&pdev->dev, np); of_get_regulator_init_data(&pdev->dev, np,
&info->desc);
config->of_node = np; config->of_node = np;
break; break;
} }
......
...@@ -189,17 +189,18 @@ static int anatop_regulator_probe(struct platform_device *pdev) ...@@ -189,17 +189,18 @@ static int anatop_regulator_probe(struct platform_device *pdev)
int ret = 0; int ret = 0;
u32 val; u32 val;
initdata = of_get_regulator_init_data(dev, np);
sreg = devm_kzalloc(dev, sizeof(*sreg), GFP_KERNEL); sreg = devm_kzalloc(dev, sizeof(*sreg), GFP_KERNEL);
if (!sreg) if (!sreg)
return -ENOMEM; return -ENOMEM;
sreg->initdata = initdata;
sreg->name = of_get_property(np, "regulator-name", NULL); sreg->name = of_get_property(np, "regulator-name", NULL);
rdesc = &sreg->rdesc; rdesc = &sreg->rdesc;
rdesc->name = sreg->name; rdesc->name = sreg->name;
rdesc->type = REGULATOR_VOLTAGE; rdesc->type = REGULATOR_VOLTAGE;
rdesc->owner = THIS_MODULE; rdesc->owner = THIS_MODULE;
initdata = of_get_regulator_init_data(dev, np, rdesc);
sreg->initdata = initdata;
anatop_np = of_get_parent(np); anatop_np = of_get_parent(np);
if (!anatop_np) if (!anatop_np)
return -ENODEV; return -ENODEV;
......
...@@ -179,7 +179,8 @@ static const struct regulator_init_data arizona_ldo1_default = { ...@@ -179,7 +179,8 @@ static const struct regulator_init_data arizona_ldo1_default = {
}; };
static int arizona_ldo1_of_get_pdata(struct arizona *arizona, static int arizona_ldo1_of_get_pdata(struct arizona *arizona,
struct regulator_config *config) struct regulator_config *config,
const struct regulator_desc *desc)
{ {
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;
...@@ -194,7 +195,8 @@ static int arizona_ldo1_of_get_pdata(struct arizona *arizona, ...@@ -194,7 +195,8 @@ static int arizona_ldo1_of_get_pdata(struct arizona *arizona,
if (init_node) { if (init_node) {
config->of_node = init_node; config->of_node = init_node;
init_data = of_get_regulator_init_data(arizona->dev, init_node); init_data = of_get_regulator_init_data(arizona->dev, init_node,
desc);
if (init_data) { if (init_data) {
init_data->consumer_supplies = &ldo1->supply; init_data->consumer_supplies = &ldo1->supply;
...@@ -257,7 +259,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev) ...@@ -257,7 +259,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
if (IS_ENABLED(CONFIG_OF)) { if (IS_ENABLED(CONFIG_OF)) {
if (!dev_get_platdata(arizona->dev)) { if (!dev_get_platdata(arizona->dev)) {
ret = arizona_ldo1_of_get_pdata(arizona, &config); ret = arizona_ldo1_of_get_pdata(arizona, &config, desc);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
......
...@@ -198,7 +198,8 @@ static const struct regulator_init_data arizona_micsupp_ext_default = { ...@@ -198,7 +198,8 @@ static const struct regulator_init_data arizona_micsupp_ext_default = {
}; };
static int arizona_micsupp_of_get_pdata(struct arizona *arizona, static int arizona_micsupp_of_get_pdata(struct arizona *arizona,
struct regulator_config *config) struct regulator_config *config,
const struct regulator_desc *desc)
{ {
struct arizona_pdata *pdata = &arizona->pdata; struct arizona_pdata *pdata = &arizona->pdata;
struct arizona_micsupp *micsupp = config->driver_data; struct arizona_micsupp *micsupp = config->driver_data;
...@@ -210,7 +211,7 @@ static int arizona_micsupp_of_get_pdata(struct arizona *arizona, ...@@ -210,7 +211,7 @@ static int arizona_micsupp_of_get_pdata(struct arizona *arizona,
if (np) { if (np) {
config->of_node = np; config->of_node = np;
init_data = of_get_regulator_init_data(arizona->dev, np); init_data = of_get_regulator_init_data(arizona->dev, np, desc);
if (init_data) { if (init_data) {
init_data->consumer_supplies = &micsupp->supply; init_data->consumer_supplies = &micsupp->supply;
...@@ -264,7 +265,8 @@ static int arizona_micsupp_probe(struct platform_device *pdev) ...@@ -264,7 +265,8 @@ static int arizona_micsupp_probe(struct platform_device *pdev)
if (IS_ENABLED(CONFIG_OF)) { if (IS_ENABLED(CONFIG_OF)) {
if (!dev_get_platdata(arizona->dev)) { if (!dev_get_platdata(arizona->dev)) {
ret = arizona_micsupp_of_get_pdata(arizona, &config); ret = arizona_micsupp_of_get_pdata(arizona, &config,
desc);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
......
...@@ -436,7 +436,8 @@ static int da9052_regulator_probe(struct platform_device *pdev) ...@@ -436,7 +436,8 @@ static int da9052_regulator_probe(struct platform_device *pdev)
if (!of_node_cmp(np->name, if (!of_node_cmp(np->name,
regulator->info->reg_desc.name)) { regulator->info->reg_desc.name)) {
config.init_data = of_get_regulator_init_data( config.init_data = of_get_regulator_init_data(
&pdev->dev, np); &pdev->dev, np,
&regulator->info->reg_desc);
config.of_node = np; config.of_node = np;
break; break;
} }
......
...@@ -147,7 +147,7 @@ static int da9210_i2c_probe(struct i2c_client *i2c, ...@@ -147,7 +147,7 @@ static int da9210_i2c_probe(struct i2c_client *i2c,
config.dev = &i2c->dev; config.dev = &i2c->dev;
config.init_data = pdata ? &pdata->da9210_constraints : config.init_data = pdata ? &pdata->da9210_constraints :
of_get_regulator_init_data(dev, dev->of_node); of_get_regulator_init_data(dev, dev->of_node, &da9210_reg);
config.driver_data = chip; config.driver_data = chip;
config.regmap = chip->regmap; config.regmap = chip->regmap;
config.of_node = dev->of_node; config.of_node = dev->of_node;
......
...@@ -302,7 +302,8 @@ static struct regmap_config fan53555_regmap_config = { ...@@ -302,7 +302,8 @@ static struct regmap_config fan53555_regmap_config = {
}; };
static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev, static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev,
struct device_node *np) struct device_node *np,
const struct regulator_desc *desc)
{ {
struct fan53555_platform_data *pdata; struct fan53555_platform_data *pdata;
int ret; int ret;
...@@ -312,7 +313,7 @@ static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev, ...@@ -312,7 +313,7 @@ static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev,
if (!pdata) if (!pdata)
return NULL; return NULL;
pdata->regulator = of_get_regulator_init_data(dev, np); pdata->regulator = of_get_regulator_init_data(dev, np, desc);
ret = of_property_read_u32(np, "fcs,suspend-voltage-selector", ret = of_property_read_u32(np, "fcs,suspend-voltage-selector",
&tmp); &tmp);
...@@ -347,20 +348,20 @@ static int fan53555_regulator_probe(struct i2c_client *client, ...@@ -347,20 +348,20 @@ static int fan53555_regulator_probe(struct i2c_client *client,
unsigned int val; unsigned int val;
int ret; int ret;
di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info),
GFP_KERNEL);
if (!di)
return -ENOMEM;
pdata = dev_get_platdata(&client->dev); pdata = dev_get_platdata(&client->dev);
if (!pdata) if (!pdata)
pdata = fan53555_parse_dt(&client->dev, np); pdata = fan53555_parse_dt(&client->dev, np, &di->desc);
if (!pdata || !pdata->regulator) { if (!pdata || !pdata->regulator) {
dev_err(&client->dev, "Platform data not found!\n"); dev_err(&client->dev, "Platform data not found!\n");
return -ENODEV; return -ENODEV;
} }
di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info),
GFP_KERNEL);
if (!di)
return -ENOMEM;
di->regulator = pdata->regulator; di->regulator = pdata->regulator;
if (client->dev.of_node) { if (client->dev.of_node) {
const struct of_device_id *match; const struct of_device_id *match;
......
...@@ -40,13 +40,15 @@ struct fixed_voltage_data { ...@@ -40,13 +40,15 @@ struct fixed_voltage_data {
/** /**
* of_get_fixed_voltage_config - extract fixed_voltage_config structure info * of_get_fixed_voltage_config - extract fixed_voltage_config structure info
* @dev: device requesting for fixed_voltage_config * @dev: device requesting for fixed_voltage_config
* @desc: regulator description
* *
* Populates fixed_voltage_config structure by extracting data from device * Populates fixed_voltage_config structure by extracting data from device
* tree node, returns a pointer to the populated structure of NULL if memory * tree node, returns a pointer to the populated structure of NULL if memory
* alloc fails. * alloc fails.
*/ */
static struct fixed_voltage_config * static struct fixed_voltage_config *
of_get_fixed_voltage_config(struct device *dev) of_get_fixed_voltage_config(struct device *dev,
const struct regulator_desc *desc)
{ {
struct fixed_voltage_config *config; struct fixed_voltage_config *config;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
...@@ -57,7 +59,7 @@ of_get_fixed_voltage_config(struct device *dev) ...@@ -57,7 +59,7 @@ of_get_fixed_voltage_config(struct device *dev)
if (!config) if (!config)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
config->init_data = of_get_regulator_init_data(dev, dev->of_node); config->init_data = of_get_regulator_init_data(dev, dev->of_node, desc);
if (!config->init_data) if (!config->init_data)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
...@@ -112,8 +114,14 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -112,8 +114,14 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
struct regulator_config cfg = { }; struct regulator_config cfg = { };
int ret; int ret;
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
GFP_KERNEL);
if (!drvdata)
return -ENOMEM;
if (pdev->dev.of_node) { if (pdev->dev.of_node) {
config = of_get_fixed_voltage_config(&pdev->dev); config = of_get_fixed_voltage_config(&pdev->dev,
&drvdata->desc);
if (IS_ERR(config)) if (IS_ERR(config))
return PTR_ERR(config); return PTR_ERR(config);
} else { } else {
...@@ -123,11 +131,6 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -123,11 +131,6 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
if (!config) if (!config)
return -ENOMEM; return -ENOMEM;
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
GFP_KERNEL);
if (!drvdata)
return -ENOMEM;
drvdata->desc.name = devm_kstrdup(&pdev->dev, drvdata->desc.name = devm_kstrdup(&pdev->dev,
config->supply_name, config->supply_name,
GFP_KERNEL); GFP_KERNEL);
......
...@@ -133,7 +133,8 @@ static struct regulator_ops gpio_regulator_voltage_ops = { ...@@ -133,7 +133,8 @@ static struct regulator_ops gpio_regulator_voltage_ops = {
}; };
static struct gpio_regulator_config * static struct gpio_regulator_config *
of_get_gpio_regulator_config(struct device *dev, struct device_node *np) of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
const struct regulator_desc *desc)
{ {
struct gpio_regulator_config *config; struct gpio_regulator_config *config;
const char *regtype; const char *regtype;
...@@ -146,7 +147,7 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np) ...@@ -146,7 +147,7 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np)
if (!config) if (!config)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
config->init_data = of_get_regulator_init_data(dev, np); config->init_data = of_get_regulator_init_data(dev, np, desc);
if (!config->init_data) if (!config->init_data)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
...@@ -243,17 +244,18 @@ static int gpio_regulator_probe(struct platform_device *pdev) ...@@ -243,17 +244,18 @@ static int gpio_regulator_probe(struct platform_device *pdev)
struct regulator_config cfg = { }; struct regulator_config cfg = { };
int ptr, ret, state; int ptr, ret, state;
if (np) {
config = of_get_gpio_regulator_config(&pdev->dev, np);
if (IS_ERR(config))
return PTR_ERR(config);
}
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data), drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
GFP_KERNEL); GFP_KERNEL);
if (drvdata == NULL) if (drvdata == NULL)
return -ENOMEM; return -ENOMEM;
if (np) {
config = of_get_gpio_regulator_config(&pdev->dev, np,
&drvdata->desc);
if (IS_ERR(config))
return PTR_ERR(config);
}
drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL);
if (drvdata->desc.name == NULL) { if (drvdata->desc.name == NULL) {
dev_err(&pdev->dev, "Failed to allocate supply name\n"); dev_err(&pdev->dev, "Failed to allocate supply name\n");
......
...@@ -174,7 +174,7 @@ static struct max8952_platform_data *max8952_parse_dt(struct device *dev) ...@@ -174,7 +174,7 @@ static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
if (of_property_read_u32(np, "max8952,ramp-speed", &pd->ramp_speed)) if (of_property_read_u32(np, "max8952,ramp-speed", &pd->ramp_speed))
dev_warn(dev, "max8952,ramp-speed property not specified, defaulting to 32mV/us\n"); dev_warn(dev, "max8952,ramp-speed property not specified, defaulting to 32mV/us\n");
pd->reg_data = of_get_regulator_init_data(dev, np); pd->reg_data = of_get_regulator_init_data(dev, np, &regulator);
if (!pd->reg_data) { if (!pd->reg_data) {
dev_err(dev, "Failed to parse regulator init data\n"); dev_err(dev, "Failed to parse regulator init data\n");
return NULL; return NULL;
......
...@@ -458,7 +458,8 @@ static int max8973_probe(struct i2c_client *client, ...@@ -458,7 +458,8 @@ static int max8973_probe(struct i2c_client *client,
config.dev = &client->dev; config.dev = &client->dev;
config.init_data = pdata ? pdata->reg_init_data : config.init_data = pdata ? pdata->reg_init_data :
of_get_regulator_init_data(&client->dev, client->dev.of_node); of_get_regulator_init_data(&client->dev, client->dev.of_node,
&max->desc);
config.driver_data = max; config.driver_data = max;
config.of_node = client->dev.of_node; config.of_node = client->dev.of_node;
config.regmap = max->regmap; config.regmap = max->regmap;
......
...@@ -953,7 +953,8 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev, ...@@ -953,7 +953,8 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
rdata->id = i; rdata->id = i;
rdata->initdata = of_get_regulator_init_data(&pdev->dev, rdata->initdata = of_get_regulator_init_data(&pdev->dev,
reg_np); reg_np,
&regulators[i]);
rdata->reg_node = reg_np; rdata->reg_node = reg_np;
rdata++; rdata++;
} }
......
...@@ -686,8 +686,9 @@ static int max8998_pmic_dt_parse_pdata(struct max8998_dev *iodev, ...@@ -686,8 +686,9 @@ static int max8998_pmic_dt_parse_pdata(struct max8998_dev *iodev,
continue; continue;
rdata->id = regulators[i].id; rdata->id = regulators[i].id;
rdata->initdata = of_get_regulator_init_data( rdata->initdata = of_get_regulator_init_data(iodev->dev,
iodev->dev, reg_np); reg_np,
&regulators[i]);
rdata->reg_node = reg_np; rdata->reg_node = reg_np;
++rdata; ++rdata;
} }
......
...@@ -194,7 +194,8 @@ struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt( ...@@ -194,7 +194,8 @@ struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
regulators[i].desc.name)) { regulators[i].desc.name)) {
p->id = i; p->id = i;
p->init_data = of_get_regulator_init_data( p->init_data = of_get_regulator_init_data(
&pdev->dev, child); &pdev->dev, child,
&regulators[i].desc);
p->node = child; p->node = child;
p++; p++;
......
...@@ -19,12 +19,20 @@ ...@@ -19,12 +19,20 @@
#include "internal.h" #include "internal.h"
static const char *const regulator_states[PM_SUSPEND_MAX + 1] = {
[PM_SUSPEND_MEM] = "regulator-state-mem",
[PM_SUSPEND_MAX] = "regulator-state-disk",
};
static void of_get_regulation_constraints(struct device_node *np, static void of_get_regulation_constraints(struct device_node *np,
struct regulator_init_data **init_data) struct regulator_init_data **init_data,
const struct regulator_desc *desc)
{ {
const __be32 *min_uV, *max_uV; const __be32 *min_uV, *max_uV;
struct regulation_constraints *constraints = &(*init_data)->constraints; struct regulation_constraints *constraints = &(*init_data)->constraints;
int ret; struct regulator_state *suspend_state;
struct device_node *suspend_np;
int ret, i;
u32 pval; u32 pval;
constraints->name = of_get_property(np, "regulator-name", NULL); constraints->name = of_get_property(np, "regulator-name", NULL);
...@@ -73,18 +81,84 @@ static void of_get_regulation_constraints(struct device_node *np, ...@@ -73,18 +81,84 @@ static void of_get_regulation_constraints(struct device_node *np,
ret = of_property_read_u32(np, "regulator-enable-ramp-delay", &pval); ret = of_property_read_u32(np, "regulator-enable-ramp-delay", &pval);
if (!ret) if (!ret)
constraints->enable_time = pval; constraints->enable_time = pval;
if (!of_property_read_u32(np, "regulator-initial-mode", &pval)) {
if (desc && desc->of_map_mode) {
ret = desc->of_map_mode(pval);
if (ret == -EINVAL)
pr_err("%s: invalid mode %u\n", np->name, pval);
else
constraints->initial_mode = ret;
} else {
pr_warn("%s: mapping for mode %d not defined\n",
np->name, pval);
}
}
for (i = 0; i < ARRAY_SIZE(regulator_states); i++) {
switch (i) {
case PM_SUSPEND_MEM:
suspend_state = &constraints->state_mem;
break;
case PM_SUSPEND_MAX:
suspend_state = &constraints->state_disk;
break;
case PM_SUSPEND_ON:
case PM_SUSPEND_FREEZE:
case PM_SUSPEND_STANDBY:
default:
continue;
};
suspend_np = of_get_child_by_name(np, regulator_states[i]);
if (!suspend_np || !suspend_state)
continue;
if (!of_property_read_u32(suspend_np, "regulator-mode",
&pval)) {
if (desc && desc->of_map_mode) {
ret = desc->of_map_mode(pval);
if (ret == -EINVAL)
pr_err("%s: invalid mode %u\n",
np->name, pval);
else
suspend_state->mode = ret;
} else {
pr_warn("%s: mapping for mode %d not defined\n",
np->name, pval);
}
}
if (of_property_read_bool(suspend_np,
"regulator-on-in-suspend"))
suspend_state->enabled = true;
else if (of_property_read_bool(suspend_np,
"regulator-off-in-suspend"))
suspend_state->disabled = true;
if (!of_property_read_u32(suspend_np,
"regulator-suspend-microvolt", &pval))
suspend_state->uV = pval;
of_node_put(suspend_np);
suspend_state = NULL;
suspend_np = NULL;
}
} }
/** /**
* of_get_regulator_init_data - extract regulator_init_data structure info * of_get_regulator_init_data - extract regulator_init_data structure info
* @dev: device requesting for regulator_init_data * @dev: device requesting for regulator_init_data
* @node: regulator device node
* @desc: regulator description
* *
* Populates regulator_init_data structure by extracting data from device * Populates regulator_init_data structure by extracting data from device
* tree node, returns a pointer to the populated struture or NULL if memory * tree node, returns a pointer to the populated struture or NULL if memory
* alloc fails. * alloc fails.
*/ */
struct regulator_init_data *of_get_regulator_init_data(struct device *dev, struct regulator_init_data *of_get_regulator_init_data(struct device *dev,
struct device_node *node) struct device_node *node,
const struct regulator_desc *desc)
{ {
struct regulator_init_data *init_data; struct regulator_init_data *init_data;
...@@ -95,7 +169,7 @@ struct regulator_init_data *of_get_regulator_init_data(struct device *dev, ...@@ -95,7 +169,7 @@ struct regulator_init_data *of_get_regulator_init_data(struct device *dev,
if (!init_data) if (!init_data)
return NULL; /* Out of memory? */ return NULL; /* Out of memory? */
of_get_regulation_constraints(node, &init_data); of_get_regulation_constraints(node, &init_data, desc);
return init_data; return init_data;
} }
EXPORT_SYMBOL_GPL(of_get_regulator_init_data); EXPORT_SYMBOL_GPL(of_get_regulator_init_data);
...@@ -176,7 +250,8 @@ int of_regulator_match(struct device *dev, struct device_node *node, ...@@ -176,7 +250,8 @@ int of_regulator_match(struct device *dev, struct device_node *node,
continue; continue;
match->init_data = match->init_data =
of_get_regulator_init_data(dev, child); of_get_regulator_init_data(dev, child,
match->desc);
if (!match->init_data) { if (!match->init_data) {
dev_err(dev, dev_err(dev,
"failed to parse DT for regulator %s\n", "failed to parse DT for regulator %s\n",
...@@ -223,7 +298,7 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev, ...@@ -223,7 +298,7 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
if (strcmp(desc->of_match, name)) if (strcmp(desc->of_match, name))
continue; continue;
init_data = of_get_regulator_init_data(dev, child); init_data = of_get_regulator_init_data(dev, child, desc);
if (!init_data) { if (!init_data) {
dev_err(dev, dev_err(dev,
"failed to parse DT for regulator %s\n", "failed to parse DT for regulator %s\n",
......
...@@ -149,7 +149,8 @@ static int pwm_regulator_probe(struct platform_device *pdev) ...@@ -149,7 +149,8 @@ static int pwm_regulator_probe(struct platform_device *pdev)
return ret; return ret;
} }
config.init_data = of_get_regulator_init_data(&pdev->dev, np); config.init_data = of_get_regulator_init_data(&pdev->dev, np,
&drvdata->desc);
if (!config.init_data) if (!config.init_data)
return -ENOMEM; return -ENOMEM;
......
...@@ -643,10 +643,6 @@ static int rpm_reg_probe(struct platform_device *pdev) ...@@ -643,10 +643,6 @@ static int rpm_reg_probe(struct platform_device *pdev)
match = of_match_device(rpm_of_match, &pdev->dev); match = of_match_device(rpm_of_match, &pdev->dev);
template = match->data; template = match->data;
initdata = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node);
if (!initdata)
return -EINVAL;
vreg = devm_kmalloc(&pdev->dev, sizeof(*vreg), GFP_KERNEL); vreg = devm_kmalloc(&pdev->dev, sizeof(*vreg), GFP_KERNEL);
if (!vreg) { if (!vreg) {
dev_err(&pdev->dev, "failed to allocate vreg\n"); dev_err(&pdev->dev, "failed to allocate vreg\n");
...@@ -666,6 +662,11 @@ static int rpm_reg_probe(struct platform_device *pdev) ...@@ -666,6 +662,11 @@ static int rpm_reg_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
} }
initdata = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node,
&vreg->desc);
if (!initdata)
return -EINVAL;
key = "reg"; key = "reg";
ret = of_property_read_u32(pdev->dev.of_node, key, &val); ret = of_property_read_u32(pdev->dev.of_node, key, &val);
if (ret) { if (ret) {
......
...@@ -581,7 +581,8 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, ...@@ -581,7 +581,8 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
rdata->id = i; rdata->id = i;
rdata->initdata = of_get_regulator_init_data( rdata->initdata = of_get_regulator_init_data(
&pdev->dev, reg_np); &pdev->dev, reg_np,
&regulators[i]);
rdata->reg_node = reg_np; rdata->reg_node = reg_np;
rdata++; rdata++;
rmode->id = i; rmode->id = i;
......
...@@ -72,7 +72,8 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev) ...@@ -72,7 +72,8 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev)
config.regmap = stw481x->map; config.regmap = stw481x->map;
config.of_node = pdev->dev.of_node; config.of_node = pdev->dev.of_node;
config.init_data = of_get_regulator_init_data(&pdev->dev, config.init_data = of_get_regulator_init_data(&pdev->dev,
pdev->dev.of_node); pdev->dev.of_node,
&vmmc_regulator);
stw481x->vmmc_regulator = devm_regulator_register(&pdev->dev, stw481x->vmmc_regulator = devm_regulator_register(&pdev->dev,
&vmmc_regulator, &config); &vmmc_regulator, &config);
......
...@@ -837,7 +837,8 @@ static int ti_abb_probe(struct platform_device *pdev) ...@@ -837,7 +837,8 @@ static int ti_abb_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
initdata = of_get_regulator_init_data(dev, pdev->dev.of_node); initdata = of_get_regulator_init_data(dev, pdev->dev.of_node,
&abb->rdesc);
if (!initdata) { if (!initdata) {
dev_err(dev, "%s: Unable to alloc regulator init data\n", dev_err(dev, "%s: Unable to alloc regulator init data\n",
__func__); __func__);
......
...@@ -221,7 +221,8 @@ static const struct of_device_id tps51632_of_match[] = { ...@@ -221,7 +221,8 @@ static const struct of_device_id tps51632_of_match[] = {
MODULE_DEVICE_TABLE(of, tps51632_of_match); MODULE_DEVICE_TABLE(of, tps51632_of_match);
static struct tps51632_regulator_platform_data * static struct tps51632_regulator_platform_data *
of_get_tps51632_platform_data(struct device *dev) of_get_tps51632_platform_data(struct device *dev,
const struct regulator_desc *desc)
{ {
struct tps51632_regulator_platform_data *pdata; struct tps51632_regulator_platform_data *pdata;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
...@@ -230,7 +231,8 @@ static struct tps51632_regulator_platform_data * ...@@ -230,7 +231,8 @@ static struct tps51632_regulator_platform_data *
if (!pdata) if (!pdata)
return NULL; return NULL;
pdata->reg_init_data = of_get_regulator_init_data(dev, dev->of_node); pdata->reg_init_data = of_get_regulator_init_data(dev, dev->of_node,
desc);
if (!pdata->reg_init_data) { if (!pdata->reg_init_data) {
dev_err(dev, "Not able to get OF regulator init data\n"); dev_err(dev, "Not able to get OF regulator init data\n");
return NULL; return NULL;
...@@ -248,7 +250,8 @@ static struct tps51632_regulator_platform_data * ...@@ -248,7 +250,8 @@ static struct tps51632_regulator_platform_data *
} }
#else #else
static struct tps51632_regulator_platform_data * static struct tps51632_regulator_platform_data *
of_get_tps51632_platform_data(struct device *dev) of_get_tps51632_platform_data(struct device *dev,
const struct regulator_desc *desc)
{ {
return NULL; return NULL;
} }
...@@ -273,9 +276,25 @@ static int tps51632_probe(struct i2c_client *client, ...@@ -273,9 +276,25 @@ static int tps51632_probe(struct i2c_client *client,
} }
} }
tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
if (!tps)
return -ENOMEM;
tps->dev = &client->dev;
tps->desc.name = client->name;
tps->desc.id = 0;
tps->desc.ramp_delay = TPS51632_DEFAULT_RAMP_DELAY;
tps->desc.min_uV = TPS51632_MIN_VOLTAGE;
tps->desc.uV_step = TPS51632_VOLTAGE_STEP_10mV;
tps->desc.linear_min_sel = TPS51632_MIN_VSEL;
tps->desc.n_voltages = TPS51632_MAX_VSEL + 1;
tps->desc.ops = &tps51632_dcdc_ops;
tps->desc.type = REGULATOR_VOLTAGE;
tps->desc.owner = THIS_MODULE;
pdata = dev_get_platdata(&client->dev); pdata = dev_get_platdata(&client->dev);
if (!pdata && client->dev.of_node) if (!pdata && client->dev.of_node)
pdata = of_get_tps51632_platform_data(&client->dev); pdata = of_get_tps51632_platform_data(&client->dev, &tps->desc);
if (!pdata) { if (!pdata) {
dev_err(&client->dev, "No Platform data\n"); dev_err(&client->dev, "No Platform data\n");
return -EINVAL; return -EINVAL;
...@@ -296,22 +315,6 @@ static int tps51632_probe(struct i2c_client *client, ...@@ -296,22 +315,6 @@ static int tps51632_probe(struct i2c_client *client,
} }
} }
tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
if (!tps)
return -ENOMEM;
tps->dev = &client->dev;
tps->desc.name = client->name;
tps->desc.id = 0;
tps->desc.ramp_delay = TPS51632_DEFAULT_RAMP_DELAY;
tps->desc.min_uV = TPS51632_MIN_VOLTAGE;
tps->desc.uV_step = TPS51632_VOLTAGE_STEP_10mV;
tps->desc.linear_min_sel = TPS51632_MIN_VSEL;
tps->desc.n_voltages = TPS51632_MAX_VSEL + 1;
tps->desc.ops = &tps51632_dcdc_ops;
tps->desc.type = REGULATOR_VOLTAGE;
tps->desc.owner = THIS_MODULE;
if (pdata->enable_pwm_dvfs) if (pdata->enable_pwm_dvfs)
tps->desc.vsel_reg = TPS51632_VOLTAGE_BASE_REG; tps->desc.vsel_reg = TPS51632_VOLTAGE_BASE_REG;
else else
......
...@@ -293,7 +293,8 @@ static const struct regmap_config tps62360_regmap_config = { ...@@ -293,7 +293,8 @@ static const struct regmap_config tps62360_regmap_config = {
}; };
static struct tps62360_regulator_platform_data * static struct tps62360_regulator_platform_data *
of_get_tps62360_platform_data(struct device *dev) of_get_tps62360_platform_data(struct device *dev,
const struct regulator_desc *desc)
{ {
struct tps62360_regulator_platform_data *pdata; struct tps62360_regulator_platform_data *pdata;
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
...@@ -302,7 +303,8 @@ static struct tps62360_regulator_platform_data * ...@@ -302,7 +303,8 @@ static struct tps62360_regulator_platform_data *
if (!pdata) if (!pdata)
return NULL; return NULL;
pdata->reg_init_data = of_get_regulator_init_data(dev, dev->of_node); pdata->reg_init_data = of_get_regulator_init_data(dev, dev->of_node,
desc);
if (!pdata->reg_init_data) { if (!pdata->reg_init_data) {
dev_err(dev, "Not able to get OF regulator init data\n"); dev_err(dev, "Not able to get OF regulator init data\n");
return NULL; return NULL;
...@@ -350,6 +352,17 @@ static int tps62360_probe(struct i2c_client *client, ...@@ -350,6 +352,17 @@ static int tps62360_probe(struct i2c_client *client,
pdata = dev_get_platdata(&client->dev); pdata = dev_get_platdata(&client->dev);
tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
if (!tps)
return -ENOMEM;
tps->desc.name = client->name;
tps->desc.id = 0;
tps->desc.ops = &tps62360_dcdc_ops;
tps->desc.type = REGULATOR_VOLTAGE;
tps->desc.owner = THIS_MODULE;
tps->desc.uV_step = 10000;
if (client->dev.of_node) { if (client->dev.of_node) {
const struct of_device_id *match; const struct of_device_id *match;
match = of_match_device(of_match_ptr(tps62360_of_match), match = of_match_device(of_match_ptr(tps62360_of_match),
...@@ -360,7 +373,8 @@ static int tps62360_probe(struct i2c_client *client, ...@@ -360,7 +373,8 @@ static int tps62360_probe(struct i2c_client *client,
} }
chip_id = (int)(long)match->data; chip_id = (int)(long)match->data;
if (!pdata) if (!pdata)
pdata = of_get_tps62360_platform_data(&client->dev); pdata = of_get_tps62360_platform_data(&client->dev,
&tps->desc);
} else if (id) { } else if (id) {
chip_id = id->driver_data; chip_id = id->driver_data;
} else { } else {
...@@ -374,10 +388,6 @@ static int tps62360_probe(struct i2c_client *client, ...@@ -374,10 +388,6 @@ static int tps62360_probe(struct i2c_client *client,
return -EIO; return -EIO;
} }
tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
if (!tps)
return -ENOMEM;
tps->en_discharge = pdata->en_discharge; tps->en_discharge = pdata->en_discharge;
tps->en_internal_pulldn = pdata->en_internal_pulldn; tps->en_internal_pulldn = pdata->en_internal_pulldn;
tps->vsel0_gpio = pdata->vsel0_gpio; tps->vsel0_gpio = pdata->vsel0_gpio;
...@@ -401,13 +411,6 @@ static int tps62360_probe(struct i2c_client *client, ...@@ -401,13 +411,6 @@ static int tps62360_probe(struct i2c_client *client,
return -ENODEV; return -ENODEV;
} }
tps->desc.name = client->name;
tps->desc.id = 0;
tps->desc.ops = &tps62360_dcdc_ops;
tps->desc.type = REGULATOR_VOLTAGE;
tps->desc.owner = THIS_MODULE;
tps->desc.uV_step = 10000;
tps->regmap = devm_regmap_init_i2c(client, &tps62360_regmap_config); tps->regmap = devm_regmap_init_i2c(client, &tps62360_regmap_config);
if (IS_ERR(tps->regmap)) { if (IS_ERR(tps->regmap)) {
ret = PTR_ERR(tps->regmap); ret = PTR_ERR(tps->regmap);
......
...@@ -231,7 +231,8 @@ static int tps65218_regulator_probe(struct platform_device *pdev) ...@@ -231,7 +231,8 @@ static int tps65218_regulator_probe(struct platform_device *pdev)
template = match->data; template = match->data;
id = template->id; id = template->id;
init_data = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node); init_data = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node,
&regulators[id]);
platform_set_drvdata(pdev, tps); platform_set_drvdata(pdev, tps);
......
...@@ -1104,7 +1104,8 @@ static int twlreg_probe(struct platform_device *pdev) ...@@ -1104,7 +1104,8 @@ static int twlreg_probe(struct platform_device *pdev)
template = match->data; template = match->data;
id = template->desc.id; id = template->desc.id;
initdata = of_get_regulator_init_data(&pdev->dev, initdata = of_get_regulator_init_data(&pdev->dev,
pdev->dev.of_node); pdev->dev.of_node,
&template->desc);
drvdata = NULL; drvdata = NULL;
} else { } else {
id = pdev->id; id = pdev->id;
......
...@@ -74,7 +74,8 @@ static int vexpress_regulator_probe(struct platform_device *pdev) ...@@ -74,7 +74,8 @@ static int vexpress_regulator_probe(struct platform_device *pdev)
reg->desc.owner = THIS_MODULE; reg->desc.owner = THIS_MODULE;
reg->desc.continuous_voltage_range = true; reg->desc.continuous_voltage_range = true;
init_data = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node); init_data = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node,
&reg->desc);
if (!init_data) if (!init_data)
return -EINVAL; return -EINVAL;
......
...@@ -243,6 +243,8 @@ enum regulator_type { ...@@ -243,6 +243,8 @@ enum regulator_type {
* *
* @enable_time: Time taken for initial enable of regulator (in uS). * @enable_time: Time taken for initial enable of regulator (in uS).
* @off_on_delay: guard time (in uS), before re-enabling a regulator * @off_on_delay: guard time (in uS), before re-enabling a regulator
*
* @of_map_mode: Maps a hardware mode defined in a DeviceTree to a standard mode
*/ */
struct regulator_desc { struct regulator_desc {
const char *name; const char *name;
...@@ -285,6 +287,8 @@ struct regulator_desc { ...@@ -285,6 +287,8 @@ struct regulator_desc {
unsigned int enable_time; unsigned int enable_time;
unsigned int off_on_delay; unsigned int off_on_delay;
unsigned int (*of_map_mode)(unsigned int mode);
}; };
/** /**
......
...@@ -6,24 +6,29 @@ ...@@ -6,24 +6,29 @@
#ifndef __LINUX_OF_REG_H #ifndef __LINUX_OF_REG_H
#define __LINUX_OF_REG_H #define __LINUX_OF_REG_H
struct regulator_desc;
struct of_regulator_match { struct of_regulator_match {
const char *name; const char *name;
void *driver_data; void *driver_data;
struct regulator_init_data *init_data; struct regulator_init_data *init_data;
struct device_node *of_node; struct device_node *of_node;
const struct regulator_desc *desc;
}; };
#if defined(CONFIG_OF) #if defined(CONFIG_OF)
extern struct regulator_init_data extern struct regulator_init_data
*of_get_regulator_init_data(struct device *dev, *of_get_regulator_init_data(struct device *dev,
struct device_node *node); struct device_node *node,
const struct regulator_desc *desc);
extern int of_regulator_match(struct device *dev, struct device_node *node, extern int of_regulator_match(struct device *dev, struct device_node *node,
struct of_regulator_match *matches, struct of_regulator_match *matches,
unsigned int num_matches); unsigned int num_matches);
#else #else
static inline struct regulator_init_data static inline struct regulator_init_data
*of_get_regulator_init_data(struct device *dev, *of_get_regulator_init_data(struct device *dev,
struct device_node *node) struct device_node *node,
const struct regulator_desc *desc)
{ {
return NULL; return NULL;
} }
......
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