aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-04-27 13:58:17 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-04-27 17:10:55 -0400
commit8842c72afe9f954d9462da577a25d4a32bfe0a2b (patch)
treedf56158bc212d2f5de958e6fff7f8d00cd2c370d /sound/soc
parent5357e8f505d058b7419eb6a91b6e42b8f1fc02d5 (diff)
ASoC: Allow platform drivers to have no ops structure
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Jassi Brar <jassisinghbrar@gmail.com> Acked-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/soc-core.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index a6f37d454220..9dc13113fa26 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -555,7 +555,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
555 } 555 }
556 } 556 }
557 557
558 if (platform->driver->ops->open) { 558 if (platform->driver->ops && platform->driver->ops->open) {
559 ret = platform->driver->ops->open(substream); 559 ret = platform->driver->ops->open(substream);
560 if (ret < 0) { 560 if (ret < 0) {
561 printk(KERN_ERR "asoc: can't open platform %s\n", platform->name); 561 printk(KERN_ERR "asoc: can't open platform %s\n", platform->name);
@@ -685,7 +685,7 @@ machine_err:
685 codec_dai->driver->ops->shutdown(substream, codec_dai); 685 codec_dai->driver->ops->shutdown(substream, codec_dai);
686 686
687codec_dai_err: 687codec_dai_err:
688 if (platform->driver->ops->close) 688 if (platform->driver->ops && platform->driver->ops->close)
689 platform->driver->ops->close(substream); 689 platform->driver->ops->close(substream);
690 690
691platform_err: 691platform_err:
@@ -767,7 +767,7 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
767 if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown) 767 if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
768 rtd->dai_link->ops->shutdown(substream); 768 rtd->dai_link->ops->shutdown(substream);
769 769
770 if (platform->driver->ops->close) 770 if (platform->driver->ops && platform->driver->ops->close)
771 platform->driver->ops->close(substream); 771 platform->driver->ops->close(substream);
772 cpu_dai->runtime = NULL; 772 cpu_dai->runtime = NULL;
773 773
@@ -810,7 +810,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
810 } 810 }
811 } 811 }
812 812
813 if (platform->driver->ops->prepare) { 813 if (platform->driver->ops && platform->driver->ops->prepare) {
814 ret = platform->driver->ops->prepare(substream); 814 ret = platform->driver->ops->prepare(substream);
815 if (ret < 0) { 815 if (ret < 0) {
816 printk(KERN_ERR "asoc: platform prepare error\n"); 816 printk(KERN_ERR "asoc: platform prepare error\n");
@@ -899,7 +899,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
899 } 899 }
900 } 900 }
901 901
902 if (platform->driver->ops->hw_params) { 902 if (platform->driver->ops && platform->driver->ops->hw_params) {
903 ret = platform->driver->ops->hw_params(substream, params); 903 ret = platform->driver->ops->hw_params(substream, params);
904 if (ret < 0) { 904 if (ret < 0) {
905 printk(KERN_ERR "asoc: platform %s hw params failed\n", 905 printk(KERN_ERR "asoc: platform %s hw params failed\n",
@@ -952,7 +952,7 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
952 rtd->dai_link->ops->hw_free(substream); 952 rtd->dai_link->ops->hw_free(substream);
953 953
954 /* free any DMA resources */ 954 /* free any DMA resources */
955 if (platform->driver->ops->hw_free) 955 if (platform->driver->ops && platform->driver->ops->hw_free)
956 platform->driver->ops->hw_free(substream); 956 platform->driver->ops->hw_free(substream);
957 957
958 /* now free hw params for the DAIs */ 958 /* now free hw params for the DAIs */
@@ -980,7 +980,7 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
980 return ret; 980 return ret;
981 } 981 }
982 982
983 if (platform->driver->ops->trigger) { 983 if (platform->driver->ops && platform->driver->ops->trigger) {
984 ret = platform->driver->ops->trigger(substream, cmd); 984 ret = platform->driver->ops->trigger(substream, cmd);
985 if (ret < 0) 985 if (ret < 0)
986 return ret; 986 return ret;
@@ -1009,7 +1009,7 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
1009 snd_pcm_uframes_t offset = 0; 1009 snd_pcm_uframes_t offset = 0;
1010 snd_pcm_sframes_t delay = 0; 1010 snd_pcm_sframes_t delay = 0;
1011 1011
1012 if (platform->driver->ops->pointer) 1012 if (platform->driver->ops && platform->driver->ops->pointer)
1013 offset = platform->driver->ops->pointer(substream); 1013 offset = platform->driver->ops->pointer(substream);
1014 1014
1015 if (cpu_dai->driver->ops->delay) 1015 if (cpu_dai->driver->ops->delay)
@@ -2125,13 +2125,15 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2125 2125
2126 rtd->pcm = pcm; 2126 rtd->pcm = pcm;
2127 pcm->private_data = rtd; 2127 pcm->private_data = rtd;
2128 soc_pcm_ops.mmap = platform->driver->ops->mmap; 2128 if (platform->driver->ops) {
2129 soc_pcm_ops.pointer = platform->driver->ops->pointer; 2129 soc_pcm_ops.mmap = platform->driver->ops->mmap;
2130 soc_pcm_ops.ioctl = platform->driver->ops->ioctl; 2130 soc_pcm_ops.pointer = platform->driver->ops->pointer;
2131 soc_pcm_ops.copy = platform->driver->ops->copy; 2131 soc_pcm_ops.ioctl = platform->driver->ops->ioctl;
2132 soc_pcm_ops.silence = platform->driver->ops->silence; 2132 soc_pcm_ops.copy = platform->driver->ops->copy;
2133 soc_pcm_ops.ack = platform->driver->ops->ack; 2133 soc_pcm_ops.silence = platform->driver->ops->silence;
2134 soc_pcm_ops.page = platform->driver->ops->page; 2134 soc_pcm_ops.ack = platform->driver->ops->ack;
2135 soc_pcm_ops.page = platform->driver->ops->page;
2136 }
2135 2137
2136 if (playback) 2138 if (playback)
2137 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops); 2139 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
@@ -2139,10 +2141,13 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2139 if (capture) 2141 if (capture)
2140 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops); 2142 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
2141 2143
2142 ret = platform->driver->pcm_new(rtd->card->snd_card, codec_dai, pcm); 2144 if (platform->driver->pcm_new) {
2143 if (ret < 0) { 2145 ret = platform->driver->pcm_new(rtd->card->snd_card,
2144 printk(KERN_ERR "asoc: platform pcm constructor failed\n"); 2146 codec_dai, pcm);
2145 return ret; 2147 if (ret < 0) {
2148 pr_err("asoc: platform pcm constructor failed\n");
2149 return ret;
2150 }
2146 } 2151 }
2147 2152
2148 pcm->private_free = platform->driver->pcm_free; 2153 pcm->private_free = platform->driver->pcm_free;