aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlessandro Zummo <a.zummo@towertech.it>2009-01-06 17:42:15 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-06 18:59:24 -0500
commit0417ce2ad81f719c72e948705134c3d502300d4f (patch)
treece1b5aea60a41cb59d84c7021cfaf87992811106
parentdc9443688e76733e43eebe8d6f31cc6dc34ccda9 (diff)
rtc: pxa27x/pxa3xx driver fixes, revised
Small fixes for the pxa27x/pxa3xx driver - use platform_driver_probe - fixed exit paths - fixed probe sequence - added missing include - using linux/io.h instead of asm/io.h Signed-off-by: Alessandro Zummo <a.zummo@towertech.it> Tested-by: Robert Jarzmik <robert.jarzmik@free.fr> Cc: Jonathan Cameron <jic23@cam.ac.uk> Cc: David Brownell <david-b@pacbell.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/rtc/rtc-pxa.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/drivers/rtc/rtc-pxa.c b/drivers/rtc/rtc-pxa.c
index 074f356fd049..cc7eb8767b82 100644
--- a/drivers/rtc/rtc-pxa.c
+++ b/drivers/rtc/rtc-pxa.c
@@ -19,13 +19,13 @@
19 * 19 *
20 */ 20 */
21 21
22#include <linux/init.h>
22#include <linux/platform_device.h> 23#include <linux/platform_device.h>
23#include <linux/module.h> 24#include <linux/module.h>
24#include <linux/rtc.h> 25#include <linux/rtc.h>
25#include <linux/seq_file.h> 26#include <linux/seq_file.h>
26#include <linux/interrupt.h> 27#include <linux/interrupt.h>
27 28#include <linux/io.h>
28#include <asm/io.h>
29 29
30#define TIMER_FREQ CLOCK_TICK_RATE 30#define TIMER_FREQ CLOCK_TICK_RATE
31#define RTC_DEF_DIVIDER (32768 - 1) 31#define RTC_DEF_DIVIDER (32768 - 1)
@@ -347,17 +347,19 @@ static const struct rtc_class_ops pxa_rtc_ops = {
347 .irq_set_freq = pxa_periodic_irq_set_freq, 347 .irq_set_freq = pxa_periodic_irq_set_freq,
348}; 348};
349 349
350static int __devinit pxa_rtc_probe(struct platform_device *pdev) 350static int __init pxa_rtc_probe(struct platform_device *pdev)
351{ 351{
352 struct device *dev = &pdev->dev; 352 struct device *dev = &pdev->dev;
353 struct pxa_rtc *pxa_rtc; 353 struct pxa_rtc *pxa_rtc;
354 int ret; 354 int ret;
355 u32 rttr; 355 u32 rttr;
356 356
357 ret = -ENOMEM;
358 pxa_rtc = kzalloc(sizeof(struct pxa_rtc), GFP_KERNEL); 357 pxa_rtc = kzalloc(sizeof(struct pxa_rtc), GFP_KERNEL);
359 if (!pxa_rtc) 358 if (!pxa_rtc)
360 goto err_alloc; 359 return -ENOMEM;
360
361 spin_lock_init(&pxa_rtc->lock);
362 platform_set_drvdata(pdev, pxa_rtc);
361 363
362 ret = -ENXIO; 364 ret = -ENXIO;
363 pxa_rtc->ress = platform_get_resource(pdev, IORESOURCE_MEM, 0); 365 pxa_rtc->ress = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -377,20 +379,9 @@ static int __devinit pxa_rtc_probe(struct platform_device *pdev)
377 goto err_ress; 379 goto err_ress;
378 } 380 }
379 381
380 pxa_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, &pxa_rtc_ops,
381 THIS_MODULE);
382 ret = PTR_ERR(pxa_rtc->rtc);
383 if (IS_ERR(pxa_rtc->rtc)) {
384 dev_err(dev, "Failed to register RTC device -> %d\n", ret);
385 goto err_rtc_reg;
386 }
387
388 spin_lock_init(&pxa_rtc->lock);
389 platform_set_drvdata(pdev, pxa_rtc);
390
391 ret = -ENOMEM; 382 ret = -ENOMEM;
392 pxa_rtc->base = ioremap(pxa_rtc->ress->start, 383 pxa_rtc->base = ioremap(pxa_rtc->ress->start,
393 pxa_rtc->ress->end - pxa_rtc->ress->start + 1); 384 resource_size(pxa_rtc->ress));
394 if (!pxa_rtc->base) { 385 if (!pxa_rtc->base) {
395 dev_err(&pdev->dev, "Unable to map pxa RTC I/O memory\n"); 386 dev_err(&pdev->dev, "Unable to map pxa RTC I/O memory\n");
396 goto err_map; 387 goto err_map;
@@ -408,31 +399,37 @@ static int __devinit pxa_rtc_probe(struct platform_device *pdev)
408 } 399 }
409 400
410 rtsr_clear_bits(pxa_rtc, RTSR_PIALE | RTSR_RDALE1 | RTSR_HZE); 401 rtsr_clear_bits(pxa_rtc, RTSR_PIALE | RTSR_RDALE1 | RTSR_HZE);
402
403 pxa_rtc->rtc = rtc_device_register("pxa-rtc", &pdev->dev, &pxa_rtc_ops,
404 THIS_MODULE);
405 ret = PTR_ERR(pxa_rtc->rtc);
406 if (IS_ERR(pxa_rtc->rtc)) {
407 dev_err(dev, "Failed to register RTC device -> %d\n", ret);
408 goto err_rtc_reg;
409 }
410
411 device_init_wakeup(dev, 1); 411 device_init_wakeup(dev, 1);
412 412
413 return 0; 413 return 0;
414 414
415err_map:
416 platform_set_drvdata(pdev, NULL);
417 rtc_device_unregister(pxa_rtc->rtc);
418err_rtc_reg: 415err_rtc_reg:
416 iounmap(pxa_rtc->base);
419err_ress: 417err_ress:
418err_map:
420 kfree(pxa_rtc); 419 kfree(pxa_rtc);
421err_alloc:
422 return ret; 420 return ret;
423} 421}
424 422
425static int __devexit pxa_rtc_remove(struct platform_device *pdev) 423static int __exit pxa_rtc_remove(struct platform_device *pdev)
426{ 424{
427 struct pxa_rtc *pxa_rtc = platform_get_drvdata(pdev); 425 struct pxa_rtc *pxa_rtc = platform_get_drvdata(pdev);
428 426
427 rtc_device_unregister(pxa_rtc->rtc);
428
429 spin_lock_irq(&pxa_rtc->lock); 429 spin_lock_irq(&pxa_rtc->lock);
430 iounmap(pxa_rtc->base); 430 iounmap(pxa_rtc->base);
431 pxa_rtc->base = NULL;
432 platform_set_drvdata(pdev, NULL);
433 spin_unlock_irq(&pxa_rtc->lock); 431 spin_unlock_irq(&pxa_rtc->lock);
434 432
435 rtc_device_unregister(pxa_rtc->rtc);
436 kfree(pxa_rtc); 433 kfree(pxa_rtc);
437 434
438 return 0; 435 return 0;
@@ -462,7 +459,6 @@ static int pxa_rtc_resume(struct platform_device *pdev)
462#endif 459#endif
463 460
464static struct platform_driver pxa_rtc_driver = { 461static struct platform_driver pxa_rtc_driver = {
465 .probe = pxa_rtc_probe,
466 .remove = __exit_p(pxa_rtc_remove), 462 .remove = __exit_p(pxa_rtc_remove),
467 .suspend = pxa_rtc_suspend, 463 .suspend = pxa_rtc_suspend,
468 .resume = pxa_rtc_resume, 464 .resume = pxa_rtc_resume,
@@ -474,7 +470,7 @@ static struct platform_driver pxa_rtc_driver = {
474static int __init pxa_rtc_init(void) 470static int __init pxa_rtc_init(void)
475{ 471{
476 if (cpu_is_pxa27x() || cpu_is_pxa3xx()) 472 if (cpu_is_pxa27x() || cpu_is_pxa3xx())
477 return platform_driver_register(&pxa_rtc_driver); 473 return platform_driver_probe(&pxa_rtc_driver, pxa_rtc_probe);
478 474
479 return -ENODEV; 475 return -ENODEV;
480} 476}