1/*
2 * rt286.h  --  RT286 ALSA SoC audio driver
3 *
4 * Copyright 2011 Realtek Microelectronics
5 * Author: Johnny Hsu <johnnyhsu@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT286_H__
13#define __RT286_H__
14
15#define VERB_CMD(V, N, D) ((N << 20) | (V << 8) | D)
16
17#define RT286_AUDIO_FUNCTION_GROUP			0x01
18#define RT286_DAC_OUT1					0x02
19#define RT286_DAC_OUT2					0x03
20#define RT286_ADC_IN1					0x09
21#define RT286_ADC_IN2					0x08
22#define RT286_MIXER_IN					0x0b
23#define RT286_MIXER_OUT1				0x0c
24#define RT286_MIXER_OUT2				0x0d
25#define RT286_DMIC1					0x12
26#define RT286_DMIC2					0x13
27#define RT286_SPK_OUT					0x14
28#define RT286_MIC1					0x18
29#define RT286_LINE1					0x1a
30#define RT286_BEEP					0x1d
31#define RT286_SPDIF					0x1e
32#define RT286_VENDOR_REGISTERS				0x20
33#define RT286_HP_OUT					0x21
34#define RT286_MIXER_IN1					0x22
35#define RT286_MIXER_IN2					0x23
36
37#define RT286_SET_PIN_SFT				6
38#define RT286_SET_PIN_ENABLE				0x40
39#define RT286_SET_PIN_DISABLE				0
40#define RT286_SET_EAPD_HIGH				0x2
41#define RT286_SET_EAPD_LOW				0
42
43#define RT286_MUTE_SFT					7
44
45/* Verb commands */
46#define RT286_GET_PARAM(NID, PARAM) VERB_CMD(AC_VERB_PARAMETERS, NID, PARAM)
47#define RT286_SET_POWER(NID) VERB_CMD(AC_VERB_SET_POWER_STATE, NID, 0)
48#define RT286_SET_AUDIO_POWER RT286_SET_POWER(RT286_AUDIO_FUNCTION_GROUP)
49#define RT286_SET_HPO_POWER RT286_SET_POWER(RT286_HP_OUT)
50#define RT286_SET_SPK_POWER RT286_SET_POWER(RT286_SPK_OUT)
51#define RT286_SET_DMIC1_POWER RT286_SET_POWER(RT286_DMIC1)
52#define RT286_SPK_MUX\
53	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_SPK_OUT, 0)
54#define RT286_HPO_MUX\
55	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_HP_OUT, 0)
56#define RT286_ADC0_MUX\
57	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_MIXER_IN1, 0)
58#define RT286_ADC1_MUX\
59	VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_MIXER_IN2, 0)
60#define RT286_SET_MIC1\
61	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_MIC1, 0)
62#define RT286_SET_PIN_HPO\
63	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_HP_OUT, 0)
64#define RT286_SET_PIN_SPK\
65	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_SPK_OUT, 0)
66#define RT286_SET_PIN_DMIC1\
67	VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_DMIC1, 0)
68#define RT286_SPK_EAPD\
69	VERB_CMD(AC_VERB_SET_EAPD_BTLENABLE, RT286_SPK_OUT, 0)
70#define RT286_SET_AMP_GAIN_HPO\
71	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0)
72#define RT286_SET_AMP_GAIN_ADC_IN1\
73	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0)
74#define RT286_SET_AMP_GAIN_ADC_IN2\
75	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN2, 0)
76#define RT286_GET_HP_SENSE\
77	VERB_CMD(AC_VERB_GET_PIN_SENSE, RT286_HP_OUT, 0)
78#define RT286_GET_MIC1_SENSE\
79	VERB_CMD(AC_VERB_GET_PIN_SENSE, RT286_MIC1, 0)
80#define RT286_SET_DMIC2_DEFAULT\
81	VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT286_DMIC2, 0)
82#define RT286_DACL_GAIN\
83	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_DAC_OUT1, 0xa000)
84#define RT286_DACR_GAIN\
85	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_DAC_OUT1, 0x9000)
86#define RT286_ADCL_GAIN\
87	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0x6000)
88#define RT286_ADCR_GAIN\
89	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0x5000)
90#define RT286_MIC_GAIN\
91	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIC1, 0x7000)
92#define RT286_SPOL_GAIN\
93	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_SPK_OUT, 0xa000)
94#define RT286_SPOR_GAIN\
95	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_SPK_OUT, 0x9000)
96#define RT286_HPOL_GAIN\
97	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0xa000)
98#define RT286_HPOR_GAIN\
99	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0x9000)
100#define RT286_F_DAC_SWITCH\
101	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_OUT1, 0x7000)
102#define RT286_F_RECMIX_SWITCH\
103	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_OUT1, 0x7100)
104#define RT286_REC_MIC_SWITCH\
105	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7000)
106#define RT286_REC_I2S_SWITCH\
107	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7100)
108#define RT286_REC_LINE_SWITCH\
109	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7200)
110#define RT286_REC_BEEP_SWITCH\
111	VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7300)
112#define RT286_DAC_FORMAT\
113	VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT286_DAC_OUT1, 0)
114#define RT286_ADC_FORMAT\
115	VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT286_ADC_IN1, 0)
116#define RT286_COEF_INDEX\
117	VERB_CMD(AC_VERB_SET_COEF_INDEX, RT286_VENDOR_REGISTERS, 0)
118#define RT286_PROC_COEF\
119	VERB_CMD(AC_VERB_SET_PROC_COEF, RT286_VENDOR_REGISTERS, 0)
120#define RT286_SET_GPIO_MASK\
121	VERB_CMD(AC_VERB_SET_GPIO_MASK, RT286_AUDIO_FUNCTION_GROUP, 0)
122#define RT286_SET_GPIO_DIRECTION\
123	VERB_CMD(AC_VERB_SET_GPIO_DIRECTION, RT286_AUDIO_FUNCTION_GROUP, 0)
124#define RT286_SET_GPIO_DATA\
125	VERB_CMD(AC_VERB_SET_GPIO_DATA, RT286_AUDIO_FUNCTION_GROUP, 0)
126
127/* Index registers */
128#define RT286_A_BIAS_CTRL1	0x01
129#define RT286_A_BIAS_CTRL2	0x02
130#define RT286_POWER_CTRL1	0x03
131#define RT286_A_BIAS_CTRL3	0x04
132#define RT286_POWER_CTRL2	0x08
133#define RT286_I2S_CTRL1		0x09
134#define RT286_I2S_CTRL2		0x0a
135#define RT286_CLK_DIV		0x0b
136#define RT286_DC_GAIN		0x0d
137#define RT286_POWER_CTRL3	0x0f
138#define RT286_MIC1_DET_CTRL	0x19
139#define RT286_MISC_CTRL1	0x20
140#define RT286_GPIO_CTRL		0x29
141#define RT286_IRQ_CTRL		0x33
142#define RT286_PLL_CTRL1		0x49
143#define RT286_CBJ_CTRL1		0x4f
144#define RT286_CBJ_CTRL2		0x50
145#define RT286_PLL_CTRL		0x63
146#define RT286_DEPOP_CTRL1	0x66
147#define RT286_DEPOP_CTRL2	0x67
148#define RT286_DEPOP_CTRL3	0x68
149#define RT286_DEPOP_CTRL4	0x69
150
151/* SPDIF (0x06) */
152#define RT286_SPDIF_SEL_SFT	0
153#define RT286_SPDIF_SEL_PCM0	0
154#define RT286_SPDIF_SEL_PCM1	1
155#define RT286_SPDIF_SEL_SPOUT	2
156#define RT286_SPDIF_SEL_PP	3
157
158/* RECMIX (0x0b) */
159#define RT286_M_REC_BEEP_SFT	0
160#define RT286_M_REC_LINE1_SFT	1
161#define RT286_M_REC_MIC1_SFT	2
162#define RT286_M_REC_I2S_SFT	3
163
164/* Front (0x0c) */
165#define RT286_M_FRONT_DAC_SFT	0
166#define RT286_M_FRONT_REC_SFT	1
167
168/* SPK-OUT (0x14) */
169#define RT286_M_SPK_MUX_SFT	14
170#define RT286_SPK_SEL_MASK	0x1
171#define RT286_SPK_SEL_SFT	0
172#define RT286_SPK_SEL_F		0
173#define RT286_SPK_SEL_S		1
174
175/* HP-OUT (0x21) */
176#define RT286_M_HP_MUX_SFT	14
177#define RT286_HP_SEL_MASK	0x1
178#define RT286_HP_SEL_SFT	0
179#define RT286_HP_SEL_F		0
180#define RT286_HP_SEL_S		1
181
182/* ADC (0x22) (0x23) */
183#define RT286_ADC_SEL_MASK	0x7
184#define RT286_ADC_SEL_SFT	0
185#define RT286_ADC_SEL_SURR	0
186#define RT286_ADC_SEL_FRONT	1
187#define RT286_ADC_SEL_DMIC	2
188#define RT286_ADC_SEL_BEEP	4
189#define RT286_ADC_SEL_LINE1	5
190#define RT286_ADC_SEL_I2S	6
191#define RT286_ADC_SEL_MIC1	7
192
193#define RT286_SCLK_S_MCLK	0
194#define RT286_SCLK_S_PLL	1
195
196enum {
197	RT286_AIF1,
198	RT286_AIF2,
199	RT286_AIFS,
200};
201
202int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
203
204#endif /* __RT286_H__ */
205
206