diff mbox

[v2,3/8] ASoC: davinci-evm: HDMI audio support for TDA998x trough McASP I2S bus

Message ID a92cd9257efb58711b2d5d3de2abff9c8a1052d2.1408397864.git.jsarha@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jyri Sarha Aug. 18, 2014, 9:46 p.m. UTC
Add machine driver support for BeagleBone-Black HDMI audio. BBB has
NXP TDA998X HDMI transmitter connected to McASP port in I2S mode. The
44100 Hz sample-rate and it's multiples can not be accurately produced
on BBB. The only supported sample format is SNDRV_PCM_FORMAT_S32_LE.
The 8 least significant bits are ignored.

Signed-off-by: Jyri Sarha <jsarha@ti.com>
---
 .../bindings/sound/davinci-evm-audio.txt           |    4 +-
 sound/soc/davinci/davinci-evm.c                    |   82 +++++++++++++++++++-
 2 files changed, 83 insertions(+), 3 deletions(-)

Comments

Mark Rutland Aug. 19, 2014, 1:16 p.m. UTC | #1
On Mon, Aug 18, 2014 at 10:46:41PM +0100, Jyri Sarha wrote:
> Add machine driver support for BeagleBone-Black HDMI audio. BBB has
> NXP TDA998X HDMI transmitter connected to McASP port in I2S mode. The
> 44100 Hz sample-rate and it's multiples can not be accurately produced
> on BBB. The only supported sample format is SNDRV_PCM_FORMAT_S32_LE.
> The 8 least significant bits are ignored.
> 
> Signed-off-by: Jyri Sarha <jsarha@ti.com>
> ---
>  .../bindings/sound/davinci-evm-audio.txt           |    4 +-
>  sound/soc/davinci/davinci-evm.c                    |   82 +++++++++++++++++++-
>  2 files changed, 83 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
> index 963e100..c137436 100644
> --- a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
> +++ b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
> @@ -1,7 +1,9 @@
>  * Texas Instruments SoC audio setups with TLV320AIC3X Codec
>  
>  Required properties:
> -- compatible : "ti,da830-evm-audio" : forDM365/DA8xx/OMAPL1x/AM33xx
> +- compatible : "ti,da830-evm-audio" : for DM365/DA8xx/OMAPL1x/AM33xx
> +               "ti,am335x-beaglebone-black-audio" : for Beaglebone-black HDMI
> +                                                    audio

To keep this legible I'd recommend reorganising this like:

- compatible: should contain one of:
   * "ti,da830-evm-audio" for DM365/DA8xx/OMAPL1x/AM33xx
   * "ti,am335x-beaglebone-black-audio" for Beaglebone-black HDMI audio

For the BBB case, do you expect both strings or just the BBB-specific
string?

Is the 'x' in the BBB string a wildcard? If we know the particular
number for BBB we should use that.

Cheers,
Mark.
Jyri Sarha Aug. 19, 2014, 7:40 p.m. UTC | #2
On 08/19/2014 04:16 PM, Mark Rutland wrote:
> On Mon, Aug 18, 2014 at 10:46:41PM +0100, Jyri Sarha wrote:
>> Add machine driver support for BeagleBone-Black HDMI audio. BBB has
>> NXP TDA998X HDMI transmitter connected to McASP port in I2S mode. The
>> 44100 Hz sample-rate and it's multiples can not be accurately produced
>> on BBB. The only supported sample format is SNDRV_PCM_FORMAT_S32_LE.
>> The 8 least significant bits are ignored.
>>
>> Signed-off-by: Jyri Sarha <jsarha@ti.com>
>> ---
>>   .../bindings/sound/davinci-evm-audio.txt           |    4 +-
>>   sound/soc/davinci/davinci-evm.c                    |   82 +++++++++++++++++++-
>>   2 files changed, 83 insertions(+), 3 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
>> index 963e100..c137436 100644
>> --- a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
>> +++ b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
>> @@ -1,7 +1,9 @@
>>   * Texas Instruments SoC audio setups with TLV320AIC3X Codec
>>
>>   Required properties:
>> -- compatible : "ti,da830-evm-audio" : forDM365/DA8xx/OMAPL1x/AM33xx
>> +- compatible : "ti,da830-evm-audio" : for DM365/DA8xx/OMAPL1x/AM33xx
>> +               "ti,am335x-beaglebone-black-audio" : for Beaglebone-black HDMI
>> +                                                    audio
>
> To keep this legible I'd recommend reorganising this like:
>
> - compatible: should contain one of:
>     * "ti,da830-evm-audio" for DM365/DA8xx/OMAPL1x/AM33xx
>     * "ti,am335x-beaglebone-black-audio" for Beaglebone-black HDMI audio
>

