Skip to content

Commit

Permalink
net/smsc911x: Provide common clock functionality
Browse files Browse the repository at this point in the history
Some platforms provide clocks which require enabling before the
SMSC911x chip will power on. This patch uses the new common clk
framework to do just that. If no clock is provided, it will just
be ignored and the driver will continue to assume that no clock
is required for the chip to run successfully.

Acked-by: David S. Miller <davem@davemloft.net>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Lee Jones authored and Linus Walleij committed Mar 1, 2013
1 parent 1e6b680 commit b6c2301
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion drivers/net/ethernet/smsc/smsc911x.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/crc32.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/etherdevice.h>
Expand Down Expand Up @@ -144,6 +145,9 @@ struct smsc911x_data {

/* regulators */
struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES];

/* clock */
struct clk *clk;
};

/* Easy access to information */
Expand Down Expand Up @@ -369,7 +373,7 @@ smsc911x_rx_readfifo_shift(struct smsc911x_data *pdata, unsigned int *buf,
}

/*
* enable resources, currently just regulators.
* enable regulator and clock resources.
*/
static int smsc911x_enable_resources(struct platform_device *pdev)
{
Expand All @@ -382,6 +386,13 @@ static int smsc911x_enable_resources(struct platform_device *pdev)
if (ret)
netdev_err(ndev, "failed to enable regulators %d\n",
ret);

if (!IS_ERR(pdata->clk)) {
ret = clk_prepare_enable(pdata->clk);
if (ret < 0)
netdev_err(ndev, "failed to enable clock %d\n", ret);
}

return ret;
}

Expand All @@ -396,6 +407,10 @@ static int smsc911x_disable_resources(struct platform_device *pdev)

ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies),
pdata->supplies);

if (!IS_ERR(pdata->clk))
clk_disable_unprepare(pdata->clk);

return ret;
}

Expand All @@ -421,6 +436,12 @@ static int smsc911x_request_resources(struct platform_device *pdev)
if (ret)
netdev_err(ndev, "couldn't get regulators %d\n",
ret);

/* Request clock */
pdata->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(pdata->clk))
netdev_warn(ndev, "couldn't get clock %li\n", PTR_ERR(pdata->clk));

return ret;
}

Expand All @@ -436,6 +457,12 @@ static void smsc911x_free_resources(struct platform_device *pdev)
/* Free regulators */
regulator_bulk_free(ARRAY_SIZE(pdata->supplies),
pdata->supplies);

/* Free clock */
if (!IS_ERR(pdata->clk)) {
clk_put(pdata->clk);
pdata->clk = NULL;
}
}

/* waits for MAC not busy, with timeout. Only called by smsc911x_mac_read
Expand Down

0 comments on commit b6c2301

Please sign in to comment.