All of lore.kernel.org
 help / color / mirror / Atom feed
* [RESEND] ASoC: omap-abe-twl6040: Add device tree support
@ 2012-07-25 13:09 Peter Ujfalusi
  2012-07-25 13:15 ` Mark Brown
  2012-07-26 12:00 ` Mark Brown
  0 siblings, 2 replies; 7+ messages in thread
From: Peter Ujfalusi @ 2012-07-25 13:09 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: alsa-devel

When the board boots with device tree the driver will receive the name of the
card, DAPM routing map, phandle for the audio components described in the dts
file, mclk speed, and the possibility of detecting the jack detection.

The card will be set up based on this information.
Since the routing is provided via DT we can mark the card fully routed so
core can take care of disconnecting the unused pins.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Reviwed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---

Hello,

This is the v3 of the DT support patch rebased on latest ASoC: needed to be
fixed because of this commit (cpu_dai_of_node renamed to cpu_of_node):
bc92657 ASoC: make snd_soc_dai_link more symmetrical

Could you queue this for 3.6?

Thank you,
Peter

 .../devicetree/bindings/sound/omap-abe-twl6040.txt |   91 ++++++++++++
 sound/soc/omap/omap-abe-twl6040.c                  |  145 ++++++++++++++++----
 2 files changed, 206 insertions(+), 30 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt

diff --git a/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt b/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
new file mode 100644
index 0000000..65dec87
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
@@ -0,0 +1,91 @@
+* Texas Instruments OMAP4+ and twl6040 based audio setups
+
+Required properties:
+- compatible: "ti,abe-twl6040"
+- ti,model: Name of the sound card ( for example "SDP4430")
+- ti,mclk-freq: MCLK frequency for HPPLL operation
+- ti,mcpdm: phandle for the McPDM node
+- ti,twl6040: phandle for the twl6040 core node
+- ti,audio-routing: List of connections between audio components.
+  Each entry is a pair of strings, the first being the connection's sink,
+  the second being the connection's source.
+
+Optional properties:
+- ti,dmic: phandle for the OMAP dmic node if the machine have it connected
+- ti,jack_detection: Need to be set to <1> if the board capable to detect jack
+  insertion, removal.
+
+Available audio endpoints for the audio-routing table:
+
+Board connectors:
+ * Headset Stereophone
+ * Earphone Spk
+ * Ext Spk
+ * Line Out
+ * Vibrator
+ * Headset Mic
+ * Main Handset Mic
+ * Sub Handset Mic
+ * Line In
+ * Digital Mic
+
+twl6040 pins:
+ * HSOL
+ * HSOR
+ * EP
+ * HFL
+ * HFR
+ * AUXL
+ * AUXR
+ * VIBRAL
+ * VIBRAR
+ * HSMIC
+ * MAINMIC
+ * SUBMIC
+ * AFML
+ * AFMR
+
+ * Headset Mic Bias
+ * Main Mic Bias
+ * Digital Mic1 Bias
+ * Digital Mic2 Bias
+
+Digital mic pins:
+ * DMic
+
+Example:
+
+sound {
+	compatible = "ti,abe-twl6040";
+	ti,model = "SDP4430";
+
+	ti,jack-detection = <1>;
+	ti,mclk-freq = <38400000>;
+
+	ti,mcpdm = <&mcpdm>;
+	ti,dmic = <&dmic>;
+
+	ti,twl6040 = <&twl6040>;
+
+	/* Audio routing */
+	ti,audio-routing =
+		"Headset Stereophone", "HSOL",
+		"Headset Stereophone", "HSOR",
+		"Earphone Spk", "EP",
+		"Ext Spk", "HFL",
+		"Ext Spk", "HFR",
+		"Line Out", "AUXL",
+		"Line Out", "AUXR",
+		"Vibrator", "VIBRAL",
+		"Vibrator", "VIBRAR",
+		"HSMIC", "Headset Mic",
+		"Headset Mic", "Headset Mic Bias",
+		"MAINMIC", "Main Handset Mic",
+		"Main Handset Mic", "Main Mic Bias",
+		"SUBMIC", "Sub Handset Mic",
+		"Sub Handset Mic", "Main Mic Bias",
+		"AFML", "Line In",
+		"AFMR", "Line In",
+		"DMic", "Digital Mic",
+		"Digital Mic", "Digital Mic1 Bias";
+};
diff --git a/sound/soc/omap/omap-abe-twl6040.c b/sound/soc/omap/omap-abe-twl6040.c
index 9d93793..be525df 100644
--- a/sound/soc/omap/omap-abe-twl6040.c
+++ b/sound/soc/omap/omap-abe-twl6040.c
@@ -25,6 +25,7 @@
 #include <linux/mfd/twl6040.h>
 #include <linux/platform_data/omap-abe-twl6040.h>
 #include <linux/module.h>
