ALSA: HDA: Add Zhaoxin HDMI Controller and Codec support
authorTony W Wang-oc <TonyWWang-oc@zhaoxin.com>
Wed, 23 Apr 2025 10:28:51 +0000 (18:28 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 23 Apr 2025 11:47:40 +0000 (13:47 +0200)
Add newer Zhaoxin HD Audio PCI IDs, and HDMI codec vendor IDs.

Because Zhaoxin hardware limitation, set BDL position to 128 to
increase interrupt interval.

To fix response write request not synced to memory when handle
HDAC interrupt, set bus->polling_mode = 1.

Signed-off-by: Joanne Bao <JoanneBao@glenfly.com>
Signed-off-by: Tony W Wang-oc <TonyWWang-oc@zhaoxin.com>
Link: https://patch.msgid.link/20250423102851.57997-1-TonyWWang-oc@zhaoxin.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_hdmi.c

index 9756017930b538ed2e3dac0124618944f6ca7fcc..d7651a75c6299810a971e6b92e3f90575c0a1217 100644 (file)
@@ -240,6 +240,7 @@ enum {
        AZX_DRIVER_CTHDA,
        AZX_DRIVER_CMEDIA,
        AZX_DRIVER_ZHAOXIN,
+       AZX_DRIVER_ZHAOXINHDMI,
        AZX_DRIVER_LOONGSON,
        AZX_DRIVER_GENERIC,
        AZX_NUM_DRIVERS, /* keep this as last entry */
@@ -355,6 +356,7 @@ static const char * const driver_short_names[] = {
        [AZX_DRIVER_CTHDA] = "HDA Creative",
        [AZX_DRIVER_CMEDIA] = "HDA C-Media",
        [AZX_DRIVER_ZHAOXIN] = "HDA Zhaoxin",
+       [AZX_DRIVER_ZHAOXINHDMI] = "HDA Zhaoxin HDMI",
        [AZX_DRIVER_LOONGSON] = "HDA Loongson",
        [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
 };
@@ -1750,6 +1752,8 @@ static int default_bdl_pos_adj(struct azx *chip)
        case AZX_DRIVER_ICH:
        case AZX_DRIVER_PCH:
                return 1;
+       case AZX_DRIVER_ZHAOXINHDMI:
+               return 128;
        default:
                return 32;
        }
@@ -1877,6 +1881,9 @@ static int azx_first_init(struct azx *chip)
                        chip->jackpoll_interval = msecs_to_jiffies(1500);
        }
 
+       if (chip->driver_type == AZX_DRIVER_ZHAOXINHDMI)
+               bus->polling_mode = 1;
+
        bus->remap_addr = pcim_iomap_region(pci, 0, "ICH HD audio");
        if (IS_ERR(bus->remap_addr))
                return PTR_ERR(bus->remap_addr);
@@ -1973,6 +1980,7 @@ static int azx_first_init(struct azx *chip)
                        chip->capture_streams = ATIHDMI_NUM_CAPTURE;
                        break;
                case AZX_DRIVER_GFHDMI:
+               case AZX_DRIVER_ZHAOXINHDMI:
                case AZX_DRIVER_GENERIC:
                default:
                        chip->playback_streams = ICH6_NUM_PLAYBACK;
@@ -2781,6 +2789,21 @@ static const struct pci_device_id azx_ids[] = {
          .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
        /* Zhaoxin */
        { PCI_VDEVICE(ZHAOXIN, 0x3288), .driver_data = AZX_DRIVER_ZHAOXIN },
+       { PCI_VDEVICE(ZHAOXIN, 0x9141),
+        .driver_data = AZX_DRIVER_ZHAOXINHDMI | AZX_DCAPS_POSFIX_LPIB |
+        AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT },
+       { PCI_VDEVICE(ZHAOXIN, 0x9142),
+        .driver_data = AZX_DRIVER_ZHAOXINHDMI | AZX_DCAPS_POSFIX_LPIB |
+        AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT },
+       { PCI_VDEVICE(ZHAOXIN, 0x9144),
+        .driver_data = AZX_DRIVER_ZHAOXINHDMI | AZX_DCAPS_POSFIX_LPIB |
+        AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT },
+       { PCI_VDEVICE(ZHAOXIN, 0x9145),
+        .driver_data = AZX_DRIVER_ZHAOXINHDMI | AZX_DCAPS_POSFIX_LPIB |
+        AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT },
+       { PCI_VDEVICE(ZHAOXIN, 0x9146),
+        .driver_data = AZX_DRIVER_ZHAOXINHDMI | AZX_DCAPS_POSFIX_LPIB |
+        AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT },
        /* Loongson HDAudio*/
        { PCI_VDEVICE(LOONGSON, PCI_DEVICE_ID_LOONGSON_HDA),
          .driver_data = AZX_DRIVER_LOONGSON | AZX_DCAPS_NO_TCSEL },
index 7167989a8d86a87daf2549c0d2b1d387abdcad51..a3a53e63a51aca510e1d1c60f7c3f92637be5142 100644 (file)
@@ -4610,6 +4610,17 @@ HDA_CODEC_ENTRY(0x11069f80, "VX900 HDMI/DP",     patch_via_hdmi),
 HDA_CODEC_ENTRY(0x11069f81, "VX900 HDMI/DP",   patch_via_hdmi),
 HDA_CODEC_ENTRY(0x11069f84, "VX11 HDMI/DP",    patch_generic_hdmi),
 HDA_CODEC_ENTRY(0x11069f85, "VX11 HDMI/DP",    patch_generic_hdmi),
+HDA_CODEC_ENTRY(0x1d179f86, "ZX-100S HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f87, "ZX-100S HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f88, "KX-5000 HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f89, "KX-5000 HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f8a, "KX-6000 HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f8b, "KX-6000 HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f8c, "KX-6000G HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f8d, "KX-6000G HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f8e, "KX-7000 HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f8f, "KX-7000 HDMI/DP", patch_gf_hdmi),
+HDA_CODEC_ENTRY(0x1d179f90, "KX-7000 HDMI/DP", patch_gf_hdmi),
 HDA_CODEC_ENTRY(0x80860054, "IbexPeak HDMI",   patch_i915_cpt_hdmi),
 HDA_CODEC_ENTRY(0x80862800, "Geminilake HDMI", patch_i915_glk_hdmi),
 HDA_CODEC_ENTRY(0x80862801, "Bearlake HDMI",   patch_generic_hdmi),