linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support
@ 2014-11-20  8:41 Zidan Wang
  2014-11-20  8:41 ` [alsa-devel][PATCH v2 2/2] ASoC: wm8960: LRCM operation should after software reset Zidan Wang
  2014-11-20  8:56 ` [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support Lars-Peter Clausen
  0 siblings, 2 replies; 4+ messages in thread
From: Zidan Wang @ 2014-11-20  8:41 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, lars, ckeepax, Li.Xiubo, patches,
	alsa-devel, linux-kernel, Zidan Wang

Document the device tree binding for the WM8960 codec, and modify the
driver to extract the platform data from device tree, if present.

Signed-off-by: Zidan Wang <b50113@freescale.com>
---
 Documentation/devicetree/bindings/sound/wm8960.txt | 27 ++++++++++++++
 sound/soc/codecs/wm8960.c                          | 41 ++++++++++++++++------
 2 files changed, 58 insertions(+), 10 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/sound/wm8960.txt

diff --git a/Documentation/devicetree/bindings/sound/wm8960.txt b/Documentation/devicetree/bindings/sound/wm8960.txt
new file mode 100644
index 0000000..1a9ad07
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/wm8960.txt
@@ -0,0 +1,27 @@
+WM8960 audio CODEC
+
+This device supports I2C only.
+
+Required properties:
+
+  - compatible : "wlf,wm8960"
+
+  - reg : the I2C address of the device.
+
+Optional properties:
+  - shared_lrclk: This is a boolean property. If present, the LRCM bit of
+	R24 (Additional control 2 ) gets set, indicating that ADCLRC and DACLRC
+	will be disabled only when ADC (Left and Right) and DAC (Left and Right)
+	are disabled.
+
+  - capless: This is a boolean property. If present, OUT3 will be enabled
+	and disabled together with HP_L and HP_R in response to jack detect events.
+
+Example:
+
+codec: wm8960@1a {
+	compatible = "wlf,wm8960";
+	reg = <0x1a>;
+
+	shared_lrclk;
+};
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
index 4dc4e85..e5d89a2 100644
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -125,6 +125,7 @@ struct wm8960_priv {
 	struct snd_soc_dapm_widget *out3;
 	bool deemph;
 	int playback_fs;
+	struct wm8960_data pdata;
 };
 
 #define wm8960_reset(c)	snd_soc_write(c, WM8960_RESET, 0)
@@ -440,8 +441,8 @@ static const struct snd_soc_dapm_route audio_paths_capless[] = {
 
 static int wm8960_add_widgets(struct snd_soc_codec *codec)
 {
-	struct wm8960_data *pdata = codec->dev->platform_data;
 	struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
+	struct wm8960_data *pdata = &wm8960->pdata;
 	struct snd_soc_dapm_context *dapm = &codec->dapm;
 	struct snd_soc_dapm_widget *w;
 
@@ -961,17 +962,13 @@ static int wm8960_resume(struct snd_soc_codec *codec)
 static int wm8960_probe(struct snd_soc_codec *codec)
 {
 	struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
-	struct wm8960_data *pdata = dev_get_platdata(codec->dev);
+	struct wm8960_data *pdata = &wm8960->pdata;
 	int ret;
 
-	wm8960->set_bias_level = wm8960_set_bias_level_out3;
-
-	if (!pdata) {
-		dev_warn(codec->dev, "No platform data supplied\n");
-	} else {
-		if (pdata->capless)
-			wm8960->set_bias_level = wm8960_set_bias_level_capless;
-	}
+	if (pdata->capless)
+		wm8960->set_bias_level = wm8960_set_bias_level_capless;
+	else
+		wm8960->set_bias_level = wm8960_set_bias_level_out3;
 
 	ret = wm8960_reset(codec);
 	if (ret < 0) {
@@ -1029,6 +1026,18 @@ static const struct regmap_config wm8960_regmap = {
 	.volatile_reg = wm8960_volatile,
 };
 
+static void wm8960_set_pdata_from_of(struct i2c_client *i2c,
+				struct wm8960_data *pdata)
+{
+	const struct device_node *np = i2c->dev.of_node;
+
+	if (of_property_read_bool(np, "capless"))
+		pdata->capless = true;
+
+	if (of_property_read_bool(np, "shared_lrclk"))
+		pdata->shared_lrclk = true;
+}
+
 static int wm8960_i2c_probe(struct i2c_client *i2c,
 			    const struct i2c_device_id *id)
 {
@@ -1045,6 +1054,11 @@ static int wm8960_i2c_probe(struct i2c_client *i2c,
 	if (IS_ERR(wm8960->regmap))
 		return PTR_ERR(wm8960->regmap);
 
+	if (pdata)
+		memcpy(&wm8960->pdata, pdata, sizeof(struct wm8960_data));
+	else if (i2c->dev.of_node)
+		wm8960_set_pdata_from_of(i2c, &wm8960->pdata);
+
 	if (pdata && pdata->shared_lrclk) {
 		ret = regmap_update_bits(wm8960->regmap, WM8960_ADDCTL2,
 					 0x4, 0x4);
@@ -1075,10 +1089,17 @@ static const struct i2c_device_id wm8960_i2c_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, wm8960_i2c_id);
 
+static const struct of_device_id wm8960_of_match[] = {
+       { .compatible = "wlf,wm8960", },
+       { }
+};
+MODULE_DEVICE_TABLE(of, wm8960_of_match);
+
 static struct i2c_driver wm8960_i2c_driver = {
 	.driver = {
 		.name = "wm8960",
 		.owner = THIS_MODULE,
+		.of_match_table = wm8960_of_match,
 	},
 	.probe =    wm8960_i2c_probe,
 	.remove =   wm8960_i2c_remove,
-- 
1.9.1


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

* [alsa-devel][PATCH v2 2/2] ASoC: wm8960: LRCM operation should after software reset
  2014-11-20  8:41 [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support Zidan Wang
@ 2014-11-20  8:41 ` Zidan Wang
  2014-11-20  9:12   ` Charles Keepax
  2014-11-20  8:56 ` [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support Lars-Peter Clausen
  1 sibling, 1 reply; 4+ messages in thread
From: Zidan Wang @ 2014-11-20  8:41 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, lars, ckeepax, Li.Xiubo, patches,
	alsa-devel, linux-kernel, Zidan Wang

When shared_lrclk is set, LRCM will be enabled. But the following software
reset in wm8960_probe will reset it to the default state. So LRCM operation
should after software reset.

Signed-off-by: Zidan Wang <b50113@freescale.com>
---
 sound/soc/codecs/wm8960.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
index e5d89a2..a7f60b7 100644
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -976,6 +976,14 @@ static int wm8960_probe(struct snd_soc_codec *codec)
 		return ret;
 	}
 
+    if (pdata->shared_lrclk) {
+		ret = snd_soc_update_bits(codec, WM8960_ADDCTL2, 0x4, 0x4);
+		if (ret < 0) {
+			dev_err(codec->dev, "Failed to enable LRCM: %d\n", ret);
+			return ret;
+		}
+	}
+
 	wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
 
 	/* Latch the update bits */
@@ -1059,16 +1067,6 @@ static int wm8960_i2c_probe(struct i2c_client *i2c,
 	else if (i2c->dev.of_node)
 		wm8960_set_pdata_from_of(i2c, &wm8960->pdata);
 
-	if (pdata && pdata->shared_lrclk) {
-		ret = regmap_update_bits(wm8960->regmap, WM8960_ADDCTL2,
-					 0x4, 0x4);
-		if (ret != 0) {
-			dev_err(&i2c->dev, "Failed to enable LRCM: %d\n",
-				ret);
-			return ret;
-		}
-	}
-
 	i2c_set_clientdata(i2c, wm8960);
 
 	ret = snd_soc_register_codec(&i2c->dev,
-- 
1.9.1


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

* Re: [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support
  2014-11-20  8:41 [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support Zidan Wang
  2014-11-20  8:41 ` [alsa-devel][PATCH v2 2/2] ASoC: wm8960: LRCM operation should after software reset Zidan Wang
@ 2014-11-20  8:56 ` Lars-Peter Clausen
  1 sibling, 0 replies; 4+ messages in thread
From: Lars-Peter Clausen @ 2014-11-20  8:56 UTC (permalink / raw)
  To: Zidan Wang, broonie
  Cc: lgirdwood, perex, tiwai, ckeepax, Li.Xiubo, patches, alsa-devel,
	linux-kernel

On 11/20/2014 09:41 AM, Zidan Wang wrote:
[...][
> +Optional properties:
> +  - shared_lrclk: This is a boolean property. If present, the LRCM bit of
> +	R24 (Additional control 2 ) gets set, indicating that ADCLRC and DACLRC
> +	will be disabled only when ADC (Left and Right) and DAC (Left and Right)
> +	are disabled.
> +
> +  - capless: This is a boolean property. If present, OUT3 will be enabled
> +	and disabled together with HP_L and HP_R in response to jack detect events.


Custom properties need a vendor prefix and properties should use '-' instead 
of '_'. Also the devicetree describes the hardware and not the driver, so 
the description should say for which hardware setups this flag should be 
set, not what the behavior of the driver will be.

- Lars


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

* Re: [alsa-devel][PATCH v2 2/2] ASoC: wm8960: LRCM operation should after software reset
  2014-11-20  8:41 ` [alsa-devel][PATCH v2 2/2] ASoC: wm8960: LRCM operation should after software reset Zidan Wang
@ 2014-11-20  9:12   ` Charles Keepax
  0 siblings, 0 replies; 4+ messages in thread
From: Charles Keepax @ 2014-11-20  9:12 UTC (permalink / raw)
  To: Zidan Wang
  Cc: broonie, lgirdwood, perex, tiwai, lars, Li.Xiubo, patches,
	alsa-devel, linux-kernel

On Thu, Nov 20, 2014 at 04:41:18PM +0800, Zidan Wang wrote:
> When shared_lrclk is set, LRCM will be enabled. But the following software
> reset in wm8960_probe will reset it to the default state. So LRCM operation
> should after software reset.
> 
> Signed-off-by: Zidan Wang <b50113@freescale.com>
> ---

For patch 2 here:

Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>

Patch 1 could still use the docs fixups Lars suggested.

Thanks,
Charles

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

end of thread, other threads:[~2014-11-20  9:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-20  8:41 [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support Zidan Wang
2014-11-20  8:41 ` [alsa-devel][PATCH v2 2/2] ASoC: wm8960: LRCM operation should after software reset Zidan Wang
2014-11-20  9:12   ` Charles Keepax
2014-11-20  8:56 ` [alsa-devel][PATCH v2 1/2] ASoC: wm8960: Add device tree support Lars-Peter Clausen

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).