diff options
Diffstat (limited to 'drivers/net/smsc911x.c')
-rw-r--r-- | drivers/net/smsc911x.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index 94b6d2658ddc..04907ae11f51 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c @@ -128,6 +128,16 @@ static inline u32 smsc911x_reg_read(struct smsc911x_data *pdata, u32 reg) if (pdata->config.flags & SMSC911X_USE_32BIT) return readl(pdata->ioaddr + reg); +#ifdef CONFIG_ARCH_MXC + if (pdata->config.flags & 0x8000) { + u32 data; + unsigned long flags; + spin_lock_irqsave(&pdata->dev_lock, flags); + data = spi_cpld_read(reg); + spin_unlock_irqrestore(&pdata->dev_lock, flags); + return data; + } else +#endif if (pdata->config.flags & SMSC911X_USE_16BIT) { u32 data; unsigned long flags; @@ -155,6 +165,15 @@ static inline void smsc911x_reg_write(struct smsc911x_data *pdata, u32 reg, return; } +#ifdef CONFIG_ARCH_MXC + if (pdata->config.flags & 0x8000) { + unsigned long flags; + spin_lock_irqsave(&pdata->dev_lock, flags); + spi_cpld_write(reg, val); + spin_unlock_irqrestore(&pdata->dev_lock, flags); + return; + } else +#endif if (pdata->config.flags & SMSC911X_USE_16BIT) { unsigned long flags; @@ -2118,6 +2137,9 @@ static int smsc911x_suspend(struct platform_device *pdev, pm_message_t state) { struct net_device *dev = platform_get_drvdata(pdev); struct smsc911x_data *pdata = netdev_priv(dev); + struct phy_device *phy_dev = pdata->phy_dev; + + smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, BMCR_PDOWN); /* enable wake on LAN, energy detection and the external PME * signal. */ @@ -2132,6 +2154,7 @@ static int smsc911x_resume(struct platform_device *pdev) { struct net_device *dev = platform_get_drvdata(pdev); struct smsc911x_data *pdata = netdev_priv(dev); + struct phy_device *phy_dev = pdata->phy_dev; unsigned int to = 100; /* Note 3.11 from the datasheet: @@ -2146,6 +2169,8 @@ static int smsc911x_resume(struct platform_device *pdev) while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) udelay(1000); + smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART); + return (to == 0) ? -EIO : 0; } |