diff mbox

[4/6] mfd: arizona: Add gating of external MCLKn clocks

Message ID 1472831568-466-5-git-send-email-ckeepax@opensource.wolfsonmicro.com (mailing list archive)
State New, archived
Headers show

Commit Message

Charles Keepax Sept. 2, 2016, 3:52 p.m. UTC
From: Sylwester Nawrocki <s.nawrocki@samsung.com>

This patch adds requesting of the clocks supplied on MCLK1, MCLK2 pins,
gating of the 32k clock is added to the arizona_clk32k_enable(),
arizona_clk32k_disable() helpers.

It's a temporary change until the CODEC's clock controller gets exposed
through the clk API and is helpful for board configurations where the
MCLK clocks are not provided by always on oscillators.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
---
 drivers/mfd/arizona-core.c       | 30 ++++++++++++++++++++++++++++--
 include/linux/mfd/arizona/core.h |  9 +++++++++
 2 files changed, 37 insertions(+), 2 deletions(-)

Comments

Lee Jones Sept. 13, 2016, 12:44 p.m. UTC | #1
On Fri, 02 Sep 2016, Charles Keepax wrote:

> From: Sylwester Nawrocki <s.nawrocki@samsung.com>
> 
> This patch adds requesting of the clocks supplied on MCLK1, MCLK2 pins,
> gating of the 32k clock is added to the arizona_clk32k_enable(),
> arizona_clk32k_disable() helpers.
> 
> It's a temporary change until the CODEC's clock controller gets exposed
> through the clk API and is helpful for board configurations where the
> MCLK clocks are not provided by always on oscillators.
> 
> Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
> ---
>  drivers/mfd/arizona-core.c       | 30 ++++++++++++++++++++++++++++--
>  include/linux/mfd/arizona/core.h |  9 +++++++++
>  2 files changed, 37 insertions(+), 2 deletions(-)

Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>

Can I take this?

> diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
> index e4f97b3..4fa0fae 100644
> --- a/drivers/mfd/arizona-core.c
> +++ b/drivers/mfd/arizona-core.c
> @@ -10,6 +10,7 @@
>   * published by the Free Software Foundation.
>   */
>  
> +#include <linux/clk.h>
>  #include <linux/delay.h>
>  #include <linux/err.h>
>  #include <linux/gpio.h>
> @@ -49,7 +50,15 @@ int arizona_clk32k_enable(struct arizona *arizona)
>  		case ARIZONA_32KZ_MCLK1:
>  			ret = pm_runtime_get_sync(arizona->dev);
>  			if (ret != 0)
> -				goto out;
> +				goto err_ref;
> +			ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]);
> +			if (ret != 0)
> +				goto err_pm;
> +			break;
> +		case ARIZONA_32KZ_MCLK2:
> +			ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]);
> +			if (ret != 0)
> +				goto err_ref;
>  			break;
>  		}
>  
> @@ -58,7 +67,9 @@ int arizona_clk32k_enable(struct arizona *arizona)
>  					 ARIZONA_CLK_32K_ENA);
>  	}
>  
> -out:
> +err_pm:
> +	pm_runtime_put_sync(arizona->dev);
> +err_ref:
>  	if (ret != 0)
>  		arizona->clk32k_ref--;
>  
> @@ -83,6 +94,10 @@ int arizona_clk32k_disable(struct arizona *arizona)
>  		switch (arizona->pdata.clk32k_src) {
>  		case ARIZONA_32KZ_MCLK1:
>  			pm_runtime_put_sync(arizona->dev);
> +			clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK1]);
> +			break;
> +		case ARIZONA_32KZ_MCLK2:
> +			clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK2]);
>  			break;
>  		}
>  	}
> @@ -1000,6 +1015,7 @@ static const struct mfd_cell wm8998_devs[] = {
>  
>  int arizona_dev_init(struct arizona *arizona)
>  {
> +	const char * const mclk_name[] = { "mclk1", "mclk2" };
>  	struct device *dev = arizona->dev;
>  	const char *type_name = NULL;
>  	unsigned int reg, val, mask;
> @@ -1016,6 +1032,16 @@ int arizona_dev_init(struct arizona *arizona)
>  	else
>  		arizona_of_get_core_pdata(arizona);
>  
> +	BUILD_BUG_ON(ARRAY_SIZE(arizona->mclk) != ARRAY_SIZE(mclk_name));
> +	for (i = 0; i < ARRAY_SIZE(arizona->mclk); i++) {
> +		arizona->mclk[i] = devm_clk_get(arizona->dev, mclk_name[i]);
> +		if (IS_ERR(arizona->mclk[i])) {
> +			dev_info(arizona->dev, "Failed to get %s: %ld\n",
> +				 mclk_name[i], PTR_ERR(arizona->mclk[i]));
> +			arizona->mclk[i] = NULL;
> +		}
> +	}
> +
>  	regcache_cache_only(arizona->regmap, true);
>  
>  	switch (arizona->type) {
> diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h
> index 58ab4c0..b9909bb 100644
> --- a/include/linux/mfd/arizona/core.h
> +++ b/include/linux/mfd/arizona/core.h
> @@ -13,6 +13,7 @@
>  #ifndef _WM_ARIZONA_CORE_H
>  #define _WM_ARIZONA_CORE_H
>  
> +#include <linux/clk.h>
>  #include <linux/interrupt.h>
>  #include <linux/notifier.h>
>  #include <linux/regmap.h>
> @@ -21,6 +22,12 @@
>  
>  #define ARIZONA_MAX_CORE_SUPPLIES 2
>  
> +enum {
> +	ARIZONA_MCLK1,
> +	ARIZONA_MCLK2,
> +	ARIZONA_NUM_MCLK
> +};
> +
>  enum arizona_type {
>  	WM5102 = 1,
>  	WM5110 = 2,
> @@ -139,6 +146,8 @@ struct arizona {
>  	struct mutex clk_lock;
>  	int clk32k_ref;
>  
> +	struct clk *mclk[ARIZONA_NUM_MCLK];
> +
>  	bool ctrlif_error;
>  
>  	struct snd_soc_dapm_context *dapm;
Charles Keepax Sept. 13, 2016, 12:57 p.m. UTC | #2
On Tue, Sep 13, 2016 at 01:44:57PM +0100, Lee Jones wrote:
> On Fri, 02 Sep 2016, Charles Keepax wrote:
> 
> > From: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > 
> > This patch adds requesting of the clocks supplied on MCLK1, MCLK2 pins,
> > gating of the 32k clock is added to the arizona_clk32k_enable(),
> > arizona_clk32k_disable() helpers.
> > 
> > It's a temporary change until the CODEC's clock controller gets exposed
> > through the clk API and is helpful for board configurations where the
> > MCLK clocks are not provided by always on oscillators.
> > 
> > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
> > ---
> >  drivers/mfd/arizona-core.c       | 30 ++++++++++++++++++++++++++++--
> >  include/linux/mfd/arizona/core.h |  9 +++++++++
> >  2 files changed, 37 insertions(+), 2 deletions(-)
> 
> Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> 
> Can I take this?
> 

The two following ASoC patches depend on it, so its probably
slightly easier if they go through together.

Thanks,
Charles
Lee Jones Sept. 13, 2016, 1:11 p.m. UTC | #3
On Tue, 13 Sep 2016, Charles Keepax wrote:

> On Tue, Sep 13, 2016 at 01:44:57PM +0100, Lee Jones wrote:
> > On Fri, 02 Sep 2016, Charles Keepax wrote:
> > 
> > > From: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > > 
> > > This patch adds requesting of the clocks supplied on MCLK1, MCLK2 pins,
> > > gating of the 32k clock is added to the arizona_clk32k_enable(),
> > > arizona_clk32k_disable() helpers.
> > > 
> > > It's a temporary change until the CODEC's clock controller gets exposed
> > > through the clk API and is helpful for board configurations where the
> > > MCLK clocks are not provided by always on oscillators.
> > > 
> > > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > > Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
> > > ---
> > >  drivers/mfd/arizona-core.c       | 30 ++++++++++++++++++++++++++++--
> > >  include/linux/mfd/arizona/core.h |  9 +++++++++
> > >  2 files changed, 37 insertions(+), 2 deletions(-)
> > 
> > Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> > 
> > Can I take this?
> > 
> 
> The two following ASoC patches depend on it, so its probably
> slightly easier if they go through together.

Okay, let me know when you have all your Acks.
Mark Brown Sept. 14, 2016, 1:11 p.m. UTC | #4
On Tue, Sep 13, 2016 at 01:44:57PM +0100, Lee Jones wrote:
> On Fri, 02 Sep 2016, Charles Keepax wrote:

> Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>

> Can I take this?

The easiest thing would be if you applied it and then sent me a pull
request.
Charles Keepax Sept. 30, 2016, 9:29 a.m. UTC | #5
On Tue, Sep 13, 2016 at 02:11:50PM +0100, Lee Jones wrote:
> On Tue, 13 Sep 2016, Charles Keepax wrote:
> 
> > On Tue, Sep 13, 2016 at 01:44:57PM +0100, Lee Jones wrote:
> > > On Fri, 02 Sep 2016, Charles Keepax wrote:
> > > 
> > > > From: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > > > 
> > > > This patch adds requesting of the clocks supplied on MCLK1, MCLK2 pins,
> > > > gating of the 32k clock is added to the arizona_clk32k_enable(),
> > > > arizona_clk32k_disable() helpers.
> > > > 
> > > > It's a temporary change until the CODEC's clock controller gets exposed
> > > > through the clk API and is helpful for board configurations where the
> > > > MCLK clocks are not provided by always on oscillators.
> > > > 
> > > > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > > > Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
> > > > ---
> > > >  drivers/mfd/arizona-core.c       | 30 ++++++++++++++++++++++++++++--
> > > >  include/linux/mfd/arizona/core.h |  9 +++++++++
> > > >  2 files changed, 37 insertions(+), 2 deletions(-)
> > > 
> > > Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> > > 
> > > Can I take this?
> > > 
> > 
> > The two following ASoC patches depend on it, so its probably
> > slightly easier if they go through together.
> 
> Okay, let me know when you have all your Acks.
> 

Hi Lee, I see you have merged this patch on your public MFD
branch, is it possible to send Mark a branch to pull from now? So
we can get the other two patches merged.

Thanks,
Charles
Lee Jones Oct. 4, 2016, 2:52 p.m. UTC | #6
On Fri, 30 Sep 2016, Charles Keepax wrote:

> On Tue, Sep 13, 2016 at 02:11:50PM +0100, Lee Jones wrote:
> > On Tue, 13 Sep 2016, Charles Keepax wrote:
> > 
> > > On Tue, Sep 13, 2016 at 01:44:57PM +0100, Lee Jones wrote:
> > > > On Fri, 02 Sep 2016, Charles Keepax wrote:
> > > > 
> > > > > From: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > > > > 
> > > > > This patch adds requesting of the clocks supplied on MCLK1, MCLK2 pins,
> > > > > gating of the 32k clock is added to the arizona_clk32k_enable(),
> > > > > arizona_clk32k_disable() helpers.
> > > > > 
> > > > > It's a temporary change until the CODEC's clock controller gets exposed
> > > > > through the clk API and is helpful for board configurations where the
> > > > > MCLK clocks are not provided by always on oscillators.
> > > > > 
> > > > > Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
> > > > > Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
> > > > > ---
> > > > >  drivers/mfd/arizona-core.c       | 30 ++++++++++++++++++++++++++++--
> > > > >  include/linux/mfd/arizona/core.h |  9 +++++++++
> > > > >  2 files changed, 37 insertions(+), 2 deletions(-)
> > > > 
> > > > Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> > > > 
> > > > Can I take this?
> > > > 
> > > 
> > > The two following ASoC patches depend on it, so its probably
> > > slightly easier if they go through together.
> > 
> > Okay, let me know when you have all your Acks.
> > 
> 
> Hi Lee, I see you have merged this patch on your public MFD
> branch, is it possible to send Mark a branch to pull from now? So
> we can get the other two patches merged.

Done.
diff mbox

Patch

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index e4f97b3..4fa0fae 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -10,6 +10,7 @@ 
  * published by the Free Software Foundation.
  */
 
+#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/gpio.h>
@@ -49,7 +50,15 @@  int arizona_clk32k_enable(struct arizona *arizona)
 		case ARIZONA_32KZ_MCLK1:
 			ret = pm_runtime_get_sync(arizona->dev);
 			if (ret != 0)
-				goto out;
+				goto err_ref;
+			ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]);
+			if (ret != 0)
+				goto err_pm;
+			break;
+		case ARIZONA_32KZ_MCLK2:
+			ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]);
+			if (ret != 0)
+				goto err_ref;
 			break;
 		}
 
