1 /* 2 * ALSA SoC TLV320AIC23 codec driver 3 * 4 * Author: Arun KS, <arunks@mistralsolutions.com> 5 * Copyright: (C) 2008 Mistral Solutions Pvt Ltd., 6 * 7 * Based on sound/soc/codecs/wm8731.c by Richard Purdie 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 * 13 * Notes: 14 * The AIC23 is a driver for a low power stereo audio 15 * codec tlv320aic23 16 * 17 * The machine layer should disable unsupported inputs/outputs by 18 * snd_soc_dapm_disable_pin(codec, "LHPOUT"), etc. 19 */ 20 21 #include <linux/module.h> 22 #include <linux/moduleparam.h> 23 #include <linux/init.h> 24 #include <linux/delay.h> 25 #include <linux/pm.h> 26 #include <linux/i2c.h> 27 #include <linux/platform_device.h> 28 #include <linux/slab.h> 29 #include <sound/core.h> 30 #include <sound/pcm.h> 31 #include <sound/pcm_params.h> 32 #include <sound/soc.h> 33 #include <sound/tlv.h> 34 #include <sound/initval.h> 35 36 #include "tlv320aic23.h" 37 38 #define AIC23_VERSION "0.1" 39 40 /* 41 * AIC23 register cache 42 */ 43 static const u16 tlv320aic23_reg[] = { 44 0x0097, 0x0097, 0x00F9, 0x00F9, /* 0 */ 45 0x001A, 0x0004, 0x0007, 0x0001, /* 4 */ 46 0x0020, 0x0000, 0x0000, 0x0000, /* 8 */ 47 0x0000, 0x0000, 0x0000, 0x0000, /* 12 */ 48 }; 49 50 static const char *rec_src_text[] = { "Line", "Mic" }; 51 static const char *deemph_text[] = {"None", "32Khz", "44.1Khz", "48Khz"}; 52 53 static const struct soc_enum rec_src_enum = 54 SOC_ENUM_SINGLE(TLV320AIC23_ANLG, 2, 2, rec_src_text); 55 56 static const struct snd_kcontrol_new tlv320aic23_rec_src_mux_controls = 57 SOC_DAPM_ENUM("Input Select", rec_src_enum); 58 59 static const struct soc_enum tlv320aic23_rec_src = 60 SOC_ENUM_SINGLE(TLV320AIC23_ANLG, 2, 2, rec_src_text); 61 static const struct soc_enum tlv320aic23_deemph = 62 SOC_ENUM_SINGLE(TLV320AIC23_DIGT, 1, 4, deemph_text); 63 64 static const DECLARE_TLV_DB_SCALE(out_gain_tlv, -12100, 100, 0); 65 static const DECLARE_TLV_DB_SCALE(input_gain_tlv, -1725, 75, 0); 66 static const DECLARE_TLV_DB_SCALE(sidetone_vol_tlv, -1800, 300, 0); 67 68 static int snd_soc_tlv320aic23_put_volsw(struct snd_kcontrol *kcontrol, 69 struct snd_ctl_elem_value *ucontrol) 70 { 71 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 72 u16 val, reg; 73 74 val = (ucontrol->value.integer.value[0] & 0x07); 75 76 /* linear conversion to userspace 77 * 000 = -6db 78 * 001 = -9db 79 * 010 = -12db 80 * 011 = -18db (Min) 81 * 100 = 0db (Max) 82 */ 83 val = (val >= 4) ? 4 : (3 - val); 84 85 reg = snd_soc_read(codec, TLV320AIC23_ANLG) & (~0x1C0); 86 snd_soc_write(codec, TLV320AIC23_ANLG, reg | (val << 6)); 87 88 return 0; 89 } 90 91 static int snd_soc_tlv320aic23_get_volsw(struct snd_kcontrol *kcontrol, 92 struct snd_ctl_elem_value *ucontrol) 93 { 94 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 95 u16 val; 96 97 val = snd_soc_read(codec, TLV320AIC23_ANLG) & (0x1C0); 98 val = val >> 6; 99 val = (val >= 4) ? 4 : (3 - val); 100 ucontrol->value.integer.value[0] = val; 101 return 0; 102 103 } 104 105 static const struct snd_kcontrol_new tlv320aic23_snd_controls[] = { 106 SOC_DOUBLE_R_TLV("Digital Playback Volume", TLV320AIC23_LCHNVOL, 107 TLV320AIC23_RCHNVOL, 0, 127, 0, out_gain_tlv), 108 SOC_SINGLE("Digital Playback Switch", TLV320AIC23_DIGT, 3, 1, 1), 109 SOC_DOUBLE_R("Line Input Switch", TLV320AIC23_LINVOL, 110 TLV320AIC23_RINVOL, 7, 1, 0), 111 SOC_DOUBLE_R_TLV("Line Input Volume", TLV320AIC23_LINVOL, 112 TLV320AIC23_RINVOL, 0, 31, 0, input_gain_tlv), 113 SOC_SINGLE("Mic Input Switch", TLV320AIC23_ANLG, 1, 1, 1), 114 SOC_SINGLE("Mic Booster Switch", TLV320AIC23_ANLG, 0, 1, 0), 115 SOC_SINGLE_EXT_TLV("Sidetone Volume", TLV320AIC23_ANLG, 6, 4, 0, 116 snd_soc_tlv320aic23_get_volsw, 117 snd_soc_tlv320aic23_put_volsw, sidetone_vol_tlv), 118 SOC_ENUM("Playback De-emphasis", tlv320aic23_deemph), 119 }; 120 121 /* PGA Mixer controls for Line and Mic switch */ 122 static const struct snd_kcontrol_new tlv320aic23_output_mixer_controls[] = { 123 SOC_DAPM_SINGLE("Line Bypass Switch", TLV320AIC23_ANLG, 3, 1, 0), 124 SOC_DAPM_SINGLE("Mic Sidetone Switch", TLV320AIC23_ANLG, 5, 1, 0), 125 SOC_DAPM_SINGLE("Playback Switch", TLV320AIC23_ANLG, 4, 1, 0), 126 }; 127 128 static const struct snd_soc_dapm_widget tlv320aic23_dapm_widgets[] = { 129 SND_SOC_DAPM_DAC("DAC", "Playback", TLV320AIC23_PWR, 3, 1), 130 SND_SOC_DAPM_ADC("ADC", "Capture", TLV320AIC23_PWR, 2, 1), 131 SND_SOC_DAPM_MUX("Capture Source", SND_SOC_NOPM, 0, 0, 132 &tlv320aic23_rec_src_mux_controls), 133 SND_SOC_DAPM_MIXER("Output Mixer", TLV320AIC23_PWR, 4, 1, 134 &tlv320aic23_output_mixer_controls[0], 135 ARRAY_SIZE(tlv320aic23_output_mixer_controls)), 136 SND_SOC_DAPM_PGA("Line Input", TLV320AIC23_PWR, 0, 1, NULL, 0), 137 SND_SOC_DAPM_PGA("Mic Input", TLV320AIC23_PWR, 1, 1, NULL, 0), 138 139 SND_SOC_DAPM_OUTPUT("LHPOUT"), 140 SND_SOC_DAPM_OUTPUT("RHPOUT"), 141 SND_SOC_DAPM_OUTPUT("LOUT"), 142 SND_SOC_DAPM_OUTPUT("ROUT"), 143 144 SND_SOC_DAPM_INPUT("LLINEIN"), 145 SND_SOC_DAPM_INPUT("RLINEIN"), 146 147 SND_SOC_DAPM_INPUT("MICIN"), 148 }; 149 150 static const struct snd_soc_dapm_route tlv320aic23_intercon[] = { 151 /* Output Mixer */ 152 {"Output Mixer", "Line Bypass Switch", "Line Input"}, 153 {"Output Mixer", "Playback Switch", "DAC"}, 154 {"Output Mixer", "Mic Sidetone Switch", "Mic Input"}, 155 156 /* Outputs */ 157 {"RHPOUT", NULL, "Output Mixer"}, 158 {"LHPOUT", NULL, "Output Mixer"}, 159 {"LOUT", NULL, "Output Mixer"}, 160 {"ROUT", NULL, "Output Mixer"}, 161 162 /* Inputs */ 163 {"Line Input", "NULL", "LLINEIN"}, 164 {"Line Input", "NULL", "RLINEIN"}, 165 166 {"Mic Input", "NULL", "MICIN"}, 167 168 /* input mux */ 169 {"Capture Source", "Line", "Line Input"}, 170 {"Capture Source", "Mic", "Mic Input"}, 171 {"ADC", NULL, "Capture Source"}, 172 173 }; 174 175 /* AIC23 driver data */ 176 struct aic23 { 177 enum snd_soc_control_type control_type; 178 int mclk; 179 int requested_adc; 180 int requested_dac; 181 }; 182 183 /* 184 * Common Crystals used 185 * 11.2896 Mhz /128 = *88.2k /192 = 58.8k 186 * 12.0000 Mhz /125 = *96k /136 = 88.235K 187 * 12.2880 Mhz /128 = *96k /192 = 64k 188 * 16.9344 Mhz /128 = 132.3k /192 = *88.2k 189 * 18.4320 Mhz /128 = 144k /192 = *96k 190 */ 191 192 /* 193 * Normal BOSR 0-256/2 = 128, 1-384/2 = 192 194 * USB BOSR 0-250/2 = 125, 1-272/2 = 136 195 */ 196 static const int bosr_usb_divisor_table[] = { 197 128, 125, 192, 136 198 }; 199 #define LOWER_GROUP ((1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<6) | (1<<7)) 200 #define UPPER_GROUP ((1<<8) | (1<<9) | (1<<10) | (1<<11) | (1<<15)) 201 static const unsigned short sr_valid_mask[] = { 202 LOWER_GROUP|UPPER_GROUP, /* Normal, bosr - 0*/ 203 LOWER_GROUP, /* Usb, bosr - 0*/ 204 LOWER_GROUP|UPPER_GROUP, /* Normal, bosr - 1*/ 205 UPPER_GROUP, /* Usb, bosr - 1*/ 206 }; 207 /* 208 * Every divisor is a factor of 11*12 209 */ 210 #define SR_MULT (11*12) 211 #define A(x) (SR_MULT/x) 212 static const unsigned char sr_adc_mult_table[] = { 213 A(2), A(2), A(12), A(12), 0, 0, A(3), A(1), 214 A(2), A(2), A(11), A(11), 0, 0, 0, A(1) 215 }; 216 static const unsigned char sr_dac_mult_table[] = { 217 A(2), A(12), A(2), A(12), 0, 0, A(3), A(1), 218 A(2), A(11), A(2), A(11), 0, 0, 0, A(1) 219 }; 220 221 static unsigned get_score(int adc, int adc_l, int adc_h, int need_adc, 222 int dac, int dac_l, int dac_h, int need_dac) 223 { 224 if ((adc >= adc_l) && (adc <= adc_h) && 225 (dac >= dac_l) && (dac <= dac_h)) { 226 int diff_adc = need_adc - adc; 227 int diff_dac = need_dac - dac; 228 return abs(diff_adc) + abs(diff_dac); 229 } 230 return UINT_MAX; 231 } 232 233 static int find_rate(int mclk, u32 need_adc, u32 need_dac) 234 { 235 int i, j; 236 int best_i = -1; 237 int best_j = -1; 238 int best_div = 0; 239 unsigned best_score = UINT_MAX; 240 int adc_l, adc_h, dac_l, dac_h; 241 242 need_adc *= SR_MULT; 243 need_dac *= SR_MULT; 244 /* 245 * rates given are +/- 1/32 246 */ 247 adc_l = need_adc - (need_adc >> 5); 248 adc_h = need_adc + (need_adc >> 5); 249 dac_l = need_dac - (need_dac >> 5); 250 dac_h = need_dac + (need_dac >> 5); 251 for (i = 0; i < ARRAY_SIZE(bosr_usb_divisor_table); i++) { 252 int base = mclk / bosr_usb_divisor_table[i]; 253 int mask = sr_valid_mask[i]; 254 for (j = 0; j < ARRAY_SIZE(sr_adc_mult_table); 255 j++, mask >>= 1) { 256 int adc; 257 int dac; 258 int score; 259 if ((mask & 1) == 0) 260 continue; 261 adc = base * sr_adc_mult_table[j]; 262 dac = base * sr_dac_mult_table[j]; 263 score = get_score(adc, adc_l, adc_h, need_adc, 264 dac, dac_l, dac_h, need_dac); 265 if (best_score > score) { 266 best_score = score; 267 best_i = i; 268 best_j = j; 269 best_div = 0; 270 } 271 score = get_score((adc >> 1), adc_l, adc_h, need_adc, 272 (dac >> 1), dac_l, dac_h, need_dac); 273 /* prefer to have a /2 */ 274 if ((score != UINT_MAX) && (best_score >= score)) { 275 best_score = score; 276 best_i = i; 277 best_j = j; 278 best_div = 1; 279 } 280 } 281 } 282 return (best_j << 2) | best_i | (best_div << TLV320AIC23_CLKIN_SHIFT); 283 } 284 285 #ifdef DEBUG 286 static void get_current_sample_rates(struct snd_soc_codec *codec, int mclk, 287 u32 *sample_rate_adc, u32 *sample_rate_dac) 288 { 289 int src = snd_soc_read(codec, TLV320AIC23_SRATE); 290 int sr = (src >> 2) & 0x0f; 291 int val = (mclk / bosr_usb_divisor_table[src & 3]); 292 int adc = (val * sr_adc_mult_table[sr]) / SR_MULT; 293 int dac = (val * sr_dac_mult_table[sr]) / SR_MULT; 294 if (src & TLV320AIC23_CLKIN_HALF) { 295 adc >>= 1; 296 dac >>= 1; 297 } 298 *sample_rate_adc = adc; 299 *sample_rate_dac = dac; 300 } 301 #endif 302 303 static int set_sample_rate_control(struct snd_soc_codec *codec, int mclk, 304 u32 sample_rate_adc, u32 sample_rate_dac) 305 { 306 /* Search for the right sample rate */ 307 int data = find_rate(mclk, sample_rate_adc, sample_rate_dac); 308 if (data < 0) { 309 printk(KERN_ERR "%s:Invalid rate %u,%u requested\n", 310 __func__, sample_rate_adc, sample_rate_dac); 311 return -EINVAL; 312 } 313 snd_soc_write(codec, TLV320AIC23_SRATE, data); 314 #ifdef DEBUG 315 { 316 u32 adc, dac; 317 get_current_sample_rates(codec, mclk, &adc, &dac); 318 printk(KERN_DEBUG "actual samplerate = %u,%u reg=%x\n", 319 adc, dac, data); 320 } 321 #endif 322 return 0; 323 } 324 325 static int tlv320aic23_hw_params(struct snd_pcm_substream *substream, 326 struct snd_pcm_hw_params *params, 327 struct snd_soc_dai *dai) 328 { 329 struct snd_soc_pcm_runtime *rtd = substream->private_data; 330 struct snd_soc_codec *codec = rtd->codec; 331 u16 iface_reg; 332 int ret; 333 struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); 334 u32 sample_rate_adc = aic23->requested_adc; 335 u32 sample_rate_dac = aic23->requested_dac; 336 u32 sample_rate = params_rate(params); 337 338 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 339 aic23->requested_dac = sample_rate_dac = sample_rate; 340 if (!sample_rate_adc) 341 sample_rate_adc = sample_rate; 342 } else { 343 aic23->requested_adc = sample_rate_adc = sample_rate; 344 if (!sample_rate_dac) 345 sample_rate_dac = sample_rate; 346 } 347 ret = set_sample_rate_control(codec, aic23->mclk, sample_rate_adc, 348 sample_rate_dac); 349 if (ret < 0) 350 return ret; 351 352 iface_reg = snd_soc_read(codec, TLV320AIC23_DIGT_FMT) & ~(0x03 << 2); 353 354 switch (params_format(params)) { 355 case SNDRV_PCM_FORMAT_S16_LE: 356 break; 357 case SNDRV_PCM_FORMAT_S20_3LE: 358 iface_reg |= (0x01 << 2); 359 break; 360 case SNDRV_PCM_FORMAT_S24_LE: 361 iface_reg |= (0x02 << 2); 362 break; 363 case SNDRV_PCM_FORMAT_S32_LE: 364 iface_reg |= (0x03 << 2); 365 break; 366 } 367 snd_soc_write(codec, TLV320AIC23_DIGT_FMT, iface_reg); 368 369 return 0; 370 } 371 372 static int tlv320aic23_pcm_prepare(struct snd_pcm_substream *substream, 373 struct snd_soc_dai *dai) 374 { 375 struct snd_soc_pcm_runtime *rtd = substream->private_data; 376 struct snd_soc_codec *codec = rtd->codec; 377 378 /* set active */ 379 snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0001); 380 381 return 0; 382 } 383 384 static void tlv320aic23_shutdown(struct snd_pcm_substream *substream, 385 struct snd_soc_dai *dai) 386 { 387 struct snd_soc_pcm_runtime *rtd = substream->private_data; 388 struct snd_soc_codec *codec = rtd->codec; 389 struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); 390 391 /* deactivate */ 392 if (!codec->active) { 393 udelay(50); 394 snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); 395 } 396 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 397 aic23->requested_dac = 0; 398 else 399 aic23->requested_adc = 0; 400 } 401 402 static int tlv320aic23_mute(struct snd_soc_dai *dai, int mute) 403 { 404 struct snd_soc_codec *codec = dai->codec; 405 u16 reg; 406 407 reg = snd_soc_read(codec, TLV320AIC23_DIGT); 408 if (mute) 409 reg |= TLV320AIC23_DACM_MUTE; 410 411 else 412 reg &= ~TLV320AIC23_DACM_MUTE; 413 414 snd_soc_write(codec, TLV320AIC23_DIGT, reg); 415 416 return 0; 417 } 418 419 static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai, 420 unsigned int fmt) 421 { 422 struct snd_soc_codec *codec = codec_dai->codec; 423 u16 iface_reg; 424 425 iface_reg = snd_soc_read(codec, TLV320AIC23_DIGT_FMT) & (~0x03); 426 427 /* set master/slave audio interface */ 428 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 429 case SND_SOC_DAIFMT_CBM_CFM: 430 iface_reg |= TLV320AIC23_MS_MASTER; 431 break; 432 case SND_SOC_DAIFMT_CBS_CFS: 433 iface_reg &= ~TLV320AIC23_MS_MASTER; 434 break; 435 default: 436 return -EINVAL; 437 438 } 439 440 /* interface format */ 441 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 442 case SND_SOC_DAIFMT_I2S: 443 iface_reg |= TLV320AIC23_FOR_I2S; 444 break; 445 case SND_SOC_DAIFMT_DSP_A: 446 iface_reg |= TLV320AIC23_LRP_ON; 447 case SND_SOC_DAIFMT_DSP_B: 448 iface_reg |= TLV320AIC23_FOR_DSP; 449 break; 450 case SND_SOC_DAIFMT_RIGHT_J: 451 break; 452 case SND_SOC_DAIFMT_LEFT_J: 453 iface_reg |= TLV320AIC23_FOR_LJUST; 454 break; 455 default: 456 return -EINVAL; 457 458 } 459 460 snd_soc_write(codec, TLV320AIC23_DIGT_FMT, iface_reg); 461 462 return 0; 463 } 464 465 static int tlv320aic23_set_dai_sysclk(struct snd_soc_dai *codec_dai, 466 int clk_id, unsigned int freq, int dir) 467 { 468 struct aic23 *aic23 = snd_soc_dai_get_drvdata(codec_dai); 469 aic23->mclk = freq; 470 return 0; 471 } 472 473 static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, 474 enum snd_soc_bias_level level) 475 { 476 u16 reg = snd_soc_read(codec, TLV320AIC23_PWR) & 0xff7f; 477 478 switch (level) { 479 case SND_SOC_BIAS_ON: 480 /* vref/mid, osc on, dac unmute */ 481 reg &= ~(TLV320AIC23_DEVICE_PWR_OFF | TLV320AIC23_OSC_OFF | \ 482 TLV320AIC23_DAC_OFF); 483 snd_soc_write(codec, TLV320AIC23_PWR, reg); 484 break; 485 case SND_SOC_BIAS_PREPARE: 486 break; 487 case SND_SOC_BIAS_STANDBY: 488 /* everything off except vref/vmid, */ 489 snd_soc_write(codec, TLV320AIC23_PWR, 490 reg | TLV320AIC23_CLK_OFF); 491 break; 492 case SND_SOC_BIAS_OFF: 493 /* everything off, dac mute, inactive */ 494 snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); 495 snd_soc_write(codec, TLV320AIC23_PWR, 0xffff); 496 break; 497 } 498 codec->dapm.bias_level = level; 499 return 0; 500 } 501 502 #define AIC23_RATES SNDRV_PCM_RATE_8000_96000 503 #define AIC23_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 504 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) 505 506 static const struct snd_soc_dai_ops tlv320aic23_dai_ops = { 507 .prepare = tlv320aic23_pcm_prepare, 508 .hw_params = tlv320aic23_hw_params, 509 .shutdown = tlv320aic23_shutdown, 510 .digital_mute = tlv320aic23_mute, 511 .set_fmt = tlv320aic23_set_dai_fmt, 512 .set_sysclk = tlv320aic23_set_dai_sysclk, 513 }; 514 515 static struct snd_soc_dai_driver tlv320aic23_dai = { 516 .name = "tlv320aic23-hifi", 517 .playback = { 518 .stream_name = "Playback", 519 .channels_min = 2, 520 .channels_max = 2, 521 .rates = AIC23_RATES, 522 .formats = AIC23_FORMATS,}, 523 .capture = { 524 .stream_name = "Capture", 525 .channels_min = 2, 526 .channels_max = 2, 527 .rates = AIC23_RATES, 528 .formats = AIC23_FORMATS,}, 529 .ops = &tlv320aic23_dai_ops, 530 }; 531 532 static int tlv320aic23_suspend(struct snd_soc_codec *codec, 533 pm_message_t state) 534 { 535 tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); 536 537 return 0; 538 } 539 540 static int tlv320aic23_resume(struct snd_soc_codec *codec) 541 { 542 snd_soc_cache_sync(codec); 543 tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_STANDBY); 544 545 return 0; 546 } 547 548 static int tlv320aic23_probe(struct snd_soc_codec *codec) 549 { 550 struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); 551 int ret; 552 553 printk(KERN_INFO "AIC23 Audio Codec %s\n", AIC23_VERSION); 554 555 ret = snd_soc_codec_set_cache_io(codec, 7, 9, aic23->control_type); 556 if (ret < 0) { 557 dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); 558 return ret; 559 } 560 561 /* Reset codec */ 562 snd_soc_write(codec, TLV320AIC23_RESET, 0); 563 564 /* Write the register default value to cache for reserved registers, 565 * so the write to the these registers are suppressed by the cache 566 * restore code when it skips writes of default registers. 567 */ 568 snd_soc_cache_write(codec, 0x0A, 0); 569 snd_soc_cache_write(codec, 0x0B, 0); 570 snd_soc_cache_write(codec, 0x0C, 0); 571 snd_soc_cache_write(codec, 0x0D, 0); 572 snd_soc_cache_write(codec, 0x0E, 0); 573 574 /* power on device */ 575 tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_STANDBY); 576 577 snd_soc_write(codec, TLV320AIC23_DIGT, TLV320AIC23_DEEMP_44K); 578 579 /* Unmute input */ 580 snd_soc_update_bits(codec, TLV320AIC23_LINVOL, 581 TLV320AIC23_LIM_MUTED, TLV320AIC23_LRS_ENABLED); 582 583 snd_soc_update_bits(codec, TLV320AIC23_RINVOL, 584 TLV320AIC23_LIM_MUTED, TLV320AIC23_LRS_ENABLED); 585 586 snd_soc_update_bits(codec, TLV320AIC23_ANLG, 587 TLV320AIC23_BYPASS_ON | TLV320AIC23_MICM_MUTED, 588 0); 589 590 /* Default output volume */ 591 snd_soc_write(codec, TLV320AIC23_LCHNVOL, 592 TLV320AIC23_DEFAULT_OUT_VOL & TLV320AIC23_OUT_VOL_MASK); 593 snd_soc_write(codec, TLV320AIC23_RCHNVOL, 594 TLV320AIC23_DEFAULT_OUT_VOL & TLV320AIC23_OUT_VOL_MASK); 595 596 snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x1); 597 598 snd_soc_add_controls(codec, tlv320aic23_snd_controls, 599 ARRAY_SIZE(tlv320aic23_snd_controls)); 600 601 return 0; 602 } 603 604 static int tlv320aic23_remove(struct snd_soc_codec *codec) 605 { 606 tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); 607 return 0; 608 } 609 610 static struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = { 611 .reg_cache_size = ARRAY_SIZE(tlv320aic23_reg), 612 .reg_word_size = sizeof(u16), 613 .reg_cache_default = tlv320aic23_reg, 614 .probe = tlv320aic23_probe, 615 .remove = tlv320aic23_remove, 616 .suspend = tlv320aic23_suspend, 617 .resume = tlv320aic23_resume, 618 .set_bias_level = tlv320aic23_set_bias_level, 619 .dapm_widgets = tlv320aic23_dapm_widgets, 620 .num_dapm_widgets = ARRAY_SIZE(tlv320aic23_dapm_widgets), 621 .dapm_routes = tlv320aic23_intercon, 622 .num_dapm_routes = ARRAY_SIZE(tlv320aic23_intercon), 623 }; 624 625 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 626 /* 627 * If the i2c layer weren't so broken, we could pass this kind of data 628 * around 629 */ 630 static int tlv320aic23_codec_probe(struct i2c_client *i2c, 631 const struct i2c_device_id *i2c_id) 632 { 633 struct aic23 *aic23; 634 int ret; 635 636 if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 637 return -EINVAL; 638 639 aic23 = kzalloc(sizeof(struct aic23), GFP_KERNEL); 640 if (aic23 == NULL) 641 return -ENOMEM; 642 643 i2c_set_clientdata(i2c, aic23); 644 aic23->control_type = SND_SOC_I2C; 645 646 ret = snd_soc_register_codec(&i2c->dev, 647 &soc_codec_dev_tlv320aic23, &tlv320aic23_dai, 1); 648 if (ret < 0) 649 kfree(aic23); 650 return ret; 651 } 652 static int __exit tlv320aic23_i2c_remove(struct i2c_client *i2c) 653 { 654 snd_soc_unregister_codec(&i2c->dev); 655 kfree(i2c_get_clientdata(i2c)); 656 return 0; 657 } 658 659 static const struct i2c_device_id tlv320aic23_id[] = { 660 {"tlv320aic23", 0}, 661 {} 662 }; 663 664 MODULE_DEVICE_TABLE(i2c, tlv320aic23_id); 665 666 static struct i2c_driver tlv320aic23_i2c_driver = { 667 .driver = { 668 .name = "tlv320aic23-codec", 669 }, 670 .probe = tlv320aic23_codec_probe, 671 .remove = __exit_p(tlv320aic23_i2c_remove), 672 .id_table = tlv320aic23_id, 673 }; 674 675 #endif 676 677 static int __init tlv320aic23_modinit(void) 678 { 679 int ret; 680 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 681 ret = i2c_add_driver(&tlv320aic23_i2c_driver); 682 if (ret != 0) { 683 printk(KERN_ERR "Failed to register TLV320AIC23 I2C driver: %d\n", 684 ret); 685 } 686 #endif 687 return ret; 688 } 689 module_init(tlv320aic23_modinit); 690 691 static void __exit tlv320aic23_exit(void) 692 { 693 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 694 i2c_del_driver(&tlv320aic23_i2c_driver); 695 #endif 696 } 697 module_exit(tlv320aic23_exit); 698 699 MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver"); 700 MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>"); 701 MODULE_LICENSE("GPL"); 702