• Home
  • Raw
  • Download

Lines Matching +full:dmic01 +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0-only
3 * skl-pcm.c -ASoC HDA Platform driver file implementing PCM functionality
5 * Copyright (C) 2014-2015 Intel Corp
19 #include "skl-topology.h"
20 #include "skl-sst-dsp.h"
21 #include "skl-sst-ipc.h"
59 return substream->runtime->private_data; in get_hdac_ext_stream()
66 struct hdac_bus *bus = hstream->bus; in get_bus_ctx()
76 hdac_stream(stream)->bufsize = 0; in skl_substream_alloc_pages()
77 hdac_stream(stream)->period_bytes = 0; in skl_substream_alloc_pages()
78 hdac_stream(stream)->format_val = 0; in skl_substream_alloc_pages()
88 /* avoid wrap-around with wall-clock */ in skl_set_pcm_constrains()
95 if (bus->ppcap) in skl_get_host_stream_type()
111 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_set_suspend_active()
115 w = snd_soc_dai_get_widget(dai, substream->stream); in skl_set_suspend_active()
117 if (w->ignore_suspend && enable) in skl_set_suspend_active()
118 skl->supend_active++; in skl_set_suspend_active()
119 else if (w->ignore_suspend && !enable) in skl_set_suspend_active()
120 skl->supend_active--; in skl_set_suspend_active()
132 hstream = snd_hdac_get_stream(bus, params->stream, in skl_pcm_host_dma_prepare()
133 params->host_dma_id + 1); in skl_pcm_host_dma_prepare()
135 return -EINVAL; in skl_pcm_host_dma_prepare()
140 format_val = snd_hdac_calc_stream_format(params->s_freq, in skl_pcm_host_dma_prepare()
141 params->ch, params->format, params->host_bps, 0); in skl_pcm_host_dma_prepare()
144 format_val, params->s_freq, params->ch, params->format); in skl_pcm_host_dma_prepare()
155 if (IS_BXT(skl->pci)) { in skl_pcm_host_dma_prepare()
166 hdac_stream(stream)->prepared = 1; in skl_pcm_host_dma_prepare()
180 hstream = snd_hdac_get_stream(bus, params->stream, in skl_pcm_link_dma_prepare()
181 params->link_dma_id + 1); in skl_pcm_link_dma_prepare()
183 return -EINVAL; in skl_pcm_link_dma_prepare()
187 format_val = snd_hdac_calc_stream_format(params->s_freq, params->ch, in skl_pcm_link_dma_prepare()
188 params->format, params->link_bps, 0); in skl_pcm_link_dma_prepare()
191 format_val, params->s_freq, params->ch, params->format); in skl_pcm_link_dma_prepare()
197 stream_tag = hstream->stream_tag; in skl_pcm_link_dma_prepare()
198 if (stream->hstream.direction == SNDRV_PCM_STREAM_PLAYBACK) { in skl_pcm_link_dma_prepare()
199 list_for_each_entry(link, &bus->hlink_list, list) { in skl_pcm_link_dma_prepare()
200 if (link->index == params->link_index) in skl_pcm_link_dma_prepare()
206 stream->link_prepared = 1; in skl_pcm_link_dma_prepare()
214 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_pcm_open()
216 struct snd_pcm_runtime *runtime = substream->runtime; in skl_pcm_open()
218 struct skl_dev *skl = get_skl_ctx(dai->dev); in skl_pcm_open()
221 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); in skl_pcm_open()
226 return -EBUSY; in skl_pcm_open()
234 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { in skl_pcm_open()
235 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; /* legacy */ in skl_pcm_open()
236 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_LINK_ATIME; in skl_pcm_open()
239 runtime->private_data = stream; in skl_pcm_open()
243 return -ENOMEM; in skl_pcm_open()
245 dma_params->stream_tag = hdac_stream(stream)->stream_tag; in skl_pcm_open()
248 dev_dbg(dai->dev, "stream tag set in dma params=%d\n", in skl_pcm_open()
249 dma_params->stream_tag); in skl_pcm_open()
253 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); in skl_pcm_open()
256 return -EINVAL; in skl_pcm_open()
259 skl_tplg_d0i3_get(skl, mconfig->d0i3_caps); in skl_pcm_open()
267 struct skl_dev *skl = get_skl_ctx(dai->dev); in skl_pcm_prepare()
271 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); in skl_pcm_prepare()
273 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); in skl_pcm_prepare()
277 * calls prepare another time, reset the FW pipe to clean state in skl_pcm_prepare()
280 (substream->runtime->status->state == SNDRV_PCM_STATE_XRUN || in skl_pcm_prepare()
281 mconfig->pipe->state == SKL_PIPE_CREATED || in skl_pcm_prepare()
282 mconfig->pipe->state == SKL_PIPE_PAUSED)) { in skl_pcm_prepare()
284 ret = skl_reset_pipe(skl, mconfig->pipe); in skl_pcm_prepare()
289 ret = skl_pcm_host_dma_prepare(dai->dev, in skl_pcm_prepare()
290 mconfig->pipe->p_params); in skl_pcm_prepare()
302 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_pcm_hw_params()
304 struct snd_pcm_runtime *runtime = substream->runtime; in skl_pcm_hw_params()
309 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); in skl_pcm_hw_params()
315 dev_dbg(dai->dev, "format_val, rate=%d, ch=%d, format=%d\n", in skl_pcm_hw_params()
316 runtime->rate, runtime->channels, runtime->format); in skl_pcm_hw_params()
318 dma_id = hdac_stream(stream)->stream_tag - 1; in skl_pcm_hw_params()
319 dev_dbg(dai->dev, "dma_id=%d\n", dma_id); in skl_pcm_hw_params()
325 p_params.stream = substream->stream; in skl_pcm_hw_params()
327 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in skl_pcm_hw_params()
328 p_params.host_bps = dai->driver->playback.sig_bits; in skl_pcm_hw_params()
330 p_params.host_bps = dai->driver->capture.sig_bits; in skl_pcm_hw_params()
335 skl_tplg_update_pipe_params(dai->dev, m_cfg, &p_params); in skl_pcm_hw_params()
344 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_pcm_close()
349 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); in skl_pcm_close()
365 if (!strncmp(dai->name, "Reference Pin", 13) && in skl_pcm_close()
366 skl->miscbdcg_disabled) { in skl_pcm_close()
367 skl->enable_miscbdcge(dai->dev, true); in skl_pcm_close()
368 skl->miscbdcg_disabled = false; in skl_pcm_close()
371 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); in skl_pcm_close()
373 skl_tplg_d0i3_put(skl, mconfig->d0i3_caps); in skl_pcm_close()
382 struct skl_dev *skl = get_skl_ctx(dai->dev); in skl_pcm_hw_free()
386 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); in skl_pcm_hw_free()
388 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); in skl_pcm_hw_free()
391 ret = skl_reset_pipe(skl, mconfig->pipe); in skl_pcm_hw_free()
393 dev_err(dai->dev, "%s:Reset failed ret =%d", in skl_pcm_hw_free()
398 hdac_stream(stream)->prepared = 0; in skl_pcm_hw_free()
412 p_params.stream = substream->stream; in skl_be_hw_params()
429 if (!hstr->prepared) in skl_decoupled_trigger()
430 return -EPIPE; in skl_decoupled_trigger()
446 return -EINVAL; in skl_decoupled_trigger()
449 spin_lock_irqsave(&bus->reg_lock, cookie); in skl_decoupled_trigger()
458 spin_unlock_irqrestore(&bus->reg_lock, cookie); in skl_decoupled_trigger()
466 struct skl_dev *skl = get_skl_ctx(dai->dev); in skl_pcm_trigger()
473 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); in skl_pcm_trigger()
475 return -EIO; in skl_pcm_trigger()
477 w = snd_soc_dai_get_widget(dai, substream->stream); in skl_pcm_trigger()
481 if (!w->ignore_suspend) { in skl_pcm_trigger()
488 hdac_stream(stream)->index); in skl_pcm_trigger()
490 stream->lpib); in skl_pcm_trigger()
491 snd_hdac_ext_stream_set_lpib(stream, stream->lpib); in skl_pcm_trigger()
506 return skl_run_pipe(skl, mconfig->pipe); in skl_pcm_trigger()
517 ret = skl_stop_pipe(skl, mconfig->pipe); in skl_pcm_trigger()
522 if ((cmd == SNDRV_PCM_TRIGGER_SUSPEND) && !w->ignore_suspend) { in skl_pcm_trigger()
524 stream->dpib = readl(bus->remap_addr + in skl_pcm_trigger()
527 hdac_stream(stream)->index)); in skl_pcm_trigger()
529 stream->lpib = snd_hdac_stream_get_pos_lpib( in skl_pcm_trigger()
536 return -EINVAL; in skl_pcm_trigger()
547 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_link_hw_params()
558 return -EBUSY; in skl_link_hw_params()
562 link = snd_hdac_ext_bus_get_link(bus, codec_dai->component->name); in skl_link_hw_params()
564 return -EINVAL; in skl_link_hw_params()
566 stream_tag = hdac_stream(link_dev)->stream_tag; in skl_link_hw_params()
569 snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream); in skl_link_hw_params()
574 p_params.stream = substream->stream; in skl_link_hw_params()
575 p_params.link_dma_id = stream_tag - 1; in skl_link_hw_params()
576 p_params.link_index = link->index; in skl_link_hw_params()
579 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in skl_link_hw_params()
580 p_params.link_bps = codec_dai->driver->playback.sig_bits; in skl_link_hw_params()
582 p_params.link_bps = codec_dai->driver->capture.sig_bits; in skl_link_hw_params()
590 struct skl_dev *skl = get_skl_ctx(dai->dev); in skl_link_pcm_prepare()
593 /* In case of XRUN recovery, reset the FW pipe to clean state */ in skl_link_pcm_prepare()
594 mconfig = skl_tplg_be_get_cpr_module(dai, substream->stream); in skl_link_pcm_prepare()
595 if (mconfig && !mconfig->pipe->passthru && in skl_link_pcm_prepare()
596 (substream->runtime->status->state == SNDRV_PCM_STATE_XRUN)) in skl_link_pcm_prepare()
597 skl_reset_pipe(skl, mconfig->pipe); in skl_link_pcm_prepare()
610 dev_dbg(dai->dev, "In %s cmd=%d\n", __func__, cmd); in skl_link_pcm_trigger()
627 return -EINVAL; in skl_link_pcm_trigger()
635 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_link_hw_free()
642 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); in skl_link_hw_free()
644 link_dev->link_prepared = 0; in skl_link_hw_free()
646 link = snd_hdac_ext_bus_get_link(bus, asoc_rtd_to_codec(rtd, 0)->component->name); in skl_link_hw_free()
648 return -EINVAL; in skl_link_hw_free()
650 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in skl_link_hw_free()
651 stream_tag = hdac_stream(link_dev)->stream_tag; in skl_link_hw_free()
978 .name = "DMIC01 Pin",
981 .stream_name = "DMIC01 Rx",
1065 dai_drv->ops = &skl_pcm_dai_ops; in skl_dai_load()
1074 struct snd_soc_dai_link *dai_link = rtd->dai_link; in skl_platform_soc_open()
1076 dev_dbg(asoc_rtd_to_cpu(rtd, 0)->dev, "In %s:%s\n", __func__, in skl_platform_soc_open()
1077 dai_link->cpus->dai_name); in skl_platform_soc_open()
1098 dev_dbg(bus->dev, "In %s cmd=%d\n", __func__, cmd); in skl_coupled_trigger()
1100 if (!hstr->prepared) in skl_coupled_trigger()
1101 return -EPIPE; in skl_coupled_trigger()
1117 return -EINVAL; in skl_coupled_trigger()
1121 if (s->pcm->card != substream->pcm->card) in skl_coupled_trigger()
1124 sbits |= 1 << hdac_stream(stream)->index; in skl_coupled_trigger()
1128 spin_lock_irqsave(&bus->reg_lock, cookie); in skl_coupled_trigger()
1134 if (s->pcm->card != substream->pcm->card) in skl_coupled_trigger()
1142 spin_unlock_irqrestore(&bus->reg_lock, cookie); in skl_coupled_trigger()
1146 spin_lock_irqsave(&bus->reg_lock, cookie); in skl_coupled_trigger()
1152 spin_unlock_irqrestore(&bus->reg_lock, cookie); in skl_coupled_trigger()
1163 if (!bus->ppcap) in skl_platform_soc_trigger()
1178 * Use DPIB for Playback stream as the periodic DMA Position-in- in skl_platform_soc_pointer()
1194 * 3. Read the DMA Position-in-Buffer. This value now will be equal to in skl_platform_soc_pointer()
1198 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in skl_platform_soc_pointer()
1199 pos = readl(bus->remap_addr + AZX_REG_VS_SDXDPIB_XBASE + in skl_platform_soc_pointer()
1201 hdac_stream(hstream)->index)); in skl_platform_soc_pointer()
1204 readl(bus->remap_addr + in skl_platform_soc_pointer()
1207 hdac_stream(hstream)->index)); in skl_platform_soc_pointer()
1211 if (pos >= hdac_stream(hstream)->bufsize) in skl_platform_soc_pointer()
1214 return bytes_to_frames(substream->runtime, pos); in skl_platform_soc_pointer()
1231 if (!codec_dai->driver->ops->delay) in skl_adjust_codec_delay()
1234 codec_frames = codec_dai->driver->ops->delay(substream, codec_dai); in skl_adjust_codec_delay()
1236 substream->runtime->rate); in skl_adjust_codec_delay()
1238 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) in skl_adjust_codec_delay()
1241 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0; in skl_adjust_codec_delay()
1255 if ((substream->runtime->hw.info & SNDRV_PCM_INFO_HAS_LINK_ATIME) && in skl_platform_soc_get_time_info()
1256 (audio_tstamp_config->type_requested == SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK)) { in skl_platform_soc_get_time_info()
1258 snd_pcm_gettime(substream->runtime, system_ts); in skl_platform_soc_get_time_info()
1260 nsec = timecounter_read(&hstr->tc); in skl_platform_soc_get_time_info()
1262 if (audio_tstamp_config->report_delay) in skl_platform_soc_get_time_info()
1267 audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK; in skl_platform_soc_get_time_info()
1268 audio_tstamp_report->accuracy_report = 1; /* rest of struct is valid */ in skl_platform_soc_get_time_info()
1269 audio_tstamp_report->accuracy = 42; /* 24MHzWallClk == 42ns resolution */ in skl_platform_soc_get_time_info()
1272 audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT; in skl_platform_soc_get_time_info()
1284 struct hdac_bus *bus = dev_get_drvdata(dai->dev); in skl_platform_soc_new()
1285 struct snd_pcm *pcm = rtd->pcm; in skl_platform_soc_new()
1289 if (dai->driver->playback.channels_min || in skl_platform_soc_new()
1290 dai->driver->capture.channels_min) { in skl_platform_soc_new()
1291 /* buffer pre-allocation */ in skl_platform_soc_new()
1297 &skl->pci->dev, in skl_platform_soc_new()
1311 int i, ret = -EIO; in skl_get_module_info()
1313 uuid_mod = (guid_t *)mconfig->guid; in skl_get_module_info()
1315 if (list_empty(&skl->uuid_list)) { in skl_get_module_info()
1316 dev_err(skl->dev, "Module list is empty\n"); in skl_get_module_info()
1317 return -EIO; in skl_get_module_info()
1320 for (i = 0; i < skl->nr_modules; i++) { in skl_get_module_info()
1321 skl_module = skl->modules[i]; in skl_get_module_info()
1322 uuid_tplg = &skl_module->uuid; in skl_get_module_info()
1324 mconfig->module = skl_module; in skl_get_module_info()
1330 if (skl->nr_modules && ret) in skl_get_module_info()
1333 ret = -EIO; in skl_get_module_info()
1334 list_for_each_entry(module, &skl->uuid_list, list) { in skl_get_module_info()
1335 if (guid_equal(uuid_mod, &module->uuid)) { in skl_get_module_info()
1336 mconfig->id.module_id = module->id; in skl_get_module_info()
1337 mconfig->module->loadable = module->is_loadable; in skl_get_module_info()
1342 pin_id = &mconfig->m_in_pin[i].id; in skl_get_module_info()
1343 if (guid_equal(&pin_id->mod_uuid, &module->uuid)) in skl_get_module_info()
1344 pin_id->module_id = module->id; in skl_get_module_info()
1348 pin_id = &mconfig->m_out_pin[i].id; in skl_get_module_info()
1349 if (guid_equal(&pin_id->mod_uuid, &module->uuid)) in skl_get_module_info()
1350 pin_id->module_id = module->id; in skl_get_module_info()
1365 list_for_each_entry(p, &skl->ppl_list, node) { in skl_populate_modules()
1366 list_for_each_entry(m, &p->pipe->w_list, node) { in skl_populate_modules()
1367 w = m->w; in skl_populate_modules()
1368 mconfig = w->priv; in skl_populate_modules()
1372 dev_err(skl->dev, in skl_populate_modules()
1386 struct hdac_bus *bus = dev_get_drvdata(component->dev); in skl_platform_soc_probe()
1391 pm_runtime_get_sync(component->dev); in skl_platform_soc_probe()
1392 if (bus->ppcap) { in skl_platform_soc_probe()
1393 skl->component = component; in skl_platform_soc_probe()
1396 skl->debugfs = skl_debugfs_init(skl); in skl_platform_soc_probe()
1400 dev_err(component->dev, "Failed to init topology!\n"); in skl_platform_soc_probe()
1405 ops = skl_get_dsp_ops(skl->pci->device); in skl_platform_soc_probe()
1407 return -EIO; in skl_platform_soc_probe()
1413 skl->enable_miscbdcge(component->dev, false); in skl_platform_soc_probe()
1414 skl->clock_power_gating(component->dev, false); in skl_platform_soc_probe()
1416 ret = ops->init_fw(component->dev, skl); in skl_platform_soc_probe()
1417 skl->enable_miscbdcge(component->dev, true); in skl_platform_soc_probe()
1418 skl->clock_power_gating(component->dev, true); in skl_platform_soc_probe()
1420 dev_err(component->dev, "Failed to boot first fw: %d\n", ret); in skl_platform_soc_probe()
1424 skl->update_d0i3c = skl_update_d0i3c; in skl_platform_soc_probe()
1426 if (skl->cfg.astate_cfg != NULL) { in skl_platform_soc_probe()
1428 skl->cfg.astate_cfg->count, in skl_platform_soc_probe()
1429 skl->cfg.astate_cfg); in skl_platform_soc_probe()
1432 pm_runtime_mark_last_busy(component->dev); in skl_platform_soc_probe()
1433 pm_runtime_put_autosuspend(component->dev); in skl_platform_soc_probe()
1440 struct hdac_bus *bus = dev_get_drvdata(component->dev); in skl_platform_soc_remove()
1469 skl->dais = kmemdup(skl_platform_dai, sizeof(skl_platform_dai), in skl_platform_register()
1471 if (!skl->dais) { in skl_platform_register()
1472 ret = -ENOMEM; in skl_platform_register()
1476 if (!skl->use_tplg_pcm) { in skl_platform_register()
1477 dais = krealloc(skl->dais, sizeof(skl_fe_dai) + in skl_platform_register()
1480 kfree(skl->dais); in skl_platform_register()
1481 ret = -ENOMEM; in skl_platform_register()
1485 skl->dais = dais; in skl_platform_register()
1486 memcpy(&skl->dais[ARRAY_SIZE(skl_platform_dai)], skl_fe_dai, in skl_platform_register()
1492 skl->dais, num_dais); in skl_platform_register()
1494 kfree(skl->dais); in skl_platform_register()
1507 list_for_each_entry_safe(modules, tmp, &skl->bind_list, node) { in skl_platform_unregister()
1508 list_del(&modules->node); in skl_platform_unregister()
1512 kfree(skl->dais); in skl_platform_unregister()