Commit 5eb32bd0 authored by Baruch Siach's avatar Baruch Siach Committed by David S. Miller

fec: add support for PHY interface platform data

The i.MX25 PDK uses RMII to communicate with its PHY. This patch adds
the ability to configure RMII, based on platform data.
Signed-off-by: default avatarBaruch Siach <baruch@tkos.co.il>
Acked-by: default avatarGreg Ungerer <gerg@uclinux.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 82862742
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/fec.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
...@@ -182,6 +183,7 @@ struct fec_enet_private { ...@@ -182,6 +183,7 @@ struct fec_enet_private {
struct phy_device *phy_dev; struct phy_device *phy_dev;
int mii_timeout; int mii_timeout;
uint phy_speed; uint phy_speed;
phy_interface_t phy_interface;
int index; int index;
int link; int link;
int full_duplex; int full_duplex;
...@@ -1191,6 +1193,21 @@ fec_restart(struct net_device *dev, int duplex) ...@@ -1191,6 +1193,21 @@ fec_restart(struct net_device *dev, int duplex)
/* Set MII speed */ /* Set MII speed */
writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED);
#ifdef FEC_MIIGSK_ENR
if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) {
/* disable the gasket and wait */
writel(0, fep->hwp + FEC_MIIGSK_ENR);
while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4)
udelay(1);
/* configure the gasket: RMII, 50 MHz, no loopback, no echo */
writel(1, fep->hwp + FEC_MIIGSK_CFGR);
/* re-enable the gasket */
writel(2, fep->hwp + FEC_MIIGSK_ENR);
}
#endif
/* And last, enable the transmit and receive processing */ /* And last, enable the transmit and receive processing */
writel(2, fep->hwp + FEC_ECNTRL); writel(2, fep->hwp + FEC_ECNTRL);
writel(0, fep->hwp + FEC_R_DES_ACTIVE); writel(0, fep->hwp + FEC_R_DES_ACTIVE);
...@@ -1226,6 +1243,7 @@ static int __devinit ...@@ -1226,6 +1243,7 @@ static int __devinit
fec_probe(struct platform_device *pdev) fec_probe(struct platform_device *pdev)
{ {
struct fec_enet_private *fep; struct fec_enet_private *fep;
struct fec_platform_data *pdata;
struct net_device *ndev; struct net_device *ndev;
int i, irq, ret = 0; int i, irq, ret = 0;
struct resource *r; struct resource *r;
...@@ -1259,6 +1277,10 @@ fec_probe(struct platform_device *pdev) ...@@ -1259,6 +1277,10 @@ fec_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, ndev); platform_set_drvdata(pdev, ndev);
pdata = pdev->dev.platform_data;
if (pdata)
fep->phy_interface = pdata->phy;
/* This device has up to three irqs on some platforms */ /* This device has up to three irqs on some platforms */
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
irq = platform_get_irq(pdev, i); irq = platform_get_irq(pdev, i);
......
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
#define FEC_R_DES_START 0x180 /* Receive descriptor ring */ #define FEC_R_DES_START 0x180 /* Receive descriptor ring */
#define FEC_X_DES_START 0x184 /* Transmit descriptor ring */ #define FEC_X_DES_START 0x184 /* Transmit descriptor ring */
#define FEC_R_BUFF_SIZE 0x188 /* Maximum receive buff size */ #define FEC_R_BUFF_SIZE 0x188 /* Maximum receive buff size */
#define FEC_MIIGSK_CFGR 0x300 /* MIIGSK Configuration reg */
#define FEC_MIIGSK_ENR 0x308 /* MIIGSK Enable reg */
#else #else
......
/* include/linux/fec.h
*
* Copyright (c) 2009 Orex Computed Radiography
* Baruch Siach <baruch@tkos.co.il>
*
* Header file for the FEC platform data
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __LINUX_FEC_H__
#define __LINUX_FEC_H__
#include <linux/phy.h>
struct fec_platform_data {
phy_interface_t phy;
};
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment