Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pwm: vt8500: Simplify using devm functions

With devm_clk_get_prepared() the call to clk_unprepare() can be dropped
from the error path and the remove callback. With devm_pwmchip_add()
pwmchip_remove() can be dropped. Then the remove callback is empty and
can go away, too. With vt8500_pwm_remove() the last user of
platform_get_drvdata() is gone and so platform_set_drvdata() can be
dropped, too.

Also use dev_err_probe() for simplified (and improved) error reporting.

Link: https://lore.kernel.org/r/20230929161918.2410424-10-u.kleine-koenig@pengutronix.de
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>

authored by

Uwe Kleine-König and committed by
Thierry Reding
dfbf9379 21c0e1aa

+9 -33
+9 -33
drivers/pwm/pwm-vt8500.c
··· 235 235 struct device_node *np = pdev->dev.of_node; 236 236 int ret; 237 237 238 - if (!np) { 239 - dev_err(&pdev->dev, "invalid devicetree node\n"); 240 - return -EINVAL; 241 - } 238 + if (!np) 239 + return dev_err_probe(&pdev->dev, -EINVAL, "invalid devicetree node\n"); 242 240 243 241 vt8500 = devm_kzalloc(&pdev->dev, sizeof(*vt8500), GFP_KERNEL); 244 242 if (vt8500 == NULL) ··· 246 248 vt8500->chip.ops = &vt8500_pwm_ops; 247 249 vt8500->chip.npwm = VT8500_NR_PWMS; 248 250 249 - vt8500->clk = devm_clk_get(&pdev->dev, NULL); 250 - if (IS_ERR(vt8500->clk)) { 251 - dev_err(&pdev->dev, "clock source not specified\n"); 252 - return PTR_ERR(vt8500->clk); 253 - } 251 + vt8500->clk = devm_clk_get_prepared(&pdev->dev, NULL); 252 + if (IS_ERR(vt8500->clk)) 253 + return dev_err_probe(&pdev->dev, PTR_ERR(vt8500->clk), "clock source not specified\n"); 254 254 255 255 vt8500->base = devm_platform_ioremap_resource(pdev, 0); 256 256 if (IS_ERR(vt8500->base)) 257 257 return PTR_ERR(vt8500->base); 258 258 259 - ret = clk_prepare(vt8500->clk); 260 - if (ret < 0) { 261 - dev_err(&pdev->dev, "failed to prepare clock\n"); 262 - return ret; 263 - } 259 + ret = devm_pwmchip_add(&pdev->dev, &vt8500->chip); 260 + if (ret < 0) 261 + return dev_err_probe(&pdev->dev, ret, "failed to add PWM chip\n"); 264 262 265 - ret = pwmchip_add(&vt8500->chip); 266 - if (ret < 0) { 267 - dev_err(&pdev->dev, "failed to add PWM chip\n"); 268 - clk_unprepare(vt8500->clk); 269 - return ret; 270 - } 271 - 272 - platform_set_drvdata(pdev, vt8500); 273 - return ret; 274 - } 275 - 276 - static void vt8500_pwm_remove(struct platform_device *pdev) 277 - { 278 - struct vt8500_chip *vt8500 = platform_get_drvdata(pdev); 279 - 280 - pwmchip_remove(&vt8500->chip); 281 - 282 - clk_unprepare(vt8500->clk); 263 + return 0; 283 264 } 284 265 285 266 static struct platform_driver vt8500_pwm_driver = { 286 267 .probe = vt8500_pwm_probe, 287 - .remove_new = vt8500_pwm_remove, 288 268 .driver = { 289 269 .name = "vt8500-pwm", 290 270 .of_match_table = vt8500_pwm_dt_ids,