]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
[PATCH] rtc: fx error case
authorJan Beulich <jbeulich@novell.com>
Wed, 13 Dec 2006 08:35:04 +0000 (00:35 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Wed, 13 Dec 2006 17:05:52 +0000 (09:05 -0800)
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>
drivers/char/rtc.c

index 66a7385bc34aebb96cbda088b2a0b74f23f31363..2eb53bea186620aab4dcb8267d1a38349f679edf 100644 (file)
@@ -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 @@ static int __init rtc_init(void)
         * 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 @@ static int __init rtc_init(void)
        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 @@ static int __init rtc_init(void)
 
        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 @@ static int __init rtc_init(void)
        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 @@ static int __init rtc_init(void)
        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);