alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend
@ 2011-09-27  9:08 Lars-Peter Clausen
  2011-09-27  9:08 ` [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby Lars-Peter Clausen
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Lars-Peter Clausen @ 2011-09-27  9:08 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: alsa-devel, Lars-Peter Clausen, stable, device-drivers-devel

Currently the the internal oscillator is powered down when entering BIAS_OFF
state, but not re-enabled when going back to BIAS_STANDBY. As a result the
CODEC will stop working after suspend if the internal oscillator is used to
generate the sysclock signal. This patch fixes it by clearing the appropriate
bit in the power down register when the CODEC is re-enabled.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Cc: stable@kernel.org
---
 sound/soc/codecs/ssm2602.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index cceb002..32d6c51 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -430,7 +430,8 @@ static int ssm2602_set_dai_fmt(struct snd_soc_dai *codec_dai,
 static int ssm2602_set_bias_level(struct snd_soc_codec *codec,
 				 enum snd_soc_bias_level level)
 {
-	u16 reg = snd_soc_read(codec, SSM2602_PWR) & 0xff7f;
+	u16 reg = snd_soc_read(codec, SSM2602_PWR);
+	reg &= ~(PWR_POWER_OFF | PWR_OSC_PDN);
 
 	switch (level) {
 	case SND_SOC_BIAS_ON:
-- 
1.7.2.5

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

* [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby
  2011-09-27  9:08 [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Lars-Peter Clausen
@ 2011-09-27  9:08 ` Lars-Peter Clausen
  2011-09-27 10:22   ` Mark Brown
  2011-09-27  9:08 ` [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state Lars-Peter Clausen
  2011-09-27 10:20 ` [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Mark Brown
  2 siblings, 1 reply; 7+ messages in thread
From: Lars-Peter Clausen @ 2011-09-27  9:08 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: alsa-devel, Lars-Peter Clausen, device-drivers-devel

Set the initial bias level to standby during CODEC probe instead of leaving the
CODEC powered off.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ssm2602.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index 32d6c51..c9e0fdb 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -577,7 +577,12 @@ static int ssm260x_probe(struct snd_soc_codec *codec)
 		break;
 	}
 
-	return ret;
+	if (ret)
+		return ret;
+
+	ssm2602_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+
+	return 0;
 }
 
 /* remove everything here */
-- 
1.7.2.5

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

* [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state
  2011-09-27  9:08 [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Lars-Peter Clausen
  2011-09-27  9:08 ` [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby Lars-Peter Clausen
@ 2011-09-27  9:08 ` Lars-Peter Clausen
  2011-09-27 12:30   ` Mark Brown
  2011-09-27 10:20 ` [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Mark Brown
  2 siblings, 1 reply; 7+ messages in thread
From: Lars-Peter Clausen @ 2011-09-27  9:08 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood
  Cc: alsa-devel, Lars-Peter Clausen, device-drivers-devel

Currently the oscillator is always enabled and the clock output is always
disabled. This patch adds support for controlling the oscillator and clock
output state through snd_soc_dai_set_sysclk. Which makes it possible to
disable or enable them dynamically according to the requirements of the board
on which the CODEC is used.

This patch also slightly modifies the behavior as to when the oscillator is
going to be disabled in low-power states. Previously it would only be disabled
in BIAS_OFF, now it is also going to be disabled in BIAS_STANDBY, since no
components which depend on it should be active in this state.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 sound/soc/codecs/ssm2602.c |   67 +++++++++++++++++++++++++++++++++----------
 sound/soc/codecs/ssm2602.h |    6 +++-
 2 files changed, 56 insertions(+), 17 deletions(-)

diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index c9e0fdb..e149ec6 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -59,6 +59,7 @@ struct ssm2602_priv {
 	struct snd_pcm_substream *slave_substream;
 
 	enum ssm2602_type type;
+	unsigned int clk_out_pwr;
 };
 
 /*
@@ -356,16 +357,46 @@ static int ssm2602_set_dai_sysclk(struct snd_soc_dai *codec_dai,
 {
 	struct snd_soc_codec *codec = codec_dai->codec;
 	struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
-	switch (freq) {
-	case 11289600:
-	case 12000000:
-	case 12288000:
-	case 16934400:
-	case 18432000:
-		ssm2602->sysclk = freq;
-		return 0;
+
+	if (dir == SND_SOC_CLOCK_IN) {
+		if (clk_id != SSM2602_SYSCLK)
+			return -EINVAL;
+
+		switch (freq) {
+		case 11289600:
+		case 12000000:
+		case 12288000:
+		case 16934400:
+		case 18432000:
+			ssm2602->sysclk = freq;
+			break;
+		default:
+			return -EINVAL;
+		}
+	} else {
+		unsigned int mask;
+
+		switch (clk_id) {
+		case SSM2602_CLK_CLKOUT:
+			mask = PWR_CLK_OUT_PDN;
+			break;
+		case SSM2602_CLK_XTO:
+			mask = PWR_OSC_PDN;
+			break;
+		default:
+			return -EINVAL;
+		}
+
+		if (freq == 0)
+			ssm2602->clk_out_pwr |= mask;
+		else
+			ssm2602->clk_out_pwr &= ~mask;
+
+		snd_soc_update_bits(codec, SSM2602_PWR,
+			PWR_CLK_OUT_PDN | PWR_OSC_PDN, ssm2602->clk_out_pwr);
 	}
-	return -EINVAL;
+
+	return 0;
 }
 
 static int ssm2602_set_dai_fmt(struct snd_soc_dai *codec_dai,
@@ -430,23 +461,27 @@ static int ssm2602_set_dai_fmt(struct snd_soc_dai *codec_dai,
 static int ssm2602_set_bias_level(struct snd_soc_codec *codec,
 				 enum snd_soc_bias_level level)
 {
-	u16 reg = snd_soc_read(codec, SSM2602_PWR);
-	reg &= ~(PWR_POWER_OFF | PWR_OSC_PDN);
+	struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
 
 	switch (level) {
 	case SND_SOC_BIAS_ON:
-		/* vref/mid, osc on, dac unmute */
-		snd_soc_write(codec, SSM2602_PWR, reg);
+		/* vref/mid on, osc and clkout on if enabled */
+		snd_soc_update_bits(codec, SSM2602_PWR,
+			PWR_POWER_OFF | PWR_CLK_OUT_PDN | PWR_OSC_PDN,
+			ssm2602->clk_out_pwr);
 		break;
 	case SND_SOC_BIAS_PREPARE:
 		break;
 	case SND_SOC_BIAS_STANDBY:
 		/* everything off except vref/vmid, */
-		snd_soc_write(codec, SSM2602_PWR, reg | PWR_CLK_OUT_PDN);
+		snd_soc_update_bits(codec, SSM2602_PWR,
+			PWR_POWER_OFF | PWR_CLK_OUT_PDN | PWR_OSC_PDN,
+			PWR_CLK_OUT_PDN | PWR_OSC_PDN);
 		break;
 	case SND_SOC_BIAS_OFF:
-		/* everything off, dac mute, inactive */
-		snd_soc_write(codec, SSM2602_PWR, 0xffff);
+		/* everything off */
+		snd_soc_update_bits(codec, SSM2602_PWR,
+			PWR_POWER_OFF, PWR_POWER_OFF);
 		break;
 
 	}
diff --git a/sound/soc/codecs/ssm2602.h b/sound/soc/codecs/ssm2602.h
index b98c691..fbd07d7 100644
--- a/sound/soc/codecs/ssm2602.h
+++ b/sound/soc/codecs/ssm2602.h
@@ -116,6 +116,10 @@
 
 #define SSM2602_CACHEREGNUM 	10
 
-#define SSM2602_SYSCLK	0
+enum ssm2602_clk {
+	SSM2602_SYSCLK,
+	SSM2602_CLK_CLKOUT,
+	SSM2602_CLK_XTO
+};
 
 #endif
-- 
1.7.2.5

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

* Re: [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend
  2011-09-27  9:08 [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Lars-Peter Clausen
  2011-09-27  9:08 ` [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby Lars-Peter Clausen
  2011-09-27  9:08 ` [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state Lars-Peter Clausen
@ 2011-09-27 10:20 ` Mark Brown
  2 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2011-09-27 10:20 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: alsa-devel, Liam Girdwood, device-drivers-devel, stable

On Tue, Sep 27, 2011 at 11:08:46AM +0200, Lars-Peter Clausen wrote:
> Currently the the internal oscillator is powered down when entering BIAS_OFF
> state, but not re-enabled when going back to BIAS_STANDBY. As a result the
> CODEC will stop working after suspend if the internal oscillator is used to
> generate the sysclock signal. This patch fixes it by clearing the appropriate
> bit in the power down register when the CODEC is re-enabled.

Applied, thanks.

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

* Re: [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby
  2011-09-27  9:08 ` [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby Lars-Peter Clausen
@ 2011-09-27 10:22   ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2011-09-27 10:22 UTC (permalink / raw)
  To: Lars-Peter Clausen; +Cc: alsa-devel, Liam Girdwood, device-drivers-devel

On Tue, Sep 27, 2011 at 11:08:47AM +0200, Lars-Peter Clausen wrote:
> Set the initial bias level to standby during CODEC probe instead of leaving the
> CODEC powered off.
> 
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>

Applied, thanks.

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

* Re: [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state
  2011-09-27  9:08 ` [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state Lars-Peter Clausen
@ 2011-09-27 12:30   ` Mark Brown
  2011-09-27 12:47     ` Lars-Peter Clausen
  0 siblings, 1 reply; 7+ messages in thread
From: Mark Brown @ 2011-09-27 12:30 UTC (permalink / raw)
  To: Lars-Peter Clausen; +Cc: alsa-devel, Liam Girdwood, device-drivers-devel

On Tue, Sep 27, 2011 at 11:08:48AM +0200, Lars-Peter Clausen wrote:
> Currently the oscillator is always enabled and the clock output is always
> disabled. This patch adds support for controlling the oscillator and clock
> output state through snd_soc_dai_set_sysclk. Which makes it possible to
> disable or enable them dynamically according to the requirements of the board
> on which the CODEC is used.
> 
> This patch also slightly modifies the behavior as to when the oscillator is
> going to be disabled in low-power states. Previously it would only be disabled
> in BIAS_OFF, now it is also going to be disabled in BIAS_STANDBY, since no
> components which depend on it should be active in this state.

Is this last assumption actually true?  Things like accessory detect can
need clocks on devices even when they're idle from an audio point of
view.  Still, I've applied the patch - we can always fix up later if
something needs the clock enabling.

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

* Re: [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state
  2011-09-27 12:30   ` Mark Brown
@ 2011-09-27 12:47     ` Lars-Peter Clausen
  0 siblings, 0 replies; 7+ messages in thread
From: Lars-Peter Clausen @ 2011-09-27 12:47 UTC (permalink / raw)
  To: Mark Brown; +Cc: alsa-devel, Liam Girdwood, device-drivers-devel

On 09/27/2011 02:30 PM, Mark Brown wrote:
> On Tue, Sep 27, 2011 at 11:08:48AM +0200, Lars-Peter Clausen wrote:
>> Currently the oscillator is always enabled and the clock output is always
>> disabled. This patch adds support for controlling the oscillator and clock
>> output state through snd_soc_dai_set_sysclk. Which makes it possible to
>> disable or enable them dynamically according to the requirements of the board
>> on which the CODEC is used.
>>
>> This patch also slightly modifies the behavior as to when the oscillator is
>> going to be disabled in low-power states. Previously it would only be disabled
>> in BIAS_OFF, now it is also going to be disabled in BIAS_STANDBY, since no
>> components which depend on it should be active in this state.
> 
> Is this last assumption actually true?  Things like accessory detect can
> need clocks on devices even when they're idle from an audio point of
> view.  Still, I've applied the patch - we can always fix up later if
> something needs the clock enabling.

At least for the ssm2602 the sysclk is only used to for audio processing and to
drive the clock out signal. Audio is off in standby and the clock out signal
was going to be disabled when switching to standby even before this patch. But
you are correct the later might be a problem in systems where the clock out
signal is used for another external component which needs a clock input signal
in standby mode.

Thanks
- Lars

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

end of thread, other threads:[~2011-09-27 12:47 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-27  9:08 [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Lars-Peter Clausen
2011-09-27  9:08 ` [PATCH 2/3] ASoC: ssm2602: Set initial bias level to standby Lars-Peter Clausen
2011-09-27 10:22   ` Mark Brown
2011-09-27  9:08 ` [PATCH 3/3] ASoC: ssm2602: Support setting the oscillator and the clock output state Lars-Peter Clausen
2011-09-27 12:30   ` Mark Brown
2011-09-27 12:47     ` Lars-Peter Clausen
2011-09-27 10:20 ` [PATCH 1/3] ASoC: ssm2602: Re-enable oscillator after suspend Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).