alc5632.c 34 KB

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