| From df12805da7d90965cf43ff76dc6af253df45eea4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 10 Mar 2024 12:00:54 +0100 |
| Subject: pwm: sti: Simplify probe function using devm functions |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> |
| |
| [ Upstream commit 5bb0b194aeee5d5da6881232f4e9989b35957c25 ] |
| |
| Instead of of_clk_get_by_name() use devm_clk_get_prepared() which has |
| several advantages: |
| |
| - Combines getting the clock and a call to clk_prepare(). The latter |
| can be dropped from sti_pwm_probe() accordingly. |
| - Cares for calling clk_put() which is missing in both probe's error |
| path and the remove function. |
| - Cares for calling clk_unprepare() which can be dropped from the error |
| paths and the remove function. (Note that not all error path got this |
| right.) |
| |
| With additionally using devm_pwmchip_add() instead of pwmchip_add() the |
| remove callback can be dropped completely. With it the last user of |
| platform_get_drvdata() goes away and so platform_set_drvdata() can be |
| dropped from the probe function, too. |
| |
| Fixes: 378fe115d19d ("pwm: sti: Add new driver for ST's PWM IP") |
| Link: https://lore.kernel.org/r/81f0e1d173652f435afda6719adaed1922fe059a.1710068192.git.u.kleine-koenig@pengutronix.de |
| Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pwm/pwm-sti.c | 39 +++------------------------------------ |
| 1 file changed, 3 insertions(+), 36 deletions(-) |
| |
| diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c |
| index 826eb547cc96f..f3df7b1895d35 100644 |
| --- a/drivers/pwm/pwm-sti.c |
| +++ b/drivers/pwm/pwm-sti.c |
| @@ -624,32 +624,20 @@ static int sti_pwm_probe(struct platform_device *pdev) |
| return ret; |
| |
| if (cdata->pwm_num_devs) { |
| - pc->pwm_clk = of_clk_get_by_name(dev->of_node, "pwm"); |
| + pc->pwm_clk = devm_clk_get_prepared(dev, "pwm"); |
| if (IS_ERR(pc->pwm_clk)) { |
| dev_err(dev, "failed to get PWM clock\n"); |
| return PTR_ERR(pc->pwm_clk); |
| } |
| - |
| - ret = clk_prepare(pc->pwm_clk); |
| - if (ret) { |
| - dev_err(dev, "failed to prepare clock\n"); |
| - return ret; |
| - } |
| } |
| |
| if (cdata->cpt_num_devs) { |
| - pc->cpt_clk = of_clk_get_by_name(dev->of_node, "capture"); |
| + pc->cpt_clk = devm_clk_get_prepared(dev, "capture"); |
| if (IS_ERR(pc->cpt_clk)) { |
| dev_err(dev, "failed to get PWM capture clock\n"); |
| return PTR_ERR(pc->cpt_clk); |
| } |
| |
| - ret = clk_prepare(pc->cpt_clk); |
| - if (ret) { |
| - dev_err(dev, "failed to prepare clock\n"); |
| - return ret; |
| - } |
| - |
| cdata->ddata = devm_kzalloc(dev, cdata->cpt_num_devs * sizeof(*cdata->ddata), GFP_KERNEL); |
| if (!cdata->ddata) |
| return -ENOMEM; |
| @@ -666,27 +654,7 @@ static int sti_pwm_probe(struct platform_device *pdev) |
| mutex_init(&ddata->lock); |
| } |
| |
| - ret = pwmchip_add(chip); |
| - if (ret < 0) { |
| - clk_unprepare(pc->pwm_clk); |
| - clk_unprepare(pc->cpt_clk); |
| - return ret; |
| - } |
| - |
| - platform_set_drvdata(pdev, chip); |
| - |
| - return 0; |
| -} |
| - |
| -static void sti_pwm_remove(struct platform_device *pdev) |
| -{ |
| - struct pwm_chip *chip = platform_get_drvdata(pdev); |
| - struct sti_pwm_chip *pc = to_sti_pwmchip(chip); |
| - |
| - pwmchip_remove(chip); |
| - |
| - clk_unprepare(pc->pwm_clk); |
| - clk_unprepare(pc->cpt_clk); |
| + return devm_pwmchip_add(dev, chip); |
| } |
| |
| static const struct of_device_id sti_pwm_of_match[] = { |
| @@ -701,7 +669,6 @@ static struct platform_driver sti_pwm_driver = { |
| .of_match_table = sti_pwm_of_match, |
| }, |
| .probe = sti_pwm_probe, |
| - .remove_new = sti_pwm_remove, |
| }; |
| module_platform_driver(sti_pwm_driver); |
| |
| -- |
| 2.43.0 |
| |