lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 07 Nov 2014 16:23:12 +0100
From:	Krzysztof Kozlowski <k.kozlowski@...sung.com>
To:	Javier Martinez Canillas <javier.martinez@...labora.co.uk>
Cc:	Mark Brown <broonie@...nel.org>,
	Kukjin Kim <kgene.kim@...sung.com>,
	Chanwoo Choi <cw00.choi@...sung.com>,
	Olof Johansson <olof@...om.net>,
	Chris Zhong <zyw@...k-chips.com>,
	Abhilash Kesavan <kesavan.abhilash@...il.com>,
	linux-samsung-soc@...r.kernel.org, linux-kernel@...r.kernel.org,
	devicetree@...r.kernel.org
Subject: Re: [PATCH v5 3/5] regulator: of: Add regulator desc param to
 of_get_regulator_init_data()

On piÄ…, 2014-11-07 at 14:00 +0100, Javier Martinez Canillas wrote:
> The of_get_regulator_init_data() function is used to extract the regulator
> init_data but information on how to extract certain data is defined in the
> static regulator descriptor (e.g: how to map the hardware operating modes).
> 
> Add a const struct regulator_desc * parameter to the function signature so
> the parsing logic could use the information in the struct regulator_desc.
> 
> of_get_regulator_init_data() relies on of_get_regulation_constraints() to
> actually extract the init_data so it has to pass the struct regulator_desc
> but that is modified on a later patch.
> 
> Signed-off-by: Javier Martinez Canillas <javier.martinez@...labora.co.uk>

(this looks fine)
(...)

> diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c
> index f8e4257..37b671c 100644
> --- a/drivers/regulator/fan53555.c
> +++ b/drivers/regulator/fan53555.c
> @@ -302,7 +302,8 @@ static struct regmap_config fan53555_regmap_config = {
>  };
>  
>  static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev,
> -							struct device_node *np)
> +						struct device_node *np,
> +						struct regulator_desc *desc)

Not a const? Why not?

>  {
>  	struct fan53555_platform_data *pdata;
>  	int ret;
> @@ -312,7 +313,7 @@ static struct fan53555_platform_data *fan53555_parse_dt(struct device *dev,
>  	if (!pdata)
>  		return NULL;
>  
> -	pdata->regulator = of_get_regulator_init_data(dev, np);
> +	pdata->regulator = of_get_regulator_init_data(dev, np, desc);

Desc would be always NULL here which is safe (check in patch 5/5) but if
someone puts "regulator-initial-mode" in DTS then this will always print
warning. Just wonder - is it actually what you wanted?

This applies also for tps51632 and tps62360.

>  
>  	ret = of_property_read_u32(np, "fcs,suspend-voltage-selector",
>  				   &tmp);
> @@ -347,20 +348,20 @@ static int fan53555_regulator_probe(struct i2c_client *client,
>  	unsigned int val;
>  	int ret;
>  
> +	di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info),
> +					GFP_KERNEL);
> +	if (!di)
> +		return -ENOMEM;
> +
>  	pdata = dev_get_platdata(&client->dev);
>  	if (!pdata)
> -		pdata = fan53555_parse_dt(&client->dev, np);
> +		pdata = fan53555_parse_dt(&client->dev, np, &di->desc);
>  
>  	if (!pdata || !pdata->regulator) {
>  		dev_err(&client->dev, "Platform data not found!\n");
>  		return -ENODEV;
>  	}
>  
> -	di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info),
> -					GFP_KERNEL);
> -	if (!di)
> -		return -ENOMEM;
> -
>  	di->regulator = pdata->regulator;
>  	if (client->dev.of_node) {
>  		const struct of_device_id *match;
> diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
> index 354105e..649fece 100644
> --- a/drivers/regulator/fixed.c
> +++ b/drivers/regulator/fixed.c
> @@ -40,13 +40,14 @@ struct fixed_voltage_data {
>  /**
>   * of_get_fixed_voltage_config - extract fixed_voltage_config structure info
>   * @dev: device requesting for fixed_voltage_config
> + * @desc: regulator description
>   *
>   * Populates fixed_voltage_config structure by extracting data from device
>   * tree node, returns a pointer to the populated structure of NULL if memory
>   * alloc fails.
>   */
>  static struct fixed_voltage_config *
> -of_get_fixed_voltage_config(struct device *dev)
> +of_get_fixed_voltage_config(struct device *dev, struct regulator_desc *desc)

Not const?

>  {
>  	struct fixed_voltage_config *config;
>  	struct device_node *np = dev->of_node;
> @@ -57,7 +58,7 @@ of_get_fixed_voltage_config(struct device *dev)
>  	if (!config)
>  		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)
>  		return ERR_PTR(-EINVAL);
>  
> @@ -112,8 +113,14 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
>  	struct regulator_config cfg = { };
>  	int ret;
>  
> +	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
> +			       GFP_KERNEL);
> +	if (!drvdata)
> +		return -ENOMEM;
> +
>  	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))
>  			return PTR_ERR(config);
>  	} else {
> @@ -123,11 +130,6 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
>  	if (!config)
>  		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,
>  					  config->supply_name,
>  					  GFP_KERNEL);
> diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
> index 989b23b..be0d08e 100644
> --- a/drivers/regulator/gpio-regulator.c
> +++ b/drivers/regulator/gpio-regulator.c
> @@ -133,7 +133,8 @@ static struct regulator_ops gpio_regulator_voltage_ops = {
>  };
>  
>  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,
> +			     struct regulator_desc *desc)

