Message ID | 1458674652-12141-1-git-send-email-hdegoede@redhat.com |
---|---|
State | Accepted |
Commit | fc8991c61c393ce6a9d3dfc97cb56dbbd9e8cbba |
Delegated to: | Hans de Goede |
Headers | show |
On 03/22/2016 08:24 PM, Hans de Goede wrote: > 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> > --- > Changes in v2: > -Move enabling of phy power to board_init() > --- > 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 > } Tested-by: Michael Haas <haas@computerlinguist.org>
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 }