Commit 3984c9da authored by Mark Brown's avatar Mark Brown

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

Merge remote-tracking branches 'regulator/topic/dbx500', 'regulator/topic/load-op', 'regulator/topic/max77693' and 'regulator/topic/max8660' into regulator-next
...@@ -648,10 +648,12 @@ static int drms_uA_update(struct regulator_dev *rdev) ...@@ -648,10 +648,12 @@ static int drms_uA_update(struct regulator_dev *rdev)
if (err < 0) if (err < 0)
return 0; return 0;
if (!rdev->desc->ops->get_optimum_mode) if (!rdev->desc->ops->get_optimum_mode &&
!rdev->desc->ops->set_load)
return 0; return 0;
if (!rdev->desc->ops->set_mode) if (!rdev->desc->ops->set_mode &&
!rdev->desc->ops->set_load)
return -EINVAL; return -EINVAL;
/* get output voltage */ /* get output voltage */
...@@ -676,22 +678,29 @@ static int drms_uA_update(struct regulator_dev *rdev) ...@@ -676,22 +678,29 @@ static int drms_uA_update(struct regulator_dev *rdev)
list_for_each_entry(sibling, &rdev->consumer_list, list) list_for_each_entry(sibling, &rdev->consumer_list, list)
current_uA += sibling->uA_load; current_uA += sibling->uA_load;
/* now get the optimum mode for our new total regulator load */ if (rdev->desc->ops->set_load) {
mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV, /* set the optimum mode for our new total regulator load */
output_uV, current_uA); err = rdev->desc->ops->set_load(rdev, current_uA);
if (err < 0)
rdev_err(rdev, "failed to set load %d\n", current_uA);
} else {
/* now get the optimum mode for our new total regulator load */
mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV,
output_uV, current_uA);
/* check the new mode is allowed */
err = regulator_mode_constrain(rdev, &mode);
if (err < 0) {
rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n",
current_uA, input_uV, output_uV);
return err;
}
/* check the new mode is allowed */ err = rdev->desc->ops->set_mode(rdev, mode);
err = regulator_mode_constrain(rdev, &mode); if (err < 0)
if (err < 0) { rdev_err(rdev, "failed to set optimum mode %x\n", mode);
rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n",
current_uA, input_uV, output_uV);
return err;
} }
err = rdev->desc->ops->set_mode(rdev, mode);
if (err < 0)
rdev_err(rdev, "failed to set optimum mode %x\n", mode);
return err; return err;
} }
......
...@@ -95,14 +95,9 @@ void ux500_regulator_resume_debug(void) ...@@ -95,14 +95,9 @@ void ux500_regulator_resume_debug(void)
static int ux500_regulator_power_state_cnt_print(struct seq_file *s, void *p) static int ux500_regulator_power_state_cnt_print(struct seq_file *s, void *p)
{ {
struct device *dev = s->private;
int err;
/* print power state count */ /* print power state count */
err = seq_printf(s, "ux500-regulator power state count: %i\n", seq_printf(s, "ux500-regulator power state count: %i\n",
power_state_active_get()); power_state_active_get());
if (err < 0)
dev_err(dev, "seq_printf overflow\n");
return 0; return 0;
} }
...@@ -124,19 +119,11 @@ static const struct file_operations ux500_regulator_power_state_cnt_fops = { ...@@ -124,19 +119,11 @@ static const struct file_operations ux500_regulator_power_state_cnt_fops = {
static int ux500_regulator_status_print(struct seq_file *s, void *p) static int ux500_regulator_status_print(struct seq_file *s, void *p)
{ {
struct device *dev = s->private;
int err;
int i; int i;
/* print dump header */ /* print dump header */
err = seq_puts(s, "ux500-regulator status:\n"); seq_puts(s, "ux500-regulator status:\n");
if (err < 0) seq_printf(s, "%31s : %8s : %8s\n", "current", "before", "after");
dev_err(dev, "seq_puts overflow\n");
err = seq_printf(s, "%31s : %8s : %8s\n", "current",
"before", "after");
if (err < 0)
dev_err(dev, "seq_printf overflow\n");
for (i = 0; i < rdebug.num_regulators; i++) { for (i = 0; i < rdebug.num_regulators; i++) {
struct dbx500_regulator_info *info; struct dbx500_regulator_info *info;
...@@ -144,12 +131,11 @@ static int ux500_regulator_status_print(struct seq_file *s, void *p) ...@@ -144,12 +131,11 @@ static int ux500_regulator_status_print(struct seq_file *s, void *p)
info = &rdebug.regulator_array[i]; info = &rdebug.regulator_array[i];
/* print status */ /* print status */
err = seq_printf(s, "%20s : %8s : %8s : %8s\n", info->desc.name, seq_printf(s, "%20s : %8s : %8s : %8s\n",
info->is_enabled ? "enabled" : "disabled", info->desc.name,
rdebug.state_before_suspend[i] ? "enabled" : "disabled", info->is_enabled ? "enabled" : "disabled",
rdebug.state_after_suspend[i] ? "enabled" : "disabled"); rdebug.state_before_suspend[i] ? "enabled" : "disabled",
if (err < 0) rdebug.state_after_suspend[i] ? "enabled" : "disabled");
dev_err(dev, "seq_printf overflow\n");
} }
return 0; return 0;
......
...@@ -128,6 +128,8 @@ static struct regulator_ops max77693_charger_ops = { ...@@ -128,6 +128,8 @@ static struct regulator_ops max77693_charger_ops = {
#define regulator_desc_esafeout(_num) { \ #define regulator_desc_esafeout(_num) { \
.name = "ESAFEOUT"#_num, \ .name = "ESAFEOUT"#_num, \
.id = MAX77693_ESAFEOUT##_num, \ .id = MAX77693_ESAFEOUT##_num, \
.of_match = of_match_ptr("ESAFEOUT"#_num), \
.regulators_node = of_match_ptr("regulators"), \
.n_voltages = 4, \ .n_voltages = 4, \
.ops = &max77693_safeout_ops, \ .ops = &max77693_safeout_ops, \
.type = REGULATOR_VOLTAGE, \ .type = REGULATOR_VOLTAGE, \
...@@ -145,6 +147,8 @@ static const struct regulator_desc regulators[] = { ...@@ -145,6 +147,8 @@ static const struct regulator_desc regulators[] = {
{ {
.name = "CHARGER", .name = "CHARGER",
.id = MAX77693_CHARGER, .id = MAX77693_CHARGER,
.of_match = of_match_ptr("CHARGER"),
.regulators_node = of_match_ptr("regulators"),
.ops = &max77693_charger_ops, .ops = &max77693_charger_ops,
.type = REGULATOR_CURRENT, .type = REGULATOR_CURRENT,
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -154,102 +158,23 @@ static const struct regulator_desc regulators[] = { ...@@ -154,102 +158,23 @@ static const struct regulator_desc regulators[] = {
}, },
}; };
#ifdef CONFIG_OF
static int max77693_pmic_dt_parse_rdata(struct device *dev,
struct max77693_regulator_data **rdata)
{
struct device_node *np;
struct of_regulator_match *rmatch;
struct max77693_regulator_data *tmp;
int i, matched = 0;
np = of_get_child_by_name(dev->parent->of_node, "regulators");
if (!np)
return -EINVAL;
rmatch = devm_kzalloc(dev,
sizeof(*rmatch) * ARRAY_SIZE(regulators), GFP_KERNEL);
if (!rmatch) {
of_node_put(np);
return -ENOMEM;
}
for (i = 0; i < ARRAY_SIZE(regulators); i++)
rmatch[i].name = regulators[i].name;
matched = of_regulator_match(dev, np, rmatch, ARRAY_SIZE(regulators));
of_node_put(np);
if (matched <= 0)
return matched;
*rdata = devm_kzalloc(dev, sizeof(**rdata) * matched, GFP_KERNEL);
if (!(*rdata))
return -ENOMEM;
tmp = *rdata;
for (i = 0; i < matched; i++) {
tmp->initdata = rmatch[i].init_data;
tmp->of_node = rmatch[i].of_node;
tmp->id = regulators[i].id;
tmp++;
}
return matched;
}
#else
static int max77693_pmic_dt_parse_rdata(struct device *dev,
struct max77693_regulator_data **rdata)
{
return 0;
}
#endif /* CONFIG_OF */
static int max77693_pmic_init_rdata(struct device *dev,
struct max77693_regulator_data **rdata)
{
struct max77693_platform_data *pdata;
int num_regulators = 0;
pdata = dev_get_platdata(dev->parent);
if (pdata) {
*rdata = pdata->regulators;
num_regulators = pdata->num_regulators;
}
if (!(*rdata) && dev->parent->of_node)
num_regulators = max77693_pmic_dt_parse_rdata(dev, rdata);
return num_regulators;
}
static int max77693_pmic_probe(struct platform_device *pdev) static int max77693_pmic_probe(struct platform_device *pdev)
{ {
struct max77693_dev *iodev = dev_get_drvdata(pdev->dev.parent); struct max77693_dev *iodev = dev_get_drvdata(pdev->dev.parent);
struct max77693_regulator_data *rdata = NULL; int i;
int num_rdata, i;
struct regulator_config config = { }; struct regulator_config config = { };
num_rdata = max77693_pmic_init_rdata(&pdev->dev, &rdata); config.dev = iodev->dev;
if (!rdata || num_rdata <= 0) {
dev_err(&pdev->dev, "No init data supplied.\n");
return -ENODEV;
}
config.dev = &pdev->dev;
config.regmap = iodev->regmap; config.regmap = iodev->regmap;
for (i = 0; i < num_rdata; i++) { for (i = 0; i < ARRAY_SIZE(regulators); i++) {
int id = rdata[i].id;
struct regulator_dev *rdev; struct regulator_dev *rdev;
config.init_data = rdata[i].initdata;
config.of_node = rdata[i].of_node;
rdev = devm_regulator_register(&pdev->dev, rdev = devm_regulator_register(&pdev->dev,
&regulators[id], &config); &regulators[i], &config);
if (IS_ERR(rdev)) { if (IS_ERR(rdev)) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Failed to initialize regulator-%d\n", id); "Failed to initialize regulator-%d\n", i);
return PTR_ERR(rdev); return PTR_ERR(rdev);
} }
} }
......
...@@ -382,7 +382,7 @@ static int max8660_probe(struct i2c_client *client, ...@@ -382,7 +382,7 @@ static int max8660_probe(struct i2c_client *client,
const struct i2c_device_id *i2c_id) const struct i2c_device_id *i2c_id)
{ {
struct device *dev = &client->dev; struct device *dev = &client->dev;
struct max8660_platform_data *pdata = dev_get_platdata(dev); struct max8660_platform_data pdata_of, *pdata = dev_get_platdata(dev);
struct regulator_config config = { }; struct regulator_config config = { };
struct max8660 *max8660; struct max8660 *max8660;
int boot_on, i, id, ret = -EINVAL; int boot_on, i, id, ret = -EINVAL;
...@@ -391,7 +391,6 @@ static int max8660_probe(struct i2c_client *client, ...@@ -391,7 +391,6 @@ static int max8660_probe(struct i2c_client *client,
if (dev->of_node && !pdata) { if (dev->of_node && !pdata) {
const struct of_device_id *id; const struct of_device_id *id;
struct max8660_platform_data pdata_of;
id = of_match_device(of_match_ptr(max8660_dt_ids), dev); id = of_match_device(of_match_ptr(max8660_dt_ids), dev);
if (!id) if (!id)
...@@ -443,9 +442,9 @@ static int max8660_probe(struct i2c_client *client, ...@@ -443,9 +442,9 @@ static int max8660_probe(struct i2c_client *client,
for (i = 0; i < pdata->num_subdevs; i++) { for (i = 0; i < pdata->num_subdevs; i++) {
if (!pdata->subdevs[i].platform_data) if (!pdata->subdevs[i].platform_data)
return ret; boot_on = false;
else
boot_on = pdata->subdevs[i].platform_data->constraints.boot_on; boot_on = pdata->subdevs[i].platform_data->constraints.boot_on;
switch (pdata->subdevs[i].id) { switch (pdata->subdevs[i].id) {
case MAX8660_V3: case MAX8660_V3:
......
...@@ -393,6 +393,28 @@ static int rpm_reg_is_enabled(struct regulator_dev *rdev) ...@@ -393,6 +393,28 @@ static int rpm_reg_is_enabled(struct regulator_dev *rdev)
return vreg->is_enabled; return vreg->is_enabled;
} }
static int rpm_reg_set_load(struct regulator_dev *rdev, int load_uA)
{
struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev);
const struct rpm_reg_parts *parts = vreg->parts;
const struct request_member *req = &parts->ia;
int load_mA = load_uA / 1000;
int max_mA = req->mask >> req->shift;
int ret;
if (req->mask == 0)
return -EINVAL;
if (load_mA > max_mA)
load_mA = max_mA;
mutex_lock(&vreg->lock);
ret = rpm_reg_write(vreg, req, load_mA);
mutex_unlock(&vreg->lock);
return ret;
}
static struct regulator_ops uV_ops = { static struct regulator_ops uV_ops = {
.list_voltage = regulator_list_voltage_linear_range, .list_voltage = regulator_list_voltage_linear_range,
...@@ -402,6 +424,8 @@ static struct regulator_ops uV_ops = { ...@@ -402,6 +424,8 @@ static struct regulator_ops uV_ops = {
.enable = rpm_reg_uV_enable, .enable = rpm_reg_uV_enable,
.disable = rpm_reg_uV_disable, .disable = rpm_reg_uV_disable,
.is_enabled = rpm_reg_is_enabled, .is_enabled = rpm_reg_is_enabled,
.set_load = rpm_reg_set_load,
}; };
static struct regulator_ops mV_ops = { static struct regulator_ops mV_ops = {
...@@ -413,6 +437,8 @@ static struct regulator_ops mV_ops = { ...@@ -413,6 +437,8 @@ static struct regulator_ops mV_ops = {
.enable = rpm_reg_mV_enable, .enable = rpm_reg_mV_enable,
.disable = rpm_reg_mV_disable, .disable = rpm_reg_mV_disable,
.is_enabled = rpm_reg_is_enabled, .is_enabled = rpm_reg_is_enabled,
.set_load = rpm_reg_set_load,
}; };
static struct regulator_ops switch_ops = { static struct regulator_ops switch_ops = {
...@@ -706,6 +732,10 @@ static int rpm_reg_probe(struct platform_device *pdev) ...@@ -706,6 +732,10 @@ static int rpm_reg_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
/* Regulators with ia property suppports drms */
if (vreg->parts->ia.mask)
initdata->constraints.valid_ops_mask |= REGULATOR_CHANGE_DRMS;
key = "bias-pull-down"; key = "bias-pull-down";
if (of_property_read_bool(pdev->dev.of_node, key)) { if (of_property_read_bool(pdev->dev.of_node, key)) {
ret = rpm_reg_set(vreg, &vreg->parts->pd, 1); ret = rpm_reg_set(vreg, &vreg->parts->pd, 1);
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#ifndef __LINUX_MFD_MAX77693_H #ifndef __LINUX_MFD_MAX77693_H
#define __LINUX_MFD_MAX77693_H #define __LINUX_MFD_MAX77693_H
/* MAX77686 regulator IDs */ /* MAX77693 regulator IDs */
enum max77693_regulators { enum max77693_regulators {
MAX77693_ESAFEOUT1 = 0, MAX77693_ESAFEOUT1 = 0,
MAX77693_ESAFEOUT2, MAX77693_ESAFEOUT2,
...@@ -38,12 +38,6 @@ enum max77693_regulators { ...@@ -38,12 +38,6 @@ enum max77693_regulators {
MAX77693_REG_MAX, MAX77693_REG_MAX,
}; };
struct max77693_regulator_data {
int id;
struct regulator_init_data *initdata;
struct device_node *of_node;
};
struct max77693_reg_data { struct max77693_reg_data {
u8 addr; u8 addr;
u8 data; u8 data;
...@@ -103,10 +97,6 @@ struct max77693_led_platform_data { ...@@ -103,10 +97,6 @@ struct max77693_led_platform_data {
/* MAX77693 */ /* MAX77693 */
struct max77693_platform_data { struct max77693_platform_data {
/* regulator data */
struct max77693_regulator_data *regulators;
int num_regulators;
/* muic data */ /* muic data */
struct max77693_muic_platform_data *muic_data; struct max77693_muic_platform_data *muic_data;
struct max77693_led_platform_data *led_data; struct max77693_led_platform_data *led_data;
......
...@@ -98,6 +98,7 @@ struct regulator_linear_range { ...@@ -98,6 +98,7 @@ struct regulator_linear_range {
* 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
* when running with the specified parameters. * when running with the specified parameters.
* @set_load: Set the load for the regulator.
* *
* @set_bypass: Set the regulator in bypass mode. * @set_bypass: Set the regulator in bypass mode.
* @get_bypass: Get the regulator bypass mode state. * @get_bypass: Get the regulator bypass mode state.
...@@ -167,6 +168,8 @@ struct regulator_ops { ...@@ -167,6 +168,8 @@ struct regulator_ops {
/* get most efficient regulator operating mode for load */ /* get most efficient regulator operating mode for load */
unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV, unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,
int output_uV, int load_uA); int output_uV, int load_uA);
/* set the load on the regulator */
int (*set_load)(struct regulator_dev *, int load_uA);
/* control and report on bypass mode */ /* control and report on bypass mode */
int (*set_bypass)(struct regulator_dev *dev, bool enable); int (*set_bypass)(struct regulator_dev *dev, bool enable);
......
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