alc662_quirks.c 50 KB

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