]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
x86, olpc: Use device tree for platform identification
authorDaniel Drake <dsd@laptop.org>
Sun, 13 Mar 2011 15:10:17 +0000 (15:10 +0000)
committerH. Peter Anvin <hpa@linux.intel.com>
Tue, 15 Mar 2011 21:17:23 +0000 (14:17 -0700)
Make OLPC fully depend on device tree, and use it to identify the OLPC
platform details. Some nodes are exposed as platform devices where we
plan to use device tree for device probing.

Signed-off-by: Daniel Drake <dsd@laptop.org>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
LKML-Reference: <20110313151017.C255F9D401E@zog.reactivated.net>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/Kconfig
arch/x86/include/asm/olpc_ofw.h
arch/x86/platform/olpc/Makefile
arch/x86/platform/olpc/olpc.c
arch/x86/platform/olpc/olpc_dt.c

index b4c2e9c676232e85b6664462cfc90a22cffa6454..471221bcc4fadd86fd513c23849d19ed2f5f52fd 100644 (file)
@@ -2071,7 +2071,7 @@ config OLPC
        depends on !X86_PAE
        select GPIOLIB
        select OF
-       select OF_PROMTREE if PROC_DEVICETREE
+       select OF_PROMTREE
        ---help---
          Add support for detecting the unique features of the OLPC
          XO hardware.
index c5d3a5abbb9f4ec2757b468bc14459ce4d13d496..24487712e0b1915368f96a3a74ba362ff42fdbbd 100644 (file)
@@ -26,15 +26,12 @@ extern void setup_olpc_ofw_pgd(void);
 /* check if OFW was detected during boot */
 extern bool olpc_ofw_present(void);
 
+extern void olpc_dt_build_devicetree(void);
+
 #else /* !CONFIG_OLPC */
 static inline void olpc_ofw_detect(void) { }
 static inline void setup_olpc_ofw_pgd(void) { }
-#endif /* !CONFIG_OLPC */
-
-#ifdef CONFIG_OF_PROMTREE
-extern void olpc_dt_build_devicetree(void);
-#else
 static inline void olpc_dt_build_devicetree(void) { }
-#endif
+#endif /* !CONFIG_OLPC */
 
 #endif /* _ASM_X86_OLPC_OFW_H */
index c2a8cab65e5d71f82404a9b6b118dc6556c79489..81c5e2165c2416be638675f83f887e1f8f52d218 100644 (file)
@@ -1,4 +1,2 @@
-obj-$(CONFIG_OLPC)             += olpc.o
+obj-$(CONFIG_OLPC)             += olpc.o olpc_ofw.o olpc_dt.o
 obj-$(CONFIG_OLPC_XO1)         += olpc-xo1.o
-obj-$(CONFIG_OLPC)             += olpc_ofw.o
-obj-$(CONFIG_OF_PROMTREE)      += olpc_dt.o
index edaf3fe8dc5e4b0326c0280042b868cd3400bf4c..0060fd59ea001baaf1b31769bb1bbe6c490709ca 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/io.h>
 #include <linux/string.h>
 #include <linux/platform_device.h>
+#include <linux/of.h>
 
 #include <asm/geode.h>
 #include <asm/setup.h>
@@ -187,41 +188,43 @@ err:
 }
 EXPORT_SYMBOL_GPL(olpc_ec_cmd);
 
-static bool __init check_ofw_architecture(void)
+static bool __init check_ofw_architecture(struct device_node *root)
 {
-       size_t propsize;
-       char olpc_arch[5];
-       const void *args[] = { NULL, "architecture", olpc_arch, (void *)5 };
-       void *res[] = { &propsize };
+       const char *olpc_arch;
+       int propsize;
 
-       if (olpc_ofw("getprop", args, res)) {
-               printk(KERN_ERR "ofw: getprop call failed!\n");
-               return false;
-       }
+       olpc_arch = of_get_property(root, "architecture", &propsize);
        return propsize == 5 && strncmp("OLPC", olpc_arch, 5) == 0;
 }
 
-static u32 __init get_board_revision(void)
+static u32 __init get_board_revision(struct device_node *root)
 {
-       size_t propsize;
-       __be32 rev;
-       const void *args[] = { NULL, "board-revision-int", &rev, (void *)4 };
-       void *res[] = { &propsize };
-
-       if (olpc_ofw("getprop", args, res) || propsize != 4) {
-               printk(KERN_ERR "ofw: getprop call failed!\n");
-               return cpu_to_be32(0);
-       }
-       return be32_to_cpu(rev);
+       int propsize;
+       const __be32 *rev;
+
+       rev = of_get_property(root, "board-revision-int", &propsize);
+       if (propsize != 4)
+               return 0;
+
+       return be32_to_cpu(*rev);
 }
 
 static bool __init platform_detect(void)
 {
-       if (!check_ofw_architecture())
+       struct device_node *root = of_find_node_by_path("/");
+       bool success;
+
+       if (!root)
                return false;
-       olpc_platform_info.flags |= OLPC_F_PRESENT;
-       olpc_platform_info.boardrev = get_board_revision();
-       return true;
+
+       success = check_ofw_architecture(root);
+       if (success) {
+               olpc_platform_info.boardrev = get_board_revision(root);
+               olpc_platform_info.flags |= OLPC_F_PRESENT;
+       }
+
+       of_node_put(root);
+       return success;
 }
 
 static int __init add_xo1_platform_devices(void)
index dab87464753058b10b7b3094c734126dcc862066..4ce208f885ef5885ee3624c24645a7aa753cd62a 100644 (file)
@@ -19,7 +19,9 @@
 #include <linux/kernel.h>
 #include <linux/bootmem.h>
 #include <linux/of.h>
+#include <linux/of_platform.h>
 #include <linux/of_pdt.h>
+#include <asm/olpc.h>
 #include <asm/olpc_ofw.h>
 
 static phandle __init olpc_dt_getsibling(phandle node)
@@ -181,3 +183,20 @@ void __init olpc_dt_build_devicetree(void)
        pr_info("PROM DT: Built device tree with %u bytes of memory.\n",
                        prom_early_allocated);
 }
+
+/* A list of DT node/bus matches that we want to expose as platform devices */
+static struct of_device_id __initdata of_ids[] = {
+       { .compatible = "olpc,xo1-battery" },
+       { .compatible = "olpc,xo1-dcon" },
+       { .compatible = "olpc,xo1-rtc" },
+       {},
+};
+
+static int __init olpc_create_platform_devices(void)
+{
+       if (machine_is_olpc())
+               return of_platform_bus_probe(NULL, of_ids, NULL);
+       else
+               return 0;
+}
+device_initcall(olpc_create_platform_devices);