hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c
....@@ -1,9 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * DesignWare HDMI audio driver
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
74 *
85 * Written and tested against the Designware HDMI Tx found in iMX6.
96 */
....@@ -66,10 +63,6 @@
6663 HDMI_REVISION_ID = 0x0001,
6764 HDMI_IH_AHBDMAAUD_STAT0 = 0x0109,
6865 HDMI_IH_MUTE_AHBDMAAUD_STAT0 = 0x0189,
69
- HDMI_FC_AUDICONF2 = 0x1027,
70
- HDMI_FC_AUDSCONF = 0x1063,
71
- HDMI_FC_AUDSCONF_LAYOUT1 = 1 << 0,
72
- HDMI_FC_AUDSCONF_LAYOUT0 = 0 << 0,
7366 HDMI_AHB_DMA_CONF0 = 0x3600,
7467 HDMI_AHB_DMA_START = 0x3601,
7568 HDMI_AHB_DMA_STOP = 0x3602,
....@@ -298,7 +291,7 @@
298291 return IRQ_HANDLED;
299292 }
300293
301
-static struct snd_pcm_hardware dw_hdmi_hw = {
294
+static const struct snd_pcm_hardware dw_hdmi_hw = {
302295 .info = SNDRV_PCM_INFO_INTERLEAVED |
303296 SNDRV_PCM_INFO_BLOCK_TRANSFER |
304297 SNDRV_PCM_INFO_MMAP |
....@@ -327,13 +320,17 @@
327320 struct snd_pcm_runtime *runtime = substream->runtime;
328321 struct snd_dw_hdmi *dw = substream->private_data;
329322 void __iomem *base = dw->data.base;
323
+ u8 *eld;
330324 int ret;
331325
332326 runtime->hw = dw_hdmi_hw;
333327
334
- ret = snd_pcm_hw_constraint_eld(runtime, dw->data.eld);
335
- if (ret < 0)
336
- return ret;
328
+ eld = dw->data.get_eld(dw->data.hdmi);
329
+ if (eld) {
330
+ ret = snd_pcm_hw_constraint_eld(runtime, eld);
331
+ if (ret < 0)
332
+ return ret;
333
+ }
337334
338335 ret = snd_pcm_limit_hw_rates(runtime);
339336 if (ret < 0)
....@@ -406,7 +403,7 @@
406403 {
407404 struct snd_pcm_runtime *runtime = substream->runtime;
408405 struct snd_dw_hdmi *dw = substream->private_data;
409
- u8 threshold, conf0, conf1, layout, ca;
406
+ u8 threshold, conf0, conf1, ca;
410407
411408 /* Setup as per 3.0.5 FSL 4.1.0 BSP */
412409 switch (dw->revision) {
....@@ -437,20 +434,12 @@
437434 conf1 = default_hdmi_channel_config[runtime->channels - 2].conf1;
438435 ca = default_hdmi_channel_config[runtime->channels - 2].ca;
439436
440
- /*
441
- * For >2 channel PCM audio, we need to select layout 1
442
- * and set an appropriate channel map.
443
- */
444
- if (runtime->channels > 2)
445
- layout = HDMI_FC_AUDSCONF_LAYOUT1;
446
- else
447
- layout = HDMI_FC_AUDSCONF_LAYOUT0;
448
-
449437 writeb_relaxed(threshold, dw->data.base + HDMI_AHB_DMA_THRSLD);
450438 writeb_relaxed(conf0, dw->data.base + HDMI_AHB_DMA_CONF0);
451439 writeb_relaxed(conf1, dw->data.base + HDMI_AHB_DMA_CONF1);
452
- writeb_relaxed(layout, dw->data.base + HDMI_FC_AUDSCONF);
453
- writeb_relaxed(ca, dw->data.base + HDMI_FC_AUDICONF2);
440
+
441
+ dw_hdmi_set_channel_count(dw->data.hdmi, runtime->channels);
442
+ dw_hdmi_set_channel_allocation(dw->data.hdmi, ca);
454443
455444 switch (runtime->format) {
456445 case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
....@@ -614,7 +603,6 @@
614603 struct snd_dw_hdmi *dw = dev_get_drvdata(dev);
615604
616605 snd_power_change_state(dw->card, SNDRV_CTL_POWER_D3cold);
617
- snd_pcm_suspend_all(dw->pcm);
618606
619607 return 0;
620608 }
....@@ -646,7 +634,7 @@
646634
647635 module_platform_driver(snd_dw_hdmi_driver);
648636
649
-MODULE_AUTHOR("Russell King <rmk+kernel@arm.linux.org.uk>");
637
+MODULE_AUTHOR("Russell King <rmk+kernel@armlinux.org.uk>");
650638 MODULE_DESCRIPTION("Synopsis Designware HDMI AHB ALSA interface");
651639 MODULE_LICENSE("GPL v2");
652640 MODULE_ALIAS("platform:" DRIVER_NAME);