diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/Kconfig | 7 | ||||
| -rw-r--r-- | drivers/rtc/rtc-omap.c | 47 |
2 files changed, 30 insertions, 24 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 564f3d173b1..9930d79fa51 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -597,10 +597,11 @@ comment "on-CPU RTC drivers" | |||
| 597 | 597 | ||
| 598 | config RTC_DRV_OMAP | 598 | config RTC_DRV_OMAP |
| 599 | tristate "TI OMAP1" | 599 | tristate "TI OMAP1" |
| 600 | depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 | 600 | depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_DAVINCI_DA8XX |
| 601 | help | 601 | help |
| 602 | Say "yes" here to support the real time clock on TI OMAP1 chips. | 602 | Say "yes" here to support the real time clock on TI OMAP1 and |
| 603 | This driver can also be built as a module called rtc-omap. | 603 | DA8xx/OMAP-L13x chips. This driver can also be built as a |
| 604 | module called rtc-omap. | ||
| 604 | 605 | ||
| 605 | config RTC_DRV_S3C | 606 | config RTC_DRV_S3C |
| 606 | tristate "Samsung S3C series SoC RTC" | 607 | tristate "Samsung S3C series SoC RTC" |
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 0587d53987f..64d9727b722 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
| @@ -87,9 +87,10 @@ | |||
| 87 | #define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3) | 87 | #define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3) |
| 88 | #define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) | 88 | #define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) |
| 89 | 89 | ||
| 90 | static void __iomem *rtc_base; | ||
| 90 | 91 | ||
| 91 | #define rtc_read(addr) omap_readb(OMAP_RTC_BASE + (addr)) | 92 | #define rtc_read(addr) __raw_readb(rtc_base + (addr)) |
| 92 | #define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr)) | 93 | #define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr)) |
| 93 | 94 | ||
| 94 | 95 | ||
| 95 | /* we rely on the rtc framework to handle locking (rtc->ops_lock), | 96 | /* we rely on the rtc framework to handle locking (rtc->ops_lock), |
| @@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct platform_device *pdev) | |||
| 330 | return -ENOENT; | 331 | return -ENOENT; |
| 331 | } | 332 | } |
| 332 | 333 | ||
| 333 | /* NOTE: using static mapping for RTC registers */ | ||
| 334 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 334 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 335 | if (res && res->start != OMAP_RTC_BASE) { | 335 | if (!res) { |
| 336 | pr_debug("%s: RTC registers at %08x, expected %08x\n", | 336 | pr_debug("%s: RTC resource data missing\n", pdev->name); |
| 337 | pdev->name, (unsigned) res->start, OMAP_RTC_BASE); | ||
| 338 | return -ENOENT; | 337 | return -ENOENT; |
| 339 | } | 338 | } |
| 340 | 339 | ||
| 341 | if (res) | 340 | mem = request_mem_region(res->start, resource_size(res), pdev->name); |
| 342 | mem = request_mem_region(res->start, | ||
| 343 | res->end - res->start + 1, | ||
| 344 | pdev->name); | ||
| 345 | else | ||
| 346 | mem = NULL; | ||
| 347 | if (!mem) { | 341 | if (!mem) { |
| 348 | pr_debug("%s: RTC registers at %08x are not free\n", | 342 | pr_debug("%s: RTC registers at %08x are not free\n", |
| 349 | pdev->name, OMAP_RTC_BASE); | 343 | pdev->name, res->start); |
| 350 | return -EBUSY; | 344 | return -EBUSY; |
| 351 | } | 345 | } |
| 352 | 346 | ||
| 347 | rtc_base = ioremap(res->start, resource_size(res)); | ||
| 348 | if (!rtc_base) { | ||
| 349 | pr_debug("%s: RTC registers can't be mapped\n", pdev->name); | ||
| 350 | goto fail; | ||
| 351 | } | ||
| 352 | |||
| 353 | rtc = rtc_device_register(pdev->name, &pdev->dev, | 353 | rtc = rtc_device_register(pdev->name, &pdev->dev, |
| 354 | &omap_rtc_ops, THIS_MODULE); | 354 | &omap_rtc_ops, THIS_MODULE); |
| 355 | if (IS_ERR(rtc)) { | 355 | if (IS_ERR(rtc)) { |
| 356 | pr_debug("%s: can't register RTC device, err %ld\n", | 356 | pr_debug("%s: can't register RTC device, err %ld\n", |
| 357 | pdev->name, PTR_ERR(rtc)); | 357 | pdev->name, PTR_ERR(rtc)); |
| 358 | goto fail; | 358 | goto fail0; |
| 359 | } | 359 | } |
| 360 | platform_set_drvdata(pdev, rtc); | 360 | platform_set_drvdata(pdev, rtc); |
| 361 | dev_set_drvdata(&rtc->dev, mem); | 361 | dev_set_drvdata(&rtc->dev, mem); |
| @@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct platform_device *pdev) | |||
| 380 | dev_name(&rtc->dev), rtc)) { | 380 | dev_name(&rtc->dev), rtc)) { |
| 381 | pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n", | 381 | pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n", |
| 382 | pdev->name, omap_rtc_timer); | 382 | pdev->name, omap_rtc_timer); |
| 383 | goto fail0; | 383 | goto fail1; |
| 384 | } | 384 | } |
| 385 | if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED, | 385 | if ((omap_rtc_timer != omap_rtc_alarm) && |
| 386 | dev_name(&rtc->dev), rtc)) { | 386 | (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED, |
| 387 | dev_name(&rtc->dev), rtc))) { | ||
| 387 | pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n", | 388 | pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n", |
| 388 | pdev->name, omap_rtc_alarm); | 389 | pdev->name, omap_rtc_alarm); |
| 389 | goto fail1; | 390 | goto fail2; |
| 390 | } | 391 | } |
| 391 | 392 | ||
| 392 | /* On boards with split power, RTC_ON_NOFF won't reset the RTC */ | 393 | /* On boards with split power, RTC_ON_NOFF won't reset the RTC */ |
| @@ -419,10 +420,12 @@ static int __init omap_rtc_probe(struct platform_device *pdev) | |||
| 419 | 420 | ||
| 420 | return 0; | 421 | return 0; |
| 421 | 422 | ||
| 422 | fail1: | 423 | fail2: |
| 423 | free_irq(omap_rtc_timer, NULL); | 424 | free_irq(omap_rtc_timer, NULL); |
| 424 | fail0: | 425 | fail1: |
| 425 | rtc_device_unregister(rtc); | 426 | rtc_device_unregister(rtc); |
| 427 | fail0: | ||
| 428 | iounmap(rtc_base); | ||
| 426 | fail: | 429 | fail: |
| 427 | release_resource(mem); | 430 | release_resource(mem); |
| 428 | return -EIO; | 431 | return -EIO; |
| @@ -438,7 +441,9 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) | |||
| 438 | rtc_write(0, OMAP_RTC_INTERRUPTS_REG); | 441 | rtc_write(0, OMAP_RTC_INTERRUPTS_REG); |
| 439 | 442 | ||
| 440 | free_irq(omap_rtc_timer, rtc); | 443 | free_irq(omap_rtc_timer, rtc); |
| 441 | free_irq(omap_rtc_alarm, rtc); | 444 | |
| 445 | if (omap_rtc_timer != omap_rtc_alarm) | ||
| 446 | free_irq(omap_rtc_alarm, rtc); | ||
| 442 | 447 | ||
| 443 | release_resource(dev_get_drvdata(&rtc->dev)); | 448 | release_resource(dev_get_drvdata(&rtc->dev)); |
| 444 | rtc_device_unregister(rtc); | 449 | rtc_device_unregister(rtc); |
