Lines Matching full:audio

3  * ZynqMP DisplayPort Subsystem Driver - Audio support
95 static void zynqmp_dp_audio_write(struct zynqmp_dpsub_audio *audio, int reg, in zynqmp_dp_audio_write() argument
98 writel(val, audio->base + reg); in zynqmp_dp_audio_write()
108 struct zynqmp_dpsub_audio *audio = dpsub->audio; in dp_dai_hw_params() local
119 guard(mutex)(&audio->enable_lock); in dp_dai_hw_params()
121 if (audio->enabled_streams && audio->current_rate != sample_rate) { in dp_dai_hw_params()
127 if (audio->enabled_streams > 0) { in dp_dai_hw_params()
129 audio->enabled_streams++; in dp_dai_hw_params()
133 audio->current_rate = sample_rate; in dp_dai_hw_params()
158 zynqmp_dp_audio_write(audio, ZYNQMP_DISP_AUD_MIXER_VOLUME, in dp_dai_hw_params()
159 audio->volumes[0] | (audio->volumes[1] << 16)); in dp_dai_hw_params()
161 /* Clear the audio soft reset register as it's an non-reset flop. */ in dp_dai_hw_params()
162 zynqmp_dp_audio_write(audio, ZYNQMP_DISP_AUD_SOFT_RESET, 0); in dp_dai_hw_params()
164 /* Only 2 channel audio is supported now */ in dp_dai_hw_params()
184 zynqmp_dp_audio_write(audio, ZYNQMP_DISP_AUD_CH_STATUS(i), v); in dp_dai_hw_params()
189 audio->enabled_streams++; in dp_dai_hw_params()
200 struct zynqmp_dpsub_audio *audio = dpsub->audio; in dp_dai_hw_free() local
202 guard(mutex)(&audio->enable_lock); in dp_dai_hw_free()
205 if (audio->enabled_streams > 1) { in dp_dai_hw_free()
206 audio->enabled_streams--; in dp_dai_hw_free()
215 * Reset doesn't work. If we assert reset between audio stop and start, in dp_dai_hw_free()
216 * the audio won't start anymore. Probably we are missing writing in dp_dai_hw_free()
217 * some audio related registers. A/B buf? in dp_dai_hw_free()
220 zynqmp_disp_audio_write(audio, ZYNQMP_DISP_AUD_SOFT_RESET, in dp_dai_hw_free()
226 audio->current_rate = 0; in dp_dai_hw_free()
227 audio->enabled_streams--; in dp_dai_hw_free()
267 struct zynqmp_dpsub_audio *audio = dpsub->audio; in zynqmp_dp_dai_read() local
269 return audio->volumes[reg]; in zynqmp_dp_dai_read()
276 struct zynqmp_dpsub_audio *audio = dpsub->audio; in zynqmp_dp_dai_write() local
278 guard(mutex)(&audio->enable_lock); in zynqmp_dp_dai_write()
280 audio->volumes[reg] = val; in zynqmp_dp_dai_write()
282 if (audio->enabled_streams) in zynqmp_dp_dai_write()
283 zynqmp_dp_audio_write(audio, ZYNQMP_DISP_AUD_MIXER_VOLUME, in zynqmp_dp_dai_write()
284 audio->volumes[0] | in zynqmp_dp_dai_write()
285 (audio->volumes[1] << 16)); in zynqmp_dp_dai_write()
304 struct zynqmp_dpsub_audio *audio; in zynqmp_audio_init() local
312 audio = devm_kzalloc(dev, sizeof(*audio), GFP_KERNEL); in zynqmp_audio_init()
313 if (!audio) in zynqmp_audio_init()
316 dpsub->audio = audio; in zynqmp_audio_init()
318 mutex_init(&audio->enable_lock); in zynqmp_audio_init()
321 audio->volumes[0] = 0x2000; in zynqmp_audio_init()
322 audio->volumes[1] = 0x2000; in zynqmp_audio_init()
324 audio->dai_name = devm_kasprintf(dev, GFP_KERNEL, in zynqmp_audio_init()
326 if (!audio->dai_name) in zynqmp_audio_init()
330 audio->link_names[i] = devm_kasprintf(dev, GFP_KERNEL, in zynqmp_audio_init()
332 audio->pcm_names[i] = devm_kasprintf(dev, GFP_KERNEL, in zynqmp_audio_init()
334 if (!audio->link_names[i] || !audio->pcm_names[i]) in zynqmp_audio_init()
338 audio->base = devm_platform_ioremap_resource_byname(pdev, "aud"); in zynqmp_audio_init()
339 if (IS_ERR(audio->base)) in zynqmp_audio_init()
340 return PTR_ERR(audio->base); in zynqmp_audio_init()
344 audio->dai_driver = (struct snd_soc_dai_driver) { in zynqmp_audio_init()
345 .name = audio->dai_name, in zynqmp_audio_init()
356 &audio->dai_driver, 1); in zynqmp_audio_init()
366 &audio->pcm_configs[i]; in zynqmp_audio_init()
369 .name = audio->pcm_names[i], in zynqmp_audio_init()
385 card = &audio->card; in zynqmp_audio_init()
392 card->dai_link = audio->links; in zynqmp_audio_init()
399 link->name = audio->link_names[i]; in zynqmp_audio_init()
400 link->stream_name = audio->link_names[i]; in zynqmp_audio_init()
402 link->cpus = &audio->components[i].cpu; in zynqmp_audio_init()
404 link->cpus[0].dai_name = audio->dai_name; in zynqmp_audio_init()
406 link->codecs = &audio->components[i].codec; in zynqmp_audio_init()
411 link->platforms = &audio->components[i].platform; in zynqmp_audio_init()
413 link->platforms[0].name = audio->pcm_names[i]; in zynqmp_audio_init()
425 * As older dtbs may not have the audio channel dmas defined, in zynqmp_audio_init()
427 * mark the audio as disabled. in zynqmp_audio_init()
429 dev_err(dev, "Failed to register sound card, disabling audio support\n"); in zynqmp_audio_init()
431 devm_kfree(dev, audio); in zynqmp_audio_init()
432 dpsub->audio = NULL; in zynqmp_audio_init()
442 struct zynqmp_dpsub_audio *audio = dpsub->audio; in zynqmp_audio_uninit() local
444 if (!audio) in zynqmp_audio_uninit()
450 mutex_destroy(&audio->enable_lock); in zynqmp_audio_uninit()