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/ks8851.c b/drivers/net/ks8851.c
index bcd9ba6..f79dce2 100644
--- a/drivers/net/ks8851.c
+++ b/drivers/net/ks8851.c
@@ -21,7 +21,7 @@
 #include <linux/cache.h>
 #include <linux/crc32.h>
 #include <linux/mii.h>
-
+#include <linux/regulator/consumer.h>
 #include <linux/spi/spi.h>
 
 #include "ks8851.h"
@@ -127,6 +127,8 @@
 	struct spi_message	spi_msg2;
 	struct spi_transfer	spi_xfer1;
 	struct spi_transfer	spi_xfer2[2];
+	struct regulator	*vdd_io;
+	struct regulator	*vdd_phy;
 };
 
 static int msg_enable;
@@ -1592,6 +1594,15 @@
 
 	ks = netdev_priv(ndev);
 
+	ks->vdd_io = regulator_get(&spi->dev, "vdd_io");
+	ks->vdd_phy = regulator_get(&spi->dev, "vdd_phy");
+
+	if (!IS_ERR(ks->vdd_io))
+		regulator_enable(ks->vdd_io);
+
+	if (!IS_ERR(ks->vdd_phy))
+		regulator_enable(ks->vdd_phy);
+
 	ks->netdev = ndev;
 	ks->spidev = spi;
 	ks->tx_space = 6144;
@@ -1686,6 +1697,16 @@
 err_id:
 err_irq:
 	free_netdev(ndev);
+
+	if (!IS_ERR(ks->vdd_io)) {
+		regulator_disable(ks->vdd_phy);
+		regulator_put(ks->vdd_io);
+	}
+
+	if (!IS_ERR(ks->vdd_phy)) {
+		regulator_disable(ks->vdd_phy);
+		regulator_put(ks->vdd_phy);
+	}
 	return ret;
 }
 
@@ -1696,6 +1717,16 @@
 	if (netif_msg_drv(priv))
 		dev_info(&spi->dev, "remove\n");
 
+	if (!IS_ERR(priv->vdd_io)) {
+		regulator_disable(priv->vdd_phy);
+		regulator_put(priv->vdd_io);
+	}
+
+	if (!IS_ERR(priv->vdd_phy)) {
+		regulator_disable(priv->vdd_phy);
+		regulator_put(priv->vdd_phy);
+	}
+
 	unregister_netdev(priv->netdev);
 	free_irq(spi->irq, priv);
 	free_netdev(priv->netdev);