Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+24 −15
Original line number Diff line number Diff line
@@ -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,6 +678,12 @@ static int drms_uA_update(struct regulator_dev *rdev)
	list_for_each_entry(sibling, &rdev->consumer_list, list)
		current_uA += sibling->uA_load;

	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);
@@ -691,6 +699,7 @@ static int drms_uA_update(struct regulator_dev *rdev)
		err = rdev->desc->ops->set_mode(rdev, mode);
		if (err < 0)
			rdev_err(rdev, "failed to set optimum mode %x\n", mode);
	}

	return err;
}
+9 −23
Original line number Diff line number Diff line
@@ -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",
	seq_printf(s, "ux500-regulator power state count: %i\n",
		   power_state_active_get());
	if (err < 0)
		dev_err(dev, "seq_printf overflow\n");

	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,
		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");
	}

	return 0;
+9 −84
Original line number Diff line number Diff line
@@ -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,
						&regulators[id], &config);
						&regulators[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);
		}
	}
+4 −5
Original line number Diff line number Diff line
@@ -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,8 +442,8 @@ 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 = false;
		else
			boot_on = pdata->subdevs[i].platform_data->constraints.boot_on;

		switch (pdata->subdevs[i].id) {
+30 −0
Original line number Diff line number Diff line
@@ -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);
Loading