Commit | Line | Data |
---|---|---|
320b8b0d SF |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* | |
3 | * rt711.h -- RT711 ALSA SoC audio driver header | |
4 | * | |
5 | * Copyright(c) 2019 Realtek Semiconductor Corp. | |
6 | */ | |
7 | ||
8 | #ifndef __RT711_H__ | |
9 | #define __RT711_H__ | |
10 | ||
11 | extern const struct dev_pm_ops rt711_runtime_pm; | |
12 | ||
13 | struct rt711_priv { | |
14 | struct regmap *regmap; | |
15 | struct regmap *sdw_regmap; | |
16 | struct snd_soc_component *component; | |
17 | struct sdw_slave *slave; | |
320b8b0d SF |
18 | struct sdw_bus_params params; |
19 | bool hw_init; | |
20 | bool first_hw_init; | |
21 | struct snd_soc_jack *hs_jack; | |
22 | struct delayed_work jack_detect_work; | |
23 | struct delayed_work jack_btn_check_work; | |
24 | struct work_struct calibration_work; | |
25 | struct mutex calibrate_mutex; /* for headset calibration */ | |
26 | int jack_type, jd_src; | |
18236370 PLB |
27 | struct mutex disable_irq_lock; /* imp-def irq lock protection */ |
28 | bool disable_irq; | |
320b8b0d SF |
29 | }; |
30 | ||
320b8b0d SF |
31 | /* NID */ |
32 | #define RT711_AUDIO_FUNCTION_GROUP 0x01 | |
33 | #define RT711_DAC_OUT2 0x03 | |
34 | #define RT711_ADC_IN1 0x09 | |
35 | #define RT711_ADC_IN2 0x08 | |
36 | #define RT711_DMIC1 0x12 | |
37 | #define RT711_DMIC2 0x13 | |
38 | #define RT711_MIC2 0x19 | |
39 | #define RT711_LINE1 0x1a | |
40 | #define RT711_LINE2 0x1b | |
41 | #define RT711_BEEP 0x1d | |
42 | #define RT711_VENDOR_REG 0x20 | |
43 | #define RT711_HP_OUT 0x21 | |
44 | #define RT711_MIXER_IN1 0x22 | |
45 | #define RT711_MIXER_IN2 0x23 | |
46 | #define RT711_INLINE_CMD 0x55 | |
47 | #define RT711_VENDOR_CALI 0x58 | |
48 | #define RT711_VENDOR_IMS_DRE 0x5b | |
49 | ||
50 | /* Index (NID:20h) */ | |
51 | #define RT711_DAC_DC_CALI_CTL1 0x00 | |
683b0df2 | 52 | #define RT711_JD_CTL1 0x08 |
320b8b0d | 53 | #define RT711_JD_CTL2 0x09 |
683b0df2 | 54 | #define RT711_JD_CTL4 0x0b |
320b8b0d SF |
55 | #define RT711_CC_DET1 0x11 |
56 | #define RT711_PARA_VERB_CTL 0x1a | |
57 | #define RT711_COMBO_JACK_AUTO_CTL1 0x45 | |
58 | #define RT711_COMBO_JACK_AUTO_CTL2 0x46 | |
59 | #define RT711_INLINE_CMD_CTL 0x48 | |
60 | #define RT711_DIGITAL_MISC_CTRL4 0x4a | |
61 | #define RT711_VREFOUT_CTL 0x6b | |
62 | #define RT711_FSM_CTL 0x6f | |
63 | #define RT711_IRQ_FLAG_TABLE1 0x80 | |
64 | #define RT711_IRQ_FLAG_TABLE2 0x81 | |
65 | #define RT711_IRQ_FLAG_TABLE3 0x82 | |
66 | #define RT711_TX_RX_MUX_CTL 0x91 | |
67 | ||
68 | /* Index (NID:5bh) */ | |
69 | #define RT711_IMS_DIGITAL_CTL1 0x00 | |
70 | #define RT711_HP_IMS_RESULT_L 0x20 | |
71 | #define RT711_HP_IMS_RESULT_R 0x21 | |
72 | ||
73 | /* Verb */ | |
74 | #define RT711_VERB_SET_CONNECT_SEL 0x3100 | |
75 | #define RT711_VERB_SET_EAPD_BTLENABLE 0x3c00 | |
76 | #define RT711_VERB_GET_CONNECT_SEL 0xb100 | |
77 | #define RT711_VERB_SET_POWER_STATE 0x3500 | |
78 | #define RT711_VERB_SET_CHANNEL_STREAMID 0x3600 | |
79 | #define RT711_VERB_SET_PIN_WIDGET_CONTROL 0x3700 | |
80 | #define RT711_VERB_SET_UNSOLICITED_ENABLE 0x3800 | |
81 | #define RT711_SET_AMP_GAIN_MUTE_H 0x7300 | |
82 | #define RT711_SET_AMP_GAIN_MUTE_L 0x8380 | |
83 | #define RT711_VERB_GET_POWER_STATE 0xb500 | |
84 | #define RT711_VERB_GET_CHANNEL_STREAMID 0xb600 | |
85 | #define RT711_VERB_GET_PIN_SENSE 0xb900 | |
86 | #define RT711_FUNC_RESET 0xff01 | |
87 | ||
88 | #define RT711_READ_HDA_3 0x2012 | |
89 | #define RT711_READ_HDA_2 0x2013 | |
90 | #define RT711_READ_HDA_1 0x2014 | |
91 | #define RT711_READ_HDA_0 0x2015 | |
92 | #define RT711_PRIV_INDEX_W_H 0x7500 | |
93 | #define RT711_PRIV_INDEX_W_L 0x8580 | |
94 | #define RT711_PRIV_DATA_W_H 0x7400 | |
95 | #define RT711_PRIV_DATA_W_L 0x8480 | |
96 | #define RT711_PRIV_INDEX_R_H 0x9d00 | |
97 | #define RT711_PRIV_INDEX_R_L 0xad80 | |
98 | #define RT711_PRIV_DATA_R_H 0x9c00 | |
99 | #define RT711_PRIV_DATA_R_L 0xac80 | |
100 | #define RT711_DAC_FORMAT_H 0x7203 | |
101 | #define RT711_DAC_FORMAT_L 0x8283 | |
102 | #define RT711_ADC1_FORMAT_H 0x7209 | |
103 | #define RT711_ADC1_FORMAT_L 0x8289 | |
104 | #define RT711_ADC2_FORMAT_H 0x7208 | |
105 | #define RT711_ADC2_FORMAT_L 0x8288 | |
106 | ||
107 | #define RT711_SET_AUDIO_POWER_STATE\ | |
108 | (RT711_VERB_SET_POWER_STATE | RT711_AUDIO_FUNCTION_GROUP) | |
109 | #define RT711_GET_AUDIO_POWER_STATE\ | |
110 | (RT711_VERB_GET_POWER_STATE | RT711_AUDIO_FUNCTION_GROUP) | |
111 | #define RT711_SET_PIN_DMIC1\ | |
112 | (RT711_VERB_SET_PIN_WIDGET_CONTROL | RT711_DMIC1) | |
113 | #define RT711_SET_PIN_DMIC2\ | |
114 | (RT711_VERB_SET_PIN_WIDGET_CONTROL | RT711_DMIC2) | |
115 | #define RT711_SET_PIN_HP\ | |
116 | (RT711_VERB_SET_PIN_WIDGET_CONTROL | RT711_HP_OUT) | |
117 | #define RT711_SET_PIN_MIC2\ | |
118 | (RT711_VERB_SET_PIN_WIDGET_CONTROL | RT711_MIC2) | |
119 | #define RT711_SET_PIN_LINE1\ | |
120 | (RT711_VERB_SET_PIN_WIDGET_CONTROL | RT711_LINE1) | |
121 | #define RT711_SET_PIN_LINE2\ | |
122 | (RT711_VERB_SET_PIN_WIDGET_CONTROL | RT711_LINE2) | |
123 | #define RT711_SET_MIC2_UNSOLICITED_ENABLE\ | |
124 | (RT711_VERB_SET_UNSOLICITED_ENABLE | RT711_MIC2) | |
125 | #define RT711_SET_HP_UNSOLICITED_ENABLE\ | |
126 | (RT711_VERB_SET_UNSOLICITED_ENABLE | RT711_HP_OUT) | |
127 | #define RT711_SET_INLINE_UNSOLICITED_ENABLE\ | |
128 | (RT711_VERB_SET_UNSOLICITED_ENABLE | RT711_INLINE_CMD) | |
129 | #define RT711_SET_STREAMID_DAC2\ | |
130 | (RT711_VERB_SET_CHANNEL_STREAMID | RT711_DAC_OUT2) | |
131 | #define RT711_SET_STREAMID_ADC1\ | |
132 | (RT711_VERB_SET_CHANNEL_STREAMID | RT711_ADC_IN1) | |
133 | #define RT711_SET_STREAMID_ADC2\ | |
134 | (RT711_VERB_SET_CHANNEL_STREAMID | RT711_ADC_IN2) | |
135 | #define RT711_GET_STREAMID_DAC2\ | |
136 | (RT711_VERB_GET_CHANNEL_STREAMID | RT711_DAC_OUT2) | |
137 | #define RT711_GET_STREAMID_ADC1\ | |
138 | (RT711_VERB_GET_CHANNEL_STREAMID | RT711_ADC_IN1) | |
139 | #define RT711_GET_STREAMID_ADC2\ | |
140 | (RT711_VERB_GET_CHANNEL_STREAMID | RT711_ADC_IN2) | |
141 | #define RT711_SET_GAIN_DAC2_L\ | |
142 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_DAC_OUT2) | |
143 | #define RT711_SET_GAIN_DAC2_H\ | |
144 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_DAC_OUT2) | |
145 | #define RT711_SET_GAIN_ADC1_L\ | |
146 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_ADC_IN1) | |
147 | #define RT711_SET_GAIN_ADC1_H\ | |
148 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_ADC_IN1) | |
149 | #define RT711_SET_GAIN_ADC2_L\ | |
150 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_ADC_IN2) | |
151 | #define RT711_SET_GAIN_ADC2_H\ | |
152 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_ADC_IN2) | |
153 | #define RT711_SET_GAIN_AMIC_L\ | |
154 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_MIC2) | |
155 | #define RT711_SET_GAIN_AMIC_H\ | |
156 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_MIC2) | |
157 | #define RT711_SET_GAIN_DMIC1_L\ | |
158 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_DMIC1) | |
159 | #define RT711_SET_GAIN_DMIC1_H\ | |
160 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_DMIC1) | |
161 | #define RT711_SET_GAIN_DMIC2_L\ | |
162 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_DMIC2) | |
163 | #define RT711_SET_GAIN_DMIC2_H\ | |
164 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_DMIC2) | |
165 | #define RT711_SET_GAIN_HP_L\ | |
166 | (RT711_SET_AMP_GAIN_MUTE_L | RT711_HP_OUT) | |
167 | #define RT711_SET_GAIN_HP_H\ | |
168 | (RT711_SET_AMP_GAIN_MUTE_H | RT711_HP_OUT) | |
169 | ||
170 | /* DAC DC offset calibration control-1 (0x00)(NID:20h) */ | |
171 | #define RT711_DAC_DC_CALI_TRIGGER (0x1 << 15) | |
172 | ||
683b0df2 SF |
173 | /* jack detect control 1 (0x08)(NID:20h) */ |
174 | #define RT711_JD2_DIGITAL_JD_MODE_SEL (0x1 << 1) | |
175 | #define RT711_JD2_1_JD_MODE (0x0 << 1) | |
176 | #define RT711_JD2_2_JD_MODE (0x1 << 1) | |
177 | ||
320b8b0d SF |
178 | /* jack detect control 2 (0x09)(NID:20h) */ |
179 | #define RT711_JD2_2PORT_200K_DECODE_HP (0x1 << 13) | |
683b0df2 SF |
180 | #define RT711_JD2_2PORT_100K_DECODE (0x1 << 12) |
181 | #define RT711_JD2_2PORT_100K_DECODE_HP (0x0 << 12) | |
320b8b0d SF |
182 | #define RT711_HP_JD_SEL_JD1 (0x0 << 1) |
183 | #define RT711_HP_JD_SEL_JD2 (0x1 << 1) | |
683b0df2 SF |
184 | #define RT711_JD2_1PORT_TYPE_DECODE (0x3 << 10) |
185 | #define RT711_JD2_1PORT_JD_LINE2 (0x0 << 10) | |
186 | #define RT711_JD2_1PORT_JD_HP (0x1 << 10) | |
187 | #define RT711_JD2_1PORT_JD_LINE1 (0x2 << 10) | |
188 | #define RT711_JD1_2PORT_TYPE_100K_DECODE (0x1 << 0) | |
189 | #define RT711_JD1_2PORT_JD_RESERVED (0x0 << 0) | |
190 | #define RT711_JD1_2PORT_JD_LINE1 (0x1 << 0) | |
191 | ||
192 | /* jack detect control 4 (0x0b)(NID:20h) */ | |
193 | #define RT711_JD2_PAD_PULL_UP_MASK (0x1 << 3) | |
194 | #define RT711_JD2_PAD_NOT_PULL_UP (0x0 << 3) | |
195 | #define RT711_JD2_PAD_PULL_UP (0x1 << 3) | |
196 | #define RT711_JD2_MODE_SEL_MASK (0x3 << 0) | |
197 | #define RT711_JD2_MODE0_2PORT (0x0 << 0) | |
198 | #define RT711_JD2_MODE1_3P3V_1PORT (0x1 << 0) | |
199 | #define RT711_JD2_MODE2_1P8V_1PORT (0x2 << 0) | |
320b8b0d SF |
200 | |
201 | /* CC DET1 (0x11)(NID:20h) */ | |
202 | #define RT711_HP_JD_FINAL_RESULT_CTL_JD12 (0x1 << 10) | |
203 | #define RT711_HP_JD_FINAL_RESULT_CTL_CCDET (0x0 << 10) | |
204 | ||
205 | /* Parameter & Verb control (0x1a)(NID:20h) */ | |
206 | #define RT711_HIDDEN_REG_SW_RESET (0x1 << 14) | |
207 | ||
208 | /* combo jack auto switch control 2 (0x46)(NID:20h) */ | |
209 | #define RT711_COMBOJACK_AUTO_DET_STATUS (0x1 << 11) | |
210 | #define RT711_COMBOJACK_AUTO_DET_TRS (0x1 << 10) | |
211 | #define RT711_COMBOJACK_AUTO_DET_CTIA (0x1 << 9) | |
212 | #define RT711_COMBOJACK_AUTO_DET_OMTP (0x1 << 8) | |
213 | ||
214 | /* FSM control (0x6f)(NID:20h) */ | |
215 | #define RT711_CALI_CTL (0x0 << 0) | |
216 | #define RT711_COMBOJACK_CTL (0x1 << 0) | |
217 | #define RT711_IMS_CTL (0x2 << 0) | |
218 | #define RT711_DEPOP_CTL (0x3 << 0) | |
219 | ||
220 | /* Impedance Sense Digital Control 1 (0x00)(NID:5bh) */ | |
221 | #define RT711_TRIGGER_IMS (0x1 << 15) | |
222 | #define RT711_IMS_EN (0x1 << 6) | |
223 | ||
224 | #define RT711_EAPD_HIGH 0x2 | |
225 | #define RT711_EAPD_LOW 0x0 | |
226 | #define RT711_MUTE_SFT 7 | |
227 | /* set input/output mapping to payload[14][15] separately */ | |
228 | #define RT711_DIR_IN_SFT 6 | |
229 | #define RT711_DIR_OUT_SFT 7 | |
230 | ||
231 | enum { | |
232 | RT711_AIF1, | |
233 | RT711_AIF2, | |
234 | RT711_AIFS, | |
235 | }; | |
236 | ||
237 | enum rt711_jd_src { | |
238 | RT711_JD_NULL, | |
239 | RT711_JD1, | |
683b0df2 SF |
240 | RT711_JD2, |
241 | RT711_JD2_100K, | |
242 | RT711_JD2_1P8V_1PORT | |
320b8b0d SF |
243 | }; |
244 | ||
245 | int rt711_io_init(struct device *dev, struct sdw_slave *slave); | |
246 | int rt711_init(struct device *dev, struct regmap *sdw_regmap, | |
247 | struct regmap *regmap, struct sdw_slave *slave); | |
248 | ||
249 | int rt711_jack_detect(struct rt711_priv *rt711, bool *hp, bool *mic); | |
250 | int rt711_clock_config(struct device *dev); | |
251 | #endif /* __RT711_H__ */ |