|
@@ -6,6 +6,8 @@
|
|
|
|
|
|
#include <common.h>
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
#include <asm/io.h>
|
|
|
|
+#include <fdtdec.h>
|
|
|
|
+#include <libfdt.h>
|
|
#include <altera.h>
|
|
#include <altera.h>
|
|
#include <miiphy.h>
|
|
#include <miiphy.h>
|
|
#include <netdev.h>
|
|
#include <netdev.h>
|
|
@@ -17,6 +19,8 @@
|
|
#include <asm/arch/scu.h>
|
|
#include <asm/arch/scu.h>
|
|
#include <asm/pl310.h>
|
|
#include <asm/pl310.h>
|
|
|
|
|
|
|
|
+#include <dt-bindings/reset/altr,rst-mgr.h>
|
|
|
|
+
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
static struct pl310_regs *const pl310 =
|
|
static struct pl310_regs *const pl310 =
|
|
@@ -50,26 +54,20 @@ void enable_caches(void)
|
|
* DesignWare Ethernet initialization
|
|
* DesignWare Ethernet initialization
|
|
*/
|
|
*/
|
|
#ifdef CONFIG_ETH_DESIGNWARE
|
|
#ifdef CONFIG_ETH_DESIGNWARE
|
|
-int cpu_eth_init(bd_t *bis)
|
|
|
|
|
|
+static void dwmac_deassert_reset(const unsigned int of_reset_id)
|
|
{
|
|
{
|
|
-#if CONFIG_EMAC_BASE == SOCFPGA_EMAC0_ADDRESS
|
|
|
|
- const int physhift = SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB;
|
|
|
|
- const u32 reset = SOCFPGA_RESET(EMAC0);
|
|
|
|
-#elif CONFIG_EMAC_BASE == SOCFPGA_EMAC1_ADDRESS
|
|
|
|
- const int physhift = SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB;
|
|
|
|
- const u32 reset = SOCFPGA_RESET(EMAC1);
|
|
|
|
-#else
|
|
|
|
-#error "Incorrect CONFIG_EMAC_BASE value!"
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- /* Initialize EMAC. This needs to be done at least once per boot. */
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Putting the EMAC controller to reset when configuring the PHY
|
|
|
|
- * interface select at System Manager
|
|
|
|
- */
|
|
|
|
- socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
|
|
|
|
- socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
|
|
|
|
|
|
+ u32 physhift, reset;
|
|
|
|
+
|
|
|
|
+ if (of_reset_id == EMAC0_RESET) {
|
|
|
|
+ physhift = SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB;
|
|
|
|
+ reset = SOCFPGA_RESET(EMAC0);
|
|
|
|
+ } else if (of_reset_id == EMAC1_RESET) {
|
|
|
|
+ physhift = SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB;
|
|
|
|
+ reset = SOCFPGA_RESET(EMAC1);
|
|
|
|
+ } else {
|
|
|
|
+ printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
/* Clearing emac0 PHY interface select to 0 */
|
|
/* Clearing emac0 PHY interface select to 0 */
|
|
clrbits_le32(&sysmgr_regs->emacgrp_ctrl,
|
|
clrbits_le32(&sysmgr_regs->emacgrp_ctrl,
|
|
@@ -81,6 +79,38 @@ int cpu_eth_init(bd_t *bis)
|
|
|
|
|
|
/* Release the EMAC controller from reset */
|
|
/* Release the EMAC controller from reset */
|
|
socfpga_per_reset(reset, 0);
|
|
socfpga_per_reset(reset, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int cpu_eth_init(bd_t *bis)
|
|
|
|
+{
|
|
|
|
+ const void *fdt = gd->fdt_blob;
|
|
|
|
+ struct fdtdec_phandle_args args;
|
|
|
|
+ int nodes[2]; /* Max. two GMACs */
|
|
|
|
+ int ret, count;
|
|
|
|
+ int i, node;
|
|
|
|
+
|
|
|
|
+ /* Put both GMACs into RESET state. */
|
|
|
|
+ socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
|
|
|
|
+ socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
|
|
|
|
+
|
|
|
|
+ count = fdtdec_find_aliases_for_id(fdt, "ethernet",
|
|
|
|
+ COMPAT_ALTERA_SOCFPGA_DWMAC,
|
|
|
|
+ nodes, ARRAY_SIZE(nodes));
|
|
|
|
+ for (i = 0; i < count; i++) {
|
|
|
|
+ node = nodes[i];
|
|
|
|
+ if (node <= 0)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ ret = fdtdec_parse_phandle_with_args(fdt, node, "resets",
|
|
|
|
+ "#reset-cells", 1, 0,
|
|
|
|
+ &args);
|
|
|
|
+ if (ret || (args.args_count != 1)) {
|
|
|
|
+ debug("GMAC%i: Failed to parse DT 'resets'!\n", i);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dwmac_deassert_reset(args.args[0]);
|
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|