diff options
Diffstat (limited to 'sound/soc/soc-compress.c')
-rw-r--r-- | sound/soc/soc-compress.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c index ed0bfb0ddb96..3853f7eb3f28 100644 --- a/sound/soc/soc-compress.c +++ b/sound/soc/soc-compress.c | |||
@@ -315,7 +315,7 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream, | |||
315 | } | 315 | } |
316 | 316 | ||
317 | static int soc_compr_copy(struct snd_compr_stream *cstream, | 317 | static int soc_compr_copy(struct snd_compr_stream *cstream, |
318 | const char __user *buf, size_t count) | 318 | char __user *buf, size_t count) |
319 | { | 319 | { |
320 | struct snd_soc_pcm_runtime *rtd = cstream->private_data; | 320 | struct snd_soc_pcm_runtime *rtd = cstream->private_data; |
321 | struct snd_soc_platform *platform = rtd->platform; | 321 | struct snd_soc_platform *platform = rtd->platform; |
@@ -330,11 +330,38 @@ static int soc_compr_copy(struct snd_compr_stream *cstream, | |||
330 | return ret; | 330 | return ret; |
331 | } | 331 | } |
332 | 332 | ||
333 | static int sst_compr_set_metadata(struct snd_compr_stream *cstream, | ||
334 | struct snd_compr_metadata *metadata) | ||
335 | { | ||
336 | struct snd_soc_pcm_runtime *rtd = cstream->private_data; | ||
337 | struct snd_soc_platform *platform = rtd->platform; | ||
338 | int ret = 0; | ||
339 | |||
340 | if (platform->driver->compr_ops && platform->driver->compr_ops->set_metadata) | ||
341 | ret = platform->driver->compr_ops->set_metadata(cstream, metadata); | ||
342 | |||
343 | return ret; | ||
344 | } | ||
345 | |||
346 | static int sst_compr_get_metadata(struct snd_compr_stream *cstream, | ||
347 | struct snd_compr_metadata *metadata) | ||
348 | { | ||
349 | struct snd_soc_pcm_runtime *rtd = cstream->private_data; | ||
350 | struct snd_soc_platform *platform = rtd->platform; | ||
351 | int ret = 0; | ||
352 | |||
353 | if (platform->driver->compr_ops && platform->driver->compr_ops->get_metadata) | ||
354 | ret = platform->driver->compr_ops->get_metadata(cstream, metadata); | ||
355 | |||
356 | return ret; | ||
357 | } | ||
333 | /* ASoC Compress operations */ | 358 | /* ASoC Compress operations */ |
334 | static struct snd_compr_ops soc_compr_ops = { | 359 | static struct snd_compr_ops soc_compr_ops = { |
335 | .open = soc_compr_open, | 360 | .open = soc_compr_open, |
336 | .free = soc_compr_free, | 361 | .free = soc_compr_free, |
337 | .set_params = soc_compr_set_params, | 362 | .set_params = soc_compr_set_params, |
363 | .set_metadata = sst_compr_set_metadata, | ||
364 | .get_metadata = sst_compr_get_metadata, | ||
338 | .get_params = soc_compr_get_params, | 365 | .get_params = soc_compr_get_params, |
339 | .trigger = soc_compr_trigger, | 366 | .trigger = soc_compr_trigger, |
340 | .pointer = soc_compr_pointer, | 367 | .pointer = soc_compr_pointer, |
@@ -357,7 +384,14 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num) | |||
357 | /* check client and interface hw capabilities */ | 384 | /* check client and interface hw capabilities */ |
358 | snprintf(new_name, sizeof(new_name), "%s %s-%d", | 385 | snprintf(new_name, sizeof(new_name), "%s %s-%d", |
359 | rtd->dai_link->stream_name, codec_dai->name, num); | 386 | rtd->dai_link->stream_name, codec_dai->name, num); |
360 | direction = SND_COMPRESS_PLAYBACK; | 387 | |
388 | if (codec_dai->driver->playback.channels_min) | ||
389 | direction = SND_COMPRESS_PLAYBACK; | ||
390 | else if (codec_dai->driver->capture.channels_min) | ||
391 | direction = SND_COMPRESS_CAPTURE; | ||
392 | else | ||
393 | return -EINVAL; | ||
394 | |||
361 | compr = kzalloc(sizeof(*compr), GFP_KERNEL); | 395 | compr = kzalloc(sizeof(*compr), GFP_KERNEL); |
362 | if (compr == NULL) { | 396 | if (compr == NULL) { |
363 | snd_printk(KERN_ERR "Cannot allocate compr\n"); | 397 | snd_printk(KERN_ERR "Cannot allocate compr\n"); |