summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2009-02-20 18:10:17 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2009-02-20 18:25:24 +0100
commit1e20d6bc20ed0d97912936b1f5f51dfc63128916 (patch)
tree19cc1967f0c1d0b4b5e9fe022770810a026187e6
parent370f550107b57f02c7cb5cdbdf8b6c0872de0acd (diff)
downloadbarebox-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.c13
-rw-r--r--drivers/net/fec_imx27.h16
-rw-r--r--include/fec.h1
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;
/*