Commit 8842c72a authored by Mark Brown's avatar Mark Brown

ASoC: Allow platform drivers to have no ops structure

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarJassi Brar <jassisinghbrar@gmail.com>
Acked-by: default avatarLiam Girdwood <lrg@ti.com>
parent 5357e8f5
...@@ -555,7 +555,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) ...@@ -555,7 +555,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
} }
} }
if (platform->driver->ops->open) { if (platform->driver->ops && platform->driver->ops->open) {
ret = platform->driver->ops->open(substream); ret = platform->driver->ops->open(substream);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: can't open platform %s\n", platform->name); printk(KERN_ERR "asoc: can't open platform %s\n", platform->name);
...@@ -685,7 +685,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) ...@@ -685,7 +685,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
codec_dai->driver->ops->shutdown(substream, codec_dai); codec_dai->driver->ops->shutdown(substream, codec_dai);
codec_dai_err: codec_dai_err:
if (platform->driver->ops->close) if (platform->driver->ops && platform->driver->ops->close)
platform->driver->ops->close(substream); platform->driver->ops->close(substream);
platform_err: platform_err:
...@@ -767,7 +767,7 @@ static int soc_codec_close(struct snd_pcm_substream *substream) ...@@ -767,7 +767,7 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown) if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown)
rtd->dai_link->ops->shutdown(substream); rtd->dai_link->ops->shutdown(substream);
if (platform->driver->ops->close) if (platform->driver->ops && platform->driver->ops->close)
platform->driver->ops->close(substream); platform->driver->ops->close(substream);
cpu_dai->runtime = NULL; cpu_dai->runtime = NULL;
...@@ -810,7 +810,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) ...@@ -810,7 +810,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
} }
} }
if (platform->driver->ops->prepare) { if (platform->driver->ops && platform->driver->ops->prepare) {
ret = platform->driver->ops->prepare(substream); ret = platform->driver->ops->prepare(substream);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: platform prepare error\n"); printk(KERN_ERR "asoc: platform prepare error\n");
...@@ -899,7 +899,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -899,7 +899,7 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
} }
} }
if (platform->driver->ops->hw_params) { if (platform->driver->ops && platform->driver->ops->hw_params) {
ret = platform->driver->ops->hw_params(substream, params); ret = platform->driver->ops->hw_params(substream, params);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: platform %s hw params failed\n", 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,7 +952,7 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
rtd->dai_link->ops->hw_free(substream); rtd->dai_link->ops->hw_free(substream);
/* free any DMA resources */ /* free any DMA resources */
if (platform->driver->ops->hw_free) if (platform->driver->ops && platform->driver->ops->hw_free)
platform->driver->ops->hw_free(substream); platform->driver->ops->hw_free(substream);
/* now free hw params for the DAIs */ /* now free hw params for the DAIs */
...@@ -980,7 +980,7 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) ...@@ -980,7 +980,7 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
return ret; return ret;
} }
if (platform->driver->ops->trigger) { if (platform->driver->ops && platform->driver->ops->trigger) {
ret = platform->driver->ops->trigger(substream, cmd); ret = platform->driver->ops->trigger(substream, cmd);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1009,7 +1009,7 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) ...@@ -1009,7 +1009,7 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
snd_pcm_uframes_t offset = 0; snd_pcm_uframes_t offset = 0;
snd_pcm_sframes_t delay = 0; snd_pcm_sframes_t delay = 0;
if (platform->driver->ops->pointer) if (platform->driver->ops && platform->driver->ops->pointer)
offset = platform->driver->ops->pointer(substream); offset = platform->driver->ops->pointer(substream);
if (cpu_dai->driver->ops->delay) if (cpu_dai->driver->ops->delay)
...@@ -2125,6 +2125,7 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) ...@@ -2125,6 +2125,7 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
rtd->pcm = pcm; rtd->pcm = pcm;
pcm->private_data = rtd; pcm->private_data = rtd;
if (platform->driver->ops) {
soc_pcm_ops.mmap = platform->driver->ops->mmap; soc_pcm_ops.mmap = platform->driver->ops->mmap;
soc_pcm_ops.pointer = platform->driver->ops->pointer; soc_pcm_ops.pointer = platform->driver->ops->pointer;
soc_pcm_ops.ioctl = platform->driver->ops->ioctl; soc_pcm_ops.ioctl = platform->driver->ops->ioctl;
...@@ -2132,6 +2133,7 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) ...@@ -2132,6 +2133,7 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
soc_pcm_ops.silence = platform->driver->ops->silence; soc_pcm_ops.silence = platform->driver->ops->silence;
soc_pcm_ops.ack = platform->driver->ops->ack; soc_pcm_ops.ack = platform->driver->ops->ack;
soc_pcm_ops.page = platform->driver->ops->page; soc_pcm_ops.page = platform->driver->ops->page;
}
if (playback) if (playback)
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
...@@ -2139,11 +2141,14 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) ...@@ -2139,11 +2141,14 @@ static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
if (capture) if (capture)
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
ret = platform->driver->pcm_new(rtd->card->snd_card, codec_dai, pcm); if (platform->driver->pcm_new) {
ret = platform->driver->pcm_new(rtd->card->snd_card,
codec_dai, pcm);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "asoc: platform pcm constructor failed\n"); pr_err("asoc: platform pcm constructor failed\n");
return ret; return ret;
} }
}
pcm->private_free = platform->driver->pcm_free; pcm->private_free = platform->driver->pcm_free;
printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name, printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment