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

Commit f9178dad authored by Lee Jones's avatar Lee Jones Committed by Mark Brown
Browse files

regulator: pwm-regulator: Separate voltage-table initialisation



Take this out of the main .probe() routine in order to facilitate the
introduction of different ways to obtain 'duty cycle' information.

Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d770e558
Loading
Loading
Loading
Loading
+45 −32
Original line number Original line Diff line number Diff line
@@ -78,8 +78,7 @@ static int pwm_regulator_list_voltage(struct regulator_dev *rdev,


	return drvdata->duty_cycle_table[selector].uV;
	return drvdata->duty_cycle_table[selector].uV;
}
}

static struct regulator_ops pwm_regulator_voltage_table_ops = {
static struct regulator_ops pwm_regulator_voltage_ops = {
	.set_voltage_sel = pwm_regulator_set_voltage_sel,
	.set_voltage_sel = pwm_regulator_set_voltage_sel,
	.get_voltage_sel = pwm_regulator_get_voltage_sel,
	.get_voltage_sel = pwm_regulator_get_voltage_sel,
	.list_voltage    = pwm_regulator_list_voltage,
	.list_voltage    = pwm_regulator_list_voltage,
@@ -88,20 +87,55 @@ static struct regulator_ops pwm_regulator_voltage_ops = {


static struct regulator_desc pwm_regulator_desc = {
static struct regulator_desc pwm_regulator_desc = {
	.name		= "pwm-regulator",
	.name		= "pwm-regulator",
	.ops		= &pwm_regulator_voltage_ops,
	.type		= REGULATOR_VOLTAGE,
	.type		= REGULATOR_VOLTAGE,
	.owner		= THIS_MODULE,
	.owner		= THIS_MODULE,
	.supply_name    = "pwm",
	.supply_name    = "pwm",
};
};


static int pwm_regulator_init_table(struct platform_device *pdev,
				    struct pwm_regulator_data *drvdata)
{
	struct device_node *np = pdev->dev.of_node;
	struct pwm_voltages *duty_cycle_table;
	int length;
	int ret;

	of_find_property(np, "voltage-table", &length);

	if ((length < sizeof(*duty_cycle_table)) ||
	    (length % sizeof(*duty_cycle_table))) {
		dev_err(&pdev->dev,
			"voltage-table length(%d) is invalid\n",
			length);
		return -EINVAL;
	}

	duty_cycle_table = devm_kzalloc(&pdev->dev, length, GFP_KERNEL);
	if (!duty_cycle_table)
		return -ENOMEM;

	ret = of_property_read_u32_array(np, "voltage-table",
					 (u32 *)duty_cycle_table,
					 length / sizeof(u32));
	if (ret) {
		dev_err(&pdev->dev, "Failed to read voltage-table\n");
		return ret;
	}

	drvdata->duty_cycle_table	= duty_cycle_table;
	pwm_regulator_desc.ops		= &pwm_regulator_voltage_table_ops;
	pwm_regulator_desc.n_voltages	= length / sizeof(*duty_cycle_table);

	return 0;
}

static int pwm_regulator_probe(struct platform_device *pdev)
static int pwm_regulator_probe(struct platform_device *pdev)
{
{
	struct pwm_regulator_data *drvdata;
	struct pwm_regulator_data *drvdata;
	struct property *prop;
	struct regulator_dev *regulator;
	struct regulator_dev *regulator;
	struct regulator_config config = { };
	struct regulator_config config = { };
	struct device_node *np = pdev->dev.of_node;
	struct device_node *np = pdev->dev.of_node;
	int length, ret;
	int ret;


	if (!np) {
	if (!np) {
		dev_err(&pdev->dev, "Device Tree node missing\n");
		dev_err(&pdev->dev, "Device Tree node missing\n");
@@ -112,34 +146,13 @@ static int pwm_regulator_probe(struct platform_device *pdev)
	if (!drvdata)
	if (!drvdata)
		return -ENOMEM;
		return -ENOMEM;


	/* determine the number of voltage-table */
	if (of_find_property(np, "voltage-table", NULL)) {
	prop = of_find_property(np, "voltage-table", &length);
		ret = pwm_regulator_init_table(pdev, drvdata);
	if (!prop) {
		if (ret)
		dev_err(&pdev->dev, "No voltage-table\n");
		return -EINVAL;
	}

	if ((length < sizeof(*drvdata->duty_cycle_table)) ||
	    (length % sizeof(*drvdata->duty_cycle_table))) {
		dev_err(&pdev->dev, "voltage-table length(%d) is invalid\n",
			length);
		return -EINVAL;
	}

	pwm_regulator_desc.n_voltages = length / sizeof(*drvdata->duty_cycle_table);

	drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev,
						 length, GFP_KERNEL);
	if (!drvdata->duty_cycle_table)
		return -ENOMEM;

	/* read voltage table from DT property */
	ret = of_property_read_u32_array(np, "voltage-table",
					 (u32 *)drvdata->duty_cycle_table,
					 length / sizeof(u32));
	if (ret < 0) {
		dev_err(&pdev->dev, "read voltage-table failed\n");
			return ret;
			return ret;
	} else {
		dev_err(&pdev->dev, "No \"voltage-table\" supplied\n");
		return -EINVAL;
	}
	}


	config.init_data = of_get_regulator_init_data(&pdev->dev, np,
	config.init_data = of_get_regulator_init_data(&pdev->dev, np,