summaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/pcm186x.h
blob: b630111bb3c4fb3f4d455676685f72cd75ae0289 (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
// SPDX-License-Identifier: GPL-2.0
/*
 * Texas Instruments PCM186x Universal Audio ADC
 *
 * Copyright (C) 2015-2017 Texas Instruments Incorporated - http://www.ti.com
 *	Andreas Dannenberg <dannenberg@ti.com>
 *	Andrew F. Davis <afd@ti.com>
 */

#ifndef _PCM186X_H_
#define _PCM186X_H_

#include <linux/pm.h>
#include <linux/regmap.h>

enum pcm186x_type {
	PCM1862,
	PCM1863,
	PCM1864,
	PCM1865,
};

#define PCM186X_RATES	SNDRV_PCM_RATE_8000_192000
#define PCM186X_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE | \
			 SNDRV_PCM_FMTBIT_S20_3LE |\
			 SNDRV_PCM_FMTBIT_S24_LE | \
			 SNDRV_PCM_FMTBIT_S32_LE)

#define PCM186X_PAGE_LEN		0x0100
#define PCM186X_PAGE_BASE(n)		(PCM186X_PAGE_LEN * n)

/* The page selection register address is the same on all pages */
#define PCM186X_PAGE			0

/* Register Definitions - Page 0 */
#define PCM186X_PGA_VAL_CH1_L		(PCM186X_PAGE_BASE(0) +   1)
#define PCM186X_PGA_VAL_CH1_R		(PCM186X_PAGE_BASE(0) +   2)
#define PCM186X_PGA_VAL_CH2_L		(PCM186X_PAGE_BASE(0) +   3)
#define PCM186X_PGA_VAL_CH2_R		(PCM186X_PAGE_BASE(0) +   4)
#define PCM186X_PGA_CTRL		(PCM186X_PAGE_BASE(0) +   5)
#define PCM186X_ADC1_INPUT_SEL_L	(PCM186X_PAGE_BASE(0) +   6)
#define PCM186X_ADC1_INPUT_SEL_R	(PCM186X_PAGE_BASE(0) +   7)
#define PCM186X_ADC2_INPUT_SEL_L	(PCM186X_PAGE_BASE(0) +   8)
#define PCM186X_ADC2_INPUT_SEL_R	(PCM186X_PAGE_BASE(0) +   9)
#define PCM186X_AUXADC_INPUT_SEL	(PCM186X_PAGE_BASE(0) +  10)
#define PCM186X_PCM_CFG			(PCM186X_PAGE_BASE(0) +  11)
#define PCM186X_TDM_TX_SEL		(PCM186X_PAGE_BASE(0) +  12)
#define PCM186X_TDM_TX_OFFSET		(PCM186X_PAGE_BASE(0) +  13)
#define PCM186X_TDM_RX_OFFSET		(PCM186X_PAGE_BASE(0) +  14)
#define PCM186X_DPGA_VAL_CH1_L		(PCM186X_PAGE_BASE(0) +  15)
#define PCM186X_GPIO1_0_CTRL		(PCM186X_PAGE_BASE(0) +  16)
#define PCM186X_GPIO3_2_CTRL		(PCM186X_PAGE_BASE(0) +  17)
#define PCM186X_GPIO1_0_DIR_CTRL	(PCM186X_PAGE_BASE(0) +  18)
#define PCM186X_GPIO3_2_DIR_CTRL	(PCM186X_PAGE_BASE(0) +  19)
#define PCM186X_GPIO_IN_OUT		(PCM186X_PAGE_BASE(0) +  20)
#define PCM186X_GPIO_PULL_CTRL		(PCM186X_PAGE_BASE(0) +  21)
#define PCM186X_DPGA_VAL_CH1_R		(PCM186X_PAGE_BASE(0) +  22)
#define PCM186X_DPGA_VAL_CH2_L		(PCM186X_PAGE_BASE(0) +  23)
#define PCM186X_DPGA_VAL_CH2_R		(PCM186X_PAGE_BASE(0) +  24)
#define PCM186X_DPGA_GAIN_CTRL		(PCM186X_PAGE_BASE(0) +  25)
#define PCM186X_DPGA_MIC_CTRL		(PCM186X_PAGE_BASE(0) +  26)
#define PCM186X_DIN_RESAMP_CTRL		(PCM186X_PAGE_BASE(0) +  27)
#define PCM186X_CLK_CTRL		(PCM186X_PAGE_BASE(0) +  32)
#define PCM186X_DSP1_CLK_DIV		(PCM186X_PAGE_BASE(0) +  33)
#define PCM186X_DSP2_CLK_DIV		(PCM186X_PAGE_BASE(0) +  34)
#define PCM186X_ADC_CLK_DIV		(PCM186X_PAGE_BASE(0) +  35)
#define PCM186X_PLL_SCK_DIV		(PCM186X_PAGE_BASE(0) +  37)
#define PCM186X_BCK_DIV			(PCM186X_PAGE_BASE(0) +  38)
#define PCM186X_LRK_DIV			(PCM186X_PAGE_BASE(0) +  39)
#define PCM186X_PLL_CTRL		(PCM186X_PAGE_BASE(0) +  40)
#define PCM186X_PLL_P_DIV		(PCM186X_PAGE_BASE(0) +  41)
#define PCM186X_PLL_R_DIV		(PCM186X_PAGE_BASE(0) +  42)
#define PCM186X_PLL_J_DIV		(PCM186X_PAGE_BASE(0) +  43)
#define PCM186X_PLL_D_DIV_LSB		(PCM186X_PAGE_BASE(0) +  44)
#define PCM186X_PLL_D_DIV_MSB		(PCM186X_PAGE_BASE(0) +  45)
#define PCM186X_SIGDET_MODE		(PCM186X_PAGE_BASE(0) +  48)
#define PCM186X_SIGDET_MASK		(PCM186X_PAGE_BASE(0) +  49)
#define PCM186X_SIGDET_STAT		(PCM186X_PAGE_BASE(0) +  50)
#define PCM186X_SIGDET_LOSS_TIME	(PCM186X_PAGE_BASE(0) +  52)
#define PCM186X_SIGDET_SCAN_TIME	(PCM186X_PAGE_BASE(0) +  53)
#define PCM186X_SIGDET_INT_INTVL	(PCM186X_PAGE_BASE(0) +  54)
#define PCM186X_SIGDET_DC_REF_CH1_L	(PCM186X_PAGE_BASE(0) +  64)
#define PCM186X_SIGDET_DC_DIFF_CH1_L	(PCM186X_PAGE_BASE(0) +  65)
#define PCM186X_SIGDET_DC_LEV_CH1_L	(PCM186X_PAGE_BASE(0) +  66)
#define PCM186X_SIGDET_DC_REF_CH1_R	(PCM186X_PAGE_BASE(0) +  67)
#define PCM186X_SIGDET_DC_DIFF_CH1_R	(PCM186X_PAGE_BASE(0) +  68)
#define PCM186X_SIGDET_DC_LEV_CH1_R	(PCM186X_PAGE_BASE(0) +  69)
#define PCM186X_SIGDET_DC_REF_CH2_L	(PCM186X_PAGE_BASE(0) +  70)
#define PCM186X_SIGDET_DC_DIFF_CH2_L	(PCM186X_PAGE_BASE(0) +  71)
#define PCM186X_SIGDET_DC_LEV_CH2_L	(PCM186X_PAGE_BASE(0) +  72)
#define PCM186X_SIGDET_DC_REF_CH2_R	(PCM186X_PAGE_BASE(0) +  73)
#define PCM186X_SIGDET_DC_DIFF_CH2_R	(PCM186X_PAGE_BASE(0) +  74)
#define PCM186X_SIGDET_DC_LEV_CH2_R	(PCM186X_PAGE_BASE(0) +  75)
#define PCM186X_SIGDET_DC_REF_CH3_L	(PCM186X_PAGE_BASE(0) +  76)
#define PCM186X_SIGDET_DC_DIFF_CH3_L	(PCM186X_PAGE_BASE(0) +  77)
#define PCM186X_SIGDET_DC_LEV_CH3_L	(PCM186X_PAGE_BASE(0) +  78)
#define PCM186X_SIGDET_DC_REF_CH3_R	(PCM186X_PAGE_BASE(0) +  79)
#define PCM186X_SIGDET_DC_DIFF_CH3_R	(PCM186X_PAGE_BASE(0) +  80)
#define PCM186X_SIGDET_DC_LEV_CH3_R	(PCM186X_PAGE_BASE(0) +  81)
#define PCM186X_SIGDET_DC_REF_CH4_L	(PCM186X_PAGE_BASE(0) +  82)
#define PCM186X_SIGDET_DC_DIFF_CH4_L	(PCM186X_PAGE_BASE(0) +  83)
#define PCM186X_SIGDET_DC_LEV_CH4_L	(PCM186X_PAGE_BASE(0) +  84)
#define PCM186X_SIGDET_DC_REF_CH4_R	(PCM186X_PAGE_BASE(0) +  85)
#define PCM186X_SIGDET_DC_DIFF_CH4_R	(PCM186X_PAGE_BASE(0) +  86)
#define PCM186X_SIGDET_DC_LEV_CH4_R	(PCM186X_PAGE_BASE(0) +  87)
#define PCM186X_AUXADC_DATA_CTRL	(PCM186X_PAGE_BASE(0) +  88)
#define PCM186X_AUXADC_DATA_LSB		(PCM186X_PAGE_BASE(0) +  89)
#define PCM186X_AUXADC_DATA_MSB		(PCM186X_PAGE_BASE(0) +  90)
#define PCM186X_INT_ENABLE		(PCM186X_PAGE_BASE(0) +  96)
#define PCM186X_INT_FLAG		(PCM186X_PAGE_BASE(0) +  97)
#define PCM186X_INT_POL_WIDTH		(PCM186X_PAGE_BASE(0) +  98)
#define PCM186X_POWER_CTRL		(PCM186X_PAGE_BASE(0) + 112)
#define PCM186X_FILTER_MUTE_CTRL	(PCM186X_PAGE_BASE(0) + 113)
#define PCM186X_DEVICE_STATUS		(PCM186X_PAGE_BASE(0) + 114)
#define PCM186X_FSAMPLE_STATUS		(PCM186X_PAGE_BASE(0) + 115)
#define PCM186X_DIV_STATUS		(PCM186X_PAGE_BASE(0) + 116)
#define PCM186X_CLK_STATUS		(PCM186X_PAGE_BASE(0) + 117)
#define PCM186X_SUPPLY_STATUS		(PCM186X_PAGE_BASE(0) + 120)

