alc262_quirks.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. /*
  2. * ALC262 quirk models
  3. * included by patch_realtek.c
  4. */
  5. /* ALC262 models */
  6. enum {
  7. ALC262_AUTO,
  8. ALC262_BASIC,
  9. ALC262_HIPPO,
  10. ALC262_HIPPO_1,
  11. ALC262_ULTRA,
  12. ALC262_MODEL_LAST /* last tag */
  13. };
  14. #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
  15. #define ALC262_DIGIN_NID ALC880_DIGIN_NID
  16. #define alc262_dac_nids alc260_dac_nids
  17. #define alc262_adc_nids alc882_adc_nids
  18. #define alc262_adc_nids_alt alc882_adc_nids_alt
  19. #define alc262_capsrc_nids alc882_capsrc_nids
  20. #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
  21. #define alc262_modes alc260_modes
  22. #define alc262_capture_source alc882_capture_source
  23. static const hda_nid_t alc262_dmic_adc_nids[1] = {
  24. /* ADC0 */
  25. 0x09
  26. };
  27. static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
  28. static const struct snd_kcontrol_new alc262_base_mixer[] = {
  29. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  30. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  31. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  32. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  33. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  34. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  35. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  36. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  37. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  38. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  39. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  40. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  41. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
  42. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  43. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  44. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  45. { } /* end */
  46. };
  47. /* bind hp and internal speaker mute (with plug check) as master switch */
  48. static int alc262_hippo_master_sw_get(struct snd_kcontrol *kcontrol,
  49. struct snd_ctl_elem_value *ucontrol)
  50. {
  51. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  52. struct alc_spec *spec = codec->spec;
  53. *ucontrol->value.integer.value = !spec->master_mute;
  54. return 0;
  55. }
  56. static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
  57. struct snd_ctl_elem_value *ucontrol)
  58. {
  59. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  60. struct alc_spec *spec = codec->spec;
  61. int val = !*ucontrol->value.integer.value;
  62. if (val == spec->master_mute)
  63. return 0;
  64. spec->master_mute = val;
  65. update_outputs(codec);
  66. return 1;
  67. }
  68. #define ALC262_HIPPO_MASTER_SWITCH \
  69. { \
  70. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  71. .name = "Master Playback Switch", \
  72. .info = snd_ctl_boolean_mono_info, \
  73. .get = alc262_hippo_master_sw_get, \
  74. .put = alc262_hippo_master_sw_put, \
  75. }, \
  76. { \
  77. .iface = NID_MAPPING, \
  78. .name = "Master Playback Switch", \
  79. .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
  80. (SUBDEV_SPEAKER(0) << 16), \
  81. }
  82. #define alc262_hp_master_sw_get alc262_hippo_master_sw_get
  83. #define alc262_hp_master_sw_put alc262_hippo_master_sw_put
  84. static const struct snd_kcontrol_new alc262_hippo_mixer[] = {
  85. ALC262_HIPPO_MASTER_SWITCH,
  86. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  87. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  88. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  89. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  90. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  91. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  92. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  93. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  94. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  95. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  96. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  97. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  98. { } /* end */
  99. };
  100. static const struct snd_kcontrol_new alc262_hippo1_mixer[] = {
  101. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  102. ALC262_HIPPO_MASTER_SWITCH,
  103. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  104. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  105. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  106. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  107. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  108. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  109. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  110. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  111. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  112. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  113. { } /* end */
  114. };
  115. /* mute/unmute internal speaker according to the hp jack and mute state */
  116. static void alc262_hippo_setup(struct hda_codec *codec)
  117. {
  118. struct alc_spec *spec = codec->spec;
  119. spec->autocfg.hp_pins[0] = 0x15;
  120. spec->autocfg.speaker_pins[0] = 0x14;
  121. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  122. }
  123. static void alc262_hippo1_setup(struct hda_codec *codec)
  124. {
  125. struct alc_spec *spec = codec->spec;
  126. spec->autocfg.hp_pins[0] = 0x1b;
  127. spec->autocfg.speaker_pins[0] = 0x14;
  128. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  129. }
  130. static const struct snd_kcontrol_new alc262_sony_mixer[] = {
  131. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  132. ALC262_HIPPO_MASTER_SWITCH,
  133. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  134. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  135. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  136. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  137. { } /* end */
  138. };
  139. #define alc262_capture_mixer alc882_capture_mixer
  140. #define alc262_capture_alt_mixer alc882_capture_alt_mixer
  141. /*
  142. * generic initialization of ADC, input mixers and output mixers
  143. */
  144. static const struct hda_verb alc262_init_verbs[] = {
  145. /*
  146. * Unmute ADC0-2 and set the default input to mic-in
  147. */
  148. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  149. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  150. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  151. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  152. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  153. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  154. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  155. * mixer widget
  156. * Note: PASD motherboards uses the Line In 2 as the input for
  157. * front panel mic (mic 2)
  158. */
  159. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  160. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  161. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  162. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  163. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  164. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  165. /*
  166. * Set up output mixers (0x0c - 0x0e)
  167. */
  168. /* set vol=0 to output mixers */
  169. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  170. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  171. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  172. /* set up input amps for analog loopback */
  173. /* Amp Indices: DAC = 0, mixer = 1 */
  174. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  175. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  176. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  177. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  178. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  179. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  180. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  181. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  182. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  183. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  184. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  185. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  186. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  187. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  188. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  189. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  190. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  191. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  192. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  193. /* FIXME: use matrix-type input source selection */
  194. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  195. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  196. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  197. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  198. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  199. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  200. /* Input mixer2 */
  201. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  202. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  203. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  204. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  205. /* Input mixer3 */
  206. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  207. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  208. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  209. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  210. { }
  211. };
  212. static const struct hda_verb alc262_eapd_verbs[] = {
  213. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  214. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  215. { }
  216. };
  217. static const struct hda_verb alc262_hippo1_unsol_verbs[] = {
  218. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  219. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  220. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  221. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  222. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  223. {}
  224. };
  225. static const struct hda_verb alc262_sony_unsol_verbs[] = {
  226. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  227. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  228. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
  229. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  230. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  231. {}
  232. };
  233. /* Samsung Q1 Ultra Vista model setup */
  234. static const struct snd_kcontrol_new alc262_ultra_mixer[] = {
  235. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  236. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  237. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  238. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  239. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
  240. HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT),
  241. { } /* end */
  242. };
  243. static const struct hda_verb alc262_ultra_verbs[] = {
  244. /* output mixer */
  245. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  246. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  247. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  248. /* speaker */
  249. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  250. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  251. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  252. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  253. /* HP */
  254. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  255. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  256. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  257. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  258. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  259. /* internal mic */
  260. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  261. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  262. /* ADC, choose mic */
  263. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  264. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  265. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  266. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  267. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  268. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  269. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  270. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  271. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  272. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
  273. {}
  274. };
  275. /* mute/unmute internal speaker according to the hp jack and mute state */
  276. static void alc262_ultra_automute(struct hda_codec *codec)
  277. {
  278. struct alc_spec *spec = codec->spec;
  279. unsigned int mute;
  280. mute = 0;
  281. /* auto-mute only when HP is used as HP */
  282. if (!spec->cur_mux[0]) {
  283. spec->hp_jack_present = snd_hda_jack_detect(codec, 0x15);
  284. if (spec->hp_jack_present)
  285. mute = HDA_AMP_MUTE;
  286. }
  287. /* mute/unmute internal speaker */
  288. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  289. HDA_AMP_MUTE, mute);
  290. /* mute/unmute HP */
  291. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  292. HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
  293. }
  294. /* unsolicited event for HP jack sensing */
  295. static void alc262_ultra_unsol_event(struct hda_codec *codec,
  296. unsigned int res)
  297. {
  298. if ((res >> 26) != ALC_HP_EVENT)
  299. return;
  300. alc262_ultra_automute(codec);
  301. }
  302. static const struct hda_input_mux alc262_ultra_capture_source = {
  303. .num_items = 2,
  304. .items = {
  305. { "Mic", 0x1 },
  306. { "Headphone", 0x7 },
  307. },
  308. };
  309. static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
  310. struct snd_ctl_elem_value *ucontrol)
  311. {
  312. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  313. struct alc_spec *spec = codec->spec;
  314. int ret;
  315. ret = alc_mux_enum_put(kcontrol, ucontrol);
  316. if (!ret)
  317. return 0;
  318. /* reprogram the HP pin as mic or HP according to the input source */
  319. snd_hda_codec_write_cache(codec, 0x15, 0,
  320. AC_VERB_SET_PIN_WIDGET_CONTROL,
  321. spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
  322. alc262_ultra_automute(codec); /* mute/unmute HP */
  323. return ret;
  324. }
  325. static const struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
  326. HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
  327. HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
  328. {
  329. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  330. .name = "Capture Source",
  331. .info = alc_mux_enum_info,
  332. .get = alc_mux_enum_get,
  333. .put = alc262_ultra_mux_enum_put,
  334. },
  335. {
  336. .iface = NID_MAPPING,
  337. .name = "Capture Source",
  338. .private_value = 0x15,
  339. },
  340. { } /* end */
  341. };
  342. /*
  343. * configuration and preset
  344. */
  345. static const char * const alc262_models[ALC262_MODEL_LAST] = {
  346. [ALC262_BASIC] = "basic",
  347. [ALC262_HIPPO] = "hippo",
  348. [ALC262_HIPPO_1] = "hippo_1",
  349. [ALC262_ULTRA] = "ultra",
  350. [ALC262_AUTO] = "auto",
  351. };
  352. static const struct snd_pci_quirk alc262_cfg_tbl[] = {
  353. SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
  354. SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
  355. ALC262_ULTRA),
  356. SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
  357. SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
  358. {}
  359. };
  360. static const struct alc_config_preset alc262_presets[] = {
  361. [ALC262_BASIC] = {
  362. .mixers = { alc262_base_mixer },
  363. .init_verbs = { alc262_init_verbs },
  364. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  365. .dac_nids = alc262_dac_nids,
  366. .hp_nid = 0x03,
  367. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  368. .channel_mode = alc262_modes,
  369. .input_mux = &alc262_capture_source,
  370. },
  371. [ALC262_HIPPO] = {
  372. .mixers = { alc262_hippo_mixer },
  373. .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
  374. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  375. .dac_nids = alc262_dac_nids,
  376. .hp_nid = 0x03,
  377. .dig_out_nid = ALC262_DIGOUT_NID,
  378. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  379. .channel_mode = alc262_modes,
  380. .input_mux = &alc262_capture_source,
  381. .unsol_event = alc_sku_unsol_event,
  382. .setup = alc262_hippo_setup,
  383. .init_hook = alc_inithook,
  384. },
  385. [ALC262_HIPPO_1] = {
  386. .mixers = { alc262_hippo1_mixer },
  387. .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
  388. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  389. .dac_nids = alc262_dac_nids,
  390. .hp_nid = 0x02,
  391. .dig_out_nid = ALC262_DIGOUT_NID,
  392. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  393. .channel_mode = alc262_modes,
  394. .input_mux = &alc262_capture_source,
  395. .unsol_event = alc_sku_unsol_event,
  396. .setup = alc262_hippo1_setup,
  397. .init_hook = alc_inithook,
  398. },
  399. [ALC262_ULTRA] = {
  400. .mixers = { alc262_ultra_mixer },
  401. .cap_mixer = alc262_ultra_capture_mixer,
  402. .init_verbs = { alc262_ultra_verbs },
  403. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  404. .dac_nids = alc262_dac_nids,
  405. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  406. .channel_mode = alc262_modes,
  407. .input_mux = &alc262_ultra_capture_source,
  408. .adc_nids = alc262_adc_nids, /* ADC0 */
  409. .capsrc_nids = alc262_capsrc_nids,
  410. .num_adc_nids = 1, /* single ADC */
  411. .unsol_event = alc262_ultra_unsol_event,
  412. .init_hook = alc262_ultra_automute,
  413. },
  414. };