diff options
Diffstat (limited to 'drivers/net/zynq_gem.c')
| -rw-r--r-- | drivers/net/zynq_gem.c | 42 | 
1 files changed, 42 insertions, 0 deletions
| diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index 6d4001b01..101489c99 100644 --- a/drivers/net/zynq_gem.c +++ b/drivers/net/zynq_gem.c @@ -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 |