@@ -58,7 +67,9 @@  int arizona_clk32k_enable(struct arizona *arizona)
 					 ARIZONA_CLK_32K_ENA);
 	}
 
-out:
+err_pm:
+	pm_runtime_put_sync(arizona->dev);
+err_ref:
 	if (ret != 0)
 		arizona->clk32k_ref--;
 
@@ -83,6 +94,10 @@  int arizona_clk32k_disable(struct arizona *arizona)
 		switch (arizona->pdata.clk32k_src) {
 		case ARIZONA_32KZ_MCLK1:
 			pm_runtime_put_sync(arizona->dev);
+			clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK1]);
+			break;
+		case ARIZONA_32KZ_MCLK2:
+			clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK2]);
 			break;
 		}
 	}
@@ -1000,6 +1015,7 @@  static const struct mfd_cell wm8998_devs[] = {
 
 int arizona_dev_init(struct arizona *arizona)
 {
+	const char * const mclk_name[] = { "mclk1", "mclk2" };
 	struct device *dev = arizona->dev;
 	const char *type_name = NULL;
 	unsigned int reg, val, mask;
@@ -1016,6 +1032,16 @@  int arizona_dev_init(struct arizona *arizona)
 	else
 		arizona_of_get_core_pdata(arizona);
 
+	BUILD_BUG_ON(ARRAY_SIZE(arizona->mclk) != ARRAY_SIZE(mclk_name));
+	for (i = 0; i < ARRAY_SIZE(arizona->mclk); i++) {
+		arizona->mclk[i] = devm_clk_get(arizona->dev, mclk_name[i]);
+		if (IS_ERR(arizona->mclk[i])) {
+			dev_info(arizona->dev, "Failed to get %s: %ld\n",
+				 mclk_name[i], PTR_ERR(arizona->mclk[i]));
+			arizona->mclk[i] = NULL;
+		}
+	}
+
 	regcache_cache_only(arizona->regmap, true);
 
 	switch (arizona->type) {
diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h
index 58ab4c0..b9909bb 100644
--- a/include/linux/mfd/arizona/core.h
+++ b/include/linux/mfd/arizona/core.h
@@ -13,6 +13,7 @@ 
 #ifndef _WM_ARIZONA_CORE_H
 #define _WM_ARIZONA_CORE_H
 
+#include <linux/clk.h>
 #include <linux/interrupt.h>
 #include <linux/notifier.h>
 #include <linux/regmap.h>
@@ -21,6 +22,12 @@ 
 
 #define ARIZONA_MAX_CORE_SUPPLIES 2
 
+enum {
+	ARIZONA_MCLK1,
+	ARIZONA_MCLK2,
+	ARIZONA_NUM_MCLK
+};
+
 enum arizona_type {
 	WM5102 = 1,
 	WM5110 = 2,
@@ -139,6 +146,8 @@  struct arizona {
 	struct mutex clk_lock;
 	int clk32k_ref;
 
+	struct clk *mclk[ARIZONA_NUM_MCLK];
+
 	bool ctrlif_error;
 
 	struct snd_soc_dapm_context *dapm;