1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <console/console.h>
4 #include <device/azalia_device.h>
5 #include <device/mmio.h>
9 int hda_codec_detect(u8
*base
)
13 /* Set Bit 0 to 1 to exit reset state (BAR + 0x8)[0] */
14 if (azalia_exit_reset(base
) < 0)
17 /* Write back the value once reset bit is set. */
18 write16(base
+ HDA_GCAP_REG
, read16(base
+ HDA_GCAP_REG
));
21 * Clear the "State Change Status Register" STATESTS bits
22 * for each of the "SDIN Stat Change Status Flag"
24 write8(base
+ HDA_STATESTS_REG
, 0xf);
26 /* Turn off the link and poll RESET# bit until it reads back as 0 */
27 if (azalia_enter_reset(base
) < 0)
30 /* Turn on the link and poll RESET# bit until it reads back as 1 */
31 if (azalia_exit_reset(base
) < 0)
34 /* Read in Codec location (BAR + 0xe)[2..0] */
35 reg8
= read8(base
+ HDA_STATESTS_REG
);
43 /* Codec not found, put HDA back in reset */
44 azalia_enter_reset(base
);
45 printk(BIOS_DEBUG
, "HDA: No codec!\n");