diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2009-02-20 18:10:17 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2009-02-20 18:25:24 +0100 |
commit | 1e20d6bc20ed0d97912936b1f5f51dfc63128916 (patch) | |
tree | 19cc1967f0c1d0b4b5e9fe022770810a026187e6 | |
parent | 370f550107b57f02c7cb5cdbdf8b6c0872de0acd (diff) | |
download | barebox-1e20d6bc20ed0d97912936b1f5f51dfc63128916.tar.gz barebox-1e20d6bc20ed0d97912936b1f5f51dfc63128916.tar.xz |
fec imx27: Add RMII support
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/net/fec_imx27.c | 13 | ||||
-rw-r--r-- | drivers/net/fec_imx27.h | 16 | ||||
-rw-r--r-- | include/fec.h | 1 |
3 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/fec_imx27.c b/drivers/net/fec_imx27.c index 3cf8d6a69d..4491d88ade 100644 --- a/drivers/net/fec_imx27.c +++ b/drivers/net/fec_imx27.c @@ -615,6 +615,19 @@ int fec_probe(struct device_d *dev) sprintf(dev->name, "FEC ETHERNET"); + if (fec->xcv_type == RMII) { + /* disable the gasket and wait */ + writel(0, dev->map_base + FEC_MIIGSK_ENR); + while (readl(dev->map_base + FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY) + udelay(1); + + /* configure the gasket for RMII, 50 MHz, no loopback, no echo */ + writel(FEC_MIIGSK_CFGR_IF_MODE_RMII, dev->map_base + FEC_MIIGSK_CFGR); + + /* re-enable the gasket */ + writel(FEC_MIIGSK_ENR_EN, dev->map_base + FEC_MIIGSK_ENR); + } + if (fec->xcv_type != SEVENWIRE) { fec->miiphy.read = fec_miiphy_read; fec->miiphy.write = fec_miiphy_write; diff --git a/drivers/net/fec_imx27.h b/drivers/net/fec_imx27.h index 3f8f45d5a2..2029fc6ee5 100644 --- a/drivers/net/fec_imx27.h +++ b/drivers/net/fec_imx27.h @@ -218,6 +218,22 @@ typedef struct ethernet_register_set { uint32_t RES11[64]; /* MBAR_ETH + 0x300-3FF */ } ethernet_regs; +#define FEC_MIIGSK_CFGR 0x300 +#define FEC_MIIGSK_ENR 0x308 +/* + * Some i.MXs allows RMII mode to be configured via a gasket + */ +#define FEC_MIIGSK_CFGR_FRCONT (1 << 6) +#define FEC_MIIGSK_CFGR_LBMODE (1 << 4) +#define FEC_MIIGSK_CFGR_EMODE (1 << 3) +#define FEC_MIIGSK_CFGR_IF_MODE_MASK (3 << 0) +#define FEC_MIIGSK_CFGR_IF_MODE_MII (0 << 0) +#define FEC_MIIGSK_CFGR_IF_MODE_RMII (1 << 0) + +#define FEC_MIIGSK_ENR_READY (1 << 2) +#define FEC_MIIGSK_ENR_EN (1 << 1) + + #define FEC_IEVENT_HBERR 0x80000000 #define FEC_IEVENT_BABR 0x40000000 #define FEC_IEVENT_BABT 0x20000000 diff --git a/include/fec.h b/include/fec.h index 8f6bdb3fdc..85691b6854 100644 --- a/include/fec.h +++ b/include/fec.h @@ -32,6 +32,7 @@ typedef enum { SEVENWIRE, MII10, MII100, + RMII, } xceiver_type; /* |