Message ID | 682cbbafbfc4982383d66c3871bb9e52d4e03195.1707900770.git.u.kleine-koenig@pengutronix.de |
---|---|
State | Accepted |
Headers | show |
Series | pwm: Improve lifetime tracking for pwm_chips | expand |
On Wed, 14 Feb 2024 at 17:34, Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote: > > To be able to convert the sprd driver to pwmchip_alloc() the number of > PWM channels must be known when the driver private data is allocated. So > make sprd_pwm_clk_init() not take a struct sprd_pwm_chip. On the plus > side this allows to drop a member of said driver private data. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Reviewed-by: Chunyan Zhang <zhang.lyra@gmail.com> > --- > drivers/pwm/pwm-sprd.c | 37 ++++++++++++++++++------------------- > 1 file changed, 18 insertions(+), 19 deletions(-) > > diff --git a/drivers/pwm/pwm-sprd.c b/drivers/pwm/pwm-sprd.c > index 77939e161006..2e87666ad2b9 100644 > --- a/drivers/pwm/pwm-sprd.c > +++ b/drivers/pwm/pwm-sprd.c > @@ -36,7 +36,6 @@ struct sprd_pwm_chip { > void __iomem *base; > struct device *dev; > struct pwm_chip chip; > - int num_pwms; > struct sprd_pwm_chn chn[SPRD_PWM_CHN_NUM]; > }; > > @@ -215,45 +214,48 @@ static const struct pwm_ops sprd_pwm_ops = { > .get_state = sprd_pwm_get_state, > }; > > -static int sprd_pwm_clk_init(struct sprd_pwm_chip *spc) > +static int sprd_pwm_clk_init(struct device *dev, > + struct sprd_pwm_chn chn[SPRD_PWM_CHN_NUM]) > { > struct clk *clk_pwm; > int ret, i; > > for (i = 0; i < SPRD_PWM_CHN_NUM; i++) { > - struct sprd_pwm_chn *chn = &spc->chn[i]; > int j; > > for (j = 0; j < SPRD_PWM_CHN_CLKS_NUM; ++j) > - chn->clks[j].id = > + chn[i].clks[j].id = > sprd_pwm_clks[i * SPRD_PWM_CHN_CLKS_NUM + j]; > > - ret = devm_clk_bulk_get(spc->dev, SPRD_PWM_CHN_CLKS_NUM, > - chn->clks); > + ret = devm_clk_bulk_get(dev, SPRD_PWM_CHN_CLKS_NUM, > + chn[i].clks); > if (ret) { > if (ret == -ENOENT) > break; > > - return dev_err_probe(spc->dev, ret, > + return dev_err_probe(dev, ret, > "failed to get channel clocks\n"); > } > > - clk_pwm = chn->clks[SPRD_PWM_CHN_OUTPUT_CLK].clk; > - chn->clk_rate = clk_get_rate(clk_pwm); > + clk_pwm = chn[i].clks[SPRD_PWM_CHN_OUTPUT_CLK].clk; > + chn[i].clk_rate = clk_get_rate(clk_pwm); > } > > if (!i) > - return dev_err_probe(spc->dev, -ENODEV, "no available PWM channels\n"); > + return dev_err_probe(dev, -ENODEV, "no available PWM channels\n"); > > - spc->num_pwms = i; > - > - return 0; > + return i; > } > > static int sprd_pwm_probe(struct platform_device *pdev) > { > struct sprd_pwm_chip *spc; > - int ret; > + struct sprd_pwm_chn chn[SPRD_PWM_CHN_NUM]; > + int ret, npwm; > + > + npwm = sprd_pwm_clk_init(&pdev->dev, chn); > + if (npwm < 0) > + return npwm; > > spc = devm_kzalloc(&pdev->dev, sizeof(*spc), GFP_KERNEL); > if (!spc) > @@ -264,14 +266,11 @@ static int sprd_pwm_probe(struct platform_device *pdev) > return PTR_ERR(spc->base); > > spc->dev = &pdev->dev; > - > - ret = sprd_pwm_clk_init(spc); > - if (ret) > - return ret; > + memcpy(spc->chn, chn, sizeof(chn)); > > spc->chip.dev = &pdev->dev; > spc->chip.ops = &sprd_pwm_ops; > - spc->chip.npwm = spc->num_pwms; > + spc->chip.npwm = npwm; > > ret = devm_pwmchip_add(&pdev->dev, &spc->chip); > if (ret) > -- > 2.43.0 >
diff --git a/drivers/pwm/pwm-sprd.c b/drivers/pwm/pwm-sprd.c index 77939e161006..2e87666ad2b9 100644 --- a/drivers/pwm/pwm-sprd.c +++ b/drivers/pwm/pwm-sprd.c @@ -36,7 +36,6 @@ struct sprd_pwm_chip { void __iomem *base; struct device *dev; struct pwm_chip chip; - int num_pwms; struct sprd_pwm_chn chn[SPRD_PWM_CHN_NUM]; }; @@ -215,45 +214,48 @@ static const struct pwm_ops sprd_pwm_ops = { .get_state = sprd_pwm_get_state, }; -static int sprd_pwm_clk_init(struct sprd_pwm_chip *spc) +static int sprd_pwm_clk_init(struct device *dev, + struct sprd_pwm_chn chn[SPRD_PWM_CHN_NUM]) { struct clk *clk_pwm; int ret, i; for (i = 0; i < SPRD_PWM_CHN_NUM; i++) { - struct sprd_pwm_chn *chn = &spc->chn[i]; int j; for (j = 0; j < SPRD_PWM_CHN_CLKS_NUM; ++j) - chn->clks[j].id = + chn[i].clks[j].id = sprd_pwm_clks[i * SPRD_PWM_CHN_CLKS_NUM + j]; - ret = devm_clk_bulk_get(spc->dev, SPRD_PWM_CHN_CLKS_NUM, - chn->clks); + ret = devm_clk_bulk_get(dev, SPRD_PWM_CHN_CLKS_NUM, + chn[i].clks); if (ret) { if (ret == -ENOENT) break; - return dev_err_probe(spc->dev, ret, + return dev_err_probe(dev, ret, "failed to get channel clocks\n"); } - clk_pwm = chn->clks[SPRD_PWM_CHN_OUTPUT_CLK].clk; - chn->clk_rate = clk_get_rate(clk_pwm); + clk_pwm = chn[i].clks[SPRD_PWM_CHN_OUTPUT_CLK].clk; + chn[i].clk_rate = clk_get_rate(clk_pwm); } if (!i) - return dev_err_probe(spc->dev, -ENODEV, "no available PWM channels\n"); + return dev_err_probe(dev, -ENODEV, "no available PWM channels\n"); - spc->num_pwms = i; - - return 0; + return i; } static int sprd_pwm_probe(struct platform_device *pdev) { struct sprd_pwm_chip *spc; - int ret; + struct sprd_pwm_chn chn[SPRD_PWM_CHN_NUM]; + int ret, npwm; + + npwm = sprd_pwm_clk_init(&pdev->dev, chn); + if (npwm < 0) + return npwm; spc = devm_kzalloc(&pdev->dev, sizeof(*spc), GFP_KERNEL); if (!spc) @@ -264,14 +266,11 @@ static int sprd_pwm_probe(struct platform_device *pdev) return PTR_ERR(spc->base); spc->dev = &pdev->dev; - - ret = sprd_pwm_clk_init(spc); - if (ret) - return ret; + memcpy(spc->chn, chn, sizeof(chn)); spc->chip.dev = &pdev->dev; spc->chip.ops = &sprd_pwm_ops; - spc->chip.npwm = spc->num_pwms; + spc->chip.npwm = npwm; ret = devm_pwmchip_add(&pdev->dev, &spc->chip); if (ret)
To be able to convert the sprd driver to pwmchip_alloc() the number of PWM channels must be known when the driver private data is allocated. So make sprd_pwm_clk_init() not take a struct sprd_pwm_chip. On the plus side this allows to drop a member of said driver private data. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/pwm/pwm-sprd.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-)