summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2006-12-13 00:35:04 -0800
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-13 09:05:52 -0800
commitf3e92d355e1251fb6d1a15508f2a5448d2354727 (patch)
treeccfd9584eaec47ea09d37308c8651fa66f56c65e
parente8c5c045d790e7018c56f1a998a2d240b732ea3c (diff)
downloadlinux-f3e92d355e1251fb6d1a15508f2a5448d2354727.tar.bz2
[PATCH] rtc: fx error case
Ensure RTC driver doesn't use its timer when it doesn't get to set it up (as it cannot currently prevent other of its functions to be called from outside when not built as a module - probably this should also be addressed). Signed-off-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/char/rtc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c
index 66a7385bc34a..2eb53bea1866 100644
--- a/drivers/char/rtc.c
+++ b/drivers/char/rtc.c
@@ -958,6 +958,7 @@ static int __init rtc_init(void)
}
}
#endif
+ rtc_has_irq = 0;
printk(KERN_ERR "rtc_init: no PC rtc found\n");
return -EIO;
@@ -972,6 +973,7 @@ found:
* PCI Slot 2 INTA# (and some INTx# in Slot 1).
*/
if (request_irq(rtc_irq, rtc_interrupt, IRQF_SHARED, "rtc", (void *)&rtc_port)) {
+ rtc_has_irq = 0;
printk(KERN_ERR "rtc: cannot register IRQ %d\n", rtc_irq);
return -EIO;
}
@@ -982,6 +984,9 @@ no_irq:
else
r = request_mem_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc");
if (!r) {
+#ifdef RTC_IRQ
+ rtc_has_irq = 0;
+#endif
printk(KERN_ERR "rtc: I/O resource %lx is not free.\n",
(long)(RTC_PORT(0)));
return -EIO;
@@ -996,6 +1001,7 @@ no_irq:
if(request_irq(RTC_IRQ, rtc_int_handler_ptr, IRQF_DISABLED, "rtc", NULL)) {
/* Yeah right, seeing as irq 8 doesn't even hit the bus. */
+ rtc_has_irq = 0;
printk(KERN_ERR "rtc: IRQ %d is not free.\n", RTC_IRQ);
if (RTC_IOMAPPED)
release_region(RTC_PORT(0), RTC_IO_EXTENT);
@@ -1012,6 +1018,7 @@ no_irq:
if (misc_register(&rtc_dev)) {
#ifdef RTC_IRQ
free_irq(RTC_IRQ, NULL);
+ rtc_has_irq = 0;
#endif
release_region(RTC_PORT(0), RTC_IO_EXTENT);
return -ENODEV;
@@ -1021,6 +1028,7 @@ no_irq:
if (!ent) {
#ifdef RTC_IRQ
free_irq(RTC_IRQ, NULL);
+ rtc_has_irq = 0;
#endif
release_region(RTC_PORT(0), RTC_IO_EXTENT);
misc_deregister(&rtc_dev);