alc662_quirks.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164
  1. /*
  2. * ALC662/ALC663/ALC665/ALC670 quirk models
  3. * included by patch_realtek.c
  4. */
  5. /* ALC662 models */
  6. enum {
  7. ALC662_AUTO,
  8. ALC662_3ST_2ch_DIG,
  9. ALC662_3ST_6ch_DIG,
  10. ALC662_3ST_6ch,
  11. ALC662_5ST_DIG,
  12. ALC662_ASUS_EEEPC_EP20,
  13. ALC663_ASUS_M51VA,
  14. ALC663_ASUS_G71V,
  15. ALC663_ASUS_H13,
  16. ALC663_ASUS_G50V,
  17. ALC663_ASUS_MODE1,
  18. ALC662_ASUS_MODE2,
  19. ALC663_ASUS_MODE3,
  20. ALC663_ASUS_MODE4,
  21. ALC663_ASUS_MODE5,
  22. ALC663_ASUS_MODE6,
  23. ALC663_ASUS_MODE7,
  24. ALC663_ASUS_MODE8,
  25. ALC662_MODEL_LAST,
  26. };
  27. #define ALC662_DIGOUT_NID 0x06
  28. #define ALC662_DIGIN_NID 0x0a
  29. static const hda_nid_t alc662_dac_nids[3] = {
  30. /* front, rear, clfe */
  31. 0x02, 0x03, 0x04
  32. };
  33. static const hda_nid_t alc272_dac_nids[2] = {
  34. 0x02, 0x03
  35. };
  36. static const hda_nid_t alc662_adc_nids[2] = {
  37. /* ADC1-2 */
  38. 0x09, 0x08
  39. };
  40. static const hda_nid_t alc272_adc_nids[1] = {
  41. /* ADC1-2 */
  42. 0x08,
  43. };
  44. static const hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
  45. static const hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
  46. /* input MUX */
  47. /* FIXME: should be a matrix-type input source selection */
  48. static const struct hda_input_mux alc662_capture_source = {
  49. .num_items = 4,
  50. .items = {
  51. { "Mic", 0x0 },
  52. { "Front Mic", 0x1 },
  53. { "Line", 0x2 },
  54. { "CD", 0x4 },
  55. },
  56. };
  57. static const struct hda_input_mux alc662_lenovo_101e_capture_source = {
  58. .num_items = 2,
  59. .items = {
  60. { "Mic", 0x1 },
  61. { "Line", 0x2 },
  62. },
  63. };
  64. static const struct hda_input_mux alc663_capture_source = {
  65. .num_items = 3,
  66. .items = {
  67. { "Mic", 0x0 },
  68. { "Front Mic", 0x1 },
  69. { "Line", 0x2 },
  70. },
  71. };
  72. /*
  73. * 2ch mode
  74. */
  75. static const struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
  76. { 2, NULL }
  77. };
  78. /*
  79. * 2ch mode
  80. */
  81. static const struct hda_verb alc662_3ST_ch2_init[] = {
  82. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  83. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  84. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  85. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  86. { } /* end */
  87. };
  88. /*
  89. * 6ch mode
  90. */
  91. static const struct hda_verb alc662_3ST_ch6_init[] = {
  92. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  93. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  94. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  95. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  96. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  97. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  98. { } /* end */
  99. };
  100. static const struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
  101. { 2, alc662_3ST_ch2_init },
  102. { 6, alc662_3ST_ch6_init },
  103. };
  104. /*
  105. * 2ch mode
  106. */
  107. static const struct hda_verb alc662_sixstack_ch6_init[] = {
  108. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  109. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  110. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  111. { } /* end */
  112. };
  113. /*
  114. * 6ch mode
  115. */
  116. static const struct hda_verb alc662_sixstack_ch8_init[] = {
  117. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  118. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  119. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  120. { } /* end */
  121. };
  122. static const struct hda_channel_mode alc662_5stack_modes[2] = {
  123. { 2, alc662_sixstack_ch6_init },
  124. { 6, alc662_sixstack_ch8_init },
  125. };
  126. /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
  127. * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
  128. */
  129. static const struct snd_kcontrol_new alc662_base_mixer[] = {
  130. /* output mixer control */
  131. HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
  132. HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
  133. HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
  134. HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
  135. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
  136. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
  137. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
  138. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
  139. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  140. /*Input mixer control */
  141. HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
  142. HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
  143. HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
  144. HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
  145. HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
  146. HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
  147. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
  148. HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
  149. { } /* end */
  150. };
  151. static const struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
  152. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  153. HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
  154. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  155. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  156. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  157. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  158. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  159. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  160. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  161. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  162. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  163. { } /* end */
  164. };
  165. static const struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
  166. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  167. HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
  168. HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  169. HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
  170. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
  171. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
  172. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
  173. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
  174. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  175. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  176. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  177. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  178. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  179. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  180. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  181. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  182. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  183. { } /* end */
  184. };
  185. static const struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
  186. ALC262_HIPPO_MASTER_SWITCH,
  187. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  188. HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  189. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
  190. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
  191. HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
  192. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  193. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  194. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  195. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  196. { } /* end */
  197. };
  198. static const struct hda_bind_ctls alc663_asus_bind_master_vol = {
  199. .ops = &snd_hda_bind_vol,
  200. .values = {
  201. HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
  202. HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
  203. 0
  204. },
  205. };
  206. static const struct hda_bind_ctls alc663_asus_one_bind_switch = {
  207. .ops = &snd_hda_bind_sw,
  208. .values = {
  209. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  210. HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  211. 0
  212. },
  213. };
  214. static const struct snd_kcontrol_new alc663_m51va_mixer[] = {
  215. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  216. HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
  217. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  218. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  219. { } /* end */
  220. };
  221. static const struct hda_bind_ctls alc663_asus_tree_bind_switch = {
  222. .ops = &snd_hda_bind_sw,
  223. .values = {
  224. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  225. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  226. HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  227. 0
  228. },
  229. };
  230. static const struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
  231. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  232. HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
  233. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  234. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  235. HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  236. HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  237. { } /* end */
  238. };
  239. static const struct hda_bind_ctls alc663_asus_four_bind_switch = {
  240. .ops = &snd_hda_bind_sw,
  241. .values = {
  242. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  243. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  244. HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
  245. 0
  246. },
  247. };
  248. static const struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
  249. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  250. HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
  251. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  252. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  253. HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  254. HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  255. { } /* end */
  256. };
  257. static const struct snd_kcontrol_new alc662_1bjd_mixer[] = {
  258. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  259. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  260. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  261. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  262. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  263. HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  264. HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  265. { } /* end */
  266. };
  267. static const struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
  268. .ops = &snd_hda_bind_vol,
  269. .values = {
  270. HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
  271. HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
  272. 0
  273. },
  274. };
  275. static const struct hda_bind_ctls alc663_asus_two_bind_switch = {
  276. .ops = &snd_hda_bind_sw,
  277. .values = {
  278. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  279. HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
  280. 0
  281. },
  282. };
  283. static const struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
  284. HDA_BIND_VOL("Master Playback Volume",
  285. &alc663_asus_two_bind_master_vol),
  286. HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
  287. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  288. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  289. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  290. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  291. { } /* end */
  292. };
  293. static const struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
  294. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  295. HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
  296. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  297. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  298. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  299. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  300. { } /* end */
  301. };
  302. static const struct snd_kcontrol_new alc663_g71v_mixer[] = {
  303. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  304. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  305. HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  306. HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  307. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  308. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  309. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  310. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  311. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  312. { } /* end */
  313. };
  314. static const struct snd_kcontrol_new alc663_g50v_mixer[] = {
  315. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  316. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  317. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  318. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  319. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  320. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  321. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  322. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  323. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  324. { } /* end */
  325. };
  326. static const struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
  327. .ops = &snd_hda_bind_sw,
  328. .values = {
  329. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  330. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  331. HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
  332. HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
  333. HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  334. 0
  335. },
  336. };
  337. static const struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
  338. .ops = &snd_hda_bind_sw,
  339. .values = {
  340. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  341. HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
  342. 0
  343. },
  344. };
  345. static const struct snd_kcontrol_new alc663_mode7_mixer[] = {
  346. HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
  347. HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
  348. HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
  349. HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  350. HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  351. HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  352. HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  353. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  354. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  355. { } /* end */
  356. };
  357. static const struct snd_kcontrol_new alc663_mode8_mixer[] = {
  358. HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
  359. HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
  360. HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
  361. HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  362. HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  363. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  364. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  365. { } /* end */
  366. };
  367. static const struct snd_kcontrol_new alc662_chmode_mixer[] = {
  368. {
  369. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  370. .name = "Channel Mode",
  371. .info = alc_ch_mode_info,
  372. .get = alc_ch_mode_get,
  373. .put = alc_ch_mode_put,
  374. },
  375. { } /* end */
  376. };
  377. static const struct hda_verb alc662_init_verbs[] = {
  378. /* ADC: mute amp left and right */
  379. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  380. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  381. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  382. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  383. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  384. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  385. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  386. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  387. /* Front Pin: output 0 (0x0c) */
  388. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  389. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  390. /* Rear Pin: output 1 (0x0d) */
  391. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  392. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  393. /* CLFE Pin: output 2 (0x0e) */
  394. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  395. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  396. /* Mic (rear) pin: input vref at 80% */
  397. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  398. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  399. /* Front Mic pin: input vref at 80% */
  400. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  401. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  402. /* Line In pin: input */
  403. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  404. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  405. /* Line-2 In: Headphone output (output 0 - 0x0c) */
  406. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  407. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  408. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  409. /* CD pin widget for input */
  410. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  411. /* FIXME: use matrix-type input source selection */
  412. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  413. /* Input mixer */
  414. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  415. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  416. { }
  417. };
  418. static const struct hda_verb alc662_eapd_init_verbs[] = {
  419. /* always trun on EAPD */
  420. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  421. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  422. { }
  423. };
  424. /* Set Unsolicited Event*/
  425. static const struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
  426. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  427. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  428. {}
  429. };
  430. static const struct hda_verb alc663_m51va_init_verbs[] = {
  431. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  432. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  433. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  434. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  435. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  436. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  437. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  438. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  439. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  440. {}
  441. };
  442. static const struct hda_verb alc663_21jd_amic_init_verbs[] = {
  443. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  444. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  445. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  446. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  447. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  448. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  449. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  450. {}
  451. };
  452. static const struct hda_verb alc662_1bjd_amic_init_verbs[] = {
  453. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  454. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  455. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  456. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
  457. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  458. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  459. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  460. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  461. {}
  462. };
  463. static const struct hda_verb alc663_15jd_amic_init_verbs[] = {
  464. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  465. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  466. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  467. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  468. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  469. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  470. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  471. {}
  472. };
  473. static const struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
  474. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  475. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  476. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  477. {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
  478. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  479. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  480. {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
  481. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  482. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  483. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  484. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  485. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  486. {}
  487. };
  488. static const struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
  489. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  490. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  491. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  492. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  493. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  494. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  495. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  496. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  497. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  498. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  499. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  500. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  501. {}
  502. };
  503. static const struct hda_verb alc663_g71v_init_verbs[] = {
  504. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  505. /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
  506. /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
  507. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  508. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  509. {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
  510. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC_FRONT_EVENT},
  511. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC_MIC_EVENT},
  512. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC_HP_EVENT},
  513. {}
  514. };
  515. static const struct hda_verb alc663_g50v_init_verbs[] = {
  516. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  517. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  518. {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
  519. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  520. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  521. {}
  522. };
  523. static const struct hda_verb alc662_ecs_init_verbs[] = {
  524. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
  525. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  526. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  527. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  528. {}
  529. };
  530. static const struct hda_verb alc663_mode7_init_verbs[] = {
  531. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  532. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  533. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  534. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  535. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  536. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  537. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
  538. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  539. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  540. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  541. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  542. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  543. {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  544. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  545. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  546. {}
  547. };
  548. static const struct hda_verb alc663_mode8_init_verbs[] = {
  549. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  550. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  551. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  552. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  553. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  554. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  555. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  556. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  557. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  558. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  559. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  560. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  561. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  562. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  563. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  564. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  565. {}
  566. };
  567. static const struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
  568. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  569. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  570. { } /* end */
  571. };
  572. static const struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
  573. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  574. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  575. { } /* end */
  576. };
  577. static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
  578. {
  579. struct alc_spec *spec = codec->spec;
  580. spec->autocfg.hp_pins[0] = 0x14;
  581. spec->autocfg.speaker_pins[0] = 0x1b;
  582. spec->automute = 1;
  583. spec->automute_mode = ALC_AUTOMUTE_AMP;
  584. }
  585. static void alc663_m51va_setup(struct hda_codec *codec)
  586. {
  587. struct alc_spec *spec = codec->spec;
  588. spec->autocfg.hp_pins[0] = 0x21;
  589. spec->autocfg.speaker_pins[0] = 0x14;
  590. spec->automute_mixer_nid[0] = 0x0c;
  591. spec->automute = 1;
  592. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  593. spec->ext_mic_pin = 0x18;
  594. spec->int_mic_pin = 0x12;
  595. spec->auto_mic = 1;
  596. }
  597. /* ***************** Mode1 ******************************/
  598. static void alc663_mode1_setup(struct hda_codec *codec)
  599. {
  600. struct alc_spec *spec = codec->spec;
  601. spec->autocfg.hp_pins[0] = 0x21;
  602. spec->autocfg.speaker_pins[0] = 0x14;
  603. spec->automute_mixer_nid[0] = 0x0c;
  604. spec->automute = 1;
  605. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  606. spec->ext_mic_pin = 0x18;
  607. spec->int_mic_pin = 0x19;
  608. spec->auto_mic = 1;
  609. }
  610. /* ***************** Mode2 ******************************/
  611. static void alc662_mode2_setup(struct hda_codec *codec)
  612. {
  613. struct alc_spec *spec = codec->spec;
  614. spec->autocfg.hp_pins[0] = 0x1b;
  615. spec->autocfg.speaker_pins[0] = 0x14;
  616. spec->automute = 1;
  617. spec->automute_mode = ALC_AUTOMUTE_PIN;
  618. spec->ext_mic_pin = 0x18;
  619. spec->int_mic_pin = 0x19;
  620. spec->auto_mic = 1;
  621. }
  622. /* ***************** Mode3 ******************************/
  623. static void alc663_mode3_setup(struct hda_codec *codec)
  624. {
  625. struct alc_spec *spec = codec->spec;
  626. spec->autocfg.hp_pins[0] = 0x21;
  627. spec->autocfg.hp_pins[0] = 0x15;
  628. spec->autocfg.speaker_pins[0] = 0x14;
  629. spec->automute = 1;
  630. spec->automute_mode = ALC_AUTOMUTE_PIN;
  631. spec->ext_mic_pin = 0x18;
  632. spec->int_mic_pin = 0x19;
  633. spec->auto_mic = 1;
  634. }
  635. /* ***************** Mode4 ******************************/
  636. static void alc663_mode4_setup(struct hda_codec *codec)
  637. {
  638. struct alc_spec *spec = codec->spec;
  639. spec->autocfg.hp_pins[0] = 0x21;
  640. spec->autocfg.speaker_pins[0] = 0x14;
  641. spec->autocfg.speaker_pins[1] = 0x16;
  642. spec->automute_mixer_nid[0] = 0x0c;
  643. spec->automute_mixer_nid[1] = 0x0e;
  644. spec->automute = 1;
  645. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  646. spec->ext_mic_pin = 0x18;
  647. spec->int_mic_pin = 0x19;
  648. spec->auto_mic = 1;
  649. }
  650. /* ***************** Mode5 ******************************/
  651. static void alc663_mode5_setup(struct hda_codec *codec)
  652. {
  653. struct alc_spec *spec = codec->spec;
  654. spec->autocfg.hp_pins[0] = 0x15;
  655. spec->autocfg.speaker_pins[0] = 0x14;
  656. spec->autocfg.speaker_pins[1] = 0x16;
  657. spec->automute_mixer_nid[0] = 0x0c;
  658. spec->automute_mixer_nid[1] = 0x0e;
  659. spec->automute = 1;
  660. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  661. spec->ext_mic_pin = 0x18;
  662. spec->int_mic_pin = 0x19;
  663. spec->auto_mic = 1;
  664. }
  665. /* ***************** Mode6 ******************************/
  666. static void alc663_mode6_setup(struct hda_codec *codec)
  667. {
  668. struct alc_spec *spec = codec->spec;
  669. spec->autocfg.hp_pins[0] = 0x1b;
  670. spec->autocfg.hp_pins[0] = 0x15;
  671. spec->autocfg.speaker_pins[0] = 0x14;
  672. spec->automute_mixer_nid[0] = 0x0c;
  673. spec->automute = 1;
  674. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  675. spec->ext_mic_pin = 0x18;
  676. spec->int_mic_pin = 0x19;
  677. spec->auto_mic = 1;
  678. }
  679. /* ***************** Mode7 ******************************/
  680. static void alc663_mode7_setup(struct hda_codec *codec)
  681. {
  682. struct alc_spec *spec = codec->spec;
  683. spec->autocfg.hp_pins[0] = 0x1b;
  684. spec->autocfg.hp_pins[0] = 0x21;
  685. spec->autocfg.speaker_pins[0] = 0x14;
  686. spec->autocfg.speaker_pins[0] = 0x17;
  687. spec->automute = 1;
  688. spec->automute_mode = ALC_AUTOMUTE_PIN;
  689. spec->ext_mic_pin = 0x18;
  690. spec->int_mic_pin = 0x19;
  691. spec->auto_mic = 1;
  692. }
  693. /* ***************** Mode8 ******************************/
  694. static void alc663_mode8_setup(struct hda_codec *codec)
  695. {
  696. struct alc_spec *spec = codec->spec;
  697. spec->autocfg.hp_pins[0] = 0x21;
  698. spec->autocfg.hp_pins[1] = 0x15;
  699. spec->autocfg.speaker_pins[0] = 0x14;
  700. spec->autocfg.speaker_pins[0] = 0x17;
  701. spec->automute = 1;
  702. spec->automute_mode = ALC_AUTOMUTE_PIN;
  703. spec->ext_mic_pin = 0x18;
  704. spec->int_mic_pin = 0x12;
  705. spec->auto_mic = 1;
  706. }
  707. static void alc663_g71v_setup(struct hda_codec *codec)
  708. {
  709. struct alc_spec *spec = codec->spec;
  710. spec->autocfg.hp_pins[0] = 0x21;
  711. spec->autocfg.line_out_pins[0] = 0x15;
  712. spec->autocfg.speaker_pins[0] = 0x14;
  713. spec->automute = 1;
  714. spec->automute_mode = ALC_AUTOMUTE_AMP;
  715. spec->detect_line = 1;
  716. spec->automute_lines = 1;
  717. spec->ext_mic_pin = 0x18;
  718. spec->int_mic_pin = 0x12;
  719. spec->auto_mic = 1;
  720. }
  721. #define alc663_g50v_setup alc663_m51va_setup
  722. static const struct snd_kcontrol_new alc662_ecs_mixer[] = {
  723. HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  724. ALC262_HIPPO_MASTER_SWITCH,
  725. HDA_CODEC_VOLUME("Mic/LineIn Boost Volume", 0x18, 0, HDA_INPUT),
  726. HDA_CODEC_VOLUME("Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
  727. HDA_CODEC_MUTE("Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
  728. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  729. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  730. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  731. { } /* end */
  732. };
  733. /*
  734. * configuration and preset
  735. */
  736. static const char * const alc662_models[ALC662_MODEL_LAST] = {
  737. [ALC662_3ST_2ch_DIG] = "3stack-dig",
  738. [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
  739. [ALC662_3ST_6ch] = "3stack-6ch",
  740. [ALC662_5ST_DIG] = "5stack-dig",
  741. [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
  742. [ALC663_ASUS_M51VA] = "m51va",
  743. [ALC663_ASUS_G71V] = "g71v",
  744. [ALC663_ASUS_H13] = "h13",
  745. [ALC663_ASUS_G50V] = "g50v",
  746. [ALC663_ASUS_MODE1] = "asus-mode1",
  747. [ALC662_ASUS_MODE2] = "asus-mode2",
  748. [ALC663_ASUS_MODE3] = "asus-mode3",
  749. [ALC663_ASUS_MODE4] = "asus-mode4",
  750. [ALC663_ASUS_MODE5] = "asus-mode5",
  751. [ALC663_ASUS_MODE6] = "asus-mode6",
  752. [ALC663_ASUS_MODE7] = "asus-mode7",
  753. [ALC663_ASUS_MODE8] = "asus-mode8",
  754. [ALC662_AUTO] = "auto",
  755. };
  756. static const struct snd_pci_quirk alc662_cfg_tbl[] = {
  757. SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
  758. SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
  759. SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
  760. SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
  761. SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
  762. SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
  763. SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
  764. SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
  765. SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
  766. SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
  767. SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
  768. SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
  769. SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
  770. SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
  771. SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
  772. SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
  773. SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
  774. SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
  775. SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
  776. SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
  777. SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
  778. SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
  779. SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
  780. SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
  781. SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
  782. SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
  783. SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
  784. SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
  785. SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
  786. SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
  787. SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
  788. SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
  789. SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
  790. SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
  791. /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
  792. SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
  793. SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
  794. SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
  795. SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
  796. SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
  797. SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
  798. SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
  799. SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
  800. SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
  801. SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
  802. SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
  803. SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
  804. SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
  805. SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
  806. SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
  807. /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
  808. SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
  809. SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
  810. SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
  811. SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
  812. SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
  813. SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
  814. SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
  815. SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
  816. ALC662_3ST_6ch_DIG),
  817. SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
  818. SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
  819. ALC662_3ST_6ch_DIG),
  820. SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
  821. SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
  822. SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
  823. SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
  824. ALC662_3ST_6ch_DIG),
  825. SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
  826. ALC663_ASUS_H13),
  827. {}
  828. };
  829. static const struct alc_config_preset alc662_presets[] = {
  830. [ALC662_3ST_2ch_DIG] = {
  831. .mixers = { alc662_3ST_2ch_mixer },
  832. .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
  833. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  834. .dac_nids = alc662_dac_nids,
  835. .dig_out_nid = ALC662_DIGOUT_NID,
  836. .dig_in_nid = ALC662_DIGIN_NID,
  837. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  838. .channel_mode = alc662_3ST_2ch_modes,
  839. .input_mux = &alc662_capture_source,
  840. },
  841. [ALC662_3ST_6ch_DIG] = {
  842. .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
  843. .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
  844. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  845. .dac_nids = alc662_dac_nids,
  846. .dig_out_nid = ALC662_DIGOUT_NID,
  847. .dig_in_nid = ALC662_DIGIN_NID,
  848. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  849. .channel_mode = alc662_3ST_6ch_modes,
  850. .need_dac_fix = 1,
  851. .input_mux = &alc662_capture_source,
  852. },
  853. [ALC662_3ST_6ch] = {
  854. .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
  855. .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
  856. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  857. .dac_nids = alc662_dac_nids,
  858. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  859. .channel_mode = alc662_3ST_6ch_modes,
  860. .need_dac_fix = 1,
  861. .input_mux = &alc662_capture_source,
  862. },
  863. [ALC662_5ST_DIG] = {
  864. .mixers = { alc662_base_mixer, alc662_chmode_mixer },
  865. .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
  866. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  867. .dac_nids = alc662_dac_nids,
  868. .dig_out_nid = ALC662_DIGOUT_NID,
  869. .dig_in_nid = ALC662_DIGIN_NID,
  870. .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
  871. .channel_mode = alc662_5stack_modes,
  872. .input_mux = &alc662_capture_source,
  873. },
  874. [ALC662_ASUS_EEEPC_EP20] = {
  875. .mixers = { alc662_eeepc_ep20_mixer,
  876. alc662_chmode_mixer },
  877. .init_verbs = { alc662_init_verbs,
  878. alc662_eapd_init_verbs,
  879. alc662_eeepc_ep20_sue_init_verbs },
  880. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  881. .dac_nids = alc662_dac_nids,
  882. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  883. .channel_mode = alc662_3ST_6ch_modes,
  884. .input_mux = &alc662_lenovo_101e_capture_source,
  885. .unsol_event = alc_sku_unsol_event,
  886. .setup = alc662_eeepc_ep20_setup,
  887. .init_hook = alc_inithook,
  888. },
  889. [ALC663_ASUS_M51VA] = {
  890. .mixers = { alc663_m51va_mixer },
  891. .init_verbs = { alc662_init_verbs,
  892. alc662_eapd_init_verbs,
  893. alc663_m51va_init_verbs },
  894. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  895. .dac_nids = alc662_dac_nids,
  896. .dig_out_nid = ALC662_DIGOUT_NID,
  897. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  898. .channel_mode = alc662_3ST_2ch_modes,
  899. .unsol_event = alc_sku_unsol_event,
  900. .setup = alc663_m51va_setup,
  901. .init_hook = alc_inithook,
  902. },
  903. [ALC663_ASUS_G71V] = {
  904. .mixers = { alc663_g71v_mixer },
  905. .init_verbs = { alc662_init_verbs,
  906. alc662_eapd_init_verbs,
  907. alc663_g71v_init_verbs },
  908. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  909. .dac_nids = alc662_dac_nids,
  910. .dig_out_nid = ALC662_DIGOUT_NID,
  911. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  912. .channel_mode = alc662_3ST_2ch_modes,
  913. .unsol_event = alc_sku_unsol_event,
  914. .setup = alc663_g71v_setup,
  915. .init_hook = alc_inithook,
  916. },
  917. [ALC663_ASUS_H13] = {
  918. .mixers = { alc663_m51va_mixer },
  919. .init_verbs = { alc662_init_verbs,
  920. alc662_eapd_init_verbs,
  921. alc663_m51va_init_verbs },
  922. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  923. .dac_nids = alc662_dac_nids,
  924. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  925. .channel_mode = alc662_3ST_2ch_modes,
  926. .setup = alc663_m51va_setup,
  927. .unsol_event = alc_sku_unsol_event,
  928. .init_hook = alc_inithook,
  929. },
  930. [ALC663_ASUS_G50V] = {
  931. .mixers = { alc663_g50v_mixer },
  932. .init_verbs = { alc662_init_verbs,
  933. alc662_eapd_init_verbs,
  934. alc663_g50v_init_verbs },
  935. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  936. .dac_nids = alc662_dac_nids,
  937. .dig_out_nid = ALC662_DIGOUT_NID,
  938. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  939. .channel_mode = alc662_3ST_6ch_modes,
  940. .input_mux = &alc663_capture_source,
  941. .unsol_event = alc_sku_unsol_event,
  942. .setup = alc663_g50v_setup,
  943. .init_hook = alc_inithook,
  944. },
  945. [ALC663_ASUS_MODE1] = {
  946. .mixers = { alc663_m51va_mixer },
  947. .cap_mixer = alc662_auto_capture_mixer,
  948. .init_verbs = { alc662_init_verbs,
  949. alc662_eapd_init_verbs,
  950. alc663_21jd_amic_init_verbs },
  951. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  952. .hp_nid = 0x03,
  953. .dac_nids = alc662_dac_nids,
  954. .dig_out_nid = ALC662_DIGOUT_NID,
  955. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  956. .channel_mode = alc662_3ST_2ch_modes,
  957. .unsol_event = alc_sku_unsol_event,
  958. .setup = alc663_mode1_setup,
  959. .init_hook = alc_inithook,
  960. },
  961. [ALC662_ASUS_MODE2] = {
  962. .mixers = { alc662_1bjd_mixer },
  963. .cap_mixer = alc662_auto_capture_mixer,
  964. .init_verbs = { alc662_init_verbs,
  965. alc662_eapd_init_verbs,
  966. alc662_1bjd_amic_init_verbs },
  967. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  968. .dac_nids = alc662_dac_nids,
  969. .dig_out_nid = ALC662_DIGOUT_NID,
  970. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  971. .channel_mode = alc662_3ST_2ch_modes,
  972. .unsol_event = alc_sku_unsol_event,
  973. .setup = alc662_mode2_setup,
  974. .init_hook = alc_inithook,
  975. },
  976. [ALC663_ASUS_MODE3] = {
  977. .mixers = { alc663_two_hp_m1_mixer },
  978. .cap_mixer = alc662_auto_capture_mixer,
  979. .init_verbs = { alc662_init_verbs,
  980. alc662_eapd_init_verbs,
  981. alc663_two_hp_amic_m1_init_verbs },
  982. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  983. .hp_nid = 0x03,
  984. .dac_nids = alc662_dac_nids,
  985. .dig_out_nid = ALC662_DIGOUT_NID,
  986. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  987. .channel_mode = alc662_3ST_2ch_modes,
  988. .unsol_event = alc_sku_unsol_event,
  989. .setup = alc663_mode3_setup,
  990. .init_hook = alc_inithook,
  991. },
  992. [ALC663_ASUS_MODE4] = {
  993. .mixers = { alc663_asus_21jd_clfe_mixer },
  994. .cap_mixer = alc662_auto_capture_mixer,
  995. .init_verbs = { alc662_init_verbs,
  996. alc662_eapd_init_verbs,
  997. alc663_21jd_amic_init_verbs},
  998. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  999. .hp_nid = 0x03,
  1000. .dac_nids = alc662_dac_nids,
  1001. .dig_out_nid = ALC662_DIGOUT_NID,
  1002. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  1003. .channel_mode = alc662_3ST_2ch_modes,
  1004. .unsol_event = alc_sku_unsol_event,
  1005. .setup = alc663_mode4_setup,
  1006. .init_hook = alc_inithook,
  1007. },
  1008. [ALC663_ASUS_MODE5] = {
  1009. .mixers = { alc663_asus_15jd_clfe_mixer },
  1010. .cap_mixer = alc662_auto_capture_mixer,
  1011. .init_verbs = { alc662_init_verbs,
  1012. alc662_eapd_init_verbs,
  1013. alc663_15jd_amic_init_verbs },
  1014. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  1015. .hp_nid = 0x03,
  1016. .dac_nids = alc662_dac_nids,
  1017. .dig_out_nid = ALC662_DIGOUT_NID,
  1018. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  1019. .channel_mode = alc662_3ST_2ch_modes,
  1020. .unsol_event = alc_sku_unsol_event,
  1021. .setup = alc663_mode5_setup,
  1022. .init_hook = alc_inithook,
  1023. },
  1024. [ALC663_ASUS_MODE6] = {
  1025. .mixers = { alc663_two_hp_m2_mixer },
  1026. .cap_mixer = alc662_auto_capture_mixer,
  1027. .init_verbs = { alc662_init_verbs,
  1028. alc662_eapd_init_verbs,
  1029. alc663_two_hp_amic_m2_init_verbs },
  1030. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  1031. .hp_nid = 0x03,
  1032. .dac_nids = alc662_dac_nids,
  1033. .dig_out_nid = ALC662_DIGOUT_NID,
  1034. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  1035. .channel_mode = alc662_3ST_2ch_modes,
  1036. .unsol_event = alc_sku_unsol_event,
  1037. .setup = alc663_mode6_setup,
  1038. .init_hook = alc_inithook,
  1039. },
  1040. [ALC663_ASUS_MODE7] = {
  1041. .mixers = { alc663_mode7_mixer },
  1042. .cap_mixer = alc662_auto_capture_mixer,
  1043. .init_verbs = { alc662_init_verbs,
  1044. alc662_eapd_init_verbs,
  1045. alc663_mode7_init_verbs },
  1046. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  1047. .hp_nid = 0x03,
  1048. .dac_nids = alc662_dac_nids,
  1049. .dig_out_nid = ALC662_DIGOUT_NID,
  1050. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  1051. .channel_mode = alc662_3ST_2ch_modes,
  1052. .unsol_event = alc_sku_unsol_event,
  1053. .setup = alc663_mode7_setup,
  1054. .init_hook = alc_inithook,
  1055. },
  1056. [ALC663_ASUS_MODE8] = {
  1057. .mixers = { alc663_mode8_mixer },
  1058. .cap_mixer = alc662_auto_capture_mixer,
  1059. .init_verbs = { alc662_init_verbs,
  1060. alc662_eapd_init_verbs,
  1061. alc663_mode8_init_verbs },
  1062. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  1063. .hp_nid = 0x03,
  1064. .dac_nids = alc662_dac_nids,
  1065. .dig_out_nid = ALC662_DIGOUT_NID,
  1066. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  1067. .channel_mode = alc662_3ST_2ch_modes,
  1068. .unsol_event = alc_sku_unsol_event,
  1069. .setup = alc663_mode8_setup,
  1070. .init_hook = alc_inithook,
  1071. },
  1072. };