|
|
|
@ -16,7 +16,6 @@ |
|
|
|
|
#include <asm/arch/reset_manager.h> |
|
|
|
|
#include <asm/arch/scan_manager.h> |
|
|
|
|
#include <asm/arch/system_manager.h> |
|
|
|
|
#include <asm/arch/dwmmc.h> |
|
|
|
|
#include <asm/arch/nic301.h> |
|
|
|
|
#include <asm/arch/scu.h> |
|
|
|
|
#include <asm/pl310.h> |
|
|
|
@ -77,7 +76,8 @@ void v7_outer_cache_disable(void) |
|
|
|
|
* DesignWare Ethernet initialization |
|
|
|
|
*/ |
|
|
|
|
#ifdef CONFIG_ETH_DESIGNWARE |
|
|
|
|
static void dwmac_deassert_reset(const unsigned int of_reset_id) |
|
|
|
|
static void dwmac_deassert_reset(const unsigned int of_reset_id, |
|
|
|
|
const u32 phymode) |
|
|
|
|
{ |
|
|
|
|
u32 physhift, reset; |
|
|
|
|
|
|
|
|
@ -98,16 +98,41 @@ static void dwmac_deassert_reset(const unsigned int of_reset_id) |
|
|
|
|
|
|
|
|
|
/* configure to PHY interface select choosed */ |
|
|
|
|
setbits_le32(&sysmgr_regs->emacgrp_ctrl, |
|
|
|
|
SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII << physhift); |
|
|
|
|
phymode << physhift); |
|
|
|
|
|
|
|
|
|
/* Release the EMAC controller from reset */ |
|
|
|
|
socfpga_per_reset(reset, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static u32 dwmac_phymode_to_modereg(const char *phymode, u32 *modereg) |
|
|
|
|
{ |
|
|
|
|
if (!phymode) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
if (!strcmp(phymode, "mii") || !strcmp(phymode, "gmii")) { |
|
|
|
|
*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!strcmp(phymode, "rgmii")) { |
|
|
|
|
*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!strcmp(phymode, "rmii")) { |
|
|
|
|
*modereg = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int socfpga_eth_reset(void) |
|
|
|
|
{ |
|
|
|
|
const void *fdt = gd->fdt_blob; |
|
|
|
|
struct fdtdec_phandle_args args; |
|
|
|
|
const char *phy_mode; |
|
|
|
|
u32 phy_modereg; |
|
|
|
|
int nodes[2]; /* Max. two GMACs */ |
|
|
|
|
int ret, count; |
|
|
|
|
int i, node; |
|
|
|
@ -132,7 +157,14 @@ static int socfpga_eth_reset(void) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dwmac_deassert_reset(args.args[0]); |
|
|
|
|
phy_mode = fdt_getprop(fdt, node, "phy-mode", NULL); |
|
|
|
|
ret = dwmac_phymode_to_modereg(phy_mode, &phy_modereg); |
|
|
|
|
if (ret) { |
|
|
|
|
debug("GMAC%i: Failed to parse DT 'phy-mode'!\n", i); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dwmac_deassert_reset(args.args[0], phy_modereg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|