The above looks indeed better. I'll make the change. Oh, and I probably 
should change the first line to something like:

* TI SoC audio using McASP to connect to TLV320AIC3X or HDMI endcoder

> For the BBB case, do you expect both strings or just the BBB-specific
> string?
>

Normally just the one. In theory a BBB with an audio-cape on top could 
utilize another sound node with "ti,da830-evm-audio" compatible property.

> Is the 'x' in the BBB string a wildcard? If we know the particular
> number for BBB we should use that.
>

Yes, its a wild card. BBBs have been made at least with AM3358 and 
AM3359 SoCs.

Thanks,
Jyri
Mark Rutland Aug. 20, 2014, 12:34 p.m. UTC | #3
On Tue, Aug 19, 2014 at 08:40:51PM +0100, Jyri Sarha wrote:
> On 08/19/2014 04:16 PM, Mark Rutland wrote:
> > On Mon, Aug 18, 2014 at 10:46:41PM +0100, Jyri Sarha wrote:
> >> Add machine driver support for BeagleBone-Black HDMI audio. BBB has
> >> NXP TDA998X HDMI transmitter connected to McASP port in I2S mode. The
> >> 44100 Hz sample-rate and it's multiples can not be accurately produced
> >> on BBB. The only supported sample format is SNDRV_PCM_FORMAT_S32_LE.
> >> The 8 least significant bits are ignored.
> >>
> >> Signed-off-by: Jyri Sarha <jsarha@ti.com>
> >> ---
> >>   .../bindings/sound/davinci-evm-audio.txt           |    4 +-
> >>   sound/soc/davinci/davinci-evm.c                    |   82 +++++++++++++++++++-
> >>   2 files changed, 83 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
> >> index 963e100..c137436 100644
> >> --- a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
> >> +++ b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
> >> @@ -1,7 +1,9 @@
> >>   * Texas Instruments SoC audio setups with TLV320AIC3X Codec
> >>
> >>   Required properties:
> >> -- compatible : "ti,da830-evm-audio" : forDM365/DA8xx/OMAPL1x/AM33xx
> >> +- compatible : "ti,da830-evm-audio" : for DM365/DA8xx/OMAPL1x/AM33xx
> >> +               "ti,am335x-beaglebone-black-audio" : for Beaglebone-black HDMI
> >> +                                                    audio
> >
> > To keep this legible I'd recommend reorganising this like:
> >
> > - compatible: should contain one of:
> >     * "ti,da830-evm-audio" for DM365/DA8xx/OMAPL1x/AM33xx
> >     * "ti,am335x-beaglebone-black-audio" for Beaglebone-black HDMI audio
> >
> 
> The above looks indeed better. I'll make the change. Oh, and I probably 
> should change the first line to something like:
> 
> * TI SoC audio using McASP to connect to TLV320AIC3X or HDMI endcoder
> 
> > For the BBB case, do you expect both strings or just the BBB-specific
> > string?
> >
> 
> Normally just the one. In theory a BBB with an audio-cape on top could 
> utilize another sound node with "ti,da830-evm-audio" compatible property.

Sorry, I meant in the same node. I take it we never expect:

