[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