Attention is currently required from: Patrick Rudolph. Angel Pons has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/59118 )
Change subject: haswell/lynxpoint/broadwell: Use `azalia_codec_init()` ......................................................................
haswell/lynxpoint/broadwell: Use `azalia_codec_init()`
Use the functionally-equivalent common Azalia code to get rid of redundant code.
Change-Id: I83cf1a3a1a3854c9283ccac5e254357a32638dda Signed-off-by: Angel Pons th3fanbus@gmail.com --- M src/northbridge/intel/haswell/minihd.c M src/soc/intel/broadwell/minihd.c M src/soc/intel/broadwell/pch/hda.c M src/southbridge/intel/lynxpoint/azalia.c M src/southbridge/intel/lynxpoint/hda_verb.c M src/southbridge/intel/lynxpoint/hda_verb.h 6 files changed, 8 insertions(+), 103 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/18/59118/1
diff --git a/src/northbridge/intel/haswell/minihd.c b/src/northbridge/intel/haswell/minihd.c index 6896464..558f41f 100644 --- a/src/northbridge/intel/haswell/minihd.c +++ b/src/northbridge/intel/haswell/minihd.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h> +#include <device/azalia_device.h> #include <device/device.h> #include <device/pci.h> #include <device/pci_ids.h> @@ -78,8 +79,8 @@ if (codec_mask) { for (i = 3; i >= 0; i--) { if (codec_mask & (1 << i)) - hda_codec_init(base, i, sizeof(minihd_verb_table), - minihd_verb_table); + azalia_codec_init(base, i, minihd_verb_table, + sizeof(minihd_verb_table)); } } } diff --git a/src/soc/intel/broadwell/minihd.c b/src/soc/intel/broadwell/minihd.c index a07d9b1..396c283 100644 --- a/src/soc/intel/broadwell/minihd.c +++ b/src/soc/intel/broadwell/minihd.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h> +#include <device/azalia_device.h> #include <device/device.h> #include <device/pci.h> #include <device/pci_ids.h> @@ -79,8 +80,8 @@ if (codec_mask) { for (i = 3; i >= 0; i--) { if (codec_mask & (1 << i)) - hda_codec_init(base, i, sizeof(minihd_verb_table), - minihd_verb_table); + azalia_codec_init(base, i, minihd_verb_table, + sizeof(minihd_verb_table)); } }
diff --git a/src/soc/intel/broadwell/pch/hda.c b/src/soc/intel/broadwell/pch/hda.c index 2230614..5c5e08f 100644 --- a/src/soc/intel/broadwell/pch/hda.c +++ b/src/soc/intel/broadwell/pch/hda.c @@ -18,9 +18,7 @@ /* Can support up to 4 codecs */ for (i = 3; i >= 0; i--) { if (codec_mask & (1 << i)) - hda_codec_init(base, i, - cim_verb_data_size, - cim_verb_data); + azalia_codec_init(base, i, cim_verb_data, cim_verb_data_size); }
if (pc_beep_verbs_size) diff --git a/src/southbridge/intel/lynxpoint/azalia.c b/src/southbridge/intel/lynxpoint/azalia.c index 8e138f1..9201caa 100644 --- a/src/southbridge/intel/lynxpoint/azalia.c +++ b/src/southbridge/intel/lynxpoint/azalia.c @@ -18,9 +18,7 @@ /* Can support up to 4 codecs */ for (i = 3; i >= 0; i--) { if (codec_mask & (1 << i)) - hda_codec_init(base, i, - cim_verb_data_size, - cim_verb_data); + azalia_codec_init(base, i, cim_verb_data, cim_verb_data_size); }
if (pc_beep_verbs_size) diff --git a/src/southbridge/intel/lynxpoint/hda_verb.c b/src/southbridge/intel/lynxpoint/hda_verb.c index ba30f1d..809ab3b 100644 --- a/src/southbridge/intel/lynxpoint/hda_verb.c +++ b/src/southbridge/intel/lynxpoint/hda_verb.c @@ -46,95 +46,3 @@ printk(BIOS_DEBUG, "HDA: No codec!\n"); return 0; } - -/* - * Wait 50usec for the codec to indicate it is ready. - * No response would imply that the codec is non-operative. - */ -static int hda_wait_for_ready(u8 *base) -{ - /* Use a 50 usec timeout - the Linux kernel uses the same duration */ - int timeout = 50; - - while (timeout--) { - u32 reg32 = read32(base + HDA_ICII_REG); - if (!(reg32 & HDA_ICII_BUSY)) - return 0; - udelay(1); - } - - return -1; -} - -/* - * Wait 50usec for the codec to indicate that it accepted the previous command. - * No response would imply that the code is non-operative. - */ -static int hda_wait_for_valid(u8 *base) -{ - u32 reg32; - /* Use a 50 usec timeout - the Linux kernel uses the same duration */ - int timeout = 50; - - /* Send the verb to the codec */ - reg32 = read32(base + HDA_ICII_REG); - reg32 |= HDA_ICII_BUSY | HDA_ICII_VALID; - write32(base + HDA_ICII_REG, reg32); - - while (timeout--) { - reg32 = read32(base + HDA_ICII_REG); - if ((reg32 & (HDA_ICII_VALID | HDA_ICII_BUSY)) == HDA_ICII_VALID) - return 0; - udelay(1); - } - - return -1; -} - -int hda_codec_init(u8 *base, int addr, int verb_size, const u32 *verb_data) -{ - const u32 *verb; - u32 reg32, size; - int rc; - - printk(BIOS_DEBUG, "HDA: Initializing codec #%d\n", addr); - - if (!verb_size || !verb_data) { - printk(BIOS_DEBUG, "HDA: No verb list!\n"); - return -1; - } - - /* 1 */ - if (hda_wait_for_ready(base) < 0) { - printk(BIOS_DEBUG, " codec not ready.\n"); - return -1; - } - - reg32 = (addr << 28) | 0x000f0000; - write32(base + HDA_IC_REG, reg32); - - if (hda_wait_for_valid(base) < 0) { - printk(BIOS_DEBUG, " codec not valid.\n"); - return -1; - } - - /* 2 */ - reg32 = read32(base + HDA_IR_REG); - printk(BIOS_DEBUG, "HDA: codec viddid: %08x\n", reg32); - - size = azalia_find_verb(verb_data, verb_size, reg32, &verb); - if (!size) { - printk(BIOS_DEBUG, "HDA: No verb table entry found\n"); - return -1; - } - - /* 3 */ - rc = azalia_program_verb_table(base, verb, size); - - if (rc < 0) - printk(BIOS_DEBUG, "HDA: verb not loaded\n"); - else - printk(BIOS_DEBUG, "HDA: verb loaded.\n"); - - return rc; -} diff --git a/src/southbridge/intel/lynxpoint/hda_verb.h b/src/southbridge/intel/lynxpoint/hda_verb.h index 327811f..1d6ef39 100644 --- a/src/southbridge/intel/lynxpoint/hda_verb.h +++ b/src/southbridge/intel/lynxpoint/hda_verb.h @@ -6,6 +6,5 @@ #include <stdint.h>
int hda_codec_detect(u8 *base); -int hda_codec_init(u8 *base, int addr, int verb_size, const u32 *verb_data);
#endif