/* Register Definitions - Page 1 */
#define PCM186X_MMAP_STAT_CTRL		(PCM186X_PAGE_BASE(1) +   1)
#define PCM186X_MMAP_ADDRESS		(PCM186X_PAGE_BASE(1) +   2)
#define PCM186X_MEM_WDATA0		(PCM186X_PAGE_BASE(1) +   4)
#define PCM186X_MEM_WDATA1		(PCM186X_PAGE_BASE(1) +   5)
#define PCM186X_MEM_WDATA2		(PCM186X_PAGE_BASE(1) +   6)
#define PCM186X_MEM_WDATA3		(PCM186X_PAGE_BASE(1) +   7)
#define PCM186X_MEM_RDATA0		(PCM186X_PAGE_BASE(1) +   8)
#define PCM186X_MEM_RDATA1		(PCM186X_PAGE_BASE(1) +   9)
#define PCM186X_MEM_RDATA2		(PCM186X_PAGE_BASE(1) +  10)
#define PCM186X_MEM_RDATA3		(PCM186X_PAGE_BASE(1) +  11)

/* Register Definitions - Page 3 */
#define PCM186X_OSC_PWR_DOWN_CTRL	(PCM186X_PAGE_BASE(3) +  18)
#define PCM186X_MIC_BIAS_CTRL		(PCM186X_PAGE_BASE(3) +  21)

