diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2014-03-20 05:52:41 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-03-25 14:09:20 -0400 |
commit | cf7dc23cbfd5c4c5ab2136f19522d9b3b41acf99 (patch) | |
tree | 39df7ae9eed7c8d9305e75f9a478332f2bb8392c | |
parent | 46c39cae292fd691f32e573e6c2c854e36614c93 (diff) |
ASoC: simple-card: dynamically allocate the DAI link and properties
The DAI link array and the properties (fmt, sysclk slots) are
hard-coded for a single CPU / CODEC link.
This patch dynamically allocates the DAI link array and the
properties with the aim of supporting many DAI links.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | sound/soc/generic/simple-card.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c index 2ee8ed56bcf1..1e865c5d377f 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c | |||
@@ -20,9 +20,11 @@ | |||
20 | 20 | ||
21 | struct simple_card_data { | 21 | struct simple_card_data { |
22 | struct snd_soc_card snd_card; | 22 | struct snd_soc_card snd_card; |
23 | struct asoc_simple_dai cpu_dai; | 23 | struct simple_dai_props { |
24 | struct asoc_simple_dai codec_dai; | 24 | struct asoc_simple_dai cpu_dai; |
25 | struct snd_soc_dai_link snd_link; | 25 | struct asoc_simple_dai codec_dai; |
26 | } *dai_props; | ||
27 | struct snd_soc_dai_link dai_link[]; /* dynamically allocated */ | ||
26 | }; | 28 | }; |
27 | 29 | ||
28 | static int __asoc_simple_card_dai_init(struct snd_soc_dai *dai, | 30 | static int __asoc_simple_card_dai_init(struct snd_soc_dai *dai, |
@@ -70,11 +72,11 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd) | |||
70 | struct snd_soc_dai *cpu = rtd->cpu_dai; | 72 | struct snd_soc_dai *cpu = rtd->cpu_dai; |
71 | int ret; | 73 | int ret; |
72 | 74 | ||
73 | ret = __asoc_simple_card_dai_init(codec, &priv->codec_dai); | 75 | ret = __asoc_simple_card_dai_init(codec, &priv->dai_props->codec_dai); |
74 | if (ret < 0) | 76 | if (ret < 0) |
75 | return ret; | 77 | return ret; |
76 | 78 | ||
77 | ret = __asoc_simple_card_dai_init(cpu, &priv->cpu_dai); | 79 | ret = __asoc_simple_card_dai_init(cpu, &priv->dai_props->cpu_dai); |
78 | if (ret < 0) | 80 | if (ret < 0) |
79 | return ret; | 81 | return ret; |
80 | 82 | ||
@@ -151,8 +153,8 @@ static int asoc_simple_card_parse_of(struct device_node *node, | |||
151 | struct device *dev) | 153 | struct device *dev) |
152 | { | 154 | { |
153 | struct snd_soc_dai_link *dai_link = priv->snd_card.dai_link; | 155 | struct snd_soc_dai_link *dai_link = priv->snd_card.dai_link; |
154 | struct asoc_simple_dai *codec_dai = &priv->codec_dai; | 156 | struct asoc_simple_dai *codec_dai = &priv->dai_props->codec_dai; |
155 | struct asoc_simple_dai *cpu_dai = &priv->cpu_dai; | 157 | struct asoc_simple_dai *cpu_dai = &priv->dai_props->cpu_dai; |
156 | struct device_node *np; | 158 | struct device_node *np; |
157 | char *name; | 159 | char *name; |
158 | unsigned int daifmt; | 160 | unsigned int daifmt; |
@@ -284,7 +286,10 @@ static int asoc_simple_card_probe(struct platform_device *pdev) | |||
284 | struct device *dev = &pdev->dev; | 286 | struct device *dev = &pdev->dev; |
285 | int ret; | 287 | int ret; |
286 | 288 | ||
287 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); | 289 | /* allocate the private data and the DAI link array */ |
290 | priv = devm_kzalloc(dev, | ||
291 | sizeof(*priv) + sizeof(*dai_link), | ||
292 | GFP_KERNEL); | ||
288 | if (!priv) | 293 | if (!priv) |
289 | return -ENOMEM; | 294 | return -ENOMEM; |
290 | 295 | ||
@@ -293,10 +298,17 @@ static int asoc_simple_card_probe(struct platform_device *pdev) | |||
293 | */ | 298 | */ |
294 | priv->snd_card.owner = THIS_MODULE; | 299 | priv->snd_card.owner = THIS_MODULE; |
295 | priv->snd_card.dev = dev; | 300 | priv->snd_card.dev = dev; |
296 | dai_link = &priv->snd_link; | 301 | dai_link = priv->dai_link; |
297 | priv->snd_card.dai_link = dai_link; | 302 | priv->snd_card.dai_link = dai_link; |
298 | priv->snd_card.num_links = 1; | 303 | priv->snd_card.num_links = 1; |
299 | 304 | ||
305 | /* get room for the other properties */ | ||
306 | priv->dai_props = devm_kzalloc(dev, | ||
307 | sizeof(*priv->dai_props), | ||
308 | GFP_KERNEL); | ||
309 | if (!priv->dai_props) | ||
310 | return -ENOMEM; | ||
311 | |||
300 | if (np && of_device_is_available(np)) { | 312 | if (np && of_device_is_available(np)) { |
301 | 313 | ||
302 | ret = asoc_simple_card_parse_of(np, priv, dev); | 314 | ret = asoc_simple_card_parse_of(np, priv, dev); |
@@ -330,13 +342,13 @@ static int asoc_simple_card_probe(struct platform_device *pdev) | |||
330 | dai_link->codec_name = cinfo->codec; | 342 | dai_link->codec_name = cinfo->codec; |
331 | dai_link->cpu_dai_name = cinfo->cpu_dai.name; | 343 | dai_link->cpu_dai_name = cinfo->cpu_dai.name; |
332 | dai_link->codec_dai_name = cinfo->codec_dai.name; | 344 | dai_link->codec_dai_name = cinfo->codec_dai.name; |
333 | memcpy(&priv->cpu_dai, &cinfo->cpu_dai, | 345 | memcpy(&priv->dai_props->cpu_dai, &cinfo->cpu_dai, |
334 | sizeof(priv->cpu_dai)); | 346 | sizeof(priv->dai_props->cpu_dai)); |
335 | memcpy(&priv->codec_dai, &cinfo->codec_dai, | 347 | memcpy(&priv->dai_props->codec_dai, &cinfo->codec_dai, |
336 | sizeof(priv->codec_dai)); | 348 | sizeof(priv->dai_props->codec_dai)); |
337 | 349 | ||
338 | priv->cpu_dai.fmt |= cinfo->daifmt; | 350 | priv->dai_props->cpu_dai.fmt |= cinfo->daifmt; |
339 | priv->codec_dai.fmt |= cinfo->daifmt; | 351 | priv->dai_props->codec_dai.fmt |= cinfo->daifmt; |
340 | } | 352 | } |
341 | 353 | ||
342 | /* | 354 | /* |