summaryrefslogtreecommitdiffstats
path: root/kernel/sound/soc/codecs/cs42l73.h
blob: 45746186a67820fd40678e452fc7b67a790ac69a (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
/*
 * ALSA SoC CS42L73 codec driver
 *
 * Copyright 2011 Cirrus Logic, Inc.
 *
 * Author: Georgi Vlaev <joe@nucleusys.com>
 *	   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.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

#ifndef __CS42L73_H__
#define __CS42L73_H__

/* I2C Registers */
/* I2C Address: 1001010[R/W] - 10010100 = 0x94(Write); 10010101 = 0x95(Read) */
#define CS42L73_CHIP_ID		0x4a
#define CS42L73_DEVID_AB	0x01	/* Device ID A & B [RO]. */
#define CS42L73_DEVID_CD	0x02    /* Device ID C & D [RO]. */
#define CS42L73_DEVID_E		0x03    /* Device ID E [RO]. */
#define CS42L73_REVID		0x05    /* Revision ID [RO]. */
#define CS42L73_PWRCTL1		0x06    /* Power Control 1. */
#define CS42L73_PWRCTL2		0x07    /* Power Control 2. */
#define CS42L73_PWRCTL3		0x08    /* Power Control 3. */
#define CS42L73_CPFCHC		0x09    /* Charge Pump Freq. Class H Ctl. */
#define CS42L73_OLMBMSDC	0x0A    /* Output Load, MIC Bias, MIC2 SDT */
#define CS42L73_DMMCC		0x0B    /* Digital MIC & Master Clock Ctl. */
#define CS42L73_XSPC		0x0C    /* Auxiliary Serial Port (XSP) Ctl. */
#define CS42L73_XSPMMCC		0x0D    /* XSP Master Mode Clocking Control. */
#define CS42L73_ASPC		0x0E    /* Audio Serial Port (ASP) Control. */
#define CS42L73_ASPMMCC		0x0F    /* ASP Master Mode Clocking Control. */
#define CS42L73_VSPC		0x10    /* Voice Serial Port (VSP) Control. */
#define CS42L73_VSPMMCC		0x11    /* VSP Master Mode Clocking Control. */
#define CS42L73_VXSPFS		0x12    /* VSP & XSP Sample Rate. */
#define CS42L73_MIOPC		0x13    /* Misc. Input & Output Path Control. */
#define CS42L73_ADCIPC		0x14	/* ADC/IP Control. */
#define CS42L73_MICAPREPGAAVOL	0x15	/* MIC 1 [A] PreAmp, PGAA Vol. */
#define CS42L73_MICBPREPGABVOL	0x16	/* MIC 2 [B] PreAmp, PGAB Vol. */
#define CS42L73_IPADVOL		0x17	/* Input Pat7h A Digital Volume. */
#define CS42L73_IPBDVOL		0x18	/* Input Path B Digital Volume. */
#define CS42L73_PBDC		0x19	/* Playback Digital Control. */
#define CS42L73_HLADVOL		0x1A	/* HP/Line A Out Digital Vol. */
#define CS42L73_HLBDVOL		0x1B	/* HP/Line B Out Digital Vol. */
#define CS42L73_SPKDVOL		0x1C	/* Spkphone Out [A] Digital Vol. */
#define CS42L73_ESLDVOL		0x1D	/* Ear/Spkphone LO [B] Digital */
#define CS42L73_HPAAVOL		0x1E	/* HP A Analog Volume. */
#define CS42L73_HPBAVOL		0x1F	/* HP B Analog Volume. */
#define CS42L73_LOAAVOL		0x20	/* Line Out A Analog Volume. */
#define CS42L73_LOBAVOL		0x21	/* Line Out B Analog Volume. */
#define CS42L73_STRINV		0x22	/* Stereo Input Path Adv. Vol. */
#define CS42L73_XSPINV		0x23	/* Auxiliary Port Input Advisory Vol. */
#define CS42L73_ASPINV		0x24	/* Audio Port Input Advisory Vol. */
#define CS42L73_VSPINV		0x25	/* Voice Port Input Advisory Vol. */
#define CS42L73_LIMARATEHL	0x26	/* Lmtr Attack Rate HP/Line. */
#define CS42L73_LIMRRATEHL	0x27	/* Lmtr Ctl, Rel.Rate HP/Line. */
#define CS42L73_LMAXHL		0x28	/* Lmtr Thresholds HP/Line. */
#define CS42L73_LIMARATESPK	0x29	/* Lmtr Attack Rate Spkphone [A]. */
#define CS42L73_LIMRRATESPK	0x2A	/* Lmtr Ctl,Release Rate Spk. [A]. */
#define CS42L73_LMAXSPK		0x2B	/* Lmtr Thresholds Spkphone [A]. */
#define CS42L73_LIMARATEESL	0x2C	/* Lmtr Attack Rate  */
#define CS42L73_LIMRRATEESL	0x2D	/* Lmtr Ctl,Release Rate */
#define CS42L73_LMAXESL		0x2E	/* Lmtr Thresholds */
#define CS42L73_ALCARATE	0x2F	/* ALC Enable, Attack Rate AB. */
#define CS42L73_ALCRRATE	0x30	/* ALC Release Rate AB.  */
#define CS42L73_ALCMINMAX	0x31	/* ALC Thresholds AB. */
#define CS42L73_NGCAB		0x32	/* Noise Gate Ctl AB. */
#define CS42L73_ALCNGMC		0x33	/* ALC & Noise Gate Misc Ctl. */
#define CS42L73_MIXERCTL	0x34	/* Mixer Control. */
#define CS42L73_HLAIPAA		0x35	/* HP/LO Left Mixer: L. */
#define CS42L73_HLBIPBA		0x36	/* HP/LO Right Mixer: R.  */
#define CS42L73_HLAXSPAA	0x37	/* HP/LO Left Mixer: XSP L */
#define CS42L73_HLBXSPBA	0x38	/* HP/LO Right Mixer: XSP R */
#define CS42L73_HLAASPAA	0x39	/* HP/LO Left Mixer: ASP L */
#define CS42L73_HLBASPBA	0x3A	/* HP/LO Right Mixer: ASP R */
#define CS42L73_HLAVSPMA	0x3B	/* HP/LO Left Mixer: VSP. */
#define CS42L73_HLBVSPMA	0x3C	/* HP/LO Right Mixer: VSP */
#define CS42L73_XSPAIPAA	0x3D	/* XSP Left Mixer: Left */
#define CS42L73_XSPBIPBA	0x3E	/* XSP Rt. Mixer: Right */
#define CS42L73_XSPAXSPAA	0x3F	/* XSP Left Mixer: XSP L */
#define CS42L73_XSPBXSPBA	0x40	/* XSP Rt. Mixer: XSP R */
#define CS42L73_XSPAASPAA	0x41	/* XSP Left Mixer: ASP L */
#define CS42L73_XSPAASPBA	0x42	/* XSP Rt. Mixer: ASP R */
#define CS42L73_XSPAVSPMA	0x43	/* XSP Left Mixer: VSP */
#define CS42L73_XSPBVSPMA	0x44	/* XSP Rt. Mixer: VSP */
#define CS42L73_ASPAIPAA	0x45	/* ASP Left Mixer: Left */
#define CS42L73_ASPBIPBA	0x46	/* ASP Rt. Mixer: Right */
#define CS42L73_ASPAXSPAA	0x47	/* ASP Left Mixer: XSP L */
#define CS42L73_ASPBXSPBA	0x48	/* ASP Rt. Mixer: XSP R */
#define CS42L73_ASPAASPAA	0x49	/* ASP Left Mixer: ASP L */
#define CS42L73_ASPBASPBA	0x4A	/* ASP Rt. Mixer: ASP R */
#define CS42L73_ASPAVSPMA	0x4B	/* ASP Left Mixer: VSP */
#define CS42L73_ASPBVSPMA	0x4C	/* ASP Rt. Mixer: VSP */
#define CS42L73_VSPAIPAA	0x4D	/* VSP Left Mixer: Left */
#define CS42L73_VSPBIPBA	0x4E	/* VSP Rt. Mixer: Right */
#define CS42L73_VSPAXSPAA	0x4F	/* VSP Left Mixer: XSP L */
#define CS42L73_VSPBXSPBA	0x50	/* VSP Rt. Mixer: XSP R */
#define CS42L73_VSPAASPAA	0x51	/* VSP Left Mixer: ASP Left */
#define CS42L73_VSPBASPBA	0x52	/* VSP Rt. Mixer: ASP Right */
#define CS42L73_VSPAVSPMA	0x53	/* VSP Left Mixer: VSP */
#define CS42L73_VSPBVSPMA	0x54	/* VSP Rt. Mixer: VSP */
#define CS42L73_MMIXCTL		0x55	/* Mono Mixer Controls. */
#define CS42L73_SPKMIPMA	0x56	/* SPK Mono Mixer: In. Path */
#define CS42L73_SPKMXSPA	0x57	/* SPK Mono Mixer: XSP Mono/L/R Att. */
#define CS42L73_SPKMASPA	0x58	/* SPK Mono Mixer: ASP Mono/L/R Att. */
#define CS42L73_SPKMVSPMA	0x59	/* SPK Mono Mixer: VSP Mono Atten. */
#define CS42L73_ESLMIPMA	0x5A	/* Ear/SpLO Mono Mixer: */
#define CS42L73_ESLMXSPA	0x5B	/* Ear/SpLO Mono Mixer: XSP */
#define CS42L73_ESLMASPA	0x5C	/* Ear/SpLO Mono Mixer: ASP */
#define CS42L73_ESLMVSPMA	0x5D	/* Ear/SpLO Mono Mixer: VSP */
#define CS42L73_IM1		0x5E	/* Interrupt Mask 1.  */
#define CS42L73_IM2		0x5F	/* Interrupt Mask 2. */
#define CS42L73_IS1		0x60	/* Interrupt Status 1 [RO]. */
#define CS42L73_IS2		0x61	/* Interrupt Status 2 [RO]. */
#define CS42L73_MAX_REGISTER	0x61	/* Total Registers */
/* Bitfield Definitions */

/* CS42L73_PWRCTL1 */
#define CS42L73_PDN_ADCB		(1 << 7)
#define CS42L73_PDN_DMICB		(1 << 6)
#define CS42L73_PDN_ADCA		(1 << 5)
#define CS42L73_PDN_DMICA		(1 << 4)
#define CS42L73_PDN_LDO			(1 << 2)
#define CS42L73_DISCHG_FILT		(1 << 1)
#define CS42L73_PDN			(1 << 0)

/* CS42L73_PWRCTL2 */
#define CS42L73_PDN_MIC2_BIAS		(1 << 7)
#define CS42L73_PDN_MIC1_BIAS		(1 << 6)
#define CS42L73_PDN_VSP			(1 << 4)
#define CS42L73_PDN_ASP_SDOUT		(1 << 3)
#define CS42L73_PDN_ASP_SDIN		(1 << 2)
#define CS42L73_PDN_XSP_SDOUT		(1 << 1)
#define CS42L73_PDN_XSP_SDIN		(1 << 0)

/* CS42L73_PWRCTL3 */
#define CS42L73_PDN_THMS		(1 << 5)
#define CS42L73_PDN_SPKLO		(1 << 4)
#define CS42L73_PDN_EAR			(1 << 3)
#define CS42L73_PDN_SPK			(1 << 2)
#define CS42L73_PDN_LO			(1 << 1)
#define CS42L73_PDN_HP			(1 << 0)

/* Thermal Overload Detect. Requires interrupt ... */
#define CS42L73_THMOVLD_150C		0
#define CS42L73_THMOVLD_132C		1
#define CS42L73_THMOVLD_115C		2
#define CS42L73_THMOVLD_098C		3

#define CS42L73_CHARGEPUMP_MASK	(0xF0)

/* CS42L73_ASPC, CS42L73_XSPC, CS42L73_VSPC */
#define	CS42L73_SP_3ST			(1 << 7)
#define CS42L73_SPDIF_I2S		(0 << 6)
#define CS42L73_SPDIF_PCM		(1 << 6)
#define CS42L73_PCM_MODE0		(0 << 4)
#define CS42L73_PCM_MODE1		(1 << 4)
#define CS42L73_PCM_MODE2		(2 << 4)
#define CS42L73_PCM_MODE_MASK		(3 << 4)
#define CS42L73_PCM_BIT_ORDER		(1 << 3)
#define CS42L73_MCK_SCLK_64FS		(0 << 0)
#define CS42L73_MCK_SCLK_MCLK		(2 << 0)
#define CS42L73_MCK_SCLK_PREMCLK	(3 << 0)

/* CS42L73_xSPMMCC */
#define CS42L73_MS_MASTER		(1 << 7)


/* CS42L73_DMMCC */
#define CS42L73_MCLKDIS			(1 << 0)
#define CS42L73_MCLKSEL_MCLK2		(1 << 4)
#define CS42L73_MCLKSEL_MCLK1		(0 << 4)

/* CS42L73 MCLK derived from MCLK1 or MCLK2 */
#define CS42L73_CLKID_MCLK1     0
#define CS42L73_CLKID_MCLK2     1

#define CS42L73_MCLKXDIV	0
#define CS42L73_MMCCDIV         1

#define CS42L73_XSP		0
#define CS42L73_ASP		1
#define CS42L73_VSP		2

/* IS1, IM1 */
#define CS42L73_MIC2_SDET		(1 << 6)
#define CS42L73_THMOVLD			(1 << 4)
#define CS42L73_DIGMIXOVFL		(1 << 3)
#define CS42L73_IPBOVFL			(1 << 1)
#define CS42L73_IPAOVFL			(1 << 0)

/* Analog Softramp */
#define CS42L73_ANLGOSFT		(1 << 0)

/* HP A/B Analog Mute */
#define CS42L73_HPA_MUTE		(1 << 7)
/* LO A/B Analog Mute	*/
#define CS42L73_LOA_MUTE		(1 << 7)
/* Digital Mute */
#define CS42L73_HLAD_MUTE		(1 << 0)
#define CS42L73_HLBD_MUTE		(1 << 1)
#define CS42L73_SPKD_MUTE		(1 << 2)
#define CS42L73_ESLD_MUTE		(1 << 3)

/* Misc defines for codec */
#define CS42L73_DEVID		0x00042A73
#define CS42L73_MCLKX_MIN	5644800
#define CS42L73_MCLKX_MAX	38400000

#define CS42L73_SPC(id)		(CS42L73_XSPC + (id << 1))
#define CS42L73_MMCC(id)	(CS42L73_XSPMMCC + (id << 1))
#define CS42L73_SPFS(id)	((id == CS42L73_ASP) ? CS42L73_ASPC : CS42L73_VXSPFS)

#endif	/* __CS42L73_H__ */