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 | /* |
