[PATCH v4 089/115] pwm: sifive: Make use of devm_pwmchip_alloc() function

Emil Renner Berthing emil.renner.berthing at canonical.com
Fri Dec 8 01:30:41 PST 2023


Uwe Kleine-König wrote:
> This prepares the pwm-sifive driver to further changes of the pwm core
> outlined in the commit introducing devm_pwmchip_alloc(). There is no
> intended semantical change and the driver should behave as before.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
> ---
>  drivers/pwm/pwm-sifive.c | 28 ++++++++++++++--------------
>  1 file changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/pwm/pwm-sifive.c b/drivers/pwm/pwm-sifive.c
> index c1b412905d9e..cf3fcffe7b3a 100644
> --- a/drivers/pwm/pwm-sifive.c
> +++ b/drivers/pwm/pwm-sifive.c
> @@ -41,7 +41,7 @@
>  #define PWM_SIFIVE_DEFAULT_PERIOD	10000000
>
>  struct pwm_sifive_ddata {
> -	struct pwm_chip	chip;
> +	struct pwm_chip *chip;

In patch 43 you do ddata = (void *)chip + sizeof(*chip). Shouldn't we
be able to get
the chip pointer from ddata using chip = (void *)ddata - sizeof(*chip)?

>  	struct mutex lock; /* lock to protect user_count and approx_period */
>  	struct notifier_block notifier;
>  	struct clk *clk;
> @@ -54,7 +54,7 @@ struct pwm_sifive_ddata {
>  static inline
>  struct pwm_sifive_ddata *pwm_sifive_chip_to_ddata(struct pwm_chip *chip)
>  {
> -	return container_of(chip, struct pwm_sifive_ddata, chip);
> +	return pwmchip_get_drvdata(chip);
>  }
>
>  static int pwm_sifive_request(struct pwm_chip *chip, struct pwm_device *pwm)
> @@ -102,7 +102,7 @@ static void pwm_sifive_update_clock(struct pwm_sifive_ddata *ddata,
>  	/* As scale <= 15 the shift operation cannot overflow. */
>  	num = (unsigned long long)NSEC_PER_SEC << (PWM_SIFIVE_CMPWIDTH + scale);
>  	ddata->real_period = div64_ul(num, rate);
> -	dev_dbg(pwmchip_parent(&ddata->chip),
> +	dev_dbg(pwmchip_parent(ddata->chip),
>  		"New real_period = %u ns\n", ddata->real_period);
>  }
>
> @@ -230,15 +230,14 @@ static int pwm_sifive_probe(struct platform_device *pdev)
>  	u32 val;
>  	unsigned int enabled_pwms = 0, enabled_clks = 1;
>
> -	ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
> -	if (!ddata)
> -		return -ENOMEM;
> +	chip = devm_pwmchip_alloc(dev, 4, sizeof(*ddata));
> +	if (IS_ERR(chip))
> +		return PTR_ERR(chip);
> +	ddata = pwm_sifive_chip_to_ddata(chip);
> +	ddata->chip = chip;
>
>  	mutex_init(&ddata->lock);
> -	chip = &ddata->chip;
> -	chip->dev = dev;
>  	chip->ops = &pwm_sifive_ops;
> -	chip->npwm = 4;
>
>  	ddata->regs = devm_platform_ioremap_resource(pdev, 0);
>  	if (IS_ERR(ddata->regs))
> @@ -296,7 +295,7 @@ static int pwm_sifive_probe(struct platform_device *pdev)
>  		goto unregister_clk;
>  	}
>
> -	platform_set_drvdata(pdev, ddata);
> +	platform_set_drvdata(pdev, chip);
>  	dev_dbg(dev, "SiFive PWM chip registered %d PWMs\n", chip->npwm);
>
>  	return 0;
> @@ -314,15 +313,16 @@ static int pwm_sifive_probe(struct platform_device *pdev)
>
>  static void pwm_sifive_remove(struct platform_device *dev)
>  {
> -	struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev);
> +	struct pwm_chip *chip = platform_get_drvdata(dev);
> +	struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
>  	struct pwm_device *pwm;
>  	int ch;
>
> -	pwmchip_remove(&ddata->chip);
> +	pwmchip_remove(chip);
>  	clk_notifier_unregister(ddata->clk, &ddata->notifier);
>
> -	for (ch = 0; ch < ddata->chip.npwm; ch++) {
> -		pwm = &ddata->chip.pwms[ch];
> +	for (ch = 0; ch < chip->npwm; ch++) {
> +		pwm = &chip->pwms[ch];
>  		if (pwm->state.enabled)
>  			clk_disable(ddata->clk);
>  	}
> --
> 2.42.0
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv



More information about the linux-riscv mailing list