alc269_quirks.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  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_FUJITSU,
  15. ALC269_LIFEBOOK,
  16. ALC271_ACER,
  17. ALC269_MODEL_LAST /* last tag */
  18. };
  19. /*
  20. * ALC269 channel source setting (2 channel)
  21. */
  22. #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
  23. #define alc269_dac_nids alc260_dac_nids
  24. static const hda_nid_t alc269_adc_nids[1] = {
  25. /* ADC1 */
  26. 0x08,
  27. };
  28. static const hda_nid_t alc269_capsrc_nids[1] = {
  29. 0x23,
  30. };
  31. static const hda_nid_t alc269vb_adc_nids[1] = {
  32. /* ADC1 */
  33. 0x09,
  34. };
  35. static const hda_nid_t alc269vb_capsrc_nids[1] = {
  36. 0x22,
  37. };
  38. #define alc269_modes alc260_modes
  39. #define alc269_capture_source alc880_lg_lw_capture_source
  40. static const struct snd_kcontrol_new alc269_base_mixer[] = {
  41. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  42. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  43. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  44. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  45. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  46. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  47. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  48. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  49. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  50. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  51. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  52. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  53. { } /* end */
  54. };
  55. static const struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
  56. /* output mixer control */
  57. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  58. {
  59. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  60. .name = "Master Playback Switch",
  61. .subdevice = HDA_SUBDEV_AMP_FLAG,
  62. .info = snd_hda_mixer_amp_switch_info,
  63. .get = snd_hda_mixer_amp_switch_get,
  64. .put = alc268_acer_master_sw_put,
  65. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  66. },
  67. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  68. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  69. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  70. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  71. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  72. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  73. { }
  74. };
  75. static const struct snd_kcontrol_new alc269_lifebook_mixer[] = {
  76. /* output mixer control */
  77. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  78. {
  79. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  80. .name = "Master Playback Switch",
  81. .subdevice = HDA_SUBDEV_AMP_FLAG,
  82. .info = snd_hda_mixer_amp_switch_info,
  83. .get = snd_hda_mixer_amp_switch_get,
  84. .put = alc268_acer_master_sw_put,
  85. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  86. },
  87. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  88. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  89. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  90. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  91. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  92. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  93. HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
  94. HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
  95. HDA_CODEC_VOLUME("Dock Mic Boost Volume", 0x1b, 0, HDA_INPUT),
  96. { }
  97. };
  98. static const struct snd_kcontrol_new alc269_laptop_mixer[] = {
  99. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  100. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  101. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  102. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  103. { } /* end */
  104. };
  105. static const struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
  106. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  107. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  108. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  109. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  110. { } /* end */
  111. };
  112. static const struct snd_kcontrol_new alc269_asus_mixer[] = {
  113. HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  114. HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT),
  115. { } /* end */
  116. };
  117. /* capture mixer elements */
  118. static const struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
  119. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  120. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  121. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  122. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  123. { } /* end */
  124. };
  125. static const struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
  126. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  127. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  128. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  129. { } /* end */
  130. };
  131. static const struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
  132. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  133. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  134. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  135. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  136. { } /* end */
  137. };
  138. static const struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
  139. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  140. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  141. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  142. { } /* end */
  143. };
  144. /* FSC amilo */
  145. #define alc269_fujitsu_mixer alc269_laptop_mixer
  146. static const struct hda_verb alc269_quanta_fl1_verbs[] = {
  147. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  148. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  149. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  150. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  151. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  152. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  153. { }
  154. };
  155. static const struct hda_verb alc269_lifebook_verbs[] = {
  156. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  157. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
  158. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  159. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  160. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  161. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  162. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  163. {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  164. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  165. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  166. { }
  167. };
  168. /* toggle speaker-output according to the hp-jack state */
  169. static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
  170. {
  171. alc_hp_automute(codec);
  172. snd_hda_codec_write(codec, 0x20, 0,
  173. AC_VERB_SET_COEF_INDEX, 0x0c);
  174. snd_hda_codec_write(codec, 0x20, 0,
  175. AC_VERB_SET_PROC_COEF, 0x680);
  176. snd_hda_codec_write(codec, 0x20, 0,
  177. AC_VERB_SET_COEF_INDEX, 0x0c);
  178. snd_hda_codec_write(codec, 0x20, 0,
  179. AC_VERB_SET_PROC_COEF, 0x480);
  180. }
  181. #define alc269_lifebook_speaker_automute \
  182. alc269_quanta_fl1_speaker_automute
  183. static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
  184. {
  185. unsigned int present_laptop;
  186. unsigned int present_dock;
  187. present_laptop = snd_hda_jack_detect(codec, 0x18);
  188. present_dock = snd_hda_jack_detect(codec, 0x1b);
  189. /* Laptop mic port overrides dock mic port, design decision */
  190. if (present_dock)
  191. snd_hda_codec_write(codec, 0x23, 0,
  192. AC_VERB_SET_CONNECT_SEL, 0x3);
  193. if (present_laptop)
  194. snd_hda_codec_write(codec, 0x23, 0,
  195. AC_VERB_SET_CONNECT_SEL, 0x0);
  196. if (!present_dock && !present_laptop)
  197. snd_hda_codec_write(codec, 0x23, 0,
  198. AC_VERB_SET_CONNECT_SEL, 0x1);
  199. }
  200. static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
  201. unsigned int res)
  202. {
  203. switch (res >> 26) {
  204. case ALC_HP_EVENT:
  205. alc269_quanta_fl1_speaker_automute(codec);
  206. break;
  207. case ALC_MIC_EVENT:
  208. alc_mic_automute(codec);
  209. break;
  210. }
  211. }
  212. static void alc269_lifebook_unsol_event(struct hda_codec *codec,
  213. unsigned int res)
  214. {
  215. if ((res >> 26) == ALC_HP_EVENT)
  216. alc269_lifebook_speaker_automute(codec);
  217. if ((res >> 26) == ALC_MIC_EVENT)
  218. alc269_lifebook_mic_autoswitch(codec);
  219. }
  220. static void alc269_quanta_fl1_setup(struct hda_codec *codec)
  221. {
  222. struct alc_spec *spec = codec->spec;
  223. spec->autocfg.hp_pins[0] = 0x15;
  224. spec->autocfg.speaker_pins[0] = 0x14;
  225. spec->automute_mixer_nid[0] = 0x0c;
  226. spec->automute = 1;
  227. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  228. spec->ext_mic_pin = 0x18;
  229. spec->int_mic_pin = 0x19;
  230. spec->auto_mic = 1;
  231. }
  232. static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
  233. {
  234. alc269_quanta_fl1_speaker_automute(codec);
  235. alc_mic_automute(codec);
  236. }
  237. static void alc269_lifebook_setup(struct hda_codec *codec)
  238. {
  239. struct alc_spec *spec = codec->spec;
  240. spec->autocfg.hp_pins[0] = 0x15;
  241. spec->autocfg.hp_pins[1] = 0x1a;
  242. spec->autocfg.speaker_pins[0] = 0x14;
  243. spec->automute_mixer_nid[0] = 0x0c;
  244. spec->automute = 1;
  245. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  246. }
  247. static void alc269_lifebook_init_hook(struct hda_codec *codec)
  248. {
  249. alc269_lifebook_speaker_automute(codec);
  250. alc269_lifebook_mic_autoswitch(codec);
  251. }
  252. static const struct hda_verb alc269_laptop_dmic_init_verbs[] = {
  253. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  254. {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
  255. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  256. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  257. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  258. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  259. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  260. {}
  261. };
  262. static const struct hda_verb alc269_laptop_amic_init_verbs[] = {
  263. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  264. {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
  265. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  266. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
  267. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  268. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  269. {}
  270. };
  271. static const struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
  272. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
  273. {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
  274. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  275. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  276. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  277. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  278. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  279. {}
  280. };
  281. static const struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
  282. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
  283. {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
  284. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  285. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  286. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  287. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  288. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  289. {}
  290. };
  291. static const struct hda_verb alc271_acer_dmic_verbs[] = {
  292. {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
  293. {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
  294. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  295. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  296. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  297. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  298. {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},
  299. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  300. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  301. {0x22, AC_VERB_SET_CONNECT_SEL, 6},
  302. { }
  303. };
  304. static void alc269_laptop_amic_setup(struct hda_codec *codec)
  305. {
  306. struct alc_spec *spec = codec->spec;
  307. spec->autocfg.hp_pins[0] = 0x15;
  308. spec->autocfg.speaker_pins[0] = 0x14;
  309. spec->automute_mixer_nid[0] = 0x0c;
  310. spec->automute = 1;
  311. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  312. spec->ext_mic_pin = 0x18;
  313. spec->int_mic_pin = 0x19;
  314. spec->auto_mic = 1;
  315. }
  316. static void alc269_laptop_dmic_setup(struct hda_codec *codec)
  317. {
  318. struct alc_spec *spec = codec->spec;
  319. spec->autocfg.hp_pins[0] = 0x15;
  320. spec->autocfg.speaker_pins[0] = 0x14;
  321. spec->automute_mixer_nid[0] = 0x0c;
  322. spec->automute = 1;
  323. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  324. spec->ext_mic_pin = 0x18;
  325. spec->int_mic_pin = 0x12;
  326. spec->auto_mic = 1;
  327. }
  328. static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
  329. {
  330. struct alc_spec *spec = codec->spec;
  331. spec->autocfg.hp_pins[0] = 0x21;
  332. spec->autocfg.speaker_pins[0] = 0x14;
  333. spec->automute_mixer_nid[0] = 0x0c;
  334. spec->automute = 1;
  335. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  336. spec->ext_mic_pin = 0x18;
  337. spec->int_mic_pin = 0x19;
  338. spec->auto_mic = 1;
  339. }
  340. static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
  341. {
  342. struct alc_spec *spec = codec->spec;
  343. spec->autocfg.hp_pins[0] = 0x21;
  344. spec->autocfg.speaker_pins[0] = 0x14;
  345. spec->automute_mixer_nid[0] = 0x0c;
  346. spec->automute = 1;
  347. spec->automute_mode = ALC_AUTOMUTE_MIXER;
  348. spec->ext_mic_pin = 0x18;
  349. spec->int_mic_pin = 0x12;
  350. spec->auto_mic = 1;
  351. }
  352. /*
  353. * generic initialization of ADC, input mixers and output mixers
  354. */
  355. static const struct hda_verb alc269_init_verbs[] = {
  356. /*
  357. * Unmute ADC0 and set the default input to mic-in
  358. */
  359. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  360. /*
  361. * Set up output mixers (0x02 - 0x03)
  362. */
  363. /* set vol=0 to output mixers */
  364. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  365. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  366. /* set up input amps for analog loopback */
  367. /* Amp Indices: DAC = 0, mixer = 1 */
  368. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  369. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  370. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  371. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  372. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  373. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  374. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  375. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  376. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  377. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  378. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  379. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  380. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  381. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  382. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  383. /* FIXME: use Mux-type input source selection */
  384. /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
  385. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  386. {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
  387. /* set EAPD */
  388. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  389. { }
  390. };
  391. static const struct hda_verb alc269vb_init_verbs[] = {
  392. /*
  393. * Unmute ADC0 and set the default input to mic-in
  394. */
  395. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  396. /*
  397. * Set up output mixers (0x02 - 0x03)
  398. */
  399. /* set vol=0 to output mixers */
  400. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  401. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  402. /* set up input amps for analog loopback */
  403. /* Amp Indices: DAC = 0, mixer = 1 */
  404. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  405. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  406. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  407. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  408. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  409. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  410. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  411. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  412. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  413. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  414. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  415. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  416. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  417. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  418. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  419. /* FIXME: use Mux-type input source selection */
  420. /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
  421. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  422. {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
  423. /* set EAPD */
  424. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  425. { }
  426. };
  427. /*
  428. * configuration and preset
  429. */
  430. static const char * const alc269_models[ALC269_MODEL_LAST] = {
  431. [ALC269_BASIC] = "basic",
  432. [ALC269_QUANTA_FL1] = "quanta",
  433. [ALC269_AMIC] = "laptop-amic",
  434. [ALC269_DMIC] = "laptop-dmic",
  435. [ALC269_FUJITSU] = "fujitsu",
  436. [ALC269_LIFEBOOK] = "lifebook",
  437. [ALC269_AUTO] = "auto",
  438. };
  439. static const struct snd_pci_quirk alc269_cfg_tbl[] = {
  440. SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
  441. SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER),
  442. SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
  443. ALC269_AMIC),
  444. SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
  445. SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
  446. SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
  447. SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
  448. SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
  449. SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
  450. SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
  451. SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
  452. SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
  453. SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269VB_AMIC),
  454. SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
  455. SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
  456. SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
  457. SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
  458. SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
  459. SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
  460. SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
  461. SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
  462. SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
  463. SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
  464. SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
  465. SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
  466. SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
  467. SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
  468. SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
  469. SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
  470. SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
  471. SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
  472. SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
  473. SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
  474. SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
  475. SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
  476. SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
  477. SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
  478. SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
  479. SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
  480. SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
  481. ALC269_DMIC),
  482. SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
  483. ALC269_DMIC),
  484. SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
  485. SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
  486. SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
  487. SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
  488. SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
  489. SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
  490. SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
  491. SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
  492. SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
  493. SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
  494. {}
  495. };
  496. static const struct alc_config_preset alc269_presets[] = {
  497. [ALC269_BASIC] = {
  498. .mixers = { alc269_base_mixer },
  499. .init_verbs = { alc269_init_verbs },
  500. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  501. .dac_nids = alc269_dac_nids,
  502. .hp_nid = 0x03,
  503. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  504. .channel_mode = alc269_modes,
  505. .input_mux = &alc269_capture_source,
  506. },
  507. [ALC269_QUANTA_FL1] = {
  508. .mixers = { alc269_quanta_fl1_mixer },
  509. .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
  510. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  511. .dac_nids = alc269_dac_nids,
  512. .hp_nid = 0x03,
  513. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  514. .channel_mode = alc269_modes,
  515. .input_mux = &alc269_capture_source,
  516. .unsol_event = alc269_quanta_fl1_unsol_event,
  517. .setup = alc269_quanta_fl1_setup,
  518. .init_hook = alc269_quanta_fl1_init_hook,
  519. },
  520. [ALC269_AMIC] = {
  521. .mixers = { alc269_laptop_mixer },
  522. .cap_mixer = alc269_laptop_analog_capture_mixer,
  523. .init_verbs = { alc269_init_verbs,
  524. alc269_laptop_amic_init_verbs },
  525. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  526. .dac_nids = alc269_dac_nids,
  527. .hp_nid = 0x03,
  528. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  529. .channel_mode = alc269_modes,
  530. .unsol_event = alc_sku_unsol_event,
  531. .setup = alc269_laptop_amic_setup,
  532. .init_hook = alc_inithook,
  533. },
  534. [ALC269_DMIC] = {
  535. .mixers = { alc269_laptop_mixer },
  536. .cap_mixer = alc269_laptop_digital_capture_mixer,
  537. .init_verbs = { alc269_init_verbs,
  538. alc269_laptop_dmic_init_verbs },
  539. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  540. .dac_nids = alc269_dac_nids,
  541. .hp_nid = 0x03,
  542. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  543. .channel_mode = alc269_modes,
  544. .unsol_event = alc_sku_unsol_event,
  545. .setup = alc269_laptop_dmic_setup,
  546. .init_hook = alc_inithook,
  547. },
  548. [ALC269VB_AMIC] = {
  549. .mixers = { alc269vb_laptop_mixer },
  550. .cap_mixer = alc269vb_laptop_analog_capture_mixer,
  551. .init_verbs = { alc269vb_init_verbs,
  552. alc269vb_laptop_amic_init_verbs },
  553. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  554. .dac_nids = alc269_dac_nids,
  555. .hp_nid = 0x03,
  556. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  557. .channel_mode = alc269_modes,
  558. .unsol_event = alc_sku_unsol_event,
  559. .setup = alc269vb_laptop_amic_setup,
  560. .init_hook = alc_inithook,
  561. },
  562. [ALC269VB_DMIC] = {
  563. .mixers = { alc269vb_laptop_mixer },
  564. .cap_mixer = alc269vb_laptop_digital_capture_mixer,
  565. .init_verbs = { alc269vb_init_verbs,
  566. alc269vb_laptop_dmic_init_verbs },
  567. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  568. .dac_nids = alc269_dac_nids,
  569. .hp_nid = 0x03,
  570. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  571. .channel_mode = alc269_modes,
  572. .unsol_event = alc_sku_unsol_event,
  573. .setup = alc269vb_laptop_dmic_setup,
  574. .init_hook = alc_inithook,
  575. },
  576. [ALC269_FUJITSU] = {
  577. .mixers = { alc269_fujitsu_mixer },
  578. .cap_mixer = alc269_laptop_digital_capture_mixer,
  579. .init_verbs = { alc269_init_verbs,
  580. alc269_laptop_dmic_init_verbs },
  581. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  582. .dac_nids = alc269_dac_nids,
  583. .hp_nid = 0x03,
  584. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  585. .channel_mode = alc269_modes,
  586. .unsol_event = alc_sku_unsol_event,
  587. .setup = alc269_laptop_dmic_setup,
  588. .init_hook = alc_inithook,
  589. },
  590. [ALC269_LIFEBOOK] = {
  591. .mixers = { alc269_lifebook_mixer },
  592. .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
  593. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  594. .dac_nids = alc269_dac_nids,
  595. .hp_nid = 0x03,
  596. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  597. .channel_mode = alc269_modes,
  598. .input_mux = &alc269_capture_source,
  599. .unsol_event = alc269_lifebook_unsol_event,
  600. .setup = alc269_lifebook_setup,
  601. .init_hook = alc269_lifebook_init_hook,
  602. },
  603. [ALC271_ACER] = {
  604. .mixers = { alc269_asus_mixer },
  605. .cap_mixer = alc269vb_laptop_digital_capture_mixer,
  606. .init_verbs = { alc269_init_verbs, alc271_acer_dmic_verbs },
  607. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  608. .dac_nids = alc269_dac_nids,
  609. .adc_nids = alc262_dmic_adc_nids,
  610. .num_adc_nids = ARRAY_SIZE(alc262_dmic_adc_nids),
  611. .capsrc_nids = alc262_dmic_capsrc_nids,
  612. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  613. .channel_mode = alc269_modes,
  614. .input_mux = &alc269_capture_source,
  615. .dig_out_nid = ALC880_DIGOUT_NID,
  616. .unsol_event = alc_sku_unsol_event,
  617. .setup = alc269vb_laptop_dmic_setup,
  618. .init_hook = alc_inithook,
  619. },
  620. };