aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hartleys@visionengravers.com>2013-05-24 19:21:01 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-05-30 08:54:00 -0400
commit6c7dd64abdd0d07bab3c1cc4327dc328cb70005a (patch)
tree00cfa2f8718ab0645aeddc6fa698bf4e9b9c512f
parent01fe7b43e7c83fe8fbf0b30b47f4ccd2f2058682 (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.c73
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
329fail_no_clk:
330 sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files);
331fail_no_sysfs:
332 iounmap(pwm->mmio_base);
333fail_no_ioremap:
334 release_mem_region(res->start, resource_size(res));
335fail_no_mem_resource:
336 kfree(pwm);
337fail_no_mem:
338 ep93xx_pwm_release_gpio(pdev);
339 return err;
340} 312}
341 313
342static int __exit ep93xx_pwm_remove(struct platform_device *pdev) 314static 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;