diff options
Diffstat (limited to 'sound/soc/soc-core.c')
-rw-r--r-- | sound/soc/soc-core.c | 102 |
1 files changed, 54 insertions, 48 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index d4b90d82a098..16518329f6b2 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -133,8 +133,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) | |||
133 | mutex_lock(&pcm_mutex); | 133 | mutex_lock(&pcm_mutex); |
134 | 134 | ||
135 | /* startup the audio subsystem */ | 135 | /* startup the audio subsystem */ |
136 | if (cpu_dai->ops.startup) { | 136 | if (cpu_dai->ops->startup) { |
137 | ret = cpu_dai->ops.startup(substream, cpu_dai); | 137 | ret = cpu_dai->ops->startup(substream, cpu_dai); |
138 | if (ret < 0) { | 138 | if (ret < 0) { |
139 | printk(KERN_ERR "asoc: can't open interface %s\n", | 139 | printk(KERN_ERR "asoc: can't open interface %s\n", |
140 | cpu_dai->name); | 140 | cpu_dai->name); |
@@ -150,8 +150,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) | |||
150 | } | 150 | } |
151 | } | 151 | } |
152 | 152 | ||
153 | if (codec_dai->ops.startup) { | 153 | if (codec_dai->ops->startup) { |
154 | ret = codec_dai->ops.startup(substream, codec_dai); | 154 | ret = codec_dai->ops->startup(substream, codec_dai); |
155 | if (ret < 0) { | 155 | if (ret < 0) { |
156 | printk(KERN_ERR "asoc: can't open codec %s\n", | 156 | printk(KERN_ERR "asoc: can't open codec %s\n", |
157 | codec_dai->name); | 157 | codec_dai->name); |
@@ -247,8 +247,8 @@ codec_dai_err: | |||
247 | platform->pcm_ops->close(substream); | 247 | platform->pcm_ops->close(substream); |
248 | 248 | ||
249 | platform_err: | 249 | platform_err: |
250 | if (cpu_dai->ops.shutdown) | 250 | if (cpu_dai->ops->shutdown) |
251 | cpu_dai->ops.shutdown(substream, cpu_dai); | 251 | cpu_dai->ops->shutdown(substream, cpu_dai); |
252 | out: | 252 | out: |
253 | mutex_unlock(&pcm_mutex); | 253 | mutex_unlock(&pcm_mutex); |
254 | return ret; | 254 | return ret; |
@@ -340,11 +340,11 @@ static int soc_codec_close(struct snd_pcm_substream *substream) | |||
340 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 340 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
341 | snd_soc_dai_digital_mute(codec_dai, 1); | 341 | snd_soc_dai_digital_mute(codec_dai, 1); |
342 | 342 | ||
343 | if (cpu_dai->ops.shutdown) | 343 | if (cpu_dai->ops->shutdown) |
344 | cpu_dai->ops.shutdown(substream, cpu_dai); | 344 | cpu_dai->ops->shutdown(substream, cpu_dai); |
345 | 345 | ||
346 | if (codec_dai->ops.shutdown) | 346 | if (codec_dai->ops->shutdown) |
347 | codec_dai->ops.shutdown(substream, codec_dai); | 347 | codec_dai->ops->shutdown(substream, codec_dai); |
348 | 348 | ||
349 | if (machine->ops && machine->ops->shutdown) | 349 | if (machine->ops && machine->ops->shutdown) |
350 | machine->ops->shutdown(substream); | 350 | machine->ops->shutdown(substream); |
@@ -408,16 +408,16 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) | |||
408 | } | 408 | } |
409 | } | 409 | } |
410 | 410 | ||
411 | if (codec_dai->ops.prepare) { | 411 | if (codec_dai->ops->prepare) { |
412 | ret = codec_dai->ops.prepare(substream, codec_dai); | 412 | ret = codec_dai->ops->prepare(substream, codec_dai); |
413 | if (ret < 0) { | 413 | if (ret < 0) { |
414 | printk(KERN_ERR "asoc: codec DAI prepare error\n"); | 414 | printk(KERN_ERR "asoc: codec DAI prepare error\n"); |
415 | goto out; | 415 | goto out; |
416 | } | 416 | } |
417 | } | 417 | } |
418 | 418 | ||
419 | if (cpu_dai->ops.prepare) { | 419 | if (cpu_dai->ops->prepare) { |
420 | ret = cpu_dai->ops.prepare(substream, cpu_dai); | 420 | ret = cpu_dai->ops->prepare(substream, cpu_dai); |
421 | if (ret < 0) { | 421 | if (ret < 0) { |
422 | printk(KERN_ERR "asoc: cpu DAI prepare error\n"); | 422 | printk(KERN_ERR "asoc: cpu DAI prepare error\n"); |
423 | goto out; | 423 | goto out; |
@@ -494,8 +494,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, | |||
494 | } | 494 | } |
495 | } | 495 | } |
496 | 496 | ||
497 | if (codec_dai->ops.hw_params) { | 497 | if (codec_dai->ops->hw_params) { |
498 | ret = codec_dai->ops.hw_params(substream, params, codec_dai); | 498 | ret = codec_dai->ops->hw_params(substream, params, codec_dai); |
499 | if (ret < 0) { | 499 | if (ret < 0) { |
500 | printk(KERN_ERR "asoc: can't set codec %s hw params\n", | 500 | printk(KERN_ERR "asoc: can't set codec %s hw params\n", |
501 | codec_dai->name); | 501 | codec_dai->name); |
@@ -503,8 +503,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, | |||
503 | } | 503 | } |
504 | } | 504 | } |
505 | 505 | ||
506 | if (cpu_dai->ops.hw_params) { | 506 | if (cpu_dai->ops->hw_params) { |
507 | ret = cpu_dai->ops.hw_params(substream, params, cpu_dai); | 507 | ret = cpu_dai->ops->hw_params(substream, params, cpu_dai); |
508 | if (ret < 0) { | 508 | if (ret < 0) { |
509 | printk(KERN_ERR "asoc: interface %s hw params failed\n", | 509 | printk(KERN_ERR "asoc: interface %s hw params failed\n", |
510 | cpu_dai->name); | 510 | cpu_dai->name); |
@@ -526,12 +526,12 @@ out: | |||
526 | return ret; | 526 | return ret; |
527 | 527 | ||
528 | platform_err: | 528 | platform_err: |
529 | if (cpu_dai->ops.hw_free) | 529 | if (cpu_dai->ops->hw_free) |
530 | cpu_dai->ops.hw_free(substream, cpu_dai); | 530 | cpu_dai->ops->hw_free(substream, cpu_dai); |
531 | 531 | ||
532 | interface_err: | 532 | interface_err: |
533 | if (codec_dai->ops.hw_free) | 533 | if (codec_dai->ops->hw_free) |
534 | codec_dai->ops.hw_free(substream, codec_dai); | 534 | codec_dai->ops->hw_free(substream, codec_dai); |
535 | 535 | ||
536 | codec_err: | 536 | codec_err: |
537 | if (machine->ops && machine->ops->hw_free) | 537 | if (machine->ops && machine->ops->hw_free) |
@@ -570,11 +570,11 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) | |||
570 | platform->pcm_ops->hw_free(substream); | 570 | platform->pcm_ops->hw_free(substream); |
571 | 571 | ||
572 | /* now free hw params for the DAI's */ | 572 | /* now free hw params for the DAI's */ |
573 | if (codec_dai->ops.hw_free) | 573 | if (codec_dai->ops->hw_free) |
574 | codec_dai->ops.hw_free(substream, codec_dai); | 574 | codec_dai->ops->hw_free(substream, codec_dai); |
575 | 575 | ||
576 | if (cpu_dai->ops.hw_free) | 576 | if (cpu_dai->ops->hw_free) |
577 | cpu_dai->ops.hw_free(substream, cpu_dai); | 577 | cpu_dai->ops->hw_free(substream, cpu_dai); |
578 | 578 | ||
579 | mutex_unlock(&pcm_mutex); | 579 | mutex_unlock(&pcm_mutex); |
580 | return 0; | 580 | return 0; |
@@ -591,8 +591,8 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | |||
591 | struct snd_soc_dai *codec_dai = machine->codec_dai; | 591 | struct snd_soc_dai *codec_dai = machine->codec_dai; |
592 | int ret; | 592 | int ret; |
593 | 593 | ||
594 | if (codec_dai->ops.trigger) { | 594 | if (codec_dai->ops->trigger) { |
595 | ret = codec_dai->ops.trigger(substream, cmd, codec_dai); | 595 | ret = codec_dai->ops->trigger(substream, cmd, codec_dai); |
596 | if (ret < 0) | 596 | if (ret < 0) |
597 | return ret; | 597 | return ret; |
598 | } | 598 | } |
@@ -603,8 +603,8 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | |||
603 | return ret; | 603 | return ret; |
604 | } | 604 | } |
605 | 605 | ||
606 | if (cpu_dai->ops.trigger) { | 606 | if (cpu_dai->ops->trigger) { |
607 | ret = cpu_dai->ops.trigger(substream, cmd, cpu_dai); | 607 | ret = cpu_dai->ops->trigger(substream, cmd, cpu_dai); |
608 | if (ret < 0) | 608 | if (ret < 0) |
609 | return ret; | 609 | return ret; |
610 | } | 610 | } |
@@ -645,8 +645,8 @@ static int soc_suspend(struct platform_device *pdev, pm_message_t state) | |||
645 | /* mute any active DAC's */ | 645 | /* mute any active DAC's */ |
646 | for (i = 0; i < card->num_links; i++) { | 646 | for (i = 0; i < card->num_links; i++) { |
647 | struct snd_soc_dai *dai = card->dai_link[i].codec_dai; | 647 | struct snd_soc_dai *dai = card->dai_link[i].codec_dai; |
648 | if (dai->ops.digital_mute && dai->playback.active) | 648 | if (dai->ops->digital_mute && dai->playback.active) |
649 | dai->ops.digital_mute(dai, 1); | 649 | dai->ops->digital_mute(dai, 1); |
650 | } | 650 | } |
651 | 651 | ||
652 | /* suspend all pcms */ | 652 | /* suspend all pcms */ |
@@ -741,8 +741,8 @@ static void soc_resume_deferred(struct work_struct *work) | |||
741 | /* unmute any active DACs */ | 741 | /* unmute any active DACs */ |
742 | for (i = 0; i < card->num_links; i++) { | 742 | for (i = 0; i < card->num_links; i++) { |
743 | struct snd_soc_dai *dai = card->dai_link[i].codec_dai; | 743 | struct snd_soc_dai *dai = card->dai_link[i].codec_dai; |
744 | if (dai->ops.digital_mute && dai->playback.active) | 744 | if (dai->ops->digital_mute && dai->playback.active) |
745 | dai->ops.digital_mute(dai, 0); | 745 | dai->ops->digital_mute(dai, 0); |
746 | } | 746 | } |
747 | 747 | ||
748 | for (i = 0; i < card->num_links; i++) { | 748 | for (i = 0; i < card->num_links; i++) { |
@@ -2051,8 +2051,8 @@ EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8); | |||
2051 | int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, | 2051 | int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, |
2052 | unsigned int freq, int dir) | 2052 | unsigned int freq, int dir) |
2053 | { | 2053 | { |
2054 | if (dai->ops.set_sysclk) | 2054 | if (dai->ops->set_sysclk) |
2055 | return dai->ops.set_sysclk(dai, clk_id, freq, dir); | 2055 | return dai->ops->set_sysclk(dai, clk_id, freq, dir); |
2056 | else | 2056 | else |
2057 | return -EINVAL; | 2057 | return -EINVAL; |
2058 | } | 2058 | } |
@@ -2071,8 +2071,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); | |||
2071 | int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai, | 2071 | int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai, |
2072 | int div_id, int div) | 2072 | int div_id, int div) |
2073 | { | 2073 | { |
2074 | if (dai->ops.set_clkdiv) | 2074 | if (dai->ops->set_clkdiv) |
2075 | return dai->ops.set_clkdiv(dai, div_id, div); | 2075 | return dai->ops->set_clkdiv(dai, div_id, div); |
2076 | else | 2076 | else |
2077 | return -EINVAL; | 2077 | return -EINVAL; |
2078 | } | 2078 | } |
@@ -2090,8 +2090,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv); | |||
2090 | int snd_soc_dai_set_pll(struct snd_soc_dai *dai, | 2090 | int snd_soc_dai_set_pll(struct snd_soc_dai *dai, |
2091 | int pll_id, unsigned int freq_in, unsigned int freq_out) | 2091 | int pll_id, unsigned int freq_in, unsigned int freq_out) |
2092 | { | 2092 | { |
2093 | if (dai->ops.set_pll) | 2093 | if (dai->ops->set_pll) |
2094 | return dai->ops.set_pll(dai, pll_id, freq_in, freq_out); | 2094 | return dai->ops->set_pll(dai, pll_id, freq_in, freq_out); |
2095 | else | 2095 | else |
2096 | return -EINVAL; | 2096 | return -EINVAL; |
2097 | } | 2097 | } |
@@ -2106,8 +2106,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll); | |||
2106 | */ | 2106 | */ |
2107 | int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | 2107 | int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
2108 | { | 2108 | { |
2109 | if (dai->ops.set_fmt) | 2109 | if (dai->ops->set_fmt) |
2110 | return dai->ops.set_fmt(dai, fmt); | 2110 | return dai->ops->set_fmt(dai, fmt); |
2111 | else | 2111 | else |
2112 | return -EINVAL; | 2112 | return -EINVAL; |
2113 | } | 2113 | } |
@@ -2125,8 +2125,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt); | |||
2125 | int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, | 2125 | int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, |
2126 | unsigned int mask, int slots) | 2126 | unsigned int mask, int slots) |
2127 | { | 2127 | { |
2128 | if (dai->ops.set_sysclk) | 2128 | if (dai->ops->set_sysclk) |
2129 | return dai->ops.set_tdm_slot(dai, mask, slots); | 2129 | return dai->ops->set_tdm_slot(dai, mask, slots); |
2130 | else | 2130 | else |
2131 | return -EINVAL; | 2131 | return -EINVAL; |
2132 | } | 2132 | } |
@@ -2141,8 +2141,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot); | |||
2141 | */ | 2141 | */ |
2142 | int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate) | 2142 | int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate) |
2143 | { | 2143 | { |
2144 | if (dai->ops.set_sysclk) | 2144 | if (dai->ops->set_sysclk) |
2145 | return dai->ops.set_tristate(dai, tristate); | 2145 | return dai->ops->set_tristate(dai, tristate); |
2146 | else | 2146 | else |
2147 | return -EINVAL; | 2147 | return -EINVAL; |
2148 | } | 2148 | } |
@@ -2157,8 +2157,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate); | |||
2157 | */ | 2157 | */ |
2158 | int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute) | 2158 | int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute) |
2159 | { | 2159 | { |
2160 | if (dai->ops.digital_mute) | 2160 | if (dai->ops->digital_mute) |
2161 | return dai->ops.digital_mute(dai, mute); | 2161 | return dai->ops->digital_mute(dai, mute); |
2162 | else | 2162 | else |
2163 | return -EINVAL; | 2163 | return -EINVAL; |
2164 | } | 2164 | } |
@@ -2211,6 +2211,9 @@ static int snd_soc_unregister_card(struct snd_soc_card *card) | |||
2211 | return 0; | 2211 | return 0; |
2212 | } | 2212 | } |
2213 | 2213 | ||
2214 | static struct snd_soc_dai_ops null_dai_ops = { | ||
2215 | }; | ||
2216 | |||
2214 | /** | 2217 | /** |
2215 | * snd_soc_register_dai - Register a DAI with the ASoC core | 2218 | * snd_soc_register_dai - Register a DAI with the ASoC core |
2216 | * | 2219 | * |
@@ -2225,6 +2228,9 @@ int snd_soc_register_dai(struct snd_soc_dai *dai) | |||
2225 | if (!dai->dev) | 2228 | if (!dai->dev) |
2226 | printk(KERN_WARNING "No device for DAI %s\n", dai->name); | 2229 | printk(KERN_WARNING "No device for DAI %s\n", dai->name); |
2227 | 2230 | ||
2231 | if (!dai->ops) | ||
2232 | dai->ops = &null_dai_ops; | ||
2233 | |||
2228 | INIT_LIST_HEAD(&dai->list); | 2234 | INIT_LIST_HEAD(&dai->list); |
2229 | 2235 | ||
2230 | mutex_lock(&client_mutex); | 2236 | mutex_lock(&client_mutex); |