summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default1
-rw-r--r--src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout9
-rw-r--r--src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c32
3 files changed, 42 insertions, 0 deletions
diff --git a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default
index 3cc854d6c3..79ea560466 100644
--- a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default
+++ b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default
@@ -9,3 +9,4 @@ sata_mode=AHCI
usb3_mode=Enable
usb3_drv=Enable
usb3_streams=Enable
+audio_panel_type=HDA
diff --git a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout
index 3053b8d913..86bd35a907 100644
--- a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout
+++ b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout
@@ -51,6 +51,11 @@ entries
#
424 1 e 1 usb3_streams
+# audio_panel_type
+# HD Audio or AC'97
+#
+425 1 e 9 audio_panel_type
+
# -----------------------------------------------------------------
# Sandy/Ivy Bridge MRC Scrambler Seed values
# note: MUST NOT be covered by checksum!
@@ -128,6 +133,10 @@ enumerations
8 2 Auto
8 3 SmartAuto
+# audio_panel_type
+9 0 HDA
+9 1 AC97
+
# -----------------------------------------------------------------
# <startBit[must be byte-aligned]> <endBit[must be byte aligned]>
# <bit where to start storing checksum[must be 16bits-aligned]>
diff --git a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c
index 738ba53569..b553b17a84 100644
--- a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c
+++ b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c
@@ -1,6 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <device/azalia_device.h>
+#include <stdint.h>
+
+#include <option.h>
const u32 cim_verb_data[] = {
0x10ec0887, /* Codec Vendor / Device ID: Realtek */
@@ -34,3 +37,32 @@ const u32 cim_verb_data[] = {
const u32 pc_beep_verbs[0] = {};
AZALIA_ARRAY_SIZES;
+
+void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid)
+{
+ unsigned int ac97 = get_uint_option("audio_panel_type", 0) & 0x1;
+
+ /*
+ * The verbs above are for a HD Audio front panel.
+ * With vendor firmware, if audio front panel type is set as AC97, line out 2
+ * (0x1b) and mic 2 (0x19) pins of ALC887 are configured differently.
+ *
+ * The differences are all in the "Misc" fields of configuration defaults (in byte 2)
+ * as shown below. ALC887 datasheet did not offer details on what those bits
+ * (listed as reserved in HDA spec) are, so we'll have to take their word for it.
+ *
+ * Pin | 0x19 | 0x1b
+ * -----+------+-----
+ * HDA | 1100 | 1100
+ * AC97 | 1001 | 0001
+ */
+
+ const u32 verbs[] = {
+ AZALIA_VERB_12B(0, 0x19, 0x71d, 0x99),
+ AZALIA_VERB_12B(0, 0x1b, 0x71d, 0x41)
+ };
+
+ if ((viddid == 0x10ec0887) && ac97) {
+ azalia_program_verb_table(base, verbs, ARRAY_SIZE(verbs));
+ }
+}