diff options
| -rw-r--r-- | drivers/net/fec.c | 22 | ||||
| -rw-r--r-- | drivers/net/fec.h | 2 | ||||
| -rw-r--r-- | include/linux/fec.h | 21 |
3 files changed, 45 insertions, 0 deletions
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 42d9ac9ba395..326465ffbb23 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include <linux/clk.h> | 41 | #include <linux/clk.h> |
| 42 | #include <linux/platform_device.h> | 42 | #include <linux/platform_device.h> |
| 43 | #include <linux/phy.h> | 43 | #include <linux/phy.h> |
| 44 | #include <linux/fec.h> | ||
| 44 | 45 | ||
| 45 | #include <asm/cacheflush.h> | 46 | #include <asm/cacheflush.h> |
| 46 | 47 | ||
| @@ -182,6 +183,7 @@ struct fec_enet_private { | |||
| 182 | struct phy_device *phy_dev; | 183 | struct phy_device *phy_dev; |
| 183 | int mii_timeout; | 184 | int mii_timeout; |
| 184 | uint phy_speed; | 185 | uint phy_speed; |
| 186 | phy_interface_t phy_interface; | ||
| 185 | int index; | 187 | int index; |
| 186 | int link; | 188 | int link; |
| 187 | int full_duplex; | 189 | int full_duplex; |
| @@ -1191,6 +1193,21 @@ fec_restart(struct net_device *dev, int duplex) | |||
| 1191 | /* Set MII speed */ | 1193 | /* Set MII speed */ |
| 1192 | writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); | 1194 | writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); |
| 1193 | 1195 | ||
| 1196 | #ifdef FEC_MIIGSK_ENR | ||
| 1197 | if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) { | ||
| 1198 | /* disable the gasket and wait */ | ||
| 1199 | writel(0, fep->hwp + FEC_MIIGSK_ENR); | ||
| 1200 | while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4) | ||
| 1201 | udelay(1); | ||
| 1202 | |||
| 1203 | /* configure the gasket: RMII, 50 MHz, no loopback, no echo */ | ||
| 1204 | writel(1, fep->hwp + FEC_MIIGSK_CFGR); | ||
| 1205 | |||
| 1206 | /* re-enable the gasket */ | ||
| 1207 | writel(2, fep->hwp + FEC_MIIGSK_ENR); | ||
| 1208 | } | ||
| 1209 | #endif | ||
| 1210 | |||
| 1194 | /* And last, enable the transmit and receive processing */ | 1211 | /* And last, enable the transmit and receive processing */ |
| 1195 | writel(2, fep->hwp + FEC_ECNTRL); | 1212 | writel(2, fep->hwp + FEC_ECNTRL); |
| 1196 | writel(0, fep->hwp + FEC_R_DES_ACTIVE); | 1213 | writel(0, fep->hwp + FEC_R_DES_ACTIVE); |
| @@ -1226,6 +1243,7 @@ static int __devinit | |||
| 1226 | fec_probe(struct platform_device *pdev) | 1243 | fec_probe(struct platform_device *pdev) |
| 1227 | { | 1244 | { |
| 1228 | struct fec_enet_private *fep; | 1245 | struct fec_enet_private *fep; |
| 1246 | struct fec_platform_data *pdata; | ||
| 1229 | struct net_device *ndev; | 1247 | struct net_device *ndev; |
| 1230 | int i, irq, ret = 0; | 1248 | int i, irq, ret = 0; |
| 1231 | struct resource *r; | 1249 | struct resource *r; |
| @@ -1259,6 +1277,10 @@ fec_probe(struct platform_device *pdev) | |||
| 1259 | 1277 | ||
| 1260 | platform_set_drvdata(pdev, ndev); | 1278 | platform_set_drvdata(pdev, ndev); |
| 1261 | 1279 | ||
| 1280 | pdata = pdev->dev.platform_data; | ||
| 1281 | if (pdata) | ||
| 1282 | fep->phy_interface = pdata->phy; | ||
| 1283 | |||
| 1262 | /* This device has up to three irqs on some platforms */ | 1284 | /* This device has up to three irqs on some platforms */ |
| 1263 | for (i = 0; i < 3; i++) { | 1285 | for (i = 0; i < 3; i++) { |
| 1264 | irq = platform_get_irq(pdev, i); | 1286 | irq = platform_get_irq(pdev, i); |
diff --git a/drivers/net/fec.h b/drivers/net/fec.h index cc47f3f057c7..2c48b25668d5 100644 --- a/drivers/net/fec.h +++ b/drivers/net/fec.h | |||
| @@ -43,6 +43,8 @@ | |||
| 43 | #define FEC_R_DES_START 0x180 /* Receive descriptor ring */ | 43 | #define FEC_R_DES_START 0x180 /* Receive descriptor ring */ |
| 44 | #define FEC_X_DES_START 0x184 /* Transmit descriptor ring */ | 44 | #define FEC_X_DES_START 0x184 /* Transmit descriptor ring */ |
| 45 | #define FEC_R_BUFF_SIZE 0x188 /* Maximum receive buff size */ | 45 | #define FEC_R_BUFF_SIZE 0x188 /* Maximum receive buff size */ |
| 46 | #define FEC_MIIGSK_CFGR 0x300 /* MIIGSK Configuration reg */ | ||
| 47 | #define FEC_MIIGSK_ENR 0x308 /* MIIGSK Enable reg */ | ||
| 46 | 48 | ||
| 47 | #else | 49 | #else |
| 48 | 50 | ||
diff --git a/include/linux/fec.h b/include/linux/fec.h new file mode 100644 index 000000000000..5d3523d8dd0c --- /dev/null +++ b/include/linux/fec.h | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | /* include/linux/fec.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2009 Orex Computed Radiography | ||
| 4 | * Baruch Siach <baruch@tkos.co.il> | ||
| 5 | * | ||
| 6 | * Header file for the FEC platform data | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | #ifndef __LINUX_FEC_H__ | ||
| 13 | #define __LINUX_FEC_H__ | ||
| 14 | |||
| 15 | #include <linux/phy.h> | ||
| 16 | |||
| 17 | struct fec_platform_data { | ||
| 18 | phy_interface_t phy; | ||
| 19 | }; | ||
| 20 | |||
| 21 | #endif | ||
