alc861_quirks.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. /*
  2. * ALC660/ALC861 quirk models
  3. * included by patch_realtek.c
  4. */
  5. /* ALC861 models */
  6. enum {
  7. ALC861_AUTO,
  8. ALC861_3ST,
  9. ALC660_3ST,
  10. ALC861_3ST_DIG,
  11. ALC861_6ST_DIG,
  12. ALC861_UNIWILL_M31,
  13. ALC861_TOSHIBA,
  14. ALC861_ASUS,
  15. ALC861_ASUS_LAPTOP,
  16. ALC861_MODEL_LAST,
  17. };
  18. /*
  19. * ALC861 channel source setting (2/6 channel selection for 3-stack)
  20. */
  21. /*
  22. * set the path ways for 2 channel output
  23. * need to set the codec line out and mic 1 pin widgets to inputs
  24. */
  25. static const struct hda_verb alc861_threestack_ch2_init[] = {
  26. /* set pin widget 1Ah (line in) for input */
  27. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  28. /* set pin widget 18h (mic1/2) for input, for mic also enable
  29. * the vref
  30. */
  31. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  32. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
  33. #if 0
  34. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
  35. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
  36. #endif
  37. { } /* end */
  38. };
  39. /*
  40. * 6ch mode
  41. * need to set the codec line out and mic 1 pin widgets to outputs
  42. */
  43. static const struct hda_verb alc861_threestack_ch6_init[] = {
  44. /* set pin widget 1Ah (line in) for output (Back Surround)*/
  45. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  46. /* set pin widget 18h (mic1) for output (CLFE)*/
  47. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  48. { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
  49. { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
  50. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
  51. #if 0
  52. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
  53. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
  54. #endif
  55. { } /* end */
  56. };
  57. static const struct hda_channel_mode alc861_threestack_modes[2] = {
  58. { 2, alc861_threestack_ch2_init },
  59. { 6, alc861_threestack_ch6_init },
  60. };
  61. /* Set mic1 as input and unmute the mixer */
  62. static const struct hda_verb alc861_uniwill_m31_ch2_init[] = {
  63. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  64. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
  65. { } /* end */
  66. };
  67. /* Set mic1 as output and mute mixer */
  68. static const struct hda_verb alc861_uniwill_m31_ch4_init[] = {
  69. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  70. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
  71. { } /* end */
  72. };
  73. static const struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
  74. { 2, alc861_uniwill_m31_ch2_init },
  75. { 4, alc861_uniwill_m31_ch4_init },
  76. };
  77. /* Set mic1 and line-in as input and unmute the mixer */
  78. static const struct hda_verb alc861_asus_ch2_init[] = {
  79. /* set pin widget 1Ah (line in) for input */
  80. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  81. /* set pin widget 18h (mic1/2) for input, for mic also enable
  82. * the vref
  83. */
  84. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  85. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
  86. #if 0
  87. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
  88. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
  89. #endif
  90. { } /* end */
  91. };
  92. /* Set mic1 nad line-in as output and mute mixer */
  93. static const struct hda_verb alc861_asus_ch6_init[] = {
  94. /* set pin widget 1Ah (line in) for output (Back Surround)*/
  95. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  96. /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
  97. /* set pin widget 18h (mic1) for output (CLFE)*/
  98. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  99. /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
  100. { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
  101. { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
  102. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
  103. #if 0
  104. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
  105. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
  106. #endif
  107. { } /* end */
  108. };
  109. static const struct hda_channel_mode alc861_asus_modes[2] = {
  110. { 2, alc861_asus_ch2_init },
  111. { 6, alc861_asus_ch6_init },
  112. };
  113. /* patch-ALC861 */
  114. static const struct snd_kcontrol_new alc861_base_mixer[] = {
  115. /* output mixer control */
  116. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  117. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  118. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  119. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  120. HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
  121. /*Input mixer control */
  122. /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  123. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
  124. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  125. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  126. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  127. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  128. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  129. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  130. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  131. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
  132. { } /* end */
  133. };
  134. static const struct snd_kcontrol_new alc861_3ST_mixer[] = {
  135. /* output mixer control */
  136. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  137. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  138. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  139. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  140. /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
  141. /* Input mixer control */
  142. /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  143. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
  144. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  145. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  146. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  147. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  148. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  149. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  150. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  151. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
  152. {
  153. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  154. .name = "Channel Mode",
  155. .info = alc_ch_mode_info,
  156. .get = alc_ch_mode_get,
  157. .put = alc_ch_mode_put,
  158. .private_value = ARRAY_SIZE(alc861_threestack_modes),
  159. },
  160. { } /* end */
  161. };
  162. static const struct snd_kcontrol_new alc861_toshiba_mixer[] = {
  163. /* output mixer control */
  164. HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  165. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  166. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  167. { } /* end */
  168. };
  169. static const struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
  170. /* output mixer control */
  171. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  172. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  173. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  174. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  175. /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
  176. /* Input mixer control */
  177. /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  178. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
  179. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  180. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  181. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  182. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  183. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  184. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  185. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  186. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
  187. {
  188. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  189. .name = "Channel Mode",
  190. .info = alc_ch_mode_info,
  191. .get = alc_ch_mode_get,
  192. .put = alc_ch_mode_put,
  193. .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
  194. },
  195. { } /* end */
  196. };
  197. static const struct snd_kcontrol_new alc861_asus_mixer[] = {
  198. /* output mixer control */
  199. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  200. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  201. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  202. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  203. HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
  204. /* Input mixer control */
  205. HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  206. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  207. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  208. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  209. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  210. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  211. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  212. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  213. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  214. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
  215. {
  216. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  217. .name = "Channel Mode",
  218. .info = alc_ch_mode_info,
  219. .get = alc_ch_mode_get,
  220. .put = alc_ch_mode_put,
  221. .private_value = ARRAY_SIZE(alc861_asus_modes),
  222. },
  223. { }
  224. };
  225. /* additional mixer */
  226. static const struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
  227. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  228. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  229. { }
  230. };
  231. /*
  232. * generic initialization of ADC, input mixers and output mixers
  233. */
  234. static const struct hda_verb alc861_base_init_verbs[] = {
  235. /*
  236. * Unmute ADC0 and set the default input to mic-in
  237. */
  238. /* port-A for surround (rear panel) */
  239. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  240. { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
  241. /* port-B for mic-in (rear panel) with vref */
  242. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  243. /* port-C for line-in (rear panel) */
  244. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  245. /* port-D for Front */
  246. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  247. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  248. /* port-E for HP out (front panel) */
  249. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  250. /* route front PCM to HP */
  251. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  252. /* port-F for mic-in (front panel) with vref */
  253. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  254. /* port-G for CLFE (rear panel) */
  255. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  256. { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  257. /* port-H for side (rear panel) */
  258. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  259. { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
  260. /* CD-in */
  261. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  262. /* route front mic to ADC1*/
  263. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  264. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  265. /* Unmute DAC0~3 & spdif out*/
  266. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  267. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  268. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  269. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  270. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  271. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  272. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  273. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  274. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  275. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  276. /* Unmute Stereo Mixer 15 */
  277. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  278. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  279. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  280. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  281. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  282. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  283. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  284. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  285. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  286. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  287. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  288. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  289. /* hp used DAC 3 (Front) */
  290. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  291. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  292. { }
  293. };
  294. static const struct hda_verb alc861_threestack_init_verbs[] = {
  295. /*
  296. * Unmute ADC0 and set the default input to mic-in
  297. */
  298. /* port-A for surround (rear panel) */
  299. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  300. /* port-B for mic-in (rear panel) with vref */
  301. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  302. /* port-C for line-in (rear panel) */
  303. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  304. /* port-D for Front */
  305. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  306. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  307. /* port-E for HP out (front panel) */
  308. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  309. /* route front PCM to HP */
  310. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  311. /* port-F for mic-in (front panel) with vref */
  312. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  313. /* port-G for CLFE (rear panel) */
  314. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  315. /* port-H for side (rear panel) */
  316. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  317. /* CD-in */
  318. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  319. /* route front mic to ADC1*/
  320. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  321. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  322. /* Unmute DAC0~3 & spdif out*/
  323. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  324. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  325. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  326. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  327. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  328. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  329. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  330. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  331. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  332. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  333. /* Unmute Stereo Mixer 15 */
  334. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  335. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  336. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  337. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  338. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  339. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  340. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  341. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  342. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  343. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  344. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  345. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  346. /* hp used DAC 3 (Front) */
  347. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  348. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  349. { }
  350. };
  351. static const struct hda_verb alc861_uniwill_m31_init_verbs[] = {
  352. /*
  353. * Unmute ADC0 and set the default input to mic-in
  354. */
  355. /* port-A for surround (rear panel) */
  356. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  357. /* port-B for mic-in (rear panel) with vref */
  358. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  359. /* port-C for line-in (rear panel) */
  360. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  361. /* port-D for Front */
  362. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  363. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  364. /* port-E for HP out (front panel) */
  365. /* this has to be set to VREF80 */
  366. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  367. /* route front PCM to HP */
  368. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  369. /* port-F for mic-in (front panel) with vref */
  370. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  371. /* port-G for CLFE (rear panel) */
  372. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  373. /* port-H for side (rear panel) */
  374. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  375. /* CD-in */
  376. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  377. /* route front mic to ADC1*/
  378. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  379. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  380. /* Unmute DAC0~3 & spdif out*/
  381. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  382. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  383. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  384. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  385. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  386. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  387. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  388. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  389. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  390. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  391. /* Unmute Stereo Mixer 15 */
  392. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  393. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  394. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  395. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  396. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  397. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  398. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  399. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  400. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  401. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  402. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  403. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  404. /* hp used DAC 3 (Front) */
  405. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  406. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  407. { }
  408. };
  409. static const struct hda_verb alc861_asus_init_verbs[] = {
  410. /*
  411. * Unmute ADC0 and set the default input to mic-in
  412. */
  413. /* port-A for surround (rear panel)
  414. * according to codec#0 this is the HP jack
  415. */
  416. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
  417. /* route front PCM to HP */
  418. { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
  419. /* port-B for mic-in (rear panel) with vref */
  420. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  421. /* port-C for line-in (rear panel) */
  422. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  423. /* port-D for Front */
  424. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  425. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  426. /* port-E for HP out (front panel) */
  427. /* this has to be set to VREF80 */
  428. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  429. /* route front PCM to HP */
  430. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  431. /* port-F for mic-in (front panel) with vref */
  432. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  433. /* port-G for CLFE (rear panel) */
  434. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  435. /* port-H for side (rear panel) */
  436. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  437. /* CD-in */
  438. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  439. /* route front mic to ADC1*/
  440. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  441. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  442. /* Unmute DAC0~3 & spdif out*/
  443. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  444. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  445. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  446. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  447. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  448. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  449. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  450. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  451. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  452. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  453. /* Unmute Stereo Mixer 15 */
  454. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  455. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  456. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  457. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  458. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  459. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  460. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  461. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  462. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  463. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  464. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  465. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  466. /* hp used DAC 3 (Front) */
  467. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  468. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  469. { }
  470. };
  471. /* additional init verbs for ASUS laptops */
  472. static const struct hda_verb alc861_asus_laptop_init_verbs[] = {
  473. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
  474. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
  475. { }
  476. };
  477. static const struct hda_verb alc861_toshiba_init_verbs[] = {
  478. {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  479. { }
  480. };
  481. /* toggle speaker-output according to the hp-jack state */
  482. static void alc861_toshiba_automute(struct hda_codec *codec)
  483. {
  484. unsigned int present = snd_hda_jack_detect(codec, 0x0f);
  485. snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
  486. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  487. snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
  488. HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
  489. }
  490. static void alc861_toshiba_unsol_event(struct hda_codec *codec,
  491. unsigned int res)
  492. {
  493. if ((res >> 26) == ALC_HP_EVENT)
  494. alc861_toshiba_automute(codec);
  495. }
  496. #define ALC861_DIGOUT_NID 0x07
  497. static const struct hda_channel_mode alc861_8ch_modes[1] = {
  498. { 8, NULL }
  499. };
  500. static const hda_nid_t alc861_dac_nids[4] = {
  501. /* front, surround, clfe, side */
  502. 0x03, 0x06, 0x05, 0x04
  503. };
  504. static const hda_nid_t alc660_dac_nids[3] = {
  505. /* front, clfe, surround */
  506. 0x03, 0x05, 0x06
  507. };
  508. static const hda_nid_t alc861_adc_nids[1] = {
  509. /* ADC0-2 */
  510. 0x08,
  511. };
  512. static const struct hda_input_mux alc861_capture_source = {
  513. .num_items = 5,
  514. .items = {
  515. { "Mic", 0x0 },
  516. { "Front Mic", 0x3 },
  517. { "Line", 0x1 },
  518. { "CD", 0x4 },
  519. { "Mixer", 0x5 },
  520. },
  521. };
  522. /*
  523. * configuration and preset
  524. */
  525. static const char * const alc861_models[ALC861_MODEL_LAST] = {
  526. [ALC861_3ST] = "3stack",
  527. [ALC660_3ST] = "3stack-660",
  528. [ALC861_3ST_DIG] = "3stack-dig",
  529. [ALC861_6ST_DIG] = "6stack-dig",
  530. [ALC861_UNIWILL_M31] = "uniwill-m31",
  531. [ALC861_TOSHIBA] = "toshiba",
  532. [ALC861_ASUS] = "asus",
  533. [ALC861_ASUS_LAPTOP] = "asus-laptop",
  534. [ALC861_AUTO] = "auto",
  535. };
  536. static const struct snd_pci_quirk alc861_cfg_tbl[] = {
  537. SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
  538. SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
  539. SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
  540. SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
  541. SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
  542. SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
  543. SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
  544. /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
  545. * Any other models that need this preset?
  546. */
  547. /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
  548. SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
  549. SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
  550. SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
  551. SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
  552. SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
  553. /* FIXME: the below seems conflict */
  554. /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
  555. SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
  556. SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
  557. {}
  558. };
  559. static const struct alc_config_preset alc861_presets[] = {
  560. [ALC861_3ST] = {
  561. .mixers = { alc861_3ST_mixer },
  562. .init_verbs = { alc861_threestack_init_verbs },
  563. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  564. .dac_nids = alc861_dac_nids,
  565. .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
  566. .channel_mode = alc861_threestack_modes,
  567. .need_dac_fix = 1,
  568. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  569. .adc_nids = alc861_adc_nids,
  570. .input_mux = &alc861_capture_source,
  571. },
  572. [ALC861_3ST_DIG] = {
  573. .mixers = { alc861_base_mixer },
  574. .init_verbs = { alc861_threestack_init_verbs },
  575. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  576. .dac_nids = alc861_dac_nids,
  577. .dig_out_nid = ALC861_DIGOUT_NID,
  578. .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
  579. .channel_mode = alc861_threestack_modes,
  580. .need_dac_fix = 1,
  581. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  582. .adc_nids = alc861_adc_nids,
  583. .input_mux = &alc861_capture_source,
  584. },
  585. [ALC861_6ST_DIG] = {
  586. .mixers = { alc861_base_mixer },
  587. .init_verbs = { alc861_base_init_verbs },
  588. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  589. .dac_nids = alc861_dac_nids,
  590. .dig_out_nid = ALC861_DIGOUT_NID,
  591. .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
  592. .channel_mode = alc861_8ch_modes,
  593. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  594. .adc_nids = alc861_adc_nids,
  595. .input_mux = &alc861_capture_source,
  596. },
  597. [ALC660_3ST] = {
  598. .mixers = { alc861_3ST_mixer },
  599. .init_verbs = { alc861_threestack_init_verbs },
  600. .num_dacs = ARRAY_SIZE(alc660_dac_nids),
  601. .dac_nids = alc660_dac_nids,
  602. .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
  603. .channel_mode = alc861_threestack_modes,
  604. .need_dac_fix = 1,
  605. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  606. .adc_nids = alc861_adc_nids,
  607. .input_mux = &alc861_capture_source,
  608. },
  609. [ALC861_UNIWILL_M31] = {
  610. .mixers = { alc861_uniwill_m31_mixer },
  611. .init_verbs = { alc861_uniwill_m31_init_verbs },
  612. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  613. .dac_nids = alc861_dac_nids,
  614. .dig_out_nid = ALC861_DIGOUT_NID,
  615. .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
  616. .channel_mode = alc861_uniwill_m31_modes,
  617. .need_dac_fix = 1,
  618. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  619. .adc_nids = alc861_adc_nids,
  620. .input_mux = &alc861_capture_source,
  621. },
  622. [ALC861_TOSHIBA] = {
  623. .mixers = { alc861_toshiba_mixer },
  624. .init_verbs = { alc861_base_init_verbs,
  625. alc861_toshiba_init_verbs },
  626. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  627. .dac_nids = alc861_dac_nids,
  628. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  629. .channel_mode = alc883_3ST_2ch_modes,
  630. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  631. .adc_nids = alc861_adc_nids,
  632. .input_mux = &alc861_capture_source,
  633. .unsol_event = alc861_toshiba_unsol_event,
  634. .init_hook = alc861_toshiba_automute,
  635. },
  636. [ALC861_ASUS] = {
  637. .mixers = { alc861_asus_mixer },
  638. .init_verbs = { alc861_asus_init_verbs },
  639. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  640. .dac_nids = alc861_dac_nids,
  641. .dig_out_nid = ALC861_DIGOUT_NID,
  642. .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
  643. .channel_mode = alc861_asus_modes,
  644. .need_dac_fix = 1,
  645. .hp_nid = 0x06,
  646. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  647. .adc_nids = alc861_adc_nids,
  648. .input_mux = &alc861_capture_source,
  649. },
  650. [ALC861_ASUS_LAPTOP] = {
  651. .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
  652. .init_verbs = { alc861_asus_init_verbs,
  653. alc861_asus_laptop_init_verbs },
  654. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  655. .dac_nids = alc861_dac_nids,
  656. .dig_out_nid = ALC861_DIGOUT_NID,
  657. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  658. .channel_mode = alc883_3ST_2ch_modes,
  659. .need_dac_fix = 1,
  660. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  661. .adc_nids = alc861_adc_nids,
  662. .input_mux = &alc861_capture_source,
  663. },
  664. };