wm8993.c 64 KB

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