xref: /openbmc/linux/sound/soc/codecs/alc5632.c (revision 6662ff5c)
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");
1129