summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2014-03-27 15:21:18 +0100
committerStefan Agner <stefan@agner.ch>2014-05-15 13:48:47 +0200
commitb7abbee6ae02442498a6f4ab37f696e1fa057953 (patch)
tree8ee990478486b354b77fc3a9908202ee89554e7c
parentb2ea6f57645e26f8b099ea87aeeef6149dbb2e96 (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.c24
-rw-r--r--arch/arm/mach-mvf/devices-mvf.h4
-rw-r--r--arch/arm/mach-mvf/mvf_fec.c14
-rw-r--r--arch/arm/plat-mxc/include/mach/iomux-mvf.h13
-rw-r--r--drivers/net/Kconfig7
-rwxr-xr-xdrivers/net/fec.c6
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 */