wm8731.c 21 KB

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