patch_analog.c 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155
  1. /*
  2. * HD audio interface patch for AD1981HD, AD1983, AD1986A, AD1988
  3. *
  4. * Copyright (c) 2005 Takashi Iwai <tiwai@suse.de>
  5. *
  6. * This driver is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This driver is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. */
  20. #include <sound/driver.h>
  21. #include <linux/init.h>
  22. #include <linux/delay.h>
  23. #include <linux/slab.h>
  24. #include <linux/pci.h>
  25. #include <sound/core.h>
  26. #include "hda_codec.h"
  27. #include "hda_local.h"
  28. struct ad198x_spec {
  29. struct snd_kcontrol_new *mixers[5];
  30. int num_mixers;
  31. const struct hda_verb *init_verbs[5]; /* initialization verbs
  32. * don't forget NULL termination!
  33. */
  34. unsigned int num_init_verbs;
  35. /* playback */
  36. struct hda_multi_out multiout; /* playback set-up
  37. * max_channels, dacs must be set
  38. * dig_out_nid and hp_nid are optional
  39. */
  40. unsigned int cur_eapd;
  41. /* capture */
  42. unsigned int num_adc_nids;
  43. hda_nid_t *adc_nids;
  44. hda_nid_t dig_in_nid; /* digital-in NID; optional */
  45. /* capture source */
  46. const struct hda_input_mux *input_mux;
  47. hda_nid_t *capsrc_nids;
  48. unsigned int cur_mux[3];
  49. /* channel model */
  50. const struct hda_channel_mode *channel_mode;
  51. int num_channel_mode;
  52. /* PCM information */
  53. struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */
  54. struct semaphore amp_mutex; /* PCM volume/mute control mutex */
  55. unsigned int spdif_route;
  56. /* dynamic controls, init_verbs and input_mux */
  57. struct auto_pin_cfg autocfg;
  58. unsigned int num_kctl_alloc, num_kctl_used;
  59. struct snd_kcontrol_new *kctl_alloc;
  60. struct hda_input_mux private_imux;
  61. hda_nid_t private_dac_nids[4];
  62. };
  63. /*
  64. * input MUX handling (common part)
  65. */
  66. static int ad198x_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
  67. {
  68. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  69. struct ad198x_spec *spec = codec->spec;
  70. return snd_hda_input_mux_info(spec->input_mux, uinfo);
  71. }
  72. static int ad198x_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  73. {
  74. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  75. struct ad198x_spec *spec = codec->spec;
  76. unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  77. ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
  78. return 0;
  79. }
  80. static int ad198x_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  81. {
  82. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  83. struct ad198x_spec *spec = codec->spec;
  84. unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  85. return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
  86. spec->capsrc_nids[adc_idx],
  87. &spec->cur_mux[adc_idx]);
  88. }
  89. /*
  90. * initialization (common callbacks)
  91. */
  92. static int ad198x_init(struct hda_codec *codec)
  93. {
  94. struct ad198x_spec *spec = codec->spec;
  95. int i;
  96. for (i = 0; i < spec->num_init_verbs; i++)
  97. snd_hda_sequence_write(codec, spec->init_verbs[i]);
  98. return 0;
  99. }
  100. static int ad198x_build_controls(struct hda_codec *codec)
  101. {
  102. struct ad198x_spec *spec = codec->spec;
  103. unsigned int i;
  104. int err;
  105. for (i = 0; i < spec->num_mixers; i++) {
  106. err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
  107. if (err < 0)
  108. return err;
  109. }
  110. if (spec->multiout.dig_out_nid) {
  111. err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
  112. if (err < 0)
  113. return err;
  114. }
  115. if (spec->dig_in_nid) {
  116. err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
  117. if (err < 0)
  118. return err;
  119. }
  120. return 0;
  121. }
  122. /*
  123. * Analog playback callbacks
  124. */
  125. static int ad198x_playback_pcm_open(struct hda_pcm_stream *hinfo,
  126. struct hda_codec *codec,
  127. struct snd_pcm_substream *substream)
  128. {
  129. struct ad198x_spec *spec = codec->spec;
  130. return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
  131. }
  132. static int ad198x_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
  133. struct hda_codec *codec,
  134. unsigned int stream_tag,
  135. unsigned int format,
  136. struct snd_pcm_substream *substream)
  137. {
  138. struct ad198x_spec *spec = codec->spec;
  139. return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag,
  140. format, substream);
  141. }
  142. static int ad198x_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
  143. struct hda_codec *codec,
  144. struct snd_pcm_substream *substream)
  145. {
  146. struct ad198x_spec *spec = codec->spec;
  147. return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
  148. }
  149. /*
  150. * Digital out
  151. */
  152. static int ad198x_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
  153. struct hda_codec *codec,
  154. struct snd_pcm_substream *substream)
  155. {
  156. struct ad198x_spec *spec = codec->spec;
  157. return snd_hda_multi_out_dig_open(codec, &spec->multiout);
  158. }
  159. static int ad198x_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
  160. struct hda_codec *codec,
  161. struct snd_pcm_substream *substream)
  162. {
  163. struct ad198x_spec *spec = codec->spec;
  164. return snd_hda_multi_out_dig_close(codec, &spec->multiout);
  165. }
  166. /*
  167. * Analog capture
  168. */
  169. static int ad198x_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
  170. struct hda_codec *codec,
  171. unsigned int stream_tag,
  172. unsigned int format,
  173. struct snd_pcm_substream *substream)
  174. {
  175. struct ad198x_spec *spec = codec->spec;
  176. snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
  177. stream_tag, 0, format);
  178. return 0;
  179. }
  180. static int ad198x_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
  181. struct hda_codec *codec,
  182. struct snd_pcm_substream *substream)
  183. {
  184. struct ad198x_spec *spec = codec->spec;
  185. snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
  186. 0, 0, 0);
  187. return 0;
  188. }
  189. /*
  190. */
  191. static struct hda_pcm_stream ad198x_pcm_analog_playback = {
  192. .substreams = 1,
  193. .channels_min = 2,
  194. .channels_max = 6, /* changed later */
  195. .nid = 0, /* fill later */
  196. .ops = {
  197. .open = ad198x_playback_pcm_open,
  198. .prepare = ad198x_playback_pcm_prepare,
  199. .cleanup = ad198x_playback_pcm_cleanup
  200. },
  201. };
  202. static struct hda_pcm_stream ad198x_pcm_analog_capture = {
  203. .substreams = 1,
  204. .channels_min = 2,
  205. .channels_max = 2,
  206. .nid = 0, /* fill later */
  207. .ops = {
  208. .prepare = ad198x_capture_pcm_prepare,
  209. .cleanup = ad198x_capture_pcm_cleanup
  210. },
  211. };
  212. static struct hda_pcm_stream ad198x_pcm_digital_playback = {
  213. .substreams = 1,
  214. .channels_min = 2,
  215. .channels_max = 2,
  216. .nid = 0, /* fill later */
  217. .ops = {
  218. .open = ad198x_dig_playback_pcm_open,
  219. .close = ad198x_dig_playback_pcm_close
  220. },
  221. };
  222. static struct hda_pcm_stream ad198x_pcm_digital_capture = {
  223. .substreams = 1,
  224. .channels_min = 2,
  225. .channels_max = 2,
  226. /* NID is set in alc_build_pcms */
  227. };
  228. static int ad198x_build_pcms(struct hda_codec *codec)
  229. {
  230. struct ad198x_spec *spec = codec->spec;
  231. struct hda_pcm *info = spec->pcm_rec;
  232. codec->num_pcms = 1;
  233. codec->pcm_info = info;
  234. info->name = "AD198x Analog";
  235. info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_analog_playback;
  236. info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->multiout.max_channels;
  237. info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
  238. info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad198x_pcm_analog_capture;
  239. info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adc_nids;
  240. info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
  241. if (spec->multiout.dig_out_nid) {
  242. info++;
  243. codec->num_pcms++;
  244. info->name = "AD198x Digital";
  245. info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_digital_playback;
  246. info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
  247. if (spec->dig_in_nid) {
  248. info->stream[SNDRV_PCM_STREAM_CAPTURE] = ad198x_pcm_digital_capture;
  249. info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
  250. }
  251. }
  252. return 0;
  253. }
  254. static void ad198x_free(struct hda_codec *codec)
  255. {
  256. struct ad198x_spec *spec = codec->spec;
  257. unsigned int i;
  258. if (spec->kctl_alloc) {
  259. for (i = 0; i < spec->num_kctl_used; i++)
  260. kfree(spec->kctl_alloc[i].name);
  261. kfree(spec->kctl_alloc);
  262. }
  263. kfree(codec->spec);
  264. }
  265. #ifdef CONFIG_PM
  266. static int ad198x_resume(struct hda_codec *codec)
  267. {
  268. struct ad198x_spec *spec = codec->spec;
  269. int i;
  270. ad198x_init(codec);
  271. for (i = 0; i < spec->num_mixers; i++)
  272. snd_hda_resume_ctls(codec, spec->mixers[i]);
  273. if (spec->multiout.dig_out_nid)
  274. snd_hda_resume_spdif_out(codec);
  275. if (spec->dig_in_nid)
  276. snd_hda_resume_spdif_in(codec);
  277. return 0;
  278. }
  279. #endif
  280. static struct hda_codec_ops ad198x_patch_ops = {
  281. .build_controls = ad198x_build_controls,
  282. .build_pcms = ad198x_build_pcms,
  283. .init = ad198x_init,
  284. .free = ad198x_free,
  285. #ifdef CONFIG_PM
  286. .resume = ad198x_resume,
  287. #endif
  288. };
  289. /*
  290. * AD1986A specific
  291. */
  292. #define AD1986A_SPDIF_OUT 0x02
  293. #define AD1986A_FRONT_DAC 0x03
  294. #define AD1986A_SURR_DAC 0x04
  295. #define AD1986A_CLFE_DAC 0x05
  296. #define AD1986A_ADC 0x06
  297. static hda_nid_t ad1986a_dac_nids[3] = {
  298. AD1986A_FRONT_DAC, AD1986A_SURR_DAC, AD1986A_CLFE_DAC
  299. };
  300. static hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC };
  301. static struct hda_input_mux ad1986a_capture_source = {
  302. .num_items = 7,
  303. .items = {
  304. { "Mic", 0x0 },
  305. { "CD", 0x1 },
  306. { "Aux", 0x3 },
  307. { "Line", 0x4 },
  308. { "Mix", 0x5 },
  309. { "Mono", 0x6 },
  310. { "Phone", 0x7 },
  311. },
  312. };
  313. /*
  314. * PCM control
  315. *
  316. * bind volumes/mutes of 3 DACs as a single PCM control for simplicity
  317. */
  318. #define ad1986a_pcm_amp_vol_info snd_hda_mixer_amp_volume_info
  319. static int ad1986a_pcm_amp_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  320. {
  321. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  322. struct ad198x_spec *ad = codec->spec;
  323. down(&ad->amp_mutex);
  324. snd_hda_mixer_amp_volume_get(kcontrol, ucontrol);
  325. up(&ad->amp_mutex);
  326. return 0;
  327. }
  328. static int ad1986a_pcm_amp_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  329. {
  330. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  331. struct ad198x_spec *ad = codec->spec;
  332. int i, change = 0;
  333. down(&ad->amp_mutex);
  334. for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) {
  335. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT);
  336. change |= snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
  337. }
  338. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT);
  339. up(&ad->amp_mutex);
  340. return change;
  341. }
  342. #define ad1986a_pcm_amp_sw_info snd_hda_mixer_amp_switch_info
  343. static int ad1986a_pcm_amp_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  344. {
  345. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  346. struct ad198x_spec *ad = codec->spec;
  347. down(&ad->amp_mutex);
  348. snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);
  349. up(&ad->amp_mutex);
  350. return 0;
  351. }
  352. static int ad1986a_pcm_amp_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  353. {
  354. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  355. struct ad198x_spec *ad = codec->spec;
  356. int i, change = 0;
  357. down(&ad->amp_mutex);
  358. for (i = 0; i < ARRAY_SIZE(ad1986a_dac_nids); i++) {
  359. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(ad1986a_dac_nids[i], 3, 0, HDA_OUTPUT);
  360. change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
  361. }
  362. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT);
  363. up(&ad->amp_mutex);
  364. return change;
  365. }
  366. /*
  367. * mixers
  368. */
  369. static struct snd_kcontrol_new ad1986a_mixers[] = {
  370. {
  371. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  372. .name = "PCM Playback Volume",
  373. .info = ad1986a_pcm_amp_vol_info,
  374. .get = ad1986a_pcm_amp_vol_get,
  375. .put = ad1986a_pcm_amp_vol_put,
  376. .private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT)
  377. },
  378. {
  379. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  380. .name = "PCM Playback Switch",
  381. .info = ad1986a_pcm_amp_sw_info,
  382. .get = ad1986a_pcm_amp_sw_get,
  383. .put = ad1986a_pcm_amp_sw_put,
  384. .private_value = HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT)
  385. },
  386. HDA_CODEC_VOLUME("Front Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
  387. HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  388. HDA_CODEC_VOLUME("Surround Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
  389. HDA_CODEC_MUTE("Surround Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
  390. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x1d, 1, 0x0, HDA_OUTPUT),
  391. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x1d, 2, 0x0, HDA_OUTPUT),
  392. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x1d, 1, 0x0, HDA_OUTPUT),
  393. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x1d, 2, 0x0, HDA_OUTPUT),
  394. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x1a, 0x0, HDA_OUTPUT),
  395. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
  396. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  397. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  398. HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x0, HDA_OUTPUT),
  399. HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x0, HDA_OUTPUT),
  400. HDA_CODEC_VOLUME("Aux Playback Volume", 0x16, 0x0, HDA_OUTPUT),
  401. HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT),
  402. HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
  403. HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
  404. HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT),
  405. HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT),
  406. HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT),
  407. HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT),
  408. HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
  409. HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
  410. {
  411. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  412. .name = "Capture Source",
  413. .info = ad198x_mux_enum_info,
  414. .get = ad198x_mux_enum_get,
  415. .put = ad198x_mux_enum_put,
  416. },
  417. HDA_CODEC_MUTE("Stereo Downmix Switch", 0x09, 0x0, HDA_OUTPUT),
  418. { } /* end */
  419. };
  420. /*
  421. * initialization verbs
  422. */
  423. static struct hda_verb ad1986a_init_verbs[] = {
  424. /* Front, Surround, CLFE DAC; mute as default */
  425. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  426. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  427. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  428. /* Downmix - off */
  429. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  430. /* HP, Line-Out, Surround, CLFE selectors */
  431. {0x0a, AC_VERB_SET_CONNECT_SEL, 0x0},
  432. {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0},
  433. {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
  434. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
  435. /* Mono selector */
  436. {0x0e, AC_VERB_SET_CONNECT_SEL, 0x0},
  437. /* Mic selector: Mic 1/2 pin */
  438. {0x0f, AC_VERB_SET_CONNECT_SEL, 0x0},
  439. /* Line-in selector: Line-in */
  440. {0x10, AC_VERB_SET_CONNECT_SEL, 0x0},
  441. /* Mic 1/2 swap */
  442. {0x11, AC_VERB_SET_CONNECT_SEL, 0x0},
  443. /* Record selector: mic */
  444. {0x12, AC_VERB_SET_CONNECT_SEL, 0x0},
  445. /* Mic, Phone, CD, Aux, Line-In amp; mute as default */
  446. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  447. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  448. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  449. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  450. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  451. /* PC beep */
  452. {0x18, AC_VERB_SET_CONNECT_SEL, 0x0},
  453. /* HP, Line-Out, Surround, CLFE, Mono pins; mute as default */
  454. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  455. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  456. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  457. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  458. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  459. /* HP Pin */
  460. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  461. /* Front, Surround, CLFE Pins */
  462. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  463. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  464. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  465. /* Mono Pin */
  466. {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  467. /* Mic Pin */
  468. {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  469. /* Line, Aux, CD, Beep-In Pin */
  470. {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  471. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  472. {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  473. {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  474. {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  475. { } /* end */
  476. };
  477. static int patch_ad1986a(struct hda_codec *codec)
  478. {
  479. struct ad198x_spec *spec;
  480. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  481. if (spec == NULL)
  482. return -ENOMEM;
  483. init_MUTEX(&spec->amp_mutex);
  484. codec->spec = spec;
  485. spec->multiout.max_channels = 6;
  486. spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids);
  487. spec->multiout.dac_nids = ad1986a_dac_nids;
  488. spec->multiout.dig_out_nid = AD1986A_SPDIF_OUT;
  489. spec->num_adc_nids = 1;
  490. spec->adc_nids = ad1986a_adc_nids;
  491. spec->capsrc_nids = ad1986a_adc_nids;
  492. spec->input_mux = &ad1986a_capture_source;
  493. spec->num_mixers = 1;
  494. spec->mixers[0] = ad1986a_mixers;
  495. spec->num_init_verbs = 1;
  496. spec->init_verbs[0] = ad1986a_init_verbs;
  497. codec->patch_ops = ad198x_patch_ops;
  498. return 0;
  499. }
  500. /*
  501. * AD1983 specific
  502. */
  503. #define AD1983_SPDIF_OUT 0x02
  504. #define AD1983_DAC 0x03
  505. #define AD1983_ADC 0x04
  506. static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC };
  507. static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC };
  508. static struct hda_input_mux ad1983_capture_source = {
  509. .num_items = 4,
  510. .items = {
  511. { "Mic", 0x0 },
  512. { "Line", 0x1 },
  513. { "Mix", 0x2 },
  514. { "Mix Mono", 0x3 },
  515. },
  516. };
  517. /*
  518. * SPDIF playback route
  519. */
  520. static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
  521. {
  522. static char *texts[] = { "PCM", "ADC" };
  523. uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  524. uinfo->count = 1;
  525. uinfo->value.enumerated.items = 2;
  526. if (uinfo->value.enumerated.item > 1)
  527. uinfo->value.enumerated.item = 1;
  528. strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
  529. return 0;
  530. }
  531. static int ad1983_spdif_route_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  532. {
  533. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  534. struct ad198x_spec *spec = codec->spec;
  535. ucontrol->value.enumerated.item[0] = spec->spdif_route;
  536. return 0;
  537. }
  538. static int ad1983_spdif_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  539. {
  540. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  541. struct ad198x_spec *spec = codec->spec;
  542. if (spec->spdif_route != ucontrol->value.enumerated.item[0]) {
  543. spec->spdif_route = ucontrol->value.enumerated.item[0];
  544. snd_hda_codec_write(codec, spec->multiout.dig_out_nid, 0,
  545. AC_VERB_SET_CONNECT_SEL, spec->spdif_route);
  546. return 1;
  547. }
  548. return 0;
  549. }
  550. static struct snd_kcontrol_new ad1983_mixers[] = {
  551. HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
  552. HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
  553. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
  554. HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  555. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
  556. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
  557. HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
  558. HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
  559. HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
  560. HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
  561. HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
  562. HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
  563. HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x10, 1, 0x0, HDA_OUTPUT),
  564. HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x10, 1, 0x0, HDA_OUTPUT),
  565. HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT),
  566. HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
  567. HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
  568. {
  569. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  570. .name = "Capture Source",
  571. .info = ad198x_mux_enum_info,
  572. .get = ad198x_mux_enum_get,
  573. .put = ad198x_mux_enum_put,
  574. },
  575. {
  576. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  577. .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route",
  578. .info = ad1983_spdif_route_info,
  579. .get = ad1983_spdif_route_get,
  580. .put = ad1983_spdif_route_put,
  581. },
  582. { } /* end */
  583. };
  584. static struct hda_verb ad1983_init_verbs[] = {
  585. /* Front, HP, Mono; mute as default */
  586. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  587. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  588. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  589. /* Beep, PCM, Mic, Line-In: mute */
  590. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  591. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  592. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  593. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  594. /* Front, HP selectors; from Mix */
  595. {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
  596. {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
  597. /* Mono selector; from Mix */
  598. {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
  599. /* Mic selector; Mic */
  600. {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0},
  601. /* Line-in selector: Line-in */
  602. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0},
  603. /* Mic boost: 0dB */
  604. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  605. /* Record selector: mic */
  606. {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
  607. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  608. /* SPDIF route: PCM */
  609. {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
  610. /* Front Pin */
  611. {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  612. /* HP Pin */
  613. {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  614. /* Mono Pin */
  615. {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  616. /* Mic Pin */
  617. {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  618. /* Line Pin */
  619. {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  620. { } /* end */
  621. };
  622. static int patch_ad1983(struct hda_codec *codec)
  623. {
  624. struct ad198x_spec *spec;
  625. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  626. if (spec == NULL)
  627. return -ENOMEM;
  628. init_MUTEX(&spec->amp_mutex);
  629. codec->spec = spec;
  630. spec->multiout.max_channels = 2;
  631. spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids);
  632. spec->multiout.dac_nids = ad1983_dac_nids;
  633. spec->multiout.dig_out_nid = AD1983_SPDIF_OUT;
  634. spec->num_adc_nids = 1;
  635. spec->adc_nids = ad1983_adc_nids;
  636. spec->capsrc_nids = ad1983_adc_nids;
  637. spec->input_mux = &ad1983_capture_source;
  638. spec->num_mixers = 1;
  639. spec->mixers[0] = ad1983_mixers;
  640. spec->num_init_verbs = 1;
  641. spec->init_verbs[0] = ad1983_init_verbs;
  642. spec->spdif_route = 0;
  643. codec->patch_ops = ad198x_patch_ops;
  644. return 0;
  645. }
  646. /*
  647. * AD1981 HD specific
  648. */
  649. #define AD1981_SPDIF_OUT 0x02
  650. #define AD1981_DAC 0x03
  651. #define AD1981_ADC 0x04
  652. static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC };
  653. static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC };
  654. /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */
  655. static struct hda_input_mux ad1981_capture_source = {
  656. .num_items = 7,
  657. .items = {
  658. { "Front Mic", 0x0 },
  659. { "Line", 0x1 },
  660. { "Mix", 0x2 },
  661. { "Mix Mono", 0x3 },
  662. { "CD", 0x4 },
  663. { "Mic", 0x6 },
  664. { "Aux", 0x7 },
  665. },
  666. };
  667. static struct snd_kcontrol_new ad1981_mixers[] = {
  668. HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT),
  669. HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT),
  670. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT),
  671. HDA_CODEC_MUTE("Headphone Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  672. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x07, 1, 0x0, HDA_OUTPUT),
  673. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x07, 1, 0x0, HDA_OUTPUT),
  674. HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT),
  675. HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT),
  676. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT),
  677. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT),
  678. HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT),
  679. HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT),
  680. HDA_CODEC_VOLUME("Aux Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
  681. HDA_CODEC_MUTE("Aux Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  682. HDA_CODEC_VOLUME("Mic Playback Volume", 0x1c, 0x0, HDA_OUTPUT),
  683. HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT),
  684. HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
  685. HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
  686. HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
  687. HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x0d, 1, 0x0, HDA_OUTPUT),
  688. HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT),
  689. HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT),
  690. HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
  691. HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT),
  692. {
  693. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  694. .name = "Capture Source",
  695. .info = ad198x_mux_enum_info,
  696. .get = ad198x_mux_enum_get,
  697. .put = ad198x_mux_enum_put,
  698. },
  699. /* identical with AD1983 */
  700. {
  701. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  702. .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route",
  703. .info = ad1983_spdif_route_info,
  704. .get = ad1983_spdif_route_get,
  705. .put = ad1983_spdif_route_put,
  706. },
  707. { } /* end */
  708. };
  709. static struct hda_verb ad1981_init_verbs[] = {
  710. /* Front, HP, Mono; mute as default */
  711. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  712. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  713. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  714. /* Beep, PCM, Front Mic, Line, Rear Mic, Aux, CD-In: mute */
  715. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  716. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  717. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  718. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  719. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  720. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  721. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  722. /* Front, HP selectors; from Mix */
  723. {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
  724. {0x06, AC_VERB_SET_CONNECT_SEL, 0x01},
  725. /* Mono selector; from Mix */
  726. {0x0b, AC_VERB_SET_CONNECT_SEL, 0x03},
  727. /* Mic Mixer; select Front Mic */
  728. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  729. {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  730. /* Mic boost: 0dB */
  731. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  732. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  733. /* Record selector: Front mic */
  734. {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
  735. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  736. /* SPDIF route: PCM */
  737. {0x02, AC_VERB_SET_CONNECT_SEL, 0x0},
  738. /* Front Pin */
  739. {0x05, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  740. /* HP Pin */
  741. {0x06, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  742. /* Mono Pin */
  743. {0x07, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  744. /* Front & Rear Mic Pins */
  745. {0x08, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  746. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  747. /* Line Pin */
  748. {0x09, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  749. /* Digital Beep */
  750. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
  751. /* Line-Out as Input: disabled */
  752. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
  753. { } /* end */
  754. };
  755. static int patch_ad1981(struct hda_codec *codec)
  756. {
  757. struct ad198x_spec *spec;
  758. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  759. if (spec == NULL)
  760. return -ENOMEM;
  761. init_MUTEX(&spec->amp_mutex);
  762. codec->spec = spec;
  763. spec->multiout.max_channels = 2;
  764. spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids);
  765. spec->multiout.dac_nids = ad1981_dac_nids;
  766. spec->multiout.dig_out_nid = AD1981_SPDIF_OUT;
  767. spec->num_adc_nids = 1;
  768. spec->adc_nids = ad1981_adc_nids;
  769. spec->capsrc_nids = ad1981_adc_nids;
  770. spec->input_mux = &ad1981_capture_source;
  771. spec->num_mixers = 1;
  772. spec->mixers[0] = ad1981_mixers;
  773. spec->num_init_verbs = 1;
  774. spec->init_verbs[0] = ad1981_init_verbs;
  775. spec->spdif_route = 0;
  776. codec->patch_ops = ad198x_patch_ops;
  777. return 0;
  778. }
  779. /*
  780. * AD1988
  781. *
  782. * Output pins and routes
  783. *
  784. * Pin Mix Sel DAC (*)
  785. * port-A 0x11 (mute/hp) <- 0x22 <- 0x37 <- 03/04/06
  786. * port-B 0x14 (mute/hp) <- 0x2b <- 0x30 <- 03/04/06
  787. * port-C 0x15 (mute) <- 0x2c <- 0x31 <- 05/0a
  788. * port-D 0x12 (mute/hp) <- 0x29 <- 04
  789. * port-E 0x17 (mute/hp) <- 0x26 <- 0x32 <- 05/0a
  790. * port-F 0x16 (mute) <- 0x2a <- 06
  791. * port-G 0x24 (mute) <- 0x27 <- 05
  792. * port-H 0x25 (mute) <- 0x28 <- 0a
  793. * mono 0x13 (mute/amp)<- 0x1e <- 0x36 <- 03/04/06
  794. *
  795. * DAC0 = 03h, DAC1 = 04h, DAC2 = 05h, DAC3 = 06h, DAC4 = 0ah
  796. * (*) DAC2/3/4 are swapped to DAC3/4/2 on AD198A rev.2 due to a h/w bug.
  797. *
  798. * Input pins and routes
  799. *
  800. * pin boost mix input # / adc input #
  801. * port-A 0x11 -> 0x38 -> mix 2, ADC 0
  802. * port-B 0x14 -> 0x39 -> mix 0, ADC 1
  803. * port-C 0x15 -> 0x3a -> 33:0 - mix 1, ADC 2
  804. * port-D 0x12 -> 0x3d -> mix 3, ADC 8
  805. * port-E 0x17 -> 0x3c -> 34:0 - mix 4, ADC 4
  806. * port-F 0x16 -> 0x3b -> mix 5, ADC 3
  807. * port-G 0x24 -> N/A -> 33:1 - mix 1, 34:1 - mix 4, ADC 6
  808. * port-H 0x25 -> N/A -> 33:2 - mix 1, 34:2 - mix 4, ADC 7
  809. *
  810. *
  811. * DAC assignment
  812. * 6stack - front/surr/CLFE/side/opt DACs - 04/06/05/0a/03
  813. * 3stack - front/surr/CLFE/opt DACs - 04/05/0a/03
  814. *
  815. * Inputs of Analog Mix (0x20)
  816. * 0:Port-B (front mic)
  817. * 1:Port-C/G/H (line-in)
  818. * 2:Port-A
  819. * 3:Port-D (line-in/2)
  820. * 4:Port-E/G/H (mic-in)
  821. * 5:Port-F (mic2-in)
  822. * 6:CD
  823. * 7:Beep
  824. *
  825. * ADC selection
  826. * 0:Port-A
  827. * 1:Port-B (front mic-in)
  828. * 2:Port-C (line-in)
  829. * 3:Port-F (mic2-in)
  830. * 4:Port-E (mic-in)
  831. * 5:CD
  832. * 6:Port-G
  833. * 7:Port-H
  834. * 8:Port-D (line-in/2)
  835. * 9:Mix
  836. *
  837. * Proposed pin assignments by the datasheet
  838. *
  839. * 6-stack
  840. * Port-A front headphone
  841. * B front mic-in
  842. * C rear line-in
  843. * D rear front-out
  844. * E rear mic-in
  845. * F rear surround
  846. * G rear CLFE
  847. * H rear side
  848. *
  849. * 3-stack
  850. * Port-A front headphone
  851. * B front mic
  852. * C rear line-in/surround
  853. * D rear front-out
  854. * E rear mic-in/CLFE
  855. *
  856. * laptop
  857. * Port-A headphone
  858. * B mic-in
  859. * C docking station
  860. * D internal speaker (with EAPD)
  861. * E/F quad mic array
  862. */
  863. /* models */
  864. enum {
  865. AD1988_6STACK,
  866. AD1988_6STACK_DIG,
  867. AD1988_3STACK,
  868. AD1988_3STACK_DIG,
  869. AD1988_LAPTOP,
  870. AD1988_LAPTOP_DIG,
  871. AD1988_AUTO,
  872. AD1988_MODEL_LAST,
  873. };
  874. /* reivision id to check workarounds */
  875. #define AD1988A_REV2 0x100200
  876. /*
  877. * mixers
  878. */
  879. static hda_nid_t ad1988_6stack_dac_nids[4] = {
  880. 0x04, 0x06, 0x05, 0x0a
  881. };
  882. static hda_nid_t ad1988_3stack_dac_nids[3] = {
  883. 0x04, 0x05, 0x0a
  884. };
  885. /* for AD1988A revision-2, DAC2-4 are swapped */
  886. static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = {
  887. 0x04, 0x05, 0x0a, 0x06
  888. };
  889. static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = {
  890. 0x04, 0x0a, 0x06
  891. };
  892. static hda_nid_t ad1988_adc_nids[3] = {
  893. 0x08, 0x09, 0x0f
  894. };
  895. static hda_nid_t ad1988_capsrc_nids[3] = {
  896. 0x0c, 0x0d, 0x0e
  897. };
  898. #define AD1988_SPDIF_OUT 0x02
  899. #define AD1988_SPDIF_IN 0x07
  900. static struct hda_input_mux ad1988_6stack_capture_source = {
  901. .num_items = 5,
  902. .items = {
  903. { "Front Mic", 0x0 },
  904. { "Line", 0x1 },
  905. { "Mic", 0x4 },
  906. { "CD", 0x5 },
  907. { "Mix", 0x9 },
  908. },
  909. };
  910. static struct hda_input_mux ad1988_laptop_capture_source = {
  911. .num_items = 3,
  912. .items = {
  913. { "Mic/Line", 0x0 },
  914. { "CD", 0x5 },
  915. { "Mix", 0x9 },
  916. },
  917. };
  918. /*
  919. */
  920. static int ad198x_ch_mode_info(struct snd_kcontrol *kcontrol,
  921. struct snd_ctl_elem_info *uinfo)
  922. {
  923. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  924. struct ad198x_spec *spec = codec->spec;
  925. return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
  926. spec->num_channel_mode);
  927. }
  928. static int ad198x_ch_mode_get(struct snd_kcontrol *kcontrol,
  929. struct snd_ctl_elem_value *ucontrol)
  930. {
  931. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  932. struct ad198x_spec *spec = codec->spec;
  933. return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
  934. spec->num_channel_mode, spec->multiout.max_channels);
  935. }
  936. static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol,
  937. struct snd_ctl_elem_value *ucontrol)
  938. {
  939. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  940. struct ad198x_spec *spec = codec->spec;
  941. return snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
  942. spec->num_channel_mode, &spec->multiout.max_channels);
  943. }
  944. /*
  945. * EAPD control
  946. */
  947. static int ad1988_eapd_info(struct snd_kcontrol *kcontrol,
  948. struct snd_ctl_elem_info *uinfo)
  949. {
  950. uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
  951. uinfo->count = 1;
  952. uinfo->value.integer.min = 0;
  953. uinfo->value.integer.max = 1;
  954. return 0;
  955. }
  956. static int ad1988_eapd_get(struct snd_kcontrol *kcontrol,
  957. struct snd_ctl_elem_value *ucontrol)
  958. {
  959. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  960. struct ad198x_spec *spec = codec->spec;
  961. ucontrol->value.enumerated.item[0] = ! spec->cur_eapd;
  962. return 0;
  963. }
  964. static int ad1988_eapd_put(struct snd_kcontrol *kcontrol,
  965. struct snd_ctl_elem_value *ucontrol)
  966. {
  967. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  968. struct ad198x_spec *spec = codec->spec;
  969. unsigned int eapd;
  970. eapd = ! ucontrol->value.enumerated.item[0];
  971. if (eapd == spec->cur_eapd && ! codec->in_resume)
  972. return 0;
  973. spec->cur_eapd = eapd;
  974. snd_hda_codec_write(codec, 0x12 /* port-D */,
  975. 0, AC_VERB_SET_EAPD_BTLENABLE,
  976. eapd ? 0x02 : 0x00);
  977. return 0;
  978. }
  979. /* 6-stack mode */
  980. static struct snd_kcontrol_new ad1988_6stack_mixers1[] = {
  981. HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
  982. HDA_CODEC_VOLUME("Surround Playback Volume", 0x06, 0x0, HDA_OUTPUT),
  983. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
  984. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
  985. HDA_CODEC_VOLUME("Side Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
  986. };
  987. static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = {
  988. HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
  989. HDA_CODEC_VOLUME("Surround Playback Volume", 0x05, 0x0, HDA_OUTPUT),
  990. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
  991. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0a, 2, 0x0, HDA_OUTPUT),
  992. HDA_CODEC_VOLUME("Side Playback Volume", 0x06, 0x0, HDA_OUTPUT),
  993. };
  994. static struct snd_kcontrol_new ad1988_6stack_mixers2[] = {
  995. HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
  996. HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT),
  997. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT),
  998. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x27, 2, 2, HDA_INPUT),
  999. HDA_BIND_MUTE("Side Playback Switch", 0x28, 2, HDA_INPUT),
  1000. HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
  1001. HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
  1002. HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
  1003. HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
  1004. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
  1005. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
  1006. HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
  1007. HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
  1008. HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
  1009. HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
  1010. HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
  1011. HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
  1012. HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
  1013. HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  1014. HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
  1015. HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
  1016. { } /* end */
  1017. };
  1018. /* 3-stack mode */
  1019. static struct snd_kcontrol_new ad1988_3stack_mixers1[] = {
  1020. HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
  1021. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
  1022. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
  1023. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
  1024. };
  1025. static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = {
  1026. HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
  1027. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
  1028. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT),
  1029. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x06, 2, 0x0, HDA_OUTPUT),
  1030. };
  1031. static struct snd_kcontrol_new ad1988_3stack_mixers2[] = {
  1032. HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
  1033. HDA_BIND_MUTE("Surround Playback Switch", 0x2c, 2, HDA_INPUT),
  1034. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x26, 1, 2, HDA_INPUT),
  1035. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x26, 2, 2, HDA_INPUT),
  1036. HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
  1037. HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
  1038. HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
  1039. HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
  1040. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
  1041. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
  1042. HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
  1043. HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
  1044. HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
  1045. HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
  1046. HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
  1047. HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
  1048. HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
  1049. HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  1050. HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT),
  1051. HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT),
  1052. {
  1053. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1054. .name = "Channel Mode",
  1055. .info = ad198x_ch_mode_info,
  1056. .get = ad198x_ch_mode_get,
  1057. .put = ad198x_ch_mode_put,
  1058. },
  1059. { } /* end */
  1060. };
  1061. /* laptop mode */
  1062. static struct snd_kcontrol_new ad1988_laptop_mixers[] = {
  1063. HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT),
  1064. HDA_CODEC_MUTE("PCM Playback Switch", 0x29, 0x0, HDA_INPUT),
  1065. HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
  1066. HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
  1067. HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
  1068. HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
  1069. HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
  1070. HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
  1071. HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
  1072. HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT),
  1073. HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT),
  1074. HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
  1075. HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  1076. HDA_CODEC_VOLUME("Mic Boost", 0x39, 0x0, HDA_OUTPUT),
  1077. {
  1078. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1079. .name = "External Amplifier",
  1080. .info = ad1988_eapd_info,
  1081. .get = ad1988_eapd_get,
  1082. .put = ad1988_eapd_put,
  1083. },
  1084. { } /* end */
  1085. };
  1086. /* capture */
  1087. static struct snd_kcontrol_new ad1988_capture_mixers[] = {
  1088. HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
  1089. HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
  1090. HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
  1091. HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
  1092. HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x0e, 0x0, HDA_OUTPUT),
  1093. HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x0e, 0x0, HDA_OUTPUT),
  1094. {
  1095. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1096. /* The multiple "Capture Source" controls confuse alsamixer
  1097. * So call somewhat different..
  1098. * FIXME: the controls appear in the "playback" view!
  1099. */
  1100. /* .name = "Capture Source", */
  1101. .name = "Input Source",
  1102. .count = 3,
  1103. .info = ad198x_mux_enum_info,
  1104. .get = ad198x_mux_enum_get,
  1105. .put = ad198x_mux_enum_put,
  1106. },
  1107. { } /* end */
  1108. };
  1109. static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol,
  1110. struct snd_ctl_elem_info *uinfo)
  1111. {
  1112. static char *texts[] = {
  1113. "PCM", "ADC1", "ADC2", "ADC3"
  1114. };
  1115. uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  1116. uinfo->count = 1;
  1117. uinfo->value.enumerated.items = 4;
  1118. if (uinfo->value.enumerated.item >= 4)
  1119. uinfo->value.enumerated.item = 3;
  1120. strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
  1121. return 0;
  1122. }
  1123. static int ad1988_spdif_playback_source_get(struct snd_kcontrol *kcontrol,
  1124. struct snd_ctl_elem_value *ucontrol)
  1125. {
  1126. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  1127. unsigned int sel;
  1128. sel = snd_hda_codec_read(codec, 0x02, 0, AC_VERB_GET_CONNECT_SEL, 0);
  1129. if (sel > 0) {
  1130. sel = snd_hda_codec_read(codec, 0x0b, 0, AC_VERB_GET_CONNECT_SEL, 0);
  1131. if (sel <= 3)
  1132. sel++;
  1133. else
  1134. sel = 0;
  1135. }
  1136. ucontrol->value.enumerated.item[0] = sel;
  1137. return 0;
  1138. }
  1139. static int ad1988_spdif_playback_source_put(struct snd_kcontrol *kcontrol,
  1140. struct snd_ctl_elem_value *ucontrol)
  1141. {
  1142. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  1143. unsigned int sel;
  1144. int change;
  1145. sel = snd_hda_codec_read(codec, 0x02, 0, AC_VERB_GET_CONNECT_SEL, 0);
  1146. if (! ucontrol->value.enumerated.item[0]) {
  1147. change = sel != 0;
  1148. if (change)
  1149. snd_hda_codec_write(codec, 0x02, 0, AC_VERB_SET_CONNECT_SEL, 0);
  1150. } else {
  1151. change = sel == 0;
  1152. if (change)
  1153. snd_hda_codec_write(codec, 0x02, 0, AC_VERB_SET_CONNECT_SEL, 1);
  1154. sel = snd_hda_codec_read(codec, 0x0b, 0, AC_VERB_GET_CONNECT_SEL, 0) + 1;
  1155. change |= sel == ucontrol->value.enumerated.item[0];
  1156. if (change)
  1157. snd_hda_codec_write(codec, 0x02, 0, AC_VERB_SET_CONNECT_SEL,
  1158. ucontrol->value.enumerated.item[0] - 1);
  1159. }
  1160. return change;
  1161. }
  1162. static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = {
  1163. HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
  1164. {
  1165. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1166. .name = "IEC958 Playback Source",
  1167. .info = ad1988_spdif_playback_source_info,
  1168. .get = ad1988_spdif_playback_source_get,
  1169. .put = ad1988_spdif_playback_source_put,
  1170. },
  1171. { } /* end */
  1172. };
  1173. static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = {
  1174. HDA_CODEC_VOLUME("IEC958 Capture Volume", 0x1c, 0x0, HDA_INPUT),
  1175. { } /* end */
  1176. };
  1177. /*
  1178. * initialization verbs
  1179. */
  1180. /*
  1181. * for 6-stack (+dig)
  1182. */
  1183. static struct hda_verb ad1988_6stack_init_verbs[] = {
  1184. /* Front, Surround, CLFE, side DAC; unmute as default */
  1185. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1186. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1187. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1188. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1189. /* Port-A front headphon path */
  1190. {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
  1191. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1192. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1193. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1194. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  1195. /* Port-D line-out path */
  1196. {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1197. {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1198. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1199. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1200. /* Port-F surround path */
  1201. {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1202. {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1203. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1204. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1205. /* Port-G CLFE path */
  1206. {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1207. {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1208. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1209. {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1210. /* Port-H side path */
  1211. {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1212. {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1213. {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1214. {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1215. /* Mono out path */
  1216. {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
  1217. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1218. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1219. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1220. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
  1221. /* Port-B front mic-in path */
  1222. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1223. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  1224. {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1225. /* Port-C line-in path */
  1226. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1227. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  1228. {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1229. {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
  1230. /* Port-E mic-in path */
  1231. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1232. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  1233. {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1234. {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
  1235. { }
  1236. };
  1237. static struct hda_verb ad1988_capture_init_verbs[] = {
  1238. /* mute analog mix */
  1239. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1240. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1241. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  1242. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  1243. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  1244. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  1245. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  1246. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  1247. /* select ADCs - front-mic */
  1248. {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
  1249. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
  1250. {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
  1251. /* ADCs; muted */
  1252. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1253. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1254. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1255. { }
  1256. };
  1257. static struct hda_verb ad1988_spdif_init_verbs[] = {
  1258. /* SPDIF out sel */
  1259. {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */
  1260. {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0}, /* ADC1 */
  1261. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  1262. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  1263. /* SPDIF out pin */
  1264. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
  1265. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x17}, /* 0dB */
  1266. { }
  1267. };
  1268. /*
  1269. * verbs for 3stack (+dig)
  1270. */
  1271. static struct hda_verb ad1988_3stack_ch2_init[] = {
  1272. /* set port-C to line-in */
  1273. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1274. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  1275. /* set port-E to mic-in */
  1276. { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1277. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  1278. { } /* end */
  1279. };
  1280. static struct hda_verb ad1988_3stack_ch6_init[] = {
  1281. /* set port-C to surround out */
  1282. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1283. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1284. /* set port-E to CLFE out */
  1285. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1286. { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1287. { } /* end */
  1288. };
  1289. static struct hda_channel_mode ad1988_3stack_modes[2] = {
  1290. { 2, ad1988_3stack_ch2_init },
  1291. { 6, ad1988_3stack_ch6_init },
  1292. };
  1293. static struct hda_verb ad1988_3stack_init_verbs[] = {
  1294. /* Front, Surround, CLFE, side DAC; unmute as default */
  1295. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1296. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1297. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1298. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1299. /* Port-A front headphon path */
  1300. {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
  1301. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1302. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1303. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1304. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  1305. /* Port-D line-out path */
  1306. {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1307. {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1308. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1309. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1310. /* Mono out path */
  1311. {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
  1312. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1313. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1314. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1315. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
  1316. /* Port-B front mic-in path */
  1317. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1318. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  1319. {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1320. /* Port-C line-in/surround path - 6ch mode as default */
  1321. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1322. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1323. {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1324. {0x31, AC_VERB_SET_CONNECT_SEL, 0x0}, /* output sel: DAC 0x05 */
  1325. {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
  1326. /* Port-E mic-in/CLFE path - 6ch mode as default */
  1327. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1328. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1329. {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1330. {0x32, AC_VERB_SET_CONNECT_SEL, 0x1}, /* output sel: DAC 0x0a */
  1331. {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
  1332. /* mute analog mix */
  1333. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1334. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1335. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  1336. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  1337. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  1338. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  1339. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  1340. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  1341. /* select ADCs - front-mic */
  1342. {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
  1343. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
  1344. {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
  1345. /* ADCs; muted */
  1346. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1347. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1348. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1349. { }
  1350. };
  1351. /*
  1352. * verbs for laptop mode (+dig)
  1353. */
  1354. static struct hda_verb ad1988_laptop_hp_on[] = {
  1355. /* unmute port-A and mute port-D */
  1356. { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1357. { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1358. { } /* end */
  1359. };
  1360. static struct hda_verb ad1988_laptop_hp_off[] = {
  1361. /* mute port-A and unmute port-D */
  1362. { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1363. { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1364. { } /* end */
  1365. };
  1366. #define AD1988_HP_EVENT 0x01
  1367. static struct hda_verb ad1988_laptop_init_verbs[] = {
  1368. /* Front, Surround, CLFE, side DAC; unmute as default */
  1369. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1370. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1371. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1372. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1373. /* Port-A front headphon path */
  1374. {0x37, AC_VERB_SET_CONNECT_SEL, 0x01}, /* DAC1:04h */
  1375. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1376. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1377. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1378. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  1379. /* unsolicited event for pin-sense */
  1380. {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1988_HP_EVENT },
  1381. /* Port-D line-out path + EAPD */
  1382. {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1383. {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1384. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1385. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1386. {0x12, AC_VERB_SET_EAPD_BTLENABLE, 0x00}, /* EAPD-off */
  1387. /* Mono out path */
  1388. {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
  1389. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1390. {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1391. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1392. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
  1393. /* Port-B mic-in path */
  1394. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1395. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  1396. {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1397. /* Port-C docking station - try to output */
  1398. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1399. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1400. {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  1401. {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
  1402. /* mute analog mix */
  1403. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  1404. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  1405. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  1406. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  1407. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  1408. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  1409. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  1410. {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  1411. /* select ADCs - mic */
  1412. {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
  1413. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
  1414. {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
  1415. /* ADCs; muted */
  1416. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1417. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1418. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  1419. { }
  1420. };
  1421. static void ad1988_laptop_unsol_event(struct hda_codec *codec, unsigned int res)
  1422. {
  1423. if ((res >> 26) != AD1988_HP_EVENT)
  1424. return;
  1425. if (snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0) & (1 << 31))
  1426. snd_hda_sequence_write(codec, ad1988_laptop_hp_on);
  1427. else
  1428. snd_hda_sequence_write(codec, ad1988_laptop_hp_off);
  1429. }
  1430. /*
  1431. * Automatic parse of I/O pins from the BIOS configuration
  1432. */
  1433. #define NUM_CONTROL_ALLOC 32
  1434. #define NUM_VERB_ALLOC 32
  1435. enum {
  1436. AD_CTL_WIDGET_VOL,
  1437. AD_CTL_WIDGET_MUTE,
  1438. AD_CTL_BIND_MUTE,
  1439. };
  1440. static struct snd_kcontrol_new ad1988_control_templates[] = {
  1441. HDA_CODEC_VOLUME(NULL, 0, 0, 0),
  1442. HDA_CODEC_MUTE(NULL, 0, 0, 0),
  1443. HDA_BIND_MUTE(NULL, 0, 0, 0),
  1444. };
  1445. /* add dynamic controls */
  1446. static int add_control(struct ad198x_spec *spec, int type, const char *name,
  1447. unsigned long val)
  1448. {
  1449. struct snd_kcontrol_new *knew;
  1450. if (spec->num_kctl_used >= spec->num_kctl_alloc) {
  1451. int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
  1452. knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
  1453. if (! knew)
  1454. return -ENOMEM;
  1455. if (spec->kctl_alloc) {
  1456. memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
  1457. kfree(spec->kctl_alloc);
  1458. }
  1459. spec->kctl_alloc = knew;
  1460. spec->num_kctl_alloc = num;
  1461. }
  1462. knew = &spec->kctl_alloc[spec->num_kctl_used];
  1463. *knew = ad1988_control_templates[type];
  1464. knew->name = kstrdup(name, GFP_KERNEL);
  1465. if (! knew->name)
  1466. return -ENOMEM;
  1467. knew->private_value = val;
  1468. spec->num_kctl_used++;
  1469. return 0;
  1470. }
  1471. #define AD1988_PIN_CD_NID 0x18
  1472. #define AD1988_PIN_BEEP_NID 0x10
  1473. static hda_nid_t ad1988_mixer_nids[8] = {
  1474. /* A B C D E F G H */
  1475. 0x22, 0x2b, 0x2c, 0x29, 0x26, 0x2a, 0x27, 0x28
  1476. };
  1477. static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx)
  1478. {
  1479. static hda_nid_t idx_to_dac[8] = {
  1480. /* A B C D E F G H */
  1481. 0x04, 0x06, 0x05, 0x04, 0x0a, 0x06, 0x05, 0x0a
  1482. };
  1483. static hda_nid_t idx_to_dac_rev2[8] = {
  1484. /* A B C D E F G H */
  1485. 0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06
  1486. };
  1487. if (codec->revision_id == AD1988A_REV2)
  1488. return idx_to_dac_rev2[idx];
  1489. else
  1490. return idx_to_dac[idx];
  1491. }
  1492. static hda_nid_t ad1988_boost_nids[8] = {
  1493. 0x38, 0x39, 0x3a, 0x3d, 0x3c, 0x3b, 0, 0
  1494. };
  1495. static int ad1988_pin_idx(hda_nid_t nid)
  1496. {
  1497. static hda_nid_t ad1988_io_pins[8] = {
  1498. 0x11, 0x14, 0x15, 0x12, 0x17, 0x16, 0x24, 0x25
  1499. };
  1500. int i;
  1501. for (i = 0; i < ARRAY_SIZE(ad1988_io_pins); i++)
  1502. if (ad1988_io_pins[i] == nid)
  1503. return i;
  1504. return 0; /* should be -1 */
  1505. }
  1506. static int ad1988_pin_to_loopback_idx(hda_nid_t nid)
  1507. {
  1508. static int loopback_idx[8] = {
  1509. 2, 0, 1, 3, 4, 5, 1, 4
  1510. };
  1511. switch (nid) {
  1512. case AD1988_PIN_CD_NID:
  1513. return 6;
  1514. default:
  1515. return loopback_idx[ad1988_pin_idx(nid)];
  1516. }
  1517. }
  1518. static int ad1988_pin_to_adc_idx(hda_nid_t nid)
  1519. {
  1520. static int adc_idx[8] = {
  1521. 0, 1, 2, 8, 4, 3, 6, 7
  1522. };
  1523. switch (nid) {
  1524. case AD1988_PIN_CD_NID:
  1525. return 5;
  1526. default:
  1527. return adc_idx[ad1988_pin_idx(nid)];
  1528. }
  1529. }
  1530. /* fill in the dac_nids table from the parsed pin configuration */
  1531. static int ad1988_auto_fill_dac_nids(struct hda_codec *codec,
  1532. const struct auto_pin_cfg *cfg)
  1533. {
  1534. struct ad198x_spec *spec = codec->spec;
  1535. int i, idx;
  1536. spec->multiout.dac_nids = spec->private_dac_nids;
  1537. /* check the pins hardwired to audio widget */
  1538. for (i = 0; i < cfg->line_outs; i++) {
  1539. idx = ad1988_pin_idx(cfg->line_out_pins[i]);
  1540. spec->multiout.dac_nids[i] = ad1988_idx_to_dac(codec, idx);
  1541. }
  1542. spec->multiout.num_dacs = cfg->line_outs;
  1543. return 0;
  1544. }
  1545. /* add playback controls from the parsed DAC table */
  1546. static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec,
  1547. const struct auto_pin_cfg *cfg)
  1548. {
  1549. char name[32];
  1550. static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" };
  1551. hda_nid_t nid;
  1552. int i, err;
  1553. for (i = 0; i < cfg->line_outs; i++) {
  1554. hda_nid_t dac = spec->multiout.dac_nids[i];
  1555. if (! dac)
  1556. continue;
  1557. nid = ad1988_mixer_nids[ad1988_pin_idx(cfg->line_out_pins[i])];
  1558. if (i == 2) {
  1559. /* Center/LFE */
  1560. err = add_control(spec, AD_CTL_WIDGET_VOL,
  1561. "Center Playback Volume",
  1562. HDA_COMPOSE_AMP_VAL(dac, 1, 0, HDA_OUTPUT));
  1563. if (err < 0)
  1564. return err;
  1565. err = add_control(spec, AD_CTL_WIDGET_VOL,
  1566. "LFE Playback Volume",
  1567. HDA_COMPOSE_AMP_VAL(dac, 2, 0, HDA_OUTPUT));
  1568. if (err < 0)
  1569. return err;
  1570. err = add_control(spec, AD_CTL_BIND_MUTE,
  1571. "Center Playback Switch",
  1572. HDA_COMPOSE_AMP_VAL(nid, 1, 2, HDA_INPUT));
  1573. if (err < 0)
  1574. return err;
  1575. err = add_control(spec, AD_CTL_BIND_MUTE,
  1576. "LFE Playback Switch",
  1577. HDA_COMPOSE_AMP_VAL(nid, 2, 2, HDA_INPUT));
  1578. if (err < 0)
  1579. return err;
  1580. } else {
  1581. sprintf(name, "%s Playback Volume", chname[i]);
  1582. err = add_control(spec, AD_CTL_WIDGET_VOL, name,
  1583. HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT));
  1584. if (err < 0)
  1585. return err;
  1586. sprintf(name, "%s Playback Switch", chname[i]);
  1587. err = add_control(spec, AD_CTL_BIND_MUTE, name,
  1588. HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
  1589. if (err < 0)
  1590. return err;
  1591. }
  1592. }
  1593. return 0;
  1594. }
  1595. /* add playback controls for speaker and HP outputs */
  1596. static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
  1597. const char *pfx)
  1598. {
  1599. struct ad198x_spec *spec = codec->spec;
  1600. hda_nid_t nid;
  1601. int idx, err;
  1602. char name[32];
  1603. if (! pin)
  1604. return 0;
  1605. idx = ad1988_pin_idx(pin);
  1606. nid = ad1988_idx_to_dac(codec, idx);
  1607. if (! spec->multiout.dac_nids[0]) {
  1608. /* use this as the primary output */
  1609. spec->multiout.dac_nids[0] = nid;
  1610. if (! spec->multiout.num_dacs)
  1611. spec->multiout.num_dacs = 1;
  1612. } else
  1613. /* specify the DAC as the extra output */
  1614. spec->multiout.hp_nid = nid;
  1615. /* control HP volume/switch on the output mixer amp */
  1616. sprintf(name, "%s Playback Volume", pfx);
  1617. if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
  1618. HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)
  1619. return err;
  1620. nid = ad1988_mixer_nids[idx];
  1621. sprintf(name, "%s Playback Switch", pfx);
  1622. if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,
  1623. HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT))) < 0)
  1624. return err;
  1625. return 0;
  1626. }
  1627. /* create input playback/capture controls for the given pin */
  1628. static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin,
  1629. const char *ctlname, int boost)
  1630. {
  1631. char name[32];
  1632. int err, idx;
  1633. sprintf(name, "%s Playback Volume", ctlname);
  1634. idx = ad1988_pin_to_loopback_idx(pin);
  1635. if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
  1636. HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
  1637. return err;
  1638. sprintf(name, "%s Playback Switch", ctlname);
  1639. if ((err = add_control(spec, AD_CTL_WIDGET_MUTE, name,
  1640. HDA_COMPOSE_AMP_VAL(0x20, 3, idx, HDA_INPUT))) < 0)
  1641. return err;
  1642. if (boost) {
  1643. hda_nid_t bnid;
  1644. idx = ad1988_pin_idx(pin);
  1645. bnid = ad1988_boost_nids[idx];
  1646. if (bnid) {
  1647. sprintf(name, "%s Boost", ctlname);
  1648. return add_control(spec, AD_CTL_WIDGET_VOL, name,
  1649. HDA_COMPOSE_AMP_VAL(bnid, 3, idx, HDA_OUTPUT));
  1650. }
  1651. }
  1652. return 0;
  1653. }
  1654. /* create playback/capture controls for input pins */
  1655. static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec,
  1656. const struct auto_pin_cfg *cfg)
  1657. {
  1658. struct hda_input_mux *imux = &spec->private_imux;
  1659. int i, err;
  1660. for (i = 0; i < AUTO_PIN_LAST; i++) {
  1661. err = new_analog_input(spec, cfg->input_pins[i],
  1662. auto_pin_cfg_labels[i],
  1663. i <= AUTO_PIN_FRONT_MIC);
  1664. if (err < 0)
  1665. return err;
  1666. imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
  1667. imux->items[imux->num_items].index = ad1988_pin_to_adc_idx(cfg->input_pins[i]);
  1668. imux->num_items++;
  1669. }
  1670. imux->items[imux->num_items].label = "Mix";
  1671. imux->items[imux->num_items].index = 9;
  1672. imux->num_items++;
  1673. if ((err = add_control(spec, AD_CTL_WIDGET_VOL,
  1674. "Analog Mix Playback Volume",
  1675. HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
  1676. return err;
  1677. if ((err = add_control(spec, AD_CTL_WIDGET_MUTE,
  1678. "Analog Mix Playback Switch",
  1679. HDA_COMPOSE_AMP_VAL(0x21, 3, 0x0, HDA_OUTPUT))) < 0)
  1680. return err;
  1681. return 0;
  1682. }
  1683. static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
  1684. hda_nid_t nid, int pin_type,
  1685. int dac_idx)
  1686. {
  1687. /* set as output */
  1688. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
  1689. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
  1690. switch (nid) {
  1691. case 0x11: /* port-A - DAC 04 */
  1692. snd_hda_codec_write(codec, 0x37, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
  1693. break;
  1694. case 0x14: /* port-B - DAC 06 */
  1695. snd_hda_codec_write(codec, 0x30, 0, AC_VERB_SET_CONNECT_SEL, 0x02);
  1696. break;
  1697. case 0x15: /* port-C - DAC 05 */
  1698. snd_hda_codec_write(codec, 0x31, 0, AC_VERB_SET_CONNECT_SEL, 0x00);
  1699. break;
  1700. case 0x17: /* port-E - DAC 0a */
  1701. snd_hda_codec_write(codec, 0x32, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
  1702. break;
  1703. case 0x13: /* mono - DAC 04 */
  1704. snd_hda_codec_write(codec, 0x36, 0, AC_VERB_SET_CONNECT_SEL, 0x01);
  1705. break;
  1706. }
  1707. }
  1708. static void ad1988_auto_init_multi_out(struct hda_codec *codec)
  1709. {
  1710. struct ad198x_spec *spec = codec->spec;
  1711. int i;
  1712. for (i = 0; i < spec->autocfg.line_outs; i++) {
  1713. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  1714. ad1988_auto_set_output_and_unmute(codec, nid, PIN_OUT, i);
  1715. }
  1716. }
  1717. static void ad1988_auto_init_extra_out(struct hda_codec *codec)
  1718. {
  1719. struct ad198x_spec *spec = codec->spec;
  1720. hda_nid_t pin;
  1721. pin = spec->autocfg.speaker_pin;
  1722. if (pin) /* connect to front */
  1723. ad1988_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
  1724. pin = spec->autocfg.hp_pin;
  1725. if (pin) /* connect to front */
  1726. ad1988_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
  1727. }
  1728. static void ad1988_auto_init_analog_input(struct hda_codec *codec)
  1729. {
  1730. struct ad198x_spec *spec = codec->spec;
  1731. int i, idx;
  1732. for (i = 0; i < AUTO_PIN_LAST; i++) {
  1733. hda_nid_t nid = spec->autocfg.input_pins[i];
  1734. if (! nid)
  1735. continue;
  1736. switch (nid) {
  1737. case 0x15: /* port-C */
  1738. snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
  1739. break;
  1740. case 0x17: /* port-E */
  1741. snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
  1742. break;
  1743. }
  1744. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  1745. i <= AUTO_PIN_FRONT_MIC ? PIN_VREF80 : PIN_IN);
  1746. if (nid != AD1988_PIN_CD_NID)
  1747. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
  1748. AMP_OUT_MUTE);
  1749. idx = ad1988_pin_idx(nid);
  1750. if (ad1988_boost_nids[idx])
  1751. snd_hda_codec_write(codec, ad1988_boost_nids[idx], 0,
  1752. AC_VERB_SET_AMP_GAIN_MUTE,
  1753. AMP_OUT_ZERO);
  1754. }
  1755. }
  1756. /* parse the BIOS configuration and set up the alc_spec */
  1757. /* return 1 if successful, 0 if the proper config is not found, or a negative error code */
  1758. static int ad1988_parse_auto_config(struct hda_codec *codec)
  1759. {
  1760. struct ad198x_spec *spec = codec->spec;
  1761. int err;
  1762. if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
  1763. return err;
  1764. if ((err = ad1988_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
  1765. return err;
  1766. if (! spec->autocfg.line_outs && ! spec->autocfg.speaker_pin &&
  1767. ! spec->autocfg.hp_pin)
  1768. return 0; /* can't find valid BIOS pin config */
  1769. if ((err = ad1988_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
  1770. (err = ad1988_auto_create_extra_out(codec, spec->autocfg.speaker_pin,
  1771. "Speaker")) < 0 ||
  1772. (err = ad1988_auto_create_extra_out(codec, spec->autocfg.speaker_pin,
  1773. "Headphone")) < 0 ||
  1774. (err = ad1988_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0)
  1775. return err;
  1776. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  1777. if (spec->autocfg.dig_out_pin)
  1778. spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
  1779. if (spec->autocfg.dig_in_pin)
  1780. spec->dig_in_nid = AD1988_SPDIF_IN;
  1781. if (spec->kctl_alloc)
  1782. spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
  1783. spec->init_verbs[spec->num_init_verbs++] = ad1988_6stack_init_verbs;
  1784. spec->input_mux = &spec->private_imux;
  1785. return 1;
  1786. }
  1787. /* init callback for auto-configuration model -- overriding the default init */
  1788. static int ad1988_auto_init(struct hda_codec *codec)
  1789. {
  1790. ad198x_init(codec);
  1791. ad1988_auto_init_multi_out(codec);
  1792. ad1988_auto_init_extra_out(codec);
  1793. ad1988_auto_init_analog_input(codec);
  1794. return 0;
  1795. }
  1796. /*
  1797. */
  1798. static struct hda_board_config ad1988_cfg_tbl[] = {
  1799. { .modelname = "6stack", .config = AD1988_6STACK },
  1800. { .modelname = "6stack-dig", .config = AD1988_6STACK_DIG },
  1801. { .modelname = "3stack", .config = AD1988_3STACK },
  1802. { .modelname = "3stack-dig", .config = AD1988_3STACK_DIG },
  1803. { .modelname = "laptop", .config = AD1988_LAPTOP },
  1804. { .modelname = "laptop-dig", .config = AD1988_LAPTOP_DIG },
  1805. { .modelname = "auto", .config = AD1988_AUTO },
  1806. {}
  1807. };
  1808. static int patch_ad1988(struct hda_codec *codec)
  1809. {
  1810. struct ad198x_spec *spec;
  1811. int board_config;
  1812. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  1813. if (spec == NULL)
  1814. return -ENOMEM;
  1815. init_MUTEX(&spec->amp_mutex);
  1816. codec->spec = spec;
  1817. if (codec->revision_id == AD1988A_REV2)
  1818. snd_printk(KERN_INFO "patch_analog: AD1988A rev.2 is detected, enable workarounds\n");
  1819. board_config = snd_hda_check_board_config(codec, ad1988_cfg_tbl);
  1820. if (board_config < 0 || board_config >= AD1988_MODEL_LAST) {
  1821. printk(KERN_INFO "hda_codec: Unknown model for AD1988, trying auto-probe from BIOS...\n");
  1822. board_config = AD1988_AUTO;
  1823. }
  1824. if (board_config == AD1988_AUTO) {
  1825. /* automatic parse from the BIOS config */
  1826. int err = ad1988_parse_auto_config(codec);
  1827. if (err < 0) {
  1828. ad198x_free(codec);
  1829. return err;
  1830. } else if (! err) {
  1831. printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using 6-stack mode...\n");
  1832. board_config = AD1988_6STACK;
  1833. }
  1834. }
  1835. switch (board_config) {
  1836. case AD1988_6STACK:
  1837. case AD1988_6STACK_DIG:
  1838. spec->multiout.max_channels = 8;
  1839. spec->multiout.num_dacs = 4;
  1840. if (codec->revision_id == AD1988A_REV2)
  1841. spec->multiout.dac_nids = ad1988_6stack_dac_nids_rev2;
  1842. else
  1843. spec->multiout.dac_nids = ad1988_6stack_dac_nids;
  1844. spec->input_mux = &ad1988_6stack_capture_source;
  1845. spec->num_mixers = 2;
  1846. if (codec->revision_id == AD1988A_REV2)
  1847. spec->mixers[0] = ad1988_6stack_mixers1_rev2;
  1848. else
  1849. spec->mixers[0] = ad1988_6stack_mixers1;
  1850. spec->mixers[1] = ad1988_6stack_mixers2;
  1851. spec->num_init_verbs = 1;
  1852. spec->init_verbs[0] = ad1988_6stack_init_verbs;
  1853. if (board_config == AD1988_6STACK_DIG) {
  1854. spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
  1855. spec->dig_in_nid = AD1988_SPDIF_IN;
  1856. }
  1857. break;
  1858. case AD1988_3STACK:
  1859. case AD1988_3STACK_DIG:
  1860. spec->multiout.max_channels = 6;
  1861. spec->multiout.num_dacs = 3;
  1862. if (codec->revision_id == AD1988A_REV2)
  1863. spec->multiout.dac_nids = ad1988_3stack_dac_nids_rev2;
  1864. else
  1865. spec->multiout.dac_nids = ad1988_3stack_dac_nids;
  1866. spec->input_mux = &ad1988_6stack_capture_source;
  1867. spec->channel_mode = ad1988_3stack_modes;
  1868. spec->num_channel_mode = ARRAY_SIZE(ad1988_3stack_modes);
  1869. spec->num_mixers = 2;
  1870. if (codec->revision_id == AD1988A_REV2)
  1871. spec->mixers[0] = ad1988_3stack_mixers1_rev2;
  1872. else
  1873. spec->mixers[0] = ad1988_3stack_mixers1;
  1874. spec->mixers[1] = ad1988_3stack_mixers2;
  1875. spec->num_init_verbs = 1;
  1876. spec->init_verbs[0] = ad1988_3stack_init_verbs;
  1877. if (board_config == AD1988_3STACK_DIG)
  1878. spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
  1879. break;
  1880. case AD1988_LAPTOP:
  1881. case AD1988_LAPTOP_DIG:
  1882. spec->multiout.max_channels = 2;
  1883. spec->multiout.num_dacs = 1;
  1884. spec->multiout.dac_nids = ad1988_3stack_dac_nids;
  1885. spec->input_mux = &ad1988_laptop_capture_source;
  1886. spec->num_mixers = 1;
  1887. spec->mixers[0] = ad1988_laptop_mixers;
  1888. spec->num_init_verbs = 1;
  1889. spec->init_verbs[0] = ad1988_laptop_init_verbs;
  1890. if (board_config == AD1988_LAPTOP_DIG)
  1891. spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
  1892. break;
  1893. }
  1894. spec->num_adc_nids = ARRAY_SIZE(ad1988_adc_nids);
  1895. spec->adc_nids = ad1988_adc_nids;
  1896. spec->capsrc_nids = ad1988_capsrc_nids;
  1897. spec->mixers[spec->num_mixers++] = ad1988_capture_mixers;
  1898. spec->init_verbs[spec->num_init_verbs++] = ad1988_capture_init_verbs;
  1899. if (spec->multiout.dig_out_nid) {
  1900. spec->mixers[spec->num_mixers++] = ad1988_spdif_out_mixers;
  1901. spec->init_verbs[spec->num_init_verbs++] = ad1988_spdif_init_verbs;
  1902. }
  1903. if (spec->dig_in_nid)
  1904. spec->mixers[spec->num_mixers++] = ad1988_spdif_in_mixers;
  1905. codec->patch_ops = ad198x_patch_ops;
  1906. switch (board_config) {
  1907. case AD1988_AUTO:
  1908. codec->patch_ops.init = ad1988_auto_init;
  1909. break;
  1910. case AD1988_LAPTOP:
  1911. case AD1988_LAPTOP_DIG:
  1912. codec->patch_ops.unsol_event = ad1988_laptop_unsol_event;
  1913. break;
  1914. }
  1915. return 0;
  1916. }
  1917. /*
  1918. * patch entries
  1919. */
  1920. struct hda_codec_preset snd_hda_preset_analog[] = {
  1921. { .id = 0x11d41981, .name = "AD1981", .patch = patch_ad1981 },
  1922. { .id = 0x11d41983, .name = "AD1983", .patch = patch_ad1983 },
  1923. { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a },
  1924. { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 },
  1925. {} /* terminator */
  1926. };