patch_realtek.c 645 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137
  1. /*
  2. * Universal Interface for Intel High Definition Audio Codec
  3. *
  4. * HD audio interface patch for ALC 260/880/882 codecs
  5. *
  6. * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
  7. * PeiSen Hou <pshou@realtek.com.tw>
  8. * Takashi Iwai <tiwai@suse.de>
  9. * Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
  10. *
  11. * This driver is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This driver is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  24. */
  25. #include <linux/init.h>
  26. #include <linux/delay.h>
  27. #include <linux/slab.h>
  28. #include <linux/pci.h>
  29. #include <sound/core.h>
  30. #include <sound/jack.h>
  31. #include "hda_codec.h"
  32. #include "hda_local.h"
  33. #include "hda_beep.h"
  34. #define ALC880_FRONT_EVENT 0x01
  35. #define ALC880_DCVOL_EVENT 0x02
  36. #define ALC880_HP_EVENT 0x04
  37. #define ALC880_MIC_EVENT 0x08
  38. /* ALC880 board config type */
  39. enum {
  40. ALC880_3ST,
  41. ALC880_3ST_DIG,
  42. ALC880_5ST,
  43. ALC880_5ST_DIG,
  44. ALC880_W810,
  45. ALC880_Z71V,
  46. ALC880_6ST,
  47. ALC880_6ST_DIG,
  48. ALC880_F1734,
  49. ALC880_ASUS,
  50. ALC880_ASUS_DIG,
  51. ALC880_ASUS_W1V,
  52. ALC880_ASUS_DIG2,
  53. ALC880_FUJITSU,
  54. ALC880_UNIWILL_DIG,
  55. ALC880_UNIWILL,
  56. ALC880_UNIWILL_P53,
  57. ALC880_CLEVO,
  58. ALC880_TCL_S700,
  59. ALC880_LG,
  60. ALC880_LG_LW,
  61. ALC880_MEDION_RIM,
  62. #ifdef CONFIG_SND_DEBUG
  63. ALC880_TEST,
  64. #endif
  65. ALC880_AUTO,
  66. ALC880_MODEL_LAST /* last tag */
  67. };
  68. /* ALC260 models */
  69. enum {
  70. ALC260_BASIC,
  71. ALC260_HP,
  72. ALC260_HP_DC7600,
  73. ALC260_HP_3013,
  74. ALC260_FUJITSU_S702X,
  75. ALC260_ACER,
  76. ALC260_WILL,
  77. ALC260_REPLACER_672V,
  78. ALC260_FAVORIT100,
  79. #ifdef CONFIG_SND_DEBUG
  80. ALC260_TEST,
  81. #endif
  82. ALC260_AUTO,
  83. ALC260_MODEL_LAST /* last tag */
  84. };
  85. /* ALC262 models */
  86. enum {
  87. ALC262_BASIC,
  88. ALC262_HIPPO,
  89. ALC262_HIPPO_1,
  90. ALC262_FUJITSU,
  91. ALC262_HP_BPC,
  92. ALC262_HP_BPC_D7000_WL,
  93. ALC262_HP_BPC_D7000_WF,
  94. ALC262_HP_TC_T5735,
  95. ALC262_HP_RP5700,
  96. ALC262_BENQ_ED8,
  97. ALC262_SONY_ASSAMD,
  98. ALC262_BENQ_T31,
  99. ALC262_ULTRA,
  100. ALC262_LENOVO_3000,
  101. ALC262_NEC,
  102. ALC262_TOSHIBA_S06,
  103. ALC262_TOSHIBA_RX1,
  104. ALC262_TYAN,
  105. ALC262_AUTO,
  106. ALC262_MODEL_LAST /* last tag */
  107. };
  108. /* ALC268 models */
  109. enum {
  110. ALC267_QUANTA_IL1,
  111. ALC268_3ST,
  112. ALC268_TOSHIBA,
  113. ALC268_ACER,
  114. ALC268_ACER_DMIC,
  115. ALC268_ACER_ASPIRE_ONE,
  116. ALC268_DELL,
  117. ALC268_ZEPTO,
  118. #ifdef CONFIG_SND_DEBUG
  119. ALC268_TEST,
  120. #endif
  121. ALC268_AUTO,
  122. ALC268_MODEL_LAST /* last tag */
  123. };
  124. /* ALC269 models */
  125. enum {
  126. ALC269_BASIC,
  127. ALC269_QUANTA_FL1,
  128. ALC269_AMIC,
  129. ALC269_DMIC,
  130. ALC269VB_AMIC,
  131. ALC269VB_DMIC,
  132. ALC269_FUJITSU,
  133. ALC269_LIFEBOOK,
  134. ALC271_ACER,
  135. ALC269_AUTO,
  136. ALC269_MODEL_LAST /* last tag */
  137. };
  138. /* ALC861 models */
  139. enum {
  140. ALC861_3ST,
  141. ALC660_3ST,
  142. ALC861_3ST_DIG,
  143. ALC861_6ST_DIG,
  144. ALC861_UNIWILL_M31,
  145. ALC861_TOSHIBA,
  146. ALC861_ASUS,
  147. ALC861_ASUS_LAPTOP,
  148. ALC861_AUTO,
  149. ALC861_MODEL_LAST,
  150. };
  151. /* ALC861-VD models */
  152. enum {
  153. ALC660VD_3ST,
  154. ALC660VD_3ST_DIG,
  155. ALC660VD_ASUS_V1S,
  156. ALC861VD_3ST,
  157. ALC861VD_3ST_DIG,
  158. ALC861VD_6ST_DIG,
  159. ALC861VD_LENOVO,
  160. ALC861VD_DALLAS,
  161. ALC861VD_HP,
  162. ALC861VD_AUTO,
  163. ALC861VD_MODEL_LAST,
  164. };
  165. /* ALC662 models */
  166. enum {
  167. ALC662_3ST_2ch_DIG,
  168. ALC662_3ST_6ch_DIG,
  169. ALC662_3ST_6ch,
  170. ALC662_5ST_DIG,
  171. ALC662_LENOVO_101E,
  172. ALC662_ASUS_EEEPC_P701,
  173. ALC662_ASUS_EEEPC_EP20,
  174. ALC663_ASUS_M51VA,
  175. ALC663_ASUS_G71V,
  176. ALC663_ASUS_H13,
  177. ALC663_ASUS_G50V,
  178. ALC662_ECS,
  179. ALC663_ASUS_MODE1,
  180. ALC662_ASUS_MODE2,
  181. ALC663_ASUS_MODE3,
  182. ALC663_ASUS_MODE4,
  183. ALC663_ASUS_MODE5,
  184. ALC663_ASUS_MODE6,
  185. ALC663_ASUS_MODE7,
  186. ALC663_ASUS_MODE8,
  187. ALC272_DELL,
  188. ALC272_DELL_ZM1,
  189. ALC272_SAMSUNG_NC10,
  190. ALC662_AUTO,
  191. ALC662_MODEL_LAST,
  192. };
  193. /* ALC882 models */
  194. enum {
  195. ALC882_3ST_DIG,
  196. ALC882_6ST_DIG,
  197. ALC882_ARIMA,
  198. ALC882_W2JC,
  199. ALC882_TARGA,
  200. ALC882_ASUS_A7J,
  201. ALC882_ASUS_A7M,
  202. ALC885_MACPRO,
  203. ALC885_MBA21,
  204. ALC885_MBP3,
  205. ALC885_MB5,
  206. ALC885_MACMINI3,
  207. ALC885_IMAC24,
  208. ALC885_IMAC91,
  209. ALC883_3ST_2ch_DIG,
  210. ALC883_3ST_6ch_DIG,
  211. ALC883_3ST_6ch,
  212. ALC883_6ST_DIG,
  213. ALC883_TARGA_DIG,
  214. ALC883_TARGA_2ch_DIG,
  215. ALC883_TARGA_8ch_DIG,
  216. ALC883_ACER,
  217. ALC883_ACER_ASPIRE,
  218. ALC888_ACER_ASPIRE_4930G,
  219. ALC888_ACER_ASPIRE_6530G,
  220. ALC888_ACER_ASPIRE_8930G,
  221. ALC888_ACER_ASPIRE_7730G,
  222. ALC883_MEDION,
  223. ALC883_MEDION_WIM2160,
  224. ALC883_LAPTOP_EAPD,
  225. ALC883_LENOVO_101E_2ch,
  226. ALC883_LENOVO_NB0763,
  227. ALC888_LENOVO_MS7195_DIG,
  228. ALC888_LENOVO_SKY,
  229. ALC883_HAIER_W66,
  230. ALC888_3ST_HP,
  231. ALC888_6ST_DELL,
  232. ALC883_MITAC,
  233. ALC883_CLEVO_M540R,
  234. ALC883_CLEVO_M720,
  235. ALC883_FUJITSU_PI2515,
  236. ALC888_FUJITSU_XA3530,
  237. ALC883_3ST_6ch_INTEL,
  238. ALC889A_INTEL,
  239. ALC889_INTEL,
  240. ALC888_ASUS_M90V,
  241. ALC888_ASUS_EEE1601,
  242. ALC889A_MB31,
  243. ALC1200_ASUS_P5Q,
  244. ALC883_SONY_VAIO_TT,
  245. ALC882_AUTO,
  246. ALC882_MODEL_LAST,
  247. };
  248. /* ALC680 models */
  249. enum {
  250. ALC680_BASE,
  251. ALC680_AUTO,
  252. ALC680_MODEL_LAST,
  253. };
  254. /* for GPIO Poll */
  255. #define GPIO_MASK 0x03
  256. /* extra amp-initialization sequence types */
  257. enum {
  258. ALC_INIT_NONE,
  259. ALC_INIT_DEFAULT,
  260. ALC_INIT_GPIO1,
  261. ALC_INIT_GPIO2,
  262. ALC_INIT_GPIO3,
  263. };
  264. struct alc_mic_route {
  265. hda_nid_t pin;
  266. unsigned char mux_idx;
  267. unsigned char amix_idx;
  268. };
  269. #define MUX_IDX_UNDEF ((unsigned char)-1)
  270. struct alc_customize_define {
  271. unsigned int sku_cfg;
  272. unsigned char port_connectivity;
  273. unsigned char check_sum;
  274. unsigned char customization;
  275. unsigned char external_amp;
  276. unsigned int enable_pcbeep:1;
  277. unsigned int platform_type:1;
  278. unsigned int swap:1;
  279. unsigned int override:1;
  280. unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
  281. };
  282. struct alc_fixup;
  283. struct alc_spec {
  284. /* codec parameterization */
  285. struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
  286. unsigned int num_mixers;
  287. struct snd_kcontrol_new *cap_mixer; /* capture mixer */
  288. unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
  289. const struct hda_verb *init_verbs[10]; /* initialization verbs
  290. * don't forget NULL
  291. * termination!
  292. */
  293. unsigned int num_init_verbs;
  294. char stream_name_analog[32]; /* analog PCM stream */
  295. struct hda_pcm_stream *stream_analog_playback;
  296. struct hda_pcm_stream *stream_analog_capture;
  297. struct hda_pcm_stream *stream_analog_alt_playback;
  298. struct hda_pcm_stream *stream_analog_alt_capture;
  299. char stream_name_digital[32]; /* digital PCM stream */
  300. struct hda_pcm_stream *stream_digital_playback;
  301. struct hda_pcm_stream *stream_digital_capture;
  302. /* playback */
  303. struct hda_multi_out multiout; /* playback set-up
  304. * max_channels, dacs must be set
  305. * dig_out_nid and hp_nid are optional
  306. */
  307. hda_nid_t alt_dac_nid;
  308. hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
  309. int dig_out_type;
  310. /* capture */
  311. unsigned int num_adc_nids;
  312. hda_nid_t *adc_nids;
  313. hda_nid_t *capsrc_nids;
  314. hda_nid_t dig_in_nid; /* digital-in NID; optional */
  315. /* capture setup for dynamic dual-adc switch */
  316. unsigned int cur_adc_idx;
  317. hda_nid_t cur_adc;
  318. unsigned int cur_adc_stream_tag;
  319. unsigned int cur_adc_format;
  320. /* capture source */
  321. unsigned int num_mux_defs;
  322. const struct hda_input_mux *input_mux;
  323. unsigned int cur_mux[3];
  324. struct alc_mic_route ext_mic;
  325. struct alc_mic_route int_mic;
  326. /* channel model */
  327. const struct hda_channel_mode *channel_mode;
  328. int num_channel_mode;
  329. int need_dac_fix;
  330. int const_channel_count;
  331. int ext_channel_count;
  332. /* PCM information */
  333. struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
  334. /* dynamic controls, init_verbs and input_mux */
  335. struct auto_pin_cfg autocfg;
  336. struct alc_customize_define cdefine;
  337. struct snd_array kctls;
  338. struct hda_input_mux private_imux[3];
  339. hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
  340. hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
  341. hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
  342. /* hooks */
  343. void (*init_hook)(struct hda_codec *codec);
  344. void (*unsol_event)(struct hda_codec *codec, unsigned int res);
  345. #ifdef CONFIG_SND_HDA_POWER_SAVE
  346. void (*power_hook)(struct hda_codec *codec);
  347. #endif
  348. /* for pin sensing */
  349. unsigned int sense_updated: 1;
  350. unsigned int jack_present: 1;
  351. unsigned int master_sw: 1;
  352. unsigned int auto_mic:1;
  353. /* other flags */
  354. unsigned int no_analog :1; /* digital I/O only */
  355. unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */
  356. unsigned int single_input_src:1;
  357. int init_amp;
  358. int codec_variant; /* flag for other variants */
  359. /* for virtual master */
  360. hda_nid_t vmaster_nid;
  361. #ifdef CONFIG_SND_HDA_POWER_SAVE
  362. struct hda_loopback_check loopback;
  363. #endif
  364. /* for PLL fix */
  365. hda_nid_t pll_nid;
  366. unsigned int pll_coef_idx, pll_coef_bit;
  367. /* fix-up list */
  368. int fixup_id;
  369. const struct alc_fixup *fixup_list;
  370. const char *fixup_name;
  371. };
  372. /*
  373. * configuration template - to be copied to the spec instance
  374. */
  375. struct alc_config_preset {
  376. struct snd_kcontrol_new *mixers[5]; /* should be identical size
  377. * with spec
  378. */
  379. struct snd_kcontrol_new *cap_mixer; /* capture mixer */
  380. const struct hda_verb *init_verbs[5];
  381. unsigned int num_dacs;
  382. hda_nid_t *dac_nids;
  383. hda_nid_t dig_out_nid; /* optional */
  384. hda_nid_t hp_nid; /* optional */
  385. hda_nid_t *slave_dig_outs;
  386. unsigned int num_adc_nids;
  387. hda_nid_t *adc_nids;
  388. hda_nid_t *capsrc_nids;
  389. hda_nid_t dig_in_nid;
  390. unsigned int num_channel_mode;
  391. const struct hda_channel_mode *channel_mode;
  392. int need_dac_fix;
  393. int const_channel_count;
  394. unsigned int num_mux_defs;
  395. const struct hda_input_mux *input_mux;
  396. void (*unsol_event)(struct hda_codec *, unsigned int);
  397. void (*setup)(struct hda_codec *);
  398. void (*init_hook)(struct hda_codec *);
  399. #ifdef CONFIG_SND_HDA_POWER_SAVE
  400. struct hda_amp_list *loopbacks;
  401. void (*power_hook)(struct hda_codec *codec);
  402. #endif
  403. };
  404. /*
  405. * input MUX handling
  406. */
  407. static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
  408. struct snd_ctl_elem_info *uinfo)
  409. {
  410. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  411. struct alc_spec *spec = codec->spec;
  412. unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
  413. if (mux_idx >= spec->num_mux_defs)
  414. mux_idx = 0;
  415. if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
  416. mux_idx = 0;
  417. return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
  418. }
  419. static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
  420. struct snd_ctl_elem_value *ucontrol)
  421. {
  422. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  423. struct alc_spec *spec = codec->spec;
  424. unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  425. ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
  426. return 0;
  427. }
  428. static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
  429. struct snd_ctl_elem_value *ucontrol)
  430. {
  431. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  432. struct alc_spec *spec = codec->spec;
  433. const struct hda_input_mux *imux;
  434. unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  435. unsigned int mux_idx;
  436. hda_nid_t nid = spec->capsrc_nids ?
  437. spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
  438. unsigned int type;
  439. mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
  440. imux = &spec->input_mux[mux_idx];
  441. if (!imux->num_items && mux_idx > 0)
  442. imux = &spec->input_mux[0];
  443. type = get_wcaps_type(get_wcaps(codec, nid));
  444. if (type == AC_WID_AUD_MIX) {
  445. /* Matrix-mixer style (e.g. ALC882) */
  446. unsigned int *cur_val = &spec->cur_mux[adc_idx];
  447. unsigned int i, idx;
  448. idx = ucontrol->value.enumerated.item[0];
  449. if (idx >= imux->num_items)
  450. idx = imux->num_items - 1;
  451. if (*cur_val == idx)
  452. return 0;
  453. for (i = 0; i < imux->num_items; i++) {
  454. unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
  455. snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
  456. imux->items[i].index,
  457. HDA_AMP_MUTE, v);
  458. }
  459. *cur_val = idx;
  460. return 1;
  461. } else {
  462. /* MUX style (e.g. ALC880) */
  463. return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
  464. &spec->cur_mux[adc_idx]);
  465. }
  466. }
  467. /*
  468. * channel mode setting
  469. */
  470. static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
  471. struct snd_ctl_elem_info *uinfo)
  472. {
  473. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  474. struct alc_spec *spec = codec->spec;
  475. return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
  476. spec->num_channel_mode);
  477. }
  478. static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
  479. struct snd_ctl_elem_value *ucontrol)
  480. {
  481. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  482. struct alc_spec *spec = codec->spec;
  483. return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
  484. spec->num_channel_mode,
  485. spec->ext_channel_count);
  486. }
  487. static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
  488. struct snd_ctl_elem_value *ucontrol)
  489. {
  490. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  491. struct alc_spec *spec = codec->spec;
  492. int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
  493. spec->num_channel_mode,
  494. &spec->ext_channel_count);
  495. if (err >= 0 && !spec->const_channel_count) {
  496. spec->multiout.max_channels = spec->ext_channel_count;
  497. if (spec->need_dac_fix)
  498. spec->multiout.num_dacs = spec->multiout.max_channels / 2;
  499. }
  500. return err;
  501. }
  502. /*
  503. * Control the mode of pin widget settings via the mixer. "pc" is used
  504. * instead of "%" to avoid consequences of accidently treating the % as
  505. * being part of a format specifier. Maximum allowed length of a value is
  506. * 63 characters plus NULL terminator.
  507. *
  508. * Note: some retasking pin complexes seem to ignore requests for input
  509. * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
  510. * are requested. Therefore order this list so that this behaviour will not
  511. * cause problems when mixer clients move through the enum sequentially.
  512. * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
  513. * March 2006.
  514. */
  515. static char *alc_pin_mode_names[] = {
  516. "Mic 50pc bias", "Mic 80pc bias",
  517. "Line in", "Line out", "Headphone out",
  518. };
  519. static unsigned char alc_pin_mode_values[] = {
  520. PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
  521. };
  522. /* The control can present all 5 options, or it can limit the options based
  523. * in the pin being assumed to be exclusively an input or an output pin. In
  524. * addition, "input" pins may or may not process the mic bias option
  525. * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
  526. * accept requests for bias as of chip versions up to March 2006) and/or
  527. * wiring in the computer.
  528. */
  529. #define ALC_PIN_DIR_IN 0x00
  530. #define ALC_PIN_DIR_OUT 0x01
  531. #define ALC_PIN_DIR_INOUT 0x02
  532. #define ALC_PIN_DIR_IN_NOMICBIAS 0x03
  533. #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
  534. /* Info about the pin modes supported by the different pin direction modes.
  535. * For each direction the minimum and maximum values are given.
  536. */
  537. static signed char alc_pin_mode_dir_info[5][2] = {
  538. { 0, 2 }, /* ALC_PIN_DIR_IN */
  539. { 3, 4 }, /* ALC_PIN_DIR_OUT */
  540. { 0, 4 }, /* ALC_PIN_DIR_INOUT */
  541. { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
  542. { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
  543. };
  544. #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
  545. #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
  546. #define alc_pin_mode_n_items(_dir) \
  547. (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
  548. static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
  549. struct snd_ctl_elem_info *uinfo)
  550. {
  551. unsigned int item_num = uinfo->value.enumerated.item;
  552. unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
  553. uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  554. uinfo->count = 1;
  555. uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
  556. if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
  557. item_num = alc_pin_mode_min(dir);
  558. strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
  559. return 0;
  560. }
  561. static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
  562. struct snd_ctl_elem_value *ucontrol)
  563. {
  564. unsigned int i;
  565. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  566. hda_nid_t nid = kcontrol->private_value & 0xffff;
  567. unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
  568. long *valp = ucontrol->value.integer.value;
  569. unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
  570. AC_VERB_GET_PIN_WIDGET_CONTROL,
  571. 0x00);
  572. /* Find enumerated value for current pinctl setting */
  573. i = alc_pin_mode_min(dir);
  574. while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
  575. i++;
  576. *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
  577. return 0;
  578. }
  579. static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
  580. struct snd_ctl_elem_value *ucontrol)
  581. {
  582. signed int change;
  583. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  584. hda_nid_t nid = kcontrol->private_value & 0xffff;
  585. unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
  586. long val = *ucontrol->value.integer.value;
  587. unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
  588. AC_VERB_GET_PIN_WIDGET_CONTROL,
  589. 0x00);
  590. if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
  591. val = alc_pin_mode_min(dir);
  592. change = pinctl != alc_pin_mode_values[val];
  593. if (change) {
  594. /* Set pin mode to that requested */
  595. snd_hda_codec_write_cache(codec, nid, 0,
  596. AC_VERB_SET_PIN_WIDGET_CONTROL,
  597. alc_pin_mode_values[val]);
  598. /* Also enable the retasking pin's input/output as required
  599. * for the requested pin mode. Enum values of 2 or less are
  600. * input modes.
  601. *
  602. * Dynamically switching the input/output buffers probably
  603. * reduces noise slightly (particularly on input) so we'll
  604. * do it. However, having both input and output buffers
  605. * enabled simultaneously doesn't seem to be problematic if
  606. * this turns out to be necessary in the future.
  607. */
  608. if (val <= 2) {
  609. snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
  610. HDA_AMP_MUTE, HDA_AMP_MUTE);
  611. snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
  612. HDA_AMP_MUTE, 0);
  613. } else {
  614. snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
  615. HDA_AMP_MUTE, HDA_AMP_MUTE);
  616. snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
  617. HDA_AMP_MUTE, 0);
  618. }
  619. }
  620. return change;
  621. }
  622. #define ALC_PIN_MODE(xname, nid, dir) \
  623. { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
  624. .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
  625. .info = alc_pin_mode_info, \
  626. .get = alc_pin_mode_get, \
  627. .put = alc_pin_mode_put, \
  628. .private_value = nid | (dir<<16) }
  629. /* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
  630. * together using a mask with more than one bit set. This control is
  631. * currently used only by the ALC260 test model. At this stage they are not
  632. * needed for any "production" models.
  633. */
  634. #ifdef CONFIG_SND_DEBUG
  635. #define alc_gpio_data_info snd_ctl_boolean_mono_info
  636. static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
  637. struct snd_ctl_elem_value *ucontrol)
  638. {
  639. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  640. hda_nid_t nid = kcontrol->private_value & 0xffff;
  641. unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
  642. long *valp = ucontrol->value.integer.value;
  643. unsigned int val = snd_hda_codec_read(codec, nid, 0,
  644. AC_VERB_GET_GPIO_DATA, 0x00);
  645. *valp = (val & mask) != 0;
  646. return 0;
  647. }
  648. static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
  649. struct snd_ctl_elem_value *ucontrol)
  650. {
  651. signed int change;
  652. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  653. hda_nid_t nid = kcontrol->private_value & 0xffff;
  654. unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
  655. long val = *ucontrol->value.integer.value;
  656. unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
  657. AC_VERB_GET_GPIO_DATA,
  658. 0x00);
  659. /* Set/unset the masked GPIO bit(s) as needed */
  660. change = (val == 0 ? 0 : mask) != (gpio_data & mask);
  661. if (val == 0)
  662. gpio_data &= ~mask;
  663. else
  664. gpio_data |= mask;
  665. snd_hda_codec_write_cache(codec, nid, 0,
  666. AC_VERB_SET_GPIO_DATA, gpio_data);
  667. return change;
  668. }
  669. #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
  670. { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
  671. .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
  672. .info = alc_gpio_data_info, \
  673. .get = alc_gpio_data_get, \
  674. .put = alc_gpio_data_put, \
  675. .private_value = nid | (mask<<16) }
  676. #endif /* CONFIG_SND_DEBUG */
  677. /* A switch control to allow the enabling of the digital IO pins on the
  678. * ALC260. This is incredibly simplistic; the intention of this control is
  679. * to provide something in the test model allowing digital outputs to be
  680. * identified if present. If models are found which can utilise these
  681. * outputs a more complete mixer control can be devised for those models if
  682. * necessary.
  683. */
  684. #ifdef CONFIG_SND_DEBUG
  685. #define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
  686. static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
  687. struct snd_ctl_elem_value *ucontrol)
  688. {
  689. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  690. hda_nid_t nid = kcontrol->private_value & 0xffff;
  691. unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
  692. long *valp = ucontrol->value.integer.value;
  693. unsigned int val = snd_hda_codec_read(codec, nid, 0,
  694. AC_VERB_GET_DIGI_CONVERT_1, 0x00);
  695. *valp = (val & mask) != 0;
  696. return 0;
  697. }
  698. static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
  699. struct snd_ctl_elem_value *ucontrol)
  700. {
  701. signed int change;
  702. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  703. hda_nid_t nid = kcontrol->private_value & 0xffff;
  704. unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
  705. long val = *ucontrol->value.integer.value;
  706. unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
  707. AC_VERB_GET_DIGI_CONVERT_1,
  708. 0x00);
  709. /* Set/unset the masked control bit(s) as needed */
  710. change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
  711. if (val==0)
  712. ctrl_data &= ~mask;
  713. else
  714. ctrl_data |= mask;
  715. snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
  716. ctrl_data);
  717. return change;
  718. }
  719. #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
  720. { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
  721. .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
  722. .info = alc_spdif_ctrl_info, \
  723. .get = alc_spdif_ctrl_get, \
  724. .put = alc_spdif_ctrl_put, \
  725. .private_value = nid | (mask<<16) }
  726. #endif /* CONFIG_SND_DEBUG */
  727. /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
  728. * Again, this is only used in the ALC26x test models to help identify when
  729. * the EAPD line must be asserted for features to work.
  730. */
  731. #ifdef CONFIG_SND_DEBUG
  732. #define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
  733. static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
  734. struct snd_ctl_elem_value *ucontrol)
  735. {
  736. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  737. hda_nid_t nid = kcontrol->private_value & 0xffff;
  738. unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
  739. long *valp = ucontrol->value.integer.value;
  740. unsigned int val = snd_hda_codec_read(codec, nid, 0,
  741. AC_VERB_GET_EAPD_BTLENABLE, 0x00);
  742. *valp = (val & mask) != 0;
  743. return 0;
  744. }
  745. static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
  746. struct snd_ctl_elem_value *ucontrol)
  747. {
  748. int change;
  749. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  750. hda_nid_t nid = kcontrol->private_value & 0xffff;
  751. unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
  752. long val = *ucontrol->value.integer.value;
  753. unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
  754. AC_VERB_GET_EAPD_BTLENABLE,
  755. 0x00);
  756. /* Set/unset the masked control bit(s) as needed */
  757. change = (!val ? 0 : mask) != (ctrl_data & mask);
  758. if (!val)
  759. ctrl_data &= ~mask;
  760. else
  761. ctrl_data |= mask;
  762. snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
  763. ctrl_data);
  764. return change;
  765. }
  766. #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
  767. { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
  768. .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
  769. .info = alc_eapd_ctrl_info, \
  770. .get = alc_eapd_ctrl_get, \
  771. .put = alc_eapd_ctrl_put, \
  772. .private_value = nid | (mask<<16) }
  773. #endif /* CONFIG_SND_DEBUG */
  774. /*
  775. * set up the input pin config (depending on the given auto-pin type)
  776. */
  777. static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
  778. int auto_pin_type)
  779. {
  780. unsigned int val = PIN_IN;
  781. if (auto_pin_type == AUTO_PIN_MIC) {
  782. unsigned int pincap;
  783. unsigned int oldval;
  784. oldval = snd_hda_codec_read(codec, nid, 0,
  785. AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  786. pincap = snd_hda_query_pin_caps(codec, nid);
  787. pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
  788. /* if the default pin setup is vref50, we give it priority */
  789. if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
  790. val = PIN_VREF80;
  791. else if (pincap & AC_PINCAP_VREF_50)
  792. val = PIN_VREF50;
  793. else if (pincap & AC_PINCAP_VREF_100)
  794. val = PIN_VREF100;
  795. else if (pincap & AC_PINCAP_VREF_GRD)
  796. val = PIN_VREFGRD;
  797. }
  798. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
  799. }
  800. static void alc_fixup_autocfg_pin_nums(struct hda_codec *codec)
  801. {
  802. struct alc_spec *spec = codec->spec;
  803. struct auto_pin_cfg *cfg = &spec->autocfg;
  804. if (!cfg->line_outs) {
  805. while (cfg->line_outs < AUTO_CFG_MAX_OUTS &&
  806. cfg->line_out_pins[cfg->line_outs])
  807. cfg->line_outs++;
  808. }
  809. if (!cfg->speaker_outs) {
  810. while (cfg->speaker_outs < AUTO_CFG_MAX_OUTS &&
  811. cfg->speaker_pins[cfg->speaker_outs])
  812. cfg->speaker_outs++;
  813. }
  814. if (!cfg->hp_outs) {
  815. while (cfg->hp_outs < AUTO_CFG_MAX_OUTS &&
  816. cfg->hp_pins[cfg->hp_outs])
  817. cfg->hp_outs++;
  818. }
  819. }
  820. /*
  821. */
  822. static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
  823. {
  824. if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
  825. return;
  826. spec->mixers[spec->num_mixers++] = mix;
  827. }
  828. static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
  829. {
  830. if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
  831. return;
  832. spec->init_verbs[spec->num_init_verbs++] = verb;
  833. }
  834. /*
  835. * set up from the preset table
  836. */
  837. static void setup_preset(struct hda_codec *codec,
  838. const struct alc_config_preset *preset)
  839. {
  840. struct alc_spec *spec = codec->spec;
  841. int i;
  842. for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
  843. add_mixer(spec, preset->mixers[i]);
  844. spec->cap_mixer = preset->cap_mixer;
  845. for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
  846. i++)
  847. add_verb(spec, preset->init_verbs[i]);
  848. spec->channel_mode = preset->channel_mode;
  849. spec->num_channel_mode = preset->num_channel_mode;
  850. spec->need_dac_fix = preset->need_dac_fix;
  851. spec->const_channel_count = preset->const_channel_count;
  852. if (preset->const_channel_count)
  853. spec->multiout.max_channels = preset->const_channel_count;
  854. else
  855. spec->multiout.max_channels = spec->channel_mode[0].channels;
  856. spec->ext_channel_count = spec->channel_mode[0].channels;
  857. spec->multiout.num_dacs = preset->num_dacs;
  858. spec->multiout.dac_nids = preset->dac_nids;
  859. spec->multiout.dig_out_nid = preset->dig_out_nid;
  860. spec->multiout.slave_dig_outs = preset->slave_dig_outs;
  861. spec->multiout.hp_nid = preset->hp_nid;
  862. spec->num_mux_defs = preset->num_mux_defs;
  863. if (!spec->num_mux_defs)
  864. spec->num_mux_defs = 1;
  865. spec->input_mux = preset->input_mux;
  866. spec->num_adc_nids = preset->num_adc_nids;
  867. spec->adc_nids = preset->adc_nids;
  868. spec->capsrc_nids = preset->capsrc_nids;
  869. spec->dig_in_nid = preset->dig_in_nid;
  870. spec->unsol_event = preset->unsol_event;
  871. spec->init_hook = preset->init_hook;
  872. #ifdef CONFIG_SND_HDA_POWER_SAVE
  873. spec->power_hook = preset->power_hook;
  874. spec->loopback.amplist = preset->loopbacks;
  875. #endif
  876. if (preset->setup)
  877. preset->setup(codec);
  878. alc_fixup_autocfg_pin_nums(codec);
  879. }
  880. /* Enable GPIO mask and set output */
  881. static struct hda_verb alc_gpio1_init_verbs[] = {
  882. {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
  883. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
  884. {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
  885. { }
  886. };
  887. static struct hda_verb alc_gpio2_init_verbs[] = {
  888. {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
  889. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
  890. {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
  891. { }
  892. };
  893. static struct hda_verb alc_gpio3_init_verbs[] = {
  894. {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
  895. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
  896. {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
  897. { }
  898. };
  899. /*
  900. * Fix hardware PLL issue
  901. * On some codecs, the analog PLL gating control must be off while
  902. * the default value is 1.
  903. */
  904. static void alc_fix_pll(struct hda_codec *codec)
  905. {
  906. struct alc_spec *spec = codec->spec;
  907. unsigned int val;
  908. if (!spec->pll_nid)
  909. return;
  910. snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
  911. spec->pll_coef_idx);
  912. val = snd_hda_codec_read(codec, spec->pll_nid, 0,
  913. AC_VERB_GET_PROC_COEF, 0);
  914. snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
  915. spec->pll_coef_idx);
  916. snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
  917. val & ~(1 << spec->pll_coef_bit));
  918. }
  919. static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
  920. unsigned int coef_idx, unsigned int coef_bit)
  921. {
  922. struct alc_spec *spec = codec->spec;
  923. spec->pll_nid = nid;
  924. spec->pll_coef_idx = coef_idx;
  925. spec->pll_coef_bit = coef_bit;
  926. alc_fix_pll(codec);
  927. }
  928. static int alc_init_jacks(struct hda_codec *codec)
  929. {
  930. #ifdef CONFIG_SND_HDA_INPUT_JACK
  931. struct alc_spec *spec = codec->spec;
  932. int err;
  933. unsigned int hp_nid = spec->autocfg.hp_pins[0];
  934. unsigned int mic_nid = spec->ext_mic.pin;
  935. if (hp_nid) {
  936. err = snd_hda_input_jack_add(codec, hp_nid,
  937. SND_JACK_HEADPHONE, NULL);
  938. if (err < 0)
  939. return err;
  940. snd_hda_input_jack_report(codec, hp_nid);
  941. }
  942. if (mic_nid) {
  943. err = snd_hda_input_jack_add(codec, mic_nid,
  944. SND_JACK_MICROPHONE, NULL);
  945. if (err < 0)
  946. return err;
  947. snd_hda_input_jack_report(codec, mic_nid);
  948. }
  949. #endif /* CONFIG_SND_HDA_INPUT_JACK */
  950. return 0;
  951. }
  952. static void alc_automute_speaker(struct hda_codec *codec, int pinctl)
  953. {
  954. struct alc_spec *spec = codec->spec;
  955. unsigned int mute;
  956. hda_nid_t nid;
  957. int i;
  958. spec->jack_present = 0;
  959. for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
  960. nid = spec->autocfg.hp_pins[i];
  961. if (!nid)
  962. break;
  963. snd_hda_input_jack_report(codec, nid);
  964. spec->jack_present |= snd_hda_jack_detect(codec, nid);
  965. }
  966. mute = spec->jack_present ? HDA_AMP_MUTE : 0;
  967. /* Toggle internal speakers muting */
  968. for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
  969. nid = spec->autocfg.speaker_pins[i];
  970. if (!nid)
  971. break;
  972. if (pinctl) {
  973. snd_hda_codec_write(codec, nid, 0,
  974. AC_VERB_SET_PIN_WIDGET_CONTROL,
  975. spec->jack_present ? 0 : PIN_OUT);
  976. } else {
  977. snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
  978. HDA_AMP_MUTE, mute);
  979. }
  980. }
  981. }
  982. static void alc_automute_pin(struct hda_codec *codec)
  983. {
  984. alc_automute_speaker(codec, 1);
  985. }
  986. static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
  987. hda_nid_t nid)
  988. {
  989. hda_nid_t conn[HDA_MAX_NUM_INPUTS];
  990. int i, nums;
  991. nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
  992. for (i = 0; i < nums; i++)
  993. if (conn[i] == nid)
  994. return i;
  995. return -1;
  996. }
  997. /* switch the current ADC according to the jack state */
  998. static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec)
  999. {
  1000. struct alc_spec *spec = codec->spec;
  1001. unsigned int present;
  1002. hda_nid_t new_adc;
  1003. present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
  1004. if (present)
  1005. spec->cur_adc_idx = 1;
  1006. else
  1007. spec->cur_adc_idx = 0;
  1008. new_adc = spec->adc_nids[spec->cur_adc_idx];
  1009. if (spec->cur_adc && spec->cur_adc != new_adc) {
  1010. /* stream is running, let's swap the current ADC */
  1011. __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
  1012. spec->cur_adc = new_adc;
  1013. snd_hda_codec_setup_stream(codec, new_adc,
  1014. spec->cur_adc_stream_tag, 0,
  1015. spec->cur_adc_format);
  1016. }
  1017. }
  1018. static void alc_mic_automute(struct hda_codec *codec)
  1019. {
  1020. struct alc_spec *spec = codec->spec;
  1021. struct alc_mic_route *dead, *alive;
  1022. unsigned int present, type;
  1023. hda_nid_t cap_nid;
  1024. if (!spec->auto_mic)
  1025. return;
  1026. if (!spec->int_mic.pin || !spec->ext_mic.pin)
  1027. return;
  1028. if (snd_BUG_ON(!spec->adc_nids))
  1029. return;
  1030. if (spec->dual_adc_switch) {
  1031. alc_dual_mic_adc_auto_switch(codec);
  1032. return;
  1033. }
  1034. cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
  1035. present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
  1036. if (present) {
  1037. alive = &spec->ext_mic;
  1038. dead = &spec->int_mic;
  1039. } else {
  1040. alive = &spec->int_mic;
  1041. dead = &spec->ext_mic;
  1042. }
  1043. type = get_wcaps_type(get_wcaps(codec, cap_nid));
  1044. if (type == AC_WID_AUD_MIX) {
  1045. /* Matrix-mixer style (e.g. ALC882) */
  1046. snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
  1047. alive->mux_idx,
  1048. HDA_AMP_MUTE, 0);
  1049. snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
  1050. dead->mux_idx,
  1051. HDA_AMP_MUTE, HDA_AMP_MUTE);
  1052. } else {
  1053. /* MUX style (e.g. ALC880) */
  1054. snd_hda_codec_write_cache(codec, cap_nid, 0,
  1055. AC_VERB_SET_CONNECT_SEL,
  1056. alive->mux_idx);
  1057. }
  1058. snd_hda_input_jack_report(codec, spec->ext_mic.pin);
  1059. /* FIXME: analog mixer */
  1060. }
  1061. /* unsolicited event for HP jack sensing */
  1062. static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
  1063. {
  1064. if (codec->vendor_id == 0x10ec0880)
  1065. res >>= 28;
  1066. else
  1067. res >>= 26;
  1068. switch (res) {
  1069. case ALC880_HP_EVENT:
  1070. alc_automute_pin(codec);
  1071. break;
  1072. case ALC880_MIC_EVENT:
  1073. alc_mic_automute(codec);
  1074. break;
  1075. }
  1076. }
  1077. static void alc_inithook(struct hda_codec *codec)
  1078. {
  1079. alc_automute_pin(codec);
  1080. alc_mic_automute(codec);
  1081. }
  1082. /* additional initialization for ALC888 variants */
  1083. static void alc888_coef_init(struct hda_codec *codec)
  1084. {
  1085. unsigned int tmp;
  1086. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
  1087. tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
  1088. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
  1089. if ((tmp & 0xf0) == 0x20)
  1090. /* alc888S-VC */
  1091. snd_hda_codec_read(codec, 0x20, 0,
  1092. AC_VERB_SET_PROC_COEF, 0x830);
  1093. else
  1094. /* alc888-VB */
  1095. snd_hda_codec_read(codec, 0x20, 0,
  1096. AC_VERB_SET_PROC_COEF, 0x3030);
  1097. }
  1098. static void alc889_coef_init(struct hda_codec *codec)
  1099. {
  1100. unsigned int tmp;
  1101. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
  1102. tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
  1103. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
  1104. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
  1105. }
  1106. /* turn on/off EAPD control (only if available) */
  1107. static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
  1108. {
  1109. if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
  1110. return;
  1111. if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
  1112. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
  1113. on ? 2 : 0);
  1114. }
  1115. static void alc_auto_init_amp(struct hda_codec *codec, int type)
  1116. {
  1117. unsigned int tmp;
  1118. switch (type) {
  1119. case ALC_INIT_GPIO1:
  1120. snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
  1121. break;
  1122. case ALC_INIT_GPIO2:
  1123. snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
  1124. break;
  1125. case ALC_INIT_GPIO3:
  1126. snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
  1127. break;
  1128. case ALC_INIT_DEFAULT:
  1129. switch (codec->vendor_id) {
  1130. case 0x10ec0260:
  1131. set_eapd(codec, 0x0f, 1);
  1132. set_eapd(codec, 0x10, 1);
  1133. break;
  1134. case 0x10ec0262:
  1135. case 0x10ec0267:
  1136. case 0x10ec0268:
  1137. case 0x10ec0269:
  1138. case 0x10ec0270:
  1139. case 0x10ec0272:
  1140. case 0x10ec0660:
  1141. case 0x10ec0662:
  1142. case 0x10ec0663:
  1143. case 0x10ec0665:
  1144. case 0x10ec0862:
  1145. case 0x10ec0889:
  1146. set_eapd(codec, 0x14, 1);
  1147. set_eapd(codec, 0x15, 1);
  1148. break;
  1149. }
  1150. switch (codec->vendor_id) {
  1151. case 0x10ec0260:
  1152. snd_hda_codec_write(codec, 0x1a, 0,
  1153. AC_VERB_SET_COEF_INDEX, 7);
  1154. tmp = snd_hda_codec_read(codec, 0x1a, 0,
  1155. AC_VERB_GET_PROC_COEF, 0);
  1156. snd_hda_codec_write(codec, 0x1a, 0,
  1157. AC_VERB_SET_COEF_INDEX, 7);
  1158. snd_hda_codec_write(codec, 0x1a, 0,
  1159. AC_VERB_SET_PROC_COEF,
  1160. tmp | 0x2010);
  1161. break;
  1162. case 0x10ec0262:
  1163. case 0x10ec0880:
  1164. case 0x10ec0882:
  1165. case 0x10ec0883:
  1166. case 0x10ec0885:
  1167. case 0x10ec0887:
  1168. /*case 0x10ec0889:*/ /* this causes an SPDIF problem */
  1169. alc889_coef_init(codec);
  1170. break;
  1171. case 0x10ec0888:
  1172. alc888_coef_init(codec);
  1173. break;
  1174. #if 0 /* XXX: This may cause the silent output on speaker on some machines */
  1175. case 0x10ec0267:
  1176. case 0x10ec0268:
  1177. snd_hda_codec_write(codec, 0x20, 0,
  1178. AC_VERB_SET_COEF_INDEX, 7);
  1179. tmp = snd_hda_codec_read(codec, 0x20, 0,
  1180. AC_VERB_GET_PROC_COEF, 0);
  1181. snd_hda_codec_write(codec, 0x20, 0,
  1182. AC_VERB_SET_COEF_INDEX, 7);
  1183. snd_hda_codec_write(codec, 0x20, 0,
  1184. AC_VERB_SET_PROC_COEF,
  1185. tmp | 0x3000);
  1186. break;
  1187. #endif /* XXX */
  1188. }
  1189. break;
  1190. }
  1191. }
  1192. static void alc_init_auto_hp(struct hda_codec *codec)
  1193. {
  1194. struct alc_spec *spec = codec->spec;
  1195. struct auto_pin_cfg *cfg = &spec->autocfg;
  1196. int i;
  1197. if (!cfg->hp_pins[0]) {
  1198. if (cfg->line_out_type != AUTO_PIN_HP_OUT)
  1199. return;
  1200. }
  1201. if (!cfg->speaker_pins[0]) {
  1202. if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
  1203. return;
  1204. memcpy(cfg->speaker_pins, cfg->line_out_pins,
  1205. sizeof(cfg->speaker_pins));
  1206. cfg->speaker_outs = cfg->line_outs;
  1207. }
  1208. if (!cfg->hp_pins[0]) {
  1209. memcpy(cfg->hp_pins, cfg->line_out_pins,
  1210. sizeof(cfg->hp_pins));
  1211. cfg->hp_outs = cfg->line_outs;
  1212. }
  1213. for (i = 0; i < cfg->hp_outs; i++) {
  1214. snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
  1215. cfg->hp_pins[i]);
  1216. snd_hda_codec_write_cache(codec, cfg->hp_pins[i], 0,
  1217. AC_VERB_SET_UNSOLICITED_ENABLE,
  1218. AC_USRSP_EN | ALC880_HP_EVENT);
  1219. }
  1220. spec->unsol_event = alc_sku_unsol_event;
  1221. }
  1222. static void alc_init_auto_mic(struct hda_codec *codec)
  1223. {
  1224. struct alc_spec *spec = codec->spec;
  1225. struct auto_pin_cfg *cfg = &spec->autocfg;
  1226. hda_nid_t fixed, ext;
  1227. int i;
  1228. /* there must be only two mic inputs exclusively */
  1229. for (i = 0; i < cfg->num_inputs; i++)
  1230. if (cfg->inputs[i].type >= AUTO_PIN_LINE_IN)
  1231. return;
  1232. fixed = ext = 0;
  1233. for (i = 0; i < cfg->num_inputs; i++) {
  1234. hda_nid_t nid = cfg->inputs[i].pin;
  1235. unsigned int defcfg;
  1236. defcfg = snd_hda_codec_get_pincfg(codec, nid);
  1237. switch (snd_hda_get_input_pin_attr(defcfg)) {
  1238. case INPUT_PIN_ATTR_INT:
  1239. if (fixed)
  1240. return; /* already occupied */
  1241. fixed = nid;
  1242. break;
  1243. case INPUT_PIN_ATTR_UNUSED:
  1244. return; /* invalid entry */
  1245. default:
  1246. if (ext)
  1247. return; /* already occupied */
  1248. ext = nid;
  1249. break;
  1250. }
  1251. }
  1252. if (!ext || !fixed)
  1253. return;
  1254. if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
  1255. return; /* no unsol support */
  1256. snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
  1257. ext, fixed);
  1258. spec->ext_mic.pin = ext;
  1259. spec->int_mic.pin = fixed;
  1260. spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
  1261. spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
  1262. spec->auto_mic = 1;
  1263. snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
  1264. AC_VERB_SET_UNSOLICITED_ENABLE,
  1265. AC_USRSP_EN | ALC880_MIC_EVENT);
  1266. spec->unsol_event = alc_sku_unsol_event;
  1267. }
  1268. /* Could be any non-zero and even value. When used as fixup, tells
  1269. * the driver to ignore any present sku defines.
  1270. */
  1271. #define ALC_FIXUP_SKU_IGNORE (2)
  1272. static int alc_auto_parse_customize_define(struct hda_codec *codec)
  1273. {
  1274. unsigned int ass, tmp, i;
  1275. unsigned nid = 0;
  1276. struct alc_spec *spec = codec->spec;
  1277. spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
  1278. if (spec->cdefine.fixup) {
  1279. ass = spec->cdefine.sku_cfg;
  1280. if (ass == ALC_FIXUP_SKU_IGNORE)
  1281. return -1;
  1282. goto do_sku;
  1283. }
  1284. ass = codec->subsystem_id & 0xffff;
  1285. if (ass != codec->bus->pci->subsystem_device && (ass & 1))
  1286. goto do_sku;
  1287. nid = 0x1d;
  1288. if (codec->vendor_id == 0x10ec0260)
  1289. nid = 0x17;
  1290. ass = snd_hda_codec_get_pincfg(codec, nid);
  1291. if (!(ass & 1)) {
  1292. printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
  1293. codec->chip_name, ass);
  1294. return -1;
  1295. }
  1296. /* check sum */
  1297. tmp = 0;
  1298. for (i = 1; i < 16; i++) {
  1299. if ((ass >> i) & 1)
  1300. tmp++;
  1301. }
  1302. if (((ass >> 16) & 0xf) != tmp)
  1303. return -1;
  1304. spec->cdefine.port_connectivity = ass >> 30;
  1305. spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
  1306. spec->cdefine.check_sum = (ass >> 16) & 0xf;
  1307. spec->cdefine.customization = ass >> 8;
  1308. do_sku:
  1309. spec->cdefine.sku_cfg = ass;
  1310. spec->cdefine.external_amp = (ass & 0x38) >> 3;
  1311. spec->cdefine.platform_type = (ass & 0x4) >> 2;
  1312. spec->cdefine.swap = (ass & 0x2) >> 1;
  1313. spec->cdefine.override = ass & 0x1;
  1314. snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
  1315. nid, spec->cdefine.sku_cfg);
  1316. snd_printd("SKU: port_connectivity=0x%x\n",
  1317. spec->cdefine.port_connectivity);
  1318. snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
  1319. snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
  1320. snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
  1321. snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
  1322. snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
  1323. snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
  1324. snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
  1325. return 0;
  1326. }
  1327. /* check subsystem ID and set up device-specific initialization;
  1328. * return 1 if initialized, 0 if invalid SSID
  1329. */
  1330. /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
  1331. * 31 ~ 16 : Manufacture ID
  1332. * 15 ~ 8 : SKU ID
  1333. * 7 ~ 0 : Assembly ID
  1334. * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
  1335. */
  1336. static int alc_subsystem_id(struct hda_codec *codec,
  1337. hda_nid_t porta, hda_nid_t porte,
  1338. hda_nid_t portd, hda_nid_t porti)
  1339. {
  1340. unsigned int ass, tmp, i;
  1341. unsigned nid;
  1342. struct alc_spec *spec = codec->spec;
  1343. if (spec->cdefine.fixup) {
  1344. ass = spec->cdefine.sku_cfg;
  1345. if (ass == ALC_FIXUP_SKU_IGNORE)
  1346. return 0;
  1347. goto do_sku;
  1348. }
  1349. ass = codec->subsystem_id & 0xffff;
  1350. if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
  1351. goto do_sku;
  1352. /* invalid SSID, check the special NID pin defcfg instead */
  1353. /*
  1354. * 31~30 : port connectivity
  1355. * 29~21 : reserve
  1356. * 20 : PCBEEP input
  1357. * 19~16 : Check sum (15:1)
  1358. * 15~1 : Custom
  1359. * 0 : override
  1360. */
  1361. nid = 0x1d;
  1362. if (codec->vendor_id == 0x10ec0260)
  1363. nid = 0x17;
  1364. ass = snd_hda_codec_get_pincfg(codec, nid);
  1365. snd_printd("realtek: No valid SSID, "
  1366. "checking pincfg 0x%08x for NID 0x%x\n",
  1367. ass, nid);
  1368. if (!(ass & 1))
  1369. return 0;
  1370. if ((ass >> 30) != 1) /* no physical connection */
  1371. return 0;
  1372. /* check sum */
  1373. tmp = 0;
  1374. for (i = 1; i < 16; i++) {
  1375. if ((ass >> i) & 1)
  1376. tmp++;
  1377. }
  1378. if (((ass >> 16) & 0xf) != tmp)
  1379. return 0;
  1380. do_sku:
  1381. snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
  1382. ass & 0xffff, codec->vendor_id);
  1383. /*
  1384. * 0 : override
  1385. * 1 : Swap Jack
  1386. * 2 : 0 --> Desktop, 1 --> Laptop
  1387. * 3~5 : External Amplifier control
  1388. * 7~6 : Reserved
  1389. */
  1390. tmp = (ass & 0x38) >> 3; /* external Amp control */
  1391. switch (tmp) {
  1392. case 1:
  1393. spec->init_amp = ALC_INIT_GPIO1;
  1394. break;
  1395. case 3:
  1396. spec->init_amp = ALC_INIT_GPIO2;
  1397. break;
  1398. case 7:
  1399. spec->init_amp = ALC_INIT_GPIO3;
  1400. break;
  1401. case 5:
  1402. default:
  1403. spec->init_amp = ALC_INIT_DEFAULT;
  1404. break;
  1405. }
  1406. /* is laptop or Desktop and enable the function "Mute internal speaker
  1407. * when the external headphone out jack is plugged"
  1408. */
  1409. if (!(ass & 0x8000))
  1410. return 1;
  1411. /*
  1412. * 10~8 : Jack location
  1413. * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
  1414. * 14~13: Resvered
  1415. * 15 : 1 --> enable the function "Mute internal speaker
  1416. * when the external headphone out jack is plugged"
  1417. */
  1418. if (!spec->autocfg.hp_pins[0]) {
  1419. hda_nid_t nid;
  1420. tmp = (ass >> 11) & 0x3; /* HP to chassis */
  1421. if (tmp == 0)
  1422. nid = porta;
  1423. else if (tmp == 1)
  1424. nid = porte;
  1425. else if (tmp == 2)
  1426. nid = portd;
  1427. else if (tmp == 3)
  1428. nid = porti;
  1429. else
  1430. return 1;
  1431. for (i = 0; i < spec->autocfg.line_outs; i++)
  1432. if (spec->autocfg.line_out_pins[i] == nid)
  1433. return 1;
  1434. spec->autocfg.hp_pins[0] = nid;
  1435. }
  1436. alc_init_auto_hp(codec);
  1437. alc_init_auto_mic(codec);
  1438. return 1;
  1439. }
  1440. static void alc_ssid_check(struct hda_codec *codec,
  1441. hda_nid_t porta, hda_nid_t porte,
  1442. hda_nid_t portd, hda_nid_t porti)
  1443. {
  1444. if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
  1445. struct alc_spec *spec = codec->spec;
  1446. snd_printd("realtek: "
  1447. "Enable default setup for auto mode as fallback\n");
  1448. spec->init_amp = ALC_INIT_DEFAULT;
  1449. alc_init_auto_hp(codec);
  1450. alc_init_auto_mic(codec);
  1451. }
  1452. }
  1453. /*
  1454. * Fix-up pin default configurations and add default verbs
  1455. */
  1456. struct alc_pincfg {
  1457. hda_nid_t nid;
  1458. u32 val;
  1459. };
  1460. struct alc_model_fixup {
  1461. const int id;
  1462. const char *name;
  1463. };
  1464. struct alc_fixup {
  1465. int type;
  1466. bool chained;
  1467. int chain_id;
  1468. union {
  1469. unsigned int sku;
  1470. const struct alc_pincfg *pins;
  1471. const struct hda_verb *verbs;
  1472. void (*func)(struct hda_codec *codec,
  1473. const struct alc_fixup *fix,
  1474. int action);
  1475. } v;
  1476. };
  1477. enum {
  1478. ALC_FIXUP_INVALID,
  1479. ALC_FIXUP_SKU,
  1480. ALC_FIXUP_PINS,
  1481. ALC_FIXUP_VERBS,
  1482. ALC_FIXUP_FUNC,
  1483. };
  1484. enum {
  1485. ALC_FIXUP_ACT_PRE_PROBE,
  1486. ALC_FIXUP_ACT_PROBE,
  1487. ALC_FIXUP_ACT_INIT,
  1488. };
  1489. static void alc_apply_fixup(struct hda_codec *codec, int action)
  1490. {
  1491. struct alc_spec *spec = codec->spec;
  1492. int id = spec->fixup_id;
  1493. #ifdef CONFIG_SND_DEBUG_VERBOSE
  1494. const char *modelname = spec->fixup_name;
  1495. #endif
  1496. int depth = 0;
  1497. if (!spec->fixup_list)
  1498. return;
  1499. while (id >= 0) {
  1500. const struct alc_fixup *fix = spec->fixup_list + id;
  1501. const struct alc_pincfg *cfg;
  1502. switch (fix->type) {
  1503. case ALC_FIXUP_SKU:
  1504. if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku)
  1505. break;;
  1506. snd_printdd(KERN_INFO "hda_codec: %s: "
  1507. "Apply sku override for %s\n",
  1508. codec->chip_name, modelname);
  1509. spec->cdefine.sku_cfg = fix->v.sku;
  1510. spec->cdefine.fixup = 1;
  1511. break;
  1512. case ALC_FIXUP_PINS:
  1513. cfg = fix->v.pins;
  1514. if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg)
  1515. break;
  1516. snd_printdd(KERN_INFO "hda_codec: %s: "
  1517. "Apply pincfg for %s\n",
  1518. codec->chip_name, modelname);
  1519. for (; cfg->nid; cfg++)
  1520. snd_hda_codec_set_pincfg(codec, cfg->nid,
  1521. cfg->val);
  1522. break;
  1523. case ALC_FIXUP_VERBS:
  1524. if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
  1525. break;
  1526. snd_printdd(KERN_INFO "hda_codec: %s: "
  1527. "Apply fix-verbs for %s\n",
  1528. codec->chip_name, modelname);
  1529. add_verb(codec->spec, fix->v.verbs);
  1530. break;
  1531. case ALC_FIXUP_FUNC:
  1532. if (!fix->v.func)
  1533. break;
  1534. snd_printdd(KERN_INFO "hda_codec: %s: "
  1535. "Apply fix-func for %s\n",
  1536. codec->chip_name, modelname);
  1537. fix->v.func(codec, fix, action);
  1538. break;
  1539. default:
  1540. snd_printk(KERN_ERR "hda_codec: %s: "
  1541. "Invalid fixup type %d\n",
  1542. codec->chip_name, fix->type);
  1543. break;
  1544. }
  1545. if (!fix[id].chained)
  1546. break;
  1547. if (++depth > 10)
  1548. break;
  1549. id = fix[id].chain_id;
  1550. }
  1551. }
  1552. static void alc_pick_fixup(struct hda_codec *codec,
  1553. const struct alc_model_fixup *models,
  1554. const struct snd_pci_quirk *quirk,
  1555. const struct alc_fixup *fixlist)
  1556. {
  1557. struct alc_spec *spec = codec->spec;
  1558. int id = -1;
  1559. const char *name = NULL;
  1560. if (codec->modelname && models) {
  1561. while (models->name) {
  1562. if (!strcmp(codec->modelname, models->name)) {
  1563. id = models->id;
  1564. name = models->name;
  1565. break;
  1566. }
  1567. models++;
  1568. }
  1569. }
  1570. if (id < 0) {
  1571. quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
  1572. if (quirk) {
  1573. id = quirk->value;
  1574. #ifdef CONFIG_SND_DEBUG_VERBOSE
  1575. name = quirk->name;
  1576. #endif
  1577. }
  1578. }
  1579. spec->fixup_id = id;
  1580. if (id >= 0) {
  1581. spec->fixup_list = fixlist;
  1582. spec->fixup_name = name;
  1583. }
  1584. }
  1585. static int alc_read_coef_idx(struct hda_codec *codec,
  1586. unsigned int coef_idx)
  1587. {
  1588. unsigned int val;
  1589. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
  1590. coef_idx);
  1591. val = snd_hda_codec_read(codec, 0x20, 0,
  1592. AC_VERB_GET_PROC_COEF, 0);
  1593. return val;
  1594. }
  1595. static void alc_write_coef_idx(struct hda_codec *codec, unsigned int coef_idx,
  1596. unsigned int coef_val)
  1597. {
  1598. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
  1599. coef_idx);
  1600. snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF,
  1601. coef_val);
  1602. }
  1603. /* set right pin controls for digital I/O */
  1604. static void alc_auto_init_digital(struct hda_codec *codec)
  1605. {
  1606. struct alc_spec *spec = codec->spec;
  1607. int i;
  1608. hda_nid_t pin;
  1609. for (i = 0; i < spec->autocfg.dig_outs; i++) {
  1610. pin = spec->autocfg.dig_out_pins[i];
  1611. if (pin) {
  1612. snd_hda_codec_write(codec, pin, 0,
  1613. AC_VERB_SET_PIN_WIDGET_CONTROL,
  1614. PIN_OUT);
  1615. }
  1616. }
  1617. pin = spec->autocfg.dig_in_pin;
  1618. if (pin)
  1619. snd_hda_codec_write(codec, pin, 0,
  1620. AC_VERB_SET_PIN_WIDGET_CONTROL,
  1621. PIN_IN);
  1622. }
  1623. /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
  1624. static void alc_auto_parse_digital(struct hda_codec *codec)
  1625. {
  1626. struct alc_spec *spec = codec->spec;
  1627. int i, err;
  1628. hda_nid_t dig_nid;
  1629. /* support multiple SPDIFs; the secondary is set up as a slave */
  1630. for (i = 0; i < spec->autocfg.dig_outs; i++) {
  1631. err = snd_hda_get_connections(codec,
  1632. spec->autocfg.dig_out_pins[i],
  1633. &dig_nid, 1);
  1634. if (err < 0)
  1635. continue;
  1636. if (!i) {
  1637. spec->multiout.dig_out_nid = dig_nid;
  1638. spec->dig_out_type = spec->autocfg.dig_out_type[0];
  1639. } else {
  1640. spec->multiout.slave_dig_outs = spec->slave_dig_outs;
  1641. if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
  1642. break;
  1643. spec->slave_dig_outs[i - 1] = dig_nid;
  1644. }
  1645. }
  1646. if (spec->autocfg.dig_in_pin) {
  1647. dig_nid = codec->start_nid;
  1648. for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
  1649. unsigned int wcaps = get_wcaps(codec, dig_nid);
  1650. if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
  1651. continue;
  1652. if (!(wcaps & AC_WCAP_DIGITAL))
  1653. continue;
  1654. if (!(wcaps & AC_WCAP_CONN_LIST))
  1655. continue;
  1656. err = get_connection_index(codec, dig_nid,
  1657. spec->autocfg.dig_in_pin);
  1658. if (err >= 0) {
  1659. spec->dig_in_nid = dig_nid;
  1660. break;
  1661. }
  1662. }
  1663. }
  1664. }
  1665. /*
  1666. * ALC888
  1667. */
  1668. /*
  1669. * 2ch mode
  1670. */
  1671. static struct hda_verb alc888_4ST_ch2_intel_init[] = {
  1672. /* Mic-in jack as mic in */
  1673. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  1674. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1675. /* Line-in jack as Line in */
  1676. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  1677. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1678. /* Line-Out as Front */
  1679. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
  1680. { } /* end */
  1681. };
  1682. /*
  1683. * 4ch mode
  1684. */
  1685. static struct hda_verb alc888_4ST_ch4_intel_init[] = {
  1686. /* Mic-in jack as mic in */
  1687. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  1688. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  1689. /* Line-in jack as Surround */
  1690. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1691. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1692. /* Line-Out as Front */
  1693. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
  1694. { } /* end */
  1695. };
  1696. /*
  1697. * 6ch mode
  1698. */
  1699. static struct hda_verb alc888_4ST_ch6_intel_init[] = {
  1700. /* Mic-in jack as CLFE */
  1701. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1702. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1703. /* Line-in jack as Surround */
  1704. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1705. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1706. /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
  1707. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  1708. { } /* end */
  1709. };
  1710. /*
  1711. * 8ch mode
  1712. */
  1713. static struct hda_verb alc888_4ST_ch8_intel_init[] = {
  1714. /* Mic-in jack as CLFE */
  1715. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1716. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1717. /* Line-in jack as Surround */
  1718. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  1719. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  1720. /* Line-Out as Side */
  1721. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  1722. { } /* end */
  1723. };
  1724. static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
  1725. { 2, alc888_4ST_ch2_intel_init },
  1726. { 4, alc888_4ST_ch4_intel_init },
  1727. { 6, alc888_4ST_ch6_intel_init },
  1728. { 8, alc888_4ST_ch8_intel_init },
  1729. };
  1730. /*
  1731. * ALC888 Fujitsu Siemens Amillo xa3530
  1732. */
  1733. static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
  1734. /* Front Mic: set to PIN_IN (empty by default) */
  1735. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  1736. /* Connect Internal HP to Front */
  1737. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1738. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1739. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  1740. /* Connect Bass HP to Front */
  1741. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1742. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1743. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  1744. /* Connect Line-Out side jack (SPDIF) to Side */
  1745. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1746. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1747. {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  1748. /* Connect Mic jack to CLFE */
  1749. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1750. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1751. {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
  1752. /* Connect Line-in jack to Surround */
  1753. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1754. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1755. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
  1756. /* Connect HP out jack to Front */
  1757. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1758. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1759. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  1760. /* Enable unsolicited event for HP jack and Line-out jack */
  1761. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  1762. {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  1763. {}
  1764. };
  1765. static void alc_automute_amp(struct hda_codec *codec)
  1766. {
  1767. alc_automute_speaker(codec, 0);
  1768. }
  1769. static void alc_automute_amp_unsol_event(struct hda_codec *codec,
  1770. unsigned int res)
  1771. {
  1772. if (codec->vendor_id == 0x10ec0880)
  1773. res >>= 28;
  1774. else
  1775. res >>= 26;
  1776. if (res == ALC880_HP_EVENT)
  1777. alc_automute_amp(codec);
  1778. }
  1779. static void alc889_automute_setup(struct hda_codec *codec)
  1780. {
  1781. struct alc_spec *spec = codec->spec;
  1782. spec->autocfg.hp_pins[0] = 0x15;
  1783. spec->autocfg.speaker_pins[0] = 0x14;
  1784. spec->autocfg.speaker_pins[1] = 0x16;
  1785. spec->autocfg.speaker_pins[2] = 0x17;
  1786. spec->autocfg.speaker_pins[3] = 0x19;
  1787. spec->autocfg.speaker_pins[4] = 0x1a;
  1788. }
  1789. static void alc889_intel_init_hook(struct hda_codec *codec)
  1790. {
  1791. alc889_coef_init(codec);
  1792. alc_automute_amp(codec);
  1793. }
  1794. static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
  1795. {
  1796. struct alc_spec *spec = codec->spec;
  1797. spec->autocfg.hp_pins[0] = 0x17; /* line-out */
  1798. spec->autocfg.hp_pins[1] = 0x1b; /* hp */
  1799. spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
  1800. spec->autocfg.speaker_pins[1] = 0x15; /* bass */
  1801. }
  1802. /*
  1803. * ALC888 Acer Aspire 4930G model
  1804. */
  1805. static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
  1806. /* Front Mic: set to PIN_IN (empty by default) */
  1807. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  1808. /* Unselect Front Mic by default in input mixer 3 */
  1809. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  1810. /* Enable unsolicited event for HP jack */
  1811. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  1812. /* Connect Internal HP to front */
  1813. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1814. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1815. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  1816. /* Connect HP out to front */
  1817. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1818. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1819. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  1820. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  1821. { }
  1822. };
  1823. /*
  1824. * ALC888 Acer Aspire 6530G model
  1825. */
  1826. static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
  1827. /* Route to built-in subwoofer as well as speakers */
  1828. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  1829. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  1830. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  1831. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  1832. /* Bias voltage on for external mic port */
  1833. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
  1834. /* Front Mic: set to PIN_IN (empty by default) */
  1835. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  1836. /* Unselect Front Mic by default in input mixer 3 */
  1837. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  1838. /* Enable unsolicited event for HP jack */
  1839. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  1840. /* Enable speaker output */
  1841. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1842. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1843. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  1844. /* Enable headphone output */
  1845. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
  1846. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1847. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  1848. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  1849. { }
  1850. };
  1851. /*
  1852. *ALC888 Acer Aspire 7730G model
  1853. */
  1854. static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
  1855. /* Bias voltage on for external mic port */
  1856. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
  1857. /* Front Mic: set to PIN_IN (empty by default) */
  1858. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  1859. /* Unselect Front Mic by default in input mixer 3 */
  1860. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  1861. /* Enable unsolicited event for HP jack */
  1862. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  1863. /* Enable speaker output */
  1864. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1865. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1866. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  1867. /* Enable headphone output */
  1868. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
  1869. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1870. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  1871. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  1872. /*Enable internal subwoofer */
  1873. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1874. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1875. {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
  1876. {0x17, AC_VERB_SET_EAPD_BTLENABLE, 2},
  1877. { }
  1878. };
  1879. /*
  1880. * ALC889 Acer Aspire 8930G model
  1881. */
  1882. static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
  1883. /* Front Mic: set to PIN_IN (empty by default) */
  1884. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  1885. /* Unselect Front Mic by default in input mixer 3 */
  1886. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
  1887. /* Enable unsolicited event for HP jack */
  1888. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  1889. /* Connect Internal Front to Front */
  1890. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1891. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1892. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  1893. /* Connect Internal Rear to Rear */
  1894. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1895. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1896. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
  1897. /* Connect Internal CLFE to CLFE */
  1898. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  1899. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1900. {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
  1901. /* Connect HP out to Front */
  1902. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
  1903. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  1904. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  1905. /* Enable all DACs */
  1906. /* DAC DISABLE/MUTE 1? */
  1907. /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
  1908. {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
  1909. {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
  1910. /* DAC DISABLE/MUTE 2? */
  1911. /* some bit here disables the other DACs. Init=0x4900 */
  1912. {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
  1913. {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
  1914. /* DMIC fix
  1915. * This laptop has a stereo digital microphone. The mics are only 1cm apart
  1916. * which makes the stereo useless. However, either the mic or the ALC889
  1917. * makes the signal become a difference/sum signal instead of standard
  1918. * stereo, which is annoying. So instead we flip this bit which makes the
  1919. * codec replicate the sum signal to both channels, turning it into a
  1920. * normal mono mic.
  1921. */
  1922. /* DMIC_CONTROL? Init value = 0x0001 */
  1923. {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
  1924. {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
  1925. { }
  1926. };
  1927. static struct hda_input_mux alc888_2_capture_sources[2] = {
  1928. /* Front mic only available on one ADC */
  1929. {
  1930. .num_items = 4,
  1931. .items = {
  1932. { "Mic", 0x0 },
  1933. { "Line", 0x2 },
  1934. { "CD", 0x4 },
  1935. { "Front Mic", 0xb },
  1936. },
  1937. },
  1938. {
  1939. .num_items = 3,
  1940. .items = {
  1941. { "Mic", 0x0 },
  1942. { "Line", 0x2 },
  1943. { "CD", 0x4 },
  1944. },
  1945. }
  1946. };
  1947. static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
  1948. /* Interal mic only available on one ADC */
  1949. {
  1950. .num_items = 5,
  1951. .items = {
  1952. { "Mic", 0x0 },
  1953. { "Line In", 0x2 },
  1954. { "CD", 0x4 },
  1955. { "Input Mix", 0xa },
  1956. { "Internal Mic", 0xb },
  1957. },
  1958. },
  1959. {
  1960. .num_items = 4,
  1961. .items = {
  1962. { "Mic", 0x0 },
  1963. { "Line In", 0x2 },
  1964. { "CD", 0x4 },
  1965. { "Input Mix", 0xa },
  1966. },
  1967. }
  1968. };
  1969. static struct hda_input_mux alc889_capture_sources[3] = {
  1970. /* Digital mic only available on first "ADC" */
  1971. {
  1972. .num_items = 5,
  1973. .items = {
  1974. { "Mic", 0x0 },
  1975. { "Line", 0x2 },
  1976. { "CD", 0x4 },
  1977. { "Front Mic", 0xb },
  1978. { "Input Mix", 0xa },
  1979. },
  1980. },
  1981. {
  1982. .num_items = 4,
  1983. .items = {
  1984. { "Mic", 0x0 },
  1985. { "Line", 0x2 },
  1986. { "CD", 0x4 },
  1987. { "Input Mix", 0xa },
  1988. },
  1989. },
  1990. {
  1991. .num_items = 4,
  1992. .items = {
  1993. { "Mic", 0x0 },
  1994. { "Line", 0x2 },
  1995. { "CD", 0x4 },
  1996. { "Input Mix", 0xa },
  1997. },
  1998. }
  1999. };
  2000. static struct snd_kcontrol_new alc888_base_mixer[] = {
  2001. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2002. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2003. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2004. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  2005. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  2006. HDA_OUTPUT),
  2007. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2008. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2009. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2010. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  2011. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  2012. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2013. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2014. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2015. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2016. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2017. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  2018. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2019. { } /* end */
  2020. };
  2021. static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
  2022. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2023. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2024. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2025. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  2026. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  2027. HDA_OUTPUT),
  2028. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2029. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2030. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2031. HDA_CODEC_VOLUME_MONO("Internal LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT),
  2032. HDA_BIND_MUTE_MONO("Internal LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT),
  2033. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2034. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2035. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2036. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2037. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2038. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  2039. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2040. { } /* end */
  2041. };
  2042. static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
  2043. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2044. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2045. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2046. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  2047. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  2048. HDA_OUTPUT),
  2049. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2050. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2051. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2052. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2053. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2054. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2055. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  2056. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2057. { } /* end */
  2058. };
  2059. static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
  2060. {
  2061. struct alc_spec *spec = codec->spec;
  2062. spec->autocfg.hp_pins[0] = 0x15;
  2063. spec->autocfg.speaker_pins[0] = 0x14;
  2064. spec->autocfg.speaker_pins[1] = 0x16;
  2065. spec->autocfg.speaker_pins[2] = 0x17;
  2066. }
  2067. static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
  2068. {
  2069. struct alc_spec *spec = codec->spec;
  2070. spec->autocfg.hp_pins[0] = 0x15;
  2071. spec->autocfg.speaker_pins[0] = 0x14;
  2072. spec->autocfg.speaker_pins[1] = 0x16;
  2073. spec->autocfg.speaker_pins[2] = 0x17;
  2074. }
  2075. static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec)
  2076. {
  2077. struct alc_spec *spec = codec->spec;
  2078. spec->autocfg.hp_pins[0] = 0x15;
  2079. spec->autocfg.speaker_pins[0] = 0x14;
  2080. spec->autocfg.speaker_pins[1] = 0x16;
  2081. spec->autocfg.speaker_pins[2] = 0x17;
  2082. }
  2083. static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
  2084. {
  2085. struct alc_spec *spec = codec->spec;
  2086. spec->autocfg.hp_pins[0] = 0x15;
  2087. spec->autocfg.speaker_pins[0] = 0x14;
  2088. spec->autocfg.speaker_pins[1] = 0x16;
  2089. spec->autocfg.speaker_pins[2] = 0x1b;
  2090. }
  2091. /*
  2092. * ALC880 3-stack model
  2093. *
  2094. * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
  2095. * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
  2096. * F-Mic = 0x1b, HP = 0x19
  2097. */
  2098. static hda_nid_t alc880_dac_nids[4] = {
  2099. /* front, rear, clfe, rear_surr */
  2100. 0x02, 0x05, 0x04, 0x03
  2101. };
  2102. static hda_nid_t alc880_adc_nids[3] = {
  2103. /* ADC0-2 */
  2104. 0x07, 0x08, 0x09,
  2105. };
  2106. /* The datasheet says the node 0x07 is connected from inputs,
  2107. * but it shows zero connection in the real implementation on some devices.
  2108. * Note: this is a 915GAV bug, fixed on 915GLV
  2109. */
  2110. static hda_nid_t alc880_adc_nids_alt[2] = {
  2111. /* ADC1-2 */
  2112. 0x08, 0x09,
  2113. };
  2114. #define ALC880_DIGOUT_NID 0x06
  2115. #define ALC880_DIGIN_NID 0x0a
  2116. static struct hda_input_mux alc880_capture_source = {
  2117. .num_items = 4,
  2118. .items = {
  2119. { "Mic", 0x0 },
  2120. { "Front Mic", 0x3 },
  2121. { "Line", 0x2 },
  2122. { "CD", 0x4 },
  2123. },
  2124. };
  2125. /* channel source setting (2/6 channel selection for 3-stack) */
  2126. /* 2ch mode */
  2127. static struct hda_verb alc880_threestack_ch2_init[] = {
  2128. /* set line-in to input, mute it */
  2129. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  2130. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  2131. /* set mic-in to input vref 80%, mute it */
  2132. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  2133. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  2134. { } /* end */
  2135. };
  2136. /* 6ch mode */
  2137. static struct hda_verb alc880_threestack_ch6_init[] = {
  2138. /* set line-in to output, unmute it */
  2139. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  2140. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  2141. /* set mic-in to output, unmute it */
  2142. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  2143. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  2144. { } /* end */
  2145. };
  2146. static struct hda_channel_mode alc880_threestack_modes[2] = {
  2147. { 2, alc880_threestack_ch2_init },
  2148. { 6, alc880_threestack_ch6_init },
  2149. };
  2150. static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
  2151. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2152. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2153. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  2154. HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
  2155. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  2156. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2157. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2158. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2159. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2160. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2161. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2162. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2163. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2164. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2165. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
  2166. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
  2167. HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
  2168. {
  2169. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  2170. .name = "Channel Mode",
  2171. .info = alc_ch_mode_info,
  2172. .get = alc_ch_mode_get,
  2173. .put = alc_ch_mode_put,
  2174. },
  2175. { } /* end */
  2176. };
  2177. /* capture mixer elements */
  2178. static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
  2179. struct snd_ctl_elem_info *uinfo)
  2180. {
  2181. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  2182. struct alc_spec *spec = codec->spec;
  2183. int err;
  2184. mutex_lock(&codec->control_mutex);
  2185. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
  2186. HDA_INPUT);
  2187. err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
  2188. mutex_unlock(&codec->control_mutex);
  2189. return err;
  2190. }
  2191. static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
  2192. unsigned int size, unsigned int __user *tlv)
  2193. {
  2194. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  2195. struct alc_spec *spec = codec->spec;
  2196. int err;
  2197. mutex_lock(&codec->control_mutex);
  2198. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
  2199. HDA_INPUT);
  2200. err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
  2201. mutex_unlock(&codec->control_mutex);
  2202. return err;
  2203. }
  2204. typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
  2205. struct snd_ctl_elem_value *ucontrol);
  2206. static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
  2207. struct snd_ctl_elem_value *ucontrol,
  2208. getput_call_t func)
  2209. {
  2210. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  2211. struct alc_spec *spec = codec->spec;
  2212. unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  2213. int err;
  2214. mutex_lock(&codec->control_mutex);
  2215. kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
  2216. 3, 0, HDA_INPUT);
  2217. err = func(kcontrol, ucontrol);
  2218. mutex_unlock(&codec->control_mutex);
  2219. return err;
  2220. }
  2221. static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
  2222. struct snd_ctl_elem_value *ucontrol)
  2223. {
  2224. return alc_cap_getput_caller(kcontrol, ucontrol,
  2225. snd_hda_mixer_amp_volume_get);
  2226. }
  2227. static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
  2228. struct snd_ctl_elem_value *ucontrol)
  2229. {
  2230. return alc_cap_getput_caller(kcontrol, ucontrol,
  2231. snd_hda_mixer_amp_volume_put);
  2232. }
  2233. /* capture mixer elements */
  2234. #define alc_cap_sw_info snd_ctl_boolean_stereo_info
  2235. static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
  2236. struct snd_ctl_elem_value *ucontrol)
  2237. {
  2238. return alc_cap_getput_caller(kcontrol, ucontrol,
  2239. snd_hda_mixer_amp_switch_get);
  2240. }
  2241. static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
  2242. struct snd_ctl_elem_value *ucontrol)
  2243. {
  2244. return alc_cap_getput_caller(kcontrol, ucontrol,
  2245. snd_hda_mixer_amp_switch_put);
  2246. }
  2247. #define _DEFINE_CAPMIX(num) \
  2248. { \
  2249. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  2250. .name = "Capture Switch", \
  2251. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
  2252. .count = num, \
  2253. .info = alc_cap_sw_info, \
  2254. .get = alc_cap_sw_get, \
  2255. .put = alc_cap_sw_put, \
  2256. }, \
  2257. { \
  2258. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  2259. .name = "Capture Volume", \
  2260. .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
  2261. SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
  2262. SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
  2263. .count = num, \
  2264. .info = alc_cap_vol_info, \
  2265. .get = alc_cap_vol_get, \
  2266. .put = alc_cap_vol_put, \
  2267. .tlv = { .c = alc_cap_vol_tlv }, \
  2268. }
  2269. #define _DEFINE_CAPSRC(num) \
  2270. { \
  2271. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  2272. /* .name = "Capture Source", */ \
  2273. .name = "Input Source", \
  2274. .count = num, \
  2275. .info = alc_mux_enum_info, \
  2276. .get = alc_mux_enum_get, \
  2277. .put = alc_mux_enum_put, \
  2278. }
  2279. #define DEFINE_CAPMIX(num) \
  2280. static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
  2281. _DEFINE_CAPMIX(num), \
  2282. _DEFINE_CAPSRC(num), \
  2283. { } /* end */ \
  2284. }
  2285. #define DEFINE_CAPMIX_NOSRC(num) \
  2286. static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
  2287. _DEFINE_CAPMIX(num), \
  2288. { } /* end */ \
  2289. }
  2290. /* up to three ADCs */
  2291. DEFINE_CAPMIX(1);
  2292. DEFINE_CAPMIX(2);
  2293. DEFINE_CAPMIX(3);
  2294. DEFINE_CAPMIX_NOSRC(1);
  2295. DEFINE_CAPMIX_NOSRC(2);
  2296. DEFINE_CAPMIX_NOSRC(3);
  2297. /*
  2298. * ALC880 5-stack model
  2299. *
  2300. * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
  2301. * Side = 0x02 (0xd)
  2302. * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
  2303. * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
  2304. */
  2305. /* additional mixers to alc880_three_stack_mixer */
  2306. static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
  2307. HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2308. HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
  2309. { } /* end */
  2310. };
  2311. /* channel source setting (6/8 channel selection for 5-stack) */
  2312. /* 6ch mode */
  2313. static struct hda_verb alc880_fivestack_ch6_init[] = {
  2314. /* set line-in to input, mute it */
  2315. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  2316. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  2317. { } /* end */
  2318. };
  2319. /* 8ch mode */
  2320. static struct hda_verb alc880_fivestack_ch8_init[] = {
  2321. /* set line-in to output, unmute it */
  2322. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  2323. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  2324. { } /* end */
  2325. };
  2326. static struct hda_channel_mode alc880_fivestack_modes[2] = {
  2327. { 6, alc880_fivestack_ch6_init },
  2328. { 8, alc880_fivestack_ch8_init },
  2329. };
  2330. /*
  2331. * ALC880 6-stack model
  2332. *
  2333. * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
  2334. * Side = 0x05 (0x0f)
  2335. * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
  2336. * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
  2337. */
  2338. static hda_nid_t alc880_6st_dac_nids[4] = {
  2339. /* front, rear, clfe, rear_surr */
  2340. 0x02, 0x03, 0x04, 0x05
  2341. };
  2342. static struct hda_input_mux alc880_6stack_capture_source = {
  2343. .num_items = 4,
  2344. .items = {
  2345. { "Mic", 0x0 },
  2346. { "Front Mic", 0x1 },
  2347. { "Line", 0x2 },
  2348. { "CD", 0x4 },
  2349. },
  2350. };
  2351. /* fixed 8-channels */
  2352. static struct hda_channel_mode alc880_sixstack_modes[1] = {
  2353. { 8, NULL },
  2354. };
  2355. static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
  2356. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2357. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2358. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2359. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  2360. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  2361. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2362. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2363. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2364. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  2365. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  2366. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2367. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2368. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2369. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2370. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2371. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2372. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  2373. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  2374. {
  2375. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  2376. .name = "Channel Mode",
  2377. .info = alc_ch_mode_info,
  2378. .get = alc_ch_mode_get,
  2379. .put = alc_ch_mode_put,
  2380. },
  2381. { } /* end */
  2382. };
  2383. /*
  2384. * ALC880 W810 model
  2385. *
  2386. * W810 has rear IO for:
  2387. * Front (DAC 02)
  2388. * Surround (DAC 03)
  2389. * Center/LFE (DAC 04)
  2390. * Digital out (06)
  2391. *
  2392. * The system also has a pair of internal speakers, and a headphone jack.
  2393. * These are both connected to Line2 on the codec, hence to DAC 02.
  2394. *
  2395. * There is a variable resistor to control the speaker or headphone
  2396. * volume. This is a hardware-only device without a software API.
  2397. *
  2398. * Plugging headphones in will disable the internal speakers. This is
  2399. * implemented in hardware, not via the driver using jack sense. In
  2400. * a similar fashion, plugging into the rear socket marked "front" will
  2401. * disable both the speakers and headphones.
  2402. *
  2403. * For input, there's a microphone jack, and an "audio in" jack.
  2404. * These may not do anything useful with this driver yet, because I
  2405. * haven't setup any initialization verbs for these yet...
  2406. */
  2407. static hda_nid_t alc880_w810_dac_nids[3] = {
  2408. /* front, rear/surround, clfe */
  2409. 0x02, 0x03, 0x04
  2410. };
  2411. /* fixed 6 channels */
  2412. static struct hda_channel_mode alc880_w810_modes[1] = {
  2413. { 6, NULL }
  2414. };
  2415. /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
  2416. static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
  2417. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2418. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2419. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2420. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  2421. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  2422. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2423. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2424. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2425. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  2426. { } /* end */
  2427. };
  2428. /*
  2429. * Z710V model
  2430. *
  2431. * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
  2432. * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
  2433. * Line = 0x1a
  2434. */
  2435. static hda_nid_t alc880_z71v_dac_nids[1] = {
  2436. 0x02
  2437. };
  2438. #define ALC880_Z71V_HP_DAC 0x03
  2439. /* fixed 2 channels */
  2440. static struct hda_channel_mode alc880_2_jack_modes[1] = {
  2441. { 2, NULL }
  2442. };
  2443. static struct snd_kcontrol_new alc880_z71v_mixer[] = {
  2444. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2445. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2446. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2447. HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
  2448. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2449. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2450. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2451. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2452. { } /* end */
  2453. };
  2454. /*
  2455. * ALC880 F1734 model
  2456. *
  2457. * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
  2458. * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
  2459. */
  2460. static hda_nid_t alc880_f1734_dac_nids[1] = {
  2461. 0x03
  2462. };
  2463. #define ALC880_F1734_HP_DAC 0x02
  2464. static struct snd_kcontrol_new alc880_f1734_mixer[] = {
  2465. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2466. HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
  2467. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2468. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  2469. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2470. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2471. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  2472. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  2473. { } /* end */
  2474. };
  2475. static struct hda_input_mux alc880_f1734_capture_source = {
  2476. .num_items = 2,
  2477. .items = {
  2478. { "Mic", 0x1 },
  2479. { "CD", 0x4 },
  2480. },
  2481. };
  2482. /*
  2483. * ALC880 ASUS model
  2484. *
  2485. * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
  2486. * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
  2487. * Mic = 0x18, Line = 0x1a
  2488. */
  2489. #define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
  2490. #define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
  2491. static struct snd_kcontrol_new alc880_asus_mixer[] = {
  2492. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2493. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  2494. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2495. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  2496. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  2497. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2498. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2499. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2500. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2501. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2502. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2503. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2504. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2505. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2506. {
  2507. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  2508. .name = "Channel Mode",
  2509. .info = alc_ch_mode_info,
  2510. .get = alc_ch_mode_get,
  2511. .put = alc_ch_mode_put,
  2512. },
  2513. { } /* end */
  2514. };
  2515. /*
  2516. * ALC880 ASUS W1V model
  2517. *
  2518. * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
  2519. * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
  2520. * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
  2521. */
  2522. /* additional mixers to alc880_asus_mixer */
  2523. static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
  2524. HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
  2525. HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
  2526. { } /* end */
  2527. };
  2528. /* TCL S700 */
  2529. static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
  2530. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2531. HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  2532. HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  2533. HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
  2534. HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
  2535. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
  2536. HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
  2537. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  2538. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  2539. { } /* end */
  2540. };
  2541. /* Uniwill */
  2542. static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
  2543. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2544. HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
  2545. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2546. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  2547. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  2548. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  2549. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  2550. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  2551. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2552. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2553. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  2554. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  2555. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2556. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2557. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  2558. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  2559. {
  2560. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  2561. .name = "Channel Mode",
  2562. .info = alc_ch_mode_info,
  2563. .get = alc_ch_mode_get,
  2564. .put = alc_ch_mode_put,
  2565. },
  2566. { } /* end */
  2567. };
  2568. static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
  2569. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2570. HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
  2571. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2572. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  2573. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  2574. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  2575. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2576. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2577. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  2578. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  2579. { } /* end */
  2580. };
  2581. static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
  2582. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  2583. HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
  2584. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  2585. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  2586. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  2587. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  2588. { } /* end */
  2589. };
  2590. /*
  2591. * virtual master controls
  2592. */
  2593. /*
  2594. * slave controls for virtual master
  2595. */
  2596. static const char * const alc_slave_vols[] = {
  2597. "Front Playback Volume",
  2598. "Surround Playback Volume",
  2599. "Center Playback Volume",
  2600. "LFE Playback Volume",
  2601. "Side Playback Volume",
  2602. "Headphone Playback Volume",
  2603. "Speaker Playback Volume",
  2604. "Mono Playback Volume",
  2605. "Line-Out Playback Volume",
  2606. "PCM Playback Volume",
  2607. NULL,
  2608. };
  2609. static const char * const alc_slave_sws[] = {
  2610. "Front Playback Switch",
  2611. "Surround Playback Switch",
  2612. "Center Playback Switch",
  2613. "LFE Playback Switch",
  2614. "Side Playback Switch",
  2615. "Headphone Playback Switch",
  2616. "Speaker Playback Switch",
  2617. "Mono Playback Switch",
  2618. "IEC958 Playback Switch",
  2619. "Line-Out Playback Switch",
  2620. "PCM Playback Switch",
  2621. NULL,
  2622. };
  2623. /*
  2624. * build control elements
  2625. */
  2626. #define NID_MAPPING (-1)
  2627. #define SUBDEV_SPEAKER_ (0 << 6)
  2628. #define SUBDEV_HP_ (1 << 6)
  2629. #define SUBDEV_LINE_ (2 << 6)
  2630. #define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
  2631. #define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
  2632. #define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
  2633. static void alc_free_kctls(struct hda_codec *codec);
  2634. #ifdef CONFIG_SND_HDA_INPUT_BEEP
  2635. /* additional beep mixers; the actual parameters are overwritten at build */
  2636. static struct snd_kcontrol_new alc_beep_mixer[] = {
  2637. HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
  2638. HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
  2639. { } /* end */
  2640. };
  2641. #endif
  2642. static int alc_build_controls(struct hda_codec *codec)
  2643. {
  2644. struct alc_spec *spec = codec->spec;
  2645. struct snd_kcontrol *kctl = NULL;
  2646. struct snd_kcontrol_new *knew;
  2647. int i, j, err;
  2648. unsigned int u;
  2649. hda_nid_t nid;
  2650. for (i = 0; i < spec->num_mixers; i++) {
  2651. err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
  2652. if (err < 0)
  2653. return err;
  2654. }
  2655. if (spec->cap_mixer) {
  2656. err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
  2657. if (err < 0)
  2658. return err;
  2659. }
  2660. if (spec->multiout.dig_out_nid) {
  2661. err = snd_hda_create_spdif_out_ctls(codec,
  2662. spec->multiout.dig_out_nid);
  2663. if (err < 0)
  2664. return err;
  2665. if (!spec->no_analog) {
  2666. err = snd_hda_create_spdif_share_sw(codec,
  2667. &spec->multiout);
  2668. if (err < 0)
  2669. return err;
  2670. spec->multiout.share_spdif = 1;
  2671. }
  2672. }
  2673. if (spec->dig_in_nid) {
  2674. err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
  2675. if (err < 0)
  2676. return err;
  2677. }
  2678. #ifdef CONFIG_SND_HDA_INPUT_BEEP
  2679. /* create beep controls if needed */
  2680. if (spec->beep_amp) {
  2681. struct snd_kcontrol_new *knew;
  2682. for (knew = alc_beep_mixer; knew->name; knew++) {
  2683. struct snd_kcontrol *kctl;
  2684. kctl = snd_ctl_new1(knew, codec);
  2685. if (!kctl)
  2686. return -ENOMEM;
  2687. kctl->private_value = spec->beep_amp;
  2688. err = snd_hda_ctl_add(codec, 0, kctl);
  2689. if (err < 0)
  2690. return err;
  2691. }
  2692. }
  2693. #endif
  2694. /* if we have no master control, let's create it */
  2695. if (!spec->no_analog &&
  2696. !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
  2697. unsigned int vmaster_tlv[4];
  2698. snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
  2699. HDA_OUTPUT, vmaster_tlv);
  2700. err = snd_hda_add_vmaster(codec, "Master Playback Volume",
  2701. vmaster_tlv, alc_slave_vols);
  2702. if (err < 0)
  2703. return err;
  2704. }
  2705. if (!spec->no_analog &&
  2706. !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
  2707. err = snd_hda_add_vmaster(codec, "Master Playback Switch",
  2708. NULL, alc_slave_sws);
  2709. if (err < 0)
  2710. return err;
  2711. }
  2712. /* assign Capture Source enums to NID */
  2713. if (spec->capsrc_nids || spec->adc_nids) {
  2714. kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
  2715. if (!kctl)
  2716. kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
  2717. for (i = 0; kctl && i < kctl->count; i++) {
  2718. hda_nid_t *nids = spec->capsrc_nids;
  2719. if (!nids)
  2720. nids = spec->adc_nids;
  2721. err = snd_hda_add_nid(codec, kctl, i, nids[i]);
  2722. if (err < 0)
  2723. return err;
  2724. }
  2725. }
  2726. if (spec->cap_mixer) {
  2727. const char *kname = kctl ? kctl->id.name : NULL;
  2728. for (knew = spec->cap_mixer; knew->name; knew++) {
  2729. if (kname && strcmp(knew->name, kname) == 0)
  2730. continue;
  2731. kctl = snd_hda_find_mixer_ctl(codec, knew->name);
  2732. for (i = 0; kctl && i < kctl->count; i++) {
  2733. err = snd_hda_add_nid(codec, kctl, i,
  2734. spec->adc_nids[i]);
  2735. if (err < 0)
  2736. return err;
  2737. }
  2738. }
  2739. }
  2740. /* other nid->control mapping */
  2741. for (i = 0; i < spec->num_mixers; i++) {
  2742. for (knew = spec->mixers[i]; knew->name; knew++) {
  2743. if (knew->iface != NID_MAPPING)
  2744. continue;
  2745. kctl = snd_hda_find_mixer_ctl(codec, knew->name);
  2746. if (kctl == NULL)
  2747. continue;
  2748. u = knew->subdevice;
  2749. for (j = 0; j < 4; j++, u >>= 8) {
  2750. nid = u & 0x3f;
  2751. if (nid == 0)
  2752. continue;
  2753. switch (u & 0xc0) {
  2754. case SUBDEV_SPEAKER_:
  2755. nid = spec->autocfg.speaker_pins[nid];
  2756. break;
  2757. case SUBDEV_LINE_:
  2758. nid = spec->autocfg.line_out_pins[nid];
  2759. break;
  2760. case SUBDEV_HP_:
  2761. nid = spec->autocfg.hp_pins[nid];
  2762. break;
  2763. default:
  2764. continue;
  2765. }
  2766. err = snd_hda_add_nid(codec, kctl, 0, nid);
  2767. if (err < 0)
  2768. return err;
  2769. }
  2770. u = knew->private_value;
  2771. for (j = 0; j < 4; j++, u >>= 8) {
  2772. nid = u & 0xff;
  2773. if (nid == 0)
  2774. continue;
  2775. err = snd_hda_add_nid(codec, kctl, 0, nid);
  2776. if (err < 0)
  2777. return err;
  2778. }
  2779. }
  2780. }
  2781. alc_free_kctls(codec); /* no longer needed */
  2782. return 0;
  2783. }
  2784. /*
  2785. * initialize the codec volumes, etc
  2786. */
  2787. /*
  2788. * generic initialization of ADC, input mixers and output mixers
  2789. */
  2790. static struct hda_verb alc880_volume_init_verbs[] = {
  2791. /*
  2792. * Unmute ADC0-2 and set the default input to mic-in
  2793. */
  2794. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  2795. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  2796. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  2797. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  2798. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  2799. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  2800. /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  2801. * mixer widget
  2802. * Note: PASD motherboards uses the Line In 2 as the input for front
  2803. * panel mic (mic 2)
  2804. */
  2805. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  2806. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  2807. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  2808. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  2809. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  2810. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  2811. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  2812. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  2813. /*
  2814. * Set up output mixers (0x0c - 0x0f)
  2815. */
  2816. /* set vol=0 to output mixers */
  2817. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  2818. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  2819. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  2820. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  2821. /* set up input amps for analog loopback */
  2822. /* Amp Indices: DAC = 0, mixer = 1 */
  2823. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  2824. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  2825. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  2826. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  2827. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  2828. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  2829. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  2830. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  2831. { }
  2832. };
  2833. /*
  2834. * 3-stack pin configuration:
  2835. * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
  2836. */
  2837. static struct hda_verb alc880_pin_3stack_init_verbs[] = {
  2838. /*
  2839. * preset connection lists of input pins
  2840. * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
  2841. */
  2842. {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
  2843. {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  2844. {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
  2845. /*
  2846. * Set pin mode and muting
  2847. */
  2848. /* set front pin widgets 0x14 for output */
  2849. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2850. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2851. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  2852. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2853. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2854. /* Mic2 (as headphone out) for HP output */
  2855. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2856. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2857. /* Line In pin widget for input */
  2858. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2859. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2860. /* Line2 (as front mic) pin widget for input and vref at 80% */
  2861. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2862. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2863. /* CD pin widget for input */
  2864. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2865. { }
  2866. };
  2867. /*
  2868. * 5-stack pin configuration:
  2869. * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
  2870. * line-in/side = 0x1a, f-mic = 0x1b
  2871. */
  2872. static struct hda_verb alc880_pin_5stack_init_verbs[] = {
  2873. /*
  2874. * preset connection lists of input pins
  2875. * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
  2876. */
  2877. {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  2878. {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
  2879. /*
  2880. * Set pin mode and muting
  2881. */
  2882. /* set pin widgets 0x14-0x17 for output */
  2883. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2884. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2885. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2886. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2887. /* unmute pins for output (no gain on this amp) */
  2888. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2889. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2890. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2891. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2892. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  2893. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2894. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2895. /* Mic2 (as headphone out) for HP output */
  2896. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2897. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2898. /* Line In pin widget for input */
  2899. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2900. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2901. /* Line2 (as front mic) pin widget for input and vref at 80% */
  2902. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2903. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2904. /* CD pin widget for input */
  2905. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2906. { }
  2907. };
  2908. /*
  2909. * W810 pin configuration:
  2910. * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
  2911. */
  2912. static struct hda_verb alc880_pin_w810_init_verbs[] = {
  2913. /* hphone/speaker input selector: front DAC */
  2914. {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
  2915. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2916. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2917. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2918. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2919. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2920. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2921. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2922. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2923. { }
  2924. };
  2925. /*
  2926. * Z71V pin configuration:
  2927. * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
  2928. */
  2929. static struct hda_verb alc880_pin_z71v_init_verbs[] = {
  2930. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2931. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2932. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2933. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2934. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2935. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2936. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2937. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2938. { }
  2939. };
  2940. /*
  2941. * 6-stack pin configuration:
  2942. * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
  2943. * f-mic = 0x19, line = 0x1a, HP = 0x1b
  2944. */
  2945. static struct hda_verb alc880_pin_6stack_init_verbs[] = {
  2946. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  2947. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2948. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2949. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2950. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2951. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2952. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2953. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2954. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2955. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2956. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2957. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2958. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2959. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2960. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2961. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2962. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2963. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2964. { }
  2965. };
  2966. /*
  2967. * Uniwill pin configuration:
  2968. * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
  2969. * line = 0x1a
  2970. */
  2971. static struct hda_verb alc880_uniwill_init_verbs[] = {
  2972. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  2973. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2974. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2975. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2976. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2977. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  2978. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2979. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  2980. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  2981. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  2982. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  2983. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  2984. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  2985. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  2986. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  2987. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2988. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2989. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  2990. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2991. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2992. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  2993. /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
  2994. /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
  2995. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  2996. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  2997. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  2998. { }
  2999. };
  3000. /*
  3001. * Uniwill P53
  3002. * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
  3003. */
  3004. static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
  3005. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  3006. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3007. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3008. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3009. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3010. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3011. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3012. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  3013. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  3014. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  3015. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  3016. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  3017. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  3018. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3019. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3020. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3021. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3022. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3023. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3024. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  3025. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
  3026. { }
  3027. };
  3028. static struct hda_verb alc880_beep_init_verbs[] = {
  3029. { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
  3030. { }
  3031. };
  3032. /* auto-toggle front mic */
  3033. static void alc88x_simple_mic_automute(struct hda_codec *codec)
  3034. {
  3035. unsigned int present;
  3036. unsigned char bits;
  3037. present = snd_hda_jack_detect(codec, 0x18);
  3038. bits = present ? HDA_AMP_MUTE : 0;
  3039. snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
  3040. }
  3041. static void alc880_uniwill_setup(struct hda_codec *codec)
  3042. {
  3043. struct alc_spec *spec = codec->spec;
  3044. spec->autocfg.hp_pins[0] = 0x14;
  3045. spec->autocfg.speaker_pins[0] = 0x15;
  3046. spec->autocfg.speaker_pins[0] = 0x16;
  3047. }
  3048. static void alc880_uniwill_init_hook(struct hda_codec *codec)
  3049. {
  3050. alc_automute_amp(codec);
  3051. alc88x_simple_mic_automute(codec);
  3052. }
  3053. static void alc880_uniwill_unsol_event(struct hda_codec *codec,
  3054. unsigned int res)
  3055. {
  3056. /* Looks like the unsol event is incompatible with the standard
  3057. * definition. 4bit tag is placed at 28 bit!
  3058. */
  3059. switch (res >> 28) {
  3060. case ALC880_MIC_EVENT:
  3061. alc88x_simple_mic_automute(codec);
  3062. break;
  3063. default:
  3064. alc_automute_amp_unsol_event(codec, res);
  3065. break;
  3066. }
  3067. }
  3068. static void alc880_uniwill_p53_setup(struct hda_codec *codec)
  3069. {
  3070. struct alc_spec *spec = codec->spec;
  3071. spec->autocfg.hp_pins[0] = 0x14;
  3072. spec->autocfg.speaker_pins[0] = 0x15;
  3073. }
  3074. static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
  3075. {
  3076. unsigned int present;
  3077. present = snd_hda_codec_read(codec, 0x21, 0,
  3078. AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
  3079. present &= HDA_AMP_VOLMASK;
  3080. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
  3081. HDA_AMP_VOLMASK, present);
  3082. snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
  3083. HDA_AMP_VOLMASK, present);
  3084. }
  3085. static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
  3086. unsigned int res)
  3087. {
  3088. /* Looks like the unsol event is incompatible with the standard
  3089. * definition. 4bit tag is placed at 28 bit!
  3090. */
  3091. if ((res >> 28) == ALC880_DCVOL_EVENT)
  3092. alc880_uniwill_p53_dcvol_automute(codec);
  3093. else
  3094. alc_automute_amp_unsol_event(codec, res);
  3095. }
  3096. /*
  3097. * F1734 pin configuration:
  3098. * HP = 0x14, speaker-out = 0x15, mic = 0x18
  3099. */
  3100. static struct hda_verb alc880_pin_f1734_init_verbs[] = {
  3101. {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
  3102. {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
  3103. {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
  3104. {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
  3105. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
  3106. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3107. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3108. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3109. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3110. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3111. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3112. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  3113. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3114. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3115. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3116. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3117. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3118. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3119. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
  3120. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
  3121. { }
  3122. };
  3123. /*
  3124. * ASUS pin configuration:
  3125. * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
  3126. */
  3127. static struct hda_verb alc880_pin_asus_init_verbs[] = {
  3128. {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
  3129. {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
  3130. {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
  3131. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
  3132. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3133. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3134. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3135. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3136. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3137. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3138. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3139. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3140. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3141. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3142. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3143. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3144. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3145. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3146. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3147. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3148. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3149. { }
  3150. };
  3151. /* Enable GPIO mask and set output */
  3152. #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
  3153. #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
  3154. #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
  3155. /* Clevo m520g init */
  3156. static struct hda_verb alc880_pin_clevo_init_verbs[] = {
  3157. /* headphone output */
  3158. {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
  3159. /* line-out */
  3160. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3161. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3162. /* Line-in */
  3163. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3164. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3165. /* CD */
  3166. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3167. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3168. /* Mic1 (rear panel) */
  3169. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3170. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3171. /* Mic2 (front panel) */
  3172. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3173. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3174. /* headphone */
  3175. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3176. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3177. /* change to EAPD mode */
  3178. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  3179. {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
  3180. { }
  3181. };
  3182. static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
  3183. /* change to EAPD mode */
  3184. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  3185. {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
  3186. /* Headphone output */
  3187. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3188. /* Front output*/
  3189. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3190. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  3191. /* Line In pin widget for input */
  3192. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3193. /* CD pin widget for input */
  3194. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3195. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  3196. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3197. /* change to EAPD mode */
  3198. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  3199. {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
  3200. { }
  3201. };
  3202. /*
  3203. * LG m1 express dual
  3204. *
  3205. * Pin assignment:
  3206. * Rear Line-In/Out (blue): 0x14
  3207. * Build-in Mic-In: 0x15
  3208. * Speaker-out: 0x17
  3209. * HP-Out (green): 0x1b
  3210. * Mic-In/Out (red): 0x19
  3211. * SPDIF-Out: 0x1e
  3212. */
  3213. /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
  3214. static hda_nid_t alc880_lg_dac_nids[3] = {
  3215. 0x05, 0x02, 0x03
  3216. };
  3217. /* seems analog CD is not working */
  3218. static struct hda_input_mux alc880_lg_capture_source = {
  3219. .num_items = 3,
  3220. .items = {
  3221. { "Mic", 0x1 },
  3222. { "Line", 0x5 },
  3223. { "Internal Mic", 0x6 },
  3224. },
  3225. };
  3226. /* 2,4,6 channel modes */
  3227. static struct hda_verb alc880_lg_ch2_init[] = {
  3228. /* set line-in and mic-in to input */
  3229. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  3230. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  3231. { }
  3232. };
  3233. static struct hda_verb alc880_lg_ch4_init[] = {
  3234. /* set line-in to out and mic-in to input */
  3235. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
  3236. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  3237. { }
  3238. };
  3239. static struct hda_verb alc880_lg_ch6_init[] = {
  3240. /* set line-in and mic-in to output */
  3241. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
  3242. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
  3243. { }
  3244. };
  3245. static struct hda_channel_mode alc880_lg_ch_modes[3] = {
  3246. { 2, alc880_lg_ch2_init },
  3247. { 4, alc880_lg_ch4_init },
  3248. { 6, alc880_lg_ch6_init },
  3249. };
  3250. static struct snd_kcontrol_new alc880_lg_mixer[] = {
  3251. HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  3252. HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
  3253. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  3254. HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
  3255. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
  3256. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
  3257. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
  3258. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
  3259. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  3260. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  3261. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
  3262. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
  3263. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
  3264. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
  3265. {
  3266. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  3267. .name = "Channel Mode",
  3268. .info = alc_ch_mode_info,
  3269. .get = alc_ch_mode_get,
  3270. .put = alc_ch_mode_put,
  3271. },
  3272. { } /* end */
  3273. };
  3274. static struct hda_verb alc880_lg_init_verbs[] = {
  3275. /* set capture source to mic-in */
  3276. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  3277. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  3278. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  3279. /* mute all amp mixer inputs */
  3280. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
  3281. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  3282. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  3283. /* line-in to input */
  3284. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  3285. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3286. /* built-in mic */
  3287. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3288. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3289. /* speaker-out */
  3290. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3291. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3292. /* mic-in to input */
  3293. {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
  3294. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3295. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3296. /* HP-out */
  3297. {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
  3298. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3299. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3300. /* jack sense */
  3301. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  3302. { }
  3303. };
  3304. /* toggle speaker-output according to the hp-jack state */
  3305. static void alc880_lg_setup(struct hda_codec *codec)
  3306. {
  3307. struct alc_spec *spec = codec->spec;
  3308. spec->autocfg.hp_pins[0] = 0x1b;
  3309. spec->autocfg.speaker_pins[0] = 0x17;
  3310. }
  3311. /*
  3312. * LG LW20
  3313. *
  3314. * Pin assignment:
  3315. * Speaker-out: 0x14
  3316. * Mic-In: 0x18
  3317. * Built-in Mic-In: 0x19
  3318. * Line-In: 0x1b
  3319. * HP-Out: 0x1a
  3320. * SPDIF-Out: 0x1e
  3321. */
  3322. static struct hda_input_mux alc880_lg_lw_capture_source = {
  3323. .num_items = 3,
  3324. .items = {
  3325. { "Mic", 0x0 },
  3326. { "Internal Mic", 0x1 },
  3327. { "Line In", 0x2 },
  3328. },
  3329. };
  3330. #define alc880_lg_lw_modes alc880_threestack_modes
  3331. static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
  3332. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  3333. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  3334. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  3335. HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
  3336. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  3337. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  3338. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  3339. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  3340. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  3341. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  3342. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  3343. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  3344. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  3345. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  3346. {
  3347. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  3348. .name = "Channel Mode",
  3349. .info = alc_ch_mode_info,
  3350. .get = alc_ch_mode_get,
  3351. .put = alc_ch_mode_put,
  3352. },
  3353. { } /* end */
  3354. };
  3355. static struct hda_verb alc880_lg_lw_init_verbs[] = {
  3356. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  3357. {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
  3358. {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
  3359. /* set capture source to mic-in */
  3360. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  3361. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  3362. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  3363. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  3364. /* speaker-out */
  3365. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3366. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3367. /* HP-out */
  3368. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3369. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3370. /* mic-in to input */
  3371. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3372. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3373. /* built-in mic */
  3374. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3375. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3376. /* jack sense */
  3377. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  3378. { }
  3379. };
  3380. /* toggle speaker-output according to the hp-jack state */
  3381. static void alc880_lg_lw_setup(struct hda_codec *codec)
  3382. {
  3383. struct alc_spec *spec = codec->spec;
  3384. spec->autocfg.hp_pins[0] = 0x1b;
  3385. spec->autocfg.speaker_pins[0] = 0x14;
  3386. }
  3387. static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
  3388. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  3389. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  3390. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  3391. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  3392. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  3393. HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
  3394. { } /* end */
  3395. };
  3396. static struct hda_input_mux alc880_medion_rim_capture_source = {
  3397. .num_items = 2,
  3398. .items = {
  3399. { "Mic", 0x0 },
  3400. { "Internal Mic", 0x1 },
  3401. },
  3402. };
  3403. static struct hda_verb alc880_medion_rim_init_verbs[] = {
  3404. {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  3405. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3406. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3407. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  3408. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  3409. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3410. /* Mic2 (as headphone out) for HP output */
  3411. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  3412. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  3413. /* Internal Speaker */
  3414. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  3415. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  3416. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  3417. {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
  3418. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  3419. { }
  3420. };
  3421. /* toggle speaker-output according to the hp-jack state */
  3422. static void alc880_medion_rim_automute(struct hda_codec *codec)
  3423. {
  3424. struct alc_spec *spec = codec->spec;
  3425. alc_automute_amp(codec);
  3426. /* toggle EAPD */
  3427. if (spec->jack_present)
  3428. snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
  3429. else
  3430. snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
  3431. }
  3432. static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
  3433. unsigned int res)
  3434. {
  3435. /* Looks like the unsol event is incompatible with the standard
  3436. * definition. 4bit tag is placed at 28 bit!
  3437. */
  3438. if ((res >> 28) == ALC880_HP_EVENT)
  3439. alc880_medion_rim_automute(codec);
  3440. }
  3441. static void alc880_medion_rim_setup(struct hda_codec *codec)
  3442. {
  3443. struct alc_spec *spec = codec->spec;
  3444. spec->autocfg.hp_pins[0] = 0x14;
  3445. spec->autocfg.speaker_pins[0] = 0x1b;
  3446. }
  3447. #ifdef CONFIG_SND_HDA_POWER_SAVE
  3448. static struct hda_amp_list alc880_loopbacks[] = {
  3449. { 0x0b, HDA_INPUT, 0 },
  3450. { 0x0b, HDA_INPUT, 1 },
  3451. { 0x0b, HDA_INPUT, 2 },
  3452. { 0x0b, HDA_INPUT, 3 },
  3453. { 0x0b, HDA_INPUT, 4 },
  3454. { } /* end */
  3455. };
  3456. static struct hda_amp_list alc880_lg_loopbacks[] = {
  3457. { 0x0b, HDA_INPUT, 1 },
  3458. { 0x0b, HDA_INPUT, 6 },
  3459. { 0x0b, HDA_INPUT, 7 },
  3460. { } /* end */
  3461. };
  3462. #endif
  3463. /*
  3464. * Common callbacks
  3465. */
  3466. static void alc_init_special_input_src(struct hda_codec *codec);
  3467. static int alc_init(struct hda_codec *codec)
  3468. {
  3469. struct alc_spec *spec = codec->spec;
  3470. unsigned int i;
  3471. alc_fix_pll(codec);
  3472. alc_auto_init_amp(codec, spec->init_amp);
  3473. for (i = 0; i < spec->num_init_verbs; i++)
  3474. snd_hda_sequence_write(codec, spec->init_verbs[i]);
  3475. alc_init_special_input_src(codec);
  3476. if (spec->init_hook)
  3477. spec->init_hook(codec);
  3478. alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
  3479. hda_call_check_power_status(codec, 0x01);
  3480. return 0;
  3481. }
  3482. static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
  3483. {
  3484. struct alc_spec *spec = codec->spec;
  3485. if (spec->unsol_event)
  3486. spec->unsol_event(codec, res);
  3487. }
  3488. #ifdef CONFIG_SND_HDA_POWER_SAVE
  3489. static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
  3490. {
  3491. struct alc_spec *spec = codec->spec;
  3492. return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
  3493. }
  3494. #endif
  3495. /*
  3496. * Analog playback callbacks
  3497. */
  3498. static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
  3499. struct hda_codec *codec,
  3500. struct snd_pcm_substream *substream)
  3501. {
  3502. struct alc_spec *spec = codec->spec;
  3503. return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
  3504. hinfo);
  3505. }
  3506. static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
  3507. struct hda_codec *codec,
  3508. unsigned int stream_tag,
  3509. unsigned int format,
  3510. struct snd_pcm_substream *substream)
  3511. {
  3512. struct alc_spec *spec = codec->spec;
  3513. return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
  3514. stream_tag, format, substream);
  3515. }
  3516. static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
  3517. struct hda_codec *codec,
  3518. struct snd_pcm_substream *substream)
  3519. {
  3520. struct alc_spec *spec = codec->spec;
  3521. return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
  3522. }
  3523. /*
  3524. * Digital out
  3525. */
  3526. static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
  3527. struct hda_codec *codec,
  3528. struct snd_pcm_substream *substream)
  3529. {
  3530. struct alc_spec *spec = codec->spec;
  3531. return snd_hda_multi_out_dig_open(codec, &spec->multiout);
  3532. }
  3533. static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
  3534. struct hda_codec *codec,
  3535. unsigned int stream_tag,
  3536. unsigned int format,
  3537. struct snd_pcm_substream *substream)
  3538. {
  3539. struct alc_spec *spec = codec->spec;
  3540. return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
  3541. stream_tag, format, substream);
  3542. }
  3543. static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
  3544. struct hda_codec *codec,
  3545. struct snd_pcm_substream *substream)
  3546. {
  3547. struct alc_spec *spec = codec->spec;
  3548. return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
  3549. }
  3550. static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
  3551. struct hda_codec *codec,
  3552. struct snd_pcm_substream *substream)
  3553. {
  3554. struct alc_spec *spec = codec->spec;
  3555. return snd_hda_multi_out_dig_close(codec, &spec->multiout);
  3556. }
  3557. /*
  3558. * Analog capture
  3559. */
  3560. static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
  3561. struct hda_codec *codec,
  3562. unsigned int stream_tag,
  3563. unsigned int format,
  3564. struct snd_pcm_substream *substream)
  3565. {
  3566. struct alc_spec *spec = codec->spec;
  3567. snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
  3568. stream_tag, 0, format);
  3569. return 0;
  3570. }
  3571. static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
  3572. struct hda_codec *codec,
  3573. struct snd_pcm_substream *substream)
  3574. {
  3575. struct alc_spec *spec = codec->spec;
  3576. snd_hda_codec_cleanup_stream(codec,
  3577. spec->adc_nids[substream->number + 1]);
  3578. return 0;
  3579. }
  3580. /* analog capture with dynamic dual-adc changes */
  3581. static int dualmic_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
  3582. struct hda_codec *codec,
  3583. unsigned int stream_tag,
  3584. unsigned int format,
  3585. struct snd_pcm_substream *substream)
  3586. {
  3587. struct alc_spec *spec = codec->spec;
  3588. spec->cur_adc = spec->adc_nids[spec->cur_adc_idx];
  3589. spec->cur_adc_stream_tag = stream_tag;
  3590. spec->cur_adc_format = format;
  3591. snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
  3592. return 0;
  3593. }
  3594. static int dualmic_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
  3595. struct hda_codec *codec,
  3596. struct snd_pcm_substream *substream)
  3597. {
  3598. struct alc_spec *spec = codec->spec;
  3599. snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
  3600. spec->cur_adc = 0;
  3601. return 0;
  3602. }
  3603. static struct hda_pcm_stream dualmic_pcm_analog_capture = {
  3604. .substreams = 1,
  3605. .channels_min = 2,
  3606. .channels_max = 2,
  3607. .nid = 0, /* fill later */
  3608. .ops = {
  3609. .prepare = dualmic_capture_pcm_prepare,
  3610. .cleanup = dualmic_capture_pcm_cleanup
  3611. },
  3612. };
  3613. /*
  3614. */
  3615. static struct hda_pcm_stream alc880_pcm_analog_playback = {
  3616. .substreams = 1,
  3617. .channels_min = 2,
  3618. .channels_max = 8,
  3619. /* NID is set in alc_build_pcms */
  3620. .ops = {
  3621. .open = alc880_playback_pcm_open,
  3622. .prepare = alc880_playback_pcm_prepare,
  3623. .cleanup = alc880_playback_pcm_cleanup
  3624. },
  3625. };
  3626. static struct hda_pcm_stream alc880_pcm_analog_capture = {
  3627. .substreams = 1,
  3628. .channels_min = 2,
  3629. .channels_max = 2,
  3630. /* NID is set in alc_build_pcms */
  3631. };
  3632. static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
  3633. .substreams = 1,
  3634. .channels_min = 2,
  3635. .channels_max = 2,
  3636. /* NID is set in alc_build_pcms */
  3637. };
  3638. static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
  3639. .substreams = 2, /* can be overridden */
  3640. .channels_min = 2,
  3641. .channels_max = 2,
  3642. /* NID is set in alc_build_pcms */
  3643. .ops = {
  3644. .prepare = alc880_alt_capture_pcm_prepare,
  3645. .cleanup = alc880_alt_capture_pcm_cleanup
  3646. },
  3647. };
  3648. static struct hda_pcm_stream alc880_pcm_digital_playback = {
  3649. .substreams = 1,
  3650. .channels_min = 2,
  3651. .channels_max = 2,
  3652. /* NID is set in alc_build_pcms */
  3653. .ops = {
  3654. .open = alc880_dig_playback_pcm_open,
  3655. .close = alc880_dig_playback_pcm_close,
  3656. .prepare = alc880_dig_playback_pcm_prepare,
  3657. .cleanup = alc880_dig_playback_pcm_cleanup
  3658. },
  3659. };
  3660. static struct hda_pcm_stream alc880_pcm_digital_capture = {
  3661. .substreams = 1,
  3662. .channels_min = 2,
  3663. .channels_max = 2,
  3664. /* NID is set in alc_build_pcms */
  3665. };
  3666. /* Used by alc_build_pcms to flag that a PCM has no playback stream */
  3667. static struct hda_pcm_stream alc_pcm_null_stream = {
  3668. .substreams = 0,
  3669. .channels_min = 0,
  3670. .channels_max = 0,
  3671. };
  3672. static int alc_build_pcms(struct hda_codec *codec)
  3673. {
  3674. struct alc_spec *spec = codec->spec;
  3675. struct hda_pcm *info = spec->pcm_rec;
  3676. int i;
  3677. codec->num_pcms = 1;
  3678. codec->pcm_info = info;
  3679. if (spec->no_analog)
  3680. goto skip_analog;
  3681. snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
  3682. "%s Analog", codec->chip_name);
  3683. info->name = spec->stream_name_analog;
  3684. if (spec->stream_analog_playback) {
  3685. if (snd_BUG_ON(!spec->multiout.dac_nids))
  3686. return -EINVAL;
  3687. info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
  3688. info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
  3689. }
  3690. if (spec->stream_analog_capture) {
  3691. if (snd_BUG_ON(!spec->adc_nids))
  3692. return -EINVAL;
  3693. info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
  3694. info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
  3695. }
  3696. if (spec->channel_mode) {
  3697. info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
  3698. for (i = 0; i < spec->num_channel_mode; i++) {
  3699. if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
  3700. info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
  3701. }
  3702. }
  3703. }
  3704. skip_analog:
  3705. /* SPDIF for stream index #1 */
  3706. if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
  3707. snprintf(spec->stream_name_digital,
  3708. sizeof(spec->stream_name_digital),
  3709. "%s Digital", codec->chip_name);
  3710. codec->num_pcms = 2;
  3711. codec->slave_dig_outs = spec->multiout.slave_dig_outs;
  3712. info = spec->pcm_rec + 1;
  3713. info->name = spec->stream_name_digital;
  3714. if (spec->dig_out_type)
  3715. info->pcm_type = spec->dig_out_type;
  3716. else
  3717. info->pcm_type = HDA_PCM_TYPE_SPDIF;
  3718. if (spec->multiout.dig_out_nid &&
  3719. spec->stream_digital_playback) {
  3720. info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
  3721. info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
  3722. }
  3723. if (spec->dig_in_nid &&
  3724. spec->stream_digital_capture) {
  3725. info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
  3726. info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
  3727. }
  3728. /* FIXME: do we need this for all Realtek codec models? */
  3729. codec->spdif_status_reset = 1;
  3730. }
  3731. if (spec->no_analog)
  3732. return 0;
  3733. /* If the use of more than one ADC is requested for the current
  3734. * model, configure a second analog capture-only PCM.
  3735. */
  3736. /* Additional Analaog capture for index #2 */
  3737. if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
  3738. (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
  3739. codec->num_pcms = 3;
  3740. info = spec->pcm_rec + 2;
  3741. info->name = spec->stream_name_analog;
  3742. if (spec->alt_dac_nid) {
  3743. info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
  3744. *spec->stream_analog_alt_playback;
  3745. info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
  3746. spec->alt_dac_nid;
  3747. } else {
  3748. info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
  3749. alc_pcm_null_stream;
  3750. info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
  3751. }
  3752. if (spec->num_adc_nids > 1) {
  3753. info->stream[SNDRV_PCM_STREAM_CAPTURE] =
  3754. *spec->stream_analog_alt_capture;
  3755. info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
  3756. spec->adc_nids[1];
  3757. info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
  3758. spec->num_adc_nids - 1;
  3759. } else {
  3760. info->stream[SNDRV_PCM_STREAM_CAPTURE] =
  3761. alc_pcm_null_stream;
  3762. info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
  3763. }
  3764. }
  3765. return 0;
  3766. }
  3767. static inline void alc_shutup(struct hda_codec *codec)
  3768. {
  3769. snd_hda_shutup_pins(codec);
  3770. }
  3771. static void alc_free_kctls(struct hda_codec *codec)
  3772. {
  3773. struct alc_spec *spec = codec->spec;
  3774. if (spec->kctls.list) {
  3775. struct snd_kcontrol_new *kctl = spec->kctls.list;
  3776. int i;
  3777. for (i = 0; i < spec->kctls.used; i++)
  3778. kfree(kctl[i].name);
  3779. }
  3780. snd_array_free(&spec->kctls);
  3781. }
  3782. static void alc_free(struct hda_codec *codec)
  3783. {
  3784. struct alc_spec *spec = codec->spec;
  3785. if (!spec)
  3786. return;
  3787. alc_shutup(codec);
  3788. snd_hda_input_jack_free(codec);
  3789. alc_free_kctls(codec);
  3790. kfree(spec);
  3791. snd_hda_detach_beep_device(codec);
  3792. }
  3793. #ifdef CONFIG_SND_HDA_POWER_SAVE
  3794. static void alc_power_eapd(struct hda_codec *codec)
  3795. {
  3796. /* We currently only handle front, HP */
  3797. switch (codec->vendor_id) {
  3798. case 0x10ec0260:
  3799. set_eapd(codec, 0x0f, 0);
  3800. set_eapd(codec, 0x10, 0);
  3801. break;
  3802. case 0x10ec0262:
  3803. case 0x10ec0267:
  3804. case 0x10ec0268:
  3805. case 0x10ec0269:
  3806. case 0x10ec0270:
  3807. case 0x10ec0272:
  3808. case 0x10ec0660:
  3809. case 0x10ec0662:
  3810. case 0x10ec0663:
  3811. case 0x10ec0665:
  3812. case 0x10ec0862:
  3813. case 0x10ec0889:
  3814. set_eapd(codec, 0x14, 0);
  3815. set_eapd(codec, 0x15, 0);
  3816. break;
  3817. }
  3818. }
  3819. static int alc_suspend(struct hda_codec *codec, pm_message_t state)
  3820. {
  3821. struct alc_spec *spec = codec->spec;
  3822. alc_shutup(codec);
  3823. if (spec && spec->power_hook)
  3824. spec->power_hook(codec);
  3825. return 0;
  3826. }
  3827. #endif
  3828. #ifdef SND_HDA_NEEDS_RESUME
  3829. static int alc_resume(struct hda_codec *codec)
  3830. {
  3831. codec->patch_ops.init(codec);
  3832. snd_hda_codec_resume_amp(codec);
  3833. snd_hda_codec_resume_cache(codec);
  3834. hda_call_check_power_status(codec, 0x01);
  3835. return 0;
  3836. }
  3837. #endif
  3838. /*
  3839. */
  3840. static struct hda_codec_ops alc_patch_ops = {
  3841. .build_controls = alc_build_controls,
  3842. .build_pcms = alc_build_pcms,
  3843. .init = alc_init,
  3844. .free = alc_free,
  3845. .unsol_event = alc_unsol_event,
  3846. #ifdef SND_HDA_NEEDS_RESUME
  3847. .resume = alc_resume,
  3848. #endif
  3849. #ifdef CONFIG_SND_HDA_POWER_SAVE
  3850. .suspend = alc_suspend,
  3851. .check_power_status = alc_check_power_status,
  3852. #endif
  3853. .reboot_notify = alc_shutup,
  3854. };
  3855. /* replace the codec chip_name with the given string */
  3856. static int alc_codec_rename(struct hda_codec *codec, const char *name)
  3857. {
  3858. kfree(codec->chip_name);
  3859. codec->chip_name = kstrdup(name, GFP_KERNEL);
  3860. if (!codec->chip_name) {
  3861. alc_free(codec);
  3862. return -ENOMEM;
  3863. }
  3864. return 0;
  3865. }
  3866. /*
  3867. * Test configuration for debugging
  3868. *
  3869. * Almost all inputs/outputs are enabled. I/O pins can be configured via
  3870. * enum controls.
  3871. */
  3872. #ifdef CONFIG_SND_DEBUG
  3873. static hda_nid_t alc880_test_dac_nids[4] = {
  3874. 0x02, 0x03, 0x04, 0x05
  3875. };
  3876. static struct hda_input_mux alc880_test_capture_source = {
  3877. .num_items = 7,
  3878. .items = {
  3879. { "In-1", 0x0 },
  3880. { "In-2", 0x1 },
  3881. { "In-3", 0x2 },
  3882. { "In-4", 0x3 },
  3883. { "CD", 0x4 },
  3884. { "Front", 0x5 },
  3885. { "Surround", 0x6 },
  3886. },
  3887. };
  3888. static struct hda_channel_mode alc880_test_modes[4] = {
  3889. { 2, NULL },
  3890. { 4, NULL },
  3891. { 6, NULL },
  3892. { 8, NULL },
  3893. };
  3894. static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
  3895. struct snd_ctl_elem_info *uinfo)
  3896. {
  3897. static char *texts[] = {
  3898. "N/A", "Line Out", "HP Out",
  3899. "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
  3900. };
  3901. uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  3902. uinfo->count = 1;
  3903. uinfo->value.enumerated.items = 8;
  3904. if (uinfo->value.enumerated.item >= 8)
  3905. uinfo->value.enumerated.item = 7;
  3906. strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
  3907. return 0;
  3908. }
  3909. static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
  3910. struct snd_ctl_elem_value *ucontrol)
  3911. {
  3912. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  3913. hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
  3914. unsigned int pin_ctl, item = 0;
  3915. pin_ctl = snd_hda_codec_read(codec, nid, 0,
  3916. AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  3917. if (pin_ctl & AC_PINCTL_OUT_EN) {
  3918. if (pin_ctl & AC_PINCTL_HP_EN)
  3919. item = 2;
  3920. else
  3921. item = 1;
  3922. } else if (pin_ctl & AC_PINCTL_IN_EN) {
  3923. switch (pin_ctl & AC_PINCTL_VREFEN) {
  3924. case AC_PINCTL_VREF_HIZ: item = 3; break;
  3925. case AC_PINCTL_VREF_50: item = 4; break;
  3926. case AC_PINCTL_VREF_GRD: item = 5; break;
  3927. case AC_PINCTL_VREF_80: item = 6; break;
  3928. case AC_PINCTL_VREF_100: item = 7; break;
  3929. }
  3930. }
  3931. ucontrol->value.enumerated.item[0] = item;
  3932. return 0;
  3933. }
  3934. static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
  3935. struct snd_ctl_elem_value *ucontrol)
  3936. {
  3937. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  3938. hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
  3939. static unsigned int ctls[] = {
  3940. 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
  3941. AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
  3942. AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
  3943. AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
  3944. AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
  3945. AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
  3946. };
  3947. unsigned int old_ctl, new_ctl;
  3948. old_ctl = snd_hda_codec_read(codec, nid, 0,
  3949. AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  3950. new_ctl = ctls[ucontrol->value.enumerated.item[0]];
  3951. if (old_ctl != new_ctl) {
  3952. int val;
  3953. snd_hda_codec_write_cache(codec, nid, 0,
  3954. AC_VERB_SET_PIN_WIDGET_CONTROL,
  3955. new_ctl);
  3956. val = ucontrol->value.enumerated.item[0] >= 3 ?
  3957. HDA_AMP_MUTE : 0;
  3958. snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
  3959. HDA_AMP_MUTE, val);
  3960. return 1;
  3961. }
  3962. return 0;
  3963. }
  3964. static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
  3965. struct snd_ctl_elem_info *uinfo)
  3966. {
  3967. static char *texts[] = {
  3968. "Front", "Surround", "CLFE", "Side"
  3969. };
  3970. uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  3971. uinfo->count = 1;
  3972. uinfo->value.enumerated.items = 4;
  3973. if (uinfo->value.enumerated.item >= 4)
  3974. uinfo->value.enumerated.item = 3;
  3975. strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
  3976. return 0;
  3977. }
  3978. static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
  3979. struct snd_ctl_elem_value *ucontrol)
  3980. {
  3981. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  3982. hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
  3983. unsigned int sel;
  3984. sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
  3985. ucontrol->value.enumerated.item[0] = sel & 3;
  3986. return 0;
  3987. }
  3988. static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
  3989. struct snd_ctl_elem_value *ucontrol)
  3990. {
  3991. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  3992. hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
  3993. unsigned int sel;
  3994. sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
  3995. if (ucontrol->value.enumerated.item[0] != sel) {
  3996. sel = ucontrol->value.enumerated.item[0] & 3;
  3997. snd_hda_codec_write_cache(codec, nid, 0,
  3998. AC_VERB_SET_CONNECT_SEL, sel);
  3999. return 1;
  4000. }
  4001. return 0;
  4002. }
  4003. #define PIN_CTL_TEST(xname,nid) { \
  4004. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  4005. .name = xname, \
  4006. .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
  4007. .info = alc_test_pin_ctl_info, \
  4008. .get = alc_test_pin_ctl_get, \
  4009. .put = alc_test_pin_ctl_put, \
  4010. .private_value = nid \
  4011. }
  4012. #define PIN_SRC_TEST(xname,nid) { \
  4013. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  4014. .name = xname, \
  4015. .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
  4016. .info = alc_test_pin_src_info, \
  4017. .get = alc_test_pin_src_get, \
  4018. .put = alc_test_pin_src_put, \
  4019. .private_value = nid \
  4020. }
  4021. static struct snd_kcontrol_new alc880_test_mixer[] = {
  4022. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  4023. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  4024. HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
  4025. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  4026. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  4027. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  4028. HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
  4029. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  4030. PIN_CTL_TEST("Front Pin Mode", 0x14),
  4031. PIN_CTL_TEST("Surround Pin Mode", 0x15),
  4032. PIN_CTL_TEST("CLFE Pin Mode", 0x16),
  4033. PIN_CTL_TEST("Side Pin Mode", 0x17),
  4034. PIN_CTL_TEST("In-1 Pin Mode", 0x18),
  4035. PIN_CTL_TEST("In-2 Pin Mode", 0x19),
  4036. PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
  4037. PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
  4038. PIN_SRC_TEST("In-1 Pin Source", 0x18),
  4039. PIN_SRC_TEST("In-2 Pin Source", 0x19),
  4040. PIN_SRC_TEST("In-3 Pin Source", 0x1a),
  4041. PIN_SRC_TEST("In-4 Pin Source", 0x1b),
  4042. HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
  4043. HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
  4044. HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
  4045. HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
  4046. HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
  4047. HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
  4048. HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
  4049. HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
  4050. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
  4051. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
  4052. {
  4053. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  4054. .name = "Channel Mode",
  4055. .info = alc_ch_mode_info,
  4056. .get = alc_ch_mode_get,
  4057. .put = alc_ch_mode_put,
  4058. },
  4059. { } /* end */
  4060. };
  4061. static struct hda_verb alc880_test_init_verbs[] = {
  4062. /* Unmute inputs of 0x0c - 0x0f */
  4063. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  4064. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  4065. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  4066. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  4067. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  4068. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  4069. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  4070. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  4071. /* Vol output for 0x0c-0x0f */
  4072. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  4073. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  4074. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  4075. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  4076. /* Set output pins 0x14-0x17 */
  4077. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  4078. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  4079. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  4080. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  4081. /* Unmute output pins 0x14-0x17 */
  4082. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  4083. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  4084. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  4085. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  4086. /* Set input pins 0x18-0x1c */
  4087. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  4088. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  4089. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  4090. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  4091. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  4092. /* Mute input pins 0x18-0x1b */
  4093. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  4094. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  4095. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  4096. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  4097. /* ADC set up */
  4098. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  4099. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  4100. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  4101. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  4102. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  4103. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  4104. /* Analog input/passthru */
  4105. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  4106. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  4107. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  4108. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  4109. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  4110. { }
  4111. };
  4112. #endif
  4113. /*
  4114. */
  4115. static const char * const alc880_models[ALC880_MODEL_LAST] = {
  4116. [ALC880_3ST] = "3stack",
  4117. [ALC880_TCL_S700] = "tcl",
  4118. [ALC880_3ST_DIG] = "3stack-digout",
  4119. [ALC880_CLEVO] = "clevo",
  4120. [ALC880_5ST] = "5stack",
  4121. [ALC880_5ST_DIG] = "5stack-digout",
  4122. [ALC880_W810] = "w810",
  4123. [ALC880_Z71V] = "z71v",
  4124. [ALC880_6ST] = "6stack",
  4125. [ALC880_6ST_DIG] = "6stack-digout",
  4126. [ALC880_ASUS] = "asus",
  4127. [ALC880_ASUS_W1V] = "asus-w1v",
  4128. [ALC880_ASUS_DIG] = "asus-dig",
  4129. [ALC880_ASUS_DIG2] = "asus-dig2",
  4130. [ALC880_UNIWILL_DIG] = "uniwill",
  4131. [ALC880_UNIWILL_P53] = "uniwill-p53",
  4132. [ALC880_FUJITSU] = "fujitsu",
  4133. [ALC880_F1734] = "F1734",
  4134. [ALC880_LG] = "lg",
  4135. [ALC880_LG_LW] = "lg-lw",
  4136. [ALC880_MEDION_RIM] = "medion",
  4137. #ifdef CONFIG_SND_DEBUG
  4138. [ALC880_TEST] = "test",
  4139. #endif
  4140. [ALC880_AUTO] = "auto",
  4141. };
  4142. static struct snd_pci_quirk alc880_cfg_tbl[] = {
  4143. SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
  4144. SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
  4145. SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
  4146. SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
  4147. SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
  4148. SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
  4149. SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
  4150. SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
  4151. SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
  4152. SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
  4153. SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
  4154. SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
  4155. SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
  4156. SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
  4157. SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
  4158. SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
  4159. SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
  4160. SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
  4161. /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
  4162. SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
  4163. SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
  4164. SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
  4165. SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
  4166. SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
  4167. SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
  4168. SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
  4169. SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
  4170. SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
  4171. SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
  4172. SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
  4173. SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
  4174. SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
  4175. SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
  4176. SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
  4177. SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
  4178. SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
  4179. SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
  4180. SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
  4181. SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
  4182. SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
  4183. SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_F1734),
  4184. SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
  4185. SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
  4186. SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
  4187. SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
  4188. SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
  4189. SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
  4190. SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
  4191. SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
  4192. SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
  4193. SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
  4194. SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
  4195. SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
  4196. SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_LG),
  4197. SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
  4198. SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
  4199. SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
  4200. SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
  4201. SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
  4202. SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
  4203. SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
  4204. SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
  4205. SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
  4206. SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
  4207. SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
  4208. SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
  4209. SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
  4210. SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
  4211. SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
  4212. /* default Intel */
  4213. SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
  4214. SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
  4215. SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
  4216. {}
  4217. };
  4218. /*
  4219. * ALC880 codec presets
  4220. */
  4221. static struct alc_config_preset alc880_presets[] = {
  4222. [ALC880_3ST] = {
  4223. .mixers = { alc880_three_stack_mixer },
  4224. .init_verbs = { alc880_volume_init_verbs,
  4225. alc880_pin_3stack_init_verbs },
  4226. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4227. .dac_nids = alc880_dac_nids,
  4228. .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
  4229. .channel_mode = alc880_threestack_modes,
  4230. .need_dac_fix = 1,
  4231. .input_mux = &alc880_capture_source,
  4232. },
  4233. [ALC880_3ST_DIG] = {
  4234. .mixers = { alc880_three_stack_mixer },
  4235. .init_verbs = { alc880_volume_init_verbs,
  4236. alc880_pin_3stack_init_verbs },
  4237. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4238. .dac_nids = alc880_dac_nids,
  4239. .dig_out_nid = ALC880_DIGOUT_NID,
  4240. .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
  4241. .channel_mode = alc880_threestack_modes,
  4242. .need_dac_fix = 1,
  4243. .input_mux = &alc880_capture_source,
  4244. },
  4245. [ALC880_TCL_S700] = {
  4246. .mixers = { alc880_tcl_s700_mixer },
  4247. .init_verbs = { alc880_volume_init_verbs,
  4248. alc880_pin_tcl_S700_init_verbs,
  4249. alc880_gpio2_init_verbs },
  4250. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4251. .dac_nids = alc880_dac_nids,
  4252. .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
  4253. .num_adc_nids = 1, /* single ADC */
  4254. .hp_nid = 0x03,
  4255. .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
  4256. .channel_mode = alc880_2_jack_modes,
  4257. .input_mux = &alc880_capture_source,
  4258. },
  4259. [ALC880_5ST] = {
  4260. .mixers = { alc880_three_stack_mixer,
  4261. alc880_five_stack_mixer},
  4262. .init_verbs = { alc880_volume_init_verbs,
  4263. alc880_pin_5stack_init_verbs },
  4264. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4265. .dac_nids = alc880_dac_nids,
  4266. .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
  4267. .channel_mode = alc880_fivestack_modes,
  4268. .input_mux = &alc880_capture_source,
  4269. },
  4270. [ALC880_5ST_DIG] = {
  4271. .mixers = { alc880_three_stack_mixer,
  4272. alc880_five_stack_mixer },
  4273. .init_verbs = { alc880_volume_init_verbs,
  4274. alc880_pin_5stack_init_verbs },
  4275. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4276. .dac_nids = alc880_dac_nids,
  4277. .dig_out_nid = ALC880_DIGOUT_NID,
  4278. .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
  4279. .channel_mode = alc880_fivestack_modes,
  4280. .input_mux = &alc880_capture_source,
  4281. },
  4282. [ALC880_6ST] = {
  4283. .mixers = { alc880_six_stack_mixer },
  4284. .init_verbs = { alc880_volume_init_verbs,
  4285. alc880_pin_6stack_init_verbs },
  4286. .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
  4287. .dac_nids = alc880_6st_dac_nids,
  4288. .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
  4289. .channel_mode = alc880_sixstack_modes,
  4290. .input_mux = &alc880_6stack_capture_source,
  4291. },
  4292. [ALC880_6ST_DIG] = {
  4293. .mixers = { alc880_six_stack_mixer },
  4294. .init_verbs = { alc880_volume_init_verbs,
  4295. alc880_pin_6stack_init_verbs },
  4296. .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
  4297. .dac_nids = alc880_6st_dac_nids,
  4298. .dig_out_nid = ALC880_DIGOUT_NID,
  4299. .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
  4300. .channel_mode = alc880_sixstack_modes,
  4301. .input_mux = &alc880_6stack_capture_source,
  4302. },
  4303. [ALC880_W810] = {
  4304. .mixers = { alc880_w810_base_mixer },
  4305. .init_verbs = { alc880_volume_init_verbs,
  4306. alc880_pin_w810_init_verbs,
  4307. alc880_gpio2_init_verbs },
  4308. .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
  4309. .dac_nids = alc880_w810_dac_nids,
  4310. .dig_out_nid = ALC880_DIGOUT_NID,
  4311. .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
  4312. .channel_mode = alc880_w810_modes,
  4313. .input_mux = &alc880_capture_source,
  4314. },
  4315. [ALC880_Z71V] = {
  4316. .mixers = { alc880_z71v_mixer },
  4317. .init_verbs = { alc880_volume_init_verbs,
  4318. alc880_pin_z71v_init_verbs },
  4319. .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
  4320. .dac_nids = alc880_z71v_dac_nids,
  4321. .dig_out_nid = ALC880_DIGOUT_NID,
  4322. .hp_nid = 0x03,
  4323. .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
  4324. .channel_mode = alc880_2_jack_modes,
  4325. .input_mux = &alc880_capture_source,
  4326. },
  4327. [ALC880_F1734] = {
  4328. .mixers = { alc880_f1734_mixer },
  4329. .init_verbs = { alc880_volume_init_verbs,
  4330. alc880_pin_f1734_init_verbs },
  4331. .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
  4332. .dac_nids = alc880_f1734_dac_nids,
  4333. .hp_nid = 0x02,
  4334. .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
  4335. .channel_mode = alc880_2_jack_modes,
  4336. .input_mux = &alc880_f1734_capture_source,
  4337. .unsol_event = alc880_uniwill_p53_unsol_event,
  4338. .setup = alc880_uniwill_p53_setup,
  4339. .init_hook = alc_automute_amp,
  4340. },
  4341. [ALC880_ASUS] = {
  4342. .mixers = { alc880_asus_mixer },
  4343. .init_verbs = { alc880_volume_init_verbs,
  4344. alc880_pin_asus_init_verbs,
  4345. alc880_gpio1_init_verbs },
  4346. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4347. .dac_nids = alc880_asus_dac_nids,
  4348. .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
  4349. .channel_mode = alc880_asus_modes,
  4350. .need_dac_fix = 1,
  4351. .input_mux = &alc880_capture_source,
  4352. },
  4353. [ALC880_ASUS_DIG] = {
  4354. .mixers = { alc880_asus_mixer },
  4355. .init_verbs = { alc880_volume_init_verbs,
  4356. alc880_pin_asus_init_verbs,
  4357. alc880_gpio1_init_verbs },
  4358. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4359. .dac_nids = alc880_asus_dac_nids,
  4360. .dig_out_nid = ALC880_DIGOUT_NID,
  4361. .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
  4362. .channel_mode = alc880_asus_modes,
  4363. .need_dac_fix = 1,
  4364. .input_mux = &alc880_capture_source,
  4365. },
  4366. [ALC880_ASUS_DIG2] = {
  4367. .mixers = { alc880_asus_mixer },
  4368. .init_verbs = { alc880_volume_init_verbs,
  4369. alc880_pin_asus_init_verbs,
  4370. alc880_gpio2_init_verbs }, /* use GPIO2 */
  4371. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4372. .dac_nids = alc880_asus_dac_nids,
  4373. .dig_out_nid = ALC880_DIGOUT_NID,
  4374. .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
  4375. .channel_mode = alc880_asus_modes,
  4376. .need_dac_fix = 1,
  4377. .input_mux = &alc880_capture_source,
  4378. },
  4379. [ALC880_ASUS_W1V] = {
  4380. .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
  4381. .init_verbs = { alc880_volume_init_verbs,
  4382. alc880_pin_asus_init_verbs,
  4383. alc880_gpio1_init_verbs },
  4384. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4385. .dac_nids = alc880_asus_dac_nids,
  4386. .dig_out_nid = ALC880_DIGOUT_NID,
  4387. .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
  4388. .channel_mode = alc880_asus_modes,
  4389. .need_dac_fix = 1,
  4390. .input_mux = &alc880_capture_source,
  4391. },
  4392. [ALC880_UNIWILL_DIG] = {
  4393. .mixers = { alc880_asus_mixer },
  4394. .init_verbs = { alc880_volume_init_verbs,
  4395. alc880_pin_asus_init_verbs },
  4396. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4397. .dac_nids = alc880_asus_dac_nids,
  4398. .dig_out_nid = ALC880_DIGOUT_NID,
  4399. .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
  4400. .channel_mode = alc880_asus_modes,
  4401. .need_dac_fix = 1,
  4402. .input_mux = &alc880_capture_source,
  4403. },
  4404. [ALC880_UNIWILL] = {
  4405. .mixers = { alc880_uniwill_mixer },
  4406. .init_verbs = { alc880_volume_init_verbs,
  4407. alc880_uniwill_init_verbs },
  4408. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4409. .dac_nids = alc880_asus_dac_nids,
  4410. .dig_out_nid = ALC880_DIGOUT_NID,
  4411. .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
  4412. .channel_mode = alc880_threestack_modes,
  4413. .need_dac_fix = 1,
  4414. .input_mux = &alc880_capture_source,
  4415. .unsol_event = alc880_uniwill_unsol_event,
  4416. .setup = alc880_uniwill_setup,
  4417. .init_hook = alc880_uniwill_init_hook,
  4418. },
  4419. [ALC880_UNIWILL_P53] = {
  4420. .mixers = { alc880_uniwill_p53_mixer },
  4421. .init_verbs = { alc880_volume_init_verbs,
  4422. alc880_uniwill_p53_init_verbs },
  4423. .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
  4424. .dac_nids = alc880_asus_dac_nids,
  4425. .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
  4426. .channel_mode = alc880_threestack_modes,
  4427. .input_mux = &alc880_capture_source,
  4428. .unsol_event = alc880_uniwill_p53_unsol_event,
  4429. .setup = alc880_uniwill_p53_setup,
  4430. .init_hook = alc_automute_amp,
  4431. },
  4432. [ALC880_FUJITSU] = {
  4433. .mixers = { alc880_fujitsu_mixer },
  4434. .init_verbs = { alc880_volume_init_verbs,
  4435. alc880_uniwill_p53_init_verbs,
  4436. alc880_beep_init_verbs },
  4437. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4438. .dac_nids = alc880_dac_nids,
  4439. .dig_out_nid = ALC880_DIGOUT_NID,
  4440. .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
  4441. .channel_mode = alc880_2_jack_modes,
  4442. .input_mux = &alc880_capture_source,
  4443. .unsol_event = alc880_uniwill_p53_unsol_event,
  4444. .setup = alc880_uniwill_p53_setup,
  4445. .init_hook = alc_automute_amp,
  4446. },
  4447. [ALC880_CLEVO] = {
  4448. .mixers = { alc880_three_stack_mixer },
  4449. .init_verbs = { alc880_volume_init_verbs,
  4450. alc880_pin_clevo_init_verbs },
  4451. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4452. .dac_nids = alc880_dac_nids,
  4453. .hp_nid = 0x03,
  4454. .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
  4455. .channel_mode = alc880_threestack_modes,
  4456. .need_dac_fix = 1,
  4457. .input_mux = &alc880_capture_source,
  4458. },
  4459. [ALC880_LG] = {
  4460. .mixers = { alc880_lg_mixer },
  4461. .init_verbs = { alc880_volume_init_verbs,
  4462. alc880_lg_init_verbs },
  4463. .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
  4464. .dac_nids = alc880_lg_dac_nids,
  4465. .dig_out_nid = ALC880_DIGOUT_NID,
  4466. .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
  4467. .channel_mode = alc880_lg_ch_modes,
  4468. .need_dac_fix = 1,
  4469. .input_mux = &alc880_lg_capture_source,
  4470. .unsol_event = alc_automute_amp_unsol_event,
  4471. .setup = alc880_lg_setup,
  4472. .init_hook = alc_automute_amp,
  4473. #ifdef CONFIG_SND_HDA_POWER_SAVE
  4474. .loopbacks = alc880_lg_loopbacks,
  4475. #endif
  4476. },
  4477. [ALC880_LG_LW] = {
  4478. .mixers = { alc880_lg_lw_mixer },
  4479. .init_verbs = { alc880_volume_init_verbs,
  4480. alc880_lg_lw_init_verbs },
  4481. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4482. .dac_nids = alc880_dac_nids,
  4483. .dig_out_nid = ALC880_DIGOUT_NID,
  4484. .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
  4485. .channel_mode = alc880_lg_lw_modes,
  4486. .input_mux = &alc880_lg_lw_capture_source,
  4487. .unsol_event = alc_automute_amp_unsol_event,
  4488. .setup = alc880_lg_lw_setup,
  4489. .init_hook = alc_automute_amp,
  4490. },
  4491. [ALC880_MEDION_RIM] = {
  4492. .mixers = { alc880_medion_rim_mixer },
  4493. .init_verbs = { alc880_volume_init_verbs,
  4494. alc880_medion_rim_init_verbs,
  4495. alc_gpio2_init_verbs },
  4496. .num_dacs = ARRAY_SIZE(alc880_dac_nids),
  4497. .dac_nids = alc880_dac_nids,
  4498. .dig_out_nid = ALC880_DIGOUT_NID,
  4499. .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
  4500. .channel_mode = alc880_2_jack_modes,
  4501. .input_mux = &alc880_medion_rim_capture_source,
  4502. .unsol_event = alc880_medion_rim_unsol_event,
  4503. .setup = alc880_medion_rim_setup,
  4504. .init_hook = alc880_medion_rim_automute,
  4505. },
  4506. #ifdef CONFIG_SND_DEBUG
  4507. [ALC880_TEST] = {
  4508. .mixers = { alc880_test_mixer },
  4509. .init_verbs = { alc880_test_init_verbs },
  4510. .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
  4511. .dac_nids = alc880_test_dac_nids,
  4512. .dig_out_nid = ALC880_DIGOUT_NID,
  4513. .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
  4514. .channel_mode = alc880_test_modes,
  4515. .input_mux = &alc880_test_capture_source,
  4516. },
  4517. #endif
  4518. };
  4519. /*
  4520. * Automatic parse of I/O pins from the BIOS configuration
  4521. */
  4522. enum {
  4523. ALC_CTL_WIDGET_VOL,
  4524. ALC_CTL_WIDGET_MUTE,
  4525. ALC_CTL_BIND_MUTE,
  4526. };
  4527. static struct snd_kcontrol_new alc880_control_templates[] = {
  4528. HDA_CODEC_VOLUME(NULL, 0, 0, 0),
  4529. HDA_CODEC_MUTE(NULL, 0, 0, 0),
  4530. HDA_BIND_MUTE(NULL, 0, 0, 0),
  4531. };
  4532. /* add dynamic controls */
  4533. static int add_control(struct alc_spec *spec, int type, const char *name,
  4534. int cidx, unsigned long val)
  4535. {
  4536. struct snd_kcontrol_new *knew;
  4537. snd_array_init(&spec->kctls, sizeof(*knew), 32);
  4538. knew = snd_array_new(&spec->kctls);
  4539. if (!knew)
  4540. return -ENOMEM;
  4541. *knew = alc880_control_templates[type];
  4542. knew->name = kstrdup(name, GFP_KERNEL);
  4543. if (!knew->name)
  4544. return -ENOMEM;
  4545. knew->index = cidx;
  4546. if (get_amp_nid_(val))
  4547. knew->subdevice = HDA_SUBDEV_AMP_FLAG;
  4548. knew->private_value = val;
  4549. return 0;
  4550. }
  4551. static int add_control_with_pfx(struct alc_spec *spec, int type,
  4552. const char *pfx, const char *dir,
  4553. const char *sfx, int cidx, unsigned long val)
  4554. {
  4555. char name[32];
  4556. snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
  4557. return add_control(spec, type, name, cidx, val);
  4558. }
  4559. #define add_pb_vol_ctrl(spec, type, pfx, val) \
  4560. add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
  4561. #define add_pb_sw_ctrl(spec, type, pfx, val) \
  4562. add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
  4563. #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
  4564. add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
  4565. #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
  4566. add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
  4567. #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
  4568. #define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
  4569. #define alc880_is_multi_pin(nid) ((nid) >= 0x18)
  4570. #define alc880_multi_pin_idx(nid) ((nid) - 0x18)
  4571. #define alc880_idx_to_dac(nid) ((nid) + 0x02)
  4572. #define alc880_dac_to_idx(nid) ((nid) - 0x02)
  4573. #define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
  4574. #define alc880_idx_to_selector(nid) ((nid) + 0x10)
  4575. #define ALC880_PIN_CD_NID 0x1c
  4576. /* fill in the dac_nids table from the parsed pin configuration */
  4577. static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
  4578. const struct auto_pin_cfg *cfg)
  4579. {
  4580. hda_nid_t nid;
  4581. int assigned[4];
  4582. int i, j;
  4583. memset(assigned, 0, sizeof(assigned));
  4584. spec->multiout.dac_nids = spec->private_dac_nids;
  4585. /* check the pins hardwired to audio widget */
  4586. for (i = 0; i < cfg->line_outs; i++) {
  4587. nid = cfg->line_out_pins[i];
  4588. if (alc880_is_fixed_pin(nid)) {
  4589. int idx = alc880_fixed_pin_idx(nid);
  4590. spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
  4591. assigned[idx] = 1;
  4592. }
  4593. }
  4594. /* left pins can be connect to any audio widget */
  4595. for (i = 0; i < cfg->line_outs; i++) {
  4596. nid = cfg->line_out_pins[i];
  4597. if (alc880_is_fixed_pin(nid))
  4598. continue;
  4599. /* search for an empty channel */
  4600. for (j = 0; j < cfg->line_outs; j++) {
  4601. if (!assigned[j]) {
  4602. spec->multiout.dac_nids[i] =
  4603. alc880_idx_to_dac(j);
  4604. assigned[j] = 1;
  4605. break;
  4606. }
  4607. }
  4608. }
  4609. spec->multiout.num_dacs = cfg->line_outs;
  4610. return 0;
  4611. }
  4612. static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg,
  4613. bool can_be_master)
  4614. {
  4615. if (!cfg->hp_outs && !cfg->speaker_outs && can_be_master)
  4616. return "Master";
  4617. switch (cfg->line_out_type) {
  4618. case AUTO_PIN_SPEAKER_OUT:
  4619. if (cfg->line_outs == 1)
  4620. return "Speaker";
  4621. break;
  4622. case AUTO_PIN_HP_OUT:
  4623. return "Headphone";
  4624. default:
  4625. if (cfg->line_outs == 1)
  4626. return "PCM";
  4627. break;
  4628. }
  4629. return NULL;
  4630. }
  4631. /* add playback controls from the parsed DAC table */
  4632. static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
  4633. const struct auto_pin_cfg *cfg)
  4634. {
  4635. static const char * const chname[4] = {
  4636. "Front", "Surround", NULL /*CLFE*/, "Side"
  4637. };
  4638. const char *pfx = alc_get_line_out_pfx(cfg, false);
  4639. hda_nid_t nid;
  4640. int i, err;
  4641. for (i = 0; i < cfg->line_outs; i++) {
  4642. if (!spec->multiout.dac_nids[i])
  4643. continue;
  4644. nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
  4645. if (!pfx && i == 2) {
  4646. /* Center/LFE */
  4647. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
  4648. "Center",
  4649. HDA_COMPOSE_AMP_VAL(nid, 1, 0,
  4650. HDA_OUTPUT));
  4651. if (err < 0)
  4652. return err;
  4653. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
  4654. "LFE",
  4655. HDA_COMPOSE_AMP_VAL(nid, 2, 0,
  4656. HDA_OUTPUT));
  4657. if (err < 0)
  4658. return err;
  4659. err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
  4660. "Center",
  4661. HDA_COMPOSE_AMP_VAL(nid, 1, 2,
  4662. HDA_INPUT));
  4663. if (err < 0)
  4664. return err;
  4665. err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
  4666. "LFE",
  4667. HDA_COMPOSE_AMP_VAL(nid, 2, 2,
  4668. HDA_INPUT));
  4669. if (err < 0)
  4670. return err;
  4671. } else {
  4672. const char *name = pfx;
  4673. int index = i;
  4674. if (!name) {
  4675. name = chname[i];
  4676. index = 0;
  4677. }
  4678. err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
  4679. name, index,
  4680. HDA_COMPOSE_AMP_VAL(nid, 3, 0,
  4681. HDA_OUTPUT));
  4682. if (err < 0)
  4683. return err;
  4684. err = __add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
  4685. name, index,
  4686. HDA_COMPOSE_AMP_VAL(nid, 3, 2,
  4687. HDA_INPUT));
  4688. if (err < 0)
  4689. return err;
  4690. }
  4691. }
  4692. return 0;
  4693. }
  4694. /* add playback controls for speaker and HP outputs */
  4695. static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
  4696. const char *pfx)
  4697. {
  4698. hda_nid_t nid;
  4699. int err;
  4700. if (!pin)
  4701. return 0;
  4702. if (alc880_is_fixed_pin(pin)) {
  4703. nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
  4704. /* specify the DAC as the extra output */
  4705. if (!spec->multiout.hp_nid)
  4706. spec->multiout.hp_nid = nid;
  4707. else
  4708. spec->multiout.extra_out_nid[0] = nid;
  4709. /* control HP volume/switch on the output mixer amp */
  4710. nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
  4711. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
  4712. HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
  4713. if (err < 0)
  4714. return err;
  4715. err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
  4716. HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
  4717. if (err < 0)
  4718. return err;
  4719. } else if (alc880_is_multi_pin(pin)) {
  4720. /* set manual connection */
  4721. /* we have only a switch on HP-out PIN */
  4722. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
  4723. HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
  4724. if (err < 0)
  4725. return err;
  4726. }
  4727. return 0;
  4728. }
  4729. /* create input playback/capture controls for the given pin */
  4730. static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
  4731. const char *ctlname, int ctlidx,
  4732. int idx, hda_nid_t mix_nid)
  4733. {
  4734. int err;
  4735. err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx,
  4736. HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
  4737. if (err < 0)
  4738. return err;
  4739. err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx,
  4740. HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
  4741. if (err < 0)
  4742. return err;
  4743. return 0;
  4744. }
  4745. static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
  4746. {
  4747. unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
  4748. return (pincap & AC_PINCAP_IN) != 0;
  4749. }
  4750. /* create playback/capture controls for input pins */
  4751. static int alc_auto_create_input_ctls(struct hda_codec *codec,
  4752. const struct auto_pin_cfg *cfg,
  4753. hda_nid_t mixer,
  4754. hda_nid_t cap1, hda_nid_t cap2)
  4755. {
  4756. struct alc_spec *spec = codec->spec;
  4757. struct hda_input_mux *imux = &spec->private_imux[0];
  4758. int i, err, idx, type_idx = 0;
  4759. const char *prev_label = NULL;
  4760. for (i = 0; i < cfg->num_inputs; i++) {
  4761. hda_nid_t pin;
  4762. const char *label;
  4763. pin = cfg->inputs[i].pin;
  4764. if (!alc_is_input_pin(codec, pin))
  4765. continue;
  4766. label = hda_get_autocfg_input_label(codec, cfg, i);
  4767. if (prev_label && !strcmp(label, prev_label))
  4768. type_idx++;
  4769. else
  4770. type_idx = 0;
  4771. prev_label = label;
  4772. if (mixer) {
  4773. idx = get_connection_index(codec, mixer, pin);
  4774. if (idx >= 0) {
  4775. err = new_analog_input(spec, pin,
  4776. label, type_idx,
  4777. idx, mixer);
  4778. if (err < 0)
  4779. return err;
  4780. }
  4781. }
  4782. if (!cap1)
  4783. continue;
  4784. idx = get_connection_index(codec, cap1, pin);
  4785. if (idx < 0 && cap2)
  4786. idx = get_connection_index(codec, cap2, pin);
  4787. if (idx >= 0)
  4788. snd_hda_add_imux_item(imux, label, idx, NULL);
  4789. }
  4790. return 0;
  4791. }
  4792. static int alc880_auto_create_input_ctls(struct hda_codec *codec,
  4793. const struct auto_pin_cfg *cfg)
  4794. {
  4795. return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
  4796. }
  4797. static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
  4798. unsigned int pin_type)
  4799. {
  4800. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  4801. pin_type);
  4802. /* unmute pin */
  4803. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
  4804. AMP_OUT_UNMUTE);
  4805. }
  4806. static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
  4807. hda_nid_t nid, int pin_type,
  4808. int dac_idx)
  4809. {
  4810. alc_set_pin_output(codec, nid, pin_type);
  4811. /* need the manual connection? */
  4812. if (alc880_is_multi_pin(nid)) {
  4813. struct alc_spec *spec = codec->spec;
  4814. int idx = alc880_multi_pin_idx(nid);
  4815. snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
  4816. AC_VERB_SET_CONNECT_SEL,
  4817. alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
  4818. }
  4819. }
  4820. static int get_pin_type(int line_out_type)
  4821. {
  4822. if (line_out_type == AUTO_PIN_HP_OUT)
  4823. return PIN_HP;
  4824. else
  4825. return PIN_OUT;
  4826. }
  4827. static void alc880_auto_init_multi_out(struct hda_codec *codec)
  4828. {
  4829. struct alc_spec *spec = codec->spec;
  4830. int i;
  4831. for (i = 0; i < spec->autocfg.line_outs; i++) {
  4832. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  4833. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  4834. alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
  4835. }
  4836. }
  4837. static void alc880_auto_init_extra_out(struct hda_codec *codec)
  4838. {
  4839. struct alc_spec *spec = codec->spec;
  4840. hda_nid_t pin;
  4841. pin = spec->autocfg.speaker_pins[0];
  4842. if (pin) /* connect to front */
  4843. alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
  4844. pin = spec->autocfg.hp_pins[0];
  4845. if (pin) /* connect to front */
  4846. alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
  4847. }
  4848. static void alc880_auto_init_analog_input(struct hda_codec *codec)
  4849. {
  4850. struct alc_spec *spec = codec->spec;
  4851. struct auto_pin_cfg *cfg = &spec->autocfg;
  4852. int i;
  4853. for (i = 0; i < cfg->num_inputs; i++) {
  4854. hda_nid_t nid = cfg->inputs[i].pin;
  4855. if (alc_is_input_pin(codec, nid)) {
  4856. alc_set_input_pin(codec, nid, cfg->inputs[i].type);
  4857. if (nid != ALC880_PIN_CD_NID &&
  4858. (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
  4859. snd_hda_codec_write(codec, nid, 0,
  4860. AC_VERB_SET_AMP_GAIN_MUTE,
  4861. AMP_OUT_MUTE);
  4862. }
  4863. }
  4864. }
  4865. static void alc880_auto_init_input_src(struct hda_codec *codec)
  4866. {
  4867. struct alc_spec *spec = codec->spec;
  4868. int c;
  4869. for (c = 0; c < spec->num_adc_nids; c++) {
  4870. unsigned int mux_idx;
  4871. const struct hda_input_mux *imux;
  4872. mux_idx = c >= spec->num_mux_defs ? 0 : c;
  4873. imux = &spec->input_mux[mux_idx];
  4874. if (!imux->num_items && mux_idx > 0)
  4875. imux = &spec->input_mux[0];
  4876. if (imux)
  4877. snd_hda_codec_write(codec, spec->adc_nids[c], 0,
  4878. AC_VERB_SET_CONNECT_SEL,
  4879. imux->items[0].index);
  4880. }
  4881. }
  4882. /* parse the BIOS configuration and set up the alc_spec */
  4883. /* return 1 if successful, 0 if the proper config is not found,
  4884. * or a negative error code
  4885. */
  4886. static int alc880_parse_auto_config(struct hda_codec *codec)
  4887. {
  4888. struct alc_spec *spec = codec->spec;
  4889. int err;
  4890. static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
  4891. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  4892. alc880_ignore);
  4893. if (err < 0)
  4894. return err;
  4895. if (!spec->autocfg.line_outs)
  4896. return 0; /* can't find valid BIOS pin config */
  4897. err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
  4898. if (err < 0)
  4899. return err;
  4900. err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
  4901. if (err < 0)
  4902. return err;
  4903. err = alc880_auto_create_extra_out(spec,
  4904. spec->autocfg.speaker_pins[0],
  4905. "Speaker");
  4906. if (err < 0)
  4907. return err;
  4908. err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
  4909. "Headphone");
  4910. if (err < 0)
  4911. return err;
  4912. err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
  4913. if (err < 0)
  4914. return err;
  4915. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  4916. alc_auto_parse_digital(codec);
  4917. if (spec->kctls.list)
  4918. add_mixer(spec, spec->kctls.list);
  4919. add_verb(spec, alc880_volume_init_verbs);
  4920. spec->num_mux_defs = 1;
  4921. spec->input_mux = &spec->private_imux[0];
  4922. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  4923. return 1;
  4924. }
  4925. /* additional initialization for auto-configuration model */
  4926. static void alc880_auto_init(struct hda_codec *codec)
  4927. {
  4928. struct alc_spec *spec = codec->spec;
  4929. alc880_auto_init_multi_out(codec);
  4930. alc880_auto_init_extra_out(codec);
  4931. alc880_auto_init_analog_input(codec);
  4932. alc880_auto_init_input_src(codec);
  4933. alc_auto_init_digital(codec);
  4934. if (spec->unsol_event)
  4935. alc_inithook(codec);
  4936. }
  4937. /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
  4938. * one of two digital mic pins, e.g. on ALC272
  4939. */
  4940. static void fixup_automic_adc(struct hda_codec *codec)
  4941. {
  4942. struct alc_spec *spec = codec->spec;
  4943. int i;
  4944. for (i = 0; i < spec->num_adc_nids; i++) {
  4945. hda_nid_t cap = spec->capsrc_nids ?
  4946. spec->capsrc_nids[i] : spec->adc_nids[i];
  4947. int iidx, eidx;
  4948. iidx = get_connection_index(codec, cap, spec->int_mic.pin);
  4949. if (iidx < 0)
  4950. continue;
  4951. eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
  4952. if (eidx < 0)
  4953. continue;
  4954. spec->int_mic.mux_idx = iidx;
  4955. spec->ext_mic.mux_idx = eidx;
  4956. if (spec->capsrc_nids)
  4957. spec->capsrc_nids += i;
  4958. spec->adc_nids += i;
  4959. spec->num_adc_nids = 1;
  4960. return;
  4961. }
  4962. snd_printd(KERN_INFO "hda_codec: %s: "
  4963. "No ADC/MUX containing both 0x%x and 0x%x pins\n",
  4964. codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
  4965. spec->auto_mic = 0; /* disable auto-mic to be sure */
  4966. }
  4967. /* select or unmute the given capsrc route */
  4968. static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
  4969. int idx)
  4970. {
  4971. if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
  4972. snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
  4973. HDA_AMP_MUTE, 0);
  4974. } else {
  4975. snd_hda_codec_write_cache(codec, cap, 0,
  4976. AC_VERB_SET_CONNECT_SEL, idx);
  4977. }
  4978. }
  4979. /* set the default connection to that pin */
  4980. static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
  4981. {
  4982. struct alc_spec *spec = codec->spec;
  4983. int i;
  4984. for (i = 0; i < spec->num_adc_nids; i++) {
  4985. hda_nid_t cap = spec->capsrc_nids ?
  4986. spec->capsrc_nids[i] : spec->adc_nids[i];
  4987. int idx;
  4988. idx = get_connection_index(codec, cap, pin);
  4989. if (idx < 0)
  4990. continue;
  4991. select_or_unmute_capsrc(codec, cap, idx);
  4992. return i; /* return the found index */
  4993. }
  4994. return -1; /* not found */
  4995. }
  4996. /* choose the ADC/MUX containing the input pin and initialize the setup */
  4997. static void fixup_single_adc(struct hda_codec *codec)
  4998. {
  4999. struct alc_spec *spec = codec->spec;
  5000. struct auto_pin_cfg *cfg = &spec->autocfg;
  5001. int i;
  5002. /* search for the input pin; there must be only one */
  5003. if (cfg->num_inputs != 1)
  5004. return;
  5005. i = init_capsrc_for_pin(codec, cfg->inputs[0].pin);
  5006. if (i >= 0) {
  5007. /* use only this ADC */
  5008. if (spec->capsrc_nids)
  5009. spec->capsrc_nids += i;
  5010. spec->adc_nids += i;
  5011. spec->num_adc_nids = 1;
  5012. spec->single_input_src = 1;
  5013. }
  5014. }
  5015. /* initialize dual adcs */
  5016. static void fixup_dual_adc_switch(struct hda_codec *codec)
  5017. {
  5018. struct alc_spec *spec = codec->spec;
  5019. init_capsrc_for_pin(codec, spec->ext_mic.pin);
  5020. init_capsrc_for_pin(codec, spec->int_mic.pin);
  5021. }
  5022. /* initialize some special cases for input sources */
  5023. static void alc_init_special_input_src(struct hda_codec *codec)
  5024. {
  5025. struct alc_spec *spec = codec->spec;
  5026. if (spec->dual_adc_switch)
  5027. fixup_dual_adc_switch(codec);
  5028. else if (spec->single_input_src)
  5029. init_capsrc_for_pin(codec, spec->autocfg.inputs[0].pin);
  5030. }
  5031. static void set_capture_mixer(struct hda_codec *codec)
  5032. {
  5033. struct alc_spec *spec = codec->spec;
  5034. static struct snd_kcontrol_new *caps[2][3] = {
  5035. { alc_capture_mixer_nosrc1,
  5036. alc_capture_mixer_nosrc2,
  5037. alc_capture_mixer_nosrc3 },
  5038. { alc_capture_mixer1,
  5039. alc_capture_mixer2,
  5040. alc_capture_mixer3 },
  5041. };
  5042. if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
  5043. int mux = 0;
  5044. int num_adcs = spec->num_adc_nids;
  5045. if (spec->dual_adc_switch)
  5046. num_adcs = 1;
  5047. else if (spec->auto_mic)
  5048. fixup_automic_adc(codec);
  5049. else if (spec->input_mux) {
  5050. if (spec->input_mux->num_items > 1)
  5051. mux = 1;
  5052. else if (spec->input_mux->num_items == 1)
  5053. fixup_single_adc(codec);
  5054. }
  5055. spec->cap_mixer = caps[mux][num_adcs - 1];
  5056. }
  5057. }
  5058. /* fill adc_nids (and capsrc_nids) containing all active input pins */
  5059. static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
  5060. int num_nids)
  5061. {
  5062. struct alc_spec *spec = codec->spec;
  5063. struct auto_pin_cfg *cfg = &spec->autocfg;
  5064. int n;
  5065. hda_nid_t fallback_adc = 0, fallback_cap = 0;
  5066. for (n = 0; n < num_nids; n++) {
  5067. hda_nid_t adc, cap;
  5068. hda_nid_t conn[HDA_MAX_NUM_INPUTS];
  5069. int nconns, i, j;
  5070. adc = nids[n];
  5071. if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
  5072. continue;
  5073. cap = adc;
  5074. nconns = snd_hda_get_connections(codec, cap, conn,
  5075. ARRAY_SIZE(conn));
  5076. if (nconns == 1) {
  5077. cap = conn[0];
  5078. nconns = snd_hda_get_connections(codec, cap, conn,
  5079. ARRAY_SIZE(conn));
  5080. }
  5081. if (nconns <= 0)
  5082. continue;
  5083. if (!fallback_adc) {
  5084. fallback_adc = adc;
  5085. fallback_cap = cap;
  5086. }
  5087. for (i = 0; i < cfg->num_inputs; i++) {
  5088. hda_nid_t nid = cfg->inputs[i].pin;
  5089. for (j = 0; j < nconns; j++) {
  5090. if (conn[j] == nid)
  5091. break;
  5092. }
  5093. if (j >= nconns)
  5094. break;
  5095. }
  5096. if (i >= cfg->num_inputs) {
  5097. int num_adcs = spec->num_adc_nids;
  5098. spec->private_adc_nids[num_adcs] = adc;
  5099. spec->private_capsrc_nids[num_adcs] = cap;
  5100. spec->num_adc_nids++;
  5101. spec->adc_nids = spec->private_adc_nids;
  5102. if (adc != cap)
  5103. spec->capsrc_nids = spec->private_capsrc_nids;
  5104. }
  5105. }
  5106. if (!spec->num_adc_nids) {
  5107. printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
  5108. " using fallback 0x%x\n",
  5109. codec->chip_name, fallback_adc);
  5110. spec->private_adc_nids[0] = fallback_adc;
  5111. spec->adc_nids = spec->private_adc_nids;
  5112. if (fallback_adc != fallback_cap) {
  5113. spec->private_capsrc_nids[0] = fallback_cap;
  5114. spec->capsrc_nids = spec->private_adc_nids;
  5115. }
  5116. }
  5117. }
  5118. #ifdef CONFIG_SND_HDA_INPUT_BEEP
  5119. #define set_beep_amp(spec, nid, idx, dir) \
  5120. ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
  5121. static struct snd_pci_quirk beep_white_list[] = {
  5122. SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
  5123. SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
  5124. SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
  5125. {}
  5126. };
  5127. static inline int has_cdefine_beep(struct hda_codec *codec)
  5128. {
  5129. struct alc_spec *spec = codec->spec;
  5130. const struct snd_pci_quirk *q;
  5131. q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
  5132. if (q)
  5133. return q->value;
  5134. return spec->cdefine.enable_pcbeep;
  5135. }
  5136. #else
  5137. #define set_beep_amp(spec, nid, idx, dir) /* NOP */
  5138. #define has_cdefine_beep(codec) 0
  5139. #endif
  5140. /*
  5141. * OK, here we have finally the patch for ALC880
  5142. */
  5143. static int patch_alc880(struct hda_codec *codec)
  5144. {
  5145. struct alc_spec *spec;
  5146. int board_config;
  5147. int err;
  5148. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  5149. if (spec == NULL)
  5150. return -ENOMEM;
  5151. codec->spec = spec;
  5152. board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
  5153. alc880_models,
  5154. alc880_cfg_tbl);
  5155. if (board_config < 0) {
  5156. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  5157. codec->chip_name);
  5158. board_config = ALC880_AUTO;
  5159. }
  5160. if (board_config == ALC880_AUTO) {
  5161. /* automatic parse from the BIOS config */
  5162. err = alc880_parse_auto_config(codec);
  5163. if (err < 0) {
  5164. alc_free(codec);
  5165. return err;
  5166. } else if (!err) {
  5167. printk(KERN_INFO
  5168. "hda_codec: Cannot set up configuration "
  5169. "from BIOS. Using 3-stack mode...\n");
  5170. board_config = ALC880_3ST;
  5171. }
  5172. }
  5173. err = snd_hda_attach_beep_device(codec, 0x1);
  5174. if (err < 0) {
  5175. alc_free(codec);
  5176. return err;
  5177. }
  5178. if (board_config != ALC880_AUTO)
  5179. setup_preset(codec, &alc880_presets[board_config]);
  5180. spec->stream_analog_playback = &alc880_pcm_analog_playback;
  5181. spec->stream_analog_capture = &alc880_pcm_analog_capture;
  5182. spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
  5183. spec->stream_digital_playback = &alc880_pcm_digital_playback;
  5184. spec->stream_digital_capture = &alc880_pcm_digital_capture;
  5185. if (!spec->adc_nids && spec->input_mux) {
  5186. /* check whether NID 0x07 is valid */
  5187. unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
  5188. /* get type */
  5189. wcap = get_wcaps_type(wcap);
  5190. if (wcap != AC_WID_AUD_IN) {
  5191. spec->adc_nids = alc880_adc_nids_alt;
  5192. spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
  5193. } else {
  5194. spec->adc_nids = alc880_adc_nids;
  5195. spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
  5196. }
  5197. }
  5198. set_capture_mixer(codec);
  5199. set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
  5200. spec->vmaster_nid = 0x0c;
  5201. codec->patch_ops = alc_patch_ops;
  5202. if (board_config == ALC880_AUTO)
  5203. spec->init_hook = alc880_auto_init;
  5204. #ifdef CONFIG_SND_HDA_POWER_SAVE
  5205. if (!spec->loopback.amplist)
  5206. spec->loopback.amplist = alc880_loopbacks;
  5207. #endif
  5208. return 0;
  5209. }
  5210. /*
  5211. * ALC260 support
  5212. */
  5213. static hda_nid_t alc260_dac_nids[1] = {
  5214. /* front */
  5215. 0x02,
  5216. };
  5217. static hda_nid_t alc260_adc_nids[1] = {
  5218. /* ADC0 */
  5219. 0x04,
  5220. };
  5221. static hda_nid_t alc260_adc_nids_alt[1] = {
  5222. /* ADC1 */
  5223. 0x05,
  5224. };
  5225. /* NIDs used when simultaneous access to both ADCs makes sense. Note that
  5226. * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
  5227. */
  5228. static hda_nid_t alc260_dual_adc_nids[2] = {
  5229. /* ADC0, ADC1 */
  5230. 0x04, 0x05
  5231. };
  5232. #define ALC260_DIGOUT_NID 0x03
  5233. #define ALC260_DIGIN_NID 0x06
  5234. static struct hda_input_mux alc260_capture_source = {
  5235. .num_items = 4,
  5236. .items = {
  5237. { "Mic", 0x0 },
  5238. { "Front Mic", 0x1 },
  5239. { "Line", 0x2 },
  5240. { "CD", 0x4 },
  5241. },
  5242. };
  5243. /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
  5244. * headphone jack and the internal CD lines since these are the only pins at
  5245. * which audio can appear. For flexibility, also allow the option of
  5246. * recording the mixer output on the second ADC (ADC0 doesn't have a
  5247. * connection to the mixer output).
  5248. */
  5249. static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
  5250. {
  5251. .num_items = 3,
  5252. .items = {
  5253. { "Mic/Line", 0x0 },
  5254. { "CD", 0x4 },
  5255. { "Headphone", 0x2 },
  5256. },
  5257. },
  5258. {
  5259. .num_items = 4,
  5260. .items = {
  5261. { "Mic/Line", 0x0 },
  5262. { "CD", 0x4 },
  5263. { "Headphone", 0x2 },
  5264. { "Mixer", 0x5 },
  5265. },
  5266. },
  5267. };
  5268. /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
  5269. * the Fujitsu S702x, but jacks are marked differently.
  5270. */
  5271. static struct hda_input_mux alc260_acer_capture_sources[2] = {
  5272. {
  5273. .num_items = 4,
  5274. .items = {
  5275. { "Mic", 0x0 },
  5276. { "Line", 0x2 },
  5277. { "CD", 0x4 },
  5278. { "Headphone", 0x5 },
  5279. },
  5280. },
  5281. {
  5282. .num_items = 5,
  5283. .items = {
  5284. { "Mic", 0x0 },
  5285. { "Line", 0x2 },
  5286. { "CD", 0x4 },
  5287. { "Headphone", 0x6 },
  5288. { "Mixer", 0x5 },
  5289. },
  5290. },
  5291. };
  5292. /* Maxdata Favorit 100XS */
  5293. static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
  5294. {
  5295. .num_items = 2,
  5296. .items = {
  5297. { "Line/Mic", 0x0 },
  5298. { "CD", 0x4 },
  5299. },
  5300. },
  5301. {
  5302. .num_items = 3,
  5303. .items = {
  5304. { "Line/Mic", 0x0 },
  5305. { "CD", 0x4 },
  5306. { "Mixer", 0x5 },
  5307. },
  5308. },
  5309. };
  5310. /*
  5311. * This is just place-holder, so there's something for alc_build_pcms to look
  5312. * at when it calculates the maximum number of channels. ALC260 has no mixer
  5313. * element which allows changing the channel mode, so the verb list is
  5314. * never used.
  5315. */
  5316. static struct hda_channel_mode alc260_modes[1] = {
  5317. { 2, NULL },
  5318. };
  5319. /* Mixer combinations
  5320. *
  5321. * basic: base_output + input + pc_beep + capture
  5322. * HP: base_output + input + capture_alt
  5323. * HP_3013: hp_3013 + input + capture
  5324. * fujitsu: fujitsu + capture
  5325. * acer: acer + capture
  5326. */
  5327. static struct snd_kcontrol_new alc260_base_output_mixer[] = {
  5328. HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5329. HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
  5330. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
  5331. HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
  5332. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
  5333. HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
  5334. { } /* end */
  5335. };
  5336. static struct snd_kcontrol_new alc260_input_mixer[] = {
  5337. HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
  5338. HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
  5339. HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
  5340. HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
  5341. HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
  5342. HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
  5343. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
  5344. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
  5345. { } /* end */
  5346. };
  5347. /* update HP, line and mono out pins according to the master switch */
  5348. static void alc260_hp_master_update(struct hda_codec *codec,
  5349. hda_nid_t hp, hda_nid_t line,
  5350. hda_nid_t mono)
  5351. {
  5352. struct alc_spec *spec = codec->spec;
  5353. unsigned int val = spec->master_sw ? PIN_HP : 0;
  5354. /* change HP and line-out pins */
  5355. snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  5356. val);
  5357. snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  5358. val);
  5359. /* mono (speaker) depending on the HP jack sense */
  5360. val = (val && !spec->jack_present) ? PIN_OUT : 0;
  5361. snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  5362. val);
  5363. }
  5364. static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
  5365. struct snd_ctl_elem_value *ucontrol)
  5366. {
  5367. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  5368. struct alc_spec *spec = codec->spec;
  5369. *ucontrol->value.integer.value = spec->master_sw;
  5370. return 0;
  5371. }
  5372. static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
  5373. struct snd_ctl_elem_value *ucontrol)
  5374. {
  5375. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  5376. struct alc_spec *spec = codec->spec;
  5377. int val = !!*ucontrol->value.integer.value;
  5378. hda_nid_t hp, line, mono;
  5379. if (val == spec->master_sw)
  5380. return 0;
  5381. spec->master_sw = val;
  5382. hp = (kcontrol->private_value >> 16) & 0xff;
  5383. line = (kcontrol->private_value >> 8) & 0xff;
  5384. mono = kcontrol->private_value & 0xff;
  5385. alc260_hp_master_update(codec, hp, line, mono);
  5386. return 1;
  5387. }
  5388. static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
  5389. {
  5390. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  5391. .name = "Master Playback Switch",
  5392. .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
  5393. .info = snd_ctl_boolean_mono_info,
  5394. .get = alc260_hp_master_sw_get,
  5395. .put = alc260_hp_master_sw_put,
  5396. .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
  5397. },
  5398. HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5399. HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
  5400. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
  5401. HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
  5402. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
  5403. HDA_OUTPUT),
  5404. HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
  5405. { } /* end */
  5406. };
  5407. static struct hda_verb alc260_hp_unsol_verbs[] = {
  5408. {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  5409. {},
  5410. };
  5411. static void alc260_hp_automute(struct hda_codec *codec)
  5412. {
  5413. struct alc_spec *spec = codec->spec;
  5414. spec->jack_present = snd_hda_jack_detect(codec, 0x10);
  5415. alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
  5416. }
  5417. static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
  5418. {
  5419. if ((res >> 26) == ALC880_HP_EVENT)
  5420. alc260_hp_automute(codec);
  5421. }
  5422. static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
  5423. {
  5424. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  5425. .name = "Master Playback Switch",
  5426. .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
  5427. .info = snd_ctl_boolean_mono_info,
  5428. .get = alc260_hp_master_sw_get,
  5429. .put = alc260_hp_master_sw_put,
  5430. .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
  5431. },
  5432. HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
  5433. HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
  5434. HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
  5435. HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
  5436. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5437. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  5438. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
  5439. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
  5440. { } /* end */
  5441. };
  5442. static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
  5443. .ops = &snd_hda_bind_vol,
  5444. .values = {
  5445. HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
  5446. HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
  5447. HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
  5448. 0
  5449. },
  5450. };
  5451. static struct hda_bind_ctls alc260_dc7600_bind_switch = {
  5452. .ops = &snd_hda_bind_sw,
  5453. .values = {
  5454. HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
  5455. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  5456. 0
  5457. },
  5458. };
  5459. static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
  5460. HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
  5461. HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
  5462. HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
  5463. HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
  5464. { } /* end */
  5465. };
  5466. static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
  5467. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  5468. {},
  5469. };
  5470. static void alc260_hp_3013_automute(struct hda_codec *codec)
  5471. {
  5472. struct alc_spec *spec = codec->spec;
  5473. spec->jack_present = snd_hda_jack_detect(codec, 0x15);
  5474. alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
  5475. }
  5476. static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
  5477. unsigned int res)
  5478. {
  5479. if ((res >> 26) == ALC880_HP_EVENT)
  5480. alc260_hp_3013_automute(codec);
  5481. }
  5482. static void alc260_hp_3012_automute(struct hda_codec *codec)
  5483. {
  5484. unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
  5485. snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  5486. bits);
  5487. snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  5488. bits);
  5489. snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  5490. bits);
  5491. }
  5492. static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
  5493. unsigned int res)
  5494. {
  5495. if ((res >> 26) == ALC880_HP_EVENT)
  5496. alc260_hp_3012_automute(codec);
  5497. }
  5498. /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
  5499. * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
  5500. */
  5501. static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
  5502. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5503. HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
  5504. ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
  5505. HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
  5506. HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
  5507. HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
  5508. HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
  5509. ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
  5510. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
  5511. HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
  5512. { } /* end */
  5513. };
  5514. /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
  5515. * versions of the ALC260 don't act on requests to enable mic bias from NID
  5516. * 0x0f (used to drive the headphone jack in these laptops). The ALC260
  5517. * datasheet doesn't mention this restriction. At this stage it's not clear
  5518. * whether this behaviour is intentional or is a hardware bug in chip
  5519. * revisions available in early 2006. Therefore for now allow the
  5520. * "Headphone Jack Mode" control to span all choices, but if it turns out
  5521. * that the lack of mic bias for this NID is intentional we could change the
  5522. * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
  5523. *
  5524. * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
  5525. * don't appear to make the mic bias available from the "line" jack, even
  5526. * though the NID used for this jack (0x14) can supply it. The theory is
  5527. * that perhaps Acer have included blocking capacitors between the ALC260
  5528. * and the output jack. If this turns out to be the case for all such
  5529. * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
  5530. * to ALC_PIN_DIR_INOUT_NOMICBIAS.
  5531. *
  5532. * The C20x Tablet series have a mono internal speaker which is controlled
  5533. * via the chip's Mono sum widget and pin complex, so include the necessary
  5534. * controls for such models. On models without a "mono speaker" the control
  5535. * won't do anything.
  5536. */
  5537. static struct snd_kcontrol_new alc260_acer_mixer[] = {
  5538. HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5539. HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
  5540. ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
  5541. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
  5542. HDA_OUTPUT),
  5543. HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
  5544. HDA_INPUT),
  5545. HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
  5546. HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
  5547. HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
  5548. HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
  5549. ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
  5550. HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
  5551. HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
  5552. ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
  5553. { } /* end */
  5554. };
  5555. /* Maxdata Favorit 100XS: one output and one input (0x12) jack
  5556. */
  5557. static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
  5558. HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5559. HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
  5560. ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
  5561. HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
  5562. HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
  5563. ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
  5564. { } /* end */
  5565. };
  5566. /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
  5567. * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
  5568. */
  5569. static struct snd_kcontrol_new alc260_will_mixer[] = {
  5570. HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5571. HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
  5572. HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
  5573. HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
  5574. ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
  5575. HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
  5576. HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
  5577. ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
  5578. HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
  5579. HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
  5580. { } /* end */
  5581. };
  5582. /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
  5583. * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
  5584. */
  5585. static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
  5586. HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  5587. HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
  5588. HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
  5589. HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
  5590. ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
  5591. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
  5592. HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
  5593. HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
  5594. HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
  5595. ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
  5596. { } /* end */
  5597. };
  5598. /*
  5599. * initialization verbs
  5600. */
  5601. static struct hda_verb alc260_init_verbs[] = {
  5602. /* Line In pin widget for input */
  5603. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  5604. /* CD pin widget for input */
  5605. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  5606. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  5607. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  5608. /* Mic2 (front panel) pin widget for input and vref at 80% */
  5609. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  5610. /* LINE-2 is used for line-out in rear */
  5611. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  5612. /* select line-out */
  5613. {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
  5614. /* LINE-OUT pin */
  5615. {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  5616. /* enable HP */
  5617. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  5618. /* enable Mono */
  5619. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  5620. /* mute capture amp left and right */
  5621. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  5622. /* set connection select to line in (default select for this ADC) */
  5623. {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
  5624. /* mute capture amp left and right */
  5625. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  5626. /* set connection select to line in (default select for this ADC) */
  5627. {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
  5628. /* set vol=0 Line-Out mixer amp left and right */
  5629. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5630. /* unmute pin widget amp left and right (no gain on this amp) */
  5631. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5632. /* set vol=0 HP mixer amp left and right */
  5633. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5634. /* unmute pin widget amp left and right (no gain on this amp) */
  5635. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5636. /* set vol=0 Mono mixer amp left and right */
  5637. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5638. /* unmute pin widget amp left and right (no gain on this amp) */
  5639. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5640. /* unmute LINE-2 out pin */
  5641. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5642. /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
  5643. * Line In 2 = 0x03
  5644. */
  5645. /* mute analog inputs */
  5646. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5647. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5648. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  5649. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  5650. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  5651. /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
  5652. /* mute Front out path */
  5653. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5654. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5655. /* mute Headphone out path */
  5656. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5657. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5658. /* mute Mono out path */
  5659. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5660. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5661. { }
  5662. };
  5663. #if 0 /* should be identical with alc260_init_verbs? */
  5664. static struct hda_verb alc260_hp_init_verbs[] = {
  5665. /* Headphone and output */
  5666. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  5667. /* mono output */
  5668. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  5669. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  5670. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  5671. /* Mic2 (front panel) pin widget for input and vref at 80% */
  5672. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  5673. /* Line In pin widget for input */
  5674. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  5675. /* Line-2 pin widget for output */
  5676. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  5677. /* CD pin widget for input */
  5678. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  5679. /* unmute amp left and right */
  5680. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
  5681. /* set connection select to line in (default select for this ADC) */
  5682. {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
  5683. /* unmute Line-Out mixer amp left and right (volume = 0) */
  5684. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  5685. /* mute pin widget amp left and right (no gain on this amp) */
  5686. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  5687. /* unmute HP mixer amp left and right (volume = 0) */
  5688. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  5689. /* mute pin widget amp left and right (no gain on this amp) */
  5690. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  5691. /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
  5692. * Line In 2 = 0x03
  5693. */
  5694. /* mute analog inputs */
  5695. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5696. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5697. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  5698. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  5699. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  5700. /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
  5701. /* Unmute Front out path */
  5702. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  5703. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  5704. /* Unmute Headphone out path */
  5705. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  5706. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  5707. /* Unmute Mono out path */
  5708. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  5709. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  5710. { }
  5711. };
  5712. #endif
  5713. static struct hda_verb alc260_hp_3013_init_verbs[] = {
  5714. /* Line out and output */
  5715. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  5716. /* mono output */
  5717. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  5718. /* Mic1 (rear panel) pin widget for input and vref at 80% */
  5719. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  5720. /* Mic2 (front panel) pin widget for input and vref at 80% */
  5721. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  5722. /* Line In pin widget for input */
  5723. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  5724. /* Headphone pin widget for output */
  5725. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  5726. /* CD pin widget for input */
  5727. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  5728. /* unmute amp left and right */
  5729. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
  5730. /* set connection select to line in (default select for this ADC) */
  5731. {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
  5732. /* unmute Line-Out mixer amp left and right (volume = 0) */
  5733. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  5734. /* mute pin widget amp left and right (no gain on this amp) */
  5735. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  5736. /* unmute HP mixer amp left and right (volume = 0) */
  5737. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  5738. /* mute pin widget amp left and right (no gain on this amp) */
  5739. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  5740. /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
  5741. * Line In 2 = 0x03
  5742. */
  5743. /* mute analog inputs */
  5744. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5745. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5746. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  5747. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  5748. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  5749. /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
  5750. /* Unmute Front out path */
  5751. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  5752. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  5753. /* Unmute Headphone out path */
  5754. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  5755. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  5756. /* Unmute Mono out path */
  5757. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  5758. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  5759. { }
  5760. };
  5761. /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
  5762. * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
  5763. * audio = 0x16, internal speaker = 0x10.
  5764. */
  5765. static struct hda_verb alc260_fujitsu_init_verbs[] = {
  5766. /* Disable all GPIOs */
  5767. {0x01, AC_VERB_SET_GPIO_MASK, 0},
  5768. /* Internal speaker is connected to headphone pin */
  5769. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  5770. /* Headphone/Line-out jack connects to Line1 pin; make it an output */
  5771. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  5772. /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
  5773. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  5774. /* Ensure all other unused pins are disabled and muted. */
  5775. {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5776. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5777. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5778. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5779. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5780. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5781. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5782. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5783. /* Disable digital (SPDIF) pins */
  5784. {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
  5785. {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
  5786. /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
  5787. * when acting as an output.
  5788. */
  5789. {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
  5790. /* Start with output sum widgets muted and their output gains at min */
  5791. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5792. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5793. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5794. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5795. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5796. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5797. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5798. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5799. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5800. /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
  5801. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5802. /* Unmute Line1 pin widget output buffer since it starts as an output.
  5803. * If the pin mode is changed by the user the pin mode control will
  5804. * take care of enabling the pin's input/output buffers as needed.
  5805. * Therefore there's no need to enable the input buffer at this
  5806. * stage.
  5807. */
  5808. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5809. /* Unmute input buffer of pin widget used for Line-in (no equiv
  5810. * mixer ctrl)
  5811. */
  5812. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  5813. /* Mute capture amp left and right */
  5814. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5815. /* Set ADC connection select to match default mixer setting - line
  5816. * in (on mic1 pin)
  5817. */
  5818. {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
  5819. /* Do the same for the second ADC: mute capture input amp and
  5820. * set ADC connection to line in (on mic1 pin)
  5821. */
  5822. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5823. {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
  5824. /* Mute all inputs to mixer widget (even unconnected ones) */
  5825. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
  5826. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
  5827. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
  5828. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
  5829. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
  5830. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
  5831. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
  5832. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
  5833. { }
  5834. };
  5835. /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
  5836. * similar laptops (adapted from Fujitsu init verbs).
  5837. */
  5838. static struct hda_verb alc260_acer_init_verbs[] = {
  5839. /* On TravelMate laptops, GPIO 0 enables the internal speaker and
  5840. * the headphone jack. Turn this on and rely on the standard mute
  5841. * methods whenever the user wants to turn these outputs off.
  5842. */
  5843. {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
  5844. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
  5845. {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
  5846. /* Internal speaker/Headphone jack is connected to Line-out pin */
  5847. {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  5848. /* Internal microphone/Mic jack is connected to Mic1 pin */
  5849. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  5850. /* Line In jack is connected to Line1 pin */
  5851. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  5852. /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
  5853. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  5854. /* Ensure all other unused pins are disabled and muted. */
  5855. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5856. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5857. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5858. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5859. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5860. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5861. /* Disable digital (SPDIF) pins */
  5862. {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
  5863. {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
  5864. /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
  5865. * bus when acting as outputs.
  5866. */
  5867. {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
  5868. {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
  5869. /* Start with output sum widgets muted and their output gains at min */
  5870. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5871. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5872. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5873. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5874. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5875. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5876. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5877. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5878. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5879. /* Unmute Line-out pin widget amp left and right
  5880. * (no equiv mixer ctrl)
  5881. */
  5882. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5883. /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
  5884. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5885. /* Unmute Mic1 and Line1 pin widget input buffers since they start as
  5886. * inputs. If the pin mode is changed by the user the pin mode control
  5887. * will take care of enabling the pin's input/output buffers as needed.
  5888. * Therefore there's no need to enable the input buffer at this
  5889. * stage.
  5890. */
  5891. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  5892. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  5893. /* Mute capture amp left and right */
  5894. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5895. /* Set ADC connection select to match default mixer setting - mic
  5896. * (on mic1 pin)
  5897. */
  5898. {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
  5899. /* Do similar with the second ADC: mute capture input amp and
  5900. * set ADC connection to mic to match ALSA's default state.
  5901. */
  5902. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5903. {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
  5904. /* Mute all inputs to mixer widget (even unconnected ones) */
  5905. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
  5906. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
  5907. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
  5908. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
  5909. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
  5910. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
  5911. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
  5912. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
  5913. { }
  5914. };
  5915. /* Initialisation sequence for Maxdata Favorit 100XS
  5916. * (adapted from Acer init verbs).
  5917. */
  5918. static struct hda_verb alc260_favorit100_init_verbs[] = {
  5919. /* GPIO 0 enables the output jack.
  5920. * Turn this on and rely on the standard mute
  5921. * methods whenever the user wants to turn these outputs off.
  5922. */
  5923. {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
  5924. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
  5925. {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
  5926. /* Line/Mic input jack is connected to Mic1 pin */
  5927. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  5928. /* Ensure all other unused pins are disabled and muted. */
  5929. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5930. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5931. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5932. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5933. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5934. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5935. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5936. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5937. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
  5938. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5939. /* Disable digital (SPDIF) pins */
  5940. {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
  5941. {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
  5942. /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
  5943. * bus when acting as outputs.
  5944. */
  5945. {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
  5946. {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
  5947. /* Start with output sum widgets muted and their output gains at min */
  5948. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5949. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5950. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5951. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5952. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5953. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5954. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5955. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  5956. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  5957. /* Unmute Line-out pin widget amp left and right
  5958. * (no equiv mixer ctrl)
  5959. */
  5960. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  5961. /* Unmute Mic1 and Line1 pin widget input buffers since they start as
  5962. * inputs. If the pin mode is changed by the user the pin mode control
  5963. * will take care of enabling the pin's input/output buffers as needed.
  5964. * Therefore there's no need to enable the input buffer at this
  5965. * stage.
  5966. */
  5967. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  5968. /* Mute capture amp left and right */
  5969. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5970. /* Set ADC connection select to match default mixer setting - mic
  5971. * (on mic1 pin)
  5972. */
  5973. {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
  5974. /* Do similar with the second ADC: mute capture input amp and
  5975. * set ADC connection to mic to match ALSA's default state.
  5976. */
  5977. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  5978. {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
  5979. /* Mute all inputs to mixer widget (even unconnected ones) */
  5980. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
  5981. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
  5982. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
  5983. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
  5984. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
  5985. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
  5986. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
  5987. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
  5988. { }
  5989. };
  5990. static struct hda_verb alc260_will_verbs[] = {
  5991. {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  5992. {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
  5993. {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
  5994. {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
  5995. {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
  5996. {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
  5997. {}
  5998. };
  5999. static struct hda_verb alc260_replacer_672v_verbs[] = {
  6000. {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
  6001. {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
  6002. {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
  6003. {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
  6004. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
  6005. {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
  6006. {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  6007. {}
  6008. };
  6009. /* toggle speaker-output according to the hp-jack state */
  6010. static void alc260_replacer_672v_automute(struct hda_codec *codec)
  6011. {
  6012. unsigned int present;
  6013. /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
  6014. present = snd_hda_jack_detect(codec, 0x0f);
  6015. if (present) {
  6016. snd_hda_codec_write_cache(codec, 0x01, 0,
  6017. AC_VERB_SET_GPIO_DATA, 1);
  6018. snd_hda_codec_write_cache(codec, 0x0f, 0,
  6019. AC_VERB_SET_PIN_WIDGET_CONTROL,
  6020. PIN_HP);
  6021. } else {
  6022. snd_hda_codec_write_cache(codec, 0x01, 0,
  6023. AC_VERB_SET_GPIO_DATA, 0);
  6024. snd_hda_codec_write_cache(codec, 0x0f, 0,
  6025. AC_VERB_SET_PIN_WIDGET_CONTROL,
  6026. PIN_OUT);
  6027. }
  6028. }
  6029. static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
  6030. unsigned int res)
  6031. {
  6032. if ((res >> 26) == ALC880_HP_EVENT)
  6033. alc260_replacer_672v_automute(codec);
  6034. }
  6035. static struct hda_verb alc260_hp_dc7600_verbs[] = {
  6036. {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
  6037. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  6038. {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6039. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  6040. {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6041. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6042. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  6043. {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  6044. {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  6045. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  6046. {}
  6047. };
  6048. /* Test configuration for debugging, modelled after the ALC880 test
  6049. * configuration.
  6050. */
  6051. #ifdef CONFIG_SND_DEBUG
  6052. static hda_nid_t alc260_test_dac_nids[1] = {
  6053. 0x02,
  6054. };
  6055. static hda_nid_t alc260_test_adc_nids[2] = {
  6056. 0x04, 0x05,
  6057. };
  6058. /* For testing the ALC260, each input MUX needs its own definition since
  6059. * the signal assignments are different. This assumes that the first ADC
  6060. * is NID 0x04.
  6061. */
  6062. static struct hda_input_mux alc260_test_capture_sources[2] = {
  6063. {
  6064. .num_items = 7,
  6065. .items = {
  6066. { "MIC1 pin", 0x0 },
  6067. { "MIC2 pin", 0x1 },
  6068. { "LINE1 pin", 0x2 },
  6069. { "LINE2 pin", 0x3 },
  6070. { "CD pin", 0x4 },
  6071. { "LINE-OUT pin", 0x5 },
  6072. { "HP-OUT pin", 0x6 },
  6073. },
  6074. },
  6075. {
  6076. .num_items = 8,
  6077. .items = {
  6078. { "MIC1 pin", 0x0 },
  6079. { "MIC2 pin", 0x1 },
  6080. { "LINE1 pin", 0x2 },
  6081. { "LINE2 pin", 0x3 },
  6082. { "CD pin", 0x4 },
  6083. { "Mixer", 0x5 },
  6084. { "LINE-OUT pin", 0x6 },
  6085. { "HP-OUT pin", 0x7 },
  6086. },
  6087. },
  6088. };
  6089. static struct snd_kcontrol_new alc260_test_mixer[] = {
  6090. /* Output driver widgets */
  6091. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
  6092. HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
  6093. HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
  6094. HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
  6095. HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
  6096. HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
  6097. /* Modes for retasking pin widgets
  6098. * Note: the ALC260 doesn't seem to act on requests to enable mic
  6099. * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
  6100. * mention this restriction. At this stage it's not clear whether
  6101. * this behaviour is intentional or is a hardware bug in chip
  6102. * revisions available at least up until early 2006. Therefore for
  6103. * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
  6104. * choices, but if it turns out that the lack of mic bias for these
  6105. * NIDs is intentional we could change their modes from
  6106. * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
  6107. */
  6108. ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
  6109. ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
  6110. ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
  6111. ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
  6112. ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
  6113. ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
  6114. /* Loopback mixer controls */
  6115. HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
  6116. HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
  6117. HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
  6118. HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
  6119. HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
  6120. HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
  6121. HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
  6122. HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
  6123. HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
  6124. HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
  6125. HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
  6126. HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
  6127. HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
  6128. HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
  6129. /* Controls for GPIO pins, assuming they are configured as outputs */
  6130. ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
  6131. ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
  6132. ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
  6133. ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
  6134. /* Switches to allow the digital IO pins to be enabled. The datasheet
  6135. * is ambigious as to which NID is which; testing on laptops which
  6136. * make this output available should provide clarification.
  6137. */
  6138. ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
  6139. ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
  6140. /* A switch allowing EAPD to be enabled. Some laptops seem to use
  6141. * this output to turn on an external amplifier.
  6142. */
  6143. ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
  6144. ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
  6145. { } /* end */
  6146. };
  6147. static struct hda_verb alc260_test_init_verbs[] = {
  6148. /* Enable all GPIOs as outputs with an initial value of 0 */
  6149. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
  6150. {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
  6151. {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
  6152. /* Enable retasking pins as output, initially without power amp */
  6153. {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6154. {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6155. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6156. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6157. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6158. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  6159. /* Disable digital (SPDIF) pins initially, but users can enable
  6160. * them via a mixer switch. In the case of SPDIF-out, this initverb
  6161. * payload also sets the generation to 0, output to be in "consumer"
  6162. * PCM format, copyright asserted, no pre-emphasis and no validity
  6163. * control.
  6164. */
  6165. {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
  6166. {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
  6167. /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
  6168. * OUT1 sum bus when acting as an output.
  6169. */
  6170. {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
  6171. {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
  6172. {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
  6173. {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
  6174. /* Start with output sum widgets muted and their output gains at min */
  6175. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6176. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  6177. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  6178. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6179. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  6180. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  6181. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6182. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  6183. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  6184. /* Unmute retasking pin widget output buffers since the default
  6185. * state appears to be output. As the pin mode is changed by the
  6186. * user the pin mode control will take care of enabling the pin's
  6187. * input/output buffers as needed.
  6188. */
  6189. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6190. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6191. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6192. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6193. {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6194. {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6195. /* Also unmute the mono-out pin widget */
  6196. {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6197. /* Mute capture amp left and right */
  6198. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6199. /* Set ADC connection select to match default mixer setting (mic1
  6200. * pin)
  6201. */
  6202. {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
  6203. /* Do the same for the second ADC: mute capture input amp and
  6204. * set ADC connection to mic1 pin
  6205. */
  6206. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6207. {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
  6208. /* Mute all inputs to mixer widget (even unconnected ones) */
  6209. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
  6210. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
  6211. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
  6212. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
  6213. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
  6214. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
  6215. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
  6216. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
  6217. { }
  6218. };
  6219. #endif
  6220. #define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
  6221. #define alc260_pcm_analog_capture alc880_pcm_analog_capture
  6222. #define alc260_pcm_digital_playback alc880_pcm_digital_playback
  6223. #define alc260_pcm_digital_capture alc880_pcm_digital_capture
  6224. /*
  6225. * for BIOS auto-configuration
  6226. */
  6227. static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
  6228. const char *pfx, int *vol_bits)
  6229. {
  6230. hda_nid_t nid_vol;
  6231. unsigned long vol_val, sw_val;
  6232. int err;
  6233. if (nid >= 0x0f && nid < 0x11) {
  6234. nid_vol = nid - 0x7;
  6235. vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
  6236. sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
  6237. } else if (nid == 0x11) {
  6238. nid_vol = nid - 0x7;
  6239. vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
  6240. sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
  6241. } else if (nid >= 0x12 && nid <= 0x15) {
  6242. nid_vol = 0x08;
  6243. vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
  6244. sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
  6245. } else
  6246. return 0; /* N/A */
  6247. if (!(*vol_bits & (1 << nid_vol))) {
  6248. /* first control for the volume widget */
  6249. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
  6250. if (err < 0)
  6251. return err;
  6252. *vol_bits |= (1 << nid_vol);
  6253. }
  6254. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
  6255. if (err < 0)
  6256. return err;
  6257. return 1;
  6258. }
  6259. /* add playback controls from the parsed DAC table */
  6260. static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
  6261. const struct auto_pin_cfg *cfg)
  6262. {
  6263. hda_nid_t nid;
  6264. int err;
  6265. int vols = 0;
  6266. spec->multiout.num_dacs = 1;
  6267. spec->multiout.dac_nids = spec->private_dac_nids;
  6268. spec->multiout.dac_nids[0] = 0x02;
  6269. nid = cfg->line_out_pins[0];
  6270. if (nid) {
  6271. const char *pfx;
  6272. if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
  6273. pfx = "Master";
  6274. else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
  6275. pfx = "Speaker";
  6276. else
  6277. pfx = "Front";
  6278. err = alc260_add_playback_controls(spec, nid, pfx, &vols);
  6279. if (err < 0)
  6280. return err;
  6281. }
  6282. nid = cfg->speaker_pins[0];
  6283. if (nid) {
  6284. err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
  6285. if (err < 0)
  6286. return err;
  6287. }
  6288. nid = cfg->hp_pins[0];
  6289. if (nid) {
  6290. err = alc260_add_playback_controls(spec, nid, "Headphone",
  6291. &vols);
  6292. if (err < 0)
  6293. return err;
  6294. }
  6295. return 0;
  6296. }
  6297. /* create playback/capture controls for input pins */
  6298. static int alc260_auto_create_input_ctls(struct hda_codec *codec,
  6299. const struct auto_pin_cfg *cfg)
  6300. {
  6301. return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
  6302. }
  6303. static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
  6304. hda_nid_t nid, int pin_type,
  6305. int sel_idx)
  6306. {
  6307. alc_set_pin_output(codec, nid, pin_type);
  6308. /* need the manual connection? */
  6309. if (nid >= 0x12) {
  6310. int idx = nid - 0x12;
  6311. snd_hda_codec_write(codec, idx + 0x0b, 0,
  6312. AC_VERB_SET_CONNECT_SEL, sel_idx);
  6313. }
  6314. }
  6315. static void alc260_auto_init_multi_out(struct hda_codec *codec)
  6316. {
  6317. struct alc_spec *spec = codec->spec;
  6318. hda_nid_t nid;
  6319. nid = spec->autocfg.line_out_pins[0];
  6320. if (nid) {
  6321. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  6322. alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
  6323. }
  6324. nid = spec->autocfg.speaker_pins[0];
  6325. if (nid)
  6326. alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
  6327. nid = spec->autocfg.hp_pins[0];
  6328. if (nid)
  6329. alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
  6330. }
  6331. #define ALC260_PIN_CD_NID 0x16
  6332. static void alc260_auto_init_analog_input(struct hda_codec *codec)
  6333. {
  6334. struct alc_spec *spec = codec->spec;
  6335. struct auto_pin_cfg *cfg = &spec->autocfg;
  6336. int i;
  6337. for (i = 0; i < cfg->num_inputs; i++) {
  6338. hda_nid_t nid = cfg->inputs[i].pin;
  6339. if (nid >= 0x12) {
  6340. alc_set_input_pin(codec, nid, cfg->inputs[i].type);
  6341. if (nid != ALC260_PIN_CD_NID &&
  6342. (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
  6343. snd_hda_codec_write(codec, nid, 0,
  6344. AC_VERB_SET_AMP_GAIN_MUTE,
  6345. AMP_OUT_MUTE);
  6346. }
  6347. }
  6348. }
  6349. #define alc260_auto_init_input_src alc880_auto_init_input_src
  6350. /*
  6351. * generic initialization of ADC, input mixers and output mixers
  6352. */
  6353. static struct hda_verb alc260_volume_init_verbs[] = {
  6354. /*
  6355. * Unmute ADC0-1 and set the default input to mic-in
  6356. */
  6357. {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
  6358. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  6359. {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
  6360. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  6361. /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  6362. * mixer widget
  6363. * Note: PASD motherboards uses the Line In 2 as the input for
  6364. * front panel mic (mic 2)
  6365. */
  6366. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  6367. /* mute analog inputs */
  6368. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6369. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  6370. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  6371. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  6372. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  6373. /*
  6374. * Set up output mixers (0x08 - 0x0a)
  6375. */
  6376. /* set vol=0 to output mixers */
  6377. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  6378. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  6379. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  6380. /* set up input amps for analog loopback */
  6381. /* Amp Indices: DAC = 0, mixer = 1 */
  6382. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  6383. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  6384. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  6385. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  6386. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  6387. {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  6388. { }
  6389. };
  6390. static int alc260_parse_auto_config(struct hda_codec *codec)
  6391. {
  6392. struct alc_spec *spec = codec->spec;
  6393. int err;
  6394. static hda_nid_t alc260_ignore[] = { 0x17, 0 };
  6395. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  6396. alc260_ignore);
  6397. if (err < 0)
  6398. return err;
  6399. err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
  6400. if (err < 0)
  6401. return err;
  6402. if (!spec->kctls.list)
  6403. return 0; /* can't find valid BIOS pin config */
  6404. err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
  6405. if (err < 0)
  6406. return err;
  6407. spec->multiout.max_channels = 2;
  6408. if (spec->autocfg.dig_outs)
  6409. spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
  6410. if (spec->kctls.list)
  6411. add_mixer(spec, spec->kctls.list);
  6412. add_verb(spec, alc260_volume_init_verbs);
  6413. spec->num_mux_defs = 1;
  6414. spec->input_mux = &spec->private_imux[0];
  6415. alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
  6416. return 1;
  6417. }
  6418. /* additional initialization for auto-configuration model */
  6419. static void alc260_auto_init(struct hda_codec *codec)
  6420. {
  6421. struct alc_spec *spec = codec->spec;
  6422. alc260_auto_init_multi_out(codec);
  6423. alc260_auto_init_analog_input(codec);
  6424. alc260_auto_init_input_src(codec);
  6425. alc_auto_init_digital(codec);
  6426. if (spec->unsol_event)
  6427. alc_inithook(codec);
  6428. }
  6429. #ifdef CONFIG_SND_HDA_POWER_SAVE
  6430. static struct hda_amp_list alc260_loopbacks[] = {
  6431. { 0x07, HDA_INPUT, 0 },
  6432. { 0x07, HDA_INPUT, 1 },
  6433. { 0x07, HDA_INPUT, 2 },
  6434. { 0x07, HDA_INPUT, 3 },
  6435. { 0x07, HDA_INPUT, 4 },
  6436. { } /* end */
  6437. };
  6438. #endif
  6439. /*
  6440. * Pin config fixes
  6441. */
  6442. enum {
  6443. PINFIX_HP_DC5750,
  6444. };
  6445. static const struct alc_fixup alc260_fixups[] = {
  6446. [PINFIX_HP_DC5750] = {
  6447. .type = ALC_FIXUP_PINS,
  6448. .v.pins = (const struct alc_pincfg[]) {
  6449. { 0x11, 0x90130110 }, /* speaker */
  6450. { }
  6451. }
  6452. },
  6453. };
  6454. static struct snd_pci_quirk alc260_fixup_tbl[] = {
  6455. SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
  6456. {}
  6457. };
  6458. /*
  6459. * ALC260 configurations
  6460. */
  6461. static const char * const alc260_models[ALC260_MODEL_LAST] = {
  6462. [ALC260_BASIC] = "basic",
  6463. [ALC260_HP] = "hp",
  6464. [ALC260_HP_3013] = "hp-3013",
  6465. [ALC260_HP_DC7600] = "hp-dc7600",
  6466. [ALC260_FUJITSU_S702X] = "fujitsu",
  6467. [ALC260_ACER] = "acer",
  6468. [ALC260_WILL] = "will",
  6469. [ALC260_REPLACER_672V] = "replacer",
  6470. [ALC260_FAVORIT100] = "favorit100",
  6471. #ifdef CONFIG_SND_DEBUG
  6472. [ALC260_TEST] = "test",
  6473. #endif
  6474. [ALC260_AUTO] = "auto",
  6475. };
  6476. static struct snd_pci_quirk alc260_cfg_tbl[] = {
  6477. SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
  6478. SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
  6479. SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
  6480. SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
  6481. SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
  6482. SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
  6483. SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
  6484. SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
  6485. SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
  6486. SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
  6487. SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
  6488. SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
  6489. SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
  6490. SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
  6491. SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
  6492. SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
  6493. SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
  6494. SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
  6495. SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
  6496. SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
  6497. {}
  6498. };
  6499. static struct alc_config_preset alc260_presets[] = {
  6500. [ALC260_BASIC] = {
  6501. .mixers = { alc260_base_output_mixer,
  6502. alc260_input_mixer },
  6503. .init_verbs = { alc260_init_verbs },
  6504. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6505. .dac_nids = alc260_dac_nids,
  6506. .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
  6507. .adc_nids = alc260_dual_adc_nids,
  6508. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6509. .channel_mode = alc260_modes,
  6510. .input_mux = &alc260_capture_source,
  6511. },
  6512. [ALC260_HP] = {
  6513. .mixers = { alc260_hp_output_mixer,
  6514. alc260_input_mixer },
  6515. .init_verbs = { alc260_init_verbs,
  6516. alc260_hp_unsol_verbs },
  6517. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6518. .dac_nids = alc260_dac_nids,
  6519. .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
  6520. .adc_nids = alc260_adc_nids_alt,
  6521. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6522. .channel_mode = alc260_modes,
  6523. .input_mux = &alc260_capture_source,
  6524. .unsol_event = alc260_hp_unsol_event,
  6525. .init_hook = alc260_hp_automute,
  6526. },
  6527. [ALC260_HP_DC7600] = {
  6528. .mixers = { alc260_hp_dc7600_mixer,
  6529. alc260_input_mixer },
  6530. .init_verbs = { alc260_init_verbs,
  6531. alc260_hp_dc7600_verbs },
  6532. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6533. .dac_nids = alc260_dac_nids,
  6534. .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
  6535. .adc_nids = alc260_adc_nids_alt,
  6536. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6537. .channel_mode = alc260_modes,
  6538. .input_mux = &alc260_capture_source,
  6539. .unsol_event = alc260_hp_3012_unsol_event,
  6540. .init_hook = alc260_hp_3012_automute,
  6541. },
  6542. [ALC260_HP_3013] = {
  6543. .mixers = { alc260_hp_3013_mixer,
  6544. alc260_input_mixer },
  6545. .init_verbs = { alc260_hp_3013_init_verbs,
  6546. alc260_hp_3013_unsol_verbs },
  6547. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6548. .dac_nids = alc260_dac_nids,
  6549. .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
  6550. .adc_nids = alc260_adc_nids_alt,
  6551. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6552. .channel_mode = alc260_modes,
  6553. .input_mux = &alc260_capture_source,
  6554. .unsol_event = alc260_hp_3013_unsol_event,
  6555. .init_hook = alc260_hp_3013_automute,
  6556. },
  6557. [ALC260_FUJITSU_S702X] = {
  6558. .mixers = { alc260_fujitsu_mixer },
  6559. .init_verbs = { alc260_fujitsu_init_verbs },
  6560. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6561. .dac_nids = alc260_dac_nids,
  6562. .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
  6563. .adc_nids = alc260_dual_adc_nids,
  6564. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6565. .channel_mode = alc260_modes,
  6566. .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
  6567. .input_mux = alc260_fujitsu_capture_sources,
  6568. },
  6569. [ALC260_ACER] = {
  6570. .mixers = { alc260_acer_mixer },
  6571. .init_verbs = { alc260_acer_init_verbs },
  6572. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6573. .dac_nids = alc260_dac_nids,
  6574. .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
  6575. .adc_nids = alc260_dual_adc_nids,
  6576. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6577. .channel_mode = alc260_modes,
  6578. .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
  6579. .input_mux = alc260_acer_capture_sources,
  6580. },
  6581. [ALC260_FAVORIT100] = {
  6582. .mixers = { alc260_favorit100_mixer },
  6583. .init_verbs = { alc260_favorit100_init_verbs },
  6584. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6585. .dac_nids = alc260_dac_nids,
  6586. .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
  6587. .adc_nids = alc260_dual_adc_nids,
  6588. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6589. .channel_mode = alc260_modes,
  6590. .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
  6591. .input_mux = alc260_favorit100_capture_sources,
  6592. },
  6593. [ALC260_WILL] = {
  6594. .mixers = { alc260_will_mixer },
  6595. .init_verbs = { alc260_init_verbs, alc260_will_verbs },
  6596. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6597. .dac_nids = alc260_dac_nids,
  6598. .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
  6599. .adc_nids = alc260_adc_nids,
  6600. .dig_out_nid = ALC260_DIGOUT_NID,
  6601. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6602. .channel_mode = alc260_modes,
  6603. .input_mux = &alc260_capture_source,
  6604. },
  6605. [ALC260_REPLACER_672V] = {
  6606. .mixers = { alc260_replacer_672v_mixer },
  6607. .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
  6608. .num_dacs = ARRAY_SIZE(alc260_dac_nids),
  6609. .dac_nids = alc260_dac_nids,
  6610. .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
  6611. .adc_nids = alc260_adc_nids,
  6612. .dig_out_nid = ALC260_DIGOUT_NID,
  6613. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6614. .channel_mode = alc260_modes,
  6615. .input_mux = &alc260_capture_source,
  6616. .unsol_event = alc260_replacer_672v_unsol_event,
  6617. .init_hook = alc260_replacer_672v_automute,
  6618. },
  6619. #ifdef CONFIG_SND_DEBUG
  6620. [ALC260_TEST] = {
  6621. .mixers = { alc260_test_mixer },
  6622. .init_verbs = { alc260_test_init_verbs },
  6623. .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
  6624. .dac_nids = alc260_test_dac_nids,
  6625. .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
  6626. .adc_nids = alc260_test_adc_nids,
  6627. .num_channel_mode = ARRAY_SIZE(alc260_modes),
  6628. .channel_mode = alc260_modes,
  6629. .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
  6630. .input_mux = alc260_test_capture_sources,
  6631. },
  6632. #endif
  6633. };
  6634. static int patch_alc260(struct hda_codec *codec)
  6635. {
  6636. struct alc_spec *spec;
  6637. int err, board_config;
  6638. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  6639. if (spec == NULL)
  6640. return -ENOMEM;
  6641. codec->spec = spec;
  6642. board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
  6643. alc260_models,
  6644. alc260_cfg_tbl);
  6645. if (board_config < 0) {
  6646. snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  6647. codec->chip_name);
  6648. board_config = ALC260_AUTO;
  6649. }
  6650. if (board_config == ALC260_AUTO) {
  6651. alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups);
  6652. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  6653. }
  6654. if (board_config == ALC260_AUTO) {
  6655. /* automatic parse from the BIOS config */
  6656. err = alc260_parse_auto_config(codec);
  6657. if (err < 0) {
  6658. alc_free(codec);
  6659. return err;
  6660. } else if (!err) {
  6661. printk(KERN_INFO
  6662. "hda_codec: Cannot set up configuration "
  6663. "from BIOS. Using base mode...\n");
  6664. board_config = ALC260_BASIC;
  6665. }
  6666. }
  6667. err = snd_hda_attach_beep_device(codec, 0x1);
  6668. if (err < 0) {
  6669. alc_free(codec);
  6670. return err;
  6671. }
  6672. if (board_config != ALC260_AUTO)
  6673. setup_preset(codec, &alc260_presets[board_config]);
  6674. spec->stream_analog_playback = &alc260_pcm_analog_playback;
  6675. spec->stream_analog_capture = &alc260_pcm_analog_capture;
  6676. spec->stream_analog_alt_capture = &alc260_pcm_analog_capture;
  6677. spec->stream_digital_playback = &alc260_pcm_digital_playback;
  6678. spec->stream_digital_capture = &alc260_pcm_digital_capture;
  6679. if (!spec->adc_nids && spec->input_mux) {
  6680. /* check whether NID 0x04 is valid */
  6681. unsigned int wcap = get_wcaps(codec, 0x04);
  6682. wcap = get_wcaps_type(wcap);
  6683. /* get type */
  6684. if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
  6685. spec->adc_nids = alc260_adc_nids_alt;
  6686. spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
  6687. } else {
  6688. spec->adc_nids = alc260_adc_nids;
  6689. spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
  6690. }
  6691. }
  6692. set_capture_mixer(codec);
  6693. set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
  6694. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  6695. spec->vmaster_nid = 0x08;
  6696. codec->patch_ops = alc_patch_ops;
  6697. if (board_config == ALC260_AUTO)
  6698. spec->init_hook = alc260_auto_init;
  6699. #ifdef CONFIG_SND_HDA_POWER_SAVE
  6700. if (!spec->loopback.amplist)
  6701. spec->loopback.amplist = alc260_loopbacks;
  6702. #endif
  6703. return 0;
  6704. }
  6705. /*
  6706. * ALC882/883/885/888/889 support
  6707. *
  6708. * ALC882 is almost identical with ALC880 but has cleaner and more flexible
  6709. * configuration. Each pin widget can choose any input DACs and a mixer.
  6710. * Each ADC is connected from a mixer of all inputs. This makes possible
  6711. * 6-channel independent captures.
  6712. *
  6713. * In addition, an independent DAC for the multi-playback (not used in this
  6714. * driver yet).
  6715. */
  6716. #define ALC882_DIGOUT_NID 0x06
  6717. #define ALC882_DIGIN_NID 0x0a
  6718. #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
  6719. #define ALC883_DIGIN_NID ALC882_DIGIN_NID
  6720. #define ALC1200_DIGOUT_NID 0x10
  6721. static struct hda_channel_mode alc882_ch_modes[1] = {
  6722. { 8, NULL }
  6723. };
  6724. /* DACs */
  6725. static hda_nid_t alc882_dac_nids[4] = {
  6726. /* front, rear, clfe, rear_surr */
  6727. 0x02, 0x03, 0x04, 0x05
  6728. };
  6729. #define alc883_dac_nids alc882_dac_nids
  6730. /* ADCs */
  6731. #define alc882_adc_nids alc880_adc_nids
  6732. #define alc882_adc_nids_alt alc880_adc_nids_alt
  6733. #define alc883_adc_nids alc882_adc_nids_alt
  6734. static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
  6735. static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
  6736. #define alc889_adc_nids alc880_adc_nids
  6737. static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
  6738. static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
  6739. #define alc883_capsrc_nids alc882_capsrc_nids_alt
  6740. static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
  6741. #define alc889_capsrc_nids alc882_capsrc_nids
  6742. /* input MUX */
  6743. /* FIXME: should be a matrix-type input source selection */
  6744. static struct hda_input_mux alc882_capture_source = {
  6745. .num_items = 4,
  6746. .items = {
  6747. { "Mic", 0x0 },
  6748. { "Front Mic", 0x1 },
  6749. { "Line", 0x2 },
  6750. { "CD", 0x4 },
  6751. },
  6752. };
  6753. #define alc883_capture_source alc882_capture_source
  6754. static struct hda_input_mux alc889_capture_source = {
  6755. .num_items = 3,
  6756. .items = {
  6757. { "Front Mic", 0x0 },
  6758. { "Mic", 0x3 },
  6759. { "Line", 0x2 },
  6760. },
  6761. };
  6762. static struct hda_input_mux mb5_capture_source = {
  6763. .num_items = 3,
  6764. .items = {
  6765. { "Mic", 0x1 },
  6766. { "Line", 0x7 },
  6767. { "CD", 0x4 },
  6768. },
  6769. };
  6770. static struct hda_input_mux macmini3_capture_source = {
  6771. .num_items = 2,
  6772. .items = {
  6773. { "Line", 0x2 },
  6774. { "CD", 0x4 },
  6775. },
  6776. };
  6777. static struct hda_input_mux alc883_3stack_6ch_intel = {
  6778. .num_items = 4,
  6779. .items = {
  6780. { "Mic", 0x1 },
  6781. { "Front Mic", 0x0 },
  6782. { "Line", 0x2 },
  6783. { "CD", 0x4 },
  6784. },
  6785. };
  6786. static struct hda_input_mux alc883_lenovo_101e_capture_source = {
  6787. .num_items = 2,
  6788. .items = {
  6789. { "Mic", 0x1 },
  6790. { "Line", 0x2 },
  6791. },
  6792. };
  6793. static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
  6794. .num_items = 4,
  6795. .items = {
  6796. { "Mic", 0x0 },
  6797. { "Internal Mic", 0x1 },
  6798. { "Line", 0x2 },
  6799. { "CD", 0x4 },
  6800. },
  6801. };
  6802. static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
  6803. .num_items = 2,
  6804. .items = {
  6805. { "Mic", 0x0 },
  6806. { "Internal Mic", 0x1 },
  6807. },
  6808. };
  6809. static struct hda_input_mux alc883_lenovo_sky_capture_source = {
  6810. .num_items = 3,
  6811. .items = {
  6812. { "Mic", 0x0 },
  6813. { "Front Mic", 0x1 },
  6814. { "Line", 0x4 },
  6815. },
  6816. };
  6817. static struct hda_input_mux alc883_asus_eee1601_capture_source = {
  6818. .num_items = 2,
  6819. .items = {
  6820. { "Mic", 0x0 },
  6821. { "Line", 0x2 },
  6822. },
  6823. };
  6824. static struct hda_input_mux alc889A_mb31_capture_source = {
  6825. .num_items = 2,
  6826. .items = {
  6827. { "Mic", 0x0 },
  6828. /* Front Mic (0x01) unused */
  6829. { "Line", 0x2 },
  6830. /* Line 2 (0x03) unused */
  6831. /* CD (0x04) unused? */
  6832. },
  6833. };
  6834. static struct hda_input_mux alc889A_imac91_capture_source = {
  6835. .num_items = 2,
  6836. .items = {
  6837. { "Mic", 0x01 },
  6838. { "Line", 0x2 }, /* Not sure! */
  6839. },
  6840. };
  6841. /*
  6842. * 2ch mode
  6843. */
  6844. static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
  6845. { 2, NULL }
  6846. };
  6847. /*
  6848. * 2ch mode
  6849. */
  6850. static struct hda_verb alc882_3ST_ch2_init[] = {
  6851. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  6852. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  6853. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  6854. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  6855. { } /* end */
  6856. };
  6857. /*
  6858. * 4ch mode
  6859. */
  6860. static struct hda_verb alc882_3ST_ch4_init[] = {
  6861. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  6862. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  6863. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6864. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  6865. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  6866. { } /* end */
  6867. };
  6868. /*
  6869. * 6ch mode
  6870. */
  6871. static struct hda_verb alc882_3ST_ch6_init[] = {
  6872. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6873. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  6874. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  6875. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6876. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  6877. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  6878. { } /* end */
  6879. };
  6880. static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
  6881. { 2, alc882_3ST_ch2_init },
  6882. { 4, alc882_3ST_ch4_init },
  6883. { 6, alc882_3ST_ch6_init },
  6884. };
  6885. #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
  6886. /*
  6887. * 2ch mode
  6888. */
  6889. static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
  6890. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
  6891. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  6892. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  6893. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  6894. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  6895. { } /* end */
  6896. };
  6897. /*
  6898. * 4ch mode
  6899. */
  6900. static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
  6901. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6902. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  6903. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  6904. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6905. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  6906. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  6907. { } /* end */
  6908. };
  6909. /*
  6910. * 6ch mode
  6911. */
  6912. static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
  6913. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6914. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6915. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  6916. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  6917. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6918. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  6919. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  6920. { } /* end */
  6921. };
  6922. static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
  6923. { 2, alc883_3ST_ch2_clevo_init },
  6924. { 4, alc883_3ST_ch4_clevo_init },
  6925. { 6, alc883_3ST_ch6_clevo_init },
  6926. };
  6927. /*
  6928. * 6ch mode
  6929. */
  6930. static struct hda_verb alc882_sixstack_ch6_init[] = {
  6931. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  6932. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6933. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6934. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6935. { } /* end */
  6936. };
  6937. /*
  6938. * 8ch mode
  6939. */
  6940. static struct hda_verb alc882_sixstack_ch8_init[] = {
  6941. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6942. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6943. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6944. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6945. { } /* end */
  6946. };
  6947. static struct hda_channel_mode alc882_sixstack_modes[2] = {
  6948. { 6, alc882_sixstack_ch6_init },
  6949. { 8, alc882_sixstack_ch8_init },
  6950. };
  6951. /* Macbook Air 2,1 */
  6952. static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
  6953. { 2, NULL },
  6954. };
  6955. /*
  6956. * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
  6957. */
  6958. /*
  6959. * 2ch mode
  6960. */
  6961. static struct hda_verb alc885_mbp_ch2_init[] = {
  6962. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  6963. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  6964. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  6965. { } /* end */
  6966. };
  6967. /*
  6968. * 4ch mode
  6969. */
  6970. static struct hda_verb alc885_mbp_ch4_init[] = {
  6971. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  6972. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  6973. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  6974. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  6975. { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  6976. { } /* end */
  6977. };
  6978. static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
  6979. { 2, alc885_mbp_ch2_init },
  6980. { 4, alc885_mbp_ch4_init },
  6981. };
  6982. /*
  6983. * 2ch
  6984. * Speakers/Woofer/HP = Front
  6985. * LineIn = Input
  6986. */
  6987. static struct hda_verb alc885_mb5_ch2_init[] = {
  6988. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  6989. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  6990. { } /* end */
  6991. };
  6992. /*
  6993. * 6ch mode
  6994. * Speakers/HP = Front
  6995. * Woofer = LFE
  6996. * LineIn = Surround
  6997. */
  6998. static struct hda_verb alc885_mb5_ch6_init[] = {
  6999. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7000. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7001. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  7002. { } /* end */
  7003. };
  7004. static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
  7005. { 2, alc885_mb5_ch2_init },
  7006. { 6, alc885_mb5_ch6_init },
  7007. };
  7008. #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
  7009. /*
  7010. * 2ch mode
  7011. */
  7012. static struct hda_verb alc883_4ST_ch2_init[] = {
  7013. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7014. { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7015. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  7016. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7017. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  7018. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7019. { } /* end */
  7020. };
  7021. /*
  7022. * 4ch mode
  7023. */
  7024. static struct hda_verb alc883_4ST_ch4_init[] = {
  7025. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7026. { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7027. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  7028. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7029. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7030. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7031. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7032. { } /* end */
  7033. };
  7034. /*
  7035. * 6ch mode
  7036. */
  7037. static struct hda_verb alc883_4ST_ch6_init[] = {
  7038. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7039. { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7040. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7041. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7042. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  7043. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7044. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7045. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7046. { } /* end */
  7047. };
  7048. /*
  7049. * 8ch mode
  7050. */
  7051. static struct hda_verb alc883_4ST_ch8_init[] = {
  7052. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7053. { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7054. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
  7055. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7056. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7057. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  7058. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7059. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7060. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7061. { } /* end */
  7062. };
  7063. static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
  7064. { 2, alc883_4ST_ch2_init },
  7065. { 4, alc883_4ST_ch4_init },
  7066. { 6, alc883_4ST_ch6_init },
  7067. { 8, alc883_4ST_ch8_init },
  7068. };
  7069. /*
  7070. * 2ch mode
  7071. */
  7072. static struct hda_verb alc883_3ST_ch2_intel_init[] = {
  7073. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  7074. { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7075. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  7076. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7077. { } /* end */
  7078. };
  7079. /*
  7080. * 4ch mode
  7081. */
  7082. static struct hda_verb alc883_3ST_ch4_intel_init[] = {
  7083. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  7084. { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7085. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7086. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7087. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7088. { } /* end */
  7089. };
  7090. /*
  7091. * 6ch mode
  7092. */
  7093. static struct hda_verb alc883_3ST_ch6_intel_init[] = {
  7094. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7095. { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7096. { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
  7097. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7098. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7099. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7100. { } /* end */
  7101. };
  7102. static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
  7103. { 2, alc883_3ST_ch2_intel_init },
  7104. { 4, alc883_3ST_ch4_intel_init },
  7105. { 6, alc883_3ST_ch6_intel_init },
  7106. };
  7107. /*
  7108. * 2ch mode
  7109. */
  7110. static struct hda_verb alc889_ch2_intel_init[] = {
  7111. { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
  7112. { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
  7113. { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
  7114. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
  7115. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  7116. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7117. { } /* end */
  7118. };
  7119. /*
  7120. * 6ch mode
  7121. */
  7122. static struct hda_verb alc889_ch6_intel_init[] = {
  7123. { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
  7124. { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7125. { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
  7126. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
  7127. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  7128. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  7129. { } /* end */
  7130. };
  7131. /*
  7132. * 8ch mode
  7133. */
  7134. static struct hda_verb alc889_ch8_intel_init[] = {
  7135. { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
  7136. { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
  7137. { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
  7138. { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
  7139. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
  7140. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7141. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  7142. { } /* end */
  7143. };
  7144. static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
  7145. { 2, alc889_ch2_intel_init },
  7146. { 6, alc889_ch6_intel_init },
  7147. { 8, alc889_ch8_intel_init },
  7148. };
  7149. /*
  7150. * 6ch mode
  7151. */
  7152. static struct hda_verb alc883_sixstack_ch6_init[] = {
  7153. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  7154. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7155. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7156. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7157. { } /* end */
  7158. };
  7159. /*
  7160. * 8ch mode
  7161. */
  7162. static struct hda_verb alc883_sixstack_ch8_init[] = {
  7163. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7164. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7165. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7166. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  7167. { } /* end */
  7168. };
  7169. static struct hda_channel_mode alc883_sixstack_modes[2] = {
  7170. { 6, alc883_sixstack_ch6_init },
  7171. { 8, alc883_sixstack_ch8_init },
  7172. };
  7173. /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
  7174. * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
  7175. */
  7176. static struct snd_kcontrol_new alc882_base_mixer[] = {
  7177. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  7178. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  7179. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  7180. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  7181. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  7182. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  7183. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  7184. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  7185. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  7186. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  7187. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  7188. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  7189. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  7190. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7191. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7192. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  7193. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  7194. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  7195. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  7196. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  7197. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  7198. { } /* end */
  7199. };
  7200. /* Macbook Air 2,1 same control for HP and internal Speaker */
  7201. static struct snd_kcontrol_new alc885_mba21_mixer[] = {
  7202. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  7203. HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
  7204. { }
  7205. };
  7206. static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
  7207. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  7208. HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
  7209. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
  7210. HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
  7211. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  7212. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7213. HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7214. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
  7215. HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
  7216. HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
  7217. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
  7218. { } /* end */
  7219. };
  7220. static struct snd_kcontrol_new alc885_mb5_mixer[] = {
  7221. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  7222. HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
  7223. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  7224. HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
  7225. HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
  7226. HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
  7227. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
  7228. HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
  7229. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
  7230. HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
  7231. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  7232. HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  7233. HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
  7234. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0x00, HDA_INPUT),
  7235. { } /* end */
  7236. };
  7237. static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
  7238. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  7239. HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
  7240. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  7241. HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
  7242. HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
  7243. HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
  7244. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
  7245. HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
  7246. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
  7247. HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
  7248. HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
  7249. { } /* end */
  7250. };
  7251. static struct snd_kcontrol_new alc885_imac91_mixer[] = {
  7252. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  7253. HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
  7254. { } /* end */
  7255. };
  7256. static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
  7257. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  7258. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  7259. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  7260. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  7261. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7262. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7263. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  7264. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  7265. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  7266. { } /* end */
  7267. };
  7268. static struct snd_kcontrol_new alc882_targa_mixer[] = {
  7269. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  7270. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  7271. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  7272. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  7273. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  7274. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7275. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7276. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  7277. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  7278. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  7279. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  7280. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  7281. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  7282. { } /* end */
  7283. };
  7284. /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
  7285. * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
  7286. */
  7287. static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
  7288. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  7289. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  7290. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  7291. HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
  7292. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  7293. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  7294. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7295. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7296. HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
  7297. HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
  7298. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  7299. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  7300. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  7301. { } /* end */
  7302. };
  7303. static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
  7304. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  7305. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  7306. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  7307. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  7308. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  7309. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7310. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7311. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  7312. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  7313. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  7314. { } /* end */
  7315. };
  7316. static struct snd_kcontrol_new alc882_chmode_mixer[] = {
  7317. {
  7318. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  7319. .name = "Channel Mode",
  7320. .info = alc_ch_mode_info,
  7321. .get = alc_ch_mode_get,
  7322. .put = alc_ch_mode_put,
  7323. },
  7324. { } /* end */
  7325. };
  7326. static struct hda_verb alc882_base_init_verbs[] = {
  7327. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  7328. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7329. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7330. /* Rear mixer */
  7331. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7332. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7333. /* CLFE mixer */
  7334. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7335. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7336. /* Side mixer */
  7337. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7338. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7339. /* Front Pin: output 0 (0x0c) */
  7340. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7341. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7342. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  7343. /* Rear Pin: output 1 (0x0d) */
  7344. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7345. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7346. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  7347. /* CLFE Pin: output 2 (0x0e) */
  7348. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7349. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7350. {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
  7351. /* Side Pin: output 3 (0x0f) */
  7352. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7353. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7354. {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  7355. /* Mic (rear) pin: input vref at 80% */
  7356. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7357. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7358. /* Front Mic pin: input vref at 80% */
  7359. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7360. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7361. /* Line In pin: input */
  7362. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  7363. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7364. /* Line-2 In: Headphone output (output 0 - 0x0c) */
  7365. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7366. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7367. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  7368. /* CD pin widget for input */
  7369. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  7370. /* FIXME: use matrix-type input source selection */
  7371. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  7372. /* Input mixer2 */
  7373. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7374. /* Input mixer3 */
  7375. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7376. /* ADC2: mute amp left and right */
  7377. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7378. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  7379. /* ADC3: mute amp left and right */
  7380. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7381. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  7382. { }
  7383. };
  7384. static struct hda_verb alc882_adc1_init_verbs[] = {
  7385. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  7386. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7387. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7388. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7389. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7390. /* ADC1: mute amp left and right */
  7391. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7392. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  7393. { }
  7394. };
  7395. static struct hda_verb alc882_eapd_verbs[] = {
  7396. /* change to EAPD mode */
  7397. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  7398. {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
  7399. { }
  7400. };
  7401. static struct hda_verb alc889_eapd_verbs[] = {
  7402. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  7403. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  7404. { }
  7405. };
  7406. static struct hda_verb alc_hp15_unsol_verbs[] = {
  7407. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  7408. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7409. {}
  7410. };
  7411. static struct hda_verb alc885_init_verbs[] = {
  7412. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  7413. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7414. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7415. /* Rear mixer */
  7416. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7417. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7418. /* CLFE mixer */
  7419. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7420. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7421. /* Side mixer */
  7422. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7423. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7424. /* Front HP Pin: output 0 (0x0c) */
  7425. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7426. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7427. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  7428. /* Front Pin: output 0 (0x0c) */
  7429. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7430. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7431. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  7432. /* Rear Pin: output 1 (0x0d) */
  7433. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7434. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7435. {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
  7436. /* CLFE Pin: output 2 (0x0e) */
  7437. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7438. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7439. {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
  7440. /* Side Pin: output 3 (0x0f) */
  7441. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7442. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7443. {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  7444. /* Mic (rear) pin: input vref at 80% */
  7445. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7446. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7447. /* Front Mic pin: input vref at 80% */
  7448. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7449. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7450. /* Line In pin: input */
  7451. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  7452. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7453. /* Mixer elements: 0x18, , 0x1a, 0x1b */
  7454. /* Input mixer1 */
  7455. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7456. /* Input mixer2 */
  7457. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7458. /* Input mixer3 */
  7459. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7460. /* ADC2: mute amp left and right */
  7461. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7462. /* ADC3: mute amp left and right */
  7463. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7464. { }
  7465. };
  7466. static struct hda_verb alc885_init_input_verbs[] = {
  7467. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7468. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  7469. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  7470. { }
  7471. };
  7472. /* Unmute Selector 24h and set the default input to front mic */
  7473. static struct hda_verb alc889_init_input_verbs[] = {
  7474. {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
  7475. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7476. { }
  7477. };
  7478. #define alc883_init_verbs alc882_base_init_verbs
  7479. /* Mac Pro test */
  7480. static struct snd_kcontrol_new alc882_macpro_mixer[] = {
  7481. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  7482. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  7483. HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
  7484. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
  7485. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
  7486. /* FIXME: this looks suspicious...
  7487. HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
  7488. HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
  7489. */
  7490. { } /* end */
  7491. };
  7492. static struct hda_verb alc882_macpro_init_verbs[] = {
  7493. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  7494. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7495. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7496. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7497. /* Front Pin: output 0 (0x0c) */
  7498. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7499. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7500. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  7501. /* Front Mic pin: input vref at 80% */
  7502. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7503. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7504. /* Speaker: output */
  7505. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7506. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7507. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
  7508. /* Headphone output (output 0 - 0x0c) */
  7509. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7510. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7511. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  7512. /* FIXME: use matrix-type input source selection */
  7513. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  7514. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  7515. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7516. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7517. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7518. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7519. /* Input mixer2 */
  7520. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7521. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7522. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7523. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7524. /* Input mixer3 */
  7525. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7526. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7527. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7528. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7529. /* ADC1: mute amp left and right */
  7530. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7531. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  7532. /* ADC2: mute amp left and right */
  7533. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7534. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  7535. /* ADC3: mute amp left and right */
  7536. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7537. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  7538. { }
  7539. };
  7540. /* Macbook 5,1 */
  7541. static struct hda_verb alc885_mb5_init_verbs[] = {
  7542. /* DACs */
  7543. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7544. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7545. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7546. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7547. /* Front mixer */
  7548. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7549. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7550. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7551. /* Surround mixer */
  7552. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7553. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7554. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7555. /* LFE mixer */
  7556. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7557. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7558. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7559. /* HP mixer */
  7560. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7561. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7562. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7563. /* Front Pin (0x0c) */
  7564. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  7565. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7566. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  7567. /* LFE Pin (0x0e) */
  7568. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  7569. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7570. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
  7571. /* HP Pin (0x0f) */
  7572. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7573. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7574. {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
  7575. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  7576. /* Front Mic pin: input vref at 80% */
  7577. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7578. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7579. /* Line In pin */
  7580. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  7581. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7582. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
  7583. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
  7584. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
  7585. { }
  7586. };
  7587. /* Macmini 3,1 */
  7588. static struct hda_verb alc885_macmini3_init_verbs[] = {
  7589. /* DACs */
  7590. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7591. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7592. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7593. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7594. /* Front mixer */
  7595. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7596. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7597. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7598. /* Surround mixer */
  7599. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7600. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7601. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7602. /* LFE mixer */
  7603. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7604. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7605. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7606. /* HP mixer */
  7607. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7608. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7609. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7610. /* Front Pin (0x0c) */
  7611. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  7612. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7613. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  7614. /* LFE Pin (0x0e) */
  7615. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
  7616. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7617. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
  7618. /* HP Pin (0x0f) */
  7619. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7620. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7621. {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
  7622. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  7623. /* Line In pin */
  7624. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  7625. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7626. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7627. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7628. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7629. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7630. { }
  7631. };
  7632. static struct hda_verb alc885_mba21_init_verbs[] = {
  7633. /*Internal and HP Speaker Mixer*/
  7634. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7635. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7636. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7637. /*Internal Speaker Pin (0x0c)*/
  7638. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
  7639. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7640. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  7641. /* HP Pin: output 0 (0x0e) */
  7642. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
  7643. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7644. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  7645. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
  7646. /* Line in (is hp when jack connected)*/
  7647. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
  7648. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7649. { }
  7650. };
  7651. /* Macbook Pro rev3 */
  7652. static struct hda_verb alc885_mbp3_init_verbs[] = {
  7653. /* Front mixer: unmute input/output amp left and right (volume = 0) */
  7654. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7655. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7656. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7657. /* Rear mixer */
  7658. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7659. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7660. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7661. /* HP mixer */
  7662. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7663. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7664. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7665. /* Front Pin: output 0 (0x0c) */
  7666. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7667. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7668. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  7669. /* HP Pin: output 0 (0x0e) */
  7670. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
  7671. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7672. {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
  7673. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  7674. /* Mic (rear) pin: input vref at 80% */
  7675. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7676. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7677. /* Front Mic pin: input vref at 80% */
  7678. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7679. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7680. /* Line In pin: use output 1 when in LineOut mode */
  7681. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  7682. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7683. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
  7684. /* FIXME: use matrix-type input source selection */
  7685. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  7686. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  7687. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7688. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7689. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7690. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7691. /* Input mixer2 */
  7692. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7693. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7694. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7695. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7696. /* Input mixer3 */
  7697. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7698. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7699. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7700. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7701. /* ADC1: mute amp left and right */
  7702. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7703. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  7704. /* ADC2: mute amp left and right */
  7705. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7706. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  7707. /* ADC3: mute amp left and right */
  7708. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7709. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  7710. { }
  7711. };
  7712. /* iMac 9,1 */
  7713. static struct hda_verb alc885_imac91_init_verbs[] = {
  7714. /* Internal Speaker Pin (0x0c) */
  7715. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
  7716. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7717. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  7718. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
  7719. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7720. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
  7721. /* HP Pin: Rear */
  7722. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7723. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7724. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  7725. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
  7726. /* Line in Rear */
  7727. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
  7728. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7729. /* Front Mic pin: input vref at 80% */
  7730. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7731. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7732. /* Rear mixer */
  7733. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7734. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7735. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7736. /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
  7737. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7738. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7739. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  7740. /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
  7741. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7742. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7743. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7744. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7745. /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
  7746. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7747. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7748. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7749. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7750. /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
  7751. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7752. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  7753. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  7754. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  7755. /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
  7756. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7757. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  7758. /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
  7759. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7760. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  7761. /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
  7762. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  7763. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  7764. { }
  7765. };
  7766. /* iMac 24 mixer. */
  7767. static struct snd_kcontrol_new alc885_imac24_mixer[] = {
  7768. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  7769. HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
  7770. { } /* end */
  7771. };
  7772. /* iMac 24 init verbs. */
  7773. static struct hda_verb alc885_imac24_init_verbs[] = {
  7774. /* Internal speakers: output 0 (0x0c) */
  7775. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7776. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7777. {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
  7778. /* Internal speakers: output 0 (0x0c) */
  7779. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7780. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7781. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
  7782. /* Headphone: output 0 (0x0c) */
  7783. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7784. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  7785. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  7786. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  7787. /* Front Mic: input vref at 80% */
  7788. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  7789. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  7790. { }
  7791. };
  7792. /* Toggle speaker-output according to the hp-jack state */
  7793. static void alc885_imac24_setup(struct hda_codec *codec)
  7794. {
  7795. struct alc_spec *spec = codec->spec;
  7796. spec->autocfg.hp_pins[0] = 0x14;
  7797. spec->autocfg.speaker_pins[0] = 0x18;
  7798. spec->autocfg.speaker_pins[1] = 0x1a;
  7799. }
  7800. #define alc885_mb5_setup alc885_imac24_setup
  7801. #define alc885_macmini3_setup alc885_imac24_setup
  7802. /* Macbook Air 2,1 */
  7803. static void alc885_mba21_setup(struct hda_codec *codec)
  7804. {
  7805. struct alc_spec *spec = codec->spec;
  7806. spec->autocfg.hp_pins[0] = 0x14;
  7807. spec->autocfg.speaker_pins[0] = 0x18;
  7808. }
  7809. static void alc885_mbp3_setup(struct hda_codec *codec)
  7810. {
  7811. struct alc_spec *spec = codec->spec;
  7812. spec->autocfg.hp_pins[0] = 0x15;
  7813. spec->autocfg.speaker_pins[0] = 0x14;
  7814. }
  7815. static void alc885_imac91_setup(struct hda_codec *codec)
  7816. {
  7817. struct alc_spec *spec = codec->spec;
  7818. spec->autocfg.hp_pins[0] = 0x14;
  7819. spec->autocfg.speaker_pins[0] = 0x18;
  7820. spec->autocfg.speaker_pins[1] = 0x1a;
  7821. }
  7822. static struct hda_verb alc882_targa_verbs[] = {
  7823. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7824. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7825. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7826. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7827. {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
  7828. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
  7829. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  7830. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  7831. { } /* end */
  7832. };
  7833. /* toggle speaker-output according to the hp-jack state */
  7834. static void alc882_targa_automute(struct hda_codec *codec)
  7835. {
  7836. struct alc_spec *spec = codec->spec;
  7837. alc_automute_amp(codec);
  7838. snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
  7839. spec->jack_present ? 1 : 3);
  7840. }
  7841. static void alc882_targa_setup(struct hda_codec *codec)
  7842. {
  7843. struct alc_spec *spec = codec->spec;
  7844. spec->autocfg.hp_pins[0] = 0x14;
  7845. spec->autocfg.speaker_pins[0] = 0x1b;
  7846. }
  7847. static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
  7848. {
  7849. if ((res >> 26) == ALC880_HP_EVENT)
  7850. alc882_targa_automute(codec);
  7851. }
  7852. static struct hda_verb alc882_asus_a7j_verbs[] = {
  7853. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7854. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7855. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7856. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7857. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7858. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
  7859. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  7860. {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
  7861. {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
  7862. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
  7863. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  7864. { } /* end */
  7865. };
  7866. static struct hda_verb alc882_asus_a7m_verbs[] = {
  7867. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7868. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7869. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  7870. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7871. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  7872. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
  7873. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  7874. {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
  7875. {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
  7876. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
  7877. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
  7878. { } /* end */
  7879. };
  7880. static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
  7881. {
  7882. unsigned int gpiostate, gpiomask, gpiodir;
  7883. gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
  7884. AC_VERB_GET_GPIO_DATA, 0);
  7885. if (!muted)
  7886. gpiostate |= (1 << pin);
  7887. else
  7888. gpiostate &= ~(1 << pin);
  7889. gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
  7890. AC_VERB_GET_GPIO_MASK, 0);
  7891. gpiomask |= (1 << pin);
  7892. gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
  7893. AC_VERB_GET_GPIO_DIRECTION, 0);
  7894. gpiodir |= (1 << pin);
  7895. snd_hda_codec_write(codec, codec->afg, 0,
  7896. AC_VERB_SET_GPIO_MASK, gpiomask);
  7897. snd_hda_codec_write(codec, codec->afg, 0,
  7898. AC_VERB_SET_GPIO_DIRECTION, gpiodir);
  7899. msleep(1);
  7900. snd_hda_codec_write(codec, codec->afg, 0,
  7901. AC_VERB_SET_GPIO_DATA, gpiostate);
  7902. }
  7903. /* set up GPIO at initialization */
  7904. static void alc885_macpro_init_hook(struct hda_codec *codec)
  7905. {
  7906. alc882_gpio_mute(codec, 0, 0);
  7907. alc882_gpio_mute(codec, 1, 0);
  7908. }
  7909. /* set up GPIO and update auto-muting at initialization */
  7910. static void alc885_imac24_init_hook(struct hda_codec *codec)
  7911. {
  7912. alc885_macpro_init_hook(codec);
  7913. alc_automute_amp(codec);
  7914. }
  7915. /*
  7916. * generic initialization of ADC, input mixers and output mixers
  7917. */
  7918. static struct hda_verb alc883_auto_init_verbs[] = {
  7919. /*
  7920. * Unmute ADC0-2 and set the default input to mic-in
  7921. */
  7922. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  7923. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7924. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  7925. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7926. /*
  7927. * Set up output mixers (0x0c - 0x0f)
  7928. */
  7929. /* set vol=0 to output mixers */
  7930. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7931. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7932. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7933. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  7934. /* set up input amps for analog loopback */
  7935. /* Amp Indices: DAC = 0, mixer = 1 */
  7936. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7937. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7938. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7939. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7940. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7941. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7942. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7943. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7944. {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7945. {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  7946. /* FIXME: use matrix-type input source selection */
  7947. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  7948. /* Input mixer2 */
  7949. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7950. /* Input mixer3 */
  7951. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  7952. { }
  7953. };
  7954. /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
  7955. static struct hda_verb alc889A_mb31_ch2_init[] = {
  7956. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
  7957. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
  7958. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
  7959. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
  7960. { } /* end */
  7961. };
  7962. /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
  7963. static struct hda_verb alc889A_mb31_ch4_init[] = {
  7964. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
  7965. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
  7966. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
  7967. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
  7968. { } /* end */
  7969. };
  7970. /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
  7971. static struct hda_verb alc889A_mb31_ch5_init[] = {
  7972. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
  7973. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
  7974. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
  7975. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
  7976. { } /* end */
  7977. };
  7978. /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
  7979. static struct hda_verb alc889A_mb31_ch6_init[] = {
  7980. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
  7981. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
  7982. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
  7983. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
  7984. { } /* end */
  7985. };
  7986. static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
  7987. { 2, alc889A_mb31_ch2_init },
  7988. { 4, alc889A_mb31_ch4_init },
  7989. { 5, alc889A_mb31_ch5_init },
  7990. { 6, alc889A_mb31_ch6_init },
  7991. };
  7992. static struct hda_verb alc883_medion_eapd_verbs[] = {
  7993. /* eanable EAPD on medion laptop */
  7994. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  7995. {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
  7996. { }
  7997. };
  7998. #define alc883_base_mixer alc882_base_mixer
  7999. static struct snd_kcontrol_new alc883_mitac_mixer[] = {
  8000. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8001. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8002. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  8003. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  8004. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  8005. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  8006. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  8007. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8008. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8009. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8010. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8011. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8012. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8013. { } /* end */
  8014. };
  8015. static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
  8016. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8017. HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
  8018. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8019. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  8020. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8021. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8022. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8023. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8024. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8025. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8026. { } /* end */
  8027. };
  8028. static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
  8029. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8030. HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
  8031. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8032. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  8033. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8034. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8035. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8036. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8037. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8038. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8039. { } /* end */
  8040. };
  8041. static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
  8042. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8043. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8044. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  8045. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8046. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8047. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8048. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8049. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8050. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8051. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8052. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8053. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8054. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8055. { } /* end */
  8056. };
  8057. static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
  8058. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8059. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8060. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8061. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  8062. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  8063. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  8064. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  8065. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  8066. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  8067. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8068. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8069. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8070. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8071. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8072. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8073. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8074. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8075. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8076. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8077. { } /* end */
  8078. };
  8079. static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
  8080. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8081. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8082. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8083. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  8084. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  8085. HDA_OUTPUT),
  8086. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  8087. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  8088. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  8089. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  8090. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8091. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8092. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8093. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8094. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8095. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8096. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8097. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8098. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8099. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8100. { } /* end */
  8101. };
  8102. static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
  8103. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8104. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8105. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8106. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  8107. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
  8108. HDA_OUTPUT),
  8109. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  8110. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  8111. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  8112. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  8113. HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
  8114. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  8115. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8116. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8117. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
  8118. HDA_CODEC_VOLUME("Mic Boost Volume", 0x1b, 0, HDA_INPUT),
  8119. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
  8120. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8121. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8122. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8123. { } /* end */
  8124. };
  8125. static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
  8126. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8127. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8128. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8129. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  8130. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  8131. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  8132. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  8133. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  8134. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  8135. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8136. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8137. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8138. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8139. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8140. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8141. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8142. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8143. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8144. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8145. { } /* end */
  8146. };
  8147. static struct snd_kcontrol_new alc883_targa_mixer[] = {
  8148. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8149. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8150. HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  8151. HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  8152. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8153. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  8154. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  8155. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  8156. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  8157. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  8158. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8159. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8160. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8161. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8162. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8163. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8164. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8165. { } /* end */
  8166. };
  8167. static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
  8168. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8169. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8170. HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  8171. HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  8172. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8173. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8174. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8175. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8176. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8177. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8178. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8179. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8180. { } /* end */
  8181. };
  8182. static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
  8183. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  8184. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  8185. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8186. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8187. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8188. { } /* end */
  8189. };
  8190. static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
  8191. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8192. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8193. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  8194. HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
  8195. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  8196. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8197. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8198. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8199. { } /* end */
  8200. };
  8201. static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
  8202. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8203. HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
  8204. HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  8205. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8206. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8207. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8208. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8209. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8210. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8211. { } /* end */
  8212. };
  8213. static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
  8214. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8215. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8216. HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  8217. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
  8218. HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
  8219. HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
  8220. { } /* end */
  8221. };
  8222. static struct hda_verb alc883_medion_wim2160_verbs[] = {
  8223. /* Unmute front mixer */
  8224. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8225. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  8226. /* Set speaker pin to front mixer */
  8227. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8228. /* Init headphone pin */
  8229. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8230. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  8231. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
  8232. {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8233. { } /* end */
  8234. };
  8235. /* toggle speaker-output according to the hp-jack state */
  8236. static void alc883_medion_wim2160_setup(struct hda_codec *codec)
  8237. {
  8238. struct alc_spec *spec = codec->spec;
  8239. spec->autocfg.hp_pins[0] = 0x1a;
  8240. spec->autocfg.speaker_pins[0] = 0x15;
  8241. }
  8242. static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
  8243. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8244. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8245. HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  8246. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8247. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8248. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8249. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8250. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8251. { } /* end */
  8252. };
  8253. static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
  8254. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8255. HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  8256. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8257. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8258. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8259. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8260. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8261. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8262. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8263. { } /* end */
  8264. };
  8265. static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
  8266. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8267. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8268. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
  8269. HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
  8270. HDA_CODEC_VOLUME_MONO("Center Playback Volume",
  8271. 0x0d, 1, 0x0, HDA_OUTPUT),
  8272. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
  8273. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
  8274. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
  8275. HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
  8276. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  8277. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  8278. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  8279. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8280. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8281. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8282. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8283. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8284. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8285. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8286. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8287. { } /* end */
  8288. };
  8289. static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
  8290. /* Output mixers */
  8291. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
  8292. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
  8293. HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
  8294. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
  8295. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
  8296. HDA_OUTPUT),
  8297. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
  8298. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
  8299. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
  8300. /* Output switches */
  8301. HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
  8302. HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
  8303. HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
  8304. /* Boost mixers */
  8305. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
  8306. HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
  8307. /* Input mixers */
  8308. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
  8309. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
  8310. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8311. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8312. { } /* end */
  8313. };
  8314. static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
  8315. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8316. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8317. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  8318. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  8319. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
  8320. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  8321. { } /* end */
  8322. };
  8323. static struct hda_bind_ctls alc883_bind_cap_vol = {
  8324. .ops = &snd_hda_bind_vol,
  8325. .values = {
  8326. HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
  8327. HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
  8328. 0
  8329. },
  8330. };
  8331. static struct hda_bind_ctls alc883_bind_cap_switch = {
  8332. .ops = &snd_hda_bind_sw,
  8333. .values = {
  8334. HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
  8335. HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
  8336. 0
  8337. },
  8338. };
  8339. static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
  8340. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  8341. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  8342. HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  8343. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  8344. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  8345. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  8346. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  8347. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  8348. { } /* end */
  8349. };
  8350. static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
  8351. HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
  8352. HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
  8353. {
  8354. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  8355. /* .name = "Capture Source", */
  8356. .name = "Input Source",
  8357. .count = 1,
  8358. .info = alc_mux_enum_info,
  8359. .get = alc_mux_enum_get,
  8360. .put = alc_mux_enum_put,
  8361. },
  8362. { } /* end */
  8363. };
  8364. static struct snd_kcontrol_new alc883_chmode_mixer[] = {
  8365. {
  8366. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  8367. .name = "Channel Mode",
  8368. .info = alc_ch_mode_info,
  8369. .get = alc_ch_mode_get,
  8370. .put = alc_ch_mode_put,
  8371. },
  8372. { } /* end */
  8373. };
  8374. /* toggle speaker-output according to the hp-jack state */
  8375. static void alc883_mitac_setup(struct hda_codec *codec)
  8376. {
  8377. struct alc_spec *spec = codec->spec;
  8378. spec->autocfg.hp_pins[0] = 0x15;
  8379. spec->autocfg.speaker_pins[0] = 0x14;
  8380. spec->autocfg.speaker_pins[1] = 0x17;
  8381. }
  8382. static struct hda_verb alc883_mitac_verbs[] = {
  8383. /* HP */
  8384. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8385. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8386. /* Subwoofer */
  8387. {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
  8388. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8389. /* enable unsolicited event */
  8390. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8391. /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
  8392. { } /* end */
  8393. };
  8394. static struct hda_verb alc883_clevo_m540r_verbs[] = {
  8395. /* HP */
  8396. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8397. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8398. /* Int speaker */
  8399. /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
  8400. /* enable unsolicited event */
  8401. /*
  8402. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8403. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  8404. */
  8405. { } /* end */
  8406. };
  8407. static struct hda_verb alc883_clevo_m720_verbs[] = {
  8408. /* HP */
  8409. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8410. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8411. /* Int speaker */
  8412. {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
  8413. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8414. /* enable unsolicited event */
  8415. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8416. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  8417. { } /* end */
  8418. };
  8419. static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
  8420. /* HP */
  8421. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  8422. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8423. /* Subwoofer */
  8424. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  8425. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8426. /* enable unsolicited event */
  8427. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8428. { } /* end */
  8429. };
  8430. static struct hda_verb alc883_targa_verbs[] = {
  8431. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8432. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  8433. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8434. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8435. /* Connect Line-Out side jack (SPDIF) to Side */
  8436. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8437. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  8438. {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  8439. /* Connect Mic jack to CLFE */
  8440. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8441. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  8442. {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
  8443. /* Connect Line-in jack to Surround */
  8444. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8445. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  8446. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
  8447. /* Connect HP out jack to Front */
  8448. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8449. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  8450. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  8451. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8452. { } /* end */
  8453. };
  8454. static struct hda_verb alc883_lenovo_101e_verbs[] = {
  8455. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8456. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
  8457. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
  8458. { } /* end */
  8459. };
  8460. static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
  8461. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8462. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8463. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8464. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8465. { } /* end */
  8466. };
  8467. static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
  8468. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8469. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  8470. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8471. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
  8472. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8473. { } /* end */
  8474. };
  8475. static struct hda_verb alc883_haier_w66_verbs[] = {
  8476. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8477. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  8478. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8479. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  8480. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8481. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8482. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8483. { } /* end */
  8484. };
  8485. static struct hda_verb alc888_lenovo_sky_verbs[] = {
  8486. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8487. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  8488. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8489. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8490. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8491. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8492. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
  8493. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8494. { } /* end */
  8495. };
  8496. static struct hda_verb alc888_6st_dell_verbs[] = {
  8497. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8498. { }
  8499. };
  8500. static struct hda_verb alc883_vaiott_verbs[] = {
  8501. /* HP */
  8502. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8503. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8504. /* enable unsolicited event */
  8505. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8506. { } /* end */
  8507. };
  8508. static void alc888_3st_hp_setup(struct hda_codec *codec)
  8509. {
  8510. struct alc_spec *spec = codec->spec;
  8511. spec->autocfg.hp_pins[0] = 0x1b;
  8512. spec->autocfg.speaker_pins[0] = 0x14;
  8513. spec->autocfg.speaker_pins[1] = 0x16;
  8514. spec->autocfg.speaker_pins[2] = 0x18;
  8515. }
  8516. static struct hda_verb alc888_3st_hp_verbs[] = {
  8517. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
  8518. {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
  8519. {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
  8520. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8521. { } /* end */
  8522. };
  8523. /*
  8524. * 2ch mode
  8525. */
  8526. static struct hda_verb alc888_3st_hp_2ch_init[] = {
  8527. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  8528. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  8529. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  8530. { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  8531. { } /* end */
  8532. };
  8533. /*
  8534. * 4ch mode
  8535. */
  8536. static struct hda_verb alc888_3st_hp_4ch_init[] = {
  8537. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  8538. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  8539. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  8540. { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  8541. { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
  8542. { } /* end */
  8543. };
  8544. /*
  8545. * 6ch mode
  8546. */
  8547. static struct hda_verb alc888_3st_hp_6ch_init[] = {
  8548. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  8549. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  8550. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  8551. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  8552. { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  8553. { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
  8554. { } /* end */
  8555. };
  8556. static struct hda_channel_mode alc888_3st_hp_modes[3] = {
  8557. { 2, alc888_3st_hp_2ch_init },
  8558. { 4, alc888_3st_hp_4ch_init },
  8559. { 6, alc888_3st_hp_6ch_init },
  8560. };
  8561. /* toggle front-jack and RCA according to the hp-jack state */
  8562. static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
  8563. {
  8564. unsigned int present = snd_hda_jack_detect(codec, 0x1b);
  8565. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  8566. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  8567. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  8568. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  8569. }
  8570. /* toggle RCA according to the front-jack state */
  8571. static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
  8572. {
  8573. unsigned int present = snd_hda_jack_detect(codec, 0x14);
  8574. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  8575. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  8576. }
  8577. static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
  8578. unsigned int res)
  8579. {
  8580. if ((res >> 26) == ALC880_HP_EVENT)
  8581. alc888_lenovo_ms7195_front_automute(codec);
  8582. if ((res >> 26) == ALC880_FRONT_EVENT)
  8583. alc888_lenovo_ms7195_rca_automute(codec);
  8584. }
  8585. /* toggle speaker-output according to the hp-jack state */
  8586. static void alc883_lenovo_nb0763_setup(struct hda_codec *codec)
  8587. {
  8588. struct alc_spec *spec = codec->spec;
  8589. spec->autocfg.hp_pins[0] = 0x14;
  8590. spec->autocfg.speaker_pins[0] = 0x15;
  8591. }
  8592. /* toggle speaker-output according to the hp-jack state */
  8593. #define alc883_targa_init_hook alc882_targa_init_hook
  8594. #define alc883_targa_unsol_event alc882_targa_unsol_event
  8595. static void alc883_clevo_m720_setup(struct hda_codec *codec)
  8596. {
  8597. struct alc_spec *spec = codec->spec;
  8598. spec->autocfg.hp_pins[0] = 0x15;
  8599. spec->autocfg.speaker_pins[0] = 0x14;
  8600. }
  8601. static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
  8602. {
  8603. alc_automute_amp(codec);
  8604. alc88x_simple_mic_automute(codec);
  8605. }
  8606. static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
  8607. unsigned int res)
  8608. {
  8609. switch (res >> 26) {
  8610. case ALC880_MIC_EVENT:
  8611. alc88x_simple_mic_automute(codec);
  8612. break;
  8613. default:
  8614. alc_automute_amp_unsol_event(codec, res);
  8615. break;
  8616. }
  8617. }
  8618. /* toggle speaker-output according to the hp-jack state */
  8619. static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
  8620. {
  8621. struct alc_spec *spec = codec->spec;
  8622. spec->autocfg.hp_pins[0] = 0x14;
  8623. spec->autocfg.speaker_pins[0] = 0x15;
  8624. }
  8625. static void alc883_haier_w66_setup(struct hda_codec *codec)
  8626. {
  8627. struct alc_spec *spec = codec->spec;
  8628. spec->autocfg.hp_pins[0] = 0x1b;
  8629. spec->autocfg.speaker_pins[0] = 0x14;
  8630. }
  8631. static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
  8632. {
  8633. int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
  8634. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  8635. HDA_AMP_MUTE, bits);
  8636. }
  8637. static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
  8638. {
  8639. int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
  8640. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  8641. HDA_AMP_MUTE, bits);
  8642. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  8643. HDA_AMP_MUTE, bits);
  8644. }
  8645. static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
  8646. unsigned int res)
  8647. {
  8648. if ((res >> 26) == ALC880_HP_EVENT)
  8649. alc883_lenovo_101e_all_automute(codec);
  8650. if ((res >> 26) == ALC880_FRONT_EVENT)
  8651. alc883_lenovo_101e_ispeaker_automute(codec);
  8652. }
  8653. /* toggle speaker-output according to the hp-jack state */
  8654. static void alc883_acer_aspire_setup(struct hda_codec *codec)
  8655. {
  8656. struct alc_spec *spec = codec->spec;
  8657. spec->autocfg.hp_pins[0] = 0x14;
  8658. spec->autocfg.speaker_pins[0] = 0x15;
  8659. spec->autocfg.speaker_pins[1] = 0x16;
  8660. }
  8661. static struct hda_verb alc883_acer_eapd_verbs[] = {
  8662. /* HP Pin: output 0 (0x0c) */
  8663. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8664. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  8665. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  8666. /* Front Pin: output 0 (0x0c) */
  8667. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8668. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  8669. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8670. {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
  8671. /* eanable EAPD on medion laptop */
  8672. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  8673. {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
  8674. /* enable unsolicited event */
  8675. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8676. { }
  8677. };
  8678. static void alc888_6st_dell_setup(struct hda_codec *codec)
  8679. {
  8680. struct alc_spec *spec = codec->spec;
  8681. spec->autocfg.hp_pins[0] = 0x1b;
  8682. spec->autocfg.speaker_pins[0] = 0x14;
  8683. spec->autocfg.speaker_pins[1] = 0x15;
  8684. spec->autocfg.speaker_pins[2] = 0x16;
  8685. spec->autocfg.speaker_pins[3] = 0x17;
  8686. }
  8687. static void alc888_lenovo_sky_setup(struct hda_codec *codec)
  8688. {
  8689. struct alc_spec *spec = codec->spec;
  8690. spec->autocfg.hp_pins[0] = 0x1b;
  8691. spec->autocfg.speaker_pins[0] = 0x14;
  8692. spec->autocfg.speaker_pins[1] = 0x15;
  8693. spec->autocfg.speaker_pins[2] = 0x16;
  8694. spec->autocfg.speaker_pins[3] = 0x17;
  8695. spec->autocfg.speaker_pins[4] = 0x1a;
  8696. }
  8697. static void alc883_vaiott_setup(struct hda_codec *codec)
  8698. {
  8699. struct alc_spec *spec = codec->spec;
  8700. spec->autocfg.hp_pins[0] = 0x15;
  8701. spec->autocfg.speaker_pins[0] = 0x14;
  8702. spec->autocfg.speaker_pins[1] = 0x17;
  8703. }
  8704. static struct hda_verb alc888_asus_m90v_verbs[] = {
  8705. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  8706. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  8707. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  8708. /* enable unsolicited event */
  8709. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8710. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  8711. { } /* end */
  8712. };
  8713. static void alc883_mode2_setup(struct hda_codec *codec)
  8714. {
  8715. struct alc_spec *spec = codec->spec;
  8716. spec->autocfg.hp_pins[0] = 0x1b;
  8717. spec->autocfg.speaker_pins[0] = 0x14;
  8718. spec->autocfg.speaker_pins[1] = 0x15;
  8719. spec->autocfg.speaker_pins[2] = 0x16;
  8720. spec->ext_mic.pin = 0x18;
  8721. spec->int_mic.pin = 0x19;
  8722. spec->ext_mic.mux_idx = 0;
  8723. spec->int_mic.mux_idx = 1;
  8724. spec->auto_mic = 1;
  8725. }
  8726. static struct hda_verb alc888_asus_eee1601_verbs[] = {
  8727. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  8728. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  8729. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  8730. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  8731. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  8732. {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
  8733. {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
  8734. /* enable unsolicited event */
  8735. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8736. { } /* end */
  8737. };
  8738. static void alc883_eee1601_inithook(struct hda_codec *codec)
  8739. {
  8740. struct alc_spec *spec = codec->spec;
  8741. spec->autocfg.hp_pins[0] = 0x14;
  8742. spec->autocfg.speaker_pins[0] = 0x1b;
  8743. alc_automute_pin(codec);
  8744. }
  8745. static struct hda_verb alc889A_mb31_verbs[] = {
  8746. /* Init rear pin (used as headphone output) */
  8747. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
  8748. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
  8749. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  8750. /* Init line pin (used as output in 4ch and 6ch mode) */
  8751. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
  8752. /* Init line 2 pin (used as headphone out by default) */
  8753. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
  8754. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
  8755. { } /* end */
  8756. };
  8757. /* Mute speakers according to the headphone jack state */
  8758. static void alc889A_mb31_automute(struct hda_codec *codec)
  8759. {
  8760. unsigned int present;
  8761. /* Mute only in 2ch or 4ch mode */
  8762. if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
  8763. == 0x00) {
  8764. present = snd_hda_jack_detect(codec, 0x15);
  8765. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  8766. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  8767. snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
  8768. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  8769. }
  8770. }
  8771. static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
  8772. {
  8773. if ((res >> 26) == ALC880_HP_EVENT)
  8774. alc889A_mb31_automute(codec);
  8775. }
  8776. #ifdef CONFIG_SND_HDA_POWER_SAVE
  8777. #define alc882_loopbacks alc880_loopbacks
  8778. #endif
  8779. /* pcm configuration: identical with ALC880 */
  8780. #define alc882_pcm_analog_playback alc880_pcm_analog_playback
  8781. #define alc882_pcm_analog_capture alc880_pcm_analog_capture
  8782. #define alc882_pcm_digital_playback alc880_pcm_digital_playback
  8783. #define alc882_pcm_digital_capture alc880_pcm_digital_capture
  8784. static hda_nid_t alc883_slave_dig_outs[] = {
  8785. ALC1200_DIGOUT_NID, 0,
  8786. };
  8787. static hda_nid_t alc1200_slave_dig_outs[] = {
  8788. ALC883_DIGOUT_NID, 0,
  8789. };
  8790. /*
  8791. * configuration and preset
  8792. */
  8793. static const char * const alc882_models[ALC882_MODEL_LAST] = {
  8794. [ALC882_3ST_DIG] = "3stack-dig",
  8795. [ALC882_6ST_DIG] = "6stack-dig",
  8796. [ALC882_ARIMA] = "arima",
  8797. [ALC882_W2JC] = "w2jc",
  8798. [ALC882_TARGA] = "targa",
  8799. [ALC882_ASUS_A7J] = "asus-a7j",
  8800. [ALC882_ASUS_A7M] = "asus-a7m",
  8801. [ALC885_MACPRO] = "macpro",
  8802. [ALC885_MB5] = "mb5",
  8803. [ALC885_MACMINI3] = "macmini3",
  8804. [ALC885_MBA21] = "mba21",
  8805. [ALC885_MBP3] = "mbp3",
  8806. [ALC885_IMAC24] = "imac24",
  8807. [ALC885_IMAC91] = "imac91",
  8808. [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
  8809. [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
  8810. [ALC883_3ST_6ch] = "3stack-6ch",
  8811. [ALC883_6ST_DIG] = "alc883-6stack-dig",
  8812. [ALC883_TARGA_DIG] = "targa-dig",
  8813. [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
  8814. [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
  8815. [ALC883_ACER] = "acer",
  8816. [ALC883_ACER_ASPIRE] = "acer-aspire",
  8817. [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
  8818. [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
  8819. [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
  8820. [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
  8821. [ALC883_MEDION] = "medion",
  8822. [ALC883_MEDION_WIM2160] = "medion-wim2160",
  8823. [ALC883_LAPTOP_EAPD] = "laptop-eapd",
  8824. [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
  8825. [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
  8826. [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
  8827. [ALC888_LENOVO_SKY] = "lenovo-sky",
  8828. [ALC883_HAIER_W66] = "haier-w66",
  8829. [ALC888_3ST_HP] = "3stack-hp",
  8830. [ALC888_6ST_DELL] = "6stack-dell",
  8831. [ALC883_MITAC] = "mitac",
  8832. [ALC883_CLEVO_M540R] = "clevo-m540r",
  8833. [ALC883_CLEVO_M720] = "clevo-m720",
  8834. [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
  8835. [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
  8836. [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
  8837. [ALC889A_INTEL] = "intel-alc889a",
  8838. [ALC889_INTEL] = "intel-x58",
  8839. [ALC1200_ASUS_P5Q] = "asus-p5q",
  8840. [ALC889A_MB31] = "mb31",
  8841. [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
  8842. [ALC882_AUTO] = "auto",
  8843. };
  8844. static struct snd_pci_quirk alc882_cfg_tbl[] = {
  8845. SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
  8846. SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
  8847. SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
  8848. SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
  8849. SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
  8850. SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
  8851. SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
  8852. SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
  8853. ALC888_ACER_ASPIRE_4930G),
  8854. SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
  8855. ALC888_ACER_ASPIRE_4930G),
  8856. SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
  8857. ALC888_ACER_ASPIRE_8930G),
  8858. SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
  8859. ALC888_ACER_ASPIRE_8930G),
  8860. SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
  8861. SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
  8862. SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
  8863. ALC888_ACER_ASPIRE_6530G),
  8864. SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
  8865. ALC888_ACER_ASPIRE_6530G),
  8866. SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
  8867. ALC888_ACER_ASPIRE_7730G),
  8868. /* default Acer -- disabled as it causes more problems.
  8869. * model=auto should work fine now
  8870. */
  8871. /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
  8872. SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
  8873. SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
  8874. SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
  8875. SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
  8876. SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
  8877. SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
  8878. SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
  8879. SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
  8880. SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
  8881. SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
  8882. SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
  8883. SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
  8884. SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
  8885. SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
  8886. SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
  8887. SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
  8888. SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
  8889. SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
  8890. SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
  8891. SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
  8892. SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
  8893. SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
  8894. SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
  8895. SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
  8896. SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
  8897. SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
  8898. SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
  8899. SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
  8900. SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
  8901. SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
  8902. SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
  8903. SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
  8904. SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
  8905. SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
  8906. SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
  8907. SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
  8908. SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
  8909. SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
  8910. SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
  8911. SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
  8912. SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
  8913. SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
  8914. SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
  8915. SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
  8916. SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
  8917. SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
  8918. SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
  8919. SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
  8920. SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
  8921. SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
  8922. SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
  8923. SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
  8924. SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
  8925. SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
  8926. SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
  8927. SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
  8928. SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
  8929. SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
  8930. SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
  8931. SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
  8932. SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
  8933. SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
  8934. SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
  8935. SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
  8936. SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
  8937. /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
  8938. SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
  8939. SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
  8940. ALC883_FUJITSU_PI2515),
  8941. SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
  8942. ALC888_FUJITSU_XA3530),
  8943. SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
  8944. SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
  8945. SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
  8946. SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
  8947. SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
  8948. SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
  8949. SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
  8950. SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
  8951. SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
  8952. SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
  8953. SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
  8954. SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
  8955. SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
  8956. SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
  8957. SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
  8958. {}
  8959. };
  8960. /* codec SSID table for Intel Mac */
  8961. static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
  8962. SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
  8963. SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
  8964. SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
  8965. SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
  8966. SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
  8967. SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
  8968. SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
  8969. SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
  8970. SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
  8971. SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
  8972. SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
  8973. SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
  8974. SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
  8975. SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
  8976. SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
  8977. SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
  8978. SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
  8979. /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
  8980. * so apparently no perfect solution yet
  8981. */
  8982. SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
  8983. SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
  8984. SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
  8985. {} /* terminator */
  8986. };
  8987. static struct alc_config_preset alc882_presets[] = {
  8988. [ALC882_3ST_DIG] = {
  8989. .mixers = { alc882_base_mixer },
  8990. .init_verbs = { alc882_base_init_verbs,
  8991. alc882_adc1_init_verbs },
  8992. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  8993. .dac_nids = alc882_dac_nids,
  8994. .dig_out_nid = ALC882_DIGOUT_NID,
  8995. .dig_in_nid = ALC882_DIGIN_NID,
  8996. .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
  8997. .channel_mode = alc882_ch_modes,
  8998. .need_dac_fix = 1,
  8999. .input_mux = &alc882_capture_source,
  9000. },
  9001. [ALC882_6ST_DIG] = {
  9002. .mixers = { alc882_base_mixer, alc882_chmode_mixer },
  9003. .init_verbs = { alc882_base_init_verbs,
  9004. alc882_adc1_init_verbs },
  9005. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9006. .dac_nids = alc882_dac_nids,
  9007. .dig_out_nid = ALC882_DIGOUT_NID,
  9008. .dig_in_nid = ALC882_DIGIN_NID,
  9009. .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
  9010. .channel_mode = alc882_sixstack_modes,
  9011. .input_mux = &alc882_capture_source,
  9012. },
  9013. [ALC882_ARIMA] = {
  9014. .mixers = { alc882_base_mixer, alc882_chmode_mixer },
  9015. .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
  9016. alc882_eapd_verbs },
  9017. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9018. .dac_nids = alc882_dac_nids,
  9019. .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
  9020. .channel_mode = alc882_sixstack_modes,
  9021. .input_mux = &alc882_capture_source,
  9022. },
  9023. [ALC882_W2JC] = {
  9024. .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
  9025. .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
  9026. alc882_eapd_verbs, alc880_gpio1_init_verbs },
  9027. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9028. .dac_nids = alc882_dac_nids,
  9029. .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
  9030. .channel_mode = alc880_threestack_modes,
  9031. .need_dac_fix = 1,
  9032. .input_mux = &alc882_capture_source,
  9033. .dig_out_nid = ALC882_DIGOUT_NID,
  9034. },
  9035. [ALC885_MBA21] = {
  9036. .mixers = { alc885_mba21_mixer },
  9037. .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
  9038. .num_dacs = 2,
  9039. .dac_nids = alc882_dac_nids,
  9040. .channel_mode = alc885_mba21_ch_modes,
  9041. .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
  9042. .input_mux = &alc882_capture_source,
  9043. .unsol_event = alc_automute_amp_unsol_event,
  9044. .setup = alc885_mba21_setup,
  9045. .init_hook = alc_automute_amp,
  9046. },
  9047. [ALC885_MBP3] = {
  9048. .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
  9049. .init_verbs = { alc885_mbp3_init_verbs,
  9050. alc880_gpio1_init_verbs },
  9051. .num_dacs = 2,
  9052. .dac_nids = alc882_dac_nids,
  9053. .hp_nid = 0x04,
  9054. .channel_mode = alc885_mbp_4ch_modes,
  9055. .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
  9056. .input_mux = &alc882_capture_source,
  9057. .dig_out_nid = ALC882_DIGOUT_NID,
  9058. .dig_in_nid = ALC882_DIGIN_NID,
  9059. .unsol_event = alc_automute_amp_unsol_event,
  9060. .setup = alc885_mbp3_setup,
  9061. .init_hook = alc_automute_amp,
  9062. },
  9063. [ALC885_MB5] = {
  9064. .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
  9065. .init_verbs = { alc885_mb5_init_verbs,
  9066. alc880_gpio1_init_verbs },
  9067. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9068. .dac_nids = alc882_dac_nids,
  9069. .channel_mode = alc885_mb5_6ch_modes,
  9070. .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
  9071. .input_mux = &mb5_capture_source,
  9072. .dig_out_nid = ALC882_DIGOUT_NID,
  9073. .dig_in_nid = ALC882_DIGIN_NID,
  9074. .unsol_event = alc_automute_amp_unsol_event,
  9075. .setup = alc885_mb5_setup,
  9076. .init_hook = alc_automute_amp,
  9077. },
  9078. [ALC885_MACMINI3] = {
  9079. .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
  9080. .init_verbs = { alc885_macmini3_init_verbs,
  9081. alc880_gpio1_init_verbs },
  9082. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9083. .dac_nids = alc882_dac_nids,
  9084. .channel_mode = alc885_macmini3_6ch_modes,
  9085. .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
  9086. .input_mux = &macmini3_capture_source,
  9087. .dig_out_nid = ALC882_DIGOUT_NID,
  9088. .dig_in_nid = ALC882_DIGIN_NID,
  9089. .unsol_event = alc_automute_amp_unsol_event,
  9090. .setup = alc885_macmini3_setup,
  9091. .init_hook = alc_automute_amp,
  9092. },
  9093. [ALC885_MACPRO] = {
  9094. .mixers = { alc882_macpro_mixer },
  9095. .init_verbs = { alc882_macpro_init_verbs },
  9096. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9097. .dac_nids = alc882_dac_nids,
  9098. .dig_out_nid = ALC882_DIGOUT_NID,
  9099. .dig_in_nid = ALC882_DIGIN_NID,
  9100. .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
  9101. .channel_mode = alc882_ch_modes,
  9102. .input_mux = &alc882_capture_source,
  9103. .init_hook = alc885_macpro_init_hook,
  9104. },
  9105. [ALC885_IMAC24] = {
  9106. .mixers = { alc885_imac24_mixer },
  9107. .init_verbs = { alc885_imac24_init_verbs },
  9108. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9109. .dac_nids = alc882_dac_nids,
  9110. .dig_out_nid = ALC882_DIGOUT_NID,
  9111. .dig_in_nid = ALC882_DIGIN_NID,
  9112. .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
  9113. .channel_mode = alc882_ch_modes,
  9114. .input_mux = &alc882_capture_source,
  9115. .unsol_event = alc_automute_amp_unsol_event,
  9116. .setup = alc885_imac24_setup,
  9117. .init_hook = alc885_imac24_init_hook,
  9118. },
  9119. [ALC885_IMAC91] = {
  9120. .mixers = {alc885_imac91_mixer},
  9121. .init_verbs = { alc885_imac91_init_verbs,
  9122. alc880_gpio1_init_verbs },
  9123. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9124. .dac_nids = alc882_dac_nids,
  9125. .channel_mode = alc885_mba21_ch_modes,
  9126. .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
  9127. .input_mux = &alc889A_imac91_capture_source,
  9128. .dig_out_nid = ALC882_DIGOUT_NID,
  9129. .dig_in_nid = ALC882_DIGIN_NID,
  9130. .unsol_event = alc_automute_amp_unsol_event,
  9131. .setup = alc885_imac91_setup,
  9132. .init_hook = alc_automute_amp,
  9133. },
  9134. [ALC882_TARGA] = {
  9135. .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
  9136. .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
  9137. alc880_gpio3_init_verbs, alc882_targa_verbs},
  9138. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9139. .dac_nids = alc882_dac_nids,
  9140. .dig_out_nid = ALC882_DIGOUT_NID,
  9141. .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
  9142. .adc_nids = alc882_adc_nids,
  9143. .capsrc_nids = alc882_capsrc_nids,
  9144. .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
  9145. .channel_mode = alc882_3ST_6ch_modes,
  9146. .need_dac_fix = 1,
  9147. .input_mux = &alc882_capture_source,
  9148. .unsol_event = alc882_targa_unsol_event,
  9149. .setup = alc882_targa_setup,
  9150. .init_hook = alc882_targa_automute,
  9151. },
  9152. [ALC882_ASUS_A7J] = {
  9153. .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
  9154. .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
  9155. alc882_asus_a7j_verbs},
  9156. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9157. .dac_nids = alc882_dac_nids,
  9158. .dig_out_nid = ALC882_DIGOUT_NID,
  9159. .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
  9160. .adc_nids = alc882_adc_nids,
  9161. .capsrc_nids = alc882_capsrc_nids,
  9162. .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
  9163. .channel_mode = alc882_3ST_6ch_modes,
  9164. .need_dac_fix = 1,
  9165. .input_mux = &alc882_capture_source,
  9166. },
  9167. [ALC882_ASUS_A7M] = {
  9168. .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
  9169. .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
  9170. alc882_eapd_verbs, alc880_gpio1_init_verbs,
  9171. alc882_asus_a7m_verbs },
  9172. .num_dacs = ARRAY_SIZE(alc882_dac_nids),
  9173. .dac_nids = alc882_dac_nids,
  9174. .dig_out_nid = ALC882_DIGOUT_NID,
  9175. .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
  9176. .channel_mode = alc880_threestack_modes,
  9177. .need_dac_fix = 1,
  9178. .input_mux = &alc882_capture_source,
  9179. },
  9180. [ALC883_3ST_2ch_DIG] = {
  9181. .mixers = { alc883_3ST_2ch_mixer },
  9182. .init_verbs = { alc883_init_verbs },
  9183. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9184. .dac_nids = alc883_dac_nids,
  9185. .dig_out_nid = ALC883_DIGOUT_NID,
  9186. .dig_in_nid = ALC883_DIGIN_NID,
  9187. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9188. .channel_mode = alc883_3ST_2ch_modes,
  9189. .input_mux = &alc883_capture_source,
  9190. },
  9191. [ALC883_3ST_6ch_DIG] = {
  9192. .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
  9193. .init_verbs = { alc883_init_verbs },
  9194. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9195. .dac_nids = alc883_dac_nids,
  9196. .dig_out_nid = ALC883_DIGOUT_NID,
  9197. .dig_in_nid = ALC883_DIGIN_NID,
  9198. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9199. .channel_mode = alc883_3ST_6ch_modes,
  9200. .need_dac_fix = 1,
  9201. .input_mux = &alc883_capture_source,
  9202. },
  9203. [ALC883_3ST_6ch] = {
  9204. .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
  9205. .init_verbs = { alc883_init_verbs },
  9206. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9207. .dac_nids = alc883_dac_nids,
  9208. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9209. .channel_mode = alc883_3ST_6ch_modes,
  9210. .need_dac_fix = 1,
  9211. .input_mux = &alc883_capture_source,
  9212. },
  9213. [ALC883_3ST_6ch_INTEL] = {
  9214. .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
  9215. .init_verbs = { alc883_init_verbs },
  9216. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9217. .dac_nids = alc883_dac_nids,
  9218. .dig_out_nid = ALC883_DIGOUT_NID,
  9219. .dig_in_nid = ALC883_DIGIN_NID,
  9220. .slave_dig_outs = alc883_slave_dig_outs,
  9221. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
  9222. .channel_mode = alc883_3ST_6ch_intel_modes,
  9223. .need_dac_fix = 1,
  9224. .input_mux = &alc883_3stack_6ch_intel,
  9225. },
  9226. [ALC889A_INTEL] = {
  9227. .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
  9228. .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
  9229. alc_hp15_unsol_verbs },
  9230. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9231. .dac_nids = alc883_dac_nids,
  9232. .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
  9233. .adc_nids = alc889_adc_nids,
  9234. .dig_out_nid = ALC883_DIGOUT_NID,
  9235. .dig_in_nid = ALC883_DIGIN_NID,
  9236. .slave_dig_outs = alc883_slave_dig_outs,
  9237. .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
  9238. .channel_mode = alc889_8ch_intel_modes,
  9239. .capsrc_nids = alc889_capsrc_nids,
  9240. .input_mux = &alc889_capture_source,
  9241. .setup = alc889_automute_setup,
  9242. .init_hook = alc_automute_amp,
  9243. .unsol_event = alc_automute_amp_unsol_event,
  9244. .need_dac_fix = 1,
  9245. },
  9246. [ALC889_INTEL] = {
  9247. .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
  9248. .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
  9249. alc889_eapd_verbs, alc_hp15_unsol_verbs},
  9250. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9251. .dac_nids = alc883_dac_nids,
  9252. .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
  9253. .adc_nids = alc889_adc_nids,
  9254. .dig_out_nid = ALC883_DIGOUT_NID,
  9255. .dig_in_nid = ALC883_DIGIN_NID,
  9256. .slave_dig_outs = alc883_slave_dig_outs,
  9257. .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
  9258. .channel_mode = alc889_8ch_intel_modes,
  9259. .capsrc_nids = alc889_capsrc_nids,
  9260. .input_mux = &alc889_capture_source,
  9261. .setup = alc889_automute_setup,
  9262. .init_hook = alc889_intel_init_hook,
  9263. .unsol_event = alc_automute_amp_unsol_event,
  9264. .need_dac_fix = 1,
  9265. },
  9266. [ALC883_6ST_DIG] = {
  9267. .mixers = { alc883_base_mixer, alc883_chmode_mixer },
  9268. .init_verbs = { alc883_init_verbs },
  9269. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9270. .dac_nids = alc883_dac_nids,
  9271. .dig_out_nid = ALC883_DIGOUT_NID,
  9272. .dig_in_nid = ALC883_DIGIN_NID,
  9273. .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
  9274. .channel_mode = alc883_sixstack_modes,
  9275. .input_mux = &alc883_capture_source,
  9276. },
  9277. [ALC883_TARGA_DIG] = {
  9278. .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
  9279. .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
  9280. alc883_targa_verbs},
  9281. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9282. .dac_nids = alc883_dac_nids,
  9283. .dig_out_nid = ALC883_DIGOUT_NID,
  9284. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9285. .channel_mode = alc883_3ST_6ch_modes,
  9286. .need_dac_fix = 1,
  9287. .input_mux = &alc883_capture_source,
  9288. .unsol_event = alc883_targa_unsol_event,
  9289. .setup = alc882_targa_setup,
  9290. .init_hook = alc882_targa_automute,
  9291. },
  9292. [ALC883_TARGA_2ch_DIG] = {
  9293. .mixers = { alc883_targa_2ch_mixer},
  9294. .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
  9295. alc883_targa_verbs},
  9296. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9297. .dac_nids = alc883_dac_nids,
  9298. .adc_nids = alc883_adc_nids_alt,
  9299. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
  9300. .capsrc_nids = alc883_capsrc_nids,
  9301. .dig_out_nid = ALC883_DIGOUT_NID,
  9302. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9303. .channel_mode = alc883_3ST_2ch_modes,
  9304. .input_mux = &alc883_capture_source,
  9305. .unsol_event = alc883_targa_unsol_event,
  9306. .setup = alc882_targa_setup,
  9307. .init_hook = alc882_targa_automute,
  9308. },
  9309. [ALC883_TARGA_8ch_DIG] = {
  9310. .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
  9311. alc883_chmode_mixer },
  9312. .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
  9313. alc883_targa_verbs },
  9314. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9315. .dac_nids = alc883_dac_nids,
  9316. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  9317. .adc_nids = alc883_adc_nids_rev,
  9318. .capsrc_nids = alc883_capsrc_nids_rev,
  9319. .dig_out_nid = ALC883_DIGOUT_NID,
  9320. .dig_in_nid = ALC883_DIGIN_NID,
  9321. .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
  9322. .channel_mode = alc883_4ST_8ch_modes,
  9323. .need_dac_fix = 1,
  9324. .input_mux = &alc883_capture_source,
  9325. .unsol_event = alc883_targa_unsol_event,
  9326. .setup = alc882_targa_setup,
  9327. .init_hook = alc882_targa_automute,
  9328. },
  9329. [ALC883_ACER] = {
  9330. .mixers = { alc883_base_mixer },
  9331. /* On TravelMate laptops, GPIO 0 enables the internal speaker
  9332. * and the headphone jack. Turn this on and rely on the
  9333. * standard mute methods whenever the user wants to turn
  9334. * these outputs off.
  9335. */
  9336. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
  9337. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9338. .dac_nids = alc883_dac_nids,
  9339. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9340. .channel_mode = alc883_3ST_2ch_modes,
  9341. .input_mux = &alc883_capture_source,
  9342. },
  9343. [ALC883_ACER_ASPIRE] = {
  9344. .mixers = { alc883_acer_aspire_mixer },
  9345. .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
  9346. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9347. .dac_nids = alc883_dac_nids,
  9348. .dig_out_nid = ALC883_DIGOUT_NID,
  9349. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9350. .channel_mode = alc883_3ST_2ch_modes,
  9351. .input_mux = &alc883_capture_source,
  9352. .unsol_event = alc_automute_amp_unsol_event,
  9353. .setup = alc883_acer_aspire_setup,
  9354. .init_hook = alc_automute_amp,
  9355. },
  9356. [ALC888_ACER_ASPIRE_4930G] = {
  9357. .mixers = { alc888_acer_aspire_4930g_mixer,
  9358. alc883_chmode_mixer },
  9359. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  9360. alc888_acer_aspire_4930g_verbs },
  9361. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9362. .dac_nids = alc883_dac_nids,
  9363. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  9364. .adc_nids = alc883_adc_nids_rev,
  9365. .capsrc_nids = alc883_capsrc_nids_rev,
  9366. .dig_out_nid = ALC883_DIGOUT_NID,
  9367. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9368. .channel_mode = alc883_3ST_6ch_modes,
  9369. .need_dac_fix = 1,
  9370. .const_channel_count = 6,
  9371. .num_mux_defs =
  9372. ARRAY_SIZE(alc888_2_capture_sources),
  9373. .input_mux = alc888_2_capture_sources,
  9374. .unsol_event = alc_automute_amp_unsol_event,
  9375. .setup = alc888_acer_aspire_4930g_setup,
  9376. .init_hook = alc_automute_amp,
  9377. },
  9378. [ALC888_ACER_ASPIRE_6530G] = {
  9379. .mixers = { alc888_acer_aspire_6530_mixer },
  9380. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  9381. alc888_acer_aspire_6530g_verbs },
  9382. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9383. .dac_nids = alc883_dac_nids,
  9384. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  9385. .adc_nids = alc883_adc_nids_rev,
  9386. .capsrc_nids = alc883_capsrc_nids_rev,
  9387. .dig_out_nid = ALC883_DIGOUT_NID,
  9388. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9389. .channel_mode = alc883_3ST_2ch_modes,
  9390. .num_mux_defs =
  9391. ARRAY_SIZE(alc888_2_capture_sources),
  9392. .input_mux = alc888_acer_aspire_6530_sources,
  9393. .unsol_event = alc_automute_amp_unsol_event,
  9394. .setup = alc888_acer_aspire_6530g_setup,
  9395. .init_hook = alc_automute_amp,
  9396. },
  9397. [ALC888_ACER_ASPIRE_8930G] = {
  9398. .mixers = { alc889_acer_aspire_8930g_mixer,
  9399. alc883_chmode_mixer },
  9400. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  9401. alc889_acer_aspire_8930g_verbs,
  9402. alc889_eapd_verbs},
  9403. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9404. .dac_nids = alc883_dac_nids,
  9405. .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
  9406. .adc_nids = alc889_adc_nids,
  9407. .capsrc_nids = alc889_capsrc_nids,
  9408. .dig_out_nid = ALC883_DIGOUT_NID,
  9409. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9410. .channel_mode = alc883_3ST_6ch_modes,
  9411. .need_dac_fix = 1,
  9412. .const_channel_count = 6,
  9413. .num_mux_defs =
  9414. ARRAY_SIZE(alc889_capture_sources),
  9415. .input_mux = alc889_capture_sources,
  9416. .unsol_event = alc_automute_amp_unsol_event,
  9417. .setup = alc889_acer_aspire_8930g_setup,
  9418. .init_hook = alc_automute_amp,
  9419. #ifdef CONFIG_SND_HDA_POWER_SAVE
  9420. .power_hook = alc_power_eapd,
  9421. #endif
  9422. },
  9423. [ALC888_ACER_ASPIRE_7730G] = {
  9424. .mixers = { alc883_3ST_6ch_mixer,
  9425. alc883_chmode_mixer },
  9426. .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
  9427. alc888_acer_aspire_7730G_verbs },
  9428. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9429. .dac_nids = alc883_dac_nids,
  9430. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  9431. .adc_nids = alc883_adc_nids_rev,
  9432. .capsrc_nids = alc883_capsrc_nids_rev,
  9433. .dig_out_nid = ALC883_DIGOUT_NID,
  9434. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9435. .channel_mode = alc883_3ST_6ch_modes,
  9436. .need_dac_fix = 1,
  9437. .const_channel_count = 6,
  9438. .input_mux = &alc883_capture_source,
  9439. .unsol_event = alc_automute_amp_unsol_event,
  9440. .setup = alc888_acer_aspire_7730g_setup,
  9441. .init_hook = alc_automute_amp,
  9442. },
  9443. [ALC883_MEDION] = {
  9444. .mixers = { alc883_fivestack_mixer,
  9445. alc883_chmode_mixer },
  9446. .init_verbs = { alc883_init_verbs,
  9447. alc883_medion_eapd_verbs },
  9448. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9449. .dac_nids = alc883_dac_nids,
  9450. .adc_nids = alc883_adc_nids_alt,
  9451. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
  9452. .capsrc_nids = alc883_capsrc_nids,
  9453. .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
  9454. .channel_mode = alc883_sixstack_modes,
  9455. .input_mux = &alc883_capture_source,
  9456. },
  9457. [ALC883_MEDION_WIM2160] = {
  9458. .mixers = { alc883_medion_wim2160_mixer },
  9459. .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
  9460. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9461. .dac_nids = alc883_dac_nids,
  9462. .dig_out_nid = ALC883_DIGOUT_NID,
  9463. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
  9464. .adc_nids = alc883_adc_nids,
  9465. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9466. .channel_mode = alc883_3ST_2ch_modes,
  9467. .input_mux = &alc883_capture_source,
  9468. .unsol_event = alc_automute_amp_unsol_event,
  9469. .setup = alc883_medion_wim2160_setup,
  9470. .init_hook = alc_automute_amp,
  9471. },
  9472. [ALC883_LAPTOP_EAPD] = {
  9473. .mixers = { alc883_base_mixer },
  9474. .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
  9475. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9476. .dac_nids = alc883_dac_nids,
  9477. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9478. .channel_mode = alc883_3ST_2ch_modes,
  9479. .input_mux = &alc883_capture_source,
  9480. },
  9481. [ALC883_CLEVO_M540R] = {
  9482. .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
  9483. .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
  9484. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9485. .dac_nids = alc883_dac_nids,
  9486. .dig_out_nid = ALC883_DIGOUT_NID,
  9487. .dig_in_nid = ALC883_DIGIN_NID,
  9488. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
  9489. .channel_mode = alc883_3ST_6ch_clevo_modes,
  9490. .need_dac_fix = 1,
  9491. .input_mux = &alc883_capture_source,
  9492. /* This machine has the hardware HP auto-muting, thus
  9493. * we need no software mute via unsol event
  9494. */
  9495. },
  9496. [ALC883_CLEVO_M720] = {
  9497. .mixers = { alc883_clevo_m720_mixer },
  9498. .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
  9499. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9500. .dac_nids = alc883_dac_nids,
  9501. .dig_out_nid = ALC883_DIGOUT_NID,
  9502. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9503. .channel_mode = alc883_3ST_2ch_modes,
  9504. .input_mux = &alc883_capture_source,
  9505. .unsol_event = alc883_clevo_m720_unsol_event,
  9506. .setup = alc883_clevo_m720_setup,
  9507. .init_hook = alc883_clevo_m720_init_hook,
  9508. },
  9509. [ALC883_LENOVO_101E_2ch] = {
  9510. .mixers = { alc883_lenovo_101e_2ch_mixer},
  9511. .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
  9512. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9513. .dac_nids = alc883_dac_nids,
  9514. .adc_nids = alc883_adc_nids_alt,
  9515. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
  9516. .capsrc_nids = alc883_capsrc_nids,
  9517. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9518. .channel_mode = alc883_3ST_2ch_modes,
  9519. .input_mux = &alc883_lenovo_101e_capture_source,
  9520. .unsol_event = alc883_lenovo_101e_unsol_event,
  9521. .init_hook = alc883_lenovo_101e_all_automute,
  9522. },
  9523. [ALC883_LENOVO_NB0763] = {
  9524. .mixers = { alc883_lenovo_nb0763_mixer },
  9525. .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
  9526. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9527. .dac_nids = alc883_dac_nids,
  9528. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9529. .channel_mode = alc883_3ST_2ch_modes,
  9530. .need_dac_fix = 1,
  9531. .input_mux = &alc883_lenovo_nb0763_capture_source,
  9532. .unsol_event = alc_automute_amp_unsol_event,
  9533. .setup = alc883_lenovo_nb0763_setup,
  9534. .init_hook = alc_automute_amp,
  9535. },
  9536. [ALC888_LENOVO_MS7195_DIG] = {
  9537. .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
  9538. .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
  9539. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9540. .dac_nids = alc883_dac_nids,
  9541. .dig_out_nid = ALC883_DIGOUT_NID,
  9542. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9543. .channel_mode = alc883_3ST_6ch_modes,
  9544. .need_dac_fix = 1,
  9545. .input_mux = &alc883_capture_source,
  9546. .unsol_event = alc883_lenovo_ms7195_unsol_event,
  9547. .init_hook = alc888_lenovo_ms7195_front_automute,
  9548. },
  9549. [ALC883_HAIER_W66] = {
  9550. .mixers = { alc883_targa_2ch_mixer},
  9551. .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
  9552. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9553. .dac_nids = alc883_dac_nids,
  9554. .dig_out_nid = ALC883_DIGOUT_NID,
  9555. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9556. .channel_mode = alc883_3ST_2ch_modes,
  9557. .input_mux = &alc883_capture_source,
  9558. .unsol_event = alc_automute_amp_unsol_event,
  9559. .setup = alc883_haier_w66_setup,
  9560. .init_hook = alc_automute_amp,
  9561. },
  9562. [ALC888_3ST_HP] = {
  9563. .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
  9564. .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
  9565. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9566. .dac_nids = alc883_dac_nids,
  9567. .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
  9568. .channel_mode = alc888_3st_hp_modes,
  9569. .need_dac_fix = 1,
  9570. .input_mux = &alc883_capture_source,
  9571. .unsol_event = alc_automute_amp_unsol_event,
  9572. .setup = alc888_3st_hp_setup,
  9573. .init_hook = alc_automute_amp,
  9574. },
  9575. [ALC888_6ST_DELL] = {
  9576. .mixers = { alc883_base_mixer, alc883_chmode_mixer },
  9577. .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
  9578. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9579. .dac_nids = alc883_dac_nids,
  9580. .dig_out_nid = ALC883_DIGOUT_NID,
  9581. .dig_in_nid = ALC883_DIGIN_NID,
  9582. .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
  9583. .channel_mode = alc883_sixstack_modes,
  9584. .input_mux = &alc883_capture_source,
  9585. .unsol_event = alc_automute_amp_unsol_event,
  9586. .setup = alc888_6st_dell_setup,
  9587. .init_hook = alc_automute_amp,
  9588. },
  9589. [ALC883_MITAC] = {
  9590. .mixers = { alc883_mitac_mixer },
  9591. .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
  9592. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9593. .dac_nids = alc883_dac_nids,
  9594. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9595. .channel_mode = alc883_3ST_2ch_modes,
  9596. .input_mux = &alc883_capture_source,
  9597. .unsol_event = alc_automute_amp_unsol_event,
  9598. .setup = alc883_mitac_setup,
  9599. .init_hook = alc_automute_amp,
  9600. },
  9601. [ALC883_FUJITSU_PI2515] = {
  9602. .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
  9603. .init_verbs = { alc883_init_verbs,
  9604. alc883_2ch_fujitsu_pi2515_verbs},
  9605. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9606. .dac_nids = alc883_dac_nids,
  9607. .dig_out_nid = ALC883_DIGOUT_NID,
  9608. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9609. .channel_mode = alc883_3ST_2ch_modes,
  9610. .input_mux = &alc883_fujitsu_pi2515_capture_source,
  9611. .unsol_event = alc_automute_amp_unsol_event,
  9612. .setup = alc883_2ch_fujitsu_pi2515_setup,
  9613. .init_hook = alc_automute_amp,
  9614. },
  9615. [ALC888_FUJITSU_XA3530] = {
  9616. .mixers = { alc888_base_mixer, alc883_chmode_mixer },
  9617. .init_verbs = { alc883_init_verbs,
  9618. alc888_fujitsu_xa3530_verbs },
  9619. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9620. .dac_nids = alc883_dac_nids,
  9621. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
  9622. .adc_nids = alc883_adc_nids_rev,
  9623. .capsrc_nids = alc883_capsrc_nids_rev,
  9624. .dig_out_nid = ALC883_DIGOUT_NID,
  9625. .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
  9626. .channel_mode = alc888_4ST_8ch_intel_modes,
  9627. .num_mux_defs =
  9628. ARRAY_SIZE(alc888_2_capture_sources),
  9629. .input_mux = alc888_2_capture_sources,
  9630. .unsol_event = alc_automute_amp_unsol_event,
  9631. .setup = alc888_fujitsu_xa3530_setup,
  9632. .init_hook = alc_automute_amp,
  9633. },
  9634. [ALC888_LENOVO_SKY] = {
  9635. .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
  9636. .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
  9637. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9638. .dac_nids = alc883_dac_nids,
  9639. .dig_out_nid = ALC883_DIGOUT_NID,
  9640. .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
  9641. .channel_mode = alc883_sixstack_modes,
  9642. .need_dac_fix = 1,
  9643. .input_mux = &alc883_lenovo_sky_capture_source,
  9644. .unsol_event = alc_automute_amp_unsol_event,
  9645. .setup = alc888_lenovo_sky_setup,
  9646. .init_hook = alc_automute_amp,
  9647. },
  9648. [ALC888_ASUS_M90V] = {
  9649. .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
  9650. .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
  9651. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9652. .dac_nids = alc883_dac_nids,
  9653. .dig_out_nid = ALC883_DIGOUT_NID,
  9654. .dig_in_nid = ALC883_DIGIN_NID,
  9655. .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
  9656. .channel_mode = alc883_3ST_6ch_modes,
  9657. .need_dac_fix = 1,
  9658. .input_mux = &alc883_fujitsu_pi2515_capture_source,
  9659. .unsol_event = alc_sku_unsol_event,
  9660. .setup = alc883_mode2_setup,
  9661. .init_hook = alc_inithook,
  9662. },
  9663. [ALC888_ASUS_EEE1601] = {
  9664. .mixers = { alc883_asus_eee1601_mixer },
  9665. .cap_mixer = alc883_asus_eee1601_cap_mixer,
  9666. .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
  9667. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9668. .dac_nids = alc883_dac_nids,
  9669. .dig_out_nid = ALC883_DIGOUT_NID,
  9670. .dig_in_nid = ALC883_DIGIN_NID,
  9671. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9672. .channel_mode = alc883_3ST_2ch_modes,
  9673. .need_dac_fix = 1,
  9674. .input_mux = &alc883_asus_eee1601_capture_source,
  9675. .unsol_event = alc_sku_unsol_event,
  9676. .init_hook = alc883_eee1601_inithook,
  9677. },
  9678. [ALC1200_ASUS_P5Q] = {
  9679. .mixers = { alc883_base_mixer, alc883_chmode_mixer },
  9680. .init_verbs = { alc883_init_verbs },
  9681. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9682. .dac_nids = alc883_dac_nids,
  9683. .dig_out_nid = ALC1200_DIGOUT_NID,
  9684. .dig_in_nid = ALC883_DIGIN_NID,
  9685. .slave_dig_outs = alc1200_slave_dig_outs,
  9686. .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
  9687. .channel_mode = alc883_sixstack_modes,
  9688. .input_mux = &alc883_capture_source,
  9689. },
  9690. [ALC889A_MB31] = {
  9691. .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
  9692. .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
  9693. alc880_gpio1_init_verbs },
  9694. .adc_nids = alc883_adc_nids,
  9695. .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
  9696. .capsrc_nids = alc883_capsrc_nids,
  9697. .dac_nids = alc883_dac_nids,
  9698. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9699. .channel_mode = alc889A_mb31_6ch_modes,
  9700. .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
  9701. .input_mux = &alc889A_mb31_capture_source,
  9702. .dig_out_nid = ALC883_DIGOUT_NID,
  9703. .unsol_event = alc889A_mb31_unsol_event,
  9704. .init_hook = alc889A_mb31_automute,
  9705. },
  9706. [ALC883_SONY_VAIO_TT] = {
  9707. .mixers = { alc883_vaiott_mixer },
  9708. .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
  9709. .num_dacs = ARRAY_SIZE(alc883_dac_nids),
  9710. .dac_nids = alc883_dac_nids,
  9711. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  9712. .channel_mode = alc883_3ST_2ch_modes,
  9713. .input_mux = &alc883_capture_source,
  9714. .unsol_event = alc_automute_amp_unsol_event,
  9715. .setup = alc883_vaiott_setup,
  9716. .init_hook = alc_automute_amp,
  9717. },
  9718. };
  9719. /*
  9720. * Pin config fixes
  9721. */
  9722. enum {
  9723. PINFIX_ABIT_AW9D_MAX,
  9724. PINFIX_LENOVO_Y530,
  9725. PINFIX_PB_M5210,
  9726. PINFIX_ACER_ASPIRE_7736,
  9727. };
  9728. static const struct alc_fixup alc882_fixups[] = {
  9729. [PINFIX_ABIT_AW9D_MAX] = {
  9730. .type = ALC_FIXUP_PINS,
  9731. .v.pins = (const struct alc_pincfg[]) {
  9732. { 0x15, 0x01080104 }, /* side */
  9733. { 0x16, 0x01011012 }, /* rear */
  9734. { 0x17, 0x01016011 }, /* clfe */
  9735. { }
  9736. }
  9737. },
  9738. [PINFIX_LENOVO_Y530] = {
  9739. .type = ALC_FIXUP_PINS,
  9740. .v.pins = (const struct alc_pincfg[]) {
  9741. { 0x15, 0x99130112 }, /* rear int speakers */
  9742. { 0x16, 0x99130111 }, /* subwoofer */
  9743. { }
  9744. }
  9745. },
  9746. [PINFIX_PB_M5210] = {
  9747. .type = ALC_FIXUP_VERBS,
  9748. .v.verbs = (const struct hda_verb[]) {
  9749. { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
  9750. {}
  9751. }
  9752. },
  9753. [PINFIX_ACER_ASPIRE_7736] = {
  9754. .type = ALC_FIXUP_SKU,
  9755. .v.sku = ALC_FIXUP_SKU_IGNORE,
  9756. },
  9757. };
  9758. static struct snd_pci_quirk alc882_fixup_tbl[] = {
  9759. SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
  9760. SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530),
  9761. SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
  9762. SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736),
  9763. {}
  9764. };
  9765. /*
  9766. * BIOS auto configuration
  9767. */
  9768. static int alc882_auto_create_input_ctls(struct hda_codec *codec,
  9769. const struct auto_pin_cfg *cfg)
  9770. {
  9771. return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
  9772. }
  9773. static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
  9774. hda_nid_t nid, int pin_type,
  9775. hda_nid_t dac)
  9776. {
  9777. int idx;
  9778. /* set as output */
  9779. alc_set_pin_output(codec, nid, pin_type);
  9780. if (dac == 0x25)
  9781. idx = 4;
  9782. else if (dac >= 0x02 && dac <= 0x05)
  9783. idx = dac - 2;
  9784. else
  9785. return;
  9786. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
  9787. }
  9788. static void alc882_auto_init_multi_out(struct hda_codec *codec)
  9789. {
  9790. struct alc_spec *spec = codec->spec;
  9791. int i;
  9792. for (i = 0; i <= HDA_SIDE; i++) {
  9793. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  9794. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  9795. if (nid)
  9796. alc882_auto_set_output_and_unmute(codec, nid, pin_type,
  9797. spec->multiout.dac_nids[i]);
  9798. }
  9799. }
  9800. static void alc882_auto_init_hp_out(struct hda_codec *codec)
  9801. {
  9802. struct alc_spec *spec = codec->spec;
  9803. hda_nid_t pin, dac;
  9804. int i;
  9805. if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT) {
  9806. for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
  9807. pin = spec->autocfg.hp_pins[i];
  9808. if (!pin)
  9809. break;
  9810. dac = spec->multiout.hp_nid;
  9811. if (!dac)
  9812. dac = spec->multiout.dac_nids[0]; /* to front */
  9813. alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
  9814. }
  9815. }
  9816. if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT) {
  9817. for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
  9818. pin = spec->autocfg.speaker_pins[i];
  9819. if (!pin)
  9820. break;
  9821. dac = spec->multiout.extra_out_nid[0];
  9822. if (!dac)
  9823. dac = spec->multiout.dac_nids[0]; /* to front */
  9824. alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
  9825. }
  9826. }
  9827. }
  9828. static void alc882_auto_init_analog_input(struct hda_codec *codec)
  9829. {
  9830. struct alc_spec *spec = codec->spec;
  9831. struct auto_pin_cfg *cfg = &spec->autocfg;
  9832. int i;
  9833. for (i = 0; i < cfg->num_inputs; i++) {
  9834. hda_nid_t nid = cfg->inputs[i].pin;
  9835. alc_set_input_pin(codec, nid, cfg->inputs[i].type);
  9836. if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
  9837. snd_hda_codec_write(codec, nid, 0,
  9838. AC_VERB_SET_AMP_GAIN_MUTE,
  9839. AMP_OUT_MUTE);
  9840. }
  9841. }
  9842. static void alc882_auto_init_input_src(struct hda_codec *codec)
  9843. {
  9844. struct alc_spec *spec = codec->spec;
  9845. int c;
  9846. for (c = 0; c < spec->num_adc_nids; c++) {
  9847. hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
  9848. hda_nid_t nid = spec->capsrc_nids[c];
  9849. unsigned int mux_idx;
  9850. const struct hda_input_mux *imux;
  9851. int conns, mute, idx, item;
  9852. conns = snd_hda_get_connections(codec, nid, conn_list,
  9853. ARRAY_SIZE(conn_list));
  9854. if (conns < 0)
  9855. continue;
  9856. mux_idx = c >= spec->num_mux_defs ? 0 : c;
  9857. imux = &spec->input_mux[mux_idx];
  9858. if (!imux->num_items && mux_idx > 0)
  9859. imux = &spec->input_mux[0];
  9860. for (idx = 0; idx < conns; idx++) {
  9861. /* if the current connection is the selected one,
  9862. * unmute it as default - otherwise mute it
  9863. */
  9864. mute = AMP_IN_MUTE(idx);
  9865. for (item = 0; item < imux->num_items; item++) {
  9866. if (imux->items[item].index == idx) {
  9867. if (spec->cur_mux[c] == item)
  9868. mute = AMP_IN_UNMUTE(idx);
  9869. break;
  9870. }
  9871. }
  9872. /* check if we have a selector or mixer
  9873. * we could check for the widget type instead, but
  9874. * just check for Amp-In presence (in case of mixer
  9875. * without amp-in there is something wrong, this
  9876. * function shouldn't be used or capsrc nid is wrong)
  9877. */
  9878. if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
  9879. snd_hda_codec_write(codec, nid, 0,
  9880. AC_VERB_SET_AMP_GAIN_MUTE,
  9881. mute);
  9882. else if (mute != AMP_IN_MUTE(idx))
  9883. snd_hda_codec_write(codec, nid, 0,
  9884. AC_VERB_SET_CONNECT_SEL,
  9885. idx);
  9886. }
  9887. }
  9888. }
  9889. /* add mic boosts if needed */
  9890. static int alc_auto_add_mic_boost(struct hda_codec *codec)
  9891. {
  9892. struct alc_spec *spec = codec->spec;
  9893. struct auto_pin_cfg *cfg = &spec->autocfg;
  9894. int i, err;
  9895. int type_idx = 0;
  9896. hda_nid_t nid;
  9897. const char *prev_label = NULL;
  9898. for (i = 0; i < cfg->num_inputs; i++) {
  9899. if (cfg->inputs[i].type > AUTO_PIN_MIC)
  9900. break;
  9901. nid = cfg->inputs[i].pin;
  9902. if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
  9903. const char *label;
  9904. char boost_label[32];
  9905. label = hda_get_autocfg_input_label(codec, cfg, i);
  9906. if (prev_label && !strcmp(label, prev_label))
  9907. type_idx++;
  9908. else
  9909. type_idx = 0;
  9910. prev_label = label;
  9911. snprintf(boost_label, sizeof(boost_label),
  9912. "%s Boost Volume", label);
  9913. err = add_control(spec, ALC_CTL_WIDGET_VOL,
  9914. boost_label, type_idx,
  9915. HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
  9916. if (err < 0)
  9917. return err;
  9918. }
  9919. }
  9920. return 0;
  9921. }
  9922. /* almost identical with ALC880 parser... */
  9923. static int alc882_parse_auto_config(struct hda_codec *codec)
  9924. {
  9925. struct alc_spec *spec = codec->spec;
  9926. static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
  9927. int err;
  9928. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  9929. alc882_ignore);
  9930. if (err < 0)
  9931. return err;
  9932. if (!spec->autocfg.line_outs)
  9933. return 0; /* can't find valid BIOS pin config */
  9934. err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
  9935. if (err < 0)
  9936. return err;
  9937. err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
  9938. if (err < 0)
  9939. return err;
  9940. err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
  9941. "Headphone");
  9942. if (err < 0)
  9943. return err;
  9944. err = alc880_auto_create_extra_out(spec,
  9945. spec->autocfg.speaker_pins[0],
  9946. "Speaker");
  9947. if (err < 0)
  9948. return err;
  9949. err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
  9950. if (err < 0)
  9951. return err;
  9952. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  9953. alc_auto_parse_digital(codec);
  9954. if (spec->kctls.list)
  9955. add_mixer(spec, spec->kctls.list);
  9956. add_verb(spec, alc883_auto_init_verbs);
  9957. /* if ADC 0x07 is available, initialize it, too */
  9958. if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
  9959. add_verb(spec, alc882_adc1_init_verbs);
  9960. spec->num_mux_defs = 1;
  9961. spec->input_mux = &spec->private_imux[0];
  9962. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  9963. err = alc_auto_add_mic_boost(codec);
  9964. if (err < 0)
  9965. return err;
  9966. return 1; /* config found */
  9967. }
  9968. /* additional initialization for auto-configuration model */
  9969. static void alc882_auto_init(struct hda_codec *codec)
  9970. {
  9971. struct alc_spec *spec = codec->spec;
  9972. alc882_auto_init_multi_out(codec);
  9973. alc882_auto_init_hp_out(codec);
  9974. alc882_auto_init_analog_input(codec);
  9975. alc882_auto_init_input_src(codec);
  9976. alc_auto_init_digital(codec);
  9977. if (spec->unsol_event)
  9978. alc_inithook(codec);
  9979. }
  9980. static int patch_alc882(struct hda_codec *codec)
  9981. {
  9982. struct alc_spec *spec;
  9983. int err, board_config;
  9984. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  9985. if (spec == NULL)
  9986. return -ENOMEM;
  9987. codec->spec = spec;
  9988. switch (codec->vendor_id) {
  9989. case 0x10ec0882:
  9990. case 0x10ec0885:
  9991. break;
  9992. default:
  9993. /* ALC883 and variants */
  9994. alc_fix_pll_init(codec, 0x20, 0x0a, 10);
  9995. break;
  9996. }
  9997. board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
  9998. alc882_models,
  9999. alc882_cfg_tbl);
  10000. if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
  10001. board_config = snd_hda_check_board_codec_sid_config(codec,
  10002. ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
  10003. if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
  10004. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  10005. codec->chip_name);
  10006. board_config = ALC882_AUTO;
  10007. }
  10008. if (board_config == ALC882_AUTO) {
  10009. alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
  10010. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  10011. }
  10012. alc_auto_parse_customize_define(codec);
  10013. if (board_config == ALC882_AUTO) {
  10014. /* automatic parse from the BIOS config */
  10015. err = alc882_parse_auto_config(codec);
  10016. if (err < 0) {
  10017. alc_free(codec);
  10018. return err;
  10019. } else if (!err) {
  10020. printk(KERN_INFO
  10021. "hda_codec: Cannot set up configuration "
  10022. "from BIOS. Using base mode...\n");
  10023. board_config = ALC882_3ST_DIG;
  10024. }
  10025. }
  10026. if (has_cdefine_beep(codec)) {
  10027. err = snd_hda_attach_beep_device(codec, 0x1);
  10028. if (err < 0) {
  10029. alc_free(codec);
  10030. return err;
  10031. }
  10032. }
  10033. if (board_config != ALC882_AUTO)
  10034. setup_preset(codec, &alc882_presets[board_config]);
  10035. spec->stream_analog_playback = &alc882_pcm_analog_playback;
  10036. spec->stream_analog_capture = &alc882_pcm_analog_capture;
  10037. /* FIXME: setup DAC5 */
  10038. /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
  10039. spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
  10040. spec->stream_digital_playback = &alc882_pcm_digital_playback;
  10041. spec->stream_digital_capture = &alc882_pcm_digital_capture;
  10042. if (!spec->adc_nids && spec->input_mux) {
  10043. int i, j;
  10044. spec->num_adc_nids = 0;
  10045. for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
  10046. const struct hda_input_mux *imux = spec->input_mux;
  10047. hda_nid_t cap;
  10048. hda_nid_t items[16];
  10049. hda_nid_t nid = alc882_adc_nids[i];
  10050. unsigned int wcap = get_wcaps(codec, nid);
  10051. /* get type */
  10052. wcap = get_wcaps_type(wcap);
  10053. if (wcap != AC_WID_AUD_IN)
  10054. continue;
  10055. spec->private_adc_nids[spec->num_adc_nids] = nid;
  10056. err = snd_hda_get_connections(codec, nid, &cap, 1);
  10057. if (err < 0)
  10058. continue;
  10059. err = snd_hda_get_connections(codec, cap, items,
  10060. ARRAY_SIZE(items));
  10061. if (err < 0)
  10062. continue;
  10063. for (j = 0; j < imux->num_items; j++)
  10064. if (imux->items[j].index >= err)
  10065. break;
  10066. if (j < imux->num_items)
  10067. continue;
  10068. spec->private_capsrc_nids[spec->num_adc_nids] = cap;
  10069. spec->num_adc_nids++;
  10070. }
  10071. spec->adc_nids = spec->private_adc_nids;
  10072. spec->capsrc_nids = spec->private_capsrc_nids;
  10073. }
  10074. set_capture_mixer(codec);
  10075. if (has_cdefine_beep(codec))
  10076. set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
  10077. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  10078. spec->vmaster_nid = 0x0c;
  10079. codec->patch_ops = alc_patch_ops;
  10080. if (board_config == ALC882_AUTO)
  10081. spec->init_hook = alc882_auto_init;
  10082. alc_init_jacks(codec);
  10083. #ifdef CONFIG_SND_HDA_POWER_SAVE
  10084. if (!spec->loopback.amplist)
  10085. spec->loopback.amplist = alc882_loopbacks;
  10086. #endif
  10087. return 0;
  10088. }
  10089. /*
  10090. * ALC262 support
  10091. */
  10092. #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
  10093. #define ALC262_DIGIN_NID ALC880_DIGIN_NID
  10094. #define alc262_dac_nids alc260_dac_nids
  10095. #define alc262_adc_nids alc882_adc_nids
  10096. #define alc262_adc_nids_alt alc882_adc_nids_alt
  10097. #define alc262_capsrc_nids alc882_capsrc_nids
  10098. #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
  10099. #define alc262_modes alc260_modes
  10100. #define alc262_capture_source alc882_capture_source
  10101. static hda_nid_t alc262_dmic_adc_nids[1] = {
  10102. /* ADC0 */
  10103. 0x09
  10104. };
  10105. static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
  10106. static struct snd_kcontrol_new alc262_base_mixer[] = {
  10107. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10108. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  10109. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10110. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10111. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  10112. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  10113. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10114. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10115. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10116. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10117. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10118. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10119. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
  10120. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10121. HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
  10122. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  10123. { } /* end */
  10124. };
  10125. /* update HP, line and mono-out pins according to the master switch */
  10126. static void alc262_hp_master_update(struct hda_codec *codec)
  10127. {
  10128. struct alc_spec *spec = codec->spec;
  10129. int val = spec->master_sw;
  10130. /* HP & line-out */
  10131. snd_hda_codec_write_cache(codec, 0x1b, 0,
  10132. AC_VERB_SET_PIN_WIDGET_CONTROL,
  10133. val ? PIN_HP : 0);
  10134. snd_hda_codec_write_cache(codec, 0x15, 0,
  10135. AC_VERB_SET_PIN_WIDGET_CONTROL,
  10136. val ? PIN_HP : 0);
  10137. /* mono (speaker) depending on the HP jack sense */
  10138. val = val && !spec->jack_present;
  10139. snd_hda_codec_write_cache(codec, 0x16, 0,
  10140. AC_VERB_SET_PIN_WIDGET_CONTROL,
  10141. val ? PIN_OUT : 0);
  10142. }
  10143. static void alc262_hp_bpc_automute(struct hda_codec *codec)
  10144. {
  10145. struct alc_spec *spec = codec->spec;
  10146. spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
  10147. alc262_hp_master_update(codec);
  10148. }
  10149. static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
  10150. {
  10151. if ((res >> 26) != ALC880_HP_EVENT)
  10152. return;
  10153. alc262_hp_bpc_automute(codec);
  10154. }
  10155. static void alc262_hp_wildwest_automute(struct hda_codec *codec)
  10156. {
  10157. struct alc_spec *spec = codec->spec;
  10158. spec->jack_present = snd_hda_jack_detect(codec, 0x15);
  10159. alc262_hp_master_update(codec);
  10160. }
  10161. static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
  10162. unsigned int res)
  10163. {
  10164. if ((res >> 26) != ALC880_HP_EVENT)
  10165. return;
  10166. alc262_hp_wildwest_automute(codec);
  10167. }
  10168. #define alc262_hp_master_sw_get alc260_hp_master_sw_get
  10169. static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
  10170. struct snd_ctl_elem_value *ucontrol)
  10171. {
  10172. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  10173. struct alc_spec *spec = codec->spec;
  10174. int val = !!*ucontrol->value.integer.value;
  10175. if (val == spec->master_sw)
  10176. return 0;
  10177. spec->master_sw = val;
  10178. alc262_hp_master_update(codec);
  10179. return 1;
  10180. }
  10181. #define ALC262_HP_MASTER_SWITCH \
  10182. { \
  10183. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  10184. .name = "Master Playback Switch", \
  10185. .info = snd_ctl_boolean_mono_info, \
  10186. .get = alc262_hp_master_sw_get, \
  10187. .put = alc262_hp_master_sw_put, \
  10188. }, \
  10189. { \
  10190. .iface = NID_MAPPING, \
  10191. .name = "Master Playback Switch", \
  10192. .private_value = 0x15 | (0x16 << 8) | (0x1b << 16), \
  10193. }
  10194. static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
  10195. ALC262_HP_MASTER_SWITCH,
  10196. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10197. HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10198. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  10199. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
  10200. HDA_OUTPUT),
  10201. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
  10202. HDA_OUTPUT),
  10203. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10204. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10205. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10206. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10207. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10208. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10209. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  10210. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  10211. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10212. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10213. HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
  10214. HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
  10215. { } /* end */
  10216. };
  10217. static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
  10218. ALC262_HP_MASTER_SWITCH,
  10219. HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10220. HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  10221. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  10222. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10223. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
  10224. HDA_OUTPUT),
  10225. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
  10226. HDA_OUTPUT),
  10227. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
  10228. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
  10229. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x1a, 0, HDA_INPUT),
  10230. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10231. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10232. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10233. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10234. { } /* end */
  10235. };
  10236. static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
  10237. HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10238. HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10239. HDA_CODEC_VOLUME("Rear Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10240. { } /* end */
  10241. };
  10242. /* mute/unmute internal speaker according to the hp jack and mute state */
  10243. static void alc262_hp_t5735_setup(struct hda_codec *codec)
  10244. {
  10245. struct alc_spec *spec = codec->spec;
  10246. spec->autocfg.hp_pins[0] = 0x15;
  10247. spec->autocfg.speaker_pins[0] = 0x14;
  10248. }
  10249. static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
  10250. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10251. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  10252. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  10253. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10254. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10255. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10256. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10257. { } /* end */
  10258. };
  10259. static struct hda_verb alc262_hp_t5735_verbs[] = {
  10260. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  10261. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10262. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  10263. { }
  10264. };
  10265. static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
  10266. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10267. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  10268. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
  10269. HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
  10270. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10271. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10272. { } /* end */
  10273. };
  10274. static struct hda_verb alc262_hp_rp5700_verbs[] = {
  10275. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  10276. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  10277. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  10278. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  10279. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  10280. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  10281. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  10282. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  10283. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
  10284. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
  10285. {}
  10286. };
  10287. static struct hda_input_mux alc262_hp_rp5700_capture_source = {
  10288. .num_items = 1,
  10289. .items = {
  10290. { "Line", 0x1 },
  10291. },
  10292. };
  10293. /* bind hp and internal speaker mute (with plug check) as master switch */
  10294. static void alc262_hippo_master_update(struct hda_codec *codec)
  10295. {
  10296. struct alc_spec *spec = codec->spec;
  10297. hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
  10298. hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
  10299. hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
  10300. unsigned int mute;
  10301. /* HP */
  10302. mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
  10303. snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
  10304. HDA_AMP_MUTE, mute);
  10305. /* mute internal speaker per jack sense */
  10306. if (spec->jack_present)
  10307. mute = HDA_AMP_MUTE;
  10308. if (line_nid)
  10309. snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
  10310. HDA_AMP_MUTE, mute);
  10311. if (speaker_nid && speaker_nid != line_nid)
  10312. snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
  10313. HDA_AMP_MUTE, mute);
  10314. }
  10315. #define alc262_hippo_master_sw_get alc262_hp_master_sw_get
  10316. static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
  10317. struct snd_ctl_elem_value *ucontrol)
  10318. {
  10319. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  10320. struct alc_spec *spec = codec->spec;
  10321. int val = !!*ucontrol->value.integer.value;
  10322. if (val == spec->master_sw)
  10323. return 0;
  10324. spec->master_sw = val;
  10325. alc262_hippo_master_update(codec);
  10326. return 1;
  10327. }
  10328. #define ALC262_HIPPO_MASTER_SWITCH \
  10329. { \
  10330. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  10331. .name = "Master Playback Switch", \
  10332. .info = snd_ctl_boolean_mono_info, \
  10333. .get = alc262_hippo_master_sw_get, \
  10334. .put = alc262_hippo_master_sw_put, \
  10335. }, \
  10336. { \
  10337. .iface = NID_MAPPING, \
  10338. .name = "Master Playback Switch", \
  10339. .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
  10340. (SUBDEV_SPEAKER(0) << 16), \
  10341. }
  10342. static struct snd_kcontrol_new alc262_hippo_mixer[] = {
  10343. ALC262_HIPPO_MASTER_SWITCH,
  10344. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10345. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10346. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10347. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  10348. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  10349. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10350. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10351. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10352. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10353. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10354. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10355. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  10356. { } /* end */
  10357. };
  10358. static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
  10359. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10360. ALC262_HIPPO_MASTER_SWITCH,
  10361. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10362. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10363. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  10364. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  10365. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10366. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10367. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10368. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10369. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10370. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10371. { } /* end */
  10372. };
  10373. /* mute/unmute internal speaker according to the hp jack and mute state */
  10374. static void alc262_hippo_automute(struct hda_codec *codec)
  10375. {
  10376. struct alc_spec *spec = codec->spec;
  10377. hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
  10378. spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
  10379. alc262_hippo_master_update(codec);
  10380. }
  10381. static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
  10382. {
  10383. if ((res >> 26) != ALC880_HP_EVENT)
  10384. return;
  10385. alc262_hippo_automute(codec);
  10386. }
  10387. static void alc262_hippo_setup(struct hda_codec *codec)
  10388. {
  10389. struct alc_spec *spec = codec->spec;
  10390. spec->autocfg.hp_pins[0] = 0x15;
  10391. spec->autocfg.speaker_pins[0] = 0x14;
  10392. }
  10393. static void alc262_hippo1_setup(struct hda_codec *codec)
  10394. {
  10395. struct alc_spec *spec = codec->spec;
  10396. spec->autocfg.hp_pins[0] = 0x1b;
  10397. spec->autocfg.speaker_pins[0] = 0x14;
  10398. }
  10399. static struct snd_kcontrol_new alc262_sony_mixer[] = {
  10400. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10401. ALC262_HIPPO_MASTER_SWITCH,
  10402. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10403. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10404. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10405. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10406. { } /* end */
  10407. };
  10408. static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
  10409. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10410. ALC262_HIPPO_MASTER_SWITCH,
  10411. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10412. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10413. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10414. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10415. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10416. { } /* end */
  10417. };
  10418. static struct snd_kcontrol_new alc262_tyan_mixer[] = {
  10419. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10420. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  10421. HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
  10422. HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
  10423. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  10424. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  10425. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10426. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10427. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10428. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10429. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10430. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10431. { } /* end */
  10432. };
  10433. static struct hda_verb alc262_tyan_verbs[] = {
  10434. /* Headphone automute */
  10435. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  10436. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10437. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  10438. /* P11 AUX_IN, white 4-pin connector */
  10439. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  10440. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
  10441. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
  10442. {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
  10443. {}
  10444. };
  10445. /* unsolicited event for HP jack sensing */
  10446. static void alc262_tyan_setup(struct hda_codec *codec)
  10447. {
  10448. struct alc_spec *spec = codec->spec;
  10449. spec->autocfg.hp_pins[0] = 0x1b;
  10450. spec->autocfg.speaker_pins[0] = 0x15;
  10451. }
  10452. #define alc262_capture_mixer alc882_capture_mixer
  10453. #define alc262_capture_alt_mixer alc882_capture_alt_mixer
  10454. /*
  10455. * generic initialization of ADC, input mixers and output mixers
  10456. */
  10457. static struct hda_verb alc262_init_verbs[] = {
  10458. /*
  10459. * Unmute ADC0-2 and set the default input to mic-in
  10460. */
  10461. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  10462. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10463. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  10464. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10465. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  10466. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10467. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  10468. * mixer widget
  10469. * Note: PASD motherboards uses the Line In 2 as the input for
  10470. * front panel mic (mic 2)
  10471. */
  10472. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  10473. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  10474. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  10475. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  10476. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  10477. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  10478. /*
  10479. * Set up output mixers (0x0c - 0x0e)
  10480. */
  10481. /* set vol=0 to output mixers */
  10482. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  10483. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  10484. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  10485. /* set up input amps for analog loopback */
  10486. /* Amp Indices: DAC = 0, mixer = 1 */
  10487. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10488. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  10489. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10490. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  10491. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10492. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  10493. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  10494. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  10495. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  10496. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  10497. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  10498. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  10499. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  10500. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  10501. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  10502. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  10503. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  10504. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  10505. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  10506. /* FIXME: use matrix-type input source selection */
  10507. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  10508. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  10509. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  10510. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  10511. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  10512. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  10513. /* Input mixer2 */
  10514. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  10515. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  10516. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  10517. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  10518. /* Input mixer3 */
  10519. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  10520. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  10521. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  10522. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  10523. { }
  10524. };
  10525. static struct hda_verb alc262_eapd_verbs[] = {
  10526. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  10527. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  10528. { }
  10529. };
  10530. static struct hda_verb alc262_hippo1_unsol_verbs[] = {
  10531. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  10532. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  10533. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
  10534. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  10535. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10536. {}
  10537. };
  10538. static struct hda_verb alc262_sony_unsol_verbs[] = {
  10539. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  10540. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  10541. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
  10542. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  10543. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10544. {}
  10545. };
  10546. static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
  10547. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10548. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  10549. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10550. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10551. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10552. { } /* end */
  10553. };
  10554. static struct hda_verb alc262_toshiba_s06_verbs[] = {
  10555. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  10556. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  10557. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10558. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  10559. {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
  10560. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  10561. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  10562. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  10563. {}
  10564. };
  10565. static void alc262_toshiba_s06_setup(struct hda_codec *codec)
  10566. {
  10567. struct alc_spec *spec = codec->spec;
  10568. spec->autocfg.hp_pins[0] = 0x15;
  10569. spec->autocfg.speaker_pins[0] = 0x14;
  10570. spec->ext_mic.pin = 0x18;
  10571. spec->ext_mic.mux_idx = 0;
  10572. spec->int_mic.pin = 0x12;
  10573. spec->int_mic.mux_idx = 9;
  10574. spec->auto_mic = 1;
  10575. }
  10576. /*
  10577. * nec model
  10578. * 0x15 = headphone
  10579. * 0x16 = internal speaker
  10580. * 0x18 = external mic
  10581. */
  10582. static struct snd_kcontrol_new alc262_nec_mixer[] = {
  10583. HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
  10584. HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
  10585. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10586. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10587. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10588. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
  10589. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  10590. { } /* end */
  10591. };
  10592. static struct hda_verb alc262_nec_verbs[] = {
  10593. /* Unmute Speaker */
  10594. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  10595. /* Headphone */
  10596. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  10597. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  10598. /* External mic to headphone */
  10599. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  10600. /* External mic to speaker */
  10601. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  10602. {}
  10603. };
  10604. /*
  10605. * fujitsu model
  10606. * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
  10607. * 0x1b = port replicator headphone out
  10608. */
  10609. #define ALC_HP_EVENT 0x37
  10610. static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
  10611. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  10612. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10613. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  10614. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10615. {}
  10616. };
  10617. static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
  10618. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
  10619. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10620. {}
  10621. };
  10622. static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
  10623. /* Front Mic pin: input vref at 50% */
  10624. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  10625. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  10626. {}
  10627. };
  10628. static struct hda_input_mux alc262_fujitsu_capture_source = {
  10629. .num_items = 3,
  10630. .items = {
  10631. { "Mic", 0x0 },
  10632. { "Internal Mic", 0x1 },
  10633. { "CD", 0x4 },
  10634. },
  10635. };
  10636. static struct hda_input_mux alc262_HP_capture_source = {
  10637. .num_items = 5,
  10638. .items = {
  10639. { "Mic", 0x0 },
  10640. { "Front Mic", 0x1 },
  10641. { "Line", 0x2 },
  10642. { "CD", 0x4 },
  10643. { "AUX IN", 0x6 },
  10644. },
  10645. };
  10646. static struct hda_input_mux alc262_HP_D7000_capture_source = {
  10647. .num_items = 4,
  10648. .items = {
  10649. { "Mic", 0x0 },
  10650. { "Front Mic", 0x2 },
  10651. { "Line", 0x1 },
  10652. { "CD", 0x4 },
  10653. },
  10654. };
  10655. /* mute/unmute internal speaker according to the hp jacks and mute state */
  10656. static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
  10657. {
  10658. struct alc_spec *spec = codec->spec;
  10659. unsigned int mute;
  10660. if (force || !spec->sense_updated) {
  10661. spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
  10662. snd_hda_jack_detect(codec, 0x1b);
  10663. spec->sense_updated = 1;
  10664. }
  10665. /* unmute internal speaker only if both HPs are unplugged and
  10666. * master switch is on
  10667. */
  10668. if (spec->jack_present)
  10669. mute = HDA_AMP_MUTE;
  10670. else
  10671. mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
  10672. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  10673. HDA_AMP_MUTE, mute);
  10674. }
  10675. /* unsolicited event for HP jack sensing */
  10676. static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
  10677. unsigned int res)
  10678. {
  10679. if ((res >> 26) != ALC_HP_EVENT)
  10680. return;
  10681. alc262_fujitsu_automute(codec, 1);
  10682. }
  10683. static void alc262_fujitsu_init_hook(struct hda_codec *codec)
  10684. {
  10685. alc262_fujitsu_automute(codec, 1);
  10686. }
  10687. /* bind volumes of both NID 0x0c and 0x0d */
  10688. static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
  10689. .ops = &snd_hda_bind_vol,
  10690. .values = {
  10691. HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
  10692. HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
  10693. 0
  10694. },
  10695. };
  10696. /* mute/unmute internal speaker according to the hp jack and mute state */
  10697. static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
  10698. {
  10699. struct alc_spec *spec = codec->spec;
  10700. unsigned int mute;
  10701. if (force || !spec->sense_updated) {
  10702. spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
  10703. spec->sense_updated = 1;
  10704. }
  10705. if (spec->jack_present) {
  10706. /* mute internal speaker */
  10707. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  10708. HDA_AMP_MUTE, HDA_AMP_MUTE);
  10709. snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
  10710. HDA_AMP_MUTE, HDA_AMP_MUTE);
  10711. } else {
  10712. /* unmute internal speaker if necessary */
  10713. mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
  10714. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  10715. HDA_AMP_MUTE, mute);
  10716. snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
  10717. HDA_AMP_MUTE, mute);
  10718. }
  10719. }
  10720. /* unsolicited event for HP jack sensing */
  10721. static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
  10722. unsigned int res)
  10723. {
  10724. if ((res >> 26) != ALC_HP_EVENT)
  10725. return;
  10726. alc262_lenovo_3000_automute(codec, 1);
  10727. }
  10728. static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
  10729. int dir, int idx, long *valp)
  10730. {
  10731. int i, change = 0;
  10732. for (i = 0; i < 2; i++, valp++)
  10733. change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
  10734. HDA_AMP_MUTE,
  10735. *valp ? 0 : HDA_AMP_MUTE);
  10736. return change;
  10737. }
  10738. /* bind hp and internal speaker mute (with plug check) */
  10739. static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
  10740. struct snd_ctl_elem_value *ucontrol)
  10741. {
  10742. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  10743. long *valp = ucontrol->value.integer.value;
  10744. int change;
  10745. change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
  10746. change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
  10747. if (change)
  10748. alc262_fujitsu_automute(codec, 0);
  10749. return change;
  10750. }
  10751. static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
  10752. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  10753. {
  10754. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  10755. .name = "Master Playback Switch",
  10756. .subdevice = HDA_SUBDEV_AMP_FLAG,
  10757. .info = snd_hda_mixer_amp_switch_info,
  10758. .get = snd_hda_mixer_amp_switch_get,
  10759. .put = alc262_fujitsu_master_sw_put,
  10760. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  10761. },
  10762. {
  10763. .iface = NID_MAPPING,
  10764. .name = "Master Playback Switch",
  10765. .private_value = 0x1b,
  10766. },
  10767. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10768. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10769. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10770. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10771. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10772. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10773. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  10774. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  10775. { } /* end */
  10776. };
  10777. /* bind hp and internal speaker mute (with plug check) */
  10778. static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
  10779. struct snd_ctl_elem_value *ucontrol)
  10780. {
  10781. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  10782. long *valp = ucontrol->value.integer.value;
  10783. int change;
  10784. change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
  10785. if (change)
  10786. alc262_lenovo_3000_automute(codec, 0);
  10787. return change;
  10788. }
  10789. static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
  10790. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  10791. {
  10792. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  10793. .name = "Master Playback Switch",
  10794. .subdevice = HDA_SUBDEV_AMP_FLAG,
  10795. .info = snd_hda_mixer_amp_switch_info,
  10796. .get = snd_hda_mixer_amp_switch_get,
  10797. .put = alc262_lenovo_3000_master_sw_put,
  10798. .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
  10799. },
  10800. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  10801. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  10802. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10803. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10804. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10805. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10806. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  10807. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  10808. { } /* end */
  10809. };
  10810. static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
  10811. HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
  10812. ALC262_HIPPO_MASTER_SWITCH,
  10813. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  10814. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  10815. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  10816. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10817. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10818. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10819. { } /* end */
  10820. };
  10821. /* additional init verbs for Benq laptops */
  10822. static struct hda_verb alc262_EAPD_verbs[] = {
  10823. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  10824. {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
  10825. {}
  10826. };
  10827. static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
  10828. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  10829. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  10830. {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
  10831. {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
  10832. {}
  10833. };
  10834. /* Samsung Q1 Ultra Vista model setup */
  10835. static struct snd_kcontrol_new alc262_ultra_mixer[] = {
  10836. HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
  10837. HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
  10838. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  10839. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  10840. HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
  10841. HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT),
  10842. { } /* end */
  10843. };
  10844. static struct hda_verb alc262_ultra_verbs[] = {
  10845. /* output mixer */
  10846. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  10847. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  10848. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  10849. /* speaker */
  10850. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  10851. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  10852. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10853. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  10854. /* HP */
  10855. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  10856. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  10857. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  10858. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  10859. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  10860. /* internal mic */
  10861. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  10862. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  10863. /* ADC, choose mic */
  10864. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  10865. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  10866. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  10867. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  10868. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  10869. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  10870. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  10871. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  10872. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  10873. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
  10874. {}
  10875. };
  10876. /* mute/unmute internal speaker according to the hp jack and mute state */
  10877. static void alc262_ultra_automute(struct hda_codec *codec)
  10878. {
  10879. struct alc_spec *spec = codec->spec;
  10880. unsigned int mute;
  10881. mute = 0;
  10882. /* auto-mute only when HP is used as HP */
  10883. if (!spec->cur_mux[0]) {
  10884. spec->jack_present = snd_hda_jack_detect(codec, 0x15);
  10885. if (spec->jack_present)
  10886. mute = HDA_AMP_MUTE;
  10887. }
  10888. /* mute/unmute internal speaker */
  10889. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  10890. HDA_AMP_MUTE, mute);
  10891. /* mute/unmute HP */
  10892. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  10893. HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
  10894. }
  10895. /* unsolicited event for HP jack sensing */
  10896. static void alc262_ultra_unsol_event(struct hda_codec *codec,
  10897. unsigned int res)
  10898. {
  10899. if ((res >> 26) != ALC880_HP_EVENT)
  10900. return;
  10901. alc262_ultra_automute(codec);
  10902. }
  10903. static struct hda_input_mux alc262_ultra_capture_source = {
  10904. .num_items = 2,
  10905. .items = {
  10906. { "Mic", 0x1 },
  10907. { "Headphone", 0x7 },
  10908. },
  10909. };
  10910. static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
  10911. struct snd_ctl_elem_value *ucontrol)
  10912. {
  10913. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  10914. struct alc_spec *spec = codec->spec;
  10915. int ret;
  10916. ret = alc_mux_enum_put(kcontrol, ucontrol);
  10917. if (!ret)
  10918. return 0;
  10919. /* reprogram the HP pin as mic or HP according to the input source */
  10920. snd_hda_codec_write_cache(codec, 0x15, 0,
  10921. AC_VERB_SET_PIN_WIDGET_CONTROL,
  10922. spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
  10923. alc262_ultra_automute(codec); /* mute/unmute HP */
  10924. return ret;
  10925. }
  10926. static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
  10927. HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
  10928. HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
  10929. {
  10930. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  10931. .name = "Capture Source",
  10932. .info = alc_mux_enum_info,
  10933. .get = alc_mux_enum_get,
  10934. .put = alc262_ultra_mux_enum_put,
  10935. },
  10936. {
  10937. .iface = NID_MAPPING,
  10938. .name = "Capture Source",
  10939. .private_value = 0x15,
  10940. },
  10941. { } /* end */
  10942. };
  10943. /* We use two mixers depending on the output pin; 0x16 is a mono output
  10944. * and thus it's bound with a different mixer.
  10945. * This function returns which mixer amp should be used.
  10946. */
  10947. static int alc262_check_volbit(hda_nid_t nid)
  10948. {
  10949. if (!nid)
  10950. return 0;
  10951. else if (nid == 0x16)
  10952. return 2;
  10953. else
  10954. return 1;
  10955. }
  10956. static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
  10957. const char *pfx, int *vbits, int idx)
  10958. {
  10959. unsigned long val;
  10960. int vbit;
  10961. vbit = alc262_check_volbit(nid);
  10962. if (!vbit)
  10963. return 0;
  10964. if (*vbits & vbit) /* a volume control for this mixer already there */
  10965. return 0;
  10966. *vbits |= vbit;
  10967. if (vbit == 2)
  10968. val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
  10969. else
  10970. val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
  10971. return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx, val);
  10972. }
  10973. static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
  10974. const char *pfx, int idx)
  10975. {
  10976. unsigned long val;
  10977. if (!nid)
  10978. return 0;
  10979. if (nid == 0x16)
  10980. val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
  10981. else
  10982. val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
  10983. return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx, val);
  10984. }
  10985. /* add playback controls from the parsed DAC table */
  10986. static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
  10987. const struct auto_pin_cfg *cfg)
  10988. {
  10989. const char *pfx;
  10990. int vbits;
  10991. int i, err;
  10992. spec->multiout.num_dacs = 1; /* only use one dac */
  10993. spec->multiout.dac_nids = spec->private_dac_nids;
  10994. spec->multiout.dac_nids[0] = 2;
  10995. pfx = alc_get_line_out_pfx(cfg, true);
  10996. if (!pfx)
  10997. pfx = "Front";
  10998. for (i = 0; i < 2; i++) {
  10999. err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx, i);
  11000. if (err < 0)
  11001. return err;
  11002. if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
  11003. err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[i],
  11004. "Speaker", i);
  11005. if (err < 0)
  11006. return err;
  11007. }
  11008. if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
  11009. err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[i],
  11010. "Headphone", i);
  11011. if (err < 0)
  11012. return err;
  11013. }
  11014. }
  11015. vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
  11016. alc262_check_volbit(cfg->speaker_pins[0]) |
  11017. alc262_check_volbit(cfg->hp_pins[0]);
  11018. if (vbits == 1 || vbits == 2)
  11019. pfx = "Master"; /* only one mixer is used */
  11020. vbits = 0;
  11021. for (i = 0; i < 2; i++) {
  11022. err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
  11023. &vbits, i);
  11024. if (err < 0)
  11025. return err;
  11026. if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
  11027. err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[i],
  11028. "Speaker", &vbits, i);
  11029. if (err < 0)
  11030. return err;
  11031. }
  11032. if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
  11033. err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[i],
  11034. "Headphone", &vbits, i);
  11035. if (err < 0)
  11036. return err;
  11037. }
  11038. }
  11039. return 0;
  11040. }
  11041. #define alc262_auto_create_input_ctls \
  11042. alc882_auto_create_input_ctls
  11043. /*
  11044. * generic initialization of ADC, input mixers and output mixers
  11045. */
  11046. static struct hda_verb alc262_volume_init_verbs[] = {
  11047. /*
  11048. * Unmute ADC0-2 and set the default input to mic-in
  11049. */
  11050. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  11051. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11052. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  11053. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11054. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  11055. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11056. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  11057. * mixer widget
  11058. * Note: PASD motherboards uses the Line In 2 as the input for
  11059. * front panel mic (mic 2)
  11060. */
  11061. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  11062. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  11063. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  11064. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  11065. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  11066. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  11067. /*
  11068. * Set up output mixers (0x0c - 0x0f)
  11069. */
  11070. /* set vol=0 to output mixers */
  11071. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11072. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11073. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11074. /* set up input amps for analog loopback */
  11075. /* Amp Indices: DAC = 0, mixer = 1 */
  11076. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11077. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11078. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11079. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11080. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11081. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11082. /* FIXME: use matrix-type input source selection */
  11083. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  11084. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  11085. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11086. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  11087. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  11088. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  11089. /* Input mixer2 */
  11090. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11091. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  11092. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  11093. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  11094. /* Input mixer3 */
  11095. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11096. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  11097. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  11098. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  11099. { }
  11100. };
  11101. static struct hda_verb alc262_HP_BPC_init_verbs[] = {
  11102. /*
  11103. * Unmute ADC0-2 and set the default input to mic-in
  11104. */
  11105. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  11106. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11107. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  11108. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11109. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  11110. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11111. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  11112. * mixer widget
  11113. * Note: PASD motherboards uses the Line In 2 as the input for
  11114. * front panel mic (mic 2)
  11115. */
  11116. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  11117. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  11118. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  11119. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  11120. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  11121. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  11122. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  11123. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  11124. /*
  11125. * Set up output mixers (0x0c - 0x0e)
  11126. */
  11127. /* set vol=0 to output mixers */
  11128. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11129. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11130. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11131. /* set up input amps for analog loopback */
  11132. /* Amp Indices: DAC = 0, mixer = 1 */
  11133. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11134. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11135. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11136. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11137. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11138. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11139. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  11140. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  11141. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  11142. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  11143. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  11144. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  11145. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  11146. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  11147. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  11148. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  11149. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  11150. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  11151. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11152. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11153. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11154. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11155. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11156. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11157. /* FIXME: use matrix-type input source selection */
  11158. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
  11159. /* Input mixer1: only unmute Mic */
  11160. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11161. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
  11162. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  11163. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  11164. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  11165. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
  11166. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
  11167. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
  11168. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
  11169. /* Input mixer2 */
  11170. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11171. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
  11172. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  11173. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  11174. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  11175. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
  11176. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
  11177. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
  11178. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
  11179. /* Input mixer3 */
  11180. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11181. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
  11182. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
  11183. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
  11184. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
  11185. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
  11186. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
  11187. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
  11188. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
  11189. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  11190. { }
  11191. };
  11192. static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
  11193. /*
  11194. * Unmute ADC0-2 and set the default input to mic-in
  11195. */
  11196. {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  11197. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11198. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  11199. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11200. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  11201. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11202. /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
  11203. * mixer widget
  11204. * Note: PASD motherboards uses the Line In 2 as the input for front
  11205. * panel mic (mic 2)
  11206. */
  11207. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  11208. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  11209. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  11210. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  11211. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  11212. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  11213. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  11214. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
  11215. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
  11216. /*
  11217. * Set up output mixers (0x0c - 0x0e)
  11218. */
  11219. /* set vol=0 to output mixers */
  11220. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11221. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11222. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  11223. /* set up input amps for analog loopback */
  11224. /* Amp Indices: DAC = 0, mixer = 1 */
  11225. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11226. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11227. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11228. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11229. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  11230. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  11231. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
  11232. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
  11233. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
  11234. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
  11235. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
  11236. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
  11237. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
  11238. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  11239. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  11240. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  11241. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  11242. /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
  11243. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11244. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11245. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
  11246. {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11247. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
  11248. /* FIXME: use matrix-type input source selection */
  11249. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  11250. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  11251. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
  11252. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
  11253. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
  11254. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
  11255. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
  11256. /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
  11257. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
  11258. /* Input mixer2 */
  11259. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11260. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  11261. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
  11262. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
  11263. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
  11264. /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
  11265. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
  11266. /* Input mixer3 */
  11267. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
  11268. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
  11269. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
  11270. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
  11271. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
  11272. /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
  11273. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
  11274. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  11275. { }
  11276. };
  11277. static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
  11278. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
  11279. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  11280. {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
  11281. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
  11282. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
  11283. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
  11284. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
  11285. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
  11286. {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
  11287. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  11288. {}
  11289. };
  11290. /*
  11291. * Pin config fixes
  11292. */
  11293. enum {
  11294. PINFIX_FSC_H270,
  11295. };
  11296. static const struct alc_fixup alc262_fixups[] = {
  11297. [PINFIX_FSC_H270] = {
  11298. .type = ALC_FIXUP_PINS,
  11299. .v.pins = (const struct alc_pincfg[]) {
  11300. { 0x14, 0x99130110 }, /* speaker */
  11301. { 0x15, 0x0221142f }, /* front HP */
  11302. { 0x1b, 0x0121141f }, /* rear HP */
  11303. { }
  11304. }
  11305. },
  11306. };
  11307. static struct snd_pci_quirk alc262_fixup_tbl[] = {
  11308. SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
  11309. {}
  11310. };
  11311. #ifdef CONFIG_SND_HDA_POWER_SAVE
  11312. #define alc262_loopbacks alc880_loopbacks
  11313. #endif
  11314. /* pcm configuration: identical with ALC880 */
  11315. #define alc262_pcm_analog_playback alc880_pcm_analog_playback
  11316. #define alc262_pcm_analog_capture alc880_pcm_analog_capture
  11317. #define alc262_pcm_digital_playback alc880_pcm_digital_playback
  11318. #define alc262_pcm_digital_capture alc880_pcm_digital_capture
  11319. /*
  11320. * BIOS auto configuration
  11321. */
  11322. static int alc262_parse_auto_config(struct hda_codec *codec)
  11323. {
  11324. struct alc_spec *spec = codec->spec;
  11325. int err;
  11326. static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
  11327. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  11328. alc262_ignore);
  11329. if (err < 0)
  11330. return err;
  11331. if (!spec->autocfg.line_outs) {
  11332. if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
  11333. spec->multiout.max_channels = 2;
  11334. spec->no_analog = 1;
  11335. goto dig_only;
  11336. }
  11337. return 0; /* can't find valid BIOS pin config */
  11338. }
  11339. err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
  11340. if (err < 0)
  11341. return err;
  11342. err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
  11343. if (err < 0)
  11344. return err;
  11345. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  11346. dig_only:
  11347. alc_auto_parse_digital(codec);
  11348. if (spec->kctls.list)
  11349. add_mixer(spec, spec->kctls.list);
  11350. add_verb(spec, alc262_volume_init_verbs);
  11351. spec->num_mux_defs = 1;
  11352. spec->input_mux = &spec->private_imux[0];
  11353. err = alc_auto_add_mic_boost(codec);
  11354. if (err < 0)
  11355. return err;
  11356. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  11357. return 1;
  11358. }
  11359. #define alc262_auto_init_multi_out alc882_auto_init_multi_out
  11360. #define alc262_auto_init_hp_out alc882_auto_init_hp_out
  11361. #define alc262_auto_init_analog_input alc882_auto_init_analog_input
  11362. #define alc262_auto_init_input_src alc882_auto_init_input_src
  11363. /* init callback for auto-configuration model -- overriding the default init */
  11364. static void alc262_auto_init(struct hda_codec *codec)
  11365. {
  11366. struct alc_spec *spec = codec->spec;
  11367. alc262_auto_init_multi_out(codec);
  11368. alc262_auto_init_hp_out(codec);
  11369. alc262_auto_init_analog_input(codec);
  11370. alc262_auto_init_input_src(codec);
  11371. alc_auto_init_digital(codec);
  11372. if (spec->unsol_event)
  11373. alc_inithook(codec);
  11374. }
  11375. /*
  11376. * configuration and preset
  11377. */
  11378. static const char * const alc262_models[ALC262_MODEL_LAST] = {
  11379. [ALC262_BASIC] = "basic",
  11380. [ALC262_HIPPO] = "hippo",
  11381. [ALC262_HIPPO_1] = "hippo_1",
  11382. [ALC262_FUJITSU] = "fujitsu",
  11383. [ALC262_HP_BPC] = "hp-bpc",
  11384. [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
  11385. [ALC262_HP_TC_T5735] = "hp-tc-t5735",
  11386. [ALC262_HP_RP5700] = "hp-rp5700",
  11387. [ALC262_BENQ_ED8] = "benq",
  11388. [ALC262_BENQ_T31] = "benq-t31",
  11389. [ALC262_SONY_ASSAMD] = "sony-assamd",
  11390. [ALC262_TOSHIBA_S06] = "toshiba-s06",
  11391. [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
  11392. [ALC262_ULTRA] = "ultra",
  11393. [ALC262_LENOVO_3000] = "lenovo-3000",
  11394. [ALC262_NEC] = "nec",
  11395. [ALC262_TYAN] = "tyan",
  11396. [ALC262_AUTO] = "auto",
  11397. };
  11398. static struct snd_pci_quirk alc262_cfg_tbl[] = {
  11399. SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
  11400. SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
  11401. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
  11402. ALC262_HP_BPC),
  11403. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
  11404. ALC262_HP_BPC),
  11405. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series",
  11406. ALC262_HP_BPC),
  11407. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
  11408. ALC262_HP_BPC),
  11409. SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
  11410. SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
  11411. SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
  11412. SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
  11413. SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
  11414. SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
  11415. SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
  11416. SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
  11417. SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
  11418. SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
  11419. SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
  11420. SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
  11421. ALC262_HP_TC_T5735),
  11422. SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
  11423. SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
  11424. SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
  11425. SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
  11426. SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
  11427. SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
  11428. SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
  11429. SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
  11430. #if 0 /* disable the quirk since model=auto works better in recent versions */
  11431. SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
  11432. ALC262_SONY_ASSAMD),
  11433. #endif
  11434. SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
  11435. ALC262_TOSHIBA_RX1),
  11436. SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
  11437. SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
  11438. SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
  11439. SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
  11440. SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
  11441. ALC262_ULTRA),
  11442. SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
  11443. SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
  11444. SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
  11445. SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
  11446. SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
  11447. {}
  11448. };
  11449. static struct alc_config_preset alc262_presets[] = {
  11450. [ALC262_BASIC] = {
  11451. .mixers = { alc262_base_mixer },
  11452. .init_verbs = { alc262_init_verbs },
  11453. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11454. .dac_nids = alc262_dac_nids,
  11455. .hp_nid = 0x03,
  11456. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11457. .channel_mode = alc262_modes,
  11458. .input_mux = &alc262_capture_source,
  11459. },
  11460. [ALC262_HIPPO] = {
  11461. .mixers = { alc262_hippo_mixer },
  11462. .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
  11463. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11464. .dac_nids = alc262_dac_nids,
  11465. .hp_nid = 0x03,
  11466. .dig_out_nid = ALC262_DIGOUT_NID,
  11467. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11468. .channel_mode = alc262_modes,
  11469. .input_mux = &alc262_capture_source,
  11470. .unsol_event = alc262_hippo_unsol_event,
  11471. .setup = alc262_hippo_setup,
  11472. .init_hook = alc262_hippo_automute,
  11473. },
  11474. [ALC262_HIPPO_1] = {
  11475. .mixers = { alc262_hippo1_mixer },
  11476. .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
  11477. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11478. .dac_nids = alc262_dac_nids,
  11479. .hp_nid = 0x02,
  11480. .dig_out_nid = ALC262_DIGOUT_NID,
  11481. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11482. .channel_mode = alc262_modes,
  11483. .input_mux = &alc262_capture_source,
  11484. .unsol_event = alc262_hippo_unsol_event,
  11485. .setup = alc262_hippo1_setup,
  11486. .init_hook = alc262_hippo_automute,
  11487. },
  11488. [ALC262_FUJITSU] = {
  11489. .mixers = { alc262_fujitsu_mixer },
  11490. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
  11491. alc262_fujitsu_unsol_verbs },
  11492. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11493. .dac_nids = alc262_dac_nids,
  11494. .hp_nid = 0x03,
  11495. .dig_out_nid = ALC262_DIGOUT_NID,
  11496. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11497. .channel_mode = alc262_modes,
  11498. .input_mux = &alc262_fujitsu_capture_source,
  11499. .unsol_event = alc262_fujitsu_unsol_event,
  11500. .init_hook = alc262_fujitsu_init_hook,
  11501. },
  11502. [ALC262_HP_BPC] = {
  11503. .mixers = { alc262_HP_BPC_mixer },
  11504. .init_verbs = { alc262_HP_BPC_init_verbs },
  11505. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11506. .dac_nids = alc262_dac_nids,
  11507. .hp_nid = 0x03,
  11508. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11509. .channel_mode = alc262_modes,
  11510. .input_mux = &alc262_HP_capture_source,
  11511. .unsol_event = alc262_hp_bpc_unsol_event,
  11512. .init_hook = alc262_hp_bpc_automute,
  11513. },
  11514. [ALC262_HP_BPC_D7000_WF] = {
  11515. .mixers = { alc262_HP_BPC_WildWest_mixer },
  11516. .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
  11517. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11518. .dac_nids = alc262_dac_nids,
  11519. .hp_nid = 0x03,
  11520. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11521. .channel_mode = alc262_modes,
  11522. .input_mux = &alc262_HP_D7000_capture_source,
  11523. .unsol_event = alc262_hp_wildwest_unsol_event,
  11524. .init_hook = alc262_hp_wildwest_automute,
  11525. },
  11526. [ALC262_HP_BPC_D7000_WL] = {
  11527. .mixers = { alc262_HP_BPC_WildWest_mixer,
  11528. alc262_HP_BPC_WildWest_option_mixer },
  11529. .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
  11530. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11531. .dac_nids = alc262_dac_nids,
  11532. .hp_nid = 0x03,
  11533. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11534. .channel_mode = alc262_modes,
  11535. .input_mux = &alc262_HP_D7000_capture_source,
  11536. .unsol_event = alc262_hp_wildwest_unsol_event,
  11537. .init_hook = alc262_hp_wildwest_automute,
  11538. },
  11539. [ALC262_HP_TC_T5735] = {
  11540. .mixers = { alc262_hp_t5735_mixer },
  11541. .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
  11542. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11543. .dac_nids = alc262_dac_nids,
  11544. .hp_nid = 0x03,
  11545. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11546. .channel_mode = alc262_modes,
  11547. .input_mux = &alc262_capture_source,
  11548. .unsol_event = alc_sku_unsol_event,
  11549. .setup = alc262_hp_t5735_setup,
  11550. .init_hook = alc_inithook,
  11551. },
  11552. [ALC262_HP_RP5700] = {
  11553. .mixers = { alc262_hp_rp5700_mixer },
  11554. .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
  11555. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11556. .dac_nids = alc262_dac_nids,
  11557. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11558. .channel_mode = alc262_modes,
  11559. .input_mux = &alc262_hp_rp5700_capture_source,
  11560. },
  11561. [ALC262_BENQ_ED8] = {
  11562. .mixers = { alc262_base_mixer },
  11563. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
  11564. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11565. .dac_nids = alc262_dac_nids,
  11566. .hp_nid = 0x03,
  11567. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11568. .channel_mode = alc262_modes,
  11569. .input_mux = &alc262_capture_source,
  11570. },
  11571. [ALC262_SONY_ASSAMD] = {
  11572. .mixers = { alc262_sony_mixer },
  11573. .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
  11574. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11575. .dac_nids = alc262_dac_nids,
  11576. .hp_nid = 0x02,
  11577. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11578. .channel_mode = alc262_modes,
  11579. .input_mux = &alc262_capture_source,
  11580. .unsol_event = alc262_hippo_unsol_event,
  11581. .setup = alc262_hippo_setup,
  11582. .init_hook = alc262_hippo_automute,
  11583. },
  11584. [ALC262_BENQ_T31] = {
  11585. .mixers = { alc262_benq_t31_mixer },
  11586. .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
  11587. alc_hp15_unsol_verbs },
  11588. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11589. .dac_nids = alc262_dac_nids,
  11590. .hp_nid = 0x03,
  11591. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11592. .channel_mode = alc262_modes,
  11593. .input_mux = &alc262_capture_source,
  11594. .unsol_event = alc262_hippo_unsol_event,
  11595. .setup = alc262_hippo_setup,
  11596. .init_hook = alc262_hippo_automute,
  11597. },
  11598. [ALC262_ULTRA] = {
  11599. .mixers = { alc262_ultra_mixer },
  11600. .cap_mixer = alc262_ultra_capture_mixer,
  11601. .init_verbs = { alc262_ultra_verbs },
  11602. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11603. .dac_nids = alc262_dac_nids,
  11604. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11605. .channel_mode = alc262_modes,
  11606. .input_mux = &alc262_ultra_capture_source,
  11607. .adc_nids = alc262_adc_nids, /* ADC0 */
  11608. .capsrc_nids = alc262_capsrc_nids,
  11609. .num_adc_nids = 1, /* single ADC */
  11610. .unsol_event = alc262_ultra_unsol_event,
  11611. .init_hook = alc262_ultra_automute,
  11612. },
  11613. [ALC262_LENOVO_3000] = {
  11614. .mixers = { alc262_lenovo_3000_mixer },
  11615. .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
  11616. alc262_lenovo_3000_unsol_verbs,
  11617. alc262_lenovo_3000_init_verbs },
  11618. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11619. .dac_nids = alc262_dac_nids,
  11620. .hp_nid = 0x03,
  11621. .dig_out_nid = ALC262_DIGOUT_NID,
  11622. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11623. .channel_mode = alc262_modes,
  11624. .input_mux = &alc262_fujitsu_capture_source,
  11625. .unsol_event = alc262_lenovo_3000_unsol_event,
  11626. },
  11627. [ALC262_NEC] = {
  11628. .mixers = { alc262_nec_mixer },
  11629. .init_verbs = { alc262_nec_verbs },
  11630. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11631. .dac_nids = alc262_dac_nids,
  11632. .hp_nid = 0x03,
  11633. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11634. .channel_mode = alc262_modes,
  11635. .input_mux = &alc262_capture_source,
  11636. },
  11637. [ALC262_TOSHIBA_S06] = {
  11638. .mixers = { alc262_toshiba_s06_mixer },
  11639. .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
  11640. alc262_eapd_verbs },
  11641. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11642. .capsrc_nids = alc262_dmic_capsrc_nids,
  11643. .dac_nids = alc262_dac_nids,
  11644. .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
  11645. .num_adc_nids = 1, /* single ADC */
  11646. .dig_out_nid = ALC262_DIGOUT_NID,
  11647. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11648. .channel_mode = alc262_modes,
  11649. .unsol_event = alc_sku_unsol_event,
  11650. .setup = alc262_toshiba_s06_setup,
  11651. .init_hook = alc_inithook,
  11652. },
  11653. [ALC262_TOSHIBA_RX1] = {
  11654. .mixers = { alc262_toshiba_rx1_mixer },
  11655. .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
  11656. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11657. .dac_nids = alc262_dac_nids,
  11658. .hp_nid = 0x03,
  11659. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11660. .channel_mode = alc262_modes,
  11661. .input_mux = &alc262_capture_source,
  11662. .unsol_event = alc262_hippo_unsol_event,
  11663. .setup = alc262_hippo_setup,
  11664. .init_hook = alc262_hippo_automute,
  11665. },
  11666. [ALC262_TYAN] = {
  11667. .mixers = { alc262_tyan_mixer },
  11668. .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
  11669. .num_dacs = ARRAY_SIZE(alc262_dac_nids),
  11670. .dac_nids = alc262_dac_nids,
  11671. .hp_nid = 0x02,
  11672. .dig_out_nid = ALC262_DIGOUT_NID,
  11673. .num_channel_mode = ARRAY_SIZE(alc262_modes),
  11674. .channel_mode = alc262_modes,
  11675. .input_mux = &alc262_capture_source,
  11676. .unsol_event = alc_automute_amp_unsol_event,
  11677. .setup = alc262_tyan_setup,
  11678. .init_hook = alc_automute_amp,
  11679. },
  11680. };
  11681. static int patch_alc262(struct hda_codec *codec)
  11682. {
  11683. struct alc_spec *spec;
  11684. int board_config;
  11685. int err;
  11686. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  11687. if (spec == NULL)
  11688. return -ENOMEM;
  11689. codec->spec = spec;
  11690. #if 0
  11691. /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
  11692. * under-run
  11693. */
  11694. {
  11695. int tmp;
  11696. snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
  11697. tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
  11698. snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
  11699. snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
  11700. }
  11701. #endif
  11702. alc_auto_parse_customize_define(codec);
  11703. alc_fix_pll_init(codec, 0x20, 0x0a, 10);
  11704. board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
  11705. alc262_models,
  11706. alc262_cfg_tbl);
  11707. if (board_config < 0) {
  11708. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  11709. codec->chip_name);
  11710. board_config = ALC262_AUTO;
  11711. }
  11712. if (board_config == ALC262_AUTO) {
  11713. alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
  11714. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  11715. }
  11716. if (board_config == ALC262_AUTO) {
  11717. /* automatic parse from the BIOS config */
  11718. err = alc262_parse_auto_config(codec);
  11719. if (err < 0) {
  11720. alc_free(codec);
  11721. return err;
  11722. } else if (!err) {
  11723. printk(KERN_INFO
  11724. "hda_codec: Cannot set up configuration "
  11725. "from BIOS. Using base mode...\n");
  11726. board_config = ALC262_BASIC;
  11727. }
  11728. }
  11729. if (!spec->no_analog && has_cdefine_beep(codec)) {
  11730. err = snd_hda_attach_beep_device(codec, 0x1);
  11731. if (err < 0) {
  11732. alc_free(codec);
  11733. return err;
  11734. }
  11735. }
  11736. if (board_config != ALC262_AUTO)
  11737. setup_preset(codec, &alc262_presets[board_config]);
  11738. spec->stream_analog_playback = &alc262_pcm_analog_playback;
  11739. spec->stream_analog_capture = &alc262_pcm_analog_capture;
  11740. spec->stream_digital_playback = &alc262_pcm_digital_playback;
  11741. spec->stream_digital_capture = &alc262_pcm_digital_capture;
  11742. if (!spec->adc_nids && spec->input_mux) {
  11743. int i;
  11744. /* check whether the digital-mic has to be supported */
  11745. for (i = 0; i < spec->input_mux->num_items; i++) {
  11746. if (spec->input_mux->items[i].index >= 9)
  11747. break;
  11748. }
  11749. if (i < spec->input_mux->num_items) {
  11750. /* use only ADC0 */
  11751. spec->adc_nids = alc262_dmic_adc_nids;
  11752. spec->num_adc_nids = 1;
  11753. spec->capsrc_nids = alc262_dmic_capsrc_nids;
  11754. } else {
  11755. /* all analog inputs */
  11756. /* check whether NID 0x07 is valid */
  11757. unsigned int wcap = get_wcaps(codec, 0x07);
  11758. /* get type */
  11759. wcap = get_wcaps_type(wcap);
  11760. if (wcap != AC_WID_AUD_IN) {
  11761. spec->adc_nids = alc262_adc_nids_alt;
  11762. spec->num_adc_nids =
  11763. ARRAY_SIZE(alc262_adc_nids_alt);
  11764. spec->capsrc_nids = alc262_capsrc_nids_alt;
  11765. } else {
  11766. spec->adc_nids = alc262_adc_nids;
  11767. spec->num_adc_nids =
  11768. ARRAY_SIZE(alc262_adc_nids);
  11769. spec->capsrc_nids = alc262_capsrc_nids;
  11770. }
  11771. }
  11772. }
  11773. if (!spec->cap_mixer && !spec->no_analog)
  11774. set_capture_mixer(codec);
  11775. if (!spec->no_analog && has_cdefine_beep(codec))
  11776. set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
  11777. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  11778. spec->vmaster_nid = 0x0c;
  11779. codec->patch_ops = alc_patch_ops;
  11780. if (board_config == ALC262_AUTO)
  11781. spec->init_hook = alc262_auto_init;
  11782. alc_init_jacks(codec);
  11783. #ifdef CONFIG_SND_HDA_POWER_SAVE
  11784. if (!spec->loopback.amplist)
  11785. spec->loopback.amplist = alc262_loopbacks;
  11786. #endif
  11787. return 0;
  11788. }
  11789. /*
  11790. * ALC268 channel source setting (2 channel)
  11791. */
  11792. #define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
  11793. #define alc268_modes alc260_modes
  11794. static hda_nid_t alc268_dac_nids[2] = {
  11795. /* front, hp */
  11796. 0x02, 0x03
  11797. };
  11798. static hda_nid_t alc268_adc_nids[2] = {
  11799. /* ADC0-1 */
  11800. 0x08, 0x07
  11801. };
  11802. static hda_nid_t alc268_adc_nids_alt[1] = {
  11803. /* ADC0 */
  11804. 0x08
  11805. };
  11806. static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
  11807. static struct snd_kcontrol_new alc268_base_mixer[] = {
  11808. /* output mixer control */
  11809. HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
  11810. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  11811. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
  11812. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  11813. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  11814. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  11815. HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
  11816. { }
  11817. };
  11818. static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
  11819. /* output mixer control */
  11820. HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
  11821. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
  11822. ALC262_HIPPO_MASTER_SWITCH,
  11823. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  11824. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  11825. HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
  11826. { }
  11827. };
  11828. /* bind Beep switches of both NID 0x0f and 0x10 */
  11829. static struct hda_bind_ctls alc268_bind_beep_sw = {
  11830. .ops = &snd_hda_bind_sw,
  11831. .values = {
  11832. HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
  11833. HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
  11834. 0
  11835. },
  11836. };
  11837. static struct snd_kcontrol_new alc268_beep_mixer[] = {
  11838. HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
  11839. HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
  11840. { }
  11841. };
  11842. static struct hda_verb alc268_eapd_verbs[] = {
  11843. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  11844. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  11845. { }
  11846. };
  11847. /* Toshiba specific */
  11848. static struct hda_verb alc268_toshiba_verbs[] = {
  11849. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  11850. { } /* end */
  11851. };
  11852. /* Acer specific */
  11853. /* bind volumes of both NID 0x02 and 0x03 */
  11854. static struct hda_bind_ctls alc268_acer_bind_master_vol = {
  11855. .ops = &snd_hda_bind_vol,
  11856. .values = {
  11857. HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
  11858. HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
  11859. 0
  11860. },
  11861. };
  11862. /* mute/unmute internal speaker according to the hp jack and mute state */
  11863. static void alc268_acer_automute(struct hda_codec *codec, int force)
  11864. {
  11865. struct alc_spec *spec = codec->spec;
  11866. unsigned int mute;
  11867. if (force || !spec->sense_updated) {
  11868. spec->jack_present = snd_hda_jack_detect(codec, 0x14);
  11869. spec->sense_updated = 1;
  11870. }
  11871. if (spec->jack_present)
  11872. mute = HDA_AMP_MUTE; /* mute internal speaker */
  11873. else /* unmute internal speaker if necessary */
  11874. mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
  11875. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  11876. HDA_AMP_MUTE, mute);
  11877. }
  11878. /* bind hp and internal speaker mute (with plug check) */
  11879. static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
  11880. struct snd_ctl_elem_value *ucontrol)
  11881. {
  11882. struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  11883. long *valp = ucontrol->value.integer.value;
  11884. int change;
  11885. change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
  11886. if (change)
  11887. alc268_acer_automute(codec, 0);
  11888. return change;
  11889. }
  11890. static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
  11891. /* output mixer control */
  11892. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  11893. {
  11894. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  11895. .name = "Master Playback Switch",
  11896. .subdevice = HDA_SUBDEV_AMP_FLAG,
  11897. .info = snd_hda_mixer_amp_switch_info,
  11898. .get = snd_hda_mixer_amp_switch_get,
  11899. .put = alc268_acer_master_sw_put,
  11900. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  11901. },
  11902. HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
  11903. { }
  11904. };
  11905. static struct snd_kcontrol_new alc268_acer_mixer[] = {
  11906. /* output mixer control */
  11907. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  11908. {
  11909. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  11910. .name = "Master Playback Switch",
  11911. .subdevice = HDA_SUBDEV_AMP_FLAG,
  11912. .info = snd_hda_mixer_amp_switch_info,
  11913. .get = snd_hda_mixer_amp_switch_get,
  11914. .put = alc268_acer_master_sw_put,
  11915. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  11916. },
  11917. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  11918. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  11919. HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
  11920. { }
  11921. };
  11922. static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
  11923. /* output mixer control */
  11924. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  11925. {
  11926. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  11927. .name = "Master Playback Switch",
  11928. .subdevice = HDA_SUBDEV_AMP_FLAG,
  11929. .info = snd_hda_mixer_amp_switch_info,
  11930. .get = snd_hda_mixer_amp_switch_get,
  11931. .put = alc268_acer_master_sw_put,
  11932. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  11933. },
  11934. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  11935. HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
  11936. { }
  11937. };
  11938. static struct hda_verb alc268_acer_aspire_one_verbs[] = {
  11939. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  11940. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  11941. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  11942. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  11943. {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
  11944. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
  11945. { }
  11946. };
  11947. static struct hda_verb alc268_acer_verbs[] = {
  11948. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
  11949. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  11950. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  11951. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  11952. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  11953. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  11954. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  11955. { }
  11956. };
  11957. /* unsolicited event for HP jack sensing */
  11958. #define alc268_toshiba_unsol_event alc262_hippo_unsol_event
  11959. #define alc268_toshiba_setup alc262_hippo_setup
  11960. #define alc268_toshiba_automute alc262_hippo_automute
  11961. static void alc268_acer_unsol_event(struct hda_codec *codec,
  11962. unsigned int res)
  11963. {
  11964. if ((res >> 26) != ALC880_HP_EVENT)
  11965. return;
  11966. alc268_acer_automute(codec, 1);
  11967. }
  11968. static void alc268_acer_init_hook(struct hda_codec *codec)
  11969. {
  11970. alc268_acer_automute(codec, 1);
  11971. }
  11972. /* toggle speaker-output according to the hp-jack state */
  11973. static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
  11974. {
  11975. unsigned int present;
  11976. unsigned char bits;
  11977. present = snd_hda_jack_detect(codec, 0x15);
  11978. bits = present ? HDA_AMP_MUTE : 0;
  11979. snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
  11980. HDA_AMP_MUTE, bits);
  11981. snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
  11982. HDA_AMP_MUTE, bits);
  11983. }
  11984. static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
  11985. unsigned int res)
  11986. {
  11987. switch (res >> 26) {
  11988. case ALC880_HP_EVENT:
  11989. alc268_aspire_one_speaker_automute(codec);
  11990. break;
  11991. case ALC880_MIC_EVENT:
  11992. alc_mic_automute(codec);
  11993. break;
  11994. }
  11995. }
  11996. static void alc268_acer_lc_setup(struct hda_codec *codec)
  11997. {
  11998. struct alc_spec *spec = codec->spec;
  11999. spec->ext_mic.pin = 0x18;
  12000. spec->ext_mic.mux_idx = 0;
  12001. spec->int_mic.pin = 0x12;
  12002. spec->int_mic.mux_idx = 6;
  12003. spec->auto_mic = 1;
  12004. }
  12005. static void alc268_acer_lc_init_hook(struct hda_codec *codec)
  12006. {
  12007. alc268_aspire_one_speaker_automute(codec);
  12008. alc_mic_automute(codec);
  12009. }
  12010. static struct snd_kcontrol_new alc268_dell_mixer[] = {
  12011. /* output mixer control */
  12012. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  12013. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  12014. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  12015. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  12016. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12017. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12018. { }
  12019. };
  12020. static struct hda_verb alc268_dell_verbs[] = {
  12021. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  12022. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  12023. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  12024. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  12025. { }
  12026. };
  12027. /* mute/unmute internal speaker according to the hp jack and mute state */
  12028. static void alc268_dell_setup(struct hda_codec *codec)
  12029. {
  12030. struct alc_spec *spec = codec->spec;
  12031. spec->autocfg.hp_pins[0] = 0x15;
  12032. spec->autocfg.speaker_pins[0] = 0x14;
  12033. spec->ext_mic.pin = 0x18;
  12034. spec->ext_mic.mux_idx = 0;
  12035. spec->int_mic.pin = 0x19;
  12036. spec->int_mic.mux_idx = 1;
  12037. spec->auto_mic = 1;
  12038. }
  12039. static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
  12040. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
  12041. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  12042. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
  12043. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  12044. HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
  12045. HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
  12046. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12047. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12048. { }
  12049. };
  12050. static struct hda_verb alc267_quanta_il1_verbs[] = {
  12051. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  12052. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  12053. { }
  12054. };
  12055. static void alc267_quanta_il1_setup(struct hda_codec *codec)
  12056. {
  12057. struct alc_spec *spec = codec->spec;
  12058. spec->autocfg.hp_pins[0] = 0x15;
  12059. spec->autocfg.speaker_pins[0] = 0x14;
  12060. spec->ext_mic.pin = 0x18;
  12061. spec->ext_mic.mux_idx = 0;
  12062. spec->int_mic.pin = 0x19;
  12063. spec->int_mic.mux_idx = 1;
  12064. spec->auto_mic = 1;
  12065. }
  12066. /*
  12067. * generic initialization of ADC, input mixers and output mixers
  12068. */
  12069. static struct hda_verb alc268_base_init_verbs[] = {
  12070. /* Unmute DAC0-1 and set vol = 0 */
  12071. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  12072. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  12073. /*
  12074. * Set up output mixers (0x0c - 0x0e)
  12075. */
  12076. /* set vol=0 to output mixers */
  12077. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12078. {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
  12079. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12080. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12081. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  12082. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
  12083. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
  12084. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  12085. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  12086. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  12087. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  12088. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  12089. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12090. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12091. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12092. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12093. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12094. /* set PCBEEP vol = 0, mute connections */
  12095. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12096. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  12097. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  12098. /* Unmute Selector 23h,24h and set the default input to mic-in */
  12099. {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
  12100. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  12101. {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
  12102. {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  12103. { }
  12104. };
  12105. /*
  12106. * generic initialization of ADC, input mixers and output mixers
  12107. */
  12108. static struct hda_verb alc268_volume_init_verbs[] = {
  12109. /* set output DAC */
  12110. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  12111. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  12112. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  12113. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
  12114. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  12115. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  12116. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
  12117. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12118. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12119. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12120. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12121. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  12122. /* set PCBEEP vol = 0, mute connections */
  12123. {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  12124. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  12125. {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  12126. { }
  12127. };
  12128. static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
  12129. HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
  12130. HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
  12131. { } /* end */
  12132. };
  12133. static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
  12134. HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
  12135. HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
  12136. _DEFINE_CAPSRC(1),
  12137. { } /* end */
  12138. };
  12139. static struct snd_kcontrol_new alc268_capture_mixer[] = {
  12140. HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
  12141. HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
  12142. HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
  12143. HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
  12144. _DEFINE_CAPSRC(2),
  12145. { } /* end */
  12146. };
  12147. static struct hda_input_mux alc268_capture_source = {
  12148. .num_items = 4,
  12149. .items = {
  12150. { "Mic", 0x0 },
  12151. { "Front Mic", 0x1 },
  12152. { "Line", 0x2 },
  12153. { "CD", 0x3 },
  12154. },
  12155. };
  12156. static struct hda_input_mux alc268_acer_capture_source = {
  12157. .num_items = 3,
  12158. .items = {
  12159. { "Mic", 0x0 },
  12160. { "Internal Mic", 0x1 },
  12161. { "Line", 0x2 },
  12162. },
  12163. };
  12164. static struct hda_input_mux alc268_acer_dmic_capture_source = {
  12165. .num_items = 3,
  12166. .items = {
  12167. { "Mic", 0x0 },
  12168. { "Internal Mic", 0x6 },
  12169. { "Line", 0x2 },
  12170. },
  12171. };
  12172. #ifdef CONFIG_SND_DEBUG
  12173. static struct snd_kcontrol_new alc268_test_mixer[] = {
  12174. /* Volume widgets */
  12175. HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  12176. HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  12177. HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  12178. HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
  12179. HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
  12180. HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
  12181. HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
  12182. HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
  12183. HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
  12184. HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
  12185. HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
  12186. HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
  12187. HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
  12188. /* The below appears problematic on some hardwares */
  12189. /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
  12190. HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
  12191. HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
  12192. HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
  12193. HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
  12194. /* Modes for retasking pin widgets */
  12195. ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
  12196. ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
  12197. ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
  12198. ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
  12199. /* Controls for GPIO pins, assuming they are configured as outputs */
  12200. ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
  12201. ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
  12202. ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
  12203. ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
  12204. /* Switches to allow the digital SPDIF output pin to be enabled.
  12205. * The ALC268 does not have an SPDIF input.
  12206. */
  12207. ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
  12208. /* A switch allowing EAPD to be enabled. Some laptops seem to use
  12209. * this output to turn on an external amplifier.
  12210. */
  12211. ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
  12212. ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
  12213. { } /* end */
  12214. };
  12215. #endif
  12216. /* create input playback/capture controls for the given pin */
  12217. static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
  12218. const char *ctlname, int idx)
  12219. {
  12220. hda_nid_t dac;
  12221. int err;
  12222. switch (nid) {
  12223. case 0x14:
  12224. case 0x16:
  12225. dac = 0x02;
  12226. break;
  12227. case 0x15:
  12228. case 0x1a: /* ALC259/269 only */
  12229. case 0x1b: /* ALC259/269 only */
  12230. case 0x21: /* ALC269vb has this pin, too */
  12231. dac = 0x03;
  12232. break;
  12233. default:
  12234. snd_printd(KERN_WARNING "hda_codec: "
  12235. "ignoring pin 0x%x as unknown\n", nid);
  12236. return 0;
  12237. }
  12238. if (spec->multiout.dac_nids[0] != dac &&
  12239. spec->multiout.dac_nids[1] != dac) {
  12240. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
  12241. HDA_COMPOSE_AMP_VAL(dac, 3, idx,
  12242. HDA_OUTPUT));
  12243. if (err < 0)
  12244. return err;
  12245. spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
  12246. }
  12247. if (nid != 0x16)
  12248. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
  12249. HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
  12250. else /* mono */
  12251. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
  12252. HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
  12253. if (err < 0)
  12254. return err;
  12255. return 0;
  12256. }
  12257. /* add playback controls from the parsed DAC table */
  12258. static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
  12259. const struct auto_pin_cfg *cfg)
  12260. {
  12261. hda_nid_t nid;
  12262. int err;
  12263. spec->multiout.dac_nids = spec->private_dac_nids;
  12264. nid = cfg->line_out_pins[0];
  12265. if (nid) {
  12266. const char *name;
  12267. if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
  12268. name = "Speaker";
  12269. else
  12270. name = "Front";
  12271. err = alc268_new_analog_output(spec, nid, name, 0);
  12272. if (err < 0)
  12273. return err;
  12274. }
  12275. nid = cfg->speaker_pins[0];
  12276. if (nid == 0x1d) {
  12277. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
  12278. HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
  12279. if (err < 0)
  12280. return err;
  12281. } else if (nid) {
  12282. err = alc268_new_analog_output(spec, nid, "Speaker", 0);
  12283. if (err < 0)
  12284. return err;
  12285. }
  12286. nid = cfg->hp_pins[0];
  12287. if (nid) {
  12288. err = alc268_new_analog_output(spec, nid, "Headphone", 0);
  12289. if (err < 0)
  12290. return err;
  12291. }
  12292. nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
  12293. if (nid == 0x16) {
  12294. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
  12295. HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
  12296. if (err < 0)
  12297. return err;
  12298. }
  12299. return 0;
  12300. }
  12301. /* create playback/capture controls for input pins */
  12302. static int alc268_auto_create_input_ctls(struct hda_codec *codec,
  12303. const struct auto_pin_cfg *cfg)
  12304. {
  12305. return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
  12306. }
  12307. static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
  12308. hda_nid_t nid, int pin_type)
  12309. {
  12310. int idx;
  12311. alc_set_pin_output(codec, nid, pin_type);
  12312. if (nid == 0x14 || nid == 0x16)
  12313. idx = 0;
  12314. else
  12315. idx = 1;
  12316. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
  12317. }
  12318. static void alc268_auto_init_multi_out(struct hda_codec *codec)
  12319. {
  12320. struct alc_spec *spec = codec->spec;
  12321. int i;
  12322. for (i = 0; i < spec->autocfg.line_outs; i++) {
  12323. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  12324. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  12325. alc268_auto_set_output_and_unmute(codec, nid, pin_type);
  12326. }
  12327. }
  12328. static void alc268_auto_init_hp_out(struct hda_codec *codec)
  12329. {
  12330. struct alc_spec *spec = codec->spec;
  12331. hda_nid_t pin;
  12332. int i;
  12333. for (i = 0; i < spec->autocfg.hp_outs; i++) {
  12334. pin = spec->autocfg.hp_pins[i];
  12335. alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
  12336. }
  12337. for (i = 0; i < spec->autocfg.speaker_outs; i++) {
  12338. pin = spec->autocfg.speaker_pins[i];
  12339. alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
  12340. }
  12341. if (spec->autocfg.mono_out_pin)
  12342. snd_hda_codec_write(codec, spec->autocfg.mono_out_pin, 0,
  12343. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  12344. }
  12345. static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
  12346. {
  12347. struct alc_spec *spec = codec->spec;
  12348. hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
  12349. hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
  12350. hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
  12351. unsigned int dac_vol1, dac_vol2;
  12352. if (line_nid == 0x1d || speaker_nid == 0x1d) {
  12353. snd_hda_codec_write(codec, speaker_nid, 0,
  12354. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  12355. /* mute mixer inputs from 0x1d */
  12356. snd_hda_codec_write(codec, 0x0f, 0,
  12357. AC_VERB_SET_AMP_GAIN_MUTE,
  12358. AMP_IN_UNMUTE(1));
  12359. snd_hda_codec_write(codec, 0x10, 0,
  12360. AC_VERB_SET_AMP_GAIN_MUTE,
  12361. AMP_IN_UNMUTE(1));
  12362. } else {
  12363. /* unmute mixer inputs from 0x1d */
  12364. snd_hda_codec_write(codec, 0x0f, 0,
  12365. AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
  12366. snd_hda_codec_write(codec, 0x10, 0,
  12367. AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
  12368. }
  12369. dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
  12370. if (line_nid == 0x14)
  12371. dac_vol2 = AMP_OUT_ZERO;
  12372. else if (line_nid == 0x15)
  12373. dac_vol1 = AMP_OUT_ZERO;
  12374. if (hp_nid == 0x14)
  12375. dac_vol2 = AMP_OUT_ZERO;
  12376. else if (hp_nid == 0x15)
  12377. dac_vol1 = AMP_OUT_ZERO;
  12378. if (line_nid != 0x16 || hp_nid != 0x16 ||
  12379. spec->autocfg.line_out_pins[1] != 0x16 ||
  12380. spec->autocfg.line_out_pins[2] != 0x16)
  12381. dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
  12382. snd_hda_codec_write(codec, 0x02, 0,
  12383. AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
  12384. snd_hda_codec_write(codec, 0x03, 0,
  12385. AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
  12386. }
  12387. /* pcm configuration: identical with ALC880 */
  12388. #define alc268_pcm_analog_playback alc880_pcm_analog_playback
  12389. #define alc268_pcm_analog_capture alc880_pcm_analog_capture
  12390. #define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
  12391. #define alc268_pcm_digital_playback alc880_pcm_digital_playback
  12392. /*
  12393. * BIOS auto configuration
  12394. */
  12395. static int alc268_parse_auto_config(struct hda_codec *codec)
  12396. {
  12397. struct alc_spec *spec = codec->spec;
  12398. int err;
  12399. static hda_nid_t alc268_ignore[] = { 0 };
  12400. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  12401. alc268_ignore);
  12402. if (err < 0)
  12403. return err;
  12404. if (!spec->autocfg.line_outs) {
  12405. if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
  12406. spec->multiout.max_channels = 2;
  12407. spec->no_analog = 1;
  12408. goto dig_only;
  12409. }
  12410. return 0; /* can't find valid BIOS pin config */
  12411. }
  12412. err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
  12413. if (err < 0)
  12414. return err;
  12415. err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
  12416. if (err < 0)
  12417. return err;
  12418. spec->multiout.max_channels = 2;
  12419. dig_only:
  12420. /* digital only support output */
  12421. alc_auto_parse_digital(codec);
  12422. if (spec->kctls.list)
  12423. add_mixer(spec, spec->kctls.list);
  12424. if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
  12425. add_mixer(spec, alc268_beep_mixer);
  12426. add_verb(spec, alc268_volume_init_verbs);
  12427. spec->num_mux_defs = 2;
  12428. spec->input_mux = &spec->private_imux[0];
  12429. err = alc_auto_add_mic_boost(codec);
  12430. if (err < 0)
  12431. return err;
  12432. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  12433. return 1;
  12434. }
  12435. #define alc268_auto_init_analog_input alc882_auto_init_analog_input
  12436. #define alc268_auto_init_input_src alc882_auto_init_input_src
  12437. /* init callback for auto-configuration model -- overriding the default init */
  12438. static void alc268_auto_init(struct hda_codec *codec)
  12439. {
  12440. struct alc_spec *spec = codec->spec;
  12441. alc268_auto_init_multi_out(codec);
  12442. alc268_auto_init_hp_out(codec);
  12443. alc268_auto_init_mono_speaker_out(codec);
  12444. alc268_auto_init_analog_input(codec);
  12445. alc268_auto_init_input_src(codec);
  12446. alc_auto_init_digital(codec);
  12447. if (spec->unsol_event)
  12448. alc_inithook(codec);
  12449. }
  12450. /*
  12451. * configuration and preset
  12452. */
  12453. static const char * const alc268_models[ALC268_MODEL_LAST] = {
  12454. [ALC267_QUANTA_IL1] = "quanta-il1",
  12455. [ALC268_3ST] = "3stack",
  12456. [ALC268_TOSHIBA] = "toshiba",
  12457. [ALC268_ACER] = "acer",
  12458. [ALC268_ACER_DMIC] = "acer-dmic",
  12459. [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
  12460. [ALC268_DELL] = "dell",
  12461. [ALC268_ZEPTO] = "zepto",
  12462. #ifdef CONFIG_SND_DEBUG
  12463. [ALC268_TEST] = "test",
  12464. #endif
  12465. [ALC268_AUTO] = "auto",
  12466. };
  12467. static struct snd_pci_quirk alc268_cfg_tbl[] = {
  12468. SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
  12469. SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
  12470. SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
  12471. SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
  12472. SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
  12473. SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
  12474. ALC268_ACER_ASPIRE_ONE),
  12475. SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
  12476. SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
  12477. "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
  12478. /* almost compatible with toshiba but with optional digital outs;
  12479. * auto-probing seems working fine
  12480. */
  12481. SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
  12482. ALC268_AUTO),
  12483. SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
  12484. SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
  12485. SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
  12486. SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
  12487. SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
  12488. {}
  12489. };
  12490. /* Toshiba laptops have no unique PCI SSID but only codec SSID */
  12491. static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
  12492. SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
  12493. SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
  12494. SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
  12495. ALC268_TOSHIBA),
  12496. {}
  12497. };
  12498. static struct alc_config_preset alc268_presets[] = {
  12499. [ALC267_QUANTA_IL1] = {
  12500. .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
  12501. alc268_capture_nosrc_mixer },
  12502. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12503. alc267_quanta_il1_verbs },
  12504. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12505. .dac_nids = alc268_dac_nids,
  12506. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12507. .adc_nids = alc268_adc_nids_alt,
  12508. .hp_nid = 0x03,
  12509. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12510. .channel_mode = alc268_modes,
  12511. .unsol_event = alc_sku_unsol_event,
  12512. .setup = alc267_quanta_il1_setup,
  12513. .init_hook = alc_inithook,
  12514. },
  12515. [ALC268_3ST] = {
  12516. .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
  12517. alc268_beep_mixer },
  12518. .init_verbs = { alc268_base_init_verbs },
  12519. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12520. .dac_nids = alc268_dac_nids,
  12521. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12522. .adc_nids = alc268_adc_nids_alt,
  12523. .capsrc_nids = alc268_capsrc_nids,
  12524. .hp_nid = 0x03,
  12525. .dig_out_nid = ALC268_DIGOUT_NID,
  12526. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12527. .channel_mode = alc268_modes,
  12528. .input_mux = &alc268_capture_source,
  12529. },
  12530. [ALC268_TOSHIBA] = {
  12531. .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
  12532. alc268_beep_mixer },
  12533. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12534. alc268_toshiba_verbs },
  12535. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12536. .dac_nids = alc268_dac_nids,
  12537. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12538. .adc_nids = alc268_adc_nids_alt,
  12539. .capsrc_nids = alc268_capsrc_nids,
  12540. .hp_nid = 0x03,
  12541. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12542. .channel_mode = alc268_modes,
  12543. .input_mux = &alc268_capture_source,
  12544. .unsol_event = alc268_toshiba_unsol_event,
  12545. .setup = alc268_toshiba_setup,
  12546. .init_hook = alc268_toshiba_automute,
  12547. },
  12548. [ALC268_ACER] = {
  12549. .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
  12550. alc268_beep_mixer },
  12551. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12552. alc268_acer_verbs },
  12553. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12554. .dac_nids = alc268_dac_nids,
  12555. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12556. .adc_nids = alc268_adc_nids_alt,
  12557. .capsrc_nids = alc268_capsrc_nids,
  12558. .hp_nid = 0x02,
  12559. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12560. .channel_mode = alc268_modes,
  12561. .input_mux = &alc268_acer_capture_source,
  12562. .unsol_event = alc268_acer_unsol_event,
  12563. .init_hook = alc268_acer_init_hook,
  12564. },
  12565. [ALC268_ACER_DMIC] = {
  12566. .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
  12567. alc268_beep_mixer },
  12568. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12569. alc268_acer_verbs },
  12570. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12571. .dac_nids = alc268_dac_nids,
  12572. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12573. .adc_nids = alc268_adc_nids_alt,
  12574. .capsrc_nids = alc268_capsrc_nids,
  12575. .hp_nid = 0x02,
  12576. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12577. .channel_mode = alc268_modes,
  12578. .input_mux = &alc268_acer_dmic_capture_source,
  12579. .unsol_event = alc268_acer_unsol_event,
  12580. .init_hook = alc268_acer_init_hook,
  12581. },
  12582. [ALC268_ACER_ASPIRE_ONE] = {
  12583. .mixers = { alc268_acer_aspire_one_mixer,
  12584. alc268_beep_mixer,
  12585. alc268_capture_nosrc_mixer },
  12586. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12587. alc268_acer_aspire_one_verbs },
  12588. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12589. .dac_nids = alc268_dac_nids,
  12590. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12591. .adc_nids = alc268_adc_nids_alt,
  12592. .capsrc_nids = alc268_capsrc_nids,
  12593. .hp_nid = 0x03,
  12594. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12595. .channel_mode = alc268_modes,
  12596. .unsol_event = alc268_acer_lc_unsol_event,
  12597. .setup = alc268_acer_lc_setup,
  12598. .init_hook = alc268_acer_lc_init_hook,
  12599. },
  12600. [ALC268_DELL] = {
  12601. .mixers = { alc268_dell_mixer, alc268_beep_mixer,
  12602. alc268_capture_nosrc_mixer },
  12603. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12604. alc268_dell_verbs },
  12605. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12606. .dac_nids = alc268_dac_nids,
  12607. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12608. .adc_nids = alc268_adc_nids_alt,
  12609. .capsrc_nids = alc268_capsrc_nids,
  12610. .hp_nid = 0x02,
  12611. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12612. .channel_mode = alc268_modes,
  12613. .unsol_event = alc_sku_unsol_event,
  12614. .setup = alc268_dell_setup,
  12615. .init_hook = alc_inithook,
  12616. },
  12617. [ALC268_ZEPTO] = {
  12618. .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
  12619. alc268_beep_mixer },
  12620. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12621. alc268_toshiba_verbs },
  12622. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12623. .dac_nids = alc268_dac_nids,
  12624. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12625. .adc_nids = alc268_adc_nids_alt,
  12626. .capsrc_nids = alc268_capsrc_nids,
  12627. .hp_nid = 0x03,
  12628. .dig_out_nid = ALC268_DIGOUT_NID,
  12629. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12630. .channel_mode = alc268_modes,
  12631. .input_mux = &alc268_capture_source,
  12632. .setup = alc268_toshiba_setup,
  12633. .init_hook = alc268_toshiba_automute,
  12634. },
  12635. #ifdef CONFIG_SND_DEBUG
  12636. [ALC268_TEST] = {
  12637. .mixers = { alc268_test_mixer, alc268_capture_mixer },
  12638. .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
  12639. alc268_volume_init_verbs },
  12640. .num_dacs = ARRAY_SIZE(alc268_dac_nids),
  12641. .dac_nids = alc268_dac_nids,
  12642. .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
  12643. .adc_nids = alc268_adc_nids_alt,
  12644. .capsrc_nids = alc268_capsrc_nids,
  12645. .hp_nid = 0x03,
  12646. .dig_out_nid = ALC268_DIGOUT_NID,
  12647. .num_channel_mode = ARRAY_SIZE(alc268_modes),
  12648. .channel_mode = alc268_modes,
  12649. .input_mux = &alc268_capture_source,
  12650. },
  12651. #endif
  12652. };
  12653. static int patch_alc268(struct hda_codec *codec)
  12654. {
  12655. struct alc_spec *spec;
  12656. int board_config;
  12657. int i, has_beep, err;
  12658. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  12659. if (spec == NULL)
  12660. return -ENOMEM;
  12661. codec->spec = spec;
  12662. board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
  12663. alc268_models,
  12664. alc268_cfg_tbl);
  12665. if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
  12666. board_config = snd_hda_check_board_codec_sid_config(codec,
  12667. ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
  12668. if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
  12669. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  12670. codec->chip_name);
  12671. board_config = ALC268_AUTO;
  12672. }
  12673. if (board_config == ALC268_AUTO) {
  12674. /* automatic parse from the BIOS config */
  12675. err = alc268_parse_auto_config(codec);
  12676. if (err < 0) {
  12677. alc_free(codec);
  12678. return err;
  12679. } else if (!err) {
  12680. printk(KERN_INFO
  12681. "hda_codec: Cannot set up configuration "
  12682. "from BIOS. Using base mode...\n");
  12683. board_config = ALC268_3ST;
  12684. }
  12685. }
  12686. if (board_config != ALC268_AUTO)
  12687. setup_preset(codec, &alc268_presets[board_config]);
  12688. spec->stream_analog_playback = &alc268_pcm_analog_playback;
  12689. spec->stream_analog_capture = &alc268_pcm_analog_capture;
  12690. spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
  12691. spec->stream_digital_playback = &alc268_pcm_digital_playback;
  12692. has_beep = 0;
  12693. for (i = 0; i < spec->num_mixers; i++) {
  12694. if (spec->mixers[i] == alc268_beep_mixer) {
  12695. has_beep = 1;
  12696. break;
  12697. }
  12698. }
  12699. if (has_beep) {
  12700. err = snd_hda_attach_beep_device(codec, 0x1);
  12701. if (err < 0) {
  12702. alc_free(codec);
  12703. return err;
  12704. }
  12705. if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
  12706. /* override the amp caps for beep generator */
  12707. snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
  12708. (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
  12709. (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
  12710. (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
  12711. (0 << AC_AMPCAP_MUTE_SHIFT));
  12712. }
  12713. if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
  12714. /* check whether NID 0x07 is valid */
  12715. unsigned int wcap = get_wcaps(codec, 0x07);
  12716. spec->capsrc_nids = alc268_capsrc_nids;
  12717. /* get type */
  12718. wcap = get_wcaps_type(wcap);
  12719. if (spec->auto_mic ||
  12720. wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
  12721. spec->adc_nids = alc268_adc_nids_alt;
  12722. spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
  12723. if (spec->auto_mic)
  12724. fixup_automic_adc(codec);
  12725. if (spec->auto_mic || spec->input_mux->num_items == 1)
  12726. add_mixer(spec, alc268_capture_nosrc_mixer);
  12727. else
  12728. add_mixer(spec, alc268_capture_alt_mixer);
  12729. } else {
  12730. spec->adc_nids = alc268_adc_nids;
  12731. spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
  12732. add_mixer(spec, alc268_capture_mixer);
  12733. }
  12734. }
  12735. spec->vmaster_nid = 0x02;
  12736. codec->patch_ops = alc_patch_ops;
  12737. if (board_config == ALC268_AUTO)
  12738. spec->init_hook = alc268_auto_init;
  12739. alc_init_jacks(codec);
  12740. return 0;
  12741. }
  12742. /*
  12743. * ALC269 channel source setting (2 channel)
  12744. */
  12745. #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
  12746. #define alc269_dac_nids alc260_dac_nids
  12747. static hda_nid_t alc269_adc_nids[1] = {
  12748. /* ADC1 */
  12749. 0x08,
  12750. };
  12751. static hda_nid_t alc269_capsrc_nids[1] = {
  12752. 0x23,
  12753. };
  12754. static hda_nid_t alc269vb_adc_nids[1] = {
  12755. /* ADC1 */
  12756. 0x09,
  12757. };
  12758. static hda_nid_t alc269vb_capsrc_nids[1] = {
  12759. 0x22,
  12760. };
  12761. static hda_nid_t alc269_adc_candidates[] = {
  12762. 0x08, 0x09, 0x07,
  12763. };
  12764. #define alc269_modes alc260_modes
  12765. #define alc269_capture_source alc880_lg_lw_capture_source
  12766. static struct snd_kcontrol_new alc269_base_mixer[] = {
  12767. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  12768. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  12769. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  12770. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  12771. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  12772. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  12773. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12774. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  12775. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  12776. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12777. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  12778. HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
  12779. { } /* end */
  12780. };
  12781. static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
  12782. /* output mixer control */
  12783. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  12784. {
  12785. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  12786. .name = "Master Playback Switch",
  12787. .subdevice = HDA_SUBDEV_AMP_FLAG,
  12788. .info = snd_hda_mixer_amp_switch_info,
  12789. .get = snd_hda_mixer_amp_switch_get,
  12790. .put = alc268_acer_master_sw_put,
  12791. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  12792. },
  12793. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  12794. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  12795. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12796. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  12797. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  12798. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12799. { }
  12800. };
  12801. static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
  12802. /* output mixer control */
  12803. HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
  12804. {
  12805. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  12806. .name = "Master Playback Switch",
  12807. .subdevice = HDA_SUBDEV_AMP_FLAG,
  12808. .info = snd_hda_mixer_amp_switch_info,
  12809. .get = snd_hda_mixer_amp_switch_get,
  12810. .put = alc268_acer_master_sw_put,
  12811. .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  12812. },
  12813. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  12814. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  12815. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12816. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
  12817. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
  12818. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12819. HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
  12820. HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
  12821. HDA_CODEC_VOLUME("Dock Mic Boost Volume", 0x1b, 0, HDA_INPUT),
  12822. { }
  12823. };
  12824. static struct snd_kcontrol_new alc269_laptop_mixer[] = {
  12825. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  12826. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  12827. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  12828. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  12829. { } /* end */
  12830. };
  12831. static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
  12832. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  12833. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  12834. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  12835. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  12836. { } /* end */
  12837. };
  12838. static struct snd_kcontrol_new alc269_asus_mixer[] = {
  12839. HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  12840. HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT),
  12841. { } /* end */
  12842. };
  12843. /* capture mixer elements */
  12844. static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
  12845. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  12846. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  12847. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12848. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12849. { } /* end */
  12850. };
  12851. static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
  12852. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  12853. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  12854. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12855. { } /* end */
  12856. };
  12857. static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
  12858. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  12859. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  12860. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12861. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  12862. { } /* end */
  12863. };
  12864. static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
  12865. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  12866. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  12867. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  12868. { } /* end */
  12869. };
  12870. /* FSC amilo */
  12871. #define alc269_fujitsu_mixer alc269_laptop_mixer
  12872. static struct hda_verb alc269_quanta_fl1_verbs[] = {
  12873. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  12874. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  12875. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  12876. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  12877. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  12878. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  12879. { }
  12880. };
  12881. static struct hda_verb alc269_lifebook_verbs[] = {
  12882. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  12883. {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
  12884. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  12885. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  12886. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  12887. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  12888. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  12889. {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  12890. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  12891. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  12892. { }
  12893. };
  12894. /* toggle speaker-output according to the hp-jack state */
  12895. static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
  12896. {
  12897. unsigned int present;
  12898. unsigned char bits;
  12899. present = snd_hda_jack_detect(codec, 0x15);
  12900. bits = present ? HDA_AMP_MUTE : 0;
  12901. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  12902. HDA_AMP_MUTE, bits);
  12903. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  12904. HDA_AMP_MUTE, bits);
  12905. snd_hda_codec_write(codec, 0x20, 0,
  12906. AC_VERB_SET_COEF_INDEX, 0x0c);
  12907. snd_hda_codec_write(codec, 0x20, 0,
  12908. AC_VERB_SET_PROC_COEF, 0x680);
  12909. snd_hda_codec_write(codec, 0x20, 0,
  12910. AC_VERB_SET_COEF_INDEX, 0x0c);
  12911. snd_hda_codec_write(codec, 0x20, 0,
  12912. AC_VERB_SET_PROC_COEF, 0x480);
  12913. }
  12914. /* toggle speaker-output according to the hp-jacks state */
  12915. static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
  12916. {
  12917. unsigned int present;
  12918. unsigned char bits;
  12919. /* Check laptop headphone socket */
  12920. present = snd_hda_jack_detect(codec, 0x15);
  12921. /* Check port replicator headphone socket */
  12922. present |= snd_hda_jack_detect(codec, 0x1a);
  12923. bits = present ? HDA_AMP_MUTE : 0;
  12924. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  12925. HDA_AMP_MUTE, bits);
  12926. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  12927. HDA_AMP_MUTE, bits);
  12928. snd_hda_codec_write(codec, 0x20, 0,
  12929. AC_VERB_SET_COEF_INDEX, 0x0c);
  12930. snd_hda_codec_write(codec, 0x20, 0,
  12931. AC_VERB_SET_PROC_COEF, 0x680);
  12932. snd_hda_codec_write(codec, 0x20, 0,
  12933. AC_VERB_SET_COEF_INDEX, 0x0c);
  12934. snd_hda_codec_write(codec, 0x20, 0,
  12935. AC_VERB_SET_PROC_COEF, 0x480);
  12936. }
  12937. static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
  12938. {
  12939. unsigned int present_laptop;
  12940. unsigned int present_dock;
  12941. present_laptop = snd_hda_jack_detect(codec, 0x18);
  12942. present_dock = snd_hda_jack_detect(codec, 0x1b);
  12943. /* Laptop mic port overrides dock mic port, design decision */
  12944. if (present_dock)
  12945. snd_hda_codec_write(codec, 0x23, 0,
  12946. AC_VERB_SET_CONNECT_SEL, 0x3);
  12947. if (present_laptop)
  12948. snd_hda_codec_write(codec, 0x23, 0,
  12949. AC_VERB_SET_CONNECT_SEL, 0x0);
  12950. if (!present_dock && !present_laptop)
  12951. snd_hda_codec_write(codec, 0x23, 0,
  12952. AC_VERB_SET_CONNECT_SEL, 0x1);
  12953. }
  12954. static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
  12955. unsigned int res)
  12956. {
  12957. switch (res >> 26) {
  12958. case ALC880_HP_EVENT:
  12959. alc269_quanta_fl1_speaker_automute(codec);
  12960. break;
  12961. case ALC880_MIC_EVENT:
  12962. alc_mic_automute(codec);
  12963. break;
  12964. }
  12965. }
  12966. static void alc269_lifebook_unsol_event(struct hda_codec *codec,
  12967. unsigned int res)
  12968. {
  12969. if ((res >> 26) == ALC880_HP_EVENT)
  12970. alc269_lifebook_speaker_automute(codec);
  12971. if ((res >> 26) == ALC880_MIC_EVENT)
  12972. alc269_lifebook_mic_autoswitch(codec);
  12973. }
  12974. static void alc269_quanta_fl1_setup(struct hda_codec *codec)
  12975. {
  12976. struct alc_spec *spec = codec->spec;
  12977. spec->autocfg.hp_pins[0] = 0x15;
  12978. spec->autocfg.speaker_pins[0] = 0x14;
  12979. spec->ext_mic.pin = 0x18;
  12980. spec->ext_mic.mux_idx = 0;
  12981. spec->int_mic.pin = 0x19;
  12982. spec->int_mic.mux_idx = 1;
  12983. spec->auto_mic = 1;
  12984. }
  12985. static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
  12986. {
  12987. alc269_quanta_fl1_speaker_automute(codec);
  12988. alc_mic_automute(codec);
  12989. }
  12990. static void alc269_lifebook_init_hook(struct hda_codec *codec)
  12991. {
  12992. alc269_lifebook_speaker_automute(codec);
  12993. alc269_lifebook_mic_autoswitch(codec);
  12994. }
  12995. static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
  12996. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  12997. {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
  12998. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  12999. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  13000. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13001. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  13002. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  13003. {}
  13004. };
  13005. static struct hda_verb alc269_laptop_amic_init_verbs[] = {
  13006. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  13007. {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
  13008. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  13009. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
  13010. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  13011. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  13012. {}
  13013. };
  13014. static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
  13015. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
  13016. {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
  13017. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  13018. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  13019. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13020. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  13021. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  13022. {}
  13023. };
  13024. static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
  13025. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
  13026. {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
  13027. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
  13028. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
  13029. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13030. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  13031. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  13032. {}
  13033. };
  13034. static struct hda_verb alc271_acer_dmic_verbs[] = {
  13035. {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
  13036. {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
  13037. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13038. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  13039. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  13040. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  13041. {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},
  13042. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  13043. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  13044. {0x22, AC_VERB_SET_CONNECT_SEL, 6},
  13045. { }
  13046. };
  13047. /* toggle speaker-output according to the hp-jack state */
  13048. static void alc269_speaker_automute(struct hda_codec *codec)
  13049. {
  13050. struct alc_spec *spec = codec->spec;
  13051. unsigned int nid = spec->autocfg.hp_pins[0];
  13052. unsigned int present;
  13053. unsigned char bits;
  13054. present = snd_hda_jack_detect(codec, nid);
  13055. bits = present ? HDA_AMP_MUTE : 0;
  13056. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  13057. HDA_AMP_MUTE, bits);
  13058. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  13059. HDA_AMP_MUTE, bits);
  13060. snd_hda_input_jack_report(codec, nid);
  13061. }
  13062. /* unsolicited event for HP jack sensing */
  13063. static void alc269_laptop_unsol_event(struct hda_codec *codec,
  13064. unsigned int res)
  13065. {
  13066. switch (res >> 26) {
  13067. case ALC880_HP_EVENT:
  13068. alc269_speaker_automute(codec);
  13069. break;
  13070. case ALC880_MIC_EVENT:
  13071. alc_mic_automute(codec);
  13072. break;
  13073. }
  13074. }
  13075. static void alc269_laptop_amic_setup(struct hda_codec *codec)
  13076. {
  13077. struct alc_spec *spec = codec->spec;
  13078. spec->autocfg.hp_pins[0] = 0x15;
  13079. spec->autocfg.speaker_pins[0] = 0x14;
  13080. spec->ext_mic.pin = 0x18;
  13081. spec->ext_mic.mux_idx = 0;
  13082. spec->int_mic.pin = 0x19;
  13083. spec->int_mic.mux_idx = 1;
  13084. spec->auto_mic = 1;
  13085. }
  13086. static void alc269_laptop_dmic_setup(struct hda_codec *codec)
  13087. {
  13088. struct alc_spec *spec = codec->spec;
  13089. spec->autocfg.hp_pins[0] = 0x15;
  13090. spec->autocfg.speaker_pins[0] = 0x14;
  13091. spec->ext_mic.pin = 0x18;
  13092. spec->ext_mic.mux_idx = 0;
  13093. spec->int_mic.pin = 0x12;
  13094. spec->int_mic.mux_idx = 5;
  13095. spec->auto_mic = 1;
  13096. }
  13097. static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
  13098. {
  13099. struct alc_spec *spec = codec->spec;
  13100. spec->autocfg.hp_pins[0] = 0x21;
  13101. spec->autocfg.speaker_pins[0] = 0x14;
  13102. spec->ext_mic.pin = 0x18;
  13103. spec->ext_mic.mux_idx = 0;
  13104. spec->int_mic.pin = 0x19;
  13105. spec->int_mic.mux_idx = 1;
  13106. spec->auto_mic = 1;
  13107. }
  13108. static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
  13109. {
  13110. struct alc_spec *spec = codec->spec;
  13111. spec->autocfg.hp_pins[0] = 0x21;
  13112. spec->autocfg.speaker_pins[0] = 0x14;
  13113. spec->ext_mic.pin = 0x18;
  13114. spec->ext_mic.mux_idx = 0;
  13115. spec->int_mic.pin = 0x12;
  13116. spec->int_mic.mux_idx = 6;
  13117. spec->auto_mic = 1;
  13118. }
  13119. static void alc269_laptop_inithook(struct hda_codec *codec)
  13120. {
  13121. alc269_speaker_automute(codec);
  13122. alc_mic_automute(codec);
  13123. }
  13124. /*
  13125. * generic initialization of ADC, input mixers and output mixers
  13126. */
  13127. static struct hda_verb alc269_init_verbs[] = {
  13128. /*
  13129. * Unmute ADC0 and set the default input to mic-in
  13130. */
  13131. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13132. /*
  13133. * Set up output mixers (0x02 - 0x03)
  13134. */
  13135. /* set vol=0 to output mixers */
  13136. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  13137. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  13138. /* set up input amps for analog loopback */
  13139. /* Amp Indices: DAC = 0, mixer = 1 */
  13140. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13141. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  13142. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13143. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  13144. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13145. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  13146. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  13147. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  13148. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  13149. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  13150. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  13151. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13152. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13153. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  13154. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  13155. /* FIXME: use Mux-type input source selection */
  13156. /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
  13157. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  13158. {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
  13159. /* set EAPD */
  13160. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  13161. { }
  13162. };
  13163. static struct hda_verb alc269vb_init_verbs[] = {
  13164. /*
  13165. * Unmute ADC0 and set the default input to mic-in
  13166. */
  13167. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13168. /*
  13169. * Set up output mixers (0x02 - 0x03)
  13170. */
  13171. /* set vol=0 to output mixers */
  13172. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  13173. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  13174. /* set up input amps for analog loopback */
  13175. /* Amp Indices: DAC = 0, mixer = 1 */
  13176. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13177. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  13178. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13179. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  13180. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  13181. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  13182. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  13183. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  13184. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  13185. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  13186. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  13187. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13188. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  13189. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  13190. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  13191. /* FIXME: use Mux-type input source selection */
  13192. /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
  13193. /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
  13194. {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
  13195. /* set EAPD */
  13196. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  13197. { }
  13198. };
  13199. #define alc269_auto_create_multi_out_ctls \
  13200. alc268_auto_create_multi_out_ctls
  13201. #define alc269_auto_create_input_ctls \
  13202. alc268_auto_create_input_ctls
  13203. #ifdef CONFIG_SND_HDA_POWER_SAVE
  13204. #define alc269_loopbacks alc880_loopbacks
  13205. #endif
  13206. /* pcm configuration: identical with ALC880 */
  13207. #define alc269_pcm_analog_playback alc880_pcm_analog_playback
  13208. #define alc269_pcm_analog_capture alc880_pcm_analog_capture
  13209. #define alc269_pcm_digital_playback alc880_pcm_digital_playback
  13210. #define alc269_pcm_digital_capture alc880_pcm_digital_capture
  13211. static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
  13212. .substreams = 1,
  13213. .channels_min = 2,
  13214. .channels_max = 8,
  13215. .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
  13216. /* NID is set in alc_build_pcms */
  13217. .ops = {
  13218. .open = alc880_playback_pcm_open,
  13219. .prepare = alc880_playback_pcm_prepare,
  13220. .cleanup = alc880_playback_pcm_cleanup
  13221. },
  13222. };
  13223. static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
  13224. .substreams = 1,
  13225. .channels_min = 2,
  13226. .channels_max = 2,
  13227. .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
  13228. /* NID is set in alc_build_pcms */
  13229. };
  13230. #ifdef CONFIG_SND_HDA_POWER_SAVE
  13231. static int alc269_mic2_for_mute_led(struct hda_codec *codec)
  13232. {
  13233. switch (codec->subsystem_id) {
  13234. case 0x103c1586:
  13235. return 1;
  13236. }
  13237. return 0;
  13238. }
  13239. static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
  13240. {
  13241. /* update mute-LED according to the speaker mute state */
  13242. if (nid == 0x01 || nid == 0x14) {
  13243. int pinval;
  13244. if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
  13245. HDA_AMP_MUTE)
  13246. pinval = 0x24;
  13247. else
  13248. pinval = 0x20;
  13249. /* mic2 vref pin is used for mute LED control */
  13250. snd_hda_codec_update_cache(codec, 0x19, 0,
  13251. AC_VERB_SET_PIN_WIDGET_CONTROL,
  13252. pinval);
  13253. }
  13254. return alc_check_power_status(codec, nid);
  13255. }
  13256. #endif /* CONFIG_SND_HDA_POWER_SAVE */
  13257. static int alc275_setup_dual_adc(struct hda_codec *codec)
  13258. {
  13259. struct alc_spec *spec = codec->spec;
  13260. if (codec->vendor_id != 0x10ec0275 || !spec->auto_mic)
  13261. return 0;
  13262. if ((spec->ext_mic.pin >= 0x18 && spec->int_mic.pin <= 0x13) ||
  13263. (spec->ext_mic.pin <= 0x12 && spec->int_mic.pin >= 0x18)) {
  13264. if (spec->ext_mic.pin <= 0x12) {
  13265. spec->private_adc_nids[0] = 0x08;
  13266. spec->private_adc_nids[1] = 0x11;
  13267. spec->private_capsrc_nids[0] = 0x23;
  13268. spec->private_capsrc_nids[1] = 0x22;
  13269. } else {
  13270. spec->private_adc_nids[0] = 0x11;
  13271. spec->private_adc_nids[1] = 0x08;
  13272. spec->private_capsrc_nids[0] = 0x22;
  13273. spec->private_capsrc_nids[1] = 0x23;
  13274. }
  13275. spec->adc_nids = spec->private_adc_nids;
  13276. spec->capsrc_nids = spec->private_capsrc_nids;
  13277. spec->num_adc_nids = 2;
  13278. spec->dual_adc_switch = 1;
  13279. snd_printdd("realtek: enabling dual ADC switchg (%02x:%02x)\n",
  13280. spec->adc_nids[0], spec->adc_nids[1]);
  13281. return 1;
  13282. }
  13283. return 0;
  13284. }
  13285. /* different alc269-variants */
  13286. enum {
  13287. ALC269_TYPE_NORMAL,
  13288. ALC269_TYPE_ALC258,
  13289. ALC269_TYPE_ALC259,
  13290. ALC269_TYPE_ALC269VB,
  13291. ALC269_TYPE_ALC270,
  13292. ALC269_TYPE_ALC271X,
  13293. };
  13294. /*
  13295. * BIOS auto configuration
  13296. */
  13297. static int alc269_parse_auto_config(struct hda_codec *codec)
  13298. {
  13299. struct alc_spec *spec = codec->spec;
  13300. int err;
  13301. static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
  13302. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  13303. alc269_ignore);
  13304. if (err < 0)
  13305. return err;
  13306. err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
  13307. if (err < 0)
  13308. return err;
  13309. if (spec->codec_variant == ALC269_TYPE_NORMAL)
  13310. err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
  13311. else
  13312. err = alc_auto_create_input_ctls(codec, &spec->autocfg, 0,
  13313. 0x22, 0);
  13314. if (err < 0)
  13315. return err;
  13316. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  13317. alc_auto_parse_digital(codec);
  13318. if (spec->kctls.list)
  13319. add_mixer(spec, spec->kctls.list);
  13320. if (spec->codec_variant != ALC269_TYPE_NORMAL) {
  13321. add_verb(spec, alc269vb_init_verbs);
  13322. alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
  13323. } else {
  13324. add_verb(spec, alc269_init_verbs);
  13325. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  13326. }
  13327. spec->num_mux_defs = 1;
  13328. spec->input_mux = &spec->private_imux[0];
  13329. if (!alc275_setup_dual_adc(codec))
  13330. fillup_priv_adc_nids(codec, alc269_adc_candidates,
  13331. sizeof(alc269_adc_candidates));
  13332. err = alc_auto_add_mic_boost(codec);
  13333. if (err < 0)
  13334. return err;
  13335. if (!spec->cap_mixer && !spec->no_analog)
  13336. set_capture_mixer(codec);
  13337. return 1;
  13338. }
  13339. #define alc269_auto_init_multi_out alc268_auto_init_multi_out
  13340. #define alc269_auto_init_hp_out alc268_auto_init_hp_out
  13341. #define alc269_auto_init_analog_input alc882_auto_init_analog_input
  13342. #define alc269_auto_init_input_src alc882_auto_init_input_src
  13343. /* init callback for auto-configuration model -- overriding the default init */
  13344. static void alc269_auto_init(struct hda_codec *codec)
  13345. {
  13346. struct alc_spec *spec = codec->spec;
  13347. alc269_auto_init_multi_out(codec);
  13348. alc269_auto_init_hp_out(codec);
  13349. alc269_auto_init_analog_input(codec);
  13350. if (!spec->dual_adc_switch)
  13351. alc269_auto_init_input_src(codec);
  13352. alc_auto_init_digital(codec);
  13353. if (spec->unsol_event)
  13354. alc_inithook(codec);
  13355. }
  13356. #ifdef SND_HDA_NEEDS_RESUME
  13357. static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
  13358. {
  13359. int val = alc_read_coef_idx(codec, 0x04);
  13360. if (power_up)
  13361. val |= 1 << 11;
  13362. else
  13363. val &= ~(1 << 11);
  13364. alc_write_coef_idx(codec, 0x04, val);
  13365. }
  13366. #ifdef CONFIG_SND_HDA_POWER_SAVE
  13367. static int alc269_suspend(struct hda_codec *codec, pm_message_t state)
  13368. {
  13369. struct alc_spec *spec = codec->spec;
  13370. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017)
  13371. alc269_toggle_power_output(codec, 0);
  13372. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
  13373. alc269_toggle_power_output(codec, 0);
  13374. msleep(150);
  13375. }
  13376. alc_shutup(codec);
  13377. if (spec && spec->power_hook)
  13378. spec->power_hook(codec);
  13379. return 0;
  13380. }
  13381. #endif /* CONFIG_SND_HDA_POWER_SAVE */
  13382. static int alc269_resume(struct hda_codec *codec)
  13383. {
  13384. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
  13385. alc269_toggle_power_output(codec, 0);
  13386. msleep(150);
  13387. }
  13388. codec->patch_ops.init(codec);
  13389. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
  13390. alc269_toggle_power_output(codec, 1);
  13391. msleep(200);
  13392. }
  13393. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018)
  13394. alc269_toggle_power_output(codec, 1);
  13395. snd_hda_codec_resume_amp(codec);
  13396. snd_hda_codec_resume_cache(codec);
  13397. hda_call_check_power_status(codec, 0x01);
  13398. return 0;
  13399. }
  13400. #endif /* SND_HDA_NEEDS_RESUME */
  13401. static void alc269_fixup_hweq(struct hda_codec *codec,
  13402. const struct alc_fixup *fix, int action)
  13403. {
  13404. int coef;
  13405. if (action != ALC_FIXUP_ACT_INIT)
  13406. return;
  13407. coef = alc_read_coef_idx(codec, 0x1e);
  13408. alc_write_coef_idx(codec, 0x1e, coef | 0x80);
  13409. }
  13410. enum {
  13411. ALC269_FIXUP_SONY_VAIO,
  13412. ALC275_FIXUP_SONY_VAIO_GPIO2,
  13413. ALC269_FIXUP_DELL_M101Z,
  13414. ALC269_FIXUP_SKU_IGNORE,
  13415. ALC269_FIXUP_ASUS_G73JW,
  13416. ALC269_FIXUP_LENOVO_EAPD,
  13417. ALC275_FIXUP_SONY_HWEQ,
  13418. };
  13419. static const struct alc_fixup alc269_fixups[] = {
  13420. [ALC269_FIXUP_SONY_VAIO] = {
  13421. .type = ALC_FIXUP_VERBS,
  13422. .v.verbs = (const struct hda_verb[]) {
  13423. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
  13424. {}
  13425. }
  13426. },
  13427. [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
  13428. .type = ALC_FIXUP_VERBS,
  13429. .v.verbs = (const struct hda_verb[]) {
  13430. {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
  13431. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
  13432. {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
  13433. { }
  13434. },
  13435. .chained = true,
  13436. .chain_id = ALC269_FIXUP_SONY_VAIO
  13437. },
  13438. [ALC269_FIXUP_DELL_M101Z] = {
  13439. .type = ALC_FIXUP_VERBS,
  13440. .v.verbs = (const struct hda_verb[]) {
  13441. /* Enables internal speaker */
  13442. {0x20, AC_VERB_SET_COEF_INDEX, 13},
  13443. {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
  13444. {}
  13445. }
  13446. },
  13447. [ALC269_FIXUP_SKU_IGNORE] = {
  13448. .type = ALC_FIXUP_SKU,
  13449. .v.sku = ALC_FIXUP_SKU_IGNORE,
  13450. },
  13451. [ALC269_FIXUP_ASUS_G73JW] = {
  13452. .type = ALC_FIXUP_PINS,
  13453. .v.pins = (const struct alc_pincfg[]) {
  13454. { 0x17, 0x99130111 }, /* subwoofer */
  13455. { }
  13456. }
  13457. },
  13458. [ALC269_FIXUP_LENOVO_EAPD] = {
  13459. .type = ALC_FIXUP_VERBS,
  13460. .v.verbs = (const struct hda_verb[]) {
  13461. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
  13462. {}
  13463. }
  13464. },
  13465. [ALC275_FIXUP_SONY_HWEQ] = {
  13466. .type = ALC_FIXUP_FUNC,
  13467. .v.func = alc269_fixup_hweq,
  13468. .chained = true,
  13469. .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
  13470. }
  13471. };
  13472. static struct snd_pci_quirk alc269_fixup_tbl[] = {
  13473. SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
  13474. SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
  13475. SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
  13476. SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
  13477. SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
  13478. SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
  13479. SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
  13480. SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
  13481. SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
  13482. SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
  13483. SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
  13484. SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
  13485. {}
  13486. };
  13487. /*
  13488. * configuration and preset
  13489. */
  13490. static const char * const alc269_models[ALC269_MODEL_LAST] = {
  13491. [ALC269_BASIC] = "basic",
  13492. [ALC269_QUANTA_FL1] = "quanta",
  13493. [ALC269_AMIC] = "laptop-amic",
  13494. [ALC269_DMIC] = "laptop-dmic",
  13495. [ALC269_FUJITSU] = "fujitsu",
  13496. [ALC269_LIFEBOOK] = "lifebook",
  13497. [ALC269_AUTO] = "auto",
  13498. };
  13499. static struct snd_pci_quirk alc269_cfg_tbl[] = {
  13500. SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
  13501. SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER),
  13502. SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
  13503. ALC269_AMIC),
  13504. SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
  13505. SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
  13506. SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
  13507. SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
  13508. SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
  13509. SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
  13510. SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
  13511. SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
  13512. SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
  13513. SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269VB_AMIC),
  13514. SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
  13515. SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
  13516. SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
  13517. SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
  13518. SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
  13519. SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
  13520. SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
  13521. SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
  13522. SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
  13523. SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
  13524. SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
  13525. SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
  13526. SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
  13527. SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
  13528. SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
  13529. SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
  13530. SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
  13531. SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
  13532. SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
  13533. SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
  13534. SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
  13535. SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
  13536. SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
  13537. SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
  13538. SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
  13539. SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
  13540. SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
  13541. ALC269_DMIC),
  13542. SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
  13543. ALC269_DMIC),
  13544. SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
  13545. SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
  13546. SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
  13547. SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
  13548. SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
  13549. SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
  13550. SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
  13551. SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
  13552. SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
  13553. SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
  13554. {}
  13555. };
  13556. static struct alc_config_preset alc269_presets[] = {
  13557. [ALC269_BASIC] = {
  13558. .mixers = { alc269_base_mixer },
  13559. .init_verbs = { alc269_init_verbs },
  13560. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13561. .dac_nids = alc269_dac_nids,
  13562. .hp_nid = 0x03,
  13563. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13564. .channel_mode = alc269_modes,
  13565. .input_mux = &alc269_capture_source,
  13566. },
  13567. [ALC269_QUANTA_FL1] = {
  13568. .mixers = { alc269_quanta_fl1_mixer },
  13569. .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
  13570. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13571. .dac_nids = alc269_dac_nids,
  13572. .hp_nid = 0x03,
  13573. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13574. .channel_mode = alc269_modes,
  13575. .input_mux = &alc269_capture_source,
  13576. .unsol_event = alc269_quanta_fl1_unsol_event,
  13577. .setup = alc269_quanta_fl1_setup,
  13578. .init_hook = alc269_quanta_fl1_init_hook,
  13579. },
  13580. [ALC269_AMIC] = {
  13581. .mixers = { alc269_laptop_mixer },
  13582. .cap_mixer = alc269_laptop_analog_capture_mixer,
  13583. .init_verbs = { alc269_init_verbs,
  13584. alc269_laptop_amic_init_verbs },
  13585. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13586. .dac_nids = alc269_dac_nids,
  13587. .hp_nid = 0x03,
  13588. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13589. .channel_mode = alc269_modes,
  13590. .unsol_event = alc269_laptop_unsol_event,
  13591. .setup = alc269_laptop_amic_setup,
  13592. .init_hook = alc269_laptop_inithook,
  13593. },
  13594. [ALC269_DMIC] = {
  13595. .mixers = { alc269_laptop_mixer },
  13596. .cap_mixer = alc269_laptop_digital_capture_mixer,
  13597. .init_verbs = { alc269_init_verbs,
  13598. alc269_laptop_dmic_init_verbs },
  13599. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13600. .dac_nids = alc269_dac_nids,
  13601. .hp_nid = 0x03,
  13602. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13603. .channel_mode = alc269_modes,
  13604. .unsol_event = alc269_laptop_unsol_event,
  13605. .setup = alc269_laptop_dmic_setup,
  13606. .init_hook = alc269_laptop_inithook,
  13607. },
  13608. [ALC269VB_AMIC] = {
  13609. .mixers = { alc269vb_laptop_mixer },
  13610. .cap_mixer = alc269vb_laptop_analog_capture_mixer,
  13611. .init_verbs = { alc269vb_init_verbs,
  13612. alc269vb_laptop_amic_init_verbs },
  13613. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13614. .dac_nids = alc269_dac_nids,
  13615. .hp_nid = 0x03,
  13616. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13617. .channel_mode = alc269_modes,
  13618. .unsol_event = alc269_laptop_unsol_event,
  13619. .setup = alc269vb_laptop_amic_setup,
  13620. .init_hook = alc269_laptop_inithook,
  13621. },
  13622. [ALC269VB_DMIC] = {
  13623. .mixers = { alc269vb_laptop_mixer },
  13624. .cap_mixer = alc269vb_laptop_digital_capture_mixer,
  13625. .init_verbs = { alc269vb_init_verbs,
  13626. alc269vb_laptop_dmic_init_verbs },
  13627. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13628. .dac_nids = alc269_dac_nids,
  13629. .hp_nid = 0x03,
  13630. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13631. .channel_mode = alc269_modes,
  13632. .unsol_event = alc269_laptop_unsol_event,
  13633. .setup = alc269vb_laptop_dmic_setup,
  13634. .init_hook = alc269_laptop_inithook,
  13635. },
  13636. [ALC269_FUJITSU] = {
  13637. .mixers = { alc269_fujitsu_mixer },
  13638. .cap_mixer = alc269_laptop_digital_capture_mixer,
  13639. .init_verbs = { alc269_init_verbs,
  13640. alc269_laptop_dmic_init_verbs },
  13641. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13642. .dac_nids = alc269_dac_nids,
  13643. .hp_nid = 0x03,
  13644. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13645. .channel_mode = alc269_modes,
  13646. .unsol_event = alc269_laptop_unsol_event,
  13647. .setup = alc269_laptop_dmic_setup,
  13648. .init_hook = alc269_laptop_inithook,
  13649. },
  13650. [ALC269_LIFEBOOK] = {
  13651. .mixers = { alc269_lifebook_mixer },
  13652. .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
  13653. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13654. .dac_nids = alc269_dac_nids,
  13655. .hp_nid = 0x03,
  13656. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13657. .channel_mode = alc269_modes,
  13658. .input_mux = &alc269_capture_source,
  13659. .unsol_event = alc269_lifebook_unsol_event,
  13660. .init_hook = alc269_lifebook_init_hook,
  13661. },
  13662. [ALC271_ACER] = {
  13663. .mixers = { alc269_asus_mixer },
  13664. .cap_mixer = alc269vb_laptop_digital_capture_mixer,
  13665. .init_verbs = { alc269_init_verbs, alc271_acer_dmic_verbs },
  13666. .num_dacs = ARRAY_SIZE(alc269_dac_nids),
  13667. .dac_nids = alc269_dac_nids,
  13668. .adc_nids = alc262_dmic_adc_nids,
  13669. .num_adc_nids = ARRAY_SIZE(alc262_dmic_adc_nids),
  13670. .capsrc_nids = alc262_dmic_capsrc_nids,
  13671. .num_channel_mode = ARRAY_SIZE(alc269_modes),
  13672. .channel_mode = alc269_modes,
  13673. .input_mux = &alc269_capture_source,
  13674. .dig_out_nid = ALC880_DIGOUT_NID,
  13675. .unsol_event = alc_sku_unsol_event,
  13676. .setup = alc269vb_laptop_dmic_setup,
  13677. .init_hook = alc_inithook,
  13678. },
  13679. };
  13680. static int alc269_fill_coef(struct hda_codec *codec)
  13681. {
  13682. int val;
  13683. if ((alc_read_coef_idx(codec, 0) & 0x00ff) < 0x015) {
  13684. alc_write_coef_idx(codec, 0xf, 0x960b);
  13685. alc_write_coef_idx(codec, 0xe, 0x8817);
  13686. }
  13687. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x016) {
  13688. alc_write_coef_idx(codec, 0xf, 0x960b);
  13689. alc_write_coef_idx(codec, 0xe, 0x8814);
  13690. }
  13691. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
  13692. val = alc_read_coef_idx(codec, 0x04);
  13693. /* Power up output pin */
  13694. alc_write_coef_idx(codec, 0x04, val | (1<<11));
  13695. }
  13696. if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
  13697. val = alc_read_coef_idx(codec, 0xd);
  13698. if ((val & 0x0c00) >> 10 != 0x1) {
  13699. /* Capless ramp up clock control */
  13700. alc_write_coef_idx(codec, 0xd, val | 1<<10);
  13701. }
  13702. val = alc_read_coef_idx(codec, 0x17);
  13703. if ((val & 0x01c0) >> 6 != 0x4) {
  13704. /* Class D power on reset */
  13705. alc_write_coef_idx(codec, 0x17, val | 1<<7);
  13706. }
  13707. }
  13708. return 0;
  13709. }
  13710. static int patch_alc269(struct hda_codec *codec)
  13711. {
  13712. struct alc_spec *spec;
  13713. int board_config, coef;
  13714. int err;
  13715. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  13716. if (spec == NULL)
  13717. return -ENOMEM;
  13718. codec->spec = spec;
  13719. alc_auto_parse_customize_define(codec);
  13720. if (codec->vendor_id == 0x10ec0269) {
  13721. coef = alc_read_coef_idx(codec, 0);
  13722. if ((coef & 0x00f0) == 0x0010) {
  13723. if (codec->bus->pci->subsystem_vendor == 0x1025 &&
  13724. spec->cdefine.platform_type == 1) {
  13725. alc_codec_rename(codec, "ALC271X");
  13726. spec->codec_variant = ALC269_TYPE_ALC271X;
  13727. } else if ((coef & 0xf000) == 0x1000) {
  13728. spec->codec_variant = ALC269_TYPE_ALC270;
  13729. } else if ((coef & 0xf000) == 0x2000) {
  13730. alc_codec_rename(codec, "ALC259");
  13731. spec->codec_variant = ALC269_TYPE_ALC259;
  13732. } else if ((coef & 0xf000) == 0x3000) {
  13733. alc_codec_rename(codec, "ALC258");
  13734. spec->codec_variant = ALC269_TYPE_ALC258;
  13735. } else {
  13736. alc_codec_rename(codec, "ALC269VB");
  13737. spec->codec_variant = ALC269_TYPE_ALC269VB;
  13738. }
  13739. } else
  13740. alc_fix_pll_init(codec, 0x20, 0x04, 15);
  13741. alc269_fill_coef(codec);
  13742. }
  13743. board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
  13744. alc269_models,
  13745. alc269_cfg_tbl);
  13746. if (board_config < 0) {
  13747. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  13748. codec->chip_name);
  13749. board_config = ALC269_AUTO;
  13750. }
  13751. if (board_config == ALC269_AUTO) {
  13752. alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups);
  13753. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  13754. }
  13755. if (board_config == ALC269_AUTO) {
  13756. /* automatic parse from the BIOS config */
  13757. err = alc269_parse_auto_config(codec);
  13758. if (err < 0) {
  13759. alc_free(codec);
  13760. return err;
  13761. } else if (!err) {
  13762. printk(KERN_INFO
  13763. "hda_codec: Cannot set up configuration "
  13764. "from BIOS. Using base mode...\n");
  13765. board_config = ALC269_BASIC;
  13766. }
  13767. }
  13768. if (has_cdefine_beep(codec)) {
  13769. err = snd_hda_attach_beep_device(codec, 0x1);
  13770. if (err < 0) {
  13771. alc_free(codec);
  13772. return err;
  13773. }
  13774. }
  13775. if (board_config != ALC269_AUTO)
  13776. setup_preset(codec, &alc269_presets[board_config]);
  13777. if (board_config == ALC269_QUANTA_FL1) {
  13778. /* Due to a hardware problem on Lenovo Ideadpad, we need to
  13779. * fix the sample rate of analog I/O to 44.1kHz
  13780. */
  13781. spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
  13782. spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
  13783. } else if (spec->dual_adc_switch) {
  13784. spec->stream_analog_playback = &alc269_pcm_analog_playback;
  13785. /* switch ADC dynamically */
  13786. spec->stream_analog_capture = &dualmic_pcm_analog_capture;
  13787. } else {
  13788. spec->stream_analog_playback = &alc269_pcm_analog_playback;
  13789. spec->stream_analog_capture = &alc269_pcm_analog_capture;
  13790. }
  13791. spec->stream_digital_playback = &alc269_pcm_digital_playback;
  13792. spec->stream_digital_capture = &alc269_pcm_digital_capture;
  13793. if (!spec->adc_nids) { /* wasn't filled automatically? use default */
  13794. if (spec->codec_variant == ALC269_TYPE_NORMAL) {
  13795. spec->adc_nids = alc269_adc_nids;
  13796. spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
  13797. spec->capsrc_nids = alc269_capsrc_nids;
  13798. } else {
  13799. spec->adc_nids = alc269vb_adc_nids;
  13800. spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
  13801. spec->capsrc_nids = alc269vb_capsrc_nids;
  13802. }
  13803. }
  13804. if (!spec->cap_mixer)
  13805. set_capture_mixer(codec);
  13806. if (has_cdefine_beep(codec))
  13807. set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
  13808. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  13809. spec->vmaster_nid = 0x02;
  13810. codec->patch_ops = alc_patch_ops;
  13811. #ifdef CONFIG_SND_HDA_POWER_SAVE
  13812. codec->patch_ops.suspend = alc269_suspend;
  13813. #endif
  13814. #ifdef SND_HDA_NEEDS_RESUME
  13815. codec->patch_ops.resume = alc269_resume;
  13816. #endif
  13817. if (board_config == ALC269_AUTO)
  13818. spec->init_hook = alc269_auto_init;
  13819. alc_init_jacks(codec);
  13820. #ifdef CONFIG_SND_HDA_POWER_SAVE
  13821. if (!spec->loopback.amplist)
  13822. spec->loopback.amplist = alc269_loopbacks;
  13823. if (alc269_mic2_for_mute_led(codec))
  13824. codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
  13825. #endif
  13826. return 0;
  13827. }
  13828. /*
  13829. * ALC861 channel source setting (2/6 channel selection for 3-stack)
  13830. */
  13831. /*
  13832. * set the path ways for 2 channel output
  13833. * need to set the codec line out and mic 1 pin widgets to inputs
  13834. */
  13835. static struct hda_verb alc861_threestack_ch2_init[] = {
  13836. /* set pin widget 1Ah (line in) for input */
  13837. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  13838. /* set pin widget 18h (mic1/2) for input, for mic also enable
  13839. * the vref
  13840. */
  13841. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  13842. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
  13843. #if 0
  13844. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
  13845. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
  13846. #endif
  13847. { } /* end */
  13848. };
  13849. /*
  13850. * 6ch mode
  13851. * need to set the codec line out and mic 1 pin widgets to outputs
  13852. */
  13853. static struct hda_verb alc861_threestack_ch6_init[] = {
  13854. /* set pin widget 1Ah (line in) for output (Back Surround)*/
  13855. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  13856. /* set pin widget 18h (mic1) for output (CLFE)*/
  13857. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  13858. { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
  13859. { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
  13860. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
  13861. #if 0
  13862. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
  13863. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
  13864. #endif
  13865. { } /* end */
  13866. };
  13867. static struct hda_channel_mode alc861_threestack_modes[2] = {
  13868. { 2, alc861_threestack_ch2_init },
  13869. { 6, alc861_threestack_ch6_init },
  13870. };
  13871. /* Set mic1 as input and unmute the mixer */
  13872. static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
  13873. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  13874. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
  13875. { } /* end */
  13876. };
  13877. /* Set mic1 as output and mute mixer */
  13878. static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
  13879. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  13880. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
  13881. { } /* end */
  13882. };
  13883. static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
  13884. { 2, alc861_uniwill_m31_ch2_init },
  13885. { 4, alc861_uniwill_m31_ch4_init },
  13886. };
  13887. /* Set mic1 and line-in as input and unmute the mixer */
  13888. static struct hda_verb alc861_asus_ch2_init[] = {
  13889. /* set pin widget 1Ah (line in) for input */
  13890. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  13891. /* set pin widget 18h (mic1/2) for input, for mic also enable
  13892. * the vref
  13893. */
  13894. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  13895. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
  13896. #if 0
  13897. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
  13898. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
  13899. #endif
  13900. { } /* end */
  13901. };
  13902. /* Set mic1 nad line-in as output and mute mixer */
  13903. static struct hda_verb alc861_asus_ch6_init[] = {
  13904. /* set pin widget 1Ah (line in) for output (Back Surround)*/
  13905. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  13906. /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
  13907. /* set pin widget 18h (mic1) for output (CLFE)*/
  13908. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  13909. /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
  13910. { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
  13911. { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
  13912. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
  13913. #if 0
  13914. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
  13915. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
  13916. #endif
  13917. { } /* end */
  13918. };
  13919. static struct hda_channel_mode alc861_asus_modes[2] = {
  13920. { 2, alc861_asus_ch2_init },
  13921. { 6, alc861_asus_ch6_init },
  13922. };
  13923. /* patch-ALC861 */
  13924. static struct snd_kcontrol_new alc861_base_mixer[] = {
  13925. /* output mixer control */
  13926. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  13927. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  13928. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  13929. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  13930. HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
  13931. /*Input mixer control */
  13932. /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  13933. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
  13934. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  13935. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  13936. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  13937. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  13938. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  13939. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  13940. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  13941. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
  13942. { } /* end */
  13943. };
  13944. static struct snd_kcontrol_new alc861_3ST_mixer[] = {
  13945. /* output mixer control */
  13946. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  13947. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  13948. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  13949. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  13950. /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
  13951. /* Input mixer control */
  13952. /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  13953. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
  13954. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  13955. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  13956. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  13957. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  13958. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  13959. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  13960. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  13961. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
  13962. {
  13963. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  13964. .name = "Channel Mode",
  13965. .info = alc_ch_mode_info,
  13966. .get = alc_ch_mode_get,
  13967. .put = alc_ch_mode_put,
  13968. .private_value = ARRAY_SIZE(alc861_threestack_modes),
  13969. },
  13970. { } /* end */
  13971. };
  13972. static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
  13973. /* output mixer control */
  13974. HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  13975. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  13976. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  13977. { } /* end */
  13978. };
  13979. static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
  13980. /* output mixer control */
  13981. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  13982. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  13983. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  13984. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  13985. /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
  13986. /* Input mixer control */
  13987. /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  13988. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
  13989. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  13990. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  13991. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  13992. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  13993. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  13994. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  13995. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  13996. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
  13997. {
  13998. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  13999. .name = "Channel Mode",
  14000. .info = alc_ch_mode_info,
  14001. .get = alc_ch_mode_get,
  14002. .put = alc_ch_mode_put,
  14003. .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
  14004. },
  14005. { } /* end */
  14006. };
  14007. static struct snd_kcontrol_new alc861_asus_mixer[] = {
  14008. /* output mixer control */
  14009. HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
  14010. HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
  14011. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
  14012. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
  14013. HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
  14014. /* Input mixer control */
  14015. HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
  14016. HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  14017. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  14018. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  14019. HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
  14020. HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
  14021. HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
  14022. HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
  14023. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
  14024. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
  14025. {
  14026. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  14027. .name = "Channel Mode",
  14028. .info = alc_ch_mode_info,
  14029. .get = alc_ch_mode_get,
  14030. .put = alc_ch_mode_put,
  14031. .private_value = ARRAY_SIZE(alc861_asus_modes),
  14032. },
  14033. { }
  14034. };
  14035. /* additional mixer */
  14036. static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
  14037. HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
  14038. HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
  14039. { }
  14040. };
  14041. /*
  14042. * generic initialization of ADC, input mixers and output mixers
  14043. */
  14044. static struct hda_verb alc861_base_init_verbs[] = {
  14045. /*
  14046. * Unmute ADC0 and set the default input to mic-in
  14047. */
  14048. /* port-A for surround (rear panel) */
  14049. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14050. { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14051. /* port-B for mic-in (rear panel) with vref */
  14052. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14053. /* port-C for line-in (rear panel) */
  14054. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14055. /* port-D for Front */
  14056. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14057. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14058. /* port-E for HP out (front panel) */
  14059. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  14060. /* route front PCM to HP */
  14061. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14062. /* port-F for mic-in (front panel) with vref */
  14063. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14064. /* port-G for CLFE (rear panel) */
  14065. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14066. { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14067. /* port-H for side (rear panel) */
  14068. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14069. { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14070. /* CD-in */
  14071. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14072. /* route front mic to ADC1*/
  14073. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  14074. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14075. /* Unmute DAC0~3 & spdif out*/
  14076. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14077. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14078. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14079. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14080. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14081. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  14082. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14083. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14084. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14085. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14086. /* Unmute Stereo Mixer 15 */
  14087. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14088. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14089. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14090. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  14091. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14092. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14093. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14094. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14095. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14096. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14097. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14098. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14099. /* hp used DAC 3 (Front) */
  14100. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  14101. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14102. { }
  14103. };
  14104. static struct hda_verb alc861_threestack_init_verbs[] = {
  14105. /*
  14106. * Unmute ADC0 and set the default input to mic-in
  14107. */
  14108. /* port-A for surround (rear panel) */
  14109. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14110. /* port-B for mic-in (rear panel) with vref */
  14111. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14112. /* port-C for line-in (rear panel) */
  14113. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14114. /* port-D for Front */
  14115. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14116. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14117. /* port-E for HP out (front panel) */
  14118. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
  14119. /* route front PCM to HP */
  14120. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14121. /* port-F for mic-in (front panel) with vref */
  14122. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14123. /* port-G for CLFE (rear panel) */
  14124. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14125. /* port-H for side (rear panel) */
  14126. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14127. /* CD-in */
  14128. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14129. /* route front mic to ADC1*/
  14130. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  14131. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14132. /* Unmute DAC0~3 & spdif out*/
  14133. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14134. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14135. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14136. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14137. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14138. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  14139. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14140. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14141. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14142. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14143. /* Unmute Stereo Mixer 15 */
  14144. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14145. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14146. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14147. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  14148. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14149. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14150. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14151. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14152. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14153. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14154. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14155. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14156. /* hp used DAC 3 (Front) */
  14157. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  14158. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14159. { }
  14160. };
  14161. static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
  14162. /*
  14163. * Unmute ADC0 and set the default input to mic-in
  14164. */
  14165. /* port-A for surround (rear panel) */
  14166. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14167. /* port-B for mic-in (rear panel) with vref */
  14168. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14169. /* port-C for line-in (rear panel) */
  14170. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14171. /* port-D for Front */
  14172. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14173. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14174. /* port-E for HP out (front panel) */
  14175. /* this has to be set to VREF80 */
  14176. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14177. /* route front PCM to HP */
  14178. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14179. /* port-F for mic-in (front panel) with vref */
  14180. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14181. /* port-G for CLFE (rear panel) */
  14182. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14183. /* port-H for side (rear panel) */
  14184. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14185. /* CD-in */
  14186. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14187. /* route front mic to ADC1*/
  14188. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  14189. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14190. /* Unmute DAC0~3 & spdif out*/
  14191. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14192. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14193. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14194. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14195. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14196. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  14197. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14198. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14199. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14200. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14201. /* Unmute Stereo Mixer 15 */
  14202. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14203. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14204. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14205. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  14206. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14207. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14208. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14209. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14210. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14211. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14212. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14213. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14214. /* hp used DAC 3 (Front) */
  14215. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  14216. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14217. { }
  14218. };
  14219. static struct hda_verb alc861_asus_init_verbs[] = {
  14220. /*
  14221. * Unmute ADC0 and set the default input to mic-in
  14222. */
  14223. /* port-A for surround (rear panel)
  14224. * according to codec#0 this is the HP jack
  14225. */
  14226. { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
  14227. /* route front PCM to HP */
  14228. { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
  14229. /* port-B for mic-in (rear panel) with vref */
  14230. { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14231. /* port-C for line-in (rear panel) */
  14232. { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14233. /* port-D for Front */
  14234. { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14235. { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14236. /* port-E for HP out (front panel) */
  14237. /* this has to be set to VREF80 */
  14238. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14239. /* route front PCM to HP */
  14240. { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
  14241. /* port-F for mic-in (front panel) with vref */
  14242. { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
  14243. /* port-G for CLFE (rear panel) */
  14244. { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14245. /* port-H for side (rear panel) */
  14246. { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
  14247. /* CD-in */
  14248. { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
  14249. /* route front mic to ADC1*/
  14250. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
  14251. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14252. /* Unmute DAC0~3 & spdif out*/
  14253. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14254. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14255. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14256. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14257. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14258. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  14259. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14260. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14261. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14262. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14263. /* Unmute Stereo Mixer 15 */
  14264. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14265. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14266. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14267. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
  14268. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14269. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14270. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14271. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14272. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14273. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14274. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14275. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14276. /* hp used DAC 3 (Front) */
  14277. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
  14278. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14279. { }
  14280. };
  14281. /* additional init verbs for ASUS laptops */
  14282. static struct hda_verb alc861_asus_laptop_init_verbs[] = {
  14283. { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
  14284. { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
  14285. { }
  14286. };
  14287. /*
  14288. * generic initialization of ADC, input mixers and output mixers
  14289. */
  14290. static struct hda_verb alc861_auto_init_verbs[] = {
  14291. /*
  14292. * Unmute ADC0 and set the default input to mic-in
  14293. */
  14294. /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
  14295. {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14296. /* Unmute DAC0~3 & spdif out*/
  14297. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  14298. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  14299. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  14300. {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  14301. {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  14302. /* Unmute Mixer 14 (mic) 1c (Line in)*/
  14303. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14304. {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14305. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14306. {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14307. /* Unmute Stereo Mixer 15 */
  14308. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  14309. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  14310. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  14311. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
  14312. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  14313. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  14314. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  14315. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  14316. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  14317. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  14318. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  14319. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  14320. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  14321. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  14322. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  14323. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  14324. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  14325. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  14326. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  14327. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  14328. {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
  14329. { }
  14330. };
  14331. static struct hda_verb alc861_toshiba_init_verbs[] = {
  14332. {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  14333. { }
  14334. };
  14335. /* toggle speaker-output according to the hp-jack state */
  14336. static void alc861_toshiba_automute(struct hda_codec *codec)
  14337. {
  14338. unsigned int present = snd_hda_jack_detect(codec, 0x0f);
  14339. snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
  14340. HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
  14341. snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
  14342. HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
  14343. }
  14344. static void alc861_toshiba_unsol_event(struct hda_codec *codec,
  14345. unsigned int res)
  14346. {
  14347. if ((res >> 26) == ALC880_HP_EVENT)
  14348. alc861_toshiba_automute(codec);
  14349. }
  14350. /* pcm configuration: identical with ALC880 */
  14351. #define alc861_pcm_analog_playback alc880_pcm_analog_playback
  14352. #define alc861_pcm_analog_capture alc880_pcm_analog_capture
  14353. #define alc861_pcm_digital_playback alc880_pcm_digital_playback
  14354. #define alc861_pcm_digital_capture alc880_pcm_digital_capture
  14355. #define ALC861_DIGOUT_NID 0x07
  14356. static struct hda_channel_mode alc861_8ch_modes[1] = {
  14357. { 8, NULL }
  14358. };
  14359. static hda_nid_t alc861_dac_nids[4] = {
  14360. /* front, surround, clfe, side */
  14361. 0x03, 0x06, 0x05, 0x04
  14362. };
  14363. static hda_nid_t alc660_dac_nids[3] = {
  14364. /* front, clfe, surround */
  14365. 0x03, 0x05, 0x06
  14366. };
  14367. static hda_nid_t alc861_adc_nids[1] = {
  14368. /* ADC0-2 */
  14369. 0x08,
  14370. };
  14371. static struct hda_input_mux alc861_capture_source = {
  14372. .num_items = 5,
  14373. .items = {
  14374. { "Mic", 0x0 },
  14375. { "Front Mic", 0x3 },
  14376. { "Line", 0x1 },
  14377. { "CD", 0x4 },
  14378. { "Mixer", 0x5 },
  14379. },
  14380. };
  14381. static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
  14382. {
  14383. struct alc_spec *spec = codec->spec;
  14384. hda_nid_t mix, srcs[5];
  14385. int i, j, num;
  14386. if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
  14387. return 0;
  14388. num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
  14389. if (num < 0)
  14390. return 0;
  14391. for (i = 0; i < num; i++) {
  14392. unsigned int type;
  14393. type = get_wcaps_type(get_wcaps(codec, srcs[i]));
  14394. if (type != AC_WID_AUD_OUT)
  14395. continue;
  14396. for (j = 0; j < spec->multiout.num_dacs; j++)
  14397. if (spec->multiout.dac_nids[j] == srcs[i])
  14398. break;
  14399. if (j >= spec->multiout.num_dacs)
  14400. return srcs[i];
  14401. }
  14402. return 0;
  14403. }
  14404. /* fill in the dac_nids table from the parsed pin configuration */
  14405. static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
  14406. const struct auto_pin_cfg *cfg)
  14407. {
  14408. struct alc_spec *spec = codec->spec;
  14409. int i;
  14410. hda_nid_t nid, dac;
  14411. spec->multiout.dac_nids = spec->private_dac_nids;
  14412. for (i = 0; i < cfg->line_outs; i++) {
  14413. nid = cfg->line_out_pins[i];
  14414. dac = alc861_look_for_dac(codec, nid);
  14415. if (!dac)
  14416. continue;
  14417. spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
  14418. }
  14419. return 0;
  14420. }
  14421. static int __alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
  14422. hda_nid_t nid, int idx, unsigned int chs)
  14423. {
  14424. return __add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx, idx,
  14425. HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
  14426. }
  14427. #define alc861_create_out_sw(codec, pfx, nid, chs) \
  14428. __alc861_create_out_sw(codec, pfx, nid, 0, chs)
  14429. /* add playback controls from the parsed DAC table */
  14430. static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
  14431. const struct auto_pin_cfg *cfg)
  14432. {
  14433. struct alc_spec *spec = codec->spec;
  14434. static const char * const chname[4] = {
  14435. "Front", "Surround", NULL /*CLFE*/, "Side"
  14436. };
  14437. const char *pfx = alc_get_line_out_pfx(cfg, true);
  14438. hda_nid_t nid;
  14439. int i, err;
  14440. for (i = 0; i < cfg->line_outs; i++) {
  14441. nid = spec->multiout.dac_nids[i];
  14442. if (!nid)
  14443. continue;
  14444. if (!pfx && i == 2) {
  14445. /* Center/LFE */
  14446. err = alc861_create_out_sw(codec, "Center", nid, 1);
  14447. if (err < 0)
  14448. return err;
  14449. err = alc861_create_out_sw(codec, "LFE", nid, 2);
  14450. if (err < 0)
  14451. return err;
  14452. } else {
  14453. const char *name = pfx;
  14454. int index = i;
  14455. if (!name) {
  14456. name = chname[i];
  14457. index = 0;
  14458. }
  14459. err = __alc861_create_out_sw(codec, name, nid, index, 3);
  14460. if (err < 0)
  14461. return err;
  14462. }
  14463. }
  14464. return 0;
  14465. }
  14466. static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
  14467. {
  14468. struct alc_spec *spec = codec->spec;
  14469. int err;
  14470. hda_nid_t nid;
  14471. if (!pin)
  14472. return 0;
  14473. if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
  14474. nid = alc861_look_for_dac(codec, pin);
  14475. if (nid) {
  14476. err = alc861_create_out_sw(codec, "Headphone", nid, 3);
  14477. if (err < 0)
  14478. return err;
  14479. spec->multiout.hp_nid = nid;
  14480. }
  14481. }
  14482. return 0;
  14483. }
  14484. /* create playback/capture controls for input pins */
  14485. static int alc861_auto_create_input_ctls(struct hda_codec *codec,
  14486. const struct auto_pin_cfg *cfg)
  14487. {
  14488. return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
  14489. }
  14490. static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
  14491. hda_nid_t nid,
  14492. int pin_type, hda_nid_t dac)
  14493. {
  14494. hda_nid_t mix, srcs[5];
  14495. int i, num;
  14496. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
  14497. pin_type);
  14498. snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
  14499. AMP_OUT_UNMUTE);
  14500. if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
  14501. return;
  14502. num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
  14503. if (num < 0)
  14504. return;
  14505. for (i = 0; i < num; i++) {
  14506. unsigned int mute;
  14507. if (srcs[i] == dac || srcs[i] == 0x15)
  14508. mute = AMP_IN_UNMUTE(i);
  14509. else
  14510. mute = AMP_IN_MUTE(i);
  14511. snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
  14512. mute);
  14513. }
  14514. }
  14515. static void alc861_auto_init_multi_out(struct hda_codec *codec)
  14516. {
  14517. struct alc_spec *spec = codec->spec;
  14518. int i;
  14519. for (i = 0; i < spec->autocfg.line_outs; i++) {
  14520. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  14521. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  14522. if (nid)
  14523. alc861_auto_set_output_and_unmute(codec, nid, pin_type,
  14524. spec->multiout.dac_nids[i]);
  14525. }
  14526. }
  14527. static void alc861_auto_init_hp_out(struct hda_codec *codec)
  14528. {
  14529. struct alc_spec *spec = codec->spec;
  14530. if (spec->autocfg.hp_outs)
  14531. alc861_auto_set_output_and_unmute(codec,
  14532. spec->autocfg.hp_pins[0],
  14533. PIN_HP,
  14534. spec->multiout.hp_nid);
  14535. if (spec->autocfg.speaker_outs)
  14536. alc861_auto_set_output_and_unmute(codec,
  14537. spec->autocfg.speaker_pins[0],
  14538. PIN_OUT,
  14539. spec->multiout.dac_nids[0]);
  14540. }
  14541. static void alc861_auto_init_analog_input(struct hda_codec *codec)
  14542. {
  14543. struct alc_spec *spec = codec->spec;
  14544. struct auto_pin_cfg *cfg = &spec->autocfg;
  14545. int i;
  14546. for (i = 0; i < cfg->num_inputs; i++) {
  14547. hda_nid_t nid = cfg->inputs[i].pin;
  14548. if (nid >= 0x0c && nid <= 0x11)
  14549. alc_set_input_pin(codec, nid, cfg->inputs[i].type);
  14550. }
  14551. }
  14552. /* parse the BIOS configuration and set up the alc_spec */
  14553. /* return 1 if successful, 0 if the proper config is not found,
  14554. * or a negative error code
  14555. */
  14556. static int alc861_parse_auto_config(struct hda_codec *codec)
  14557. {
  14558. struct alc_spec *spec = codec->spec;
  14559. int err;
  14560. static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
  14561. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  14562. alc861_ignore);
  14563. if (err < 0)
  14564. return err;
  14565. if (!spec->autocfg.line_outs)
  14566. return 0; /* can't find valid BIOS pin config */
  14567. err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
  14568. if (err < 0)
  14569. return err;
  14570. err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
  14571. if (err < 0)
  14572. return err;
  14573. err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
  14574. if (err < 0)
  14575. return err;
  14576. err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
  14577. if (err < 0)
  14578. return err;
  14579. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  14580. alc_auto_parse_digital(codec);
  14581. if (spec->kctls.list)
  14582. add_mixer(spec, spec->kctls.list);
  14583. add_verb(spec, alc861_auto_init_verbs);
  14584. spec->num_mux_defs = 1;
  14585. spec->input_mux = &spec->private_imux[0];
  14586. spec->adc_nids = alc861_adc_nids;
  14587. spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
  14588. set_capture_mixer(codec);
  14589. alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
  14590. return 1;
  14591. }
  14592. /* additional initialization for auto-configuration model */
  14593. static void alc861_auto_init(struct hda_codec *codec)
  14594. {
  14595. struct alc_spec *spec = codec->spec;
  14596. alc861_auto_init_multi_out(codec);
  14597. alc861_auto_init_hp_out(codec);
  14598. alc861_auto_init_analog_input(codec);
  14599. alc_auto_init_digital(codec);
  14600. if (spec->unsol_event)
  14601. alc_inithook(codec);
  14602. }
  14603. #ifdef CONFIG_SND_HDA_POWER_SAVE
  14604. static struct hda_amp_list alc861_loopbacks[] = {
  14605. { 0x15, HDA_INPUT, 0 },
  14606. { 0x15, HDA_INPUT, 1 },
  14607. { 0x15, HDA_INPUT, 2 },
  14608. { 0x15, HDA_INPUT, 3 },
  14609. { } /* end */
  14610. };
  14611. #endif
  14612. /*
  14613. * configuration and preset
  14614. */
  14615. static const char * const alc861_models[ALC861_MODEL_LAST] = {
  14616. [ALC861_3ST] = "3stack",
  14617. [ALC660_3ST] = "3stack-660",
  14618. [ALC861_3ST_DIG] = "3stack-dig",
  14619. [ALC861_6ST_DIG] = "6stack-dig",
  14620. [ALC861_UNIWILL_M31] = "uniwill-m31",
  14621. [ALC861_TOSHIBA] = "toshiba",
  14622. [ALC861_ASUS] = "asus",
  14623. [ALC861_ASUS_LAPTOP] = "asus-laptop",
  14624. [ALC861_AUTO] = "auto",
  14625. };
  14626. static struct snd_pci_quirk alc861_cfg_tbl[] = {
  14627. SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
  14628. SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
  14629. SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
  14630. SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
  14631. SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
  14632. SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
  14633. SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
  14634. /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
  14635. * Any other models that need this preset?
  14636. */
  14637. /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
  14638. SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
  14639. SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
  14640. SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
  14641. SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
  14642. SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
  14643. /* FIXME: the below seems conflict */
  14644. /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
  14645. SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
  14646. SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
  14647. {}
  14648. };
  14649. static struct alc_config_preset alc861_presets[] = {
  14650. [ALC861_3ST] = {
  14651. .mixers = { alc861_3ST_mixer },
  14652. .init_verbs = { alc861_threestack_init_verbs },
  14653. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14654. .dac_nids = alc861_dac_nids,
  14655. .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
  14656. .channel_mode = alc861_threestack_modes,
  14657. .need_dac_fix = 1,
  14658. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14659. .adc_nids = alc861_adc_nids,
  14660. .input_mux = &alc861_capture_source,
  14661. },
  14662. [ALC861_3ST_DIG] = {
  14663. .mixers = { alc861_base_mixer },
  14664. .init_verbs = { alc861_threestack_init_verbs },
  14665. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14666. .dac_nids = alc861_dac_nids,
  14667. .dig_out_nid = ALC861_DIGOUT_NID,
  14668. .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
  14669. .channel_mode = alc861_threestack_modes,
  14670. .need_dac_fix = 1,
  14671. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14672. .adc_nids = alc861_adc_nids,
  14673. .input_mux = &alc861_capture_source,
  14674. },
  14675. [ALC861_6ST_DIG] = {
  14676. .mixers = { alc861_base_mixer },
  14677. .init_verbs = { alc861_base_init_verbs },
  14678. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14679. .dac_nids = alc861_dac_nids,
  14680. .dig_out_nid = ALC861_DIGOUT_NID,
  14681. .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
  14682. .channel_mode = alc861_8ch_modes,
  14683. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14684. .adc_nids = alc861_adc_nids,
  14685. .input_mux = &alc861_capture_source,
  14686. },
  14687. [ALC660_3ST] = {
  14688. .mixers = { alc861_3ST_mixer },
  14689. .init_verbs = { alc861_threestack_init_verbs },
  14690. .num_dacs = ARRAY_SIZE(alc660_dac_nids),
  14691. .dac_nids = alc660_dac_nids,
  14692. .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
  14693. .channel_mode = alc861_threestack_modes,
  14694. .need_dac_fix = 1,
  14695. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14696. .adc_nids = alc861_adc_nids,
  14697. .input_mux = &alc861_capture_source,
  14698. },
  14699. [ALC861_UNIWILL_M31] = {
  14700. .mixers = { alc861_uniwill_m31_mixer },
  14701. .init_verbs = { alc861_uniwill_m31_init_verbs },
  14702. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14703. .dac_nids = alc861_dac_nids,
  14704. .dig_out_nid = ALC861_DIGOUT_NID,
  14705. .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
  14706. .channel_mode = alc861_uniwill_m31_modes,
  14707. .need_dac_fix = 1,
  14708. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14709. .adc_nids = alc861_adc_nids,
  14710. .input_mux = &alc861_capture_source,
  14711. },
  14712. [ALC861_TOSHIBA] = {
  14713. .mixers = { alc861_toshiba_mixer },
  14714. .init_verbs = { alc861_base_init_verbs,
  14715. alc861_toshiba_init_verbs },
  14716. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14717. .dac_nids = alc861_dac_nids,
  14718. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  14719. .channel_mode = alc883_3ST_2ch_modes,
  14720. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14721. .adc_nids = alc861_adc_nids,
  14722. .input_mux = &alc861_capture_source,
  14723. .unsol_event = alc861_toshiba_unsol_event,
  14724. .init_hook = alc861_toshiba_automute,
  14725. },
  14726. [ALC861_ASUS] = {
  14727. .mixers = { alc861_asus_mixer },
  14728. .init_verbs = { alc861_asus_init_verbs },
  14729. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14730. .dac_nids = alc861_dac_nids,
  14731. .dig_out_nid = ALC861_DIGOUT_NID,
  14732. .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
  14733. .channel_mode = alc861_asus_modes,
  14734. .need_dac_fix = 1,
  14735. .hp_nid = 0x06,
  14736. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14737. .adc_nids = alc861_adc_nids,
  14738. .input_mux = &alc861_capture_source,
  14739. },
  14740. [ALC861_ASUS_LAPTOP] = {
  14741. .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
  14742. .init_verbs = { alc861_asus_init_verbs,
  14743. alc861_asus_laptop_init_verbs },
  14744. .num_dacs = ARRAY_SIZE(alc861_dac_nids),
  14745. .dac_nids = alc861_dac_nids,
  14746. .dig_out_nid = ALC861_DIGOUT_NID,
  14747. .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
  14748. .channel_mode = alc883_3ST_2ch_modes,
  14749. .need_dac_fix = 1,
  14750. .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
  14751. .adc_nids = alc861_adc_nids,
  14752. .input_mux = &alc861_capture_source,
  14753. },
  14754. };
  14755. /* Pin config fixes */
  14756. enum {
  14757. PINFIX_FSC_AMILO_PI1505,
  14758. };
  14759. static const struct alc_fixup alc861_fixups[] = {
  14760. [PINFIX_FSC_AMILO_PI1505] = {
  14761. .type = ALC_FIXUP_PINS,
  14762. .v.pins = (const struct alc_pincfg[]) {
  14763. { 0x0b, 0x0221101f }, /* HP */
  14764. { 0x0f, 0x90170310 }, /* speaker */
  14765. { }
  14766. }
  14767. },
  14768. };
  14769. static struct snd_pci_quirk alc861_fixup_tbl[] = {
  14770. SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
  14771. {}
  14772. };
  14773. static int patch_alc861(struct hda_codec *codec)
  14774. {
  14775. struct alc_spec *spec;
  14776. int board_config;
  14777. int err;
  14778. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  14779. if (spec == NULL)
  14780. return -ENOMEM;
  14781. codec->spec = spec;
  14782. board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
  14783. alc861_models,
  14784. alc861_cfg_tbl);
  14785. if (board_config < 0) {
  14786. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  14787. codec->chip_name);
  14788. board_config = ALC861_AUTO;
  14789. }
  14790. if (board_config == ALC861_AUTO) {
  14791. alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
  14792. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  14793. }
  14794. if (board_config == ALC861_AUTO) {
  14795. /* automatic parse from the BIOS config */
  14796. err = alc861_parse_auto_config(codec);
  14797. if (err < 0) {
  14798. alc_free(codec);
  14799. return err;
  14800. } else if (!err) {
  14801. printk(KERN_INFO
  14802. "hda_codec: Cannot set up configuration "
  14803. "from BIOS. Using base mode...\n");
  14804. board_config = ALC861_3ST_DIG;
  14805. }
  14806. }
  14807. err = snd_hda_attach_beep_device(codec, 0x23);
  14808. if (err < 0) {
  14809. alc_free(codec);
  14810. return err;
  14811. }
  14812. if (board_config != ALC861_AUTO)
  14813. setup_preset(codec, &alc861_presets[board_config]);
  14814. spec->stream_analog_playback = &alc861_pcm_analog_playback;
  14815. spec->stream_analog_capture = &alc861_pcm_analog_capture;
  14816. spec->stream_digital_playback = &alc861_pcm_digital_playback;
  14817. spec->stream_digital_capture = &alc861_pcm_digital_capture;
  14818. if (!spec->cap_mixer)
  14819. set_capture_mixer(codec);
  14820. set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
  14821. spec->vmaster_nid = 0x03;
  14822. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  14823. codec->patch_ops = alc_patch_ops;
  14824. if (board_config == ALC861_AUTO) {
  14825. spec->init_hook = alc861_auto_init;
  14826. #ifdef CONFIG_SND_HDA_POWER_SAVE
  14827. spec->power_hook = alc_power_eapd;
  14828. #endif
  14829. }
  14830. #ifdef CONFIG_SND_HDA_POWER_SAVE
  14831. if (!spec->loopback.amplist)
  14832. spec->loopback.amplist = alc861_loopbacks;
  14833. #endif
  14834. return 0;
  14835. }
  14836. /*
  14837. * ALC861-VD support
  14838. *
  14839. * Based on ALC882
  14840. *
  14841. * In addition, an independent DAC
  14842. */
  14843. #define ALC861VD_DIGOUT_NID 0x06
  14844. static hda_nid_t alc861vd_dac_nids[4] = {
  14845. /* front, surr, clfe, side surr */
  14846. 0x02, 0x03, 0x04, 0x05
  14847. };
  14848. /* dac_nids for ALC660vd are in a different order - according to
  14849. * Realtek's driver.
  14850. * This should probably result in a different mixer for 6stack models
  14851. * of ALC660vd codecs, but for now there is only 3stack mixer
  14852. * - and it is the same as in 861vd.
  14853. * adc_nids in ALC660vd are (is) the same as in 861vd
  14854. */
  14855. static hda_nid_t alc660vd_dac_nids[3] = {
  14856. /* front, rear, clfe, rear_surr */
  14857. 0x02, 0x04, 0x03
  14858. };
  14859. static hda_nid_t alc861vd_adc_nids[1] = {
  14860. /* ADC0 */
  14861. 0x09,
  14862. };
  14863. static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
  14864. /* input MUX */
  14865. /* FIXME: should be a matrix-type input source selection */
  14866. static struct hda_input_mux alc861vd_capture_source = {
  14867. .num_items = 4,
  14868. .items = {
  14869. { "Mic", 0x0 },
  14870. { "Front Mic", 0x1 },
  14871. { "Line", 0x2 },
  14872. { "CD", 0x4 },
  14873. },
  14874. };
  14875. static struct hda_input_mux alc861vd_dallas_capture_source = {
  14876. .num_items = 2,
  14877. .items = {
  14878. { "Mic", 0x0 },
  14879. { "Internal Mic", 0x1 },
  14880. },
  14881. };
  14882. static struct hda_input_mux alc861vd_hp_capture_source = {
  14883. .num_items = 2,
  14884. .items = {
  14885. { "Front Mic", 0x0 },
  14886. { "ATAPI Mic", 0x1 },
  14887. },
  14888. };
  14889. /*
  14890. * 2ch mode
  14891. */
  14892. static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
  14893. { 2, NULL }
  14894. };
  14895. /*
  14896. * 6ch mode
  14897. */
  14898. static struct hda_verb alc861vd_6stack_ch6_init[] = {
  14899. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  14900. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14901. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14902. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14903. { } /* end */
  14904. };
  14905. /*
  14906. * 8ch mode
  14907. */
  14908. static struct hda_verb alc861vd_6stack_ch8_init[] = {
  14909. { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14910. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14911. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14912. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  14913. { } /* end */
  14914. };
  14915. static struct hda_channel_mode alc861vd_6stack_modes[2] = {
  14916. { 6, alc861vd_6stack_ch6_init },
  14917. { 8, alc861vd_6stack_ch8_init },
  14918. };
  14919. static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
  14920. {
  14921. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  14922. .name = "Channel Mode",
  14923. .info = alc_ch_mode_info,
  14924. .get = alc_ch_mode_get,
  14925. .put = alc_ch_mode_put,
  14926. },
  14927. { } /* end */
  14928. };
  14929. /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
  14930. * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
  14931. */
  14932. static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
  14933. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  14934. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  14935. HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  14936. HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
  14937. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
  14938. HDA_OUTPUT),
  14939. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
  14940. HDA_OUTPUT),
  14941. HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
  14942. HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
  14943. HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
  14944. HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
  14945. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  14946. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  14947. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  14948. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  14949. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  14950. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  14951. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  14952. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  14953. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  14954. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  14955. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  14956. { } /* end */
  14957. };
  14958. static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
  14959. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  14960. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  14961. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  14962. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  14963. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  14964. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  14965. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  14966. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  14967. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  14968. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  14969. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  14970. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  14971. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  14972. { } /* end */
  14973. };
  14974. static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
  14975. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  14976. /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
  14977. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  14978. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  14979. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  14980. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  14981. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  14982. HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
  14983. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  14984. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  14985. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  14986. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  14987. { } /* end */
  14988. };
  14989. /* Pin assignment: Speaker=0x14, HP = 0x15,
  14990. * Mic=0x18, Internal Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
  14991. */
  14992. static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
  14993. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  14994. HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
  14995. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  14996. HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
  14997. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  14998. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  14999. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15000. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  15001. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15002. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15003. { } /* end */
  15004. };
  15005. /* Pin assignment: Speaker=0x14, Line-out = 0x15,
  15006. * Front Mic=0x18, ATAPI Mic = 0x19,
  15007. */
  15008. static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
  15009. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15010. HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
  15011. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  15012. HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
  15013. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15014. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15015. HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15016. HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15017. { } /* end */
  15018. };
  15019. /*
  15020. * generic initialization of ADC, input mixers and output mixers
  15021. */
  15022. static struct hda_verb alc861vd_volume_init_verbs[] = {
  15023. /*
  15024. * Unmute ADC0 and set the default input to mic-in
  15025. */
  15026. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  15027. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  15028. /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
  15029. * the analog-loopback mixer widget
  15030. */
  15031. /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
  15032. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15033. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15034. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  15035. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  15036. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  15037. /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
  15038. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  15039. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  15040. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
  15041. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
  15042. /*
  15043. * Set up output mixers (0x02 - 0x05)
  15044. */
  15045. /* set vol=0 to output mixers */
  15046. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15047. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15048. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15049. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15050. /* set up input amps for analog loopback */
  15051. /* Amp Indices: DAC = 0, mixer = 1 */
  15052. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15053. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15054. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15055. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15056. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15057. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15058. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15059. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15060. { }
  15061. };
  15062. /*
  15063. * 3-stack pin configuration:
  15064. * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
  15065. */
  15066. static struct hda_verb alc861vd_3stack_init_verbs[] = {
  15067. /*
  15068. * Set pin mode and muting
  15069. */
  15070. /* set front pin widgets 0x14 for output */
  15071. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15072. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15073. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  15074. /* Mic (rear) pin: input vref at 80% */
  15075. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  15076. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15077. /* Front Mic pin: input vref at 80% */
  15078. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  15079. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15080. /* Line In pin: input */
  15081. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15082. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15083. /* Line-2 In: Headphone output (output 0 - 0x0c) */
  15084. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  15085. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15086. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  15087. /* CD pin widget for input */
  15088. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15089. { }
  15090. };
  15091. /*
  15092. * 6-stack pin configuration:
  15093. */
  15094. static struct hda_verb alc861vd_6stack_init_verbs[] = {
  15095. /*
  15096. * Set pin mode and muting
  15097. */
  15098. /* set front pin widgets 0x14 for output */
  15099. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15100. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15101. {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
  15102. /* Rear Pin: output 1 (0x0d) */
  15103. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15104. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15105. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  15106. /* CLFE Pin: output 2 (0x0e) */
  15107. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15108. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15109. {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
  15110. /* Side Pin: output 3 (0x0f) */
  15111. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15112. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15113. {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
  15114. /* Mic (rear) pin: input vref at 80% */
  15115. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  15116. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15117. /* Front Mic pin: input vref at 80% */
  15118. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  15119. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15120. /* Line In pin: input */
  15121. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15122. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15123. /* Line-2 In: Headphone output (output 0 - 0x0c) */
  15124. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  15125. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15126. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  15127. /* CD pin widget for input */
  15128. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15129. { }
  15130. };
  15131. static struct hda_verb alc861vd_eapd_verbs[] = {
  15132. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  15133. { }
  15134. };
  15135. static struct hda_verb alc660vd_eapd_verbs[] = {
  15136. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  15137. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  15138. { }
  15139. };
  15140. static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
  15141. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  15142. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  15143. {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
  15144. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  15145. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  15146. {}
  15147. };
  15148. static void alc861vd_lenovo_setup(struct hda_codec *codec)
  15149. {
  15150. struct alc_spec *spec = codec->spec;
  15151. spec->autocfg.hp_pins[0] = 0x1b;
  15152. spec->autocfg.speaker_pins[0] = 0x14;
  15153. }
  15154. static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
  15155. {
  15156. alc_automute_amp(codec);
  15157. alc88x_simple_mic_automute(codec);
  15158. }
  15159. static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
  15160. unsigned int res)
  15161. {
  15162. switch (res >> 26) {
  15163. case ALC880_MIC_EVENT:
  15164. alc88x_simple_mic_automute(codec);
  15165. break;
  15166. default:
  15167. alc_automute_amp_unsol_event(codec, res);
  15168. break;
  15169. }
  15170. }
  15171. static struct hda_verb alc861vd_dallas_verbs[] = {
  15172. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15173. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15174. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15175. {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
  15176. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  15177. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  15178. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15179. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15180. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15181. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15182. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15183. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
  15184. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15185. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15186. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15187. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15188. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15189. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15190. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  15191. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  15192. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  15193. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15194. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
  15195. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  15196. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15197. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15198. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15199. {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  15200. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  15201. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
  15202. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
  15203. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
  15204. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  15205. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  15206. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  15207. { } /* end */
  15208. };
  15209. /* toggle speaker-output according to the hp-jack state */
  15210. static void alc861vd_dallas_setup(struct hda_codec *codec)
  15211. {
  15212. struct alc_spec *spec = codec->spec;
  15213. spec->autocfg.hp_pins[0] = 0x15;
  15214. spec->autocfg.speaker_pins[0] = 0x14;
  15215. }
  15216. #ifdef CONFIG_SND_HDA_POWER_SAVE
  15217. #define alc861vd_loopbacks alc880_loopbacks
  15218. #endif
  15219. /* pcm configuration: identical with ALC880 */
  15220. #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
  15221. #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
  15222. #define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
  15223. #define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
  15224. /*
  15225. * configuration and preset
  15226. */
  15227. static const char * const alc861vd_models[ALC861VD_MODEL_LAST] = {
  15228. [ALC660VD_3ST] = "3stack-660",
  15229. [ALC660VD_3ST_DIG] = "3stack-660-digout",
  15230. [ALC660VD_ASUS_V1S] = "asus-v1s",
  15231. [ALC861VD_3ST] = "3stack",
  15232. [ALC861VD_3ST_DIG] = "3stack-digout",
  15233. [ALC861VD_6ST_DIG] = "6stack-digout",
  15234. [ALC861VD_LENOVO] = "lenovo",
  15235. [ALC861VD_DALLAS] = "dallas",
  15236. [ALC861VD_HP] = "hp",
  15237. [ALC861VD_AUTO] = "auto",
  15238. };
  15239. static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
  15240. SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
  15241. SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
  15242. SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
  15243. /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
  15244. SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
  15245. SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
  15246. SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
  15247. SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
  15248. /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
  15249. SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
  15250. SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
  15251. SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
  15252. SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
  15253. SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
  15254. SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
  15255. {}
  15256. };
  15257. static struct alc_config_preset alc861vd_presets[] = {
  15258. [ALC660VD_3ST] = {
  15259. .mixers = { alc861vd_3st_mixer },
  15260. .init_verbs = { alc861vd_volume_init_verbs,
  15261. alc861vd_3stack_init_verbs },
  15262. .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
  15263. .dac_nids = alc660vd_dac_nids,
  15264. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15265. .channel_mode = alc861vd_3stack_2ch_modes,
  15266. .input_mux = &alc861vd_capture_source,
  15267. },
  15268. [ALC660VD_3ST_DIG] = {
  15269. .mixers = { alc861vd_3st_mixer },
  15270. .init_verbs = { alc861vd_volume_init_verbs,
  15271. alc861vd_3stack_init_verbs },
  15272. .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
  15273. .dac_nids = alc660vd_dac_nids,
  15274. .dig_out_nid = ALC861VD_DIGOUT_NID,
  15275. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15276. .channel_mode = alc861vd_3stack_2ch_modes,
  15277. .input_mux = &alc861vd_capture_source,
  15278. },
  15279. [ALC861VD_3ST] = {
  15280. .mixers = { alc861vd_3st_mixer },
  15281. .init_verbs = { alc861vd_volume_init_verbs,
  15282. alc861vd_3stack_init_verbs },
  15283. .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
  15284. .dac_nids = alc861vd_dac_nids,
  15285. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15286. .channel_mode = alc861vd_3stack_2ch_modes,
  15287. .input_mux = &alc861vd_capture_source,
  15288. },
  15289. [ALC861VD_3ST_DIG] = {
  15290. .mixers = { alc861vd_3st_mixer },
  15291. .init_verbs = { alc861vd_volume_init_verbs,
  15292. alc861vd_3stack_init_verbs },
  15293. .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
  15294. .dac_nids = alc861vd_dac_nids,
  15295. .dig_out_nid = ALC861VD_DIGOUT_NID,
  15296. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15297. .channel_mode = alc861vd_3stack_2ch_modes,
  15298. .input_mux = &alc861vd_capture_source,
  15299. },
  15300. [ALC861VD_6ST_DIG] = {
  15301. .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
  15302. .init_verbs = { alc861vd_volume_init_verbs,
  15303. alc861vd_6stack_init_verbs },
  15304. .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
  15305. .dac_nids = alc861vd_dac_nids,
  15306. .dig_out_nid = ALC861VD_DIGOUT_NID,
  15307. .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
  15308. .channel_mode = alc861vd_6stack_modes,
  15309. .input_mux = &alc861vd_capture_source,
  15310. },
  15311. [ALC861VD_LENOVO] = {
  15312. .mixers = { alc861vd_lenovo_mixer },
  15313. .init_verbs = { alc861vd_volume_init_verbs,
  15314. alc861vd_3stack_init_verbs,
  15315. alc861vd_eapd_verbs,
  15316. alc861vd_lenovo_unsol_verbs },
  15317. .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
  15318. .dac_nids = alc660vd_dac_nids,
  15319. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15320. .channel_mode = alc861vd_3stack_2ch_modes,
  15321. .input_mux = &alc861vd_capture_source,
  15322. .unsol_event = alc861vd_lenovo_unsol_event,
  15323. .setup = alc861vd_lenovo_setup,
  15324. .init_hook = alc861vd_lenovo_init_hook,
  15325. },
  15326. [ALC861VD_DALLAS] = {
  15327. .mixers = { alc861vd_dallas_mixer },
  15328. .init_verbs = { alc861vd_dallas_verbs },
  15329. .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
  15330. .dac_nids = alc861vd_dac_nids,
  15331. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15332. .channel_mode = alc861vd_3stack_2ch_modes,
  15333. .input_mux = &alc861vd_dallas_capture_source,
  15334. .unsol_event = alc_automute_amp_unsol_event,
  15335. .setup = alc861vd_dallas_setup,
  15336. .init_hook = alc_automute_amp,
  15337. },
  15338. [ALC861VD_HP] = {
  15339. .mixers = { alc861vd_hp_mixer },
  15340. .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
  15341. .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
  15342. .dac_nids = alc861vd_dac_nids,
  15343. .dig_out_nid = ALC861VD_DIGOUT_NID,
  15344. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15345. .channel_mode = alc861vd_3stack_2ch_modes,
  15346. .input_mux = &alc861vd_hp_capture_source,
  15347. .unsol_event = alc_automute_amp_unsol_event,
  15348. .setup = alc861vd_dallas_setup,
  15349. .init_hook = alc_automute_amp,
  15350. },
  15351. [ALC660VD_ASUS_V1S] = {
  15352. .mixers = { alc861vd_lenovo_mixer },
  15353. .init_verbs = { alc861vd_volume_init_verbs,
  15354. alc861vd_3stack_init_verbs,
  15355. alc861vd_eapd_verbs,
  15356. alc861vd_lenovo_unsol_verbs },
  15357. .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
  15358. .dac_nids = alc660vd_dac_nids,
  15359. .dig_out_nid = ALC861VD_DIGOUT_NID,
  15360. .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
  15361. .channel_mode = alc861vd_3stack_2ch_modes,
  15362. .input_mux = &alc861vd_capture_source,
  15363. .unsol_event = alc861vd_lenovo_unsol_event,
  15364. .setup = alc861vd_lenovo_setup,
  15365. .init_hook = alc861vd_lenovo_init_hook,
  15366. },
  15367. };
  15368. /*
  15369. * BIOS auto configuration
  15370. */
  15371. static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
  15372. const struct auto_pin_cfg *cfg)
  15373. {
  15374. return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x22, 0);
  15375. }
  15376. static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
  15377. hda_nid_t nid, int pin_type, int dac_idx)
  15378. {
  15379. alc_set_pin_output(codec, nid, pin_type);
  15380. }
  15381. static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
  15382. {
  15383. struct alc_spec *spec = codec->spec;
  15384. int i;
  15385. for (i = 0; i <= HDA_SIDE; i++) {
  15386. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  15387. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  15388. if (nid)
  15389. alc861vd_auto_set_output_and_unmute(codec, nid,
  15390. pin_type, i);
  15391. }
  15392. }
  15393. static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
  15394. {
  15395. struct alc_spec *spec = codec->spec;
  15396. hda_nid_t pin;
  15397. pin = spec->autocfg.hp_pins[0];
  15398. if (pin) /* connect to front and use dac 0 */
  15399. alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
  15400. pin = spec->autocfg.speaker_pins[0];
  15401. if (pin)
  15402. alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
  15403. }
  15404. #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
  15405. static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
  15406. {
  15407. struct alc_spec *spec = codec->spec;
  15408. struct auto_pin_cfg *cfg = &spec->autocfg;
  15409. int i;
  15410. for (i = 0; i < cfg->num_inputs; i++) {
  15411. hda_nid_t nid = cfg->inputs[i].pin;
  15412. if (alc_is_input_pin(codec, nid)) {
  15413. alc_set_input_pin(codec, nid, cfg->inputs[i].type);
  15414. if (nid != ALC861VD_PIN_CD_NID &&
  15415. (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
  15416. snd_hda_codec_write(codec, nid, 0,
  15417. AC_VERB_SET_AMP_GAIN_MUTE,
  15418. AMP_OUT_MUTE);
  15419. }
  15420. }
  15421. }
  15422. #define alc861vd_auto_init_input_src alc882_auto_init_input_src
  15423. #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
  15424. #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
  15425. /* add playback controls from the parsed DAC table */
  15426. /* Based on ALC880 version. But ALC861VD has separate,
  15427. * different NIDs for mute/unmute switch and volume control */
  15428. static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
  15429. const struct auto_pin_cfg *cfg)
  15430. {
  15431. static const char * const chname[4] = {
  15432. "Front", "Surround", "CLFE", "Side"
  15433. };
  15434. const char *pfx = alc_get_line_out_pfx(cfg, true);
  15435. hda_nid_t nid_v, nid_s;
  15436. int i, err;
  15437. for (i = 0; i < cfg->line_outs; i++) {
  15438. if (!spec->multiout.dac_nids[i])
  15439. continue;
  15440. nid_v = alc861vd_idx_to_mixer_vol(
  15441. alc880_dac_to_idx(
  15442. spec->multiout.dac_nids[i]));
  15443. nid_s = alc861vd_idx_to_mixer_switch(
  15444. alc880_dac_to_idx(
  15445. spec->multiout.dac_nids[i]));
  15446. if (!pfx && i == 2) {
  15447. /* Center/LFE */
  15448. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
  15449. "Center",
  15450. HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
  15451. HDA_OUTPUT));
  15452. if (err < 0)
  15453. return err;
  15454. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
  15455. "LFE",
  15456. HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
  15457. HDA_OUTPUT));
  15458. if (err < 0)
  15459. return err;
  15460. err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
  15461. "Center",
  15462. HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
  15463. HDA_INPUT));
  15464. if (err < 0)
  15465. return err;
  15466. err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
  15467. "LFE",
  15468. HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
  15469. HDA_INPUT));
  15470. if (err < 0)
  15471. return err;
  15472. } else {
  15473. const char *name = pfx;
  15474. int index = i;
  15475. if (!name) {
  15476. name = chname[i];
  15477. index = 0;
  15478. }
  15479. err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
  15480. name, index,
  15481. HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
  15482. HDA_OUTPUT));
  15483. if (err < 0)
  15484. return err;
  15485. err = __add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
  15486. name, index,
  15487. HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
  15488. HDA_INPUT));
  15489. if (err < 0)
  15490. return err;
  15491. }
  15492. }
  15493. return 0;
  15494. }
  15495. /* add playback controls for speaker and HP outputs */
  15496. /* Based on ALC880 version. But ALC861VD has separate,
  15497. * different NIDs for mute/unmute switch and volume control */
  15498. static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
  15499. hda_nid_t pin, const char *pfx)
  15500. {
  15501. hda_nid_t nid_v, nid_s;
  15502. int err;
  15503. if (!pin)
  15504. return 0;
  15505. if (alc880_is_fixed_pin(pin)) {
  15506. nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
  15507. /* specify the DAC as the extra output */
  15508. if (!spec->multiout.hp_nid)
  15509. spec->multiout.hp_nid = nid_v;
  15510. else
  15511. spec->multiout.extra_out_nid[0] = nid_v;
  15512. /* control HP volume/switch on the output mixer amp */
  15513. nid_v = alc861vd_idx_to_mixer_vol(
  15514. alc880_fixed_pin_idx(pin));
  15515. nid_s = alc861vd_idx_to_mixer_switch(
  15516. alc880_fixed_pin_idx(pin));
  15517. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
  15518. HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
  15519. if (err < 0)
  15520. return err;
  15521. err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
  15522. HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
  15523. if (err < 0)
  15524. return err;
  15525. } else if (alc880_is_multi_pin(pin)) {
  15526. /* set manual connection */
  15527. /* we have only a switch on HP-out PIN */
  15528. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
  15529. HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
  15530. if (err < 0)
  15531. return err;
  15532. }
  15533. return 0;
  15534. }
  15535. /* parse the BIOS configuration and set up the alc_spec
  15536. * return 1 if successful, 0 if the proper config is not found,
  15537. * or a negative error code
  15538. * Based on ALC880 version - had to change it to override
  15539. * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
  15540. static int alc861vd_parse_auto_config(struct hda_codec *codec)
  15541. {
  15542. struct alc_spec *spec = codec->spec;
  15543. int err;
  15544. static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
  15545. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  15546. alc861vd_ignore);
  15547. if (err < 0)
  15548. return err;
  15549. if (!spec->autocfg.line_outs)
  15550. return 0; /* can't find valid BIOS pin config */
  15551. err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
  15552. if (err < 0)
  15553. return err;
  15554. err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
  15555. if (err < 0)
  15556. return err;
  15557. err = alc861vd_auto_create_extra_out(spec,
  15558. spec->autocfg.speaker_pins[0],
  15559. "Speaker");
  15560. if (err < 0)
  15561. return err;
  15562. err = alc861vd_auto_create_extra_out(spec,
  15563. spec->autocfg.hp_pins[0],
  15564. "Headphone");
  15565. if (err < 0)
  15566. return err;
  15567. err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
  15568. if (err < 0)
  15569. return err;
  15570. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  15571. alc_auto_parse_digital(codec);
  15572. if (spec->kctls.list)
  15573. add_mixer(spec, spec->kctls.list);
  15574. add_verb(spec, alc861vd_volume_init_verbs);
  15575. spec->num_mux_defs = 1;
  15576. spec->input_mux = &spec->private_imux[0];
  15577. err = alc_auto_add_mic_boost(codec);
  15578. if (err < 0)
  15579. return err;
  15580. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  15581. return 1;
  15582. }
  15583. /* additional initialization for auto-configuration model */
  15584. static void alc861vd_auto_init(struct hda_codec *codec)
  15585. {
  15586. struct alc_spec *spec = codec->spec;
  15587. alc861vd_auto_init_multi_out(codec);
  15588. alc861vd_auto_init_hp_out(codec);
  15589. alc861vd_auto_init_analog_input(codec);
  15590. alc861vd_auto_init_input_src(codec);
  15591. alc_auto_init_digital(codec);
  15592. if (spec->unsol_event)
  15593. alc_inithook(codec);
  15594. }
  15595. enum {
  15596. ALC660VD_FIX_ASUS_GPIO1
  15597. };
  15598. /* reset GPIO1 */
  15599. static const struct alc_fixup alc861vd_fixups[] = {
  15600. [ALC660VD_FIX_ASUS_GPIO1] = {
  15601. .type = ALC_FIXUP_VERBS,
  15602. .v.verbs = (const struct hda_verb[]) {
  15603. {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
  15604. {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
  15605. {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
  15606. { }
  15607. }
  15608. },
  15609. };
  15610. static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
  15611. SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
  15612. {}
  15613. };
  15614. static int patch_alc861vd(struct hda_codec *codec)
  15615. {
  15616. struct alc_spec *spec;
  15617. int err, board_config;
  15618. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  15619. if (spec == NULL)
  15620. return -ENOMEM;
  15621. codec->spec = spec;
  15622. board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
  15623. alc861vd_models,
  15624. alc861vd_cfg_tbl);
  15625. if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
  15626. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  15627. codec->chip_name);
  15628. board_config = ALC861VD_AUTO;
  15629. }
  15630. if (board_config == ALC861VD_AUTO) {
  15631. alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
  15632. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  15633. }
  15634. if (board_config == ALC861VD_AUTO) {
  15635. /* automatic parse from the BIOS config */
  15636. err = alc861vd_parse_auto_config(codec);
  15637. if (err < 0) {
  15638. alc_free(codec);
  15639. return err;
  15640. } else if (!err) {
  15641. printk(KERN_INFO
  15642. "hda_codec: Cannot set up configuration "
  15643. "from BIOS. Using base mode...\n");
  15644. board_config = ALC861VD_3ST;
  15645. }
  15646. }
  15647. err = snd_hda_attach_beep_device(codec, 0x23);
  15648. if (err < 0) {
  15649. alc_free(codec);
  15650. return err;
  15651. }
  15652. if (board_config != ALC861VD_AUTO)
  15653. setup_preset(codec, &alc861vd_presets[board_config]);
  15654. if (codec->vendor_id == 0x10ec0660) {
  15655. /* always turn on EAPD */
  15656. add_verb(spec, alc660vd_eapd_verbs);
  15657. }
  15658. spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
  15659. spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
  15660. spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
  15661. spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
  15662. if (!spec->adc_nids) {
  15663. spec->adc_nids = alc861vd_adc_nids;
  15664. spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
  15665. }
  15666. if (!spec->capsrc_nids)
  15667. spec->capsrc_nids = alc861vd_capsrc_nids;
  15668. set_capture_mixer(codec);
  15669. set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
  15670. spec->vmaster_nid = 0x02;
  15671. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  15672. codec->patch_ops = alc_patch_ops;
  15673. if (board_config == ALC861VD_AUTO)
  15674. spec->init_hook = alc861vd_auto_init;
  15675. #ifdef CONFIG_SND_HDA_POWER_SAVE
  15676. if (!spec->loopback.amplist)
  15677. spec->loopback.amplist = alc861vd_loopbacks;
  15678. #endif
  15679. return 0;
  15680. }
  15681. /*
  15682. * ALC662 support
  15683. *
  15684. * ALC662 is almost identical with ALC880 but has cleaner and more flexible
  15685. * configuration. Each pin widget can choose any input DACs and a mixer.
  15686. * Each ADC is connected from a mixer of all inputs. This makes possible
  15687. * 6-channel independent captures.
  15688. *
  15689. * In addition, an independent DAC for the multi-playback (not used in this
  15690. * driver yet).
  15691. */
  15692. #define ALC662_DIGOUT_NID 0x06
  15693. #define ALC662_DIGIN_NID 0x0a
  15694. static hda_nid_t alc662_dac_nids[4] = {
  15695. /* front, rear, clfe, rear_surr */
  15696. 0x02, 0x03, 0x04
  15697. };
  15698. static hda_nid_t alc272_dac_nids[2] = {
  15699. 0x02, 0x03
  15700. };
  15701. static hda_nid_t alc662_adc_nids[2] = {
  15702. /* ADC1-2 */
  15703. 0x09, 0x08
  15704. };
  15705. static hda_nid_t alc272_adc_nids[1] = {
  15706. /* ADC1-2 */
  15707. 0x08,
  15708. };
  15709. static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
  15710. static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
  15711. /* input MUX */
  15712. /* FIXME: should be a matrix-type input source selection */
  15713. static struct hda_input_mux alc662_capture_source = {
  15714. .num_items = 4,
  15715. .items = {
  15716. { "Mic", 0x0 },
  15717. { "Front Mic", 0x1 },
  15718. { "Line", 0x2 },
  15719. { "CD", 0x4 },
  15720. },
  15721. };
  15722. static struct hda_input_mux alc662_lenovo_101e_capture_source = {
  15723. .num_items = 2,
  15724. .items = {
  15725. { "Mic", 0x1 },
  15726. { "Line", 0x2 },
  15727. },
  15728. };
  15729. static struct hda_input_mux alc663_capture_source = {
  15730. .num_items = 3,
  15731. .items = {
  15732. { "Mic", 0x0 },
  15733. { "Front Mic", 0x1 },
  15734. { "Line", 0x2 },
  15735. },
  15736. };
  15737. #if 0 /* set to 1 for testing other input sources below */
  15738. static struct hda_input_mux alc272_nc10_capture_source = {
  15739. .num_items = 16,
  15740. .items = {
  15741. { "Autoselect Mic", 0x0 },
  15742. { "Internal Mic", 0x1 },
  15743. { "In-0x02", 0x2 },
  15744. { "In-0x03", 0x3 },
  15745. { "In-0x04", 0x4 },
  15746. { "In-0x05", 0x5 },
  15747. { "In-0x06", 0x6 },
  15748. { "In-0x07", 0x7 },
  15749. { "In-0x08", 0x8 },
  15750. { "In-0x09", 0x9 },
  15751. { "In-0x0a", 0x0a },
  15752. { "In-0x0b", 0x0b },
  15753. { "In-0x0c", 0x0c },
  15754. { "In-0x0d", 0x0d },
  15755. { "In-0x0e", 0x0e },
  15756. { "In-0x0f", 0x0f },
  15757. },
  15758. };
  15759. #endif
  15760. /*
  15761. * 2ch mode
  15762. */
  15763. static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
  15764. { 2, NULL }
  15765. };
  15766. /*
  15767. * 2ch mode
  15768. */
  15769. static struct hda_verb alc662_3ST_ch2_init[] = {
  15770. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
  15771. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  15772. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
  15773. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
  15774. { } /* end */
  15775. };
  15776. /*
  15777. * 6ch mode
  15778. */
  15779. static struct hda_verb alc662_3ST_ch6_init[] = {
  15780. { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  15781. { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  15782. { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
  15783. { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  15784. { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
  15785. { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
  15786. { } /* end */
  15787. };
  15788. static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
  15789. { 2, alc662_3ST_ch2_init },
  15790. { 6, alc662_3ST_ch6_init },
  15791. };
  15792. /*
  15793. * 2ch mode
  15794. */
  15795. static struct hda_verb alc662_sixstack_ch6_init[] = {
  15796. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  15797. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
  15798. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  15799. { } /* end */
  15800. };
  15801. /*
  15802. * 6ch mode
  15803. */
  15804. static struct hda_verb alc662_sixstack_ch8_init[] = {
  15805. { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  15806. { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  15807. { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
  15808. { } /* end */
  15809. };
  15810. static struct hda_channel_mode alc662_5stack_modes[2] = {
  15811. { 2, alc662_sixstack_ch6_init },
  15812. { 6, alc662_sixstack_ch8_init },
  15813. };
  15814. /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
  15815. * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
  15816. */
  15817. static struct snd_kcontrol_new alc662_base_mixer[] = {
  15818. /* output mixer control */
  15819. HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
  15820. HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
  15821. HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
  15822. HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
  15823. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
  15824. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
  15825. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
  15826. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
  15827. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  15828. /*Input mixer control */
  15829. HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
  15830. HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
  15831. HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
  15832. HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
  15833. HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
  15834. HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
  15835. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
  15836. HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
  15837. { } /* end */
  15838. };
  15839. static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
  15840. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15841. HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
  15842. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  15843. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  15844. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  15845. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  15846. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  15847. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15848. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15849. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15850. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15851. { } /* end */
  15852. };
  15853. static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
  15854. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15855. HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
  15856. HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  15857. HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
  15858. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
  15859. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
  15860. HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
  15861. HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
  15862. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  15863. HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
  15864. HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
  15865. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  15866. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  15867. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15868. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15869. HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15870. HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15871. { } /* end */
  15872. };
  15873. static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
  15874. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15875. HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
  15876. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  15877. HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
  15878. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  15879. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  15880. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  15881. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15882. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15883. { } /* end */
  15884. };
  15885. static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
  15886. HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15887. ALC262_HIPPO_MASTER_SWITCH,
  15888. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  15889. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15890. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15891. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  15892. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15893. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15894. { } /* end */
  15895. };
  15896. static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
  15897. ALC262_HIPPO_MASTER_SWITCH,
  15898. HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15899. HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  15900. HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
  15901. HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
  15902. HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
  15903. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  15904. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  15905. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15906. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15907. { } /* end */
  15908. };
  15909. static struct hda_bind_ctls alc663_asus_bind_master_vol = {
  15910. .ops = &snd_hda_bind_vol,
  15911. .values = {
  15912. HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
  15913. HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
  15914. 0
  15915. },
  15916. };
  15917. static struct hda_bind_ctls alc663_asus_one_bind_switch = {
  15918. .ops = &snd_hda_bind_sw,
  15919. .values = {
  15920. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  15921. HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  15922. 0
  15923. },
  15924. };
  15925. static struct snd_kcontrol_new alc663_m51va_mixer[] = {
  15926. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  15927. HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
  15928. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15929. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15930. { } /* end */
  15931. };
  15932. static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
  15933. .ops = &snd_hda_bind_sw,
  15934. .values = {
  15935. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  15936. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  15937. HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  15938. 0
  15939. },
  15940. };
  15941. static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
  15942. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  15943. HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
  15944. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15945. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15946. HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15947. HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15948. { } /* end */
  15949. };
  15950. static struct hda_bind_ctls alc663_asus_four_bind_switch = {
  15951. .ops = &snd_hda_bind_sw,
  15952. .values = {
  15953. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  15954. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  15955. HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
  15956. 0
  15957. },
  15958. };
  15959. static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
  15960. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  15961. HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
  15962. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15963. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15964. HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15965. HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15966. { } /* end */
  15967. };
  15968. static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
  15969. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  15970. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  15971. HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  15972. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  15973. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  15974. HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  15975. HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  15976. { } /* end */
  15977. };
  15978. static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
  15979. .ops = &snd_hda_bind_vol,
  15980. .values = {
  15981. HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
  15982. HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
  15983. 0
  15984. },
  15985. };
  15986. static struct hda_bind_ctls alc663_asus_two_bind_switch = {
  15987. .ops = &snd_hda_bind_sw,
  15988. .values = {
  15989. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  15990. HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
  15991. 0
  15992. },
  15993. };
  15994. static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
  15995. HDA_BIND_VOL("Master Playback Volume",
  15996. &alc663_asus_two_bind_master_vol),
  15997. HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
  15998. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  15999. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  16000. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16001. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16002. { } /* end */
  16003. };
  16004. static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
  16005. HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
  16006. HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
  16007. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  16008. HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  16009. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16010. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16011. { } /* end */
  16012. };
  16013. static struct snd_kcontrol_new alc663_g71v_mixer[] = {
  16014. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  16015. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  16016. HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  16017. HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  16018. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  16019. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16020. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16021. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  16022. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  16023. { } /* end */
  16024. };
  16025. static struct snd_kcontrol_new alc663_g50v_mixer[] = {
  16026. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  16027. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  16028. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  16029. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16030. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16031. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  16032. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  16033. HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
  16034. HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
  16035. { } /* end */
  16036. };
  16037. static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
  16038. .ops = &snd_hda_bind_sw,
  16039. .values = {
  16040. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  16041. HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
  16042. HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
  16043. HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
  16044. HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  16045. 0
  16046. },
  16047. };
  16048. static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
  16049. .ops = &snd_hda_bind_sw,
  16050. .values = {
  16051. HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  16052. HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
  16053. 0
  16054. },
  16055. };
  16056. static struct snd_kcontrol_new alc663_mode7_mixer[] = {
  16057. HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
  16058. HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
  16059. HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
  16060. HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
  16061. HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  16062. HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16063. HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16064. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  16065. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  16066. { } /* end */
  16067. };
  16068. static struct snd_kcontrol_new alc663_mode8_mixer[] = {
  16069. HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
  16070. HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
  16071. HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
  16072. HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
  16073. HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  16074. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16075. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16076. { } /* end */
  16077. };
  16078. static struct snd_kcontrol_new alc662_chmode_mixer[] = {
  16079. {
  16080. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  16081. .name = "Channel Mode",
  16082. .info = alc_ch_mode_info,
  16083. .get = alc_ch_mode_get,
  16084. .put = alc_ch_mode_put,
  16085. },
  16086. { } /* end */
  16087. };
  16088. static struct hda_verb alc662_init_verbs[] = {
  16089. /* ADC: mute amp left and right */
  16090. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16091. {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
  16092. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16093. {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16094. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16095. {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16096. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16097. {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16098. /* Front Pin: output 0 (0x0c) */
  16099. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16100. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16101. /* Rear Pin: output 1 (0x0d) */
  16102. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16103. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16104. /* CLFE Pin: output 2 (0x0e) */
  16105. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16106. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16107. /* Mic (rear) pin: input vref at 80% */
  16108. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  16109. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  16110. /* Front Mic pin: input vref at 80% */
  16111. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  16112. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  16113. /* Line In pin: input */
  16114. {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16115. {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  16116. /* Line-2 In: Headphone output (output 0 - 0x0c) */
  16117. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16118. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16119. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
  16120. /* CD pin widget for input */
  16121. {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16122. /* FIXME: use matrix-type input source selection */
  16123. /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
  16124. /* Input mixer */
  16125. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16126. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16127. /* always trun on EAPD */
  16128. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
  16129. {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
  16130. { }
  16131. };
  16132. static struct hda_verb alc663_init_verbs[] = {
  16133. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16134. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16135. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16136. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16137. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16138. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16139. { }
  16140. };
  16141. static struct hda_verb alc272_init_verbs[] = {
  16142. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16143. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  16144. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16145. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16146. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16147. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16148. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  16149. {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16150. { }
  16151. };
  16152. static struct hda_verb alc662_sue_init_verbs[] = {
  16153. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
  16154. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
  16155. {}
  16156. };
  16157. static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
  16158. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16159. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16160. {}
  16161. };
  16162. /* Set Unsolicited Event*/
  16163. static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
  16164. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16165. {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16166. {}
  16167. };
  16168. static struct hda_verb alc663_m51va_init_verbs[] = {
  16169. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16170. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16171. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16172. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16173. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16174. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16175. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  16176. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16177. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16178. {}
  16179. };
  16180. static struct hda_verb alc663_21jd_amic_init_verbs[] = {
  16181. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16182. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16183. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16184. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16185. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16186. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16187. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16188. {}
  16189. };
  16190. static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
  16191. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16192. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16193. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16194. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
  16195. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16196. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16197. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16198. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16199. {}
  16200. };
  16201. static struct hda_verb alc663_15jd_amic_init_verbs[] = {
  16202. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16203. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16204. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16205. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16206. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16207. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16208. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16209. {}
  16210. };
  16211. static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
  16212. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16213. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16214. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16215. {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
  16216. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16217. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16218. {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
  16219. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16220. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16221. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16222. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16223. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16224. {}
  16225. };
  16226. static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
  16227. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16228. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16229. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16230. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16231. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16232. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16233. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16234. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16235. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
  16236. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16237. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16238. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16239. {}
  16240. };
  16241. static struct hda_verb alc663_g71v_init_verbs[] = {
  16242. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16243. /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
  16244. /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
  16245. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16246. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16247. {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
  16248. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
  16249. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
  16250. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
  16251. {}
  16252. };
  16253. static struct hda_verb alc663_g50v_init_verbs[] = {
  16254. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16255. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16256. {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
  16257. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16258. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16259. {}
  16260. };
  16261. static struct hda_verb alc662_ecs_init_verbs[] = {
  16262. {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
  16263. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16264. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16265. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16266. {}
  16267. };
  16268. static struct hda_verb alc272_dell_zm1_init_verbs[] = {
  16269. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16270. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16271. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16272. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16273. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16274. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16275. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16276. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16277. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  16278. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16279. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16280. {}
  16281. };
  16282. static struct hda_verb alc272_dell_init_verbs[] = {
  16283. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16284. {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16285. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16286. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16287. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16288. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16289. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16290. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16291. {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  16292. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16293. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16294. {}
  16295. };
  16296. static struct hda_verb alc663_mode7_init_verbs[] = {
  16297. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16298. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16299. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16300. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16301. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16302. {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16303. {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
  16304. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16305. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16306. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16307. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16308. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  16309. {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16310. {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16311. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16312. {}
  16313. };
  16314. static struct hda_verb alc663_mode8_init_verbs[] = {
  16315. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16316. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16317. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16318. {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
  16319. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16320. {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  16321. {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16322. {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  16323. {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  16324. {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  16325. {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
  16326. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
  16327. {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
  16328. {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16329. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
  16330. {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
  16331. {}
  16332. };
  16333. static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
  16334. HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
  16335. HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
  16336. { } /* end */
  16337. };
  16338. static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
  16339. HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
  16340. HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
  16341. { } /* end */
  16342. };
  16343. static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
  16344. {
  16345. unsigned int present;
  16346. unsigned char bits;
  16347. present = snd_hda_jack_detect(codec, 0x14);
  16348. bits = present ? HDA_AMP_MUTE : 0;
  16349. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  16350. HDA_AMP_MUTE, bits);
  16351. }
  16352. static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
  16353. {
  16354. unsigned int present;
  16355. unsigned char bits;
  16356. present = snd_hda_jack_detect(codec, 0x1b);
  16357. bits = present ? HDA_AMP_MUTE : 0;
  16358. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  16359. HDA_AMP_MUTE, bits);
  16360. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  16361. HDA_AMP_MUTE, bits);
  16362. }
  16363. static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
  16364. unsigned int res)
  16365. {
  16366. if ((res >> 26) == ALC880_HP_EVENT)
  16367. alc662_lenovo_101e_all_automute(codec);
  16368. if ((res >> 26) == ALC880_FRONT_EVENT)
  16369. alc662_lenovo_101e_ispeaker_automute(codec);
  16370. }
  16371. /* unsolicited event for HP jack sensing */
  16372. static void alc662_eeepc_unsol_event(struct hda_codec *codec,
  16373. unsigned int res)
  16374. {
  16375. if ((res >> 26) == ALC880_MIC_EVENT)
  16376. alc_mic_automute(codec);
  16377. else
  16378. alc262_hippo_unsol_event(codec, res);
  16379. }
  16380. static void alc662_eeepc_setup(struct hda_codec *codec)
  16381. {
  16382. struct alc_spec *spec = codec->spec;
  16383. alc262_hippo1_setup(codec);
  16384. spec->ext_mic.pin = 0x18;
  16385. spec->ext_mic.mux_idx = 0;
  16386. spec->int_mic.pin = 0x19;
  16387. spec->int_mic.mux_idx = 1;
  16388. spec->auto_mic = 1;
  16389. }
  16390. static void alc662_eeepc_inithook(struct hda_codec *codec)
  16391. {
  16392. alc262_hippo_automute(codec);
  16393. alc_mic_automute(codec);
  16394. }
  16395. static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
  16396. {
  16397. struct alc_spec *spec = codec->spec;
  16398. spec->autocfg.hp_pins[0] = 0x14;
  16399. spec->autocfg.speaker_pins[0] = 0x1b;
  16400. }
  16401. #define alc662_eeepc_ep20_inithook alc262_hippo_master_update
  16402. static void alc663_m51va_speaker_automute(struct hda_codec *codec)
  16403. {
  16404. unsigned int present;
  16405. unsigned char bits;
  16406. present = snd_hda_jack_detect(codec, 0x21);
  16407. bits = present ? HDA_AMP_MUTE : 0;
  16408. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  16409. HDA_AMP_MUTE, bits);
  16410. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  16411. HDA_AMP_MUTE, bits);
  16412. }
  16413. static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
  16414. {
  16415. unsigned int present;
  16416. unsigned char bits;
  16417. present = snd_hda_jack_detect(codec, 0x21);
  16418. bits = present ? HDA_AMP_MUTE : 0;
  16419. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  16420. HDA_AMP_MUTE, bits);
  16421. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  16422. HDA_AMP_MUTE, bits);
  16423. snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
  16424. HDA_AMP_MUTE, bits);
  16425. snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
  16426. HDA_AMP_MUTE, bits);
  16427. }
  16428. static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
  16429. {
  16430. unsigned int present;
  16431. unsigned char bits;
  16432. present = snd_hda_jack_detect(codec, 0x15);
  16433. bits = present ? HDA_AMP_MUTE : 0;
  16434. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  16435. HDA_AMP_MUTE, bits);
  16436. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  16437. HDA_AMP_MUTE, bits);
  16438. snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
  16439. HDA_AMP_MUTE, bits);
  16440. snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
  16441. HDA_AMP_MUTE, bits);
  16442. }
  16443. static void alc662_f5z_speaker_automute(struct hda_codec *codec)
  16444. {
  16445. unsigned int present;
  16446. unsigned char bits;
  16447. present = snd_hda_jack_detect(codec, 0x1b);
  16448. bits = present ? 0 : PIN_OUT;
  16449. snd_hda_codec_write(codec, 0x14, 0,
  16450. AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
  16451. }
  16452. static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
  16453. {
  16454. unsigned int present1, present2;
  16455. present1 = snd_hda_jack_detect(codec, 0x21);
  16456. present2 = snd_hda_jack_detect(codec, 0x15);
  16457. if (present1 || present2) {
  16458. snd_hda_codec_write_cache(codec, 0x14, 0,
  16459. AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
  16460. } else {
  16461. snd_hda_codec_write_cache(codec, 0x14, 0,
  16462. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  16463. }
  16464. }
  16465. static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
  16466. {
  16467. unsigned int present1, present2;
  16468. present1 = snd_hda_jack_detect(codec, 0x1b);
  16469. present2 = snd_hda_jack_detect(codec, 0x15);
  16470. if (present1 || present2) {
  16471. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  16472. HDA_AMP_MUTE, HDA_AMP_MUTE);
  16473. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  16474. HDA_AMP_MUTE, HDA_AMP_MUTE);
  16475. } else {
  16476. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
  16477. HDA_AMP_MUTE, 0);
  16478. snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
  16479. HDA_AMP_MUTE, 0);
  16480. }
  16481. }
  16482. static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
  16483. {
  16484. unsigned int present1, present2;
  16485. present1 = snd_hda_codec_read(codec, 0x1b, 0,
  16486. AC_VERB_GET_PIN_SENSE, 0)
  16487. & AC_PINSENSE_PRESENCE;
  16488. present2 = snd_hda_codec_read(codec, 0x21, 0,
  16489. AC_VERB_GET_PIN_SENSE, 0)
  16490. & AC_PINSENSE_PRESENCE;
  16491. if (present1 || present2) {
  16492. snd_hda_codec_write_cache(codec, 0x14, 0,
  16493. AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
  16494. snd_hda_codec_write_cache(codec, 0x17, 0,
  16495. AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
  16496. } else {
  16497. snd_hda_codec_write_cache(codec, 0x14, 0,
  16498. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  16499. snd_hda_codec_write_cache(codec, 0x17, 0,
  16500. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  16501. }
  16502. }
  16503. static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
  16504. {
  16505. unsigned int present1, present2;
  16506. present1 = snd_hda_codec_read(codec, 0x21, 0,
  16507. AC_VERB_GET_PIN_SENSE, 0)
  16508. & AC_PINSENSE_PRESENCE;
  16509. present2 = snd_hda_codec_read(codec, 0x15, 0,
  16510. AC_VERB_GET_PIN_SENSE, 0)
  16511. & AC_PINSENSE_PRESENCE;
  16512. if (present1 || present2) {
  16513. snd_hda_codec_write_cache(codec, 0x14, 0,
  16514. AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
  16515. snd_hda_codec_write_cache(codec, 0x17, 0,
  16516. AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
  16517. } else {
  16518. snd_hda_codec_write_cache(codec, 0x14, 0,
  16519. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  16520. snd_hda_codec_write_cache(codec, 0x17, 0,
  16521. AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
  16522. }
  16523. }
  16524. static void alc663_m51va_unsol_event(struct hda_codec *codec,
  16525. unsigned int res)
  16526. {
  16527. switch (res >> 26) {
  16528. case ALC880_HP_EVENT:
  16529. alc663_m51va_speaker_automute(codec);
  16530. break;
  16531. case ALC880_MIC_EVENT:
  16532. alc_mic_automute(codec);
  16533. break;
  16534. }
  16535. }
  16536. static void alc663_m51va_setup(struct hda_codec *codec)
  16537. {
  16538. struct alc_spec *spec = codec->spec;
  16539. spec->ext_mic.pin = 0x18;
  16540. spec->ext_mic.mux_idx = 0;
  16541. spec->int_mic.pin = 0x12;
  16542. spec->int_mic.mux_idx = 9;
  16543. spec->auto_mic = 1;
  16544. }
  16545. static void alc663_m51va_inithook(struct hda_codec *codec)
  16546. {
  16547. alc663_m51va_speaker_automute(codec);
  16548. alc_mic_automute(codec);
  16549. }
  16550. /* ***************** Mode1 ******************************/
  16551. #define alc663_mode1_unsol_event alc663_m51va_unsol_event
  16552. static void alc663_mode1_setup(struct hda_codec *codec)
  16553. {
  16554. struct alc_spec *spec = codec->spec;
  16555. spec->ext_mic.pin = 0x18;
  16556. spec->ext_mic.mux_idx = 0;
  16557. spec->int_mic.pin = 0x19;
  16558. spec->int_mic.mux_idx = 1;
  16559. spec->auto_mic = 1;
  16560. }
  16561. #define alc663_mode1_inithook alc663_m51va_inithook
  16562. /* ***************** Mode2 ******************************/
  16563. static void alc662_mode2_unsol_event(struct hda_codec *codec,
  16564. unsigned int res)
  16565. {
  16566. switch (res >> 26) {
  16567. case ALC880_HP_EVENT:
  16568. alc662_f5z_speaker_automute(codec);
  16569. break;
  16570. case ALC880_MIC_EVENT:
  16571. alc_mic_automute(codec);
  16572. break;
  16573. }
  16574. }
  16575. #define alc662_mode2_setup alc663_mode1_setup
  16576. static void alc662_mode2_inithook(struct hda_codec *codec)
  16577. {
  16578. alc662_f5z_speaker_automute(codec);
  16579. alc_mic_automute(codec);
  16580. }
  16581. /* ***************** Mode3 ******************************/
  16582. static void alc663_mode3_unsol_event(struct hda_codec *codec,
  16583. unsigned int res)
  16584. {
  16585. switch (res >> 26) {
  16586. case ALC880_HP_EVENT:
  16587. alc663_two_hp_m1_speaker_automute(codec);
  16588. break;
  16589. case ALC880_MIC_EVENT:
  16590. alc_mic_automute(codec);
  16591. break;
  16592. }
  16593. }
  16594. #define alc663_mode3_setup alc663_mode1_setup
  16595. static void alc663_mode3_inithook(struct hda_codec *codec)
  16596. {
  16597. alc663_two_hp_m1_speaker_automute(codec);
  16598. alc_mic_automute(codec);
  16599. }
  16600. /* ***************** Mode4 ******************************/
  16601. static void alc663_mode4_unsol_event(struct hda_codec *codec,
  16602. unsigned int res)
  16603. {
  16604. switch (res >> 26) {
  16605. case ALC880_HP_EVENT:
  16606. alc663_21jd_two_speaker_automute(codec);
  16607. break;
  16608. case ALC880_MIC_EVENT:
  16609. alc_mic_automute(codec);
  16610. break;
  16611. }
  16612. }
  16613. #define alc663_mode4_setup alc663_mode1_setup
  16614. static void alc663_mode4_inithook(struct hda_codec *codec)
  16615. {
  16616. alc663_21jd_two_speaker_automute(codec);
  16617. alc_mic_automute(codec);
  16618. }
  16619. /* ***************** Mode5 ******************************/
  16620. static void alc663_mode5_unsol_event(struct hda_codec *codec,
  16621. unsigned int res)
  16622. {
  16623. switch (res >> 26) {
  16624. case ALC880_HP_EVENT:
  16625. alc663_15jd_two_speaker_automute(codec);
  16626. break;
  16627. case ALC880_MIC_EVENT:
  16628. alc_mic_automute(codec);
  16629. break;
  16630. }
  16631. }
  16632. #define alc663_mode5_setup alc663_mode1_setup
  16633. static void alc663_mode5_inithook(struct hda_codec *codec)
  16634. {
  16635. alc663_15jd_two_speaker_automute(codec);
  16636. alc_mic_automute(codec);
  16637. }
  16638. /* ***************** Mode6 ******************************/
  16639. static void alc663_mode6_unsol_event(struct hda_codec *codec,
  16640. unsigned int res)
  16641. {
  16642. switch (res >> 26) {
  16643. case ALC880_HP_EVENT:
  16644. alc663_two_hp_m2_speaker_automute(codec);
  16645. break;
  16646. case ALC880_MIC_EVENT:
  16647. alc_mic_automute(codec);
  16648. break;
  16649. }
  16650. }
  16651. #define alc663_mode6_setup alc663_mode1_setup
  16652. static void alc663_mode6_inithook(struct hda_codec *codec)
  16653. {
  16654. alc663_two_hp_m2_speaker_automute(codec);
  16655. alc_mic_automute(codec);
  16656. }
  16657. /* ***************** Mode7 ******************************/
  16658. static void alc663_mode7_unsol_event(struct hda_codec *codec,
  16659. unsigned int res)
  16660. {
  16661. switch (res >> 26) {
  16662. case ALC880_HP_EVENT:
  16663. alc663_two_hp_m7_speaker_automute(codec);
  16664. break;
  16665. case ALC880_MIC_EVENT:
  16666. alc_mic_automute(codec);
  16667. break;
  16668. }
  16669. }
  16670. #define alc663_mode7_setup alc663_mode1_setup
  16671. static void alc663_mode7_inithook(struct hda_codec *codec)
  16672. {
  16673. alc663_two_hp_m7_speaker_automute(codec);
  16674. alc_mic_automute(codec);
  16675. }
  16676. /* ***************** Mode8 ******************************/
  16677. static void alc663_mode8_unsol_event(struct hda_codec *codec,
  16678. unsigned int res)
  16679. {
  16680. switch (res >> 26) {
  16681. case ALC880_HP_EVENT:
  16682. alc663_two_hp_m8_speaker_automute(codec);
  16683. break;
  16684. case ALC880_MIC_EVENT:
  16685. alc_mic_automute(codec);
  16686. break;
  16687. }
  16688. }
  16689. #define alc663_mode8_setup alc663_m51va_setup
  16690. static void alc663_mode8_inithook(struct hda_codec *codec)
  16691. {
  16692. alc663_two_hp_m8_speaker_automute(codec);
  16693. alc_mic_automute(codec);
  16694. }
  16695. static void alc663_g71v_hp_automute(struct hda_codec *codec)
  16696. {
  16697. unsigned int present;
  16698. unsigned char bits;
  16699. present = snd_hda_jack_detect(codec, 0x21);
  16700. bits = present ? HDA_AMP_MUTE : 0;
  16701. snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
  16702. HDA_AMP_MUTE, bits);
  16703. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  16704. HDA_AMP_MUTE, bits);
  16705. }
  16706. static void alc663_g71v_front_automute(struct hda_codec *codec)
  16707. {
  16708. unsigned int present;
  16709. unsigned char bits;
  16710. present = snd_hda_jack_detect(codec, 0x15);
  16711. bits = present ? HDA_AMP_MUTE : 0;
  16712. snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
  16713. HDA_AMP_MUTE, bits);
  16714. }
  16715. static void alc663_g71v_unsol_event(struct hda_codec *codec,
  16716. unsigned int res)
  16717. {
  16718. switch (res >> 26) {
  16719. case ALC880_HP_EVENT:
  16720. alc663_g71v_hp_automute(codec);
  16721. break;
  16722. case ALC880_FRONT_EVENT:
  16723. alc663_g71v_front_automute(codec);
  16724. break;
  16725. case ALC880_MIC_EVENT:
  16726. alc_mic_automute(codec);
  16727. break;
  16728. }
  16729. }
  16730. #define alc663_g71v_setup alc663_m51va_setup
  16731. static void alc663_g71v_inithook(struct hda_codec *codec)
  16732. {
  16733. alc663_g71v_front_automute(codec);
  16734. alc663_g71v_hp_automute(codec);
  16735. alc_mic_automute(codec);
  16736. }
  16737. static void alc663_g50v_unsol_event(struct hda_codec *codec,
  16738. unsigned int res)
  16739. {
  16740. switch (res >> 26) {
  16741. case ALC880_HP_EVENT:
  16742. alc663_m51va_speaker_automute(codec);
  16743. break;
  16744. case ALC880_MIC_EVENT:
  16745. alc_mic_automute(codec);
  16746. break;
  16747. }
  16748. }
  16749. #define alc663_g50v_setup alc663_m51va_setup
  16750. static void alc663_g50v_inithook(struct hda_codec *codec)
  16751. {
  16752. alc663_m51va_speaker_automute(codec);
  16753. alc_mic_automute(codec);
  16754. }
  16755. static struct snd_kcontrol_new alc662_ecs_mixer[] = {
  16756. HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  16757. ALC262_HIPPO_MASTER_SWITCH,
  16758. HDA_CODEC_VOLUME("Mic/LineIn Boost Volume", 0x18, 0, HDA_INPUT),
  16759. HDA_CODEC_VOLUME("Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16760. HDA_CODEC_MUTE("Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16761. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  16762. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  16763. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  16764. { } /* end */
  16765. };
  16766. static struct snd_kcontrol_new alc272_nc10_mixer[] = {
  16767. /* Master Playback automatically created from Speaker and Headphone */
  16768. HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
  16769. HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  16770. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
  16771. HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
  16772. HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
  16773. HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
  16774. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  16775. HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
  16776. HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
  16777. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
  16778. { } /* end */
  16779. };
  16780. #ifdef CONFIG_SND_HDA_POWER_SAVE
  16781. #define alc662_loopbacks alc880_loopbacks
  16782. #endif
  16783. /* pcm configuration: identical with ALC880 */
  16784. #define alc662_pcm_analog_playback alc880_pcm_analog_playback
  16785. #define alc662_pcm_analog_capture alc880_pcm_analog_capture
  16786. #define alc662_pcm_digital_playback alc880_pcm_digital_playback
  16787. #define alc662_pcm_digital_capture alc880_pcm_digital_capture
  16788. /*
  16789. * configuration and preset
  16790. */
  16791. static const char * const alc662_models[ALC662_MODEL_LAST] = {
  16792. [ALC662_3ST_2ch_DIG] = "3stack-dig",
  16793. [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
  16794. [ALC662_3ST_6ch] = "3stack-6ch",
  16795. [ALC662_5ST_DIG] = "6stack-dig",
  16796. [ALC662_LENOVO_101E] = "lenovo-101e",
  16797. [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
  16798. [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
  16799. [ALC662_ECS] = "ecs",
  16800. [ALC663_ASUS_M51VA] = "m51va",
  16801. [ALC663_ASUS_G71V] = "g71v",
  16802. [ALC663_ASUS_H13] = "h13",
  16803. [ALC663_ASUS_G50V] = "g50v",
  16804. [ALC663_ASUS_MODE1] = "asus-mode1",
  16805. [ALC662_ASUS_MODE2] = "asus-mode2",
  16806. [ALC663_ASUS_MODE3] = "asus-mode3",
  16807. [ALC663_ASUS_MODE4] = "asus-mode4",
  16808. [ALC663_ASUS_MODE5] = "asus-mode5",
  16809. [ALC663_ASUS_MODE6] = "asus-mode6",
  16810. [ALC663_ASUS_MODE7] = "asus-mode7",
  16811. [ALC663_ASUS_MODE8] = "asus-mode8",
  16812. [ALC272_DELL] = "dell",
  16813. [ALC272_DELL_ZM1] = "dell-zm1",
  16814. [ALC272_SAMSUNG_NC10] = "samsung-nc10",
  16815. [ALC662_AUTO] = "auto",
  16816. };
  16817. static struct snd_pci_quirk alc662_cfg_tbl[] = {
  16818. SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
  16819. SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
  16820. SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
  16821. SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
  16822. SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
  16823. SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
  16824. SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
  16825. SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
  16826. SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
  16827. SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
  16828. SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
  16829. SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
  16830. SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
  16831. SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
  16832. SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
  16833. SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
  16834. SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
  16835. SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
  16836. SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
  16837. SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
  16838. SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
  16839. SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
  16840. SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
  16841. SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
  16842. SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
  16843. SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
  16844. SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
  16845. SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
  16846. SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
  16847. SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
  16848. SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
  16849. SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
  16850. SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
  16851. SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
  16852. SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
  16853. SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
  16854. SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
  16855. /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
  16856. SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
  16857. SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
  16858. SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
  16859. SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
  16860. SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
  16861. SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
  16862. SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
  16863. SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
  16864. SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
  16865. SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
  16866. SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
  16867. SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
  16868. SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
  16869. SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
  16870. SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
  16871. /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
  16872. SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
  16873. SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
  16874. SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
  16875. SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
  16876. SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
  16877. SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
  16878. SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
  16879. SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
  16880. SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
  16881. SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
  16882. ALC662_3ST_6ch_DIG),
  16883. SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
  16884. SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
  16885. SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
  16886. ALC662_3ST_6ch_DIG),
  16887. SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
  16888. SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
  16889. SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
  16890. SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
  16891. SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
  16892. ALC662_3ST_6ch_DIG),
  16893. SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
  16894. ALC663_ASUS_H13),
  16895. SND_PCI_QUIRK(0x1991, 0x5628, "Ordissimo EVE", ALC662_LENOVO_101E),
  16896. {}
  16897. };
  16898. static struct alc_config_preset alc662_presets[] = {
  16899. [ALC662_3ST_2ch_DIG] = {
  16900. .mixers = { alc662_3ST_2ch_mixer },
  16901. .init_verbs = { alc662_init_verbs },
  16902. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16903. .dac_nids = alc662_dac_nids,
  16904. .dig_out_nid = ALC662_DIGOUT_NID,
  16905. .dig_in_nid = ALC662_DIGIN_NID,
  16906. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  16907. .channel_mode = alc662_3ST_2ch_modes,
  16908. .input_mux = &alc662_capture_source,
  16909. },
  16910. [ALC662_3ST_6ch_DIG] = {
  16911. .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
  16912. .init_verbs = { alc662_init_verbs },
  16913. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16914. .dac_nids = alc662_dac_nids,
  16915. .dig_out_nid = ALC662_DIGOUT_NID,
  16916. .dig_in_nid = ALC662_DIGIN_NID,
  16917. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  16918. .channel_mode = alc662_3ST_6ch_modes,
  16919. .need_dac_fix = 1,
  16920. .input_mux = &alc662_capture_source,
  16921. },
  16922. [ALC662_3ST_6ch] = {
  16923. .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
  16924. .init_verbs = { alc662_init_verbs },
  16925. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16926. .dac_nids = alc662_dac_nids,
  16927. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  16928. .channel_mode = alc662_3ST_6ch_modes,
  16929. .need_dac_fix = 1,
  16930. .input_mux = &alc662_capture_source,
  16931. },
  16932. [ALC662_5ST_DIG] = {
  16933. .mixers = { alc662_base_mixer, alc662_chmode_mixer },
  16934. .init_verbs = { alc662_init_verbs },
  16935. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16936. .dac_nids = alc662_dac_nids,
  16937. .dig_out_nid = ALC662_DIGOUT_NID,
  16938. .dig_in_nid = ALC662_DIGIN_NID,
  16939. .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
  16940. .channel_mode = alc662_5stack_modes,
  16941. .input_mux = &alc662_capture_source,
  16942. },
  16943. [ALC662_LENOVO_101E] = {
  16944. .mixers = { alc662_lenovo_101e_mixer },
  16945. .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
  16946. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16947. .dac_nids = alc662_dac_nids,
  16948. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  16949. .channel_mode = alc662_3ST_2ch_modes,
  16950. .input_mux = &alc662_lenovo_101e_capture_source,
  16951. .unsol_event = alc662_lenovo_101e_unsol_event,
  16952. .init_hook = alc662_lenovo_101e_all_automute,
  16953. },
  16954. [ALC662_ASUS_EEEPC_P701] = {
  16955. .mixers = { alc662_eeepc_p701_mixer },
  16956. .init_verbs = { alc662_init_verbs,
  16957. alc662_eeepc_sue_init_verbs },
  16958. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16959. .dac_nids = alc662_dac_nids,
  16960. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  16961. .channel_mode = alc662_3ST_2ch_modes,
  16962. .unsol_event = alc662_eeepc_unsol_event,
  16963. .setup = alc662_eeepc_setup,
  16964. .init_hook = alc662_eeepc_inithook,
  16965. },
  16966. [ALC662_ASUS_EEEPC_EP20] = {
  16967. .mixers = { alc662_eeepc_ep20_mixer,
  16968. alc662_chmode_mixer },
  16969. .init_verbs = { alc662_init_verbs,
  16970. alc662_eeepc_ep20_sue_init_verbs },
  16971. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16972. .dac_nids = alc662_dac_nids,
  16973. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  16974. .channel_mode = alc662_3ST_6ch_modes,
  16975. .input_mux = &alc662_lenovo_101e_capture_source,
  16976. .unsol_event = alc662_eeepc_unsol_event,
  16977. .setup = alc662_eeepc_ep20_setup,
  16978. .init_hook = alc662_eeepc_ep20_inithook,
  16979. },
  16980. [ALC662_ECS] = {
  16981. .mixers = { alc662_ecs_mixer },
  16982. .init_verbs = { alc662_init_verbs,
  16983. alc662_ecs_init_verbs },
  16984. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16985. .dac_nids = alc662_dac_nids,
  16986. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  16987. .channel_mode = alc662_3ST_2ch_modes,
  16988. .unsol_event = alc662_eeepc_unsol_event,
  16989. .setup = alc662_eeepc_setup,
  16990. .init_hook = alc662_eeepc_inithook,
  16991. },
  16992. [ALC663_ASUS_M51VA] = {
  16993. .mixers = { alc663_m51va_mixer },
  16994. .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
  16995. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  16996. .dac_nids = alc662_dac_nids,
  16997. .dig_out_nid = ALC662_DIGOUT_NID,
  16998. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  16999. .channel_mode = alc662_3ST_2ch_modes,
  17000. .unsol_event = alc663_m51va_unsol_event,
  17001. .setup = alc663_m51va_setup,
  17002. .init_hook = alc663_m51va_inithook,
  17003. },
  17004. [ALC663_ASUS_G71V] = {
  17005. .mixers = { alc663_g71v_mixer },
  17006. .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
  17007. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17008. .dac_nids = alc662_dac_nids,
  17009. .dig_out_nid = ALC662_DIGOUT_NID,
  17010. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17011. .channel_mode = alc662_3ST_2ch_modes,
  17012. .unsol_event = alc663_g71v_unsol_event,
  17013. .setup = alc663_g71v_setup,
  17014. .init_hook = alc663_g71v_inithook,
  17015. },
  17016. [ALC663_ASUS_H13] = {
  17017. .mixers = { alc663_m51va_mixer },
  17018. .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
  17019. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17020. .dac_nids = alc662_dac_nids,
  17021. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17022. .channel_mode = alc662_3ST_2ch_modes,
  17023. .unsol_event = alc663_m51va_unsol_event,
  17024. .init_hook = alc663_m51va_inithook,
  17025. },
  17026. [ALC663_ASUS_G50V] = {
  17027. .mixers = { alc663_g50v_mixer },
  17028. .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
  17029. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17030. .dac_nids = alc662_dac_nids,
  17031. .dig_out_nid = ALC662_DIGOUT_NID,
  17032. .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
  17033. .channel_mode = alc662_3ST_6ch_modes,
  17034. .input_mux = &alc663_capture_source,
  17035. .unsol_event = alc663_g50v_unsol_event,
  17036. .setup = alc663_g50v_setup,
  17037. .init_hook = alc663_g50v_inithook,
  17038. },
  17039. [ALC663_ASUS_MODE1] = {
  17040. .mixers = { alc663_m51va_mixer },
  17041. .cap_mixer = alc662_auto_capture_mixer,
  17042. .init_verbs = { alc662_init_verbs,
  17043. alc663_21jd_amic_init_verbs },
  17044. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17045. .hp_nid = 0x03,
  17046. .dac_nids = alc662_dac_nids,
  17047. .dig_out_nid = ALC662_DIGOUT_NID,
  17048. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17049. .channel_mode = alc662_3ST_2ch_modes,
  17050. .unsol_event = alc663_mode1_unsol_event,
  17051. .setup = alc663_mode1_setup,
  17052. .init_hook = alc663_mode1_inithook,
  17053. },
  17054. [ALC662_ASUS_MODE2] = {
  17055. .mixers = { alc662_1bjd_mixer },
  17056. .cap_mixer = alc662_auto_capture_mixer,
  17057. .init_verbs = { alc662_init_verbs,
  17058. alc662_1bjd_amic_init_verbs },
  17059. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17060. .dac_nids = alc662_dac_nids,
  17061. .dig_out_nid = ALC662_DIGOUT_NID,
  17062. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17063. .channel_mode = alc662_3ST_2ch_modes,
  17064. .unsol_event = alc662_mode2_unsol_event,
  17065. .setup = alc662_mode2_setup,
  17066. .init_hook = alc662_mode2_inithook,
  17067. },
  17068. [ALC663_ASUS_MODE3] = {
  17069. .mixers = { alc663_two_hp_m1_mixer },
  17070. .cap_mixer = alc662_auto_capture_mixer,
  17071. .init_verbs = { alc662_init_verbs,
  17072. alc663_two_hp_amic_m1_init_verbs },
  17073. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17074. .hp_nid = 0x03,
  17075. .dac_nids = alc662_dac_nids,
  17076. .dig_out_nid = ALC662_DIGOUT_NID,
  17077. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17078. .channel_mode = alc662_3ST_2ch_modes,
  17079. .unsol_event = alc663_mode3_unsol_event,
  17080. .setup = alc663_mode3_setup,
  17081. .init_hook = alc663_mode3_inithook,
  17082. },
  17083. [ALC663_ASUS_MODE4] = {
  17084. .mixers = { alc663_asus_21jd_clfe_mixer },
  17085. .cap_mixer = alc662_auto_capture_mixer,
  17086. .init_verbs = { alc662_init_verbs,
  17087. alc663_21jd_amic_init_verbs},
  17088. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17089. .hp_nid = 0x03,
  17090. .dac_nids = alc662_dac_nids,
  17091. .dig_out_nid = ALC662_DIGOUT_NID,
  17092. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17093. .channel_mode = alc662_3ST_2ch_modes,
  17094. .unsol_event = alc663_mode4_unsol_event,
  17095. .setup = alc663_mode4_setup,
  17096. .init_hook = alc663_mode4_inithook,
  17097. },
  17098. [ALC663_ASUS_MODE5] = {
  17099. .mixers = { alc663_asus_15jd_clfe_mixer },
  17100. .cap_mixer = alc662_auto_capture_mixer,
  17101. .init_verbs = { alc662_init_verbs,
  17102. alc663_15jd_amic_init_verbs },
  17103. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17104. .hp_nid = 0x03,
  17105. .dac_nids = alc662_dac_nids,
  17106. .dig_out_nid = ALC662_DIGOUT_NID,
  17107. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17108. .channel_mode = alc662_3ST_2ch_modes,
  17109. .unsol_event = alc663_mode5_unsol_event,
  17110. .setup = alc663_mode5_setup,
  17111. .init_hook = alc663_mode5_inithook,
  17112. },
  17113. [ALC663_ASUS_MODE6] = {
  17114. .mixers = { alc663_two_hp_m2_mixer },
  17115. .cap_mixer = alc662_auto_capture_mixer,
  17116. .init_verbs = { alc662_init_verbs,
  17117. alc663_two_hp_amic_m2_init_verbs },
  17118. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17119. .hp_nid = 0x03,
  17120. .dac_nids = alc662_dac_nids,
  17121. .dig_out_nid = ALC662_DIGOUT_NID,
  17122. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17123. .channel_mode = alc662_3ST_2ch_modes,
  17124. .unsol_event = alc663_mode6_unsol_event,
  17125. .setup = alc663_mode6_setup,
  17126. .init_hook = alc663_mode6_inithook,
  17127. },
  17128. [ALC663_ASUS_MODE7] = {
  17129. .mixers = { alc663_mode7_mixer },
  17130. .cap_mixer = alc662_auto_capture_mixer,
  17131. .init_verbs = { alc662_init_verbs,
  17132. alc663_mode7_init_verbs },
  17133. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17134. .hp_nid = 0x03,
  17135. .dac_nids = alc662_dac_nids,
  17136. .dig_out_nid = ALC662_DIGOUT_NID,
  17137. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17138. .channel_mode = alc662_3ST_2ch_modes,
  17139. .unsol_event = alc663_mode7_unsol_event,
  17140. .setup = alc663_mode7_setup,
  17141. .init_hook = alc663_mode7_inithook,
  17142. },
  17143. [ALC663_ASUS_MODE8] = {
  17144. .mixers = { alc663_mode8_mixer },
  17145. .cap_mixer = alc662_auto_capture_mixer,
  17146. .init_verbs = { alc662_init_verbs,
  17147. alc663_mode8_init_verbs },
  17148. .num_dacs = ARRAY_SIZE(alc662_dac_nids),
  17149. .hp_nid = 0x03,
  17150. .dac_nids = alc662_dac_nids,
  17151. .dig_out_nid = ALC662_DIGOUT_NID,
  17152. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17153. .channel_mode = alc662_3ST_2ch_modes,
  17154. .unsol_event = alc663_mode8_unsol_event,
  17155. .setup = alc663_mode8_setup,
  17156. .init_hook = alc663_mode8_inithook,
  17157. },
  17158. [ALC272_DELL] = {
  17159. .mixers = { alc663_m51va_mixer },
  17160. .cap_mixer = alc272_auto_capture_mixer,
  17161. .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
  17162. .num_dacs = ARRAY_SIZE(alc272_dac_nids),
  17163. .dac_nids = alc662_dac_nids,
  17164. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17165. .adc_nids = alc272_adc_nids,
  17166. .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
  17167. .capsrc_nids = alc272_capsrc_nids,
  17168. .channel_mode = alc662_3ST_2ch_modes,
  17169. .unsol_event = alc663_m51va_unsol_event,
  17170. .setup = alc663_m51va_setup,
  17171. .init_hook = alc663_m51va_inithook,
  17172. },
  17173. [ALC272_DELL_ZM1] = {
  17174. .mixers = { alc663_m51va_mixer },
  17175. .cap_mixer = alc662_auto_capture_mixer,
  17176. .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
  17177. .num_dacs = ARRAY_SIZE(alc272_dac_nids),
  17178. .dac_nids = alc662_dac_nids,
  17179. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17180. .adc_nids = alc662_adc_nids,
  17181. .num_adc_nids = 1,
  17182. .capsrc_nids = alc662_capsrc_nids,
  17183. .channel_mode = alc662_3ST_2ch_modes,
  17184. .unsol_event = alc663_m51va_unsol_event,
  17185. .setup = alc663_m51va_setup,
  17186. .init_hook = alc663_m51va_inithook,
  17187. },
  17188. [ALC272_SAMSUNG_NC10] = {
  17189. .mixers = { alc272_nc10_mixer },
  17190. .init_verbs = { alc662_init_verbs,
  17191. alc663_21jd_amic_init_verbs },
  17192. .num_dacs = ARRAY_SIZE(alc272_dac_nids),
  17193. .dac_nids = alc272_dac_nids,
  17194. .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
  17195. .channel_mode = alc662_3ST_2ch_modes,
  17196. /*.input_mux = &alc272_nc10_capture_source,*/
  17197. .unsol_event = alc663_mode4_unsol_event,
  17198. .setup = alc663_mode4_setup,
  17199. .init_hook = alc663_mode4_inithook,
  17200. },
  17201. };
  17202. /*
  17203. * BIOS auto configuration
  17204. */
  17205. /* convert from MIX nid to DAC */
  17206. static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
  17207. {
  17208. if (nid == 0x0f)
  17209. return 0x02;
  17210. else if (nid >= 0x0c && nid <= 0x0e)
  17211. return nid - 0x0c + 0x02;
  17212. else if (nid == 0x26) /* ALC887-VD has this DAC too */
  17213. return 0x25;
  17214. else
  17215. return 0;
  17216. }
  17217. /* get MIX nid connected to the given pin targeted to DAC */
  17218. static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
  17219. hda_nid_t dac)
  17220. {
  17221. hda_nid_t mix[5];
  17222. int i, num;
  17223. num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
  17224. for (i = 0; i < num; i++) {
  17225. if (alc662_mix_to_dac(mix[i]) == dac)
  17226. return mix[i];
  17227. }
  17228. return 0;
  17229. }
  17230. /* look for an empty DAC slot */
  17231. static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
  17232. {
  17233. struct alc_spec *spec = codec->spec;
  17234. hda_nid_t srcs[5];
  17235. int i, j, num;
  17236. num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
  17237. if (num < 0)
  17238. return 0;
  17239. for (i = 0; i < num; i++) {
  17240. hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
  17241. if (!nid)
  17242. continue;
  17243. for (j = 0; j < spec->multiout.num_dacs; j++)
  17244. if (spec->multiout.dac_nids[j] == nid)
  17245. break;
  17246. if (j >= spec->multiout.num_dacs)
  17247. return nid;
  17248. }
  17249. return 0;
  17250. }
  17251. /* fill in the dac_nids table from the parsed pin configuration */
  17252. static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
  17253. const struct auto_pin_cfg *cfg)
  17254. {
  17255. struct alc_spec *spec = codec->spec;
  17256. int i;
  17257. hda_nid_t dac;
  17258. spec->multiout.dac_nids = spec->private_dac_nids;
  17259. for (i = 0; i < cfg->line_outs; i++) {
  17260. dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
  17261. if (!dac)
  17262. continue;
  17263. spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
  17264. }
  17265. return 0;
  17266. }
  17267. static inline int __alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
  17268. hda_nid_t nid, int idx, unsigned int chs)
  17269. {
  17270. return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx,
  17271. HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
  17272. }
  17273. static inline int __alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
  17274. hda_nid_t nid, int idx, unsigned int chs)
  17275. {
  17276. return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx,
  17277. HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
  17278. }
  17279. #define alc662_add_vol_ctl(spec, pfx, nid, chs) \
  17280. __alc662_add_vol_ctl(spec, pfx, nid, 0, chs)
  17281. #define alc662_add_sw_ctl(spec, pfx, nid, chs) \
  17282. __alc662_add_sw_ctl(spec, pfx, nid, 0, chs)
  17283. #define alc662_add_stereo_vol(spec, pfx, nid) \
  17284. alc662_add_vol_ctl(spec, pfx, nid, 3)
  17285. #define alc662_add_stereo_sw(spec, pfx, nid) \
  17286. alc662_add_sw_ctl(spec, pfx, nid, 3)
  17287. /* add playback controls from the parsed DAC table */
  17288. static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
  17289. const struct auto_pin_cfg *cfg)
  17290. {
  17291. struct alc_spec *spec = codec->spec;
  17292. static const char * const chname[4] = {
  17293. "Front", "Surround", NULL /*CLFE*/, "Side"
  17294. };
  17295. const char *pfx = alc_get_line_out_pfx(cfg, true);
  17296. hda_nid_t nid, mix;
  17297. int i, err;
  17298. for (i = 0; i < cfg->line_outs; i++) {
  17299. nid = spec->multiout.dac_nids[i];
  17300. if (!nid)
  17301. continue;
  17302. mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
  17303. if (!mix)
  17304. continue;
  17305. if (!pfx && i == 2) {
  17306. /* Center/LFE */
  17307. err = alc662_add_vol_ctl(spec, "Center", nid, 1);
  17308. if (err < 0)
  17309. return err;
  17310. err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
  17311. if (err < 0)
  17312. return err;
  17313. err = alc662_add_sw_ctl(spec, "Center", mix, 1);
  17314. if (err < 0)
  17315. return err;
  17316. err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
  17317. if (err < 0)
  17318. return err;
  17319. } else {
  17320. const char *name = pfx;
  17321. int index = i;
  17322. if (!name) {
  17323. name = chname[i];
  17324. index = 0;
  17325. }
  17326. err = __alc662_add_vol_ctl(spec, name, nid, index, 3);
  17327. if (err < 0)
  17328. return err;
  17329. err = __alc662_add_sw_ctl(spec, name, mix, index, 3);
  17330. if (err < 0)
  17331. return err;
  17332. }
  17333. }
  17334. return 0;
  17335. }
  17336. /* add playback controls for speaker and HP outputs */
  17337. /* return DAC nid if any new DAC is assigned */
  17338. static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
  17339. const char *pfx)
  17340. {
  17341. struct alc_spec *spec = codec->spec;
  17342. hda_nid_t nid, mix;
  17343. int err;
  17344. if (!pin)
  17345. return 0;
  17346. nid = alc662_look_for_dac(codec, pin);
  17347. if (!nid) {
  17348. /* the corresponding DAC is already occupied */
  17349. if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
  17350. return 0; /* no way */
  17351. /* create a switch only */
  17352. return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
  17353. HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
  17354. }
  17355. mix = alc662_dac_to_mix(codec, pin, nid);
  17356. if (!mix)
  17357. return 0;
  17358. err = alc662_add_vol_ctl(spec, pfx, nid, 3);
  17359. if (err < 0)
  17360. return err;
  17361. err = alc662_add_sw_ctl(spec, pfx, mix, 3);
  17362. if (err < 0)
  17363. return err;
  17364. return nid;
  17365. }
  17366. /* create playback/capture controls for input pins */
  17367. #define alc662_auto_create_input_ctls \
  17368. alc882_auto_create_input_ctls
  17369. static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
  17370. hda_nid_t nid, int pin_type,
  17371. hda_nid_t dac)
  17372. {
  17373. int i, num;
  17374. hda_nid_t srcs[HDA_MAX_CONNECTIONS];
  17375. alc_set_pin_output(codec, nid, pin_type);
  17376. /* need the manual connection? */
  17377. num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
  17378. if (num <= 1)
  17379. return;
  17380. for (i = 0; i < num; i++) {
  17381. if (alc662_mix_to_dac(srcs[i]) != dac)
  17382. continue;
  17383. snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
  17384. return;
  17385. }
  17386. }
  17387. static void alc662_auto_init_multi_out(struct hda_codec *codec)
  17388. {
  17389. struct alc_spec *spec = codec->spec;
  17390. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  17391. int i;
  17392. for (i = 0; i <= HDA_SIDE; i++) {
  17393. hda_nid_t nid = spec->autocfg.line_out_pins[i];
  17394. if (nid)
  17395. alc662_auto_set_output_and_unmute(codec, nid, pin_type,
  17396. spec->multiout.dac_nids[i]);
  17397. }
  17398. }
  17399. static void alc662_auto_init_hp_out(struct hda_codec *codec)
  17400. {
  17401. struct alc_spec *spec = codec->spec;
  17402. hda_nid_t pin;
  17403. pin = spec->autocfg.hp_pins[0];
  17404. if (pin)
  17405. alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
  17406. spec->multiout.hp_nid);
  17407. pin = spec->autocfg.speaker_pins[0];
  17408. if (pin)
  17409. alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
  17410. spec->multiout.extra_out_nid[0]);
  17411. }
  17412. #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
  17413. static void alc662_auto_init_analog_input(struct hda_codec *codec)
  17414. {
  17415. struct alc_spec *spec = codec->spec;
  17416. struct auto_pin_cfg *cfg = &spec->autocfg;
  17417. int i;
  17418. for (i = 0; i < cfg->num_inputs; i++) {
  17419. hda_nid_t nid = cfg->inputs[i].pin;
  17420. if (alc_is_input_pin(codec, nid)) {
  17421. alc_set_input_pin(codec, nid, cfg->inputs[i].type);
  17422. if (nid != ALC662_PIN_CD_NID &&
  17423. (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
  17424. snd_hda_codec_write(codec, nid, 0,
  17425. AC_VERB_SET_AMP_GAIN_MUTE,
  17426. AMP_OUT_MUTE);
  17427. }
  17428. }
  17429. }
  17430. #define alc662_auto_init_input_src alc882_auto_init_input_src
  17431. static int alc662_parse_auto_config(struct hda_codec *codec)
  17432. {
  17433. struct alc_spec *spec = codec->spec;
  17434. int err;
  17435. static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
  17436. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  17437. alc662_ignore);
  17438. if (err < 0)
  17439. return err;
  17440. if (!spec->autocfg.line_outs)
  17441. return 0; /* can't find valid BIOS pin config */
  17442. err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
  17443. if (err < 0)
  17444. return err;
  17445. err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
  17446. if (err < 0)
  17447. return err;
  17448. err = alc662_auto_create_extra_out(codec,
  17449. spec->autocfg.speaker_pins[0],
  17450. "Speaker");
  17451. if (err < 0)
  17452. return err;
  17453. if (err)
  17454. spec->multiout.extra_out_nid[0] = err;
  17455. err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
  17456. "Headphone");
  17457. if (err < 0)
  17458. return err;
  17459. if (err)
  17460. spec->multiout.hp_nid = err;
  17461. err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
  17462. if (err < 0)
  17463. return err;
  17464. spec->multiout.max_channels = spec->multiout.num_dacs * 2;
  17465. alc_auto_parse_digital(codec);
  17466. if (spec->kctls.list)
  17467. add_mixer(spec, spec->kctls.list);
  17468. spec->num_mux_defs = 1;
  17469. spec->input_mux = &spec->private_imux[0];
  17470. add_verb(spec, alc662_init_verbs);
  17471. if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
  17472. codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
  17473. add_verb(spec, alc663_init_verbs);
  17474. if (codec->vendor_id == 0x10ec0272)
  17475. add_verb(spec, alc272_init_verbs);
  17476. err = alc_auto_add_mic_boost(codec);
  17477. if (err < 0)
  17478. return err;
  17479. if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
  17480. codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
  17481. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
  17482. else
  17483. alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
  17484. return 1;
  17485. }
  17486. /* additional initialization for auto-configuration model */
  17487. static void alc662_auto_init(struct hda_codec *codec)
  17488. {
  17489. struct alc_spec *spec = codec->spec;
  17490. alc662_auto_init_multi_out(codec);
  17491. alc662_auto_init_hp_out(codec);
  17492. alc662_auto_init_analog_input(codec);
  17493. alc662_auto_init_input_src(codec);
  17494. alc_auto_init_digital(codec);
  17495. if (spec->unsol_event)
  17496. alc_inithook(codec);
  17497. }
  17498. static void alc272_fixup_mario(struct hda_codec *codec,
  17499. const struct alc_fixup *fix, int action)
  17500. {
  17501. if (action != ALC_FIXUP_ACT_PROBE)
  17502. return;
  17503. if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
  17504. (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
  17505. (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
  17506. (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
  17507. (0 << AC_AMPCAP_MUTE_SHIFT)))
  17508. printk(KERN_WARNING
  17509. "hda_codec: failed to override amp caps for NID 0x2\n");
  17510. }
  17511. enum {
  17512. ALC662_FIXUP_ASPIRE,
  17513. ALC662_FIXUP_IDEAPAD,
  17514. ALC272_FIXUP_MARIO,
  17515. ALC662_FIXUP_CZC_P10T,
  17516. };
  17517. static const struct alc_fixup alc662_fixups[] = {
  17518. [ALC662_FIXUP_ASPIRE] = {
  17519. .type = ALC_FIXUP_PINS,
  17520. .v.pins = (const struct alc_pincfg[]) {
  17521. { 0x15, 0x99130112 }, /* subwoofer */
  17522. { }
  17523. }
  17524. },
  17525. [ALC662_FIXUP_IDEAPAD] = {
  17526. .type = ALC_FIXUP_PINS,
  17527. .v.pins = (const struct alc_pincfg[]) {
  17528. { 0x17, 0x99130112 }, /* subwoofer */
  17529. { }
  17530. }
  17531. },
  17532. [ALC272_FIXUP_MARIO] = {
  17533. .type = ALC_FIXUP_FUNC,
  17534. .v.func = alc272_fixup_mario,
  17535. },
  17536. [ALC662_FIXUP_CZC_P10T] = {
  17537. .type = ALC_FIXUP_VERBS,
  17538. .v.verbs = (const struct hda_verb[]) {
  17539. {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
  17540. {}
  17541. }
  17542. },
  17543. };
  17544. static struct snd_pci_quirk alc662_fixup_tbl[] = {
  17545. SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
  17546. SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
  17547. SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
  17548. SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
  17549. SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
  17550. SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
  17551. {}
  17552. };
  17553. static const struct alc_model_fixup alc662_fixup_models[] = {
  17554. {.id = ALC272_FIXUP_MARIO, .name = "mario"},
  17555. {}
  17556. };
  17557. static int patch_alc662(struct hda_codec *codec)
  17558. {
  17559. struct alc_spec *spec;
  17560. int err, board_config;
  17561. int coef;
  17562. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  17563. if (!spec)
  17564. return -ENOMEM;
  17565. codec->spec = spec;
  17566. alc_auto_parse_customize_define(codec);
  17567. alc_fix_pll_init(codec, 0x20, 0x04, 15);
  17568. coef = alc_read_coef_idx(codec, 0);
  17569. if (coef == 0x8020 || coef == 0x8011)
  17570. alc_codec_rename(codec, "ALC661");
  17571. else if (coef & (1 << 14) &&
  17572. codec->bus->pci->subsystem_vendor == 0x1025 &&
  17573. spec->cdefine.platform_type == 1)
  17574. alc_codec_rename(codec, "ALC272X");
  17575. else if (coef == 0x4011)
  17576. alc_codec_rename(codec, "ALC656");
  17577. board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
  17578. alc662_models,
  17579. alc662_cfg_tbl);
  17580. if (board_config < 0) {
  17581. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  17582. codec->chip_name);
  17583. board_config = ALC662_AUTO;
  17584. }
  17585. if (board_config == ALC662_AUTO) {
  17586. alc_pick_fixup(codec, alc662_fixup_models,
  17587. alc662_fixup_tbl, alc662_fixups);
  17588. alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
  17589. /* automatic parse from the BIOS config */
  17590. err = alc662_parse_auto_config(codec);
  17591. if (err < 0) {
  17592. alc_free(codec);
  17593. return err;
  17594. } else if (!err) {
  17595. printk(KERN_INFO
  17596. "hda_codec: Cannot set up configuration "
  17597. "from BIOS. Using base mode...\n");
  17598. board_config = ALC662_3ST_2ch_DIG;
  17599. }
  17600. }
  17601. if (has_cdefine_beep(codec)) {
  17602. err = snd_hda_attach_beep_device(codec, 0x1);
  17603. if (err < 0) {
  17604. alc_free(codec);
  17605. return err;
  17606. }
  17607. }
  17608. if (board_config != ALC662_AUTO)
  17609. setup_preset(codec, &alc662_presets[board_config]);
  17610. spec->stream_analog_playback = &alc662_pcm_analog_playback;
  17611. spec->stream_analog_capture = &alc662_pcm_analog_capture;
  17612. spec->stream_digital_playback = &alc662_pcm_digital_playback;
  17613. spec->stream_digital_capture = &alc662_pcm_digital_capture;
  17614. if (!spec->adc_nids) {
  17615. spec->adc_nids = alc662_adc_nids;
  17616. spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
  17617. }
  17618. if (!spec->capsrc_nids)
  17619. spec->capsrc_nids = alc662_capsrc_nids;
  17620. if (!spec->cap_mixer)
  17621. set_capture_mixer(codec);
  17622. if (has_cdefine_beep(codec)) {
  17623. switch (codec->vendor_id) {
  17624. case 0x10ec0662:
  17625. set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
  17626. break;
  17627. case 0x10ec0272:
  17628. case 0x10ec0663:
  17629. case 0x10ec0665:
  17630. set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
  17631. break;
  17632. case 0x10ec0273:
  17633. set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
  17634. break;
  17635. }
  17636. }
  17637. spec->vmaster_nid = 0x02;
  17638. alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
  17639. codec->patch_ops = alc_patch_ops;
  17640. if (board_config == ALC662_AUTO)
  17641. spec->init_hook = alc662_auto_init;
  17642. alc_init_jacks(codec);
  17643. #ifdef CONFIG_SND_HDA_POWER_SAVE
  17644. if (!spec->loopback.amplist)
  17645. spec->loopback.amplist = alc662_loopbacks;
  17646. #endif
  17647. return 0;
  17648. }
  17649. static int patch_alc888(struct hda_codec *codec)
  17650. {
  17651. if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
  17652. kfree(codec->chip_name);
  17653. if (codec->vendor_id == 0x10ec0887)
  17654. codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL);
  17655. else
  17656. codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
  17657. if (!codec->chip_name) {
  17658. alc_free(codec);
  17659. return -ENOMEM;
  17660. }
  17661. return patch_alc662(codec);
  17662. }
  17663. return patch_alc882(codec);
  17664. }
  17665. /*
  17666. * ALC680 support
  17667. */
  17668. #define ALC680_DIGIN_NID ALC880_DIGIN_NID
  17669. #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
  17670. #define alc680_modes alc260_modes
  17671. static hda_nid_t alc680_dac_nids[3] = {
  17672. /* Lout1, Lout2, hp */
  17673. 0x02, 0x03, 0x04
  17674. };
  17675. static hda_nid_t alc680_adc_nids[3] = {
  17676. /* ADC0-2 */
  17677. /* DMIC, MIC, Line-in*/
  17678. 0x07, 0x08, 0x09
  17679. };
  17680. /*
  17681. * Analog capture ADC cgange
  17682. */
  17683. static void alc680_rec_autoswitch(struct hda_codec *codec)
  17684. {
  17685. struct alc_spec *spec = codec->spec;
  17686. struct auto_pin_cfg *cfg = &spec->autocfg;
  17687. int pin_found = 0;
  17688. int type_found = AUTO_PIN_LAST;
  17689. hda_nid_t nid;
  17690. int i;
  17691. for (i = 0; i < cfg->num_inputs; i++) {
  17692. nid = cfg->inputs[i].pin;
  17693. if (!(snd_hda_query_pin_caps(codec, nid) &
  17694. AC_PINCAP_PRES_DETECT))
  17695. continue;
  17696. if (snd_hda_jack_detect(codec, nid)) {
  17697. if (cfg->inputs[i].type < type_found) {
  17698. type_found = cfg->inputs[i].type;
  17699. pin_found = nid;
  17700. }
  17701. }
  17702. }
  17703. nid = 0x07;
  17704. if (pin_found)
  17705. snd_hda_get_connections(codec, pin_found, &nid, 1);
  17706. if (nid != spec->cur_adc)
  17707. __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
  17708. spec->cur_adc = nid;
  17709. snd_hda_codec_setup_stream(codec, nid, spec->cur_adc_stream_tag, 0,
  17710. spec->cur_adc_format);
  17711. }
  17712. static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
  17713. struct hda_codec *codec,
  17714. unsigned int stream_tag,
  17715. unsigned int format,
  17716. struct snd_pcm_substream *substream)
  17717. {
  17718. struct alc_spec *spec = codec->spec;
  17719. spec->cur_adc = 0x07;
  17720. spec->cur_adc_stream_tag = stream_tag;
  17721. spec->cur_adc_format = format;
  17722. alc680_rec_autoswitch(codec);
  17723. return 0;
  17724. }
  17725. static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
  17726. struct hda_codec *codec,
  17727. struct snd_pcm_substream *substream)
  17728. {
  17729. snd_hda_codec_cleanup_stream(codec, 0x07);
  17730. snd_hda_codec_cleanup_stream(codec, 0x08);
  17731. snd_hda_codec_cleanup_stream(codec, 0x09);
  17732. return 0;
  17733. }
  17734. static struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
  17735. .substreams = 1, /* can be overridden */
  17736. .channels_min = 2,
  17737. .channels_max = 2,
  17738. /* NID is set in alc_build_pcms */
  17739. .ops = {
  17740. .prepare = alc680_capture_pcm_prepare,
  17741. .cleanup = alc680_capture_pcm_cleanup
  17742. },
  17743. };
  17744. static struct snd_kcontrol_new alc680_base_mixer[] = {
  17745. /* output mixer control */
  17746. HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
  17747. HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
  17748. HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
  17749. HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
  17750. HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x12, 0, HDA_INPUT),
  17751. HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
  17752. HDA_CODEC_VOLUME("Line In Boost Volume", 0x19, 0, HDA_INPUT),
  17753. { }
  17754. };
  17755. static struct hda_bind_ctls alc680_bind_cap_vol = {
  17756. .ops = &snd_hda_bind_vol,
  17757. .values = {
  17758. HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
  17759. HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
  17760. HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
  17761. 0
  17762. },
  17763. };
  17764. static struct hda_bind_ctls alc680_bind_cap_switch = {
  17765. .ops = &snd_hda_bind_sw,
  17766. .values = {
  17767. HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
  17768. HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
  17769. HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
  17770. 0
  17771. },
  17772. };
  17773. static struct snd_kcontrol_new alc680_master_capture_mixer[] = {
  17774. HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol),
  17775. HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch),
  17776. { } /* end */
  17777. };
  17778. /*
  17779. * generic initialization of ADC, input mixers and output mixers
  17780. */
  17781. static struct hda_verb alc680_init_verbs[] = {
  17782. {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  17783. {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  17784. {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
  17785. {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  17786. {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  17787. {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
  17788. {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
  17789. {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
  17790. {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
  17791. {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  17792. {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  17793. {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  17794. {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  17795. {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
  17796. {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
  17797. {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  17798. {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
  17799. { }
  17800. };
  17801. /* toggle speaker-output according to the hp-jack state */
  17802. static void alc680_base_setup(struct hda_codec *codec)
  17803. {
  17804. struct alc_spec *spec = codec->spec;
  17805. spec->autocfg.hp_pins[0] = 0x16;
  17806. spec->autocfg.speaker_pins[0] = 0x14;
  17807. spec->autocfg.speaker_pins[1] = 0x15;
  17808. spec->autocfg.num_inputs = 2;
  17809. spec->autocfg.inputs[0].pin = 0x18;
  17810. spec->autocfg.inputs[0].type = AUTO_PIN_MIC;
  17811. spec->autocfg.inputs[1].pin = 0x19;
  17812. spec->autocfg.inputs[1].type = AUTO_PIN_LINE_IN;
  17813. }
  17814. static void alc680_unsol_event(struct hda_codec *codec,
  17815. unsigned int res)
  17816. {
  17817. if ((res >> 26) == ALC880_HP_EVENT)
  17818. alc_automute_amp(codec);
  17819. if ((res >> 26) == ALC880_MIC_EVENT)
  17820. alc680_rec_autoswitch(codec);
  17821. }
  17822. static void alc680_inithook(struct hda_codec *codec)
  17823. {
  17824. alc_automute_amp(codec);
  17825. alc680_rec_autoswitch(codec);
  17826. }
  17827. /* create input playback/capture controls for the given pin */
  17828. static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
  17829. const char *ctlname, int idx)
  17830. {
  17831. hda_nid_t dac;
  17832. int err;
  17833. switch (nid) {
  17834. case 0x14:
  17835. dac = 0x02;
  17836. break;
  17837. case 0x15:
  17838. dac = 0x03;
  17839. break;
  17840. case 0x16:
  17841. dac = 0x04;
  17842. break;
  17843. default:
  17844. return 0;
  17845. }
  17846. if (spec->multiout.dac_nids[0] != dac &&
  17847. spec->multiout.dac_nids[1] != dac) {
  17848. err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
  17849. HDA_COMPOSE_AMP_VAL(dac, 3, idx,
  17850. HDA_OUTPUT));
  17851. if (err < 0)
  17852. return err;
  17853. err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
  17854. HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
  17855. if (err < 0)
  17856. return err;
  17857. spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
  17858. }
  17859. return 0;
  17860. }
  17861. /* add playback controls from the parsed DAC table */
  17862. static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec,
  17863. const struct auto_pin_cfg *cfg)
  17864. {
  17865. hda_nid_t nid;
  17866. int err;
  17867. spec->multiout.dac_nids = spec->private_dac_nids;
  17868. nid = cfg->line_out_pins[0];
  17869. if (nid) {
  17870. const char *name;
  17871. if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
  17872. name = "Speaker";
  17873. else
  17874. name = "Front";
  17875. err = alc680_new_analog_output(spec, nid, name, 0);
  17876. if (err < 0)
  17877. return err;
  17878. }
  17879. nid = cfg->speaker_pins[0];
  17880. if (nid) {
  17881. err = alc680_new_analog_output(spec, nid, "Speaker", 0);
  17882. if (err < 0)
  17883. return err;
  17884. }
  17885. nid = cfg->hp_pins[0];
  17886. if (nid) {
  17887. err = alc680_new_analog_output(spec, nid, "Headphone", 0);
  17888. if (err < 0)
  17889. return err;
  17890. }
  17891. return 0;
  17892. }
  17893. static void alc680_auto_set_output_and_unmute(struct hda_codec *codec,
  17894. hda_nid_t nid, int pin_type)
  17895. {
  17896. alc_set_pin_output(codec, nid, pin_type);
  17897. }
  17898. static void alc680_auto_init_multi_out(struct hda_codec *codec)
  17899. {
  17900. struct alc_spec *spec = codec->spec;
  17901. hda_nid_t nid = spec->autocfg.line_out_pins[0];
  17902. if (nid) {
  17903. int pin_type = get_pin_type(spec->autocfg.line_out_type);
  17904. alc680_auto_set_output_and_unmute(codec, nid, pin_type);
  17905. }
  17906. }
  17907. static void alc680_auto_init_hp_out(struct hda_codec *codec)
  17908. {
  17909. struct alc_spec *spec = codec->spec;
  17910. hda_nid_t pin;
  17911. pin = spec->autocfg.hp_pins[0];
  17912. if (pin)
  17913. alc680_auto_set_output_and_unmute(codec, pin, PIN_HP);
  17914. pin = spec->autocfg.speaker_pins[0];
  17915. if (pin)
  17916. alc680_auto_set_output_and_unmute(codec, pin, PIN_OUT);
  17917. }
  17918. /* pcm configuration: identical with ALC880 */
  17919. #define alc680_pcm_analog_playback alc880_pcm_analog_playback
  17920. #define alc680_pcm_analog_capture alc880_pcm_analog_capture
  17921. #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
  17922. #define alc680_pcm_digital_playback alc880_pcm_digital_playback
  17923. #define alc680_pcm_digital_capture alc880_pcm_digital_capture
  17924. /*
  17925. * BIOS auto configuration
  17926. */
  17927. static int alc680_parse_auto_config(struct hda_codec *codec)
  17928. {
  17929. struct alc_spec *spec = codec->spec;
  17930. int err;
  17931. static hda_nid_t alc680_ignore[] = { 0 };
  17932. err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
  17933. alc680_ignore);
  17934. if (err < 0)
  17935. return err;
  17936. if (!spec->autocfg.line_outs) {
  17937. if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
  17938. spec->multiout.max_channels = 2;
  17939. spec->no_analog = 1;
  17940. goto dig_only;
  17941. }
  17942. return 0; /* can't find valid BIOS pin config */
  17943. }
  17944. err = alc680_auto_create_multi_out_ctls(spec, &spec->autocfg);
  17945. if (err < 0)
  17946. return err;
  17947. spec->multiout.max_channels = 2;
  17948. dig_only:
  17949. /* digital only support output */
  17950. alc_auto_parse_digital(codec);
  17951. if (spec->kctls.list)
  17952. add_mixer(spec, spec->kctls.list);
  17953. add_verb(spec, alc680_init_verbs);
  17954. err = alc_auto_add_mic_boost(codec);
  17955. if (err < 0)
  17956. return err;
  17957. return 1;
  17958. }
  17959. #define alc680_auto_init_analog_input alc882_auto_init_analog_input
  17960. /* init callback for auto-configuration model -- overriding the default init */
  17961. static void alc680_auto_init(struct hda_codec *codec)
  17962. {
  17963. struct alc_spec *spec = codec->spec;
  17964. alc680_auto_init_multi_out(codec);
  17965. alc680_auto_init_hp_out(codec);
  17966. alc680_auto_init_analog_input(codec);
  17967. alc_auto_init_digital(codec);
  17968. if (spec->unsol_event)
  17969. alc_inithook(codec);
  17970. }
  17971. /*
  17972. * configuration and preset
  17973. */
  17974. static const char * const alc680_models[ALC680_MODEL_LAST] = {
  17975. [ALC680_BASE] = "base",
  17976. [ALC680_AUTO] = "auto",
  17977. };
  17978. static struct snd_pci_quirk alc680_cfg_tbl[] = {
  17979. SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE),
  17980. {}
  17981. };
  17982. static struct alc_config_preset alc680_presets[] = {
  17983. [ALC680_BASE] = {
  17984. .mixers = { alc680_base_mixer },
  17985. .cap_mixer = alc680_master_capture_mixer,
  17986. .init_verbs = { alc680_init_verbs },
  17987. .num_dacs = ARRAY_SIZE(alc680_dac_nids),
  17988. .dac_nids = alc680_dac_nids,
  17989. .dig_out_nid = ALC680_DIGOUT_NID,
  17990. .num_channel_mode = ARRAY_SIZE(alc680_modes),
  17991. .channel_mode = alc680_modes,
  17992. .unsol_event = alc680_unsol_event,
  17993. .setup = alc680_base_setup,
  17994. .init_hook = alc680_inithook,
  17995. },
  17996. };
  17997. static int patch_alc680(struct hda_codec *codec)
  17998. {
  17999. struct alc_spec *spec;
  18000. int board_config;
  18001. int err;
  18002. spec = kzalloc(sizeof(*spec), GFP_KERNEL);
  18003. if (spec == NULL)
  18004. return -ENOMEM;
  18005. codec->spec = spec;
  18006. board_config = snd_hda_check_board_config(codec, ALC680_MODEL_LAST,
  18007. alc680_models,
  18008. alc680_cfg_tbl);
  18009. if (board_config < 0 || board_config >= ALC680_MODEL_LAST) {
  18010. printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
  18011. codec->chip_name);
  18012. board_config = ALC680_AUTO;
  18013. }
  18014. if (board_config == ALC680_AUTO) {
  18015. /* automatic parse from the BIOS config */
  18016. err = alc680_parse_auto_config(codec);
  18017. if (err < 0) {
  18018. alc_free(codec);
  18019. return err;
  18020. } else if (!err) {
  18021. printk(KERN_INFO
  18022. "hda_codec: Cannot set up configuration "
  18023. "from BIOS. Using base mode...\n");
  18024. board_config = ALC680_BASE;
  18025. }
  18026. }
  18027. if (board_config != ALC680_AUTO)
  18028. setup_preset(codec, &alc680_presets[board_config]);
  18029. spec->stream_analog_playback = &alc680_pcm_analog_playback;
  18030. spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
  18031. spec->stream_digital_playback = &alc680_pcm_digital_playback;
  18032. spec->stream_digital_capture = &alc680_pcm_digital_capture;
  18033. if (!spec->adc_nids) {
  18034. spec->adc_nids = alc680_adc_nids;
  18035. spec->num_adc_nids = ARRAY_SIZE(alc680_adc_nids);
  18036. }
  18037. if (!spec->cap_mixer)
  18038. set_capture_mixer(codec);
  18039. spec->vmaster_nid = 0x02;
  18040. codec->patch_ops = alc_patch_ops;
  18041. if (board_config == ALC680_AUTO)
  18042. spec->init_hook = alc680_auto_init;
  18043. return 0;
  18044. }
  18045. /*
  18046. * patch entries
  18047. */
  18048. static struct hda_codec_preset snd_hda_preset_realtek[] = {
  18049. { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
  18050. { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
  18051. { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
  18052. { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
  18053. { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
  18054. { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
  18055. { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
  18056. { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
  18057. { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
  18058. .patch = patch_alc861 },
  18059. { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
  18060. { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
  18061. { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
  18062. { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
  18063. .patch = patch_alc882 },
  18064. { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
  18065. .patch = patch_alc662 },
  18066. { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
  18067. { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
  18068. { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
  18069. { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
  18070. { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
  18071. { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
  18072. { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
  18073. { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
  18074. .patch = patch_alc882 },
  18075. { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
  18076. .patch = patch_alc882 },
  18077. { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
  18078. { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 },
  18079. { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
  18080. .patch = patch_alc882 },
  18081. { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
  18082. { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
  18083. { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
  18084. {} /* terminator */
  18085. };
  18086. MODULE_ALIAS("snd-hda-codec-id:10ec*");
  18087. MODULE_LICENSE("GPL");
  18088. MODULE_DESCRIPTION("Realtek HD-audio codec");
  18089. static struct hda_codec_preset_list realtek_list = {
  18090. .preset = snd_hda_preset_realtek,
  18091. .owner = THIS_MODULE,
  18092. };
  18093. static int __init patch_realtek_init(void)
  18094. {
  18095. return snd_hda_add_codec_preset(&realtek_list);
  18096. }
  18097. static void __exit patch_realtek_exit(void)
  18098. {
  18099. snd_hda_delete_codec_preset(&realtek_list);
  18100. }
  18101. module_init(patch_realtek_init)
  18102. module_exit(patch_realtek_exit)