+#include <linux/of.h>
 
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -43,6 +44,8 @@
 struct abe_twl6040 {
 	int	jack_detection;	/* board can detect jack events */
 	int	mclk_freq;	/* MCLK frequency speed for twl6040 */
+
+	struct platform_device *dmic_codec_dev;
 };
 
 static int omap_abe_hw_params(struct snd_pcm_substream *substream,
@@ -185,17 +188,6 @@ static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd)
 	int hs_trim;
 	int ret = 0;
 
-	/* Disable not connected paths if not used */
-	twl6040_disconnect_pin(dapm, pdata->has_hs, "Headset Stereophone");
-	twl6040_disconnect_pin(dapm, pdata->has_hf, "Ext Spk");
-	twl6040_disconnect_pin(dapm, pdata->has_ep, "Earphone Spk");
-	twl6040_disconnect_pin(dapm, pdata->has_aux, "Line Out");
-	twl6040_disconnect_pin(dapm, pdata->has_vibra, "Vinrator");
-	twl6040_disconnect_pin(dapm, pdata->has_hsmic, "Headset Mic");
-	twl6040_disconnect_pin(dapm, pdata->has_mainmic, "Main Handset Mic");
-	twl6040_disconnect_pin(dapm, pdata->has_submic, "Sub Handset Mic");
-	twl6040_disconnect_pin(dapm, pdata->has_afm, "Line In");
-
 	/*
 	 * Configure McPDM offset cancellation based on the HSOTRIM value from
 	 * twl6040.
@@ -216,6 +208,24 @@ static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd)
 		twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET);
 	}
 
+	/*
+	 * NULL pdata means we booted with DT. In this case the routing is
+	 * provided and the card is fully routed, no need to mark pins.
+	 */
+	if (!pdata)
+		return ret;
+
+	/* Disable not connected paths if not used */
+	twl6040_disconnect_pin(dapm, pdata->has_hs, "Headset Stereophone");
+	twl6040_disconnect_pin(dapm, pdata->has_hf, "Ext Spk");
+	twl6040_disconnect_pin(dapm, pdata->has_ep, "Earphone Spk");
+	twl6040_disconnect_pin(dapm, pdata->has_aux, "Line Out");
+	twl6040_disconnect_pin(dapm, pdata->has_vibra, "Vinrator");
+	twl6040_disconnect_pin(dapm, pdata->has_hsmic, "Headset Mic");
+	twl6040_disconnect_pin(dapm, pdata->has_mainmic, "Main Handset Mic");
+	twl6040_disconnect_pin(dapm, pdata->has_submic, "Sub Handset Mic");
+	twl6040_disconnect_pin(dapm, pdata->has_afm, "Line In");
+
 	return ret;
 }
 
