Commit f3e92d35 authored by Jan Beulich's avatar Jan Beulich Committed by Linus Torvalds

[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: default avatarJan Beulich <jbeulich@novell.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e8c5c045
...@@ -958,6 +958,7 @@ static int __init rtc_init(void) ...@@ -958,6 +958,7 @@ static int __init rtc_init(void)
} }
} }
#endif #endif
rtc_has_irq = 0;
printk(KERN_ERR "rtc_init: no PC rtc found\n"); printk(KERN_ERR "rtc_init: no PC rtc found\n");
return -EIO; return -EIO;
...@@ -972,6 +973,7 @@ found: ...@@ -972,6 +973,7 @@ found:
* PCI Slot 2 INTA# (and some INTx# in Slot 1). * PCI Slot 2 INTA# (and some INTx# in Slot 1).
*/ */
if (request_irq(rtc_irq, rtc_interrupt, IRQF_SHARED, "rtc", (void *)&rtc_port)) { 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); printk(KERN_ERR "rtc: cannot register IRQ %d\n", rtc_irq);
return -EIO; return -EIO;
} }
...@@ -982,6 +984,9 @@ no_irq: ...@@ -982,6 +984,9 @@ no_irq:
else else
r = request_mem_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc"); r = request_mem_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc");
if (!r) { if (!r) {
#ifdef RTC_IRQ
rtc_has_irq = 0;
#endif
printk(KERN_ERR "rtc: I/O resource %lx is not free.\n", printk(KERN_ERR "rtc: I/O resource %lx is not free.\n",
(long)(RTC_PORT(0))); (long)(RTC_PORT(0)));
return -EIO; return -EIO;
...@@ -996,6 +1001,7 @@ no_irq: ...@@ -996,6 +1001,7 @@ no_irq:
if(request_irq(RTC_IRQ, rtc_int_handler_ptr, IRQF_DISABLED, "rtc", NULL)) { 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. */ /* 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); printk(KERN_ERR "rtc: IRQ %d is not free.\n", RTC_IRQ);
if (RTC_IOMAPPED) if (RTC_IOMAPPED)
release_region(RTC_PORT(0), RTC_IO_EXTENT); release_region(RTC_PORT(0), RTC_IO_EXTENT);
...@@ -1012,6 +1018,7 @@ no_irq: ...@@ -1012,6 +1018,7 @@ no_irq:
if (misc_register(&rtc_dev)) { if (misc_register(&rtc_dev)) {
#ifdef RTC_IRQ #ifdef RTC_IRQ
free_irq(RTC_IRQ, NULL); free_irq(RTC_IRQ, NULL);
rtc_has_irq = 0;
#endif #endif
release_region(RTC_PORT(0), RTC_IO_EXTENT); release_region(RTC_PORT(0), RTC_IO_EXTENT);
return -ENODEV; return -ENODEV;
...@@ -1021,6 +1028,7 @@ no_irq: ...@@ -1021,6 +1028,7 @@ no_irq:
if (!ent) { if (!ent) {
#ifdef RTC_IRQ #ifdef RTC_IRQ
free_irq(RTC_IRQ, NULL); free_irq(RTC_IRQ, NULL);
rtc_has_irq = 0;
#endif #endif
release_region(RTC_PORT(0), RTC_IO_EXTENT); release_region(RTC_PORT(0), RTC_IO_EXTENT);
misc_deregister(&rtc_dev); misc_deregister(&rtc_dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment