From f89d69071671a3d32297a50d1b376d4b0cc0308b Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 24 Mar 2026 00:49:47 +0200 Subject: [PATCH] Kernel: HDAudio only probe codecs in STATESTS This removes unnecessary probing that lead to timeouts. Also cap codec address at 14 instead of 15. My test laptop was duplicating codec 0 at address 15 leading to duplicate devices. --- kernel/include/kernel/Audio/HDAudio/Registers.h | 1 + kernel/kernel/Audio/HDAudio/Controller.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel/include/kernel/Audio/HDAudio/Registers.h b/kernel/include/kernel/Audio/HDAudio/Registers.h index e25a7c8e..eab3814b 100644 --- a/kernel/include/kernel/Audio/HDAudio/Registers.h +++ b/kernel/include/kernel/Audio/HDAudio/Registers.h @@ -11,6 +11,7 @@ namespace Kernel::HDAudio VMIN = 0x02, VMAJ = 0x03, GCTL = 0x08, + STATESTS = 0x0E, INTCTL = 0x20, INTSTS = 0x24, diff --git a/kernel/kernel/Audio/HDAudio/Controller.cpp b/kernel/kernel/Audio/HDAudio/Controller.cpp index b3cbb81f..a19714b8 100644 --- a/kernel/kernel/Audio/HDAudio/Controller.cpp +++ b/kernel/kernel/Audio/HDAudio/Controller.cpp @@ -65,8 +65,12 @@ namespace Kernel m_pci_device.enable_interrupt(0, *this); m_bar0->write32(Regs::INTCTL, UINT32_MAX); - for (uint8_t codec_id = 0; codec_id < 0x10; codec_id++) + const uint16_t state_sts = m_bar0->read16(Regs::STATESTS); + for (uint8_t codec_id = 0; codec_id < 15; codec_id++) { + if (!(state_sts & (1 << codec_id))) + continue; + auto codec_or_error = initialize_codec(codec_id); if (codec_or_error.is_error()) continue;