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