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
6 * Author: Jeeja KP <jeeja.kp@intel.com>
8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13 #include <linux/pci.h>
14 #include <linux/pm_runtime.h>
15 #include <linux/delay.h>
16 #include <sound/pcm_params.h>
17 #include <sound/soc.h>
19 #include "skl-topology.h"
20 #include "skl-sst-dsp.h"
21 #include "skl-sst-ipc.h"
28 static const struct snd_pcm_hardware azx_pcm_hw
= {
29 .info
= (SNDRV_PCM_INFO_MMAP
|
30 SNDRV_PCM_INFO_INTERLEAVED
|
31 SNDRV_PCM_INFO_BLOCK_TRANSFER
|
32 SNDRV_PCM_INFO_MMAP_VALID
|
33 SNDRV_PCM_INFO_PAUSE
|
34 SNDRV_PCM_INFO_RESUME
|
35 SNDRV_PCM_INFO_SYNC_START
|
36 SNDRV_PCM_INFO_HAS_WALL_CLOCK
| /* legacy */
37 SNDRV_PCM_INFO_HAS_LINK_ATIME
|
38 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP
),
39 .formats
= SNDRV_PCM_FMTBIT_S16_LE
|
40 SNDRV_PCM_FMTBIT_S32_LE
|
41 SNDRV_PCM_FMTBIT_S24_LE
,
42 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
|
48 .buffer_bytes_max
= AZX_MAX_BUF_SIZE
,
49 .period_bytes_min
= 128,
50 .period_bytes_max
= AZX_MAX_BUF_SIZE
/ 2,
52 .periods_max
= AZX_MAX_FRAG
,
57 struct hdac_ext_stream
*get_hdac_ext_stream(struct snd_pcm_substream
*substream
)
59 return substream
->runtime
->private_data
;
62 static struct hdac_bus
*get_bus_ctx(struct snd_pcm_substream
*substream
)
64 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
65 struct hdac_stream
*hstream
= hdac_stream(stream
);
66 struct hdac_bus
*bus
= hstream
->bus
;
70 static int skl_substream_alloc_pages(struct hdac_bus
*bus
,
71 struct snd_pcm_substream
*substream
,
74 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
76 hdac_stream(stream
)->bufsize
= 0;
77 hdac_stream(stream
)->period_bytes
= 0;
78 hdac_stream(stream
)->format_val
= 0;
83 static void skl_set_pcm_constrains(struct hdac_bus
*bus
,
84 struct snd_pcm_runtime
*runtime
)
86 snd_pcm_hw_constraint_integer(runtime
, SNDRV_PCM_HW_PARAM_PERIODS
);
88 /* avoid wrap-around with wall-clock */
89 snd_pcm_hw_constraint_minmax(runtime
, SNDRV_PCM_HW_PARAM_BUFFER_TIME
,
93 static enum hdac_ext_stream_type
skl_get_host_stream_type(struct hdac_bus
*bus
)
96 return HDAC_EXT_STREAM_TYPE_HOST
;
98 return HDAC_EXT_STREAM_TYPE_COUPLED
;
102 * check if the stream opened is marked as ignore_suspend by machine, if so
103 * then enable suspend_active refcount
105 * The count supend_active does not need lock as it is used in open/close
106 * and suspend context
108 static void skl_set_suspend_active(struct snd_pcm_substream
*substream
,
109 struct snd_soc_dai
*dai
, bool enable
)
111 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
112 struct snd_soc_dapm_widget
*w
;
113 struct skl_dev
*skl
= bus_to_skl(bus
);
115 w
= snd_soc_dai_get_widget(dai
, substream
->stream
);
117 if (w
->ignore_suspend
&& enable
)
118 skl
->supend_active
++;
119 else if (w
->ignore_suspend
&& !enable
)
120 skl
->supend_active
--;
123 int skl_pcm_host_dma_prepare(struct device
*dev
, struct skl_pipe_params
*params
)
125 struct hdac_bus
*bus
= dev_get_drvdata(dev
);
126 struct skl_dev
*skl
= bus_to_skl(bus
);
127 unsigned int format_val
;
128 struct hdac_stream
*hstream
;
129 struct hdac_ext_stream
*stream
;
132 hstream
= snd_hdac_get_stream(bus
, params
->stream
,
133 params
->host_dma_id
+ 1);
137 stream
= stream_to_hdac_ext_stream(hstream
);
138 snd_hdac_ext_stream_decouple(bus
, stream
, true);
140 format_val
= snd_hdac_calc_stream_format(params
->s_freq
,
141 params
->ch
, params
->format
, params
->host_bps
, 0);
143 dev_dbg(dev
, "format_val=%d, rate=%d, ch=%d, format=%d\n",
144 format_val
, params
->s_freq
, params
->ch
, params
->format
);
146 snd_hdac_stream_reset(hdac_stream(stream
));
147 err
= snd_hdac_stream_set_params(hdac_stream(stream
), format_val
);
152 * The recommended SDxFMT programming sequence for BXT
153 * platforms is to couple the stream before writing the format
155 if (IS_BXT(skl
->pci
)) {
156 snd_hdac_ext_stream_decouple(bus
, stream
, false);
157 err
= snd_hdac_stream_setup(hdac_stream(stream
));
158 snd_hdac_ext_stream_decouple(bus
, stream
, true);
160 err
= snd_hdac_stream_setup(hdac_stream(stream
));
166 hdac_stream(stream
)->prepared
= 1;
171 int skl_pcm_link_dma_prepare(struct device
*dev
, struct skl_pipe_params
*params
)
173 struct hdac_bus
*bus
= dev_get_drvdata(dev
);
174 unsigned int format_val
;
175 struct hdac_stream
*hstream
;
176 struct hdac_ext_stream
*stream
;
177 struct hdac_ext_link
*link
;
178 unsigned char stream_tag
;
180 hstream
= snd_hdac_get_stream(bus
, params
->stream
,
181 params
->link_dma_id
+ 1);
185 stream
= stream_to_hdac_ext_stream(hstream
);
186 snd_hdac_ext_stream_decouple(bus
, stream
, true);
187 format_val
= snd_hdac_calc_stream_format(params
->s_freq
, params
->ch
,
188 params
->format
, params
->link_bps
, 0);
190 dev_dbg(dev
, "format_val=%d, rate=%d, ch=%d, format=%d\n",
191 format_val
, params
->s_freq
, params
->ch
, params
->format
);
193 snd_hdac_ext_link_stream_reset(stream
);
195 snd_hdac_ext_link_stream_setup(stream
, format_val
);
197 stream_tag
= hstream
->stream_tag
;
198 if (stream
->hstream
.direction
== SNDRV_PCM_STREAM_PLAYBACK
) {
199 list_for_each_entry(link
, &bus
->hlink_list
, list
) {
200 if (link
->index
== params
->link_index
)
201 snd_hdac_ext_link_set_stream_id(link
,
206 stream
->link_prepared
= 1;
211 static int skl_pcm_open(struct snd_pcm_substream
*substream
,
212 struct snd_soc_dai
*dai
)
214 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
215 struct hdac_ext_stream
*stream
;
216 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
217 struct skl_dma_params
*dma_params
;
218 struct skl_dev
*skl
= get_skl_ctx(dai
->dev
);
219 struct skl_module_cfg
*mconfig
;
221 dev_dbg(dai
->dev
, "%s: %s\n", __func__
, dai
->name
);
223 stream
= snd_hdac_ext_stream_assign(bus
, substream
,
224 skl_get_host_stream_type(bus
));
228 skl_set_pcm_constrains(bus
, runtime
);
231 * disable WALLCLOCK timestamps for capture streams
232 * until we figure out how to handle digital inputs
234 if (substream
->stream
== SNDRV_PCM_STREAM_CAPTURE
) {
235 runtime
->hw
.info
&= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK
; /* legacy */
236 runtime
->hw
.info
&= ~SNDRV_PCM_INFO_HAS_LINK_ATIME
;
239 runtime
->private_data
= stream
;
241 dma_params
= kzalloc(sizeof(*dma_params
), GFP_KERNEL
);
245 dma_params
->stream_tag
= hdac_stream(stream
)->stream_tag
;
246 snd_soc_dai_set_dma_data(dai
, substream
, dma_params
);
248 dev_dbg(dai
->dev
, "stream tag set in dma params=%d\n",
249 dma_params
->stream_tag
);
250 skl_set_suspend_active(substream
, dai
, true);
251 snd_pcm_set_sync(substream
);
253 mconfig
= skl_tplg_fe_get_cpr_module(dai
, substream
->stream
);
257 skl_tplg_d0i3_get(skl
, mconfig
->d0i3_caps
);
262 static int skl_pcm_prepare(struct snd_pcm_substream
*substream
,
263 struct snd_soc_dai
*dai
)
265 struct skl_dev
*skl
= get_skl_ctx(dai
->dev
);
266 struct skl_module_cfg
*mconfig
;
269 dev_dbg(dai
->dev
, "%s: %s\n", __func__
, dai
->name
);
271 mconfig
= skl_tplg_fe_get_cpr_module(dai
, substream
->stream
);
274 * In case of XRUN recovery or in the case when the application
275 * calls prepare another time, reset the FW pipe to clean state
278 (substream
->runtime
->status
->state
== SNDRV_PCM_STATE_XRUN
||
279 mconfig
->pipe
->state
== SKL_PIPE_CREATED
||
280 mconfig
->pipe
->state
== SKL_PIPE_PAUSED
)) {
282 ret
= skl_reset_pipe(skl
, mconfig
->pipe
);
287 ret
= skl_pcm_host_dma_prepare(dai
->dev
,
288 mconfig
->pipe
->p_params
);
296 static int skl_pcm_hw_params(struct snd_pcm_substream
*substream
,
297 struct snd_pcm_hw_params
*params
,
298 struct snd_soc_dai
*dai
)
300 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
301 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
302 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
303 struct skl_pipe_params p_params
= {0};
304 struct skl_module_cfg
*m_cfg
;
307 dev_dbg(dai
->dev
, "%s: %s\n", __func__
, dai
->name
);
308 ret
= skl_substream_alloc_pages(bus
, substream
,
309 params_buffer_bytes(params
));
313 dev_dbg(dai
->dev
, "format_val, rate=%d, ch=%d, format=%d\n",
314 runtime
->rate
, runtime
->channels
, runtime
->format
);
316 dma_id
= hdac_stream(stream
)->stream_tag
- 1;
317 dev_dbg(dai
->dev
, "dma_id=%d\n", dma_id
);
319 p_params
.s_fmt
= snd_pcm_format_width(params_format(params
));
320 p_params
.ch
= params_channels(params
);
321 p_params
.s_freq
= params_rate(params
);
322 p_params
.host_dma_id
= dma_id
;
323 p_params
.stream
= substream
->stream
;
324 p_params
.format
= params_format(params
);
325 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
326 p_params
.host_bps
= dai
->driver
->playback
.sig_bits
;
328 p_params
.host_bps
= dai
->driver
->capture
.sig_bits
;
331 m_cfg
= skl_tplg_fe_get_cpr_module(dai
, p_params
.stream
);
333 skl_tplg_update_pipe_params(dai
->dev
, m_cfg
, &p_params
);
338 static void skl_pcm_close(struct snd_pcm_substream
*substream
,
339 struct snd_soc_dai
*dai
)
341 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
342 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
343 struct skl_dma_params
*dma_params
= NULL
;
344 struct skl_dev
*skl
= bus_to_skl(bus
);
345 struct skl_module_cfg
*mconfig
;
347 dev_dbg(dai
->dev
, "%s: %s\n", __func__
, dai
->name
);
349 snd_hdac_ext_stream_release(stream
, skl_get_host_stream_type(bus
));
351 dma_params
= snd_soc_dai_get_dma_data(dai
, substream
);
353 * now we should set this to NULL as we are freeing by the
356 snd_soc_dai_set_dma_data(dai
, substream
, NULL
);
357 skl_set_suspend_active(substream
, dai
, false);
360 * check if close is for "Reference Pin" and set back the
361 * CGCTL.MISCBDCGE if disabled by driver
363 if (!strncmp(dai
->name
, "Reference Pin", 13) &&
364 skl
->miscbdcg_disabled
) {
365 skl
->enable_miscbdcge(dai
->dev
, true);
366 skl
->miscbdcg_disabled
= false;
369 mconfig
= skl_tplg_fe_get_cpr_module(dai
, substream
->stream
);
371 skl_tplg_d0i3_put(skl
, mconfig
->d0i3_caps
);
376 static int skl_pcm_hw_free(struct snd_pcm_substream
*substream
,
377 struct snd_soc_dai
*dai
)
379 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
380 struct skl_dev
*skl
= get_skl_ctx(dai
->dev
);
381 struct skl_module_cfg
*mconfig
;
384 dev_dbg(dai
->dev
, "%s: %s\n", __func__
, dai
->name
);
386 mconfig
= skl_tplg_fe_get_cpr_module(dai
, substream
->stream
);
389 ret
= skl_reset_pipe(skl
, mconfig
->pipe
);
391 dev_err(dai
->dev
, "%s:Reset failed ret =%d",
395 snd_hdac_stream_cleanup(hdac_stream(stream
));
396 hdac_stream(stream
)->prepared
= 0;
401 static int skl_be_hw_params(struct snd_pcm_substream
*substream
,
402 struct snd_pcm_hw_params
*params
,
403 struct snd_soc_dai
*dai
)
405 struct skl_pipe_params p_params
= {0};
407 p_params
.s_fmt
= snd_pcm_format_width(params_format(params
));
408 p_params
.ch
= params_channels(params
);
409 p_params
.s_freq
= params_rate(params
);
410 p_params
.stream
= substream
->stream
;
412 return skl_tplg_be_update_params(dai
, &p_params
);
415 static int skl_decoupled_trigger(struct snd_pcm_substream
*substream
,
418 struct hdac_bus
*bus
= get_bus_ctx(substream
);
419 struct hdac_ext_stream
*stream
;
421 unsigned long cookie
;
422 struct hdac_stream
*hstr
;
424 stream
= get_hdac_ext_stream(substream
);
425 hstr
= hdac_stream(stream
);
431 case SNDRV_PCM_TRIGGER_START
:
432 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
433 case SNDRV_PCM_TRIGGER_RESUME
:
437 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
438 case SNDRV_PCM_TRIGGER_SUSPEND
:
439 case SNDRV_PCM_TRIGGER_STOP
:
447 spin_lock_irqsave(&bus
->reg_lock
, cookie
);
450 snd_hdac_stream_start(hdac_stream(stream
), true);
451 snd_hdac_stream_timecounter_init(hstr
, 0);
453 snd_hdac_stream_stop(hdac_stream(stream
));
456 spin_unlock_irqrestore(&bus
->reg_lock
, cookie
);
461 static int skl_pcm_trigger(struct snd_pcm_substream
*substream
, int cmd
,
462 struct snd_soc_dai
*dai
)
464 struct skl_dev
*skl
= get_skl_ctx(dai
->dev
);
465 struct skl_module_cfg
*mconfig
;
466 struct hdac_bus
*bus
= get_bus_ctx(substream
);
467 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
468 struct snd_soc_dapm_widget
*w
;
471 mconfig
= skl_tplg_fe_get_cpr_module(dai
, substream
->stream
);
475 w
= snd_soc_dai_get_widget(dai
, substream
->stream
);
478 case SNDRV_PCM_TRIGGER_RESUME
:
479 if (!w
->ignore_suspend
) {
481 * enable DMA Resume enable bit for the stream, set the
482 * dpib & lpib position to resume before starting the
485 snd_hdac_ext_stream_drsm_enable(bus
, true,
486 hdac_stream(stream
)->index
);
487 snd_hdac_ext_stream_set_dpibr(bus
, stream
,
489 snd_hdac_ext_stream_set_lpib(stream
, stream
->lpib
);
493 case SNDRV_PCM_TRIGGER_START
:
494 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
496 * Start HOST DMA and Start FE Pipe.This is to make sure that
497 * there are no underrun/overrun in the case when the FE
498 * pipeline is started but there is a delay in starting the
499 * DMA channel on the host.
501 ret
= skl_decoupled_trigger(substream
, cmd
);
504 return skl_run_pipe(skl
, mconfig
->pipe
);
506 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
507 case SNDRV_PCM_TRIGGER_SUSPEND
:
508 case SNDRV_PCM_TRIGGER_STOP
:
510 * Stop FE Pipe first and stop DMA. This is to make sure that
511 * there are no underrun/overrun in the case if there is a delay
512 * between the two operations.
514 ret
= skl_stop_pipe(skl
, mconfig
->pipe
);
518 ret
= skl_decoupled_trigger(substream
, cmd
);
519 if ((cmd
== SNDRV_PCM_TRIGGER_SUSPEND
) && !w
->ignore_suspend
) {
520 /* save the dpib and lpib positions */
521 stream
->dpib
= readl(bus
->remap_addr
+
522 AZX_REG_VS_SDXDPIB_XBASE
+
523 (AZX_REG_VS_SDXDPIB_XINTERVAL
*
524 hdac_stream(stream
)->index
));
526 stream
->lpib
= snd_hdac_stream_get_pos_lpib(
527 hdac_stream(stream
));
528 snd_hdac_ext_stream_decouple(bus
, stream
, false);
540 static int skl_link_hw_params(struct snd_pcm_substream
*substream
,
541 struct snd_pcm_hw_params
*params
,
542 struct snd_soc_dai
*dai
)
544 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
545 struct hdac_ext_stream
*link_dev
;
546 struct snd_soc_pcm_runtime
*rtd
= asoc_substream_to_rtd(substream
);
547 struct snd_soc_dai
*codec_dai
= asoc_rtd_to_codec(rtd
, 0);
548 struct skl_pipe_params p_params
= {0};
549 struct hdac_ext_link
*link
;
552 link_dev
= snd_hdac_ext_stream_assign(bus
, substream
,
553 HDAC_EXT_STREAM_TYPE_LINK
);
557 snd_soc_dai_set_dma_data(dai
, substream
, (void *)link_dev
);
559 link
= snd_hdac_ext_bus_get_link(bus
, codec_dai
->component
->name
);
563 stream_tag
= hdac_stream(link_dev
)->stream_tag
;
565 /* set the stream tag in the codec dai dma params */
566 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
567 snd_soc_dai_set_tdm_slot(codec_dai
, stream_tag
, 0, 0, 0);
569 snd_soc_dai_set_tdm_slot(codec_dai
, 0, stream_tag
, 0, 0);
571 p_params
.s_fmt
= snd_pcm_format_width(params_format(params
));
572 p_params
.ch
= params_channels(params
);
573 p_params
.s_freq
= params_rate(params
);
574 p_params
.stream
= substream
->stream
;
575 p_params
.link_dma_id
= stream_tag
- 1;
576 p_params
.link_index
= link
->index
;
577 p_params
.format
= params_format(params
);
579 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
580 p_params
.link_bps
= codec_dai
->driver
->playback
.sig_bits
;
582 p_params
.link_bps
= codec_dai
->driver
->capture
.sig_bits
;
584 return skl_tplg_be_update_params(dai
, &p_params
);
587 static int skl_link_pcm_prepare(struct snd_pcm_substream
*substream
,
588 struct snd_soc_dai
*dai
)
590 struct skl_dev
*skl
= get_skl_ctx(dai
->dev
);
591 struct skl_module_cfg
*mconfig
= NULL
;
593 /* In case of XRUN recovery, reset the FW pipe to clean state */
594 mconfig
= skl_tplg_be_get_cpr_module(dai
, substream
->stream
);
595 if (mconfig
&& !mconfig
->pipe
->passthru
&&
596 (substream
->runtime
->status
->state
== SNDRV_PCM_STATE_XRUN
))
597 skl_reset_pipe(skl
, mconfig
->pipe
);
602 static int skl_link_pcm_trigger(struct snd_pcm_substream
*substream
,
603 int cmd
, struct snd_soc_dai
*dai
)
605 struct hdac_ext_stream
*link_dev
=
606 snd_soc_dai_get_dma_data(dai
, substream
);
607 struct hdac_bus
*bus
= get_bus_ctx(substream
);
608 struct hdac_ext_stream
*stream
= get_hdac_ext_stream(substream
);
610 dev_dbg(dai
->dev
, "In %s cmd=%d\n", __func__
, cmd
);
612 case SNDRV_PCM_TRIGGER_RESUME
:
613 case SNDRV_PCM_TRIGGER_START
:
614 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
615 snd_hdac_ext_link_stream_start(link_dev
);
618 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
619 case SNDRV_PCM_TRIGGER_SUSPEND
:
620 case SNDRV_PCM_TRIGGER_STOP
:
621 snd_hdac_ext_link_stream_clear(link_dev
);
622 if (cmd
== SNDRV_PCM_TRIGGER_SUSPEND
)
623 snd_hdac_ext_stream_decouple(bus
, stream
, false);
632 static int skl_link_hw_free(struct snd_pcm_substream
*substream
,
633 struct snd_soc_dai
*dai
)
635 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
636 struct snd_soc_pcm_runtime
*rtd
= asoc_substream_to_rtd(substream
);
637 struct hdac_ext_stream
*link_dev
=
638 snd_soc_dai_get_dma_data(dai
, substream
);
639 struct hdac_ext_link
*link
;
640 unsigned char stream_tag
;
642 dev_dbg(dai
->dev
, "%s: %s\n", __func__
, dai
->name
);
644 link_dev
->link_prepared
= 0;
646 link
= snd_hdac_ext_bus_get_link(bus
, asoc_rtd_to_codec(rtd
, 0)->component
->name
);
650 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
651 stream_tag
= hdac_stream(link_dev
)->stream_tag
;
652 snd_hdac_ext_link_clear_stream_id(link
, stream_tag
);
655 snd_hdac_ext_stream_release(link_dev
, HDAC_EXT_STREAM_TYPE_LINK
);
659 static const struct snd_soc_dai_ops skl_pcm_dai_ops
= {
660 .startup
= skl_pcm_open
,
661 .shutdown
= skl_pcm_close
,
662 .prepare
= skl_pcm_prepare
,
663 .hw_params
= skl_pcm_hw_params
,
664 .hw_free
= skl_pcm_hw_free
,
665 .trigger
= skl_pcm_trigger
,
668 static const struct snd_soc_dai_ops skl_dmic_dai_ops
= {
669 .hw_params
= skl_be_hw_params
,
672 static const struct snd_soc_dai_ops skl_be_ssp_dai_ops
= {
673 .hw_params
= skl_be_hw_params
,
676 static const struct snd_soc_dai_ops skl_link_dai_ops
= {
677 .prepare
= skl_link_pcm_prepare
,
678 .hw_params
= skl_link_hw_params
,
679 .hw_free
= skl_link_hw_free
,
680 .trigger
= skl_link_pcm_trigger
,
683 static struct snd_soc_dai_driver skl_fe_dai
[] = {
685 .name
= "System Pin",
686 .ops
= &skl_pcm_dai_ops
,
688 .stream_name
= "System Playback",
689 .channels_min
= HDA_MONO
,
690 .channels_max
= HDA_STEREO
,
691 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
| SNDRV_PCM_RATE_8000
,
692 .formats
= SNDRV_PCM_FMTBIT_S16_LE
|
693 SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S32_LE
,
697 .stream_name
= "System Capture",
698 .channels_min
= HDA_MONO
,
699 .channels_max
= HDA_STEREO
,
700 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
,
701 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
,
706 .name
= "System Pin2",
707 .ops
= &skl_pcm_dai_ops
,
709 .stream_name
= "Headset Playback",
710 .channels_min
= HDA_MONO
,
711 .channels_max
= HDA_STEREO
,
712 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
|
714 .formats
= SNDRV_PCM_FMTBIT_S16_LE
|
715 SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S32_LE
,
719 .name
= "Echoref Pin",
720 .ops
= &skl_pcm_dai_ops
,
722 .stream_name
= "Echoreference Capture",
723 .channels_min
= HDA_STEREO
,
724 .channels_max
= HDA_STEREO
,
725 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
|
727 .formats
= SNDRV_PCM_FMTBIT_S16_LE
|
728 SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S32_LE
,
732 .name
= "Reference Pin",
733 .ops
= &skl_pcm_dai_ops
,
735 .stream_name
= "Reference Capture",
736 .channels_min
= HDA_MONO
,
737 .channels_max
= HDA_QUAD
,
738 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
,
739 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
,
744 .name
= "Deepbuffer Pin",
745 .ops
= &skl_pcm_dai_ops
,
747 .stream_name
= "Deepbuffer Playback",
748 .channels_min
= HDA_STEREO
,
749 .channels_max
= HDA_STEREO
,
750 .rates
= SNDRV_PCM_RATE_48000
,
751 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
,
756 .name
= "LowLatency Pin",
757 .ops
= &skl_pcm_dai_ops
,
759 .stream_name
= "Low Latency Playback",
760 .channels_min
= HDA_STEREO
,
761 .channels_max
= HDA_STEREO
,
762 .rates
= SNDRV_PCM_RATE_48000
,
763 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
,
769 .ops
= &skl_pcm_dai_ops
,
771 .stream_name
= "DMIC Capture",
772 .channels_min
= HDA_MONO
,
773 .channels_max
= HDA_QUAD
,
774 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
,
775 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
,
781 .ops
= &skl_pcm_dai_ops
,
783 .stream_name
= "HDMI1 Playback",
784 .channels_min
= HDA_STEREO
,
786 .rates
= SNDRV_PCM_RATE_32000
| SNDRV_PCM_RATE_44100
|
787 SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_88200
|
788 SNDRV_PCM_RATE_96000
| SNDRV_PCM_RATE_176400
|
789 SNDRV_PCM_RATE_192000
,
790 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
791 SNDRV_PCM_FMTBIT_S32_LE
,
797 .ops
= &skl_pcm_dai_ops
,
799 .stream_name
= "HDMI2 Playback",
800 .channels_min
= HDA_STEREO
,
802 .rates
= SNDRV_PCM_RATE_32000
| SNDRV_PCM_RATE_44100
|
803 SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_88200
|
804 SNDRV_PCM_RATE_96000
| SNDRV_PCM_RATE_176400
|
805 SNDRV_PCM_RATE_192000
,
806 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
807 SNDRV_PCM_FMTBIT_S32_LE
,
813 .ops
= &skl_pcm_dai_ops
,
815 .stream_name
= "HDMI3 Playback",
816 .channels_min
= HDA_STEREO
,
818 .rates
= SNDRV_PCM_RATE_32000
| SNDRV_PCM_RATE_44100
|
819 SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_88200
|
820 SNDRV_PCM_RATE_96000
| SNDRV_PCM_RATE_176400
|
821 SNDRV_PCM_RATE_192000
,
822 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
823 SNDRV_PCM_FMTBIT_S32_LE
,
830 static struct snd_soc_dai_driver skl_platform_dai
[] = {
833 .ops
= &skl_be_ssp_dai_ops
,
835 .stream_name
= "ssp0 Tx",
836 .channels_min
= HDA_STEREO
,
837 .channels_max
= HDA_STEREO
,
838 .rates
= SNDRV_PCM_RATE_48000
,
839 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
842 .stream_name
= "ssp0 Rx",
843 .channels_min
= HDA_STEREO
,
844 .channels_max
= HDA_STEREO
,
845 .rates
= SNDRV_PCM_RATE_48000
,
846 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
851 .ops
= &skl_be_ssp_dai_ops
,
853 .stream_name
= "ssp1 Tx",
854 .channels_min
= HDA_STEREO
,
855 .channels_max
= HDA_STEREO
,
856 .rates
= SNDRV_PCM_RATE_48000
,
857 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
860 .stream_name
= "ssp1 Rx",
861 .channels_min
= HDA_STEREO
,
862 .channels_max
= HDA_STEREO
,
863 .rates
= SNDRV_PCM_RATE_48000
,
864 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
869 .ops
= &skl_be_ssp_dai_ops
,
871 .stream_name
= "ssp2 Tx",
872 .channels_min
= HDA_STEREO
,
873 .channels_max
= HDA_STEREO
,
874 .rates
= SNDRV_PCM_RATE_48000
,
875 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
878 .stream_name
= "ssp2 Rx",
879 .channels_min
= HDA_STEREO
,
880 .channels_max
= HDA_STEREO
,
881 .rates
= SNDRV_PCM_RATE_48000
,
882 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
887 .ops
= &skl_be_ssp_dai_ops
,
889 .stream_name
= "ssp3 Tx",
890 .channels_min
= HDA_STEREO
,
891 .channels_max
= HDA_STEREO
,
892 .rates
= SNDRV_PCM_RATE_48000
,
893 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
896 .stream_name
= "ssp3 Rx",
897 .channels_min
= HDA_STEREO
,
898 .channels_max
= HDA_STEREO
,
899 .rates
= SNDRV_PCM_RATE_48000
,
900 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
905 .ops
= &skl_be_ssp_dai_ops
,
907 .stream_name
= "ssp4 Tx",
908 .channels_min
= HDA_STEREO
,
909 .channels_max
= HDA_STEREO
,
910 .rates
= SNDRV_PCM_RATE_48000
,
911 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
914 .stream_name
= "ssp4 Rx",
915 .channels_min
= HDA_STEREO
,
916 .channels_max
= HDA_STEREO
,
917 .rates
= SNDRV_PCM_RATE_48000
,
918 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
923 .ops
= &skl_be_ssp_dai_ops
,
925 .stream_name
= "ssp5 Tx",
926 .channels_min
= HDA_STEREO
,
927 .channels_max
= HDA_STEREO
,
928 .rates
= SNDRV_PCM_RATE_48000
,
929 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
932 .stream_name
= "ssp5 Rx",
933 .channels_min
= HDA_STEREO
,
934 .channels_max
= HDA_STEREO
,
935 .rates
= SNDRV_PCM_RATE_48000
,
936 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
940 .name
= "iDisp1 Pin",
941 .ops
= &skl_link_dai_ops
,
943 .stream_name
= "iDisp1 Tx",
944 .channels_min
= HDA_STEREO
,
946 .rates
= SNDRV_PCM_RATE_8000
|SNDRV_PCM_RATE_16000
|SNDRV_PCM_RATE_48000
,
947 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S32_LE
|
948 SNDRV_PCM_FMTBIT_S24_LE
,
952 .name
= "iDisp2 Pin",
953 .ops
= &skl_link_dai_ops
,
955 .stream_name
= "iDisp2 Tx",
956 .channels_min
= HDA_STEREO
,
958 .rates
= SNDRV_PCM_RATE_8000
|SNDRV_PCM_RATE_16000
|
959 SNDRV_PCM_RATE_48000
,
960 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S32_LE
|
961 SNDRV_PCM_FMTBIT_S24_LE
,
965 .name
= "iDisp3 Pin",
966 .ops
= &skl_link_dai_ops
,
968 .stream_name
= "iDisp3 Tx",
969 .channels_min
= HDA_STEREO
,
971 .rates
= SNDRV_PCM_RATE_8000
|SNDRV_PCM_RATE_16000
|
972 SNDRV_PCM_RATE_48000
,
973 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S32_LE
|
974 SNDRV_PCM_FMTBIT_S24_LE
,
978 .name
= "DMIC01 Pin",
979 .ops
= &skl_dmic_dai_ops
,
981 .stream_name
= "DMIC01 Rx",
982 .channels_min
= HDA_MONO
,
983 .channels_max
= HDA_QUAD
,
984 .rates
= SNDRV_PCM_RATE_48000
| SNDRV_PCM_RATE_16000
,
985 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
,
989 .name
= "DMIC16k Pin",
990 .ops
= &skl_dmic_dai_ops
,
992 .stream_name
= "DMIC16k Rx",
993 .channels_min
= HDA_MONO
,
994 .channels_max
= HDA_QUAD
,
995 .rates
= SNDRV_PCM_RATE_16000
,
996 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
1000 .name
= "Analog CPU DAI",
1001 .ops
= &skl_link_dai_ops
,
1003 .stream_name
= "Analog CPU Playback",
1004 .channels_min
= HDA_MONO
,
1005 .channels_max
= HDA_MAX
,
1006 .rates
= SNDRV_PCM_RATE_8000_192000
,
1007 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
1008 SNDRV_PCM_FMTBIT_S32_LE
,
1011 .stream_name
= "Analog CPU Capture",
1012 .channels_min
= HDA_MONO
,
1013 .channels_max
= HDA_MAX
,
1014 .rates
= SNDRV_PCM_RATE_8000_192000
,
1015 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
1016 SNDRV_PCM_FMTBIT_S32_LE
,
1020 .name
= "Alt Analog CPU DAI",
1021 .ops
= &skl_link_dai_ops
,
1023 .stream_name
= "Alt Analog CPU Playback",
1024 .channels_min
= HDA_MONO
,
1025 .channels_max
= HDA_MAX
,
1026 .rates
= SNDRV_PCM_RATE_8000_192000
,
1027 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
1028 SNDRV_PCM_FMTBIT_S32_LE
,
1031 .stream_name
= "Alt Analog CPU Capture",
1032 .channels_min
= HDA_MONO
,
1033 .channels_max
= HDA_MAX
,
1034 .rates
= SNDRV_PCM_RATE_8000_192000
,
1035 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
1036 SNDRV_PCM_FMTBIT_S32_LE
,
1040 .name
= "Digital CPU DAI",
1041 .ops
= &skl_link_dai_ops
,
1043 .stream_name
= "Digital CPU Playback",
1044 .channels_min
= HDA_MONO
,
1045 .channels_max
= HDA_MAX
,
1046 .rates
= SNDRV_PCM_RATE_8000_192000
,
1047 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
1048 SNDRV_PCM_FMTBIT_S32_LE
,
1051 .stream_name
= "Digital CPU Capture",
1052 .channels_min
= HDA_MONO
,
1053 .channels_max
= HDA_MAX
,
1054 .rates
= SNDRV_PCM_RATE_8000_192000
,
1055 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
1056 SNDRV_PCM_FMTBIT_S32_LE
,
1061 int skl_dai_load(struct snd_soc_component
*cmp
, int index
,
1062 struct snd_soc_dai_driver
*dai_drv
,
1063 struct snd_soc_tplg_pcm
*pcm
, struct snd_soc_dai
*dai
)
1065 dai_drv
->ops
= &skl_pcm_dai_ops
;
1070 static int skl_platform_soc_open(struct snd_soc_component
*component
,
1071 struct snd_pcm_substream
*substream
)
1073 struct snd_soc_pcm_runtime
*rtd
= asoc_substream_to_rtd(substream
);
1074 struct snd_soc_dai_link
*dai_link
= rtd
->dai_link
;
1076 dev_dbg(asoc_rtd_to_cpu(rtd
, 0)->dev
, "In %s:%s\n", __func__
,
1077 dai_link
->cpus
->dai_name
);
1079 snd_soc_set_runtime_hwparams(substream
, &azx_pcm_hw
);
1084 static int skl_coupled_trigger(struct snd_pcm_substream
*substream
,
1087 struct hdac_bus
*bus
= get_bus_ctx(substream
);
1088 struct hdac_ext_stream
*stream
;
1089 struct snd_pcm_substream
*s
;
1092 unsigned long cookie
;
1093 struct hdac_stream
*hstr
;
1095 stream
= get_hdac_ext_stream(substream
);
1096 hstr
= hdac_stream(stream
);
1098 dev_dbg(bus
->dev
, "In %s cmd=%d\n", __func__
, cmd
);
1100 if (!hstr
->prepared
)
1104 case SNDRV_PCM_TRIGGER_START
:
1105 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
1106 case SNDRV_PCM_TRIGGER_RESUME
:
1110 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
1111 case SNDRV_PCM_TRIGGER_SUSPEND
:
1112 case SNDRV_PCM_TRIGGER_STOP
:
1120 snd_pcm_group_for_each_entry(s
, substream
) {
1121 if (s
->pcm
->card
!= substream
->pcm
->card
)
1123 stream
= get_hdac_ext_stream(s
);
1124 sbits
|= 1 << hdac_stream(stream
)->index
;
1125 snd_pcm_trigger_done(s
, substream
);
1128 spin_lock_irqsave(&bus
->reg_lock
, cookie
);
1130 /* first, set SYNC bits of corresponding streams */
1131 snd_hdac_stream_sync_trigger(hstr
, true, sbits
, AZX_REG_SSYNC
);
1133 snd_pcm_group_for_each_entry(s
, substream
) {
1134 if (s
->pcm
->card
!= substream
->pcm
->card
)
1136 stream
= get_hdac_ext_stream(s
);
1138 snd_hdac_stream_start(hdac_stream(stream
), true);
1140 snd_hdac_stream_stop(hdac_stream(stream
));
1142 spin_unlock_irqrestore(&bus
->reg_lock
, cookie
);
1144 snd_hdac_stream_sync(hstr
, start
, sbits
);
1146 spin_lock_irqsave(&bus
->reg_lock
, cookie
);
1148 /* reset SYNC bits */
1149 snd_hdac_stream_sync_trigger(hstr
, false, sbits
, AZX_REG_SSYNC
);
1151 snd_hdac_stream_timecounter_init(hstr
, sbits
);
1152 spin_unlock_irqrestore(&bus
->reg_lock
, cookie
);
1157 static int skl_platform_soc_trigger(struct snd_soc_component
*component
,
1158 struct snd_pcm_substream
*substream
,
1161 struct hdac_bus
*bus
= get_bus_ctx(substream
);
1164 return skl_coupled_trigger(substream
, cmd
);
1169 static snd_pcm_uframes_t
skl_platform_soc_pointer(
1170 struct snd_soc_component
*component
,
1171 struct snd_pcm_substream
*substream
)
1173 struct hdac_ext_stream
*hstream
= get_hdac_ext_stream(substream
);
1174 struct hdac_bus
*bus
= get_bus_ctx(substream
);
1178 * Use DPIB for Playback stream as the periodic DMA Position-in-
1179 * Buffer Writes may be scheduled at the same time or later than
1180 * the MSI and does not guarantee to reflect the Position of the
1181 * last buffer that was transferred. Whereas DPIB register in
1182 * HAD space reflects the actual data that is transferred.
1183 * Use the position buffer for capture, as DPIB write gets
1184 * completed earlier than the actual data written to the DDR.
1186 * For capture stream following workaround is required to fix the
1187 * incorrect position reporting.
1189 * 1. Wait for 20us before reading the DMA position in buffer once
1190 * the interrupt is generated for stream completion as update happens
1191 * on the HDA frame boundary i.e. 20.833uSec.
1192 * 2. Read DPIB register to flush the DMA position value. This dummy
1193 * read is required to flush DMA position value.
1194 * 3. Read the DMA Position-in-Buffer. This value now will be equal to
1195 * or greater than period boundary.
1198 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
1199 pos
= readl(bus
->remap_addr
+ AZX_REG_VS_SDXDPIB_XBASE
+
1200 (AZX_REG_VS_SDXDPIB_XINTERVAL
*
1201 hdac_stream(hstream
)->index
));
1204 readl(bus
->remap_addr
+
1205 AZX_REG_VS_SDXDPIB_XBASE
+
1206 (AZX_REG_VS_SDXDPIB_XINTERVAL
*
1207 hdac_stream(hstream
)->index
));
1208 pos
= snd_hdac_stream_get_pos_posbuf(hdac_stream(hstream
));
1211 if (pos
>= hdac_stream(hstream
)->bufsize
)
1214 return bytes_to_frames(substream
->runtime
, pos
);
1217 static int skl_platform_soc_mmap(struct snd_soc_component
*component
,
1218 struct snd_pcm_substream
*substream
,
1219 struct vm_area_struct
*area
)
1221 return snd_pcm_lib_default_mmap(substream
, area
);
1224 static u64
skl_adjust_codec_delay(struct snd_pcm_substream
*substream
,
1227 struct snd_soc_pcm_runtime
*rtd
= asoc_substream_to_rtd(substream
);
1228 struct snd_soc_dai
*codec_dai
= asoc_rtd_to_codec(rtd
, 0);
1229 u64 codec_frames
, codec_nsecs
;
1231 if (!codec_dai
->driver
->ops
->delay
)
1234 codec_frames
= codec_dai
->driver
->ops
->delay(substream
, codec_dai
);
1235 codec_nsecs
= div_u64(codec_frames
* 1000000000LL,
1236 substream
->runtime
->rate
);
1238 if (substream
->stream
== SNDRV_PCM_STREAM_CAPTURE
)
1239 return nsec
+ codec_nsecs
;
1241 return (nsec
> codec_nsecs
) ? nsec
- codec_nsecs
: 0;
1244 static int skl_platform_soc_get_time_info(
1245 struct snd_soc_component
*component
,
1246 struct snd_pcm_substream
*substream
,
1247 struct timespec64
*system_ts
, struct timespec64
*audio_ts
,
1248 struct snd_pcm_audio_tstamp_config
*audio_tstamp_config
,
1249 struct snd_pcm_audio_tstamp_report
*audio_tstamp_report
)
1251 struct hdac_ext_stream
*sstream
= get_hdac_ext_stream(substream
);
1252 struct hdac_stream
*hstr
= hdac_stream(sstream
);
1255 if ((substream
->runtime
->hw
.info
& SNDRV_PCM_INFO_HAS_LINK_ATIME
) &&
1256 (audio_tstamp_config
->type_requested
== SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK
)) {
1258 snd_pcm_gettime(substream
->runtime
, system_ts
);
1260 nsec
= timecounter_read(&hstr
->tc
);
1261 nsec
= div_u64(nsec
, 3); /* can be optimized */
1262 if (audio_tstamp_config
->report_delay
)
1263 nsec
= skl_adjust_codec_delay(substream
, nsec
);
1265 *audio_ts
= ns_to_timespec64(nsec
);
1267 audio_tstamp_report
->actual_type
= SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK
;
1268 audio_tstamp_report
->accuracy_report
= 1; /* rest of struct is valid */
1269 audio_tstamp_report
->accuracy
= 42; /* 24MHzWallClk == 42ns resolution */
1272 audio_tstamp_report
->actual_type
= SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT
;
1278 #define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
1280 static int skl_platform_soc_new(struct snd_soc_component
*component
,
1281 struct snd_soc_pcm_runtime
*rtd
)
1283 struct snd_soc_dai
*dai
= asoc_rtd_to_cpu(rtd
, 0);
1284 struct hdac_bus
*bus
= dev_get_drvdata(dai
->dev
);
1285 struct snd_pcm
*pcm
= rtd
->pcm
;
1287 struct skl_dev
*skl
= bus_to_skl(bus
);
1289 if (dai
->driver
->playback
.channels_min
||
1290 dai
->driver
->capture
.channels_min
) {
1291 /* buffer pre-allocation */
1292 size
= CONFIG_SND_HDA_PREALLOC_SIZE
* 1024;
1293 if (size
> MAX_PREALLOC_SIZE
)
1294 size
= MAX_PREALLOC_SIZE
;
1295 snd_pcm_set_managed_buffer_all(pcm
,
1296 SNDRV_DMA_TYPE_DEV_SG
,
1298 size
, MAX_PREALLOC_SIZE
);
1304 static int skl_get_module_info(struct skl_dev
*skl
,
1305 struct skl_module_cfg
*mconfig
)
1307 struct skl_module_inst_id
*pin_id
;
1308 guid_t
*uuid_mod
, *uuid_tplg
;
1309 struct skl_module
*skl_module
;
1310 struct uuid_module
*module
;
1313 uuid_mod
= (guid_t
*)mconfig
->guid
;
1315 if (list_empty(&skl
->uuid_list
)) {
1316 dev_err(skl
->dev
, "Module list is empty\n");
1320 list_for_each_entry(module
, &skl
->uuid_list
, list
) {
1321 if (guid_equal(uuid_mod
, &module
->uuid
)) {
1322 mconfig
->id
.module_id
= module
->id
;
1323 if (mconfig
->module
)
1324 mconfig
->module
->loadable
= module
->is_loadable
;
1333 uuid_mod
= &module
->uuid
;
1335 for (i
= 0; i
< skl
->nr_modules
; i
++) {
1336 skl_module
= skl
->modules
[i
];
1337 uuid_tplg
= &skl_module
->uuid
;
1338 if (guid_equal(uuid_mod
, uuid_tplg
)) {
1339 mconfig
->module
= skl_module
;
1344 if (skl
->nr_modules
&& ret
)
1347 list_for_each_entry(module
, &skl
->uuid_list
, list
) {
1348 for (i
= 0; i
< MAX_IN_QUEUE
; i
++) {
1349 pin_id
= &mconfig
->m_in_pin
[i
].id
;
1350 if (guid_equal(&pin_id
->mod_uuid
, &module
->uuid
))
1351 pin_id
->module_id
= module
->id
;
1354 for (i
= 0; i
< MAX_OUT_QUEUE
; i
++) {
1355 pin_id
= &mconfig
->m_out_pin
[i
].id
;
1356 if (guid_equal(&pin_id
->mod_uuid
, &module
->uuid
))
1357 pin_id
->module_id
= module
->id
;
1364 static int skl_populate_modules(struct skl_dev
*skl
)
1366 struct skl_pipeline
*p
;
1367 struct skl_pipe_module
*m
;
1368 struct snd_soc_dapm_widget
*w
;
1369 struct skl_module_cfg
*mconfig
;
1372 list_for_each_entry(p
, &skl
->ppl_list
, node
) {
1373 list_for_each_entry(m
, &p
->pipe
->w_list
, node
) {
1377 ret
= skl_get_module_info(skl
, mconfig
);
1380 "query module info failed\n");
1384 skl_tplg_add_moduleid_in_bind_params(skl
, w
);
1391 static int skl_platform_soc_probe(struct snd_soc_component
*component
)
1393 struct hdac_bus
*bus
= dev_get_drvdata(component
->dev
);
1394 struct skl_dev
*skl
= bus_to_skl(bus
);
1395 const struct skl_dsp_ops
*ops
;
1398 pm_runtime_get_sync(component
->dev
);
1400 skl
->component
= component
;
1403 skl
->debugfs
= skl_debugfs_init(skl
);
1405 ret
= skl_tplg_init(component
, bus
);
1407 dev_err(component
->dev
, "Failed to init topology!\n");
1411 /* load the firmwares, since all is set */
1412 ops
= skl_get_dsp_ops(skl
->pci
->device
);
1417 * Disable dynamic clock and power gating during firmware
1418 * and library download
1420 skl
->enable_miscbdcge(component
->dev
, false);
1421 skl
->clock_power_gating(component
->dev
, false);
1423 ret
= ops
->init_fw(component
->dev
, skl
);
1424 skl
->enable_miscbdcge(component
->dev
, true);
1425 skl
->clock_power_gating(component
->dev
, true);
1427 dev_err(component
->dev
, "Failed to boot first fw: %d\n", ret
);
1430 skl_populate_modules(skl
);
1431 skl
->update_d0i3c
= skl_update_d0i3c
;
1433 if (skl
->cfg
.astate_cfg
!= NULL
) {
1434 skl_dsp_set_astate_cfg(skl
,
1435 skl
->cfg
.astate_cfg
->count
,
1436 skl
->cfg
.astate_cfg
);
1439 pm_runtime_mark_last_busy(component
->dev
);
1440 pm_runtime_put_autosuspend(component
->dev
);
1445 static void skl_platform_soc_remove(struct snd_soc_component
*component
)
1447 struct hdac_bus
*bus
= dev_get_drvdata(component
->dev
);
1448 struct skl_dev
*skl
= bus_to_skl(bus
);
1450 skl_tplg_exit(component
, bus
);
1452 skl_debugfs_exit(skl
);
1455 static const struct snd_soc_component_driver skl_component
= {
1457 .probe
= skl_platform_soc_probe
,
1458 .remove
= skl_platform_soc_remove
,
1459 .open
= skl_platform_soc_open
,
1460 .trigger
= skl_platform_soc_trigger
,
1461 .pointer
= skl_platform_soc_pointer
,
1462 .get_time_info
= skl_platform_soc_get_time_info
,
1463 .mmap
= skl_platform_soc_mmap
,
1464 .pcm_construct
= skl_platform_soc_new
,
1465 .module_get_upon_open
= 1, /* increment refcount when a pcm is opened */
1468 int skl_platform_register(struct device
*dev
)
1471 struct snd_soc_dai_driver
*dais
;
1472 int num_dais
= ARRAY_SIZE(skl_platform_dai
);
1473 struct hdac_bus
*bus
= dev_get_drvdata(dev
);
1474 struct skl_dev
*skl
= bus_to_skl(bus
);
1476 skl
->dais
= kmemdup(skl_platform_dai
, sizeof(skl_platform_dai
),
1483 if (!skl
->use_tplg_pcm
) {
1484 dais
= krealloc(skl
->dais
, sizeof(skl_fe_dai
) +
1485 sizeof(skl_platform_dai
), GFP_KERNEL
);
1492 memcpy(&skl
->dais
[ARRAY_SIZE(skl_platform_dai
)], skl_fe_dai
,
1493 sizeof(skl_fe_dai
));
1494 num_dais
+= ARRAY_SIZE(skl_fe_dai
);
1497 ret
= devm_snd_soc_register_component(dev
, &skl_component
,
1498 skl
->dais
, num_dais
);
1500 dev_err(dev
, "soc component registration failed %d\n", ret
);
1505 int skl_platform_unregister(struct device
*dev
)
1507 struct hdac_bus
*bus
= dev_get_drvdata(dev
);
1508 struct skl_dev
*skl
= bus_to_skl(bus
);
1509 struct skl_module_deferred_bind
*modules
, *tmp
;
1511 list_for_each_entry_safe(modules
, tmp
, &skl
->bind_list
, node
) {
1512 list_del(&modules
->node
);