1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #ifndef DEVICE_AZALIA_H 4 #define DEVICE_AZALIA_H 5 6 #include <acpi/acpi.h> 7 #include <device/device.h> 8 #include <device/mmio.h> 9 #include <stdint.h> 10 11 #define HDA_GCAP_REG 0x00 12 #define HDA_GCTL_REG 0x08 13 #define HDA_GCTL_CRST (1 << 0) 14 #define HDA_STATESTS_REG 0x0e 15 #define HDA_IC_REG 0x60 16 #define HDA_IR_REG 0x64 17 #define HDA_ICII_REG 0x68 18 #define HDA_ICII_BUSY (1 << 0) 19 #define HDA_ICII_VALID (1 << 1) 20 21 #define AZALIA_MAX_CODECS 15 22 23 int azalia_set_bits(void *port, u32 mask, u32 val); 24 int azalia_enter_reset(u8 *base); 25 int azalia_exit_reset(u8 *base); 26 u32 azalia_find_verb(const u32 *verb_table, u32 verb_table_bytes, u32 viddid, const u32 **verb); 27 int azalia_program_verb_table(u8 *base, const u32 *verbs, u32 verb_size); 28 void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes); 29 void azalia_codecs_init(u8 *base, u16 codec_mask); 30 void azalia_audio_init(struct device *dev); 31 extern struct device_operations default_azalia_audio_ops; 32 33 /* Optional hook to program codec settings that are only known at runtime */ 34 void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid); 35 36 extern const u32 cim_verb_data[]; 37 extern const u32 cim_verb_data_size; 38 extern const u32 pc_beep_verbs[]; 39 extern const u32 pc_beep_verbs_size; 40 41 /* 42 * The tables found in this file are derived from the Intel High Definition 43 * Audio Specification Revision 1.0a, published 17 June 2010 44 * 45 * 7.3.3.31 Configuration Default (page 177) 46 */ 47 enum azalia_pin_connection { 48 AZALIA_JACK = 0x0, 49 AZALIA_NC = 0x1, 50 AZALIA_INTEGRATED = 0x2, 51 AZALIA_JACK_AND_INTEGRATED = 0x3, 52 }; 53 54 enum azalia_pin_location_gross { 55 AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x00, 56 AZALIA_INTERNAL = 0x10, 57 AZALIA_SEPARATE_CHASSIS = 0x20, 58 AZALIA_LOCATION_OTHER = 0x30, 59 }; 60 61 enum azalia_pin_location_geometric { 62 AZALIA_GEOLOCATION_NA = 0x0, 63 AZALIA_REAR = 0x1, 64 AZALIA_FRONT = 0x2, 65 AZALIA_LEFT = 0x3, 66 AZALIA_RIGHT = 0x4, 67 AZALIA_TOP = 0x5, 68 AZALIA_BOTTOM = 0x6, 69 AZALIA_SPECIAL7 = 0x7, 70 AZALIA_SPECIAL8 = 0x8, 71 AZALIA_SPECIAL9 = 0x9, 72 }; 73 74 enum azalia_pin_location_special { 75 AZALIA_REAR_PANEL = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL7, 76 AZALIA_DRIVE_BAY = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL8, 77 AZALIA_RISER = AZALIA_INTERNAL | AZALIA_SPECIAL7, 78 AZALIA_DIGITAL_DISPLAY = AZALIA_INTERNAL | AZALIA_SPECIAL8, 79 AZALIA_ATAPI = AZALIA_INTERNAL | AZALIA_SPECIAL9, 80 AZALIA_MOBILE_LID_INSIDE = AZALIA_LOCATION_OTHER | AZALIA_SPECIAL7, 81 AZALIA_MOBILE_LID_OUTSIDE = AZALIA_LOCATION_OTHER | AZALIA_SPECIAL8, 82 }; 83 84 enum azalia_pin_device { 85 AZALIA_LINE_OUT = 0x0, 86 AZALIA_SPEAKER = 0x1, 87 AZALIA_HP_OUT = 0x2, 88 AZALIA_CD = 0x3, 89 AZALIA_SPDIF_OUT = 0x4, 90 AZALIA_DIGITAL_OTHER_OUT = 0x5, 91 AZALIA_MODEM_LINE_SIDE = 0x6, 92 AZALIA_MODEM_HANDSET_SIDE = 0x7, 93 AZALIA_LINE_IN = 0x8, 94 AZALIA_AUX = 0x9, 95 AZALIA_MIC_IN = 0xa, 96 AZALIA_TELEPHONY = 0xb, 97 AZALIA_SPDIF_IN = 0xc, 98 AZALIA_DIGITAL_OTHER_IN = 0xd, 99 AZALIA_DEVICE_OTHER = 0xf, 100 }; 101 102 enum azalia_pin_type { 103 AZALIA_TYPE_UNKNOWN = 0x0, 104 AZALIA_STEREO_MONO_1_8 = 0x1, 105 AZALIA_STEREO_MONO_1_4 = 0x2, 106 AZALIA_ATAPI_INTERNAL = 0x3, 107 AZALIA_RCA = 0x4, 108 AZALIA_OPTICAL = 0x5, 109 AZALIA_OTHER_DIGITAL = 0x6, 110 AZALIA_OTHER_ANALOG = 0x7, 111 AZALIA_MULTICHANNEL_ANALOG = 0x8, 112 AZALIA_XLR = 0x9, 113 AZALIA_RJ_11 = 0xa, 114 AZALIA_COMBINATION = 0xb, 115 AZALIA_TYPE_OTHER = 0xf, 116 }; 117 118 enum azalia_pin_color { 119 AZALIA_COLOR_UNKNOWN = 0x0, 120 AZALIA_BLACK = 0x1, 121 AZALIA_GREY = 0x2, 122 AZALIA_BLUE = 0x3, 123 AZALIA_GREEN = 0x4, 124 AZALIA_RED = 0x5, 125 AZALIA_ORANGE = 0x6, 126 AZALIA_YELLOW = 0x7, 127 AZALIA_PURPLE = 0x8, 128 AZALIA_PINK = 0x9, 129 AZALIA_WHITE = 0xe, 130 AZALIA_COLOR_OTHER = 0xf, 131 }; 132 133 enum azalia_pin_misc { 134 AZALIA_JACK_PRESENCE_DETECT = 0x0, 135 AZALIA_NO_JACK_PRESENCE_DETECT = 0x1, 136 }; 137 138 #define AZALIA_PIN_DESC(conn, location, dev, type, color, misc, association, sequence) \ 139 ((((conn) << 30) & 0xc0000000) | \ 140 (((location) << 24) & 0x3f000000) | \ 141 (((dev) << 20) & 0x00f00000) | \ 142 (((type) << 16) & 0x000f0000) | \ 143 (((color) << 12) & 0x0000f000) | \ 144 (((misc) << 8) & 0x00000f00) | \ 145 (((association) << 4) & 0x000000f0) | \ 146 (((sequence) << 0) & 0x0000000f)) 147 148 #define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size = \ 149 ARRAY_SIZE(pc_beep_verbs); \ 150 const u32 cim_verb_data_size = sizeof(cim_verb_data) 151 152 #define AZALIA_VERB_12B(codec, pin, verb, val) \ 153 ((codec) << 28 | (pin) << 20 | (verb) << 8 | (val)) 154 155 #define AZALIA_PIN_CFG(codec, pin, val) \ 156 AZALIA_VERB_12B(codec, pin, 0x71c, ((val) >> 0) & 0xff), \ 157 AZALIA_VERB_12B(codec, pin, 0x71d, ((val) >> 8) & 0xff), \ 158 AZALIA_VERB_12B(codec, pin, 0x71e, ((val) >> 16) & 0xff), \ 159 AZALIA_VERB_12B(codec, pin, 0x71f, ((val) >> 24) & 0xff) 160 161 #define AZALIA_PIN_CFG_NC(n) (0x411111f0 | ((n) & 0xf)) 162 163 #define AZALIA_RESET(pin) \ 164 AZALIA_VERB_12B(0, pin, 0x7ff, 0), \ 165 AZALIA_VERB_12B(0, pin, 0x7ff, 0), \ 166 AZALIA_VERB_12B(0, pin, 0x7ff, 0), \ 167 AZALIA_VERB_12B(0, pin, 0x7ff, 0) 168 169 #define AZALIA_SUBVENDOR(codec, val) \ 170 AZALIA_VERB_12B(codec, 1, 0x720, ((val) >> 0) & 0xff), \ 171 AZALIA_VERB_12B(codec, 1, 0x721, ((val) >> 8) & 0xff), \ 172 AZALIA_VERB_12B(codec, 1, 0x722, ((val) >> 16) & 0xff), \ 173 AZALIA_VERB_12B(codec, 1, 0x723, ((val) >> 24) & 0xff) 174 175 #endif /* DEVICE_AZALIA_H */ 176