[U-Boot] [PATCH v2 2/4] mx6cuboxi: Add USB host support

Fabio Estevam festevam at gmail.com
Fri May 1 23:37:08 CEST 2015


Vagrant,

On Fri, May 1, 2015 at 5:20 PM, Fabio Estevam <festevam at gmail.com> wrote:

> Looking at Solid-run's tree they have the following commit that may be
> related to this PHY issue:

I applied Rabeeh's patch on top of this v2 series and generated the
two attached patches.

Could you please give them a try and let us know if it fixes the
Ethernet PHY detect issue?

Regards,

Fabio Estevam
-------------- next part --------------
From c0078a4fe907f8c579924f89ee5ac48e40d84736 Mon Sep 17 00:00:00 2001
From: Fabio Estevam <fabio.estevam at freescale.com>
Date: Fri, 1 May 2015 18:09:30 -0300
Subject: [PATCH 1/2] fec: Allow passing a phy mask in fecmxc_initialize_multi()

Instead of only accepting a fixed PHY address, allow passing a range of PHY
addresses through a mask address.

Signed-off-by: Rabeeh Khoury <rabeeh at solid-run.com>
Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
---
 board/denx/m28evk/m28evk.c               |  4 ++--
 board/freescale/mx28evk/mx28evk.c        |  4 ++--
 board/schulercontrol/sc_sps_1/sc_sps_1.c |  4 ++--
 drivers/net/fec_mxc.c                    | 10 +++++-----
 include/netdev.h                         |  2 +-
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/board/denx/m28evk/m28evk.c b/board/denx/m28evk/m28evk.c
index 33d38cf..7b4f67d 100644
--- a/board/denx/m28evk/m28evk.c
+++ b/board/denx/m28evk/m28evk.c
@@ -131,13 +131,13 @@ int board_eth_init(bd_t *bis)
 	udelay(10000);
 #endif
 
-	ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE);
+	ret = fecmxc_initialize_multi(bis, 0, 1 << 0, MXS_ENET0_BASE);
 	if (ret) {
 		printf("FEC MXS: Unable to init FEC0\n");
 		return ret;
 	}
 
-	ret = fecmxc_initialize_multi(bis, 1, 3, MXS_ENET1_BASE);
+	ret = fecmxc_initialize_multi(bis, 1, 1 << 3, MXS_ENET1_BASE);
 	if (ret) {
 		printf("FEC MXS: Unable to init FEC1\n");
 		return ret;
diff --git a/board/freescale/mx28evk/mx28evk.c b/board/freescale/mx28evk/mx28evk.c
index 5005fe2..4cf9332 100644
--- a/board/freescale/mx28evk/mx28evk.c
+++ b/board/freescale/mx28evk/mx28evk.c
@@ -118,13 +118,13 @@ int board_eth_init(bd_t *bis)
 	udelay(200);
 	gpio_set_value(MX28_PAD_ENET0_RX_CLK__GPIO_4_13, 1);
 
-	ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE);
+	ret = fecmxc_initialize_multi(bis, 0, 1 << 0, MXS_ENET0_BASE);
 	if (ret) {
 		puts("FEC MXS: Unable to init FEC0\n");
 		return ret;
 	}
 
-	ret = fecmxc_initialize_multi(bis, 1, 3, MXS_ENET1_BASE);
+	ret = fecmxc_initialize_multi(bis, 1, 1 << 3, MXS_ENET1_BASE);
 	if (ret) {
 		puts("FEC MXS: Unable to init FEC1\n");
 		return ret;
diff --git a/board/schulercontrol/sc_sps_1/sc_sps_1.c b/board/schulercontrol/sc_sps_1/sc_sps_1.c
index 7f0b591..fdaa383 100644
--- a/board/schulercontrol/sc_sps_1/sc_sps_1.c
+++ b/board/schulercontrol/sc_sps_1/sc_sps_1.c
@@ -79,13 +79,13 @@ int board_eth_init(bd_t *bis)
 		CLKCTRL_ENET_TIME_SEL_MASK,
 		CLKCTRL_ENET_TIME_SEL_RMII_CLK | CLKCTRL_ENET_CLK_OUT_EN);
 
-	ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE);
+	ret = fecmxc_initialize_multi(bis, 0, 1 << 0, MXS_ENET0_BASE);
 	if (ret) {
 		printf("FEC MXS: Unable to init FEC0\n");
 		return ret;
 	}
 
-	ret = fecmxc_initialize_multi(bis, 1, 1, MXS_ENET1_BASE);
+	ret = fecmxc_initialize_multi(bis, 1, 1 << 1, MXS_ENET1_BASE);
 	if (ret) {
 		printf("FEC MXS: Unable to init FEC1\n");
 		return ret;
diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index b572470..9817df2 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -1077,7 +1077,7 @@ struct mii_dev *fec_get_miibus(uint32_t base_addr, int dev_id)
 	return bus;
 }
 