compatible = "ti,am335x-beaglebone-black-audio", "ti,da830-evm-audio";

> > Is the 'x' in the BBB string a wildcard? If we know the particular
> > number for BBB we should use that.
> >
> 
> Yes, its a wild card. BBBs have been made at least with AM3358 and 
> AM3359 SoCs.

In general we've pushed back against wildcard strings, and used the
first implementation for the naming. We should be able to use 
"ti,am3358-beaglebone-black-audio" for AM335{8,9} assuming the block is
the same? Otherwise we might need separate strings anyway.

Thanks,
Mark.
Jyri Sarha Aug. 20, 2014, 1:03 p.m. UTC | #4
On 08/20/2014 03:34 PM, Mark Rutland wrote:
...
> Sorry, I meant in the same node. I take it we never expect:
>
> compatible = "ti,am335x-beaglebone-black-audio", "ti,da830-evm-audio";
>

No never like that.

>>> > >Is the 'x' in the BBB string a wildcard? If we know the particular
>>> > >number for BBB we should use that.
>>> > >
>> >
>> >Yes, its a wild card. BBBs have been made at least with AM3358 and
>> >AM3359 SoCs.
> In general we've pushed back against wildcard strings, and used the
> first implementation for the naming. We should be able to use
> "ti,am3358-beaglebone-black-audio" for AM335{8,9} assuming the block is
> the same? Otherwise we might need separate strings anyway.

At least the relevant block (McASP) is the same. AM335x is commonly used 
in all TI documentation, but I am not picky am3358 is fine with me.

Could we drop the SoC id completely and make it just 
"beaglebone-black-audio"?

The board design is the unique factor here, not the SoC. McASP block can 
be found from several TI SoCs.

Cheers,
Jyri
Mark Brown Aug. 21, 2014, 6:24 p.m. UTC | #5
On Wed, Aug 20, 2014 at 04:03:46PM +0300, Jyri Sarha wrote:

> Could we drop the SoC id completely and make it just
> "beaglebone-black-audio"?

> The board design is the unique factor here, not the SoC. McASP block can be
> found from several TI SoCs.

That's a lot more sensible, yes.
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
index 963e100..c137436 100644
--- a/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
+++ b/Documentation/devicetree/bindings/sound/davinci-evm-audio.txt
@@ -1,7 +1,9 @@ 
 * Texas Instruments SoC audio setups with TLV320AIC3X Codec
 
 Required properties:
-- compatible : "ti,da830-evm-audio" : forDM365/DA8xx/OMAPL1x/AM33xx
+- compatible : "ti,da830-evm-audio" : for DM365/DA8xx/OMAPL1x/AM33xx
+               "ti,am335x-beaglebone-black-audio" : for Beaglebone-black HDMI
+                                                    audio
 - ti,model : The user-visible name of this sound complex.
 - ti,audio-codec : The phandle of the TLV320AIC3x audio codec
 - ti,mcasp-controller : The phandle of the McASP controller
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
index a50010e..9b98667 100644
--- a/sound/soc/davinci/davinci-evm.c
+++ b/sound/soc/davinci/davinci-evm.c
@@ -21,6 +21,7 @@ 
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/soc.h>
+#include <sound/pcm_params.h>
 
 #include <asm/dma.h>
 #include <asm/mach-types.h>
@@ -83,12 +84,46 @@  static int evm_hw_params(struct snd_pcm_substream *substream,
 	return 0;
 }
 
