alc262_quirks.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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_FUJITSU,
  12. ALC262_BENQ_ED8,
  13. ALC262_BENQ_T31,
  14. ALC262_ULTRA,
  15. ALC262_LENOVO_3000,
  16. ALC262_NEC,
  17. ALC262_TOSHIBA_S06,
  18. ALC262_TOSHIBA_RX1,
  19. ALC262_TYAN,
  20. ALC262_MODEL_LAST /* last tag */
  21. };
  22. #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
  23. #define ALC262_DIGIN_NID ALC880_DIGIN_NID
  24. #define alc262_dac_nids alc260_dac_nids
  25. #define alc262_adc_nids alc882_adc_nids
  26. #define alc262_adc_nids_alt alc882_adc_nids_alt
  27. #define alc262_capsrc_nids alc882_capsrc_nids
  28. #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
  29. #define alc262_modes alc260_modes
  30. #define alc262_capture_source alc882_capture_source
  31. static const hda_nid_t alc262_dmic_adc_nids[1] = {
  32. /* ADC0 */
  33. 0x09
  34. };
  35. static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
  36. static const struct snd_kcontrol_new alc262_base_mixer[] = {
  37. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  38. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  39. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  40. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  41. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  42. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  43. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  44. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  45. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  46. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  47. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  48. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  49. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
  50. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  51. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  52. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  53. { } /* end */
  54. };
  55. /* bind hp and internal speaker mute (with plug check) as master switch */
  56. static void alc262_hippo_master_update(struct hda_codec *codec)
  57. {
  58. update_speakers(codec);
  59. }
  60. static int alc262_hippo_master_sw_get(struct snd_kcontrol *kcontrol,
  61. struct snd_ctl_elem_value *ucontrol)
  62. {
  63. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  64. struct alc_spec *spec = codec->spec;
  65. *ucontrol->value.integer.value = !spec->master_mute;
  66. return 0;
  67. }
  68. static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
  69. struct snd_ctl_elem_value *ucontrol)
  70. {
  71. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  72. struct alc_spec *spec = codec->spec;
  73. int val = !*ucontrol->value.integer.value;
  74. if (val == spec->master_mute)
  75. return 0;
  76. spec->master_mute = val;
  77. alc262_hippo_master_update(codec);
  78. return 1;
  79. }
  80. #define ALC262_HIPPO_MASTER_SWITCH \
  81. { \
  82. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  83. .name = "Master Playback Switch", \
  84. .info = snd_ctl_boolean_mono_info, \
  85. .get = alc262_hippo_master_sw_get, \
  86. .put = alc262_hippo_master_sw_put, \
  87. }, \
  88. { \
  89. .iface = NID_MAPPING, \
  90. .name = "Master Playback Switch", \
  91. .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
  92. (SUBDEV_SPEAKER(0) << 16), \
  93. }
  94. #define alc262_hp_master_sw_get alc262_hippo_master_sw_get
  95. #define alc262_hp_master_sw_put alc262_hippo_master_sw_put
  96. static const struct snd_kcontrol_new alc262_hippo_mixer[] = {
  97. ALC262_HIPPO_MASTER_SWITCH,
  98. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  99. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  100. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  101. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  102. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  103. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  104. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  105. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  106. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  107. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  108. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  109. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  110. { } /* end */
  111. };
  112. static const struct snd_kcontrol_new alc262_hippo1_mixer[] = {
  113. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  114. ALC262_HIPPO_MASTER_SWITCH,
  115. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  116. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  117. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  118. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  119. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  120. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  121. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  122. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  123. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  124. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  125. { } /* end */
  126. };
  127. /* mute/unmute internal speaker according to the hp jack and mute state */
  128. static void alc262_hippo_setup(struct hda_codec *codec)
  129. {
  130. struct alc_spec *spec = codec->spec;
  131. spec->autocfg.hp_pins[0] = 0x15;
  132. spec->autocfg.speaker_pins[0] = 0x14;
  133. spec->automute = 1;
  134. spec->automute_mode = ALC_AUTOMUTE_AMP;
  135. }
  136. static void alc262_hippo1_setup(struct hda_codec *codec)
  137. {
  138. struct alc_spec *spec = codec->spec;
  139. spec->autocfg.hp_pins[0] = 0x1b;
  140. spec->autocfg.speaker_pins[0] = 0x14;
  141. spec->automute = 1;
  142. spec->automute_mode = ALC_AUTOMUTE_AMP;
  143. }
  144. static const struct snd_kcontrol_new alc262_sony_mixer[] = {
  145. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  146. ALC262_HIPPO_MASTER_SWITCH,
  147. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  148. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  149. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  150. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  151. { } /* end */
  152. };
  153. static const struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
  154. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  155. ALC262_HIPPO_MASTER_SWITCH,
  156. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  157. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  158. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  159. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  160. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  161. { } /* end */
  162. };
  163. static const struct snd_kcontrol_new alc262_tyan_mixer[] = {
  164. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  165. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  166. HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
  167. HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
  168. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  169. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  170. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  171. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  172. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  173. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  174. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  175. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  176. { } /* end */
  177. };
  178. static const struct hda_verb alc262_tyan_verbs[] = {
  179. /* Headphone automute */
  180. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  181. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  182. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  183. /* P11 AUX_IN, white 4-pin connector */
  184. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  185. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
  186. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
  187. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
  188. {}
  189. };
  190. /* unsolicited event for HP jack sensing */
  191. static void alc262_tyan_setup(struct hda_codec *codec)
  192. {
  193. struct alc_spec *spec = codec->spec;
  194. spec->autocfg.hp_pins[0] = 0x1b;
  195. spec->autocfg.speaker_pins[0] = 0x15;
  196. spec->automute = 1;
  197. spec->automute_mode = ALC_AUTOMUTE_AMP;
  198. }
  199. #define alc262_capture_mixer alc882_capture_mixer
  200. #define alc262_capture_alt_mixer alc882_capture_alt_mixer
  201. /*
  202. * generic initialization of ADC, input mixers and output mixers
  203. */
  204. static const struct hda_verb alc262_init_verbs[] = {
  205. /*
  206. * Unmute ADC0-2 and set the default input to mic-in
  207. */
  208. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  209. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  210. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  211. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  212. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  213. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  214. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  215. * mixer widget
  216. * Note: PASD motherboards uses the Line In 2 as the input for
  217. * front panel mic (mic 2)
  218. */
  219. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  220. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  221. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  222. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  223. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  224. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  225. /*
  226. * Set up output mixers (0x0c - 0x0e)
  227. */
  228. /* set vol=0 to output mixers */
  229. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  230. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  231. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  232. /* set up input amps for analog loopback */
  233. /* Amp Indices: DAC = 0, mixer = 1 */
  234. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  235. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  236. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  237. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  238. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  239. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  240. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  241. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  242. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  243. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  244. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  245. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  246. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  247. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  248. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  249. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  250. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  251. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  252. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  253. /* FIXME: use matrix-type input source selection */
  254. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  255. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  256. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  257. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  258. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  259. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  260. /* Input mixer2 */
  261. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  262. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  263. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  264. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  265. /* Input mixer3 */
  266. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  267. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  268. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  269. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  270. { }
  271. };
  272. static const struct hda_verb alc262_eapd_verbs[] = {
  273. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  274. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  275. { }
  276. };
  277. static const struct hda_verb alc262_hippo1_unsol_verbs[] = {
  278. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  279. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  280. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  281. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  282. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  283. {}
  284. };
  285. static const struct hda_verb alc262_sony_unsol_verbs[] = {
  286. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  287. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  288. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
  289. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  290. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  291. {}
  292. };
  293. static const struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
  294. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  295. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  296. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  297. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  298. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  299. { } /* end */
  300. };
  301. static const struct hda_verb alc262_toshiba_s06_verbs[] = {
  302. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  303. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  304. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  305. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  306. {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
  307. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  308. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  309. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  310. {}
  311. };
  312. static void alc262_toshiba_s06_setup(struct hda_codec *codec)
  313. {
  314. struct alc_spec *spec = codec->spec;
  315. spec->autocfg.hp_pins[0] = 0x15;
  316. spec->autocfg.speaker_pins[0] = 0x14;
  317. spec->ext_mic_pin = 0x18;
  318. spec->int_mic_pin = 0x12;
  319. spec->auto_mic = 1;
  320. spec->automute = 1;
  321. spec->automute_mode = ALC_AUTOMUTE_PIN;
  322. }
  323. /*
  324. * nec model
  325. * 0x15 = headphone
  326. * 0x16 = internal speaker
  327. * 0x18 = external mic
  328. */
  329. static const struct snd_kcontrol_new alc262_nec_mixer[] = {
  330. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  331. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
  332. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  333. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  334. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  335. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  336. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  337. { } /* end */
  338. };
  339. static const struct hda_verb alc262_nec_verbs[] = {
  340. /* Unmute Speaker */
  341. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  342. /* Headphone */
  343. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  344. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  345. /* External mic to headphone */
  346. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  347. /* External mic to speaker */
  348. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  349. {}
  350. };
  351. /*
  352. * fujitsu model
  353. * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
  354. * 0x1b = port replicator headphone out
  355. */
  356. static const struct hda_verb alc262_fujitsu_unsol_verbs[] = {
  357. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  358. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  359. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  360. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  361. {}
  362. };
  363. static const struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
  364. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  365. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  366. {}
  367. };
  368. static const struct hda_verb alc262_lenovo_3000_init_verbs[] = {
  369. /* Front Mic pin: input vref at 50% */
  370. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  371. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  372. {}
  373. };
  374. static const struct hda_input_mux alc262_fujitsu_capture_source = {
  375. .num_items = 3,
  376. .items = {
  377. { "Mic", 0x0 },
  378. { "Internal Mic", 0x1 },
  379. { "CD", 0x4 },
  380. },
  381. };
  382. static void alc262_fujitsu_setup(struct hda_codec *codec)
  383. {
  384. struct alc_spec *spec = codec->spec;
  385. spec->autocfg.hp_pins[0] = 0x14;
  386. spec->autocfg.hp_pins[1] = 0x1b;
  387. spec->autocfg.speaker_pins[0] = 0x15;
  388. spec->automute = 1;
  389. spec->automute_mode = ALC_AUTOMUTE_AMP;
  390. }
  391. /* bind volumes of both NID 0x0c and 0x0d */
  392. static const struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
  393. .ops = &snd_hda_bind_vol,
  394. .values = {
  395. HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
  396. HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
  397. 0
  398. },
  399. };
  400. static const struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
  401. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  402. {
  403. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  404. .name = "Master Playback Switch",
  405. .subdevice = HDA_SUBDEV_NID_FLAG | 0x14,
  406. .info = snd_ctl_boolean_mono_info,
  407. .get = alc262_hp_master_sw_get,
  408. .put = alc262_hp_master_sw_put,
  409. },
  410. {
  411. .iface = NID_MAPPING,
  412. .name = "Master Playback Switch",
  413. .private_value = 0x1b,
  414. },
  415. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  416. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  417. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  418. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  419. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  420. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  421. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  422. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  423. { } /* end */
  424. };
  425. static void alc262_lenovo_3000_setup(struct hda_codec *codec)
  426. {
  427. struct alc_spec *spec = codec->spec;
  428. spec->autocfg.hp_pins[0] = 0x1b;
  429. spec->autocfg.speaker_pins[0] = 0x14;
  430. spec->autocfg.speaker_pins[1] = 0x16;
  431. spec->automute = 1;
  432. spec->automute_mode = ALC_AUTOMUTE_AMP;
  433. }
  434. static const struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
  435. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  436. {
  437. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  438. .name = "Master Playback Switch",
  439. .subdevice = HDA_SUBDEV_NID_FLAG | 0x1b,
  440. .info = snd_ctl_boolean_mono_info,
  441. .get = alc262_hp_master_sw_get,
  442. .put = alc262_hp_master_sw_put,
  443. },
  444. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  445. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  446. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  447. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  448. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  449. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  450. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  451. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  452. { } /* end */
  453. };
  454. static const struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
  455. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  456. ALC262_HIPPO_MASTER_SWITCH,
  457. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  458. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  459. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  460. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  461. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  462. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  463. { } /* end */
  464. };
  465. /* additional init verbs for Benq laptops */
  466. static const struct hda_verb alc262_EAPD_verbs[] = {
  467. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  468. {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
  469. {}
  470. };
  471. static const struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
  472. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  473. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  474. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  475. {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
  476. {}
  477. };
  478. /* Samsung Q1 Ultra Vista model setup */
  479. static const struct snd_kcontrol_new alc262_ultra_mixer[] = {
  480. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  481. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  482. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  483. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  484. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
  485. HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT),
  486. { } /* end */
  487. };
  488. static const struct hda_verb alc262_ultra_verbs[] = {
  489. /* output mixer */
  490. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  491. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  492. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  493. /* speaker */
  494. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  495. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  496. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  497. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  498. /* HP */
  499. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  500. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  501. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  502. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  503. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  504. /* internal mic */
  505. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  506. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  507. /* ADC, choose mic */
  508. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  509. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  510. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  511. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  512. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  513. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  514. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  515. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  516. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  517. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
  518. {}
  519. };
  520. /* mute/unmute internal speaker according to the hp jack and mute state */
  521. static void alc262_ultra_automute(struct hda_codec *codec)
  522. {
  523. struct alc_spec *spec = codec->spec;
  524. unsigned int mute;
  525. mute = 0;
  526. /* auto-mute only when HP is used as HP */
  527. if (!spec->cur_mux[0]) {
  528. spec->jack_present = snd_hda_jack_detect(codec, 0x15);
  529. if (spec->jack_present)
  530. mute = HDA_AMP_MUTE;
  531. }
  532. /* mute/unmute internal speaker */
  533. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  534. HDA_AMP_MUTE, mute);
  535. /* mute/unmute HP */
  536. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  537. HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
  538. }
  539. /* unsolicited event for HP jack sensing */
  540. static void alc262_ultra_unsol_event(struct hda_codec *codec,
  541. unsigned int res)
  542. {
  543. if ((res >> 26) != ALC_HP_EVENT)
  544. return;
  545. alc262_ultra_automute(codec);
  546. }
  547. static const struct hda_input_mux alc262_ultra_capture_source = {
  548. .num_items = 2,
  549. .items = {
  550. { "Mic", 0x1 },
  551. { "Headphone", 0x7 },
  552. },
  553. };
  554. static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
  555. struct snd_ctl_elem_value *ucontrol)
  556. {
  557. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  558. struct alc_spec *spec = codec->spec;
  559. int ret;
  560. ret = alc_mux_enum_put(kcontrol, ucontrol);
  561. if (!ret)
  562. return 0;
  563. /* reprogram the HP pin as mic or HP according to the input source */
  564. snd_hda_codec_write_cache(codec, 0x15, 0,
  565. AC_VERB_SET_PIN_WIDGET_CONTROL,
  566. spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
  567. alc262_ultra_automute(codec); /* mute/unmute HP */
  568. return ret;
  569. }
  570. static const struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
  571. HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
  572. HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
  573. {
  574. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  575. .name = "Capture Source",
  576. .info = alc_mux_enum_info,
  577. .get = alc_mux_enum_get,
  578. .put = alc262_ultra_mux_enum_put,
  579. },
  580. {
  581. .iface = NID_MAPPING,
  582. .name = "Capture Source",
  583. .private_value = 0x15,
  584. },
  585. { } /* end */
  586. };
  587. static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
  588. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
  589. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  590. {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
  591. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
  592. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
  593. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
  594. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
  595. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
  596. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  597. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  598. {}
  599. };
  600. /*
  601. * configuration and preset
  602. */
  603. static const char * const alc262_models[ALC262_MODEL_LAST] = {
  604. [ALC262_BASIC] = "basic",
  605. [ALC262_HIPPO] = "hippo",
  606. [ALC262_HIPPO_1] = "hippo_1",
  607. [ALC262_FUJITSU] = "fujitsu",
  608. [ALC262_BENQ_ED8] = "benq",
  609. [ALC262_BENQ_T31] = "benq-t31",
  610. [ALC262_TOSHIBA_S06] = "toshiba-s06",
  611. [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
  612. [ALC262_ULTRA] = "ultra",
  613. [ALC262_LENOVO_3000] = "lenovo-3000",
  614. [ALC262_NEC] = "nec",
  615. [ALC262_TYAN] = "tyan",
  616. [ALC262_AUTO] = "auto",
  617. };
  618. static const struct snd_pci_quirk alc262_cfg_tbl[] = {
  619. SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
  620. SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
  621. SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
  622. ALC262_TOSHIBA_RX1),
  623. SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
  624. SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
  625. SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
  626. SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
  627. SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
  628. ALC262_ULTRA),
  629. SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
  630. SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
  631. SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
  632. SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
  633. SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
  634. {}
  635. };
  636. static const struct alc_config_preset alc262_presets[] = {
  637. [ALC262_BASIC] = {
  638. .mixers = { alc262_base_mixer },
  639. .init_verbs = { alc262_init_verbs },
  640. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  641. .dac_nids = alc262_dac_nids,
  642. .hp_nid = 0x03,
  643. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  644. .channel_mode = alc262_modes,
  645. .input_mux = &alc262_capture_source,
  646. },
  647. [ALC262_HIPPO] = {
  648. .mixers = { alc262_hippo_mixer },
  649. .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
  650. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  651. .dac_nids = alc262_dac_nids,
  652. .hp_nid = 0x03,
  653. .dig_out_nid = ALC262_DIGOUT_NID,
  654. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  655. .channel_mode = alc262_modes,
  656. .input_mux = &alc262_capture_source,
  657. .unsol_event = alc_sku_unsol_event,
  658. .setup = alc262_hippo_setup,
  659. .init_hook = alc_inithook,
  660. },
  661. [ALC262_HIPPO_1] = {
  662. .mixers = { alc262_hippo1_mixer },
  663. .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
  664. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  665. .dac_nids = alc262_dac_nids,
  666. .hp_nid = 0x02,
  667. .dig_out_nid = ALC262_DIGOUT_NID,
  668. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  669. .channel_mode = alc262_modes,
  670. .input_mux = &alc262_capture_source,
  671. .unsol_event = alc_sku_unsol_event,
  672. .setup = alc262_hippo1_setup,
  673. .init_hook = alc_inithook,
  674. },
  675. [ALC262_FUJITSU] = {
  676. .mixers = { alc262_fujitsu_mixer },
  677. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
  678. alc262_fujitsu_unsol_verbs },
  679. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  680. .dac_nids = alc262_dac_nids,
  681. .hp_nid = 0x03,
  682. .dig_out_nid = ALC262_DIGOUT_NID,
  683. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  684. .channel_mode = alc262_modes,
  685. .input_mux = &alc262_fujitsu_capture_source,
  686. .unsol_event = alc_sku_unsol_event,
  687. .setup = alc262_fujitsu_setup,
  688. .init_hook = alc_inithook,
  689. },
  690. [ALC262_BENQ_ED8] = {
  691. .mixers = { alc262_base_mixer },
  692. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
  693. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  694. .dac_nids = alc262_dac_nids,
  695. .hp_nid = 0x03,
  696. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  697. .channel_mode = alc262_modes,
  698. .input_mux = &alc262_capture_source,
  699. },
  700. [ALC262_BENQ_T31] = {
  701. .mixers = { alc262_benq_t31_mixer },
  702. .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
  703. alc_hp15_unsol_verbs },
  704. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  705. .dac_nids = alc262_dac_nids,
  706. .hp_nid = 0x03,
  707. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  708. .channel_mode = alc262_modes,
  709. .input_mux = &alc262_capture_source,
  710. .unsol_event = alc_sku_unsol_event,
  711. .setup = alc262_hippo_setup,
  712. .init_hook = alc_inithook,
  713. },
  714. [ALC262_ULTRA] = {
  715. .mixers = { alc262_ultra_mixer },
  716. .cap_mixer = alc262_ultra_capture_mixer,
  717. .init_verbs = { alc262_ultra_verbs },
  718. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  719. .dac_nids = alc262_dac_nids,
  720. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  721. .channel_mode = alc262_modes,
  722. .input_mux = &alc262_ultra_capture_source,
  723. .adc_nids = alc262_adc_nids, /* ADC0 */
  724. .capsrc_nids = alc262_capsrc_nids,
  725. .num_adc_nids = 1, /* single ADC */
  726. .unsol_event = alc262_ultra_unsol_event,
  727. .init_hook = alc262_ultra_automute,
  728. },
  729. [ALC262_LENOVO_3000] = {
  730. .mixers = { alc262_lenovo_3000_mixer },
  731. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
  732. alc262_lenovo_3000_unsol_verbs,
  733. alc262_lenovo_3000_init_verbs },
  734. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  735. .dac_nids = alc262_dac_nids,
  736. .hp_nid = 0x03,
  737. .dig_out_nid = ALC262_DIGOUT_NID,
  738. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  739. .channel_mode = alc262_modes,
  740. .input_mux = &alc262_fujitsu_capture_source,
  741. .unsol_event = alc_sku_unsol_event,
  742. .setup = alc262_lenovo_3000_setup,
  743. .init_hook = alc_inithook,
  744. },
  745. [ALC262_NEC] = {
  746. .mixers = { alc262_nec_mixer },
  747. .init_verbs = { alc262_nec_verbs },
  748. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  749. .dac_nids = alc262_dac_nids,
  750. .hp_nid = 0x03,
  751. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  752. .channel_mode = alc262_modes,
  753. .input_mux = &alc262_capture_source,
  754. },
  755. [ALC262_TOSHIBA_S06] = {
  756. .mixers = { alc262_toshiba_s06_mixer },
  757. .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
  758. alc262_eapd_verbs },
  759. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  760. .capsrc_nids = alc262_dmic_capsrc_nids,
  761. .dac_nids = alc262_dac_nids,
  762. .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
  763. .num_adc_nids = 1, /* single ADC */
  764. .dig_out_nid = ALC262_DIGOUT_NID,
  765. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  766. .channel_mode = alc262_modes,
  767. .unsol_event = alc_sku_unsol_event,
  768. .setup = alc262_toshiba_s06_setup,
  769. .init_hook = alc_inithook,
  770. },
  771. [ALC262_TOSHIBA_RX1] = {
  772. .mixers = { alc262_toshiba_rx1_mixer },
  773. .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
  774. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  775. .dac_nids = alc262_dac_nids,
  776. .hp_nid = 0x03,
  777. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  778. .channel_mode = alc262_modes,
  779. .input_mux = &alc262_capture_source,
  780. .unsol_event = alc_sku_unsol_event,
  781. .setup = alc262_hippo_setup,
  782. .init_hook = alc_inithook,
  783. },
  784. [ALC262_TYAN] = {
  785. .mixers = { alc262_tyan_mixer },
  786. .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
  787. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  788. .dac_nids = alc262_dac_nids,
  789. .hp_nid = 0x02,
  790. .dig_out_nid = ALC262_DIGOUT_NID,
  791. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  792. .channel_mode = alc262_modes,
  793. .input_mux = &alc262_capture_source,
  794. .unsol_event = alc_sku_unsol_event,
  795. .setup = alc262_tyan_setup,
  796. .init_hook = alc_hp_automute,
  797. },
  798. };