All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Heiko Stübner" <heiko@sntech.de>
To: Chris Zhong <zyw@rock-chips.com>
Cc: dianders@chromium.org, huangtao@rock-chips.com,
	cf@rock-chips.com, zhangqing@rock-chips.com,
	Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] regulator: st-pwm: get voltage and duty table from dts
Date: Wed, 17 Sep 2014 17:15:27 +0200	[thread overview]
Message-ID: <1589492.avvszpBkYL@diego> (raw)
In-Reply-To: <1410959280-29662-2-git-send-email-zyw@rock-chips.com>

Hi Chris,

Am Mittwoch, 17. September 2014, 21:07:59 schrieb Chris Zhong:
> Get voltage & duty table from device tree might be better, other platforms
> can also use this driver without any modify.
> 
> Signed-off-by: Chris Zhong <zyw@rock-chips.com>
> ---
> 
>  drivers/regulator/Kconfig  |    1 -
>  drivers/regulator/st-pwm.c |   80
> +++++++++++++++++++++++--------------------- 2 files changed, 42
> insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
> index fb32bab..06a9632 100644
> --- a/drivers/regulator/Kconfig
> +++ b/drivers/regulator/Kconfig
> @@ -495,7 +495,6 @@ config REGULATOR_S5M8767
> 
>  config REGULATOR_ST_PWM
>  	tristate "STMicroelectronics PWM voltage regulator"
> -	depends on ARCH_STI
>  	help
>  	 This driver supports ST's PWM controlled voltage regulators.
> 
> diff --git a/drivers/regulator/st-pwm.c b/drivers/regulator/st-pwm.c
> index 5ea78df..877381b 100644
> --- a/drivers/regulator/st-pwm.c
> +++ b/drivers/regulator/st-pwm.c
> @@ -20,16 +20,11 @@
>  #include <linux/of_device.h>
>  #include <linux/pwm.h>
> 
> -#define ST_PWM_REG_PERIOD 8448
> -
> -struct st_pwm_regulator_pdata {
> -	const struct regulator_desc *desc;
> -	struct st_pwm_voltages *duty_cycle_table;
> -};
> -
>  struct st_pwm_regulator_data {
> -	const struct st_pwm_regulator_pdata *pdata;
> +	struct regulator_desc *desc;
> +	struct st_pwm_voltages *duty_cycle_table;
>  	struct pwm_device *pwm;
> +	int pwm_reg_period;
>  	bool enabled;
>  	int state;
>  };
> @@ -53,10 +48,10 @@ static int st_pwm_regulator_set_voltage_sel(struct
> regulator_dev *dev, int dutycycle;
>  	int ret;
> 
> -	dutycycle = (ST_PWM_REG_PERIOD / 100) *
> -		drvdata->pdata->duty_cycle_table[selector].dutycycle;
> +	dutycycle = (drvdata->pwm_reg_period / 100) *
> +		    drvdata->duty_cycle_table[selector].dutycycle;
> 
> -	ret = pwm_config(drvdata->pwm, dutycycle, ST_PWM_REG_PERIOD);
> +	ret = pwm_config(drvdata->pwm, dutycycle, drvdata->pwm_reg_period);
>  	if (ret) {
>  		dev_err(&dev->dev, "Failed to configure PWM\n");
>  		return ret;
> @@ -84,7 +79,7 @@ static int st_pwm_regulator_list_voltage(struct
> regulator_dev *dev, if (selector >= dev->desc->n_voltages)
>  		return -EINVAL;
> 
> -	return drvdata->pdata->duty_cycle_table[selector].uV;
> +	return drvdata->duty_cycle_table[selector].uV;
>  }
> 
>  static struct regulator_ops st_pwm_regulator_voltage_ops = {
> @@ -94,32 +89,16 @@ static struct regulator_ops st_pwm_regulator_voltage_ops
> = { .map_voltage     = regulator_map_voltage_iterate,
>  };
> 
> -static struct st_pwm_voltages b2105_duty_cycle_table[] = {
> -	{ .uV = 1114000, .dutycycle = 0,  },
> -	{ .uV = 1095000, .dutycycle = 10, },
> -	{ .uV = 1076000, .dutycycle = 20, },
> -	{ .uV = 1056000, .dutycycle = 30, },
> -	{ .uV = 1036000, .dutycycle = 40, },
> -	{ .uV = 1016000, .dutycycle = 50, },
> -	/* WARNING: Values above 50% duty-cycle cause boot failures. */
> -};
> -
> -static const struct regulator_desc b2105_desc = {
> +static struct regulator_desc b2105_desc = {
>  	.name		= "b2105-pwm-regulator",
>  	.ops		= &st_pwm_regulator_voltage_ops,
>  	.type		= REGULATOR_VOLTAGE,
>  	.owner		= THIS_MODULE,
> -	.n_voltages	= ARRAY_SIZE(b2105_duty_cycle_table),
>  	.supply_name    = "pwm",
>  };
> 
> -static const struct st_pwm_regulator_pdata b2105_info = {
> -	.desc		  = &b2105_desc,
> -	.duty_cycle_table = b2105_duty_cycle_table,
> -};
> -
>  static const struct of_device_id st_pwm_of_match[] = {
> -	{ .compatible = "st,b2105-pwm-regulator", .data = &b2105_info, },
> +	{ .compatible = "st,b2105-pwm-regulator" },

This is breaking compatibility with the existing binding for the b2105-pwm-
regulator - which has to stay intact. Please add a separate compatiblity like 
"pwm-regulator" that reads the table from the dt and let the b2105 keep it's 
voltage<->duty_cycle table in the driver as it is now.


Heiko


>  	{ },
>  };
>  MODULE_DEVICE_TABLE(of, st_pwm_of_match);
> @@ -127,10 +106,11 @@ MODULE_DEVICE_TABLE(of, st_pwm_of_match);
>  static int st_pwm_regulator_probe(struct platform_device *pdev)
>  {
>  	struct st_pwm_regulator_data *drvdata;
> +	struct property *prop;
>  	struct regulator_dev *regulator;
>  	struct regulator_config config = { };
>  	struct device_node *np = pdev->dev.of_node;
> -	const struct of_device_id *of_match;
> +	int length, ret;
> 
>  	if (!np) {
>  		dev_err(&pdev->dev, "Device Tree node missing\n");
> @@ -141,12 +121,36 @@ static int st_pwm_regulator_probe(struct
> platform_device *pdev) if (!drvdata)
>  		return -ENOMEM;
> 
> -	of_match = of_match_device(st_pwm_of_match, &pdev->dev);
> -	if (!of_match) {
> -		dev_err(&pdev->dev, "failed to match of device\n");
> -		return -ENODEV;
> +	drvdata->desc = &b2105_desc;
> +
> +	/* determine the number of voltage-table */
> +	prop = of_find_property(np, "voltage-table", &length);
> +	if (!prop)
> +		return -EINVAL;
> +
> +	drvdata->desc->n_voltages = length / sizeof(*drvdata->duty_cycle_table);
> +
> +	/* read voltage table from DT property */
> +	if (length > 0) {
> +		size_t size = sizeof(*drvdata->duty_cycle_table) *
> +			      drvdata->desc->n_voltages;
> +
> +		drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev,
> +							 size, GFP_KERNEL);
> +		if (!drvdata->duty_cycle_table)
> +			return -ENOMEM;
> +
> +		ret = of_property_read_u32_array(np, "voltage-table",
> +				(u32 *)drvdata->duty_cycle_table,
> +				length / sizeof(u32));
> +		if (ret < 0)
> +			return ret;
>  	}
> -	drvdata->pdata = of_match->data;
> +
> +	ret = of_property_read_u32(np, "pwm-reg-period",
> +				   &drvdata->pwm_reg_period);
> +	if (ret)
> +		return -EINVAL;
> 
>  	config.init_data = of_get_regulator_init_data(&pdev->dev, np);
>  	if (!config.init_data)
> @@ -163,10 +167,10 @@ static int st_pwm_regulator_probe(struct
> platform_device *pdev) }
> 
>  	regulator = devm_regulator_register(&pdev->dev,
> -					    drvdata->pdata->desc, &config);
> +					    drvdata->desc, &config);
>  	if (IS_ERR(regulator)) {
>  		dev_err(&pdev->dev, "Failed to register regulator %s\n",
> -			drvdata->pdata->desc->name);
> +			drvdata->desc->name);
>  		return PTR_ERR(regulator);
>  	}


  reply	other threads:[~2014-09-17 15:13 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-17 13:07 [PATCH 0/2] regulator: get voltage & duty table from dts for st-pwm Chris Zhong
2014-09-17 13:07 ` Chris Zhong
2014-09-17 13:07 ` [PATCH 1/2] regulator: st-pwm: get voltage and duty table from dts Chris Zhong
2014-09-17 15:15   ` Heiko Stübner [this message]
2014-09-17 16:51   ` Mark Brown
2014-09-17 16:54     ` Doug Anderson
2014-09-18  1:37       ` Chris Zhong
2014-09-18  3:36         ` Doug Anderson
2014-09-17 18:28   ` Doug Anderson
2014-09-17 21:26     ` Lee Jones
2014-09-17 13:08 ` [PATCH 2/2] dt-bindings: add devicetree bindings for st-pwm regulator Chris Zhong
     [not found]   ` <1410959280-29662-3-git-send-email-zyw-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2014-09-17 18:16     ` Doug Anderson
2014-09-17 18:16       ` Doug Anderson
     [not found]       ` <CAD=FV=WCQ4oU1O9JcZ9SuwWJ7g+GLsUiE=wmQQoWvL41o24eWg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-09-17 18:35         ` Mark Brown
2014-09-17 18:35           ` Mark Brown
2014-09-17 19:46         ` Mark Rutland
2014-09-17 19:46           ` Mark Rutland
2014-09-17 21:22       ` Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1589492.avvszpBkYL@diego \
    --to=heiko@sntech.de \
    --cc=broonie@kernel.org \
    --cc=cf@rock-chips.com \
    --cc=dianders@chromium.org \
    --cc=huangtao@rock-chips.com \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=zhangqing@rock-chips.com \
    --cc=zyw@rock-chips.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.