summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2017-12-28 14:07:09 +0100
committerMax Krummenacher <max.krummenacher@toradex.com>2019-01-30 18:05:13 +0100
commita7ab7b4911113bf5d23556c1d7ca34107947a725 (patch)
treeaec50179de6e6837481e5109b6334bdb5496642a /board
parent064c36d27aac74082df596fdf0981b759e581b2b (diff)
apalis-imx8: fix Ethernet
Make sure that all pins connected to the Micrel KSZ9031 PHY are muxed. Properly reset the PHY after all muxing has been applied. This makes sure that strapping is not overwritten by the SoC default mux (particularly it makes sure that CLK125_NDO is not driven low during reset). Make sure to not use CONFIG_DM_ETH as it seems to break ETH support as is. Signed-off-by: Stefan Agner <stefan.agner@toradex.com> (cherry picked from commit f0a1ceb6f5e2ab3b3618190541b1e7a9fd4c1e4a) (cherry picked from commit 8f6405070189a8744c2f6a9d9a6e041554fb9046) (cherry picked from commit 6f24c637fd7725a27249d6a950f587134f30b97c) (cherry picked from commit 1b3c97e1eb50a56066820596a6b1b83da465af7f)
Diffstat (limited to 'board')
-rw-r--r--board/toradex/apalis-imx8/apalis-imx8.c180
1 files changed, 49 insertions, 131 deletions
diff --git a/board/toradex/apalis-imx8/apalis-imx8.c b/board/toradex/apalis-imx8/apalis-imx8.c
index 95355297d2..c6dc0d9a03 100644
--- a/board/toradex/apalis-imx8/apalis-imx8.c
+++ b/board/toradex/apalis-imx8/apalis-imx8.c
@@ -225,28 +225,45 @@ int board_mmc_getcd(struct mmc *mmc)
#endif /* CONFIG_FSL_ESDHC */
+#ifdef CONFIG_MXC_GPIO
+
+#define LVDS_ENABLE IMX_GPIO_NR(1, 6)
+#define MIPI_ENABLE IMX_GPIO_NR(1, 7)
+#define DEBUG_LED IMX_GPIO_NR(2, 15)
+#define IOEXP_RESET IMX_GPIO_NR(1, 12)
+
+static iomux_cfg_t board_gpios[] = {
+ SC_P_LVDS0_I2C0_SCL | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+ SC_P_LVDS0_I2C0_SDA | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+ SC_P_LVDS1_I2C0_SCL | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+ SC_P_SPDIF0_TX | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+};
+
+static void board_gpio_init(void)
+{
+ imx8_iomux_setup_multiple_pads(board_gpios, ARRAY_SIZE(board_gpios));
+
+ gpio_request(DEBUG_LED, "debug_led");
+ gpio_direction_output(DEBUG_LED, 1);
+
+ /* enable i2c port expander assert reset line */
+ gpio_request(IOEXP_RESET, "ioexp_rst");
+ gpio_direction_output(IOEXP_RESET, 1);
+
+ /* enable LVDS SAS boards */
+ gpio_request(LVDS_ENABLE, "lvds_enable");
+ gpio_direction_output(LVDS_ENABLE, 1);
+
+ /* enable MIPI SAS boards */
+ gpio_request(MIPI_ENABLE, "mipi_enable");
+ gpio_direction_output(MIPI_ENABLE, 1);
+}
+#endif
#ifdef CONFIG_FEC_MXC
#include <miiphy.h>
-static iomux_cfg_t pad_enet1[] = {
- SC_P_ENET1_RGMII_RX_CTL | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
- SC_P_ENET1_RGMII_RXD0 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
- SC_P_ENET1_RGMII_RXD1 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
- SC_P_ENET1_RGMII_RXD2 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
- SC_P_ENET1_RGMII_RXD3 | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
- SC_P_ENET1_RGMII_RXC | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
- SC_P_ENET1_RGMII_TX_CTL | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
- SC_P_ENET1_RGMII_TXD0 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
- SC_P_ENET1_RGMII_TXD1 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
- SC_P_ENET1_RGMII_TXD2 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
- SC_P_ENET1_RGMII_TXD3 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
- SC_P_ENET1_RGMII_TXC | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
-
- /* Shared MDIO */
- SC_P_ENET0_MDC | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
- SC_P_ENET0_MDIO | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
-};
+#define ETH_RESET IMX_GPIO_NR(1, 11)
static iomux_cfg_t pad_enet0[] = {
SC_P_ENET0_RGMII_RX_CTL | MUX_PAD_CTRL(ENET_INPUT_PAD_CTRL),
@@ -261,50 +278,27 @@ static iomux_cfg_t pad_enet0[] = {
SC_P_ENET0_RGMII_TXD2 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
SC_P_ENET0_RGMII_TXD3 | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
SC_P_ENET0_RGMII_TXC | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+ SC_P_ENET0_REFCLK_125M_25M | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
/* Shared MDIO */
SC_P_ENET0_MDC | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
SC_P_ENET0_MDIO | MUX_PAD_CTRL(ENET_NORMAL_PAD_CTRL),
+
+ /* Ethernet PHY reset */
+ SC_P_LVDS1_GPIO01 | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
};
static void setup_iomux_fec(void)
{
- if (0 == CONFIG_FEC_ENET_DEV)
- imx8_iomux_setup_multiple_pads(pad_enet0, ARRAY_SIZE(pad_enet0));
- else
- imx8_iomux_setup_multiple_pads(pad_enet1, ARRAY_SIZE(pad_enet1));
+ imx8_iomux_setup_multiple_pads(pad_enet0, ARRAY_SIZE(pad_enet0));
}
static void enet_device_phy_reset(void)
{
- struct gpio_desc desc;
- int ret;
-
- if (0 == CONFIG_FEC_ENET_DEV) {
- ret = dm_gpio_lookup_name("gpio@18_1", &desc);
- if (ret)
- return;
-
- ret = dm_gpio_request(&desc, "enet0_reset");
- if (ret)
- return;
- } else {
- ret = dm_gpio_lookup_name("gpio@18_4", &desc);
- if (ret)
- return;
-
- ret = dm_gpio_request(&desc, "enet1_reset");
- if (ret)
- return;
- }
-
- dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT);
- dm_gpio_set_value(&desc, 0);
- udelay(50);
- dm_gpio_set_value(&desc, 1);
-
- /* The board has a long delay for this reset to become stable */
- mdelay(200);
+ gpio_request(ETH_RESET, "ETH_RESET#");
+ gpio_direction_output(ETH_RESET, 0);
+ mdelay(10);
+ gpio_set_value(ETH_RESET, 1);
}
int board_eth_init(bd_t *bis)
@@ -312,19 +306,14 @@ int board_eth_init(bd_t *bis)
int ret;
struct power_domain pd;
- printf("[%s] %d\n", __func__, __LINE__);
-
- if (CONFIG_FEC_ENET_DEV) {
- if (!power_domain_lookup_name("conn_enet1", &pd))
- power_domain_on(&pd);
- } else {
- if (!power_domain_lookup_name("conn_enet0", &pd))
- power_domain_on(&pd);
- }
+ if (!power_domain_lookup_name("conn_enet0", &pd))
+ power_domain_on(&pd);
setup_iomux_fec();
- ret = fecmxc_initialize_multi(bis, CONFIG_FEC_ENET_DEV,
+ enet_device_phy_reset();
+
+ ret = fecmxc_initialize_multi(bis, 0,
CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE);
if (ret)
printf("FEC1 MXC: %s:failed\n", __func__);
@@ -334,78 +323,11 @@ int board_eth_init(bd_t *bis)
int board_phy_config(struct phy_device *phydev)
{
-#ifdef CONFIG_FEC_ENABLE_MAX7322
- uint8_t value;
-
- /* This is needed to drive the pads to 1.8V instead of 1.5V */
- i2c_set_bus_num(CONFIG_MAX7322_I2C_BUS);
-
- if (!i2c_probe(CONFIG_MAX7322_I2C_ADDR)) {
- /* Write 0x1 to enable O0 output, this device has no addr */
- /* hence addr length is 0 */
- value = 0x1;
- if (i2c_write(CONFIG_MAX7322_I2C_ADDR, 0, 0, &value, 1))
- printf("MAX7322 write failed\n");
- } else {
- printf("MAX7322 Not found\n");
- }
- mdelay(1);
-#endif
-
- phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f);
- phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8);
-
- phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
- phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100);
-
if (phydev->drv->config)
phydev->drv->config(phydev);
return 0;
}
-
-static int setup_fec(int ind)
-{
- /* Reset ENET PHY */
- enet_device_phy_reset();
-
- return 0;
-}
-#endif
-
-#ifdef CONFIG_MXC_GPIO
-
-#define LVDS_ENABLE IMX_GPIO_NR(1, 6)
-#define MIPI_ENABLE IMX_GPIO_NR(1, 7)
-#define DEBUG_LED IMX_GPIO_NR(2, 15)
-#define IOEXP_RESET IMX_GPIO_NR(1, 12)
-
-static iomux_cfg_t board_gpios[] = {
- SC_P_LVDS0_I2C0_SCL | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
- SC_P_LVDS0_I2C0_SDA | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
- SC_P_LVDS1_I2C0_SCL | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
- SC_P_SPDIF0_TX | MUX_MODE_ALT(3) | MUX_PAD_CTRL(GPIO_PAD_CTRL),
-};
-
-static void board_gpio_init(void)
-{
- imx8_iomux_setup_multiple_pads(board_gpios, ARRAY_SIZE(board_gpios));
-
- gpio_request(DEBUG_LED, "debug_led");
- gpio_direction_output(DEBUG_LED, 1);
-
- /* enable i2c port expander assert reset line */
- gpio_request(IOEXP_RESET, "ioexp_rst");
- gpio_direction_output(IOEXP_RESET, 1);
-
- /* enable LVDS SAS boards */
- gpio_request(LVDS_ENABLE, "lvds_enable");
- gpio_direction_output(LVDS_ENABLE, 1);
-
- /* enable MIPI SAS boards */
- gpio_request(MIPI_ENABLE, "mipi_enable");
- gpio_direction_output(MIPI_ENABLE, 1);
-}
#endif
int checkboard(void)
@@ -486,10 +408,6 @@ int board_init(void)
board_gpio_init();
#endif
-#ifdef CONFIG_FEC_MXC
- setup_fec(CONFIG_FEC_ENET_DEV);
-#endif
-
#ifdef CONFIG_FSL_HSIO
imx8qm_hsio_initialize();
#ifdef CONFIG_SCSI_AHCI_PLAT