summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/rt711-sdca.h
blob: 11d421e8ab2b6ecbea4ffe4c4280eab1ef4195e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * rt711-sdca.h -- RT711 SDCA ALSA SoC audio driver header
 *
 * Copyright(c) 2021 Realtek Semiconductor Corp.
 */

#ifndef __RT711_SDCA_H__
#define __RT711_SDCA_H__

#include <linux/pm.h>
#include <linux/regmap.h>
#include <linux/soundwire/sdw.h>
#include <linux/soundwire/sdw_type.h>
#include <sound/soc.h>
#include <linux/workqueue.h>

struct  rt711_sdca_priv {
	struct regmap *regmap, *mbq_regmap;
	struct snd_soc_component *component;
	struct sdw_slave *slave;
	struct sdw_bus_params params;
	bool hw_init;
	bool first_hw_init;
	struct snd_soc_jack *hs_jack;
	struct delayed_work jack_detect_work;
	struct delayed_work jack_btn_check_work;
	struct mutex calibrate_mutex; /* for headset calibration */
	struct mutex disable_irq_lock; /* SDCA irq lock protection */
	bool disable_irq;
	int jack_type, jd_src;
	unsigned int scp_sdca_stat1, scp_sdca_stat2;
	int hw_ver;
	bool fu0f_dapm_mute, fu0f_mixer_l_mute, fu0f_mixer_r_mute;
	bool fu1e_dapm_mute, fu1e_mixer_l_mute, fu1e_mixer_r_mute;
};

/* NID */
#define RT711_AUDIO_FUNCTION_GROUP			0x01
#define RT711_DAC_OUT2					0x03
#define RT711_ADC_IN1					0x09
#define RT711_ADC_IN2					0x08
#define RT711_DMIC1					0x12
#define RT711_DMIC2					0x13
#define RT711_MIC2					0x19
#define RT711_LINE1					0x1a
#define RT711_LINE2					0x1b
#define RT711_BEEP					0x1d
#define RT711_VENDOR_REG				0x20
#define RT711_HP_OUT					0x21
#define RT711_MIXER_IN1					0x22
#define RT711_MIXER_IN2					0x23
#define RT711_INLINE_CMD				0x55
#define RT711_VENDOR_CALI				0x58
#define RT711_VENDOR_IMS_DRE				0x5b
#define RT711_VENDOR_VAD				0x5e
#define RT711_VENDOR_ANALOG_CTL				0x5f
#define RT711_VENDOR_HDA_CTL				0x61

/* Index (NID:20h) */
#define RT711_JD_PRODUCT_NUM			0x00
#define RT711_DMIC_CTL1					0x06
#define RT711_JD_CTL1					0x08
#define RT711_JD_CTL2					0x09
#define RT711_CC_DET1					0x11
#define RT711_PARA_VERB_CTL				0x1a
#define RT711_COMBO_JACK_AUTO_CTL1			0x45
#define RT711_COMBO_JACK_AUTO_CTL2			0x46
#define RT711_COMBO_JACK_AUTO_CTL3			0x47
#define RT711_INLINE_CMD_CTL				0x48
#define RT711_DIGITAL_MISC_CTRL4			0x4a
#define RT711_JD_CTRL6			0x6a
#define RT711_VREFOUT_CTL				0x6b
#define RT711_GPIO_TEST_MODE_CTL2			0x6d
#define RT711_FSM_CTL					0x6f
#define RT711_IRQ_FLAG_TABLE1				0x80
#define RT711_IRQ_FLAG_TABLE2				0x81
#define RT711_IRQ_FLAG_TABLE3				0x82
#define RT711_HP_FSM_CTL				0x83
#define RT711_TX_RX_MUX_CTL				0x91
#define RT711_FILTER_SRC_SEL				0xb0
#define RT711_ADC27_VOL_SET				0xb7

/* Index (NID:58h) */
#define RT711_DAC_DC_CALI_CTL1				0x00
#define RT711_DAC_DC_CALI_CTL2				0x01

