summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/cs35l35.h
blob: 5a6e43a87c4ddc3e1a6d527c0242cf69af6e87a8 (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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
/*
 * cs35l35.h -- CS35L35 ALSA SoC audio driver
 *
 * Copyright 2016 Cirrus Logic, Inc.
 *
 * Author: Brian Austin <brian.austin@cirrus.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 __CS35L35_H__
#define __CS35L35_H__

#define CS35L35_FIRSTREG		0x01
#define CS35L35_LASTREG			0x7E
#define CS35L35_CHIP_ID			0x00035A35
#define CS35L35_DEVID_AB		0x01	/* Device ID A & B [RO] */
#define CS35L35_DEVID_CD		0x02    /* Device ID C & D [RO] */
#define CS35L35_DEVID_E			0x03    /* Device ID E [RO] */
#define CS35L35_FAB_ID			0x04	/* Fab ID [RO] */
#define CS35L35_REV_ID			0x05	/* Revision ID [RO] */
#define CS35L35_PWRCTL1			0x06    /* Power Ctl 1 */
#define CS35L35_PWRCTL2			0x07    /* Power Ctl 2 */
#define CS35L35_PWRCTL3			0x08	/* Power Ctl 3 */
#define CS35L35_CLK_CTL1		0x0A	/* Clocking Ctl 1 */
#define CS35L35_CLK_CTL2		0x0B	/* Clocking Ctl 2 */
#define CS35L35_CLK_CTL3		0x0C	/* Clocking Ctl 3 */
#define CS35L35_SP_FMT_CTL1		0x0D	/* Serial Port Format CTL1 */
#define CS35L35_SP_FMT_CTL2		0x0E	/* Serial Port Format CTL2 */
#define CS35L35_SP_FMT_CTL3		0x0F	/* Serial Port Format CTL3 */
#define CS35L35_MAG_COMP_CTL		0x13	/* Magnitude Comp CTL */
#define CS35L35_AMP_INP_DRV_CTL		0x14	/* Amp Input Drive Ctl */
#define CS35L35_AMP_DIG_VOL_CTL		0x15	/* Amplifier Dig Volume Ctl */
#define CS35L35_AMP_DIG_VOL		0x16	/* Amplifier Dig Volume */
#define CS35L35_ADV_DIG_VOL		0x17	/* Advisory Digital Volume */
#define CS35L35_PROTECT_CTL		0x18	/* Amp Gain - Prot Ctl Param */
#define CS35L35_AMP_GAIN_AUD_CTL	0x19	/* Amp Serial Port Gain Ctl */
#define CS35L35_AMP_GAIN_PDM_CTL	0x1A	/* Amplifier Gain PDM Ctl */
#define CS35L35_AMP_GAIN_ADV_CTL	0x1B	/* Amplifier Gain Ctl */
#define CS35L35_GPI_CTL			0x1C	/* GPI Ctl */
#define CS35L35_BST_CVTR_V_CTL		0x1D	/* Boost Conv Voltage Ctl */
#define CS35L35_BST_PEAK_I		0x1E	/* Boost Conv Peak Current */
#define CS35L35_BST_RAMP_CTL		0x20	/* Boost Conv Soft Ramp Ctl */
#define CS35L35_BST_CONV_COEF_1		0x21	/* Boost Conv Coefficients 1 */
#define CS35L35_BST_CONV_COEF_2		0x22	/* Boost Conv Coefficients 2 */
#define CS35L35_BST_CONV_SLOPE_COMP	0x23	/* Boost Conv Slope Comp */
#define CS35L35_BST_CONV_SW_FREQ	0x24	/* Boost Conv L BST SW Freq */
#define CS35L35_CLASS_H_CTL		0x30	/* CLS H Control */
#define CS35L35_CLASS_H_HEADRM_CTL	0x31	/* CLS H Headroom Ctl */
#define CS35L35_CLASS_H_RELEASE_RATE	0x32	/* CLS H Release Rate */
#define CS35L35_CLASS_H_FET_DRIVE_CTL	0x33	/* CLS H Weak FET Drive Ctl */
#define CS35L35_CLASS_H_VP_CTL		0x34	/* CLS H VP Ctl */
#define CS35L35_CLASS_H_STATUS		0x38	/* CLS H Status */
#define CS35L35_VPBR_CTL		0x3A	/* VPBR Ctl */
#define CS35L35_VPBR_VOL_CTL		0x3B	/* VPBR Volume Ctl */
#define CS35L35_VPBR_TIMING_CTL		0x3C	/* VPBR Timing Ctl */
#define CS35L35_VPBR_MODE_VOL_CTL	0x3D	/* VPBR Mode/Attack Vol Ctl */
#define CS35L35_VPBR_ATTEN_STATUS	0x4B	/* VPBR Attenuation Status */
#define CS35L35_SPKR_MON_CTL		0x4E	/* Speaker Monitoring Ctl */
#define CS35L35_IMON_SCALE_CTL		0x51	/* IMON Scale Ctl */
#define CS35L35_AUDIN_RXLOC_CTL		0x52	/* Audio Input RX Loc Ctl */
#define CS35L35_ADVIN_RXLOC_CTL		0x53	/* Advisory Input RX Loc Ctl */
#define CS35L35_VMON_TXLOC_CTL		0x54	/* VMON TX Loc Ctl */
#define CS35L35_IMON_TXLOC_CTL		0x55	/* IMON TX Loc Ctl */
#define CS35L35_VPMON_TXLOC_CTL		0x56	/* VPMON TX Loc Ctl */
#define CS35L35_VBSTMON_TXLOC_CTL	0x57	/* VBSTMON TX Loc Ctl */
#define CS35L35_VPBR_STATUS_TXLOC_CTL	0x58	/* VPBR Status TX Loc Ctl */
#define CS35L35_ZERO_FILL_LOC_CTL	0x59	/* Zero Fill Loc Ctl */
#define CS35L35_AUDIN_DEPTH_CTL		0x5A	/* Audio Input Depth Ctl */
#define CS35L35_SPKMON_DEPTH_CTL	0x5B	/* SPK Mon Output Depth Ctl */
#define CS35L35_SUPMON_DEPTH_CTL	0x5C	/* Supply Mon Out Depth Ctl */
#define CS35L35_ZEROFILL_DEPTH_CTL	0x5D	/* Zero Fill Mon Output Ctl */
#define CS35L35_MULT_DEV_SYNCH1		0x62	/* Multidevice Synch */
#define CS35L35_MULT_DEV_SYNCH2		0x63	/* Multidevice Synch 2 */
#define CS35L35_PROT_RELEASE_CTL	0x64	/* Protection Release Ctl */
#define CS35L35_DIAG_MODE_REG_LOCK	0x68	/* Diagnostic Mode Reg Lock */
#define CS35L35_DIAG_MODE_CTL_1		0x69	/* Diagnostic Mode Ctl 1 */
#define CS35L35_DIAG_MODE_CTL_2		0x6A	/* Diagnostic Mode Ctl 2 */
#define CS35L35_INT_MASK_1		0x70	/* Interrupt Mask 1 */
#define CS35L35_INT_MASK_2		0x71	/* Interrupt Mask 2 */
#define CS35L35_INT_MASK_3		0x72	/* Interrupt Mask 3 */
#define CS35L35_INT_MASK_4		0x73	/* Interrupt Mask 4 */
#define CS35L35_INT_STATUS_1		0x74	/* Interrupt Status 1 */
#define CS35L35_INT_STATUS_2		0x75	/* Interrupt Status 2 */
#define CS35L35_INT_STATUS_3		0x76	/* Interrupt Status 3 */
#define CS35L35_INT_STATUS_4		0x77	/* Interrupt Status 4 */
#define CS35L35_PLL_STATUS		0x78	/* PLL Status */
#define CS35L35_OTP_TRIM_STATUS		0x7E	/* OTP Trim Status */

#define CS35L35_MAX_REGISTER		0x7F

/* CS35L35_PWRCTL1 */
#define CS35L35_SFT_RST			0x80
#define CS35L35_DISCHG_FLT		0x02
#define CS35L35_PDN_ALL			0x01

/* CS35L35_PWRCTL2 */
#define CS35L35_PDN_VMON		0x80
#define CS35L35_PDN_IMON		0x40
#define CS35L35_PDN_CLASSH		0x20
#define CS35L35_PDN_VPBR		0x10
#define CS35L35_PDN_BST			0x04
#define CS35L35_PDN_AMP			0x01

/* CS35L35_PWRCTL3 */
#define CS35L35_PDN_VBSTMON_OUT		0x10
#define CS35L35_PDN_VMON_OUT		0x08

#define CS35L35_AUDIN_DEPTH_MASK	0x03
#define CS35L35_AUDIN_DEPTH_SHIFT	0
#define CS35L35_ADVIN_DEPTH_MASK	0x0C
#define CS35L35_ADVIN_DEPTH_SHIFT	2
#define CS35L35_SDIN_DEPTH_8		0x01
#define CS35L35_SDIN_DEPTH_16		0x02
#define CS35L35_SDIN_DEPTH_24		0x03

#define CS35L35_SDOUT_DEPTH_8		0x01
#define CS35L35_SDOUT_DEPTH_12		0x02
#define CS35L35_SDOUT_DEPTH_16		0x03

#define CS35L35_AUD_IN_LR_MASK		0x80
#define CS35L35_AUD_IN_LR_SHIFT		7
#define CS35L35_ADV_IN_LR_MASK		0x80
#define CS35L35_ADV_IN_LR_SHIFT		7
#define CS35L35_AUD_IN_LOC_MASK		0x0F
#define CS35L35_AUD_IN_LOC_SHIFT	0
#define CS35L35_ADV_IN_LOC_MASK		0x0F
#define CS35L35_ADV_IN_LOC_SHIFT	0

#define CS35L35_IMON_DEPTH_MASK		0x03
#define CS35L35_IMON_DEPTH_SHIFT	0
#define CS35L35_VMON_DEPTH_MASK		0x0C
#define CS35L35_VMON_DEPTH_SHIFT	2
#define CS35L35_VBSTMON_DEPTH_MASK	0x03
#define CS35L35_VBSTMON_DEPTH_SHIFT	0
#define CS35L35_VPMON_DEPTH_MASK	0x0C
#define CS35L35_VPMON_DEPTH_SHIFT	2
#define CS35L35_VPBRSTAT_DEPTH_MASK	0x30
#define CS35L35_VPBRSTAT_DEPTH_SHIFT	4
#define CS35L35_ZEROFILL_DEPTH_MASK	0x03
#define CS35L35_ZEROFILL_DEPTH_SHIFT	0x00

#define CS35L35_MON_TXLOC_MASK		0x3F
#define CS35L35_MON_TXLOC_SHIFT		0
#define CS35L35_MON_FRM_MASK		0x80
#define CS35L35_MON_FRM_SHIFT		7

#define CS35L35_IMON_SCALE_MASK		0xF8
#define CS35L35_IMON_SCALE_SHIFT	3

#define CS35L35_MS_MASK			0x80
#define CS35L35_MS_SHIFT		7
#define CS35L35_SPMODE_MASK		0x40
#define CS35L35_SP_DRV_MASK		0x10
#define CS35L35_SP_DRV_SHIFT		4
#define CS35L35_CLK_CTL2_MASK		0xFF
#define CS35L35_PDM_MODE_MASK		0x40
#define CS35L35_PDM_MODE_SHIFT		6
#define CS35L35_CLK_SOURCE_MASK		0x03
#define CS35L35_CLK_SOURCE_SHIFT	0
#define CS35L35_CLK_SOURCE_MCLK		0
#define CS35L35_CLK_SOURCE_SCLK		1
#define CS35L35_CLK_SOURCE_PDM		2

#define CS35L35_SP_SCLKS_MASK		0x0F
#define CS35L35_SP_SCLKS_SHIFT		0x00
#define CS35L35_SP_SCLKS_16FS		0x03
#define CS35L35_SP_SCLKS_32FS		0x07
#define CS35L35_SP_SCLKS_48FS		0x0B
#define CS35L35_SP_SCLKS_64FS		0x0F
#define CS35L35_SP_RATE_MASK		0xC0

#define CS35L35_PDN_BST_MASK		0x06
#define CS35L35_PDN_BST_FETON_SHIFT	1
#define CS35L35_PDN_BST_FETOFF_SHIFT	2
#define CS35L35_PWR2_PDN_MASK		0xE0
#define CS35L35_PWR3_PDN_MASK		0x1E
#define CS35L35_PDN_ALL_MASK		0x01
#define CS35L35_DISCHG_FILT_MASK	0x02
#define CS35L35_DISCHG_FILT_SHIFT	1
#define CS35L35_MCLK_DIS_MASK		0x04
#define CS35L35_MCLK_DIS_SHIFT		2

#define CS35L35_BST_CTL_MASK		0x7F
#define CS35L35_BST_CTL_SHIFT		0
#define CS35L35_BST_IPK_MASK		0x1F
#define CS35L35_BST_IPK_SHIFT		0
#define CS35L35_AMP_MUTE_MASK		0x20
#define CS35L35_AMP_MUTE_SHIFT		5
#define CS35L35_AMP_GAIN_ZC_MASK	0x10
#define CS35L35_AMP_GAIN_ZC_SHIFT	4

#define CS35L35_AMP_DIGSFT_MASK		0x02
#define CS35L35_AMP_DIGSFT_SHIFT	1

/* CS35L35_SP_FMT_CTL3 */
#define CS35L35_SP_I2S_DRV_MASK		0x03
#define CS35L35_SP_I2S_DRV_SHIFT	0

/* Class H Algorithm Control */
#define CS35L35_CH_STEREO_MASK		0x40
#define CS35L35_CH_STEREO_SHIFT		6
#define CS35L35_CH_BST_OVR_MASK		0x04
#define CS35L35_CH_BST_OVR_SHIFT	2
#define CS35L35_CH_BST_LIM_MASK		0x08
#define CS35L35_CH_BST_LIM_SHIFT	3
#define CS35L35_CH_MEM_DEPTH_MASK	0x01
#define CS35L35_CH_MEM_DEPTH_SHIFT	0
#define CS35L35_CH_HDRM_CTL_MASK	0x3F
#define CS35L35_CH_HDRM_CTL_SHIFT	0
#define CS35L35_CH_REL_RATE_MASK	0xFF
#define CS35L35_CH_REL_RATE_SHIFT	0
#define CS35L35_CH_WKFET_DIS_MASK	0x80
#define CS35L35_CH_WKFET_DIS_SHIFT	7
#define CS35L35_CH_WKFET_DEL_MASK	0x70
#define CS35L35_CH_WKFET_DEL_SHIFT	4
#define CS35L35_CH_WKFET_THLD_MASK	0x0F
#define CS35L35_CH_WKFET_THLD_SHIFT	0
#define CS35L35_CH_VP_AUTO_MASK		0x80
#define CS35L35_CH_VP_AUTO_SHIFT	7
#define CS35L35_CH_VP_RATE_MASK		0x60
#define CS35L35_CH_VP_RATE_SHIFT	5
#define CS35L35_CH_VP_MAN_MASK		0x1F
#define CS35L35_CH_VP_MAN_SHIFT		0

/* CS35L35_PROT_RELEASE_CTL */
#define CS35L35_CAL_ERR_RLS		0x80
#define CS35L35_SHORT_RLS		0x04
#define CS35L35_OTW_RLS			0x02
#define CS35L35_OTE_RLS			0x01

/* INT Mask Registers */
#define CS35L35_INT1_CRIT_MASK		0x38
#define CS35L35_INT2_CRIT_MASK		0xEF
#define CS35L35_INT3_CRIT_MASK		0xEE
#define CS35L35_INT4_CRIT_MASK		0xFF

/* PDN DONE Masks */
#define CS35L35_M_PDN_DONE_SHIFT	4
#define CS35L35_M_PDN_DONE_MASK		0x10

/* CS35L35_INT_1 */
#define CS35L35_CAL_ERR			0x80
#define CS35L35_OTP_ERR			0x40
#define CS35L35_LRCLK_ERR		0x20
#define CS35L35_SPCLK_ERR		0x10
#define CS35L35_MCLK_ERR		0x08
#define CS35L35_AMP_SHORT		0x04
#define CS35L35_OTW			0x02
#define CS35L35_OTE			0x01

/* CS35L35_INT_2 */
#define CS35L35_PDN_DONE		0x10
#define CS35L35_VPBR_ERR		0x02
#define CS35L35_VPBR_CLR		0x01

/* CS35L35_INT_3 */
#define CS35L35_BST_HIGH		0x10
#define CS35L35_BST_HIGH_FLAG		0x08
#define CS35L35_BST_IPK_FLAG		0x04
#define CS35L35_LBST_SHORT		0x01

/* CS35L35_INT_4 */
#define CS35L35_VMON_OVFL		0x08
#define CS35L35_IMON_OVFL		0x04

#define CS35L35_FORMATS (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | \
			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)

struct  cs35l35_private {
	struct device *dev;
	struct cs35l35_platform_data pdata;
	struct regmap *regmap;
	struct regulator_bulk_data supplies[2];
	int num_supplies;
	int sysclk;
	int sclk;
	bool pdm_mode;
	bool i2s_mode;
	bool slave_mode;
	/* GPIO for /RST */
	struct gpio_desc *reset_gpio;
	struct completion pdn_done;
};

static const char * const cs35l35_supplies[] = {
	"VA",
	"VP",
};

#endif