Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 116931
b: refs/heads/master
c: 51d9861
h: refs/heads/master
i:
  116929: d04618c
  116927: 8e8455d
v: v3
  • Loading branch information
Wolfram Sang authored and Grant Likely committed Oct 15, 2008
1 parent f6f8ecd commit 3be2343
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 34 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9629095761b64636356c132f0228ed780ebb97e8
refs/heads/master: 51d9861e9e09c5c0066e5e5d9bb0009be1957899
55 changes: 22 additions & 33 deletions trunk/drivers/net/fec_mpc52xx_phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Driver for the MPC5200 Fast Ethernet Controller - MDIO bus driver
*
* Copyright (C) 2007 Domen Puncer, Telargo, Inc.
* Copyright (C) 2008 Wolfram Sang, Pengutronix
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
Expand All @@ -21,58 +22,45 @@ struct mpc52xx_fec_mdio_priv {
struct mpc52xx_fec __iomem *regs;
};

static int mpc52xx_fec_mdio_read(struct mii_bus *bus, int phy_id, int reg)
static int mpc52xx_fec_mdio_transfer(struct mii_bus *bus, int phy_id,
int reg, u32 value)
{
struct mpc52xx_fec_mdio_priv *priv = bus->priv;
struct mpc52xx_fec __iomem *fec;
int tries = 100;
u32 request = FEC_MII_READ_FRAME;

value |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK;
value |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK;

fec = priv->regs;
out_be32(&fec->ievent, FEC_IEVENT_MII);

request |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK;
request |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK;

out_be32(&priv->regs->mii_data, request);
out_be32(&priv->regs->mii_data, value);

/* wait for it to finish, this takes about 23 us on lite5200b */
while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries)
udelay(5);

if (tries == 0)
if (!tries)
return -ETIMEDOUT;

return in_be32(&priv->regs->mii_data) & FEC_MII_DATA_DATAMSK;
return value & FEC_MII_DATA_OP_RD ?
in_be32(&priv->regs->mii_data) & FEC_MII_DATA_DATAMSK : 0;
}

static int mpc52xx_fec_mdio_write(struct mii_bus *bus, int phy_id, int reg, u16 data)
static int mpc52xx_fec_mdio_read(struct mii_bus *bus, int phy_id, int reg)
{
struct mpc52xx_fec_mdio_priv *priv = bus->priv;
struct mpc52xx_fec __iomem *fec;
u32 value = data;
int tries = 100;

fec = priv->regs;
out_be32(&fec->ievent, FEC_IEVENT_MII);

value |= FEC_MII_WRITE_FRAME;
value |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK;
value |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK;

out_be32(&priv->regs->mii_data, value);

/* wait for request to finish */
while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries)
udelay(5);

if (tries == 0)
return -ETIMEDOUT;
return mpc52xx_fec_mdio_transfer(bus, phy_id, reg, FEC_MII_READ_FRAME);
}

return 0;
static int mpc52xx_fec_mdio_write(struct mii_bus *bus, int phy_id, int reg,
u16 data)
{
return mpc52xx_fec_mdio_transfer(bus, phy_id, reg,
data | FEC_MII_WRITE_FRAME);
}

static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_id *match)
static int mpc52xx_fec_mdio_probe(struct of_device *of,
const struct of_device_id *match)
{
struct device *dev = &of->dev;
struct device_node *np = of->node;
Expand Down Expand Up @@ -131,7 +119,8 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_i
dev_set_drvdata(dev, bus);

/* set MII speed */
out_be32(&priv->regs->mii_speed, ((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1);
out_be32(&priv->regs->mii_speed,
((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1);

/* enable MII interrupt */
out_be32(&priv->regs->imask, in_be32(&priv->regs->imask) | FEC_IMASK_MII);
Expand Down

0 comments on commit 3be2343

Please sign in to comment.