[POWERPC] Enable RTC for Ebony and Walnut (v2)
authorDavid Gibson <dwg@au1.ibm.com>
Fri, 11 Jan 2008 03:25:34 +0000 (14:25 +1100)
committerJosh Boyer <jwboyer@linux.vnet.ibm.com>
Fri, 25 Jan 2008 13:07:26 +0000 (07:07 -0600)
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 <david@gibson.dropbear.id.au>
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
arch/powerpc/boot/dts/ebony.dts
arch/powerpc/boot/dts/walnut.dts
arch/powerpc/platforms/40x/walnut.c
arch/powerpc/platforms/44x/Kconfig
arch/powerpc/platforms/44x/ebony.c
arch/powerpc/platforms/Kconfig
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/of_rtc.c [new file with mode: 0644]
include/asm-powerpc/of_platform.h

index f8790c4747dfd9a63c8d7e25ceff5d6b2556f863..7aad135a44b0524d26b0dd3dcadad911b8a98934 100644 (file)
                                        };
                                };
 
-                               ds1743@1,0 {
+                               nvram@1,0 {
                                        /* NVRAM & RTC */
-                                       compatible = "ds1743";
+                                       compatible = "ds1743-nvram";
+                                       #bytes = <2000>;
                                        reg = <1 0 2000>;
                                };
 
index 0e3825e599dcaf17ffcb7be93d01f6dc67dda3ad..dcc21b0438e5f4e56d3761f1e2053a5c02ca5554 100644 (file)
                                };
                        };
 
-                       ds1743@1,0 {
+                       nvram@1,0 {
                                /* NVRAM and RTC */
-                               compatible = "ds1743";
+                               compatible = "ds1743-nvram";
+                               #bytes = <2000>;
                                reg = <1 0 2000>;
                        };
 
index f115b6dbf5ad26f6609fb137f3b87fa996e78529..5d9edd917f925382b4f3b5d920842dfb14cf297e 100644 (file)
@@ -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;
 }
index d248013053448a655c4d3d5eb638900c5cc58c24..c3e4e8c3c467277a4be3ee489d93f2abe3090fe7 100644 (file)
@@ -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.
 
index 481a016e153506eea25d60e336e254f5a87ffa2b..1a8d467bff8522fd1db5d8c3c5f2d10bb40bd0df 100644 (file)
@@ -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;
 }
index 2cec34314d2e134ce5be619d0623f5b5b43719c0..4286664741dd8fb4dc06a9c7b748b43a17a06280 100644 (file)
@@ -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
index f17e7b885f60188b927346f3328e98083377f370..702916bf28fa2c6fc09e97e2b4bb037928b03d3e 100644 (file)
@@ -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 (file)
index 0000000..3d54450
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Instantiate mmio-mapped RTC chips based on device tree information
+ *
+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, 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);
+               }
+       }
+}
index 1bce5efe1de042f7ab891f8bdf20fc57d56b77fb..18659ef72139c3599796b5fc718a23fe676bc71d 100644 (file)
@@ -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 */