@@ -270,52 +280,116 @@ static struct snd_soc_card omap_abe_card = {
 static __devinit int omap_abe_probe(struct platform_device *pdev)
 {
 	struct omap_abe_twl6040_data *pdata = dev_get_platdata(&pdev->dev);
+	struct device_node *node = pdev->dev.of_node;
 	struct snd_soc_card *card = &omap_abe_card;
 	struct abe_twl6040 *priv;
 	int num_links = 0;
-	int ret;
+	int ret = 0;
 
 	card->dev = &pdev->dev;
 
-	if (!pdata) {
-		dev_err(&pdev->dev, "Missing pdata\n");
-		return -ENODEV;
-	}
-
 	priv = devm_kzalloc(&pdev->dev, sizeof(struct abe_twl6040), GFP_KERNEL);
 	if (priv == NULL)
 		return -ENOMEM;
 
-	if (pdata->card_name) {
-		card->name = pdata->card_name;
+	priv->dmic_codec_dev = ERR_PTR(-EINVAL);
+
+	if (node) {
+		struct device_node *dai_node;
+
+		if (snd_soc_of_parse_card_name(card, "ti,model")) {
+			dev_err(&pdev->dev, "Card name is not provided\n");
+			return -ENODEV;
+		}
+
+		ret = snd_soc_of_parse_audio_routing(card,
+						"ti,audio-routing");
+		if (ret) {
+			dev_err(&pdev->dev,
+				"Error while parsing DAPM routing\n");
+			return ret;
+		}
+
+		dai_node = of_parse_phandle(node, "ti,mcpdm", 0);
+		if (!dai_node) {
+			dev_err(&pdev->dev, "McPDM node is not provided\n");
+			return -EINVAL;
+		}
+		abe_twl6040_dai_links[0].cpu_dai_name  = NULL;
+		abe_twl6040_dai_links[0].cpu_of_node = dai_node;
+
+		dai_node = of_parse_phandle(node, "ti,dmic", 0);
+		if (dai_node) {
+			num_links = 2;
+			abe_twl6040_dai_links[1].cpu_dai_name  = NULL;
+			abe_twl6040_dai_links[1].cpu_of_node = dai_node;
+
+			priv->dmic_codec_dev = platform_device_register_simple(
+						"dmic-codec", -1, NULL, 0);
+			if (IS_ERR(priv->dmic_codec_dev)) {
+				dev_err(&pdev->dev,
+					"Can't instantiate dmic-codec\n");
+				return PTR_ERR(priv->dmic_codec_dev);
+			}
+		} else {
+			num_links = 1;
+		}
+
+		of_property_read_u32(node, "ti,jack-detection",
+				     &priv->jack_detection);
+		of_property_read_u32(node, "ti,mclk-freq",
+				     &priv->mclk_freq);
+		if (!priv->mclk_freq) {
+			dev_err(&pdev->dev, "MCLK frequency not provided\n");
+			ret = -EINVAL;
+			goto err_unregister;
+		}
+
+		omap_abe_card.fully_routed = 1;
+	} else if (pdata) {
+		if (pdata->card_name) {
+			card->name = pdata->card_name;
+		} else {
+			dev_err(&pdev->dev, "Card name is not provided\n");
+			return -ENODEV;
+		}
+
+		if (pdata->has_dmic)
+			num_links = 2;
+		else
+			num_links = 1;
+
+		priv->jack_detection = pdata->jack_detection;
+		priv->mclk_freq = pdata->mclk_freq;
 	} else {
-		dev_err(&pdev->dev, "Card name is not provided\n");
+		dev_err(&pdev->dev, "Missing pdata\n");
 		return -ENODEV;
 	}
 
-	priv->jack_detection = pdata->jack_detection;
-	priv->mclk_freq = pdata->mclk_freq;
-
 
 	if (!priv->mclk_freq) {
 		dev_err(&pdev->dev, "MCLK frequency missing\n");
-		return -ENODEV;
+		ret = -ENODEV;
+		goto err_unregister;
 	}
 
-	if (pdata->has_dmic)
-		num_links = 2;
-	else
-		num_links = 1;
-
 	card->dai_link = abe_twl6040_dai_links;
 	card->num_links = num_links;
 
 	snd_soc_card_set_drvdata(card, priv);
 
 	ret = snd_soc_register_card(card);
-	if (ret)
+	if (ret) {
 		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
 			ret);
+		goto err_unregister;
+	}
+
+	return 0;
+
+err_unregister:
+	if (!IS_ERR(priv->dmic_codec_dev))
+		platform_device_unregister(priv->dmic_codec_dev);
 
 	return ret;
 }
@@ -323,17 +397,28 @@ static __devinit int omap_abe_probe(struct platform_device *pdev)
 static int __devexit omap_abe_remove(struct platform_device *pdev)
 {
 	struct snd_soc_card *card = platform_get_drvdata(pdev);
+	struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card);
 
 	snd_soc_unregister_card(card);
 
+	if (!IS_ERR(priv->dmic_codec_dev))
+		platform_device_unregister(priv->dmic_codec_dev);
+
 	return 0;
 }
 
