diff options
Diffstat (limited to 'drivers/rtc/rtc-at91rm9200.c')
-rw-r--r-- | drivers/rtc/rtc-at91rm9200.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index 434ebc3a99dc..0eab77b22340 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/ioctl.h> | 28 | #include <linux/ioctl.h> |
29 | #include <linux/completion.h> | 29 | #include <linux/completion.h> |
30 | #include <linux/io.h> | 30 | #include <linux/io.h> |
31 | #include <linux/of.h> | ||
32 | #include <linux/of_device.h> | ||
31 | 33 | ||
32 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
33 | 35 | ||
@@ -297,7 +299,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
297 | "at91_rtc", pdev); | 299 | "at91_rtc", pdev); |
298 | if (ret) { | 300 | if (ret) { |
299 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); | 301 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); |
300 | return ret; | 302 | goto err_unmap; |
301 | } | 303 | } |
302 | 304 | ||
303 | /* cpu init code should really have flagged this device as | 305 | /* cpu init code should really have flagged this device as |
@@ -309,13 +311,20 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
309 | rtc = rtc_device_register(pdev->name, &pdev->dev, | 311 | rtc = rtc_device_register(pdev->name, &pdev->dev, |
310 | &at91_rtc_ops, THIS_MODULE); | 312 | &at91_rtc_ops, THIS_MODULE); |
311 | if (IS_ERR(rtc)) { | 313 | if (IS_ERR(rtc)) { |
312 | free_irq(irq, pdev); | 314 | ret = PTR_ERR(rtc); |
313 | return PTR_ERR(rtc); | 315 | goto err_free_irq; |
314 | } | 316 | } |
315 | platform_set_drvdata(pdev, rtc); | 317 | platform_set_drvdata(pdev, rtc); |
316 | 318 | ||
317 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); | 319 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); |
318 | return 0; | 320 | return 0; |
321 | |||
322 | err_free_irq: | ||
323 | free_irq(irq, pdev); | ||
324 | err_unmap: | ||
325 | iounmap(at91_rtc_regs); | ||
326 | |||
327 | return ret; | ||
319 | } | 328 | } |
320 | 329 | ||
321 | /* | 330 | /* |
@@ -332,12 +341,13 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) | |||
332 | free_irq(irq, pdev); | 341 | free_irq(irq, pdev); |
333 | 342 | ||
334 | rtc_device_unregister(rtc); | 343 | rtc_device_unregister(rtc); |
344 | iounmap(at91_rtc_regs); | ||
335 | platform_set_drvdata(pdev, NULL); | 345 | platform_set_drvdata(pdev, NULL); |
336 | 346 | ||
337 | return 0; | 347 | return 0; |
338 | } | 348 | } |
339 | 349 | ||
340 | #ifdef CONFIG_PM | 350 | #ifdef CONFIG_PM_SLEEP |
341 | 351 | ||
342 | /* AT91RM9200 RTC Power management control */ | 352 | /* AT91RM9200 RTC Power management control */ |
343 | 353 | ||
@@ -369,39 +379,27 @@ static int at91_rtc_resume(struct device *dev) | |||
369 | } | 379 | } |
370 | return 0; | 380 | return 0; |
371 | } | 381 | } |
382 | #endif | ||
372 | 383 | ||
373 | static const struct dev_pm_ops at91_rtc_pm = { | 384 | static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); |
374 | .suspend = at91_rtc_suspend, | ||
375 | .resume = at91_rtc_resume, | ||
376 | }; | ||
377 | |||
378 | #define at91_rtc_pm_ptr &at91_rtc_pm | ||
379 | 385 | ||
380 | #else | 386 | static const struct of_device_id at91_rtc_dt_ids[] = { |
381 | #define at91_rtc_pm_ptr NULL | 387 | { .compatible = "atmel,at91rm9200-rtc" }, |
382 | #endif | 388 | { /* sentinel */ } |
389 | }; | ||
390 | MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids); | ||
383 | 391 | ||
384 | static struct platform_driver at91_rtc_driver = { | 392 | static struct platform_driver at91_rtc_driver = { |
385 | .remove = __exit_p(at91_rtc_remove), | 393 | .remove = __exit_p(at91_rtc_remove), |
386 | .driver = { | 394 | .driver = { |
387 | .name = "at91_rtc", | 395 | .name = "at91_rtc", |
388 | .owner = THIS_MODULE, | 396 | .owner = THIS_MODULE, |
389 | .pm = at91_rtc_pm_ptr, | 397 | .pm = &at91_rtc_pm_ops, |
398 | .of_match_table = of_match_ptr(at91_rtc_dt_ids), | ||
390 | }, | 399 | }, |
391 | }; | 400 | }; |
392 | 401 | ||
393 | static int __init at91_rtc_init(void) | 402 | module_platform_driver_probe(at91_rtc_driver, at91_rtc_probe); |
394 | { | ||
395 | return platform_driver_probe(&at91_rtc_driver, at91_rtc_probe); | ||
396 | } | ||
397 | |||
398 | static void __exit at91_rtc_exit(void) | ||
399 | { | ||
400 | platform_driver_unregister(&at91_rtc_driver); | ||
401 | } | ||
402 | |||
403 | module_init(at91_rtc_init); | ||
404 | module_exit(at91_rtc_exit); | ||
405 | 403 | ||
406 | MODULE_AUTHOR("Rick Bronson"); | 404 | MODULE_AUTHOR("Rick Bronson"); |
407 | MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200"); | 405 | MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200"); |