diff options
Diffstat (limited to 'sound/soc/codecs/max98088.c')
-rw-r--r-- | sound/soc/codecs/max98088.c | 580 |
1 files changed, 251 insertions, 329 deletions
diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c index 8896d5e33980..31912d59702c 100644 --- a/sound/soc/codecs/max98088.c +++ b/sound/soc/codecs/max98088.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/pm.h> | 16 | #include <linux/pm.h> |
17 | #include <linux/i2c.h> | 17 | #include <linux/i2c.h> |
18 | #include <linux/regmap.h> | ||
18 | #include <sound/core.h> | 19 | #include <sound/core.h> |
19 | #include <sound/pcm.h> | 20 | #include <sound/pcm.h> |
20 | #include <sound/pcm_params.h> | 21 | #include <sound/pcm_params.h> |
@@ -38,6 +39,7 @@ struct max98088_cdata { | |||
38 | }; | 39 | }; |
39 | 40 | ||
40 | struct max98088_priv { | 41 | struct max98088_priv { |
42 | struct regmap *regmap; | ||
41 | enum max98088_type devtype; | 43 | enum max98088_type devtype; |
42 | struct max98088_pdata *pdata; | 44 | struct max98088_pdata *pdata; |
43 | unsigned int sysclk; | 45 | unsigned int sysclk; |
@@ -54,278 +56,206 @@ struct max98088_priv { | |||
54 | unsigned int extmic_mode; | 56 | unsigned int extmic_mode; |
55 | }; | 57 | }; |
56 | 58 | ||
57 | static const u8 max98088_reg[M98088_REG_CNT] = { | 59 | static const struct reg_default max98088_reg[] = { |
58 | 0x00, /* 00 IRQ status */ | 60 | { 0xf, 0x00 }, /* 0F interrupt enable */ |
59 | 0x00, /* 01 MIC status */ | 61 | |
60 | 0x00, /* 02 jack status */ | 62 | { 0x10, 0x00 }, /* 10 master clock */ |
61 | 0x00, /* 03 battery voltage */ | 63 | { 0x11, 0x00 }, /* 11 DAI1 clock mode */ |
62 | 0x00, /* 04 */ | 64 | { 0x12, 0x00 }, /* 12 DAI1 clock control */ |
63 | 0x00, /* 05 */ | 65 | { 0x13, 0x00 }, /* 13 DAI1 clock control */ |
64 | 0x00, /* 06 */ | 66 | { 0x14, 0x00 }, /* 14 DAI1 format */ |
65 | 0x00, /* 07 */ | 67 | { 0x15, 0x00 }, /* 15 DAI1 clock */ |
66 | 0x00, /* 08 */ | 68 | { 0x16, 0x00 }, /* 16 DAI1 config */ |
67 | 0x00, /* 09 */ | 69 | { 0x17, 0x00 }, /* 17 DAI1 TDM */ |
68 | 0x00, /* 0A */ | 70 | { 0x18, 0x00 }, /* 18 DAI1 filters */ |
69 | 0x00, /* 0B */ | 71 | { 0x19, 0x00 }, /* 19 DAI2 clock mode */ |
70 | 0x00, /* 0C */ | 72 | { 0x1a, 0x00 }, /* 1A DAI2 clock control */ |
71 | 0x00, /* 0D */ | 73 | { 0x1b, 0x00 }, /* 1B DAI2 clock control */ |
72 | 0x00, /* 0E */ | 74 | { 0x1c, 0x00 }, /* 1C DAI2 format */ |
73 | 0x00, /* 0F interrupt enable */ | 75 | { 0x1d, 0x00 }, /* 1D DAI2 clock */ |
74 | 76 | { 0x1e, 0x00 }, /* 1E DAI2 config */ | |
75 | 0x00, /* 10 master clock */ | 77 | { 0x1f, 0x00 }, /* 1F DAI2 TDM */ |
76 | 0x00, /* 11 DAI1 clock mode */ | 78 | |
77 | 0x00, /* 12 DAI1 clock control */ | 79 | { 0x20, 0x00 }, /* 20 DAI2 filters */ |
78 | 0x00, /* 13 DAI1 clock control */ | 80 | { 0x21, 0x00 }, /* 21 data config */ |
79 | 0x00, /* 14 DAI1 format */ | 81 | { 0x22, 0x00 }, /* 22 DAC mixer */ |
80 | 0x00, /* 15 DAI1 clock */ | 82 | { 0x23, 0x00 }, /* 23 left ADC mixer */ |
81 | 0x00, /* 16 DAI1 config */ | 83 | { 0x24, 0x00 }, /* 24 right ADC mixer */ |
82 | 0x00, /* 17 DAI1 TDM */ | 84 | { 0x25, 0x00 }, /* 25 left HP mixer */ |
83 | 0x00, /* 18 DAI1 filters */ | 85 | { 0x26, 0x00 }, /* 26 right HP mixer */ |
84 | 0x00, /* 19 DAI2 clock mode */ | 86 | { 0x27, 0x00 }, /* 27 HP control */ |
85 | 0x00, /* 1A DAI2 clock control */ | 87 | { 0x28, 0x00 }, /* 28 left REC mixer */ |
86 | 0x00, /* 1B DAI2 clock control */ | 88 | { 0x29, 0x00 }, /* 29 right REC mixer */ |
87 | 0x00, /* 1C DAI2 format */ | 89 | { 0x2a, 0x00 }, /* 2A REC control */ |
88 | 0x00, /* 1D DAI2 clock */ | 90 | { 0x2b, 0x00 }, /* 2B left SPK mixer */ |
89 | 0x00, /* 1E DAI2 config */ | 91 | { 0x2c, 0x00 }, /* 2C right SPK mixer */ |
90 | 0x00, /* 1F DAI2 TDM */ | 92 | { 0x2d, 0x00 }, /* 2D SPK control */ |
91 | 93 | { 0x2e, 0x00 }, /* 2E sidetone */ | |
92 | 0x00, /* 20 DAI2 filters */ | 94 | { 0x2f, 0x00 }, /* 2F DAI1 playback level */ |
93 | 0x00, /* 21 data config */ | 95 | |
94 | 0x00, /* 22 DAC mixer */ | 96 | { 0x30, 0x00 }, /* 30 DAI1 playback level */ |
95 | 0x00, /* 23 left ADC mixer */ | 97 | { 0x31, 0x00 }, /* 31 DAI2 playback level */ |
96 | 0x00, /* 24 right ADC mixer */ | 98 | { 0x32, 0x00 }, /* 32 DAI2 playbakc level */ |
97 | 0x00, /* 25 left HP mixer */ | 99 | { 0x33, 0x00 }, /* 33 left ADC level */ |
98 | 0x00, /* 26 right HP mixer */ | 100 | { 0x34, 0x00 }, /* 34 right ADC level */ |
99 | 0x00, /* 27 HP control */ | 101 | { 0x35, 0x00 }, /* 35 MIC1 level */ |
100 | 0x00, /* 28 left REC mixer */ | 102 | { 0x36, 0x00 }, /* 36 MIC2 level */ |
101 | 0x00, /* 29 right REC mixer */ | 103 | { 0x37, 0x00 }, /* 37 INA level */ |
102 | 0x00, /* 2A REC control */ | 104 | { 0x38, 0x00 }, /* 38 INB level */ |
103 | 0x00, /* 2B left SPK mixer */ | 105 | { 0x39, 0x00 }, /* 39 left HP volume */ |
104 | 0x00, /* 2C right SPK mixer */ | 106 | { 0x3a, 0x00 }, /* 3A right HP volume */ |
105 | 0x00, /* 2D SPK control */ | 107 | { 0x3b, 0x00 }, /* 3B left REC volume */ |
106 | 0x00, /* 2E sidetone */ | 108 | { 0x3c, 0x00 }, /* 3C right REC volume */ |
107 | 0x00, /* 2F DAI1 playback level */ | 109 | { 0x3d, 0x00 }, /* 3D left SPK volume */ |
108 | 110 | { 0x3e, 0x00 }, /* 3E right SPK volume */ | |
109 | 0x00, /* 30 DAI1 playback level */ | 111 | { 0x3f, 0x00 }, /* 3F MIC config */ |
110 | 0x00, /* 31 DAI2 playback level */ | 112 | |
111 | 0x00, /* 32 DAI2 playbakc level */ | 113 | { 0x40, 0x00 }, /* 40 MIC threshold */ |
112 | 0x00, /* 33 left ADC level */ | 114 | { 0x41, 0x00 }, /* 41 excursion limiter filter */ |
113 | 0x00, /* 34 right ADC level */ | 115 | { 0x42, 0x00 }, /* 42 excursion limiter threshold */ |
114 | 0x00, /* 35 MIC1 level */ | 116 | { 0x43, 0x00 }, /* 43 ALC */ |
115 | 0x00, /* 36 MIC2 level */ | 117 | { 0x44, 0x00 }, /* 44 power limiter threshold */ |
116 | 0x00, /* 37 INA level */ | 118 | { 0x45, 0x00 }, /* 45 power limiter config */ |
117 | 0x00, /* 38 INB level */ | 119 | { 0x46, 0x00 }, /* 46 distortion limiter config */ |
118 | 0x00, /* 39 left HP volume */ | 120 | { 0x47, 0x00 }, /* 47 audio input */ |
119 | 0x00, /* 3A right HP volume */ | 121 | { 0x48, 0x00 }, /* 48 microphone */ |
120 | 0x00, /* 3B left REC volume */ | 122 | { 0x49, 0x00 }, /* 49 level control */ |
121 | 0x00, /* 3C right REC volume */ | 123 | { 0x4a, 0x00 }, /* 4A bypass switches */ |
122 | 0x00, /* 3D left SPK volume */ | 124 | { 0x4b, 0x00 }, /* 4B jack detect */ |
123 | 0x00, /* 3E right SPK volume */ | 125 | { 0x4c, 0x00 }, /* 4C input enable */ |
124 | 0x00, /* 3F MIC config */ | 126 | { 0x4d, 0x00 }, /* 4D output enable */ |
125 | 127 | { 0x4e, 0xF0 }, /* 4E bias control */ | |
126 | 0x00, /* 40 MIC threshold */ | 128 | { 0x4f, 0x00 }, /* 4F DAC power */ |
127 | 0x00, /* 41 excursion limiter filter */ | 129 | |
128 | 0x00, /* 42 excursion limiter threshold */ | 130 | { 0x50, 0x0F }, /* 50 DAC power */ |
129 | 0x00, /* 43 ALC */ | 131 | { 0x51, 0x00 }, /* 51 system */ |
130 | 0x00, /* 44 power limiter threshold */ | 132 | { 0x52, 0x00 }, /* 52 DAI1 EQ1 */ |
131 | 0x00, /* 45 power limiter config */ | 133 | { 0x53, 0x00 }, /* 53 DAI1 EQ1 */ |
132 | 0x00, /* 46 distortion limiter config */ | 134 | { 0x54, 0x00 }, /* 54 DAI1 EQ1 */ |
133 | 0x00, /* 47 audio input */ | 135 | { 0x55, 0x00 }, /* 55 DAI1 EQ1 */ |
134 | 0x00, /* 48 microphone */ | 136 | { 0x56, 0x00 }, /* 56 DAI1 EQ1 */ |
135 | 0x00, /* 49 level control */ | 137 | { 0x57, 0x00 }, /* 57 DAI1 EQ1 */ |
136 | 0x00, /* 4A bypass switches */ | 138 | { 0x58, 0x00 }, /* 58 DAI1 EQ1 */ |
137 | 0x00, /* 4B jack detect */ | 139 | { 0x59, 0x00 }, /* 59 DAI1 EQ1 */ |
138 | 0x00, /* 4C input enable */ | 140 | { 0x5a, 0x00 }, /* 5A DAI1 EQ1 */ |
139 | 0x00, /* 4D output enable */ | 141 | { 0x5b, 0x00 }, /* 5B DAI1 EQ1 */ |
140 | 0xF0, /* 4E bias control */ | 142 | { 0x5c, 0x00 }, /* 5C DAI1 EQ2 */ |
141 | 0x00, /* 4F DAC power */ | 143 | { 0x5d, 0x00 }, /* 5D DAI1 EQ2 */ |
142 | 144 | { 0x5e, 0x00 }, /* 5E DAI1 EQ2 */ | |
143 | 0x0F, /* 50 DAC power */ | 145 | { 0x5f, 0x00 }, /* 5F DAI1 EQ2 */ |
144 | 0x00, /* 51 system */ | 146 | |
145 | 0x00, /* 52 DAI1 EQ1 */ | 147 | { 0x60, 0x00 }, /* 60 DAI1 EQ2 */ |
146 | 0x00, /* 53 DAI1 EQ1 */ | 148 | { 0x61, 0x00 }, /* 61 DAI1 EQ2 */ |
147 | 0x00, /* 54 DAI1 EQ1 */ | 149 | { 0x62, 0x00 }, /* 62 DAI1 EQ2 */ |
148 | 0x00, /* 55 DAI1 EQ1 */ | 150 | { 0x63, 0x00 }, /* 63 DAI1 EQ2 */ |
149 | 0x00, /* 56 DAI1 EQ1 */ | 151 | { 0x64, 0x00 }, /* 64 DAI1 EQ2 */ |
150 | 0x00, /* 57 DAI1 EQ1 */ | 152 | { 0x65, 0x00 }, /* 65 DAI1 EQ2 */ |
151 | 0x00, /* 58 DAI1 EQ1 */ | 153 | { 0x66, 0x00 }, /* 66 DAI1 EQ3 */ |
152 | 0x00, /* 59 DAI1 EQ1 */ | 154 | { 0x67, 0x00 }, /* 67 DAI1 EQ3 */ |
153 | 0x00, /* 5A DAI1 EQ1 */ | 155 | { 0x68, 0x00 }, /* 68 DAI1 EQ3 */ |
154 | 0x00, /* 5B DAI1 EQ1 */ | 156 | { 0x69, 0x00 }, /* 69 DAI1 EQ3 */ |
155 | 0x00, /* 5C DAI1 EQ2 */ | 157 | { 0x6a, 0x00 }, /* 6A DAI1 EQ3 */ |
156 | 0x00, /* 5D DAI1 EQ2 */ | 158 | { 0x6b, 0x00 }, /* 6B DAI1 EQ3 */ |
157 | 0x00, /* 5E DAI1 EQ2 */ | 159 | { 0x6c, 0x00 }, /* 6C DAI1 EQ3 */ |
158 | 0x00, /* 5F DAI1 EQ2 */ | 160 | { 0x6d, 0x00 }, /* 6D DAI1 EQ3 */ |
159 | 161 | { 0x6e, 0x00 }, /* 6E DAI1 EQ3 */ | |
160 | 0x00, /* 60 DAI1 EQ2 */ | 162 | { 0x6f, 0x00 }, /* 6F DAI1 EQ3 */ |
161 | 0x00, /* 61 DAI1 EQ2 */ | 163 | |
162 | 0x00, /* 62 DAI1 EQ2 */ | 164 | { 0x70, 0x00 }, /* 70 DAI1 EQ4 */ |
163 | 0x00, /* 63 DAI1 EQ2 */ | 165 | { 0x71, 0x00 }, /* 71 DAI1 EQ4 */ |
164 | 0x00, /* 64 DAI1 EQ2 */ | 166 | { 0x72, 0x00 }, /* 72 DAI1 EQ4 */ |
165 | 0x00, /* 65 DAI1 EQ2 */ | 167 | { 0x73, 0x00 }, /* 73 DAI1 EQ4 */ |
166 | 0x00, /* 66 DAI1 EQ3 */ | 168 | { 0x74, 0x00 }, /* 74 DAI1 EQ4 */ |
167 | 0x00, /* 67 DAI1 EQ3 */ | 169 | { 0x75, 0x00 }, /* 75 DAI1 EQ4 */ |
168 | 0x00, /* 68 DAI1 EQ3 */ | 170 | { 0x76, 0x00 }, /* 76 DAI1 EQ4 */ |
169 | 0x00, /* 69 DAI1 EQ3 */ | 171 | { 0x77, 0x00 }, /* 77 DAI1 EQ4 */ |
170 | 0x00, /* 6A DAI1 EQ3 */ | 172 | { 0x78, 0x00 }, /* 78 DAI1 EQ4 */ |
171 | 0x00, /* 6B DAI1 EQ3 */ | 173 | { 0x79, 0x00 }, /* 79 DAI1 EQ4 */ |
172 | 0x00, /* 6C DAI1 EQ3 */ | 174 | { 0x7a, 0x00 }, /* 7A DAI1 EQ5 */ |
173 | 0x00, /* 6D DAI1 EQ3 */ | 175 | { 0x7b, 0x00 }, /* 7B DAI1 EQ5 */ |
174 | 0x00, /* 6E DAI1 EQ3 */ | 176 | { 0x7c, 0x00 }, /* 7C DAI1 EQ5 */ |
175 | 0x00, /* 6F DAI1 EQ3 */ | 177 | { 0x7d, 0x00 }, /* 7D DAI1 EQ5 */ |
176 | 178 | { 0x7e, 0x00 }, /* 7E DAI1 EQ5 */ | |
177 | 0x00, /* 70 DAI1 EQ4 */ | 179 | { 0x7f, 0x00 }, /* 7F DAI1 EQ5 */ |
178 | 0x00, /* 71 DAI1 EQ4 */ | 180 | |
179 | 0x00, /* 72 DAI1 EQ4 */ | 181 | { 0x80, 0x00 }, /* 80 DAI1 EQ5 */ |
180 | 0x00, /* 73 DAI1 EQ4 */ | 182 | { 0x81, 0x00 }, /* 81 DAI1 EQ5 */ |
181 | 0x00, /* 74 DAI1 EQ4 */ | 183 | { 0x82, 0x00 }, /* 82 DAI1 EQ5 */ |
182 | 0x00, /* 75 DAI1 EQ4 */ | 184 | { 0x83, 0x00 }, /* 83 DAI1 EQ5 */ |
183 | 0x00, /* 76 DAI1 EQ4 */ | 185 | { 0x84, 0x00 }, /* 84 DAI2 EQ1 */ |
184 | 0x00, /* 77 DAI1 EQ4 */ | 186 | { 0x85, 0x00 }, /* 85 DAI2 EQ1 */ |
185 | 0x00, /* 78 DAI1 EQ4 */ | 187 | { 0x86, 0x00 }, /* 86 DAI2 EQ1 */ |
186 | 0x00, /* 79 DAI1 EQ4 */ | 188 | { 0x87, 0x00 }, /* 87 DAI2 EQ1 */ |
187 | 0x00, /* 7A DAI1 EQ5 */ | 189 | { 0x88, 0x00 }, /* 88 DAI2 EQ1 */ |
188 | 0x00, /* 7B DAI1 EQ5 */ | 190 | { 0x89, 0x00 }, /* 89 DAI2 EQ1 */ |
189 | 0x00, /* 7C DAI1 EQ5 */ | 191 | { 0x8a, 0x00 }, /* 8A DAI2 EQ1 */ |
190 | 0x00, /* 7D DAI1 EQ5 */ | 192 | { 0x8b, 0x00 }, /* 8B DAI2 EQ1 */ |
191 | 0x00, /* 7E DAI1 EQ5 */ | 193 | { 0x8c, 0x00 }, /* 8C DAI2 EQ1 */ |
192 | 0x00, /* 7F DAI1 EQ5 */ | 194 | { 0x8d, 0x00 }, /* 8D DAI2 EQ1 */ |
193 | 195 | { 0x8e, 0x00 }, /* 8E DAI2 EQ2 */ | |
194 | 0x00, /* 80 DAI1 EQ5 */ | 196 | { 0x8f, 0x00 }, /* 8F DAI2 EQ2 */ |
195 | 0x00, /* 81 DAI1 EQ5 */ | 197 | |
196 | 0x00, /* 82 DAI1 EQ5 */ | 198 | { 0x90, 0x00 }, /* 90 DAI2 EQ2 */ |
197 | 0x00, /* 83 DAI1 EQ5 */ | 199 | { 0x91, 0x00 }, /* 91 DAI2 EQ2 */ |
198 | 0x00, /* 84 DAI2 EQ1 */ | 200 | { 0x92, 0x00 }, /* 92 DAI2 EQ2 */ |
199 | 0x00, /* 85 DAI2 EQ1 */ | 201 | { 0x93, 0x00 }, /* 93 DAI2 EQ2 */ |
200 | 0x00, /* 86 DAI2 EQ1 */ | 202 | { 0x94, 0x00 }, /* 94 DAI2 EQ2 */ |
201 | 0x00, /* 87 DAI2 EQ1 */ | 203 | { 0x95, 0x00 }, /* 95 DAI2 EQ2 */ |
202 | 0x00, /* 88 DAI2 EQ1 */ | 204 | { 0x96, 0x00 }, /* 96 DAI2 EQ2 */ |
203 | 0x00, /* 89 DAI2 EQ1 */ | 205 | { 0x97, 0x00 }, /* 97 DAI2 EQ2 */ |
204 | 0x00, /* 8A DAI2 EQ1 */ | 206 | { 0x98, 0x00 }, /* 98 DAI2 EQ3 */ |
205 | 0x00, /* 8B DAI2 EQ1 */ | 207 | { 0x99, 0x00 }, /* 99 DAI2 EQ3 */ |
206 | 0x00, /* 8C DAI2 EQ1 */ | 208 | { 0x9a, 0x00 }, /* 9A DAI2 EQ3 */ |
207 | 0x00, /* 8D DAI2 EQ1 */ | 209 | { 0x9b, 0x00 }, /* 9B DAI2 EQ3 */ |
208 | 0x00, /* 8E DAI2 EQ2 */ | 210 | { 0x9c, 0x00 }, /* 9C DAI2 EQ3 */ |
209 | 0x00, /* 8F DAI2 EQ2 */ | 211 | { 0x9d, 0x00 }, /* 9D DAI2 EQ3 */ |
210 | 212 | { 0x9e, 0x00 }, /* 9E DAI2 EQ3 */ | |
211 | 0x00, /* 90 DAI2 EQ2 */ | 213 | { 0x9f, 0x00 }, /* 9F DAI2 EQ3 */ |
212 | 0x00, /* 91 DAI2 EQ2 */ | 214 | |
213 | 0x00, /* 92 DAI2 EQ2 */ | 215 | { 0xa0, 0x00 }, /* A0 DAI2 EQ3 */ |
214 | 0x00, /* 93 DAI2 EQ2 */ | 216 | { 0xa1, 0x00 }, /* A1 DAI2 EQ3 */ |
215 | 0x00, /* 94 DAI2 EQ2 */ | 217 | { 0xa2, 0x00 }, /* A2 DAI2 EQ4 */ |
216 | 0x00, /* 95 DAI2 EQ2 */ | 218 | { 0xa3, 0x00 }, /* A3 DAI2 EQ4 */ |
217 | 0x00, /* 96 DAI2 EQ2 */ | 219 | { 0xa4, 0x00 }, /* A4 DAI2 EQ4 */ |
218 | 0x00, /* 97 DAI2 EQ2 */ | 220 | { 0xa5, 0x00 }, /* A5 DAI2 EQ4 */ |
219 | 0x00, /* 98 DAI2 EQ3 */ | 221 | { 0xa6, 0x00 }, /* A6 DAI2 EQ4 */ |
220 | 0x00, /* 99 DAI2 EQ3 */ | 222 | { 0xa7, 0x00 }, /* A7 DAI2 EQ4 */ |
221 | 0x00, /* 9A DAI2 EQ3 */ | 223 | { 0xa8, 0x00 }, /* A8 DAI2 EQ4 */ |
222 | 0x00, /* 9B DAI2 EQ3 */ | 224 | { 0xa9, 0x00 }, /* A9 DAI2 EQ4 */ |
223 | 0x00, /* 9C DAI2 EQ3 */ | 225 | { 0xaa, 0x00 }, /* AA DAI2 EQ4 */ |
224 | 0x00, /* 9D DAI2 EQ3 */ | 226 | { 0xab, 0x00 }, /* AB DAI2 EQ4 */ |
225 | 0x00, /* 9E DAI2 EQ3 */ | 227 | { 0xac, 0x00 }, /* AC DAI2 EQ5 */ |
226 | 0x00, /* 9F DAI2 EQ3 */ | 228 | { 0xad, 0x00 }, /* AD DAI2 EQ5 */ |
227 | 229 | { 0xae, 0x00 }, /* AE DAI2 EQ5 */ | |
228 | 0x00, /* A0 DAI2 EQ3 */ | 230 | { 0xaf, 0x00 }, /* AF DAI2 EQ5 */ |
229 | 0x00, /* A1 DAI2 EQ3 */ | 231 | |
230 | 0x00, /* A2 DAI2 EQ4 */ | 232 | { 0xb0, 0x00 }, /* B0 DAI2 EQ5 */ |
231 | 0x00, /* A3 DAI2 EQ4 */ | 233 | { 0xb1, 0x00 }, /* B1 DAI2 EQ5 */ |
232 | 0x00, /* A4 DAI2 EQ4 */ | 234 | { 0xb2, 0x00 }, /* B2 DAI2 EQ5 */ |
233 | 0x00, /* A5 DAI2 EQ4 */ | 235 | { 0xb3, 0x00 }, /* B3 DAI2 EQ5 */ |
234 | 0x00, /* A6 DAI2 EQ4 */ | 236 | { 0xb4, 0x00 }, /* B4 DAI2 EQ5 */ |
235 | 0x00, /* A7 DAI2 EQ4 */ | 237 | { 0xb5, 0x00 }, /* B5 DAI2 EQ5 */ |
236 | 0x00, /* A8 DAI2 EQ4 */ | 238 | { 0xb6, 0x00 }, /* B6 DAI1 biquad */ |
237 | 0x00, /* A9 DAI2 EQ4 */ | 239 | { 0xb7, 0x00 }, /* B7 DAI1 biquad */ |
238 | 0x00, /* AA DAI2 EQ4 */ | 240 | { 0xb8 ,0x00 }, /* B8 DAI1 biquad */ |
239 | 0x00, /* AB DAI2 EQ4 */ | 241 | { 0xb9, 0x00 }, /* B9 DAI1 biquad */ |
240 | 0x00, /* AC DAI2 EQ5 */ | 242 | { 0xba, 0x00 }, /* BA DAI1 biquad */ |
241 | 0x00, /* AD DAI2 EQ5 */ | 243 | { 0xbb, 0x00 }, /* BB DAI1 biquad */ |
242 | 0x00, /* AE DAI2 EQ5 */ | 244 | { 0xbc, 0x00 }, /* BC DAI1 biquad */ |
243 | 0x00, /* AF DAI2 EQ5 */ | 245 | { 0xbd, 0x00 }, /* BD DAI1 biquad */ |
244 | 246 | { 0xbe, 0x00 }, /* BE DAI1 biquad */ | |
245 | 0x00, /* B0 DAI2 EQ5 */ | 247 | { 0xbf, 0x00 }, /* BF DAI1 biquad */ |
246 | 0x00, /* B1 DAI2 EQ5 */ | 248 | |
247 | 0x00, /* B2 DAI2 EQ5 */ | 249 | { 0xc0, 0x00 }, /* C0 DAI2 biquad */ |
248 | 0x00, /* B3 DAI2 EQ5 */ | 250 | { 0xc1, 0x00 }, /* C1 DAI2 biquad */ |
249 | 0x00, /* B4 DAI2 EQ5 */ | 251 | { 0xc2, 0x00 }, /* C2 DAI2 biquad */ |
250 | 0x00, /* B5 DAI2 EQ5 */ | 252 | { 0xc3, 0x00 }, /* C3 DAI2 biquad */ |
251 | 0x00, /* B6 DAI1 biquad */ | 253 | { 0xc4, 0x00 }, /* C4 DAI2 biquad */ |
252 | 0x00, /* B7 DAI1 biquad */ | 254 | { 0xc5, 0x00 }, /* C5 DAI2 biquad */ |
253 | 0x00, /* B8 DAI1 biquad */ | 255 | { 0xc6, 0x00 }, /* C6 DAI2 biquad */ |
254 | 0x00, /* B9 DAI1 biquad */ | 256 | { 0xc7, 0x00 }, /* C7 DAI2 biquad */ |
255 | 0x00, /* BA DAI1 biquad */ | 257 | { 0xc8, 0x00 }, /* C8 DAI2 biquad */ |
256 | 0x00, /* BB DAI1 biquad */ | 258 | { 0xc9, 0x00 }, /* C9 DAI2 biquad */ |
257 | 0x00, /* BC DAI1 biquad */ | ||
258 | 0x00, /* BD DAI1 biquad */ | ||
259 | 0x00, /* BE DAI1 biquad */ | ||
260 | 0x00, /* BF DAI1 biquad */ | ||
261 | |||
262 | 0x00, /* C0 DAI2 biquad */ | ||
263 | 0x00, /* C1 DAI2 biquad */ | ||
264 | 0x00, /* C2 DAI2 biquad */ | ||
265 | 0x00, /* C3 DAI2 biquad */ | ||
266 | 0x00, /* C4 DAI2 biquad */ | ||
267 | 0x00, /* C5 DAI2 biquad */ | ||
268 | 0x00, /* C6 DAI2 biquad */ | ||
269 | 0x00, /* C7 DAI2 biquad */ | ||
270 | 0x00, /* C8 DAI2 biquad */ | ||
271 | 0x00, /* C9 DAI2 biquad */ | ||
272 | 0x00, /* CA */ | ||
273 | 0x00, /* CB */ | ||
274 | 0x00, /* CC */ | ||
275 | 0x00, /* CD */ | ||
276 | 0x00, /* CE */ | ||
277 | 0x00, /* CF */ | ||
278 | |||
279 | 0x00, /* D0 */ | ||
280 | 0x00, /* D1 */ | ||
281 | 0x00, /* D2 */ | ||
282 | 0x00, /* D3 */ | ||
283 | 0x00, /* D4 */ | ||
284 | 0x00, /* D5 */ | ||
285 | 0x00, /* D6 */ | ||
286 | 0x00, /* D7 */ | ||
287 | 0x00, /* D8 */ | ||
288 | 0x00, /* D9 */ | ||
289 | 0x00, /* DA */ | ||
290 | 0x70, /* DB */ | ||
291 | 0x00, /* DC */ | ||
292 | 0x00, /* DD */ | ||
293 | 0x00, /* DE */ | ||
294 | 0x00, /* DF */ | ||
295 | |||
296 | 0x00, /* E0 */ | ||
297 | 0x00, /* E1 */ | ||
298 | 0x00, /* E2 */ | ||
299 | 0x00, /* E3 */ | ||
300 | 0x00, /* E4 */ | ||
301 | 0x00, /* E5 */ | ||
302 | 0x00, /* E6 */ | ||
303 | 0x00, /* E7 */ | ||
304 | 0x00, /* E8 */ | ||
305 | 0x00, /* E9 */ | ||
306 | 0x00, /* EA */ | ||
307 | 0x00, /* EB */ | ||
308 | 0x00, /* EC */ | ||
309 | 0x00, /* ED */ | ||
310 | 0x00, /* EE */ | ||
311 | 0x00, /* EF */ | ||
312 | |||
313 | 0x00, /* F0 */ | ||
314 | 0x00, /* F1 */ | ||
315 | 0x00, /* F2 */ | ||
316 | 0x00, /* F3 */ | ||
317 | 0x00, /* F4 */ | ||
318 | 0x00, /* F5 */ | ||
319 | 0x00, /* F6 */ | ||
320 | 0x00, /* F7 */ | ||
321 | 0x00, /* F8 */ | ||
322 | 0x00, /* F9 */ | ||
323 | 0x00, /* FA */ | ||
324 | 0x00, /* FB */ | ||
325 | 0x00, /* FC */ | ||
326 | 0x00, /* FD */ | ||
327 | 0x00, /* FE */ | ||
328 | 0x00, /* FF */ | ||
329 | }; | 259 | }; |
330 | 260 | ||
331 | static struct { | 261 | static struct { |
@@ -606,11 +536,27 @@ static struct { | |||
606 | { 0xFF, 0x00, 1 }, /* FF */ | 536 | { 0xFF, 0x00, 1 }, /* FF */ |
607 | }; | 537 | }; |
608 | 538 | ||
609 | static int max98088_volatile_register(struct snd_soc_codec *codec, unsigned int reg) | 539 | static bool max98088_readable_register(struct device *dev, unsigned int reg) |
540 | { | ||
541 | return max98088_access[reg].readable; | ||
542 | } | ||
543 | |||
544 | static bool max98088_volatile_register(struct device *dev, unsigned int reg) | ||
610 | { | 545 | { |
611 | return max98088_access[reg].vol; | 546 | return max98088_access[reg].vol; |
612 | } | 547 | } |
613 | 548 | ||
549 | static const struct regmap_config max98088_regmap = { | ||
550 | .reg_bits = 8, | ||
551 | .val_bits = 8, | ||
552 | |||
553 | .readable_reg = max98088_readable_register, | ||
554 | .volatile_reg = max98088_volatile_register, | ||
555 | |||
556 | .reg_defaults = max98088_reg, | ||
557 | .num_reg_defaults = ARRAY_SIZE(max98088_reg), | ||
558 | .cache_type = REGCACHE_RBTREE, | ||
559 | }; | ||
614 | 560 | ||
615 | /* | 561 | /* |
616 | * Load equalizer DSP coefficient configurations registers | 562 | * Load equalizer DSP coefficient configurations registers |
@@ -1610,58 +1556,34 @@ static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute) | |||
1610 | return 0; | 1556 | return 0; |
1611 | } | 1557 | } |
1612 | 1558 | ||
1613 | static void max98088_sync_cache(struct snd_soc_codec *codec) | ||
1614 | { | ||
1615 | u8 *reg_cache = codec->reg_cache; | ||
1616 | int i; | ||
1617 | |||
1618 | if (!codec->cache_sync) | ||
1619 | return; | ||
1620 | |||
1621 | codec->cache_only = 0; | ||
1622 | |||
1623 | /* write back cached values if they're writeable and | ||
1624 | * different from the hardware default. | ||
1625 | */ | ||
1626 | for (i = 1; i < codec->driver->reg_cache_size; i++) { | ||
1627 | if (!max98088_access[i].writable) | ||
1628 | continue; | ||
1629 | |||
1630 | if (reg_cache[i] == max98088_reg[i]) | ||
1631 | continue; | ||
1632 | |||
1633 | snd_soc_write(codec, i, reg_cache[i]); | ||
1634 | } | ||
1635 | |||
1636 | codec->cache_sync = 0; | ||
1637 | } | ||
1638 | |||
1639 | static int max98088_set_bias_level(struct snd_soc_codec *codec, | 1559 | static int max98088_set_bias_level(struct snd_soc_codec *codec, |
1640 | enum snd_soc_bias_level level) | 1560 | enum snd_soc_bias_level level) |
1641 | { | 1561 | { |
1642 | switch (level) { | 1562 | struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); |
1643 | case SND_SOC_BIAS_ON: | 1563 | |
1644 | break; | 1564 | switch (level) { |
1645 | 1565 | case SND_SOC_BIAS_ON: | |
1646 | case SND_SOC_BIAS_PREPARE: | 1566 | break; |
1647 | break; | 1567 | |
1648 | 1568 | case SND_SOC_BIAS_PREPARE: | |
1649 | case SND_SOC_BIAS_STANDBY: | 1569 | break; |
1650 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) | 1570 | |
1651 | max98088_sync_cache(codec); | 1571 | case SND_SOC_BIAS_STANDBY: |
1652 | 1572 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) | |
1653 | snd_soc_update_bits(codec, M98088_REG_4C_PWR_EN_IN, | 1573 | regcache_sync(max98088->regmap); |
1654 | M98088_MBEN, M98088_MBEN); | 1574 | |
1655 | break; | 1575 | snd_soc_update_bits(codec, M98088_REG_4C_PWR_EN_IN, |
1656 | 1576 | M98088_MBEN, M98088_MBEN); | |
1657 | case SND_SOC_BIAS_OFF: | 1577 | break; |
1658 | snd_soc_update_bits(codec, M98088_REG_4C_PWR_EN_IN, | 1578 | |
1659 | M98088_MBEN, 0); | 1579 | case SND_SOC_BIAS_OFF: |
1660 | codec->cache_sync = 1; | 1580 | snd_soc_update_bits(codec, M98088_REG_4C_PWR_EN_IN, |
1661 | break; | 1581 | M98088_MBEN, 0); |
1662 | } | 1582 | regcache_mark_dirty(max98088->regmap); |
1663 | codec->dapm.bias_level = level; | 1583 | break; |
1664 | return 0; | 1584 | } |
1585 | codec->dapm.bias_level = level; | ||
1586 | return 0; | ||
1665 | } | 1587 | } |
1666 | 1588 | ||
1667 | #define MAX98088_RATES SNDRV_PCM_RATE_8000_96000 | 1589 | #define MAX98088_RATES SNDRV_PCM_RATE_8000_96000 |
@@ -1988,9 +1910,9 @@ static int max98088_probe(struct snd_soc_codec *codec) | |||
1988 | struct max98088_cdata *cdata; | 1910 | struct max98088_cdata *cdata; |
1989 | int ret = 0; | 1911 | int ret = 0; |
1990 | 1912 | ||
1991 | codec->cache_sync = 1; | 1913 | regcache_mark_dirty(max98088->regmap); |
1992 | 1914 | ||
1993 | ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C); | 1915 | ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_REGMAP); |
1994 | if (ret != 0) { | 1916 | if (ret != 0) { |
1995 | dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); | 1917 | dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); |
1996 | return ret; | 1918 | return ret; |
@@ -2070,10 +1992,6 @@ static struct snd_soc_codec_driver soc_codec_dev_max98088 = { | |||
2070 | .set_bias_level = max98088_set_bias_level, | 1992 | .set_bias_level = max98088_set_bias_level, |
2071 | .controls = max98088_snd_controls, | 1993 | .controls = max98088_snd_controls, |
2072 | .num_controls = ARRAY_SIZE(max98088_snd_controls), | 1994 | .num_controls = ARRAY_SIZE(max98088_snd_controls), |
2073 | .reg_cache_size = ARRAY_SIZE(max98088_reg), | ||
2074 | .reg_word_size = sizeof(u8), | ||
2075 | .reg_cache_default = max98088_reg, | ||
2076 | .volatile_register = max98088_volatile_register, | ||
2077 | .dapm_widgets = max98088_dapm_widgets, | 1995 | .dapm_widgets = max98088_dapm_widgets, |
2078 | .num_dapm_widgets = ARRAY_SIZE(max98088_dapm_widgets), | 1996 | .num_dapm_widgets = ARRAY_SIZE(max98088_dapm_widgets), |
2079 | .dapm_routes = max98088_audio_map, | 1997 | .dapm_routes = max98088_audio_map, |
@@ -2081,7 +1999,7 @@ static struct snd_soc_codec_driver soc_codec_dev_max98088 = { | |||
2081 | }; | 1999 | }; |
2082 | 2000 | ||
2083 | static int max98088_i2c_probe(struct i2c_client *i2c, | 2001 | static int max98088_i2c_probe(struct i2c_client *i2c, |
2084 | const struct i2c_device_id *id) | 2002 | const struct i2c_device_id *id) |
2085 | { | 2003 | { |
2086 | struct max98088_priv *max98088; | 2004 | struct max98088_priv *max98088; |
2087 | int ret; | 2005 | int ret; |
@@ -2091,6 +2009,10 @@ static int max98088_i2c_probe(struct i2c_client *i2c, | |||
2091 | if (max98088 == NULL) | 2009 | if (max98088 == NULL) |
2092 | return -ENOMEM; | 2010 | return -ENOMEM; |
2093 | 2011 | ||
2012 | max98088->regmap = devm_regmap_init_i2c(i2c, &max98088_regmap); | ||
2013 | if (IS_ERR(max98088->regmap)) | ||
2014 | return PTR_ERR(max98088->regmap); | ||
2015 | |||
2094 | max98088->devtype = id->driver_data; | 2016 | max98088->devtype = id->driver_data; |
2095 | 2017 | ||
2096 | i2c_set_clientdata(i2c, max98088); | 2018 | i2c_set_clientdata(i2c, max98088); |