diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/clk/tegra/clk-tegra20.c | 36 | ||||
| -rw-r--r-- | drivers/clk/ux500/u8500_clk.c | 3 | ||||
| -rw-r--r-- | drivers/mmc/host/mmci.c | 9 | ||||
| -rw-r--r-- | drivers/net/ethernet/smsc/smsc911x.c | 29 | 
4 files changed, 41 insertions, 36 deletions
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index f873dcefe0d..bf194009e20 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c @@ -711,8 +711,8 @@ static void tegra20_pll_init(void)  }  static const char *cclk_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", -				      "pll_p_cclk", "pll_p_out4_cclk", -				      "pll_p_out3_cclk", "clk_d", "pll_x" }; +				      "pll_p", "pll_p_out4", +				      "pll_p_out3", "clk_d", "pll_x" };  static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4",  				      "pll_p_out3", "pll_p_out2", "clk_d",  				      "clk_32k", "pll_m_out1" }; @@ -721,38 +721,6 @@ static void tegra20_super_clk_init(void)  {  	struct clk *clk; -	/* -	 * DIV_U71 dividers for CCLK, these dividers are used only -	 * if parent clock is fixed rate. -	 */ - -	/* -	 * Clock input to cclk divided from pll_p using -	 * U71 divider of cclk. -	 */ -	clk = tegra_clk_register_divider("pll_p_cclk", "pll_p", -				clk_base + SUPER_CCLK_DIVIDER, 0, -				TEGRA_DIVIDER_INT, 16, 8, 1, NULL); -	clk_register_clkdev(clk, "pll_p_cclk", NULL); - -	/* -	 * Clock input to cclk divided from pll_p_out3 using -	 * U71 divider of cclk. -	 */ -	clk = tegra_clk_register_divider("pll_p_out3_cclk", "pll_p_out3", -				clk_base + SUPER_CCLK_DIVIDER, 0, -				TEGRA_DIVIDER_INT, 16, 8, 1, NULL); -	clk_register_clkdev(clk, "pll_p_out3_cclk", NULL); - -	/* -	 * Clock input to cclk divided from pll_p_out4 using -	 * U71 divider of cclk. -	 */ -	clk = tegra_clk_register_divider("pll_p_out4_cclk", "pll_p_out4", -				clk_base + SUPER_CCLK_DIVIDER, 0, -				TEGRA_DIVIDER_INT, 16, 8, 1, NULL); -	clk_register_clkdev(clk, "pll_p_out4_cclk", NULL); -  	/* CCLK */  	clk = tegra_clk_register_super_mux("cclk", cclk_parents,  			      ARRAY_SIZE(cclk_parents), CLK_SET_RATE_PARENT, diff --git a/drivers/clk/ux500/u8500_clk.c b/drivers/clk/ux500/u8500_clk.c index 6b889a0e90b..9d9add1e816 100644 --- a/drivers/clk/ux500/u8500_clk.c +++ b/drivers/clk/ux500/u8500_clk.c @@ -324,7 +324,8 @@ void u8500_clk_init(void)  	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,  				BIT(0), 0); -	clk_register_clkdev(clk, NULL, "fsmc"); +	clk_register_clkdev(clk, "fsmc", NULL); +	clk_register_clkdev(clk, NULL, "smsc911x");  	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,  				BIT(1), 0); diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 372e921389c..375c109607f 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -1141,6 +1141,11 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	case MMC_POWER_OFF:  		if (!IS_ERR(mmc->supply.vmmc))  			mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); + +		if (!IS_ERR(mmc->supply.vqmmc) && +		    regulator_is_enabled(mmc->supply.vqmmc)) +			regulator_disable(mmc->supply.vqmmc); +  		break;  	case MMC_POWER_UP:  		if (!IS_ERR(mmc->supply.vmmc)) @@ -1155,6 +1160,10 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  		break;  	case MMC_POWER_ON: +		if (!IS_ERR(mmc->supply.vqmmc) && +		    !regulator_is_enabled(mmc->supply.vqmmc)) +			regulator_enable(mmc->supply.vqmmc); +  		pwr |= MCI_PWR_ON;  		break;  	} diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index 48e2b99bec5..3663b9e04a3 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c @@ -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> @@ -144,6 +145,9 @@ struct smsc911x_data {  	/* regulators */  	struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES]; + +	/* clock */ +	struct clk *clk;  };  /* Easy access to information */ @@ -369,7 +373,7 @@ out:  }  /* - * enable resources, currently just regulators. + * enable regulator and clock resources.   */  static int smsc911x_enable_resources(struct platform_device *pdev)  { @@ -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;  } @@ -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;  } @@ -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;  } @@ -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  |