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