diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-04-27 13:58:17 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-04-27 17:10:55 -0400 |
commit | 8842c72afe9f954d9462da577a25d4a32bfe0a2b (patch) | |
tree | df56158bc212d2f5de958e6fff7f8d00cd2c370d /sound/soc | |
parent | 5357e8f505d058b7419eb6a91b6e42b8f1fc02d5 (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.c | 43 |
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 | ||
687 | codec_dai_err: | 687 | codec_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 | ||
691 | platform_err: | 691 | platform_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; |