Initial Contribution
msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142
Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c
index c6d47d1..1064aa0 100644
--- a/drivers/net/smsc911x.c
+++ b/drivers/net/smsc911x.c
@@ -42,6 +42,7 @@
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/platform_device.h>
+#include <linux/gpio.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/bug.h>
@@ -872,7 +873,7 @@
(!pdata->using_extphy)) {
/* Restore original GPIO configuration */
pdata->gpio_setting = pdata->gpio_orig_setting;
- smsc911x_reg_write(pdata, GPIO_CFG,
+ smsc911x_reg_write(pdata, SMSC_GPIO_CFG,
pdata->gpio_setting);
}
} else {
@@ -880,7 +881,7 @@
/* Check global setting that LED1
* usage is 10/100 indicator */
pdata->gpio_setting = smsc911x_reg_read(pdata,
- GPIO_CFG);
+ SMSC_GPIO_CFG);
if ((pdata->gpio_setting & GPIO_CFG_LED1_EN_) &&
(!pdata->using_extphy)) {
/* Force 10/100 LED off, after saving
@@ -891,7 +892,7 @@
pdata->gpio_setting |= (GPIO_CFG_GPIOBUF0_
| GPIO_CFG_GPIODIR0_
| GPIO_CFG_GPIOD0_);
- smsc911x_reg_write(pdata, GPIO_CFG,
+ smsc911x_reg_write(pdata, SMSC_GPIO_CFG,
pdata->gpio_setting);
}
}
@@ -1314,7 +1315,7 @@
SMSC_WARN(pdata, ifup,
"Timed out waiting for EEPROM busy bit to clear");
- smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000);
+ smsc911x_reg_write(pdata, SMSC_GPIO_CFG, 0x70070000);
/* The soft reset above cleared the device's MAC address,
* restore it from local copy (set in probe) */
@@ -1758,9 +1759,9 @@
static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata)
{
- unsigned int temp = smsc911x_reg_read(pdata, GPIO_CFG);
+ unsigned int temp = smsc911x_reg_read(pdata, SMSC_GPIO_CFG);
temp &= ~GPIO_CFG_EEPR_EN_;
- smsc911x_reg_write(pdata, GPIO_CFG, temp);
+ smsc911x_reg_write(pdata, SMSC_GPIO_CFG, temp);
msleep(1);
}
@@ -2055,6 +2056,10 @@
SMSC_TRACE(pdata, ifdown, "Stopping driver");
+ if (pdata->config.has_reset_gpio) {
+ gpio_set_value_cansleep(pdata->config.reset_gpio, 0);
+ gpio_free(pdata->config.reset_gpio);
+ }
phy_disconnect(pdata->phy_dev);
pdata->phy_dev = NULL;
mdiobus_unregister(pdata->mii_bus);
@@ -2185,7 +2190,7 @@
smsc911x_reg_write(pdata, INT_EN, 0);
smsc911x_reg_write(pdata, INT_STS, 0xFFFFFFFF);
- retval = request_irq(dev->irq, smsc911x_irqhandler,
+ retval = request_any_context_irq(dev->irq, smsc911x_irqhandler,
irq_flags | IRQF_SHARED, dev->name, dev);
if (retval) {
SMSC_WARN(pdata, probe,
@@ -2277,6 +2282,10 @@
PMT_CTRL_PM_MODE_D1_ | PMT_CTRL_WOL_EN_ |
PMT_CTRL_ED_EN_ | PMT_CTRL_PME_EN_);
+ /* Drive the GPIO Ethernet_Reset Line low to Suspend */
+ if (pdata->config.has_reset_gpio)
+ gpio_set_value_cansleep(pdata->config.reset_gpio, 0);
+
return 0;
}
@@ -2286,6 +2295,9 @@
struct smsc911x_data *pdata = netdev_priv(ndev);
unsigned int to = 100;
+ if (pdata->config.has_reset_gpio)
+ gpio_set_value_cansleep(pdata->config.reset_gpio, 1);
+
/* Note 3.11 from the datasheet:
* "When the LAN9220 is in a power saving state, a write of any
* data to the BYTE_TEST register will wake-up the device."