Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9626f1f117be21b6e4b7a1cb49814fc065dd3d2d
Commit:     9626f1f117be21b6e4b7a1cb49814fc065dd3d2d
Parent:     4c06be10c790008aa2b2d19df2872ff39990b7bd
Author:     Bjorn Helgaas <[EMAIL PROTECTED]>
AuthorDate: Wed Nov 14 16:59:57 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Wed Nov 14 18:45:41 2007 -0800

    rtc: fall back to requesting only the ports we actually use
    
    Firmware like PNPBIOS or ACPI can report the address space consumed by the
    RTC.  The actual space consumed may be less than the size (RTC_IO_EXTENT)
    assumed by the RTC driver.
    
    The PNP core doesn't request resources yet, but I'd like to make it do so.
    If/when it does, the RTC_IO_EXTENT request may fail, which prevents the RTC
    driver from loading.
    
    Since we only use the RTC index and data registers at RTC_PORT(0) and
    RTC_PORT(1), we can fall back to requesting just enough space for those.
    
    If the PNP core requests resources, this results in typical I/O port usage
    like this:
    
        0070-0073 : 00:06               <-- PNP device 00:06 responds to 70-73
          0070-0071 : rtc               <-- RTC driver uses only 70-71
    
    instead of the current:
    
        0070-0077 : rtc         <-- RTC_IO_EXTENT == 8
    
    Signed-off-by: Bjorn Helgaas <[EMAIL PROTECTED]>
    Cc: Alessandro Zummo <[EMAIL PROTECTED]>
    Cc: David Brownell <[EMAIL PROTECTED]>
    Cc: Ralf Baechle <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/char/rtc.c          |   36 ++++++++++++++++++++++++++++++------
 include/linux/mc146818rtc.h |    3 +++
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c
index a162e1b..0c66b80 100644
--- a/drivers/char/rtc.c
+++ b/drivers/char/rtc.c
@@ -918,12 +918,29 @@ static const struct file_operations rtc_proc_fops = {
 };
 #endif
 
+static resource_size_t rtc_size;
+
+static struct resource * __init rtc_request_region(resource_size_t size)
+{
+       struct resource *r;
+
+       if (RTC_IOMAPPED)
+               r = request_region(RTC_PORT(0), size, "rtc");
+       else
+               r = request_mem_region(RTC_PORT(0), size, "rtc");
+
+       if (r)
+               rtc_size = size;
+
+       return r;
+}
+
 static void rtc_release_region(void)
 {
        if (RTC_IOMAPPED)
-               release_region(RTC_PORT(0), RTC_IO_EXTENT);
+               release_region(RTC_PORT(0), rtc_size);
        else
-               release_mem_region(RTC_PORT(0), RTC_IO_EXTENT);
+               release_mem_region(RTC_PORT(0), rtc_size);
 }
 
 static int __init rtc_init(void)
@@ -976,10 +993,17 @@ found:
        }
 no_irq:
 #else
-       if (RTC_IOMAPPED)
-               r = request_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc");
-       else
-               r = request_mem_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc");
+       r = rtc_request_region(RTC_IO_EXTENT);
+
+       /*
+        * If we've already requested a smaller range (for example, because
+        * PNPBIOS or ACPI told us how the device is configured), the request
+        * above might fail because it's too big.
+        *
+        * If so, request just the range we actually use.
+        */
+       if (!r)
+               r = rtc_request_region(RTC_IO_EXTENT_USED);
        if (!r) {
 #ifdef RTC_IRQ
                rtc_has_irq = 0;
diff --git a/include/linux/mc146818rtc.h b/include/linux/mc146818rtc.h
index 580b3f4..2f4e957 100644
--- a/include/linux/mc146818rtc.h
+++ b/include/linux/mc146818rtc.h
@@ -109,8 +109,11 @@ struct cmos_rtc_board_info {
 #ifndef ARCH_RTC_LOCATION      /* Override by <asm/mc146818rtc.h>? */
 
 #define RTC_IO_EXTENT  0x8
+#define RTC_IO_EXTENT_USED     0x2
 #define RTC_IOMAPPED   1       /* Default to I/O mapping. */
 
+#else
+#define RTC_IO_EXTENT_USED      RTC_IO_EXTENT
 #endif /* ARCH_RTC_LOCATION */
 
 #endif /* _MC146818RTC_H */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to