mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 12:34:41 +08:00
pwm: sti: Simplify probe function using devm functions
[ Upstream commit5bb0b194ae
] 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:378fe115d1
("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>
This commit is contained in:
parent
1370b265cd
commit
822c8bb7b9
@ -625,32 +625,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;
|
||||
@ -667,27 +655,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[] = {
|
||||
@ -702,7 +670,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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user