alc5632.c 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234
  1. /*
  2. * alc5632.c -- ALC5632 ALSA SoC Audio Codec
  3. *
  4. * Copyright (C) 2011 The AC100 Kernel Team <ac100@lists.lauchpad.net>
  5. *
  6. * Authors: Leon Romanovsky <leon@leon.nu>
  7. * Andrey Danin <danindrey@mail.ru>
  8. * Ilya Petrov <ilya.muromec@gmail.com>
  9. * Marc Dietrich <marvin24@gmx.de>
  10. *
  11. * Based on alc5623.c by Arnaud Patard
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License version 2 as
  15. * published by the Free Software Foundation.
  16. */
  17. #include <linux/module.h>
  18. #include <linux/kernel.h>
  19. #include <linux/init.h>
  20. #include <linux/delay.h>
  21. #include <linux/pm.h>
  22. #include <linux/i2c.h>
  23. #include <linux/slab.h>
  24. #include <linux/regmap.h>
  25. #include <sound/core.h>
  26. #include <sound/pcm.h>
  27. #include <sound/pcm_params.h>
  28. #include <sound/tlv.h>
  29. #include <sound/soc.h>
  30. #include <sound/initval.h>
  31. #include "alc5632.h"
  32. /*
  33. * ALC5632 register cache
  34. */
  35. static struct reg_default alc5632_reg_defaults[] = {
  36. { 0, 0x59B4 },
  37. { 1, 0x0000 },
  38. { 2, 0x8080 },
  39. { 3, 0x0000 },
  40. { 4, 0x8080 },
  41. { 5, 0x0000 },
  42. { 6, 0x8080 },
  43. { 7, 0x0000 },
  44. { 8, 0xC800 },
  45. { 9, 0x0000 },
  46. { 10, 0xE808 },
  47. { 11, 0x0000 },
  48. { 12, 0x1010 },
  49. { 13, 0x0000 },
  50. { 14, 0x0808 },
  51. { 15, 0x0000 },
  52. { 16, 0xEE0F },
  53. { 17, 0x0000 },
  54. { 18, 0xCBCB },
  55. { 19, 0x0000 },
  56. { 20, 0x7F7F },
  57. { 21, 0x0000 },
  58. { 22, 0x0000 },
  59. { 23, 0x0000 },
  60. { 24, 0xE010 },
  61. { 25, 0x0000 },
  62. { 26, 0x0000 },
  63. { 27, 0x0000 },
  64. { 28, 0x8008 },
  65. { 29, 0x0000 },
  66. { 30, 0x0000 },
  67. { 31, 0x0000 },
  68. { 32, 0x0000 },
  69. { 33, 0x0000 },
  70. { 34, 0x0000 },
  71. { 35, 0x0000 },
  72. { 36, 0x00C0 },
  73. { 37, 0x0000 },
  74. { 38, 0xEF00 },
  75. { 39, 0x0000 },
  76. { 40, 0x0000 },
  77. { 41, 0x0000 },
  78. { 42, 0x0000 },
  79. { 43, 0x0000 },
  80. { 44, 0x0000 },
  81. { 45, 0x0000 },
  82. { 46, 0x0000 },
  83. { 47, 0x0000 },
  84. { 48, 0x0000 },
  85. { 49, 0x0000 },
  86. { 50, 0x0000 },
  87. { 51, 0x0000 },
  88. { 52, 0x8000 },
  89. { 53, 0x0000 },
  90. { 54, 0x0000 },
  91. { 55, 0x0000 },
  92. { 56, 0x0000 },
  93. { 57, 0x0000 },
  94. { 58, 0x0000 },
  95. { 59, 0x0000 },
  96. { 60, 0x0000 },
  97. { 61, 0x0000 },
  98. { 62, 0x8000 },
  99. { 63, 0x0000 },
  100. { 64, 0x0C0A },
  101. { 65, 0x0000 },
  102. { 66, 0x0000 },
  103. { 67, 0x0000 },
  104. { 68, 0x0000 },
  105. { 69, 0x0000 },
  106. { 70, 0x0000 },
  107. { 71, 0x0000 },
  108. { 72, 0x0000 },
  109. { 73, 0x0000 },
  110. { 74, 0x0000 },
  111. { 75, 0x0000 },
  112. { 76, 0xBE3E },
  113. { 77, 0x0000 },
  114. { 78, 0xBE3E },
  115. { 79, 0x0000 },
  116. { 80, 0x0000 },
  117. { 81, 0x0000 },
  118. { 82, 0x0000 },
  119. { 83, 0x0000 },
  120. { 84, 0x803A },
  121. { 85, 0x0000 },
  122. { 86, 0x0000 },
  123. { 87, 0x0000 },
  124. { 88, 0x0000 },
  125. { 89, 0x0000 },
  126. { 90, 0x0009 },
  127. { 91, 0x0000 },
  128. { 92, 0x0000 },
  129. { 93, 0x0000 },
  130. { 94, 0x3000 },
  131. { 95, 0x0000 },
  132. { 96, 0x3075 },
  133. { 97, 0x0000 },
  134. { 98, 0x1010 },
  135. { 99, 0x0000 },
  136. { 100, 0x3110 },
  137. { 101, 0x0000 },
  138. { 102, 0x0000 },
  139. { 103, 0x0000 },
  140. { 104, 0x0553 },
  141. { 105, 0x0000 },
  142. { 106, 0x0000 },
  143. { 107, 0x0000 },
  144. { 108, 0x0000 },
  145. { 109, 0x0000 },
  146. { 110, 0x0000 },
  147. { 111, 0x0000 },
  148. };
  149. /* codec private data */
  150. struct alc5632_priv {
  151. struct regmap *regmap;
  152. u8 id;
  153. unsigned int sysclk;
  154. };
  155. static bool alc5632_volatile_register(struct device *dev,
  156. unsigned int reg)
  157. {
  158. switch (reg) {
  159. case ALC5632_RESET:
  160. case ALC5632_PWR_DOWN_CTRL_STATUS:
  161. case ALC5632_GPIO_PIN_STATUS:
  162. case ALC5632_OVER_CURR_STATUS:
  163. case ALC5632_HID_CTRL_DATA:
  164. case ALC5632_EQ_CTRL:
  165. return true;
  166. default:
  167. break;
  168. }
  169. return false;
  170. }
  171. static inline int alc5632_reset(struct regmap *map)
  172. {
  173. return regmap_write(map, ALC5632_RESET, 0x59B4);
  174. }
  175. static int amp_mixer_event(struct snd_soc_dapm_widget *w,
  176. struct snd_kcontrol *kcontrol, int event)
  177. {
  178. /* to power-on/off class-d amp generators/speaker */
  179. /* need to write to 'index-46h' register : */
  180. /* so write index num (here 0x46) to reg 0x6a */
  181. /* and then 0xffff/0 to reg 0x6c */
  182. snd_soc_write(w->codec, ALC5632_HID_CTRL_INDEX, 0x46);
  183. switch (event) {
  184. case SND_SOC_DAPM_PRE_PMU:
  185. snd_soc_write(w->codec, ALC5632_HID_CTRL_DATA, 0xFFFF);
  186. break;
  187. case SND_SOC_DAPM_POST_PMD:
  188. snd_soc_write(w->codec, ALC5632_HID_CTRL_DATA, 0);
  189. break;
  190. }
  191. return 0;
  192. }
  193. /*
  194. * ALC5632 Controls
  195. */
  196. /* -34.5db min scale, 1.5db steps, no mute */
  197. static const DECLARE_TLV_DB_SCALE(vol_tlv, -3450, 150, 0);
  198. /* -46.5db min scale, 1.5db steps, no mute */
  199. static const DECLARE_TLV_DB_SCALE(hp_tlv, -4650, 150, 0);
  200. /* -16.5db min scale, 1.5db steps, no mute */
  201. static const DECLARE_TLV_DB_SCALE(adc_rec_tlv, -1650, 150, 0);
  202. static const unsigned int boost_tlv[] = {
  203. TLV_DB_RANGE_HEAD(3),
  204. 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
  205. 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
  206. 2, 2, TLV_DB_SCALE_ITEM(3000, 0, 0),
  207. };
  208. /* 0db min scale, 6 db steps, no mute */
  209. static const DECLARE_TLV_DB_SCALE(dig_tlv, 0, 600, 0);
  210. /* 0db min scalem 0.75db steps, no mute */
  211. static const DECLARE_TLV_DB_SCALE(vdac_tlv, -3525, 075, 0);
  212. static const struct snd_kcontrol_new alc5632_vol_snd_controls[] = {
  213. /* left starts at bit 8, right at bit 0 */
  214. /* 31 steps (5 bit), -46.5db scale */
  215. SOC_DOUBLE_TLV("Line Playback Volume",
  216. ALC5632_SPK_OUT_VOL, 8, 0, 31, 1, hp_tlv),
  217. /* bit 15 mutes left, bit 7 right */
  218. SOC_DOUBLE("Line Playback Switch",
  219. ALC5632_SPK_OUT_VOL, 15, 7, 1, 1),
  220. SOC_DOUBLE_TLV("Headphone Playback Volume",
  221. ALC5632_HP_OUT_VOL, 8, 0, 31, 1, hp_tlv),
  222. SOC_DOUBLE("Headphone Playback Switch",
  223. ALC5632_HP_OUT_VOL, 15, 7, 1, 1),
  224. };
  225. static const struct snd_kcontrol_new alc5632_snd_controls[] = {
  226. SOC_DOUBLE_TLV("Auxout Playback Volume",
  227. ALC5632_AUX_OUT_VOL, 8, 0, 31, 1, hp_tlv),
  228. SOC_DOUBLE("Auxout Playback Switch",
  229. ALC5632_AUX_OUT_VOL, 15, 7, 1, 1),
  230. SOC_SINGLE_TLV("Voice DAC Playback Volume",
  231. ALC5632_VOICE_DAC_VOL, 0, 63, 0, vdac_tlv),
  232. SOC_SINGLE_TLV("Phone Capture Volume",
  233. ALC5632_PHONE_IN_VOL, 8, 31, 1, vol_tlv),
  234. SOC_DOUBLE_TLV("LineIn Capture Volume",
  235. ALC5632_LINE_IN_VOL, 8, 0, 31, 1, vol_tlv),
  236. SOC_DOUBLE_TLV("Stereo DAC Playback Volume",
  237. ALC5632_STEREO_DAC_IN_VOL, 8, 0, 63, 1, vdac_tlv),
  238. SOC_DOUBLE("Stereo DAC Playback Switch",
  239. ALC5632_STEREO_DAC_IN_VOL, 15, 7, 1, 1),
  240. SOC_SINGLE_TLV("Mic1 Capture Volume",
  241. ALC5632_MIC_VOL, 8, 31, 1, vol_tlv),
  242. SOC_SINGLE_TLV("Mic2 Capture Volume",
  243. ALC5632_MIC_VOL, 0, 31, 1, vol_tlv),
  244. SOC_DOUBLE_TLV("Rec Capture Volume",
  245. ALC5632_ADC_REC_GAIN, 8, 0, 31, 0, adc_rec_tlv),
  246. SOC_SINGLE_TLV("Mic 1 Boost Volume",
  247. ALC5632_MIC_CTRL, 10, 2, 0, boost_tlv),
  248. SOC_SINGLE_TLV("Mic 2 Boost Volume",
  249. ALC5632_MIC_CTRL, 8, 2, 0, boost_tlv),
  250. SOC_SINGLE_TLV("Digital Boost Volume",
  251. ALC5632_DIGI_BOOST_CTRL, 0, 7, 0, dig_tlv),
  252. };
  253. /*
  254. * DAPM Controls
  255. */
  256. static const struct snd_kcontrol_new alc5632_hp_mixer_controls[] = {
  257. SOC_DAPM_SINGLE("LI2HP Playback Switch", ALC5632_LINE_IN_VOL, 15, 1, 1),
  258. SOC_DAPM_SINGLE("PHONE2HP Playback Switch", ALC5632_PHONE_IN_VOL, 15, 1, 1),
  259. SOC_DAPM_SINGLE("MIC12HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 15, 1, 1),
  260. SOC_DAPM_SINGLE("MIC22HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 11, 1, 1),
  261. SOC_DAPM_SINGLE("VOICE2HP Playback Switch", ALC5632_VOICE_DAC_VOL, 15, 1, 1),
  262. };
  263. static const struct snd_kcontrol_new alc5632_hpl_mixer_controls[] = {
  264. SOC_DAPM_SINGLE("ADC2HP_L Playback Switch", ALC5632_ADC_REC_GAIN, 15, 1, 1),
  265. SOC_DAPM_SINGLE("DACL2HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 3, 1, 1),
  266. };
  267. static const struct snd_kcontrol_new alc5632_hpr_mixer_controls[] = {
  268. SOC_DAPM_SINGLE("ADC2HP_R Playback Switch", ALC5632_ADC_REC_GAIN, 7, 1, 1),
  269. SOC_DAPM_SINGLE("DACR2HP Playback Switch", ALC5632_MIC_ROUTING_CTRL, 2, 1, 1),
  270. };
  271. static const struct snd_kcontrol_new alc5632_mono_mixer_controls[] = {
  272. SOC_DAPM_SINGLE("ADC2MONO_L Playback Switch", ALC5632_ADC_REC_GAIN, 14, 1, 1),
  273. SOC_DAPM_SINGLE("ADC2MONO_R Playback Switch", ALC5632_ADC_REC_GAIN, 6, 1, 1),
  274. SOC_DAPM_SINGLE("LI2MONO Playback Switch", ALC5632_LINE_IN_VOL, 13, 1, 1),
  275. SOC_DAPM_SINGLE("MIC12MONO Playback Switch",
  276. ALC5632_MIC_ROUTING_CTRL, 13, 1, 1),
  277. SOC_DAPM_SINGLE("MIC22MONO Playback Switch",
  278. ALC5632_MIC_ROUTING_CTRL, 9, 1, 1),
  279. SOC_DAPM_SINGLE("DAC2MONO Playback Switch", ALC5632_MIC_ROUTING_CTRL, 0, 1, 1),
  280. SOC_DAPM_SINGLE("VOICE2MONO Playback Switch", ALC5632_VOICE_DAC_VOL, 13, 1, 1),
  281. };
  282. static const struct snd_kcontrol_new alc5632_speaker_mixer_controls[] = {
  283. SOC_DAPM_SINGLE("LI2SPK Playback Switch", ALC5632_LINE_IN_VOL, 14, 1, 1),
  284. SOC_DAPM_SINGLE("PHONE2SPK Playback Switch", ALC5632_PHONE_IN_VOL, 14, 1, 1),
  285. SOC_DAPM_SINGLE("MIC12SPK Playback Switch",
  286. ALC5632_MIC_ROUTING_CTRL, 14, 1, 1),
  287. SOC_DAPM_SINGLE("MIC22SPK Playback Switch",
  288. ALC5632_MIC_ROUTING_CTRL, 10, 1, 1),
  289. SOC_DAPM_SINGLE("DAC2SPK Playback Switch", ALC5632_MIC_ROUTING_CTRL, 1, 1, 1),
  290. SOC_DAPM_SINGLE("VOICE2SPK Playback Switch", ALC5632_VOICE_DAC_VOL, 14, 1, 1),
  291. };
  292. /* Left Record Mixer */
  293. static const struct snd_kcontrol_new alc5632_captureL_mixer_controls[] = {
  294. SOC_DAPM_SINGLE("Mic1 Capture Switch", ALC5632_ADC_REC_MIXER, 14, 1, 1),
  295. SOC_DAPM_SINGLE("Mic2 Capture Switch", ALC5632_ADC_REC_MIXER, 13, 1, 1),
  296. SOC_DAPM_SINGLE("LineInL Capture Switch", ALC5632_ADC_REC_MIXER, 12, 1, 1),
  297. SOC_DAPM_SINGLE("Left Phone Capture Switch", ALC5632_ADC_REC_MIXER, 11, 1, 1),
  298. SOC_DAPM_SINGLE("HPMixerL Capture Switch", ALC5632_ADC_REC_MIXER, 10, 1, 1),
  299. SOC_DAPM_SINGLE("SPKMixer Capture Switch", ALC5632_ADC_REC_MIXER, 9, 1, 1),
  300. SOC_DAPM_SINGLE("MonoMixer Capture Switch", ALC5632_ADC_REC_MIXER, 8, 1, 1),
  301. };
  302. /* Right Record Mixer */
  303. static const struct snd_kcontrol_new alc5632_captureR_mixer_controls[] = {
  304. SOC_DAPM_SINGLE("Mic1 Capture Switch", ALC5632_ADC_REC_MIXER, 6, 1, 1),
  305. SOC_DAPM_SINGLE("Mic2 Capture Switch", ALC5632_ADC_REC_MIXER, 5, 1, 1),
  306. SOC_DAPM_SINGLE("LineInR Capture Switch", ALC5632_ADC_REC_MIXER, 4, 1, 1),
  307. SOC_DAPM_SINGLE("Right Phone Capture Switch", ALC5632_ADC_REC_MIXER, 3, 1, 1),
  308. SOC_DAPM_SINGLE("HPMixerR Capture Switch", ALC5632_ADC_REC_MIXER, 2, 1, 1),
  309. SOC_DAPM_SINGLE("SPKMixer Capture Switch", ALC5632_ADC_REC_MIXER, 1, 1, 1),
  310. SOC_DAPM_SINGLE("MonoMixer Capture Switch", ALC5632_ADC_REC_MIXER, 0, 1, 1),
  311. };
  312. static const char *alc5632_spk_n_sour_sel[] = {
  313. "RN/-R", "RP/+R", "LN/-R", "Mute"};
  314. static const char *alc5632_hpl_out_input_sel[] = {
  315. "Vmid", "HP Left Mix"};
  316. static const char *alc5632_hpr_out_input_sel[] = {
  317. "Vmid", "HP Right Mix"};
  318. static const char *alc5632_spkout_input_sel[] = {
  319. "Vmid", "HPOut Mix", "Speaker Mix", "Mono Mix"};
  320. static const char *alc5632_aux_out_input_sel[] = {
  321. "Vmid", "HPOut Mix", "Speaker Mix", "Mono Mix"};
  322. /* auxout output mux */
  323. static const struct soc_enum alc5632_aux_out_input_enum =
  324. SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 6, 4, alc5632_aux_out_input_sel);
  325. static const struct snd_kcontrol_new alc5632_auxout_mux_controls =
  326. SOC_DAPM_ENUM("AuxOut Mux", alc5632_aux_out_input_enum);
  327. /* speaker output mux */
  328. static const struct soc_enum alc5632_spkout_input_enum =
  329. SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 10, 4, alc5632_spkout_input_sel);
  330. static const struct snd_kcontrol_new alc5632_spkout_mux_controls =
  331. SOC_DAPM_ENUM("SpeakerOut Mux", alc5632_spkout_input_enum);
  332. /* headphone left output mux */
  333. static const struct soc_enum alc5632_hpl_out_input_enum =
  334. SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 9, 2, alc5632_hpl_out_input_sel);
  335. static const struct snd_kcontrol_new alc5632_hpl_out_mux_controls =
  336. SOC_DAPM_ENUM("Left Headphone Mux", alc5632_hpl_out_input_enum);
  337. /* headphone right output mux */
  338. static const struct soc_enum alc5632_hpr_out_input_enum =
  339. SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 8, 2, alc5632_hpr_out_input_sel);
  340. static const struct snd_kcontrol_new alc5632_hpr_out_mux_controls =
  341. SOC_DAPM_ENUM("Right Headphone Mux", alc5632_hpr_out_input_enum);
  342. /* speaker output N select */
  343. static const struct soc_enum alc5632_spk_n_sour_enum =
  344. SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 14, 4, alc5632_spk_n_sour_sel);
  345. static const struct snd_kcontrol_new alc5632_spkoutn_mux_controls =
  346. SOC_DAPM_ENUM("SpeakerOut N Mux", alc5632_spk_n_sour_enum);
  347. /* speaker amplifier */
  348. static const char *alc5632_amp_names[] = {"AB Amp", "D Amp"};
  349. static const struct soc_enum alc5632_amp_enum =
  350. SOC_ENUM_SINGLE(ALC5632_OUTPUT_MIXER_CTRL, 13, 2, alc5632_amp_names);
  351. static const struct snd_kcontrol_new alc5632_amp_mux_controls =
  352. SOC_DAPM_ENUM("AB-D Amp Mux", alc5632_amp_enum);
  353. static const struct snd_soc_dapm_widget alc5632_dapm_widgets[] = {
  354. /* Muxes */
  355. SND_SOC_DAPM_MUX("AuxOut Mux", SND_SOC_NOPM, 0, 0,
  356. &alc5632_auxout_mux_controls),
  357. SND_SOC_DAPM_MUX("SpeakerOut Mux", SND_SOC_NOPM, 0, 0,
  358. &alc5632_spkout_mux_controls),
  359. SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0,
  360. &alc5632_hpl_out_mux_controls),
  361. SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0,
  362. &alc5632_hpr_out_mux_controls),
  363. SND_SOC_DAPM_MUX("SpeakerOut N Mux", SND_SOC_NOPM, 0, 0,
  364. &alc5632_spkoutn_mux_controls),
  365. /* output mixers */
  366. SND_SOC_DAPM_MIXER("HP Mix", SND_SOC_NOPM, 0, 0,
  367. &alc5632_hp_mixer_controls[0],
  368. ARRAY_SIZE(alc5632_hp_mixer_controls)),
  369. SND_SOC_DAPM_MIXER("HPR Mix", ALC5632_PWR_MANAG_ADD2, 4, 0,
  370. &alc5632_hpr_mixer_controls[0],
  371. ARRAY_SIZE(alc5632_hpr_mixer_controls)),
  372. SND_SOC_DAPM_MIXER("HPL Mix", ALC5632_PWR_MANAG_ADD2, 5, 0,
  373. &alc5632_hpl_mixer_controls[0],
  374. ARRAY_SIZE(alc5632_hpl_mixer_controls)),
  375. SND_SOC_DAPM_MIXER("HPOut Mix", SND_SOC_NOPM, 0, 0, NULL, 0),
  376. SND_SOC_DAPM_MIXER("Mono Mix", ALC5632_PWR_MANAG_ADD2, 2, 0,
  377. &alc5632_mono_mixer_controls[0],
  378. ARRAY_SIZE(alc5632_mono_mixer_controls)),
  379. SND_SOC_DAPM_MIXER("Speaker Mix", ALC5632_PWR_MANAG_ADD2, 3, 0,
  380. &alc5632_speaker_mixer_controls[0],
  381. ARRAY_SIZE(alc5632_speaker_mixer_controls)),
  382. /* input mixers */
  383. SND_SOC_DAPM_MIXER("Left Capture Mix", ALC5632_PWR_MANAG_ADD2, 1, 0,
  384. &alc5632_captureL_mixer_controls[0],
  385. ARRAY_SIZE(alc5632_captureL_mixer_controls)),
  386. SND_SOC_DAPM_MIXER("Right Capture Mix", ALC5632_PWR_MANAG_ADD2, 0, 0,
  387. &alc5632_captureR_mixer_controls[0],
  388. ARRAY_SIZE(alc5632_captureR_mixer_controls)),
  389. SND_SOC_DAPM_DAC("Left DAC", "HiFi Playback",
  390. ALC5632_PWR_MANAG_ADD2, 9, 0),
  391. SND_SOC_DAPM_DAC("Right DAC", "HiFi Playback",
  392. ALC5632_PWR_MANAG_ADD2, 8, 0),
  393. SND_SOC_DAPM_MIXER("DAC Left Channel", ALC5632_PWR_MANAG_ADD1, 15, 0, NULL, 0),
  394. SND_SOC_DAPM_MIXER("DAC Right Channel",
  395. ALC5632_PWR_MANAG_ADD1, 14, 0, NULL, 0),
  396. SND_SOC_DAPM_MIXER("I2S Mix", ALC5632_PWR_MANAG_ADD1, 11, 0, NULL, 0),
  397. SND_SOC_DAPM_MIXER("Phone Mix", SND_SOC_NOPM, 0, 0, NULL, 0),
  398. SND_SOC_DAPM_MIXER("Line Mix", SND_SOC_NOPM, 0, 0, NULL, 0),
  399. SND_SOC_DAPM_ADC("Left ADC", "HiFi Capture",
  400. ALC5632_PWR_MANAG_ADD2, 7, 0),
  401. SND_SOC_DAPM_ADC("Right ADC", "HiFi Capture",
  402. ALC5632_PWR_MANAG_ADD2, 6, 0),
  403. SND_SOC_DAPM_PGA("Left Headphone", ALC5632_PWR_MANAG_ADD3, 11, 0, NULL, 0),
  404. SND_SOC_DAPM_PGA("Right Headphone", ALC5632_PWR_MANAG_ADD3, 10, 0, NULL, 0),
  405. SND_SOC_DAPM_PGA("Left Speaker", ALC5632_PWR_MANAG_ADD3, 13, 0, NULL, 0),
  406. SND_SOC_DAPM_PGA("Right Speaker", ALC5632_PWR_MANAG_ADD3, 12, 0, NULL, 0),
  407. SND_SOC_DAPM_PGA("Aux Out", ALC5632_PWR_MANAG_ADD3, 14, 0, NULL, 0),
  408. SND_SOC_DAPM_PGA("Left LineIn", ALC5632_PWR_MANAG_ADD3, 7, 0, NULL, 0),
  409. SND_SOC_DAPM_PGA("Right LineIn", ALC5632_PWR_MANAG_ADD3, 6, 0, NULL, 0),
  410. SND_SOC_DAPM_PGA("Phone", ALC5632_PWR_MANAG_ADD3, 5, 0, NULL, 0),
  411. SND_SOC_DAPM_PGA("Phone ADMix", ALC5632_PWR_MANAG_ADD3, 4, 0, NULL, 0),
  412. SND_SOC_DAPM_PGA("MIC1 PGA", ALC5632_PWR_MANAG_ADD3, 3, 0, NULL, 0),
  413. SND_SOC_DAPM_PGA("MIC2 PGA", ALC5632_PWR_MANAG_ADD3, 2, 0, NULL, 0),
  414. SND_SOC_DAPM_PGA("MIC1 Pre Amp", ALC5632_PWR_MANAG_ADD3, 1, 0, NULL, 0),
  415. SND_SOC_DAPM_PGA("MIC2 Pre Amp", ALC5632_PWR_MANAG_ADD3, 0, 0, NULL, 0),
  416. SND_SOC_DAPM_SUPPLY("Mic Bias1", ALC5632_PWR_MANAG_ADD1, 3, 0, NULL, 0),
  417. SND_SOC_DAPM_SUPPLY("Mic Bias2", ALC5632_PWR_MANAG_ADD1, 2, 0, NULL, 0),
  418. SND_SOC_DAPM_PGA_E("D Amp", ALC5632_PWR_MANAG_ADD2, 14, 0, NULL, 0,
  419. amp_mixer_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  420. SND_SOC_DAPM_PGA("AB Amp", ALC5632_PWR_MANAG_ADD2, 15, 0, NULL, 0),
  421. SND_SOC_DAPM_MUX("AB-D Amp Mux", ALC5632_PWR_MANAG_ADD1, 10, 0,
  422. &alc5632_amp_mux_controls),
  423. SND_SOC_DAPM_OUTPUT("AUXOUT"),
  424. SND_SOC_DAPM_OUTPUT("HPL"),
  425. SND_SOC_DAPM_OUTPUT("HPR"),
  426. SND_SOC_DAPM_OUTPUT("SPKOUT"),
  427. SND_SOC_DAPM_OUTPUT("SPKOUTN"),
  428. SND_SOC_DAPM_INPUT("LINEINL"),
  429. SND_SOC_DAPM_INPUT("LINEINR"),
  430. SND_SOC_DAPM_INPUT("PHONEP"),
  431. SND_SOC_DAPM_INPUT("PHONEN"),
  432. SND_SOC_DAPM_INPUT("MIC1"),
  433. SND_SOC_DAPM_INPUT("MIC2"),
  434. SND_SOC_DAPM_VMID("Vmid"),
  435. };
  436. static const struct snd_soc_dapm_route alc5632_dapm_routes[] = {
  437. /* virtual mixer - mixes left & right channels */
  438. {"I2S Mix", NULL, "Left DAC"},
  439. {"I2S Mix", NULL, "Right DAC"},
  440. {"Line Mix", NULL, "Right LineIn"},
  441. {"Line Mix", NULL, "Left LineIn"},
  442. {"Phone Mix", NULL, "Phone"},
  443. {"Phone Mix", NULL, "Phone ADMix"},
  444. {"AUXOUT", NULL, "Aux Out"},
  445. /* DAC */
  446. {"DAC Right Channel", NULL, "I2S Mix"},
  447. {"DAC Left Channel", NULL, "I2S Mix"},
  448. /* HP mixer */
  449. {"HPL Mix", "ADC2HP_L Playback Switch", "Left Capture Mix"},
  450. {"HPL Mix", NULL, "HP Mix"},
  451. {"HPR Mix", "ADC2HP_R Playback Switch", "Right Capture Mix"},
  452. {"HPR Mix", NULL, "HP Mix"},
  453. {"HP Mix", "LI2HP Playback Switch", "Line Mix"},
  454. {"HP Mix", "PHONE2HP Playback Switch", "Phone Mix"},
  455. {"HP Mix", "MIC12HP Playback Switch", "MIC1 PGA"},
  456. {"HP Mix", "MIC22HP Playback Switch", "MIC2 PGA"},
  457. {"HPR Mix", "DACR2HP Playback Switch", "DAC Right Channel"},
  458. {"HPL Mix", "DACL2HP Playback Switch", "DAC Left Channel"},
  459. /* speaker mixer */
  460. {"Speaker Mix", "LI2SPK Playback Switch", "Line Mix"},
  461. {"Speaker Mix", "PHONE2SPK Playback Switch", "Phone Mix"},
  462. {"Speaker Mix", "MIC12SPK Playback Switch", "MIC1 PGA"},
  463. {"Speaker Mix", "MIC22SPK Playback Switch", "MIC2 PGA"},
  464. {"Speaker Mix", "DAC2SPK Playback Switch", "DAC Left Channel"},
  465. /* mono mixer */
  466. {"Mono Mix", "ADC2MONO_L Playback Switch", "Left Capture Mix"},
  467. {"Mono Mix", "ADC2MONO_R Playback Switch", "Right Capture Mix"},
  468. {"Mono Mix", "LI2MONO Playback Switch", "Line Mix"},
  469. {"Mono Mix", "VOICE2MONO Playback Switch", "Phone Mix"},
  470. {"Mono Mix", "MIC12MONO Playback Switch", "MIC1 PGA"},
  471. {"Mono Mix", "MIC22MONO Playback Switch", "MIC2 PGA"},
  472. {"Mono Mix", "DAC2MONO Playback Switch", "DAC Left Channel"},
  473. /* Left record mixer */
  474. {"Left Capture Mix", "LineInL Capture Switch", "LINEINL"},
  475. {"Left Capture Mix", "Left Phone Capture Switch", "PHONEN"},
  476. {"Left Capture Mix", "Mic1 Capture Switch", "MIC1 Pre Amp"},
  477. {"Left Capture Mix", "Mic2 Capture Switch", "MIC2 Pre Amp"},
  478. {"Left Capture Mix", "HPMixerL Capture Switch", "HPL Mix"},
  479. {"Left Capture Mix", "SPKMixer Capture Switch", "Speaker Mix"},
  480. {"Left Capture Mix", "MonoMixer Capture Switch", "Mono Mix"},
  481. /*Right record mixer */
  482. {"Right Capture Mix", "LineInR Capture Switch", "LINEINR"},
  483. {"Right Capture Mix", "Right Phone Capture Switch", "PHONEP"},
  484. {"Right Capture Mix", "Mic1 Capture Switch", "MIC1 Pre Amp"},
  485. {"Right Capture Mix", "Mic2 Capture Switch", "MIC2 Pre Amp"},
  486. {"Right Capture Mix", "HPMixerR Capture Switch", "HPR Mix"},
  487. {"Right Capture Mix", "SPKMixer Capture Switch", "Speaker Mix"},
  488. {"Right Capture Mix", "MonoMixer Capture Switch", "Mono Mix"},
  489. /* headphone left mux */
  490. {"Left Headphone Mux", "HP Left Mix", "HPL Mix"},
  491. {"Left Headphone Mux", "Vmid", "Vmid"},
  492. /* headphone right mux */
  493. {"Right Headphone Mux", "HP Right Mix", "HPR Mix"},
  494. {"Right Headphone Mux", "Vmid", "Vmid"},
  495. /* speaker out mux */
  496. {"SpeakerOut Mux", "Vmid", "Vmid"},
  497. {"SpeakerOut Mux", "HPOut Mix", "HPOut Mix"},
  498. {"SpeakerOut Mux", "Speaker Mix", "Speaker Mix"},
  499. {"SpeakerOut Mux", "Mono Mix", "Mono Mix"},
  500. /* Mono/Aux Out mux */
  501. {"AuxOut Mux", "Vmid", "Vmid"},
  502. {"AuxOut Mux", "HPOut Mix", "HPOut Mix"},
  503. {"AuxOut Mux", "Speaker Mix", "Speaker Mix"},
  504. {"AuxOut Mux", "Mono Mix", "Mono Mix"},
  505. /* output pga */
  506. {"HPL", NULL, "Left Headphone"},
  507. {"Left Headphone", NULL, "Left Headphone Mux"},
  508. {"HPR", NULL, "Right Headphone"},
  509. {"Right Headphone", NULL, "Right Headphone Mux"},
  510. {"Aux Out", NULL, "AuxOut Mux"},
  511. /* input pga */
  512. {"Left LineIn", NULL, "LINEINL"},
  513. {"Right LineIn", NULL, "LINEINR"},
  514. {"Phone", NULL, "PHONEP"},
  515. {"MIC1 Pre Amp", NULL, "MIC1"},
  516. {"MIC2 Pre Amp", NULL, "MIC2"},
  517. {"MIC1 PGA", NULL, "MIC1 Pre Amp"},
  518. {"MIC2 PGA", NULL, "MIC2 Pre Amp"},
  519. /* left ADC */
  520. {"Left ADC", NULL, "Left Capture Mix"},
  521. /* right ADC */
  522. {"Right ADC", NULL, "Right Capture Mix"},
  523. {"SpeakerOut N Mux", "RN/-R", "Left Speaker"},
  524. {"SpeakerOut N Mux", "RP/+R", "Left Speaker"},
  525. {"SpeakerOut N Mux", "LN/-R", "Left Speaker"},
  526. {"SpeakerOut N Mux", "Mute", "Vmid"},
  527. {"SpeakerOut N Mux", "RN/-R", "Right Speaker"},
  528. {"SpeakerOut N Mux", "RP/+R", "Right Speaker"},
  529. {"SpeakerOut N Mux", "LN/-R", "Right Speaker"},
  530. {"SpeakerOut N Mux", "Mute", "Vmid"},
  531. {"AB Amp", NULL, "SpeakerOut Mux"},
  532. {"D Amp", NULL, "SpeakerOut Mux"},
  533. {"AB-D Amp Mux", "AB Amp", "AB Amp"},
  534. {"AB-D Amp Mux", "D Amp", "D Amp"},
  535. {"Left Speaker", NULL, "AB-D Amp Mux"},
  536. {"Right Speaker", NULL, "AB-D Amp Mux"},
  537. {"SPKOUT", NULL, "Left Speaker"},
  538. {"SPKOUT", NULL, "Right Speaker"},
  539. {"SPKOUTN", NULL, "SpeakerOut N Mux"},
  540. };
  541. /* PLL divisors */
  542. struct _pll_div {
  543. u32 pll_in;
  544. u32 pll_out;
  545. u16 regvalue;
  546. };
  547. /* Note : pll code from original alc5632 driver. Not sure of how good it is */
  548. /* usefull only for master mode */
  549. static const struct _pll_div codec_master_pll_div[] = {
  550. { 2048000, 8192000, 0x0ea0},
  551. { 3686400, 8192000, 0x4e27},
  552. { 12000000, 8192000, 0x456b},
  553. { 13000000, 8192000, 0x495f},
  554. { 13100000, 8192000, 0x0320},
  555. { 2048000, 11289600, 0xf637},
  556. { 3686400, 11289600, 0x2f22},
  557. { 12000000, 11289600, 0x3e2f},
  558. { 13000000, 11289600, 0x4d5b},
  559. { 13100000, 11289600, 0x363b},
  560. { 2048000, 16384000, 0x1ea0},
  561. { 3686400, 16384000, 0x9e27},
  562. { 12000000, 16384000, 0x452b},
  563. { 13000000, 16384000, 0x542f},
  564. { 13100000, 16384000, 0x03a0},
  565. { 2048000, 16934400, 0xe625},
  566. { 3686400, 16934400, 0x9126},
  567. { 12000000, 16934400, 0x4d2c},
  568. { 13000000, 16934400, 0x742f},
  569. { 13100000, 16934400, 0x3c27},
  570. { 2048000, 22579200, 0x2aa0},
  571. { 3686400, 22579200, 0x2f20},
  572. { 12000000, 22579200, 0x7e2f},
  573. { 13000000, 22579200, 0x742f},
  574. { 13100000, 22579200, 0x3c27},
  575. { 2048000, 24576000, 0x2ea0},
  576. { 3686400, 24576000, 0xee27},
  577. { 12000000, 24576000, 0x2915},
  578. { 13000000, 24576000, 0x772e},
  579. { 13100000, 24576000, 0x0d20},
  580. };
  581. /* FOUT = MCLK*(N+2)/((M+2)*(K+2))
  582. N: bit 15:8 (div 2 .. div 257)
  583. K: bit 6:4 typical 2
  584. M: bit 3:0 (div 2 .. div 17)
  585. same as for 5623 - thanks!
  586. */
  587. static const struct _pll_div codec_slave_pll_div[] = {
  588. { 1024000, 16384000, 0x3ea0},
  589. { 1411200, 22579200, 0x3ea0},
  590. { 1536000, 24576000, 0x3ea0},
  591. { 2048000, 16384000, 0x1ea0},
  592. { 2822400, 22579200, 0x1ea0},
  593. { 3072000, 24576000, 0x1ea0},
  594. };
  595. static int alc5632_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
  596. int source, unsigned int freq_in, unsigned int freq_out)
  597. {
  598. int i;
  599. struct snd_soc_codec *codec = codec_dai->codec;
  600. int gbl_clk = 0, pll_div = 0;
  601. u16 reg;
  602. if (pll_id < ALC5632_PLL_FR_MCLK || pll_id > ALC5632_PLL_FR_VBCLK)
  603. return -EINVAL;
  604. /* Disable PLL power */
  605. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  606. ALC5632_PWR_ADD2_PLL1,
  607. 0);
  608. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  609. ALC5632_PWR_ADD2_PLL2,
  610. 0);
  611. /* pll is not used in slave mode */
  612. reg = snd_soc_read(codec, ALC5632_DAI_CONTROL);
  613. if (reg & ALC5632_DAI_SDP_SLAVE_MODE)
  614. return 0;
  615. if (!freq_in || !freq_out)
  616. return 0;
  617. switch (pll_id) {
  618. case ALC5632_PLL_FR_MCLK:
  619. for (i = 0; i < ARRAY_SIZE(codec_master_pll_div); i++) {
  620. if (codec_master_pll_div[i].pll_in == freq_in
  621. && codec_master_pll_div[i].pll_out == freq_out) {
  622. /* PLL source from MCLK */
  623. pll_div = codec_master_pll_div[i].regvalue;
  624. break;
  625. }
  626. }
  627. break;
  628. case ALC5632_PLL_FR_BCLK:
  629. for (i = 0; i < ARRAY_SIZE(codec_slave_pll_div); i++) {
  630. if (codec_slave_pll_div[i].pll_in == freq_in
  631. && codec_slave_pll_div[i].pll_out == freq_out) {
  632. /* PLL source from Bitclk */
  633. gbl_clk = ALC5632_PLL_FR_BCLK;
  634. pll_div = codec_slave_pll_div[i].regvalue;
  635. break;
  636. }
  637. }
  638. break;
  639. case ALC5632_PLL_FR_VBCLK:
  640. for (i = 0; i < ARRAY_SIZE(codec_slave_pll_div); i++) {
  641. if (codec_slave_pll_div[i].pll_in == freq_in
  642. && codec_slave_pll_div[i].pll_out == freq_out) {
  643. /* PLL source from voice clock */
  644. gbl_clk = ALC5632_PLL_FR_VBCLK;
  645. pll_div = codec_slave_pll_div[i].regvalue;
  646. break;
  647. }
  648. }
  649. break;
  650. default:
  651. return -EINVAL;
  652. }
  653. if (!pll_div)
  654. return -EINVAL;
  655. /* choose MCLK/BCLK/VBCLK */
  656. snd_soc_write(codec, ALC5632_GPCR2, gbl_clk);
  657. /* choose PLL1 clock rate */
  658. snd_soc_write(codec, ALC5632_PLL1_CTRL, pll_div);
  659. /* enable PLL1 */
  660. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  661. ALC5632_PWR_ADD2_PLL1,
  662. ALC5632_PWR_ADD2_PLL1);
  663. /* enable PLL2 */
  664. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  665. ALC5632_PWR_ADD2_PLL2,
  666. ALC5632_PWR_ADD2_PLL2);
  667. /* use PLL1 as main SYSCLK */
  668. snd_soc_update_bits(codec, ALC5632_GPCR1,
  669. ALC5632_GPCR1_CLK_SYS_SRC_SEL_PLL1,
  670. ALC5632_GPCR1_CLK_SYS_SRC_SEL_PLL1);
  671. return 0;
  672. }
  673. struct _coeff_div {
  674. u16 fs;
  675. u16 regvalue;
  676. };
  677. /* codec hifi mclk (after PLL) clock divider coefficients */
  678. /* values inspired from column BCLK=32Fs of Appendix A table */
  679. static const struct _coeff_div coeff_div[] = {
  680. {512*1, 0x3075},
  681. };
  682. static int get_coeff(struct snd_soc_codec *codec, int rate)
  683. {
  684. struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
  685. int i;
  686. for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
  687. if (coeff_div[i].fs * rate == alc5632->sysclk)
  688. return i;
  689. }
  690. return -EINVAL;
  691. }
  692. /*
  693. * Clock after PLL and dividers
  694. */
  695. static int alc5632_set_dai_sysclk(struct snd_soc_dai *codec_dai,
  696. int clk_id, unsigned int freq, int dir)
  697. {
  698. struct snd_soc_codec *codec = codec_dai->codec;
  699. struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
  700. switch (freq) {
  701. case 8192000:
  702. case 11289600:
  703. case 12288000:
  704. case 16384000:
  705. case 16934400:
  706. case 18432000:
  707. case 22579200:
  708. case 24576000:
  709. alc5632->sysclk = freq;
  710. return 0;
  711. }
  712. return -EINVAL;
  713. }
  714. static int alc5632_set_dai_fmt(struct snd_soc_dai *codec_dai,
  715. unsigned int fmt)
  716. {
  717. struct snd_soc_codec *codec = codec_dai->codec;
  718. u16 iface = 0;
  719. /* set master/slave audio interface */
  720. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  721. case SND_SOC_DAIFMT_CBM_CFM:
  722. iface = ALC5632_DAI_SDP_MASTER_MODE;
  723. break;
  724. case SND_SOC_DAIFMT_CBS_CFS:
  725. iface = ALC5632_DAI_SDP_SLAVE_MODE;
  726. break;
  727. default:
  728. return -EINVAL;
  729. }
  730. /* interface format */
  731. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  732. case SND_SOC_DAIFMT_I2S:
  733. iface |= ALC5632_DAI_I2S_DF_I2S;
  734. break;
  735. case SND_SOC_DAIFMT_LEFT_J:
  736. iface |= ALC5632_DAI_I2S_DF_LEFT;
  737. break;
  738. case SND_SOC_DAIFMT_DSP_A:
  739. iface |= ALC5632_DAI_I2S_DF_PCM_A;
  740. break;
  741. case SND_SOC_DAIFMT_DSP_B:
  742. iface |= ALC5632_DAI_I2S_DF_PCM_B;
  743. break;
  744. default:
  745. return -EINVAL;
  746. }
  747. /* clock inversion */
  748. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  749. case SND_SOC_DAIFMT_NB_NF:
  750. break;
  751. case SND_SOC_DAIFMT_IB_IF:
  752. iface |= ALC5632_DAI_MAIN_I2S_BCLK_POL_CTRL;
  753. break;
  754. case SND_SOC_DAIFMT_IB_NF:
  755. iface |= ALC5632_DAI_MAIN_I2S_BCLK_POL_CTRL;
  756. break;
  757. case SND_SOC_DAIFMT_NB_IF:
  758. break;
  759. default:
  760. return -EINVAL;
  761. }
  762. return snd_soc_write(codec, ALC5632_DAI_CONTROL, iface);
  763. }
  764. static int alc5632_pcm_hw_params(struct snd_pcm_substream *substream,
  765. struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
  766. {
  767. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  768. struct snd_soc_codec *codec = rtd->codec;
  769. int coeff, rate;
  770. u16 iface;
  771. iface = snd_soc_read(codec, ALC5632_DAI_CONTROL);
  772. iface &= ~ALC5632_DAI_I2S_DL_MASK;
  773. /* bit size */
  774. switch (params_format(params)) {
  775. case SNDRV_PCM_FORMAT_S16_LE:
  776. iface |= ALC5632_DAI_I2S_DL_16;
  777. break;
  778. case SNDRV_PCM_FORMAT_S20_3LE:
  779. iface |= ALC5632_DAI_I2S_DL_20;
  780. break;
  781. case SNDRV_PCM_FORMAT_S24_LE:
  782. iface |= ALC5632_DAI_I2S_DL_24;
  783. break;
  784. default:
  785. return -EINVAL;
  786. }
  787. /* set iface & srate */
  788. snd_soc_write(codec, ALC5632_DAI_CONTROL, iface);
  789. rate = params_rate(params);
  790. coeff = get_coeff(codec, rate);
  791. if (coeff < 0)
  792. return -EINVAL;
  793. coeff = coeff_div[coeff].regvalue;
  794. snd_soc_write(codec, ALC5632_DAC_CLK_CTRL1, coeff);
  795. return 0;
  796. }
  797. static int alc5632_mute(struct snd_soc_dai *dai, int mute)
  798. {
  799. struct snd_soc_codec *codec = dai->codec;
  800. u16 hp_mute = ALC5632_MISC_HP_DEPOP_MUTE_L
  801. |ALC5632_MISC_HP_DEPOP_MUTE_R;
  802. u16 mute_reg = snd_soc_read(codec, ALC5632_MISC_CTRL) & ~hp_mute;
  803. if (mute)
  804. mute_reg |= hp_mute;
  805. return snd_soc_write(codec, ALC5632_MISC_CTRL, mute_reg);
  806. }
  807. #define ALC5632_ADD2_POWER_EN (ALC5632_PWR_ADD2_VREF)
  808. #define ALC5632_ADD3_POWER_EN (ALC5632_PWR_ADD3_MIC1_BOOST_AD)
  809. #define ALC5632_ADD1_POWER_EN \
  810. (ALC5632_PWR_ADD1_DAC_REF \
  811. | ALC5632_PWR_ADD1_SOFTGEN_EN \
  812. | ALC5632_PWR_ADD1_HP_OUT_AMP \
  813. | ALC5632_PWR_ADD1_HP_OUT_ENH_AMP \
  814. | ALC5632_PWR_ADD1_MAIN_BIAS)
  815. static void enable_power_depop(struct snd_soc_codec *codec)
  816. {
  817. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
  818. ALC5632_PWR_ADD1_SOFTGEN_EN,
  819. ALC5632_PWR_ADD1_SOFTGEN_EN);
  820. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD3,
  821. ALC5632_ADD3_POWER_EN,
  822. ALC5632_ADD3_POWER_EN);
  823. snd_soc_update_bits(codec, ALC5632_MISC_CTRL,
  824. ALC5632_MISC_HP_DEPOP_MODE2_EN,
  825. ALC5632_MISC_HP_DEPOP_MODE2_EN);
  826. /* "normal" mode: 0 @ 26 */
  827. /* set all PR0-7 mixers to 0 */
  828. snd_soc_update_bits(codec, ALC5632_PWR_DOWN_CTRL_STATUS,
  829. ALC5632_PWR_DOWN_CTRL_STATUS_MASK,
  830. 0);
  831. msleep(500);
  832. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  833. ALC5632_ADD2_POWER_EN,
  834. ALC5632_ADD2_POWER_EN);
  835. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
  836. ALC5632_ADD1_POWER_EN,
  837. ALC5632_ADD1_POWER_EN);
  838. /* disable HP Depop2 */
  839. snd_soc_update_bits(codec, ALC5632_MISC_CTRL,
  840. ALC5632_MISC_HP_DEPOP_MODE2_EN,
  841. 0);
  842. }
  843. static int alc5632_set_bias_level(struct snd_soc_codec *codec,
  844. enum snd_soc_bias_level level)
  845. {
  846. switch (level) {
  847. case SND_SOC_BIAS_ON:
  848. enable_power_depop(codec);
  849. break;
  850. case SND_SOC_BIAS_PREPARE:
  851. break;
  852. case SND_SOC_BIAS_STANDBY:
  853. /* everything off except vref/vmid, */
  854. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
  855. ALC5632_PWR_MANAG_ADD1_MASK,
  856. ALC5632_PWR_ADD1_MAIN_BIAS);
  857. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  858. ALC5632_PWR_MANAG_ADD2_MASK,
  859. ALC5632_PWR_ADD2_VREF);
  860. /* "normal" mode: 0 @ 26 */
  861. snd_soc_update_bits(codec, ALC5632_PWR_DOWN_CTRL_STATUS,
  862. ALC5632_PWR_DOWN_CTRL_STATUS_MASK,
  863. 0xffff ^ (ALC5632_PWR_VREF_PR3
  864. | ALC5632_PWR_VREF_PR2));
  865. break;
  866. case SND_SOC_BIAS_OFF:
  867. /* everything off, dac mute, inactive */
  868. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2,
  869. ALC5632_PWR_MANAG_ADD2_MASK, 0);
  870. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD3,
  871. ALC5632_PWR_MANAG_ADD3_MASK, 0);
  872. snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1,
  873. ALC5632_PWR_MANAG_ADD1_MASK, 0);
  874. break;
  875. }
  876. codec->dapm.bias_level = level;
  877. return 0;
  878. }
  879. #define ALC5632_FORMATS (SNDRV_PCM_FMTBIT_S16_LE \
  880. | SNDRV_PCM_FMTBIT_S24_LE \
  881. | SNDRV_PCM_FMTBIT_S32_LE)
  882. static struct snd_soc_dai_ops alc5632_dai_ops = {
  883. .hw_params = alc5632_pcm_hw_params,
  884. .digital_mute = alc5632_mute,
  885. .set_fmt = alc5632_set_dai_fmt,
  886. .set_sysclk = alc5632_set_dai_sysclk,
  887. .set_pll = alc5632_set_dai_pll,
  888. };
  889. static struct snd_soc_dai_driver alc5632_dai = {
  890. .name = "alc5632-hifi",
  891. .playback = {
  892. .stream_name = "HiFi Playback",
  893. .channels_min = 1,
  894. .channels_max = 2,
  895. .rate_min = 8000,
  896. .rate_max = 48000,
  897. .rates = SNDRV_PCM_RATE_8000_48000,
  898. .formats = ALC5632_FORMATS,},
  899. .capture = {
  900. .stream_name = "HiFi Capture",
  901. .channels_min = 1,
  902. .channels_max = 2,
  903. .rate_min = 8000,
  904. .rate_max = 48000,
  905. .rates = SNDRV_PCM_RATE_8000_48000,
  906. .formats = ALC5632_FORMATS,},
  907. .ops = &alc5632_dai_ops,
  908. .symmetric_rates = 1,
  909. };
  910. #ifdef CONFIG_PM
  911. static int alc5632_suspend(struct snd_soc_codec *codec, pm_message_t mesg)
  912. {
  913. alc5632_set_bias_level(codec, SND_SOC_BIAS_OFF);
  914. return 0;
  915. }
  916. static int alc5632_resume(struct snd_soc_codec *codec)
  917. {
  918. struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
  919. regcache_sync(alc5632->regmap);
  920. alc5632_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
  921. return 0;
  922. }
  923. #else
  924. #define alc5632_suspend NULL
  925. #define alc5632_resume NULL
  926. #endif
  927. static int alc5632_probe(struct snd_soc_codec *codec)
  928. {
  929. struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec);
  930. int ret;
  931. codec->control_data = alc5632->regmap;
  932. ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_REGMAP);
  933. if (ret != 0) {
  934. dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
  935. return ret;
  936. }
  937. /* power on device */
  938. alc5632_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
  939. switch (alc5632->id) {
  940. case 0x5c:
  941. snd_soc_add_controls(codec, alc5632_vol_snd_controls,
  942. ARRAY_SIZE(alc5632_vol_snd_controls));
  943. break;
  944. default:
  945. return -EINVAL;
  946. }
  947. return ret;
  948. }
  949. /* power down chip */
  950. static int alc5632_remove(struct snd_soc_codec *codec)
  951. {
  952. alc5632_set_bias_level(codec, SND_SOC_BIAS_OFF);
  953. return 0;
  954. }
  955. static struct snd_soc_codec_driver soc_codec_device_alc5632 = {
  956. .probe = alc5632_probe,
  957. .remove = alc5632_remove,
  958. .suspend = alc5632_suspend,
  959. .resume = alc5632_resume,
  960. .set_bias_level = alc5632_set_bias_level,
  961. .controls = alc5632_snd_controls,
  962. .num_controls = ARRAY_SIZE(alc5632_snd_controls),
  963. .dapm_widgets = alc5632_dapm_widgets,
  964. .num_dapm_widgets = ARRAY_SIZE(alc5632_dapm_widgets),
  965. .dapm_routes = alc5632_dapm_routes,
  966. .num_dapm_routes = ARRAY_SIZE(alc5632_dapm_routes),
  967. };
  968. static struct regmap_config alc5632_regmap = {
  969. .reg_bits = 8,
  970. .val_bits = 16,
  971. .max_register = ALC5632_MAX_REGISTER,
  972. .reg_defaults = alc5632_reg_defaults,
  973. .num_reg_defaults = ARRAY_SIZE(alc5632_reg_defaults),
  974. .volatile_reg = alc5632_volatile_register,
  975. .cache_type = REGCACHE_RBTREE,
  976. };
  977. /*
  978. * alc5632 2 wire address is determined by A1 pin
  979. * state during powerup.
  980. * low = 0x1a
  981. * high = 0x1b
  982. */
  983. static __devinit int alc5632_i2c_probe(struct i2c_client *client,
  984. const struct i2c_device_id *id)
  985. {
  986. struct alc5632_priv *alc5632;
  987. int ret, vid1, vid2;
  988. vid1 = i2c_smbus_read_word_data(client, ALC5632_VENDOR_ID1);
  989. if (vid1 < 0) {
  990. dev_err(&client->dev, "failed to read I2C\n");
  991. return -EIO;
  992. } else {
  993. dev_info(&client->dev, "got vid1: %x\n", vid1);
  994. }
  995. vid1 = ((vid1 & 0xff) << 8) | (vid1 >> 8);
  996. vid2 = i2c_smbus_read_word_data(client, ALC5632_VENDOR_ID2);
  997. if (vid2 < 0) {
  998. dev_err(&client->dev, "failed to read I2C\n");
  999. return -EIO;
  1000. } else {
  1001. dev_info(&client->dev, "got vid2: %x\n", vid2);
  1002. }
  1003. vid2 = (vid2 & 0xff);
  1004. if ((vid1 != 0x10ec) || (vid2 != id->driver_data)) {
  1005. dev_err(&client->dev, "unknown or wrong codec\n");
  1006. dev_err(&client->dev, "Expected %x:%lx, got %x:%x\n",
  1007. 0x10ec, id->driver_data,
  1008. vid1, vid2);
  1009. return -ENODEV;
  1010. }
  1011. alc5632 = devm_kzalloc(&client->dev,
  1012. sizeof(struct alc5632_priv), GFP_KERNEL);
  1013. if (alc5632 == NULL)
  1014. return -ENOMEM;
  1015. alc5632->id = vid2;
  1016. switch (alc5632->id) {
  1017. case 0x5c:
  1018. alc5632_dai.name = "alc5632-hifi";
  1019. break;
  1020. default:
  1021. return -EINVAL;
  1022. }
  1023. i2c_set_clientdata(client, alc5632);
  1024. alc5632->regmap = regmap_init_i2c(client, &alc5632_regmap);
  1025. if (IS_ERR(alc5632->regmap)) {
  1026. ret = PTR_ERR(alc5632->regmap);
  1027. dev_err(&client->dev, "regmap_init() failed: %d\n", ret);
  1028. return ret;
  1029. }
  1030. ret = alc5632_reset(alc5632->regmap);
  1031. if (ret < 0) {
  1032. dev_err(&client->dev, "Failed to issue reset\n");
  1033. regmap_exit(alc5632->regmap);
  1034. return ret;
  1035. }
  1036. ret = snd_soc_register_codec(&client->dev,
  1037. &soc_codec_device_alc5632, &alc5632_dai, 1);
  1038. if (ret < 0) {
  1039. dev_err(&client->dev, "Failed to register codec: %d\n", ret);
  1040. regmap_exit(alc5632->regmap);
  1041. return ret;
  1042. }
  1043. return ret;
  1044. }
  1045. static int alc5632_i2c_remove(struct i2c_client *client)
  1046. {
  1047. struct alc5632_priv *alc5632 = i2c_get_clientdata(client);
  1048. snd_soc_unregister_codec(&client->dev);
  1049. regmap_exit(alc5632->regmap);
  1050. return 0;
  1051. }
  1052. static const struct i2c_device_id alc5632_i2c_table[] = {
  1053. {"alc5632", 0x5c},
  1054. {}
  1055. };
  1056. MODULE_DEVICE_TABLE(i2c, alc5632_i2c_table);
  1057. /* i2c codec control layer */
  1058. static struct i2c_driver alc5632_i2c_driver = {
  1059. .driver = {
  1060. .name = "alc5632",
  1061. .owner = THIS_MODULE,
  1062. },
  1063. .probe = alc5632_i2c_probe,
  1064. .remove = __devexit_p(alc5632_i2c_remove),
  1065. .id_table = alc5632_i2c_table,
  1066. };
  1067. static int __init alc5632_modinit(void)
  1068. {
  1069. int ret;
  1070. ret = i2c_add_driver(&alc5632_i2c_driver);
  1071. if (ret != 0) {
  1072. printk(KERN_ERR "%s: can't add i2c driver", __func__);
  1073. return ret;
  1074. }
  1075. return ret;
  1076. }
  1077. module_init(alc5632_modinit);
  1078. static void __exit alc5632_modexit(void)
  1079. {
  1080. i2c_del_driver(&alc5632_i2c_driver);
  1081. }
  1082. module_exit(alc5632_modexit);
  1083. MODULE_DESCRIPTION("ASoC ALC5632 driver");
  1084. MODULE_AUTHOR("Leon Romanovsky <leon@leon.nu>");
  1085. MODULE_LICENSE("GPL");