alc269_quirks.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. /*
  2. * ALC269/ALC270/ALC275/ALC276 quirk models
  3. * included by patch_realtek.c
  4. */
  5. /* ALC269 models */
  6. enum {
  7. ALC269_AUTO,
  8. ALC269_BASIC,
  9. ALC269_QUANTA_FL1,
  10. ALC269_AMIC,
  11. ALC269_DMIC,
  12. ALC269VB_AMIC,
  13. ALC269VB_DMIC,
  14. ALC269_MODEL_LAST /* last tag */
  15. };
  16. /*
  17. * ALC269 channel source setting (2 channel)
  18. */
  19. #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
  20. #define alc269_dac_nids alc260_dac_nids
  21. static const hda_nid_t alc269_adc_nids[1] = {
  22. /* ADC1 */
  23. 0x08,
  24. };
  25. static const hda_nid_t alc269_capsrc_nids[1] = {
  26. 0x23,
  27. };
  28. static const hda_nid_t alc269vb_adc_nids[1] = {
  29. /* ADC1 */
  30. 0x09,
  31. };
  32. static const hda_nid_t alc269vb_capsrc_nids[1] = {
  33. 0x22,
  34. };
  35. #define alc269_modes alc260_modes
  36. #define alc269_capture_source alc880_lg_lw_capture_source
  37. static const struct snd_kcontrol_new alc269_base_mixer[] = {
  38. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  39. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  40. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  41. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  42. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  43. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  44. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  45. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  46. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  47. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  48. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  49. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  50. { } /* end */
  51. };
  52. static const struct snd_kcontrol_new alc269_laptop_mixer[] = {
  53. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  54. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  55. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  56. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  57. { } /* end */
  58. };
  59. static const struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
  60. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  61. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  62. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  63. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  64. { } /* end */
  65. };
  66. static const struct snd_kcontrol_new alc269_asus_mixer[] = {
  67. HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  68. HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT),
  69. { } /* end */
  70. };
  71. /* capture mixer elements */
  72. static const struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
  73. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  74. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  75. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  76. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  77. { } /* end */
  78. };
  79. static const struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
  80. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  81. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  82. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  83. { } /* end */
  84. };
  85. static const struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
  86. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  87. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  88. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  89. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  90. { } /* end */
  91. };
  92. static const struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
  93. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  94. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  95. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  96. { } /* end */
  97. };
  98. static const struct hda_verb alc269_laptop_dmic_init_verbs[] = {
  99. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  100. {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
  101. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  102. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  103. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  104. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  105. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  106. {}
  107. };
  108. static const struct hda_verb alc269_laptop_amic_init_verbs[] = {
  109. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  110. {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
  111. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  112. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
  113. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  114. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  115. {}
  116. };
  117. static const struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
  118. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
  119. {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
  120. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  121. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  122. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  123. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  124. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  125. {}
  126. };
  127. static const struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
  128. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
  129. {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
  130. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  131. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  132. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  133. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  134. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  135. {}
  136. };
  137. static void alc269_laptop_amic_setup(struct hda_codec *codec)
  138. {
  139. struct alc_spec *spec = codec->spec;
  140. spec->autocfg.hp_pins[0] = 0x15;
  141. spec->autocfg.speaker_pins[0] = 0x14;
  142. spec->automute_mixer_nid[0] = 0x0c;
  143. spec->automute = 1;
  144. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  145. spec->ext_mic_pin = 0x18;
  146. spec->int_mic_pin = 0x19;
  147. spec->auto_mic = 1;
  148. }
  149. static void alc269_laptop_dmic_setup(struct hda_codec *codec)
  150. {
  151. struct alc_spec *spec = codec->spec;
  152. spec->autocfg.hp_pins[0] = 0x15;
  153. spec->autocfg.speaker_pins[0] = 0x14;
  154. spec->automute_mixer_nid[0] = 0x0c;
  155. spec->automute = 1;
  156. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  157. spec->ext_mic_pin = 0x18;
  158. spec->int_mic_pin = 0x12;
  159. spec->auto_mic = 1;
  160. }
  161. static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
  162. {
  163. struct alc_spec *spec = codec->spec;
  164. spec->autocfg.hp_pins[0] = 0x21;
  165. spec->autocfg.speaker_pins[0] = 0x14;
  166. spec->automute_mixer_nid[0] = 0x0c;
  167. spec->automute = 1;
  168. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  169. spec->ext_mic_pin = 0x18;
  170. spec->int_mic_pin = 0x19;
  171. spec->auto_mic = 1;
  172. }
  173. static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
  174. {
  175. struct alc_spec *spec = codec->spec;
  176. spec->autocfg.hp_pins[0] = 0x21;
  177. spec->autocfg.speaker_pins[0] = 0x14;
  178. spec->automute_mixer_nid[0] = 0x0c;
  179. spec->automute = 1;
  180. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  181. spec->ext_mic_pin = 0x18;
  182. spec->int_mic_pin = 0x12;
  183. spec->auto_mic = 1;
  184. }
  185. /*
  186. * generic initialization of ADC, input mixers and output mixers
  187. */
  188. static const struct hda_verb alc269_init_verbs[] = {
  189. /*
  190. * Unmute ADC0 and set the default input to mic-in
  191. */
  192. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  193. /*
  194. * Set up output mixers (0x02 - 0x03)
  195. */
  196. /* set vol=0 to output mixers */
  197. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  198. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  199. /* set up input amps for analog loopback */
  200. /* Amp Indices: DAC = 0, mixer = 1 */
  201. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  202. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  203. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  204. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  205. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  206. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  207. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  208. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  209. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  210. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  211. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  212. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  213. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  214. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  215. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  216. /* FIXME: use Mux-type input source selection */
  217. /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
  218. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  219. {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
  220. /* set EAPD */
  221. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  222. { }
  223. };
  224. static const struct hda_verb alc269vb_init_verbs[] = {
  225. /*
  226. * Unmute ADC0 and set the default input to mic-in
  227. */
  228. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  229. /*
  230. * Set up output mixers (0x02 - 0x03)
  231. */
  232. /* set vol=0 to output mixers */
  233. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  234. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  235. /* set up input amps for analog loopback */
  236. /* Amp Indices: DAC = 0, mixer = 1 */
  237. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  238. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  239. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  240. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  241. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  242. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  243. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  244. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  245. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  246. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  247. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  248. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  249. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  250. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  251. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  252. /* FIXME: use Mux-type input source selection */
  253. /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
  254. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  255. {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
  256. /* set EAPD */
  257. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  258. { }
  259. };
  260. /*
  261. * configuration and preset
  262. */
  263. static const char * const alc269_models[ALC269_MODEL_LAST] = {
  264. [ALC269_BASIC] = "basic",
  265. [ALC269_AMIC] = "laptop-amic",
  266. [ALC269_DMIC] = "laptop-dmic",
  267. [ALC269_AUTO] = "auto",
  268. };
  269. static const struct snd_pci_quirk alc269_cfg_tbl[] = {
  270. SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
  271. ALC269_AMIC),
  272. SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
  273. SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
  274. SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
  275. SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
  276. SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
  277. SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
  278. SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
  279. SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
  280. SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
  281. SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269VB_AMIC),
  282. SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
  283. SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
  284. SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
  285. SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
  286. SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
  287. SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
  288. SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
  289. SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
  290. SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
  291. SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
  292. SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
  293. SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
  294. SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
  295. SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
  296. SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
  297. SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
  298. SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
  299. SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
  300. SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
  301. SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
  302. SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
  303. SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
  304. SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
  305. SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
  306. SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
  307. SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
  308. SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
  309. SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
  310. SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
  311. SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
  312. SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
  313. {}
  314. };
  315. static const struct alc_config_preset alc269_presets[] = {
  316. [ALC269_BASIC] = {
  317. .mixers = { alc269_base_mixer },
  318. .init_verbs = { alc269_init_verbs },
  319. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  320. .dac_nids = alc269_dac_nids,
  321. .hp_nid = 0x03,
  322. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  323. .channel_mode = alc269_modes,
  324. .input_mux = &alc269_capture_source,
  325. },
  326. [ALC269_AMIC] = {
  327. .mixers = { alc269_laptop_mixer },
  328. .cap_mixer = alc269_laptop_analog_capture_mixer,
  329. .init_verbs = { alc269_init_verbs,
  330. alc269_laptop_amic_init_verbs },
  331. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  332. .dac_nids = alc269_dac_nids,
  333. .hp_nid = 0x03,
  334. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  335. .channel_mode = alc269_modes,
  336. .unsol_event = alc_sku_unsol_event,
  337. .setup = alc269_laptop_amic_setup,
  338. .init_hook = alc_inithook,
  339. },
  340. [ALC269_DMIC] = {
  341. .mixers = { alc269_laptop_mixer },
  342. .cap_mixer = alc269_laptop_digital_capture_mixer,
  343. .init_verbs = { alc269_init_verbs,
  344. alc269_laptop_dmic_init_verbs },
  345. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  346. .dac_nids = alc269_dac_nids,
  347. .hp_nid = 0x03,
  348. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  349. .channel_mode = alc269_modes,
  350. .unsol_event = alc_sku_unsol_event,
  351. .setup = alc269_laptop_dmic_setup,
  352. .init_hook = alc_inithook,
  353. },
  354. [ALC269VB_AMIC] = {
  355. .mixers = { alc269vb_laptop_mixer },
  356. .cap_mixer = alc269vb_laptop_analog_capture_mixer,
  357. .init_verbs = { alc269vb_init_verbs,
  358. alc269vb_laptop_amic_init_verbs },
  359. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  360. .dac_nids = alc269_dac_nids,
  361. .hp_nid = 0x03,
  362. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  363. .channel_mode = alc269_modes,
  364. .unsol_event = alc_sku_unsol_event,
  365. .setup = alc269vb_laptop_amic_setup,
  366. .init_hook = alc_inithook,
  367. },
  368. [ALC269VB_DMIC] = {
  369. .mixers = { alc269vb_laptop_mixer },
  370. .cap_mixer = alc269vb_laptop_digital_capture_mixer,
  371. .init_verbs = { alc269vb_init_verbs,
  372. alc269vb_laptop_dmic_init_verbs },
  373. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  374. .dac_nids = alc269_dac_nids,
  375. .hp_nid = 0x03,
  376. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  377. .channel_mode = alc269_modes,
  378. .unsol_event = alc_sku_unsol_event,
  379. .setup = alc269vb_laptop_dmic_setup,
  380. .init_hook = alc_inithook,
  381. },
  382. };