xref: /OK3568_Linux_fs/kernel/sound/soc/codecs/nau8540.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * NAU85L40 ALSA SoC audio driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2016 Nuvoton Technology Corp.
6*4882a593Smuzhiyun  * Author: John Hsu <KCHSU0@nuvoton.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __NAU8540_H__
10*4882a593Smuzhiyun #define __NAU8540_H__
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define NAU8540_REG_SW_RESET			0x00
13*4882a593Smuzhiyun #define NAU8540_REG_POWER_MANAGEMENT	0x01
14*4882a593Smuzhiyun #define NAU8540_REG_CLOCK_CTRL		0x02
15*4882a593Smuzhiyun #define NAU8540_REG_CLOCK_SRC			0x03
16*4882a593Smuzhiyun #define NAU8540_REG_FLL1			0x04
17*4882a593Smuzhiyun #define NAU8540_REG_FLL2			0x05
18*4882a593Smuzhiyun #define NAU8540_REG_FLL3			0x06
19*4882a593Smuzhiyun #define NAU8540_REG_FLL4			0x07
20*4882a593Smuzhiyun #define NAU8540_REG_FLL5			0x08
21*4882a593Smuzhiyun #define NAU8540_REG_FLL6			0x09
22*4882a593Smuzhiyun #define NAU8540_REG_FLL_VCO_RSV		0x0A
23*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL0			0x10
24*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL1			0x11
25*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL2			0x12
26*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL3			0x13
27*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL4			0x14
28*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_1		0x20
29*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_2		0x21
30*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_3		0x22
31*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_4		0x23
32*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_5		0x24
33*4882a593Smuzhiyun #define NAU8540_REG_ALC_GAIN_CH12		0x2D
34*4882a593Smuzhiyun #define NAU8540_REG_ALC_GAIN_CH34		0x2E
35*4882a593Smuzhiyun #define NAU8540_REG_ALC_STATUS		0x2F
36*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH1		0x30
37*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH1		0x31
38*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH2		0x32
39*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH2		0x33
40*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH3		0x34
41*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH3		0x35
42*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH4		0x36
43*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH4		0x37
44*4882a593Smuzhiyun #define NAU8540_REG_HPF_FILTER_CH12		0x38
45*4882a593Smuzhiyun #define NAU8540_REG_HPF_FILTER_CH34		0x39
46*4882a593Smuzhiyun #define NAU8540_REG_ADC_SAMPLE_RATE		0x3A
47*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH1		0x40
48*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH2		0x41
49*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH3		0x42
50*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH4		0x43
51*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_MUX		0x44
52*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH1			0x48
53*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH2			0x49
54*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH3			0x4A
55*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH4			0x4B
56*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH1			0x4C
57*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH2			0x4D
58*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH3			0x4E
59*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH4			0x4F
60*4882a593Smuzhiyun #define NAU8540_REG_GPIO_CTRL			0x50
61*4882a593Smuzhiyun #define NAU8540_REG_MISC_CTRL			0x51
62*4882a593Smuzhiyun #define NAU8540_REG_I2C_CTRL			0x52
63*4882a593Smuzhiyun #define NAU8540_REG_I2C_DEVICE_ID		0x58
64*4882a593Smuzhiyun #define NAU8540_REG_RST			0x5A
65*4882a593Smuzhiyun #define NAU8540_REG_VMID_CTRL			0x60
66*4882a593Smuzhiyun #define NAU8540_REG_MUTE			0x61
67*4882a593Smuzhiyun #define NAU8540_REG_ANALOG_ADC1		0x64
68*4882a593Smuzhiyun #define NAU8540_REG_ANALOG_ADC2		0x65
69*4882a593Smuzhiyun #define NAU8540_REG_ANALOG_PWR		0x66
70*4882a593Smuzhiyun #define NAU8540_REG_MIC_BIAS			0x67
71*4882a593Smuzhiyun #define NAU8540_REG_REFERENCE			0x68
72*4882a593Smuzhiyun #define NAU8540_REG_FEPGA1			0x69
73*4882a593Smuzhiyun #define NAU8540_REG_FEPGA2			0x6A
74*4882a593Smuzhiyun #define NAU8540_REG_FEPGA3			0x6B
75*4882a593Smuzhiyun #define NAU8540_REG_FEPGA4			0x6C
76*4882a593Smuzhiyun #define NAU8540_REG_PWR			0x6D
77*4882a593Smuzhiyun #define NAU8540_REG_MAX			NAU8540_REG_PWR
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* POWER_MANAGEMENT (0x01) */
81*4882a593Smuzhiyun #define NAU8540_ADC4_EN		(0x1 << 3)
82*4882a593Smuzhiyun #define NAU8540_ADC3_EN		(0x1 << 2)
83*4882a593Smuzhiyun #define NAU8540_ADC2_EN		(0x1 << 1)
84*4882a593Smuzhiyun #define NAU8540_ADC1_EN		0x1
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /* CLOCK_CTRL (0x02) */
87*4882a593Smuzhiyun #define NAU8540_CLK_ADC_EN		(0x1 << 15)
88*4882a593Smuzhiyun #define NAU8540_CLK_I2S_EN		(0x1 << 1)
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /* CLOCK_SRC (0x03) */
91*4882a593Smuzhiyun #define NAU8540_CLK_SRC_SFT		15
92*4882a593Smuzhiyun #define NAU8540_CLK_SRC_MASK		(1 << NAU8540_CLK_SRC_SFT)
93*4882a593Smuzhiyun #define NAU8540_CLK_SRC_VCO		(1 << NAU8540_CLK_SRC_SFT)
94*4882a593Smuzhiyun #define NAU8540_CLK_SRC_MCLK		(0 << NAU8540_CLK_SRC_SFT)
95*4882a593Smuzhiyun #define NAU8540_CLK_ADC_SRC_SFT	6
96*4882a593Smuzhiyun #define NAU8540_CLK_ADC_SRC_MASK	(0x3 << NAU8540_CLK_ADC_SRC_SFT)
97*4882a593Smuzhiyun #define NAU8540_CLK_MCLK_SRC_MASK	0xf
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /* FLL1 (0x04) */
100*4882a593Smuzhiyun #define NAU8540_ICTRL_LATCH_SFT	10
101*4882a593Smuzhiyun #define NAU8540_ICTRL_LATCH_MASK	(0x7 << NAU8540_ICTRL_LATCH_SFT)
102*4882a593Smuzhiyun #define NAU8540_FLL_RATIO_MASK	0x7f
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* FLL3 (0x06) */
105*4882a593Smuzhiyun #define NAU8540_GAIN_ERR_SFT		12
106*4882a593Smuzhiyun #define NAU8540_GAIN_ERR_MASK		(0xf << NAU8540_GAIN_ERR_SFT)
107*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_SFT	10
108*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_MASK	(0x3 << NAU8540_FLL_CLK_SRC_SFT)
109*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_MCLK	(0 << NAU8540_FLL_CLK_SRC_SFT)
110*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_BLK	(0x2 << NAU8540_FLL_CLK_SRC_SFT)
111*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_FS		(0x3 << NAU8540_FLL_CLK_SRC_SFT)
112*4882a593Smuzhiyun #define NAU8540_FLL_INTEGER_MASK	0x3ff
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* FLL4 (0x07) */
115*4882a593Smuzhiyun #define NAU8540_FLL_REF_DIV_SFT	10
116*4882a593Smuzhiyun #define NAU8540_FLL_REF_DIV_MASK	(0x3 << NAU8540_FLL_REF_DIV_SFT)
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /* FLL5 (0x08) */
119*4882a593Smuzhiyun #define NAU8540_FLL_PDB_DAC_EN	(0x1 << 15)
120*4882a593Smuzhiyun #define NAU8540_FLL_LOOP_FTR_EN	(0x1 << 14)
121*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SW_MASK	(0x1 << 13)
122*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SW_N2		(0x1 << 13)
123*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SW_REF	(0x0 << 13)
124*4882a593Smuzhiyun #define NAU8540_FLL_FTR_SW_MASK	(0x1 << 12)
125*4882a593Smuzhiyun #define NAU8540_FLL_FTR_SW_ACCU	(0x1 << 12)
126*4882a593Smuzhiyun #define NAU8540_FLL_FTR_SW_FILTER	(0x0 << 12)
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /* FLL6 (0x9) */
129*4882a593Smuzhiyun #define NAU8540_DCO_EN			(0x1 << 15)
130*4882a593Smuzhiyun #define NAU8540_SDM_EN			(0x1 << 14)
131*4882a593Smuzhiyun #define NAU8540_CUTOFF500		(0x1 << 13)
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun /* PCM_CTRL0 (0x10) */
134*4882a593Smuzhiyun #define NAU8540_I2S_BP_SFT		7
135*4882a593Smuzhiyun #define NAU8540_I2S_BP_INV		(0x1 << NAU8540_I2S_BP_SFT)
136*4882a593Smuzhiyun #define NAU8540_I2S_PCMB_SFT		6
137*4882a593Smuzhiyun #define NAU8540_I2S_PCMB_EN		(0x1 << NAU8540_I2S_PCMB_SFT)
138*4882a593Smuzhiyun #define NAU8540_I2S_DL_SFT		2
139*4882a593Smuzhiyun #define NAU8540_I2S_DL_MASK		(0x3 << NAU8540_I2S_DL_SFT)
140*4882a593Smuzhiyun #define NAU8540_I2S_DL_16		(0 << NAU8540_I2S_DL_SFT)
141*4882a593Smuzhiyun #define NAU8540_I2S_DL_20		(0x1 << NAU8540_I2S_DL_SFT)
142*4882a593Smuzhiyun #define NAU8540_I2S_DL_24		(0x2 << NAU8540_I2S_DL_SFT)
143*4882a593Smuzhiyun #define NAU8540_I2S_DL_32		(0x3 << NAU8540_I2S_DL_SFT)
144*4882a593Smuzhiyun #define NAU8540_I2S_DF_MASK		0x3
145*4882a593Smuzhiyun #define NAU8540_I2S_DF_RIGTH		0
146*4882a593Smuzhiyun #define NAU8540_I2S_DF_LEFT		0x1
147*4882a593Smuzhiyun #define NAU8540_I2S_DF_I2S		0x2
148*4882a593Smuzhiyun #define NAU8540_I2S_DF_PCM_AB		0x3
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* PCM_CTRL1 (0x11) */
151*4882a593Smuzhiyun #define NAU8540_I2S_DO12_TRI		(0x1 << 15)
152*4882a593Smuzhiyun #define NAU8540_I2S_LRC_DIV_SFT	12
153*4882a593Smuzhiyun #define NAU8540_I2S_LRC_DIV_MASK	(0x3 << NAU8540_I2S_LRC_DIV_SFT)
154*4882a593Smuzhiyun #define NAU8540_I2S_DO12_OE		(0x1 << 4)
155*4882a593Smuzhiyun #define NAU8540_I2S_MS_SFT		3
156*4882a593Smuzhiyun #define NAU8540_I2S_MS_MASK		(0x1 << NAU8540_I2S_MS_SFT)
157*4882a593Smuzhiyun #define NAU8540_I2S_MS_MASTER		(0x1 << NAU8540_I2S_MS_SFT)
158*4882a593Smuzhiyun #define NAU8540_I2S_MS_SLAVE		(0x0 << NAU8540_I2S_MS_SFT)
159*4882a593Smuzhiyun #define NAU8540_I2S_BLK_DIV_MASK	0x7
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* PCM_CTRL1 (0x12) */
162*4882a593Smuzhiyun #define NAU8540_I2S_DO34_TRI		(0x1 << 15)
163*4882a593Smuzhiyun #define NAU8540_I2S_DO34_OE		(0x1 << 11)
164*4882a593Smuzhiyun #define NAU8540_I2S_TSLOT_L_MASK	0x3ff
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* PCM_CTRL4 (0x14) */
167*4882a593Smuzhiyun #define NAU8540_TDM_MODE		(0x1 << 15)
168*4882a593Smuzhiyun #define NAU8540_TDM_OFFSET_EN		(0x1 << 14)
169*4882a593Smuzhiyun #define NAU8540_TDM_TX_MASK		0xf
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun /* ADC_SAMPLE_RATE (0x3A) */
172*4882a593Smuzhiyun #define NAU8540_CH_SYNC		(0x1 << 14)
173*4882a593Smuzhiyun #define NAU8540_ADC_OSR_MASK		0x3
174*4882a593Smuzhiyun #define NAU8540_ADC_OSR_256		0x3
175*4882a593Smuzhiyun #define NAU8540_ADC_OSR_128		0x2
176*4882a593Smuzhiyun #define NAU8540_ADC_OSR_64		0x1
177*4882a593Smuzhiyun #define NAU8540_ADC_OSR_32		0x0
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun /* VMID_CTRL (0x60) */
180*4882a593Smuzhiyun #define NAU8540_VMID_EN		(1 << 6)
181*4882a593Smuzhiyun #define NAU8540_VMID_SEL_SFT		4
182*4882a593Smuzhiyun #define NAU8540_VMID_SEL_MASK		(0x3 << NAU8540_VMID_SEL_SFT)
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* MIC_BIAS (0x67) */
185*4882a593Smuzhiyun #define NAU8540_PU_PRE			(0x1 << 8)
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /* REFERENCE (0x68) */
188*4882a593Smuzhiyun #define NAU8540_PRECHARGE_DIS		(0x1 << 13)
189*4882a593Smuzhiyun #define NAU8540_GLOBAL_BIAS_EN	(0x1 << 12)
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /* FEPGA1 (0x69) */
192*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH2_SHT_SFT	7
193*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH2_SHT	(0x1 << NAU8540_FEPGA1_MODCH2_SHT_SFT)
194*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH1_SHT_SFT	3
195*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH1_SHT	(0x1 << NAU8540_FEPGA1_MODCH1_SHT_SFT)
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /* FEPGA2 (0x6A) */
198*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH4_SHT_SFT	7
199*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH4_SHT	(0x1 << NAU8540_FEPGA2_MODCH4_SHT_SFT)
200*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH3_SHT_SFT	3
201*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH3_SHT	(0x1 << NAU8540_FEPGA2_MODCH3_SHT_SFT)
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* System Clock Source */
205*4882a593Smuzhiyun enum {
206*4882a593Smuzhiyun 	NAU8540_CLK_DIS,
207*4882a593Smuzhiyun 	NAU8540_CLK_MCLK,
208*4882a593Smuzhiyun 	NAU8540_CLK_INTERNAL,
209*4882a593Smuzhiyun 	NAU8540_CLK_FLL_MCLK,
210*4882a593Smuzhiyun 	NAU8540_CLK_FLL_BLK,
211*4882a593Smuzhiyun 	NAU8540_CLK_FLL_FS,
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun struct nau8540 {
215*4882a593Smuzhiyun 	struct device *dev;
216*4882a593Smuzhiyun 	struct regmap *regmap;
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun struct nau8540_fll {
220*4882a593Smuzhiyun 	int mclk_src;
221*4882a593Smuzhiyun 	int ratio;
222*4882a593Smuzhiyun 	int fll_frac;
223*4882a593Smuzhiyun 	int fll_int;
224*4882a593Smuzhiyun 	int clk_ref_div;
225*4882a593Smuzhiyun };
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun struct nau8540_fll_attr {
228*4882a593Smuzhiyun 	unsigned int param;
229*4882a593Smuzhiyun 	unsigned int val;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /* over sampling rate */
233*4882a593Smuzhiyun struct nau8540_osr_attr {
234*4882a593Smuzhiyun 	unsigned int osr;
235*4882a593Smuzhiyun 	unsigned int clk_src;
236*4882a593Smuzhiyun };
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun #endif	/* __NAU8540_H__ */
240