summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/rt286.h
blob: b539b7320a79074605fb51b42a3e0a2507dcfc53 (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
/*
 * rt286.h  --  RT286 ALSA SoC audio driver
 *
 * Copyright 2011 Realtek Microelectronics
 * Author: Johnny Hsu <johnnyhsu@realtek.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef __RT286_H__
#define __RT286_H__

#define VERB_CMD(V, N, D) ((N << 20) | (V << 8) | D)

#define RT286_AUDIO_FUNCTION_GROUP			0x01
#define RT286_DAC_OUT1					0x02
#define RT286_DAC_OUT2					0x03
#define RT286_ADC_IN1					0x09
#define RT286_ADC_IN2					0x08
#define RT286_MIXER_IN					0x0b
#define RT286_MIXER_OUT1				0x0c
#define RT286_MIXER_OUT2				0x0d
#define RT286_DMIC1					0x12
#define RT286_DMIC2					0x13
#define RT286_SPK_OUT					0x14
#define RT286_MIC1					0x18
#define RT286_LINE1					0x1a
#define RT286_BEEP					0x1d
#define RT286_SPDIF					0x1e
#define RT286_VENDOR_REGISTERS				0x20
#define RT286_HP_OUT					0x21
#define RT286_MIXER_IN1					0x22
#define RT286_MIXER_IN2					0x23

#define RT286_SET_PIN_SFT				6
#define RT286_SET_PIN_ENABLE				0x40
#define RT286_SET_PIN_DISABLE				0
#define RT286_SET_EAPD_HIGH				0x2
#define RT286_SET_EAPD_LOW				0

#define RT286_MUTE_SFT					7

/* Verb commands */
#define RT286_GET_PARAM(NID, PARAM) VERB_CMD(AC_VERB_PARAMETERS, NID, PARAM)
#define RT286_SET_POWER(NID) VERB_CMD(AC_VERB_SET_POWER_STATE, NID, 0)
#define RT286_SET_AUDIO_POWER RT286_SET_POWER(RT286_AUDIO_FUNCTION_GROUP)
#define RT286_SET_HPO_POWER RT286_SET_POWER(RT286_HP_OUT)
#define RT286_SET_SPK_POWER RT286_SET_POWER(RT286_SPK_OUT)
#define RT286_SET_DMIC1_POWER RT286_SET_POWER(RT286_DMIC1)
#define RT286_SPK_MUX\
	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_SPK_OUT, 0)
#define RT286_HPO_MUX\
	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_HP_OUT, 0)
#define RT286_ADC0_MUX\
	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_MIXER_IN1, 0)
#define RT286_ADC1_MUX\
	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_MIXER_IN2, 0)
#define RT286_SET_MIC1\
	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_MIC1, 0)
#define RT286_SET_PIN_HPO\
	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_HP_OUT, 0)
#define RT286_SET_PIN_SPK\
	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_SPK_OUT, 0)
#define RT286_SET_PIN_DMIC1\
	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_DMIC1, 0)
#define RT286_SPK_EAPD\
	VERB_CMD(AC_VERB_SET_EAPD_BTLENABLE, RT286_SPK_OUT, 0)
#define RT286_SET_AMP_GAIN_HPO\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0)
#define RT286_SET_AMP_GAIN_ADC_IN1\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0)
#define RT286_SET_AMP_GAIN_ADC_IN2\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN2, 0)
#define RT286_GET_HP_SENSE\
	VERB_CMD(AC_VERB_GET_PIN_SENSE, RT286_HP_OUT, 0)
#define RT286_GET_MIC1_SENSE\
	VERB_CMD(AC_VERB_GET_PIN_SENSE, RT286_MIC1, 0)
#define RT286_SET_DMIC2_DEFAULT\
	VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT286_DMIC2, 0)
