Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=22258fa40e54ceefe75a6c6a793f5c44d8339b9c
Commit:     22258fa40e54ceefe75a6c6a793f5c44d8339b9c
Parent:     a40955167ffc34a1651ebe2e88a8c1db2987fc91
Author:     David Gibson <[EMAIL PROTECTED]>
AuthorDate: Fri Jan 11 14:25:34 2008 +1100
Committer:  Josh Boyer <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 07:07:26 2008 -0600

    [POWERPC] Enable RTC for Ebony and Walnut (v2)
    
    This patch extends the Ebony and Walnut platform code to instantiate
    the existing ds1742 RTC class driver for the DS1743 RTC/NVRAM chip
    found on both those boards.  The patch uses a helper function to scan
    the device tree and instantiate the appropriate platform_device based
    on it, so it should be easy to extend for other boards which have mmio
    mapped RTC chips.
    
    Along with this, the device tree binding for the ds1743 chips is
    tweaked, based on the existing DS1385 OF binding found at:
        
http://playground.sun.com/1275/proposals/Closed/Remanded/Accepted/346-it.txt
    Although that document covers the NVRAM portion of the chip, whereas
    here we're interested in the RTC portion, so it's not entirely clear
    if that's a good model.
    
    This implements only RTC class driver support - that is /dev/rtc0, not
    /dev/rtc, and the low-level get/set time callbacks remain
    unimplemented.  That means in order to get at the clock you will
    either need a modified version of hwclock which will look at
    /dev/rtc0, or you'll need to configure udev to symlink rtc0 to rtc.
    
    Signed-off-by: David Gibson <[EMAIL PROTECTED]>
    Signed-off-by: Josh Boyer <[EMAIL PROTECTED]>
---
 arch/powerpc/boot/dts/ebony.dts     |    5 ++-
 arch/powerpc/boot/dts/walnut.dts    |    5 ++-
 arch/powerpc/platforms/40x/walnut.c |    1 +
 arch/powerpc/platforms/44x/Kconfig  |    1 +
 arch/powerpc/platforms/44x/ebony.c  |    2 +
 arch/powerpc/platforms/Kconfig      |    6 +++
 arch/powerpc/sysdev/Makefile        |    1 +
 arch/powerpc/sysdev/of_rtc.c        |   59 +++++++++++++++++++++++++++++++++++
 include/asm-powerpc/of_platform.h   |    2 +
 9 files changed, 78 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/boot/dts/ebony.dts b/arch/powerpc/boot/dts/ebony.dts
index f8790c4..7aad135 100644
--- a/arch/powerpc/boot/dts/ebony.dts
+++ b/arch/powerpc/boot/dts/ebony.dts
@@ -158,9 +158,10 @@
                                        };
                                };
 
-                               [EMAIL PROTECTED],0 {
+                               [EMAIL PROTECTED],0 {
                                        /* NVRAM & RTC */
-                                       compatible = "ds1743";
+                                       compatible = "ds1743-nvram";
+                                       #bytes = <2000>;
                                        reg = <1 0 2000>;
                                };
 
diff --git a/arch/powerpc/boot/dts/walnut.dts b/arch/powerpc/boot/dts/walnut.dts
index 0e3825e..dcc21b0 100644
--- a/arch/powerpc/boot/dts/walnut.dts
+++ b/arch/powerpc/boot/dts/walnut.dts
@@ -175,9 +175,10 @@
                                };
                        };
 