+/* If changing sample format the tda998x configuration (REG_CTS_N) needs
+   to be changed. */
+#define TDA998X_SAMPLE_FORMAT SNDRV_PCM_FORMAT_S32_LE
+static int evm_tda998x_startup(struct snd_pcm_substream *substream)
+{
+	struct snd_pcm_runtime *runtime = substream->runtime;
+	struct snd_mask *fmt = constrs_mask(&runtime->hw_constraints,
+					    SNDRV_PCM_HW_PARAM_FORMAT);
+	snd_mask_none(fmt);
+	snd_mask_set(fmt, TDA998X_SAMPLE_FORMAT);
+
+	return evm_startup(substream);
+}
+
+static int evm_tda998x_hw_params(struct snd_pcm_substream *substream,
+				 struct snd_pcm_hw_params *params)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+	struct snd_soc_card *soc_card = rtd->card;
+	struct snd_soc_card_drvdata_davinci *drvdata =
+		snd_soc_card_get_drvdata(soc_card);
+
+	return snd_soc_dai_set_sysclk(cpu_dai, 0, drvdata->sysclk,
+				      SND_SOC_CLOCK_IN);
+}
+
 static struct snd_soc_ops evm_ops = {
 	.startup = evm_startup,
 	.shutdown = evm_shutdown,
 	.hw_params = evm_hw_params,
 };
 
+
+static struct snd_soc_ops evm_tda998x_ops = {
+	.startup = evm_tda998x_startup,
+	.shutdown = evm_shutdown,
+	.hw_params = evm_tda998x_hw_params,
+};
+
 /* davinci-evm machine dapm widgets */
 static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
@@ -149,6 +184,35 @@  static int evm_aic3x_init(struct snd_soc_pcm_runtime *rtd)
 	return 0;
 }
 
+static const struct snd_soc_dapm_widget tda998x_dapm_widgets[] = {
+	SND_SOC_DAPM_OUTPUT("HDMI Out"),
+};
+
+static int evm_tda998x_init(struct snd_soc_pcm_runtime *rtd)
+{
+	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+	struct snd_soc_dapm_context *dapm = &rtd->codec->dapm;
+	struct snd_soc_card *soc_card = rtd->card;
+	int ret;
+
+	ret = snd_soc_dai_set_clkdiv(cpu_dai, 0, 1);
+	if (ret < 0)
+		return ret;
+
+	snd_soc_dapm_new_controls(dapm, tda998x_dapm_widgets,
+				  ARRAY_SIZE(tda998x_dapm_widgets));
+
+	ret = snd_soc_of_parse_audio_routing(soc_card, "ti,audio-routing");
+
+	/* not connected */
+	snd_soc_dapm_disable_pin(dapm, "RX");
+
+	/* always connected */
+	snd_soc_dapm_enable_pin(dapm, "HDMI Out");
+
+	return 0;
+}
+
 /* davinci-evm digital audio interface glue - connects codec <--> CPU */
 static struct snd_soc_dai_link dm6446_evm_dai = {
 	.name = "TLV320AIC3X",
@@ -334,7 +398,7 @@  static struct snd_soc_card da850_snd_soc_card = {
 #if defined(CONFIG_OF)
 
 /*
- * The struct is used as place holder. It will be completely
+ * The structs are used as place holders. They will be completely
  * filled with data from dt node.
  */
 static struct snd_soc_dai_link evm_dai_tlv320aic3x = {
@@ -347,10 +411,24 @@  static struct snd_soc_dai_link evm_dai_tlv320aic3x = {
 		   SND_SOC_DAIFMT_IB_NF,
 };
 
+static struct snd_soc_dai_link evm_dai_tda998x_hdmi = {
+	.name		= "NXP TDA998x HDMI Chip",
+	.stream_name	= "HDMI",
+	.codec_dai_name	= "hdmi-hifi",
+	.ops		= &evm_tda998x_ops,
+	.init           = evm_tda998x_init,
+	.dai_fmt	= (SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_I2S |
+			   SND_SOC_DAIFMT_IB_NF),
+};
+
 static const struct of_device_id davinci_evm_dt_ids[] = {
 	{
 		.compatible = "ti,da830-evm-audio",
-		.data = (void *) &evm_dai_tlv320aic3x,
+		.data = &evm_dai_tlv320aic3x,
+	},
+	{
+		.compatible = "ti,am335x-beaglebone-black-audio",
+		.data = &evm_dai_tda998x_hdmi,
 	},
 	{ /* sentinel */ }
 };