All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] ad1836/ad1938: PM and typo fix/cleanup
@ 2009-12-25  6:10 Barry Song
  2009-12-25  6:10 ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Barry Song
  0 siblings, 1 reply; 5+ messages in thread
From: Barry Song @ 2009-12-25  6:10 UTC (permalink / raw)
  To: broonie; +Cc: uclinux-dist-devel, alsa-devel, Barry Song

Hi Mark,
The following 3 patches fix/cleanup PM and typo of ad1836/ad1938 codec driver:

1. ad1836: reset and restore clock control mode in suspend/resume entry 
2. ad1938: fix typo, rename mask to rx_mask for ad1938_set_tdm_slot
3. ad1938:let soc-core dapm handle PLL power

As I will send patches special for moving to soc-cache, in patch 1, I still use
the old way to read/write codec registers.

Thanks
Barry

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry
  2009-12-25  6:10 [PATCH 0/3] ad1836/ad1938: PM and typo fix/cleanup Barry Song
@ 2009-12-25  6:10 ` Barry Song
  2009-12-25  6:10   ` [PATCH 2/3] ad1938: fix typo, rename mask to rx_mask for ad1938_set_tdm_slot Barry Song
  2009-12-30 18:31   ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Mark Brown
  0 siblings, 2 replies; 5+ messages in thread
From: Barry Song @ 2009-12-25  6:10 UTC (permalink / raw)
  To: broonie; +Cc: uclinux-dist-devel, alsa-devel, Barry Song

Tests show frequent suspend/resume(frequent poweroff/on ad1836 internal components)
maybe make ad1836 clock mode wrong sometimes after wakeup. This patch reset/restore
ad1836 clock mode while executing PM, then ad1836 can always resume to right clock
status.

Signed-off-by: Barry Song <21cnbao@gmail.com>
---
 sound/soc/codecs/ad1836.c |   32 ++++++++++++++++++++++++++++++++
 1 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c
index 2c18e3d..83add2f 100644
--- a/sound/soc/codecs/ad1836.c
+++ b/sound/soc/codecs/ad1836.c
@@ -223,6 +223,36 @@ static unsigned int ad1836_read_reg_cache(struct snd_soc_codec *codec,
 	return reg_cache[reg];
 }
 
+#ifdef CONFIG_PM
+static int ad1836_soc_suspend(struct platform_device *pdev,
+		pm_message_t state)
+{
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec *codec = socdev->card->codec;
+
+	/* reset clock control mode */
+	u16 adc_ctrl2 =  codec->read(codec, AD1836_ADC_CTRL2);
+	adc_ctrl2 &= ~AD1836_ADC_SERFMT_MASK;
+
+	return codec->write(codec, AD1836_ADC_CTRL2, adc_ctrl2);
+}
+
+static int ad1836_soc_resume(struct platform_device *pdev)
+{
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec *codec = socdev->card->codec;
+
+	/* restore clock control mode */
+	u16 adc_ctrl2 = codec->read(codec, AD1836_ADC_CTRL2);
+	adc_ctrl2 |= AD1836_ADC_AUX;
+
+	return codec->write(codec, AD1836_ADC_CTRL2, adc_ctrl2);
+}
+#else
+#define ad1836_soc_suspend NULL
+#define ad1836_soc_resume  NULL
+#endif
+
 static int __devinit ad1836_spi_probe(struct spi_device *spi)
 {
 	struct snd_soc_codec *codec;
@@ -404,6 +434,8 @@ static int ad1836_remove(struct platform_device *pdev)
 struct snd_soc_codec_device soc_codec_dev_ad1836 = {
 	.probe = 	ad1836_probe,
 	.remove = 	ad1836_remove,
+	.suspend =      ad1836_soc_suspend,
+	.resume =       ad1836_soc_resume,
 };
 EXPORT_SYMBOL_GPL(soc_codec_dev_ad1836);
 
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] ad1938: fix typo, rename mask to rx_mask for ad1938_set_tdm_slot
  2009-12-25  6:10 ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Barry Song
@ 2009-12-25  6:10   ` Barry Song
  2009-12-25  6:10     ` [PATCH 3/3] ad1938:let soc-core dapm handle PLL power Barry Song
  2009-12-30 18:31   ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Mark Brown
  1 sibling, 1 reply; 5+ messages in thread
From: Barry Song @ 2009-12-25  6:10 UTC (permalink / raw)
  To: broonie; +Cc: uclinux-dist-devel, alsa-devel, Barry Song

