alc882_quirks.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562
  1. /*
  2. * ALC882/ALC883/ALC888/ALC889 quirk models
  3. * included by patch_realtek.c
  4. */
  5. /* ALC882 models */
  6. enum {
  7. ALC882_AUTO,
  8. ALC885_MACPRO,
  9. ALC885_MBA21,
  10. ALC885_MBP3,
  11. ALC885_MB5,
  12. ALC885_MACMINI3,
  13. ALC885_IMAC24,
  14. ALC885_IMAC91,
  15. ALC888_ACER_ASPIRE_4930G,
  16. ALC888_ACER_ASPIRE_6530G,
  17. ALC888_ACER_ASPIRE_8930G,
  18. ALC888_ACER_ASPIRE_7730G,
  19. ALC889A_MB31,
  20. ALC882_MODEL_LAST,
  21. };
  22. /*
  23. * ALC888 Acer Aspire 4930G model
  24. */
  25. static const struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
  26. /* Front Mic: set to PIN_IN (empty by default) */
  27. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  28. /* Unselect Front Mic by default in input mixer 3 */
  29. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  30. /* Enable unsolicited event for HP jack */
  31. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  32. /* Connect Internal HP to front */
  33. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  34. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  35. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  36. /* Connect HP out to front */
  37. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  38. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  39. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  40. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  41. { }
  42. };
  43. /*
  44. * ALC888 Acer Aspire 6530G model
  45. */
  46. static const struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
  47. /* Route to built-in subwoofer as well as speakers */
  48. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  49. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  50. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  51. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  52. /* Bias voltage on for external mic port */
  53. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
  54. /* Front Mic: set to PIN_IN (empty by default) */
  55. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  56. /* Unselect Front Mic by default in input mixer 3 */
  57. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  58. /* Enable unsolicited event for HP jack */
  59. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  60. /* Enable speaker output */
  61. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  62. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  63. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  64. /* Enable headphone output */
  65. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
  66. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  67. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  68. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  69. { }
  70. };
  71. /*
  72. *ALC888 Acer Aspire 7730G model
  73. */
  74. static const struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
  75. /* Bias voltage on for external mic port */
  76. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
  77. /* Front Mic: set to PIN_IN (empty by default) */
  78. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  79. /* Unselect Front Mic by default in input mixer 3 */
  80. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  81. /* Enable unsolicited event for HP jack */
  82. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  83. /* Enable speaker output */
  84. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  85. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  86. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  87. /* Enable headphone output */
  88. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
  89. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  90. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  91. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  92. /*Enable internal subwoofer */
  93. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  94. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  95. {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
  96. {0x17, AC_VERB_SET_EAPD_BTLENABLE, 2},
  97. { }
  98. };
  99. /*
  100. * ALC889 Acer Aspire 8930G model
  101. */
  102. static const struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
  103. /* Front Mic: set to PIN_IN (empty by default) */
  104. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  105. /* Unselect Front Mic by default in input mixer 3 */
  106. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  107. /* Enable unsolicited event for HP jack */
  108. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  109. /* Connect Internal Front to Front */
  110. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  111. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  112. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  113. /* Connect Internal Rear to Rear */
  114. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  115. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  116. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
  117. /* Connect Internal CLFE to CLFE */
  118. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  119. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  120. {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
  121. /* Connect HP out to Front */
  122. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
  123. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  124. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  125. /* Enable all DACs */
  126. /* DAC DISABLE/MUTE 1? */
  127. /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
  128. {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
  129. {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
  130. /* DAC DISABLE/MUTE 2? */
  131. /* some bit here disables the other DACs. Init=0x4900 */
  132. {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
  133. {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
  134. /* DMIC fix
  135. * This laptop has a stereo digital microphone. The mics are only 1cm apart
  136. * which makes the stereo useless. However, either the mic or the ALC889
  137. * makes the signal become a difference/sum signal instead of standard
  138. * stereo, which is annoying. So instead we flip this bit which makes the
  139. * codec replicate the sum signal to both channels, turning it into a
  140. * normal mono mic.
  141. */
  142. /* DMIC_CONTROL? Init value = 0x0001 */
  143. {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
  144. {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
  145. { }
  146. };
  147. static const struct hda_input_mux alc888_2_capture_sources[2] = {
  148. /* Front mic only available on one ADC */
  149. {
  150. .num_items = 4,
  151. .items = {
  152. { "Mic", 0x0 },
  153. { "Line", 0x2 },
  154. { "CD", 0x4 },
  155. { "Front Mic", 0xb },
  156. },
  157. },
  158. {
  159. .num_items = 3,
  160. .items = {
  161. { "Mic", 0x0 },
  162. { "Line", 0x2 },
  163. { "CD", 0x4 },
  164. },
  165. }
  166. };
  167. static const struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
  168. /* Interal mic only available on one ADC */
  169. {
  170. .num_items = 5,
  171. .items = {
  172. { "Mic", 0x0 },
  173. { "Line In", 0x2 },
  174. { "CD", 0x4 },
  175. { "Input Mix", 0xa },
  176. { "Internal Mic", 0xb },
  177. },
  178. },
  179. {
  180. .num_items = 4,
  181. .items = {
  182. { "Mic", 0x0 },
  183. { "Line In", 0x2 },
  184. { "CD", 0x4 },
  185. { "Input Mix", 0xa },
  186. },
  187. }
  188. };
  189. static const struct hda_input_mux alc889_capture_sources[3] = {
  190. /* Digital mic only available on first "ADC" */
  191. {
  192. .num_items = 5,
  193. .items = {
  194. { "Mic", 0x0 },
  195. { "Line", 0x2 },
  196. { "CD", 0x4 },
  197. { "Front Mic", 0xb },
  198. { "Input Mix", 0xa },
  199. },
  200. },
  201. {
  202. .num_items = 4,
  203. .items = {
  204. { "Mic", 0x0 },
  205. { "Line", 0x2 },
  206. { "CD", 0x4 },
  207. { "Input Mix", 0xa },
  208. },
  209. },
  210. {
  211. .num_items = 4,
  212. .items = {
  213. { "Mic", 0x0 },
  214. { "Line", 0x2 },
  215. { "CD", 0x4 },
  216. { "Input Mix", 0xa },
  217. },
  218. }
  219. };
  220. static const struct snd_kcontrol_new alc888_base_mixer[] = {
  221. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  222. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  223. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  224. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  225. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  226. HDA_OUTPUT),
  227. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  228. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  229. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  230. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  231. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  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_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  238. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  239. { } /* end */
  240. };
  241. static const struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
  242. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  243. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  244. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  245. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  246. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  247. HDA_OUTPUT),
  248. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  249. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  250. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  251. HDA_CODEC_VOLUME_MONO("Internal LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT),
  252. HDA_BIND_MUTE_MONO("Internal LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT),
  253. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  254. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  255. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  256. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  257. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  258. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  259. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  260. { } /* end */
  261. };
  262. static const struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
  263. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  264. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  265. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  266. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  267. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  268. HDA_OUTPUT),
  269. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  270. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  271. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  272. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  273. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  274. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  275. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  276. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  277. { } /* end */
  278. };
  279. static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
  280. {
  281. struct alc_spec *spec = codec->spec;
  282. spec->autocfg.hp_pins[0] = 0x15;
  283. spec->autocfg.speaker_pins[0] = 0x14;
  284. spec->autocfg.speaker_pins[1] = 0x16;
  285. spec->autocfg.speaker_pins[2] = 0x17;
  286. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  287. }
  288. static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
  289. {
  290. struct alc_spec *spec = codec->spec;
  291. spec->autocfg.hp_pins[0] = 0x15;
  292. spec->autocfg.speaker_pins[0] = 0x14;
  293. spec->autocfg.speaker_pins[1] = 0x16;
  294. spec->autocfg.speaker_pins[2] = 0x17;
  295. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  296. }
  297. static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec)
  298. {
  299. struct alc_spec *spec = codec->spec;
  300. spec->autocfg.hp_pins[0] = 0x15;
  301. spec->autocfg.speaker_pins[0] = 0x14;
  302. spec->autocfg.speaker_pins[1] = 0x16;
  303. spec->autocfg.speaker_pins[2] = 0x17;
  304. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  305. }
  306. static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
  307. {
  308. struct alc_spec *spec = codec->spec;
  309. spec->autocfg.hp_pins[0] = 0x15;
  310. spec->autocfg.speaker_pins[0] = 0x14;
  311. spec->autocfg.speaker_pins[1] = 0x16;
  312. spec->autocfg.speaker_pins[2] = 0x1b;
  313. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  314. }
  315. #define ALC882_DIGOUT_NID 0x06
  316. #define ALC882_DIGIN_NID 0x0a
  317. #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
  318. #define ALC883_DIGIN_NID ALC882_DIGIN_NID
  319. #define ALC1200_DIGOUT_NID 0x10
  320. static const struct hda_channel_mode alc882_ch_modes[1] = {
  321. { 8, NULL }
  322. };
  323. /* DACs */
  324. static const hda_nid_t alc882_dac_nids[4] = {
  325. /* front, rear, clfe, rear_surr */
  326. 0x02, 0x03, 0x04, 0x05
  327. };
  328. #define alc883_dac_nids alc882_dac_nids
  329. /* ADCs */
  330. #define alc882_adc_nids alc880_adc_nids
  331. #define alc882_adc_nids_alt alc880_adc_nids_alt
  332. #define alc883_adc_nids alc882_adc_nids_alt
  333. static const hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
  334. static const hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
  335. #define alc889_adc_nids alc880_adc_nids
  336. static const hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
  337. static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
  338. #define alc883_capsrc_nids alc882_capsrc_nids_alt
  339. static const hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
  340. #define alc889_capsrc_nids alc882_capsrc_nids
  341. /* input MUX */
  342. /* FIXME: should be a matrix-type input source selection */
  343. static const struct hda_input_mux alc882_capture_source = {
  344. .num_items = 4,
  345. .items = {
  346. { "Mic", 0x0 },
  347. { "Front Mic", 0x1 },
  348. { "Line", 0x2 },
  349. { "CD", 0x4 },
  350. },
  351. };
  352. #define alc883_capture_source alc882_capture_source
  353. static const struct hda_input_mux alc889_capture_source = {
  354. .num_items = 3,
  355. .items = {
  356. { "Front Mic", 0x0 },
  357. { "Mic", 0x3 },
  358. { "Line", 0x2 },
  359. },
  360. };
  361. static const struct hda_input_mux mb5_capture_source = {
  362. .num_items = 3,
  363. .items = {
  364. { "Mic", 0x1 },
  365. { "Line", 0x7 },
  366. { "CD", 0x4 },
  367. },
  368. };
  369. static const struct hda_input_mux macmini3_capture_source = {
  370. .num_items = 2,
  371. .items = {
  372. { "Line", 0x2 },
  373. { "CD", 0x4 },
  374. },
  375. };
  376. static const struct hda_input_mux alc883_3stack_6ch_intel = {
  377. .num_items = 4,
  378. .items = {
  379. { "Mic", 0x1 },
  380. { "Front Mic", 0x0 },
  381. { "Line", 0x2 },
  382. { "CD", 0x4 },
  383. },
  384. };
  385. static const struct hda_input_mux alc889A_mb31_capture_source = {
  386. .num_items = 2,
  387. .items = {
  388. { "Mic", 0x0 },
  389. /* Front Mic (0x01) unused */
  390. { "Line", 0x2 },
  391. /* Line 2 (0x03) unused */
  392. /* CD (0x04) unused? */
  393. },
  394. };
  395. static const struct hda_input_mux alc889A_imac91_capture_source = {
  396. .num_items = 2,
  397. .items = {
  398. { "Mic", 0x01 },
  399. { "Line", 0x2 }, /* Not sure! */
  400. },
  401. };
  402. /*
  403. * 2ch mode
  404. */
  405. static const struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
  406. { 2, NULL }
  407. };
  408. /*
  409. * 2ch mode
  410. */
  411. static const struct hda_verb alc882_3ST_ch2_init[] = {
  412. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  413. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  414. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  415. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  416. { } /* end */
  417. };
  418. /*
  419. * 4ch mode
  420. */
  421. static const struct hda_verb alc882_3ST_ch4_init[] = {
  422. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  423. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  424. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  425. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  426. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  427. { } /* end */
  428. };
  429. /*
  430. * 6ch mode
  431. */
  432. static const struct hda_verb alc882_3ST_ch6_init[] = {
  433. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  434. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  435. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  436. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  437. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  438. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  439. { } /* end */
  440. };
  441. static const struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
  442. { 2, alc882_3ST_ch2_init },
  443. { 4, alc882_3ST_ch4_init },
  444. { 6, alc882_3ST_ch6_init },
  445. };
  446. #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
  447. /* Macbook Air 2,1 */
  448. static const struct hda_channel_mode alc885_mba21_ch_modes[1] = {
  449. { 2, NULL },
  450. };
  451. /*
  452. * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
  453. */
  454. /*
  455. * 2ch mode
  456. */
  457. static const struct hda_verb alc885_mbp_ch2_init[] = {
  458. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  459. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  460. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  461. { } /* end */
  462. };
  463. /*
  464. * 4ch mode
  465. */
  466. static const struct hda_verb alc885_mbp_ch4_init[] = {
  467. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  468. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  469. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  470. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  471. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  472. { } /* end */
  473. };
  474. static const struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
  475. { 2, alc885_mbp_ch2_init },
  476. { 4, alc885_mbp_ch4_init },
  477. };
  478. /*
  479. * 2ch
  480. * Speakers/Woofer/HP = Front
  481. * LineIn = Input
  482. */
  483. static const struct hda_verb alc885_mb5_ch2_init[] = {
  484. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  485. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  486. { } /* end */
  487. };
  488. /*
  489. * 6ch mode
  490. * Speakers/HP = Front
  491. * Woofer = LFE
  492. * LineIn = Surround
  493. */
  494. static const struct hda_verb alc885_mb5_ch6_init[] = {
  495. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  496. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  497. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  498. { } /* end */
  499. };
  500. static const struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
  501. { 2, alc885_mb5_ch2_init },
  502. { 6, alc885_mb5_ch6_init },
  503. };
  504. #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
  505. /* Macbook Air 2,1 same control for HP and internal Speaker */
  506. static const struct snd_kcontrol_new alc885_mba21_mixer[] = {
  507. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  508. HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
  509. { }
  510. };
  511. static const struct snd_kcontrol_new alc885_mbp3_mixer[] = {
  512. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  513. HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
  514. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
  515. HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
  516. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  517. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  518. HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  519. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
  520. HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
  521. HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
  522. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
  523. { } /* end */
  524. };
  525. static const struct snd_kcontrol_new alc885_mb5_mixer[] = {
  526. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  527. HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
  528. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  529. HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
  530. HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
  531. HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
  532. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
  533. HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
  534. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
  535. HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
  536. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  537. HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  538. HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
  539. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0x00, HDA_INPUT),
  540. { } /* end */
  541. };
  542. static const struct snd_kcontrol_new alc885_macmini3_mixer[] = {
  543. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  544. HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
  545. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  546. HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
  547. HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
  548. HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
  549. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
  550. HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
  551. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
  552. HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
  553. HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
  554. { } /* end */
  555. };
  556. static const struct snd_kcontrol_new alc885_imac91_mixer[] = {
  557. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  558. HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
  559. { } /* end */
  560. };
  561. static const struct snd_kcontrol_new alc882_chmode_mixer[] = {
  562. {
  563. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  564. .name = "Channel Mode",
  565. .info = alc_ch_mode_info,
  566. .get = alc_ch_mode_get,
  567. .put = alc_ch_mode_put,
  568. },
  569. { } /* end */
  570. };
  571. static const struct hda_verb alc882_base_init_verbs[] = {
  572. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  573. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  574. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  575. /* Rear mixer */
  576. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  577. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  578. /* CLFE mixer */
  579. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  580. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  581. /* Side mixer */
  582. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  583. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  584. /* Front Pin: output 0 (0x0c) */
  585. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  586. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  587. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  588. /* Rear Pin: output 1 (0x0d) */
  589. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  590. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  591. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  592. /* CLFE Pin: output 2 (0x0e) */
  593. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  594. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  595. {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
  596. /* Side Pin: output 3 (0x0f) */
  597. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  598. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  599. {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  600. /* Mic (rear) pin: input vref at 80% */
  601. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  602. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  603. /* Front Mic pin: input vref at 80% */
  604. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  605. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  606. /* Line In pin: input */
  607. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  608. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  609. /* Line-2 In: Headphone output (output 0 - 0x0c) */
  610. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  611. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  612. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  613. /* CD pin widget for input */
  614. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  615. /* FIXME: use matrix-type input source selection */
  616. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  617. /* Input mixer2 */
  618. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  619. /* Input mixer3 */
  620. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  621. /* ADC2: mute amp left and right */
  622. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  623. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  624. /* ADC3: mute amp left and right */
  625. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  626. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  627. { }
  628. };
  629. static const struct hda_verb alc882_adc1_init_verbs[] = {
  630. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  631. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  632. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  633. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  634. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  635. /* ADC1: mute amp left and right */
  636. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  637. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  638. { }
  639. };
  640. static const struct hda_verb alc889_eapd_verbs[] = {
  641. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  642. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  643. { }
  644. };
  645. #define alc883_init_verbs alc882_base_init_verbs
  646. /* Mac Pro test */
  647. static const struct snd_kcontrol_new alc882_macpro_mixer[] = {
  648. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  649. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  650. HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
  651. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
  652. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
  653. /* FIXME: this looks suspicious...
  654. HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
  655. HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
  656. */
  657. { } /* end */
  658. };
  659. static const struct hda_verb alc882_macpro_init_verbs[] = {
  660. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  661. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  662. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  663. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  664. /* Front Pin: output 0 (0x0c) */
  665. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  666. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  667. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  668. /* Front Mic pin: input vref at 80% */
  669. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  670. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  671. /* Speaker: output */
  672. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  673. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  674. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
  675. /* Headphone output (output 0 - 0x0c) */
  676. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  677. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  678. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  679. /* FIXME: use matrix-type input source selection */
  680. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  681. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  682. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  683. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  684. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  685. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  686. /* Input mixer2 */
  687. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  688. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  689. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  690. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  691. /* Input mixer3 */
  692. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  693. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  694. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  695. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  696. /* ADC1: mute amp left and right */
  697. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  698. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  699. /* ADC2: mute amp left and right */
  700. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  701. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  702. /* ADC3: mute amp left and right */
  703. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  704. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  705. { }
  706. };
  707. /* Macbook 5,1 */
  708. static const struct hda_verb alc885_mb5_init_verbs[] = {
  709. /* DACs */
  710. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  711. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  712. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  713. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  714. /* Front mixer */
  715. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  716. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  717. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  718. /* Surround mixer */
  719. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  720. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  721. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  722. /* LFE mixer */
  723. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  724. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  725. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  726. /* HP mixer */
  727. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  728. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  729. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  730. /* Front Pin (0x0c) */
  731. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  732. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  733. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  734. /* LFE Pin (0x0e) */
  735. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  736. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  737. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
  738. /* HP Pin (0x0f) */
  739. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  740. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  741. {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
  742. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  743. /* Front Mic pin: input vref at 80% */
  744. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  745. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  746. /* Line In pin */
  747. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  748. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  749. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
  750. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
  751. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
  752. { }
  753. };
  754. /* Macmini 3,1 */
  755. static const struct hda_verb alc885_macmini3_init_verbs[] = {
  756. /* DACs */
  757. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  758. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  759. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  760. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  761. /* Front mixer */
  762. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  763. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  764. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  765. /* Surround mixer */
  766. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  767. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  768. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  769. /* LFE mixer */
  770. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  771. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  772. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  773. /* HP mixer */
  774. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  775. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  776. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  777. /* Front Pin (0x0c) */
  778. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  779. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  780. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  781. /* LFE Pin (0x0e) */
  782. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  783. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  784. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
  785. /* HP Pin (0x0f) */
  786. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  787. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  788. {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
  789. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  790. /* Line In pin */
  791. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  792. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  793. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  794. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  795. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  796. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  797. { }
  798. };
  799. static const struct hda_verb alc885_mba21_init_verbs[] = {
  800. /*Internal and HP Speaker Mixer*/
  801. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  802. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  803. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  804. /*Internal Speaker Pin (0x0c)*/
  805. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
  806. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  807. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  808. /* HP Pin: output 0 (0x0e) */
  809. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
  810. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  811. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  812. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)},
  813. /* Line in (is hp when jack connected)*/
  814. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
  815. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  816. { }
  817. };
  818. /* Macbook Pro rev3 */
  819. static const struct hda_verb alc885_mbp3_init_verbs[] = {
  820. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  821. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  822. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  823. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  824. /* Rear mixer */
  825. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  826. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  827. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  828. /* HP mixer */
  829. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  830. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  831. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  832. /* Front Pin: output 0 (0x0c) */
  833. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  834. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  835. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  836. /* HP Pin: output 0 (0x0e) */
  837. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
  838. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  839. {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
  840. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  841. /* Mic (rear) pin: input vref at 80% */
  842. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  843. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  844. /* Front Mic pin: input vref at 80% */
  845. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  846. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  847. /* Line In pin: use output 1 when in LineOut mode */
  848. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  849. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  850. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
  851. /* FIXME: use matrix-type input source selection */
  852. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  853. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  854. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  855. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  856. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  857. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  858. /* Input mixer2 */
  859. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  860. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  861. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  862. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  863. /* Input mixer3 */
  864. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  865. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  866. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  867. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  868. /* ADC1: mute amp left and right */
  869. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  870. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  871. /* ADC2: mute amp left and right */
  872. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  873. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  874. /* ADC3: mute amp left and right */
  875. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  876. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  877. { }
  878. };
  879. /* iMac 9,1 */
  880. static const struct hda_verb alc885_imac91_init_verbs[] = {
  881. /* Internal Speaker Pin (0x0c) */
  882. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
  883. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  884. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  885. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
  886. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  887. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
  888. /* HP Pin: Rear */
  889. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  890. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  891. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  892. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)},
  893. /* Line in Rear */
  894. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
  895. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  896. /* Front Mic pin: input vref at 80% */
  897. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  898. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  899. /* Rear mixer */
  900. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  901. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  902. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  903. /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
  904. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  905. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  906. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  907. /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
  908. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  909. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  910. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  911. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  912. /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
  913. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  914. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  915. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  916. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  917. /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
  918. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  919. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  920. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  921. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  922. /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
  923. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  924. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  925. /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
  926. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  927. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  928. /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
  929. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  930. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  931. { }
  932. };
  933. /* iMac 24 mixer. */
  934. static const struct snd_kcontrol_new alc885_imac24_mixer[] = {
  935. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  936. HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
  937. { } /* end */
  938. };
  939. /* iMac 24 init verbs. */
  940. static const struct hda_verb alc885_imac24_init_verbs[] = {
  941. /* Internal speakers: output 0 (0x0c) */
  942. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  943. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  944. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  945. /* Internal speakers: output 0 (0x0c) */
  946. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  947. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  948. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
  949. /* Headphone: output 0 (0x0c) */
  950. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  951. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  952. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  953. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  954. /* Front Mic: input vref at 80% */
  955. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  956. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  957. { }
  958. };
  959. /* Toggle speaker-output according to the hp-jack state */
  960. static void alc885_imac24_setup(struct hda_codec *codec)
  961. {
  962. struct alc_spec *spec = codec->spec;
  963. spec->autocfg.hp_pins[0] = 0x14;
  964. spec->autocfg.speaker_pins[0] = 0x18;
  965. spec->autocfg.speaker_pins[1] = 0x1a;
  966. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  967. }
  968. #define alc885_mb5_setup alc885_imac24_setup
  969. #define alc885_macmini3_setup alc885_imac24_setup
  970. /* Macbook Air 2,1 */
  971. static void alc885_mba21_setup(struct hda_codec *codec)
  972. {
  973. struct alc_spec *spec = codec->spec;
  974. spec->autocfg.hp_pins[0] = 0x14;
  975. spec->autocfg.speaker_pins[0] = 0x18;
  976. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  977. }
  978. static void alc885_mbp3_setup(struct hda_codec *codec)
  979. {
  980. struct alc_spec *spec = codec->spec;
  981. spec->autocfg.hp_pins[0] = 0x15;
  982. spec->autocfg.speaker_pins[0] = 0x14;
  983. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  984. }
  985. static void alc885_imac91_setup(struct hda_codec *codec)
  986. {
  987. struct alc_spec *spec = codec->spec;
  988. spec->autocfg.hp_pins[0] = 0x14;
  989. spec->autocfg.speaker_pins[0] = 0x18;
  990. spec->autocfg.speaker_pins[1] = 0x1a;
  991. alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
  992. }
  993. /* toggle speaker-output according to the hp-jack state */
  994. static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
  995. {
  996. unsigned int gpiostate, gpiomask, gpiodir;
  997. gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
  998. AC_VERB_GET_GPIO_DATA, 0);
  999. if (!muted)
  1000. gpiostate |= (1 << pin);
  1001. else
  1002. gpiostate &= ~(1 << pin);
  1003. gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
  1004. AC_VERB_GET_GPIO_MASK, 0);
  1005. gpiomask |= (1 << pin);
  1006. gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
  1007. AC_VERB_GET_GPIO_DIRECTION, 0);
  1008. gpiodir |= (1 << pin);
  1009. snd_hda_codec_write(codec, codec->afg, 0,
  1010. AC_VERB_SET_GPIO_MASK, gpiomask);
  1011. snd_hda_codec_write(codec, codec->afg, 0,
  1012. AC_VERB_SET_GPIO_DIRECTION, gpiodir);
  1013. msleep(1);
  1014. snd_hda_codec_write(codec, codec->afg, 0,
  1015. AC_VERB_SET_GPIO_DATA, gpiostate);
  1016. }
  1017. /* set up GPIO at initialization */
  1018. static void alc885_macpro_init_hook(struct hda_codec *codec)
  1019. {
  1020. alc882_gpio_mute(codec, 0, 0);
  1021. alc882_gpio_mute(codec, 1, 0);
  1022. }
  1023. /* set up GPIO and update auto-muting at initialization */
  1024. static void alc885_imac24_init_hook(struct hda_codec *codec)
  1025. {
  1026. alc885_macpro_init_hook(codec);
  1027. alc_hp_automute(codec);
  1028. }
  1029. /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
  1030. static const struct hda_verb alc889A_mb31_ch2_init[] = {
  1031. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
  1032. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
  1033. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
  1034. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
  1035. { } /* end */
  1036. };
  1037. /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
  1038. static const struct hda_verb alc889A_mb31_ch4_init[] = {
  1039. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
  1040. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
  1041. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
  1042. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
  1043. { } /* end */
  1044. };
  1045. /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
  1046. static const struct hda_verb alc889A_mb31_ch5_init[] = {
  1047. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
  1048. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
  1049. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
  1050. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
  1051. { } /* end */
  1052. };
  1053. /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
  1054. static const struct hda_verb alc889A_mb31_ch6_init[] = {
  1055. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
  1056. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
  1057. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
  1058. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
  1059. { } /* end */
  1060. };
  1061. static const struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
  1062. { 2, alc889A_mb31_ch2_init },
  1063. { 4, alc889A_mb31_ch4_init },
  1064. { 5, alc889A_mb31_ch5_init },
  1065. { 6, alc889A_mb31_ch6_init },
  1066. };
  1067. static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
  1068. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  1069. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  1070. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  1071. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  1072. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  1073. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  1074. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  1075. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  1076. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  1077. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  1078. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  1079. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  1080. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  1081. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  1082. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  1083. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  1084. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  1085. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  1086. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  1087. { } /* end */
  1088. };
  1089. static const struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
  1090. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  1091. HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  1092. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  1093. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  1094. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  1095. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  1096. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  1097. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  1098. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  1099. { } /* end */
  1100. };
  1101. static const struct snd_kcontrol_new alc889A_mb31_mixer[] = {
  1102. /* Output mixers */
  1103. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  1104. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
  1105. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  1106. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
  1107. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
  1108. HDA_OUTPUT),
  1109. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
  1110. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
  1111. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
  1112. /* Output switches */
  1113. HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
  1114. HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
  1115. HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
  1116. /* Boost mixers */
  1117. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
  1118. HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
  1119. /* Input mixers */
  1120. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
  1121. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
  1122. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  1123. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  1124. { } /* end */
  1125. };
  1126. static const struct snd_kcontrol_new alc883_chmode_mixer[] = {
  1127. {
  1128. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  1129. .name = "Channel Mode",
  1130. .info = alc_ch_mode_info,
  1131. .get = alc_ch_mode_get,
  1132. .put = alc_ch_mode_put,
  1133. },
  1134. { } /* end */
  1135. };
  1136. static const struct hda_verb alc889A_mb31_verbs[] = {
  1137. /* Init rear pin (used as headphone output) */
  1138. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
  1139. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
  1140. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
  1141. /* Init line pin (used as output in 4ch and 6ch mode) */
  1142. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
  1143. /* Init line 2 pin (used as headphone out by default) */
  1144. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
  1145. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
  1146. { } /* end */
  1147. };
  1148. /* Mute speakers according to the headphone jack state */
  1149. static void alc889A_mb31_automute(struct hda_codec *codec)
  1150. {
  1151. unsigned int present;
  1152. /* Mute only in 2ch or 4ch mode */
  1153. if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
  1154. == 0x00) {
  1155. present = snd_hda_jack_detect(codec, 0x15);
  1156. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  1157. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  1158. snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
  1159. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  1160. }
  1161. }
  1162. static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
  1163. {
  1164. if ((res >> 26) == ALC_HP_EVENT)
  1165. alc889A_mb31_automute(codec);
  1166. }
  1167. /*
  1168. * configuration and preset
  1169. */
  1170. static const char * const alc882_models[ALC882_MODEL_LAST] = {
  1171. [ALC885_MACPRO] = "macpro",
  1172. [ALC885_MB5] = "mb5",
  1173. [ALC885_MACMINI3] = "macmini3",
  1174. [ALC885_MBA21] = "mba21",
  1175. [ALC885_MBP3] = "mbp3",
  1176. [ALC885_IMAC24] = "imac24",
  1177. [ALC885_IMAC91] = "imac91",
  1178. [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
  1179. [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
  1180. [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
  1181. [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
  1182. [ALC889A_MB31] = "mb31",
  1183. [ALC882_AUTO] = "auto",
  1184. };
  1185. static const struct snd_pci_quirk alc882_cfg_tbl[] = {
  1186. SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
  1187. ALC888_ACER_ASPIRE_4930G),
  1188. SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
  1189. ALC888_ACER_ASPIRE_4930G),
  1190. SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
  1191. ALC888_ACER_ASPIRE_8930G),
  1192. SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
  1193. ALC888_ACER_ASPIRE_8930G),
  1194. SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
  1195. ALC888_ACER_ASPIRE_6530G),
  1196. SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
  1197. ALC888_ACER_ASPIRE_6530G),
  1198. SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
  1199. ALC888_ACER_ASPIRE_7730G),
  1200. {}
  1201. };
  1202. /* codec SSID table for Intel Mac */
  1203. static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
  1204. SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
  1205. SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
  1206. SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
  1207. SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
  1208. SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
  1209. SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
  1210. SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
  1211. SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
  1212. SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
  1213. SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
  1214. SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
  1215. SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
  1216. SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
  1217. SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
  1218. SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
  1219. SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
  1220. /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
  1221. * so apparently no perfect solution yet
  1222. */
  1223. SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
  1224. SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
  1225. SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
  1226. {} /* terminator */
  1227. };
  1228. static const struct alc_config_preset alc882_presets[] = {
  1229. [ALC885_MBA21] = {
  1230. .mixers = { alc885_mba21_mixer },
  1231. .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
  1232. .num_dacs = 2,
  1233. .dac_nids = alc882_dac_nids,
  1234. .channel_mode = alc885_mba21_ch_modes,
  1235. .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
  1236. .input_mux = &alc882_capture_source,
  1237. .unsol_event = alc_sku_unsol_event,
  1238. .setup = alc885_mba21_setup,
  1239. .init_hook = alc_hp_automute,
  1240. },
  1241. [ALC885_MBP3] = {
  1242. .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
  1243. .init_verbs = { alc885_mbp3_init_verbs,
  1244. alc880_gpio1_init_verbs },
  1245. .num_dacs = 2,
  1246. .dac_nids = alc882_dac_nids,
  1247. .hp_nid = 0x04,
  1248. .channel_mode = alc885_mbp_4ch_modes,
  1249. .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
  1250. .input_mux = &alc882_capture_source,
  1251. .dig_out_nid = ALC882_DIGOUT_NID,
  1252. .dig_in_nid = ALC882_DIGIN_NID,
  1253. .unsol_event = alc_sku_unsol_event,
  1254. .setup = alc885_mbp3_setup,
  1255. .init_hook = alc_hp_automute,
  1256. },
  1257. [ALC885_MB5] = {
  1258. .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
  1259. .init_verbs = { alc885_mb5_init_verbs,
  1260. alc880_gpio1_init_verbs },
  1261. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  1262. .dac_nids = alc882_dac_nids,
  1263. .channel_mode = alc885_mb5_6ch_modes,
  1264. .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
  1265. .input_mux = &mb5_capture_source,
  1266. .dig_out_nid = ALC882_DIGOUT_NID,
  1267. .dig_in_nid = ALC882_DIGIN_NID,
  1268. .unsol_event = alc_sku_unsol_event,
  1269. .setup = alc885_mb5_setup,
  1270. .init_hook = alc_hp_automute,
  1271. },
  1272. [ALC885_MACMINI3] = {
  1273. .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
  1274. .init_verbs = { alc885_macmini3_init_verbs,
  1275. alc880_gpio1_init_verbs },
  1276. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  1277. .dac_nids = alc882_dac_nids,
  1278. .channel_mode = alc885_macmini3_6ch_modes,
  1279. .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
  1280. .input_mux = &macmini3_capture_source,
  1281. .dig_out_nid = ALC882_DIGOUT_NID,
  1282. .dig_in_nid = ALC882_DIGIN_NID,
  1283. .unsol_event = alc_sku_unsol_event,
  1284. .setup = alc885_macmini3_setup,
  1285. .init_hook = alc_hp_automute,
  1286. },
  1287. [ALC885_MACPRO] = {
  1288. .mixers = { alc882_macpro_mixer },
  1289. .init_verbs = { alc882_macpro_init_verbs },
  1290. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  1291. .dac_nids = alc882_dac_nids,
  1292. .dig_out_nid = ALC882_DIGOUT_NID,
  1293. .dig_in_nid = ALC882_DIGIN_NID,
  1294. .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
  1295. .channel_mode = alc882_ch_modes,
  1296. .input_mux = &alc882_capture_source,
  1297. .init_hook = alc885_macpro_init_hook,
  1298. },
  1299. [ALC885_IMAC24] = {
  1300. .mixers = { alc885_imac24_mixer },
  1301. .init_verbs = { alc885_imac24_init_verbs },
  1302. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  1303. .dac_nids = alc882_dac_nids,
  1304. .dig_out_nid = ALC882_DIGOUT_NID,
  1305. .dig_in_nid = ALC882_DIGIN_NID,
  1306. .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
  1307. .channel_mode = alc882_ch_modes,
  1308. .input_mux = &alc882_capture_source,
  1309. .unsol_event = alc_sku_unsol_event,
  1310. .setup = alc885_imac24_setup,
  1311. .init_hook = alc885_imac24_init_hook,
  1312. },
  1313. [ALC885_IMAC91] = {
  1314. .mixers = {alc885_imac91_mixer},
  1315. .init_verbs = { alc885_imac91_init_verbs,
  1316. alc880_gpio1_init_verbs },
  1317. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  1318. .dac_nids = alc882_dac_nids,
  1319. .channel_mode = alc885_mba21_ch_modes,
  1320. .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
  1321. .input_mux = &alc889A_imac91_capture_source,
  1322. .dig_out_nid = ALC882_DIGOUT_NID,
  1323. .dig_in_nid = ALC882_DIGIN_NID,
  1324. .unsol_event = alc_sku_unsol_event,
  1325. .setup = alc885_imac91_setup,
  1326. .init_hook = alc_hp_automute,
  1327. },
  1328. [ALC888_ACER_ASPIRE_4930G] = {
  1329. .mixers = { alc888_acer_aspire_4930g_mixer,
  1330. alc883_chmode_mixer },
  1331. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  1332. alc888_acer_aspire_4930g_verbs },
  1333. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  1334. .dac_nids = alc883_dac_nids,
  1335. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  1336. .adc_nids = alc883_adc_nids_rev,
  1337. .capsrc_nids = alc883_capsrc_nids_rev,
  1338. .dig_out_nid = ALC883_DIGOUT_NID,
  1339. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  1340. .channel_mode = alc883_3ST_6ch_modes,
  1341. .need_dac_fix = 1,
  1342. .const_channel_count = 6,
  1343. .num_mux_defs =
  1344. ARRAY_SIZE(alc888_2_capture_sources),
  1345. .input_mux = alc888_2_capture_sources,
  1346. .unsol_event = alc_sku_unsol_event,
  1347. .setup = alc888_acer_aspire_4930g_setup,
  1348. .init_hook = alc_hp_automute,
  1349. },
  1350. [ALC888_ACER_ASPIRE_6530G] = {
  1351. .mixers = { alc888_acer_aspire_6530_mixer },
  1352. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  1353. alc888_acer_aspire_6530g_verbs },
  1354. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  1355. .dac_nids = alc883_dac_nids,
  1356. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  1357. .adc_nids = alc883_adc_nids_rev,
  1358. .capsrc_nids = alc883_capsrc_nids_rev,
  1359. .dig_out_nid = ALC883_DIGOUT_NID,
  1360. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  1361. .channel_mode = alc883_3ST_2ch_modes,
  1362. .num_mux_defs =
  1363. ARRAY_SIZE(alc888_2_capture_sources),
  1364. .input_mux = alc888_acer_aspire_6530_sources,
  1365. .unsol_event = alc_sku_unsol_event,
  1366. .setup = alc888_acer_aspire_6530g_setup,
  1367. .init_hook = alc_hp_automute,
  1368. },
  1369. [ALC888_ACER_ASPIRE_8930G] = {
  1370. .mixers = { alc889_acer_aspire_8930g_mixer,
  1371. alc883_chmode_mixer },
  1372. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  1373. alc889_acer_aspire_8930g_verbs,
  1374. alc889_eapd_verbs},
  1375. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  1376. .dac_nids = alc883_dac_nids,
  1377. .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
  1378. .adc_nids = alc889_adc_nids,
  1379. .capsrc_nids = alc889_capsrc_nids,
  1380. .dig_out_nid = ALC883_DIGOUT_NID,
  1381. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  1382. .channel_mode = alc883_3ST_6ch_modes,
  1383. .need_dac_fix = 1,
  1384. .const_channel_count = 6,
  1385. .num_mux_defs =
  1386. ARRAY_SIZE(alc889_capture_sources),
  1387. .input_mux = alc889_capture_sources,
  1388. .unsol_event = alc_sku_unsol_event,
  1389. .setup = alc889_acer_aspire_8930g_setup,
  1390. .init_hook = alc_hp_automute,
  1391. #ifdef CONFIG_SND_HDA_POWER_SAVE
  1392. .power_hook = alc_power_eapd,
  1393. #endif
  1394. },
  1395. [ALC888_ACER_ASPIRE_7730G] = {
  1396. .mixers = { alc883_3ST_6ch_mixer,
  1397. alc883_chmode_mixer },
  1398. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  1399. alc888_acer_aspire_7730G_verbs },
  1400. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  1401. .dac_nids = alc883_dac_nids,
  1402. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  1403. .adc_nids = alc883_adc_nids_rev,
  1404. .capsrc_nids = alc883_capsrc_nids_rev,
  1405. .dig_out_nid = ALC883_DIGOUT_NID,
  1406. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  1407. .channel_mode = alc883_3ST_6ch_modes,
  1408. .need_dac_fix = 1,
  1409. .const_channel_count = 6,
  1410. .input_mux = &alc883_capture_source,
  1411. .unsol_event = alc_sku_unsol_event,
  1412. .setup = alc888_acer_aspire_7730g_setup,
  1413. .init_hook = alc_hp_automute,
  1414. },
  1415. [ALC889A_MB31] = {
  1416. .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
  1417. .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
  1418. alc880_gpio1_init_verbs },
  1419. .adc_nids = alc883_adc_nids,
  1420. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
  1421. .capsrc_nids = alc883_capsrc_nids,
  1422. .dac_nids = alc883_dac_nids,
  1423. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  1424. .channel_mode = alc889A_mb31_6ch_modes,
  1425. .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
  1426. .input_mux = &alc889A_mb31_capture_source,
  1427. .dig_out_nid = ALC883_DIGOUT_NID,
  1428. .unsol_event = alc889A_mb31_unsol_event,
  1429. .init_hook = alc889A_mb31_automute,
  1430. },
  1431. };