Hi Oliver.
We use i.MX6 Solo and RMII with on chip clock generator, PHY lan8720 as described in "Hardware Development Guide for i.MX 6Quad, 6Dual, 6DualLite 6Solo Families of Applications Processors"
http://cache.freescale.com/files/32bit/doc/user_guide/IMX6DQ6SDLHDG.pdf
Chapter 12 Using the RMII Interface
u-boot and linux kernel rel_imx_3.0.35_4.0.0
The major changes required in u-boot:
board/freescale/mx6q_xx/mx6q_xx.c
#define ANATOP_PLL_LOCK 0x80000000
#define ANATOP_PLL_PWDN_MASK 0x00001000
#define ANATOP_PLL_BYPASS_MASK 0x00010000
#define ANATOP_FEC_PLL_ENABLE_MASK 0x00002000
static int setup_fec(void)
{
u32 reg = 0;
s32 timeout = 100000;
/*
* get enet tx reference clk from internal clock from anatop
* GPR1[21] = 1
*/
reg = readl(IOMUXC_BASE_ADDR + 0x4);
reg |= (0x1 << 21);
writel(reg, IOMUXC_BASE_ADDR + 0x4);
/* Enable PLLs */
reg = readl(ANATOP_BASE_ADDR + 0xe0); /* ENET PLL */
if ((reg & ANATOP_PLL_PWDN_MASK) || (!(reg & ANATOP_PLL_LOCK))) {
reg &= ~ANATOP_PLL_PWDN_MASK;
writel(reg, ANATOP_BASE_ADDR + 0xe0);
while (timeout--) {
if (readl(ANATOP_BASE_ADDR + 0xe0) & ANATOP_PLL_LOCK)
break;
}
if (timeout <= 0)
return -1;
}
/* Enable FEC clock */
reg |= ANATOP_FEC_PLL_ENABLE_MASK;
reg &= ~ANATOP_PLL_BYPASS_MASK;
writel(reg, ANATOP_BASE_ADDR + 0xe0);
return 0;
}
....
int board_init(void)
{
...
setup_uart();
++ setup_fec();
...
iomux_v3_cfg_t enet_pads[] = {
MX6DL_PAD_GPIO_16__ENET_ANATOP_ETHERNET_REF_OUT,
MX6DL_PAD_ENET_MDIO__ENET_MDIO,
MX6DL_PAD_ENET_MDC__ENET_MDC,
MX6DL_PAD_ENET_CRS_DV__ENET_RX_EN,
MX6DL_PAD_ENET_RX_ER__ENET_RX_ER,
MX6DL_PAD_ENET_TX_EN__ENET_TX_EN,
MX6DL_PAD_ENET_RXD0__ENET_RDATA_0,
MX6DL_PAD_ENET_RXD1__ENET_RDATA_1,
MX6DL_PAD_ENET_TXD0__ENET_TDATA_0,
MX6DL_PAD_ENET_TXD1__ENET_TDATA_1,
MX6DL_PAD_ENET_REF_CLK__GPIO_1_23, /* phy reset: gpio1-23 */
};
...
drivers/net/mxc_fec.c
int fec_init(struct eth_device *dev, bd_t *bd)
{
...
#if defined(CONFIG_MX6Q) || defined(CONFIG_MX6DL)
-- fecp->rcr &= ~(0x100);
-- fecp->rcr |= 0x44;
++ fecp->rcr &= ~(0x40);
++ fecp->rcr |= 0x104;
#endif
....
not sure this is required:
include/asm-arm/arch-mx6/mx6dl_pins.h
#define MX6DL_PAD_GPIO_16__ENET_ANATOP_ETHERNET_REF_OUT \
-- IOMUX_PAD(0x05E4, 0x0214, 0x2, 0x080C, 0, NO_PAD_CTRL)
++ IOMUX_PAD(0x05E4, 0x0214, 0x12, 0x080C, 0, NO_PAD_CTRL)
Linux:
arch/arm/mach-mx6/board-mx6q_xx.c
static struct fec_platform_data fec_data __initdata = {
.init = mx6q_xx_fec_phy_init,
-- .phy = PHY_INTERFACE_MODE_RGMII,
++ .phy = PHY_INTERFACE_MODE_RMII,
#ifdef CONFIG_MX6_ENET_IRQ_TO_GPIO
.gpio_irq = MX6_ENET_IRQ,
#endif
};