alc262_quirks.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353
  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_HP_BPC,
  13. ALC262_HP_BPC_D7000_WL,
  14. ALC262_HP_BPC_D7000_WF,
  15. ALC262_HP_TC_T5735,
  16. ALC262_HP_RP5700,
  17. ALC262_BENQ_ED8,
  18. ALC262_SONY_ASSAMD,
  19. ALC262_BENQ_T31,
  20. ALC262_ULTRA,
  21. ALC262_LENOVO_3000,
  22. ALC262_NEC,
  23. ALC262_TOSHIBA_S06,
  24. ALC262_TOSHIBA_RX1,
  25. ALC262_TYAN,
  26. ALC262_MODEL_LAST /* last tag */
  27. };
  28. #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
  29. #define ALC262_DIGIN_NID ALC880_DIGIN_NID
  30. #define alc262_dac_nids alc260_dac_nids
  31. #define alc262_adc_nids alc882_adc_nids
  32. #define alc262_adc_nids_alt alc882_adc_nids_alt
  33. #define alc262_capsrc_nids alc882_capsrc_nids
  34. #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
  35. #define alc262_modes alc260_modes
  36. #define alc262_capture_source alc882_capture_source
  37. static const hda_nid_t alc262_dmic_adc_nids[1] = {
  38. /* ADC0 */
  39. 0x09
  40. };
  41. static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
  42. static const struct snd_kcontrol_new alc262_base_mixer[] = {
  43. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  44. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  45. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  46. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  47. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  48. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  49. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  50. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  51. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  52. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  53. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  54. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  55. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
  56. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  57. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  58. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  59. { } /* end */
  60. };
  61. /* update HP, line and mono-out pins according to the master switch */
  62. #define alc262_hp_master_update alc260_hp_master_update
  63. static void alc262_hp_bpc_setup(struct hda_codec *codec)
  64. {
  65. struct alc_spec *spec = codec->spec;
  66. spec->autocfg.hp_pins[0] = 0x1b;
  67. spec->autocfg.speaker_pins[0] = 0x16;
  68. spec->automute = 1;
  69. spec->automute_mode = ALC_AUTOMUTE_PIN;
  70. }
  71. static void alc262_hp_wildwest_setup(struct hda_codec *codec)
  72. {
  73. struct alc_spec *spec = codec->spec;
  74. spec->autocfg.hp_pins[0] = 0x15;
  75. spec->autocfg.speaker_pins[0] = 0x16;
  76. spec->automute = 1;
  77. spec->automute_mode = ALC_AUTOMUTE_PIN;
  78. }
  79. #define alc262_hp_master_sw_get alc260_hp_master_sw_get
  80. #define alc262_hp_master_sw_put alc260_hp_master_sw_put
  81. #define ALC262_HP_MASTER_SWITCH \
  82. { \
  83. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  84. .name = "Master Playback Switch", \
  85. .info = snd_ctl_boolean_mono_info, \
  86. .get = alc262_hp_master_sw_get, \
  87. .put = alc262_hp_master_sw_put, \
  88. }, \
  89. { \
  90. .iface = NID_MAPPING, \
  91. .name = "Master Playback Switch", \
  92. .private_value = 0x15 | (0x16 << 8) | (0x1b << 16), \
  93. }
  94. static const struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
  95. ALC262_HP_MASTER_SWITCH,
  96. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  97. HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  98. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  99. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
  100. HDA_OUTPUT),
  101. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
  102. HDA_OUTPUT),
  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("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  110. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  111. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  112. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  113. HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
  114. HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
  115. { } /* end */
  116. };
  117. static const struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
  118. ALC262_HP_MASTER_SWITCH,
  119. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  120. HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  121. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  122. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  123. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
  124. HDA_OUTPUT),
  125. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
  126. HDA_OUTPUT),
  127. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
  128. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
  129. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x1a, 0, HDA_INPUT),
  130. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
  131. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
  132. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  133. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  134. { } /* end */
  135. };
  136. static const struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
  137. HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  138. HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  139. HDA_CODEC_VOLUME("Rear Mic Boost Volume", 0x18, 0, HDA_INPUT),
  140. { } /* end */
  141. };
  142. /* mute/unmute internal speaker according to the hp jack and mute state */
  143. static void alc262_hp_t5735_setup(struct hda_codec *codec)
  144. {
  145. struct alc_spec *spec = codec->spec;
  146. spec->autocfg.hp_pins[0] = 0x15;
  147. spec->autocfg.speaker_pins[0] = 0x14;
  148. spec->automute = 1;
  149. spec->automute_mode = ALC_AUTOMUTE_PIN;
  150. }
  151. static const struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
  152. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  153. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  154. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  155. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  156. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  157. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  158. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  159. { } /* end */
  160. };
  161. static const struct hda_verb alc262_hp_t5735_verbs[] = {
  162. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  163. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  164. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  165. { }
  166. };
  167. static const struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
  168. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  169. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  170. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
  171. HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
  172. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
  173. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
  174. { } /* end */
  175. };
  176. static const struct hda_verb alc262_hp_rp5700_verbs[] = {
  177. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  178. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  179. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  180. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  181. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  182. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  183. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  184. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  185. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
  186. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
  187. {}
  188. };
  189. static const struct hda_input_mux alc262_hp_rp5700_capture_source = {
  190. .num_items = 1,
  191. .items = {
  192. { "Line", 0x1 },
  193. },
  194. };
  195. /* bind hp and internal speaker mute (with plug check) as master switch */
  196. #define alc262_hippo_master_update alc262_hp_master_update
  197. #define alc262_hippo_master_sw_get alc262_hp_master_sw_get
  198. #define alc262_hippo_master_sw_put alc262_hp_master_sw_put
  199. #define ALC262_HIPPO_MASTER_SWITCH \
  200. { \
  201. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  202. .name = "Master Playback Switch", \
  203. .info = snd_ctl_boolean_mono_info, \
  204. .get = alc262_hippo_master_sw_get, \
  205. .put = alc262_hippo_master_sw_put, \
  206. }, \
  207. { \
  208. .iface = NID_MAPPING, \
  209. .name = "Master Playback Switch", \
  210. .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
  211. (SUBDEV_SPEAKER(0) << 16), \
  212. }
  213. static const struct snd_kcontrol_new alc262_hippo_mixer[] = {
  214. ALC262_HIPPO_MASTER_SWITCH,
  215. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  216. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  217. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  218. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  219. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  220. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  221. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  222. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  223. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  224. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  225. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  226. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  227. { } /* end */
  228. };
  229. static const struct snd_kcontrol_new alc262_hippo1_mixer[] = {
  230. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  231. ALC262_HIPPO_MASTER_SWITCH,
  232. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  233. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  234. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  235. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  236. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  237. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  238. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  239. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  240. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  241. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  242. { } /* end */
  243. };
  244. /* mute/unmute internal speaker according to the hp jack and mute state */
  245. static void alc262_hippo_setup(struct hda_codec *codec)
  246. {
  247. struct alc_spec *spec = codec->spec;
  248. spec->autocfg.hp_pins[0] = 0x15;
  249. spec->autocfg.speaker_pins[0] = 0x14;
  250. spec->automute = 1;
  251. spec->automute_mode = ALC_AUTOMUTE_AMP;
  252. }
  253. static void alc262_hippo1_setup(struct hda_codec *codec)
  254. {
  255. struct alc_spec *spec = codec->spec;
  256. spec->autocfg.hp_pins[0] = 0x1b;
  257. spec->autocfg.speaker_pins[0] = 0x14;
  258. spec->automute = 1;
  259. spec->automute_mode = ALC_AUTOMUTE_AMP;
  260. }
  261. static const struct snd_kcontrol_new alc262_sony_mixer[] = {
  262. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  263. ALC262_HIPPO_MASTER_SWITCH,
  264. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  265. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  266. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  267. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  268. { } /* end */
  269. };
  270. static const struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
  271. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  272. ALC262_HIPPO_MASTER_SWITCH,
  273. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  274. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  275. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  276. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  277. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  278. { } /* end */
  279. };
  280. static const struct snd_kcontrol_new alc262_tyan_mixer[] = {
  281. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  282. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  283. HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
  284. HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
  285. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  286. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  287. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  288. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  289. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  290. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  291. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  292. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  293. { } /* end */
  294. };
  295. static const struct hda_verb alc262_tyan_verbs[] = {
  296. /* Headphone automute */
  297. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  298. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  299. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  300. /* P11 AUX_IN, white 4-pin connector */
  301. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  302. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
  303. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
  304. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
  305. {}
  306. };
  307. /* unsolicited event for HP jack sensing */
  308. static void alc262_tyan_setup(struct hda_codec *codec)
  309. {
  310. struct alc_spec *spec = codec->spec;
  311. spec->autocfg.hp_pins[0] = 0x1b;
  312. spec->autocfg.speaker_pins[0] = 0x15;
  313. spec->automute = 1;
  314. spec->automute_mode = ALC_AUTOMUTE_AMP;
  315. }
  316. #define alc262_capture_mixer alc882_capture_mixer
  317. #define alc262_capture_alt_mixer alc882_capture_alt_mixer
  318. /*
  319. * generic initialization of ADC, input mixers and output mixers
  320. */
  321. static const struct hda_verb alc262_init_verbs[] = {
  322. /*
  323. * Unmute ADC0-2 and set the default input to mic-in
  324. */
  325. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  326. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  327. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  328. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  329. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  330. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  331. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  332. * mixer widget
  333. * Note: PASD motherboards uses the Line In 2 as the input for
  334. * front panel mic (mic 2)
  335. */
  336. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  337. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  338. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  339. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  340. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  341. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  342. /*
  343. * Set up output mixers (0x0c - 0x0e)
  344. */
  345. /* set vol=0 to output mixers */
  346. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  347. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  348. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  349. /* set up input amps for analog loopback */
  350. /* Amp Indices: DAC = 0, mixer = 1 */
  351. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  352. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  353. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  354. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  355. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  356. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  357. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  358. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  359. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  360. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  361. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  362. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  363. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  364. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  365. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  366. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  367. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  368. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  369. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  370. /* FIXME: use matrix-type input source selection */
  371. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  372. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  373. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  374. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  375. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  376. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  377. /* Input mixer2 */
  378. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  379. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  380. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  381. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  382. /* Input mixer3 */
  383. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  384. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  385. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  386. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  387. { }
  388. };
  389. static const struct hda_verb alc262_eapd_verbs[] = {
  390. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  391. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  392. { }
  393. };
  394. static const struct hda_verb alc262_hippo1_unsol_verbs[] = {
  395. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  396. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  397. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  398. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  399. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  400. {}
  401. };
  402. static const struct hda_verb alc262_sony_unsol_verbs[] = {
  403. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  404. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  405. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
  406. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  407. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  408. {}
  409. };
  410. static const struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
  411. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  412. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  413. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  414. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  415. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  416. { } /* end */
  417. };
  418. static const struct hda_verb alc262_toshiba_s06_verbs[] = {
  419. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  420. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  421. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  422. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  423. {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
  424. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  425. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
  426. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  427. {}
  428. };
  429. static void alc262_toshiba_s06_setup(struct hda_codec *codec)
  430. {
  431. struct alc_spec *spec = codec->spec;
  432. spec->autocfg.hp_pins[0] = 0x15;
  433. spec->autocfg.speaker_pins[0] = 0x14;
  434. spec->ext_mic_pin = 0x18;
  435. spec->int_mic_pin = 0x12;
  436. spec->auto_mic = 1;
  437. spec->automute = 1;
  438. spec->automute_mode = ALC_AUTOMUTE_PIN;
  439. }
  440. /*
  441. * nec model
  442. * 0x15 = headphone
  443. * 0x16 = internal speaker
  444. * 0x18 = external mic
  445. */
  446. static const struct snd_kcontrol_new alc262_nec_mixer[] = {
  447. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  448. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
  449. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  450. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  451. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  452. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  453. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  454. { } /* end */
  455. };
  456. static const struct hda_verb alc262_nec_verbs[] = {
  457. /* Unmute Speaker */
  458. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  459. /* Headphone */
  460. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  461. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  462. /* External mic to headphone */
  463. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  464. /* External mic to speaker */
  465. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  466. {}
  467. };
  468. /*
  469. * fujitsu model
  470. * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
  471. * 0x1b = port replicator headphone out
  472. */
  473. static const struct hda_verb alc262_fujitsu_unsol_verbs[] = {
  474. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  475. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  476. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  477. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  478. {}
  479. };
  480. static const struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
  481. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  482. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  483. {}
  484. };
  485. static const struct hda_verb alc262_lenovo_3000_init_verbs[] = {
  486. /* Front Mic pin: input vref at 50% */
  487. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  488. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  489. {}
  490. };
  491. static const struct hda_input_mux alc262_fujitsu_capture_source = {
  492. .num_items = 3,
  493. .items = {
  494. { "Mic", 0x0 },
  495. { "Internal Mic", 0x1 },
  496. { "CD", 0x4 },
  497. },
  498. };
  499. static const struct hda_input_mux alc262_HP_capture_source = {
  500. .num_items = 5,
  501. .items = {
  502. { "Mic", 0x0 },
  503. { "Front Mic", 0x1 },
  504. { "Line", 0x2 },
  505. { "CD", 0x4 },
  506. { "AUX IN", 0x6 },
  507. },
  508. };
  509. static const struct hda_input_mux alc262_HP_D7000_capture_source = {
  510. .num_items = 4,
  511. .items = {
  512. { "Mic", 0x0 },
  513. { "Front Mic", 0x2 },
  514. { "Line", 0x1 },
  515. { "CD", 0x4 },
  516. },
  517. };
  518. static void alc262_fujitsu_setup(struct hda_codec *codec)
  519. {
  520. struct alc_spec *spec = codec->spec;
  521. spec->autocfg.hp_pins[0] = 0x14;
  522. spec->autocfg.hp_pins[1] = 0x1b;
  523. spec->autocfg.speaker_pins[0] = 0x15;
  524. spec->automute = 1;
  525. spec->automute_mode = ALC_AUTOMUTE_AMP;
  526. }
  527. /* bind volumes of both NID 0x0c and 0x0d */
  528. static const struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
  529. .ops = &snd_hda_bind_vol,
  530. .values = {
  531. HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
  532. HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
  533. 0
  534. },
  535. };
  536. static const struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
  537. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  538. {
  539. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  540. .name = "Master Playback Switch",
  541. .subdevice = HDA_SUBDEV_NID_FLAG | 0x14,
  542. .info = snd_ctl_boolean_mono_info,
  543. .get = alc262_hp_master_sw_get,
  544. .put = alc262_hp_master_sw_put,
  545. },
  546. {
  547. .iface = NID_MAPPING,
  548. .name = "Master Playback Switch",
  549. .private_value = 0x1b,
  550. },
  551. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  552. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  553. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  554. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  555. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  556. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  557. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  558. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  559. { } /* end */
  560. };
  561. static void alc262_lenovo_3000_setup(struct hda_codec *codec)
  562. {
  563. struct alc_spec *spec = codec->spec;
  564. spec->autocfg.hp_pins[0] = 0x1b;
  565. spec->autocfg.speaker_pins[0] = 0x14;
  566. spec->autocfg.speaker_pins[1] = 0x16;
  567. spec->automute = 1;
  568. spec->automute_mode = ALC_AUTOMUTE_AMP;
  569. }
  570. static const struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
  571. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  572. {
  573. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  574. .name = "Master Playback Switch",
  575. .subdevice = HDA_SUBDEV_NID_FLAG | 0x1b,
  576. .info = snd_ctl_boolean_mono_info,
  577. .get = alc262_hp_master_sw_get,
  578. .put = alc262_hp_master_sw_put,
  579. },
  580. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  581. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  582. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  583. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  584. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  585. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  586. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  587. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  588. { } /* end */
  589. };
  590. static const struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
  591. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  592. ALC262_HIPPO_MASTER_SWITCH,
  593. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  594. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  595. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  596. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  597. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  598. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  599. { } /* end */
  600. };
  601. /* additional init verbs for Benq laptops */
  602. static const struct hda_verb alc262_EAPD_verbs[] = {
  603. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  604. {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
  605. {}
  606. };
  607. static const struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
  608. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  609. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  610. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  611. {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
  612. {}
  613. };
  614. /* Samsung Q1 Ultra Vista model setup */
  615. static const struct snd_kcontrol_new alc262_ultra_mixer[] = {
  616. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  617. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  618. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  619. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  620. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
  621. HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT),
  622. { } /* end */
  623. };
  624. static const struct hda_verb alc262_ultra_verbs[] = {
  625. /* output mixer */
  626. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  627. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  628. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  629. /* speaker */
  630. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  631. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  632. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  633. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  634. /* HP */
  635. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  636. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  637. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  638. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  639. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  640. /* internal mic */
  641. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  642. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  643. /* ADC, choose mic */
  644. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  645. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  646. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  647. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  648. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  649. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  650. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  651. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  652. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  653. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
  654. {}
  655. };
  656. /* mute/unmute internal speaker according to the hp jack and mute state */
  657. static void alc262_ultra_automute(struct hda_codec *codec)
  658. {
  659. struct alc_spec *spec = codec->spec;
  660. unsigned int mute;
  661. mute = 0;
  662. /* auto-mute only when HP is used as HP */
  663. if (!spec->cur_mux[0]) {
  664. spec->jack_present = snd_hda_jack_detect(codec, 0x15);
  665. if (spec->jack_present)
  666. mute = HDA_AMP_MUTE;
  667. }
  668. /* mute/unmute internal speaker */
  669. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  670. HDA_AMP_MUTE, mute);
  671. /* mute/unmute HP */
  672. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  673. HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
  674. }
  675. /* unsolicited event for HP jack sensing */
  676. static void alc262_ultra_unsol_event(struct hda_codec *codec,
  677. unsigned int res)
  678. {
  679. if ((res >> 26) != ALC_HP_EVENT)
  680. return;
  681. alc262_ultra_automute(codec);
  682. }
  683. static const struct hda_input_mux alc262_ultra_capture_source = {
  684. .num_items = 2,
  685. .items = {
  686. { "Mic", 0x1 },
  687. { "Headphone", 0x7 },
  688. },
  689. };
  690. static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
  691. struct snd_ctl_elem_value *ucontrol)
  692. {
  693. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  694. struct alc_spec *spec = codec->spec;
  695. int ret;
  696. ret = alc_mux_enum_put(kcontrol, ucontrol);
  697. if (!ret)
  698. return 0;
  699. /* reprogram the HP pin as mic or HP according to the input source */
  700. snd_hda_codec_write_cache(codec, 0x15, 0,
  701. AC_VERB_SET_PIN_WIDGET_CONTROL,
  702. spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
  703. alc262_ultra_automute(codec); /* mute/unmute HP */
  704. return ret;
  705. }
  706. static const struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
  707. HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
  708. HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
  709. {
  710. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  711. .name = "Capture Source",
  712. .info = alc_mux_enum_info,
  713. .get = alc_mux_enum_get,
  714. .put = alc262_ultra_mux_enum_put,
  715. },
  716. {
  717. .iface = NID_MAPPING,
  718. .name = "Capture Source",
  719. .private_value = 0x15,
  720. },
  721. { } /* end */
  722. };
  723. static const struct hda_verb alc262_HP_BPC_init_verbs[] = {
  724. /*
  725. * Unmute ADC0-2 and set the default input to mic-in
  726. */
  727. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  728. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  729. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  730. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  731. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  732. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  733. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  734. * mixer widget
  735. * Note: PASD motherboards uses the Line In 2 as the input for
  736. * front panel mic (mic 2)
  737. */
  738. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  739. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  740. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  741. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  742. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  743. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  744. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  745. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  746. /*
  747. * Set up output mixers (0x0c - 0x0e)
  748. */
  749. /* set vol=0 to output mixers */
  750. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  751. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  752. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  753. /* set up input amps for analog loopback */
  754. /* Amp Indices: DAC = 0, mixer = 1 */
  755. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  756. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  757. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  758. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  759. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  760. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  761. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  762. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  763. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  764. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  765. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  766. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  767. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  768. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  769. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  770. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  771. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  772. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  773. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  774. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  775. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  776. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  777. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  778. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  779. /* FIXME: use matrix-type input source selection */
  780. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
  781. /* Input mixer1: only unmute Mic */
  782. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  783. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
  784. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  785. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  786. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  787. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
  788. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
  789. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
  790. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
  791. /* Input mixer2 */
  792. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  793. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
  794. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  795. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  796. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  797. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
  798. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
  799. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
  800. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
  801. /* Input mixer3 */
  802. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  803. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
  804. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  805. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  806. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  807. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
  808. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
  809. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
  810. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
  811. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  812. { }
  813. };
  814. static const struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
  815. /*
  816. * Unmute ADC0-2 and set the default input to mic-in
  817. */
  818. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  819. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  820. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  821. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  822. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  823. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  824. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  825. * mixer widget
  826. * Note: PASD motherboards uses the Line In 2 as the input for front
  827. * panel mic (mic 2)
  828. */
  829. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  830. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  831. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  832. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  833. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  834. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  835. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  836. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  837. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  838. /*
  839. * Set up output mixers (0x0c - 0x0e)
  840. */
  841. /* set vol=0 to output mixers */
  842. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  843. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  844. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  845. /* set up input amps for analog loopback */
  846. /* Amp Indices: DAC = 0, mixer = 1 */
  847. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  848. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  849. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  850. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  851. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  852. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  853. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
  854. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
  855. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
  856. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
  857. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
  858. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
  859. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
  860. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  861. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  862. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  863. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  864. /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
  865. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  866. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  867. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
  868. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  869. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  870. /* FIXME: use matrix-type input source selection */
  871. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  872. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  873. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
  874. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
  875. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
  876. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
  877. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
  878. /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
  879. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
  880. /* Input mixer2 */
  881. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  882. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  883. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
  884. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
  885. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
  886. /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
  887. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
  888. /* Input mixer3 */
  889. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  890. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  891. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
  892. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
  893. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
  894. /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
  895. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
  896. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  897. { }
  898. };
  899. static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
  900. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
  901. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  902. {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
  903. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
  904. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
  905. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
  906. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
  907. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
  908. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  909. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  910. {}
  911. };
  912. /*
  913. * configuration and preset
  914. */
  915. static const char * const alc262_models[ALC262_MODEL_LAST] = {
  916. [ALC262_BASIC] = "basic",
  917. [ALC262_HIPPO] = "hippo",
  918. [ALC262_HIPPO_1] = "hippo_1",
  919. [ALC262_FUJITSU] = "fujitsu",
  920. [ALC262_HP_BPC] = "hp-bpc",
  921. [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
  922. [ALC262_HP_TC_T5735] = "hp-tc-t5735",
  923. [ALC262_HP_RP5700] = "hp-rp5700",
  924. [ALC262_BENQ_ED8] = "benq",
  925. [ALC262_BENQ_T31] = "benq-t31",
  926. [ALC262_SONY_ASSAMD] = "sony-assamd",
  927. [ALC262_TOSHIBA_S06] = "toshiba-s06",
  928. [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
  929. [ALC262_ULTRA] = "ultra",
  930. [ALC262_LENOVO_3000] = "lenovo-3000",
  931. [ALC262_NEC] = "nec",
  932. [ALC262_TYAN] = "tyan",
  933. [ALC262_AUTO] = "auto",
  934. };
  935. static const struct snd_pci_quirk alc262_cfg_tbl[] = {
  936. SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
  937. SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
  938. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
  939. ALC262_HP_BPC),
  940. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
  941. ALC262_HP_BPC),
  942. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series",
  943. ALC262_HP_BPC),
  944. SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200",
  945. ALC262_AUTO),
  946. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
  947. ALC262_HP_BPC),
  948. SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
  949. SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
  950. SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
  951. SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
  952. SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
  953. SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
  954. SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
  955. SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
  956. SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
  957. SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
  958. SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
  959. SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
  960. ALC262_HP_TC_T5735),
  961. SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
  962. SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
  963. SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
  964. SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
  965. SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
  966. SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
  967. SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
  968. SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
  969. #if 0 /* disable the quirk since model=auto works better in recent versions */
  970. SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
  971. ALC262_SONY_ASSAMD),
  972. #endif
  973. SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
  974. ALC262_TOSHIBA_RX1),
  975. SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
  976. SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
  977. SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
  978. SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
  979. SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
  980. ALC262_ULTRA),
  981. SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
  982. SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
  983. SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
  984. SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
  985. SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
  986. {}
  987. };
  988. static const struct alc_config_preset alc262_presets[] = {
  989. [ALC262_BASIC] = {
  990. .mixers = { alc262_base_mixer },
  991. .init_verbs = { alc262_init_verbs },
  992. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  993. .dac_nids = alc262_dac_nids,
  994. .hp_nid = 0x03,
  995. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  996. .channel_mode = alc262_modes,
  997. .input_mux = &alc262_capture_source,
  998. },
  999. [ALC262_HIPPO] = {
  1000. .mixers = { alc262_hippo_mixer },
  1001. .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
  1002. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1003. .dac_nids = alc262_dac_nids,
  1004. .hp_nid = 0x03,
  1005. .dig_out_nid = ALC262_DIGOUT_NID,
  1006. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1007. .channel_mode = alc262_modes,
  1008. .input_mux = &alc262_capture_source,
  1009. .unsol_event = alc_sku_unsol_event,
  1010. .setup = alc262_hippo_setup,
  1011. .init_hook = alc_inithook,
  1012. },
  1013. [ALC262_HIPPO_1] = {
  1014. .mixers = { alc262_hippo1_mixer },
  1015. .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
  1016. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1017. .dac_nids = alc262_dac_nids,
  1018. .hp_nid = 0x02,
  1019. .dig_out_nid = ALC262_DIGOUT_NID,
  1020. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1021. .channel_mode = alc262_modes,
  1022. .input_mux = &alc262_capture_source,
  1023. .unsol_event = alc_sku_unsol_event,
  1024. .setup = alc262_hippo1_setup,
  1025. .init_hook = alc_inithook,
  1026. },
  1027. [ALC262_FUJITSU] = {
  1028. .mixers = { alc262_fujitsu_mixer },
  1029. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
  1030. alc262_fujitsu_unsol_verbs },
  1031. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1032. .dac_nids = alc262_dac_nids,
  1033. .hp_nid = 0x03,
  1034. .dig_out_nid = ALC262_DIGOUT_NID,
  1035. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1036. .channel_mode = alc262_modes,
  1037. .input_mux = &alc262_fujitsu_capture_source,
  1038. .unsol_event = alc_sku_unsol_event,
  1039. .setup = alc262_fujitsu_setup,
  1040. .init_hook = alc_inithook,
  1041. },
  1042. [ALC262_HP_BPC] = {
  1043. .mixers = { alc262_HP_BPC_mixer },
  1044. .init_verbs = { alc262_HP_BPC_init_verbs },
  1045. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1046. .dac_nids = alc262_dac_nids,
  1047. .hp_nid = 0x03,
  1048. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1049. .channel_mode = alc262_modes,
  1050. .input_mux = &alc262_HP_capture_source,
  1051. .unsol_event = alc_sku_unsol_event,
  1052. .setup = alc262_hp_bpc_setup,
  1053. .init_hook = alc_inithook,
  1054. },
  1055. [ALC262_HP_BPC_D7000_WF] = {
  1056. .mixers = { alc262_HP_BPC_WildWest_mixer },
  1057. .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
  1058. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1059. .dac_nids = alc262_dac_nids,
  1060. .hp_nid = 0x03,
  1061. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1062. .channel_mode = alc262_modes,
  1063. .input_mux = &alc262_HP_D7000_capture_source,
  1064. .unsol_event = alc_sku_unsol_event,
  1065. .setup = alc262_hp_wildwest_setup,
  1066. .init_hook = alc_inithook,
  1067. },
  1068. [ALC262_HP_BPC_D7000_WL] = {
  1069. .mixers = { alc262_HP_BPC_WildWest_mixer,
  1070. alc262_HP_BPC_WildWest_option_mixer },
  1071. .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
  1072. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1073. .dac_nids = alc262_dac_nids,
  1074. .hp_nid = 0x03,
  1075. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1076. .channel_mode = alc262_modes,
  1077. .input_mux = &alc262_HP_D7000_capture_source,
  1078. .unsol_event = alc_sku_unsol_event,
  1079. .setup = alc262_hp_wildwest_setup,
  1080. .init_hook = alc_inithook,
  1081. },
  1082. [ALC262_HP_TC_T5735] = {
  1083. .mixers = { alc262_hp_t5735_mixer },
  1084. .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
  1085. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1086. .dac_nids = alc262_dac_nids,
  1087. .hp_nid = 0x03,
  1088. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1089. .channel_mode = alc262_modes,
  1090. .input_mux = &alc262_capture_source,
  1091. .unsol_event = alc_sku_unsol_event,
  1092. .setup = alc262_hp_t5735_setup,
  1093. .init_hook = alc_inithook,
  1094. },
  1095. [ALC262_HP_RP5700] = {
  1096. .mixers = { alc262_hp_rp5700_mixer },
  1097. .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
  1098. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1099. .dac_nids = alc262_dac_nids,
  1100. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1101. .channel_mode = alc262_modes,
  1102. .input_mux = &alc262_hp_rp5700_capture_source,
  1103. },
  1104. [ALC262_BENQ_ED8] = {
  1105. .mixers = { alc262_base_mixer },
  1106. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
  1107. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1108. .dac_nids = alc262_dac_nids,
  1109. .hp_nid = 0x03,
  1110. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1111. .channel_mode = alc262_modes,
  1112. .input_mux = &alc262_capture_source,
  1113. },
  1114. [ALC262_SONY_ASSAMD] = {
  1115. .mixers = { alc262_sony_mixer },
  1116. .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
  1117. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1118. .dac_nids = alc262_dac_nids,
  1119. .hp_nid = 0x02,
  1120. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1121. .channel_mode = alc262_modes,
  1122. .input_mux = &alc262_capture_source,
  1123. .unsol_event = alc_sku_unsol_event,
  1124. .setup = alc262_hippo_setup,
  1125. .init_hook = alc_inithook,
  1126. },
  1127. [ALC262_BENQ_T31] = {
  1128. .mixers = { alc262_benq_t31_mixer },
  1129. .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
  1130. alc_hp15_unsol_verbs },
  1131. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1132. .dac_nids = alc262_dac_nids,
  1133. .hp_nid = 0x03,
  1134. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1135. .channel_mode = alc262_modes,
  1136. .input_mux = &alc262_capture_source,
  1137. .unsol_event = alc_sku_unsol_event,
  1138. .setup = alc262_hippo_setup,
  1139. .init_hook = alc_inithook,
  1140. },
  1141. [ALC262_ULTRA] = {
  1142. .mixers = { alc262_ultra_mixer },
  1143. .cap_mixer = alc262_ultra_capture_mixer,
  1144. .init_verbs = { alc262_ultra_verbs },
  1145. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1146. .dac_nids = alc262_dac_nids,
  1147. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1148. .channel_mode = alc262_modes,
  1149. .input_mux = &alc262_ultra_capture_source,
  1150. .adc_nids = alc262_adc_nids, /* ADC0 */
  1151. .capsrc_nids = alc262_capsrc_nids,
  1152. .num_adc_nids = 1, /* single ADC */
  1153. .unsol_event = alc262_ultra_unsol_event,
  1154. .init_hook = alc262_ultra_automute,
  1155. },
  1156. [ALC262_LENOVO_3000] = {
  1157. .mixers = { alc262_lenovo_3000_mixer },
  1158. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
  1159. alc262_lenovo_3000_unsol_verbs,
  1160. alc262_lenovo_3000_init_verbs },
  1161. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1162. .dac_nids = alc262_dac_nids,
  1163. .hp_nid = 0x03,
  1164. .dig_out_nid = ALC262_DIGOUT_NID,
  1165. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1166. .channel_mode = alc262_modes,
  1167. .input_mux = &alc262_fujitsu_capture_source,
  1168. .unsol_event = alc_sku_unsol_event,
  1169. .setup = alc262_lenovo_3000_setup,
  1170. .init_hook = alc_inithook,
  1171. },
  1172. [ALC262_NEC] = {
  1173. .mixers = { alc262_nec_mixer },
  1174. .init_verbs = { alc262_nec_verbs },
  1175. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1176. .dac_nids = alc262_dac_nids,
  1177. .hp_nid = 0x03,
  1178. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1179. .channel_mode = alc262_modes,
  1180. .input_mux = &alc262_capture_source,
  1181. },
  1182. [ALC262_TOSHIBA_S06] = {
  1183. .mixers = { alc262_toshiba_s06_mixer },
  1184. .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
  1185. alc262_eapd_verbs },
  1186. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1187. .capsrc_nids = alc262_dmic_capsrc_nids,
  1188. .dac_nids = alc262_dac_nids,
  1189. .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
  1190. .num_adc_nids = 1, /* single ADC */
  1191. .dig_out_nid = ALC262_DIGOUT_NID,
  1192. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1193. .channel_mode = alc262_modes,
  1194. .unsol_event = alc_sku_unsol_event,
  1195. .setup = alc262_toshiba_s06_setup,
  1196. .init_hook = alc_inithook,
  1197. },
  1198. [ALC262_TOSHIBA_RX1] = {
  1199. .mixers = { alc262_toshiba_rx1_mixer },
  1200. .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
  1201. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1202. .dac_nids = alc262_dac_nids,
  1203. .hp_nid = 0x03,
  1204. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1205. .channel_mode = alc262_modes,
  1206. .input_mux = &alc262_capture_source,
  1207. .unsol_event = alc_sku_unsol_event,
  1208. .setup = alc262_hippo_setup,
  1209. .init_hook = alc_inithook,
  1210. },
  1211. [ALC262_TYAN] = {
  1212. .mixers = { alc262_tyan_mixer },
  1213. .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
  1214. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  1215. .dac_nids = alc262_dac_nids,
  1216. .hp_nid = 0x02,
  1217. .dig_out_nid = ALC262_DIGOUT_NID,
  1218. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  1219. .channel_mode = alc262_modes,
  1220. .input_mux = &alc262_capture_source,
  1221. .unsol_event = alc_sku_unsol_event,
  1222. .setup = alc262_tyan_setup,
  1223. .init_hook = alc_hp_automute,
  1224. },
  1225. };