net: gem: Add OF initialization support
authorMichal Simek <michal.simek@xilinx.com>
Mon, 24 Feb 2014 10:16:30 +0000 (11:16 +0100)
committerTom Rini <trini@ti.com>
Tue, 4 Mar 2014 14:27:35 +0000 (09:27 -0500)
Gem can be directly initialized from DTB.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/net/zynq_gem.c
include/netdev.h

index 6d4001b01736bd340f8059925fecd4410b53d445..101489c994760bf8bdaba0f7546fd941ca846a94 100644 (file)
@@ -12,6 +12,8 @@
 #include <common.h>
 #include <net.h>
 #include <config.h>
+#include <fdtdec.h>
+#include <libfdt.h>
 #include <malloc.h>
 #include <asm/io.h>
 #include <phy.h>
@@ -534,3 +536,43 @@ int zynq_gem_initialize(bd_t *bis, int base_addr, int phy_addr, u32 emio)
 
        return 1;
 }
+
+#ifdef CONFIG_OF_CONTROL
+int zynq_gem_of_init(const void *blob)
+{
+       int offset = 0;
+       u32 ret = 0;
+       u32 reg, phy_reg;
+
+       debug("ZYNQ GEM: Initialization\n");
+
+       do {
+               offset = fdt_node_offset_by_compatible(blob, offset,
+                                       "xlnx,ps7-ethernet-1.00.a");
+               if (offset != -1) {
+                       reg = fdtdec_get_addr(blob, offset, "reg");
+                       if (reg != FDT_ADDR_T_NONE) {
+                               offset = fdtdec_lookup_phandle(blob, offset,
+                                                              "phy-handle");
+                               if (offset != -1)
+                                       phy_reg = fdtdec_get_addr(blob, offset,
+                                                                 "reg");
+                               else
+                                       phy_reg = 0;
+
+                               debug("ZYNQ GEM: addr %x, phyaddr %x\n",
+                                     reg, phy_reg);
+
+                               ret |= zynq_gem_initialize(NULL, reg,
+                                                          phy_reg, 0);
+
+                       } else {
+                               debug("ZYNQ GEM: Can't get base address\n");
+                               return -1;
+                       }
+               }
+       } while (offset != -1);
+
+       return ret;
+}
+#endif
index c684014d5ec46932386fdb69163e84be574f5bea..32b5073ef025bb3e8d5e8b2bac0c3558236d0a25 100644 (file)
@@ -91,6 +91,7 @@ int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr,
                                                        int txpp, int rxpp);
 int xilinx_ll_temac_eth_init(bd_t *bis, unsigned long base_addr, int flags,
                                                unsigned long ctrl_addr);
+int zynq_gem_of_init(const void *blob);
 int zynq_gem_initialize(bd_t *bis, int base_addr, int phy_addr, u32 emio);
 /*
  * As long as the Xilinx xps_ll_temac ethernet driver has not its own interface