blob: 59e7ea2af3ff1cc8b94a1f050ba33382f817250d [file] [log] [blame]
Angel Pons32859fc2020-04-02 23:48:27 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Andrew Wub7bb70d2013-08-12 20:07:47 +08002
3#ifndef DEVICE_AZALIA_H
4#define DEVICE_AZALIA_H
5
Furquan Shaikh76cedd22020-05-02 10:24:23 -07006#include <acpi/acpi.h>
Andrew Wub7bb70d2013-08-12 20:07:47 +08007#include <device/device.h>
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +09008#include <device/mmio.h>
Elyes HAOUAS6d097b82020-08-03 15:42:23 +02009#include <stdint.h>
Andrew Wub7bb70d2013-08-12 20:07:47 +080010
Elyes HAOUAS899d5bde2020-08-03 15:00:46 +020011#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
Nicholas Sudsgaard516d05f2024-02-02 18:21:34 +090021#define AZALIA_MAX_CODECS 15
22
Angel Pons61dd8362020-12-05 18:02:32 +010023int azalia_set_bits(void *port, u32 mask, u32 val);
Angel Pons49190282020-12-05 18:52:38 +010024int azalia_enter_reset(u8 *base);
25int azalia_exit_reset(u8 *base);
Angel Ponsd425ddd2020-12-05 18:22:58 +010026u32 azalia_find_verb(const u32 *verb_table, u32 verb_table_bytes, u32 viddid, const u32 **verb);
Angel Pons44c431e2021-02-08 12:37:56 +010027int azalia_program_verb_table(u8 *base, const u32 *verbs, u32 verb_size);
Angel Pons86dfd3c2021-11-10 17:58:12 +010028void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes);
Angel Ponsaae6b552021-11-10 18:10:38 +010029void azalia_codecs_init(u8 *base, u16 codec_mask);
Andrew Wub7bb70d2013-08-12 20:07:47 +080030void azalia_audio_init(struct device *dev);
31extern struct device_operations default_azalia_audio_ops;
32
Angel Ponsd6d71ce2021-02-08 12:47:29 +010033/* Optional hook to program codec settings that are only known at runtime */
34void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid);
35
Vladimir Serbinenko75c83872014-09-05 01:01:31 +020036extern const u32 cim_verb_data[];
37extern const u32 cim_verb_data_size;
38extern const u32 pc_beep_verbs[];
39extern const u32 pc_beep_verbs_size;
40
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +090041/*
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 */
Patrick Rudolph9a521d72020-03-20 10:07:53 +010047enum azalia_pin_connection {
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +090048 AZALIA_JACK = 0x0,
49 AZALIA_NC = 0x1,
50 AZALIA_INTEGRATED = 0x2,
51 AZALIA_JACK_AND_INTEGRATED = 0x3,
Patrick Rudolph9a521d72020-03-20 10:07:53 +010052};
53
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +090054enum azalia_pin_location_gross {
Nicholas Sudsgaard4e8bbc12024-02-25 09:32:33 +090055 AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x00,
56 AZALIA_INTERNAL = 0x10,
57 AZALIA_SEPARATE_CHASSIS = 0x20,
58 AZALIA_LOCATION_OTHER = 0x30,
Patrick Rudolph9a521d72020-03-20 10:07:53 +010059};
60
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +090061enum 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,
Patrick Rudolph9a521d72020-03-20 10:07:53 +010072};
73
Nicholas Sudsgaard4e8bbc12024-02-25 09:32:33 +090074enum 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
Patrick Rudolph9a521d72020-03-20 10:07:53 +010084enum azalia_pin_device {
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +090085 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,
Patrick Rudolph9a521d72020-03-20 10:07:53 +0100100};
101
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +0900102enum 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,
Patrick Rudolph9a521d72020-03-20 10:07:53 +0100116};
117
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +0900118enum 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,
Patrick Rudolph9a521d72020-03-20 10:07:53 +0100131};
132
Nicholas Chin463a7bc2024-01-15 10:26:11 -0700133enum azalia_pin_misc {
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +0900134 AZALIA_JACK_PRESENCE_DETECT = 0x0,
135 AZALIA_NO_JACK_PRESENCE_DETECT = 0x1,
Nicholas Chin463a7bc2024-01-15 10:26:11 -0700136};
137
Nicholas Sudsgaard4e8bbc12024-02-25 09:32:33 +0900138#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) | \
Nicholas Sudsgaard4a62b8a2024-02-22 13:33:15 +0900146 (((sequence) << 0) & 0x0000000f))
Patrick Rudolph9a521d72020-03-20 10:07:53 +0100147
Lee Leahy6a566d72017-03-07 17:45:12 -0800148#define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size = \
149 ARRAY_SIZE(pc_beep_verbs); \
Vladimir Serbinenko75c83872014-09-05 01:01:31 +0200150 const u32 cim_verb_data_size = sizeof(cim_verb_data)
Vladimir Serbinenko6a3a8ce2014-08-17 23:48:42 +0200151
Angel Pons05c4dcb2021-11-03 12:18:31 +0100152#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)
Vladimir Serbinenko8f0da582014-09-04 21:34:13 +0200160
Angel Pons779d0c62021-11-03 11:12:35 +0100161#define AZALIA_PIN_CFG_NC(n) (0x411111f0 | ((n) & 0xf))
Felix Singer1bdbcd72020-09-22 12:55:25 +0200162
Angel Pons05c4dcb2021-11-03 12:18:31 +0100163#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)
Lijian Zhao5c9237f2018-11-08 17:57:33 -0800168
Angel Pons05c4dcb2021-11-03 12:18:31 +0100169#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)
Vladimir Serbinenko8f0da582014-09-04 21:34:13 +0200174
Andrew Wub7bb70d2013-08-12 20:07:47 +0800175#endif /* DEVICE_AZALIA_H */