-int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
+int fecmxc_initialize_multi(bd_t *bd, int dev_id, uint32_t phy_mask, uint32_t addr)
 {
 	uint32_t base_mii;
 	struct mii_dev *bus = NULL;
@@ -1095,19 +1095,19 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
 #else
 	base_mii = addr;
 #endif
-	debug("eth_init: fec_probe(bd, %i, %i) @ %08x\n", dev_id, phy_id, addr);
+	debug("eth_init: fec_probe(bd, %i, %i) @ %08x\n", dev_id, phy_mask, addr);
 	bus = fec_get_miibus(base_mii, dev_id);
 	if (!bus)
 		return -ENOMEM;
 #ifdef CONFIG_PHYLIB
-	phydev = phy_find_by_mask(bus, 1 << phy_id, PHY_INTERFACE_MODE_RGMII);
+	phydev = phy_find_by_mask(bus, phy_mask, PHY_INTERFACE_MODE_RGMII);
 	if (!phydev) {
 		free(bus);
 		return -ENOMEM;
 	}
 	ret = fec_probe(bd, dev_id, addr, bus, phydev);
 #else
-	ret = fec_probe(bd, dev_id, addr, bus, phy_id);
+	ret = fec_probe(bd, dev_id, addr, bus, phy_mask);
 #endif
 	if (ret) {
 #ifdef CONFIG_PHYLIB
@@ -1121,7 +1121,7 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
 #ifdef CONFIG_FEC_MXC_PHYADDR
 int fecmxc_initialize(bd_t *bd)
 {
-	return fecmxc_initialize_multi(bd, -1, CONFIG_FEC_MXC_PHYADDR,
+	return fecmxc_initialize_multi(bd, -1, 1 << CONFIG_FEC_MXC_PHYADDR,
 			IMX_FEC_BASE);
 }
 #endif
diff --git a/include/netdev.h b/include/netdev.h
index d96e1da..15c513d 100644
--- a/include/netdev.h
+++ b/include/netdev.h
@@ -49,7 +49,7 @@ int eth_3com_initialize (bd_t * bis);
 int ethoc_initialize(u8 dev_num, int base_addr);
 int fec_initialize (bd_t *bis);
 int fecmxc_initialize(bd_t *bis);
-int fecmxc_initialize_multi(bd_t *bis, int dev_id, int phy_id, uint32_t addr);
+int fecmxc_initialize_multi(bd_t *bis, int dev_id, uint32_t phy_mask, uint32_t addr);
 int ftgmac100_initialize(bd_t *bits);
 int ftmac100_initialize(bd_t *bits);
 int ftmac110_initialize(bd_t *bits);
-- 
1.9.1

-------------- next part --------------
From cc3a6625a4ddab8943c8d66f5dd0aac651e7c5e5 Mon Sep 17 00:00:00 2001
From: Fabio Estevam <fabio.estevam at freescale.com>
Date: Fri, 1 May 2015 18:16:13 -0300
Subject: [PATCH 2/2] mx6cuboxi: Fix Ethernet PHY undetected problem

mx6cuboxi sometimes fails to recognize the Ethernet PHY:

Net:   Phy 0 not found

The explanation comes from a patch from Rabeeh:

"Initialize the phy in address 0x0 or 0x4 (0x11 phy mask).
The LED_ACT pin on the carrier-one boards had a pull down that
forces the phy address to 0x0; where on CuBox-i and the production
HummingBoard that pin is connected directly to LED that depending
on the pull down strength of the LED it might be sampled as '0' or '1' thus
the phy address might appear as either address 0x0 or 0x4."

Reported-by: Vagrant Cascadian <vagrant at aikidev.net>
Signed-off-by: Rabeeh Khoury <rabeeh at solid-run.com>
Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
---
 board/solidrun/mx6cuboxi/mx6cuboxi.c | 16 ++++++++++++++++
 include/configs/mx6cuboxi.h          |  1 -
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c
index 9aa0259..d1ba2dd 100644
--- a/board/solidrun/mx6cuboxi/mx6cuboxi.c
+++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c
@@ -133,6 +133,8 @@ static iomux_v3_cfg_t const enet_pads[] = {
 	IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
 	IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
 	IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
+	IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
+	IOMUX_PADS(PAD_ENET_RXD1__GPIO1_IO26 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
 };
 
 static void setup_iomux_enet(void)
@@ -144,6 +146,20 @@ static void setup_iomux_enet(void)
 	gpio_set_value(ETH_PHY_RESET, 1);
 }
 
+int fecmxc_initialize(bd_t *bd)
+{
+	/*
+	 * Initialize the phy in address 0x0 or 0x4 (0x11 phy mask).
+	 * The LED_ACT pin on the carrier-one boards had a pull down that
+	 * forces the phy address to 0x0; where on CuBox-i and the production
+	 * HummingBoard that pin is connected directly to LED that depending
+	 * on the pull down strength of the LED it might be sampled
+	 * as '0' or '1' thus the phy address might appear as either address
+	 * 0x0 or 0x4.
+	 */
+	return fecmxc_initialize_multi(bd, -1, 0x11, IMX_FEC_BASE);
+}
+
 int board_phy_config(struct phy_device *phydev)
 {
 	if (phydev->drv->config)
diff --git a/include/configs/mx6cuboxi.h b/include/configs/mx6cuboxi.h
index 4e07f59..3759b3f 100644
--- a/include/configs/mx6cuboxi.h
+++ b/include/configs/mx6cuboxi.h
@@ -57,7 +57,6 @@
 #define CONFIG_MII
 #define IMX_FEC_BASE			ENET_BASE_ADDR
 #define CONFIG_FEC_XCV_TYPE		RGMII
-#define CONFIG_FEC_MXC_PHYADDR		0
 #define CONFIG_PHYLIB
 #define CONFIG_PHY_ATHEROS
 
-- 
1.9.1



More information about the U-Boot mailing list