|
@@ -598,17 +598,6 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream)
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
-/* ASoC PCM operations */
|
|
|
-static struct snd_pcm_ops soc_pcm_ops = {
|
|
|
- .open = soc_pcm_open,
|
|
|
- .close = soc_pcm_close,
|
|
|
- .hw_params = soc_pcm_hw_params,
|
|
|
- .hw_free = soc_pcm_hw_free,
|
|
|
- .prepare = soc_pcm_prepare,
|
|
|
- .trigger = soc_pcm_trigger,
|
|
|
- .pointer = soc_pcm_pointer,
|
|
|
-};
|
|
|
-
|
|
|
/* create a new pcm */
|
|
|
int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|
|
{
|
|
@@ -616,10 +605,19 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|
|
struct snd_soc_platform *platform = rtd->platform;
|
|
|
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
|
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
|
|
+ struct snd_pcm_ops *soc_pcm_ops = &rtd->ops;
|
|
|
struct snd_pcm *pcm;
|
|
|
char new_name[64];
|
|
|
int ret = 0, playback = 0, capture = 0;
|
|
|
|
|
|
+ soc_pcm_ops->open = soc_pcm_open;
|
|
|
+ soc_pcm_ops->close = soc_pcm_close;
|
|
|
+ soc_pcm_ops->hw_params = soc_pcm_hw_params;
|
|
|
+ soc_pcm_ops->hw_free = soc_pcm_hw_free;
|
|
|
+ soc_pcm_ops->prepare = soc_pcm_prepare;
|
|
|
+ soc_pcm_ops->trigger = soc_pcm_trigger;
|
|
|
+ soc_pcm_ops->pointer = soc_pcm_pointer;
|
|
|
+
|
|
|
/* check client and interface hw capabilities */
|
|
|
snprintf(new_name, sizeof(new_name), "%s %s-%d",
|
|
|
rtd->dai_link->stream_name, codec_dai->name, num);
|
|
@@ -643,20 +641,20 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
|
|
|
rtd->pcm = pcm;
|
|
|
pcm->private_data = rtd;
|
|
|
if (platform->driver->ops) {
|
|
|
- soc_pcm_ops.mmap = platform->driver->ops->mmap;
|
|
|
- soc_pcm_ops.pointer = platform->driver->ops->pointer;
|
|
|
- soc_pcm_ops.ioctl = platform->driver->ops->ioctl;
|
|
|
- soc_pcm_ops.copy = platform->driver->ops->copy;
|
|
|
- soc_pcm_ops.silence = platform->driver->ops->silence;
|
|
|
- soc_pcm_ops.ack = platform->driver->ops->ack;
|
|
|
- soc_pcm_ops.page = platform->driver->ops->page;
|
|
|
+ soc_pcm_ops->mmap = platform->driver->ops->mmap;
|
|
|
+ soc_pcm_ops->pointer = platform->driver->ops->pointer;
|
|
|
+ soc_pcm_ops->ioctl = platform->driver->ops->ioctl;
|
|
|
+ soc_pcm_ops->copy = platform->driver->ops->copy;
|
|
|
+ soc_pcm_ops->silence = platform->driver->ops->silence;
|
|
|
+ soc_pcm_ops->ack = platform->driver->ops->ack;
|
|
|
+ soc_pcm_ops->page = platform->driver->ops->page;
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
|
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);
|
|
|
|
|
|
if (platform->driver->pcm_new) {
|
|
|
ret = platform->driver->pcm_new(rtd);
|