#define RT286_DACL_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_DAC_OUT1, 0xa000)
#define RT286_DACR_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_DAC_OUT1, 0x9000)
#define RT286_ADCL_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0x6000)
#define RT286_ADCR_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0x5000)
#define RT286_MIC_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIC1, 0x7000)
#define RT286_SPOL_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_SPK_OUT, 0xa000)
#define RT286_SPOR_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_SPK_OUT, 0x9000)
#define RT286_HPOL_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0xa000)
#define RT286_HPOR_GAIN\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0x9000)
#define RT286_F_DAC_SWITCH\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_OUT1, 0x7000)
#define RT286_F_RECMIX_SWITCH\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_OUT1, 0x7100)
#define RT286_REC_MIC_SWITCH\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7000)
#define RT286_REC_I2S_SWITCH\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7100)
#define RT286_REC_LINE_SWITCH\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7200)
#define RT286_REC_BEEP_SWITCH\
	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7300)
#define RT286_DAC_FORMAT\
	VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT286_DAC_OUT1, 0)
#define RT286_ADC_FORMAT\
	VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT286_ADC_IN1, 0)
#define RT286_COEF_INDEX\
	VERB_CMD(AC_VERB_SET_COEF_INDEX, RT286_VENDOR_REGISTERS, 0)
#define RT286_PROC_COEF\
	VERB_CMD(AC_VERB_SET_PROC_COEF, RT286_VENDOR_REGISTERS, 0)

/* Index registers */
#define RT286_A_BIAS_CTRL1	0x01
#define RT286_A_BIAS_CTRL2	0x02
#define RT286_POWER_CTRL1	0x03
#define RT286_A_BIAS_CTRL3	0x04
#define RT286_POWER_CTRL2	0x08
#define RT286_I2S_CTRL1		0x09
#define RT286_I2S_CTRL2		0x0a
#define RT286_CLK_DIV		0x0b
#define RT286_DC_GAIN		0x0d
#define RT286_POWER_CTRL3	0x0f
#define RT286_MIC1_DET_CTRL	0x19
#define RT286_MISC_CTRL1	0x20
#define RT286_IRQ_CTRL		0x33
#define RT286_PLL_CTRL1		0x49
#define RT286_CBJ_CTRL1		0x4f
#define RT286_CBJ_CTRL2		0x50
#define RT286_PLL_CTRL		0x63
#define RT286_DEPOP_CTRL1	0x66
#define RT286_DEPOP_CTRL2	0x67
#define RT286_DEPOP_CTRL3	0x68
#define RT286_DEPOP_CTRL4	0x69

/* SPDIF (0x06) */
#define RT286_SPDIF_SEL_SFT	0
#define RT286_SPDIF_SEL_PCM0	0
#define RT286_SPDIF_SEL_PCM1	1
#define RT286_SPDIF_SEL_SPOUT	2
#define RT286_SPDIF_SEL_PP	3

/* RECMIX (0x0b) */
#define RT286_M_REC_BEEP_SFT	0
#define RT286_M_REC_LINE1_SFT	1
#define RT286_M_REC_MIC1_SFT	2
#define RT286_M_REC_I2S_SFT	3

/* Front (0x0c) */
#define RT286_M_FRONT_DAC_SFT	0
#define RT286_M_FRONT_REC_SFT	1

/* SPK-OUT (0x14) */
#define RT286_M_SPK_MUX_SFT	14
#define RT286_SPK_SEL_MASK	0x1
#define RT286_SPK_SEL_SFT	0
#define RT286_SPK_SEL_F		0
#define RT286_SPK_SEL_S		1

/* HP-OUT (0x21) */
#define RT286_M_HP_MUX_SFT	14
#define RT286_HP_SEL_MASK	0x1
#define RT286_HP_SEL_SFT	0
#define RT286_HP_SEL_F		0
#define RT286_HP_SEL_S		1

/* ADC (0x22) (0x23) */
#define RT286_ADC_SEL_MASK	0x7
#define RT286_ADC_SEL_SFT	0
#define RT286_ADC_SEL_SURR	0
#define RT286_ADC_SEL_FRONT	1
#define RT286_ADC_SEL_DMIC	2
#define RT286_ADC_SEL_BEEP	4
#define RT286_ADC_SEL_LINE1	5
#define RT286_ADC_SEL_I2S	6
#define RT286_ADC_SEL_MIC1	7

#define RT286_SCLK_S_MCLK	0
#define RT286_SCLK_S_PLL	1

enum {
	RT286_AIF1,
	RT286_AIF2,
	RT286_AIFS,
};

int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);

#endif /* __RT286_H__ */