Angel Pons | 182dbde | 2020-04-02 23:49:05 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Duncan Laurie | 0a7c49e | 2013-06-20 12:40:55 -0700 | [diff] [blame] | 2 | |
| 3 | #include <console/console.h> |
Elyes HAOUAS | eaf2ae7 | 2020-08-03 15:33:49 +0200 | [diff] [blame] | 4 | #include <device/azalia_device.h> |
Kyösti Mälkki | 13f6650 | 2019-03-03 08:01:05 +0200 | [diff] [blame] | 5 | #include <device/mmio.h> |
Elyes HAOUAS | a302205 | 2020-08-11 16:47:47 +0200 | [diff] [blame] | 6 | |
Duncan Laurie | 0a7c49e | 2013-06-20 12:40:55 -0700 | [diff] [blame] | 7 | #include "hda_verb.h" |
| 8 | |
Kevin Paul Herbert | bde6d30 | 2014-12-24 18:43:20 -0800 | [diff] [blame] | 9 | int hda_codec_detect(u8 *base) |
Duncan Laurie | 0a7c49e | 2013-06-20 12:40:55 -0700 | [diff] [blame] | 10 | { |
| 11 | u8 reg8; |
| 12 | |
| 13 | /* Set Bit 0 to 1 to exit reset state (BAR + 0x8)[0] */ |
Angel Pons | 7f839f6 | 2020-12-05 19:02:14 +0100 | [diff] [blame] | 14 | if (azalia_exit_reset(base) < 0) |
Duncan Laurie | 0a7c49e | 2013-06-20 12:40:55 -0700 | [diff] [blame] | 15 | goto no_codec; |
| 16 | |
| 17 | /* Write back the value once reset bit is set. */ |
| 18 | write16(base + HDA_GCAP_REG, read16(base + HDA_GCAP_REG)); |
| 19 | |
Angel Pons | f20ef65 | 2021-03-18 17:09:49 +0100 | [diff] [blame] | 20 | /* |
| 21 | * Clear the "State Change Status Register" STATESTS bits |
| 22 | * for each of the "SDIN Stat Change Status Flag" |
| 23 | */ |
| 24 | write8(base + HDA_STATESTS_REG, 0xf); |
| 25 | |
| 26 | /* Turn off the link and poll RESET# bit until it reads back as 0 */ |
| 27 | if (azalia_enter_reset(base) < 0) |
| 28 | goto no_codec; |
| 29 | |
| 30 | /* Turn on the link and poll RESET# bit until it reads back as 1 */ |
| 31 | if (azalia_exit_reset(base) < 0) |
| 32 | goto no_codec; |
| 33 | |
Angel Pons | 90cdf70 | 2020-10-24 23:00:34 +0200 | [diff] [blame] | 34 | /* Read in Codec location (BAR + 0xe)[2..0] */ |
Duncan Laurie | 0a7c49e | 2013-06-20 12:40:55 -0700 | [diff] [blame] | 35 | reg8 = read8(base + HDA_STATESTS_REG); |
| 36 | reg8 &= 0x0f; |
| 37 | if (!reg8) |
| 38 | goto no_codec; |
| 39 | |
| 40 | return reg8; |
| 41 | |
| 42 | no_codec: |
Angel Pons | 2e0053b | 2020-12-05 19:06:55 +0100 | [diff] [blame] | 43 | /* Codec not found, put HDA back in reset */ |
| 44 | azalia_enter_reset(base); |
Duncan Laurie | 0a7c49e | 2013-06-20 12:40:55 -0700 | [diff] [blame] | 45 | printk(BIOS_DEBUG, "HDA: No codec!\n"); |
| 46 | return 0; |
| 47 | } |