Using a card with multiple audio codecs in TDM mode

169 views
Skip to first unread message

ccrome

unread,
May 19, 2011, 6:11:11 PM5/19/11
to Beagle Board
Hi All,
I wonder if anybody has any experience with building a drvier for a
card with multiple codecs in TDM mode.

I have built a board that uses the beagleboard expansion connector,
using MCBSP3. There are a total of 9 different I2C devices on the
board -- a microcontroller, and 8 TLV320AIC33 codecs.

The Codecs and the mcbsp must be configured in TDM mode, and I want
all 8 codecs to show up as a single 16 channel sound card.

There is already a driver for a single TLV320AIC33 driver (in sound/
soc/codecs/tlv320aic3x.c, and I have one of those going.

My question is: how do i get all 8 codecs to show up in one sound
card?

Do I instantiate 8 AIC33s? I tried that, but I get an error when
registering the SOC_DOUBLE_R_TLV.... and friends -- the second time
around, they fail because the mixer controls are already inserted with
those names.

Does anybody know how this is supposed to be done with multiple codecs
per board?

There seem to be different concepts that I'm not clear on:
substreams, subdevices, etc.

I tried something like this:
static struct snd_soc_dai_link puppy_dai[] =
{
{
.name = "tlv320aic33-se-a",
.stream_name = "tlv320aic33-se",
.cpu_dai_name = "omap-mcbsp-dai.2",
.platform_name = "omap-pcm-audio",
.codec_dai_name = "tlv320aic3x-se-hifi",
.codec_name = "tlv320aic3x-se-codec.2-0018",
.ops = &puppy_ops,
.symmetric_rates = 1, // I think this requires send
and receive be the same
rate.
.init = puppy_dai_link_init,
},
{
.name = "tlv320aic33-se-b",
.stream_name = "tlv320aic33-se",
.cpu_dai_name = "omap-mcbsp-dai.2",
.platform_name = "omap-pcm-audio",
.codec_dai_name = "tlv320aic3x-se-hifi",
.codec_name = "tlv320aic3x-se-codec.2-0019",
.ops = &puppy_ops,
.symmetric_rates = 1, // I think this requires send
and receive be the same
rate.
.init = puppy_dai_link_init,
},
};

static struct snd_soc_card snd_soc_puppy = {
.name = "tlv320aic33-se",
.owner = THIS_MODULE,
.dai_link = puppy_dai,
.num_links = ARRAY_SIZE(puppy_dai),
};

and then this:
platform_set_drvdata(puppy_snd_device, &snd_soc_puppy);
But it fails when trying to instantiate the 2nd device.

Any thoughts?
Thanks,
-Caleb
Reply all
Reply to author
Forward
0 new messages