ASoC: Remove unused control_data and mutex fields from struct alc5632_priv
[deliverable/linux.git] / sound / soc / codecs / alc5632.c
1 /*
2 * alc5632.c -- ALC5632 ALSA SoC Audio Codec
3 *
4 * Copyright (C) 2011 The AC100 Kernel Team <ac100@lists.lauchpad.net>
5 *
6 * Authors: Leon Romanovsky <leon@leon.nu>
7 * Andrey Danin <danindrey@mail.ru>
8 * Ilya Petrov <ilya.muromec@gmail.com>
9 * Marc Dietrich <marvin24@gmx.de>
10 *
11 * Based on alc5623.c by Arnaud Patard
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
16 */
17
18 #include <linux/module.h>
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/delay.h>
22 #include <linux/pm.h>
23 #include <linux/i2c.h>
24 #include <linux/slab.h>
25 #include <sound/core.h>
26 #include <sound/pcm.h>
27 #include <sound/pcm_params.h>
28 #include <sound/tlv.h>
29 #include <sound/soc.h>
30 #include <sound/initval.h>
31
32 #include "alc5632.h"
33
34 /*
35 * ALC5632 register cache
36 */
37 static const u16 alc5632_reg_defaults[] = {
38 0x59B4, 0x0000, 0x8080, 0x0000, /* 0 */
39 0x8080, 0x0000, 0x8080, 0x0000, /* 4 */
40 0xC800, 0x0000, 0xE808, 0x0000, /* 8 */
41 0x1010, 0x0000, 0x0808, 0x0000, /* 12 */
42 0xEE0F, 0x0000, 0xCBCB, 0x0000, /* 16 */
43 0x7F7F, 0x0000, 0x0000, 0x0000, /* 20 */
44 0xE010, 0x0000, 0x0000, 0x0000, /* 24 */
45 0x8008, 0x0000, 0x0000, 0x0000, /* 28 */
46 0x0000, 0x0000, 0x0000, 0x0000, /* 32 */
47 0x00C0, 0x0000, 0xEF00, 0x0000, /* 36 */
48 0x0000, 0x0000, 0x0000, 0x0000, /* 40 */
49 0x0000, 0x0000, 0x0000, 0x0000, /* 44 */
50 0x0000, 0x0000, 0x0000, 0x0000, /* 48 */
51 0x8000, 0x0000, 0x0000, 0x0000, /* 52 */
52 0x0000, 0x0000, 0x0000, 0x0000, /* 56 */
53 0x0000, 0x0000, 0x8000, 0x0000, /* 60 */
54 0x0C0A, 0x0000, 0x0000, 0x0000, /* 64 */
55 0x0000, 0x0000, 0x0000, 0x0000, /* 68 */
56 0x0000, 0x0000, 0x0000, 0x0000, /* 72 */
57 0xBE3E, 0x0000, 0xBE3E, 0x0000, /* 76 */
58 0x0000, 0x0000, 0x0000, 0x0000, /* 80 */
59 0x803A, 0x0000, 0x0000, 0x0000, /* 84 */
60 0x0000, 0x0000, 0x0009, 0x0000, /* 88 */
61 0x0000, 0x0000, 0x3000, 0x0000, /* 92 */
62 0x3075, 0x0000, 0x1010, 0x0000, /* 96 */
63 0x3110, 0x0000, 0x0000, 0x0000, /* 100 */
64 0x0553, 0x0000, 0x0000, 0x0000, /* 104 */
65 0x0000, 0x0000, 0x0000, 0x0000, /* 108 */
66 };
67
68 /* codec private data */
69 struct alc5632_priv {
70 enum snd_soc_control_type control_type;
71 u8 id;
72 unsigned int sysclk;
73 };
74
75 static int alc5632_volatile_register(struct snd_soc_codec *codec,
76 unsigned int reg)
77 {
78 switch (reg) {
79 case ALC5632_RESET:
80 case ALC5632_PWR_DOWN_CTRL_STATUS:
81 case ALC5632_GPIO_PIN_STATUS:
82 case ALC5632_OVER_CURR_STATUS:
83 case ALC5632_HID_CTRL_DATA:
84 case ALC5632_EQ_CTRL:
85 return 1;
86
87 default:
88 break;
89 }
90
91 return 0;
92 }
93
94 static inline int alc5632_reset(struct snd_soc_codec *codec)
95 {
96 snd_soc_write(codec, ALC5632_RESET, 0);
97 return snd_soc_read(codec, ALC5632_RESET);
98 }
99
100 static int amp_mixer_event(struct snd_soc_dapm_widget *w,
101 struct snd_kcontrol *kcontrol, int event)
102 {
103 /* to power-on/off class-d amp generators/speaker */
104 /* need to write to 'index-46h' register : */
105 /* so write index num (here 0x46) to reg 0x6a */
106 /* and then 0xffff/0 to reg 0x6c */
107 snd_soc_write(w->codec, ALC5632_HID_CTRL_INDEX, 0x46);
108
109 switch (event) {
110 case SND_SOC_DAPM_PRE_PMU:
111 snd_soc_write(w->codec, ALC5632_HID_CTRL_DATA, 0xFFFF);
112 break;
113 case SND_SOC_DAPM_POST_PMD:
114 snd_soc_write(w->codec, ALC5632_HID_CTRL_DATA, 0);
115 break;
116 }
117
118 return 0;
119 }
120
121 /*
122 * ALC5632 Controls
123 */
124
125 /* -34.5db min scale, 1.5db steps, no mute */
126 static const DECLARE_TLV_DB_SCALE(vol_tlv, -3450, 150, 0);
127 /* -46.5db min scale, 1.5db steps, no mute */
128 static const DECLARE_TLV_DB_SCALE(hp_tlv, -4650, 150, 0);
129 /* -16.5db min scale, 1.5db steps, no mute */
130 static const DECLARE_TLV_DB_SCALE(adc_rec_tlv, -1650, 150, 0);
131 static const unsigned int boost_tlv[] = {
132 TLV_DB_RANGE_HEAD(3),
133 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
134 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
135 2, 2, TLV_DB_SCALE_ITEM(3000, 0, 0),
136 };
137 /* 0db min scale, 6 db steps, no mute */
138 static const DECLARE_TLV_DB_SCALE(dig_tlv, 0, 600, 0);
139 /* 0db min scalem 0.75db steps, no mute */
140 static const DECLARE_TLV_DB_SCALE(vdac_tlv, -3525, 075, 0);
141
142 static const struct snd_kcontrol_new alc5632_vol_snd_controls[] = {
143 /* left starts at bit 8, right at bit 0 */
144 /* 31 steps (5 bit), -46.5db scale */
145 SOC_DOUBLE_TLV("Line Playback Volume",
146 ALC5632_SPK_OUT_VOL, 8, 0, 31, 1, hp_tlv),
147 /* bit 15 mutes left, bit 7 right */
148 SOC_DOUBLE("Line Playback Switch",
149 ALC5632_SPK_OUT_VOL, 15, 7, 1, 1),
150 SOC_DOUBLE_TLV("Headphone Playback Volume",
151 ALC5632_HP_OUT_VOL, 8, 0, 31, 1, hp_tlv),
152 SOC_DOUBLE("Headphone Playback Switch",
153 ALC5632_HP_OUT_VOL, 15, 7, 1, 1),
154 };
155
156 static const struct snd_kcontrol_new alc5632_snd_controls[] = {
157 SOC_DOUBLE_TLV("Auxout Playback Volume",
158 ALC5632_AUX_OUT_VOL, 8, 0, 31, 1, hp_tlv),
159 SOC_DOUBLE("Auxout Playback Switch",
160 ALC5632_AUX_OUT_VOL, 15, 7, 1, 1),
161 SOC_SINGLE_TLV("Voice DAC Playback Volume",
162 ALC5632_VOICE_DAC_VOL, 0, 63, 0, vdac_tlv),
163 SOC_SINGLE_TLV("Phone Capture Volume",
164 ALC5632_PHONE_IN_VOL, 8, 31, 1, vol_tlv),
165 SOC_DOUBLE_TLV("LineIn Capture Volume",
166 ALC5632_LINE_IN_VOL, 8, 0, 31, 1, vol_tlv),
167 SOC_DOUBLE_TLV("Stereo DAC Playback Volume",
168 ALC5632_STEREO_DAC_IN_VOL, 8, 0, 63, 1, vdac_tlv),
169 SOC_DOUBLE("Stereo DAC Playback Switch",
170 ALC5632_STEREO_DAC_IN_VOL, 15, 7, 1, 1),
171 SOC_SINGLE_TLV("Mic1 Capture Volume",
172 ALC5632_MIC_VOL, 8, 31, 1, vol_tlv),
173 SOC_SINGLE_TLV("Mic2 Capture Volume",
174 ALC5632_MIC_VOL, 0, 31, 1, vol_tlv),
175 SOC_DOUBLE_TLV("Rec Capture Volume",
176 ALC5632_ADC_REC_GAIN, 8, 0, 31, 0, adc_rec_tlv),
177 SOC_SINGLE_TLV("Mic 1 Boost Volume",
178 ALC5632_MIC_CTRL, 10, 2, 0, boost_tlv),
179 SOC_SINGLE_TLV("Mic 2 Boost Volume",
180 ALC5632_MIC_CTRL, 8, 2, 0, boost_tlv),
181 SOC_SINGLE_TLV("Digital Boost Volume",
182 ALC5632_DIGI_BOOST_CTRL, 0, 7, 0, dig_tlv),
183 };
184
185 /*
186 * DAPM Controls
187 */
188 static const struct snd_kcontrol_new alc5632_hp_mixer_controls[] = {
189 SOC_DAPM_SINGLE("LI2HP Playback Switch", ALC5632_LINE_IN_VOL, 15, 1, 1),
190 SOC_DAPM_SINGLE("PHONE2HP Playback Switch", ALC5632_PHONE_IN_VOL, 15, 1, 1),
191 SOC_DAPM_SINGLE("MIC12HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 15, 1, 1),
192 SOC_DAPM_SINGLE("MIC22HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 11, 1, 1),
193 SOC_DAPM_SINGLE("VOICE2HP Playback Switch", ALC5632_VOICE_DAC_VOL, 15, 1, 1),
194 };
195
196 static const struct snd_kcontrol_new alc5632_hpl_mixer_controls[] = {
197 SOC_DAPM_SINGLE("ADC2HP_L Playback Switch", ALC5632_ADC_REC_GAIN, 15, 1, 1),
198 SOC_DAPM_SINGLE("DACL2HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 3, 1, 1),
199 };
200
201 static const struct snd_kcontrol_new alc5632_hpr_mixer_controls[] = {
202 SOC_DAPM_SINGLE("ADC2HP_R Playback Switch", ALC5632_ADC_REC_GAIN, 7, 1, 1),
203 SOC_DAPM_SINGLE("DACR2HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 2, 1, 1),
204 };
205
206 static const struct snd_kcontrol_new alc5632_mono_mixer_controls[] = {
207 SOC_DAPM_SINGLE("ADC2MONO_L Playback Switch", ALC5632_ADC_REC_GAIN, 14, 1, 1),
208 SOC_DAPM_SINGLE("ADC2MONO_R Playback Switch", ALC5632_ADC_REC_GAIN, 6, 1, 1),
209 SOC_DAPM_SINGLE("LI2MONO Playback Switch", ALC5632_LINE_IN_VOL, 13, 1, 1),
210 SOC_DAPM_SINGLE("MIC12MONO Playback Switch",
211 ALC5632_MIC_ROUTING_CTRL, 13, 1, 1),
212 SOC_DAPM_SINGLE("MIC22MONO Playback Switch",
213 ALC5632_MIC_ROUTING_CTRL, 9, 1, 1),
214 SOC_DAPM_SINGLE("DAC2MONO Playback Switch", ALC5632_MIC_ROUTING_CTRL, 0, 1, 1),
215 SOC_DAPM_SINGLE("VOICE2MONO Playback Switch", ALC5632_VOICE_DAC_VOL, 13, 1, 1),
216 };
217
218 static const struct snd_kcontrol_new alc5632_speaker_mixer_controls[] = {
219 SOC_DAPM_SINGLE("LI2SPK Playback Switch", ALC5632_LINE_IN_VOL, 14, 1, 1),
220 SOC_DAPM_SINGLE("PHONE2SPK Playback Switch", ALC5632_PHONE_IN_VOL, 14, 1, 1),
221 SOC_DAPM_SINGLE("MIC12SPK Playback Switch",
222 ALC5632_MIC_ROUTING_CTRL, 14, 1, 1),
223 SOC_DAPM_SINGLE("MIC22SPK Playback Switch",
224 ALC5632_MIC_ROUTING_CTRL, 10, 1, 1),
225 SOC_DAPM_SINGLE("DAC2SPK Playback Switch", ALC5632_MIC_ROUTING_CTRL, 1, 1, 1),
226 SOC_DAPM_SINGLE("VOICE2SPK Playback Switch", ALC5632_VOICE_DAC_VOL, 14, 1, 1),
227 };
228
229 /* Left Record Mixer */
230 static const struct snd_kcontrol_new alc5632_captureL_mixer_controls[] = {
231 SOC_DAPM_SINGLE("Mic1 Capture Switch", ALC5632_ADC_REC_MIXER, 14, 1, 1),
232 SOC_DAPM_SINGLE("Mic2 Capture Switch", ALC5632_ADC_REC_MIXER, 13, 1, 1),
233 SOC_DAPM_SINGLE("LineInL Capture Switch", ALC5632_ADC_REC_MIXER, 12, 1, 1),
234 SOC_DAPM_SINGLE("Left Phone Capture Switch", ALC5632_ADC_REC_MIXER, 11, 1, 1),
235 SOC_DAPM_SINGLE("HPMixerL Capture Switch", ALC5632_ADC_REC_MIXER, 10, 1, 1),
236 SOC_DAPM_SINGLE("SPKMixer Capture Switch", ALC5632_ADC_REC_MIXER, 9, 1, 1),
237 SOC_DAPM_SINGLE("MonoMixer Capture Switch", ALC5632_ADC_REC_MIXER, 8, 1, 1),
238 };
239
240 /* Right Record Mixer */
241 static const struct snd_kcontrol_new alc5632_captureR_mixer_controls[] = {
242 SOC_DAPM_SINGLE("Mic1 Capture Switch", ALC5632_ADC_REC_MIXER, 6, 1, 1),
243 SOC_DAPM_SINGLE("Mic2 Capture Switch", ALC5632_ADC_REC_MIXER, 5, 1, 1),
244 SOC_DAPM_SINGLE("LineInR Capture Switch", ALC5632_ADC_REC_MIXER, 4, 1, 1),
245 SOC_DAPM_SINGLE("Right Phone Capture Switch", ALC5632_ADC_REC_MIXER, 3, 1, 1),
246 SOC_DAPM_SINGLE("HPMixerR Capture Switch", ALC5632_ADC_REC_MIXER, 2, 1, 1),
247 SOC_DAPM_SINGLE("SPKMixer Capture Switch", ALC5632_ADC_REC_MIXER, 1, 1, 1),
248 SOC_DAPM_SINGLE("MonoMixer Capture Switch", ALC5632_ADC_REC_MIXER, 0, 1, 1),
249 };
250
251 static const char *alc5632_spk_n_sour_sel[] = {
252 "RN/-R", "RP/+R", "LN/-R", "Mute"};
253 static const char *alc5632_hpl_out_input_sel[] = {
254 "Vmid", "HP Left Mix"};
255 static const char *alc5632_hpr_out_input_sel[] = {
256 "Vmid", "HP Right Mix"};
257 static const char *alc5632_spkout_input_sel[] = {
258 "Vmid", "HPOut Mix", "Speaker Mix", "Mono Mix"};
259 static const char *alc5632_aux_out_input_sel[] = {
260 "Vmid", "HPOut Mix", "Speaker Mix", "Mono Mix"};
261
262 /* auxout output mux */
263 static const struct soc_enum alc5632_aux_out_input_enum =
264 SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 6, 4, alc5632_aux_out_input_sel);
265 static const struct snd_kcontrol_new alc5632_auxout_mux_controls =
266 SOC_DAPM_ENUM("AuxOut Mux", alc5632_aux_out_input_enum);
267
268 /* speaker output mux */
269 static const struct soc_enum alc5632_spkout_input_enum =
270 SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 10, 4, alc5632_spkout_input_sel);
271 static const struct snd_kcontrol_new alc5632_spkout_mux_controls =
272 SOC_DAPM_ENUM("SpeakerOut Mux", alc5632_spkout_input_enum);
273
274 /* headphone left output mux */
275 static const struct soc_enum alc5632_hpl_out_input_enum =
276 SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 9, 2, alc5632_hpl_out_input_sel);
277 static const struct snd_kcontrol_new alc5632_hpl_out_mux_controls =
278 SOC_DAPM_ENUM("Left Headphone Mux", alc5632_hpl_out_input_enum);
279
280 /* headphone right output mux */
281 static const struct soc_enum alc5632_hpr_out_input_enum =
282 SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 8, 2, alc5632_hpr_out_input_sel);
283 static const struct snd_kcontrol_new alc5632_hpr_out_mux_controls =
284 SOC_DAPM_ENUM("Right Headphone Mux", alc5632_hpr_out_input_enum);
285
286 /* speaker output N select */
287 static const struct soc_enum alc5632_spk_n_sour_enum =
288 SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 14, 4, alc5632_spk_n_sour_sel);
289 static const struct snd_kcontrol_new alc5632_spkoutn_mux_controls =
290 SOC_DAPM_ENUM("SpeakerOut N Mux", alc5632_spk_n_sour_enum);
291
292 /* speaker amplifier */
293 static const char *alc5632_amp_names[] = {"AB Amp", "D Amp"};
294 static const struct soc_enum alc5632_amp_enum =
295 SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 13, 2, alc5632_amp_names);
296 static const struct snd_kcontrol_new alc5632_amp_mux_controls =
297 SOC_DAPM_ENUM("AB-D Amp Mux", alc5632_amp_enum);
298
299
300 static const struct snd_soc_dapm_widget alc5632_dapm_widgets[] = {
301 /* Muxes */
302 SND_SOC_DAPM_MUX("AuxOut Mux", SND_SOC_NOPM, 0, 0,
303 &alc5632_auxout_mux_controls),
304 SND_SOC_DAPM_MUX("SpeakerOut Mux", SND_SOC_NOPM, 0, 0,
305 &alc5632_spkout_mux_controls),
306 SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0,
307 &alc5632_hpl_out_mux_controls),
308 SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0,
309 &alc5632_hpr_out_mux_controls),
310 SND_SOC_DAPM_MUX("SpeakerOut N Mux", SND_SOC_NOPM, 0, 0,
311 &alc5632_spkoutn_mux_controls),
312
313 /* output mixers */
314 SND_SOC_DAPM_MIXER("HP Mix", SND_SOC_NOPM, 0, 0,
315 &alc5632_hp_mixer_controls[0],
316 ARRAY_SIZE(alc5632_hp_mixer_controls)),
317 SND_SOC_DAPM_MIXER("HPR Mix", ALC5632_PWR_MANAG_ADD2, 4, 0,
318 &alc5632_hpr_mixer_controls[0],
319 ARRAY_SIZE(alc5632_hpr_mixer_controls)),
320 SND_SOC_DAPM_MIXER("HPL Mix", ALC5632_PWR_MANAG_ADD2, 5, 0,
321 &alc5632_hpl_mixer_controls[0],
322 ARRAY_SIZE(alc5632_hpl_mixer_controls)),
323 SND_SOC_DAPM_MIXER("HPOut Mix", SND_SOC_NOPM, 0, 0, NULL, 0),
324 SND_SOC_DAPM_MIXER("Mono Mix", ALC5632_PWR_MANAG_ADD2, 2, 0,
325 &alc5632_mono_mixer_controls[0],
326 ARRAY_SIZE(alc5632_mono_mixer_controls)),
327 SND_SOC_DAPM_MIXER("Speaker Mix", ALC5632_PWR_MANAG_ADD2, 3, 0,
328 &alc5632_speaker_mixer_controls[0],
329 ARRAY_SIZE(alc5632_speaker_mixer_controls)),
330
331 /* input mixers */
332 SND_SOC_DAPM_MIXER("Left Capture Mix", ALC5632_PWR_MANAG_ADD2, 1, 0,
333 &alc5632_captureL_mixer_controls[0],
334 ARRAY_SIZE(alc5632_captureL_mixer_controls)),
335 SND_SOC_DAPM_MIXER("Right Capture Mix", ALC5632_PWR_MANAG_ADD2, 0, 0,
336 &alc5632_captureR_mixer_controls[0],
337 ARRAY_SIZE(alc5632_captureR_mixer_controls)),
338
339 SND_SOC_DAPM_DAC("Left DAC", "HiFi Playback",
340 ALC5632_PWR_MANAG_ADD2, 9, 0),
341 SND_SOC_DAPM_DAC("Right DAC", "HiFi Playback",
342 ALC5632_PWR_MANAG_ADD2, 8, 0),
343 SND_SOC_DAPM_MIXER("DAC Left Channel", ALC5632_PWR_MANAG_ADD1, 15, 0, NULL, 0),
344 SND_SOC_DAPM_MIXER("DAC Right Channel",
345 ALC5632_PWR_MANAG_ADD1, 14, 0, NULL, 0),
346 SND_SOC_DAPM_MIXER("I2S Mix", ALC5632_PWR_MANAG_ADD1, 11, 0, NULL, 0),
347 SND_SOC_DAPM_MIXER("Phone Mix", SND_SOC_NOPM, 0, 0, NULL, 0),
348 SND_SOC_DAPM_MIXER("Line Mix", SND_SOC_NOPM, 0, 0, NULL, 0),
349 SND_SOC_DAPM_ADC("Left ADC", "HiFi Capture",
350 ALC5632_PWR_MANAG_ADD2, 7, 0),
351 SND_SOC_DAPM_ADC("Right ADC", "HiFi Capture",
352 ALC5632_PWR_MANAG_ADD2, 6, 0),
353 SND_SOC_DAPM_PGA("Left Headphone", ALC5632_PWR_MANAG_ADD3, 11, 0, NULL, 0),
354 SND_SOC_DAPM_PGA("Right Headphone", ALC5632_PWR_MANAG_ADD3, 10, 0, NULL, 0),
355 SND_SOC_DAPM_PGA("Left Speaker", ALC5632_PWR_MANAG_ADD3, 13, 0, NULL, 0),
356 SND_SOC_DAPM_PGA("Right Speaker", ALC5632_PWR_MANAG_ADD3, 12, 0, NULL, 0),
357 SND_SOC_DAPM_PGA("Aux Out", ALC5632_PWR_MANAG_ADD3, 14, 0, NULL, 0),
358 SND_SOC_DAPM_PGA("Left LineIn", ALC5632_PWR_MANAG_ADD3, 7, 0, NULL, 0),
359 SND_SOC_DAPM_PGA("Right LineIn", ALC5632_PWR_MANAG_ADD3, 6, 0, NULL, 0),
360 SND_SOC_DAPM_PGA("Phone", ALC5632_PWR_MANAG_ADD3, 5, 0, NULL, 0),
361 SND_SOC_DAPM_PGA("Phone ADMix", ALC5632_PWR_MANAG_ADD3, 4, 0, NULL, 0),
362 SND_SOC_DAPM_PGA("MIC1 PGA", ALC5632_PWR_MANAG_ADD3, 3, 0, NULL, 0),
363 SND_SOC_DAPM_PGA("MIC2 PGA", ALC5632_PWR_MANAG_ADD3, 2, 0, NULL, 0),
364 SND_SOC_DAPM_PGA("MIC1 Pre Amp", ALC5632_PWR_MANAG_ADD3, 1, 0, NULL, 0),
365 SND_SOC_DAPM_PGA("MIC2 Pre Amp", ALC5632_PWR_MANAG_ADD3, 0, 0, NULL, 0),
366 SND_SOC_DAPM_SUPPLY("Mic Bias1", ALC5632_PWR_MANAG_ADD1, 3, 0, NULL, 0),
367 SND_SOC_DAPM_SUPPLY("Mic Bias2", ALC5632_PWR_MANAG_ADD1, 2, 0, NULL, 0),
368
369 SND_SOC_DAPM_PGA_E("D Amp", ALC5632_PWR_MANAG_ADD2, 14, 0, NULL, 0,
370 amp_mixer_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
371 SND_SOC_DAPM_PGA("AB Amp", ALC5632_PWR_MANAG_ADD2, 15, 0, NULL, 0),
372 SND_SOC_DAPM_MUX("AB-D Amp Mux", ALC5632_PWR_MANAG_ADD1, 10, 0,
373 &alc5632_amp_mux_controls),
374
375 SND_SOC_DAPM_OUTPUT("AUXOUT"),
376 SND_SOC_DAPM_OUTPUT("HPL"),
377 SND_SOC_DAPM_OUTPUT("HPR"),
378 SND_SOC_DAPM_OUTPUT("SPKOUT"),
379 SND_SOC_DAPM_OUTPUT("SPKOUTN"),
380 SND_SOC_DAPM_INPUT("LINEINL"),
381 SND_SOC_DAPM_INPUT("LINEINR"),
382 SND_SOC_DAPM_INPUT("PHONEP"),
383 SND_SOC_DAPM_INPUT("PHONEN"),
384 SND_SOC_DAPM_INPUT("MIC1"),
385 SND_SOC_DAPM_INPUT("MIC2"),
386 SND_SOC_DAPM_VMID("Vmid"),
387 };
388
389
390 static const struct snd_soc_dapm_route alc5632_dapm_routes[] = {
391 /* virtual mixer - mixes left & right channels */
392 {"I2S Mix", NULL, "Left DAC"},
393 {"I2S Mix", NULL, "Right DAC"},
394 {"Line Mix", NULL, "Right LineIn"},
395 {"Line Mix", NULL, "Left LineIn"},
396 {"Phone Mix", NULL, "Phone"},
397 {"Phone Mix", NULL, "Phone ADMix"},
398 {"AUXOUT", NULL, "Aux Out"},
399
400 /* DAC */
401 {"DAC Right Channel", NULL, "I2S Mix"},
402 {"DAC Left Channel", NULL, "I2S Mix"},
403
404 /* HP mixer */
405 {"HPL Mix", "ADC2HP_L Playback Switch", "Left Capture Mix"},
406 {"HPL Mix", NULL, "HP Mix"},
407 {"HPR Mix", "ADC2HP_R Playback Switch", "Right Capture Mix"},
408 {"HPR Mix", NULL, "HP Mix"},
409 {"HP Mix", "LI2HP Playback Switch", "Line Mix"},
410 {"HP Mix", "PHONE2HP Playback Switch", "Phone Mix"},
411 {"HP Mix", "MIC12HP Playback Switch", "MIC1 PGA"},
412 {"HP Mix", "MIC22HP Playback Switch", "MIC2 PGA"},
413
414 {"HPR Mix", "DACR2HP Playback Switch", "DAC Right Channel"},
415 {"HPL Mix", "DACL2HP Playback Switch", "DAC Left Channel"},
416
417 /* speaker mixer */
418 {"Speaker Mix", "LI2SPK Playback Switch", "Line Mix"},
419 {"Speaker Mix", "PHONE2SPK Playback Switch", "Phone Mix"},
420 {"Speaker Mix", "MIC12SPK Playback Switch", "MIC1 PGA"},
421 {"Speaker Mix", "MIC22SPK Playback Switch", "MIC2 PGA"},
422 {"Speaker Mix", "DAC2SPK Playback Switch", "DAC Left Channel"},
423
424
425
426 /* mono mixer */
427 {"Mono Mix", "ADC2MONO_L Playback Switch", "Left Capture Mix"},
428 {"Mono Mix", "ADC2MONO_R Playback Switch", "Right Capture Mix"},
429 {"Mono Mix", "LI2MONO Playback Switch", "Line Mix"},
430 {"Mono Mix", "VOICE2MONO Playback Switch", "Phone Mix"},
431 {"Mono Mix", "MIC12MONO Playback Switch", "MIC1 PGA"},
432 {"Mono Mix", "MIC22MONO Playback Switch", "MIC2 PGA"},
433 {"Mono Mix", "DAC2MONO Playback Switch", "DAC Left Channel"},
434
435 /* Left record mixer */
436 {"Left Capture Mix", "LineInL Capture Switch", "LINEINL"},
437 {"Left Capture Mix", "Left Phone Capture Switch", "PHONEN"},
438 {"Left Capture Mix", "Mic1 Capture Switch", "MIC1 Pre Amp"},
439 {"Left Capture Mix", "Mic2 Capture Switch", "MIC2 Pre Amp"},
440 {"Left Capture Mix", "HPMixerL Capture Switch", "HPL Mix"},
441 {"Left Capture Mix", "SPKMixer Capture Switch", "Speaker Mix"},
442 {"Left Capture Mix", "MonoMixer Capture Switch", "Mono Mix"},
443
444 /*Right record mixer */
445 {"Right Capture Mix", "LineInR Capture Switch", "LINEINR"},
446 {"Right Capture Mix", "Right Phone Capture Switch", "PHONEP"},
447 {"Right Capture Mix", "Mic1 Capture Switch", "MIC1 Pre Amp"},
448 {"Right Capture Mix", "Mic2 Capture Switch", "MIC2 Pre Amp"},
449 {"Right Capture Mix", "HPMixerR Capture Switch", "HPR Mix"},
450 {"Right Capture Mix", "SPKMixer Capture Switch", "Speaker Mix"},
451 {"Right Capture Mix", "MonoMixer Capture Switch", "Mono Mix"},
452
453 /* headphone left mux */
454 {"Left Headphone Mux", "HP Left Mix", "HPL Mix"},
455 {"Left Headphone Mux", "Vmid", "Vmid"},
456
457 /* headphone right mux */
458 {"Right Headphone Mux", "HP Right Mix", "HPR Mix"},
459 {"Right Headphone Mux", "Vmid", "Vmid"},
460
461 /* speaker out mux */
462 {"SpeakerOut Mux", "Vmid", "Vmid"},
463 {"SpeakerOut Mux", "HPOut Mix", "HPOut Mix"},
464 {"SpeakerOut Mux", "Speaker Mix", "Speaker Mix"},
465 {"SpeakerOut Mux", "Mono Mix", "Mono Mix"},
466
467 /* Mono/Aux Out mux */
468 {"AuxOut Mux", "Vmid", "Vmid"},
469 {"AuxOut Mux", "HPOut Mix", "HPOut Mix"},
470 {"AuxOut Mux", "Speaker Mix", "Speaker Mix"},
471 {"AuxOut Mux", "Mono Mix", "Mono Mix"},
472
473 /* output pga */
474 {"HPL", NULL, "Left Headphone"},
475 {"Left Headphone", NULL, "Left Headphone Mux"},
476 {"HPR", NULL, "Right Headphone"},
477 {"Right Headphone", NULL, "Right Headphone Mux"},
478 {"Aux Out", NULL, "AuxOut Mux"},
479
480 /* input pga */
481 {"Left LineIn", NULL, "LINEINL"},
482 {"Right LineIn", NULL, "LINEINR"},
483 {"Phone", NULL, "PHONEP"},
484 {"MIC1 Pre Amp", NULL, "MIC1"},
485 {"MIC2 Pre Amp", NULL, "MIC2"},
486 {"MIC1 PGA", NULL, "MIC1 Pre Amp"},
487 {"MIC2 PGA", NULL, "MIC2 Pre Amp"},
488
489 /* left ADC */
490 {"Left ADC", NULL, "Left Capture Mix"},
491
492 /* right ADC */
493 {"Right ADC", NULL, "Right Capture Mix"},
494
495 {"SpeakerOut N Mux", "RN/-R", "Left Speaker"},
496 {"SpeakerOut N Mux", "RP/+R", "Left Speaker"},
497 {"SpeakerOut N Mux", "LN/-R", "Left Speaker"},
498 {"SpeakerOut N Mux", "Mute", "Vmid"},
499
500 {"SpeakerOut N Mux", "RN/-R", "Right Speaker"},
501 {"SpeakerOut N Mux", "RP/+R", "Right Speaker"},
502 {"SpeakerOut N Mux", "LN/-R", "Right Speaker"},
503 {"SpeakerOut N Mux", "Mute", "Vmid"},
504
505 {"AB Amp", NULL, "SpeakerOut Mux"},
506 {"D Amp", NULL, "SpeakerOut Mux"},
507 {"AB-D Amp Mux", "AB Amp", "AB Amp"},
508 {"AB-D Amp Mux", "D Amp", "D Amp"},
509 {"Left Speaker", NULL, "AB-D Amp Mux"},
510 {"Right Speaker", NULL, "AB-D Amp Mux"},
511
512 {"SPKOUT", NULL, "Left Speaker"},
513 {"SPKOUT", NULL, "Right Speaker"},
514
515 {"SPKOUTN", NULL, "SpeakerOut N Mux"},
516
517 };
518
519 /* PLL divisors */
520 struct _pll_div {
521 u32 pll_in;
522 u32 pll_out;
523 u16 regvalue;
524 };
525
526 /* Note : pll code from original alc5632 driver. Not sure of how good it is */
527 /* usefull only for master mode */
528 static const struct _pll_div codec_master_pll_div[] = {
529
530 { 2048000, 8192000, 0x0ea0},
531 { 3686400, 8192000, 0x4e27},
532 { 12000000, 8192000, 0x456b},
533 { 13000000, 8192000, 0x495f},
534 { 13100000, 8192000, 0x0320},
535 { 2048000, 11289600, 0xf637},
536 { 3686400, 11289600, 0x2f22},
537 { 12000000, 11289600, 0x3e2f},
538 { 13000000, 11289600, 0x4d5b},
539 { 13100000, 11289600, 0x363b},
540 { 2048000, 16384000, 0x1ea0},
541 { 3686400, 16384000, 0x9e27},
542 { 12000000, 16384000, 0x452b},
543 { 13000000, 16384000, 0x542f},
544 { 13100000, 16384000, 0x03a0},
545 { 2048000, 16934400, 0xe625},
546 { 3686400, 16934400, 0x9126},
547 { 12000000, 16934400, 0x4d2c},
548 { 13000000, 16934400, 0x742f},
549 { 13100000, 16934400, 0x3c27},
550 { 2048000, 22579200, 0x2aa0},
551 { 3686400, 22579200, 0x2f20},
552 { 12000000, 22579200, 0x7e2f},
553 { 13000000, 22579200, 0x742f},
554 { 13100000, 22579200, 0x3c27},
555 { 2048000, 24576000, 0x2ea0},
556 { 3686400, 24576000, 0xee27},
557 { 12000000, 24576000, 0x2915},
558 { 13000000, 24576000, 0x772e},
559 { 13100000, 24576000, 0x0d20},
560 };
561
562 /* FOUT = MCLK*(N+2)/((M+2)*(K+2))
563 N: bit 15:8 (div 2 .. div 257)
564 K: bit 6:4 typical 2
565 M: bit 3:0 (div 2 .. div 17)
566
567 same as for 5623 - thanks!
568 */
569
570 static const struct _pll_div codec_slave_pll_div[] = {
571
572 { 1024000, 16384000, 0x3ea0},
573 { 1411200, 22579200, 0x3ea0},
574 { 1536000, 24576000, 0x3ea0},
575 { 2048000, 16384000, 0x1ea0},
576 { 2822400, 22579200, 0x1ea0},
577 { 3072000, 24576000, 0x1ea0},
578
579 };
580
581 static int alc5632_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
582 int source, unsigned int freq_in, unsigned int freq_out)
583 {
584 int i;
585 struct snd_soc_codec *codec = codec_dai->codec;
586 int gbl_clk = 0, pll_div = 0;
587 u16 reg;
588
589 if (pll_id < ALC5632_PLL_FR_MCLK || pll_id > ALC5632_PLL_FR_VBCLK)
590 return -EINVAL;
591
592 /* Disable PLL power */
593 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
594 ALC5632_PWR_ADD2_PLL1,
595 0);
596 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
597 ALC5632_PWR_ADD2_PLL2,
598 0);
599
600 /* pll is not used in slave mode */
601 reg = snd_soc_read(codec, ALC5632_DAI_CONTROL);
602 if (reg & ALC5632_DAI_SDP_SLAVE_MODE)
603 return 0;
604
605 if (!freq_in || !freq_out)
606 return 0;
607
608 switch (pll_id) {
609 case ALC5632_PLL_FR_MCLK:
610 for (i = 0; i < ARRAY_SIZE(codec_master_pll_div); i++) {
611 if (codec_master_pll_div[i].pll_in == freq_in
612 && codec_master_pll_div[i].pll_out == freq_out) {
613 /* PLL source from MCLK */
614 pll_div = codec_master_pll_div[i].regvalue;
615 break;
616 }
617 }
618 break;
619 case ALC5632_PLL_FR_BCLK:
620 for (i = 0; i < ARRAY_SIZE(codec_slave_pll_div); i++) {
621 if (codec_slave_pll_div[i].pll_in == freq_in
622 && codec_slave_pll_div[i].pll_out == freq_out) {
623 /* PLL source from Bitclk */
624 gbl_clk = ALC5632_PLL_FR_BCLK;
625 pll_div = codec_slave_pll_div[i].regvalue;
626 break;
627 }
628 }
629 break;
630 case ALC5632_PLL_FR_VBCLK:
631 for (i = 0; i < ARRAY_SIZE(codec_slave_pll_div); i++) {
632 if (codec_slave_pll_div[i].pll_in == freq_in
633 && codec_slave_pll_div[i].pll_out == freq_out) {
634 /* PLL source from voice clock */
635 gbl_clk = ALC5632_PLL_FR_VBCLK;
636 pll_div = codec_slave_pll_div[i].regvalue;
637 break;
638 }
639 }
640 break;
641 default:
642 return -EINVAL;
643 }
644
645 if (!pll_div)
646 return -EINVAL;
647
648 /* choose MCLK/BCLK/VBCLK */
649 snd_soc_write(codec, ALC5632_GPCR2, gbl_clk);
650 /* choose PLL1 clock rate */
651 snd_soc_write(codec, ALC5632_PLL1_CTRL, pll_div);
652 /* enable PLL1 */
653 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
654 ALC5632_PWR_ADD2_PLL1,
655 ALC5632_PWR_ADD2_PLL1);
656 /* enable PLL2 */
657 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
658 ALC5632_PWR_ADD2_PLL2,
659 ALC5632_PWR_ADD2_PLL2);
660 /* use PLL1 as main SYSCLK */
661 snd_soc_update_bits(codec, ALC5632_GPCR1,
662 ALC5632_GPCR1_CLK_SYS_SRC_SEL_PLL1,
663 ALC5632_GPCR1_CLK_SYS_SRC_SEL_PLL1);
664
665 return 0;
666 }
667
668 struct _coeff_div {
669 u16 fs;
670 u16 regvalue;
671 };
672
673 /* codec hifi mclk (after PLL) clock divider coefficients */
674 /* values inspired from column BCLK=32Fs of Appendix A table */
675 static const struct _coeff_div coeff_div[] = {
676 {512*1, 0x3075},
677 };
678
679 static int get_coeff(struct snd_soc_codec *codec, int rate)
680 {
681 struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
682 int i;
683
684 for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
685 if (coeff_div[i].fs * rate == alc5632->sysclk)
686 return i;
687 }
688 return -EINVAL;
689 }
690
691 /*
692 * Clock after PLL and dividers
693 */
694 static int alc5632_set_dai_sysclk(struct snd_soc_dai *codec_dai,
695 int clk_id, unsigned int freq, int dir)
696 {
697 struct snd_soc_codec *codec = codec_dai->codec;
698 struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
699
700 switch (freq) {
701 case 8192000:
702 case 11289600:
703 case 12288000:
704 case 16384000:
705 case 16934400:
706 case 18432000:
707 case 22579200:
708 case 24576000:
709 alc5632->sysclk = freq;
710 return 0;
711 }
712 return -EINVAL;
713 }
714
715 static int alc5632_set_dai_fmt(struct snd_soc_dai *codec_dai,
716 unsigned int fmt)
717 {
718 struct snd_soc_codec *codec = codec_dai->codec;
719 u16 iface = 0;
720
721 /* set master/slave audio interface */
722 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
723 case SND_SOC_DAIFMT_CBM_CFM:
724 iface = ALC5632_DAI_SDP_MASTER_MODE;
725 break;
726 case SND_SOC_DAIFMT_CBS_CFS:
727 iface = ALC5632_DAI_SDP_SLAVE_MODE;
728 break;
729 default:
730 return -EINVAL;
731 }
732
733 /* interface format */
734 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
735 case SND_SOC_DAIFMT_I2S:
736 iface |= ALC5632_DAI_I2S_DF_I2S;
737 break;
738 case SND_SOC_DAIFMT_LEFT_J:
739 iface |= ALC5632_DAI_I2S_DF_LEFT;
740 break;
741 case SND_SOC_DAIFMT_DSP_A:
742 iface |= ALC5632_DAI_I2S_DF_PCM_A;
743 break;
744 case SND_SOC_DAIFMT_DSP_B:
745 iface |= ALC5632_DAI_I2S_DF_PCM_B;
746 break;
747 default:
748 return -EINVAL;
749 }
750
751 /* clock inversion */
752 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
753 case SND_SOC_DAIFMT_NB_NF:
754 break;
755 case SND_SOC_DAIFMT_IB_IF:
756 iface |= ALC5632_DAI_MAIN_I2S_BCLK_POL_CTRL;
757 break;
758 case SND_SOC_DAIFMT_IB_NF:
759 iface |= ALC5632_DAI_MAIN_I2S_BCLK_POL_CTRL;
760 break;
761 case SND_SOC_DAIFMT_NB_IF:
762 break;
763 default:
764 return -EINVAL;
765 }
766
767 return snd_soc_write(codec, ALC5632_DAI_CONTROL, iface);
768 }
769
770 static int alc5632_pcm_hw_params(struct snd_pcm_substream *substream,
771 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
772 {
773 struct snd_soc_pcm_runtime *rtd = substream->private_data;
774 struct snd_soc_codec *codec = rtd->codec;
775 int coeff, rate;
776 u16 iface;
777
778 iface = snd_soc_read(codec, ALC5632_DAI_CONTROL);
779 iface &= ~ALC5632_DAI_I2S_DL_MASK;
780
781 /* bit size */
782 switch (params_format(params)) {
783 case SNDRV_PCM_FORMAT_S16_LE:
784 iface |= ALC5632_DAI_I2S_DL_16;
785 break;
786 case SNDRV_PCM_FORMAT_S20_3LE:
787 iface |= ALC5632_DAI_I2S_DL_20;
788 break;
789 case SNDRV_PCM_FORMAT_S24_LE:
790 iface |= ALC5632_DAI_I2S_DL_24;
791 break;
792 default:
793 return -EINVAL;
794 }
795
796 /* set iface & srate */
797 snd_soc_write(codec, ALC5632_DAI_CONTROL, iface);
798 rate = params_rate(params);
799 coeff = get_coeff(codec, rate);
800 if (coeff < 0)
801 return -EINVAL;
802
803 coeff = coeff_div[coeff].regvalue;
804 snd_soc_write(codec, ALC5632_DAC_CLK_CTRL1, coeff);
805
806 return 0;
807 }
808
809 static int alc5632_mute(struct snd_soc_dai *dai, int mute)
810 {
811 struct snd_soc_codec *codec = dai->codec;
812 u16 hp_mute = ALC5632_MISC_HP_DEPOP_MUTE_L
813 |ALC5632_MISC_HP_DEPOP_MUTE_R;
814 u16 mute_reg = snd_soc_read(codec, ALC5632_MISC_CTRL) & ~hp_mute;
815
816 if (mute)
817 mute_reg |= hp_mute;
818
819 return snd_soc_write(codec, ALC5632_MISC_CTRL, mute_reg);
820 }
821
822 #define ALC5632_ADD2_POWER_EN (ALC5632_PWR_ADD2_VREF)
823
824 #define ALC5632_ADD3_POWER_EN (ALC5632_PWR_ADD3_MIC1_BOOST_AD)
825
826 #define ALC5632_ADD1_POWER_EN \
827 (ALC5632_PWR_ADD1_DAC_REF \
828 | ALC5632_PWR_ADD1_SOFTGEN_EN \
829 | ALC5632_PWR_ADD1_HP_OUT_AMP \
830 | ALC5632_PWR_ADD1_HP_OUT_ENH_AMP \
831 | ALC5632_PWR_ADD1_MAIN_BIAS)
832
833 static void enable_power_depop(struct snd_soc_codec *codec)
834 {
835 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
836 ALC5632_PWR_ADD1_SOFTGEN_EN,
837 ALC5632_PWR_ADD1_SOFTGEN_EN);
838
839 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD3,
840 ALC5632_ADD3_POWER_EN,
841 ALC5632_ADD3_POWER_EN);
842
843 snd_soc_update_bits(codec, ALC5632_MISC_CTRL,
844 ALC5632_MISC_HP_DEPOP_MODE2_EN,
845 ALC5632_MISC_HP_DEPOP_MODE2_EN);
846
847 /* "normal" mode: 0 @ 26 */
848 /* set all PR0-7 mixers to 0 */
849 snd_soc_update_bits(codec, ALC5632_PWR_DOWN_CTRL_STATUS,
850 ALC5632_PWR_DOWN_CTRL_STATUS_MASK,
851 0);
852
853 msleep(500);
854
855 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
856 ALC5632_ADD2_POWER_EN,
857 ALC5632_ADD2_POWER_EN);
858
859 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
860 ALC5632_ADD1_POWER_EN,
861 ALC5632_ADD1_POWER_EN);
862
863 /* disable HP Depop2 */
864 snd_soc_update_bits(codec, ALC5632_MISC_CTRL,
865 ALC5632_MISC_HP_DEPOP_MODE2_EN,
866 0);
867
868 }
869
870 static int alc5632_set_bias_level(struct snd_soc_codec *codec,
871 enum snd_soc_bias_level level)
872 {
873 switch (level) {
874 case SND_SOC_BIAS_ON:
875 enable_power_depop(codec);
876 break;
877 case SND_SOC_BIAS_PREPARE:
878 break;
879 case SND_SOC_BIAS_STANDBY:
880 /* everything off except vref/vmid, */
881 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
882 ALC5632_PWR_MANAG_ADD1_MASK,
883 ALC5632_PWR_ADD1_MAIN_BIAS);
884 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
885 ALC5632_PWR_MANAG_ADD2_MASK,
886 ALC5632_PWR_ADD2_VREF);
887 /* "normal" mode: 0 @ 26 */
888 snd_soc_update_bits(codec, ALC5632_PWR_DOWN_CTRL_STATUS,
889 ALC5632_PWR_DOWN_CTRL_STATUS_MASK,
890 0xffff ^ (ALC5632_PWR_VREF_PR3
891 | ALC5632_PWR_VREF_PR2));
892 break;
893 case SND_SOC_BIAS_OFF:
894 /* everything off, dac mute, inactive */
895 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
896 ALC5632_PWR_MANAG_ADD2_MASK, 0);
897 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD3,
898 ALC5632_PWR_MANAG_ADD3_MASK, 0);
899 snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
900 ALC5632_PWR_MANAG_ADD1_MASK, 0);
901 break;
902 }
903 codec->dapm.bias_level = level;
904 return 0;
905 }
906
907 #define ALC5632_FORMATS (SNDRV_PCM_FMTBIT_S16_LE \
908 | SNDRV_PCM_FMTBIT_S24_LE \
909 | SNDRV_PCM_FMTBIT_S32_LE)
910
911 static struct snd_soc_dai_ops alc5632_dai_ops = {
912 .hw_params = alc5632_pcm_hw_params,
913 .digital_mute = alc5632_mute,
914 .set_fmt = alc5632_set_dai_fmt,
915 .set_sysclk = alc5632_set_dai_sysclk,
916 .set_pll = alc5632_set_dai_pll,
917 };
918
919 static struct snd_soc_dai_driver alc5632_dai = {
920 .name = "alc5632-hifi",
921 .playback = {
922 .stream_name = "HiFi Playback",
923 .channels_min = 1,
924 .channels_max = 2,
925 .rate_min = 8000,
926 .rate_max = 48000,
927 .rates = SNDRV_PCM_RATE_8000_48000,
928 .formats = ALC5632_FORMATS,},
929 .capture = {
930 .stream_name = "HiFi Capture",
931 .channels_min = 1,
932 .channels_max = 2,
933 .rate_min = 8000,
934 .rate_max = 48000,
935 .rates = SNDRV_PCM_RATE_8000_48000,
936 .formats = ALC5632_FORMATS,},
937
938 .ops = &alc5632_dai_ops,
939 .symmetric_rates = 1,
940 };
941
942 static int alc5632_suspend(struct snd_soc_codec *codec, pm_message_t mesg)
943 {
944 alc5632_set_bias_level(codec, SND_SOC_BIAS_OFF);
945 return 0;
946 }
947
948 static int alc5632_resume(struct snd_soc_codec *codec)
949 {
950 int ret;
951
952 /* mark cache as needed to sync */
953 codec->cache_sync = 1;
954
955 ret = snd_soc_cache_sync(codec);
956 if (ret != 0) {
957 dev_err(codec->dev, "Failed to sync cache: %d\n", ret);
958 return ret;
959 }
960
961 alc5632_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
962 return 0;
963 }
964
965 static int alc5632_probe(struct snd_soc_codec *codec)
966 {
967 struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
968 int ret;
969
970 ret = snd_soc_codec_set_cache_io(codec, 8, 16, alc5632->control_type);
971 if (ret < 0) {
972 dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
973 return ret;
974 }
975
976 alc5632_reset(codec);
977
978 /* power on device */
979 alc5632_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
980
981 switch (alc5632->id) {
982 case 0x5c:
983 snd_soc_add_controls(codec, alc5632_vol_snd_controls,
984 ARRAY_SIZE(alc5632_vol_snd_controls));
985 break;
986 default:
987 return -EINVAL;
988 }
989
990 return ret;
991 }
992
993 /* power down chip */
994 static int alc5632_remove(struct snd_soc_codec *codec)
995 {
996 alc5632_set_bias_level(codec, SND_SOC_BIAS_OFF);
997 return 0;
998 }
999
1000 static struct snd_soc_codec_driver soc_codec_device_alc5632 = {
1001 .probe = alc5632_probe,
1002 .remove = alc5632_remove,
1003 .suspend = alc5632_suspend,
1004 .resume = alc5632_resume,
1005 .set_bias_level = alc5632_set_bias_level,
1006 .reg_word_size = sizeof(u16),
1007 .reg_cache_step = 2,
1008 .reg_cache_default = alc5632_reg_defaults,
1009 .reg_cache_size = ARRAY_SIZE(alc5632_reg_defaults),
1010 .volatile_register = alc5632_volatile_register,
1011 .controls = alc5632_snd_controls,
1012 .num_controls = ARRAY_SIZE(alc5632_snd_controls),
1013 .dapm_widgets = alc5632_dapm_widgets,
1014 .num_dapm_widgets = ARRAY_SIZE(alc5632_dapm_widgets),
1015 .dapm_routes = alc5632_dapm_routes,
1016 .num_dapm_routes = ARRAY_SIZE(alc5632_dapm_routes),
1017 };
1018
1019 /*
1020 * alc5632 2 wire address is determined by A1 pin
1021 * state during powerup.
1022 * low = 0x1a
1023 * high = 0x1b
1024 */
1025 static int alc5632_i2c_probe(struct i2c_client *client,
1026 const struct i2c_device_id *id)
1027 {
1028 struct alc5632_priv *alc5632;
1029 int ret, vid1, vid2;
1030
1031 vid1 = i2c_smbus_read_word_data(client, ALC5632_VENDOR_ID1);
1032 if (vid1 < 0) {
1033 dev_err(&client->dev, "failed to read I2C\n");
1034 return -EIO;
1035 } else {
1036 dev_info(&client->dev, "got vid1: %x\n", vid1);
1037 }
1038 vid1 = ((vid1 & 0xff) << 8) | (vid1 >> 8);
1039
1040 vid2 = i2c_smbus_read_word_data(client, ALC5632_VENDOR_ID2);
1041 if (vid2 < 0) {
1042 dev_err(&client->dev, "failed to read I2C\n");
1043 return -EIO;
1044 } else {
1045 dev_info(&client->dev, "got vid2: %x\n", vid2);
1046 }
1047 vid2 = (vid2 & 0xff);
1048
1049 if ((vid1 != 0x10ec) || (vid2 != id->driver_data)) {
1050 dev_err(&client->dev, "unknown or wrong codec\n");
1051 dev_err(&client->dev, "Expected %x:%lx, got %x:%x\n",
1052 0x10ec, id->driver_data,
1053 vid1, vid2);
1054 return -ENODEV;
1055 }
1056
1057 alc5632 = devm_kzalloc(&client->dev,
1058 sizeof(struct alc5632_priv), GFP_KERNEL);
1059 if (alc5632 == NULL)
1060 return -ENOMEM;
1061
1062 alc5632->id = vid2;
1063 switch (alc5632->id) {
1064 case 0x5c:
1065 alc5632_dai.name = "alc5632-hifi";
1066 break;
1067 default:
1068 return -EINVAL;
1069 }
1070
1071 i2c_set_clientdata(client, alc5632);
1072 alc5632->control_type = SND_SOC_I2C;
1073
1074 ret = snd_soc_register_codec(&client->dev,
1075 &soc_codec_device_alc5632, &alc5632_dai, 1);
1076 if (ret != 0)
1077 dev_err(&client->dev, "Failed to register codec: %d\n", ret);
1078
1079 return ret;
1080 }
1081
1082 static int alc5632_i2c_remove(struct i2c_client *client)
1083 {
1084 snd_soc_unregister_codec(&client->dev);
1085
1086 return 0;
1087 }
1088
1089 static const struct i2c_device_id alc5632_i2c_table[] = {
1090 {"alc5632", 0x5c},
1091 {}
1092 };
1093 MODULE_DEVICE_TABLE(i2c, alc5632_i2c_table);
1094
1095 /* i2c codec control layer */
1096 static struct i2c_driver alc5632_i2c_driver = {
1097 .driver = {
1098 .name = "alc5632",
1099 .owner = THIS_MODULE,
1100 },
1101 .probe = alc5632_i2c_probe,
1102 .remove = __devexit_p(alc5632_i2c_remove),
1103 .id_table = alc5632_i2c_table,
1104 };
1105
1106 static int __init alc5632_modinit(void)
1107 {
1108 int ret;
1109
1110 ret = i2c_add_driver(&alc5632_i2c_driver);
1111 if (ret != 0) {
1112 printk(KERN_ERR "%s: can't add i2c driver", __func__);
1113 return ret;
1114 }
1115
1116 return ret;
1117 }
1118 module_init(alc5632_modinit);
1119
1120 static void __exit alc5632_modexit(void)
1121 {
1122 i2c_del_driver(&alc5632_i2c_driver);
1123 }
1124 module_exit(alc5632_modexit);
1125
1126 MODULE_DESCRIPTION("ASoC ALC5632 driver");
1127 MODULE_AUTHOR("Leon Romanovsky <leon@leon.nu>");
1128 MODULE_LICENSE("GPL");
This page took 0.060912 seconds and 6 git commands to generate.