Not const?

>  {
>  	struct gpio_regulator_config *config;
>  	const char *regtype;
> @@ -146,7 +147,7 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np)
>  	if (!config)
>  		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)
>  		return ERR_PTR(-EINVAL);
>  
> @@ -243,17 +244,18 @@ static int gpio_regulator_probe(struct platform_device *pdev)
>  	struct regulator_config cfg = { };
>  	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),
>  			       GFP_KERNEL);
>  	if (drvdata == NULL)
>  		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);
>  	if (drvdata->desc.name == NULL) {
>  		dev_err(&pdev->dev, "Failed to allocate supply name\n");
> diff --git a/drivers/regulator/max8952.c b/drivers/regulator/max8952.c
> index f7f9efc..6e54d78 100644
> --- a/drivers/regulator/max8952.c
> +++ b/drivers/regulator/max8952.c
> @@ -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))
>  		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) {
>  		dev_err(dev, "Failed to parse regulator init data\n");
>  		return NULL;
> diff --git a/drivers/regulator/max8973-regulator.c b/drivers/regulator/max8973-regulator.c
> index dbedf17..c3d55c2 100644
> --- a/drivers/regulator/max8973-regulator.c
> +++ b/drivers/regulator/max8973-regulator.c
> @@ -458,7 +458,8 @@ static int max8973_probe(struct i2c_client *client,
>  
>  	config.dev = &client->dev;
>  	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.of_node = client->dev.of_node;
>  	config.regmap = max->regmap;
> diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c
> index 9c31e21..726fde1 100644
> --- a/drivers/regulator/max8997.c
> +++ b/drivers/regulator/max8997.c
> @@ -953,7 +953,8 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
>  
>  		rdata->id = i;
>  		rdata->initdata = of_get_regulator_init_data(&pdev->dev,
> -							     reg_np);
> +							     reg_np,
> +							     &regulators[i]);
>  		rdata->reg_node = reg_np;
>  		rdata++;
>  	}
> diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c
> index 961091b..59e34a0 100644
> --- a/drivers/regulator/max8998.c
> +++ b/drivers/regulator/max8998.c
> @@ -686,8 +686,9 @@ static int max8998_pmic_dt_parse_pdata(struct max8998_dev *iodev,
>  			continue;
>  
>  		rdata->id = regulators[i].id;
> -		rdata->initdata = of_get_regulator_init_data(
> -							iodev->dev, reg_np);
> +		rdata->initdata = of_get_regulator_init_data(iodev->dev,
> +							     reg_np,
> +							     &regulators[i]);
>  		rdata->reg_node = reg_np;
>  		++rdata;
>  	}
> diff --git a/drivers/regulator/mc13xxx-regulator-core.c b/drivers/regulator/mc13xxx-regulator-core.c
> index afba024..0281c31 100644
> --- a/drivers/regulator/mc13xxx-regulator-core.c
> +++ b/drivers/regulator/mc13xxx-regulator-core.c
> @@ -194,7 +194,8 @@ struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
>  					 regulators[i].desc.name)) {
>  				p->id = i;
>  				p->init_data = of_get_regulator_init_data(
> -							&pdev->dev, child);
> +							&pdev->dev, child,
> +							&regulators[i].desc);
>  				p->node = child;
>  				p++;
>  
> diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
> index 03edb17..945486f 100644
> --- a/drivers/regulator/of_regulator.c
> +++ b/drivers/regulator/of_regulator.c
> @@ -120,13 +120,16 @@ static void of_get_regulation_constraints(struct device_node *np,
>  /**
>   * of_get_regulator_init_data - extract regulator_init_data structure info
>   * @dev: device requesting for regulator_init_data
> + * @node: regulator device node
> + * @desc: regulator description
>   *
>   * Populates regulator_init_data structure by extracting data from device
>   * tree node, returns a pointer to the populated struture or NULL if memory
>   * alloc fails.
>   */
>  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;
>  
> @@ -218,7 +221,7 @@ int of_regulator_match(struct device *dev, struct device_node *node,
>  				continue;
>  
>  			match->init_data =
> -				of_get_regulator_init_data(dev, child);
> +				of_get_regulator_init_data(dev, child, NULL);
>  			if (!match->init_data) {
>  				dev_err(dev,
>  					"failed to parse DT for regulator %s\n",
> @@ -266,7 +269,7 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
>  		if (strcmp(desc->of_match, name))
>  			continue;
>  
> -		init_data = of_get_regulator_init_data(dev, child);
> +		init_data = of_get_regulator_init_data(dev, child, desc);
>  		if (!init_data) {
>  			dev_err(dev,
>  				"failed to parse DT for regulator %s\n",
> diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
> index d3f55ea..91f34ca 100644
> --- a/drivers/regulator/pwm-regulator.c
> +++ b/drivers/regulator/pwm-regulator.c
> @@ -149,7 +149,8 @@ static int pwm_regulator_probe(struct platform_device *pdev)
>  		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)
>  		return -ENOMEM;
>  
> diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c
> index b55cd5b..dabd28a 100644
> --- a/drivers/regulator/qcom_rpm-regulator.c
> +++ b/drivers/regulator/qcom_rpm-regulator.c
> @@ -643,10 +643,6 @@ static int rpm_reg_probe(struct platform_device *pdev)
>  	match = of_match_device(rpm_of_match, &pdev->dev);
>  	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);
>  	if (!vreg) {
>  		dev_err(&pdev->dev, "failed to allocate vreg\n");
> @@ -666,6 +662,11 @@ static int rpm_reg_probe(struct platform_device *pdev)
>  		return -ENODEV;
>  	}
>  
> +	initdata = of_get_regulator_init_data(&pdev->dev, pdev->dev.of_node,
> +					      &vreg->desc);
> +	if (!initdata)
> +		return -EINVAL;
> +
>  	key = "reg";
>  	ret = of_property_read_u32(pdev->dev.of_node, key, &val);
>  	if (ret) {
> diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c
> index 0ab5cbe..26932fe 100644
> --- a/drivers/regulator/s5m8767.c
> +++ b/drivers/regulator/s5m8767.c
> @@ -581,7 +581,8 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
>  
>  		rdata->id = i;
>  		rdata->initdata = of_get_regulator_init_data(
> -						&pdev->dev, reg_np);
> +						&pdev->dev, reg_np,
> +						&regulators[i]);
>  		rdata->reg_node = reg_np;
>  		rdata++;
>  		rmode->id = i;
> diff --git a/drivers/regulator/sky81452-regulator.c b/drivers/regulator/sky81452-regulator.c
> index 476b80a..e68e13f 100644
> --- a/drivers/regulator/sky81452-regulator.c
> +++ b/drivers/regulator/sky81452-regulator.c
> @@ -76,7 +76,7 @@ static struct regulator_init_data *sky81452_reg_parse_dt(struct device *dev)
>  		return NULL;
>  	}
>  
> -	init_data = of_get_regulator_init_data(dev, np);
> +	init_data = of_get_regulator_init_data(dev, np, &sky81452_reg);
>  
>  	of_node_put(np);
>  	return init_data;
> diff --git a/drivers/regulator/stw481x-vmmc.c b/drivers/regulator/stw481x-vmmc.c
> index a7e1526..b4f1696 100644
> --- a/drivers/regulator/stw481x-vmmc.c
> +++ b/drivers/regulator/stw481x-vmmc.c
> @@ -72,7 +72,8 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev)
>  	config.regmap = stw481x->map;
>  	config.of_node = pdev->dev.of_node;
>  	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,
>  						&vmmc_regulator, &config);
> diff --git a/drivers/regulator/ti-abb-regulator.c b/drivers/regulator/ti-abb-regulator.c
> index a2dabb5..1ef5aba 100644
> --- a/drivers/regulator/ti-abb-regulator.c
> +++ b/drivers/regulator/ti-abb-regulator.c
> @@ -837,7 +837,8 @@ skip_opt:
>  		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) {
>  		dev_err(dev, "%s: Unable to alloc regulator init data\n",
>  			__func__);
> diff --git a/drivers/regulator/tps51632-regulator.c b/drivers/regulator/tps51632-regulator.c
> index f31f22e..c917b54 100644
> --- a/drivers/regulator/tps51632-regulator.c
> +++ b/drivers/regulator/tps51632-regulator.c
> @@ -221,7 +221,8 @@ static const struct of_device_id tps51632_of_match[] = {
>  MODULE_DEVICE_TABLE(of, tps51632_of_match);
>  
>  static struct tps51632_regulator_platform_data *
> -	of_get_tps51632_platform_data(struct device *dev)
> +	of_get_tps51632_platform_data(struct device *dev,
> +				      struct regulator_desc *desc)

Not const?

>  {
>  	struct tps51632_regulator_platform_data *pdata;
>  	struct device_node *np = dev->of_node;
> @@ -230,7 +231,8 @@ static struct tps51632_regulator_platform_data *
>  	if (!pdata)
>  		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) {
>  		dev_err(dev, "Not able to get OF regulator init data\n");
>  		return NULL;
> @@ -273,9 +275,13 @@ static int tps51632_probe(struct i2c_client *client,
>  		}
>  	}
>  
> +	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
> +	if (!tps)
> +		return -ENOMEM;
> +
>  	pdata = dev_get_platdata(&client->dev);
>  	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) {
>  		dev_err(&client->dev, "No Platform data\n");
>  		return -EINVAL;
> @@ -296,10 +302,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;
> diff --git a/drivers/regulator/tps62360-regulator.c b/drivers/regulator/tps62360-regulator.c
> index a167204..be1f401 100644
> --- a/drivers/regulator/tps62360-regulator.c
> +++ b/drivers/regulator/tps62360-regulator.c
> @@ -293,7 +293,8 @@ static const struct regmap_config tps62360_regmap_config = {
>  };
>  
>  static struct tps62360_regulator_platform_data *
> -	of_get_tps62360_platform_data(struct device *dev)
> +	of_get_tps62360_platform_data(struct device *dev,
> +				      struct regulator_desc *desc)

Not const?


(...)

Rest looks fine.

Krzysztof

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists