wm8993.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206
  1. /*
  2. * wm8993.c -- WM8993 ALSA SoC audio driver
  3. *
  4. * Copyright 2009 Wolfson Microelectronics plc
  5. *
  6. * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/moduleparam.h>
  14. #include <linux/init.h>
  15. #include <linux/delay.h>
  16. #include <linux/pm.h>
  17. #include <linux/i2c.h>
  18. #include <linux/spi/spi.h>
  19. #include <sound/core.h>
  20. #include <sound/pcm.h>
  21. #include <sound/pcm_params.h>
  22. #include <sound/tlv.h>
  23. #include <sound/soc.h>
  24. #include <sound/soc-dapm.h>
  25. #include <sound/initval.h>
  26. #include <sound/wm8993.h>
  27. #include "wm8993.h"
  28. static u16 wm8993_reg_defaults[WM8993_REGISTER_COUNT] = {
  29. 0x8993, /* R0 - Software Reset */
  30. 0x0000, /* R1 - Power Management (1) */
  31. 0x6000, /* R2 - Power Management (2) */
  32. 0x0000, /* R3 - Power Management (3) */
  33. 0x4050, /* R4 - Audio Interface (1) */
  34. 0x4000, /* R5 - Audio Interface (2) */
  35. 0x01C8, /* R6 - Clocking 1 */
  36. 0x0000, /* R7 - Clocking 2 */
  37. 0x0000, /* R8 - Audio Interface (3) */
  38. 0x0040, /* R9 - Audio Interface (4) */
  39. 0x0004, /* R10 - DAC CTRL */
  40. 0x00C0, /* R11 - Left DAC Digital Volume */
  41. 0x00C0, /* R12 - Right DAC Digital Volume */
  42. 0x0000, /* R13 - Digital Side Tone */
  43. 0x0300, /* R14 - ADC CTRL */
  44. 0x00C0, /* R15 - Left ADC Digital Volume */
  45. 0x00C0, /* R16 - Right ADC Digital Volume */
  46. 0x0000, /* R17 */
  47. 0x0000, /* R18 - GPIO CTRL 1 */
  48. 0x0010, /* R19 - GPIO1 */
  49. 0x0000, /* R20 - IRQ_DEBOUNCE */
  50. 0x0000, /* R21 */
  51. 0x8000, /* R22 - GPIOCTRL 2 */
  52. 0x0800, /* R23 - GPIO_POL */
  53. 0x008B, /* R24 - Left Line Input 1&2 Volume */
  54. 0x008B, /* R25 - Left Line Input 3&4 Volume */
  55. 0x008B, /* R26 - Right Line Input 1&2 Volume */
  56. 0x008B, /* R27 - Right Line Input 3&4 Volume */
  57. 0x006D, /* R28 - Left Output Volume */
  58. 0x006D, /* R29 - Right Output Volume */
  59. 0x0066, /* R30 - Line Outputs Volume */
  60. 0x0020, /* R31 - HPOUT2 Volume */
  61. 0x0079, /* R32 - Left OPGA Volume */
  62. 0x0079, /* R33 - Right OPGA Volume */
  63. 0x0003, /* R34 - SPKMIXL Attenuation */
  64. 0x0003, /* R35 - SPKMIXR Attenuation */
  65. 0x0011, /* R36 - SPKOUT Mixers */
  66. 0x0100, /* R37 - SPKOUT Boost */
  67. 0x0079, /* R38 - Speaker Volume Left */
  68. 0x0079, /* R39 - Speaker Volume Right */
  69. 0x0000, /* R40 - Input Mixer2 */
  70. 0x0000, /* R41 - Input Mixer3 */
  71. 0x0000, /* R42 - Input Mixer4 */
  72. 0x0000, /* R43 - Input Mixer5 */
  73. 0x0000, /* R44 - Input Mixer6 */
  74. 0x0000, /* R45 - Output Mixer1 */
  75. 0x0000, /* R46 - Output Mixer2 */
  76. 0x0000, /* R47 - Output Mixer3 */
  77. 0x0000, /* R48 - Output Mixer4 */
  78. 0x0000, /* R49 - Output Mixer5 */
  79. 0x0000, /* R50 - Output Mixer6 */
  80. 0x0000, /* R51 - HPOUT2 Mixer */
  81. 0x0000, /* R52 - Line Mixer1 */
  82. 0x0000, /* R53 - Line Mixer2 */
  83. 0x0000, /* R54 - Speaker Mixer */
  84. 0x0000, /* R55 - Additional Control */
  85. 0x0000, /* R56 - AntiPOP1 */
  86. 0x0000, /* R57 - AntiPOP2 */
  87. 0x0000, /* R58 - MICBIAS */
  88. 0x0000, /* R59 */
  89. 0x0000, /* R60 - FLL Control 1 */
  90. 0x0000, /* R61 - FLL Control 2 */
  91. 0x0000, /* R62 - FLL Control 3 */
  92. 0x2EE0, /* R63 - FLL Control 4 */
  93. 0x0002, /* R64 - FLL Control 5 */
  94. 0x2287, /* R65 - Clocking 3 */
  95. 0x025F, /* R66 - Clocking 4 */
  96. 0x0000, /* R67 - MW Slave Control */
  97. 0x0000, /* R68 */
  98. 0x0002, /* R69 - Bus Control 1 */
  99. 0x0000, /* R70 - Write Sequencer 0 */
  100. 0x0000, /* R71 - Write Sequencer 1 */
  101. 0x0000, /* R72 - Write Sequencer 2 */
  102. 0x0000, /* R73 - Write Sequencer 3 */
  103. 0x0000, /* R74 - Write Sequencer 4 */
  104. 0x0000, /* R75 - Write Sequencer 5 */
  105. 0x1F25, /* R76 - Charge Pump 1 */
  106. 0x0000, /* R77 */
  107. 0x0000, /* R78 */
  108. 0x0000, /* R79 */
  109. 0x0000, /* R80 */
  110. 0x0000, /* R81 - Class W 0 */
  111. 0x0000, /* R82 */
  112. 0x0000, /* R83 */
  113. 0x0000, /* R84 - DC Servo 0 */
  114. 0x054A, /* R85 - DC Servo 1 */
  115. 0x0000, /* R86 */
  116. 0x0000, /* R87 - DC Servo 3 */
  117. 0x0000, /* R88 - DC Servo Readback 0 */
  118. 0x0000, /* R89 - DC Servo Readback 1 */
  119. 0x0000, /* R90 - DC Servo Readback 2 */
  120. 0x0000, /* R91 */
  121. 0x0000, /* R92 */
  122. 0x0000, /* R93 */
  123. 0x0000, /* R94 */
  124. 0x0000, /* R95 */
  125. 0x0100, /* R96 - Analogue HP 0 */
  126. 0x0000, /* R97 */
  127. 0x0000, /* R98 - EQ1 */
  128. 0x000C, /* R99 - EQ2 */
  129. 0x000C, /* R100 - EQ3 */
  130. 0x000C, /* R101 - EQ4 */
  131. 0x000C, /* R102 - EQ5 */
  132. 0x000C, /* R103 - EQ6 */
  133. 0x0FCA, /* R104 - EQ7 */
  134. 0x0400, /* R105 - EQ8 */
  135. 0x00D8, /* R106 - EQ9 */
  136. 0x1EB5, /* R107 - EQ10 */
  137. 0xF145, /* R108 - EQ11 */
  138. 0x0B75, /* R109 - EQ12 */
  139. 0x01C5, /* R110 - EQ13 */
  140. 0x1C58, /* R111 - EQ14 */
  141. 0xF373, /* R112 - EQ15 */
  142. 0x0A54, /* R113 - EQ16 */
  143. 0x0558, /* R114 - EQ17 */
  144. 0x168E, /* R115 - EQ18 */
  145. 0xF829, /* R116 - EQ19 */
  146. 0x07AD, /* R117 - EQ20 */
  147. 0x1103, /* R118 - EQ21 */
  148. 0x0564, /* R119 - EQ22 */
  149. 0x0559, /* R120 - EQ23 */
  150. 0x4000, /* R121 - EQ24 */
  151. 0x0000, /* R122 - Digital Pulls */
  152. 0x0F08, /* R123 - DRC Control 1 */
  153. 0x0000, /* R124 - DRC Control 2 */
  154. 0x0080, /* R125 - DRC Control 3 */
  155. 0x0000, /* R126 - DRC Control 4 */
  156. };
  157. static struct {
  158. int ratio;
  159. int clk_sys_rate;
  160. } clk_sys_rates[] = {
  161. { 64, 0 },
  162. { 128, 1 },
  163. { 192, 2 },
  164. { 256, 3 },
  165. { 384, 4 },
  166. { 512, 5 },
  167. { 768, 6 },
  168. { 1024, 7 },
  169. { 1408, 8 },
  170. { 1536, 9 },
  171. };
  172. static struct {
  173. int rate;
  174. int sample_rate;
  175. } sample_rates[] = {
  176. { 8000, 0 },
  177. { 11025, 1 },
  178. { 12000, 1 },
  179. { 16000, 2 },
  180. { 22050, 3 },
  181. { 24000, 3 },
  182. { 32000, 4 },
  183. { 44100, 5 },
  184. { 48000, 5 },
  185. };
  186. static struct {
  187. int div; /* *10 due to .5s */
  188. int bclk_div;
  189. } bclk_divs[] = {
  190. { 10, 0 },
  191. { 15, 1 },
  192. { 20, 2 },
  193. { 30, 3 },
  194. { 40, 4 },
  195. { 55, 5 },
  196. { 60, 6 },
  197. { 80, 7 },
  198. { 110, 8 },
  199. { 120, 9 },
  200. { 160, 10 },
  201. { 220, 11 },
  202. { 240, 12 },
  203. { 320, 13 },
  204. { 440, 14 },
  205. { 480, 15 },
  206. };
  207. struct wm8993_priv {
  208. u16 reg_cache[WM8993_REGISTER_COUNT];
  209. struct wm8993_platform_data pdata;
  210. struct snd_soc_codec codec;
  211. int master;
  212. int sysclk_source;
  213. unsigned int mclk_rate;
  214. unsigned int sysclk_rate;
  215. unsigned int fs;
  216. unsigned int bclk;
  217. int class_w_users;
  218. unsigned int fll_fref;
  219. unsigned int fll_fout;
  220. };
  221. static unsigned int wm8993_read_hw(struct snd_soc_codec *codec, u8 reg)
  222. {
  223. struct i2c_msg xfer[2];
  224. u16 data;
  225. int ret;
  226. struct i2c_client *i2c = codec->control_data;
  227. /* Write register */
  228. xfer[0].addr = i2c->addr;
  229. xfer[0].flags = 0;
  230. xfer[0].len = 1;
  231. xfer[0].buf = &reg;
  232. /* Read data */
  233. xfer[1].addr = i2c->addr;
  234. xfer[1].flags = I2C_M_RD;
  235. xfer[1].len = 2;
  236. xfer[1].buf = (u8 *)&data;
  237. ret = i2c_transfer(i2c->adapter, xfer, 2);
  238. if (ret != 2) {
  239. dev_err(codec->dev, "Failed to read 0x%x: %d\n", reg, ret);
  240. return 0;
  241. }
  242. return (data >> 8) | ((data & 0xff) << 8);
  243. }
  244. static int wm8993_volatile(unsigned int reg)
  245. {
  246. switch (reg) {
  247. case WM8993_SOFTWARE_RESET:
  248. case WM8993_DC_SERVO_0:
  249. case WM8993_DC_SERVO_READBACK_0:
  250. case WM8993_DC_SERVO_READBACK_1:
  251. case WM8993_DC_SERVO_READBACK_2:
  252. return 1;
  253. default:
  254. return 0;
  255. }
  256. }
  257. static unsigned int wm8993_read(struct snd_soc_codec *codec,
  258. unsigned int reg)
  259. {
  260. u16 *reg_cache = codec->reg_cache;
  261. BUG_ON(reg > WM8993_MAX_REGISTER);
  262. if (wm8993_volatile(reg))
  263. return wm8993_read_hw(codec, reg);
  264. else
  265. return reg_cache[reg];
  266. }
  267. static int wm8993_write(struct snd_soc_codec *codec, unsigned int reg,
  268. unsigned int value)
  269. {
  270. u16 *reg_cache = codec->reg_cache;
  271. u8 data[3];
  272. int ret;
  273. BUG_ON(reg > WM8993_MAX_REGISTER);
  274. /* data is
  275. * D15..D9 WM8993 register offset
  276. * D8...D0 register data
  277. */
  278. data[0] = reg;
  279. data[1] = value >> 8;
  280. data[2] = value & 0x00ff;
  281. if (!wm8993_volatile(reg))
  282. reg_cache[reg] = value;
  283. ret = codec->hw_write(codec->control_data, data, 3);
  284. if (ret == 3)
  285. return 0;
  286. if (ret < 0)
  287. return ret;
  288. return -EIO;
  289. }
  290. struct _fll_div {
  291. u16 fll_fratio;
  292. u16 fll_outdiv;
  293. u16 fll_clk_ref_div;
  294. u16 n;
  295. u16 k;
  296. };
  297. /* The size in bits of the FLL divide multiplied by 10
  298. * to allow rounding later */
  299. #define FIXED_FLL_SIZE ((1 << 16) * 10)
  300. static struct {
  301. unsigned int min;
  302. unsigned int max;
  303. u16 fll_fratio;
  304. int ratio;
  305. } fll_fratios[] = {
  306. { 0, 64000, 4, 16 },
  307. { 64000, 128000, 3, 8 },
  308. { 128000, 256000, 2, 4 },
  309. { 256000, 1000000, 1, 2 },
  310. { 1000000, 13500000, 0, 1 },
  311. };
  312. static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
  313. unsigned int Fout)
  314. {
  315. u64 Kpart;
  316. unsigned int K, Ndiv, Nmod, target;
  317. unsigned int div;
  318. int i;
  319. /* Fref must be <=13.5MHz */
  320. div = 1;
  321. fll_div->fll_clk_ref_div = 0;
  322. while ((Fref / div) > 13500000) {
  323. div *= 2;
  324. fll_div->fll_clk_ref_div++;
  325. if (div > 8) {
  326. pr_err("Can't scale %dMHz input down to <=13.5MHz\n",
  327. Fref);
  328. return -EINVAL;
  329. }
  330. }
  331. pr_debug("Fref=%u Fout=%u\n", Fref, Fout);
  332. /* Apply the division for our remaining calculations */
  333. Fref /= div;
  334. /* Fvco should be 90-100MHz; don't check the upper bound */
  335. div = 0;
  336. target = Fout * 2;
  337. while (target < 90000000) {
  338. div++;
  339. target *= 2;
  340. if (div > 7) {
  341. pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n",
  342. Fout);
  343. return -EINVAL;
  344. }
  345. }
  346. fll_div->fll_outdiv = div;
  347. pr_debug("Fvco=%dHz\n", target);
  348. /* Find an appropraite FLL_FRATIO and factor it out of the target */
  349. for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
  350. if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
  351. fll_div->fll_fratio = fll_fratios[i].fll_fratio;
  352. target /= fll_fratios[i].ratio;
  353. break;
  354. }
  355. }
  356. if (i == ARRAY_SIZE(fll_fratios)) {
  357. pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref);
  358. return -EINVAL;
  359. }
  360. /* Now, calculate N.K */
  361. Ndiv = target / Fref;
  362. fll_div->n = Ndiv;
  363. Nmod = target % Fref;
  364. pr_debug("Nmod=%d\n", Nmod);
  365. /* Calculate fractional part - scale up so we can round. */
  366. Kpart = FIXED_FLL_SIZE * (long long)Nmod;
  367. do_div(Kpart, Fref);
  368. K = Kpart & 0xFFFFFFFF;
  369. if ((K % 10) >= 5)
  370. K += 5;
  371. /* Move down to proper range now rounding is done */
  372. fll_div->k = K / 10;
  373. pr_debug("N=%x K=%x FLL_FRATIO=%x FLL_OUTDIV=%x FLL_CLK_REF_DIV=%x\n",
  374. fll_div->n, fll_div->k,
  375. fll_div->fll_fratio, fll_div->fll_outdiv,
  376. fll_div->fll_clk_ref_div);
  377. return 0;
  378. }
  379. static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id,
  380. unsigned int Fref, unsigned int Fout)
  381. {
  382. struct snd_soc_codec *codec = dai->codec;
  383. struct wm8993_priv *wm8993 = codec->private_data;
  384. u16 reg1, reg4, reg5;
  385. struct _fll_div fll_div;
  386. int ret;
  387. /* Any change? */
  388. if (Fref == wm8993->fll_fref && Fout == wm8993->fll_fout)
  389. return 0;
  390. /* Disable the FLL */
  391. if (Fout == 0) {
  392. dev_dbg(codec->dev, "FLL disabled\n");
  393. wm8993->fll_fref = 0;
  394. wm8993->fll_fout = 0;
  395. reg1 = wm8993_read(codec, WM8993_FLL_CONTROL_1);
  396. reg1 &= ~WM8993_FLL_ENA;
  397. wm8993_write(codec, WM8993_FLL_CONTROL_1, reg1);
  398. return 0;
  399. }
  400. ret = fll_factors(&fll_div, Fref, Fout);
  401. if (ret != 0)
  402. return ret;
  403. reg5 = wm8993_read(codec, WM8993_FLL_CONTROL_5);
  404. reg5 &= ~WM8993_FLL_CLK_SRC_MASK;
  405. switch (fll_id) {
  406. case WM8993_FLL_MCLK:
  407. break;
  408. case WM8993_FLL_LRCLK:
  409. reg5 |= 1;
  410. break;
  411. case WM8993_FLL_BCLK:
  412. reg5 |= 2;
  413. break;
  414. default:
  415. dev_err(codec->dev, "Unknown FLL ID %d\n", fll_id);
  416. return -EINVAL;
  417. }
  418. /* Any FLL configuration change requires that the FLL be
  419. * disabled first. */
  420. reg1 = wm8993_read(codec, WM8993_FLL_CONTROL_1);
  421. reg1 &= ~WM8993_FLL_ENA;
  422. wm8993_write(codec, WM8993_FLL_CONTROL_1, reg1);
  423. /* Apply the configuration */
  424. if (fll_div.k)
  425. reg1 |= WM8993_FLL_FRAC_MASK;
  426. else
  427. reg1 &= ~WM8993_FLL_FRAC_MASK;
  428. wm8993_write(codec, WM8993_FLL_CONTROL_1, reg1);
  429. wm8993_write(codec, WM8993_FLL_CONTROL_2,
  430. (fll_div.fll_outdiv << WM8993_FLL_OUTDIV_SHIFT) |
  431. (fll_div.fll_fratio << WM8993_FLL_FRATIO_SHIFT));
  432. wm8993_write(codec, WM8993_FLL_CONTROL_3, fll_div.k);
  433. reg4 = wm8993_read(codec, WM8993_FLL_CONTROL_4);
  434. reg4 &= ~WM8993_FLL_N_MASK;
  435. reg4 |= fll_div.n << WM8993_FLL_N_SHIFT;
  436. wm8993_write(codec, WM8993_FLL_CONTROL_4, reg4);
  437. reg5 &= ~WM8993_FLL_CLK_REF_DIV_MASK;
  438. reg5 |= fll_div.fll_clk_ref_div << WM8993_FLL_CLK_REF_DIV_SHIFT;
  439. wm8993_write(codec, WM8993_FLL_CONTROL_5, reg5);
  440. /* Enable the FLL */
  441. wm8993_write(codec, WM8993_FLL_CONTROL_1, reg1 | WM8993_FLL_ENA);
  442. dev_dbg(codec->dev, "FLL enabled at %dHz->%dHz\n", Fref, Fout);
  443. wm8993->fll_fref = Fref;
  444. wm8993->fll_fout = Fout;
  445. return 0;
  446. }
  447. static int configure_clock(struct snd_soc_codec *codec)
  448. {
  449. struct wm8993_priv *wm8993 = codec->private_data;
  450. unsigned int reg;
  451. /* This should be done on init() for bypass paths */
  452. switch (wm8993->sysclk_source) {
  453. case WM8993_SYSCLK_MCLK:
  454. dev_dbg(codec->dev, "Using %dHz MCLK\n", wm8993->mclk_rate);
  455. reg = wm8993_read(codec, WM8993_CLOCKING_2);
  456. reg &= ~WM8993_SYSCLK_SRC;
  457. if (wm8993->mclk_rate > 13500000) {
  458. reg |= WM8993_MCLK_DIV;
  459. wm8993->sysclk_rate = wm8993->mclk_rate / 2;
  460. } else {
  461. reg &= ~WM8993_MCLK_DIV;
  462. wm8993->sysclk_rate = wm8993->mclk_rate;
  463. }
  464. reg &= ~WM8993_MCLK_DIV;
  465. reg &= ~(WM8993_MCLK_DIV | WM8993_SYSCLK_SRC);
  466. wm8993_write(codec, WM8993_CLOCKING_2, reg);
  467. break;
  468. case WM8993_SYSCLK_FLL:
  469. dev_dbg(codec->dev, "Using %dHz FLL clock\n",
  470. wm8993->fll_fout);
  471. reg = wm8993_read(codec, WM8993_CLOCKING_2);
  472. reg |= WM8993_SYSCLK_SRC;
  473. if (wm8993->fll_fout > 13500000) {
  474. reg |= WM8993_MCLK_DIV;
  475. wm8993->sysclk_rate = wm8993->fll_fout / 2;
  476. } else {
  477. reg &= ~WM8993_MCLK_DIV;
  478. wm8993->sysclk_rate = wm8993->fll_fout;
  479. }
  480. wm8993_write(codec, WM8993_CLOCKING_2, reg);
  481. break;
  482. default:
  483. dev_err(codec->dev, "System clock not configured\n");
  484. return -EINVAL;
  485. }
  486. dev_dbg(codec->dev, "CLK_SYS is %dHz\n", wm8993->sysclk_rate);
  487. return 0;
  488. }
  489. static void wait_for_dc_servo(struct snd_soc_codec *codec, int mask)
  490. {
  491. unsigned int reg;
  492. int count = 0;
  493. dev_dbg(codec->dev, "Waiting for DC servo...\n");
  494. do {
  495. count++;
  496. msleep(1);
  497. reg = wm8993_read(codec, WM8993_DC_SERVO_READBACK_0);
  498. dev_dbg(codec->dev, "DC servo status: %x\n", reg);
  499. } while ((reg & WM8993_DCS_CAL_COMPLETE_MASK)
  500. != WM8993_DCS_CAL_COMPLETE_MASK && count < 1000);
  501. if ((reg & WM8993_DCS_CAL_COMPLETE_MASK)
  502. != WM8993_DCS_CAL_COMPLETE_MASK)
  503. dev_err(codec->dev, "Timed out waiting for DC Servo\n");
  504. }
  505. static const DECLARE_TLV_DB_SCALE(inpga_tlv, -1650, 150, 0);
  506. static const DECLARE_TLV_DB_SCALE(inmix_sw_tlv, 0, 3000, 0);
  507. static const DECLARE_TLV_DB_SCALE(inmix_tlv, -1500, 300, 1);
  508. static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -3600, 300, 0);
  509. static const DECLARE_TLV_DB_SCALE(drc_comp_threash, -4500, 75, 0);
  510. static const DECLARE_TLV_DB_SCALE(drc_comp_amp, -2250, 75, 0);
  511. static const DECLARE_TLV_DB_SCALE(drc_min_tlv, -1800, 600, 0);
  512. static const unsigned int drc_max_tlv[] = {
  513. TLV_DB_RANGE_HEAD(4),
  514. 0, 2, TLV_DB_SCALE_ITEM(1200, 600, 0),
  515. 3, 3, TLV_DB_SCALE_ITEM(3600, 0, 0),
  516. };
  517. static const DECLARE_TLV_DB_SCALE(drc_qr_tlv, 1200, 600, 0);
  518. static const DECLARE_TLV_DB_SCALE(drc_startup_tlv, -1800, 300, 0);
  519. static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
  520. static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1);
  521. static const DECLARE_TLV_DB_SCALE(dac_boost_tlv, 0, 600, 0);
  522. static const DECLARE_TLV_DB_SCALE(earpiece_tlv, -600, 600, 0);
  523. static const DECLARE_TLV_DB_SCALE(outmix_tlv, -2100, 300, 0);
  524. static const DECLARE_TLV_DB_SCALE(spkmix_tlv, -300, 300, 0);
  525. static const DECLARE_TLV_DB_SCALE(spkmixout_tlv, -1800, 600, 1);
  526. static const DECLARE_TLV_DB_SCALE(outpga_tlv, -5700, 100, 0);
  527. static const unsigned int spkboost_tlv[] = {
  528. TLV_DB_RANGE_HEAD(7),
  529. 0, 6, TLV_DB_SCALE_ITEM(0, 150, 0),
  530. 7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0),
  531. };
  532. static const DECLARE_TLV_DB_SCALE(line_tlv, -600, 600, 0);
  533. static const char *speaker_ref_text[] = {
  534. "SPKVDD/2",
  535. "VMID",
  536. };
  537. static const struct soc_enum speaker_ref =
  538. SOC_ENUM_SINGLE(WM8993_SPEAKER_MIXER, 8, 2, speaker_ref_text);
  539. static const char *speaker_mode_text[] = {
  540. "Class D",
  541. "Class AB",
  542. };
  543. static const struct soc_enum speaker_mode =
  544. SOC_ENUM_SINGLE(WM8993_SPKMIXR_ATTENUATION, 8, 2, speaker_mode_text);
  545. static const char *dac_deemph_text[] = {
  546. "None",
  547. "32kHz",
  548. "44.1kHz",
  549. "48kHz",
  550. };
  551. static const struct soc_enum dac_deemph =
  552. SOC_ENUM_SINGLE(WM8993_DAC_CTRL, 4, 4, dac_deemph_text);
  553. static const char *adc_hpf_text[] = {
  554. "Hi-Fi",
  555. "Voice 1",
  556. "Voice 2",
  557. "Voice 3",
  558. };
  559. static const struct soc_enum adc_hpf =
  560. SOC_ENUM_SINGLE(WM8993_ADC_CTRL, 5, 4, adc_hpf_text);
  561. static const char *drc_path_text[] = {
  562. "ADC",
  563. "DAC"
  564. };
  565. static const struct soc_enum drc_path =
  566. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_1, 14, 2, drc_path_text);
  567. static const char *drc_r0_text[] = {
  568. "1",
  569. "1/2",
  570. "1/4",
  571. "1/8",
  572. "1/16",
  573. "0",
  574. };
  575. static const struct soc_enum drc_r0 =
  576. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_3, 8, 6, drc_r0_text);
  577. static const char *drc_r1_text[] = {
  578. "1",
  579. "1/2",
  580. "1/4",
  581. "1/8",
  582. "0",
  583. };
  584. static const struct soc_enum drc_r1 =
  585. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_4, 13, 5, drc_r1_text);
  586. static const char *drc_attack_text[] = {
  587. "Reserved",
  588. "181us",
  589. "363us",
  590. "726us",
  591. "1.45ms",
  592. "2.9ms",
  593. "5.8ms",
  594. "11.6ms",
  595. "23.2ms",
  596. "46.4ms",
  597. "92.8ms",
  598. "185.6ms",
  599. };
  600. static const struct soc_enum drc_attack =
  601. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_2, 12, 12, drc_attack_text);
  602. static const char *drc_decay_text[] = {
  603. "186ms",
  604. "372ms",
  605. "743ms",
  606. "1.49s",
  607. "2.97ms",
  608. "5.94ms",
  609. "11.89ms",
  610. "23.78ms",
  611. "47.56ms",
  612. };
  613. static const struct soc_enum drc_decay =
  614. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_2, 8, 9, drc_decay_text);
  615. static const char *drc_ff_text[] = {
  616. "5 samples",
  617. "9 samples",
  618. };
  619. static const struct soc_enum drc_ff =
  620. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_3, 7, 2, drc_ff_text);
  621. static const char *drc_qr_rate_text[] = {
  622. "0.725ms",
  623. "1.45ms",
  624. "5.8ms",
  625. };
  626. static const struct soc_enum drc_qr_rate =
  627. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_3, 0, 3, drc_qr_rate_text);
  628. static const char *drc_smooth_text[] = {
  629. "Low",
  630. "Medium",
  631. "High",
  632. };
  633. static const struct soc_enum drc_smooth =
  634. SOC_ENUM_SINGLE(WM8993_DRC_CONTROL_1, 4, 3, drc_smooth_text);
  635. /*
  636. * Update the DC servo calibration on gain changes
  637. */
  638. static int wm8993_put_dc_servo(struct snd_kcontrol *kcontrol,
  639. struct snd_ctl_elem_value *ucontrol)
  640. {
  641. struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
  642. int ret;
  643. ret = snd_soc_put_volsw_2r(kcontrol, ucontrol);
  644. /* Only need to do this if the outputs are active */
  645. if (wm8993_read(codec, WM8993_POWER_MANAGEMENT_1)
  646. & (WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA))
  647. snd_soc_update_bits(codec,
  648. WM8993_DC_SERVO_0,
  649. WM8993_DCS_TRIG_SINGLE_0 |
  650. WM8993_DCS_TRIG_SINGLE_1,
  651. WM8993_DCS_TRIG_SINGLE_0 |
  652. WM8993_DCS_TRIG_SINGLE_1);
  653. return ret;
  654. }
  655. static const struct snd_kcontrol_new wm8993_snd_controls[] = {
  656. SOC_SINGLE_TLV("IN1L Volume", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 0, 31, 0,
  657. inpga_tlv),
  658. SOC_SINGLE("IN1L Switch", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 7, 1, 1),
  659. SOC_SINGLE("IN1L ZC Switch", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 7, 1, 0),
  660. SOC_SINGLE_TLV("IN1R Volume", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 0, 31, 0,
  661. inpga_tlv),
  662. SOC_SINGLE("IN1R Switch", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 7, 1, 1),
  663. SOC_SINGLE("IN1R ZC Switch", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 7, 1, 0),
  664. SOC_SINGLE_TLV("IN2L Volume", WM8993_LEFT_LINE_INPUT_3_4_VOLUME, 0, 31, 0,
  665. inpga_tlv),
  666. SOC_SINGLE("IN2L Switch", WM8993_LEFT_LINE_INPUT_3_4_VOLUME, 7, 1, 1),
  667. SOC_SINGLE("IN2L ZC Switch", WM8993_LEFT_LINE_INPUT_3_4_VOLUME, 7, 1, 0),
  668. SOC_SINGLE_TLV("IN2R Volume", WM8993_RIGHT_LINE_INPUT_3_4_VOLUME, 0, 31, 0,
  669. inpga_tlv),
  670. SOC_SINGLE("IN2R Switch", WM8993_RIGHT_LINE_INPUT_3_4_VOLUME, 7, 1, 1),
  671. SOC_SINGLE("IN2R ZC Switch", WM8993_RIGHT_LINE_INPUT_3_4_VOLUME, 7, 1, 0),
  672. SOC_SINGLE_TLV("MIXINL IN2L Volume", WM8993_INPUT_MIXER3, 7, 1, 0,
  673. inmix_sw_tlv),
  674. SOC_SINGLE_TLV("MIXINL IN1L Volume", WM8993_INPUT_MIXER3, 4, 1, 0,
  675. inmix_sw_tlv),
  676. SOC_SINGLE_TLV("MIXINL Output Record Volume", WM8993_INPUT_MIXER3, 0, 7, 0,
  677. inmix_tlv),
  678. SOC_SINGLE_TLV("MIXINL IN1LP Volume", WM8993_INPUT_MIXER5, 6, 7, 0, inmix_tlv),
  679. SOC_SINGLE_TLV("MIXINL Direct Voice Volume", WM8993_INPUT_MIXER5, 0, 6, 0,
  680. inmix_tlv),
  681. SOC_SINGLE_TLV("MIXINR IN2R Volume", WM8993_INPUT_MIXER4, 7, 1, 0,
  682. inmix_sw_tlv),
  683. SOC_SINGLE_TLV("MIXINR IN1R Volume", WM8993_INPUT_MIXER4, 4, 1, 0,
  684. inmix_sw_tlv),
  685. SOC_SINGLE_TLV("MIXINR Output Record Volume", WM8993_INPUT_MIXER4, 0, 7, 0,
  686. inmix_tlv),
  687. SOC_SINGLE_TLV("MIXINR IN1RP Volume", WM8993_INPUT_MIXER6, 6, 7, 0, inmix_tlv),
  688. SOC_SINGLE_TLV("MIXINR Direct Voice Volume", WM8993_INPUT_MIXER6, 0, 6, 0,
  689. inmix_tlv),
  690. SOC_DOUBLE_TLV("Digital Sidetone Volume", WM8993_DIGITAL_SIDE_TONE,
  691. 5, 9, 12, 0, sidetone_tlv),
  692. SOC_SINGLE("DRC Switch", WM8993_DRC_CONTROL_1, 15, 1, 0),
  693. SOC_ENUM("DRC Path", drc_path),
  694. SOC_SINGLE_TLV("DRC Compressor Threashold Volume", WM8993_DRC_CONTROL_2,
  695. 2, 60, 1, drc_comp_threash),
  696. SOC_SINGLE_TLV("DRC Compressor Amplitude Volume", WM8993_DRC_CONTROL_3,
  697. 11, 30, 1, drc_comp_amp),
  698. SOC_ENUM("DRC R0", drc_r0),
  699. SOC_ENUM("DRC R1", drc_r1),
  700. SOC_SINGLE_TLV("DRC Minimum Volume", WM8993_DRC_CONTROL_1, 2, 3, 1,
  701. drc_min_tlv),
  702. SOC_SINGLE_TLV("DRC Maximum Volume", WM8993_DRC_CONTROL_1, 0, 3, 0,
  703. drc_max_tlv),
  704. SOC_ENUM("DRC Attack Rate", drc_attack),
  705. SOC_ENUM("DRC Decay Rate", drc_decay),
  706. SOC_ENUM("DRC FF Delay", drc_ff),
  707. SOC_SINGLE("DRC Anti-clip Switch", WM8993_DRC_CONTROL_1, 9, 1, 0),
  708. SOC_SINGLE("DRC Quick Release Switch", WM8993_DRC_CONTROL_1, 10, 1, 0),
  709. SOC_SINGLE_TLV("DRC Quick Release Volume", WM8993_DRC_CONTROL_3, 2, 3, 0,
  710. drc_qr_tlv),
  711. SOC_ENUM("DRC Quick Release Rate", drc_qr_rate),
  712. SOC_SINGLE("DRC Smoothing Switch", WM8993_DRC_CONTROL_1, 11, 1, 0),
  713. SOC_SINGLE("DRC Smoothing Hysteresis Switch", WM8993_DRC_CONTROL_1, 8, 1, 0),
  714. SOC_ENUM("DRC Smoothing Hysteresis Threashold", drc_smooth),
  715. SOC_SINGLE_TLV("DRC Startup Volume", WM8993_DRC_CONTROL_4, 8, 18, 0,
  716. drc_startup_tlv),
  717. SOC_SINGLE("EQ Switch", WM8993_EQ1, 0, 1, 0),
  718. SOC_DOUBLE_R_TLV("Capture Volume", WM8993_LEFT_ADC_DIGITAL_VOLUME,
  719. WM8993_RIGHT_ADC_DIGITAL_VOLUME, 1, 96, 0, digital_tlv),
  720. SOC_SINGLE("ADC High Pass Filter Switch", WM8993_ADC_CTRL, 8, 1, 0),
  721. SOC_ENUM("ADC High Pass Filter Mode", adc_hpf),
  722. SOC_DOUBLE_R_TLV("Playback Volume", WM8993_LEFT_DAC_DIGITAL_VOLUME,
  723. WM8993_RIGHT_DAC_DIGITAL_VOLUME, 1, 96, 0, digital_tlv),
  724. SOC_SINGLE_TLV("Playback Boost Volume", WM8993_AUDIO_INTERFACE_2, 10, 3, 0,
  725. dac_boost_tlv),
  726. SOC_ENUM("DAC Deemphasis", dac_deemph),
  727. SOC_SINGLE_TLV("Left Output Mixer IN2RN Volume", WM8993_OUTPUT_MIXER5, 6, 7, 1,
  728. outmix_tlv),
  729. SOC_SINGLE_TLV("Left Output Mixer IN2LN Volume", WM8993_OUTPUT_MIXER3, 6, 7, 1,
  730. outmix_tlv),
  731. SOC_SINGLE_TLV("Left Output Mixer IN2LP Volume", WM8993_OUTPUT_MIXER3, 9, 7, 1,
  732. outmix_tlv),
  733. SOC_SINGLE_TLV("Left Output Mixer IN1L Volume", WM8993_OUTPUT_MIXER3, 0, 7, 1,
  734. outmix_tlv),
  735. SOC_SINGLE_TLV("Left Output Mixer IN1R Volume", WM8993_OUTPUT_MIXER3, 3, 7, 1,
  736. outmix_tlv),
  737. SOC_SINGLE_TLV("Left Output Mixer Right Input Volume",
  738. WM8993_OUTPUT_MIXER5, 3, 7, 1, outmix_tlv),
  739. SOC_SINGLE_TLV("Left Output Mixer Left Input Volume",
  740. WM8993_OUTPUT_MIXER5, 0, 7, 1, outmix_tlv),
  741. SOC_SINGLE_TLV("Left Output Mixer DAC Volume", WM8993_OUTPUT_MIXER5, 9, 7, 1,
  742. outmix_tlv),
  743. SOC_SINGLE_TLV("Right Output Mixer IN2LN Volume",
  744. WM8993_OUTPUT_MIXER6, 6, 7, 1, outmix_tlv),
  745. SOC_SINGLE_TLV("Right Output Mixer IN2RN Volume",
  746. WM8993_OUTPUT_MIXER4, 6, 7, 1, outmix_tlv),
  747. SOC_SINGLE_TLV("Right Output Mixer IN1L Volume",
  748. WM8993_OUTPUT_MIXER4, 3, 7, 1, outmix_tlv),
  749. SOC_SINGLE_TLV("Right Output Mixer IN1R Volume",
  750. WM8993_OUTPUT_MIXER4, 0, 7, 1, outmix_tlv),
  751. SOC_SINGLE_TLV("Right Output Mixer IN2RP Volume",
  752. WM8993_OUTPUT_MIXER4, 9, 7, 1, outmix_tlv),
  753. SOC_SINGLE_TLV("Right Output Mixer Left Input Volume",
  754. WM8993_OUTPUT_MIXER6, 3, 7, 1, outmix_tlv),
  755. SOC_SINGLE_TLV("Right Output Mixer Right Input Volume",
  756. WM8993_OUTPUT_MIXER6, 6, 7, 1, outmix_tlv),
  757. SOC_SINGLE_TLV("Right Output Mixer DAC Volume",
  758. WM8993_OUTPUT_MIXER6, 9, 7, 1, outmix_tlv),
  759. SOC_DOUBLE_R_TLV("Output Volume", WM8993_LEFT_OPGA_VOLUME,
  760. WM8993_RIGHT_OPGA_VOLUME, 0, 63, 0, outpga_tlv),
  761. SOC_DOUBLE_R("Output Switch", WM8993_LEFT_OPGA_VOLUME,
  762. WM8993_RIGHT_OPGA_VOLUME, 6, 1, 0),
  763. SOC_DOUBLE_R("Output ZC Switch", WM8993_LEFT_OPGA_VOLUME,
  764. WM8993_RIGHT_OPGA_VOLUME, 7, 1, 0),
  765. SOC_SINGLE("Earpiece Switch", WM8993_HPOUT2_VOLUME, 5, 1, 1),
  766. SOC_SINGLE_TLV("Earpiece Volume", WM8993_HPOUT2_VOLUME, 4, 1, 1, earpiece_tlv),
  767. SOC_SINGLE_TLV("SPKL Input Volume", WM8993_SPKMIXL_ATTENUATION,
  768. 5, 1, 1, spkmix_tlv),
  769. SOC_SINGLE_TLV("SPKL IN1LP Volume", WM8993_SPKMIXL_ATTENUATION,
  770. 4, 1, 1, spkmix_tlv),
  771. SOC_SINGLE_TLV("SPKL Output Volume", WM8993_SPKMIXL_ATTENUATION,
  772. 3, 1, 1, spkmix_tlv),
  773. SOC_SINGLE_TLV("SPKL DAC Volume", WM8993_SPKMIXL_ATTENUATION,
  774. 2, 1, 1, spkmix_tlv),
  775. SOC_SINGLE_TLV("SPKR Input Volume", WM8993_SPKMIXR_ATTENUATION,
  776. 5, 1, 1, spkmix_tlv),
  777. SOC_SINGLE_TLV("SPKR IN1RP Volume", WM8993_SPKMIXR_ATTENUATION,
  778. 4, 1, 1, spkmix_tlv),
  779. SOC_SINGLE_TLV("SPKR Output Volume", WM8993_SPKMIXR_ATTENUATION,
  780. 3, 1, 1, spkmix_tlv),
  781. SOC_SINGLE_TLV("SPKR DAC Volume", WM8993_SPKMIXR_ATTENUATION,
  782. 2, 1, 1, spkmix_tlv),
  783. SOC_DOUBLE_R_TLV("Speaker Mixer Volume",
  784. WM8993_SPKMIXL_ATTENUATION, WM8993_SPKMIXR_ATTENUATION,
  785. 0, 3, 1, spkmixout_tlv),
  786. SOC_DOUBLE_R_TLV("Speaker Volume",
  787. WM8993_SPEAKER_VOLUME_LEFT, WM8993_SPEAKER_VOLUME_RIGHT,
  788. 0, 63, 0, outpga_tlv),
  789. SOC_DOUBLE_R("Speaker Switch",
  790. WM8993_SPEAKER_VOLUME_LEFT, WM8993_SPEAKER_VOLUME_RIGHT,
  791. 6, 1, 0),
  792. SOC_DOUBLE_R("Speaker ZC Switch",
  793. WM8993_SPEAKER_VOLUME_LEFT, WM8993_SPEAKER_VOLUME_RIGHT,
  794. 7, 1, 0),
  795. SOC_DOUBLE_TLV("Speaker Boost Volume", WM8993_SPKOUT_BOOST, 0, 3, 7, 0,
  796. spkboost_tlv),
  797. SOC_ENUM("Speaker Reference", speaker_ref),
  798. SOC_ENUM("Speaker Mode", speaker_mode),
  799. {
  800. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Headphone Volume",
  801. .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |
  802. SNDRV_CTL_ELEM_ACCESS_READWRITE,
  803. .tlv.p = outpga_tlv,
  804. .info = snd_soc_info_volsw_2r,
  805. .get = snd_soc_get_volsw_2r, .put = wm8993_put_dc_servo,
  806. .private_value = (unsigned long)&(struct soc_mixer_control) {
  807. .reg = WM8993_LEFT_OUTPUT_VOLUME,
  808. .rreg = WM8993_RIGHT_OUTPUT_VOLUME,
  809. .shift = 0, .max = 63
  810. },
  811. },
  812. SOC_DOUBLE_R("Headphone Switch", WM8993_LEFT_OUTPUT_VOLUME,
  813. WM8993_RIGHT_OUTPUT_VOLUME, 6, 1, 0),
  814. SOC_DOUBLE_R("Headphone ZC Switch", WM8993_LEFT_OUTPUT_VOLUME,
  815. WM8993_RIGHT_OUTPUT_VOLUME, 7, 1, 0),
  816. SOC_SINGLE("LINEOUT1N Switch", WM8993_LINE_OUTPUTS_VOLUME, 6, 1, 1),
  817. SOC_SINGLE("LINEOUT1P Switch", WM8993_LINE_OUTPUTS_VOLUME, 5, 1, 1),
  818. SOC_SINGLE_TLV("LINEOUT1 Volume", WM8993_LINE_OUTPUTS_VOLUME, 4, 1, 1,
  819. line_tlv),
  820. SOC_SINGLE("LINEOUT2N Switch", WM8993_LINE_OUTPUTS_VOLUME, 2, 1, 1),
  821. SOC_SINGLE("LINEOUT2P Switch", WM8993_LINE_OUTPUTS_VOLUME, 1, 1, 1),
  822. SOC_SINGLE_TLV("LINEOUT2 Volume", WM8993_LINE_OUTPUTS_VOLUME, 0, 1, 1,
  823. line_tlv),
  824. };
  825. static const struct snd_kcontrol_new wm8993_eq_controls[] = {
  826. SOC_SINGLE_TLV("EQ1 Volume", WM8993_EQ2, 0, 24, 0, eq_tlv),
  827. SOC_SINGLE_TLV("EQ2 Volume", WM8993_EQ3, 0, 24, 0, eq_tlv),
  828. SOC_SINGLE_TLV("EQ3 Volume", WM8993_EQ4, 0, 24, 0, eq_tlv),
  829. SOC_SINGLE_TLV("EQ4 Volume", WM8993_EQ5, 0, 24, 0, eq_tlv),
  830. SOC_SINGLE_TLV("EQ5 Volume", WM8993_EQ6, 0, 24, 0, eq_tlv),
  831. };
  832. static int wm8993_earpiece_event(struct snd_soc_dapm_widget *w,
  833. struct snd_kcontrol *control, int event)
  834. {
  835. struct snd_soc_codec *codec = w->codec;
  836. u16 reg = wm8993_read(codec, WM8993_ANTIPOP1) & ~WM8993_HPOUT2_IN_ENA;
  837. switch (event) {
  838. case SND_SOC_DAPM_PRE_PMU:
  839. reg |= WM8993_HPOUT2_IN_ENA;
  840. wm8993_write(codec, WM8993_ANTIPOP1, reg);
  841. udelay(50);
  842. break;
  843. case SND_SOC_DAPM_POST_PMD:
  844. wm8993_write(codec, WM8993_ANTIPOP1, reg);
  845. break;
  846. default:
  847. BUG();
  848. break;
  849. }
  850. return 0;
  851. }
  852. static int clk_sys_event(struct snd_soc_dapm_widget *w,
  853. struct snd_kcontrol *kcontrol, int event)
  854. {
  855. struct snd_soc_codec *codec = w->codec;
  856. switch (event) {
  857. case SND_SOC_DAPM_PRE_PMU:
  858. return configure_clock(codec);
  859. case SND_SOC_DAPM_POST_PMD:
  860. break;
  861. }
  862. return 0;
  863. }
  864. /*
  865. * When used with DAC outputs only the WM8993 charge pump supports
  866. * operation in class W mode, providing very low power consumption
  867. * when used with digital sources. Enable and disable this mode
  868. * automatically depending on the mixer configuration.
  869. *
  870. * Currently the only supported paths are the direct DAC->headphone
  871. * paths (which provide minimum power consumption anyway).
  872. */
  873. static int wm8993_class_w_put(struct snd_kcontrol *kcontrol,
  874. struct snd_ctl_elem_value *ucontrol)
  875. {
  876. struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
  877. struct snd_soc_codec *codec = widget->codec;
  878. struct wm8993_priv *wm8993 = codec->private_data;
  879. int ret;
  880. /* Turn it off if we're using the main output mixer */
  881. if (ucontrol->value.integer.value[0] == 0) {
  882. if (wm8993->class_w_users == 0) {
  883. dev_dbg(codec->dev, "Disabling Class W\n");
  884. snd_soc_update_bits(codec, WM8993_CLASS_W_0,
  885. WM8993_CP_DYN_FREQ |
  886. WM8993_CP_DYN_V,
  887. 0);
  888. }
  889. wm8993->class_w_users++;
  890. }
  891. /* Implement the change */
  892. ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
  893. /* Enable it if we're using the direct DAC path */
  894. if (ucontrol->value.integer.value[0] == 1) {
  895. if (wm8993->class_w_users == 1) {
  896. dev_dbg(codec->dev, "Enabling Class W\n");
  897. snd_soc_update_bits(codec, WM8993_CLASS_W_0,
  898. WM8993_CP_DYN_FREQ |
  899. WM8993_CP_DYN_V,
  900. WM8993_CP_DYN_FREQ |
  901. WM8993_CP_DYN_V);
  902. }
  903. wm8993->class_w_users--;
  904. }
  905. dev_dbg(codec->dev, "Indirect DAC use count now %d\n",
  906. wm8993->class_w_users);
  907. return ret;
  908. }
  909. #define SOC_DAPM_ENUM_W(xname, xenum) \
  910. { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  911. .info = snd_soc_info_enum_double, \
  912. .get = snd_soc_dapm_get_enum_double, \
  913. .put = wm8993_class_w_put, \
  914. .private_value = (unsigned long)&xenum }
  915. static int hp_event(struct snd_soc_dapm_widget *w,
  916. struct snd_kcontrol *kcontrol, int event)
  917. {
  918. struct snd_soc_codec *codec = w->codec;
  919. unsigned int reg = wm8993_read(codec, WM8993_ANALOGUE_HP_0);
  920. switch (event) {
  921. case SND_SOC_DAPM_POST_PMU:
  922. snd_soc_update_bits(codec, WM8993_CHARGE_PUMP_1,
  923. WM8993_CP_ENA, WM8993_CP_ENA);
  924. msleep(5);
  925. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
  926. WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA,
  927. WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA);
  928. reg |= WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY;
  929. wm8993_write(codec, WM8993_ANALOGUE_HP_0, reg);
  930. /* Start the DC servo */
  931. snd_soc_update_bits(codec, WM8993_DC_SERVO_0,
  932. WM8993_DCS_ENA_CHAN_0 |
  933. WM8993_DCS_ENA_CHAN_1 |
  934. WM8993_DCS_TRIG_STARTUP_1 |
  935. WM8993_DCS_TRIG_STARTUP_0,
  936. WM8993_DCS_ENA_CHAN_0 |
  937. WM8993_DCS_ENA_CHAN_1 |
  938. WM8993_DCS_TRIG_STARTUP_1 |
  939. WM8993_DCS_TRIG_STARTUP_0);
  940. wait_for_dc_servo(codec, WM8993_DCS_TRIG_STARTUP_0 |
  941. WM8993_DCS_TRIG_STARTUP_1);
  942. snd_soc_update_bits(codec, WM8993_DC_SERVO_1,
  943. WM8993_DCS_TIMER_PERIOD_01_MASK, 0xa);
  944. reg |= WM8993_HPOUT1R_OUTP | WM8993_HPOUT1R_RMV_SHORT |
  945. WM8993_HPOUT1L_OUTP | WM8993_HPOUT1L_RMV_SHORT;
  946. wm8993_write(codec, WM8993_ANALOGUE_HP_0, reg);
  947. break;
  948. case SND_SOC_DAPM_PRE_PMD:
  949. reg &= ~(WM8993_HPOUT1L_RMV_SHORT |
  950. WM8993_HPOUT1L_DLY |
  951. WM8993_HPOUT1L_OUTP |
  952. WM8993_HPOUT1R_RMV_SHORT |
  953. WM8993_HPOUT1R_DLY |
  954. WM8993_HPOUT1R_OUTP);
  955. snd_soc_update_bits(codec, WM8993_DC_SERVO_1,
  956. WM8993_DCS_TIMER_PERIOD_01_MASK, 0);
  957. snd_soc_update_bits(codec, WM8993_DC_SERVO_0,
  958. WM8993_DCS_ENA_CHAN_0 |
  959. WM8993_DCS_ENA_CHAN_1, 0);
  960. wm8993_write(codec, WM8993_ANALOGUE_HP_0, reg);
  961. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
  962. WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA,
  963. 0);
  964. snd_soc_update_bits(codec, WM8993_CHARGE_PUMP_1,
  965. WM8993_CP_ENA, 0);
  966. break;
  967. }
  968. return 0;
  969. }
  970. static const struct snd_kcontrol_new in1l_pga[] = {
  971. SOC_DAPM_SINGLE("IN1LP Switch", WM8993_INPUT_MIXER2, 5, 1, 0),
  972. SOC_DAPM_SINGLE("IN1LN Switch", WM8993_INPUT_MIXER2, 4, 1, 0),
  973. };
  974. static const struct snd_kcontrol_new in1r_pga[] = {
  975. SOC_DAPM_SINGLE("IN1RP Switch", WM8993_INPUT_MIXER2, 1, 1, 0),
  976. SOC_DAPM_SINGLE("IN1RN Switch", WM8993_INPUT_MIXER2, 0, 1, 0),
  977. };
  978. static const struct snd_kcontrol_new in2l_pga[] = {
  979. SOC_DAPM_SINGLE("IN2LP Switch", WM8993_INPUT_MIXER2, 7, 1, 0),
  980. SOC_DAPM_SINGLE("IN2LN Switch", WM8993_INPUT_MIXER2, 6, 1, 0),
  981. };
  982. static const struct snd_kcontrol_new in2r_pga[] = {
  983. SOC_DAPM_SINGLE("IN2RP Switch", WM8993_INPUT_MIXER2, 3, 1, 0),
  984. SOC_DAPM_SINGLE("IN2RN Switch", WM8993_INPUT_MIXER2, 2, 1, 0),
  985. };
  986. static const struct snd_kcontrol_new mixinl[] = {
  987. SOC_DAPM_SINGLE("IN2L Switch", WM8993_INPUT_MIXER3, 8, 1, 0),
  988. SOC_DAPM_SINGLE("IN1L Switch", WM8993_INPUT_MIXER3, 5, 1, 0),
  989. };
  990. static const struct snd_kcontrol_new mixinr[] = {
  991. SOC_DAPM_SINGLE("IN2R Switch", WM8993_INPUT_MIXER4, 8, 1, 0),
  992. SOC_DAPM_SINGLE("IN1R Switch", WM8993_INPUT_MIXER4, 5, 1, 0),
  993. };
  994. static const struct snd_kcontrol_new left_output_mixer[] = {
  995. SOC_DAPM_SINGLE("Right Input Switch", WM8993_OUTPUT_MIXER1, 7, 1, 0),
  996. SOC_DAPM_SINGLE("Left Input Switch", WM8993_OUTPUT_MIXER1, 6, 1, 0),
  997. SOC_DAPM_SINGLE("IN2RN Switch", WM8993_OUTPUT_MIXER1, 5, 1, 0),
  998. SOC_DAPM_SINGLE("IN2LN Switch", WM8993_OUTPUT_MIXER1, 4, 1, 0),
  999. SOC_DAPM_SINGLE("IN2LP Switch", WM8993_OUTPUT_MIXER1, 1, 1, 0),
  1000. SOC_DAPM_SINGLE("IN1R Switch", WM8993_OUTPUT_MIXER1, 3, 1, 0),
  1001. SOC_DAPM_SINGLE("IN1L Switch", WM8993_OUTPUT_MIXER1, 2, 1, 0),
  1002. SOC_DAPM_SINGLE("DAC Switch", WM8993_OUTPUT_MIXER1, 0, 1, 0),
  1003. };
  1004. static const struct snd_kcontrol_new right_output_mixer[] = {
  1005. SOC_DAPM_SINGLE("Left Input Switch", WM8993_OUTPUT_MIXER2, 7, 1, 0),
  1006. SOC_DAPM_SINGLE("Right Input Switch", WM8993_OUTPUT_MIXER2, 6, 1, 0),
  1007. SOC_DAPM_SINGLE("IN2LN Switch", WM8993_OUTPUT_MIXER2, 5, 1, 0),
  1008. SOC_DAPM_SINGLE("IN2RN Switch", WM8993_OUTPUT_MIXER2, 4, 1, 0),
  1009. SOC_DAPM_SINGLE("IN1L Switch", WM8993_OUTPUT_MIXER2, 3, 1, 0),
  1010. SOC_DAPM_SINGLE("IN1R Switch", WM8993_OUTPUT_MIXER2, 2, 1, 0),
  1011. SOC_DAPM_SINGLE("IN2RP Switch", WM8993_OUTPUT_MIXER2, 1, 1, 0),
  1012. SOC_DAPM_SINGLE("DAC Switch", WM8993_OUTPUT_MIXER2, 0, 1, 0),
  1013. };
  1014. static const struct snd_kcontrol_new earpiece_mixer[] = {
  1015. SOC_DAPM_SINGLE("Direct Voice Switch", WM8993_HPOUT2_MIXER, 5, 1, 0),
  1016. SOC_DAPM_SINGLE("Left Output Switch", WM8993_HPOUT2_MIXER, 4, 1, 0),
  1017. SOC_DAPM_SINGLE("Right Output Switch", WM8993_HPOUT2_MIXER, 3, 1, 0),
  1018. };
  1019. static const struct snd_kcontrol_new left_speaker_mixer[] = {
  1020. SOC_DAPM_SINGLE("Input Switch", WM8993_SPEAKER_MIXER, 7, 1, 0),
  1021. SOC_DAPM_SINGLE("IN1LP Switch", WM8993_SPEAKER_MIXER, 5, 1, 0),
  1022. SOC_DAPM_SINGLE("Output Switch", WM8993_SPEAKER_MIXER, 3, 1, 0),
  1023. SOC_DAPM_SINGLE("DAC Switch", WM8993_SPEAKER_MIXER, 6, 1, 0),
  1024. };
  1025. static const struct snd_kcontrol_new right_speaker_mixer[] = {
  1026. SOC_DAPM_SINGLE("Input Switch", WM8993_SPEAKER_MIXER, 6, 1, 0),
  1027. SOC_DAPM_SINGLE("IN1RP Switch", WM8993_SPEAKER_MIXER, 4, 1, 0),
  1028. SOC_DAPM_SINGLE("Output Switch", WM8993_SPEAKER_MIXER, 2, 1, 0),
  1029. SOC_DAPM_SINGLE("DAC Switch", WM8993_SPEAKER_MIXER, 0, 1, 0),
  1030. };
  1031. static const struct snd_kcontrol_new left_speaker_boost[] = {
  1032. SOC_DAPM_SINGLE("Direct Voice Switch", WM8993_SPKOUT_MIXERS, 5, 1, 0),
  1033. SOC_DAPM_SINGLE("SPKL Switch", WM8993_SPKOUT_MIXERS, 4, 1, 0),
  1034. SOC_DAPM_SINGLE("SPKR Switch", WM8993_SPKOUT_MIXERS, 3, 1, 0),
  1035. };
  1036. static const struct snd_kcontrol_new right_speaker_boost[] = {
  1037. SOC_DAPM_SINGLE("Direct Voice Switch", WM8993_SPKOUT_MIXERS, 2, 1, 0),
  1038. SOC_DAPM_SINGLE("SPKL Switch", WM8993_SPKOUT_MIXERS, 1, 1, 0),
  1039. SOC_DAPM_SINGLE("SPKR Switch", WM8993_SPKOUT_MIXERS, 0, 1, 0),
  1040. };
  1041. static const char *hp_mux_text[] = {
  1042. "Mixer",
  1043. "DAC",
  1044. };
  1045. static const struct soc_enum hpl_enum =
  1046. SOC_ENUM_SINGLE(WM8993_OUTPUT_MIXER1, 8, 2, hp_mux_text);
  1047. static const struct snd_kcontrol_new hpl_mux =
  1048. SOC_DAPM_ENUM_W("Left Headphone Mux", hpl_enum);
  1049. static const struct soc_enum hpr_enum =
  1050. SOC_ENUM_SINGLE(WM8993_OUTPUT_MIXER2, 8, 2, hp_mux_text);
  1051. static const struct snd_kcontrol_new hpr_mux =
  1052. SOC_DAPM_ENUM_W("Right Headphone Mux", hpr_enum);
  1053. static const struct snd_kcontrol_new line1_mix[] = {
  1054. SOC_DAPM_SINGLE("IN1R Switch", WM8993_LINE_MIXER1, 2, 1, 0),
  1055. SOC_DAPM_SINGLE("IN1L Switch", WM8993_LINE_MIXER1, 1, 1, 0),
  1056. SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER1, 0, 1, 0),
  1057. };
  1058. static const struct snd_kcontrol_new line1n_mix[] = {
  1059. SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER1, 6, 1, 0),
  1060. SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER1, 5, 1, 0),
  1061. };
  1062. static const struct snd_kcontrol_new line1p_mix[] = {
  1063. SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER1, 0, 1, 0),
  1064. };
  1065. static const struct snd_kcontrol_new line2_mix[] = {
  1066. SOC_DAPM_SINGLE("IN2R Switch", WM8993_LINE_MIXER2, 2, 1, 0),
  1067. SOC_DAPM_SINGLE("IN2L Switch", WM8993_LINE_MIXER2, 1, 1, 0),
  1068. SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0),
  1069. };
  1070. static const struct snd_kcontrol_new line2n_mix[] = {
  1071. SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 6, 1, 0),
  1072. SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 5, 1, 0),
  1073. };
  1074. static const struct snd_kcontrol_new line2p_mix[] = {
  1075. SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 0, 1, 0),
  1076. };
  1077. static const struct snd_soc_dapm_widget wm8993_dapm_widgets[] = {
  1078. SND_SOC_DAPM_INPUT("IN1LN"),
  1079. SND_SOC_DAPM_INPUT("IN1LP"),
  1080. SND_SOC_DAPM_INPUT("IN2LN"),
  1081. SND_SOC_DAPM_INPUT("IN2LP/VXRN"),
  1082. SND_SOC_DAPM_INPUT("IN1RN"),
  1083. SND_SOC_DAPM_INPUT("IN1RP"),
  1084. SND_SOC_DAPM_INPUT("IN2RN"),
  1085. SND_SOC_DAPM_INPUT("IN2RP/VXRP"),
  1086. SND_SOC_DAPM_SUPPLY("CLK_SYS", WM8993_BUS_CONTROL_1, 1, 0, clk_sys_event,
  1087. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1088. SND_SOC_DAPM_SUPPLY("TOCLK", WM8993_CLOCKING_1, 14, 0, NULL, 0),
  1089. SND_SOC_DAPM_SUPPLY("CLK_DSP", WM8993_CLOCKING_3, 0, 0, NULL, 0),
  1090. SND_SOC_DAPM_MICBIAS("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0),
  1091. SND_SOC_DAPM_MICBIAS("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0),
  1092. SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0,
  1093. in1l_pga, ARRAY_SIZE(in1l_pga)),
  1094. SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0,
  1095. in1r_pga, ARRAY_SIZE(in1r_pga)),
  1096. SND_SOC_DAPM_MIXER("IN2L PGA", WM8993_POWER_MANAGEMENT_2, 7, 0,
  1097. in2l_pga, ARRAY_SIZE(in2l_pga)),
  1098. SND_SOC_DAPM_MIXER("IN2R PGA", WM8993_POWER_MANAGEMENT_2, 5, 0,
  1099. in2r_pga, ARRAY_SIZE(in2r_pga)),
  1100. /* Dummy widgets to represent differential paths */
  1101. SND_SOC_DAPM_PGA("Direct Voice", SND_SOC_NOPM, 0, 0, NULL, 0),
  1102. SND_SOC_DAPM_MIXER("MIXINL", WM8993_POWER_MANAGEMENT_2, 9, 0,
  1103. mixinl, ARRAY_SIZE(mixinl)),
  1104. SND_SOC_DAPM_MIXER("MIXINR", WM8993_POWER_MANAGEMENT_2, 8, 0,
  1105. mixinr, ARRAY_SIZE(mixinr)),
  1106. SND_SOC_DAPM_ADC("ADCL", "Capture", WM8993_POWER_MANAGEMENT_2, 1, 0),
  1107. SND_SOC_DAPM_ADC("ADCR", "Capture", WM8993_POWER_MANAGEMENT_2, 0, 0),
  1108. SND_SOC_DAPM_DAC("DACL", "Playback", WM8993_POWER_MANAGEMENT_3, 1, 0),
  1109. SND_SOC_DAPM_DAC("DACR", "Playback", WM8993_POWER_MANAGEMENT_3, 0, 0),
  1110. SND_SOC_DAPM_MIXER("Left Output Mixer", WM8993_POWER_MANAGEMENT_3, 5, 0,
  1111. left_output_mixer, ARRAY_SIZE(left_output_mixer)),
  1112. SND_SOC_DAPM_MIXER("Right Output Mixer", WM8993_POWER_MANAGEMENT_3, 4, 0,
  1113. right_output_mixer, ARRAY_SIZE(right_output_mixer)),
  1114. SND_SOC_DAPM_PGA("Left Output PGA", WM8993_POWER_MANAGEMENT_3, 7, 0, NULL, 0),
  1115. SND_SOC_DAPM_PGA("Right Output PGA", WM8993_POWER_MANAGEMENT_3, 6, 0, NULL, 0),
  1116. SND_SOC_DAPM_MIXER("Earpiece Mixer", SND_SOC_NOPM, 0, 0,
  1117. earpiece_mixer, ARRAY_SIZE(earpiece_mixer)),
  1118. SND_SOC_DAPM_PGA_E("Earpiece Driver", WM8993_POWER_MANAGEMENT_1, 11, 0,
  1119. NULL, 0, wm8993_earpiece_event,
  1120. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  1121. SND_SOC_DAPM_MIXER("SPKL", WM8993_POWER_MANAGEMENT_3, 8, 0,
  1122. left_speaker_mixer, ARRAY_SIZE(left_speaker_mixer)),
  1123. SND_SOC_DAPM_MIXER("SPKR", WM8993_POWER_MANAGEMENT_3, 9, 0,
  1124. right_speaker_mixer, ARRAY_SIZE(right_speaker_mixer)),
  1125. SND_SOC_DAPM_MIXER("SPKL Boost", SND_SOC_NOPM, 0, 0,
  1126. left_speaker_boost, ARRAY_SIZE(left_speaker_boost)),
  1127. SND_SOC_DAPM_MIXER("SPKR Boost", SND_SOC_NOPM, 0, 0,
  1128. right_speaker_boost, ARRAY_SIZE(right_speaker_boost)),
  1129. SND_SOC_DAPM_PGA("SPKL Driver", WM8993_POWER_MANAGEMENT_1, 12, 0,
  1130. NULL, 0),
  1131. SND_SOC_DAPM_PGA("SPKR Driver", WM8993_POWER_MANAGEMENT_1, 13, 0,
  1132. NULL, 0),
  1133. SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0, &hpl_mux),
  1134. SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0, &hpr_mux),
  1135. SND_SOC_DAPM_PGA_E("Headphone PGA", SND_SOC_NOPM, 0, 0,
  1136. NULL, 0,
  1137. hp_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1138. SND_SOC_DAPM_MIXER("LINEOUT1 Mixer", SND_SOC_NOPM, 0, 0,
  1139. line1_mix, ARRAY_SIZE(line1_mix)),
  1140. SND_SOC_DAPM_MIXER("LINEOUT2 Mixer", SND_SOC_NOPM, 0, 0,
  1141. line2_mix, ARRAY_SIZE(line2_mix)),
  1142. SND_SOC_DAPM_MIXER("LINEOUT1N Mixer", SND_SOC_NOPM, 0, 0,
  1143. line1n_mix, ARRAY_SIZE(line1n_mix)),
  1144. SND_SOC_DAPM_MIXER("LINEOUT1P Mixer", SND_SOC_NOPM, 0, 0,
  1145. line1p_mix, ARRAY_SIZE(line1p_mix)),
  1146. SND_SOC_DAPM_MIXER("LINEOUT2N Mixer", SND_SOC_NOPM, 0, 0,
  1147. line2n_mix, ARRAY_SIZE(line2n_mix)),
  1148. SND_SOC_DAPM_MIXER("LINEOUT2P Mixer", SND_SOC_NOPM, 0, 0,
  1149. line2p_mix, ARRAY_SIZE(line2p_mix)),
  1150. SND_SOC_DAPM_PGA("LINEOUT1N Driver", WM8993_POWER_MANAGEMENT_3, 13, 0,
  1151. NULL, 0),
  1152. SND_SOC_DAPM_PGA("LINEOUT1P Driver", WM8993_POWER_MANAGEMENT_3, 12, 0,
  1153. NULL, 0),
  1154. SND_SOC_DAPM_PGA("LINEOUT2N Driver", WM8993_POWER_MANAGEMENT_3, 11, 0,
  1155. NULL, 0),
  1156. SND_SOC_DAPM_PGA("LINEOUT2P Driver", WM8993_POWER_MANAGEMENT_3, 10, 0,
  1157. NULL, 0),
  1158. SND_SOC_DAPM_OUTPUT("SPKOUTLP"),
  1159. SND_SOC_DAPM_OUTPUT("SPKOUTLN"),
  1160. SND_SOC_DAPM_OUTPUT("SPKOUTRP"),
  1161. SND_SOC_DAPM_OUTPUT("SPKOUTRN"),
  1162. SND_SOC_DAPM_OUTPUT("HPOUT1L"),
  1163. SND_SOC_DAPM_OUTPUT("HPOUT1R"),
  1164. SND_SOC_DAPM_OUTPUT("HPOUT2P"),
  1165. SND_SOC_DAPM_OUTPUT("HPOUT2N"),
  1166. SND_SOC_DAPM_OUTPUT("LINEOUT1P"),
  1167. SND_SOC_DAPM_OUTPUT("LINEOUT1N"),
  1168. SND_SOC_DAPM_OUTPUT("LINEOUT2P"),
  1169. SND_SOC_DAPM_OUTPUT("LINEOUT2N"),
  1170. };
  1171. static const struct snd_soc_dapm_route routes[] = {
  1172. { "IN1L PGA", "IN1LP Switch", "IN1LP" },
  1173. { "IN1L PGA", "IN1LN Switch", "IN1LN" },
  1174. { "IN1R PGA", "IN1RP Switch", "IN1RP" },
  1175. { "IN1R PGA", "IN1RN Switch", "IN1RN" },
  1176. { "IN2L PGA", "IN2LP Switch", "IN2LP/VXRN" },
  1177. { "IN2L PGA", "IN2LN Switch", "IN2LN" },
  1178. { "IN2R PGA", "IN2RP Switch", "IN2RP/VXRP" },
  1179. { "IN2R PGA", "IN2RN Switch", "IN2RN" },
  1180. { "Direct Voice", NULL, "IN2LP/VXRN" },
  1181. { "Direct Voice", NULL, "IN2RP/VXRP" },
  1182. { "MIXINL", "IN1L Switch", "IN1L PGA" },
  1183. { "MIXINL", "IN2L Switch", "IN2L PGA" },
  1184. { "MIXINL", NULL, "Direct Voice" },
  1185. { "MIXINL", NULL, "IN1LP" },
  1186. { "MIXINL", NULL, "Left Output Mixer" },
  1187. { "MIXINR", "IN1R Switch", "IN1R PGA" },
  1188. { "MIXINR", "IN2R Switch", "IN2R PGA" },
  1189. { "MIXINR", NULL, "Direct Voice" },
  1190. { "MIXINR", NULL, "IN1RP" },
  1191. { "MIXINR", NULL, "Right Output Mixer" },
  1192. { "ADCL", NULL, "MIXINL" },
  1193. { "ADCL", NULL, "CLK_SYS" },
  1194. { "ADCL", NULL, "CLK_DSP" },
  1195. { "ADCR", NULL, "MIXINR" },
  1196. { "ADCR", NULL, "CLK_SYS" },
  1197. { "ADCR", NULL, "CLK_DSP" },
  1198. { "DACL", NULL, "CLK_SYS" },
  1199. { "DACL", NULL, "CLK_DSP" },
  1200. { "DACR", NULL, "CLK_SYS" },
  1201. { "DACR", NULL, "CLK_DSP" },
  1202. { "Left Output Mixer", "Left Input Switch", "MIXINL" },
  1203. { "Left Output Mixer", "Right Input Switch", "MIXINR" },
  1204. { "Left Output Mixer", "IN2RN Switch", "IN2RN" },
  1205. { "Left Output Mixer", "IN2LN Switch", "IN2LN" },
  1206. { "Left Output Mixer", "IN2LP Switch", "IN2LP/VXRN" },
  1207. { "Left Output Mixer", "IN1L Switch", "IN1L PGA" },
  1208. { "Left Output Mixer", "IN1R Switch", "IN1R PGA" },
  1209. { "Left Output Mixer", "DAC Switch", "DACL" },
  1210. { "Right Output Mixer", "Left Input Switch", "MIXINL" },
  1211. { "Right Output Mixer", "Right Input Switch", "MIXINR" },
  1212. { "Right Output Mixer", "IN2LN Switch", "IN2LN" },
  1213. { "Right Output Mixer", "IN2RN Switch", "IN2RN" },
  1214. { "Right Output Mixer", "IN2RP Switch", "IN2RP/VXRP" },
  1215. { "Right Output Mixer", "IN1L Switch", "IN1L PGA" },
  1216. { "Right Output Mixer", "IN1R Switch", "IN1R PGA" },
  1217. { "Right Output Mixer", "DAC Switch", "DACR" },
  1218. { "Left Output PGA", NULL, "Left Output Mixer" },
  1219. { "Left Output PGA", NULL, "CLK_SYS" },
  1220. { "Left Output PGA", NULL, "TOCLK" },
  1221. { "Right Output PGA", NULL, "Right Output Mixer" },
  1222. { "Right Output PGA", NULL, "CLK_SYS" },
  1223. { "Right Output PGA", NULL, "TOCLK" },
  1224. { "Earpiece Mixer", "Direct Voice Switch", "Direct Voice" },
  1225. { "Earpiece Mixer", "Left Output Switch", "Left Output PGA" },
  1226. { "Earpiece Mixer", "Right Output Switch", "Right Output PGA" },
  1227. { "Earpiece Driver", NULL, "Earpiece Mixer" },
  1228. { "HPOUT2N", NULL, "Earpiece Driver" },
  1229. { "HPOUT2P", NULL, "Earpiece Driver" },
  1230. { "SPKL", "Input Switch", "MIXINL" },
  1231. { "SPKL", "IN1LP Switch", "IN1LP" },
  1232. { "SPKL", "Output Switch", "Left Output Mixer" },
  1233. { "SPKL", "DAC Switch", "DACL" },
  1234. { "SPKL", NULL, "CLK_SYS" },
  1235. { "SPKL", NULL, "TOCLK" },
  1236. { "SPKR", "Input Switch", "MIXINR" },
  1237. { "SPKR", "IN1RP Switch", "IN1RP" },
  1238. { "SPKR", "Output Switch", "Right Output Mixer" },
  1239. { "SPKR", "DAC Switch", "DACR" },
  1240. { "SPKR", NULL, "CLK_SYS" },
  1241. { "SPKR", NULL, "TOCLK" },
  1242. { "SPKL Boost", "Direct Voice Switch", "Direct Voice" },
  1243. { "SPKL Boost", "SPKL Switch", "SPKL" },
  1244. { "SPKL Boost", "SPKR Switch", "SPKR" },
  1245. { "SPKR Boost", "Direct Voice Switch", "Direct Voice" },
  1246. { "SPKR Boost", "SPKR Switch", "SPKR" },
  1247. { "SPKR Boost", "SPKL Switch", "SPKL" },
  1248. { "SPKL Driver", NULL, "SPKL Boost" },
  1249. { "SPKL Driver", NULL, "CLK_SYS" },
  1250. { "SPKR Driver", NULL, "SPKR Boost" },
  1251. { "SPKR Driver", NULL, "CLK_SYS" },
  1252. { "SPKOUTLP", NULL, "SPKL Driver" },
  1253. { "SPKOUTLN", NULL, "SPKL Driver" },
  1254. { "SPKOUTRP", NULL, "SPKR Driver" },
  1255. { "SPKOUTRN", NULL, "SPKR Driver" },
  1256. { "Left Headphone Mux", "DAC", "DACL" },
  1257. { "Left Headphone Mux", "Mixer", "Left Output Mixer" },
  1258. { "Right Headphone Mux", "DAC", "DACR" },
  1259. { "Right Headphone Mux", "Mixer", "Right Output Mixer" },
  1260. { "Headphone PGA", NULL, "Left Headphone Mux" },
  1261. { "Headphone PGA", NULL, "Right Headphone Mux" },
  1262. { "Headphone PGA", NULL, "CLK_SYS" },
  1263. { "Headphone PGA", NULL, "TOCLK" },
  1264. { "HPOUT1L", NULL, "Headphone PGA" },
  1265. { "HPOUT1R", NULL, "Headphone PGA" },
  1266. { "LINEOUT1N", NULL, "LINEOUT1N Driver" },
  1267. { "LINEOUT1P", NULL, "LINEOUT1P Driver" },
  1268. { "LINEOUT2N", NULL, "LINEOUT2N Driver" },
  1269. { "LINEOUT2P", NULL, "LINEOUT2P Driver" },
  1270. };
  1271. static const struct snd_soc_dapm_route lineout1_diff_routes[] = {
  1272. { "LINEOUT1 Mixer", "IN1L Switch", "IN1L PGA" },
  1273. { "LINEOUT1 Mixer", "IN1R Switch", "IN1R PGA" },
  1274. { "LINEOUT1 Mixer", "Output Switch", "Left Output Mixer" },
  1275. { "LINEOUT1N Driver", NULL, "LINEOUT1 Mixer" },
  1276. { "LINEOUT1P Driver", NULL, "LINEOUT1 Mixer" },
  1277. };
  1278. static const struct snd_soc_dapm_route lineout1_se_routes[] = {
  1279. { "LINEOUT1N Mixer", "Left Output Switch", "Left Output Mixer" },
  1280. { "LINEOUT1N Mixer", "Right Output Switch", "Left Output Mixer" },
  1281. { "LINEOUT1P Mixer", "Left Output Switch", "Left Output Mixer" },
  1282. { "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" },
  1283. { "LINEOUT1P Driver", NULL, "LINEOUT1P Mixer" },
  1284. };
  1285. static const struct snd_soc_dapm_route lineout2_diff_routes[] = {
  1286. { "LINEOUT2 Mixer", "IN2L Switch", "IN2L PGA" },
  1287. { "LINEOUT2 Mixer", "IN2R Switch", "IN2R PGA" },
  1288. { "LINEOUT2 Mixer", "Output Switch", "Right Output Mixer" },
  1289. { "LINEOUT2N Driver", NULL, "LINEOUT2 Mixer" },
  1290. { "LINEOUT2P Driver", NULL, "LINEOUT2 Mixer" },
  1291. };
  1292. static const struct snd_soc_dapm_route lineout2_se_routes[] = {
  1293. { "LINEOUT2N Mixer", "Left Output Switch", "Left Output Mixer" },
  1294. { "LINEOUT2N Mixer", "Right Output Switch", "Left Output Mixer" },
  1295. { "LINEOUT2P Mixer", "Right Output Switch", "Right Output Mixer" },
  1296. { "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" },
  1297. { "LINEOUT2P Driver", NULL, "LINEOUT2P Mixer" },
  1298. };
  1299. static int wm8993_set_bias_level(struct snd_soc_codec *codec,
  1300. enum snd_soc_bias_level level)
  1301. {
  1302. struct wm8993_priv *wm8993 = codec->private_data;
  1303. switch (level) {
  1304. case SND_SOC_BIAS_ON:
  1305. case SND_SOC_BIAS_PREPARE:
  1306. /* VMID=2*40k */
  1307. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
  1308. WM8993_VMID_SEL_MASK, 0x2);
  1309. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_2,
  1310. WM8993_TSHUT_ENA, WM8993_TSHUT_ENA);
  1311. break;
  1312. case SND_SOC_BIAS_STANDBY:
  1313. if (codec->bias_level == SND_SOC_BIAS_OFF) {
  1314. /* Bring up VMID with fast soft start */
  1315. snd_soc_update_bits(codec, WM8993_ANTIPOP2,
  1316. WM8993_STARTUP_BIAS_ENA |
  1317. WM8993_VMID_BUF_ENA |
  1318. WM8993_VMID_RAMP_MASK |
  1319. WM8993_BIAS_SRC,
  1320. WM8993_STARTUP_BIAS_ENA |
  1321. WM8993_VMID_BUF_ENA |
  1322. WM8993_VMID_RAMP_MASK |
  1323. WM8993_BIAS_SRC);
  1324. /* If either line output is single ended we
  1325. * need the VMID buffer */
  1326. if (!wm8993->pdata.lineout1_diff ||
  1327. !wm8993->pdata.lineout2_diff)
  1328. snd_soc_update_bits(codec, WM8993_ANTIPOP1,
  1329. WM8993_LINEOUT_VMID_BUF_ENA,
  1330. WM8993_LINEOUT_VMID_BUF_ENA);
  1331. /* VMID=2*40k */
  1332. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
  1333. WM8993_VMID_SEL_MASK |
  1334. WM8993_BIAS_ENA,
  1335. WM8993_BIAS_ENA | 0x2);
  1336. msleep(32);
  1337. /* Switch to normal bias */
  1338. snd_soc_update_bits(codec, WM8993_ANTIPOP2,
  1339. WM8993_BIAS_SRC |
  1340. WM8993_STARTUP_BIAS_ENA, 0);
  1341. }
  1342. /* VMID=2*240k */
  1343. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
  1344. WM8993_VMID_SEL_MASK, 0x4);
  1345. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_2,
  1346. WM8993_TSHUT_ENA, 0);
  1347. break;
  1348. case SND_SOC_BIAS_OFF:
  1349. snd_soc_update_bits(codec, WM8993_ANTIPOP1,
  1350. WM8993_LINEOUT_VMID_BUF_ENA, 0);
  1351. snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1,
  1352. WM8993_VMID_SEL_MASK | WM8993_BIAS_ENA,
  1353. 0);
  1354. break;
  1355. }
  1356. codec->bias_level = level;
  1357. return 0;
  1358. }
  1359. static int wm8993_set_sysclk(struct snd_soc_dai *codec_dai,
  1360. int clk_id, unsigned int freq, int dir)
  1361. {
  1362. struct snd_soc_codec *codec = codec_dai->codec;
  1363. struct wm8993_priv *wm8993 = codec->private_data;
  1364. switch (clk_id) {
  1365. case WM8993_SYSCLK_MCLK:
  1366. wm8993->mclk_rate = freq;
  1367. case WM8993_SYSCLK_FLL:
  1368. wm8993->sysclk_source = clk_id;
  1369. break;
  1370. default:
  1371. return -EINVAL;
  1372. }
  1373. return 0;
  1374. }
  1375. static int wm8993_set_dai_fmt(struct snd_soc_dai *dai,
  1376. unsigned int fmt)
  1377. {
  1378. struct snd_soc_codec *codec = dai->codec;
  1379. struct wm8993_priv *wm8993 = codec->private_data;
  1380. unsigned int aif1 = wm8993_read(codec, WM8993_AUDIO_INTERFACE_1);
  1381. unsigned int aif4 = wm8993_read(codec, WM8993_AUDIO_INTERFACE_4);
  1382. aif1 &= ~(WM8993_BCLK_DIR | WM8993_AIF_BCLK_INV |
  1383. WM8993_AIF_LRCLK_INV | WM8993_AIF_FMT_MASK);
  1384. aif4 &= ~WM8993_LRCLK_DIR;
  1385. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  1386. case SND_SOC_DAIFMT_CBS_CFS:
  1387. wm8993->master = 0;
  1388. break;
  1389. case SND_SOC_DAIFMT_CBS_CFM:
  1390. aif4 |= WM8993_LRCLK_DIR;
  1391. wm8993->master = 1;
  1392. break;
  1393. case SND_SOC_DAIFMT_CBM_CFS:
  1394. aif1 |= WM8993_BCLK_DIR;
  1395. wm8993->master = 1;
  1396. break;
  1397. case SND_SOC_DAIFMT_CBM_CFM:
  1398. aif1 |= WM8993_BCLK_DIR;
  1399. aif4 |= WM8993_LRCLK_DIR;
  1400. wm8993->master = 1;
  1401. break;
  1402. default:
  1403. return -EINVAL;
  1404. }
  1405. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  1406. case SND_SOC_DAIFMT_DSP_B:
  1407. aif1 |= WM8993_AIF_LRCLK_INV;
  1408. case SND_SOC_DAIFMT_DSP_A:
  1409. aif1 |= 0x18;
  1410. break;
  1411. case SND_SOC_DAIFMT_I2S:
  1412. aif1 |= 0x10;
  1413. break;
  1414. case SND_SOC_DAIFMT_RIGHT_J:
  1415. break;
  1416. case SND_SOC_DAIFMT_LEFT_J:
  1417. aif1 |= 0x8;
  1418. break;
  1419. default:
  1420. return -EINVAL;
  1421. }
  1422. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  1423. case SND_SOC_DAIFMT_DSP_A:
  1424. case SND_SOC_DAIFMT_DSP_B:
  1425. /* frame inversion not valid for DSP modes */
  1426. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  1427. case SND_SOC_DAIFMT_NB_NF:
  1428. break;
  1429. case SND_SOC_DAIFMT_IB_NF:
  1430. aif1 |= WM8993_AIF_BCLK_INV;
  1431. break;
  1432. default:
  1433. return -EINVAL;
  1434. }
  1435. break;
  1436. case SND_SOC_DAIFMT_I2S:
  1437. case SND_SOC_DAIFMT_RIGHT_J:
  1438. case SND_SOC_DAIFMT_LEFT_J:
  1439. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  1440. case SND_SOC_DAIFMT_NB_NF:
  1441. break;
  1442. case SND_SOC_DAIFMT_IB_IF:
  1443. aif1 |= WM8993_AIF_BCLK_INV | WM8993_AIF_LRCLK_INV;
  1444. break;
  1445. case SND_SOC_DAIFMT_IB_NF:
  1446. aif1 |= WM8993_AIF_BCLK_INV;
  1447. break;
  1448. case SND_SOC_DAIFMT_NB_IF:
  1449. aif1 |= WM8993_AIF_LRCLK_INV;
  1450. break;
  1451. default:
  1452. return -EINVAL;
  1453. }
  1454. break;
  1455. default:
  1456. return -EINVAL;
  1457. }
  1458. wm8993_write(codec, WM8993_AUDIO_INTERFACE_1, aif1);
  1459. wm8993_write(codec, WM8993_AUDIO_INTERFACE_4, aif4);
  1460. return 0;
  1461. }
  1462. static int wm8993_hw_params(struct snd_pcm_substream *substream,
  1463. struct snd_pcm_hw_params *params,
  1464. struct snd_soc_dai *dai)
  1465. {
  1466. struct snd_soc_codec *codec = dai->codec;
  1467. struct wm8993_priv *wm8993 = codec->private_data;
  1468. int ret, i, best, best_val, cur_val;
  1469. unsigned int clocking1, clocking3, aif1, aif4;
  1470. clocking1 = wm8993_read(codec, WM8993_CLOCKING_1);
  1471. clocking1 &= ~WM8993_BCLK_DIV_MASK;
  1472. clocking3 = wm8993_read(codec, WM8993_CLOCKING_3);
  1473. clocking3 &= ~(WM8993_CLK_SYS_RATE_MASK | WM8993_SAMPLE_RATE_MASK);
  1474. aif1 = wm8993_read(codec, WM8993_AUDIO_INTERFACE_1);
  1475. aif1 &= ~WM8993_AIF_WL_MASK;
  1476. aif4 = wm8993_read(codec, WM8993_AUDIO_INTERFACE_4);
  1477. aif4 &= ~WM8993_LRCLK_RATE_MASK;
  1478. /* What BCLK do we need? */
  1479. wm8993->fs = params_rate(params);
  1480. wm8993->bclk = 2 * wm8993->fs;
  1481. switch (params_format(params)) {
  1482. case SNDRV_PCM_FORMAT_S16_LE:
  1483. wm8993->bclk *= 16;
  1484. break;
  1485. case SNDRV_PCM_FORMAT_S20_3LE:
  1486. wm8993->bclk *= 20;
  1487. aif1 |= 0x8;
  1488. break;
  1489. case SNDRV_PCM_FORMAT_S24_LE:
  1490. wm8993->bclk *= 24;
  1491. aif1 |= 0x10;
  1492. break;
  1493. case SNDRV_PCM_FORMAT_S32_LE:
  1494. wm8993->bclk *= 32;
  1495. aif1 |= 0x18;
  1496. break;
  1497. default:
  1498. return -EINVAL;
  1499. }
  1500. dev_dbg(codec->dev, "Target BCLK is %dHz\n", wm8993->bclk);
  1501. ret = configure_clock(codec);
  1502. if (ret != 0)
  1503. return ret;
  1504. /* Select nearest CLK_SYS_RATE */
  1505. best = 0;
  1506. best_val = abs((wm8993->sysclk_rate / clk_sys_rates[0].ratio)
  1507. - wm8993->fs);
  1508. for (i = 1; i < ARRAY_SIZE(clk_sys_rates); i++) {
  1509. cur_val = abs((wm8993->sysclk_rate /
  1510. clk_sys_rates[i].ratio) - wm8993->fs);;
  1511. if (cur_val < best_val) {
  1512. best = i;
  1513. best_val = cur_val;
  1514. }
  1515. }
  1516. dev_dbg(codec->dev, "Selected CLK_SYS_RATIO of %d\n",
  1517. clk_sys_rates[best].ratio);
  1518. clocking3 |= (clk_sys_rates[best].clk_sys_rate
  1519. << WM8993_CLK_SYS_RATE_SHIFT);
  1520. /* SAMPLE_RATE */
  1521. best = 0;
  1522. best_val = abs(wm8993->fs - sample_rates[0].rate);
  1523. for (i = 1; i < ARRAY_SIZE(sample_rates); i++) {
  1524. /* Closest match */
  1525. cur_val = abs(wm8993->fs - sample_rates[i].rate);
  1526. if (cur_val < best_val) {
  1527. best = i;
  1528. best_val = cur_val;
  1529. }
  1530. }
  1531. dev_dbg(codec->dev, "Selected SAMPLE_RATE of %dHz\n",
  1532. sample_rates[best].rate);
  1533. clocking3 |= (sample_rates[best].sample_rate
  1534. << WM8993_SAMPLE_RATE_SHIFT);
  1535. /* BCLK_DIV */
  1536. best = 0;
  1537. best_val = INT_MAX;
  1538. for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) {
  1539. cur_val = ((wm8993->sysclk_rate * 10) / bclk_divs[i].div)
  1540. - wm8993->bclk;
  1541. if (cur_val < 0) /* Table is sorted */
  1542. break;
  1543. if (cur_val < best_val) {
  1544. best = i;
  1545. best_val = cur_val;
  1546. }
  1547. }
  1548. wm8993->bclk = (wm8993->sysclk_rate * 10) / bclk_divs[best].div;
  1549. dev_dbg(codec->dev, "Selected BCLK_DIV of %d for %dHz BCLK\n",
  1550. bclk_divs[best].div, wm8993->bclk);
  1551. clocking1 |= bclk_divs[best].bclk_div << WM8993_BCLK_DIV_SHIFT;
  1552. /* LRCLK is a simple fraction of BCLK */
  1553. dev_dbg(codec->dev, "LRCLK_RATE is %d\n", wm8993->bclk / wm8993->fs);
  1554. aif4 |= wm8993->bclk / wm8993->fs;
  1555. wm8993_write(codec, WM8993_CLOCKING_1, clocking1);
  1556. wm8993_write(codec, WM8993_CLOCKING_3, clocking3);
  1557. wm8993_write(codec, WM8993_AUDIO_INTERFACE_1, aif1);
  1558. wm8993_write(codec, WM8993_AUDIO_INTERFACE_4, aif4);
  1559. /* ReTune Mobile? */
  1560. if (wm8993->pdata.num_retune_configs) {
  1561. u16 eq1 = wm8993_read(codec, WM8993_EQ1);
  1562. struct wm8993_retune_mobile_setting *s;
  1563. best = 0;
  1564. best_val = abs(wm8993->pdata.retune_configs[0].rate
  1565. - wm8993->fs);
  1566. for (i = 0; i < wm8993->pdata.num_retune_configs; i++) {
  1567. cur_val = abs(wm8993->pdata.retune_configs[i].rate
  1568. - wm8993->fs);
  1569. if (cur_val < best_val) {
  1570. best_val = cur_val;
  1571. best = i;
  1572. }
  1573. }
  1574. s = &wm8993->pdata.retune_configs[best];
  1575. dev_dbg(codec->dev, "ReTune Mobile %s tuned for %dHz\n",
  1576. s->name, s->rate);
  1577. /* Disable EQ while we reconfigure */
  1578. snd_soc_update_bits(codec, WM8993_EQ1, WM8993_EQ_ENA, 0);
  1579. for (i = 1; i < ARRAY_SIZE(s->config); i++)
  1580. wm8993_write(codec, WM8993_EQ1 + i, s->config[i]);
  1581. snd_soc_update_bits(codec, WM8993_EQ1, WM8993_EQ_ENA, eq1);
  1582. }
  1583. return 0;
  1584. }
  1585. static int wm8993_digital_mute(struct snd_soc_dai *codec_dai, int mute)
  1586. {
  1587. struct snd_soc_codec *codec = codec_dai->codec;
  1588. unsigned int reg;
  1589. reg = wm8993_read(codec, WM8993_DAC_CTRL);
  1590. if (mute)
  1591. reg |= WM8993_DAC_MUTE;
  1592. else
  1593. reg &= ~WM8993_DAC_MUTE;
  1594. wm8993_write(codec, WM8993_DAC_CTRL, reg);
  1595. return 0;
  1596. }
  1597. static struct snd_soc_dai_ops wm8993_ops = {
  1598. .set_sysclk = wm8993_set_sysclk,
  1599. .set_fmt = wm8993_set_dai_fmt,
  1600. .hw_params = wm8993_hw_params,
  1601. .digital_mute = wm8993_digital_mute,
  1602. .set_pll = wm8993_set_fll,
  1603. };
  1604. #define WM8993_RATES SNDRV_PCM_RATE_8000_48000
  1605. #define WM8993_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  1606. SNDRV_PCM_FMTBIT_S20_3LE |\
  1607. SNDRV_PCM_FMTBIT_S24_LE |\
  1608. SNDRV_PCM_FMTBIT_S32_LE)
  1609. struct snd_soc_dai wm8993_dai = {
  1610. .name = "WM8993",
  1611. .playback = {
  1612. .stream_name = "Playback",
  1613. .channels_min = 1,
  1614. .channels_max = 2,
  1615. .rates = WM8993_RATES,
  1616. .formats = WM8993_FORMATS,
  1617. },
  1618. .capture = {
  1619. .stream_name = "Capture",
  1620. .channels_min = 1,
  1621. .channels_max = 2,
  1622. .rates = WM8993_RATES,
  1623. .formats = WM8993_FORMATS,
  1624. },
  1625. .ops = &wm8993_ops,
  1626. .symmetric_rates = 1,
  1627. };
  1628. EXPORT_SYMBOL_GPL(wm8993_dai);
  1629. static struct snd_soc_codec *wm8993_codec;
  1630. static int wm8993_probe(struct platform_device *pdev)
  1631. {
  1632. struct snd_soc_device *socdev = platform_get_drvdata(pdev);
  1633. struct snd_soc_codec *codec;
  1634. struct wm8993_priv *wm8993;
  1635. int ret = 0;
  1636. if (!wm8993_codec) {
  1637. dev_err(&pdev->dev, "I2C device not yet probed\n");
  1638. goto err;
  1639. }
  1640. socdev->card->codec = wm8993_codec;
  1641. codec = wm8993_codec;
  1642. wm8993 = codec->private_data;
  1643. ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
  1644. if (ret < 0) {
  1645. dev_err(codec->dev, "failed to create pcms\n");
  1646. goto err;
  1647. }
  1648. snd_soc_add_controls(codec, wm8993_snd_controls,
  1649. ARRAY_SIZE(wm8993_snd_controls));
  1650. if (wm8993->pdata.num_retune_configs != 0) {
  1651. dev_dbg(codec->dev, "Using ReTune Mobile\n");
  1652. } else {
  1653. dev_dbg(codec->dev, "No ReTune Mobile, using normal EQ\n");
  1654. snd_soc_add_controls(codec, wm8993_eq_controls,
  1655. ARRAY_SIZE(wm8993_eq_controls));
  1656. }
  1657. snd_soc_dapm_new_controls(codec, wm8993_dapm_widgets,
  1658. ARRAY_SIZE(wm8993_dapm_widgets));
  1659. snd_soc_dapm_add_routes(codec, routes, ARRAY_SIZE(routes));
  1660. if (wm8993->pdata.lineout1_diff)
  1661. snd_soc_dapm_add_routes(codec,
  1662. lineout1_diff_routes,
  1663. ARRAY_SIZE(lineout1_diff_routes));
  1664. else
  1665. snd_soc_dapm_add_routes(codec,
  1666. lineout1_se_routes,
  1667. ARRAY_SIZE(lineout1_se_routes));
  1668. if (wm8993->pdata.lineout2_diff)
  1669. snd_soc_dapm_add_routes(codec,
  1670. lineout2_diff_routes,
  1671. ARRAY_SIZE(lineout2_diff_routes));
  1672. else
  1673. snd_soc_dapm_add_routes(codec,
  1674. lineout2_se_routes,
  1675. ARRAY_SIZE(lineout2_se_routes));
  1676. snd_soc_dapm_new_widgets(codec);
  1677. ret = snd_soc_init_card(socdev);
  1678. if (ret < 0) {
  1679. dev_err(codec->dev, "failed to register card\n");
  1680. goto card_err;
  1681. }
  1682. return ret;
  1683. card_err:
  1684. snd_soc_free_pcms(socdev);
  1685. snd_soc_dapm_free(socdev);
  1686. err:
  1687. return ret;
  1688. }
  1689. static int wm8993_remove(struct platform_device *pdev)
  1690. {
  1691. struct snd_soc_device *socdev = platform_get_drvdata(pdev);
  1692. snd_soc_free_pcms(socdev);
  1693. snd_soc_dapm_free(socdev);
  1694. return 0;
  1695. }
  1696. struct snd_soc_codec_device soc_codec_dev_wm8993 = {
  1697. .probe = wm8993_probe,
  1698. .remove = wm8993_remove,
  1699. };
  1700. EXPORT_SYMBOL_GPL(soc_codec_dev_wm8993);
  1701. static int wm8993_i2c_probe(struct i2c_client *i2c,
  1702. const struct i2c_device_id *id)
  1703. {
  1704. struct wm8993_priv *wm8993;
  1705. struct snd_soc_codec *codec;
  1706. unsigned int val;
  1707. int ret;
  1708. if (wm8993_codec) {
  1709. dev_err(&i2c->dev, "A WM8993 is already registered\n");
  1710. return -EINVAL;
  1711. }
  1712. wm8993 = kzalloc(sizeof(struct wm8993_priv), GFP_KERNEL);
  1713. if (wm8993 == NULL)
  1714. return -ENOMEM;
  1715. codec = &wm8993->codec;
  1716. if (i2c->dev.platform_data)
  1717. memcpy(&wm8993->pdata, i2c->dev.platform_data,
  1718. sizeof(wm8993->pdata));
  1719. mutex_init(&codec->mutex);
  1720. INIT_LIST_HEAD(&codec->dapm_widgets);
  1721. INIT_LIST_HEAD(&codec->dapm_paths);
  1722. codec->name = "WM8993";
  1723. codec->read = wm8993_read;
  1724. codec->write = wm8993_write;
  1725. codec->hw_write = (hw_write_t)i2c_master_send;
  1726. codec->reg_cache = wm8993->reg_cache;
  1727. codec->reg_cache_size = ARRAY_SIZE(wm8993->reg_cache);
  1728. codec->bias_level = SND_SOC_BIAS_OFF;
  1729. codec->set_bias_level = wm8993_set_bias_level;
  1730. codec->dai = &wm8993_dai;
  1731. codec->num_dai = 1;
  1732. codec->private_data = wm8993;
  1733. memcpy(wm8993->reg_cache, wm8993_reg_defaults,
  1734. sizeof(wm8993->reg_cache));
  1735. i2c_set_clientdata(i2c, wm8993);
  1736. codec->control_data = i2c;
  1737. wm8993_codec = codec;
  1738. codec->dev = &i2c->dev;
  1739. val = wm8993_read_hw(codec, WM8993_SOFTWARE_RESET);
  1740. if (val != wm8993_reg_defaults[WM8993_SOFTWARE_RESET]) {
  1741. dev_err(codec->dev, "Invalid ID register value %x\n", val);
  1742. ret = -EINVAL;
  1743. goto err;
  1744. }
  1745. ret = wm8993_write(codec, WM8993_SOFTWARE_RESET, 0xffff);
  1746. if (ret != 0)
  1747. goto err;
  1748. /* By default we're using the output mixers */
  1749. wm8993->class_w_users = 2;
  1750. /* Latch volume update bits and default ZC on */
  1751. snd_soc_update_bits(codec, WM8993_LEFT_LINE_INPUT_1_2_VOLUME,
  1752. WM8993_IN1_VU, WM8993_IN1_VU);
  1753. snd_soc_update_bits(codec, WM8993_RIGHT_LINE_INPUT_1_2_VOLUME,
  1754. WM8993_IN1_VU, WM8993_IN1_VU);
  1755. snd_soc_update_bits(codec, WM8993_LEFT_LINE_INPUT_3_4_VOLUME,
  1756. WM8993_IN2_VU, WM8993_IN2_VU);
  1757. snd_soc_update_bits(codec, WM8993_RIGHT_LINE_INPUT_3_4_VOLUME,
  1758. WM8993_IN2_VU, WM8993_IN2_VU);
  1759. snd_soc_update_bits(codec, WM8993_SPEAKER_VOLUME_RIGHT,
  1760. WM8993_SPKOUT_VU, WM8993_SPKOUT_VU);
  1761. snd_soc_update_bits(codec, WM8993_LEFT_OUTPUT_VOLUME,
  1762. WM8993_HPOUT1L_ZC, WM8993_HPOUT1L_ZC);
  1763. snd_soc_update_bits(codec, WM8993_RIGHT_OUTPUT_VOLUME,
  1764. WM8993_HPOUT1_VU | WM8993_HPOUT1R_ZC,
  1765. WM8993_HPOUT1_VU | WM8993_HPOUT1R_ZC);
  1766. snd_soc_update_bits(codec, WM8993_LEFT_OPGA_VOLUME,
  1767. WM8993_MIXOUTL_ZC, WM8993_MIXOUTL_ZC);
  1768. snd_soc_update_bits(codec, WM8993_RIGHT_OPGA_VOLUME,
  1769. WM8993_MIXOUTR_ZC | WM8993_MIXOUT_VU,
  1770. WM8993_MIXOUTR_ZC | WM8993_MIXOUT_VU);
  1771. snd_soc_update_bits(codec, WM8993_RIGHT_DAC_DIGITAL_VOLUME,
  1772. WM8993_DAC_VU, WM8993_DAC_VU);
  1773. snd_soc_update_bits(codec, WM8993_RIGHT_ADC_DIGITAL_VOLUME,
  1774. WM8993_ADC_VU, WM8993_ADC_VU);
  1775. /* Manualy manage the HPOUT sequencing for independent stereo
  1776. * control. */
  1777. snd_soc_update_bits(codec, WM8993_ANALOGUE_HP_0,
  1778. WM8993_HPOUT1_AUTO_PU, 0);
  1779. /* Use automatic clock configuration */
  1780. snd_soc_update_bits(codec, WM8993_CLOCKING_4, WM8993_SR_MODE, 0);
  1781. if (!wm8993->pdata.lineout1_diff)
  1782. snd_soc_update_bits(codec, WM8993_LINE_MIXER1,
  1783. WM8993_LINEOUT1_MODE,
  1784. WM8993_LINEOUT1_MODE);
  1785. if (!wm8993->pdata.lineout2_diff)
  1786. snd_soc_update_bits(codec, WM8993_LINE_MIXER2,
  1787. WM8993_LINEOUT2_MODE,
  1788. WM8993_LINEOUT2_MODE);
  1789. if (wm8993->pdata.lineout1fb)
  1790. snd_soc_update_bits(codec, WM8993_ADDITIONAL_CONTROL,
  1791. WM8993_LINEOUT1_FB, WM8993_LINEOUT1_FB);
  1792. if (wm8993->pdata.lineout2fb)
  1793. snd_soc_update_bits(codec, WM8993_ADDITIONAL_CONTROL,
  1794. WM8993_LINEOUT2_FB, WM8993_LINEOUT2_FB);
  1795. /* Apply the microphone bias/detection configuration - the
  1796. * platform data is directly applicable to the register. */
  1797. snd_soc_update_bits(codec, WM8993_MICBIAS,
  1798. WM8993_JD_SCTHR_MASK | WM8993_JD_THR_MASK |
  1799. WM8993_MICB1_LVL | WM8993_MICB2_LVL,
  1800. wm8993->pdata.jd_scthr << WM8993_JD_SCTHR_SHIFT |
  1801. wm8993->pdata.jd_thr << WM8993_JD_THR_SHIFT |
  1802. wm8993->pdata.micbias1_lvl |
  1803. wm8993->pdata.micbias1_lvl << 1);
  1804. ret = wm8993_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
  1805. if (ret != 0)
  1806. goto err;
  1807. wm8993_dai.dev = codec->dev;
  1808. ret = snd_soc_register_dai(&wm8993_dai);
  1809. if (ret != 0)
  1810. goto err_bias;
  1811. ret = snd_soc_register_codec(codec);
  1812. return 0;
  1813. err_bias:
  1814. wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF);
  1815. err:
  1816. wm8993_codec = NULL;
  1817. kfree(wm8993);
  1818. return ret;
  1819. }
  1820. static int wm8993_i2c_remove(struct i2c_client *client)
  1821. {
  1822. struct wm8993_priv *wm8993 = i2c_get_clientdata(client);
  1823. snd_soc_unregister_codec(&wm8993->codec);
  1824. snd_soc_unregister_dai(&wm8993_dai);
  1825. wm8993_set_bias_level(&wm8993->codec, SND_SOC_BIAS_OFF);
  1826. kfree(wm8993);
  1827. return 0;
  1828. }
  1829. static const struct i2c_device_id wm8993_i2c_id[] = {
  1830. { "wm8993", 0 },
  1831. { }
  1832. };
  1833. MODULE_DEVICE_TABLE(i2c, wm8993_i2c_id);
  1834. static struct i2c_driver wm8993_i2c_driver = {
  1835. .driver = {
  1836. .name = "WM8993",
  1837. .owner = THIS_MODULE,
  1838. },
  1839. .probe = wm8993_i2c_probe,
  1840. .remove = wm8993_i2c_remove,
  1841. .id_table = wm8993_i2c_id,
  1842. };
  1843. static int __init wm8993_modinit(void)
  1844. {
  1845. int ret;
  1846. ret = i2c_add_driver(&wm8993_i2c_driver);
  1847. if (ret != 0)
  1848. pr_err("WM8993: Unable to register I2C driver: %d\n", ret);
  1849. return ret;
  1850. }
  1851. module_init(wm8993_modinit);
  1852. static void __exit wm8993_exit(void)
  1853. {
  1854. i2c_del_driver(&wm8993_i2c_driver);
  1855. }
  1856. module_exit(wm8993_exit);
  1857. MODULE_DESCRIPTION("ASoC WM8993 driver");
  1858. MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
  1859. MODULE_LICENSE("GPL");