Lines Matching +full:write +full:- +full:0 +full:- +full:bps
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
16 #include <sound/hda-mlink.h>
17 #include <sound/hda-sdw-bpt.h>
26 struct sdw_stream_config sconfig = {0}; in sdw_slave_bpt_stream_add()
27 struct sdw_port_config pconfig = {0}; in sdw_slave_bpt_stream_add()
33 sconfig.bps = 32; /* this is required for BPT/BRA */ in sdw_slave_bpt_stream_add()
37 pconfig.num = 0; in sdw_slave_bpt_stream_add()
38 pconfig.ch_mask = BIT(0); in sdw_slave_bpt_stream_add()
42 dev_err(&slave->dev, "%s: failed: %d\n", __func__, ret); in sdw_slave_bpt_stream_add()
50 struct sdw_cdns *cdns = &sdw->cdns; in intel_ace2x_bpt_open_stream()
51 struct sdw_bus *bus = &cdns->bus; in intel_ace2x_bpt_open_stream()
52 struct sdw_master_prop *prop = &bus->prop; in intel_ace2x_bpt_open_stream()
73 return -ENOMEM; in intel_ace2x_bpt_open_stream()
75 cdns->bus.bpt_stream = stream; in intel_ace2x_bpt_open_stream()
78 if (ret < 0) in intel_ace2x_bpt_open_stream()
84 pdi0 = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, 1, dir, 0); in intel_ace2x_bpt_open_stream()
86 dev_err(cdns->dev, "%s: sdw_cdns_alloc_pdi0 failed\n", __func__); in intel_ace2x_bpt_open_stream()
87 ret = -EINVAL; in intel_ace2x_bpt_open_stream()
96 pdi1 = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, 1, dir, 1); in intel_ace2x_bpt_open_stream()
98 dev_err(cdns->dev, "%s: sdw_cdns_alloc_pdi1 failed\n", __func__); in intel_ace2x_bpt_open_stream()
99 ret = -EINVAL; in intel_ace2x_bpt_open_stream()
113 sconfig.bps = 32; /* this is required for BPT/BRA */ in intel_ace2x_bpt_open_stream()
118 ret = -ENOMEM; in intel_ace2x_bpt_open_stream()
122 for (i = 0; i < 2 /* num_pdi */; i++) { in intel_ace2x_bpt_open_stream()
127 ret = sdw_stream_add_master(&cdns->bus, &sconfig, pconfig, 2, stream); in intel_ace2x_bpt_open_stream()
130 if (ret < 0) { in intel_ace2x_bpt_open_stream()
131 dev_err(cdns->dev, "add master to stream failed:%d\n", ret); in intel_ace2x_bpt_open_stream()
135 ret = sdw_prepare_stream(cdns->bus.bpt_stream); in intel_ace2x_bpt_open_stream()
136 if (ret < 0) in intel_ace2x_bpt_open_stream()
139 command = (msg->flags & SDW_MSG_FLAG_WRITE) ? 0 : 1; in intel_ace2x_bpt_open_stream()
141 ret = sdw_cdns_bpt_find_buffer_sizes(command, cdns->bus.params.row, cdns->bus.params.col, in intel_ace2x_bpt_open_stream()
142 msg->len, SDW_BPT_MSG_MAX_BYTES, &data_per_frame, in intel_ace2x_bpt_open_stream()
144 if (ret < 0) in intel_ace2x_bpt_open_stream()
147 sdw->bpt_ctx.pdi0_buffer_size = pdi0_buffer_size; in intel_ace2x_bpt_open_stream()
148 sdw->bpt_ctx.pdi1_buffer_size = pdi1_buffer_size; in intel_ace2x_bpt_open_stream()
149 sdw->bpt_ctx.num_frames = num_frames; in intel_ace2x_bpt_open_stream()
150 sdw->bpt_ctx.data_per_frame = data_per_frame; in intel_ace2x_bpt_open_stream()
151 tx_dma_bandwidth = div_u64((u64)pdi0_buffer_size * 8 * (u64)prop->default_frame_rate, in intel_ace2x_bpt_open_stream()
153 rx_dma_bandwidth = div_u64((u64)pdi1_buffer_size * 8 * (u64)prop->default_frame_rate, in intel_ace2x_bpt_open_stream()
156 dev_dbg(cdns->dev, "Message len %d transferred in %d frames (%d per frame)\n", in intel_ace2x_bpt_open_stream()
157 msg->len, num_frames, data_per_frame); in intel_ace2x_bpt_open_stream()
158 dev_dbg(cdns->dev, "sizes pdi0 %d pdi1 %d tx_bandwidth %d rx_bandwidth %d\n", in intel_ace2x_bpt_open_stream()
161 ret = hda_sdw_bpt_open(cdns->dev->parent, /* PCI device */ in intel_ace2x_bpt_open_stream()
162 sdw->instance, &sdw->bpt_ctx.bpt_tx_stream, in intel_ace2x_bpt_open_stream()
163 &sdw->bpt_ctx.dmab_tx_bdl, pdi0_buffer_size, tx_dma_bandwidth, in intel_ace2x_bpt_open_stream()
164 &sdw->bpt_ctx.bpt_rx_stream, &sdw->bpt_ctx.dmab_rx_bdl, in intel_ace2x_bpt_open_stream()
166 if (ret < 0) { in intel_ace2x_bpt_open_stream()
167 dev_err(cdns->dev, "%s: hda_sdw_bpt_open failed %d\n", __func__, ret); in intel_ace2x_bpt_open_stream()
172 ret = sdw_cdns_prepare_write_dma_buffer(msg->dev_num, msg->addr, msg->buf, in intel_ace2x_bpt_open_stream()
173 msg->len, data_per_frame, in intel_ace2x_bpt_open_stream()
174 sdw->bpt_ctx.dmab_tx_bdl.area, in intel_ace2x_bpt_open_stream()
177 ret = sdw_cdns_prepare_read_dma_buffer(msg->dev_num, msg->addr, msg->len, in intel_ace2x_bpt_open_stream()
179 sdw->bpt_ctx.dmab_tx_bdl.area, in intel_ace2x_bpt_open_stream()
184 return 0; in intel_ace2x_bpt_open_stream()
186 dev_err(cdns->dev, "%s: sdw_prepare_%s_dma_buffer failed %d\n", in intel_ace2x_bpt_open_stream()
189 ret1 = hda_sdw_bpt_close(cdns->dev->parent, /* PCI device */ in intel_ace2x_bpt_open_stream()
190 sdw->bpt_ctx.bpt_tx_stream, &sdw->bpt_ctx.dmab_tx_bdl, in intel_ace2x_bpt_open_stream()
191 sdw->bpt_ctx.bpt_rx_stream, &sdw->bpt_ctx.dmab_rx_bdl); in intel_ace2x_bpt_open_stream()
192 if (ret1 < 0) in intel_ace2x_bpt_open_stream()
193 dev_err(cdns->dev, "%s: hda_sdw_bpt_close failed: ret %d\n", in intel_ace2x_bpt_open_stream()
197 sdw_deprepare_stream(cdns->bus.bpt_stream); in intel_ace2x_bpt_open_stream()
200 ret1 = sdw_stream_remove_master(&cdns->bus, cdns->bus.bpt_stream); in intel_ace2x_bpt_open_stream()
201 if (ret1 < 0) in intel_ace2x_bpt_open_stream()
202 dev_err(cdns->dev, "%s: remove master failed: %d\n", in intel_ace2x_bpt_open_stream()
206 ret1 = sdw_stream_remove_slave(slave, cdns->bus.bpt_stream); in intel_ace2x_bpt_open_stream()
207 if (ret1 < 0) in intel_ace2x_bpt_open_stream()
208 dev_err(cdns->dev, "%s: remove slave failed: %d\n", in intel_ace2x_bpt_open_stream()
212 sdw_release_stream(cdns->bus.bpt_stream); in intel_ace2x_bpt_open_stream()
213 cdns->bus.bpt_stream = NULL; in intel_ace2x_bpt_open_stream()
221 struct sdw_cdns *cdns = &sdw->cdns; in intel_ace2x_bpt_close_stream()
224 ret = hda_sdw_bpt_close(cdns->dev->parent /* PCI device */, sdw->bpt_ctx.bpt_tx_stream, in intel_ace2x_bpt_close_stream()
225 &sdw->bpt_ctx.dmab_tx_bdl, sdw->bpt_ctx.bpt_rx_stream, in intel_ace2x_bpt_close_stream()
226 &sdw->bpt_ctx.dmab_rx_bdl); in intel_ace2x_bpt_close_stream()
227 if (ret < 0) in intel_ace2x_bpt_close_stream()
228 dev_err(cdns->dev, "%s: hda_sdw_bpt_close failed: ret %d\n", in intel_ace2x_bpt_close_stream()
231 ret = sdw_deprepare_stream(cdns->bus.bpt_stream); in intel_ace2x_bpt_close_stream()
232 if (ret < 0) in intel_ace2x_bpt_close_stream()
233 dev_err(cdns->dev, "%s: sdw_deprepare_stream failed: ret %d\n", in intel_ace2x_bpt_close_stream()
236 ret = sdw_stream_remove_master(&cdns->bus, cdns->bus.bpt_stream); in intel_ace2x_bpt_close_stream()
237 if (ret < 0) in intel_ace2x_bpt_close_stream()
238 dev_err(cdns->dev, "%s: remove master failed: %d\n", in intel_ace2x_bpt_close_stream()
241 ret = sdw_stream_remove_slave(slave, cdns->bus.bpt_stream); in intel_ace2x_bpt_close_stream()
242 if (ret < 0) in intel_ace2x_bpt_close_stream()
243 dev_err(cdns->dev, "%s: remove slave failed: %d\n", in intel_ace2x_bpt_close_stream()
246 cdns->bus.bpt_stream = NULL; in intel_ace2x_bpt_close_stream()
254 struct sdw_cdns *cdns = &sdw->cdns; in intel_ace2x_bpt_send_async()
257 if (msg->len < INTEL_BPT_MSG_BYTE_MIN) { in intel_ace2x_bpt_send_async()
258 dev_err(cdns->dev, "BPT message length %d is less than the minimum bytes %d\n", in intel_ace2x_bpt_send_async()
259 msg->len, INTEL_BPT_MSG_BYTE_MIN); in intel_ace2x_bpt_send_async()
260 return -EINVAL; in intel_ace2x_bpt_send_async()
263 dev_dbg(cdns->dev, "BPT Transfer start\n"); in intel_ace2x_bpt_send_async()
266 if (ret < 0) in intel_ace2x_bpt_send_async()
269 ret = hda_sdw_bpt_send_async(cdns->dev->parent, /* PCI device */ in intel_ace2x_bpt_send_async()
270 sdw->bpt_ctx.bpt_tx_stream, sdw->bpt_ctx.bpt_rx_stream); in intel_ace2x_bpt_send_async()
271 if (ret < 0) { in intel_ace2x_bpt_send_async()
272 dev_err(cdns->dev, "%s: hda_sdw_bpt_send_async failed: %d\n", in intel_ace2x_bpt_send_async()
280 ret = sdw_enable_stream(cdns->bus.bpt_stream); in intel_ace2x_bpt_send_async()
281 if (ret < 0) { in intel_ace2x_bpt_send_async()
282 dev_err(cdns->dev, "%s: sdw_stream_enable failed: %d\n", in intel_ace2x_bpt_send_async()
293 struct sdw_cdns *cdns = &sdw->cdns; in intel_ace2x_bpt_wait()
296 dev_dbg(cdns->dev, "BPT Transfer wait\n"); in intel_ace2x_bpt_wait()
298 ret = hda_sdw_bpt_wait(cdns->dev->parent, /* PCI device */ in intel_ace2x_bpt_wait()
299 sdw->bpt_ctx.bpt_tx_stream, sdw->bpt_ctx.bpt_rx_stream); in intel_ace2x_bpt_wait()
300 if (ret < 0) in intel_ace2x_bpt_wait()
301 dev_err(cdns->dev, "%s: hda_sdw_bpt_wait failed: %d\n", __func__, ret); in intel_ace2x_bpt_wait()
303 ret = sdw_disable_stream(cdns->bus.bpt_stream); in intel_ace2x_bpt_wait()
304 if (ret < 0) { in intel_ace2x_bpt_wait()
305 dev_err(cdns->dev, "%s: sdw_stream_enable failed: %d\n", in intel_ace2x_bpt_wait()
310 if (msg->flags & SDW_MSG_FLAG_WRITE) { in intel_ace2x_bpt_wait()
311 ret = sdw_cdns_check_write_response(cdns->dev, sdw->bpt_ctx.dmab_rx_bdl.area, in intel_ace2x_bpt_wait()
312 sdw->bpt_ctx.pdi1_buffer_size, in intel_ace2x_bpt_wait()
313 sdw->bpt_ctx.num_frames); in intel_ace2x_bpt_wait()
314 if (ret < 0) in intel_ace2x_bpt_wait()
315 dev_err(cdns->dev, "%s: BPT Write failed %d\n", __func__, ret); in intel_ace2x_bpt_wait()
317 ret = sdw_cdns_check_read_response(cdns->dev, sdw->bpt_ctx.dmab_rx_bdl.area, in intel_ace2x_bpt_wait()
318 sdw->bpt_ctx.pdi1_buffer_size, in intel_ace2x_bpt_wait()
319 msg->buf, msg->len, sdw->bpt_ctx.num_frames, in intel_ace2x_bpt_wait()
320 sdw->bpt_ctx.data_per_frame); in intel_ace2x_bpt_wait()
321 if (ret < 0) in intel_ace2x_bpt_wait()
322 dev_err(cdns->dev, "%s: BPT Read failed %d\n", __func__, ret); in intel_ace2x_bpt_wait()
332 * shim vendor-specific (vs) ops
337 void __iomem *shim_vs = sdw->link_res->shim_vs; in intel_shim_vs_init()
338 struct sdw_bus *bus = &sdw->cdns.bus; in intel_shim_vs_init()
351 intel_prop = bus->vendor_specific_prop; in intel_shim_vs_init()
352 clde = intel_prop->clde; in intel_shim_vs_init()
353 doaise2 = intel_prop->doaise2; in intel_shim_vs_init()
354 dodse2 = intel_prop->dodse2; in intel_shim_vs_init()
355 clds = intel_prop->clds; in intel_shim_vs_init()
356 clss = intel_prop->clss; in intel_shim_vs_init()
357 doaise = intel_prop->doaise; in intel_shim_vs_init()
358 doais = intel_prop->doais; in intel_shim_vs_init()
359 dodse = intel_prop->dodse; in intel_shim_vs_init()
360 dods = intel_prop->dods; in intel_shim_vs_init()
379 void __iomem *shim_vs = sdw->link_res->shim_vs; in intel_shim_vs_set_clock_source()
388 dev_dbg(sdw->cdns.dev, "clock source %d LVSCTL %#x\n", source, val); in intel_shim_vs_set_clock_source()
403 u16 lsdiid = 0; in intel_shim_wake()
408 mutex_lock(sdw->link_res->shim_lock); in intel_shim_wake()
410 ret = hdac_bus_eml_sdw_get_lsdiid_unlocked(sdw->link_res->hbus, sdw->instance, &lsdiid); in intel_shim_wake()
411 if (ret < 0) in intel_shim_wake()
414 wake_en = snd_hdac_chip_readw(sdw->link_res->hbus, WAKEEN); in intel_shim_wake()
420 snd_hdac_chip_writew(sdw->link_res->hbus, WAKEEN, wake_en); in intel_shim_wake()
424 snd_hdac_chip_writew(sdw->link_res->hbus, WAKEEN, wake_en); in intel_shim_wake()
427 wake_sts = snd_hdac_chip_readw(sdw->link_res->hbus, STATESTS); in intel_shim_wake()
429 snd_hdac_chip_writew(sdw->link_res->hbus, STATESTS, wake_sts); in intel_shim_wake()
432 mutex_unlock(sdw->link_res->shim_lock); in intel_shim_wake()
437 struct sdw_bus *bus = &sdw->cdns.bus; in intel_link_power_up()
438 struct sdw_master_prop *prop = &bus->prop; in intel_link_power_up()
439 u32 *shim_mask = sdw->link_res->shim_mask; in intel_link_power_up()
440 unsigned int link_id = sdw->instance; in intel_link_power_up()
445 if (prop->mclk_freq % 6000000) { in intel_link_power_up()
446 if (prop->mclk_freq % 2400000) { in intel_link_power_up()
458 mutex_lock(sdw->link_res->shim_lock); in intel_link_power_up()
460 ret = hdac_bus_eml_sdw_power_up_unlocked(sdw->link_res->hbus, link_id); in intel_link_power_up()
461 if (ret < 0) { in intel_link_power_up()
462 dev_err(sdw->cdns.dev, "%s: hdac_bus_eml_sdw_power_up failed: %d\n", in intel_link_power_up()
471 dev_dbg(sdw->cdns.dev, "first link up, programming SYNCPRD\n"); in intel_link_power_up()
473 ret = hdac_bus_eml_sdw_set_syncprd_unlocked(sdw->link_res->hbus, syncprd); in intel_link_power_up()
474 if (ret < 0) { in intel_link_power_up()
475 dev_err(sdw->cdns.dev, "%s: hdac_bus_eml_sdw_set_syncprd failed: %d\n", in intel_link_power_up()
481 ret = hdac_bus_eml_sdw_wait_syncpu_unlocked(sdw->link_res->hbus); in intel_link_power_up()
482 if (ret < 0) { in intel_link_power_up()
483 dev_err(sdw->cdns.dev, "%s: hdac_bus_eml_sdw_wait_syncpu failed: %d\n", in intel_link_power_up()
488 hdac_bus_eml_enable_interrupt_unlocked(sdw->link_res->hbus, true, in intel_link_power_up()
494 sdw->cdns.link_up = true; in intel_link_power_up()
499 mutex_unlock(sdw->link_res->shim_lock); in intel_link_power_up()
506 u32 *shim_mask = sdw->link_res->shim_mask; in intel_link_power_down()
507 unsigned int link_id = sdw->instance; in intel_link_power_down()
510 mutex_lock(sdw->link_res->shim_lock); in intel_link_power_down()
512 sdw->cdns.link_up = false; in intel_link_power_down()
517 hdac_bus_eml_enable_interrupt_unlocked(sdw->link_res->hbus, true, in intel_link_power_down()
520 ret = hdac_bus_eml_sdw_power_down_unlocked(sdw->link_res->hbus, link_id); in intel_link_power_down()
521 if (ret < 0) { in intel_link_power_down()
522 dev_err(sdw->cdns.dev, "%s: hdac_bus_eml_sdw_power_down failed: %d\n", in intel_link_power_down()
526 * we leave the sdw->cdns.link_up flag as false since we've disabled in intel_link_power_down()
531 mutex_unlock(sdw->link_res->shim_lock); in intel_link_power_down()
538 unsigned int link_id = sdw->instance; in intel_sync_arm()
540 mutex_lock(sdw->link_res->shim_lock); in intel_sync_arm()
542 hdac_bus_eml_sdw_sync_arm_unlocked(sdw->link_res->hbus, link_id); in intel_sync_arm()
544 mutex_unlock(sdw->link_res->shim_lock); in intel_sync_arm()
551 ret = hdac_bus_eml_sdw_sync_go_unlocked(sdw->link_res->hbus); in intel_sync_go_unlocked()
552 if (ret < 0) in intel_sync_go_unlocked()
553 dev_err(sdw->cdns.dev, "%s: SyncGO clear failed: %d\n", __func__, ret); in intel_sync_go_unlocked()
562 mutex_lock(sdw->link_res->shim_lock); in intel_sync_go()
566 mutex_unlock(sdw->link_res->shim_lock); in intel_sync_go()
573 return hdac_bus_eml_sdw_check_cmdsync_unlocked(sdw->link_res->hbus); in intel_check_cmdsync_unlocked()
583 struct sdw_intel_link_res *res = sdw->link_res; in intel_params_stream()
592 if (res->ops && res->ops->params_stream && res->dev) in intel_params_stream()
593 return res->ops->params_stream(res->dev, in intel_params_stream()
595 return -EIO; in intel_params_stream()
604 struct sdw_intel_link_res *res = sdw->link_res; in intel_free_stream()
611 if (res->ops && res->ops->free_stream && res->dev) in intel_free_stream()
612 return res->ops->free_stream(res->dev, in intel_free_stream()
615 return 0; in intel_free_stream()
633 dai_runtime = cdns->dai_runtime_array[dai->id]; in intel_hw_params()
635 return -EIO; in intel_hw_params()
638 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) in intel_hw_params()
643 pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id); in intel_hw_params()
645 return -EINVAL; in intel_hw_params()
648 pdi->intel_alh_id = (sdw->instance * 16) + pdi->num + 3; in intel_hw_params()
649 if (pdi->num >= 2) in intel_hw_params()
650 pdi->intel_alh_id += 2; in intel_hw_params()
657 dai_runtime->paused = false; in intel_hw_params()
658 dai_runtime->suspended = false; in intel_hw_params()
659 dai_runtime->pdi = pdi; in intel_hw_params()
663 sdw->instance, in intel_hw_params()
664 pdi->intel_alh_id); in intel_hw_params()
671 sconfig.type = dai_runtime->stream_type; in intel_hw_params()
673 sconfig.bps = snd_pcm_format_width(params_format(params)); in intel_hw_params()
679 return -ENOMEM; in intel_hw_params()
681 pconfig->num = pdi->num; in intel_hw_params()
682 pconfig->ch_mask = (1 << ch) - 1; in intel_hw_params()
684 ret = sdw_stream_add_master(&cdns->bus, &sconfig, in intel_hw_params()
685 pconfig, 1, dai_runtime->stream); in intel_hw_params()
687 dev_err(cdns->dev, "add master to stream failed:%d\n", ret); in intel_hw_params()
702 dai_runtime = cdns->dai_runtime_array[dai->id]; in intel_prepare()
704 dev_err(dai->dev, "failed to get dai runtime in %s\n", in intel_prepare()
706 return -EIO; in intel_prepare()
709 hw_params = &rtd->dpcm[substream->stream].hw_params; in intel_prepare()
710 if (dai_runtime->suspended) { in intel_prepare()
711 dai_runtime->suspended = false; in intel_prepare()
723 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) in intel_prepare()
730 sdw_cdns_config_stream(cdns, ch, dir, dai_runtime->pdi); in intel_prepare()
734 return intel_params_stream(sdw, substream, dai, hw_params, sdw->instance, in intel_prepare()
735 dai_runtime->pdi->intel_alh_id); in intel_prepare()
746 dai_runtime = cdns->dai_runtime_array[dai->id]; in intel_hw_free()
748 return -EIO; in intel_hw_free()
751 * The sdw stream state will transition to RELEASED when stream-> in intel_hw_free()
753 * DEPREPARED for the first cpu-dai and to RELEASED for the last in intel_hw_free()
754 * cpu-dai. in intel_hw_free()
756 ret = sdw_stream_remove_master(&cdns->bus, dai_runtime->stream); in intel_hw_free()
757 if (ret < 0) { in intel_hw_free()
758 dev_err(dai->dev, "remove master from stream %s failed: %d\n", in intel_hw_free()
759 dai_runtime->stream->name, ret); in intel_hw_free()
763 ret = intel_free_stream(sdw, substream, dai, sdw->instance); in intel_hw_free()
764 if (ret < 0) { in intel_hw_free()
765 dev_err(dai->dev, "intel_free_stream: failed %d\n", ret); in intel_hw_free()
769 dai_runtime->pdi = NULL; in intel_hw_free()
771 return 0; in intel_hw_free()
786 dai_runtime = cdns->dai_runtime_array[dai->id]; in intel_get_sdw_stream()
788 return ERR_PTR(-EINVAL); in intel_get_sdw_stream()
790 return dai_runtime->stream; in intel_get_sdw_stream()
797 struct sdw_intel_link_res *res = sdw->link_res; in intel_trigger()
799 int ret = 0; in intel_trigger()
805 if (res->ops && res->ops->trigger) { in intel_trigger()
806 ret = res->ops->trigger(substream, cmd, dai); in intel_trigger()
807 if (ret < 0) in intel_trigger()
811 dai_runtime = cdns->dai_runtime_array[dai->id]; in intel_trigger()
813 dev_err(dai->dev, "failed to get dai runtime in %s\n", in intel_trigger()
815 return -EIO; in intel_trigger()
828 dai_runtime->suspended = true; in intel_trigger()
833 dai_runtime->paused = true; in intel_trigger()
837 dai_runtime->paused = false; in intel_trigger()
865 void __iomem *shim = sdw->link_res->shim; in intel_pdi_init()
871 config->pcm_bd = FIELD_GET(SDW_SHIM2_PCMSCAP_BSS, pcm_cap); in intel_pdi_init()
872 config->pcm_in = FIELD_GET(SDW_SHIM2_PCMSCAP_ISS, pcm_cap); in intel_pdi_init()
873 config->pcm_out = FIELD_GET(SDW_SHIM2_PCMSCAP_ISS, pcm_cap); in intel_pdi_init()
875 dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n", in intel_pdi_init()
876 config->pcm_bd, config->pcm_in, config->pcm_out); in intel_pdi_init()
882 void __iomem *shim = sdw->link_res->shim; in intel_pdi_get_ch_cap()
893 int ch_count = 0; in intel_pdi_get_ch_update()
896 for (i = 0; i < num_pdi; i++) { in intel_pdi_get_ch_update()
897 pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num); in intel_pdi_get_ch_update()
898 ch_count += pdi->ch_count; in intel_pdi_get_ch_update()
908 intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd, in intel_pdi_stream_ch_update()
909 &stream->num_ch_bd); in intel_pdi_stream_ch_update()
911 intel_pdi_get_ch_update(sdw, stream->in, stream->num_in, in intel_pdi_stream_ch_update()
912 &stream->num_ch_in); in intel_pdi_stream_ch_update()
914 intel_pdi_get_ch_update(sdw, stream->out, stream->num_out, in intel_pdi_stream_ch_update()
915 &stream->num_ch_out); in intel_pdi_stream_ch_update()
926 return 0; in intel_create_dai()
929 dais[i].name = devm_kasprintf(cdns->dev, GFP_KERNEL, in intel_create_dai()
931 cdns->instance, i); in intel_create_dai()
933 return -ENOMEM; in intel_create_dai()
948 return 0; in intel_create_dai()
955 struct sdw_cdns *cdns = &sdw->cdns; in intel_register_dai()
960 int off = 0; in intel_register_dai()
968 intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm); in intel_register_dai()
971 num_dai = cdns->pcm.num_pdi; in intel_register_dai()
973 dai_runtime_array = devm_kcalloc(cdns->dev, num_dai, in intel_register_dai()
977 return -ENOMEM; in intel_register_dai()
978 cdns->dai_runtime_array = dai_runtime_array; in intel_register_dai()
980 dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL); in intel_register_dai()
982 return -ENOMEM; in intel_register_dai()
985 stream = &cdns->pcm; in intel_register_dai()
987 ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in, in intel_register_dai()
988 off, stream->num_ch_in); in intel_register_dai()
992 off += cdns->pcm.num_in; in intel_register_dai()
993 ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pcm.num_out, in intel_register_dai()
994 off, stream->num_ch_out); in intel_register_dai()
998 off += cdns->pcm.num_out; in intel_register_dai()
999 ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd, in intel_register_dai()
1000 off, stream->num_ch_bd); in intel_register_dai()
1004 return devm_snd_soc_register_component(cdns->dev, &dai_component, in intel_register_dai()
1012 ret = hdac_bus_eml_sdw_set_lsdiid(sdw->link_res->hbus, sdw->instance, dev_num); in intel_program_sdi()
1013 if (ret < 0) in intel_program_sdi()
1014 dev_err(sdw->cdns.dev, "%s: could not set lsdiid for link %d %d\n", in intel_program_sdi()
1015 __func__, sdw->instance, dev_num); in intel_program_sdi()
1022 ret = hdac_bus_eml_get_count(sdw->link_res->hbus, true, AZX_REG_ML_LEPTR_ID_SDW); in intel_get_link_count()
1024 dev_err(sdw->cdns.dev, "%s: could not retrieve link count\n", __func__); in intel_get_link_count()
1025 return -ENODEV; in intel_get_link_count()
1029 dev_err(sdw->cdns.dev, "%s: link count %d exceed max %d\n", __func__, ret, SDW_INTEL_MAX_LINKS); in intel_get_link_count()
1030 return -EINVAL; in intel_get_link_count()