blob: d717fdd7ef33c9299c466671d37a51c7751a3568 [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>
Kyösti Mälkki13f66502019-03-03 08:01:05 +02007#include <device/mmio.h>
Andrew Wub7bb70d2013-08-12 20:07:47 +08008#include <device/device.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
Angel Pons61dd8362020-12-05 18:02:32 +010021int azalia_set_bits(void *port, u32 mask, u32 val);
Angel Pons49190282020-12-05 18:52:38 +010022int azalia_enter_reset(u8 *base);
23int azalia_exit_reset(u8 *base);
Angel Ponsd425ddd2020-12-05 18:22:58 +010024u32 azalia_find_verb(const u32 *verb_table, u32 verb_table_bytes, u32 viddid, const u32 **verb);
Angel Pons44c431e2021-02-08 12:37:56 +010025int azalia_program_verb_table(u8 *base, const u32 *verbs, u32 verb_size);
Angel Pons86dfd3c2021-11-10 17:58:12 +010026void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes);
Angel Pons42552ca2021-11-10 17:19:44 +010027void azalia_codecs_init(struct device *dev, u8 *base, u16 codec_mask);
Andrew Wub7bb70d2013-08-12 20:07:47 +080028void azalia_audio_init(struct device *dev);
29extern struct device_operations default_azalia_audio_ops;
30
Angel Ponsd6d71ce2021-02-08 12:47:29 +010031/* Optional hook to program codec settings that are only known at runtime */
32void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid);
33
Vladimir Serbinenko75c83872014-09-05 01:01:31 +020034extern const u32 cim_verb_data[];
35extern const u32 cim_verb_data_size;
36extern const u32 pc_beep_verbs[];
37extern const u32 pc_beep_verbs_size;
38
Patrick Rudolph9a521d72020-03-20 10:07:53 +010039enum azalia_pin_connection {
40 JACK = 0,
41 NC,
42 INTEGRATED,
43 JACK_AND_INTEGRATED,
44};
45
46enum azalia_pin_color {
47 COLOR_UNKNOWN = 0,
48 BLACK,
49 GREY,
50 BLUE,
51 GREEN,
52 RED,
53 ORANGE,
54 YELLOW,
55 PURPLE,
56 PINK,
57 WHITE = 0xe,
58 COLOR_OTHER = 0xf,
59};
60
61enum azalia_pin_type {
62 TYPE_UNKNOWN = 0,
63 STEREO_MONO_1_8,
64 STEREO_MONO_1_4,
65 ATAPI,
66 RCA,
Patrick Rudolph9572dd82020-10-21 16:43:08 +020067 OPTICAL,
Patrick Rudolph9a521d72020-03-20 10:07:53 +010068 OTHER_DIGITAL,
69 OTHER_ANALOG,
70 MULTICHANNEL_ANALOG,
71 XLR,
72 RJ_11,
73 COMBINATION,
74 TYPE_OTHER = 0xf
75};
76
77enum azalia_pin_device {
78 LINE_OUT = 0,
79 SPEAKER,
80 HP_OUT,
81 CD,
82 SPDIF_OUT,
83 DIGITAL_OTHER_OUT,
84 MODEM_LINE_SIDE,
85 MODEM_HANDSET_SIDE,
86 LINE_IN,
87 AUX,
88 MIC_IN,
89 TELEPHONY,
90 SPDIF_IN,
91 DIGITAL_OTHER_IN,
92 DEVICE_OTHER = 0xf,
93};
94
95enum azalia_pin_location_1 {
96 NA = 0,
97 REAR,
98 FRONT,
99 LEFT,
100 RIGHT,
101 TOP,
102 BOTTOM,
103 SPECIAL7,
104 SPECIAL8,
105 SPECIAL9,
106};
107
108enum azalia_pin_location_2 {
109 EXTERNAL_PRIMARY_CHASSIS = 0,
110 INTERNAL,
111 SEPARATE_CHASSIS,
112 LOCATION_OTHER
113};
114
115#define AZALIA_PIN_DESC(conn, location2, location1, dev, type, color, no_presence_detect, \
116 association, sequence) \
117 (((conn) << 30) | \
118 ((location2) << 27) | \
119 ((location1) << 24) | \
120 ((dev) << 20) | \
121 ((type) << 16) | \
122 ((color) << 12) | \
123 ((no_presence_detect) << 8) | \
Patrick Rudolph15d62402020-08-28 10:59:45 +0200124 ((association) << 4) | \
Patrick Rudolph9a521d72020-03-20 10:07:53 +0100125 ((sequence) << 0))
126
Lee Leahy6a566d72017-03-07 17:45:12 -0800127#define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size = \
128 ARRAY_SIZE(pc_beep_verbs); \
Vladimir Serbinenko75c83872014-09-05 01:01:31 +0200129 const u32 cim_verb_data_size = sizeof(cim_verb_data)
Vladimir Serbinenko6a3a8ce2014-08-17 23:48:42 +0200130
Angel Pons05c4dcb2021-11-03 12:18:31 +0100131#define AZALIA_VERB_12B(codec, pin, verb, val) \
132 ((codec) << 28 | (pin) << 20 | (verb) << 8 | (val))
133
134#define AZALIA_PIN_CFG(codec, pin, val) \
135 AZALIA_VERB_12B(codec, pin, 0x71c, ((val) >> 0) & 0xff), \
136 AZALIA_VERB_12B(codec, pin, 0x71d, ((val) >> 8) & 0xff), \
137 AZALIA_VERB_12B(codec, pin, 0x71e, ((val) >> 16) & 0xff), \
138 AZALIA_VERB_12B(codec, pin, 0x71f, ((val) >> 24) & 0xff)
Vladimir Serbinenko8f0da582014-09-04 21:34:13 +0200139
Angel Pons779d0c62021-11-03 11:12:35 +0100140#define AZALIA_PIN_CFG_NC(n) (0x411111f0 | ((n) & 0xf))
Felix Singer1bdbcd72020-09-22 12:55:25 +0200141
Angel Pons05c4dcb2021-11-03 12:18:31 +0100142#define AZALIA_RESET(pin) \
143 AZALIA_VERB_12B(0, pin, 0x7ff, 0), \
144 AZALIA_VERB_12B(0, pin, 0x7ff, 0), \
145 AZALIA_VERB_12B(0, pin, 0x7ff, 0), \
146 AZALIA_VERB_12B(0, pin, 0x7ff, 0)
Lijian Zhao5c9237f2018-11-08 17:57:33 -0800147
Angel Pons05c4dcb2021-11-03 12:18:31 +0100148#define AZALIA_SUBVENDOR(codec, val) \
149 AZALIA_VERB_12B(codec, 1, 0x720, ((val) >> 0) & 0xff), \
150 AZALIA_VERB_12B(codec, 1, 0x721, ((val) >> 8) & 0xff), \
151 AZALIA_VERB_12B(codec, 1, 0x722, ((val) >> 16) & 0xff), \
152 AZALIA_VERB_12B(codec, 1, 0x723, ((val) >> 24) & 0xff)
Vladimir Serbinenko8f0da582014-09-04 21:34:13 +0200153
Andrew Wub7bb70d2013-08-12 20:07:47 +0800154#endif /* DEVICE_AZALIA_H */