xref: /linux/sound/soc/intel/avs/pcm.c (revision 2672031b20f6681514bef14ddcfe8c62c2757d11)
1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // Copyright(c) 2021-2022 Intel Corporation. All rights reserved.
4 //
5 // Authors: Cezary Rojewski <cezary.rojewski@intel.com>
6 //          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
7 //
8 
9 #include <linux/debugfs.h>
10 #include <linux/device.h>
11 #include <sound/hda_register.h>
12 #include <sound/hdaudio_ext.h>
13 #include <sound/pcm_params.h>
14 #include <sound/soc-acpi.h>
15 #include <sound/soc-acpi-intel-match.h>
16 #include <sound/soc-component.h>
17 #include "avs.h"
18 #include "path.h"
19 #include "topology.h"
20 #include "../../codecs/hda.h"
21 
22 struct avs_dma_data {
23 	struct avs_tplg_path_template *template;
24 	struct avs_path *path;
25 	/*
26 	 * link stream is stored within substream's runtime
27 	 * private_data to fulfill the needs of codec BE path
28 	 *
29 	 * host stream assigned
30 	 */
31 	struct hdac_ext_stream *host_stream;
32 
33 	struct snd_pcm_substream *substream;
34 };
35 
36 static struct avs_tplg_path_template *
37 avs_dai_find_path_template(struct snd_soc_dai *dai, bool is_fe, int direction)
38 {
39 	struct snd_soc_dapm_widget *dw = snd_soc_dai_get_widget(dai, direction);
40 	struct snd_soc_dapm_path *dp;
41 	enum snd_soc_dapm_direction dir;
42 
43 	if (direction == SNDRV_PCM_STREAM_CAPTURE) {
44 		dir = is_fe ? SND_SOC_DAPM_DIR_OUT : SND_SOC_DAPM_DIR_IN;
45 	} else {
46 		dir = is_fe ? SND_SOC_DAPM_DIR_IN : SND_SOC_DAPM_DIR_OUT;
47 	}
48 
49 	dp = list_first_entry_or_null(&dw->edges[dir], typeof(*dp), list_node[dir]);
50 	if (!dp)
51 		return NULL;
52 
53 	/* Get the other widget, with actual path template data */
54 	dw = (dp->source == dw) ? dp->sink : dp->source;
55 
56 	return dw->priv;
57 }
58 
59 static int avs_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai, bool is_fe,
60 			   const struct snd_soc_dai_ops *ops)
61 {
62 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
63 	struct avs_dev *adev = to_avs_dev(dai->dev);
64 	struct avs_tplg_path_template *template;
65 	struct avs_dma_data *data;
66 
67 	template = avs_dai_find_path_template(dai, is_fe, substream->stream);
68 	if (!template) {
69 		dev_err(dai->dev, "no %s path for dai %s, invalid tplg?\n",
70 			snd_pcm_stream_str(substream), dai->name);
71 		return -EINVAL;
72 	}
73 
74 	data = kzalloc(sizeof(*data), GFP_KERNEL);
75 	if (!data)
76 		return -ENOMEM;
77 
78 	data->substream = substream;
79 	data->template = template;
80 	snd_soc_dai_set_dma_data(dai, substream, data);
81 
82 	if (rtd->dai_link->ignore_suspend)
83 		adev->num_lp_paths++;
84 
85 	return 0;
86 }
87 
88 static int avs_dai_hw_params(struct snd_pcm_substream *substream,
89 			     struct snd_pcm_hw_params *fe_hw_params,
90 			     struct snd_pcm_hw_params *be_hw_params, struct snd_soc_dai *dai,
91 			     int dma_id)
92 {
93 	struct avs_dma_data *data;
94 	struct avs_path *path;
95 	struct avs_dev *adev = to_avs_dev(dai->dev);
96 	int ret;
97 
98 	data = snd_soc_dai_get_dma_data(dai, substream);
99 
100 	dev_dbg(dai->dev, "%s FE hw_params str %p rtd %p",
101 		__func__, substream, substream->runtime);
102 	dev_dbg(dai->dev, "rate %d chn %d vbd %d bd %d\n",
103 		params_rate(fe_hw_params), params_channels(fe_hw_params),
104 		params_width(fe_hw_params), params_physical_width(fe_hw_params));
105 
106 	dev_dbg(dai->dev, "%s BE hw_params str %p rtd %p",
107 		__func__, substream, substream->runtime);
108 	dev_dbg(dai->dev, "rate %d chn %d vbd %d bd %d\n",
109 		params_rate(be_hw_params), params_channels(be_hw_params),
110 		params_width(be_hw_params), params_physical_width(be_hw_params));
111 
112 	path = avs_path_create(adev, dma_id, data->template, fe_hw_params, be_hw_params);
113 	if (IS_ERR(path)) {
114 		ret = PTR_ERR(path);
115 		dev_err(dai->dev, "create path failed: %d\n", ret);
116 		return ret;
117 	}
118 
119 	data->path = path;
120 	return 0;
121 }
122 
123 static int avs_dai_be_hw_params(struct snd_pcm_substream *substream,
124 				struct snd_pcm_hw_params *be_hw_params, struct snd_soc_dai *dai,
125 				int dma_id)
126 {
127 	struct snd_pcm_hw_params *fe_hw_params = NULL;
128 	struct snd_soc_pcm_runtime *fe, *be;
129 	struct snd_soc_dpcm *dpcm;
130 
131 	be = snd_soc_substream_to_rtd(substream);
132 	for_each_dpcm_fe(be, substream->stream, dpcm) {
133 		fe = dpcm->fe;
134 		fe_hw_params = &fe->dpcm[substream->stream].hw_params;
135 	}
136 
137 	return avs_dai_hw_params(substream, fe_hw_params, be_hw_params, dai, dma_id);
138 }
139 
140 static int avs_dai_prepare(struct avs_dev *adev, struct snd_pcm_substream *substream,
141 			   struct snd_soc_dai *dai)
142 {
143 	struct avs_dma_data *data;
144 	int ret;
145 
146 	data = snd_soc_dai_get_dma_data(dai, substream);
147 	if (!data->path)
148 		return 0;
149 
150 	ret = avs_path_reset(data->path);
151 	if (ret < 0) {
152 		dev_err(dai->dev, "reset path failed: %d\n", ret);
153 		return ret;
154 	}
155 
156 	ret = avs_path_pause(data->path);
157 	if (ret < 0)
158 		dev_err(dai->dev, "pause path failed: %d\n", ret);
159 	return ret;
160 }
161 
162 static const struct snd_soc_dai_ops avs_dai_nonhda_be_ops;
163 
164 static int avs_dai_nonhda_be_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
165 {
166 	return avs_dai_startup(substream, dai, false, &avs_dai_nonhda_be_ops);
167 }
168 
169 static void avs_dai_nonhda_be_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
170 {
171 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
172 	struct avs_dev *adev = to_avs_dev(dai->dev);
173 	struct avs_dma_data *data;
174 
175 	if (rtd->dai_link->ignore_suspend)
176 		adev->num_lp_paths--;
177 
178 	data = snd_soc_dai_get_dma_data(dai, substream);
179 
180 	snd_soc_dai_set_dma_data(dai, substream, NULL);
181 	kfree(data);
182 }
183 
184 static int avs_dai_nonhda_be_hw_params(struct snd_pcm_substream *substream,
185 				       struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai)
186 {
187 	struct avs_dma_data *data;
188 
189 	data = snd_soc_dai_get_dma_data(dai, substream);
190 	if (data->path)
191 		return 0;
192 
193 	/* Actual port-id comes from topology. */
194 	return avs_dai_be_hw_params(substream, hw_params, dai, 0);
195 }
196 
197 static int avs_dai_nonhda_be_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
198 {
199 	struct avs_dma_data *data;
200 
201 	dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
202 
203 	data = snd_soc_dai_get_dma_data(dai, substream);
204 	if (data->path) {
205 		avs_path_free(data->path);
206 		data->path = NULL;
207 	}
208 
209 	return 0;
210 }
211 
212 static int avs_dai_nonhda_be_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
213 {
214 	return avs_dai_prepare(to_avs_dev(dai->dev), substream, dai);
215 }
216 
217 static int avs_dai_nonhda_be_trigger(struct snd_pcm_substream *substream, int cmd,
218 				     struct snd_soc_dai *dai)
219 {
220 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
221 	struct avs_dma_data *data;
222 	int ret = 0;
223 
224 	data = snd_soc_dai_get_dma_data(dai, substream);
225 
226 	switch (cmd) {
227 	case SNDRV_PCM_TRIGGER_RESUME:
228 		if (rtd->dai_link->ignore_suspend)
229 			break;
230 		fallthrough;
231 	case SNDRV_PCM_TRIGGER_START:
232 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
233 		ret = avs_path_pause(data->path);
234 		if (ret < 0) {
235 			dev_err(dai->dev, "pause BE path failed: %d\n", ret);
236 			break;
237 		}
238 
239 		ret = avs_path_run(data->path, AVS_TPLG_TRIGGER_AUTO);
240 		if (ret < 0)
241 			dev_err(dai->dev, "run BE path failed: %d\n", ret);
242 		break;
243 
244 	case SNDRV_PCM_TRIGGER_SUSPEND:
245 		if (rtd->dai_link->ignore_suspend)
246 			break;
247 		fallthrough;
248 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
249 	case SNDRV_PCM_TRIGGER_STOP:
250 		ret = avs_path_pause(data->path);
251 		if (ret < 0)
252 			dev_err(dai->dev, "pause BE path failed: %d\n", ret);
253 
254 		ret = avs_path_reset(data->path);
255 		if (ret < 0)
256 			dev_err(dai->dev, "reset BE path failed: %d\n", ret);
257 		break;
258 
259 	default:
260 		ret = -EINVAL;
261 		break;
262 	}
263 
264 	return ret;
265 }
266 
267 static const struct snd_soc_dai_ops avs_dai_nonhda_be_ops = {
268 	.startup = avs_dai_nonhda_be_startup,
269 	.shutdown = avs_dai_nonhda_be_shutdown,
270 	.hw_params = avs_dai_nonhda_be_hw_params,
271 	.hw_free = avs_dai_nonhda_be_hw_free,
272 	.prepare = avs_dai_nonhda_be_prepare,
273 	.trigger = avs_dai_nonhda_be_trigger,
274 };
275 
276 static const struct snd_soc_dai_ops avs_dai_hda_be_ops;
277 
278 static int avs_dai_hda_be_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
279 {
280 	return avs_dai_startup(substream, dai, false, &avs_dai_hda_be_ops);
281 }
282 
283 static void avs_dai_hda_be_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
284 {
285 	return avs_dai_nonhda_be_shutdown(substream, dai);
286 }
287 
288 static int avs_dai_hda_be_hw_params(struct snd_pcm_substream *substream,
289 				    struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai)
290 {
291 	struct avs_dma_data *data;
292 	struct hdac_ext_stream *link_stream;
293 
294 	data = snd_soc_dai_get_dma_data(dai, substream);
295 	if (data->path)
296 		return 0;
297 
298 	link_stream = substream->runtime->private_data;
299 
300 	return avs_dai_be_hw_params(substream, hw_params, dai,
301 				    hdac_stream(link_stream)->stream_tag - 1);
302 }
303 
304 static int avs_dai_hda_be_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
305 {
306 	struct avs_dma_data *data;
307 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
308 	struct hdac_ext_stream *link_stream;
309 	struct hdac_ext_link *link;
310 	struct hda_codec *codec;
311 
312 	dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
313 
314 	data = snd_soc_dai_get_dma_data(dai, substream);
315 	if (!data->path)
316 		return 0;
317 
318 	link_stream = substream->runtime->private_data;
319 	link_stream->link_prepared = false;
320 	avs_path_free(data->path);
321 	data->path = NULL;
322 
323 	/* clear link <-> stream mapping */
324 	codec = dev_to_hda_codec(snd_soc_rtd_to_codec(rtd, 0)->dev);
325 	link = snd_hdac_ext_bus_get_hlink_by_addr(&codec->bus->core, codec->core.addr);
326 	if (!link)
327 		return -EINVAL;
328 
329 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
330 		snd_hdac_ext_bus_link_clear_stream_id(link, hdac_stream(link_stream)->stream_tag);
331 
332 	return 0;
333 }
334 
335 static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
336 {
337 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
338 	struct snd_pcm_runtime *runtime = substream->runtime;
339 	struct snd_soc_pcm_stream *stream_info;
340 	struct hdac_ext_stream *link_stream;
341 	struct hdac_ext_link *link;
342 	struct hda_codec *codec;
343 	struct hdac_bus *bus;
344 	unsigned int format_val;
345 	unsigned int bits;
346 	int ret;
347 
348 	link_stream = runtime->private_data;
349 	if (link_stream->link_prepared)
350 		return 0;
351 
352 	codec = dev_to_hda_codec(snd_soc_rtd_to_codec(rtd, 0)->dev);
353 	bus = &codec->bus->core;
354 	stream_info = snd_soc_dai_get_pcm_stream(dai, substream->stream);
355 	bits = snd_hdac_stream_format_bits(runtime->format, runtime->subformat,
356 					   stream_info->sig_bits);
357 	format_val = snd_hdac_stream_format(runtime->channels, bits, runtime->rate);
358 
359 	snd_hdac_ext_stream_reset(link_stream);
360 	snd_hdac_ext_stream_setup(link_stream, format_val);
361 
362 	link = snd_hdac_ext_bus_get_hlink_by_addr(bus, codec->core.addr);
363 	if (!link)
364 		return -EINVAL;
365 
366 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
367 		snd_hdac_ext_bus_link_set_stream_id(link, hdac_stream(link_stream)->stream_tag);
368 
369 	ret = avs_dai_prepare(to_avs_dev(dai->dev), substream, dai);
370 	if (ret)
371 		return ret;
372 
373 	link_stream->link_prepared = true;
374 	return 0;
375 }
376 
377 static int avs_dai_hda_be_trigger(struct snd_pcm_substream *substream, int cmd,
378 				  struct snd_soc_dai *dai)
379 {
380 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
381 	struct hdac_ext_stream *link_stream;
382 	struct avs_dma_data *data;
383 	int ret = 0;
384 
385 	dev_dbg(dai->dev, "entry %s cmd=%d\n", __func__, cmd);
386 
387 	data = snd_soc_dai_get_dma_data(dai, substream);
388 	link_stream = substream->runtime->private_data;
389 
390 	switch (cmd) {
391 	case SNDRV_PCM_TRIGGER_RESUME:
392 		if (rtd->dai_link->ignore_suspend)
393 			break;
394 		fallthrough;
395 	case SNDRV_PCM_TRIGGER_START:
396 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
397 		snd_hdac_ext_stream_start(link_stream);
398 
399 		ret = avs_path_pause(data->path);
400 		if (ret < 0) {
401 			dev_err(dai->dev, "pause BE path failed: %d\n", ret);
402 			break;
403 		}
404 
405 		ret = avs_path_run(data->path, AVS_TPLG_TRIGGER_AUTO);
406 		if (ret < 0)
407 			dev_err(dai->dev, "run BE path failed: %d\n", ret);
408 		break;
409 
410 	case SNDRV_PCM_TRIGGER_SUSPEND:
411 		if (rtd->dai_link->ignore_suspend)
412 			break;
413 		fallthrough;
414 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
415 	case SNDRV_PCM_TRIGGER_STOP:
416 		ret = avs_path_pause(data->path);
417 		if (ret < 0)
418 			dev_err(dai->dev, "pause BE path failed: %d\n", ret);
419 
420 		snd_hdac_ext_stream_clear(link_stream);
421 
422 		ret = avs_path_reset(data->path);
423 		if (ret < 0)
424 			dev_err(dai->dev, "reset BE path failed: %d\n", ret);
425 		break;
426 
427 	default:
428 		ret = -EINVAL;
429 		break;
430 	}
431 
432 	return ret;
433 }
434 
435 static const struct snd_soc_dai_ops avs_dai_hda_be_ops = {
436 	.startup = avs_dai_hda_be_startup,
437 	.shutdown = avs_dai_hda_be_shutdown,
438 	.hw_params = avs_dai_hda_be_hw_params,
439 	.hw_free = avs_dai_hda_be_hw_free,
440 	.prepare = avs_dai_hda_be_prepare,
441 	.trigger = avs_dai_hda_be_trigger,
442 };
443 
444 static const unsigned int rates[] = {
445 	8000, 11025, 12000, 16000,
446 	22050, 24000, 32000, 44100,
447 	48000, 64000, 88200, 96000,
448 	128000, 176400, 192000,
449 };
450 
451 static const struct snd_pcm_hw_constraint_list hw_rates = {
452 	.count = ARRAY_SIZE(rates),
453 	.list = rates,
454 	.mask = 0,
455 };
456 
457 const struct snd_soc_dai_ops avs_dai_fe_ops;
458 
459 static int avs_dai_fe_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
460 {
461 	struct snd_pcm_runtime *runtime = substream->runtime;
462 	struct avs_dma_data *data;
463 	struct avs_dev *adev = to_avs_dev(dai->dev);
464 	struct hdac_bus *bus = &adev->base.core;
465 	struct hdac_ext_stream *host_stream;
466 	int ret;
467 
468 	ret = avs_dai_startup(substream, dai, true, &avs_dai_fe_ops);
469 	if (ret)
470 		return ret;
471 
472 	data = snd_soc_dai_get_dma_data(dai, substream);
473 
474 	host_stream = snd_hdac_ext_stream_assign(bus, substream, HDAC_EXT_STREAM_TYPE_HOST);
475 	if (!host_stream) {
476 		ret = -EBUSY;
477 		goto err;
478 	}
479 
480 	data->host_stream = host_stream;
481 	ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
482 	if (ret < 0)
483 		goto err;
484 
485 	/* avoid wrap-around with wall-clock */
486 	ret = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME, 20, 178000000);
487 	if (ret < 0)
488 		goto err;
489 
490 	ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_rates);
491 	if (ret < 0)
492 		goto err;
493 
494 	snd_pcm_set_sync(substream);
495 
496 	dev_dbg(dai->dev, "%s fe STARTUP tag %d str %p",
497 		__func__, hdac_stream(host_stream)->stream_tag, substream);
498 
499 	return 0;
500 
501 err:
502 	kfree(data);
503 	return ret;
504 }
505 
506 static void avs_dai_fe_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
507 {
508 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
509 	struct avs_dev *adev = to_avs_dev(dai->dev);
510 	struct avs_dma_data *data;
511 
512 	if (rtd->dai_link->ignore_suspend)
513 		adev->num_lp_paths--;
514 
515 	data = snd_soc_dai_get_dma_data(dai, substream);
516 
517 	snd_soc_dai_set_dma_data(dai, substream, NULL);
518 	snd_hdac_ext_stream_release(data->host_stream, HDAC_EXT_STREAM_TYPE_HOST);
519 	kfree(data);
520 }
521 
522 static int avs_dai_fe_hw_params(struct snd_pcm_substream *substream,
523 				struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai)
524 {
525 	struct snd_pcm_hw_params *be_hw_params = NULL;
526 	struct snd_soc_pcm_runtime *fe, *be;
527 	struct snd_soc_dpcm *dpcm;
528 	struct avs_dma_data *data;
529 	struct hdac_ext_stream *host_stream;
530 	int ret;
531 
532 	data = snd_soc_dai_get_dma_data(dai, substream);
533 	if (data->path)
534 		return 0;
535 
536 	host_stream = data->host_stream;
537 
538 	hdac_stream(host_stream)->bufsize = 0;
539 	hdac_stream(host_stream)->period_bytes = 0;
540 	hdac_stream(host_stream)->format_val = 0;
541 
542 	fe = snd_soc_substream_to_rtd(substream);
543 	for_each_dpcm_be(fe, substream->stream, dpcm) {
544 		be = dpcm->be;
545 		be_hw_params = &be->dpcm[substream->stream].hw_params;
546 	}
547 
548 	ret = avs_dai_hw_params(substream, hw_params, be_hw_params, dai,
549 				hdac_stream(host_stream)->stream_tag - 1);
550 	if (ret)
551 		goto create_err;
552 
553 	ret = avs_path_bind(data->path);
554 	if (ret < 0) {
555 		dev_err(dai->dev, "bind FE <-> BE failed: %d\n", ret);
556 		goto bind_err;
557 	}
558 
559 	return 0;
560 
561 bind_err:
562 	avs_path_free(data->path);
563 	data->path = NULL;
564 create_err:
565 	snd_pcm_lib_free_pages(substream);
566 	return ret;
567 }
568 
569 static int __avs_dai_fe_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
570 {
571 	struct avs_dma_data *data;
572 	struct hdac_ext_stream *host_stream;
573 	int ret;
574 
575 	dev_dbg(dai->dev, "%s fe HW_FREE str %p rtd %p",
576 		__func__, substream, substream->runtime);
577 
578 	data = snd_soc_dai_get_dma_data(dai, substream);
579 	if (!data->path)
580 		return 0;
581 
582 	host_stream = data->host_stream;
583 
584 	ret = avs_path_unbind(data->path);
585 	if (ret < 0)
586 		dev_err(dai->dev, "unbind FE <-> BE failed: %d\n", ret);
587 
588 	avs_path_free(data->path);
589 	data->path = NULL;
590 	snd_hdac_stream_cleanup(hdac_stream(host_stream));
591 	hdac_stream(host_stream)->prepared = false;
592 
593 	return ret;
594 }
595 
596 static int avs_dai_fe_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
597 {
598 	int ret;
599 
600 	ret = __avs_dai_fe_hw_free(substream, dai);
601 	snd_pcm_lib_free_pages(substream);
602 
603 	return ret;
604 }
605 
606 static int avs_dai_fe_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
607 {
608 	struct snd_pcm_runtime *runtime = substream->runtime;
609 	struct snd_soc_pcm_stream *stream_info;
610 	struct avs_dma_data *data;
611 	struct avs_dev *adev = to_avs_dev(dai->dev);
612 	struct hdac_ext_stream *host_stream;
613 	unsigned int format_val;
614 	unsigned int bits;
615 	int ret;
616 
617 	data = snd_soc_dai_get_dma_data(dai, substream);
618 	host_stream = data->host_stream;
619 
620 	if (hdac_stream(host_stream)->prepared)
621 		return 0;
622 
623 	snd_hdac_stream_reset(hdac_stream(host_stream));
624 
625 	stream_info = snd_soc_dai_get_pcm_stream(dai, substream->stream);
626 	bits = snd_hdac_stream_format_bits(runtime->format, runtime->subformat,
627 					   stream_info->sig_bits);
628 	format_val = snd_hdac_stream_format(runtime->channels, bits, runtime->rate);
629 
630 	ret = snd_hdac_stream_set_params(hdac_stream(host_stream), format_val);
631 	if (ret < 0)
632 		return ret;
633 
634 	ret = snd_hdac_ext_host_stream_setup(host_stream, false);
635 	if (ret < 0)
636 		return ret;
637 
638 	ret = avs_dai_prepare(adev, substream, dai);
639 	if (ret)
640 		return ret;
641 
642 	hdac_stream(host_stream)->prepared = true;
643 	return 0;
644 }
645 
646 static int avs_dai_fe_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
647 {
648 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
649 	struct avs_dma_data *data;
650 	struct hdac_ext_stream *host_stream;
651 	struct hdac_bus *bus;
652 	unsigned long flags;
653 	int ret = 0;
654 
655 	data = snd_soc_dai_get_dma_data(dai, substream);
656 	host_stream = data->host_stream;
657 	bus = hdac_stream(host_stream)->bus;
658 
659 	switch (cmd) {
660 	case SNDRV_PCM_TRIGGER_RESUME:
661 		if (rtd->dai_link->ignore_suspend)
662 			break;
663 		fallthrough;
664 	case SNDRV_PCM_TRIGGER_START:
665 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
666 		spin_lock_irqsave(&bus->reg_lock, flags);
667 		snd_hdac_stream_start(hdac_stream(host_stream));
668 		spin_unlock_irqrestore(&bus->reg_lock, flags);
669 
670 		/* Timeout on DRSM poll shall not stop the resume so ignore the result. */
671 		if (cmd == SNDRV_PCM_TRIGGER_RESUME)
672 			snd_hdac_stream_wait_drsm(hdac_stream(host_stream));
673 
674 		ret = avs_path_pause(data->path);
675 		if (ret < 0) {
676 			dev_err(dai->dev, "pause FE path failed: %d\n", ret);
677 			break;
678 		}
679 
680 		ret = avs_path_run(data->path, AVS_TPLG_TRIGGER_AUTO);
681 		if (ret < 0)
682 			dev_err(dai->dev, "run FE path failed: %d\n", ret);
683 
684 		break;
685 
686 	case SNDRV_PCM_TRIGGER_SUSPEND:
687 		if (rtd->dai_link->ignore_suspend)
688 			break;
689 		fallthrough;
690 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
691 	case SNDRV_PCM_TRIGGER_STOP:
692 		ret = avs_path_pause(data->path);
693 		if (ret < 0)
694 			dev_err(dai->dev, "pause FE path failed: %d\n", ret);
695 
696 		spin_lock_irqsave(&bus->reg_lock, flags);
697 		snd_hdac_stream_stop(hdac_stream(host_stream));
698 		spin_unlock_irqrestore(&bus->reg_lock, flags);
699 
700 		ret = avs_path_reset(data->path);
701 		if (ret < 0)
702 			dev_err(dai->dev, "reset FE path failed: %d\n", ret);
703 		break;
704 
705 	default:
706 		ret = -EINVAL;
707 		break;
708 	}
709 
710 	return ret;
711 }
712 
713 const struct snd_soc_dai_ops avs_dai_fe_ops = {
714 	.startup = avs_dai_fe_startup,
715 	.shutdown = avs_dai_fe_shutdown,
716 	.hw_params = avs_dai_fe_hw_params,
717 	.hw_free = avs_dai_fe_hw_free,
718 	.prepare = avs_dai_fe_prepare,
719 	.trigger = avs_dai_fe_trigger,
720 };
721 
722 static ssize_t topology_name_read(struct file *file, char __user *user_buf, size_t count,
723 				  loff_t *ppos)
724 {
725 	struct snd_soc_component *component = file->private_data;
726 	struct snd_soc_card *card = component->card;
727 	struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev);
728 	char buf[64];
729 	size_t len;
730 
731 	len = scnprintf(buf, sizeof(buf), "%s/%s\n", component->driver->topology_name_prefix,
732 			mach->tplg_filename);
733 
734 	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
735 }
736 
737 static const struct file_operations topology_name_fops = {
738 	.open = simple_open,
739 	.read = topology_name_read,
740 	.llseek = default_llseek,
741 };
742 
743 static int avs_component_load_libraries(struct avs_soc_component *acomp)
744 {
745 	struct avs_tplg *tplg = acomp->tplg;
746 	struct avs_dev *adev = to_avs_dev(acomp->base.dev);
747 	int ret;
748 
749 	if (!tplg->num_libs)
750 		return 0;
751 
752 	/* Parent device may be asleep and library loading involves IPCs. */
753 	ret = pm_runtime_resume_and_get(adev->dev);
754 	if (ret < 0)
755 		return ret;
756 
757 	avs_hda_power_gating_enable(adev, false);
758 	avs_hda_clock_gating_enable(adev, false);
759 	avs_hda_l1sen_enable(adev, false);
760 
761 	ret = avs_dsp_load_libraries(adev, tplg->libs, tplg->num_libs);
762 
763 	avs_hda_l1sen_enable(adev, true);
764 	avs_hda_clock_gating_enable(adev, true);
765 	avs_hda_power_gating_enable(adev, true);
766 
767 	if (!ret)
768 		ret = avs_module_info_init(adev, false);
769 
770 	pm_runtime_mark_last_busy(adev->dev);
771 	pm_runtime_put_autosuspend(adev->dev);
772 
773 	return ret;
774 }
775 
776 static int avs_component_probe(struct snd_soc_component *component)
777 {
778 	struct snd_soc_card *card = component->card;
779 	struct snd_soc_acpi_mach *mach;
780 	struct avs_soc_component *acomp;
781 	struct avs_dev *adev;
782 	char *filename;
783 	int ret;
784 
785 	dev_dbg(card->dev, "probing %s card %s\n", component->name, card->name);
786 	mach = dev_get_platdata(card->dev);
787 	acomp = to_avs_soc_component(component);
788 	adev = to_avs_dev(component->dev);
789 
790 	acomp->tplg = avs_tplg_new(component);
791 	if (!acomp->tplg)
792 		return -ENOMEM;
793 
794 	if (!mach->tplg_filename)
795 		goto finalize;
796 
797 	/* Load specified topology and create debugfs for it. */
798 	filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
799 			     mach->tplg_filename);
800 	if (!filename)
801 		return -ENOMEM;
802 
803 	ret = avs_load_topology(component, filename);
804 	kfree(filename);
805 	if (ret == -ENOENT && !strncmp(mach->tplg_filename, "hda-", 4)) {
806 		unsigned int vendor_id;
807 
808 		if (sscanf(mach->tplg_filename, "hda-%08x-tplg.bin", &vendor_id) != 1)
809 			return ret;
810 
811 		if (((vendor_id >> 16) & 0xFFFF) == 0x8086)
812 			mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
813 							     "hda-8086-generic-tplg.bin");
814 		else
815 			mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
816 							     "hda-generic-tplg.bin");
817 
818 		filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
819 				     mach->tplg_filename);
820 		if (!filename)
821 			return -ENOMEM;
822 
823 		dev_info(card->dev, "trying to load fallback topology %s\n", mach->tplg_filename);
824 		ret = avs_load_topology(component, filename);
825 		kfree(filename);
826 	}
827 	if (ret < 0)
828 		return ret;
829 
830 	ret = avs_component_load_libraries(acomp);
831 	if (ret < 0) {
832 		dev_err(card->dev, "libraries loading failed: %d\n", ret);
833 		goto err_load_libs;
834 	}
835 
836 finalize:
837 	debugfs_create_file("topology_name", 0444, component->debugfs_root, component,
838 			    &topology_name_fops);
839 
840 	mutex_lock(&adev->comp_list_mutex);
841 	list_add_tail(&acomp->node, &adev->comp_list);
842 	mutex_unlock(&adev->comp_list_mutex);
843 
844 	return 0;
845 
846 err_load_libs:
847 	avs_remove_topology(component);
848 	return ret;
849 }
850 
851 static void avs_component_remove(struct snd_soc_component *component)
852 {
853 	struct avs_soc_component *acomp = to_avs_soc_component(component);
854 	struct snd_soc_acpi_mach *mach;
855 	struct avs_dev *adev = to_avs_dev(component->dev);
856 	int ret;
857 
858 	mach = dev_get_platdata(component->card->dev);
859 
860 	mutex_lock(&adev->comp_list_mutex);
861 	list_del(&acomp->node);
862 	mutex_unlock(&adev->comp_list_mutex);
863 
864 	if (mach->tplg_filename) {
865 		ret = avs_remove_topology(component);
866 		if (ret < 0)
867 			dev_err(component->dev, "unload topology failed: %d\n", ret);
868 	}
869 }
870 
871 static int avs_dai_resume_hw_params(struct snd_soc_dai *dai, struct avs_dma_data *data)
872 {
873 	struct snd_pcm_substream *substream;
874 	struct snd_soc_pcm_runtime *rtd;
875 	int ret;
876 
877 	substream = data->substream;
878 	rtd = snd_soc_substream_to_rtd(substream);
879 
880 	ret = dai->driver->ops->hw_params(substream, &rtd->dpcm[substream->stream].hw_params, dai);
881 	if (ret)
882 		dev_err(dai->dev, "hw_params on resume failed: %d\n", ret);
883 
884 	return ret;
885 }
886 
887 static int avs_dai_resume_fe_prepare(struct snd_soc_dai *dai, struct avs_dma_data *data)
888 {
889 	struct hdac_ext_stream *host_stream;
890 	struct hdac_stream *hstream;
891 	struct hdac_bus *bus;
892 	int ret;
893 
894 	host_stream = data->host_stream;
895 	hstream = hdac_stream(host_stream);
896 	bus = hdac_stream(host_stream)->bus;
897 
898 	/* Set DRSM before programming stream and position registers. */
899 	snd_hdac_stream_drsm_enable(bus, true, hstream->index);
900 
901 	ret = dai->driver->ops->prepare(data->substream, dai);
902 	if (ret) {
903 		dev_err(dai->dev, "prepare FE on resume failed: %d\n", ret);
904 		return ret;
905 	}
906 
907 	writel(host_stream->pphcllpl, host_stream->pphc_addr + AZX_REG_PPHCLLPL);
908 	writel(host_stream->pphcllpu, host_stream->pphc_addr + AZX_REG_PPHCLLPU);
909 	writel(host_stream->pphcldpl, host_stream->pphc_addr + AZX_REG_PPHCLDPL);
910 	writel(host_stream->pphcldpu, host_stream->pphc_addr + AZX_REG_PPHCLDPU);
911 
912 	/* As per HW spec recommendation, program LPIB and DPIB to the same value. */
913 	snd_hdac_stream_set_lpib(hstream, hstream->lpib);
914 	snd_hdac_stream_set_dpibr(bus, hstream, hstream->lpib);
915 
916 	return 0;
917 }
918 
919 static int avs_dai_resume_be_prepare(struct snd_soc_dai *dai, struct avs_dma_data *data)
920 {
921 	int ret;
922 
923 	ret = dai->driver->ops->prepare(data->substream, dai);
924 	if (ret)
925 		dev_err(dai->dev, "prepare BE on resume failed: %d\n", ret);
926 
927 	return ret;
928 }
929 
930 static int avs_dai_suspend_fe_hw_free(struct snd_soc_dai *dai, struct avs_dma_data *data)
931 {
932 	struct hdac_ext_stream *host_stream;
933 	int ret;
934 
935 	host_stream = data->host_stream;
936 
937 	/* Store position addresses so we can resume from them later on. */
938 	hdac_stream(host_stream)->lpib = snd_hdac_stream_get_pos_lpib(hdac_stream(host_stream));
939 	host_stream->pphcllpl = readl(host_stream->pphc_addr + AZX_REG_PPHCLLPL);
940 	host_stream->pphcllpu = readl(host_stream->pphc_addr + AZX_REG_PPHCLLPU);
941 	host_stream->pphcldpl = readl(host_stream->pphc_addr + AZX_REG_PPHCLDPL);
942 	host_stream->pphcldpu = readl(host_stream->pphc_addr + AZX_REG_PPHCLDPU);
943 
944 	ret = __avs_dai_fe_hw_free(data->substream, dai);
945 	if (ret < 0)
946 		dev_err(dai->dev, "hw_free FE on suspend failed: %d\n", ret);
947 
948 	return ret;
949 }
950 
951 static int avs_dai_suspend_be_hw_free(struct snd_soc_dai *dai, struct avs_dma_data *data)
952 {
953 	int ret;
954 
955 	ret = dai->driver->ops->hw_free(data->substream, dai);
956 	if (ret < 0)
957 		dev_err(dai->dev, "hw_free BE on suspend failed: %d\n", ret);
958 
959 	return ret;
960 }
961 
962 static int avs_component_pm_op(struct snd_soc_component *component, bool be,
963 			       int (*op)(struct snd_soc_dai *, struct avs_dma_data *))
964 {
965 	struct snd_soc_pcm_runtime *rtd;
966 	struct avs_dma_data *data;
967 	struct snd_soc_dai *dai;
968 	int ret;
969 
970 	for_each_component_dais(component, dai) {
971 		data = snd_soc_dai_dma_data_get_playback(dai);
972 		if (data) {
973 			rtd = snd_soc_substream_to_rtd(data->substream);
974 			if (rtd->dai_link->no_pcm == be && !rtd->dai_link->ignore_suspend) {
975 				ret = op(dai, data);
976 				if (ret < 0) {
977 					__snd_pcm_set_state(data->substream->runtime,
978 							    SNDRV_PCM_STATE_DISCONNECTED);
979 					return ret;
980 				}
981 			}
982 		}
983 
984 		data = snd_soc_dai_dma_data_get_capture(dai);
985 		if (data) {
986 			rtd = snd_soc_substream_to_rtd(data->substream);
987 			if (rtd->dai_link->no_pcm == be && !rtd->dai_link->ignore_suspend) {
988 				ret = op(dai, data);
989 				if (ret < 0) {
990 					__snd_pcm_set_state(data->substream->runtime,
991 							    SNDRV_PCM_STATE_DISCONNECTED);
992 					return ret;
993 				}
994 			}
995 		}
996 	}
997 
998 	return 0;
999 }
1000 
1001 static int avs_component_resume_hw_params(struct snd_soc_component *component, bool be)
1002 {
1003 	return avs_component_pm_op(component, be, &avs_dai_resume_hw_params);
1004 }
1005 
1006 static int avs_component_resume_prepare(struct snd_soc_component *component, bool be)
1007 {
1008 	int (*prepare_cb)(struct snd_soc_dai *dai, struct avs_dma_data *data);
1009 
1010 	if (be)
1011 		prepare_cb = &avs_dai_resume_be_prepare;
1012 	else
1013 		prepare_cb = &avs_dai_resume_fe_prepare;
1014 
1015 	return avs_component_pm_op(component, be, prepare_cb);
1016 }
1017 
1018 static int avs_component_suspend_hw_free(struct snd_soc_component *component, bool be)
1019 {
1020 	int (*hw_free_cb)(struct snd_soc_dai *dai, struct avs_dma_data *data);
1021 
1022 	if (be)
1023 		hw_free_cb = &avs_dai_suspend_be_hw_free;
1024 	else
1025 		hw_free_cb = &avs_dai_suspend_fe_hw_free;
1026 
1027 	return avs_component_pm_op(component, be, hw_free_cb);
1028 }
1029 
1030 static int avs_component_suspend(struct snd_soc_component *component)
1031 {
1032 	int ret;
1033 
1034 	/*
1035 	 * When freeing paths, FEs need to be first as they perform
1036 	 * path unbinding.
1037 	 */
1038 	ret = avs_component_suspend_hw_free(component, false);
1039 	if (ret)
1040 		return ret;
1041 
1042 	return avs_component_suspend_hw_free(component, true);
1043 }
1044 
1045 static int avs_component_resume(struct snd_soc_component *component)
1046 {
1047 	int ret;
1048 
1049 	/*
1050 	 * When creating paths, FEs need to be last as they perform
1051 	 * path binding.
1052 	 */
1053 	ret = avs_component_resume_hw_params(component, true);
1054 	if (ret)
1055 		return ret;
1056 
1057 	ret = avs_component_resume_hw_params(component, false);
1058 	if (ret)
1059 		return ret;
1060 
1061 	/* It is expected that the LINK stream is prepared first. */
1062 	ret = avs_component_resume_prepare(component, true);
1063 	if (ret)
1064 		return ret;
1065 
1066 	return avs_component_resume_prepare(component, false);
1067 }
1068 
1069 static const struct snd_pcm_hardware avs_pcm_hardware = {
1070 	.info			= SNDRV_PCM_INFO_MMAP |
1071 				  SNDRV_PCM_INFO_MMAP_VALID |
1072 				  SNDRV_PCM_INFO_INTERLEAVED |
1073 				  SNDRV_PCM_INFO_PAUSE |
1074 				  SNDRV_PCM_INFO_RESUME |
1075 				  SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
1076 	.formats		= SNDRV_PCM_FMTBIT_S16_LE |
1077 				  SNDRV_PCM_FMTBIT_S32_LE,
1078 	.subformats		= SNDRV_PCM_SUBFMTBIT_MSBITS_20 |
1079 				  SNDRV_PCM_SUBFMTBIT_MSBITS_24 |
1080 				  SNDRV_PCM_SUBFMTBIT_MSBITS_MAX,
1081 	.buffer_bytes_max	= AZX_MAX_BUF_SIZE,
1082 	.period_bytes_min	= 128,
1083 	.period_bytes_max	= AZX_MAX_BUF_SIZE / 2,
1084 	.periods_min		= 2,
1085 	.periods_max		= AZX_MAX_FRAG,
1086 	.fifo_size		= 0,
1087 };
1088 
1089 static int avs_component_open(struct snd_soc_component *component,
1090 			      struct snd_pcm_substream *substream)
1091 {
1092 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1093 
1094 	/* only FE DAI links are handled here */
1095 	if (rtd->dai_link->no_pcm)
1096 		return 0;
1097 
1098 	return snd_soc_set_runtime_hwparams(substream, &avs_pcm_hardware);
1099 }
1100 
1101 static unsigned int avs_hda_stream_dpib_read(struct hdac_ext_stream *stream)
1102 {
1103 	return readl(hdac_stream(stream)->bus->remap_addr + AZX_REG_VS_SDXDPIB_XBASE +
1104 		     (AZX_REG_VS_SDXDPIB_XINTERVAL * hdac_stream(stream)->index));
1105 }
1106 
1107 static snd_pcm_uframes_t
1108 avs_component_pointer(struct snd_soc_component *component, struct snd_pcm_substream *substream)
1109 {
1110 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1111 	struct avs_dma_data *data;
1112 	struct hdac_ext_stream *host_stream;
1113 	unsigned int pos;
1114 
1115 	data = snd_soc_dai_get_dma_data(snd_soc_rtd_to_cpu(rtd, 0), substream);
1116 	if (!data->host_stream)
1117 		return 0;
1118 
1119 	host_stream = data->host_stream;
1120 	pos = avs_hda_stream_dpib_read(host_stream);
1121 
1122 	if (pos >= hdac_stream(host_stream)->bufsize)
1123 		pos = 0;
1124 
1125 	return bytes_to_frames(substream->runtime, pos);
1126 }
1127 
1128 static int avs_component_mmap(struct snd_soc_component *component,
1129 			      struct snd_pcm_substream *substream,
1130 			      struct vm_area_struct *vma)
1131 {
1132 	return snd_pcm_lib_default_mmap(substream, vma);
1133 }
1134 
1135 #define MAX_PREALLOC_SIZE	(32 * 1024 * 1024)
1136 
1137 static int avs_component_construct(struct snd_soc_component *component,
1138 				   struct snd_soc_pcm_runtime *rtd)
1139 {
1140 	struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
1141 	struct snd_pcm *pcm = rtd->pcm;
1142 
1143 	if (dai->driver->playback.channels_min)
1144 		snd_pcm_set_managed_buffer(pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream,
1145 					   SNDRV_DMA_TYPE_DEV_SG, component->dev, 0,
1146 					   MAX_PREALLOC_SIZE);
1147 
1148 	if (dai->driver->capture.channels_min)
1149 		snd_pcm_set_managed_buffer(pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream,
1150 					   SNDRV_DMA_TYPE_DEV_SG, component->dev, 0,
1151 					   MAX_PREALLOC_SIZE);
1152 
1153 	return 0;
1154 }
1155 
1156 static const struct snd_soc_component_driver avs_component_driver = {
1157 	.name			= "avs-pcm",
1158 	.probe			= avs_component_probe,
1159 	.remove			= avs_component_remove,
1160 	.suspend		= avs_component_suspend,
1161 	.resume			= avs_component_resume,
1162 	.open			= avs_component_open,
1163 	.pointer		= avs_component_pointer,
1164 	.mmap			= avs_component_mmap,
1165 	.pcm_construct		= avs_component_construct,
1166 	.module_get_upon_open	= 1, /* increment refcount when a pcm is opened */
1167 	.topology_name_prefix	= "intel/avs",
1168 };
1169 
1170 int avs_soc_component_register(struct device *dev, const char *name,
1171 			       const struct snd_soc_component_driver *drv,
1172 			       struct snd_soc_dai_driver *cpu_dais, int num_cpu_dais)
1173 {
1174 	struct avs_soc_component *acomp;
1175 	int ret;
1176 
1177 	acomp = devm_kzalloc(dev, sizeof(*acomp), GFP_KERNEL);
1178 	if (!acomp)
1179 		return -ENOMEM;
1180 
1181 	ret = snd_soc_component_initialize(&acomp->base, drv, dev);
1182 	if (ret < 0)
1183 		return ret;
1184 
1185 	/* force name change after ASoC is done with its init */
1186 	acomp->base.name = name;
1187 	INIT_LIST_HEAD(&acomp->node);
1188 
1189 	return snd_soc_add_component(&acomp->base, cpu_dais, num_cpu_dais);
1190 }
1191 
1192 static struct snd_soc_dai_driver dmic_cpu_dais[] = {
1193 {
1194 	.name = "DMIC Pin",
1195 	.ops = &avs_dai_nonhda_be_ops,
1196 	.capture = {
1197 		.stream_name	= "DMIC Rx",
1198 		.channels_min	= 1,
1199 		.channels_max	= 4,
1200 		.rates		= SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000,
1201 		.formats	= SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
1202 	},
1203 },
1204 {
1205 	.name = "DMIC WoV Pin",
1206 	.ops = &avs_dai_nonhda_be_ops,
1207 	.capture = {
1208 		.stream_name	= "DMIC WoV Rx",
1209 		.channels_min	= 1,
1210 		.channels_max	= 4,
1211 		.rates		= SNDRV_PCM_RATE_16000,
1212 		.formats	= SNDRV_PCM_FMTBIT_S16_LE,
1213 	},
1214 },
1215 };
1216 
1217 int avs_dmic_platform_register(struct avs_dev *adev, const char *name)
1218 {
1219 	return avs_soc_component_register(adev->dev, name, &avs_component_driver, dmic_cpu_dais,
1220 					  ARRAY_SIZE(dmic_cpu_dais));
1221 }
1222 
1223 static const struct snd_soc_dai_driver i2s_dai_template = {
1224 	.ops = &avs_dai_nonhda_be_ops,
1225 	.playback = {
1226 		.channels_min	= 1,
1227 		.channels_max	= 8,
1228 		.rates		= SNDRV_PCM_RATE_8000_192000 |
1229 				  SNDRV_PCM_RATE_KNOT,
1230 		.formats	= SNDRV_PCM_FMTBIT_S16_LE |
1231 				  SNDRV_PCM_FMTBIT_S32_LE,
1232 		.subformats	= SNDRV_PCM_SUBFMTBIT_MSBITS_20 |
1233 				  SNDRV_PCM_SUBFMTBIT_MSBITS_24 |
1234 				  SNDRV_PCM_SUBFMTBIT_MSBITS_MAX,
1235 	},
1236 	.capture = {
1237 		.channels_min	= 1,
1238 		.channels_max	= 8,
1239 		.rates		= SNDRV_PCM_RATE_8000_192000 |
1240 				  SNDRV_PCM_RATE_KNOT,
1241 		.formats	= SNDRV_PCM_FMTBIT_S16_LE |
1242 				  SNDRV_PCM_FMTBIT_S32_LE,
1243 		.subformats	= SNDRV_PCM_SUBFMTBIT_MSBITS_20 |
1244 				  SNDRV_PCM_SUBFMTBIT_MSBITS_24 |
1245 				  SNDRV_PCM_SUBFMTBIT_MSBITS_MAX,
1246 	},
1247 };
1248 
1249 int avs_i2s_platform_register(struct avs_dev *adev, const char *name, unsigned long port_mask,
1250 			      unsigned long *tdms)
1251 {
1252 	struct snd_soc_dai_driver *cpus, *dai;
1253 	size_t ssp_count, cpu_count;
1254 	int i, j;
1255 
1256 	ssp_count = adev->hw_cfg.i2s_caps.ctrl_count;
1257 
1258 	cpu_count = 0;
1259 	for_each_set_bit(i, &port_mask, ssp_count)
1260 		if (!tdms || test_bit(0, &tdms[i]))
1261 			cpu_count++;
1262 	if (tdms)
1263 		for_each_set_bit(i, &port_mask, ssp_count)
1264 			cpu_count += hweight_long(tdms[i]);
1265 
1266 	cpus = devm_kzalloc(adev->dev, sizeof(*cpus) * cpu_count, GFP_KERNEL);
1267 	if (!cpus)
1268 		return -ENOMEM;
1269 
1270 	dai = cpus;
1271 	for_each_set_bit(i, &port_mask, ssp_count) {
1272 		if (!tdms || test_bit(0, &tdms[i])) {
1273 			memcpy(dai, &i2s_dai_template, sizeof(*dai));
1274 
1275 			dai->name =
1276 				devm_kasprintf(adev->dev, GFP_KERNEL, "SSP%d Pin", i);
1277 			dai->playback.stream_name =
1278 				devm_kasprintf(adev->dev, GFP_KERNEL, "ssp%d Tx", i);
1279 			dai->capture.stream_name =
1280 				devm_kasprintf(adev->dev, GFP_KERNEL, "ssp%d Rx", i);
1281 
1282 			if (!dai->name || !dai->playback.stream_name || !dai->capture.stream_name)
1283 				return -ENOMEM;
1284 			dai++;
1285 		}
1286 	}
1287 
1288 	if (!tdms)
1289 		goto plat_register;
1290 
1291 	for_each_set_bit(i, &port_mask, ssp_count) {
1292 		for_each_set_bit(j, &tdms[i], ssp_count) {
1293 			memcpy(dai, &i2s_dai_template, sizeof(*dai));
1294 
1295 			dai->name =
1296 				devm_kasprintf(adev->dev, GFP_KERNEL, "SSP%d:%d Pin", i, j);
1297 			dai->playback.stream_name =
1298 				devm_kasprintf(adev->dev, GFP_KERNEL, "ssp%d:%d Tx", i, j);
1299 			dai->capture.stream_name =
1300 				devm_kasprintf(adev->dev, GFP_KERNEL, "ssp%d:%d Rx", i, j);
1301 
1302 			if (!dai->name || !dai->playback.stream_name || !dai->capture.stream_name)
1303 				return -ENOMEM;
1304 			dai++;
1305 		}
1306 	}
1307 
1308 plat_register:
1309 	return avs_soc_component_register(adev->dev, name, &avs_component_driver, cpus, cpu_count);
1310 }
1311 
1312 /* HD-Audio CPU DAI template */
1313 static const struct snd_soc_dai_driver hda_cpu_dai = {
1314 	.ops = &avs_dai_hda_be_ops,
1315 	.playback = {
1316 		.channels_min	= 1,
1317 		.channels_max	= 8,
1318 		.rates		= SNDRV_PCM_RATE_8000_192000,
1319 		.formats	= SNDRV_PCM_FMTBIT_S16_LE |
1320 				  SNDRV_PCM_FMTBIT_S32_LE,
1321 		.subformats	= SNDRV_PCM_SUBFMTBIT_MSBITS_20 |
1322 				  SNDRV_PCM_SUBFMTBIT_MSBITS_24 |
1323 				  SNDRV_PCM_SUBFMTBIT_MSBITS_MAX,
1324 	},
1325 	.capture = {
1326 		.channels_min	= 1,
1327 		.channels_max	= 8,
1328 		.rates		= SNDRV_PCM_RATE_8000_192000,
1329 		.formats	= SNDRV_PCM_FMTBIT_S16_LE |
1330 				  SNDRV_PCM_FMTBIT_S32_LE,
1331 		.subformats	= SNDRV_PCM_SUBFMTBIT_MSBITS_20 |
1332 				  SNDRV_PCM_SUBFMTBIT_MSBITS_24 |
1333 				  SNDRV_PCM_SUBFMTBIT_MSBITS_MAX,
1334 	},
1335 };
1336 
1337 static void avs_component_hda_unregister_dais(struct snd_soc_component *component)
1338 {
1339 	struct snd_soc_acpi_mach *mach;
1340 	struct snd_soc_dai *dai, *save;
1341 	struct hda_codec *codec;
1342 	char name[32];
1343 
1344 	mach = dev_get_platdata(component->card->dev);
1345 	codec = mach->pdata;
1346 	sprintf(name, "%s-cpu", dev_name(&codec->core.dev));
1347 
1348 	for_each_component_dais_safe(component, dai, save) {
1349 		int stream;
1350 
1351 		if (!strstr(dai->driver->name, name))
1352 			continue;
1353 
1354 		for_each_pcm_streams(stream)
1355 			snd_soc_dapm_free_widget(snd_soc_dai_get_widget(dai, stream));
1356 
1357 		snd_soc_unregister_dai(dai);
1358 	}
1359 }
1360 
1361 static int avs_component_hda_probe(struct snd_soc_component *component)
1362 {
1363 	struct snd_soc_dapm_context *dapm;
1364 	struct snd_soc_dai_driver *dais;
1365 	struct snd_soc_acpi_mach *mach;
1366 	struct hda_codec *codec;
1367 	struct hda_pcm *pcm;
1368 	const char *cname;
1369 	int pcm_count = 0, ret, i;
1370 
1371 	mach = dev_get_platdata(component->card->dev);
1372 	if (!mach)
1373 		return -EINVAL;
1374 
1375 	codec = mach->pdata;
1376 	if (list_empty(&codec->pcm_list_head))
1377 		return -EINVAL;
1378 	list_for_each_entry(pcm, &codec->pcm_list_head, list)
1379 		pcm_count++;
1380 
1381 	dais = devm_kcalloc(component->dev, pcm_count, sizeof(*dais),
1382 			    GFP_KERNEL);
1383 	if (!dais)
1384 		return -ENOMEM;
1385 
1386 	cname = dev_name(&codec->core.dev);
1387 	dapm = snd_soc_component_get_dapm(component);
1388 	pcm = list_first_entry(&codec->pcm_list_head, struct hda_pcm, list);
1389 
1390 	for (i = 0; i < pcm_count; i++, pcm = list_next_entry(pcm, list)) {
1391 		struct snd_soc_dai *dai;
1392 
1393 		memcpy(&dais[i], &hda_cpu_dai, sizeof(*dais));
1394 		dais[i].id = i;
1395 		dais[i].name = devm_kasprintf(component->dev, GFP_KERNEL,
1396 					      "%s-cpu%d", cname, i);
1397 		if (!dais[i].name) {
1398 			ret = -ENOMEM;
1399 			goto exit;
1400 		}
1401 
1402 		if (pcm->stream[0].substreams) {
1403 			dais[i].playback.stream_name =
1404 				devm_kasprintf(component->dev, GFP_KERNEL,
1405 					       "%s-cpu%d Tx", cname, i);
1406 			if (!dais[i].playback.stream_name) {
1407 				ret = -ENOMEM;
1408 				goto exit;
1409 			}
1410 
1411 			if (!hda_codec_is_display(codec)) {
1412 				dais[i].playback.formats = pcm->stream[0].formats;
1413 				dais[i].playback.subformats = pcm->stream[0].subformats;
1414 				dais[i].playback.rates = pcm->stream[0].rates;
1415 				dais[i].playback.channels_min = pcm->stream[0].channels_min;
1416 				dais[i].playback.channels_max = pcm->stream[0].channels_max;
1417 				dais[i].playback.sig_bits = pcm->stream[0].maxbps;
1418 			}
1419 		}
1420 
1421 		if (pcm->stream[1].substreams) {
1422 			dais[i].capture.stream_name =
1423 				devm_kasprintf(component->dev, GFP_KERNEL,
1424 					       "%s-cpu%d Rx", cname, i);
1425 			if (!dais[i].capture.stream_name) {
1426 				ret = -ENOMEM;
1427 				goto exit;
1428 			}
1429 
1430 			if (!hda_codec_is_display(codec)) {
1431 				dais[i].capture.formats = pcm->stream[1].formats;
1432 				dais[i].capture.subformats = pcm->stream[1].subformats;
1433 				dais[i].capture.rates = pcm->stream[1].rates;
1434 				dais[i].capture.channels_min = pcm->stream[1].channels_min;
1435 				dais[i].capture.channels_max = pcm->stream[1].channels_max;
1436 				dais[i].capture.sig_bits = pcm->stream[1].maxbps;
1437 			}
1438 		}
1439 
1440 		dai = snd_soc_register_dai(component, &dais[i], false);
1441 		if (!dai) {
1442 			dev_err(component->dev, "register dai for %s failed\n",
1443 				pcm->name);
1444 			ret = -EINVAL;
1445 			goto exit;
1446 		}
1447 
1448 		ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
1449 		if (ret < 0) {
1450 			dev_err(component->dev, "create widgets failed: %d\n",
1451 				ret);
1452 			goto exit;
1453 		}
1454 	}
1455 
1456 	ret = avs_component_probe(component);
1457 exit:
1458 	if (ret)
1459 		avs_component_hda_unregister_dais(component);
1460 
1461 	return ret;
1462 }
1463 
1464 static void avs_component_hda_remove(struct snd_soc_component *component)
1465 {
1466 	avs_component_hda_unregister_dais(component);
1467 	avs_component_remove(component);
1468 }
1469 
1470 static int avs_component_hda_open(struct snd_soc_component *component,
1471 				  struct snd_pcm_substream *substream)
1472 {
1473 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1474 	struct hdac_ext_stream *link_stream;
1475 	struct hda_codec *codec;
1476 
1477 	if (!rtd->dai_link->no_pcm) {
1478 		struct snd_pcm_hardware hwparams = avs_pcm_hardware;
1479 		struct snd_soc_pcm_runtime *be;
1480 		struct snd_soc_dpcm *dpcm;
1481 		int dir = substream->stream;
1482 
1483 		/*
1484 		 * Support the DPCM reparenting while still fulfilling expectations of HDAudio
1485 		 * common code - a valid stream pointer at substream->runtime->private_data -
1486 		 * by having all FEs point to the same private data.
1487 		 */
1488 		for_each_dpcm_be(rtd, dir, dpcm) {
1489 			struct snd_pcm_substream *be_substream;
1490 
1491 			be = dpcm->be;
1492 			if (be->dpcm[dir].users == 1)
1493 				break;
1494 
1495 			be_substream = snd_soc_dpcm_get_substream(be, dir);
1496 			substream->runtime->private_data = be_substream->runtime->private_data;
1497 			break;
1498 		}
1499 
1500 		/* RESUME unsupported for de-coupled HD-Audio capture. */
1501 		if (dir == SNDRV_PCM_STREAM_CAPTURE)
1502 			hwparams.info &= ~SNDRV_PCM_INFO_RESUME;
1503 
1504 		return snd_soc_set_runtime_hwparams(substream, &hwparams);
1505 	}
1506 
1507 	codec = dev_to_hda_codec(snd_soc_rtd_to_codec(rtd, 0)->dev);
1508 	link_stream = snd_hdac_ext_stream_assign(&codec->bus->core, substream,
1509 					     HDAC_EXT_STREAM_TYPE_LINK);
1510 	if (!link_stream)
1511 		return -EBUSY;
1512 
1513 	substream->runtime->private_data = link_stream;
1514 	return 0;
1515 }
1516 
1517 static int avs_component_hda_close(struct snd_soc_component *component,
1518 				   struct snd_pcm_substream *substream)
1519 {
1520 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1521 	struct hdac_ext_stream *link_stream;
1522 
1523 	/* only BE DAI links are handled here */
1524 	if (!rtd->dai_link->no_pcm)
1525 		return 0;
1526 
1527 	link_stream = substream->runtime->private_data;
1528 	snd_hdac_ext_stream_release(link_stream, HDAC_EXT_STREAM_TYPE_LINK);
1529 	substream->runtime->private_data = NULL;
1530 
1531 	return 0;
1532 }
1533 
1534 static const struct snd_soc_component_driver avs_hda_component_driver = {
1535 	.name			= "avs-hda-pcm",
1536 	.probe			= avs_component_hda_probe,
1537 	.remove			= avs_component_hda_remove,
1538 	.suspend		= avs_component_suspend,
1539 	.resume			= avs_component_resume,
1540 	.open			= avs_component_hda_open,
1541 	.close			= avs_component_hda_close,
1542 	.pointer		= avs_component_pointer,
1543 	.mmap			= avs_component_mmap,
1544 	.pcm_construct		= avs_component_construct,
1545 	/*
1546 	 * hda platform component's probe() is dependent on
1547 	 * codec->pcm_list_head, it needs to be initialized after codec
1548 	 * component. remove_order is here for completeness sake
1549 	 */
1550 	.probe_order		= SND_SOC_COMP_ORDER_LATE,
1551 	.remove_order		= SND_SOC_COMP_ORDER_EARLY,
1552 	.module_get_upon_open	= 1,
1553 	.topology_name_prefix	= "intel/avs",
1554 };
1555 
1556 int avs_hda_platform_register(struct avs_dev *adev, const char *name)
1557 {
1558 	return avs_soc_component_register(adev->dev, name,
1559 					  &avs_hda_component_driver, NULL, 0);
1560 }
1561