Lines Matching +full:is +full:- +full:compress +full:- +full:dai

1 // SPDX-License-Identifier: GPL-2.0-only
3 * sst_mfld_platform.c - Intel MID Platform driver
5 * Copyright (C) 2010-2014 Intel Corp
23 #include "sst-mfld-platform.h"
24 #include "sst-atom-controls.h"
32 return -EINVAL; in sst_register_dsp()
33 if (!try_module_get(dev->dev->driver->owner)) in sst_register_dsp()
34 return -ENODEV; in sst_register_dsp()
37 dev_err(dev->dev, "we already have a device %s\n", sst->name); in sst_register_dsp()
38 module_put(dev->dev->driver->owner); in sst_register_dsp()
40 return -EEXIST; in sst_register_dsp()
42 dev_dbg(dev->dev, "registering device %s\n", dev->name); in sst_register_dsp()
52 return -EINVAL; in sst_unregister_dsp()
54 return -EINVAL; in sst_unregister_dsp()
60 return -EIO; in sst_unregister_dsp()
63 module_put(sst->dev->driver->owner); in sst_unregister_dsp()
64 dev_dbg(dev->dev, "unreg %s\n", sst->name); in sst_unregister_dsp()
96 static int sst_media_digital_mute(struct snd_soc_dai *dai, int mute, int stream) in sst_media_digital_mute() argument
99 return sst_send_pipe_gains(dai, stream, mute); in sst_media_digital_mute()
107 spin_lock_irqsave(&stream->status_lock, flags); in sst_set_stream_status()
108 stream->stream_status = state; in sst_set_stream_status()
109 spin_unlock_irqrestore(&stream->status_lock, flags); in sst_set_stream_status()
117 spin_lock_irqsave(&stream->status_lock, flags); in sst_get_stream_status()
118 state = stream->stream_status; in sst_get_stream_status()
119 spin_unlock_irqrestore(&stream->status_lock, flags); in sst_get_stream_status()
130 u32 buffer_addr = substream->runtime->dma_addr; in sst_fill_alloc_params()
132 channels = substream->runtime->channels; in sst_fill_alloc_params()
133 period_size = substream->runtime->period_size; in sst_fill_alloc_params()
134 periodbytes = samples_to_bytes(substream->runtime, period_size); in sst_fill_alloc_params()
135 alloc_param->ring_buf_info[0].addr = buffer_addr; in sst_fill_alloc_params()
136 alloc_param->ring_buf_info[0].size = buffer_bytes; in sst_fill_alloc_params()
137 alloc_param->sg_count = 1; in sst_fill_alloc_params()
138 alloc_param->reserved = 0; in sst_fill_alloc_params()
139 alloc_param->frag_size = periodbytes * channels; in sst_fill_alloc_params()
145 param->uc.pcm_params.num_chan = (u8) substream->runtime->channels; in sst_fill_pcm_params()
146 param->uc.pcm_params.pcm_wd_sz = substream->runtime->sample_bits; in sst_fill_pcm_params()
147 param->uc.pcm_params.sfreq = substream->runtime->rate; in sst_fill_pcm_params()
150 param->uc.pcm_params.use_offload_path = 0; in sst_fill_pcm_params()
151 param->uc.pcm_params.reserved2 = 0; in sst_fill_pcm_params()
152 memset(param->uc.pcm_params.channel_map, 0, sizeof(u8)); in sst_fill_pcm_params()
162 return -EINVAL; in sst_get_stream_mapping()
165 /* index 0 is not used in stream map */ in sst_get_stream_mapping()
182 map = ctx->pdata->pdev_strm_map; in sst_fill_stream_params()
183 map_size = ctx->pdata->strm_map_size; in sst_fill_stream_params()
190 str_params->stream_type = SST_STREAM_TYPE_MUSIC; in sst_fill_stream_params()
194 index = sst_get_stream_mapping(pstream->pcm->device, in sst_fill_stream_params()
195 pstream->number, pstream->stream, in sst_fill_stream_params()
198 return -EINVAL; in sst_fill_stream_params()
200 str_params->stream_id = index; in sst_fill_stream_params()
201 str_params->device_type = map[index].device_id; in sst_fill_stream_params()
202 str_params->task = map[index].task_id; in sst_fill_stream_params()
204 str_params->ops = (u8)pstream->stream; in sst_fill_stream_params()
208 index = sst_get_stream_mapping(cstream->device->device, in sst_fill_stream_params()
209 0, cstream->direction, in sst_fill_stream_params()
212 return -EINVAL; in sst_fill_stream_params()
213 str_params->stream_id = index; in sst_fill_stream_params()
214 str_params->device_type = map[index].device_id; in sst_fill_stream_params()
215 str_params->task = map[index].task_id; in sst_fill_stream_params()
217 str_params->ops = (u8)cstream->direction; in sst_fill_stream_params()
223 struct snd_soc_dai *dai) in sst_platform_alloc_stream() argument
226 substream->runtime->private_data; in sst_platform_alloc_stream()
231 struct sst_data *ctx = snd_soc_dai_get_drvdata(dai); in sst_platform_alloc_stream()
245 stream->stream_info.str_id = str_params.stream_id; in sst_platform_alloc_stream()
247 ret_val = stream->ops->open(sst->dev, &str_params); in sst_platform_alloc_stream()
261 if (!substream || !substream->runtime) in sst_period_elapsed()
263 stream = substream->runtime->private_data; in sst_period_elapsed()
275 substream->runtime->private_data; in sst_platform_init_stream()
279 dev_dbg(rtd->dev, "setting buffer ptr param\n"); in sst_platform_init_stream()
281 stream->stream_info.period_elapsed = sst_period_elapsed; in sst_platform_init_stream()
282 stream->stream_info.arg = substream; in sst_platform_init_stream()
283 stream->stream_info.buffer_ptr = 0; in sst_platform_init_stream()
284 stream->stream_info.sfreq = substream->runtime->rate; in sst_platform_init_stream()
285 ret_val = stream->ops->stream_init(sst->dev, &stream->stream_info); in sst_platform_init_stream()
287 dev_err(rtd->dev, "control_set ret error %d\n", ret_val); in sst_platform_init_stream()
294 return stream->ops->power(sst->dev, true); in power_up_sst()
299 stream->ops->power(sst->dev, false); in power_down_sst()
303 struct snd_soc_dai *dai) in sst_media_open() argument
306 struct snd_pcm_runtime *runtime = substream->runtime; in sst_media_open()
311 return -ENOMEM; in sst_media_open()
312 spin_lock_init(&stream->status_lock); in sst_media_open()
317 !try_module_get(sst->dev->driver->owner)) { in sst_media_open()
318 dev_err(dai->dev, "no device available to run\n"); in sst_media_open()
319 ret_val = -ENODEV; in sst_media_open()
322 stream->ops = sst->ops; in sst_media_open()
325 stream->stream_info.str_id = 0; in sst_media_open()
327 stream->stream_info.arg = substream; in sst_media_open()
329 runtime->private_data = stream; in sst_media_open()
341 snd_pcm_hw_constraint_step(substream->runtime, 0, in sst_media_open()
343 snd_pcm_hw_constraint_step(substream->runtime, 0, in sst_media_open()
346 /* Make sure, that the period size is always even */ in sst_media_open()
347 snd_pcm_hw_constraint_step(substream->runtime, 0, in sst_media_open()
360 struct snd_soc_dai *dai) in sst_media_close() argument
365 stream = substream->runtime->private_data; in sst_media_close()
368 str_id = stream->stream_info.str_id; in sst_media_close()
370 stream->ops->close(sst->dev, str_id); in sst_media_close()
371 module_put(sst->dev->driver->owner); in sst_media_close()
376 struct snd_soc_dai *dai) in sst_media_prepare() argument
381 stream = substream->runtime->private_data; in sst_media_prepare()
382 str_id = stream->stream_info.str_id; in sst_media_prepare()
383 if (stream->stream_info.str_id) { in sst_media_prepare()
384 ret_val = stream->ops->stream_drop(sst->dev, str_id); in sst_media_prepare()
388 ret_val = sst_platform_alloc_stream(substream, dai); in sst_media_prepare()
391 snprintf(substream->pcm->id, sizeof(substream->pcm->id), in sst_media_prepare()
392 "%d", stream->stream_info.str_id); in sst_media_prepare()
397 substream->runtime->hw.info = SNDRV_PCM_INFO_BLOCK_TRANSFER; in sst_media_prepare()
402 struct snd_soc_dai *dai) in sst_enable_ssp() argument
406 if (!snd_soc_dai_active(dai)) { in sst_enable_ssp()
407 ret = sst_handle_vb_timer(dai, true); in sst_enable_ssp()
408 sst_fill_ssp_defaults(dai); in sst_enable_ssp()
415 struct snd_soc_dai *dai) in sst_be_hw_params() argument
419 if (snd_soc_dai_active(dai) == 1) in sst_be_hw_params()
420 ret = send_ssp_cmd(dai, dai->name, 1); in sst_be_hw_params()
424 static int sst_set_format(struct snd_soc_dai *dai, unsigned int fmt) in sst_set_format() argument
428 if (!snd_soc_dai_active(dai)) in sst_set_format()
431 ret = sst_fill_ssp_config(dai, fmt); in sst_set_format()
433 dev_err(dai->dev, "sst_set_format failed..\n"); in sst_set_format()
438 static int sst_platform_set_ssp_slot(struct snd_soc_dai *dai, in sst_platform_set_ssp_slot() argument
443 if (!snd_soc_dai_active(dai)) in sst_platform_set_ssp_slot()
446 ret = sst_fill_ssp_slot(dai, tx_mask, rx_mask, slots, slot_width); in sst_platform_set_ssp_slot()
448 dev_err(dai->dev, "sst_fill_ssp_slot failed..%d\n", ret); in sst_platform_set_ssp_slot()
454 struct snd_soc_dai *dai) in sst_disable_ssp() argument
456 if (!snd_soc_dai_active(dai)) { in sst_disable_ssp()
457 send_ssp_cmd(dai, dai->name, 0); in sst_disable_ssp()
458 sst_handle_vb_timer(dai, false); in sst_disable_ssp()
484 .name = "media-cpu-dai",
502 .name = "deepbuffer-cpu-dai",
513 .name = "compress-cpu-dai",
516 .stream_name = "Compress Playback",
522 .name = "ssp0-port",
540 .name = "ssp1-port",
558 .name = "ssp2-port",
582 if (substream->pcm->internal) in sst_soc_open()
585 runtime = substream->runtime; in sst_soc_open()
586 runtime->hw = sst_platform_pcm_hw; in sst_soc_open()
598 dev_dbg(rtd->dev, "%s called\n", __func__); in sst_soc_trigger()
599 if (substream->pcm->internal) in sst_soc_trigger()
601 stream = substream->runtime->private_data; in sst_soc_trigger()
602 str_id = stream->stream_info.str_id; in sst_soc_trigger()
605 dev_dbg(rtd->dev, "sst: Trigger Start\n"); in sst_soc_trigger()
607 stream->stream_info.arg = substream; in sst_soc_trigger()
608 ret_val = stream->ops->stream_start(sst->dev, str_id); in sst_soc_trigger()
611 dev_dbg(rtd->dev, "sst: in stop\n"); in sst_soc_trigger()
613 ret_val = stream->ops->stream_drop(sst->dev, str_id); in sst_soc_trigger()
617 dev_dbg(rtd->dev, "sst: in pause\n"); in sst_soc_trigger()
619 ret_val = stream->ops->stream_pause(sst->dev, str_id); in sst_soc_trigger()
623 dev_dbg(rtd->dev, "sst: in pause release\n"); in sst_soc_trigger()
625 ret_val = stream->ops->stream_pause_release(sst->dev, str_id); in sst_soc_trigger()
628 return -EINVAL; in sst_soc_trigger()
646 stream = substream->runtime->private_data; in sst_soc_pointer()
650 str_info = &stream->stream_info; in sst_soc_pointer()
651 ret_val = stream->ops->stream_read_tstamp(sst->dev, str_info); in sst_soc_pointer()
653 dev_err(rtd->dev, "sst: error code = %d\n", ret_val); in sst_soc_pointer()
656 return str_info->buffer_ptr; in sst_soc_pointer()
662 struct sst_runtime_stream *stream = substream->runtime->private_data; in sst_soc_delay()
663 struct pcm_stream_info *str_info = &stream->stream_info; in sst_soc_delay()
668 return str_info->pcm_delay; in sst_soc_delay()
674 struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0); in sst_soc_pcm_new() local
675 struct snd_pcm *pcm = rtd->pcm; in sst_soc_pcm_new()
677 if (dai->driver->playback.channels_min || in sst_soc_pcm_new()
678 dai->driver->capture.channels_min) { in sst_soc_pcm_new()
680 pcm->card->dev, in sst_soc_pcm_new()
688 struct sst_data *drv = dev_get_drvdata(component->dev); in sst_soc_probe()
690 drv->soc_card = component->card; in sst_soc_probe()
696 struct sst_data *drv = dev_get_drvdata(component->dev); in sst_soc_remove()
698 drv->soc_card = NULL; in sst_soc_remove()
719 drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); in sst_platform_probe()
721 return -ENOMEM; in sst_platform_probe()
724 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); in sst_platform_probe()
726 return -ENOMEM; in sst_platform_probe()
729 pdata->pdev_strm_map = dpcm_strm_map; in sst_platform_probe()
730 pdata->strm_map_size = ARRAY_SIZE(dpcm_strm_map); in sst_platform_probe()
731 drv->pdata = pdata; in sst_platform_probe()
732 drv->pdev = pdev; in sst_platform_probe()
733 mutex_init(&drv->lock); in sst_platform_probe()
734 dev_set_drvdata(&pdev->dev, drv); in sst_platform_probe()
736 ret = devm_snd_soc_register_component(&pdev->dev, &sst_soc_platform_drv, in sst_platform_probe()
739 dev_err(&pdev->dev, "registering cpu dais failed\n"); in sst_platform_probe()
746 dev_dbg(&pdev->dev, "sst_platform_remove success\n"); in sst_platform_remove()
756 if (!drv->soc_card) in sst_soc_prepare()
760 snd_soc_suspend(drv->soc_card->dev); in sst_soc_prepare()
761 snd_soc_poweroff(drv->soc_card->dev); in sst_soc_prepare()
764 for_each_card_rtds(drv->soc_card, rtd) { in sst_soc_prepare()
765 struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0); in sst_soc_prepare() local
767 if (snd_soc_dai_active(dai)) { in sst_soc_prepare()
768 send_ssp_cmd(dai, dai->name, 0); in sst_soc_prepare()
769 sst_handle_vb_timer(dai, false); in sst_soc_prepare()
781 if (!drv->soc_card) in sst_soc_complete()
785 for_each_card_rtds(drv->soc_card, rtd) { in sst_soc_complete()
786 struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0); in sst_soc_complete() local
788 if (snd_soc_dai_active(dai)) { in sst_soc_complete()
789 sst_handle_vb_timer(dai, true); in sst_soc_complete()
790 send_ssp_cmd(dai, dai->name, 1); in sst_soc_complete()
793 snd_soc_resume(drv->soc_card->dev); in sst_soc_complete()
811 .name = "sst-mfld-platform",
824 MODULE_ALIAS("platform:sst-atom-hifi2-platform");
825 MODULE_ALIAS("platform:sst-mfld-platform");