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: Baruch Siach <baruch@tkos.co.il> Acked-by: Greg Ungerer <gerg@uclinux.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8286274284
commit
5eb32bd059
@ -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 {
|
|||||||
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)
|
|||||||
/* 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
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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
|
||||||
|
|
||||||
|
21
include/linux/fec.h
Normal file
21
include/linux/fec.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/* 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
|
Loading…
Reference in New Issue
Block a user