package: uboot-sunxi: various changes
[openwrt.git] / package / boot / uboot-sunxi / patches / 014-fix-gmac-init.patch
diff --git a/package/boot/uboot-sunxi/patches/014-fix-gmac-init.patch b/package/boot/uboot-sunxi/patches/014-fix-gmac-init.patch
new file mode 100644 (file)
index 0000000..a4e4386
--- /dev/null
@@ -0,0 +1,135 @@
+From fc8991c61c393ce6a9d3dfc97cb56dbbd9e8cbba Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Thu, 17 Mar 2016 13:53:03 +0100
+Subject: [PATCH] sunxi: Fix gmac not working due to cpu_eth_init no longer
+ being called
+
+cpu_eth_init is no longer called for dm enabled eth drivers, this
+was causing the sunxi gmac eth controller to no longer work in u-boot.
+
+This commit fixes this by calling the clock, reset and pinmux setup
+function from s_init() and enabling the phy power pin (if any) from
+board_init().
+
+The enabling of phy power cannot be done from s_init because it uses dm
+and dm is not ready yet at this point.
+
+Note that the mdelay is dropped as the phy gets enabled much earlier
+now, so it is no longer needed.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Acked-by: Ian Campbell <ijc@hellion.org.uk>
+Tested-by: Karsten Merker <merker@debian.org>
+Tested-by: Michael Haas <haas@computerlinguist.org>
+---
+ arch/arm/cpu/armv7/sunxi/board.c            | 28 +---------------------------
+ arch/arm/include/asm/arch-sunxi/sys_proto.h |  6 +++++-
+ board/sunxi/board.c                         |  5 +++++
+ board/sunxi/gmac.c                          | 14 +-------------
+ 4 files changed, 12 insertions(+), 41 deletions(-)
+
+diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
+index e80785b..7653148 100644
+--- a/arch/arm/cpu/armv7/sunxi/board.c
++++ b/arch/arm/cpu/armv7/sunxi/board.c
+@@ -152,6 +152,7 @@ void s_init(void)
+       timer_init();
+       gpio_init();
+       i2c_init_board();
++      eth_init_board();
+ }
+ #ifdef CONFIG_SPL_BUILD
+@@ -259,30 +260,3 @@ void enable_caches(void)
+       dcache_enable();
+ }
+ #endif
+-
+-#ifdef CONFIG_CMD_NET
+-/*
+- * Initializes on-chip ethernet controllers.
+- * to override, implement board_eth_init()
+- */
+-int cpu_eth_init(bd_t *bis)
+-{
+-      __maybe_unused int rc;
+-
+-#ifdef CONFIG_MACPWR
+-      gpio_request(CONFIG_MACPWR, "macpwr");
+-      gpio_direction_output(CONFIG_MACPWR, 1);
+-      mdelay(200);
+-#endif
+-
+-#ifdef CONFIG_SUNXI_GMAC
+-      rc = sunxi_gmac_initialize(bis);
+-      if (rc < 0) {
+-              printf("sunxi: failed to initialize gmac\n");
+-              return rc;
+-      }
+-#endif
+-
+-      return 0;
+-}
+-#endif
+diff --git a/arch/arm/include/asm/arch-sunxi/sys_proto.h b/arch/arm/include/asm/arch-sunxi/sys_proto.h
+index 9df3744..a373319 100644
+--- a/arch/arm/include/asm/arch-sunxi/sys_proto.h
++++ b/arch/arm/include/asm/arch-sunxi/sys_proto.h
+@@ -24,6 +24,10 @@ void sdelay(unsigned long);
+ void return_to_fel(uint32_t lr, uint32_t sp);
+ /* Board / SoC level designware gmac init */
+-int sunxi_gmac_initialize(bd_t *bis);
++#if !defined CONFIG_SPL_BUILD && defined CONFIG_SUNXI_GMAC
++void eth_init_board(void);
++#else
++static inline void eth_init_board(void) {}
++#endif
+ #endif
+diff --git a/board/sunxi/board.c b/board/sunxi/board.c
+index 80eae9c..e16718f 100644
+--- a/board/sunxi/board.c
++++ b/board/sunxi/board.c
+@@ -90,6 +90,11 @@ int board_init(void)
+       if (ret)
+               return ret;
++#ifdef CONFIG_MACPWR
++      gpio_request(CONFIG_MACPWR, "macpwr");
++      gpio_direction_output(CONFIG_MACPWR, 1);
++#endif
++
+       /* Uses dm gpio code so do this here and not in i2c_init_board() */
+       return soft_i2c_board_init();
+ }
+diff --git a/board/sunxi/gmac.c b/board/sunxi/gmac.c
+index 4e222d8..69eb8ff 100644
+--- a/board/sunxi/gmac.c
++++ b/board/sunxi/gmac.c
+@@ -6,7 +6,7 @@
+ #include <asm/arch/clock.h>
+ #include <asm/arch/gpio.h>
+-int sunxi_gmac_initialize(bd_t *bis)
++void eth_init_board(void)
+ {
+       int pin;
+       struct sunxi_ccm_reg *const ccm =
+@@ -79,16 +79,4 @@ int sunxi_gmac_initialize(bd_t *bis)
+       for (pin = SUNXI_GPA(26); pin <= SUNXI_GPA(27); pin++)
+               sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
+ #endif
+-
+-#ifdef CONFIG_DM_ETH
+-      return 0;
+-#else
+-# ifdef CONFIG_RGMII
+-      return designware_initialize(SUNXI_GMAC_BASE, PHY_INTERFACE_MODE_RGMII);
+-# elif defined CONFIG_GMII
+-      return designware_initialize(SUNXI_GMAC_BASE, PHY_INTERFACE_MODE_GMII);
+-# else
+-      return designware_initialize(SUNXI_GMAC_BASE, PHY_INTERFACE_MODE_MII);
+-# endif
+-#endif
+ }