mirror of https://gitee.com/openkylin/linux.git
Merge remote-tracking branches 'regulator/topic/dbx500', 'regulator/topic/load-op', 'regulator/topic/max77693' and 'regulator/topic/max8660' into regulator-next
This commit is contained in:
commit
3984c9da45
|
@ -648,10 +648,12 @@ static int drms_uA_update(struct regulator_dev *rdev)
|
|||
if (err < 0)
|
||||
return 0;
|
||||
|
||||
if (!rdev->desc->ops->get_optimum_mode)
|
||||
if (!rdev->desc->ops->get_optimum_mode &&
|
||||
!rdev->desc->ops->set_load)
|
||||
return 0;
|
||||
|
||||
if (!rdev->desc->ops->set_mode)
|
||||
if (!rdev->desc->ops->set_mode &&
|
||||
!rdev->desc->ops->set_load)
|
||||
return -EINVAL;
|
||||
|
||||
/* get output voltage */
|
||||
|
@ -676,22 +678,29 @@ static int drms_uA_update(struct regulator_dev *rdev)
|
|||
list_for_each_entry(sibling, &rdev->consumer_list, list)
|
||||
current_uA += sibling->uA_load;
|
||||
|
||||
/* 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);
|
||||
if (rdev->desc->ops->set_load) {
|
||||
/* set the optimum mode for our new total regulator load */
|
||||
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 = 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;
|
||||
}
|
||||
|
||||
err = rdev->desc->ops->set_mode(rdev, mode);
|
||||
if (err < 0)
|
||||
rdev_err(rdev, "failed to set optimum mode %x\n", mode);
|
||||
}
|
||||
|
||||
err = rdev->desc->ops->set_mode(rdev, mode);
|
||||
if (err < 0)
|
||||
rdev_err(rdev, "failed to set optimum mode %x\n", mode);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -95,14 +95,9 @@ void ux500_regulator_resume_debug(void)
|
|||
|
||||
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 */
|
||||
err = seq_printf(s, "ux500-regulator power state count: %i\n",
|
||||
power_state_active_get());
|
||||
if (err < 0)
|
||||
dev_err(dev, "seq_printf overflow\n");
|
||||
seq_printf(s, "ux500-regulator power state count: %i\n",
|
||||
power_state_active_get());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
struct device *dev = s->private;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
/* print dump header */
|
||||
err = seq_puts(s, "ux500-regulator status:\n");
|
||||
if (err < 0)
|
||||
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");
|
||||
seq_puts(s, "ux500-regulator status:\n");
|
||||
seq_printf(s, "%31s : %8s : %8s\n", "current", "before", "after");
|
||||
|
||||
for (i = 0; i < rdebug.num_regulators; i++) {
|
||||
struct dbx500_regulator_info *info;
|
||||
|
@ -144,12 +131,11 @@ static int ux500_regulator_status_print(struct seq_file *s, void *p)
|
|||
info = &rdebug.regulator_array[i];
|
||||
|
||||
/* print status */
|
||||
err = seq_printf(s, "%20s : %8s : %8s : %8s\n", info->desc.name,
|
||||
info->is_enabled ? "enabled" : "disabled",
|
||||
rdebug.state_before_suspend[i] ? "enabled" : "disabled",
|
||||
rdebug.state_after_suspend[i] ? "enabled" : "disabled");
|
||||
if (err < 0)
|
||||
dev_err(dev, "seq_printf overflow\n");
|
||||
seq_printf(s, "%20s : %8s : %8s : %8s\n",
|
||||
info->desc.name,
|
||||
info->is_enabled ? "enabled" : "disabled",
|
||||
rdebug.state_before_suspend[i] ? "enabled" : "disabled",
|
||||
rdebug.state_after_suspend[i] ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -128,6 +128,8 @@ static struct regulator_ops max77693_charger_ops = {
|
|||
#define regulator_desc_esafeout(_num) { \
|
||||
.name = "ESAFEOUT"#_num, \
|
||||
.id = MAX77693_ESAFEOUT##_num, \
|
||||
.of_match = of_match_ptr("ESAFEOUT"#_num), \
|
||||
.regulators_node = of_match_ptr("regulators"), \
|
||||
.n_voltages = 4, \
|
||||
.ops = &max77693_safeout_ops, \
|
||||
.type = REGULATOR_VOLTAGE, \
|
||||
|
@ -145,6 +147,8 @@ static const struct regulator_desc regulators[] = {
|
|||
{
|
||||
.name = "CHARGER",
|
||||
.id = MAX77693_CHARGER,
|
||||
.of_match = of_match_ptr("CHARGER"),
|
||||
.regulators_node = of_match_ptr("regulators"),
|
||||
.ops = &max77693_charger_ops,
|
||||
.type = REGULATOR_CURRENT,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -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)
|
||||
{
|
||||
struct max77693_dev *iodev = dev_get_drvdata(pdev->dev.parent);
|
||||
struct max77693_regulator_data *rdata = NULL;
|
||||
int num_rdata, i;
|
||||
int i;
|
||||
struct regulator_config config = { };
|
||||
|
||||
num_rdata = max77693_pmic_init_rdata(&pdev->dev, &rdata);
|
||||
if (!rdata || num_rdata <= 0) {
|
||||
dev_err(&pdev->dev, "No init data supplied.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
config.dev = &pdev->dev;
|
||||
config.dev = iodev->dev;
|
||||
config.regmap = iodev->regmap;
|
||||
|
||||
for (i = 0; i < num_rdata; i++) {
|
||||
int id = rdata[i].id;
|
||||
for (i = 0; i < ARRAY_SIZE(regulators); i++) {
|
||||
struct regulator_dev *rdev;
|
||||
|
||||
config.init_data = rdata[i].initdata;
|
||||
config.of_node = rdata[i].of_node;
|
||||
|
||||
rdev = devm_regulator_register(&pdev->dev,
|
||||
®ulators[id], &config);
|
||||
®ulators[i], &config);
|
||||
if (IS_ERR(rdev)) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to initialize regulator-%d\n", id);
|
||||
"Failed to initialize regulator-%d\n", i);
|
||||
return PTR_ERR(rdev);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -382,7 +382,7 @@ static int max8660_probe(struct i2c_client *client,
|
|||
const struct i2c_device_id *i2c_id)
|
||||
{
|
||||
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 max8660 *max8660;
|
||||
int boot_on, i, id, ret = -EINVAL;
|
||||
|
@ -391,7 +391,6 @@ static int max8660_probe(struct i2c_client *client,
|
|||
|
||||
if (dev->of_node && !pdata) {
|
||||
const struct of_device_id *id;
|
||||
struct max8660_platform_data pdata_of;
|
||||
|
||||
id = of_match_device(of_match_ptr(max8660_dt_ids), dev);
|
||||
if (!id)
|
||||
|
@ -443,9 +442,9 @@ static int max8660_probe(struct i2c_client *client,
|
|||
for (i = 0; i < pdata->num_subdevs; i++) {
|
||||
|
||||
if (!pdata->subdevs[i].platform_data)
|
||||
return ret;
|
||||
|
||||
boot_on = pdata->subdevs[i].platform_data->constraints.boot_on;
|
||||
boot_on = false;
|
||||
else
|
||||
boot_on = pdata->subdevs[i].platform_data->constraints.boot_on;
|
||||
|
||||
switch (pdata->subdevs[i].id) {
|
||||
case MAX8660_V3:
|
||||
|
|
|
@ -393,6 +393,28 @@ static int rpm_reg_is_enabled(struct regulator_dev *rdev)
|
|||
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 = {
|
||||
.list_voltage = regulator_list_voltage_linear_range,
|
||||
|
||||
|
@ -402,6 +424,8 @@ static struct regulator_ops uV_ops = {
|
|||
.enable = rpm_reg_uV_enable,
|
||||
.disable = rpm_reg_uV_disable,
|
||||
.is_enabled = rpm_reg_is_enabled,
|
||||
|
||||
.set_load = rpm_reg_set_load,
|
||||
};
|
||||
|
||||
static struct regulator_ops mV_ops = {
|
||||
|
@ -413,6 +437,8 @@ static struct regulator_ops mV_ops = {
|
|||
.enable = rpm_reg_mV_enable,
|
||||
.disable = rpm_reg_mV_disable,
|
||||
.is_enabled = rpm_reg_is_enabled,
|
||||
|
||||
.set_load = rpm_reg_set_load,
|
||||
};
|
||||
|
||||
static struct regulator_ops switch_ops = {
|
||||
|
@ -706,6 +732,10 @@ static int rpm_reg_probe(struct platform_device *pdev)
|
|||
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";
|
||||
if (of_property_read_bool(pdev->dev.of_node, key)) {
|
||||
ret = rpm_reg_set(vreg, &vreg->parts->pd, 1);
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#ifndef __LINUX_MFD_MAX77693_H
|
||||
#define __LINUX_MFD_MAX77693_H
|
||||
|
||||
/* MAX77686 regulator IDs */
|
||||
/* MAX77693 regulator IDs */
|
||||
enum max77693_regulators {
|
||||
MAX77693_ESAFEOUT1 = 0,
|
||||
MAX77693_ESAFEOUT2,
|
||||
|
@ -38,12 +38,6 @@ enum max77693_regulators {
|
|||
MAX77693_REG_MAX,
|
||||
};
|
||||
|
||||
struct max77693_regulator_data {
|
||||
int id;
|
||||
struct regulator_init_data *initdata;
|
||||
struct device_node *of_node;
|
||||
};
|
||||
|
||||
struct max77693_reg_data {
|
||||
u8 addr;
|
||||
u8 data;
|
||||
|
@ -103,10 +97,6 @@ struct max77693_led_platform_data {
|
|||
/* MAX77693 */
|
||||
|
||||
struct max77693_platform_data {
|
||||
/* regulator data */
|
||||
struct max77693_regulator_data *regulators;
|
||||
int num_regulators;
|
||||
|
||||
/* muic data */
|
||||
struct max77693_muic_platform_data *muic_data;
|
||||
struct max77693_led_platform_data *led_data;
|
||||
|
|
|
@ -98,6 +98,7 @@ struct regulator_linear_range {
|
|||
* REGULATOR_STATUS value (or negative errno)
|
||||
* @get_optimum_mode: Get the most efficient operating mode for the regulator
|
||||
* when running with the specified parameters.
|
||||
* @set_load: Set the load for the regulator.
|
||||
*
|
||||
* @set_bypass: Set the regulator in bypass mode.
|
||||
* @get_bypass: Get the regulator bypass mode state.
|
||||
|
@ -167,6 +168,8 @@ struct regulator_ops {
|
|||
/* get most efficient regulator operating mode for load */
|
||||
unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,
|
||||
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 */
|
||||
int (*set_bypass)(struct regulator_dev *dev, bool enable);
|
||||
|
|
Loading…
Reference in New Issue