/* Index (NID:5bh) */
#define RT711_IMS_DIGITAL_CTL1				0x00
#define RT711_HP_IMS_RESULT_L				0x20
#define RT711_HP_IMS_RESULT_R				0x21

/* Index (NID:5eh) */
#define RT711_VAD_SRAM_CTL1				0x10

/* Index (NID:5fh) */
#define RT711_MISC_POWER_CTL0				0x01
#define RT711_MISC_POWER_CTL4				0x05

/* Index (NID:61h) */
#define RT711_HDA_LEGACY_MUX_CTL1			0x00
#define RT711_HDA_LEGACY_UNSOLICITED_CTL	0x03
#define RT711_HDA_LEGACY_CONFIG_CTL			0x06
#define RT711_HDA_LEGACY_RESET_CTL			0x08
#define RT711_HDA_LEGACY_GPIO_CTL			0x0a
#define RT711_ADC08_09_PDE_CTL				0x24
#define RT711_GE_MODE_RELATED_CTL			0x35
#define RT711_PUSH_BTN_INT_CTL0				0x36
#define RT711_PUSH_BTN_INT_CTL1				0x37
#define RT711_PUSH_BTN_INT_CTL2				0x38
#define RT711_PUSH_BTN_INT_CTL6				0x3c
#define RT711_PUSH_BTN_INT_CTL7				0x3d
#define RT711_PUSH_BTN_INT_CTL9				0x3f

/* DAC DC offset calibration control-1 (0x00)(NID:20h) */
#define RT711_DAC_DC_CALI_TRIGGER (0x1 << 15)
#define RT711_DAC_DC_CALI_CLK_EN (0x1 << 14)
#define RT711_DAC_DC_FORCE_CALI_RST (0x1 << 3)

/* jack detect control 1 (0x08)(NID:20h) */
#define RT711_JD2_DIGITAL_MODE_SEL (0x1 << 1)

/* jack detect control 2 (0x09)(NID:20h) */
#define RT711_JD2_2PORT_200K_DECODE_HP (0x1 << 13)
#define RT711_JD2_2PORT_100K_DECODE_MASK (0x1 << 12)
#define RT711_JD2_2PORT_100K_DECODE_HP (0x0 << 12)
#define RT711_HP_JD_SEL_JD1 (0x0 << 1)
#define RT711_HP_JD_SEL_JD2 (0x1 << 1)

/* CC DET1 (0x11)(NID:20h) */
#define RT711_HP_JD_FINAL_RESULT_CTL_JD12 (0x1 << 10)
#define RT711_HP_JD_FINAL_RESULT_CTL_CCDET (0x0 << 10)
#define RT711_POW_CC1_AGPI (0x1 << 5)
#define RT711_POW_CC1_AGPI_ON (0x1 << 5)
#define RT711_POW_CC1_AGPI_OFF (0x0 << 5)

/* Parameter & Verb control (0x1a)(NID:20h) */
#define RT711_HIDDEN_REG_SW_RESET (0x1 << 14)

/* combo jack auto switch control 2 (0x46)(NID:20h) */
#define RT711_COMBOJACK_AUTO_DET_STATUS			(0x1 << 11)
#define RT711_COMBOJACK_AUTO_DET_TRS			(0x1 << 10)
#define RT711_COMBOJACK_AUTO_DET_CTIA			(0x1 << 9)
#define RT711_COMBOJACK_AUTO_DET_OMTP			(0x1 << 8)

/* FSM control (0x6f)(NID:20h) */
#define RT711_CALI_CTL			(0x0 << 0)
#define RT711_COMBOJACK_CTL		(0x1 << 0)
#define RT711_IMS_CTL			(0x2 << 0)
#define RT711_DEPOP_CTL			(0x3 << 0)
#define RT711_FSM_IMP_EN		(0x1 << 6)

/* Impedance Sense Digital Control 1 (0x00)(NID:5bh) */
#define RT711_TRIGGER_IMS		(0x1 << 15)
#define RT711_IMS_EN			(0x1 << 6)

#define RT711_EAPD_HIGH				0x2
#define RT711_EAPD_LOW				0x0
#define RT711_MUTE_SFT				7
/* set input/output mapping to payload[14][15] separately */
#define RT711_DIR_IN_SFT			6
#define RT711_DIR_OUT_SFT			7

/* RC Calibration register */
#define RT711_RC_CAL_STATUS			0x320c

/* Buffer address for HID */
#define RT711_BUF_ADDR_HID1			0x44030000
#define RT711_BUF_ADDR_HID2			0x44030020

/* RT711 SDCA Control - function number */
#define FUNC_NUM_JACK_CODEC 0x01
#define FUNC_NUM_MIC_ARRAY 0x02
#define FUNC_NUM_HID 0x03

/* RT711 SDCA entity */
#define RT711_SDCA_ENT_HID01 0x01
#define RT711_SDCA_ENT_GE49 0x49
#define RT711_SDCA_ENT_USER_FU05 0x05
#define RT711_SDCA_ENT_USER_FU0F 0x0f
#define RT711_SDCA_ENT_USER_FU1E 0x1e
#define RT711_SDCA_ENT_PLATFORM_FU15 0x15
#define RT711_SDCA_ENT_PLATFORM_FU44 0x44
#define RT711_SDCA_ENT_PDE28 0x28
#define RT711_SDCA_ENT_PDE29 0x29
#define RT711_SDCA_ENT_PDE2A 0x2a
#define RT711_SDCA_ENT_CS01 0x01
#define RT711_SDCA_ENT_CS11 0x11
#define RT711_SDCA_ENT_CS1F 0x1f
#define RT711_SDCA_ENT_OT1 0x06
#define RT711_SDCA_ENT_LINE1 0x09
#define RT711_SDCA_ENT_LINE2 0x31
#define RT711_SDCA_ENT_PDELINE2 0x36
#define RT711_SDCA_ENT_USER_FU9 0x41

/* RT711 SDCA control */
#define RT711_SDCA_CTL_SAMPLE_FREQ_INDEX 0x10
#define RT711_SDCA_CTL_FU_CH_GAIN 0x0b
#define RT711_SDCA_CTL_FU_MUTE 0x01
#define RT711_SDCA_CTL_FU_VOLUME 0x02
#define RT711_SDCA_CTL_HIDTX_CURRENT_OWNER 0x10
#define RT711_SDCA_CTL_HIDTX_SET_OWNER_TO_DEVICE 0x11
#define RT711_SDCA_CTL_HIDTX_MESSAGE_OFFSET 0x12
#define RT711_SDCA_CTL_HIDTX_MESSAGE_LENGTH 0x13
#define RT711_SDCA_CTL_SELECTED_MODE 0x01
#define RT711_SDCA_CTL_DETECTED_MODE 0x02
#define RT711_SDCA_CTL_REQ_POWER_STATE 0x01
#define RT711_SDCA_CTL_VENDOR_DEF 0x30

/* RT711 SDCA channel */
#define CH_L 0x01
#define CH_R 0x02

/* sample frequency index */
#define RT711_SDCA_RATE_44100HZ		0x08
#define RT711_SDCA_RATE_48000HZ		0x09
#define RT711_SDCA_RATE_96000HZ		0x0b
#define RT711_SDCA_RATE_192000HZ	0x0d

enum {
	RT711_AIF1,
	RT711_AIF2,
	RT711_AIFS,
};

enum rt711_sdca_jd_src {
	RT711_JD_NULL,
	RT711_JD1,
	RT711_JD2,
	RT711_JD2_100K
};

enum rt711_sdca_ver {
	RT711_VER_VD0,
	RT711_VER_VD1
};

int rt711_sdca_io_init(struct device *dev, struct sdw_slave *slave);
int rt711_sdca_init(struct device *dev, struct regmap *regmap,
	       struct regmap *mbq_regmap, struct sdw_slave *slave);

int rt711_sdca_jack_detect(struct rt711_sdca_priv *rt711, bool *hp, bool *mic);
#endif /* __RT711_SDCA_H__ */