diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2014-03-27 15:21:18 +0100 |
---|---|---|
committer | Stefan Agner <stefan@agner.ch> | 2014-05-15 13:48:47 +0200 |
commit | b7abbee6ae02442498a6f4ab37f696e1fa057953 (patch) | |
tree | 8ee990478486b354b77fc3a9908202ee89554e7c | |
parent | b2ea6f57645e26f8b099ea87aeeef6149dbb2e96 (diff) |
colibri_vf: add support for second Ethernet
Add alternative pinmux and platform data for second Ethernet. Also
make sure MAC address is calculated from first Ethernet MAC address,
which is derived from part serial number. Note that FEC1 is the
default Ethernet controller (and hence eth0), while FEC0 is the
additional Ethernet controller (eth1).
-rw-r--r-- | arch/arm/mach-mvf/board-colibri_vf.c | 24 | ||||
-rw-r--r-- | arch/arm/mach-mvf/devices-mvf.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-mvf/mvf_fec.c | 14 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/iomux-mvf.h | 13 | ||||
-rw-r--r-- | drivers/net/Kconfig | 7 | ||||
-rwxr-xr-x | drivers/net/fec.c | 6 |
6 files changed, 63 insertions, 5 deletions
diff --git a/arch/arm/mach-mvf/board-colibri_vf.c b/arch/arm/mach-mvf/board-colibri_vf.c index 782d8d7b2ddd..a631517e5490 100644 --- a/arch/arm/mach-mvf/board-colibri_vf.c +++ b/arch/arm/mach-mvf/board-colibri_vf.c @@ -108,6 +108,20 @@ static iomux_v3_cfg_t mvf600_pads[] = { /* GPIO for CAN Interrupt */ MVF600_PAD43_PTB21__CAN_INT, + /* FEC0: Ethernet */ +#ifdef CONFIG_FEC0 + MVF600_PAD2_PTA9__RMII_CLKOUT, + MVF600_PAD45_PTC0__RMII0_MDC, + MVF600_PAD46_PTC1__RMII0_MDIO, + MVF600_PAD47_PTC2__RMII0_CRS_DV, + MVF600_PAD48_PTC3__RMII0_RXD1, + MVF600_PAD49_PTC4__RMII0_RXD0, + MVF600_PAD50_PTC5__RMII0_RXER, + MVF600_PAD51_PTC6__RMII0_TXD1, + MVF600_PAD52_PTC7__RMII0_TXD0, + MVF600_PAD53_PTC8__RMII0_TXEN, +#endif + /* FEC1: Ethernet */ MVF600_PAD0_PTA6__RMII_CLKOUT, MVF600_PAD54_PTC9__RMII1_MDC, @@ -155,7 +169,9 @@ static iomux_v3_cfg_t mvf600_pads[] = { MVF600_PAD131_PTE26_DCU0_B5, MVF600_PAD132_PTE27_DCU0_B6, MVF600_PAD133_PTE28_DCU0_B7, +#ifndef CONFIG_FEC0 MVF600_PAD45_PTC0_BL_ON, +#endif /* UART1: UART_C */ MVF600_PAD26_PTB4_UART1_TX, @@ -183,10 +199,18 @@ static iomux_v3_cfg_t mvf600_pads[] = { MVF600_PAD108_PTE3__USB_OC, /* PWM */ +#ifndef CONFIG_FEC0 MVF600_PAD22_PTB0_FTM0CH0, //PWM<A> multiplexed MVF600_PAD52_PTC7_VID7 +#else + MVF600_PAD22_PTB0_GPIO, +#endif MVF600_PAD23_PTB1_FTM0CH1, //PWM<c> MVF600_PAD30_PTB8_FTM1CH0, //PWM<B> +#ifndef CONFIG_FEC0 MVF600_PAD31_PTB9_FTM1CH1, //PWM<D> multiplexed MVF600_PAD51_PTC6_VID6 +#else + MVF600_PAD31_PTB9_GPIO, +#endif /* Wake-Up GPIO */ MVF600_PAD41_PTB19__GPIO, diff --git a/arch/arm/mach-mvf/devices-mvf.h b/arch/arm/mach-mvf/devices-mvf.h index c434834ba0b2..c5c3db9d13a1 100644 --- a/arch/arm/mach-mvf/devices-mvf.h +++ b/arch/arm/mach-mvf/devices-mvf.h @@ -28,8 +28,8 @@ extern const struct imx_snvs_rtc_data mvf_snvs_rtc_data __initconst; imx_add_snvs_rtc(&mvf_snvs_rtc_data) extern const struct imx_fec_data mvf_fec_data[] __initconst; -#define mvf_add_fec(id, pdata) \ - imx_add_fec(id, &mvf_fec_data[id], pdata) +#define mvf_add_fec(id, fec_data, pdata) \ + imx_add_fec(id, fec_data, pdata) extern const struct imx_sdhci_esdhc_imx_data mvf_sdhci_esdhc_imx_data[] __initconst; diff --git a/arch/arm/mach-mvf/mvf_fec.c b/arch/arm/mach-mvf/mvf_fec.c index 55ba44bf73f0..5cbed27ba9aa 100644 --- a/arch/arm/mach-mvf/mvf_fec.c +++ b/arch/arm/mach-mvf/mvf_fec.c @@ -53,9 +53,19 @@ void __init mvf_init_fec(struct fec_platform_data fec_data) memcpy(fec_data.mac, default_mac, ETH_ALEN); #if !defined(CONFIG_COLIBRI_VF) - mvf_add_fec(0, &fec_data); +#ifdef CONFIG_FEC0 + mvf_add_fec(0, &mvf_fec_data[0], &fec_data); #endif #ifdef CONFIG_FEC1 - mvf_add_fec(1, &fec_data); + mvf_add_fec(1, &mvf_fec_data[1], &fec_data); +#endif +#else + /* Inverse device ID */ +#ifdef CONFIG_FEC1 + mvf_add_fec(0, &mvf_fec_data[1], &fec_data); +#endif +#ifdef CONFIG_FEC0 + mvf_add_fec(1, &mvf_fec_data[0], &fec_data); +#endif #endif } diff --git a/arch/arm/plat-mxc/include/mach/iomux-mvf.h b/arch/arm/plat-mxc/include/mach/iomux-mvf.h index 9978dc02f832..b77d2d40d284 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-mvf.h +++ b/arch/arm/plat-mxc/include/mach/iomux-mvf.h @@ -170,6 +170,10 @@ typedef enum iomux_config { #define MVF600_PAD0_PTA6__RMII_CLKOUT \ IOMUX_PAD(0x0000, 0x0000, 1, 0x0000, 0, \ MVF600_ENET_PAD_CTRL | PAD_CTL_IBE_ENABLE) +#define MVF600_PAD2_PTA9__RMII_CLKOUT \ + IOMUX_PAD(0x0008, 0x0008, 2, 0x0000, 0, \ + MVF600_ENET_PAD_CTRL | PAD_CTL_IBE_ENABLE) + #define MVF600_PAD45_PTC0__RMII0_MDC \ IOMUX_PAD(0x00B4, 0x00B4, 1, 0x0000, 0, \ MVF600_ENET_PAD_CTRL | PAD_CTL_OBE_ENABLE) @@ -432,6 +436,15 @@ typedef enum iomux_config { IOMUX_PAD(0x002C, 0x002C, 6, 0x0390, 0, \ MVF600_UART_PAD_CTRL | PAD_CTL_IBE_ENABLE) +/* GPIO Input (disabled in case of 2nd Ethernet) */ +#define MVF600_PAD22_PTB0_GPIO \ + IOMUX_PAD(0x0058, 0x0058, 0, 0x0000, 0, \ + MVF600_GPIO_GENERAL_CTRL | PAD_CTL_IBE_ENABLE) +#define MVF600_PAD31_PTB9_GPIO \ + IOMUX_PAD(0x007C, 0x007C, 0, 0x0000, 0, \ + MVF600_GPIO_GENERAL_CTRL | PAD_CTL_IBE_ENABLE) + + /* FlexTimer channel pin */ #define MVF600_PAD22_PTB0_FTM0CH0 \ IOMUX_PAD(0x0058, 0x0058, 1, 0x0000, 0, MVF600_FTM0_CH_CTRL) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index de2905a67e76..31da73894a70 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -1951,6 +1951,13 @@ config FEC Say Y here if you want to use the built-in 10/100 Fast ethernet controller on some Motorola ColdFire and Freescale i.MX processors. +config FEC0 + bool "First FEC ethernet controller (of Vybrid and ColdFire)" + depends on FEC && (ARCH_MVF || M54455 || M5441X) + help + Say Y here if you want to use the first built-in 10/100 Fast + ethernet controller on Vybrid and some ColdFire processors. + config FEC1 bool "Second FEC ethernet controller (of Vybrid and ColdFire)" depends on FEC && (ARCH_MVF || M54455 || M5441X) diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 8a2c60f29898..bcd02e5cfaf0 100755 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -691,8 +691,12 @@ static void __inline__ fec_get_mac(struct net_device *ndev) memcpy(ndev->dev_addr, iap, ETH_ALEN); -#if !defined(CONFIG_COLIBRI_VF) /* Adjust MAC if using macaddr */ +#if CONFIG_COLIBRI_VF + /* Add 0x100000 to the first MAC address to get the second */ + if (iap == macaddr) + ndev->dev_addr[3] = macaddr[3] + (fep->pdev->id * 0x10); +#else if (iap == macaddr) ndev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->pdev->id; #endif /* !CONFIG_COLIBRI_VF */ |