Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning
@ 2012-11-30 10:28 Daniel Mack
  2012-11-30 10:28 ` [PATCH 2/3] ALSA: ASoC: cs4271: fix property check Daniel Mack
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Daniel Mack @ 2012-11-30 10:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: broonie, lrg, Daniel Mack

Make the flag in the pdata of type bool to fix a sparse warning.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
---
 include/sound/cs4271.h    | 2 +-
 sound/soc/codecs/cs4271.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/sound/cs4271.h b/include/sound/cs4271.h
index 6d9e15e..dd8c48d 100644
--- a/include/sound/cs4271.h
+++ b/include/sound/cs4271.h
@@ -19,7 +19,7 @@
 
 struct cs4271_platform_data {
 	int gpio_nreset;	/* GPIO driving Reset pin, if any */
-	int amutec_eq_bmutec:1;	/* flag to enable AMUTEC=BMUTEC */
+	bool amutec_eq_bmutec;	/* flag to enable AMUTEC=BMUTEC */
 };
 
 #endif /* __CS4271_H */
diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c
index 6ad3878..70de900 100644
--- a/sound/soc/codecs/cs4271.c
+++ b/sound/soc/codecs/cs4271.c
@@ -474,7 +474,7 @@ static int cs4271_probe(struct snd_soc_codec *codec)
 	struct cs4271_platform_data *cs4271plat = codec->dev->platform_data;
 	int ret;
 	int gpio_nreset = -EINVAL;
-	int amutec_eq_bmutec = 0;
+	bool amutec_eq_bmutec = false;
 
 #ifdef CONFIG_OF
 	if (of_match_device(cs4271_dt_ids, codec->dev)) {
@@ -483,7 +483,7 @@ static int cs4271_probe(struct snd_soc_codec *codec)
 
 		if (!of_get_property(codec->dev->of_node,
 				     "cirrus,amutec-eq-bmutec", NULL))
-			amutec_eq_bmutec = 1;
+			amutec_eq_bmutec = true;
 	}
 #endif
 
-- 
1.7.11.7

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

* [PATCH 2/3] ALSA: ASoC: cs4271: fix property check
  2012-11-30 10:28 [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Daniel Mack
@ 2012-11-30 10:28 ` Daniel Mack
  2012-12-02  4:02   ` Mark Brown
  2012-11-30 10:28 ` [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround Daniel Mack
  2012-12-02  4:02 ` [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Mark Brown
  2 siblings, 1 reply; 7+ messages in thread
From: Daniel Mack @ 2012-11-30 10:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: broonie, lrg, Daniel Mack

The driver had the property check for 'cirrus,amutec_eq_bmutec' the
wrong way around. That happens if you misspell the property in the
bindings during tests.

Signed-off-by: Daniel Mack <zonque@gmail.com>
---
 sound/soc/codecs/cs4271.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c
index 70de900..ac99238 100644
--- a/sound/soc/codecs/cs4271.c
+++ b/sound/soc/codecs/cs4271.c
@@ -481,7 +481,7 @@ static int cs4271_probe(struct snd_soc_codec *codec)
 		gpio_nreset = of_get_named_gpio(codec->dev->of_node,
 						"reset-gpio", 0);
 
-		if (!of_get_property(codec->dev->of_node,
+		if (of_get_property(codec->dev->of_node,
 				     "cirrus,amutec-eq-bmutec", NULL))
 			amutec_eq_bmutec = true;
 	}
-- 
1.7.11.7

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

* [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround
  2012-11-30 10:28 [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Daniel Mack
  2012-11-30 10:28 ` [PATCH 2/3] ALSA: ASoC: cs4271: fix property check Daniel Mack
@ 2012-11-30 10:28 ` Daniel Mack
  2012-12-02  4:02   ` Mark Brown
  2012-12-02  4:02 ` [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Mark Brown
  2 siblings, 1 reply; 7+ messages in thread
From: Daniel Mack @ 2012-11-30 10:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: broonie, lrg, Daniel Mack

The CS4271 requires its LRCLK and MCLK to be stable before its RESET
line is de-asserted. That also means that clocks cannot be changed
without putting the chip back into hardware reset, which also requires
a complete re-initialization of all registers.

One (undocumented) workaround is to assert and de-assert the PDN bit
in the MODE2 register in the startup hook, in case the other channel
of the codec is not currently running.

This patch adds a new flag to both the DT bindings as well as to the
platform data to enable that workaround.

Signed-off-by: Daniel Mack <zonque@gmail.com>
---
 Documentation/devicetree/bindings/sound/cs4271.txt | 12 +++++++
 include/sound/cs4271.h                             | 15 +++++++++
 sound/soc/codecs/cs4271.c                          | 39 ++++++++++++++++++++++
 3 files changed, 66 insertions(+)

diff --git a/Documentation/devicetree/bindings/sound/cs4271.txt b/Documentation/devicetree/bindings/sound/cs4271.txt
index a850fb9..e2cd1d7 100644
--- a/Documentation/devicetree/bindings/sound/cs4271.txt
+++ b/Documentation/devicetree/bindings/sound/cs4271.txt
@@ -20,6 +20,18 @@ Optional properties:
 		!RESET pin
  - cirrus,amuteb-eq-bmutec:	When given, the Codec's AMUTEB=BMUTEC flag
 				is enabled.
+ - cirrus,enable-soft-reset:
+	The CS4271 requires its LRCLK and MCLK to be stable before its RESET
+	line is de-asserted. That also means that clocks cannot be changed
+	without putting the chip back into hardware reset, which also requires
+	a complete re-initialization of all registers.
+
+	One (undocumented) workaround is to assert and de-assert the PDN bit
+	in the MODE2 register. This workaround can be enabled with this DT
+	property.
+
+	Note that this is not needed in case the clocks are stable
+	throughout the entire runtime of the codec.
 
 Examples:
 
diff --git a/include/sound/cs4271.h b/include/sound/cs4271.h
index dd8c48d..70f4535 100644
--- a/include/sound/cs4271.h
+++ b/include/sound/cs4271.h
@@ -20,6 +20,21 @@
 struct cs4271_platform_data {
 	int gpio_nreset;	/* GPIO driving Reset pin, if any */
 	bool amutec_eq_bmutec;	/* flag to enable AMUTEC=BMUTEC */
+
+	/*
+	 * The CS4271 requires its LRCLK and MCLK to be stable before its RESET
+	 * line is de-asserted. That also means that clocks cannot be changed
+	 * without putting the chip back into hardware reset, which also requires
+	 * a complete re-initialization of all registers.
+	 *
+	 * One (undocumented) workaround is to assert and de-assert the PDN bit
+	 * in the MODE2 register. This workaround can be enabled with the
+	 * following flag.
+	 *
+	 * Note that this is not needed in case the clocks are stable
+	 * throughout the entire runtime of the codec.
+	 */
+	bool enable_soft_reset;
 };
 
 #endif /* __CS4271_H */
diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c
index ac99238..bbc83ef 100644
--- a/sound/soc/codecs/cs4271.c
+++ b/sound/soc/codecs/cs4271.c
@@ -167,6 +167,8 @@ struct cs4271_private {
 	int				gpio_nreset;
 	/* GPIO that disable serial bus, if any */
 	int				gpio_disable;
+	/* enable soft reset workaround */
+	bool				enable_soft_reset;
 };
 
 /*
@@ -403,11 +405,43 @@ static const struct snd_kcontrol_new cs4271_snd_controls[] = {
 		7, 1, 1),
 };
 
+static int cs4271_startup(struct snd_pcm_substream *subs,
+			   struct snd_soc_dai *codec_dai)
+{
+	int ret;
+	struct snd_soc_codec *codec = codec_dai->codec;
+	struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec);
+
+	if (!cs4271->enable_soft_reset)
+		return 0;
+
+	/*
+	 * Put the codec in soft reset and back again in case it's not
+	 * currently streaming data. This way of bringing the codec in
+	 * sync to the current clocks is not explicitly documented in
+	 * the data sheet, but it seems to work fine.
+	 */
+
+	if ((subs->stream == SNDRV_PCM_STREAM_PLAYBACK &&
+	     codec_dai->capture_active) ||
+	    (subs->stream == SNDRV_PCM_STREAM_CAPTURE &&
+	     codec_dai->playback_active))
+		return 0;
+
+	ret = snd_soc_update_bits(codec, CS4271_MODE2, CS4271_MODE2_PDN,
+				  CS4271_MODE2_PDN);
+	if (ret < 0)
+		return ret;
+
+	return snd_soc_update_bits(codec, CS4271_MODE2, CS4271_MODE2_PDN, 0);
+}
+
 static const struct snd_soc_dai_ops cs4271_dai_ops = {
 	.hw_params	= cs4271_hw_params,
 	.set_sysclk	= cs4271_set_dai_sysclk,
 	.set_fmt	= cs4271_set_dai_fmt,
 	.digital_mute	= cs4271_digital_mute,
+	.startup	= cs4271_startup,
 };
 
 static struct snd_soc_dai_driver cs4271_dai = {
@@ -484,6 +518,10 @@ static int cs4271_probe(struct snd_soc_codec *codec)
 		if (of_get_property(codec->dev->of_node,
 				     "cirrus,amutec-eq-bmutec", NULL))
 			amutec_eq_bmutec = true;
+
+		if (of_get_property(codec->dev->of_node,
+				     "cirrus,enable-soft-reset", NULL))
+			cs4271->enable_soft_reset = true;
 	}
 #endif
 
@@ -492,6 +530,7 @@ static int cs4271_probe(struct snd_soc_codec *codec)
 			gpio_nreset = cs4271plat->gpio_nreset;
 
 		amutec_eq_bmutec = cs4271plat->amutec_eq_bmutec;
+		cs4271->enable_soft_reset = cs4271plat->enable_soft_reset;
 	}
 
 	if (gpio_nreset >= 0)
-- 
1.7.11.7

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

* Re: [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround
  2012-11-30 10:28 ` [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround Daniel Mack
@ 2012-12-02  4:02   ` Mark Brown
  2012-12-05 13:59     ` Daniel Mack
  0 siblings, 1 reply; 7+ messages in thread
From: Mark Brown @ 2012-12-02  4:02 UTC (permalink / raw)
  To: Daniel Mack; +Cc: alsa-devel, lrg


[-- Attachment #1.1: Type: text/plain, Size: 1036 bytes --]

On Fri, Nov 30, 2012 at 11:28:57AM +0100, Daniel Mack wrote:

> +	Note that this is not needed in case the clocks are stable
> +	throughout the entire runtime of the codec.

That's really quite rare for embeded systems, though - normally at least
the LRCLK is going to be enabled only when there's audio.  

> +static int cs4271_startup(struct snd_pcm_substream *subs,
> +			   struct snd_soc_dai *codec_dai)
> +{
> +	int ret;
> +	struct snd_soc_codec *codec = codec_dai->codec;
> +	struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec);
> +
> +	if (!cs4271->enable_soft_reset)
> +		return 0;
> +
> +	/*
> +	 * Put the codec in soft reset and back again in case it's not
> +	 * currently streaming data. This way of bringing the codec in
> +	 * sync to the current clocks is not explicitly documented in
> +	 * the data sheet, but it seems to work fine.
> +	 */

Since startup() is called before hw_params() you might well find even an
active LRCLK is going to change underneath the driver here...

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



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

* Re: [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning
  2012-11-30 10:28 [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Daniel Mack
  2012-11-30 10:28 ` [PATCH 2/3] ALSA: ASoC: cs4271: fix property check Daniel Mack
  2012-11-30 10:28 ` [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround Daniel Mack
@ 2012-12-02  4:02 ` Mark Brown
  2 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2012-12-02  4:02 UTC (permalink / raw)
  To: Daniel Mack; +Cc: alsa-devel, lrg


[-- Attachment #1.1: Type: text/plain, Size: 146 bytes --]

On Fri, Nov 30, 2012 at 11:28:55AM +0100, Daniel Mack wrote:
> Make the flag in the pdata of type bool to fix a sparse warning.

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



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

* Re: [PATCH 2/3] ALSA: ASoC: cs4271: fix property check
  2012-11-30 10:28 ` [PATCH 2/3] ALSA: ASoC: cs4271: fix property check Daniel Mack
@ 2012-12-02  4:02   ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2012-12-02  4:02 UTC (permalink / raw)
  To: Daniel Mack; +Cc: alsa-devel, lrg


[-- Attachment #1.1: Type: text/plain, Size: 243 bytes --]

On Fri, Nov 30, 2012 at 11:28:56AM +0100, Daniel Mack wrote:
> The driver had the property check for 'cirrus,amutec_eq_bmutec' the
> wrong way around. That happens if you misspell the property in the
> bindings during tests.

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



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

* Re: [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround
  2012-12-02  4:02   ` Mark Brown
@ 2012-12-05 13:59     ` Daniel Mack
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Mack @ 2012-12-05 13:59 UTC (permalink / raw)
  To: Mark Brown; +Cc: alsa-devel, Alexander Sverdlin, lrg

On 02.12.2012 05:02, Mark Brown wrote:
> On Fri, Nov 30, 2012 at 11:28:57AM +0100, Daniel Mack wrote:
> 
>> +	Note that this is not needed in case the clocks are stable
>> +	throughout the entire runtime of the codec.
> 
> That's really quite rare for embeded systems, though - normally at least
> the LRCLK is going to be enabled only when there's audio. 

I agree, but I don't know which system the original driver was written
for. As it seems to work there, I didn't want to unconditionally
introduce this new reset command.

>> +static int cs4271_startup(struct snd_pcm_substream *subs,
>> +			   struct snd_soc_dai *codec_dai)
>> +{
>> +	int ret;
>> +	struct snd_soc_codec *codec = codec_dai->codec;
>> +	struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec);
>> +
>> +	if (!cs4271->enable_soft_reset)
>> +		return 0;
>> +
>> +	/*
>> +	 * Put the codec in soft reset and back again in case it's not
>> +	 * currently streaming data. This way of bringing the codec in
>> +	 * sync to the current clocks is not explicitly documented in
>> +	 * the data sheet, but it seems to work fine.
>> +	 */
> 
> Since startup() is called before hw_params() you might well find even an
> active LRCLK is going to change underneath the driver here...

Hmm ok, so you're saying this quirk should go in hwparams() then?



Thanks,
Daniel

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

end of thread, other threads:[~2012-12-05 13:59 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-30 10:28 [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Daniel Mack
2012-11-30 10:28 ` [PATCH 2/3] ALSA: ASoC: cs4271: fix property check Daniel Mack
2012-12-02  4:02   ` Mark Brown
2012-11-30 10:28 ` [PATCH 3/3] ALSA: ASoC: cs4271: add optional soft reset workaround Daniel Mack
2012-12-02  4:02   ` Mark Brown
2012-12-05 13:59     ` Daniel Mack
2012-12-02  4:02 ` [PATCH 1/3] ALSA: ASoC: cs4271: fix sparse warning Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox