diff options
author | H Hartley Sweeten <hartleys@visionengravers.com> | 2013-05-24 19:21:01 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-05-30 08:54:00 -0400 |
commit | 6c7dd64abdd0d07bab3c1cc4327dc328cb70005a (patch) | |
tree | 00cfa2f8718ab0645aeddc6fa698bf4e9b9c512f | |
parent | 01fe7b43e7c83fe8fbf0b30b47f4ccd2f2058682 (diff) |
misc/ep93xx_pwm: use managed device resources
Use managed device resources to clean up the probe/remove.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Ryan Mallon <rmallon@gmail.com>
Cc: Matthieu Crapet <mcrapet@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/misc/ep93xx_pwm.c | 73 |
1 files changed, 20 insertions, 53 deletions
diff --git a/drivers/misc/ep93xx_pwm.c b/drivers/misc/ep93xx_pwm.c index 9ba93f0fe1df..36370b429bc7 100644 --- a/drivers/misc/ep93xx_pwm.c +++ b/drivers/misc/ep93xx_pwm.c | |||
@@ -273,50 +273,33 @@ static int __init ep93xx_pwm_probe(struct platform_device *pdev) | |||
273 | { | 273 | { |
274 | struct ep93xx_pwm *pwm; | 274 | struct ep93xx_pwm *pwm; |
275 | struct resource *res; | 275 | struct resource *res; |
276 | int err; | 276 | int ret; |
277 | 277 | ||
278 | err = ep93xx_pwm_acquire_gpio(pdev); | 278 | pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL); |
279 | if (err) | 279 | if (!pwm) |
280 | return err; | 280 | return -ENOMEM; |
281 | 281 | ||
282 | pwm = kzalloc(sizeof(struct ep93xx_pwm), GFP_KERNEL); | 282 | pwm->clk = devm_clk_get(&pdev->dev, "pwm_clk"); |
283 | if (!pwm) { | 283 | if (IS_ERR(pwm->clk)) |
284 | err = -ENOMEM; | 284 | return PTR_ERR(pwm->clk); |
285 | goto fail_no_mem; | ||
286 | } | ||
287 | 285 | ||
288 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 286 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
289 | if (res == NULL) { | 287 | pwm->mmio_base = devm_ioremap_resource(&pdev->dev, res); |
290 | err = -ENXIO; | 288 | if (IS_ERR(pwm->mmio_base)) |
291 | goto fail_no_mem_resource; | 289 | return PTR_ERR(pwm->mmio_base); |
292 | } | 290 | |
293 | 291 | ret = ep93xx_pwm_acquire_gpio(pdev); | |
294 | res = request_mem_region(res->start, resource_size(res), pdev->name); | 292 | if (ret) |
295 | if (res == NULL) { | 293 | return ret; |
296 | err = -EBUSY; | 294 | |
297 | goto fail_no_mem_resource; | 295 | ret = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); |
298 | } | 296 | if (ret) { |
299 | 297 | ep93xx_pwm_release_gpio(pdev); | |
300 | pwm->mmio_base = ioremap(res->start, resource_size(res)); | 298 | return ret; |
301 | if (pwm->mmio_base == NULL) { | ||
302 | err = -ENXIO; | ||
303 | goto fail_no_ioremap; | ||
304 | } | ||
305 | |||
306 | err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); | ||
307 | if (err) | ||
308 | goto fail_no_sysfs; | ||
309 | |||
310 | pwm->clk = clk_get(&pdev->dev, "pwm_clk"); | ||
311 | if (IS_ERR(pwm->clk)) { | ||
312 | err = PTR_ERR(pwm->clk); | ||
313 | goto fail_no_clk; | ||
314 | } | 299 | } |
315 | 300 | ||
316 | pwm->duty_percent = 50; | 301 | pwm->duty_percent = 50; |
317 | 302 | ||
318 | platform_set_drvdata(pdev, pwm); | ||
319 | |||
320 | /* disable pwm at startup. Avoids zero value. */ | 303 | /* disable pwm at startup. Avoids zero value. */ |
321 | ep93xx_pwm_disable(pwm); | 304 | ep93xx_pwm_disable(pwm); |
322 | ep93xx_pwm_write_tc(pwm, EP93XX_PWM_MAX_COUNT); | 305 | ep93xx_pwm_write_tc(pwm, EP93XX_PWM_MAX_COUNT); |
@@ -324,33 +307,17 @@ static int __init ep93xx_pwm_probe(struct platform_device *pdev) | |||
324 | 307 | ||
325 | clk_enable(pwm->clk); | 308 | clk_enable(pwm->clk); |
326 | 309 | ||
310 | platform_set_drvdata(pdev, pwm); | ||
327 | return 0; | 311 | return 0; |
328 | |||
329 | fail_no_clk: | ||
330 | sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); | ||
331 | fail_no_sysfs: | ||
332 | iounmap(pwm->mmio_base); | ||
333 | fail_no_ioremap: | ||
334 | release_mem_region(res->start, resource_size(res)); | ||
335 | fail_no_mem_resource: | ||
336 | kfree(pwm); | ||
337 | fail_no_mem: | ||
338 | ep93xx_pwm_release_gpio(pdev); | ||
339 | return err; | ||
340 | } | 312 | } |
341 | 313 | ||
342 | static int __exit ep93xx_pwm_remove(struct platform_device *pdev) | 314 | static int __exit ep93xx_pwm_remove(struct platform_device *pdev) |
343 | { | 315 | { |
344 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); | 316 | struct ep93xx_pwm *pwm = platform_get_drvdata(pdev); |
345 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
346 | 317 | ||
347 | ep93xx_pwm_disable(pwm); | 318 | ep93xx_pwm_disable(pwm); |
348 | clk_disable(pwm->clk); | 319 | clk_disable(pwm->clk); |
349 | clk_put(pwm->clk); | ||
350 | sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); | 320 | sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files); |
351 | iounmap(pwm->mmio_base); | ||
352 | release_mem_region(res->start, resource_size(res)); | ||
353 | kfree(pwm); | ||
354 | ep93xx_pwm_release_gpio(pdev); | 321 | ep93xx_pwm_release_gpio(pdev); |
355 | 322 | ||
356 | return 0; | 323 | return 0; |