All of 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 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.