mmc: zynq: Add OF initialization support
authorMichal Simek <michal.simek@xilinx.com>
Mon, 24 Feb 2014 10:16:31 +0000 (11:16 +0100)
committerTom Rini <trini@ti.com>
Tue, 4 Mar 2014 14:27:35 +0000 (09:27 -0500)
Enable initialize sdhci from DTB.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/include/asm/arch-zynq/sys_proto.h
drivers/mmc/zynq_sdhci.c

index 0a2ba05..a68e1b3 100644 (file)
@@ -19,5 +19,6 @@ extern void zynq_ddrc_init(void);
 
 /* Driver extern functions */
 extern int zynq_sdhci_init(u32 regbase);
+extern int zynq_sdhci_of_init(const void *blob);
 
 #endif /* _SYS_PROTO_H_ */
index 72a272f..fdce2c2 100644 (file)
@@ -7,6 +7,8 @@
  */
 
 #include <common.h>
+#include <fdtdec.h>
+#include <libfdt.h>
 #include <malloc.h>
 #include <sdhci.h>
 #include <asm/arch/sys_proto.h>
@@ -32,3 +34,30 @@ int zynq_sdhci_init(u32 regbase)
        add_sdhci(host, 52000000, 52000000 >> 9);
        return 0;
 }
+
+#ifdef CONFIG_OF_CONTROL
+int zynq_sdhci_of_init(const void *blob)
+{
+       int offset = 0;
+       u32 ret = 0;
+       u32 reg;
+
+       debug("ZYNQ SDHCI: Initialization\n");
+
+       do {
+               offset = fdt_node_offset_by_compatible(blob, offset,
+                                       "arasan,sdhci-8.9a");
+               if (offset != -1) {
+                       reg = fdtdec_get_addr(blob, offset, "reg");
+                       if (reg != FDT_ADDR_T_NONE) {
+                               ret |= zynq_sdhci_init(reg);
+                       } else {
+                               debug("ZYNQ SDHCI: Can't get base address\n");
+                               return -1;
+                       }
+               }
+       } while (offset != -1);
+
+       return ret;
+}
+#endif