1 /* 2 * wm8731.c -- WM8731 ALSA SoC Audio driver 3 * 4 * Copyright 2005 Openedhand Ltd. 5 * 6 * Author: Richard Purdie <richard@openedhand.com> 7 * 8 * Based on wm8753.c by Liam Girdwood 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 as 12 * published by the Free Software Foundation. 13 */ 14 15 #include <linux/module.h> 16 #include <linux/moduleparam.h> 17 #include <linux/init.h> 18 #include <linux/delay.h> 19 #include <linux/pm.h> 20 #include <linux/i2c.h> 21 #include <linux/platform_device.h> 22 #include <sound/driver.h> 23 #include <sound/core.h> 24 #include <sound/pcm.h> 25 #include <sound/pcm_params.h> 26 #include <sound/soc.h> 27 #include <sound/soc-dapm.h> 28 #include <sound/initval.h> 29 30 #include "wm8731.h" 31 32 #define AUDIO_NAME "wm8731" 33 #define WM8731_VERSION "0.12" 34 35 /* 36 * Debug 37 */ 38 39 #define WM8731_DEBUG 0 40 41 #ifdef WM8731_DEBUG 42 #define dbg(format, arg...) \ 43 printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg) 44 #else 45 #define dbg(format, arg...) do {} while (0) 46 #endif 47 #define err(format, arg...) \ 48 printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg) 49 #define info(format, arg...) \ 50 printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg) 51 #define warn(format, arg...) \ 52 printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg) 53 54 struct snd_soc_codec_device soc_codec_dev_wm8731; 55 56 /* 57 * wm8731 register cache 58 * We can't read the WM8731 register space when we are 59 * using 2 wire for device control, so we cache them instead. 60 * There is no point in caching the reset register 61 */ 62 static const u16 wm8731_reg[WM8731_CACHEREGNUM] = { 63 0x0097, 0x0097, 0x0079, 0x0079, 64 0x000a, 0x0008, 0x009f, 0x000a, 65 0x0000, 0x0000 66 }; 67 68 #define WM8731_DAIFMT \ 69 (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \ 70 SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \ 71 SND_SOC_DAIFMT_IB_IF) 72 73 #define WM8731_DIR \ 74 (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE) 75 76 #define WM8731_RATES \ 77 (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \ 78 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ 79 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) 80 81 #define WM8731_HIFI_BITS \ 82 (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 83 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 84 85 static struct snd_soc_dai_mode wm8731_modes[] = { 86 /* codec frame and clock master modes */ 87 /* 8k */ 88 { 89 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 90 .pcmfmt = WM8731_HIFI_BITS, 91 .pcmrate = SNDRV_PCM_RATE_8000, 92 .pcmdir = WM8731_DIR, 93 .flags = SND_SOC_DAI_BFS_RATE, 94 .fs = 1536, 95 .bfs = 64, 96 }, 97 { 98 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 99 .pcmfmt = WM8731_HIFI_BITS, 100 .pcmrate = SNDRV_PCM_RATE_8000, 101 .pcmdir = WM8731_DIR, 102 .flags = SND_SOC_DAI_BFS_RATE, 103 .fs = 2304, 104 .bfs = 64, 105 }, 106 { 107 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 108 .pcmfmt = WM8731_HIFI_BITS, 109 .pcmrate = SNDRV_PCM_RATE_8000, 110 .pcmdir = WM8731_DIR, 111 .flags = SND_SOC_DAI_BFS_RATE, 112 .fs = 1408, 113 .bfs = 64, 114 }, 115 { 116 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 117 .pcmfmt = WM8731_HIFI_BITS, 118 .pcmrate = SNDRV_PCM_RATE_8000, 119 .pcmdir = WM8731_DIR, 120 .flags = SND_SOC_DAI_BFS_RATE, 121 .fs = 2112, 122 .bfs = 64, 123 }, 124 125 /* 32k */ 126 { 127 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 128 .pcmfmt = WM8731_HIFI_BITS, 129 .pcmrate = SNDRV_PCM_RATE_32000, 130 .pcmdir = WM8731_DIR, 131 .flags = SND_SOC_DAI_BFS_RATE, 132 .fs = 384, 133 .bfs = 64, 134 }, 135 { 136 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 137 .pcmfmt = WM8731_HIFI_BITS, 138 .pcmrate = SNDRV_PCM_RATE_32000, 139 .pcmdir = WM8731_DIR, 140 .flags = SND_SOC_DAI_BFS_RATE, 141 .fs = 576, 142 .bfs = 64, 143 }, 144 145 /* 44.1k & 48k */ 146 { 147 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 148 .pcmfmt = WM8731_HIFI_BITS, 149 .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, 150 .pcmdir = WM8731_DIR, 151 .flags = SND_SOC_DAI_BFS_RATE, 152 .fs = 256, 153 .bfs = 64, 154 }, 155 { 156 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 157 .pcmfmt = WM8731_HIFI_BITS, 158 .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, 159 .pcmdir = WM8731_DIR, 160 .flags = SND_SOC_DAI_BFS_RATE, 161 .fs = 384, 162 .bfs = 64, 163 }, 164 165 /* 88.2 & 96k */ 166 { 167 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 168 .pcmfmt = WM8731_HIFI_BITS, 169 .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000, 170 .pcmdir = WM8731_DIR, 171 .flags = SND_SOC_DAI_BFS_RATE, 172 .fs = 128, 173 .bfs = 64, 174 }, 175 { 176 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 177 .pcmfmt = WM8731_HIFI_BITS, 178 .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000, 179 .pcmdir = WM8731_DIR, 180 .flags = SND_SOC_DAI_BFS_RATE, 181 .fs = 192, 182 .bfs = 64, 183 }, 184 185 /* USB codec frame and clock master modes */ 186 /* 8k */ 187 { 188 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 189 .pcmfmt = WM8731_HIFI_BITS, 190 .pcmrate = SNDRV_PCM_RATE_8000, 191 .pcmdir = WM8731_DIR, 192 .flags = SND_SOC_DAI_BFS_DIV, 193 .fs = 1500, 194 .bfs = SND_SOC_FSBD(1), 195 }, 196 197 /* 44.1k */ 198 { 199 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 200 .pcmfmt = WM8731_HIFI_BITS, 201 .pcmrate = SNDRV_PCM_RATE_44100, 202 .pcmdir = WM8731_DIR, 203 .flags = SND_SOC_DAI_BFS_DIV, 204 .fs = 272, 205 .bfs = SND_SOC_FSBD(1), 206 }, 207 208 /* 48k */ 209 { 210 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 211 .pcmfmt = WM8731_HIFI_BITS, 212 .pcmrate = SNDRV_PCM_RATE_48000, 213 .pcmdir = WM8731_DIR, 214 .flags = SND_SOC_DAI_BFS_DIV, 215 .fs = 250, 216 .bfs = SND_SOC_FSBD(1), 217 }, 218 219 /* 88.2k */ 220 { 221 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 222 .pcmfmt = WM8731_HIFI_BITS, 223 .pcmrate = SNDRV_PCM_RATE_88200, 224 .pcmdir = WM8731_DIR, 225 .flags = SND_SOC_DAI_BFS_DIV, 226 .fs = 136, 227 .bfs = SND_SOC_FSBD(1), 228 }, 229 230 /* 96k */ 231 { 232 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM, 233 .pcmfmt = WM8731_HIFI_BITS, 234 .pcmrate = SNDRV_PCM_RATE_96000, 235 .pcmdir = WM8731_DIR, 236 .flags = SND_SOC_DAI_BFS_DIV, 237 .fs = 125, 238 .bfs = SND_SOC_FSBD(1), 239 }, 240 241 /* codec frame and clock slave modes */ 242 { 243 .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, 244 .pcmfmt = WM8731_HIFI_BITS, 245 .pcmrate = WM8731_RATES, 246 .pcmdir = WM8731_DIR, 247 .flags = SND_SOC_DAI_BFS_DIV, 248 .fs = SND_SOC_FS_ALL, 249 .bfs = SND_SOC_FSB_ALL, 250 }, 251 }; 252 253 /* 254 * read wm8731 register cache 255 */ 256 static inline unsigned int wm8731_read_reg_cache(struct snd_soc_codec *codec, 257 unsigned int reg) 258 { 259 u16 *cache = codec->reg_cache; 260 if (reg == WM8731_RESET) 261 return 0; 262 if (reg >= WM8731_CACHEREGNUM) 263 return -1; 264 return cache[reg]; 265 } 266 267 /* 268 * write wm8731 register cache 269 */ 270 static inline void wm8731_write_reg_cache(struct snd_soc_codec *codec, 271 u16 reg, unsigned int value) 272 { 273 u16 *cache = codec->reg_cache; 274 if (reg >= WM8731_CACHEREGNUM) 275 return; 276 cache[reg] = value; 277 } 278 279 /* 280 * write to the WM8731 register space 281 */ 282 static int wm8731_write(struct snd_soc_codec *codec, unsigned int reg, 283 unsigned int value) 284 { 285 u8 data[2]; 286 287 /* data is 288 * D15..D9 WM8731 register offset 289 * D8...D0 register data 290 */ 291 data[0] = (reg << 1) | ((value >> 8) & 0x0001); 292 data[1] = value & 0x00ff; 293 294 wm8731_write_reg_cache (codec, reg, value); 295 if (codec->hw_write(codec->control_data, data, 2) == 2) 296 return 0; 297 else 298 return -EIO; 299 } 300 301 #define wm8731_reset(c) wm8731_write(c, WM8731_RESET, 0) 302 303 static const char *wm8731_input_select[] = {"Line In", "Mic"}; 304 static const char *wm8731_deemph[] = {"None", "32Khz", "44.1Khz", "48Khz"}; 305 306 static const struct soc_enum wm8731_enum[] = { 307 SOC_ENUM_SINGLE(WM8731_APANA, 2, 2, wm8731_input_select), 308 SOC_ENUM_SINGLE(WM8731_APDIGI, 1, 4, wm8731_deemph), 309 }; 310 311 static const struct snd_kcontrol_new wm8731_snd_controls[] = { 312 313 SOC_DOUBLE_R("Playback Volume", WM8731_LOUT1V, WM8731_ROUT1V, 0, 127, 0), 314 SOC_DOUBLE_R("Playback ZC Switch", WM8731_LOUT1V, WM8731_ROUT1V, 7, 1, 0), 315 316 SOC_DOUBLE_R("Capture Volume", WM8731_LINVOL, WM8731_RINVOL, 0, 31, 0), 317 SOC_DOUBLE_R("Line Capture Switch", WM8731_LINVOL, WM8731_RINVOL, 7, 1, 1), 318 319 SOC_SINGLE("Mic Boost (+20dB)", WM8731_APANA, 0, 1, 0), 320 SOC_SINGLE("Capture Mic Switch", WM8731_APANA, 1, 1, 1), 321 322 SOC_SINGLE("Sidetone Playback Volume", WM8731_APANA, 6, 3, 1), 323 324 SOC_SINGLE("ADC High Pass Filter Switch", WM8731_APDIGI, 0, 1, 1), 325 SOC_SINGLE("Store DC Offset Switch", WM8731_APDIGI, 4, 1, 0), 326 327 SOC_ENUM("Playback De-emphasis", wm8731_enum[1]), 328 }; 329 330 /* add non dapm controls */ 331 static int wm8731_add_controls(struct snd_soc_codec *codec) 332 { 333 int err, i; 334 335 for (i = 0; i < ARRAY_SIZE(wm8731_snd_controls); i++) { 336 if ((err = snd_ctl_add(codec->card, 337 snd_soc_cnew(&wm8731_snd_controls[i],codec, NULL))) < 0) 338 return err; 339 } 340 341 return 0; 342 } 343 344 /* Output Mixer */ 345 static const struct snd_kcontrol_new wm8731_output_mixer_controls[] = { 346 SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0), 347 SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0), 348 SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0), 349 }; 350 351 /* Input mux */ 352 static const struct snd_kcontrol_new wm8731_input_mux_controls = 353 SOC_DAPM_ENUM("Input Select", wm8731_enum[0]); 354 355 static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = { 356 SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, 357 &wm8731_output_mixer_controls[0], 358 ARRAY_SIZE(wm8731_output_mixer_controls)), 359 SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8731_PWR, 3, 1), 360 SND_SOC_DAPM_OUTPUT("LOUT"), 361 SND_SOC_DAPM_OUTPUT("LHPOUT"), 362 SND_SOC_DAPM_OUTPUT("ROUT"), 363 SND_SOC_DAPM_OUTPUT("RHPOUT"), 364 SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8731_PWR, 2, 1), 365 SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0, &wm8731_input_mux_controls), 366 SND_SOC_DAPM_PGA("Line Input", WM8731_PWR, 0, 1, NULL, 0), 367 SND_SOC_DAPM_MICBIAS("Mic Bias", WM8731_PWR, 1, 1), 368 SND_SOC_DAPM_INPUT("MICIN"), 369 SND_SOC_DAPM_INPUT("RLINEIN"), 370 SND_SOC_DAPM_INPUT("LLINEIN"), 371 }; 372 373 static const char *intercon[][3] = { 374 /* output mixer */ 375 {"Output Mixer", "Line Bypass Switch", "Line Input"}, 376 {"Output Mixer", "HiFi Playback Switch", "DAC"}, 377 {"Output Mixer", "Mic Sidetone Switch", "Mic Bias"}, 378 379 /* outputs */ 380 {"RHPOUT", NULL, "Output Mixer"}, 381 {"ROUT", NULL, "Output Mixer"}, 382 {"LHPOUT", NULL, "Output Mixer"}, 383 {"LOUT", NULL, "Output Mixer"}, 384 385 /* input mux */ 386 {"Input Mux", "Line In", "Line Input"}, 387 {"Input Mux", "Mic", "Mic Bias"}, 388 {"ADC", NULL, "Input Mux"}, 389 390 /* inputs */ 391 {"Line Input", NULL, "LLINEIN"}, 392 {"Line Input", NULL, "RLINEIN"}, 393 {"Mic Bias", NULL, "MICIN"}, 394 395 /* terminator */ 396 {NULL, NULL, NULL}, 397 }; 398 399 static int wm8731_add_widgets(struct snd_soc_codec *codec) 400 { 401 int i; 402 403 for(i = 0; i < ARRAY_SIZE(wm8731_dapm_widgets); i++) { 404 snd_soc_dapm_new_control(codec, &wm8731_dapm_widgets[i]); 405 } 406 407 /* set up audio path interconnects */ 408 for(i = 0; intercon[i][0] != NULL; i++) { 409 snd_soc_dapm_connect_input(codec, intercon[i][0], 410 intercon[i][1], intercon[i][2]); 411 } 412 413 snd_soc_dapm_new_widgets(codec); 414 return 0; 415 } 416 417 struct _coeff_div { 418 u32 mclk; 419 u32 rate; 420 u16 fs; 421 u8 sr:4; 422 u8 bosr:1; 423 u8 usb:1; 424 }; 425 426 /* codec mclk clock divider coefficients */ 427 static const struct _coeff_div coeff_div[] = { 428 /* 48k */ 429 {12288000, 48000, 256, 0x0, 0x0, 0x0}, 430 {18432000, 48000, 384, 0x0, 0x1, 0x0}, 431 {12000000, 48000, 250, 0x0, 0x0, 0x1}, 432 433 /* 32k */ 434 {12288000, 32000, 384, 0x6, 0x0, 0x0}, 435 {18432000, 32000, 576, 0x6, 0x1, 0x0}, 436 437 /* 8k */ 438 {12288000, 8000, 1536, 0x3, 0x0, 0x0}, 439 {18432000, 8000, 2304, 0x3, 0x1, 0x0}, 440 {11289600, 8000, 1408, 0xb, 0x0, 0x0}, 441 {16934400, 8000, 2112, 0xb, 0x1, 0x0}, 442 {12000000, 8000, 1500, 0x3, 0x0, 0x1}, 443 444 /* 96k */ 445 {12288000, 96000, 128, 0x7, 0x0, 0x0}, 446 {18432000, 96000, 192, 0x7, 0x1, 0x0}, 447 {12000000, 96000, 125, 0x7, 0x0, 0x1}, 448 449 /* 44.1k */ 450 {11289600, 44100, 256, 0x8, 0x0, 0x0}, 451 {16934400, 44100, 384, 0x8, 0x1, 0x0}, 452 {12000000, 44100, 272, 0x8, 0x1, 0x1}, 453 454 /* 88.2k */ 455 {11289600, 88200, 128, 0xf, 0x0, 0x0}, 456 {16934400, 88200, 192, 0xf, 0x1, 0x0}, 457 {12000000, 88200, 136, 0xf, 0x1, 0x1}, 458 }; 459 460 static inline int get_coeff(int mclk, int rate) 461 { 462 int i; 463 464 for (i = 0; i < ARRAY_SIZE(coeff_div); i++) { 465 if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk) 466 return i; 467 } 468 return 0; 469 } 470 471 /* WM8731 supports numerous clocks per sample rate */ 472 static unsigned int wm8731_config_sysclk(struct snd_soc_codec_dai *dai, 473 struct snd_soc_clock_info *info, unsigned int clk) 474 { 475 dai->mclk = 0; 476 477 /* check that the calculated FS and rate actually match a clock from 478 * the machine driver */ 479 if (info->fs * info->rate == clk) 480 dai->mclk = clk; 481 482 return dai->mclk; 483 } 484 485 static int wm8731_pcm_prepare(struct snd_pcm_substream *substream) 486 { 487 struct snd_soc_pcm_runtime *rtd = substream->private_data; 488 struct snd_soc_device *socdev = rtd->socdev; 489 struct snd_soc_codec *codec = socdev->codec; 490 u16 iface = 0, srate; 491 int i = get_coeff(rtd->codec_dai->mclk, 492 snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate)); 493 494 /* set master/slave audio interface */ 495 switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) { 496 case SND_SOC_DAIFMT_CBM_CFM: 497 iface |= 0x0040; 498 break; 499 case SND_SOC_DAIFMT_CBS_CFS: 500 break; 501 } 502 srate = (coeff_div[i].sr << 2) | 503 (coeff_div[i].bosr << 1) | coeff_div[i].usb; 504 wm8731_write(codec, WM8731_SRATE, srate); 505 506 /* interface format */ 507 switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 508 case SND_SOC_DAIFMT_I2S: 509 iface |= 0x0002; 510 break; 511 case SND_SOC_DAIFMT_RIGHT_J: 512 break; 513 case SND_SOC_DAIFMT_LEFT_J: 514 iface |= 0x0001; 515 break; 516 case SND_SOC_DAIFMT_DSP_A: 517 iface |= 0x0003; 518 break; 519 case SND_SOC_DAIFMT_DSP_B: 520 iface |= 0x0013; 521 break; 522 } 523 524 /* bit size */ 525 switch (rtd->codec_dai->dai_runtime.pcmfmt) { 526 case SNDRV_PCM_FMTBIT_S16_LE: 527 break; 528 case SNDRV_PCM_FMTBIT_S20_3LE: 529 iface |= 0x0004; 530 break; 531 case SNDRV_PCM_FMTBIT_S24_LE: 532 iface |= 0x0008; 533 break; 534 case SNDRV_PCM_FMTBIT_S32_LE: 535 iface |= 0x000c; 536 break; 537 } 538 539 /* clock inversion */ 540 switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) { 541 case SND_SOC_DAIFMT_NB_NF: 542 break; 543 case SND_SOC_DAIFMT_IB_IF: 544 iface |= 0x0090; 545 break; 546 case SND_SOC_DAIFMT_IB_NF: 547 iface |= 0x0080; 548 break; 549 case SND_SOC_DAIFMT_NB_IF: 550 iface |= 0x0010; 551 break; 552 } 553 554 /* set iface */ 555 wm8731_write(codec, WM8731_IFACE, iface); 556 557 /* set active */ 558 wm8731_write(codec, WM8731_ACTIVE, 0x0001); 559 return 0; 560 } 561 562 static void wm8731_shutdown(struct snd_pcm_substream *substream) 563 { 564 struct snd_soc_pcm_runtime *rtd = substream->private_data; 565 struct snd_soc_device *socdev = rtd->socdev; 566 struct snd_soc_codec *codec = socdev->codec; 567 568 /* deactivate */ 569 if (!codec->active) { 570 udelay(50); 571 wm8731_write(codec, WM8731_ACTIVE, 0x0); 572 } 573 } 574 575 static int wm8731_mute(struct snd_soc_codec *codec, 576 struct snd_soc_codec_dai *dai, int mute) 577 { 578 u16 mute_reg = wm8731_read_reg_cache(codec, WM8731_APDIGI) & 0xfff7; 579 if (mute) 580 wm8731_write(codec, WM8731_APDIGI, mute_reg | 0x8); 581 else 582 wm8731_write(codec, WM8731_APDIGI, mute_reg); 583 return 0; 584 } 585 586 static int wm8731_dapm_event(struct snd_soc_codec *codec, int event) 587 { 588 u16 reg = wm8731_read_reg_cache(codec, WM8731_PWR) & 0xff7f; 589 590 switch (event) { 591 case SNDRV_CTL_POWER_D0: /* full On */ 592 /* vref/mid, osc on, dac unmute */ 593 wm8731_write(codec, WM8731_PWR, reg); 594 break; 595 case SNDRV_CTL_POWER_D1: /* partial On */ 596 case SNDRV_CTL_POWER_D2: /* partial On */ 597 break; 598 case SNDRV_CTL_POWER_D3hot: /* Off, with power */ 599 /* everything off except vref/vmid, */ 600 wm8731_write(codec, WM8731_PWR, reg | 0x0040); 601 break; 602 case SNDRV_CTL_POWER_D3cold: /* Off, without power */ 603 /* everything off, dac mute, inactive */ 604 wm8731_write(codec, WM8731_ACTIVE, 0x0); 605 wm8731_write(codec, WM8731_PWR, 0xffff); 606 break; 607 } 608 codec->dapm_state = event; 609 return 0; 610 } 611 612 struct snd_soc_codec_dai wm8731_dai = { 613 .name = "WM8731", 614 .playback = { 615 .stream_name = "Playback", 616 .channels_min = 1, 617 .channels_max = 2, 618 }, 619 .capture = { 620 .stream_name = "Capture", 621 .channels_min = 1, 622 .channels_max = 2, 623 }, 624 .config_sysclk = wm8731_config_sysclk, 625 .digital_mute = wm8731_mute, 626 .ops = { 627 .prepare = wm8731_pcm_prepare, 628 .shutdown = wm8731_shutdown, 629 }, 630 .caps = { 631 .num_modes = ARRAY_SIZE(wm8731_modes), 632 .mode = wm8731_modes, 633 }, 634 }; 635 EXPORT_SYMBOL_GPL(wm8731_dai); 636 637 static int wm8731_suspend(struct platform_device *pdev, pm_message_t state) 638 { 639 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 640 struct snd_soc_codec *codec = socdev->codec; 641 642 wm8731_write(codec, WM8731_ACTIVE, 0x0); 643 wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3cold); 644 return 0; 645 } 646 647 static int wm8731_resume(struct platform_device *pdev) 648 { 649 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 650 struct snd_soc_codec *codec = socdev->codec; 651 int i; 652 u8 data[2]; 653 u16 *cache = codec->reg_cache; 654 655 /* Sync reg_cache with the hardware */ 656 for (i = 0; i < ARRAY_SIZE(wm8731_reg); i++) { 657 data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001); 658 data[1] = cache[i] & 0x00ff; 659 codec->hw_write(codec->control_data, data, 2); 660 } 661 wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3hot); 662 wm8731_dapm_event(codec, codec->suspend_dapm_state); 663 return 0; 664 } 665 666 /* 667 * initialise the WM8731 driver 668 * register the mixer and dsp interfaces with the kernel 669 */ 670 static int wm8731_init(struct snd_soc_device *socdev) 671 { 672 struct snd_soc_codec *codec = socdev->codec; 673 int reg, ret = 0; 674 675 codec->name = "WM8731"; 676 codec->owner = THIS_MODULE; 677 codec->read = wm8731_read_reg_cache; 678 codec->write = wm8731_write; 679 codec->dapm_event = wm8731_dapm_event; 680 codec->dai = &wm8731_dai; 681 codec->num_dai = 1; 682 codec->reg_cache_size = ARRAY_SIZE(wm8731_reg); 683 684 codec->reg_cache = 685 kzalloc(sizeof(u16) * ARRAY_SIZE(wm8731_reg), GFP_KERNEL); 686 if (codec->reg_cache == NULL) 687 return -ENOMEM; 688 memcpy(codec->reg_cache, 689 wm8731_reg, sizeof(u16) * ARRAY_SIZE(wm8731_reg)); 690 codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8731_reg); 691 692 wm8731_reset(codec); 693 694 /* register pcms */ 695 ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); 696 if (ret < 0) { 697 kfree(codec->reg_cache); 698 return ret; 699 } 700 701 /* power on device */ 702 wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3hot); 703 704 /* set the update bits */ 705 reg = wm8731_read_reg_cache(codec, WM8731_LOUT1V); 706 wm8731_write(codec, WM8731_LOUT1V, reg | 0x0100); 707 reg = wm8731_read_reg_cache(codec, WM8731_ROUT1V); 708 wm8731_write(codec, WM8731_ROUT1V, reg | 0x0100); 709 reg = wm8731_read_reg_cache(codec, WM8731_LINVOL); 710 wm8731_write(codec, WM8731_LINVOL, reg | 0x0100); 711 reg = wm8731_read_reg_cache(codec, WM8731_RINVOL); 712 wm8731_write(codec, WM8731_RINVOL, reg | 0x0100); 713 714 wm8731_add_controls(codec); 715 wm8731_add_widgets(codec); 716 ret = snd_soc_register_card(socdev); 717 if (ret < 0) { 718 snd_soc_free_pcms(socdev); 719 snd_soc_dapm_free(socdev); 720 } 721 722 return ret; 723 } 724 725 static struct snd_soc_device *wm8731_socdev; 726 727 #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) 728 729 /* 730 * WM8731 2 wire address is determined by GPIO5 731 * state during powerup. 732 * low = 0x1a 733 * high = 0x1b 734 */ 735 static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END }; 736 737 /* Magic definition of all other variables and things */ 738 I2C_CLIENT_INSMOD; 739 740 static struct i2c_driver wm8731_i2c_driver; 741 static struct i2c_client client_template; 742 743 /* If the i2c layer weren't so broken, we could pass this kind of data 744 around */ 745 746 static int wm8731_codec_probe(struct i2c_adapter *adap, int addr, int kind) 747 { 748 struct snd_soc_device *socdev = wm8731_socdev; 749 struct wm8731_setup_data *setup = socdev->codec_data; 750 struct snd_soc_codec *codec = socdev->codec; 751 struct i2c_client *i2c; 752 int ret; 753 754 if (addr != setup->i2c_address) 755 return -ENODEV; 756 757 client_template.adapter = adap; 758 client_template.addr = addr; 759 760 i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); 761 if (i2c == NULL) { 762 kfree(codec); 763 return -ENOMEM; 764 } 765 memcpy(i2c, &client_template, sizeof(struct i2c_client)); 766 i2c_set_clientdata(i2c, codec); 767 codec->control_data = i2c; 768 769 ret = i2c_attach_client(i2c); 770 if (ret < 0) { 771 err("failed to attach codec at addr %x\n", addr); 772 goto err; 773 } 774 775 ret = wm8731_init(socdev); 776 if (ret < 0) { 777 err("failed to initialise WM8731\n"); 778 goto err; 779 } 780 return ret; 781 782 err: 783 kfree(codec); 784 kfree(i2c); 785 return ret; 786 } 787 788 static int wm8731_i2c_detach(struct i2c_client *client) 789 { 790 struct snd_soc_codec* codec = i2c_get_clientdata(client); 791 i2c_detach_client(client); 792 kfree(codec->reg_cache); 793 kfree(client); 794 return 0; 795 } 796 797 static int wm8731_i2c_attach(struct i2c_adapter *adap) 798 { 799 return i2c_probe(adap, &addr_data, wm8731_codec_probe); 800 } 801 802 /* corgi i2c codec control layer */ 803 static struct i2c_driver wm8731_i2c_driver = { 804 .driver = { 805 .name = "WM8731 I2C Codec", 806 .owner = THIS_MODULE, 807 }, 808 .id = I2C_DRIVERID_WM8731, 809 .attach_adapter = wm8731_i2c_attach, 810 .detach_client = wm8731_i2c_detach, 811 .command = NULL, 812 }; 813 814 static struct i2c_client client_template = { 815 .name = "WM8731", 816 .driver = &wm8731_i2c_driver, 817 }; 818 #endif 819 820 static int wm8731_probe(struct platform_device *pdev) 821 { 822 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 823 struct wm8731_setup_data *setup; 824 struct snd_soc_codec *codec; 825 int ret = 0; 826 827 info("WM8731 Audio Codec %s", WM8731_VERSION); 828 829 setup = socdev->codec_data; 830 codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); 831 if (codec == NULL) 832 return -ENOMEM; 833 834 socdev->codec = codec; 835 mutex_init(&codec->mutex); 836 INIT_LIST_HEAD(&codec->dapm_widgets); 837 INIT_LIST_HEAD(&codec->dapm_paths); 838 839 wm8731_socdev = socdev; 840 #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) 841 if (setup->i2c_address) { 842 normal_i2c[0] = setup->i2c_address; 843 codec->hw_write = (hw_write_t)i2c_master_send; 844 ret = i2c_add_driver(&wm8731_i2c_driver); 845 if (ret != 0) 846 printk(KERN_ERR "can't add i2c driver"); 847 } 848 #else 849 /* Add other interfaces here */ 850 #endif 851 return ret; 852 } 853 854 /* power down chip */ 855 static int wm8731_remove(struct platform_device *pdev) 856 { 857 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 858 struct snd_soc_codec *codec = socdev->codec; 859 860 if (codec->control_data) 861 wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3cold); 862 863 snd_soc_free_pcms(socdev); 864 snd_soc_dapm_free(socdev); 865 #if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) 866 i2c_del_driver(&wm8731_i2c_driver); 867 #endif 868 kfree(codec); 869 870 return 0; 871 } 872 873 struct snd_soc_codec_device soc_codec_dev_wm8731 = { 874 .probe = wm8731_probe, 875 .remove = wm8731_remove, 876 .suspend = wm8731_suspend, 877 .resume = wm8731_resume, 878 }; 879 880 EXPORT_SYMBOL_GPL(soc_codec_dev_wm8731); 881 882 MODULE_DESCRIPTION("ASoC WM8731 driver"); 883 MODULE_AUTHOR("Richard Purdie"); 884 MODULE_LICENSE("GPL"); 885