/* Register Definitions - Page 253 */
#define PCM186X_CURR_TRIM_CTRL		(PCM186X_PAGE_BASE(253) +  20)

#define PCM186X_MAX_REGISTER		PCM186X_CURR_TRIM_CTRL

/* PCM186X_PAGE */
#define PCM186X_RESET			0xff

/* PCM186X_ADCX_INPUT_SEL_X */
#define PCM186X_ADC_INPUT_SEL_POL	BIT(7)
#define PCM186X_ADC_INPUT_SEL_MASK	GENMASK(5, 0)

/* PCM186X_PCM_CFG */
#define PCM186X_PCM_CFG_RX_WLEN_MASK	GENMASK(7, 6)
#define PCM186X_PCM_CFG_RX_WLEN_SHIFT	6
#define PCM186X_PCM_CFG_RX_WLEN_32	0x00
#define PCM186X_PCM_CFG_RX_WLEN_24	0x01
#define PCM186X_PCM_CFG_RX_WLEN_20	0x02
#define PCM186X_PCM_CFG_RX_WLEN_16	0x03
#define PCM186X_PCM_CFG_TDM_LRCK_MODE	BIT(4)
#define PCM186X_PCM_CFG_TX_WLEN_MASK	GENMASK(3, 2)
#define PCM186X_PCM_CFG_TX_WLEN_SHIFT	2
#define PCM186X_PCM_CFG_TX_WLEN_32	0x00
#define PCM186X_PCM_CFG_TX_WLEN_24	0x01
#define PCM186X_PCM_CFG_TX_WLEN_20	0x02
#define PCM186X_PCM_CFG_TX_WLEN_16	0x03
#define PCM186X_PCM_CFG_FMT_MASK	GENMASK(1, 0)
#define PCM186X_PCM_CFG_FMT_SHIFT	0
#define PCM186X_PCM_CFG_FMT_I2S		0x00
#define PCM186X_PCM_CFG_FMT_LEFTJ	0x01
#define PCM186X_PCM_CFG_FMT_RIGHTJ	0x02
#define PCM186X_PCM_CFG_FMT_TDM		0x03

