Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 176619
b: refs/heads/master
c: 8cfde8c
h: refs/heads/master
i:
  176617: 782df54
  176615: 2ea6bad
v: v3
  • Loading branch information
Mark A. Greer authored and Linus Torvalds committed Dec 16, 2009
1 parent f645aad commit fbf0bba
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 43299f285937c907abcdd987c670c755194943cc
refs/heads/master: 8cfde8c1df31724f881de1a37f878ccbba4f178f
7 changes: 4 additions & 3 deletions trunk/drivers/rtc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -597,10 +597,11 @@ comment "on-CPU RTC drivers"

config RTC_DRV_OMAP
tristate "TI OMAP1"
depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730
depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_DAVINCI_DA8XX
help
Say "yes" here to support the real time clock on TI OMAP1 chips.
This driver can also be built as a module called rtc-omap.
Say "yes" here to support the real time clock on TI OMAP1 and
DA8xx/OMAP-L13x chips. This driver can also be built as a
module called rtc-omap.

config RTC_DRV_S3C
tristate "Samsung S3C series SoC RTC"
Expand Down
47 changes: 26 additions & 21 deletions trunk/drivers/rtc/rtc-omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,10 @@
#define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3)
#define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2)

static void __iomem *rtc_base;

#define rtc_read(addr) omap_readb(OMAP_RTC_BASE + (addr))
#define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr))
#define rtc_read(addr) __raw_readb(rtc_base + (addr))
#define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr))


/* we rely on the rtc framework to handle locking (rtc->ops_lock),
Expand Down Expand Up @@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
return -ENOENT;
}

/* NOTE: using static mapping for RTC registers */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res && res->start != OMAP_RTC_BASE) {
pr_debug("%s: RTC registers at %08x, expected %08x\n",
pdev->name, (unsigned) res->start, OMAP_RTC_BASE);
if (!res) {
pr_debug("%s: RTC resource data missing\n", pdev->name);
return -ENOENT;
}

if (res)
mem = request_mem_region(res->start,
res->end - res->start + 1,
pdev->name);
else
mem = NULL;
mem = request_mem_region(res->start, resource_size(res), pdev->name);
if (!mem) {
pr_debug("%s: RTC registers at %08x are not free\n",
pdev->name, OMAP_RTC_BASE);
pdev->name, res->start);
return -EBUSY;
}

rtc_base = ioremap(res->start, resource_size(res));
if (!rtc_base) {
pr_debug("%s: RTC registers can't be mapped\n", pdev->name);
goto fail;
}

rtc = rtc_device_register(pdev->name, &pdev->dev,
&omap_rtc_ops, THIS_MODULE);
if (IS_ERR(rtc)) {
pr_debug("%s: can't register RTC device, err %ld\n",
pdev->name, PTR_ERR(rtc));
goto fail;
goto fail0;
}
platform_set_drvdata(pdev, rtc);
dev_set_drvdata(&rtc->dev, mem);
Expand All @@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
dev_name(&rtc->dev), rtc)) {
pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n",
pdev->name, omap_rtc_timer);
goto fail0;
goto fail1;
}
if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
dev_name(&rtc->dev), rtc)) {
if ((omap_rtc_timer != omap_rtc_alarm) &&
(request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
dev_name(&rtc->dev), rtc))) {
pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n",
pdev->name, omap_rtc_alarm);
goto fail1;
goto fail2;
}

/* On boards with split power, RTC_ON_NOFF won't reset the RTC */
Expand Down Expand Up @@ -419,10 +420,12 @@ static int __init omap_rtc_probe(struct platform_device *pdev)

return 0;

fail1:
fail2:
free_irq(omap_rtc_timer, NULL);
fail0:
fail1:
rtc_device_unregister(rtc);
fail0:
iounmap(rtc_base);
fail:
release_resource(mem);
return -EIO;
Expand All @@ -438,7 +441,9 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)
rtc_write(0, OMAP_RTC_INTERRUPTS_REG);

free_irq(omap_rtc_timer, rtc);
free_irq(omap_rtc_alarm, rtc);

if (omap_rtc_timer != omap_rtc_alarm)
free_irq(omap_rtc_alarm, rtc);

release_resource(dev_get_drvdata(&rtc->dev));
rtc_device_unregister(rtc);
Expand Down

0 comments on commit fbf0bba

Please sign in to comment.