-                       [EMAIL PROTECTED],0 {
+                       [EMAIL PROTECTED],0 {
                                /* NVRAM and RTC */
-                               compatible = "ds1743";
+                               compatible = "ds1743-nvram";
+                               #bytes = <2000>;
                                reg = <1 0 2000>;
                        };
 
diff --git a/arch/powerpc/platforms/40x/walnut.c 
b/arch/powerpc/platforms/40x/walnut.c
index f115b6d..5d9edd9 100644
--- a/arch/powerpc/platforms/40x/walnut.c
+++ b/arch/powerpc/platforms/40x/walnut.c
@@ -36,6 +36,7 @@ static __initdata struct of_device_id walnut_of_bus[] = {
 static int __init walnut_device_probe(void)
 {
        of_platform_bus_probe(NULL, walnut_of_bus, NULL);
+       of_instantiate_rtc();
 
        return 0;
 }
diff --git a/arch/powerpc/platforms/44x/Kconfig 
b/arch/powerpc/platforms/44x/Kconfig
index d248013..c3e4e8c 100644
--- a/arch/powerpc/platforms/44x/Kconfig
+++ b/arch/powerpc/platforms/44x/Kconfig
@@ -13,6 +13,7 @@ config EBONY
        default y
        select 440GP
        select PCI
+       select OF_RTC
        help
          This option enables support for the IBM PPC440GP evaluation board.
 
diff --git a/arch/powerpc/platforms/44x/ebony.c 
b/arch/powerpc/platforms/44x/ebony.c
index 481a016..1a8d467 100644
--- a/arch/powerpc/platforms/44x/ebony.c
+++ b/arch/powerpc/platforms/44x/ebony.c
@@ -18,6 +18,7 @@
 
 #include <linux/init.h>
 #include <linux/of_platform.h>
+#include <linux/rtc.h>
 
 #include <asm/machdep.h>
 #include <asm/prom.h>
@@ -38,6 +39,7 @@ static __initdata struct of_device_id ebony_of_bus[] = {
 static int __init ebony_device_probe(void)
 {
        of_platform_bus_probe(NULL, ebony_of_bus, NULL);
+       of_instantiate_rtc();
 
        return 0;
 }
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index 2cec343..4286664 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -321,6 +321,12 @@ config FSL_ULI1575
 config CPM
        bool
 
+config OF_RTC
+       bool
+       help
+         Uses information from the OF or flattened device tree to instatiate
+         platform devices for direct mapped RTC chips like the DS1742 or 
DS1743.
+
 source "arch/powerpc/sysdev/bestcomm/Kconfig"
 
 endmenu
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
index f17e7b8..702916b 100644
--- a/arch/powerpc/sysdev/Makefile
+++ b/arch/powerpc/sysdev/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_PPC_I8259)               += i8259.o
 obj-$(CONFIG_IPIC)             += ipic.o
 obj-$(CONFIG_4xx)              += uic.o
 obj-$(CONFIG_XILINX_VIRTEX)    += xilinx_intc.o
+obj-$(CONFIG_OF_RTC)           += of_rtc.o
 ifeq ($(CONFIG_PCI),y)
 obj-$(CONFIG_4xx)              += ppc4xx_pci.o
 endif
diff --git a/arch/powerpc/sysdev/of_rtc.c b/arch/powerpc/sysdev/of_rtc.c
new file mode 100644
index 0000000..3d54450
--- /dev/null
+++ b/arch/powerpc/sysdev/of_rtc.c
@@ -0,0 +1,59 @@
+/*
+ * Instantiate mmio-mapped RTC chips based on device tree information
+ *
+ * Copyright 2007 David Gibson <[EMAIL PROTECTED]>, IBM Corporation.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/init.h>
+#include <linux/of_platform.h>
+
+static __initdata struct {
+       const char *compatible;
+       char *plat_name;
+} of_rtc_table[] = {
+       { "ds1743-nvram", "rtc-ds1742" },
+};
+
+void __init of_instantiate_rtc(void)
+{
+       struct device_node *node;
+       int err;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) {
+               char *plat_name = of_rtc_table[i].plat_name;
+
+               for_each_compatible_node(node, NULL,
+                                        of_rtc_table[i].compatible) {
+                       struct resource *res;
+
+                       res = kmalloc(sizeof(*res), GFP_KERNEL);
+                       if (!res) {
+                               printk(KERN_ERR "OF RTC: Out of memory "
+                                      "allocating resource structure for %s\n",
+                                      node->full_name);
+                               continue;
+                       }
+
+                       err = of_address_to_resource(node, 0, res);
+                       if (err) {
+                               printk(KERN_ERR "OF RTC: Error "
+                                      "translating resources for %s\n",
+                                      node->full_name);
+                               continue;
+                       }
+
+                       printk(KERN_INFO "OF_RTC: %s is a %s @ 0x%llx-0x%llx\n",
+                              node->full_name, plat_name,
+                              (unsigned long long)res->start,
+                              (unsigned long long)res->end);
+                       platform_device_register_simple(plat_name, -1, res, 1);
+               }
+       }
+}
diff --git a/include/asm-powerpc/of_platform.h 
b/include/asm-powerpc/of_platform.h
index 1bce5ef..18659ef 100644
--- a/include/asm-powerpc/of_platform.h
+++ b/include/asm-powerpc/of_platform.h
@@ -37,4 +37,6 @@ extern int of_platform_bus_probe(struct device_node *root,
 
 extern struct of_device *of_find_device_by_phandle(phandle ph);
 
+extern void of_instantiate_rtc(void);
+
 #endif /* _ASM_POWERPC_OF_PLATFORM_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