/* PCM186X_TDM_TX_SEL */
#define PCM186X_TDM_TX_SEL_2CH		0x00
#define PCM186X_TDM_TX_SEL_4CH		0x01
#define PCM186X_TDM_TX_SEL_6CH		0x02
#define PCM186X_TDM_TX_SEL_MASK		0x03

/* PCM186X_CLK_CTRL */
#define PCM186X_CLK_CTRL_SCK_XI_SEL1	BIT(7)
#define PCM186X_CLK_CTRL_SCK_XI_SEL0	BIT(6)
#define PCM186X_CLK_CTRL_SCK_SRC_PLL	BIT(5)
#define PCM186X_CLK_CTRL_MST_MODE	BIT(4)
#define PCM186X_CLK_CTRL_ADC_SRC_PLL	BIT(3)
#define PCM186X_CLK_CTRL_DSP2_SRC_PLL	BIT(2)
#define PCM186X_CLK_CTRL_DSP1_SRC_PLL	BIT(1)
#define PCM186X_CLK_CTRL_CLKDET_EN	BIT(0)

/* PCM186X_PLL_CTRL */
#define PCM186X_PLL_CTRL_LOCK		BIT(4)
#define PCM186X_PLL_CTRL_REF_SEL	BIT(1)
#define PCM186X_PLL_CTRL_EN		BIT(0)

/* PCM186X_POWER_CTRL */
#define PCM186X_PWR_CTRL_PWRDN		BIT(2)
#define PCM186X_PWR_CTRL_SLEEP		BIT(1)
#define PCM186X_PWR_CTRL_STBY		BIT(0)

/* PCM186X_CLK_STATUS */
#define PCM186X_CLK_STATUS_LRCKHLT	BIT(6)
#define PCM186X_CLK_STATUS_BCKHLT	BIT(5)
#define PCM186X_CLK_STATUS_SCKHLT	BIT(4)
#define PCM186X_CLK_STATUS_LRCKERR	BIT(2)
#define PCM186X_CLK_STATUS_BCKERR	BIT(1)
#define PCM186X_CLK_STATUS_SCKERR	BIT(0)

/* PCM186X_SUPPLY_STATUS */
#define PCM186X_SUPPLY_STATUS_DVDD	BIT(2)
#define PCM186X_SUPPLY_STATUS_AVDD	BIT(1)
#define PCM186X_SUPPLY_STATUS_LDO	BIT(0)

/* PCM186X_MMAP_STAT_CTRL */
#define PCM186X_MMAP_STAT_DONE		BIT(4)
#define PCM186X_MMAP_STAT_BUSY		BIT(2)
#define PCM186X_MMAP_STAT_R_REQ		BIT(1)
#define PCM186X_MMAP_STAT_W_REQ		BIT(0)

extern const struct regmap_config pcm186x_regmap;

int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq,
		  struct regmap *regmap);
int pcm186x_remove(struct device *dev);

#endif /* _PCM186X_H_ */