aboutsummaryrefslogtreecommitdiffstats
path: root/package/boot/uboot-sunxi/patches/014-fix-gmac-init.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/boot/uboot-sunxi/patches/014-fix-gmac-init.patch')
-rw-r--r--package/boot/uboot-sunxi/patches/014-fix-gmac-init.patch135
1 files changed, 135 insertions, 0 deletions
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
index 0000000000..a4e43869a6
--- /dev/null
+++ b/package/boot/uboot-sunxi/patches/014-fix-gmac-init.patch
@@ -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
+ }