Skip to content

Commit

Permalink
net: micrel : ks8851-ml: add vdd-supply support
Browse files Browse the repository at this point in the history
Few platforms use external regulator to keep the ethernet MAC supplied.
So, request and enable the regulator for driver functionality.

Fixes: 66fda75 (regulator: core: Replace direct ops->disable usage)
Reported-by: Russell King <rmk+kernel@arm.linux.org.uk>
Suggested-by: Markus Pargmann <mpa@pengutronix.de>
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Nishanth Menon authored and David S. Miller committed Mar 24, 2014
1 parent b74d3fe commit ebf4ad9
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
1 change: 1 addition & 0 deletions Documentation/devicetree/bindings/net/micrel-ks8851.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ Required properties:

Optional properties:
- local-mac-address : Ethernet mac address to use
- vdd-supply: supply for Ethernet mac
30 changes: 29 additions & 1 deletion drivers/net/ethernet/micrel/ks8851.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/crc32.h>
#include <linux/mii.h>
#include <linux/eeprom_93cx6.h>
#include <linux/regulator/consumer.h>

#include <linux/spi/spi.h>

Expand Down Expand Up @@ -83,6 +84,7 @@ union ks8851_tx_hdr {
* @rc_rxqcr: Cached copy of KS_RXQCR.
* @eeprom_size: Companion eeprom size in Bytes, 0 if no eeprom
* @eeprom: 93CX6 EEPROM state for accessing on-board EEPROM.
* @vdd_reg: Optional regulator supplying the chip
*
* The @lock ensures that the chip is protected when certain operations are
* in progress. When the read or write packet transfer is in progress, most
Expand Down Expand Up @@ -130,6 +132,7 @@ struct ks8851_net {
struct spi_transfer spi_xfer2[2];

struct eeprom_93cx6 eeprom;
struct regulator *vdd_reg;
};

static int msg_enable;
Expand Down Expand Up @@ -1414,6 +1417,21 @@ static int ks8851_probe(struct spi_device *spi)
ks->spidev = spi;
ks->tx_space = 6144;

ks->vdd_reg = regulator_get_optional(&spi->dev, "vdd");
if (IS_ERR(ks->vdd_reg)) {
ret = PTR_ERR(ks->vdd_reg);
if (ret == -EPROBE_DEFER)
goto err_reg;
} else {
ret = regulator_enable(ks->vdd_reg);
if (ret) {
dev_err(&spi->dev, "regulator enable fail: %d\n",
ret);
goto err_reg_en;
}
}


mutex_init(&ks->lock);
spin_lock_init(&ks->statelock);

Expand Down Expand Up @@ -1508,8 +1526,14 @@ static int ks8851_probe(struct spi_device *spi)
err_netdev:
free_irq(ndev->irq, ks);

err_id:
err_irq:
err_id:
if (!IS_ERR(ks->vdd_reg))
regulator_disable(ks->vdd_reg);
err_reg_en:
if (!IS_ERR(ks->vdd_reg))
regulator_put(ks->vdd_reg);
err_reg:
free_netdev(ndev);
return ret;
}
Expand All @@ -1523,6 +1547,10 @@ static int ks8851_remove(struct spi_device *spi)

unregister_netdev(priv->netdev);
free_irq(spi->irq, priv);
if (!IS_ERR(priv->vdd_reg)) {
regulator_disable(priv->vdd_reg);
regulator_put(priv->vdd_reg);
}
free_netdev(priv->netdev);

return 0;
Expand Down

0 comments on commit ebf4ad9

Please sign in to comment.