Signed-off-by: Barry Song <21cnbao@gmail.com>
---
 sound/soc/codecs/ad1938.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/sound/soc/codecs/ad1938.c b/sound/soc/codecs/ad1938.c
index 5d48918..735c356 100644
--- a/sound/soc/codecs/ad1938.c
+++ b/sound/soc/codecs/ad1938.c
@@ -145,7 +145,7 @@ static inline int ad1938_pll_powerctrl(struct snd_soc_codec *codec, int cmd)
 }
 
 static int ad1938_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
-			       unsigned int mask, int slots, int width)
+			       unsigned int rx_mask, int slots, int width)
 {
 	struct snd_soc_codec *codec = dai->codec;
 	int dac_reg = codec->read(codec, AD1938_DAC_CTRL1);
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] ad1938:let soc-core dapm handle PLL power
  2009-12-25  6:10   ` [PATCH 2/3] ad1938: fix typo, rename mask to rx_mask for ad1938_set_tdm_slot Barry Song
@ 2009-12-25  6:10     ` Barry Song
  0 siblings, 0 replies; 5+ messages in thread
From: Barry Song @ 2009-12-25  6:10 UTC (permalink / raw)
  To: broonie; +Cc: uclinux-dist-devel, alsa-devel, Barry Song

PM architecture of ad1938 is simple, we don't need a bundle of functions like
ad1938_pll_powerctrl, ad1938_set_bias_level for only PLL. A dapm supply will
handle on/off of PLL.
Since soc-core can poweron/off PLL on-demand, we don't need to poweron/off PLL
in suspend/resume entries too.

Signed-off-by: Barry Song <21cnbao@gmail.com>
---
 sound/soc/codecs/ad1938.c |   62 ++------------------------------------------
 1 files changed, 3 insertions(+), 59 deletions(-)