+static const struct of_device_id omap_abe_of_match[] = {
+	{.compatible = "ti,abe-twl6040", },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, omap_abe_of_match);
+
 static struct platform_driver omap_abe_driver = {
 	.driver = {
 		.name = "omap-abe-twl6040",
 		.owner = THIS_MODULE,
 		.pm = &snd_soc_pm_ops,
+		.of_match_table = omap_abe_of_match,
 	},
 	.probe = omap_abe_probe,
 	.remove = __devexit_p(omap_abe_remove),
-- 
1.7.8.6

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

* Re: [RESEND] ASoC: omap-abe-twl6040: Add device tree support
  2012-07-25 13:09 [RESEND] ASoC: omap-abe-twl6040: Add device tree support Peter Ujfalusi
@ 2012-07-25 13:15 ` Mark Brown
  2012-07-25 13:39   ` Peter Ujfalusi
  2012-07-26 12:00 ` Mark Brown
  1 sibling, 1 reply; 7+ messages in thread
From: Mark Brown @ 2012-07-25 13:15 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: alsa-devel, Liam Girdwood


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

On Wed, Jul 25, 2012 at 04:09:11PM +0300, Peter Ujfalusi wrote:

> Could you queue this for 3.6?

We're already in the merge window...

[-- 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: [RESEND] ASoC: omap-abe-twl6040: Add device tree support
  2012-07-25 13:15 ` Mark Brown
@ 2012-07-25 13:39   ` Peter Ujfalusi
  2012-07-25 21:48     ` Mark Brown
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Ujfalusi @ 2012-07-25 13:39 UTC (permalink / raw)
  To: Mark Brown; +Cc: alsa-devel, Liam Girdwood

On 07/25/2012 04:15 PM, Mark Brown wrote:
> On Wed, Jul 25, 2012 at 04:09:11PM +0300, Peter Ujfalusi wrote:
> 
>> Could you queue this for 3.6?
> 
> We're already in the merge window...

Yes, I'm aware of that.
I have sent the v3 on 6.6.2012 to the list [1].
I just noticed that on my working branch after I have rebased it on mainline
the omap-abe-twl6040 was not compiling (due to the cpu_dai_of_node rename to
cpu_of_node). I wanted to send a quick fix for this when I realized that the
DT support for the machine driver is not taken.

[1]
http://mailman.alsa-project.org/pipermail/alsa-devel/2012-June/052495.html

-- 
Péter

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

* Re: [RESEND] ASoC: omap-abe-twl6040: Add device tree support
  2012-07-25 13:39   ` Peter Ujfalusi
@ 2012-07-25 21:48     ` Mark Brown
  2012-07-26  7:52       ` Peter Ujfalusi
  0 siblings, 1 reply; 7+ messages in thread
From: Mark Brown @ 2012-07-25 21:48 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: alsa-devel, Liam Girdwood

On Wed, Jul 25, 2012 at 04:39:21PM +0300, Peter Ujfalusi wrote:
> On 07/25/2012 04:15 PM, Mark Brown wrote:

> > We're already in the merge window...

> Yes, I'm aware of that.
> I have sent the v3 on 6.6.2012 to the list [1].
> I just noticed that on my working branch after I have rebased it on mainline
> the omap-abe-twl6040 was not compiling (due to the cpu_dai_of_node rename to
> cpu_of_node). I wanted to send a quick fix for this when I realized that the
> DT support for the machine driver is not taken.

Please just send the build fix with a followup adding the DT bindings
and then we can get the DT bindings in for 3.7.  It's unfortunate that
Liam's been so busy and things like this got dropped on the floor but
I'm not enthusiastic adding something like this after the pull request
went to Linus.

Though obviously it's not even been compiled in mainline :/

In general you need to really start paying attention to this stuff
and start chasing around -rc5 or so.

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

* Re: [RESEND] ASoC: omap-abe-twl6040: Add device tree support
  2012-07-25 21:48     ` Mark Brown
@ 2012-07-26  7:52       ` Peter Ujfalusi
  2012-07-26  9:52         ` Mark Brown
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Ujfalusi @ 2012-07-26  7:52 UTC (permalink / raw)
  To: Mark Brown; +Cc: alsa-devel, Liam Girdwood

On 07/26/2012 12:48 AM, Mark Brown wrote:
> Please just send the build fix with a followup adding the DT bindings
> and then we can get the DT bindings in for 3.7.

We do not have build breakage as of now since the DT bindings are not in.
The build breakage happened on my local tree when I have rebased it on
mainline yesterday. Stephen can not update the DT part of the omap-abe-twl6040
when he did the snd_soc_dai_link cleanup, obviously.
The patch has been updated to compile cleanly on top of current mainline. I
could have prefixed it as v4 but the change compared to the previous was small.

> It's unfortunate that
> Liam's been so busy and things like this got dropped on the floor but
> I'm not enthusiastic adding something like this after the pull request
> went to Linus.

Yes, I understand your hesitation. On the other hand the patches to enable
audio via DT for the dts files has been merged and present in mainline already
(omap4-sdp/panda/pandaES).

> Though obviously it's not even been compiled in mainline :/

Sure it has not been compiled in mainline. It was/is compiled on top of
mainline during my daily work.

> In general you need to really start paying attention to this stuff
> and start chasing around -rc5 or so.

I know, I should have...

-- 
Péter

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

* Re: [RESEND] ASoC: omap-abe-twl6040: Add device tree support
  2012-07-26  7:52       ` Peter Ujfalusi
@ 2012-07-26  9:52         ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2012-07-26  9:52 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: alsa-devel, Liam Girdwood


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

On Thu, Jul 26, 2012 at 10:52:29AM +0300, Peter Ujfalusi wrote:
> On 07/26/2012 12:48 AM, Mark Brown wrote:

> > Please just send the build fix with a followup adding the DT bindings
> > and then we can get the DT bindings in for 3.7.

> We do not have build breakage as of now since the DT bindings are not in.
> The build breakage happened on my local tree when I have rebased it on
> mainline yesterday. Stephen can not update the DT part of the omap-abe-twl6040
> when he did the snd_soc_dai_link cleanup, obviously.

Ah, sorry - I misread what you were saying and thought that there was a
build break in the current code.

> > Though obviously it's not even been compiled in mainline :/

> Sure it has not been compiled in mainline. It was/is compiled on top of
> mainline during my daily work.

Right, that was me thinking there was a build break with the currently
merged code.

[-- 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: [RESEND] ASoC: omap-abe-twl6040: Add device tree support
  2012-07-25 13:09 [RESEND] ASoC: omap-abe-twl6040: Add device tree support Peter Ujfalusi
  2012-07-25 13:15 ` Mark Brown
@ 2012-07-26 12:00 ` Mark Brown
  1 sibling, 0 replies; 7+ messages in thread
From: Mark Brown @ 2012-07-26 12:00 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: alsa-devel, Liam Girdwood


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

On Wed, Jul 25, 2012 at 04:09:11PM +0300, Peter Ujfalusi wrote:
> When the board boots with device tree the driver will receive the name of the
> card, DAPM routing map, phandle for the audio components described in the dts
> file, mclk speed, and the possibility of detecting the jack detection.

Applied, thanks (for 3.7).

[-- 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

end of thread, other threads:[~2012-07-26 12:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-25 13:09 [RESEND] ASoC: omap-abe-twl6040: Add device tree support Peter Ujfalusi
2012-07-25 13:15 ` Mark Brown
2012-07-25 13:39   ` Peter Ujfalusi
2012-07-25 21:48     ` Mark Brown
2012-07-26  7:52       ` Peter Ujfalusi
2012-07-26  9:52         ` Mark Brown
2012-07-26 12:00 ` 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.