diff --git a/sound/soc/codecs/ad1938.c b/sound/soc/codecs/ad1938.c
index 735c356..47d9ac0 100644
--- a/sound/soc/codecs/ad1938.c
+++ b/sound/soc/codecs/ad1938.c
@@ -97,6 +97,7 @@ static const struct snd_kcontrol_new ad1938_snd_controls[] = {
 static const struct snd_soc_dapm_widget ad1938_dapm_widgets[] = {
 	SND_SOC_DAPM_DAC("DAC", "Playback", AD1938_DAC_CTRL0, 0, 1),
 	SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
+	SND_SOC_DAPM_SUPPLY("PLL_PWR", AD1938_PLL_CLK_CTRL0, 0, 1, NULL, 0),
 	SND_SOC_DAPM_SUPPLY("ADC_PWR", AD1938_ADC_CTRL0, 0, 1, NULL, 0),
 	SND_SOC_DAPM_OUTPUT("DAC1OUT"),
 	SND_SOC_DAPM_OUTPUT("DAC2OUT"),
@@ -107,6 +108,8 @@ static const struct snd_soc_dapm_widget ad1938_dapm_widgets[] = {
 };
 
 static const struct snd_soc_dapm_route audio_paths[] = {
+	{ "DAC", NULL, "PLL_PWR" },
+	{ "ADC", NULL, "PLL_PWR" },
 	{ "DAC", NULL, "ADC_PWR" },
 	{ "ADC", NULL, "ADC_PWR" },
 	{ "DAC1OUT", "DAC1 Switch", "DAC" },
@@ -134,16 +137,6 @@ static int ad1938_mute(struct snd_soc_dai *dai, int mute)
 	return 0;
 }
 
-static inline int ad1938_pll_powerctrl(struct snd_soc_codec *codec, int cmd)
-{
-	int reg = codec->read(codec, AD1938_PLL_CLK_CTRL0);
-	reg = (cmd > 0) ? reg & (~AD1938_PLL_POWERDOWN) : reg |
-		AD1938_PLL_POWERDOWN;
-	codec->write(codec, AD1938_PLL_CLK_CTRL0, reg);
-
-	return 0;
-}
-
 static int ad1938_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 			       unsigned int rx_mask, int slots, int width)
 {
@@ -306,24 +299,6 @@ static int ad1938_hw_params(struct snd_pcm_substream *substream,
 	return 0;
 }
 
-static int ad1938_set_bias_level(struct snd_soc_codec *codec,
-		enum snd_soc_bias_level level)
-{
-	switch (level) {
-	case SND_SOC_BIAS_ON:
-		ad1938_pll_powerctrl(codec, 1);
-		break;
-	case SND_SOC_BIAS_PREPARE:
-		break;
-	case SND_SOC_BIAS_STANDBY:
-	case SND_SOC_BIAS_OFF:
-		ad1938_pll_powerctrl(codec, 0);
-		break;
-	}
-	codec->bias_level = level;
-	return 0;
-}
-
 /*
  * interface to read/write ad1938 register
  */
@@ -514,7 +489,6 @@ static int ad1938_register(struct ad1938_priv *ad1938)
 	codec->num_dai = 1;
 	codec->write = ad1938_write_reg;
 	codec->read = ad1938_read_reg_cache;
-	codec->set_bias_level = ad1938_set_bias_level;
 	INIT_LIST_HEAD(&codec->dapm_widgets);
 	INIT_LIST_HEAD(&codec->dapm_paths);
 
@@ -559,7 +533,6 @@ static int ad1938_register(struct ad1938_priv *ad1938)
 
 static void ad1938_unregister(struct ad1938_priv *ad1938)
 {
-	ad1938_set_bias_level(&ad1938->codec, SND_SOC_BIAS_OFF);
 	snd_soc_unregister_dai(&ad1938_dai);
 	snd_soc_unregister_codec(&ad1938->codec);
 	kfree(ad1938);
@@ -593,7 +566,6 @@ static int ad1938_probe(struct platform_device *pdev)
 				  ARRAY_SIZE(ad1938_dapm_widgets));
 	snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
 
-	ad1938_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
 
 pcm_err:
 	return ret;
@@ -610,37 +582,9 @@ static int ad1938_remove(struct platform_device *pdev)
 	return 0;
 }
 
-#ifdef CONFIG_PM
-static int ad1938_suspend(struct platform_device *pdev,
-		pm_message_t state)
-{
-	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-	struct snd_soc_codec *codec = socdev->card->codec;
-
-	ad1938_set_bias_level(codec, SND_SOC_BIAS_OFF);
-	return 0;
-}
-
-static int ad1938_resume(struct platform_device *pdev)
-{
-	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-	struct snd_soc_codec *codec = socdev->card->codec;
-
-	if (codec->suspend_bias_level == SND_SOC_BIAS_ON)
-		ad1938_set_bias_level(codec, SND_SOC_BIAS_ON);
-
-	return 0;
-}
-#else
-#define ad1938_suspend NULL
-#define ad1938_resume NULL
-#endif
-
 struct snd_soc_codec_device soc_codec_dev_ad1938 = {
 	.probe = 	ad1938_probe,
 	.remove = 	ad1938_remove,
-	.suspend =      ad1938_suspend,
-	.resume =       ad1938_resume,
 };
 EXPORT_SYMBOL_GPL(soc_codec_dev_ad1938);
 
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry
  2009-12-25  6:10 ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Barry Song
  2009-12-25  6:10   ` [PATCH 2/3] ad1938: fix typo, rename mask to rx_mask for ad1938_set_tdm_slot Barry Song
@ 2009-12-30 18:31   ` Mark Brown
  1 sibling, 0 replies; 5+ messages in thread
From: Mark Brown @ 2009-12-30 18:31 UTC (permalink / raw)
  To: Barry Song; +Cc: uclinux-dist-devel, alsa-devel

On Fri, Dec 25, 2009 at 02:10:06PM +0800, Barry Song wrote:
> Tests show frequent suspend/resume(frequent poweroff/on ad1836 internal components)
> maybe make ad1836 clock mode wrong sometimes after wakeup. This patch reset/restore
> ad1836 clock mode while executing PM, then ad1836 can always resume to right clock
> status.
> 
> Signed-off-by: Barry Song <21cnbao@gmail.com>

Applied all three, thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-12-30 18:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-25  6:10 [PATCH 0/3] ad1836/ad1938: PM and typo fix/cleanup Barry Song
2009-12-25  6:10 ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Barry Song
2009-12-25  6:10   ` [PATCH 2/3] ad1938: fix typo, rename mask to rx_mask for ad1938_set_tdm_slot Barry Song
2009-12-25  6:10     ` [PATCH 3/3] ad1938:let soc-core dapm handle PLL power Barry Song
2009-12-30 18:31   ` [PATCH 1/3] ad1836: reset and restore clock control mode in suspend/resume entry Mark Brown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.