cs4281m.c 128 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506
  1. /*******************************************************************************
  2. *
  3. * "cs4281.c" -- Cirrus Logic-Crystal CS4281 linux audio driver.
  4. *
  5. * Copyright (C) 2000,2001 Cirrus Logic Corp.
  6. * -- adapted from drivers by Thomas Sailer,
  7. * -- but don't bug him; Problems should go to:
  8. * -- tom woller (twoller@crystal.cirrus.com) or
  9. * (audio@crystal.cirrus.com).
  10. *
  11. * This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
  24. *
  25. * Module command line parameters:
  26. * none
  27. *
  28. * Supported devices:
  29. * /dev/dsp standard /dev/dsp device, (mostly) OSS compatible
  30. * /dev/mixer standard /dev/mixer device, (mostly) OSS compatible
  31. * /dev/midi simple MIDI UART interface, no ioctl
  32. *
  33. * Modification History
  34. * 08/20/00 trw - silence and no stopping DAC until release
  35. * 08/23/00 trw - added CS_DBG statements, fix interrupt hang issue on DAC stop.
  36. * 09/18/00 trw - added 16bit only record with conversion
  37. * 09/24/00 trw - added Enhanced Full duplex (separate simultaneous
  38. * capture/playback rates)
  39. * 10/03/00 trw - fixed mmap (fixed GRECORD and the XMMS mmap test plugin
  40. * libOSSm.so)
  41. * 10/11/00 trw - modified for 2.4.0-test9 kernel enhancements (NR_MAP removal)
  42. * 11/03/00 trw - fixed interrupt loss/stutter, added debug.
  43. * 11/10/00 bkz - added __devinit to cs4281_hw_init()
  44. * 11/10/00 trw - fixed SMP and capture spinlock hang.
  45. * 12/04/00 trw - cleaned up CSDEBUG flags and added "defaultorder" moduleparm.
  46. * 12/05/00 trw - fixed polling (myth2), and added underrun swptr fix.
  47. * 12/08/00 trw - added PM support.
  48. * 12/14/00 trw - added wrapper code, builds under 2.4.0, 2.2.17-20, 2.2.17-8
  49. * (RH/Dell base), 2.2.18, 2.2.12. cleaned up code mods by ident.
  50. * 12/19/00 trw - added PM support for 2.2 base (apm_callback). other PM cleanup.
  51. * 12/21/00 trw - added fractional "defaultorder" inputs. if >100 then use
  52. * defaultorder-100 as power of 2 for the buffer size. example:
  53. * 106 = 2^(106-100) = 2^6 = 64 bytes for the buffer size.
  54. *
  55. *******************************************************************************/
  56. /* uncomment the following line to disable building PM support into the driver */
  57. //#define NOT_CS4281_PM 1
  58. #include <linux/list.h>
  59. #include <linux/module.h>
  60. #include <linux/string.h>
  61. #include <linux/ioport.h>
  62. #include <linux/sched.h>
  63. #include <linux/delay.h>
  64. #include <linux/sound.h>
  65. #include <linux/slab.h>
  66. #include <linux/soundcard.h>
  67. #include <linux/pci.h>
  68. #include <linux/bitops.h>
  69. #include <linux/init.h>
  70. #include <linux/interrupt.h>
  71. #include <linux/poll.h>
  72. #include <linux/fs.h>
  73. #include <linux/wait.h>
  74. #include <asm/current.h>
  75. #include <asm/io.h>
  76. #include <asm/dma.h>
  77. #include <asm/page.h>
  78. #include <asm/uaccess.h>
  79. //#include "cs_dm.h"
  80. #include "cs4281_hwdefs.h"
  81. #include "cs4281pm.h"
  82. struct cs4281_state;
  83. static void stop_dac(struct cs4281_state *s);
  84. static void stop_adc(struct cs4281_state *s);
  85. static void start_dac(struct cs4281_state *s);
  86. static void start_adc(struct cs4281_state *s);
  87. #undef OSS_DOCUMENTED_MIXER_SEMANTICS
  88. // ---------------------------------------------------------------------
  89. #ifndef PCI_VENDOR_ID_CIRRUS
  90. #define PCI_VENDOR_ID_CIRRUS 0x1013
  91. #endif
  92. #ifndef PCI_DEVICE_ID_CRYSTAL_CS4281
  93. #define PCI_DEVICE_ID_CRYSTAL_CS4281 0x6005
  94. #endif
  95. #define CS4281_MAGIC ((PCI_DEVICE_ID_CRYSTAL_CS4281<<16) | PCI_VENDOR_ID_CIRRUS)
  96. #define CS4281_CFLR_DEFAULT 0x00000001 /* CFLR must be in AC97 link mode */
  97. // buffer order determines the size of the dma buffer for the driver.
  98. // under Linux, a smaller buffer allows more responsiveness from many of the
  99. // applications (e.g. games). A larger buffer allows some of the apps (esound)
  100. // to not underrun the dma buffer as easily. As default, use 32k (order=3)
  101. // rather than 64k as some of the games work more responsively.
  102. // log base 2( buff sz = 32k).
  103. static unsigned long defaultorder = 3;
  104. module_param(defaultorder, ulong, 0);
  105. //
  106. // Turn on/off debugging compilation by commenting out "#define CSDEBUG"
  107. //
  108. #define CSDEBUG 1
  109. #if CSDEBUG
  110. #define CSDEBUG_INTERFACE 1
  111. #else
  112. #undef CSDEBUG_INTERFACE
  113. #endif
  114. //
  115. // cs_debugmask areas
  116. //
  117. #define CS_INIT 0x00000001 // initialization and probe functions
  118. #define CS_ERROR 0x00000002 // tmp debugging bit placeholder
  119. #define CS_INTERRUPT 0x00000004 // interrupt handler (separate from all other)
  120. #define CS_FUNCTION 0x00000008 // enter/leave functions
  121. #define CS_WAVE_WRITE 0x00000010 // write information for wave
  122. #define CS_WAVE_READ 0x00000020 // read information for wave
  123. #define CS_MIDI_WRITE 0x00000040 // write information for midi
  124. #define CS_MIDI_READ 0x00000080 // read information for midi
  125. #define CS_MPU401_WRITE 0x00000100 // write information for mpu401
  126. #define CS_MPU401_READ 0x00000200 // read information for mpu401
  127. #define CS_OPEN 0x00000400 // all open functions in the driver
  128. #define CS_RELEASE 0x00000800 // all release functions in the driver
  129. #define CS_PARMS 0x00001000 // functional and operational parameters
  130. #define CS_IOCTL 0x00002000 // ioctl (non-mixer)
  131. #define CS_PM 0x00004000 // power management
  132. #define CS_TMP 0x10000000 // tmp debug mask bit
  133. #define CS_IOCTL_CMD_SUSPEND 0x1 // suspend
  134. #define CS_IOCTL_CMD_RESUME 0x2 // resume
  135. //
  136. // CSDEBUG is usual mode is set to 1, then use the
  137. // cs_debuglevel and cs_debugmask to turn on or off debugging.
  138. // Debug level of 1 has been defined to be kernel errors and info
  139. // that should be printed on any released driver.
  140. //
  141. #if CSDEBUG
  142. #define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask) ) {x;}
  143. #else
  144. #define CS_DBGOUT(mask,level,x)
  145. #endif
  146. #if CSDEBUG
  147. static unsigned long cs_debuglevel = 1; // levels range from 1-9
  148. static unsigned long cs_debugmask = CS_INIT | CS_ERROR; // use CS_DBGOUT with various mask values
  149. module_param(cs_debuglevel, ulong, 0);
  150. module_param(cs_debugmask, ulong, 0);
  151. #endif
  152. #define CS_TRUE 1
  153. #define CS_FALSE 0
  154. // MIDI buffer sizes
  155. #define MIDIINBUF 500
  156. #define MIDIOUTBUF 500
  157. #define FMODE_MIDI_SHIFT 3
  158. #define FMODE_MIDI_READ (FMODE_READ << FMODE_MIDI_SHIFT)
  159. #define FMODE_MIDI_WRITE (FMODE_WRITE << FMODE_MIDI_SHIFT)
  160. #define CS4281_MAJOR_VERSION 1
  161. #define CS4281_MINOR_VERSION 13
  162. #ifdef __ia64__
  163. #define CS4281_ARCH 64 //architecture key
  164. #else
  165. #define CS4281_ARCH 32 //architecture key
  166. #endif
  167. #define CS_TYPE_ADC 0
  168. #define CS_TYPE_DAC 1
  169. static const char invalid_magic[] =
  170. KERN_CRIT "cs4281: invalid magic value\n";
  171. #define VALIDATE_STATE(s) \
  172. ({ \
  173. if (!(s) || (s)->magic != CS4281_MAGIC) { \
  174. printk(invalid_magic); \
  175. return -ENXIO; \
  176. } \
  177. })
  178. //LIST_HEAD(cs4281_devs);
  179. static struct list_head cs4281_devs = { &cs4281_devs, &cs4281_devs };
  180. struct cs4281_state;
  181. #include "cs4281_wrapper-24.c"
  182. struct cs4281_state {
  183. // magic
  184. unsigned int magic;
  185. // we keep the cards in a linked list
  186. struct cs4281_state *next;
  187. // pcidev is needed to turn off the DDMA controller at driver shutdown
  188. struct pci_dev *pcidev;
  189. struct list_head list;
  190. // soundcore stuff
  191. int dev_audio;
  192. int dev_mixer;
  193. int dev_midi;
  194. // hardware resources
  195. unsigned int pBA0phys, pBA1phys;
  196. char __iomem *pBA0;
  197. char __iomem *pBA1;
  198. unsigned int irq;
  199. // mixer registers
  200. struct {
  201. unsigned short vol[10];
  202. unsigned int recsrc;
  203. unsigned int modcnt;
  204. unsigned short micpreamp;
  205. } mix;
  206. // wave stuff
  207. struct properties {
  208. unsigned fmt;
  209. unsigned fmt_original; // original requested format
  210. unsigned channels;
  211. unsigned rate;
  212. unsigned char clkdiv;
  213. } prop_dac, prop_adc;
  214. unsigned conversion:1; // conversion from 16 to 8 bit in progress
  215. void *tmpbuff; // tmp buffer for sample conversions
  216. unsigned ena;
  217. spinlock_t lock;
  218. struct semaphore open_sem;
  219. struct semaphore open_sem_adc;
  220. struct semaphore open_sem_dac;
  221. mode_t open_mode;
  222. wait_queue_head_t open_wait;
  223. wait_queue_head_t open_wait_adc;
  224. wait_queue_head_t open_wait_dac;
  225. dma_addr_t dmaaddr_tmpbuff;
  226. unsigned buforder_tmpbuff; // Log base 2 of 'rawbuf' size in bytes..
  227. struct dmabuf {
  228. void *rawbuf; // Physical address of
  229. dma_addr_t dmaaddr;
  230. unsigned buforder; // Log base 2 of 'rawbuf' size in bytes..
  231. unsigned numfrag; // # of 'fragments' in the buffer.
  232. unsigned fragshift; // Log base 2 of fragment size.
  233. unsigned hwptr, swptr;
  234. unsigned total_bytes; // # bytes process since open.
  235. unsigned blocks; // last returned blocks value GETOPTR
  236. unsigned wakeup; // interrupt occurred on block
  237. int count;
  238. unsigned underrun; // underrun flag
  239. unsigned error; // over/underrun
  240. wait_queue_head_t wait;
  241. // redundant, but makes calculations easier
  242. unsigned fragsize; // 2**fragshift..
  243. unsigned dmasize; // 2**buforder.
  244. unsigned fragsamples;
  245. // OSS stuff
  246. unsigned mapped:1; // Buffer mapped in cs4281_mmap()?
  247. unsigned ready:1; // prog_dmabuf_dac()/adc() successful?
  248. unsigned endcleared:1;
  249. unsigned type:1; // adc or dac buffer (CS_TYPE_XXX)
  250. unsigned ossfragshift;
  251. int ossmaxfrags;
  252. unsigned subdivision;
  253. } dma_dac, dma_adc;
  254. // midi stuff
  255. struct {
  256. unsigned ird, iwr, icnt;
  257. unsigned ord, owr, ocnt;
  258. wait_queue_head_t iwait;
  259. wait_queue_head_t owait;
  260. struct timer_list timer;
  261. unsigned char ibuf[MIDIINBUF];
  262. unsigned char obuf[MIDIOUTBUF];
  263. } midi;
  264. struct cs4281_pm pm;
  265. struct cs4281_pipeline pl[CS4281_NUMBER_OF_PIPELINES];
  266. };
  267. #include <linux/pm_legacy.h>
  268. #include "cs4281pm-24.c"
  269. #if CSDEBUG
  270. // DEBUG ROUTINES
  271. #define SOUND_MIXER_CS_GETDBGLEVEL _SIOWR('M',120, int)
  272. #define SOUND_MIXER_CS_SETDBGLEVEL _SIOWR('M',121, int)
  273. #define SOUND_MIXER_CS_GETDBGMASK _SIOWR('M',122, int)
  274. #define SOUND_MIXER_CS_SETDBGMASK _SIOWR('M',123, int)
  275. #define SOUND_MIXER_CS_APM _SIOWR('M',124, int)
  276. static void cs_printioctl(unsigned int x)
  277. {
  278. unsigned int i;
  279. unsigned char vidx;
  280. // Index of mixtable1[] member is Device ID
  281. // and must be <= SOUND_MIXER_NRDEVICES.
  282. // Value of array member is index into s->mix.vol[]
  283. static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
  284. [SOUND_MIXER_PCM] = 1, // voice
  285. [SOUND_MIXER_LINE1] = 2, // AUX
  286. [SOUND_MIXER_CD] = 3, // CD
  287. [SOUND_MIXER_LINE] = 4, // Line
  288. [SOUND_MIXER_SYNTH] = 5, // FM
  289. [SOUND_MIXER_MIC] = 6, // Mic
  290. [SOUND_MIXER_SPEAKER] = 7, // Speaker
  291. [SOUND_MIXER_RECLEV] = 8, // Recording level
  292. [SOUND_MIXER_VOLUME] = 9 // Master Volume
  293. };
  294. switch (x) {
  295. case SOUND_MIXER_CS_GETDBGMASK:
  296. CS_DBGOUT(CS_IOCTL, 4,
  297. printk("SOUND_MIXER_CS_GETDBGMASK:\n"));
  298. break;
  299. case SOUND_MIXER_CS_GETDBGLEVEL:
  300. CS_DBGOUT(CS_IOCTL, 4,
  301. printk("SOUND_MIXER_CS_GETDBGLEVEL:\n"));
  302. break;
  303. case SOUND_MIXER_CS_SETDBGMASK:
  304. CS_DBGOUT(CS_IOCTL, 4,
  305. printk("SOUND_MIXER_CS_SETDBGMASK:\n"));
  306. break;
  307. case SOUND_MIXER_CS_SETDBGLEVEL:
  308. CS_DBGOUT(CS_IOCTL, 4,
  309. printk("SOUND_MIXER_CS_SETDBGLEVEL:\n"));
  310. break;
  311. case OSS_GETVERSION:
  312. CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION:\n"));
  313. break;
  314. case SNDCTL_DSP_SYNC:
  315. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC:\n"));
  316. break;
  317. case SNDCTL_DSP_SETDUPLEX:
  318. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX:\n"));
  319. break;
  320. case SNDCTL_DSP_GETCAPS:
  321. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS:\n"));
  322. break;
  323. case SNDCTL_DSP_RESET:
  324. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET:\n"));
  325. break;
  326. case SNDCTL_DSP_SPEED:
  327. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED:\n"));
  328. break;
  329. case SNDCTL_DSP_STEREO:
  330. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO:\n"));
  331. break;
  332. case SNDCTL_DSP_CHANNELS:
  333. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS:\n"));
  334. break;
  335. case SNDCTL_DSP_GETFMTS:
  336. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS:\n"));
  337. break;
  338. case SNDCTL_DSP_SETFMT:
  339. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT:\n"));
  340. break;
  341. case SNDCTL_DSP_POST:
  342. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST:\n"));
  343. break;
  344. case SNDCTL_DSP_GETTRIGGER:
  345. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER:\n"));
  346. break;
  347. case SNDCTL_DSP_SETTRIGGER:
  348. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER:\n"));
  349. break;
  350. case SNDCTL_DSP_GETOSPACE:
  351. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE:\n"));
  352. break;
  353. case SNDCTL_DSP_GETISPACE:
  354. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE:\n"));
  355. break;
  356. case SNDCTL_DSP_NONBLOCK:
  357. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK:\n"));
  358. break;
  359. case SNDCTL_DSP_GETODELAY:
  360. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY:\n"));
  361. break;
  362. case SNDCTL_DSP_GETIPTR:
  363. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR:\n"));
  364. break;
  365. case SNDCTL_DSP_GETOPTR:
  366. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR:\n"));
  367. break;
  368. case SNDCTL_DSP_GETBLKSIZE:
  369. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE:\n"));
  370. break;
  371. case SNDCTL_DSP_SETFRAGMENT:
  372. CS_DBGOUT(CS_IOCTL, 4,
  373. printk("SNDCTL_DSP_SETFRAGMENT:\n"));
  374. break;
  375. case SNDCTL_DSP_SUBDIVIDE:
  376. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE:\n"));
  377. break;
  378. case SOUND_PCM_READ_RATE:
  379. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE:\n"));
  380. break;
  381. case SOUND_PCM_READ_CHANNELS:
  382. CS_DBGOUT(CS_IOCTL, 4,
  383. printk("SOUND_PCM_READ_CHANNELS:\n"));
  384. break;
  385. case SOUND_PCM_READ_BITS:
  386. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS:\n"));
  387. break;
  388. case SOUND_PCM_WRITE_FILTER:
  389. CS_DBGOUT(CS_IOCTL, 4,
  390. printk("SOUND_PCM_WRITE_FILTER:\n"));
  391. break;
  392. case SNDCTL_DSP_SETSYNCRO:
  393. CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO:\n"));
  394. break;
  395. case SOUND_PCM_READ_FILTER:
  396. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER:\n"));
  397. break;
  398. case SOUND_MIXER_PRIVATE1:
  399. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1:\n"));
  400. break;
  401. case SOUND_MIXER_PRIVATE2:
  402. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2:\n"));
  403. break;
  404. case SOUND_MIXER_PRIVATE3:
  405. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3:\n"));
  406. break;
  407. case SOUND_MIXER_PRIVATE4:
  408. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4:\n"));
  409. break;
  410. case SOUND_MIXER_PRIVATE5:
  411. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5:\n"));
  412. break;
  413. case SOUND_MIXER_INFO:
  414. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO:\n"));
  415. break;
  416. case SOUND_OLD_MIXER_INFO:
  417. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO:\n"));
  418. break;
  419. default:
  420. switch (_IOC_NR(x)) {
  421. case SOUND_MIXER_VOLUME:
  422. CS_DBGOUT(CS_IOCTL, 4,
  423. printk("SOUND_MIXER_VOLUME:\n"));
  424. break;
  425. case SOUND_MIXER_SPEAKER:
  426. CS_DBGOUT(CS_IOCTL, 4,
  427. printk("SOUND_MIXER_SPEAKER:\n"));
  428. break;
  429. case SOUND_MIXER_RECLEV:
  430. CS_DBGOUT(CS_IOCTL, 4,
  431. printk("SOUND_MIXER_RECLEV:\n"));
  432. break;
  433. case SOUND_MIXER_MIC:
  434. CS_DBGOUT(CS_IOCTL, 4,
  435. printk("SOUND_MIXER_MIC:\n"));
  436. break;
  437. case SOUND_MIXER_SYNTH:
  438. CS_DBGOUT(CS_IOCTL, 4,
  439. printk("SOUND_MIXER_SYNTH:\n"));
  440. break;
  441. case SOUND_MIXER_RECSRC:
  442. CS_DBGOUT(CS_IOCTL, 4,
  443. printk("SOUND_MIXER_RECSRC:\n"));
  444. break;
  445. case SOUND_MIXER_DEVMASK:
  446. CS_DBGOUT(CS_IOCTL, 4,
  447. printk("SOUND_MIXER_DEVMASK:\n"));
  448. break;
  449. case SOUND_MIXER_RECMASK:
  450. CS_DBGOUT(CS_IOCTL, 4,
  451. printk("SOUND_MIXER_RECMASK:\n"));
  452. break;
  453. case SOUND_MIXER_STEREODEVS:
  454. CS_DBGOUT(CS_IOCTL, 4,
  455. printk("SOUND_MIXER_STEREODEVS:\n"));
  456. break;
  457. case SOUND_MIXER_CAPS:
  458. CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:\n"));
  459. break;
  460. default:
  461. i = _IOC_NR(x);
  462. if (i >= SOUND_MIXER_NRDEVICES
  463. || !(vidx = mixtable1[i])) {
  464. CS_DBGOUT(CS_IOCTL, 4, printk
  465. ("UNKNOWN IOCTL: 0x%.8x NR=%d\n",
  466. x, i));
  467. } else {
  468. CS_DBGOUT(CS_IOCTL, 4, printk
  469. ("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d\n",
  470. x, i));
  471. }
  472. break;
  473. }
  474. }
  475. }
  476. #endif
  477. static int prog_dmabuf_adc(struct cs4281_state *s);
  478. static void prog_codec(struct cs4281_state *s, unsigned type);
  479. // ---------------------------------------------------------------------
  480. //
  481. // Hardware Interfaces For the CS4281
  482. //
  483. //******************************************************************************
  484. // "delayus()-- Delay for the specified # of microseconds.
  485. //******************************************************************************
  486. static void delayus(struct cs4281_state *s, u32 delay)
  487. {
  488. u32 j;
  489. if ((delay > 9999) && (s->pm.flags & CS4281_PM_IDLE)) {
  490. j = (delay * HZ) / 1000000; /* calculate delay in jiffies */
  491. if (j < 1)
  492. j = 1; /* minimum one jiffy. */
  493. current->state = TASK_UNINTERRUPTIBLE;
  494. schedule_timeout(j);
  495. } else
  496. udelay(delay);
  497. return;
  498. }
  499. //******************************************************************************
  500. // "cs4281_read_ac97" -- Reads a word from the specified location in the
  501. // CS4281's address space(based on the BA0 register).
  502. //
  503. // 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
  504. // 2. Write ACCDA = Command Data Register = 470h for data to write to AC97 register,
  505. // 0h for reads.
  506. // 3. Write ACCTL = Control Register = 460h for initiating the write
  507. // 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
  508. // 5. if DCV not cleared, break and return error
  509. // 6. Read ACSTS = Status Register = 464h, check VSTS bit
  510. //****************************************************************************
  511. static int cs4281_read_ac97(struct cs4281_state *card, u32 offset,
  512. u32 * value)
  513. {
  514. u32 count, status;
  515. // Make sure that there is not data sitting
  516. // around from a previous uncompleted access.
  517. // ACSDA = Status Data Register = 47Ch
  518. status = readl(card->pBA0 + BA0_ACSDA);
  519. // Setup the AC97 control registers on the CS4281 to send the
  520. // appropriate command to the AC97 to perform the read.
  521. // ACCAD = Command Address Register = 46Ch
  522. // ACCDA = Command Data Register = 470h
  523. // ACCTL = Control Register = 460h
  524. // bit DCV - will clear when process completed
  525. // bit CRW - Read command
  526. // bit VFRM - valid frame enabled
  527. // bit ESYN - ASYNC generation enabled
  528. // Get the actual AC97 register from the offset
  529. writel(offset - BA0_AC97_RESET, card->pBA0 + BA0_ACCAD);
  530. writel(0, card->pBA0 + BA0_ACCDA);
  531. writel(ACCTL_DCV | ACCTL_CRW | ACCTL_VFRM | ACCTL_ESYN,
  532. card->pBA0 + BA0_ACCTL);
  533. // Wait for the read to occur.
  534. for (count = 0; count < 10; count++) {
  535. // First, we want to wait for a short time.
  536. udelay(25);
  537. // Now, check to see if the read has completed.
  538. // ACCTL = 460h, DCV should be reset by now and 460h = 17h
  539. if (!(readl(card->pBA0 + BA0_ACCTL) & ACCTL_DCV))
  540. break;
  541. }
  542. // Make sure the read completed.
  543. if (readl(card->pBA0 + BA0_ACCTL) & ACCTL_DCV)
  544. return 1;
  545. // Wait for the valid status bit to go active.
  546. for (count = 0; count < 10; count++) {
  547. // Read the AC97 status register.
  548. // ACSTS = Status Register = 464h
  549. status = readl(card->pBA0 + BA0_ACSTS);
  550. // See if we have valid status.
  551. // VSTS - Valid Status
  552. if (status & ACSTS_VSTS)
  553. break;
  554. // Wait for a short while.
  555. udelay(25);
  556. }
  557. // Make sure we got valid status.
  558. if (!(status & ACSTS_VSTS))
  559. return 1;
  560. // Read the data returned from the AC97 register.
  561. // ACSDA = Status Data Register = 474h
  562. *value = readl(card->pBA0 + BA0_ACSDA);
  563. // Success.
  564. return (0);
  565. }
  566. //****************************************************************************
  567. //
  568. // "cs4281_write_ac97()"-- writes a word to the specified location in the
  569. // CS461x's address space (based on the part's base address zero register).
  570. //
  571. // 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
  572. // 2. Write ACCDA = Command Data Register = 470h for data to write to AC97 reg.
  573. // 3. Write ACCTL = Control Register = 460h for initiating the write
  574. // 4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
  575. // 5. if DCV not cleared, break and return error
  576. //
  577. //****************************************************************************
  578. static int cs4281_write_ac97(struct cs4281_state *card, u32 offset,
  579. u32 value)
  580. {
  581. u32 count, status=0;
  582. CS_DBGOUT(CS_FUNCTION, 2,
  583. printk(KERN_INFO "cs4281: cs_4281_write_ac97()+ \n"));
  584. // Setup the AC97 control registers on the CS4281 to send the
  585. // appropriate command to the AC97 to perform the read.
  586. // ACCAD = Command Address Register = 46Ch
  587. // ACCDA = Command Data Register = 470h
  588. // ACCTL = Control Register = 460h
  589. // set DCV - will clear when process completed
  590. // reset CRW - Write command
  591. // set VFRM - valid frame enabled
  592. // set ESYN - ASYNC generation enabled
  593. // set RSTN - ARST# inactive, AC97 codec not reset
  594. // Get the actual AC97 register from the offset
  595. writel(offset - BA0_AC97_RESET, card->pBA0 + BA0_ACCAD);
  596. writel(value, card->pBA0 + BA0_ACCDA);
  597. writel(ACCTL_DCV | ACCTL_VFRM | ACCTL_ESYN,
  598. card->pBA0 + BA0_ACCTL);
  599. // Wait for the write to occur.
  600. for (count = 0; count < 100; count++) {
  601. // First, we want to wait for a short time.
  602. udelay(25);
  603. // Now, check to see if the write has completed.
  604. // ACCTL = 460h, DCV should be reset by now and 460h = 07h
  605. status = readl(card->pBA0 + BA0_ACCTL);
  606. if (!(status & ACCTL_DCV))
  607. break;
  608. }
  609. // Make sure the write completed.
  610. if (status & ACCTL_DCV) {
  611. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
  612. "cs4281: cs_4281_write_ac97()- unable to write. ACCTL_DCV active\n"));
  613. return 1;
  614. }
  615. CS_DBGOUT(CS_FUNCTION, 2,
  616. printk(KERN_INFO "cs4281: cs_4281_write_ac97()- 0\n"));
  617. // Success.
  618. return 0;
  619. }
  620. //******************************************************************************
  621. // "Init4281()" -- Bring up the part.
  622. //******************************************************************************
  623. static __devinit int cs4281_hw_init(struct cs4281_state *card)
  624. {
  625. u32 ac97_slotid;
  626. u32 temp1, temp2;
  627. CS_DBGOUT(CS_FUNCTION, 2,
  628. printk(KERN_INFO "cs4281: cs4281_hw_init()+ \n"));
  629. #ifndef NOT_CS4281_PM
  630. if(!card)
  631. return 1;
  632. #endif
  633. temp2 = readl(card->pBA0 + BA0_CFLR);
  634. CS_DBGOUT(CS_INIT | CS_ERROR | CS_PARMS, 4, printk(KERN_INFO
  635. "cs4281: cs4281_hw_init() CFLR 0x%x\n", temp2));
  636. if(temp2 != CS4281_CFLR_DEFAULT)
  637. {
  638. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
  639. "cs4281: cs4281_hw_init() CFLR invalid - resetting from 0x%x to 0x%x\n",
  640. temp2,CS4281_CFLR_DEFAULT));
  641. writel(CS4281_CFLR_DEFAULT, card->pBA0 + BA0_CFLR);
  642. temp2 = readl(card->pBA0 + BA0_CFLR);
  643. if(temp2 != CS4281_CFLR_DEFAULT)
  644. {
  645. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
  646. "cs4281: cs4281_hw_init() Invalid hardware - unable to configure CFLR\n"));
  647. return 1;
  648. }
  649. }
  650. //***************************************7
  651. // Set up the Sound System Configuration
  652. //***************************************
  653. // Set the 'Configuration Write Protect' register
  654. // to 4281h. Allows vendor-defined configuration
  655. // space between 0e4h and 0ffh to be written.
  656. writel(0x4281, card->pBA0 + BA0_CWPR); // (3e0h)
  657. // (0), Blast the clock control register to zero so that the
  658. // PLL starts out in a known state, and blast the master serial
  659. // port control register to zero so that the serial ports also
  660. // start out in a known state.
  661. writel(0, card->pBA0 + BA0_CLKCR1); // (400h)
  662. writel(0, card->pBA0 + BA0_SERMC); // (420h)
  663. // (1), Make ESYN go to zero to turn off
  664. // the Sync pulse on the AC97 link.
  665. writel(0, card->pBA0 + BA0_ACCTL);
  666. udelay(50);
  667. // (2) Drive the ARST# pin low for a minimum of 1uS (as defined in
  668. // the AC97 spec) and then drive it high. This is done for non
  669. // AC97 modes since there might be logic external to the CS461x
  670. // that uses the ARST# line for a reset.
  671. writel(0, card->pBA0 + BA0_SPMC); // (3ech)
  672. udelay(100);
  673. writel(SPMC_RSTN, card->pBA0 + BA0_SPMC);
  674. delayus(card,50000); // Wait 50 ms for ABITCLK to become stable.
  675. // (3) Turn on the Sound System Clocks.
  676. writel(CLKCR1_PLLP, card->pBA0 + BA0_CLKCR1); // (400h)
  677. delayus(card,50000); // Wait for the PLL to stabilize.
  678. // Turn on clocking of the core (CLKCR1(400h) = 0x00000030)
  679. writel(CLKCR1_PLLP | CLKCR1_SWCE, card->pBA0 + BA0_CLKCR1);
  680. // (4) Power on everything for now..
  681. writel(0x7E, card->pBA0 + BA0_SSPM); // (740h)
  682. // (5) Wait for clock stabilization.
  683. for (temp1 = 0; temp1 < 1000; temp1++) {
  684. udelay(1000);
  685. if (readl(card->pBA0 + BA0_CLKCR1) & CLKCR1_DLLRDY)
  686. break;
  687. }
  688. if (!(readl(card->pBA0 + BA0_CLKCR1) & CLKCR1_DLLRDY)) {
  689. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  690. "cs4281: DLLRDY failed!\n"));
  691. return -EIO;
  692. }
  693. // (6) Enable ASYNC generation.
  694. writel(ACCTL_ESYN, card->pBA0 + BA0_ACCTL); // (460h)
  695. // Now wait 'for a short while' to allow the AC97
  696. // part to start generating bit clock. (so we don't
  697. // Try to start the PLL without an input clock.)
  698. delayus(card,50000);
  699. // Set the serial port timing configuration, so that the
  700. // clock control circuit gets its clock from the right place.
  701. writel(SERMC_PTC_AC97, card->pBA0 + BA0_SERMC); // (420h)=2.
  702. // (7) Wait for the codec ready signal from the AC97 codec.
  703. for (temp1 = 0; temp1 < 1000; temp1++) {
  704. // Delay a mil to let things settle out and
  705. // to prevent retrying the read too quickly.
  706. udelay(1000);
  707. if (readl(card->pBA0 + BA0_ACSTS) & ACSTS_CRDY) // If ready, (464h)
  708. break; // exit the 'for' loop.
  709. }
  710. if (!(readl(card->pBA0 + BA0_ACSTS) & ACSTS_CRDY)) // If never came ready,
  711. {
  712. CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
  713. "cs4281: ACSTS never came ready!\n"));
  714. return -EIO; // exit initialization.
  715. }
  716. // (8) Assert the 'valid frame' signal so we can
  717. // begin sending commands to the AC97 codec.
  718. writel(ACCTL_VFRM | ACCTL_ESYN, card->pBA0 + BA0_ACCTL); // (460h)
  719. // (9), Wait until CODEC calibration is finished.
  720. // Print an error message if it doesn't.
  721. for (temp1 = 0; temp1 < 1000; temp1++) {
  722. delayus(card,10000);
  723. // Read the AC97 Powerdown Control/Status Register.
  724. cs4281_read_ac97(card, BA0_AC97_POWERDOWN, &temp2);
  725. if ((temp2 & 0x0000000F) == 0x0000000F)
  726. break;
  727. }
  728. if ((temp2 & 0x0000000F) != 0x0000000F) {
  729. CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR
  730. "cs4281: Codec failed to calibrate. Status = %.8x.\n",
  731. temp2));
  732. return -EIO;
  733. }
  734. // (10), Set the serial port timing configuration, so that the
  735. // clock control circuit gets its clock from the right place.
  736. writel(SERMC_PTC_AC97, card->pBA0 + BA0_SERMC); // (420h)=2.
  737. // (11) Wait until we've sampled input slots 3 & 4 as valid, meaning
  738. // that the codec is pumping ADC data across the AC link.
  739. for (temp1 = 0; temp1 < 1000; temp1++) {
  740. // Delay a mil to let things settle out and
  741. // to prevent retrying the read too quickly.
  742. delayus(card,1000); //(test)
  743. // Read the input slot valid register; See
  744. // if input slots 3 and 4 are valid yet.
  745. if (
  746. (readl(card->pBA0 + BA0_ACISV) &
  747. (ACISV_ISV3 | ACISV_ISV4)) ==
  748. (ACISV_ISV3 | ACISV_ISV4)) break; // Exit the 'for' if slots are valid.
  749. }
  750. // If we never got valid data, exit initialization.
  751. if ((readl(card->pBA0 + BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4))
  752. != (ACISV_ISV3 | ACISV_ISV4)) {
  753. CS_DBGOUT(CS_FUNCTION, 2,
  754. printk(KERN_ERR
  755. "cs4281: Never got valid data!\n"));
  756. return -EIO; // If no valid data, exit initialization.
  757. }
  758. // (12), Start digital data transfer of audio data to the codec.
  759. writel(ACOSV_SLV3 | ACOSV_SLV4, card->pBA0 + BA0_ACOSV); // (468h)
  760. //**************************************
  761. // Unmute the Master and Alternate
  762. // (headphone) volumes. Set to max.
  763. //**************************************
  764. cs4281_write_ac97(card, BA0_AC97_HEADPHONE_VOLUME, 0);
  765. cs4281_write_ac97(card, BA0_AC97_MASTER_VOLUME, 0);
  766. //******************************************
  767. // Power on the DAC(AddDACUser()from main())
  768. //******************************************
  769. cs4281_read_ac97(card, BA0_AC97_POWERDOWN, &temp1);
  770. cs4281_write_ac97(card, BA0_AC97_POWERDOWN, temp1 &= 0xfdff);
  771. // Wait until we sample a DAC ready state.
  772. for (temp2 = 0; temp2 < 32; temp2++) {
  773. // Let's wait a mil to let things settle.
  774. delayus(card,1000);
  775. // Read the current state of the power control reg.
  776. cs4281_read_ac97(card, BA0_AC97_POWERDOWN, &temp1);
  777. // If the DAC ready state bit is set, stop waiting.
  778. if (temp1 & 0x2)
  779. break;
  780. }
  781. //******************************************
  782. // Power on the ADC(AddADCUser()from main())
  783. //******************************************
  784. cs4281_read_ac97(card, BA0_AC97_POWERDOWN, &temp1);
  785. cs4281_write_ac97(card, BA0_AC97_POWERDOWN, temp1 &= 0xfeff);
  786. // Wait until we sample ADC ready state.
  787. for (temp2 = 0; temp2 < 32; temp2++) {
  788. // Let's wait a mil to let things settle.
  789. delayus(card,1000);
  790. // Read the current state of the power control reg.
  791. cs4281_read_ac97(card, BA0_AC97_POWERDOWN, &temp1);
  792. // If the ADC ready state bit is set, stop waiting.
  793. if (temp1 & 0x1)
  794. break;
  795. }
  796. // Set up 4281 Register contents that
  797. // don't change for boot duration.
  798. // For playback, we map AC97 slot 3 and 4(Left
  799. // & Right PCM playback) to DMA Channel 0.
  800. // Set the fifo to be 15 bytes at offset zero.
  801. ac97_slotid = 0x01000f00; // FCR0.RS[4:0]=1(=>slot4, right PCM playback).
  802. // FCR0.LS[4:0]=0(=>slot3, left PCM playback).
  803. // FCR0.SZ[6-0]=15; FCR0.OF[6-0]=0.
  804. writel(ac97_slotid, card->pBA0 + BA0_FCR0); // (180h)
  805. writel(ac97_slotid | FCRn_FEN, card->pBA0 + BA0_FCR0); // Turn on FIFO Enable.
  806. // For capture, we map AC97 slot 10 and 11(Left
  807. // and Right PCM Record) to DMA Channel 1.
  808. // Set the fifo to be 15 bytes at offset sixteen.
  809. ac97_slotid = 0x0B0A0f10; // FCR1.RS[4:0]=11(=>slot11, right PCM record).
  810. // FCR1.LS[4:0]=10(=>slot10, left PCM record).
  811. // FCR1.SZ[6-0]=15; FCR1.OF[6-0]=16.
  812. writel(ac97_slotid | FCRn_PSH, card->pBA0 + BA0_FCR1); // (184h)
  813. writel(ac97_slotid | FCRn_FEN, card->pBA0 + BA0_FCR1); // Turn on FIFO Enable.
  814. // Map the Playback SRC to the same AC97 slots(3 & 4--
  815. // --Playback left & right)as DMA channel 0.
  816. // Map the record SRC to the same AC97 slots(10 & 11--
  817. // -- Record left & right) as DMA channel 1.
  818. ac97_slotid = 0x0b0a0100; // SCRSA.PRSS[4:0]=1(=>slot4, right PCM playback).
  819. // SCRSA.PLSS[4:0]=0(=>slot3, left PCM playback).
  820. // SCRSA.CRSS[4:0]=11(=>slot11, right PCM record)
  821. // SCRSA.CLSS[4:0]=10(=>slot10, left PCM record).
  822. writel(ac97_slotid, card->pBA0 + BA0_SRCSA); // (75ch)
  823. // Set 'Half Terminal Count Interrupt Enable' and 'Terminal
  824. // Count Interrupt Enable' in DMA Control Registers 0 & 1.
  825. // Set 'MSK' flag to 1 to keep the DMA engines paused.
  826. temp1 = (DCRn_HTCIE | DCRn_TCIE | DCRn_MSK); // (00030001h)
  827. writel(temp1, card->pBA0 + BA0_DCR0); // (154h
  828. writel(temp1, card->pBA0 + BA0_DCR1); // (15ch)
  829. // Set 'Auto-Initialize Control' to 'enabled'; For playback,
  830. // set 'Transfer Type Control'(TR[1:0]) to 'read transfer',
  831. // for record, set Transfer Type Control to 'write transfer'.
  832. // All other bits set to zero; Some will be changed @ transfer start.
  833. temp1 = (DMRn_DMA | DMRn_AUTO | DMRn_TR_READ); // (20000018h)
  834. writel(temp1, card->pBA0 + BA0_DMR0); // (150h)
  835. temp1 = (DMRn_DMA | DMRn_AUTO | DMRn_TR_WRITE); // (20000014h)
  836. writel(temp1, card->pBA0 + BA0_DMR1); // (158h)
  837. // Enable DMA interrupts generally, and
  838. // DMA0 & DMA1 interrupts specifically.
  839. temp1 = readl(card->pBA0 + BA0_HIMR) & 0xfffbfcff;
  840. writel(temp1, card->pBA0 + BA0_HIMR);
  841. CS_DBGOUT(CS_FUNCTION, 2,
  842. printk(KERN_INFO "cs4281: cs4281_hw_init()- 0\n"));
  843. return 0;
  844. }
  845. #ifndef NOT_CS4281_PM
  846. static void printpm(struct cs4281_state *s)
  847. {
  848. CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
  849. CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
  850. (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
  851. CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
  852. s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
  853. CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
  854. s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
  855. CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
  856. s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
  857. CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
  858. s->pm.u32SSCR,s->pm.u32SRCSA));
  859. CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
  860. s->pm.u32DacASR,s->pm.u32AdcASR));
  861. CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
  862. s->pm.u32DacSR,s->pm.u32AdcSR));
  863. CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
  864. s->pm.u32MIDCR_Save));
  865. }
  866. static void printpipe(struct cs4281_pipeline *pl)
  867. {
  868. CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
  869. CS_DBGOUT(CS_PM, 9, printk("flags:0x%x number: 0%x\n",
  870. (unsigned)pl->flags,pl->number));
  871. CS_DBGOUT(CS_PM, 9, printk("u32DBAnValue: 0%x u32DBCnValue: 0x%x\n",
  872. pl->u32DBAnValue,pl->u32DBCnValue));
  873. CS_DBGOUT(CS_PM, 9, printk("u32DMRnValue: 0x%x u32DCRnValue: 0x%x\n",
  874. pl->u32DMRnValue,pl->u32DCRnValue));
  875. CS_DBGOUT(CS_PM, 9, printk("u32DBAnAddress: 0x%x u32DBCnAddress: 0x%x\n",
  876. pl->u32DBAnAddress,pl->u32DBCnAddress));
  877. CS_DBGOUT(CS_PM, 9, printk("u32DCAnAddress: 0x%x u32DCCnAddress: 0x%x\n",
  878. pl->u32DCCnAddress,pl->u32DCCnAddress));
  879. CS_DBGOUT(CS_PM, 9, printk("u32DMRnAddress: 0x%x u32DCRnAddress: 0x%x\n",
  880. pl->u32DMRnAddress,pl->u32DCRnAddress));
  881. CS_DBGOUT(CS_PM, 9, printk("u32HDSRnAddress: 0x%x u32DBAn_Save: 0x%x\n",
  882. pl->u32HDSRnAddress,pl->u32DBAn_Save));
  883. CS_DBGOUT(CS_PM, 9, printk("u32DBCn_Save: 0x%x u32DMRn_Save: 0x%x\n",
  884. pl->u32DBCn_Save,pl->u32DMRn_Save));
  885. CS_DBGOUT(CS_PM, 9, printk("u32DCRn_Save: 0x%x u32DCCn_Save: 0x%x\n",
  886. pl->u32DCRn_Save,pl->u32DCCn_Save));
  887. CS_DBGOUT(CS_PM, 9, printk("u32DCAn_Save: 0x%x\n",
  888. pl->u32DCAn_Save));
  889. CS_DBGOUT(CS_PM, 9, printk("u32FCRn_Save: 0x%x u32FSICn_Save: 0x%x\n",
  890. pl->u32FCRn_Save,pl->u32FSICn_Save));
  891. CS_DBGOUT(CS_PM, 9, printk("u32FCRnValue: 0x%x u32FSICnValue: 0x%x\n",
  892. pl->u32FCRnValue,pl->u32FSICnValue));
  893. CS_DBGOUT(CS_PM, 9, printk("u32FCRnAddress: 0x%x u32FSICnAddress: 0x%x\n",
  894. pl->u32FCRnAddress,pl->u32FSICnAddress));
  895. CS_DBGOUT(CS_PM, 9, printk("u32FPDRnValue: 0x%x u32FPDRnAddress: 0x%x\n",
  896. pl->u32FPDRnValue,pl->u32FPDRnAddress));
  897. }
  898. static void printpipelines(struct cs4281_state *s)
  899. {
  900. int i;
  901. for(i=0;i<CS4281_NUMBER_OF_PIPELINES;i++)
  902. {
  903. if(s->pl[i].flags & CS4281_PIPELINE_VALID)
  904. {
  905. printpipe(&s->pl[i]);
  906. }
  907. }
  908. }
  909. /****************************************************************************
  910. *
  911. * Suspend - save the ac97 regs, mute the outputs and power down the part.
  912. *
  913. ****************************************************************************/
  914. static void cs4281_ac97_suspend(struct cs4281_state *s)
  915. {
  916. int Count,i;
  917. CS_DBGOUT(CS_PM, 9, printk("cs4281: cs4281_ac97_suspend()+\n"));
  918. /*
  919. * change the state, save the current hwptr, then stop the dac/adc
  920. */
  921. s->pm.flags &= ~CS4281_PM_IDLE;
  922. s->pm.flags |= CS4281_PM_SUSPENDING;
  923. s->pm.u32hwptr_playback = readl(s->pBA0 + BA0_DCA0);
  924. s->pm.u32hwptr_capture = readl(s->pBA0 + BA0_DCA1);
  925. stop_dac(s);
  926. stop_adc(s);
  927. for(Count = 0x2, i=0; (Count <= CS4281_AC97_HIGHESTREGTORESTORE)
  928. && (i < CS4281_AC97_NUMBER_RESTORE_REGS);
  929. Count += 2, i++)
  930. {
  931. cs4281_read_ac97(s, BA0_AC97_RESET + Count, &s->pm.ac97[i]);
  932. }
  933. /*
  934. * Save the ac97 volume registers as well as the current powerdown state.
  935. * Now, mute the all the outputs (master, headphone, and mono), as well
  936. * as the PCM volume, in preparation for powering down the entire part.
  937. */
  938. cs4281_read_ac97(s, BA0_AC97_MASTER_VOLUME, &s->pm.u32AC97_master_volume);
  939. cs4281_read_ac97(s, BA0_AC97_HEADPHONE_VOLUME, &s->pm.u32AC97_headphone_volume);
  940. cs4281_read_ac97(s, BA0_AC97_MASTER_VOLUME_MONO, &s->pm.u32AC97_master_volume_mono);
  941. cs4281_read_ac97(s, BA0_AC97_PCM_OUT_VOLUME, &s->pm.u32AC97_pcm_out_volume);
  942. cs4281_write_ac97(s, BA0_AC97_MASTER_VOLUME, 0x8000);
  943. cs4281_write_ac97(s, BA0_AC97_HEADPHONE_VOLUME, 0x8000);
  944. cs4281_write_ac97(s, BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
  945. cs4281_write_ac97(s, BA0_AC97_PCM_OUT_VOLUME, 0x8000);
  946. cs4281_read_ac97(s, BA0_AC97_POWERDOWN, &s->pm.u32AC97_powerdown);
  947. cs4281_read_ac97(s, BA0_AC97_GENERAL_PURPOSE, &s->pm.u32AC97_general_purpose);
  948. /*
  949. * And power down everything on the AC97 codec.
  950. */
  951. cs4281_write_ac97(s, BA0_AC97_POWERDOWN, 0xff00);
  952. CS_DBGOUT(CS_PM, 9, printk("cs4281: cs4281_ac97_suspend()-\n"));
  953. }
  954. /****************************************************************************
  955. *
  956. * Resume - power up the part and restore its registers..
  957. *
  958. ****************************************************************************/
  959. static void cs4281_ac97_resume(struct cs4281_state *s)
  960. {
  961. int Count,i;
  962. CS_DBGOUT(CS_PM, 9, printk("cs4281: cs4281_ac97_resume()+\n"));
  963. /* do not save the power state registers at this time
  964. //
  965. // If we saved away the power control registers, write them into the
  966. // shadows so those saved values get restored instead of the current
  967. // shadowed value.
  968. //
  969. if( bPowerStateSaved )
  970. {
  971. PokeShadow( 0x26, ulSaveReg0x26 );
  972. bPowerStateSaved = FALSE;
  973. }
  974. */
  975. //
  976. // First, we restore the state of the general purpose register. This
  977. // contains the mic select (mic1 or mic2) and if we restore this after
  978. // we restore the mic volume/boost state and mic2 was selected at
  979. // suspend time, we will end up with a brief period of time where mic1
  980. // is selected with the volume/boost settings for mic2, causing
  981. // acoustic feedback. So we restore the general purpose register
  982. // first, thereby getting the correct mic selected before we restore
  983. // the mic volume/boost.
  984. //
  985. cs4281_write_ac97(s, BA0_AC97_GENERAL_PURPOSE, s->pm.u32AC97_general_purpose);
  986. //
  987. // Now, while the outputs are still muted, restore the state of power
  988. // on the AC97 part.
  989. //
  990. cs4281_write_ac97(s, BA0_AC97_POWERDOWN, s->pm.u32AC97_powerdown);
  991. /*
  992. * Restore just the first set of registers, from register number
  993. * 0x02 to the register number that ulHighestRegToRestore specifies.
  994. */
  995. for( Count = 0x2, i=0;
  996. (Count <= CS4281_AC97_HIGHESTREGTORESTORE)
  997. && (i < CS4281_AC97_NUMBER_RESTORE_REGS);
  998. Count += 2, i++)
  999. {
  1000. cs4281_write_ac97(s, BA0_AC97_RESET + Count, s->pm.ac97[i]);
  1001. }
  1002. CS_DBGOUT(CS_PM, 9, printk("cs4281: cs4281_ac97_resume()-\n"));
  1003. }
  1004. /* do not save the power state registers at this time
  1005. ****************************************************************************
  1006. *
  1007. * SavePowerState - Save the power registers away.
  1008. *
  1009. ****************************************************************************
  1010. void
  1011. HWAC97codec::SavePowerState(void)
  1012. {
  1013. ENTRY(TM_OBJECTCALLS, "HWAC97codec::SavePowerState()\r\n");
  1014. ulSaveReg0x26 = PeekShadow(0x26);
  1015. //
  1016. // Note that we have saved registers that need to be restored during a
  1017. // resume instead of ulAC97Regs[].
  1018. //
  1019. bPowerStateSaved = TRUE;
  1020. } // SavePowerState
  1021. */
  1022. static void cs4281_SuspendFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
  1023. {
  1024. /*
  1025. * We need to save the contents of the BASIC FIFO Registers.
  1026. */
  1027. pl->u32FCRn_Save = readl(s->pBA0 + pl->u32FCRnAddress);
  1028. pl->u32FSICn_Save = readl(s->pBA0 + pl->u32FSICnAddress);
  1029. }
  1030. static void cs4281_ResumeFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
  1031. {
  1032. /*
  1033. * We need to restore the contents of the BASIC FIFO Registers.
  1034. */
  1035. writel(pl->u32FCRn_Save,s->pBA0 + pl->u32FCRnAddress);
  1036. writel(pl->u32FSICn_Save,s->pBA0 + pl->u32FSICnAddress);
  1037. }
  1038. static void cs4281_SuspendDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
  1039. {
  1040. //
  1041. // We need to save the contents of the BASIC DMA Registers.
  1042. //
  1043. pl->u32DBAn_Save = readl(s->pBA0 + pl->u32DBAnAddress);
  1044. pl->u32DBCn_Save = readl(s->pBA0 + pl->u32DBCnAddress);
  1045. pl->u32DMRn_Save = readl(s->pBA0 + pl->u32DMRnAddress);
  1046. pl->u32DCRn_Save = readl(s->pBA0 + pl->u32DCRnAddress);
  1047. pl->u32DCCn_Save = readl(s->pBA0 + pl->u32DCCnAddress);
  1048. pl->u32DCAn_Save = readl(s->pBA0 + pl->u32DCAnAddress);
  1049. }
  1050. static void cs4281_ResumeDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
  1051. {
  1052. //
  1053. // We need to save the contents of the BASIC DMA Registers.
  1054. //
  1055. writel( pl->u32DBAn_Save, s->pBA0 + pl->u32DBAnAddress);
  1056. writel( pl->u32DBCn_Save, s->pBA0 + pl->u32DBCnAddress);
  1057. writel( pl->u32DMRn_Save, s->pBA0 + pl->u32DMRnAddress);
  1058. writel( pl->u32DCRn_Save, s->pBA0 + pl->u32DCRnAddress);
  1059. writel( pl->u32DCCn_Save, s->pBA0 + pl->u32DCCnAddress);
  1060. writel( pl->u32DCAn_Save, s->pBA0 + pl->u32DCAnAddress);
  1061. }
  1062. static int cs4281_suspend(struct cs4281_state *s)
  1063. {
  1064. int i;
  1065. u32 u32CLKCR1;
  1066. struct cs4281_pm *pm = &s->pm;
  1067. CS_DBGOUT(CS_PM | CS_FUNCTION, 9,
  1068. printk("cs4281: cs4281_suspend()+ flags=%d\n",
  1069. (unsigned)s->pm.flags));
  1070. /*
  1071. * check the current state, only suspend if IDLE
  1072. */
  1073. if(!(s->pm.flags & CS4281_PM_IDLE))
  1074. {
  1075. CS_DBGOUT(CS_PM | CS_ERROR, 2,
  1076. printk("cs4281: cs4281_suspend() unable to suspend, not IDLE\n"));
  1077. return 1;
  1078. }
  1079. s->pm.flags &= ~CS4281_PM_IDLE;
  1080. s->pm.flags |= CS4281_PM_SUSPENDING;
  1081. //
  1082. // Gershwin CLKRUN - Set CKRA
  1083. //
  1084. u32CLKCR1 = readl(s->pBA0 + BA0_CLKCR1);
  1085. pm->u32CLKCR1_SAVE = u32CLKCR1;
  1086. if(!(u32CLKCR1 & 0x00010000 ) )
  1087. writel(u32CLKCR1 | 0x00010000, s->pBA0 + BA0_CLKCR1);
  1088. //
  1089. // First, turn on the clocks (yikes) to the devices, so that they will
  1090. // respond when we try to save their state.
  1091. //
  1092. if(!(u32CLKCR1 & CLKCR1_SWCE))
  1093. {
  1094. writel(u32CLKCR1 | CLKCR1_SWCE , s->pBA0 + BA0_CLKCR1);
  1095. }
  1096. //
  1097. // Save the power state
  1098. //
  1099. pm->u32SSPMValue = readl(s->pBA0 + BA0_SSPM);
  1100. //
  1101. // Disable interrupts.
  1102. //
  1103. writel(HICR_CHGM, s->pBA0 + BA0_HICR);
  1104. //
  1105. // Save the PCM Playback Left and Right Volume Control.
  1106. //
  1107. pm->u32PPLVCvalue = readl(s->pBA0 + BA0_PPLVC);
  1108. pm->u32PPRVCvalue = readl(s->pBA0 + BA0_PPRVC);
  1109. //
  1110. // Save the FM Synthesis Left and Right Volume Control.
  1111. //
  1112. pm->u32FMLVCvalue = readl(s->pBA0 + BA0_FMLVC);
  1113. pm->u32FMRVCvalue = readl(s->pBA0 + BA0_FMRVC);
  1114. //
  1115. // Save the GPIOR value.
  1116. //
  1117. pm->u32GPIORvalue = readl(s->pBA0 + BA0_GPIOR);
  1118. //
  1119. // Save the JSCTL value.
  1120. //
  1121. pm->u32JSCTLvalue = readl(s->pBA0 + BA0_GPIOR);
  1122. //
  1123. // Save Sound System Control Register
  1124. //
  1125. pm->u32SSCR = readl(s->pBA0 + BA0_SSCR);
  1126. //
  1127. // Save SRC Slot Assinment register
  1128. //
  1129. pm->u32SRCSA = readl(s->pBA0 + BA0_SRCSA);
  1130. //
  1131. // Save sample rate
  1132. //
  1133. pm->u32DacASR = readl(s->pBA0 + BA0_PASR);
  1134. pm->u32AdcASR = readl(s->pBA0 + BA0_CASR);
  1135. pm->u32DacSR = readl(s->pBA0 + BA0_DACSR);
  1136. pm->u32AdcSR = readl(s->pBA0 + BA0_ADCSR);
  1137. //
  1138. // Loop through all of the PipeLines
  1139. //
  1140. for(i = 0; i < CS4281_NUMBER_OF_PIPELINES; i++)
  1141. {
  1142. if(s->pl[i].flags & CS4281_PIPELINE_VALID)
  1143. {
  1144. //
  1145. // Ask the DMAengines and FIFOs to Suspend.
  1146. //
  1147. cs4281_SuspendDMAengine(s,&s->pl[i]);
  1148. cs4281_SuspendFIFO(s,&s->pl[i]);
  1149. }
  1150. }
  1151. //
  1152. // We need to save the contents of the Midi Control Register.
  1153. //
  1154. pm->u32MIDCR_Save = readl(s->pBA0 + BA0_MIDCR);
  1155. /*
  1156. * save off the AC97 part information
  1157. */
  1158. cs4281_ac97_suspend(s);
  1159. //
  1160. // Turn off the serial ports.
  1161. //
  1162. writel(0, s->pBA0 + BA0_SERMC);
  1163. //
  1164. // Power off FM, Joystick, AC link,
  1165. //
  1166. writel(0, s->pBA0 + BA0_SSPM);
  1167. //
  1168. // DLL off.
  1169. //
  1170. writel(0, s->pBA0 + BA0_CLKCR1);
  1171. //
  1172. // AC link off.
  1173. //
  1174. writel(0, s->pBA0 + BA0_SPMC);
  1175. //
  1176. // Put the chip into D3(hot) state.
  1177. //
  1178. // PokeBA0(BA0_PMCS, 0x00000003);
  1179. //
  1180. // Gershwin CLKRUN - Clear CKRA
  1181. //
  1182. u32CLKCR1 = readl(s->pBA0 + BA0_CLKCR1);
  1183. writel(u32CLKCR1 & 0xFFFEFFFF, s->pBA0 + BA0_CLKCR1);
  1184. #ifdef CSDEBUG
  1185. printpm(s);
  1186. printpipelines(s);
  1187. #endif
  1188. s->pm.flags &= ~CS4281_PM_SUSPENDING;
  1189. s->pm.flags |= CS4281_PM_SUSPENDED;
  1190. CS_DBGOUT(CS_PM | CS_FUNCTION, 9,
  1191. printk("cs4281: cs4281_suspend()- flags=%d\n",
  1192. (unsigned)s->pm.flags));
  1193. return 0;
  1194. }
  1195. static int cs4281_resume(struct cs4281_state *s)
  1196. {
  1197. int i;
  1198. unsigned temp1;
  1199. u32 u32CLKCR1;
  1200. struct cs4281_pm *pm = &s->pm;
  1201. CS_DBGOUT(CS_PM | CS_FUNCTION, 4,
  1202. printk( "cs4281: cs4281_resume()+ flags=%d\n",
  1203. (unsigned)s->pm.flags));
  1204. if(!(s->pm.flags & CS4281_PM_SUSPENDED))
  1205. {
  1206. CS_DBGOUT(CS_PM | CS_ERROR, 2,
  1207. printk("cs4281: cs4281_resume() unable to resume, not SUSPENDED\n"));
  1208. return 1;
  1209. }
  1210. s->pm.flags &= ~CS4281_PM_SUSPENDED;
  1211. s->pm.flags |= CS4281_PM_RESUMING;
  1212. //
  1213. // Gershwin CLKRUN - Set CKRA
  1214. //
  1215. u32CLKCR1 = readl(s->pBA0 + BA0_CLKCR1);
  1216. writel(u32CLKCR1 | 0x00010000, s->pBA0 + BA0_CLKCR1);
  1217. //
  1218. // set the power state.
  1219. //
  1220. //old PokeBA0(BA0_PMCS, 0);
  1221. //
  1222. // Program the clock circuit and serial ports.
  1223. //
  1224. temp1 = cs4281_hw_init(s);
  1225. if (temp1) {
  1226. CS_DBGOUT(CS_ERROR | CS_INIT, 1,
  1227. printk(KERN_ERR
  1228. "cs4281: resume cs4281_hw_init() error.\n"));
  1229. return -1;
  1230. }
  1231. //
  1232. // restore the Power state
  1233. //
  1234. writel(pm->u32SSPMValue, s->pBA0 + BA0_SSPM);
  1235. //
  1236. // Set post SRC mix setting (FM or ALT48K)
  1237. //
  1238. writel(pm->u32SSPM_BITS, s->pBA0 + BA0_SSPM);
  1239. //
  1240. // Loop through all of the PipeLines
  1241. //
  1242. for(i = 0; i < CS4281_NUMBER_OF_PIPELINES; i++)
  1243. {
  1244. if(s->pl[i].flags & CS4281_PIPELINE_VALID)
  1245. {
  1246. //
  1247. // Ask the DMAengines and FIFOs to Resume.
  1248. //
  1249. cs4281_ResumeDMAengine(s,&s->pl[i]);
  1250. cs4281_ResumeFIFO(s,&s->pl[i]);
  1251. }
  1252. }
  1253. //
  1254. // We need to restore the contents of the Midi Control Register.
  1255. //
  1256. writel(pm->u32MIDCR_Save, s->pBA0 + BA0_MIDCR);
  1257. cs4281_ac97_resume(s);
  1258. //
  1259. // Restore the PCM Playback Left and Right Volume Control.
  1260. //
  1261. writel(pm->u32PPLVCvalue, s->pBA0 + BA0_PPLVC);
  1262. writel(pm->u32PPRVCvalue, s->pBA0 + BA0_PPRVC);
  1263. //
  1264. // Restore the FM Synthesis Left and Right Volume Control.
  1265. //
  1266. writel(pm->u32FMLVCvalue, s->pBA0 + BA0_FMLVC);
  1267. writel(pm->u32FMRVCvalue, s->pBA0 + BA0_FMRVC);
  1268. //
  1269. // Restore the JSCTL value.
  1270. //
  1271. writel(pm->u32JSCTLvalue, s->pBA0 + BA0_JSCTL);
  1272. //
  1273. // Restore the GPIOR register value.
  1274. //
  1275. writel(pm->u32GPIORvalue, s->pBA0 + BA0_GPIOR);
  1276. //
  1277. // Restore Sound System Control Register
  1278. //
  1279. writel(pm->u32SSCR, s->pBA0 + BA0_SSCR);
  1280. //
  1281. // Restore SRC Slot Assignment register
  1282. //
  1283. writel(pm->u32SRCSA, s->pBA0 + BA0_SRCSA);
  1284. //
  1285. // Restore sample rate
  1286. //
  1287. writel(pm->u32DacASR, s->pBA0 + BA0_PASR);
  1288. writel(pm->u32AdcASR, s->pBA0 + BA0_CASR);
  1289. writel(pm->u32DacSR, s->pBA0 + BA0_DACSR);
  1290. writel(pm->u32AdcSR, s->pBA0 + BA0_ADCSR);
  1291. //
  1292. // Restore CFL1/2 registers we saved to compensate for OEM bugs.
  1293. //
  1294. // PokeBA0(BA0_CFLR, ulConfig);
  1295. //
  1296. // Gershwin CLKRUN - Clear CKRA
  1297. //
  1298. writel(pm->u32CLKCR1_SAVE, s->pBA0 + BA0_CLKCR1);
  1299. //
  1300. // Enable interrupts on the part.
  1301. //
  1302. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR);
  1303. #ifdef CSDEBUG
  1304. printpm(s);
  1305. printpipelines(s);
  1306. #endif
  1307. /*
  1308. * change the state, restore the current hwptrs, then stop the dac/adc
  1309. */
  1310. s->pm.flags |= CS4281_PM_IDLE;
  1311. s->pm.flags &= ~(CS4281_PM_SUSPENDING | CS4281_PM_SUSPENDED
  1312. | CS4281_PM_RESUMING | CS4281_PM_RESUMED);
  1313. writel(s->pm.u32hwptr_playback, s->pBA0 + BA0_DCA0);
  1314. writel(s->pm.u32hwptr_capture, s->pBA0 + BA0_DCA1);
  1315. start_dac(s);
  1316. start_adc(s);
  1317. CS_DBGOUT(CS_PM | CS_FUNCTION, 9, printk("cs4281: cs4281_resume()- flags=%d\n",
  1318. (unsigned)s->pm.flags));
  1319. return 0;
  1320. }
  1321. #endif
  1322. //******************************************************************************
  1323. // "cs4281_play_rate()" --
  1324. //******************************************************************************
  1325. static void cs4281_play_rate(struct cs4281_state *card, u32 playrate)
  1326. {
  1327. u32 DACSRvalue = 1;
  1328. // Based on the sample rate, program the DACSR register.
  1329. if (playrate == 8000)
  1330. DACSRvalue = 5;
  1331. if (playrate == 11025)
  1332. DACSRvalue = 4;
  1333. else if (playrate == 22050)
  1334. DACSRvalue = 2;
  1335. else if (playrate == 44100)
  1336. DACSRvalue = 1;
  1337. else if ((playrate <= 48000) && (playrate >= 6023))
  1338. DACSRvalue = 24576000 / (playrate * 16);
  1339. else if (playrate < 6023)
  1340. // Not allowed by open.
  1341. return;
  1342. else if (playrate > 48000)
  1343. // Not allowed by open.
  1344. return;
  1345. CS_DBGOUT(CS_WAVE_WRITE | CS_PARMS, 2, printk(KERN_INFO
  1346. "cs4281: cs4281_play_rate(): DACSRvalue=0x%.8x playrate=%d\n",
  1347. DACSRvalue, playrate));
  1348. // Write the 'sample rate select code'
  1349. // to the 'DAC Sample Rate' register.
  1350. writel(DACSRvalue, card->pBA0 + BA0_DACSR); // (744h)
  1351. }
  1352. //******************************************************************************
  1353. // "cs4281_record_rate()" -- Initialize the record sample rate converter.
  1354. //******************************************************************************
  1355. static void cs4281_record_rate(struct cs4281_state *card, u32 outrate)
  1356. {
  1357. u32 ADCSRvalue = 1;
  1358. //
  1359. // Based on the sample rate, program the ADCSR register
  1360. //
  1361. if (outrate == 8000)
  1362. ADCSRvalue = 5;
  1363. if (outrate == 11025)
  1364. ADCSRvalue = 4;
  1365. else if (outrate == 22050)
  1366. ADCSRvalue = 2;
  1367. else if (outrate == 44100)
  1368. ADCSRvalue = 1;
  1369. else if ((outrate <= 48000) && (outrate >= 6023))
  1370. ADCSRvalue = 24576000 / (outrate * 16);
  1371. else if (outrate < 6023) {
  1372. // Not allowed by open.
  1373. return;
  1374. } else if (outrate > 48000) {
  1375. // Not allowed by open.
  1376. return;
  1377. }
  1378. CS_DBGOUT(CS_WAVE_READ | CS_PARMS, 2, printk(KERN_INFO
  1379. "cs4281: cs4281_record_rate(): ADCSRvalue=0x%.8x outrate=%d\n",
  1380. ADCSRvalue, outrate));
  1381. // Write the 'sample rate select code
  1382. // to the 'ADC Sample Rate' register.
  1383. writel(ADCSRvalue, card->pBA0 + BA0_ADCSR); // (748h)
  1384. }
  1385. static void stop_dac(struct cs4281_state *s)
  1386. {
  1387. unsigned long flags;
  1388. unsigned temp1;
  1389. CS_DBGOUT(CS_WAVE_WRITE, 3, printk(KERN_INFO "cs4281: stop_dac():\n"));
  1390. spin_lock_irqsave(&s->lock, flags);
  1391. s->ena &= ~FMODE_WRITE;
  1392. temp1 = readl(s->pBA0 + BA0_DCR0) | DCRn_MSK;
  1393. writel(temp1, s->pBA0 + BA0_DCR0);
  1394. spin_unlock_irqrestore(&s->lock, flags);
  1395. }
  1396. static void start_dac(struct cs4281_state *s)
  1397. {
  1398. unsigned long flags;
  1399. unsigned temp1;
  1400. CS_DBGOUT(CS_FUNCTION, 3, printk(KERN_INFO "cs4281: start_dac()+\n"));
  1401. spin_lock_irqsave(&s->lock, flags);
  1402. if (!(s->ena & FMODE_WRITE) && (s->dma_dac.mapped ||
  1403. (s->dma_dac.count > 0
  1404. && s->dma_dac.ready))
  1405. #ifndef NOT_CS4281_PM
  1406. && (s->pm.flags & CS4281_PM_IDLE))
  1407. #else
  1408. )
  1409. #endif
  1410. {
  1411. s->ena |= FMODE_WRITE;
  1412. temp1 = readl(s->pBA0 + BA0_DCR0) & ~DCRn_MSK; // Clear DMA0 channel mask.
  1413. writel(temp1, s->pBA0 + BA0_DCR0); // Start DMA'ing.
  1414. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); // Enable interrupts.
  1415. writel(7, s->pBA0 + BA0_PPRVC);
  1416. writel(7, s->pBA0 + BA0_PPLVC);
  1417. CS_DBGOUT(CS_WAVE_WRITE | CS_PARMS, 8, printk(KERN_INFO
  1418. "cs4281: start_dac(): writel 0x%x start dma\n", temp1));
  1419. }
  1420. spin_unlock_irqrestore(&s->lock, flags);
  1421. CS_DBGOUT(CS_FUNCTION, 3,
  1422. printk(KERN_INFO "cs4281: start_dac()-\n"));
  1423. }
  1424. static void stop_adc(struct cs4281_state *s)
  1425. {
  1426. unsigned long flags;
  1427. unsigned temp1;
  1428. CS_DBGOUT(CS_FUNCTION, 3,
  1429. printk(KERN_INFO "cs4281: stop_adc()+\n"));
  1430. spin_lock_irqsave(&s->lock, flags);
  1431. s->ena &= ~FMODE_READ;
  1432. if (s->conversion == 1) {
  1433. s->conversion = 0;
  1434. s->prop_adc.fmt = s->prop_adc.fmt_original;
  1435. }
  1436. temp1 = readl(s->pBA0 + BA0_DCR1) | DCRn_MSK;
  1437. writel(temp1, s->pBA0 + BA0_DCR1);
  1438. spin_unlock_irqrestore(&s->lock, flags);
  1439. CS_DBGOUT(CS_FUNCTION, 3,
  1440. printk(KERN_INFO "cs4281: stop_adc()-\n"));
  1441. }
  1442. static void start_adc(struct cs4281_state *s)
  1443. {
  1444. unsigned long flags;
  1445. unsigned temp1;
  1446. CS_DBGOUT(CS_FUNCTION, 2,
  1447. printk(KERN_INFO "cs4281: start_adc()+\n"));
  1448. if (!(s->ena & FMODE_READ) &&
  1449. (s->dma_adc.mapped || s->dma_adc.count <=
  1450. (signed) (s->dma_adc.dmasize - 2 * s->dma_adc.fragsize))
  1451. && s->dma_adc.ready
  1452. #ifndef NOT_CS4281_PM
  1453. && (s->pm.flags & CS4281_PM_IDLE))
  1454. #else
  1455. )
  1456. #endif
  1457. {
  1458. if (s->prop_adc.fmt & AFMT_S8 || s->prop_adc.fmt & AFMT_U8) {
  1459. //
  1460. // now only use 16 bit capture, due to truncation issue
  1461. // in the chip, noticable distortion occurs.
  1462. // allocate buffer and then convert from 16 bit to
  1463. // 8 bit for the user buffer.
  1464. //
  1465. s->prop_adc.fmt_original = s->prop_adc.fmt;
  1466. if (s->prop_adc.fmt & AFMT_S8) {
  1467. s->prop_adc.fmt &= ~AFMT_S8;
  1468. s->prop_adc.fmt |= AFMT_S16_LE;
  1469. }
  1470. if (s->prop_adc.fmt & AFMT_U8) {
  1471. s->prop_adc.fmt &= ~AFMT_U8;
  1472. s->prop_adc.fmt |= AFMT_U16_LE;
  1473. }
  1474. //
  1475. // prog_dmabuf_adc performs a stop_adc() but that is
  1476. // ok since we really haven't started the DMA yet.
  1477. //
  1478. prog_codec(s, CS_TYPE_ADC);
  1479. if (prog_dmabuf_adc(s) != 0) {
  1480. CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
  1481. "cs4281: start_adc(): error in prog_dmabuf_adc\n"));
  1482. }
  1483. s->conversion = 1;
  1484. }
  1485. spin_lock_irqsave(&s->lock, flags);
  1486. s->ena |= FMODE_READ;
  1487. temp1 = readl(s->pBA0 + BA0_DCR1) & ~DCRn_MSK; // Clear DMA1 channel mask bit.
  1488. writel(temp1, s->pBA0 + BA0_DCR1); // Start recording
  1489. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); // Enable interrupts.
  1490. spin_unlock_irqrestore(&s->lock, flags);
  1491. CS_DBGOUT(CS_PARMS, 6, printk(KERN_INFO
  1492. "cs4281: start_adc(): writel 0x%x \n", temp1));
  1493. }
  1494. CS_DBGOUT(CS_FUNCTION, 2,
  1495. printk(KERN_INFO "cs4281: start_adc()-\n"));
  1496. }
  1497. // ---------------------------------------------------------------------
  1498. #define DMABUF_MINORDER 1 // ==> min buffer size = 8K.
  1499. static void dealloc_dmabuf(struct cs4281_state *s, struct dmabuf *db)
  1500. {
  1501. struct page *map, *mapend;
  1502. if (db->rawbuf) {
  1503. // Undo prog_dmabuf()'s marking the pages as reserved
  1504. mapend =
  1505. virt_to_page(db->rawbuf + (PAGE_SIZE << db->buforder) -
  1506. 1);
  1507. for (map = virt_to_page(db->rawbuf); map <= mapend; map++)
  1508. ClearPageReserved(map);
  1509. free_dmabuf(s, db);
  1510. }
  1511. if (s->tmpbuff && (db->type == CS_TYPE_ADC)) {
  1512. // Undo prog_dmabuf()'s marking the pages as reserved
  1513. mapend =
  1514. virt_to_page(s->tmpbuff +
  1515. (PAGE_SIZE << s->buforder_tmpbuff) - 1);
  1516. for (map = virt_to_page(s->tmpbuff); map <= mapend; map++)
  1517. ClearPageReserved(map);
  1518. free_dmabuf2(s, db);
  1519. }
  1520. s->tmpbuff = NULL;
  1521. db->rawbuf = NULL;
  1522. db->mapped = db->ready = 0;
  1523. }
  1524. static int prog_dmabuf(struct cs4281_state *s, struct dmabuf *db)
  1525. {
  1526. int order;
  1527. unsigned bytespersec, temp1;
  1528. unsigned bufs, sample_shift = 0;
  1529. struct page *map, *mapend;
  1530. unsigned long df;
  1531. CS_DBGOUT(CS_FUNCTION, 2,
  1532. printk(KERN_INFO "cs4281: prog_dmabuf()+\n"));
  1533. db->hwptr = db->swptr = db->total_bytes = db->count = db->error =
  1534. db->endcleared = db->blocks = db->wakeup = db->underrun = 0;
  1535. /*
  1536. * check for order within limits, but do not overwrite value, check
  1537. * later for a fractional defaultorder (i.e. 100+).
  1538. */
  1539. if((defaultorder > 0) && (defaultorder < 12))
  1540. df = defaultorder;
  1541. else
  1542. df = 1;
  1543. if (!db->rawbuf) {
  1544. db->ready = db->mapped = 0;
  1545. for (order = df; order >= DMABUF_MINORDER; order--)
  1546. if ( (db->rawbuf = (void *) pci_alloc_consistent(
  1547. s->pcidev, PAGE_SIZE << order, &db-> dmaaddr)))
  1548. break;
  1549. if (!db->rawbuf) {
  1550. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  1551. "cs4281: prog_dmabuf(): unable to allocate rawbuf\n"));
  1552. return -ENOMEM;
  1553. }
  1554. db->buforder = order;
  1555. // Now mark the pages as reserved; otherwise the
  1556. // remap_pfn_range() in cs4281_mmap doesn't work.
  1557. // 1. get index to last page in mem_map array for rawbuf.
  1558. mapend = virt_to_page(db->rawbuf +
  1559. (PAGE_SIZE << db->buforder) - 1);
  1560. // 2. mark each physical page in range as 'reserved'.
  1561. for (map = virt_to_page(db->rawbuf); map <= mapend; map++)
  1562. SetPageReserved(map);
  1563. }
  1564. if (!s->tmpbuff && (db->type == CS_TYPE_ADC)) {
  1565. for (order = df; order >= DMABUF_MINORDER;
  1566. order--)
  1567. if ( (s->tmpbuff = (void *) pci_alloc_consistent(
  1568. s->pcidev, PAGE_SIZE << order,
  1569. &s->dmaaddr_tmpbuff)))
  1570. break;
  1571. if (!s->tmpbuff) {
  1572. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  1573. "cs4281: prog_dmabuf(): unable to allocate tmpbuff\n"));
  1574. return -ENOMEM;
  1575. }
  1576. s->buforder_tmpbuff = order;
  1577. // Now mark the pages as reserved; otherwise the
  1578. // remap_pfn_range() in cs4281_mmap doesn't work.
  1579. // 1. get index to last page in mem_map array for rawbuf.
  1580. mapend = virt_to_page(s->tmpbuff +
  1581. (PAGE_SIZE << s->buforder_tmpbuff) - 1);
  1582. // 2. mark each physical page in range as 'reserved'.
  1583. for (map = virt_to_page(s->tmpbuff); map <= mapend; map++)
  1584. SetPageReserved(map);
  1585. }
  1586. if (db->type == CS_TYPE_DAC) {
  1587. if (s->prop_dac.fmt & (AFMT_S16_LE | AFMT_U16_LE))
  1588. sample_shift++;
  1589. if (s->prop_dac.channels > 1)
  1590. sample_shift++;
  1591. bytespersec = s->prop_dac.rate << sample_shift;
  1592. } else // CS_TYPE_ADC
  1593. {
  1594. if (s->prop_adc.fmt & (AFMT_S16_LE | AFMT_U16_LE))
  1595. sample_shift++;
  1596. if (s->prop_adc.channels > 1)
  1597. sample_shift++;
  1598. bytespersec = s->prop_adc.rate << sample_shift;
  1599. }
  1600. bufs = PAGE_SIZE << db->buforder;
  1601. /*
  1602. * added fractional "defaultorder" inputs. if >100 then use
  1603. * defaultorder-100 as power of 2 for the buffer size. example:
  1604. * 106 = 2^(106-100) = 2^6 = 64 bytes for the buffer size.
  1605. */
  1606. if(defaultorder >= 100)
  1607. {
  1608. bufs = 1 << (defaultorder-100);
  1609. }
  1610. #define INTERRUPT_RATE_MS 100 // Interrupt rate in milliseconds.
  1611. db->numfrag = 2;
  1612. /*
  1613. * Nominal frag size(bytes/interrupt)
  1614. */
  1615. temp1 = bytespersec / (1000 / INTERRUPT_RATE_MS);
  1616. db->fragshift = 8; // Min 256 bytes.
  1617. while (1 << db->fragshift < temp1) // Calc power of 2 frag size.
  1618. db->fragshift += 1;
  1619. db->fragsize = 1 << db->fragshift;
  1620. db->dmasize = db->fragsize * 2;
  1621. db->fragsamples = db->fragsize >> sample_shift; // # samples/fragment.
  1622. // If the calculated size is larger than the allocated
  1623. // buffer, divide the allocated buffer into 2 fragments.
  1624. if (db->dmasize > bufs) {
  1625. db->numfrag = 2; // Two fragments.
  1626. db->fragsize = bufs >> 1; // Each 1/2 the alloc'ed buffer.
  1627. db->fragsamples = db->fragsize >> sample_shift; // # samples/fragment.
  1628. db->dmasize = bufs; // Use all the alloc'ed buffer.
  1629. db->fragshift = 0; // Calculate 'fragshift'.
  1630. temp1 = db->fragsize; // update_ptr() uses it
  1631. while ((temp1 >>= 1) > 1) // to calc 'total-bytes'
  1632. db->fragshift += 1; // returned in DSP_GETI/OPTR.
  1633. }
  1634. CS_DBGOUT(CS_PARMS, 3, printk(KERN_INFO
  1635. "cs4281: prog_dmabuf(): numfrag=%d fragsize=%d fragsamples=%d fragshift=%d bufs=%d fmt=0x%x ch=%d\n",
  1636. db->numfrag, db->fragsize, db->fragsamples,
  1637. db->fragshift, bufs,
  1638. (db->type == CS_TYPE_DAC) ? s->prop_dac.fmt :
  1639. s->prop_adc.fmt,
  1640. (db->type == CS_TYPE_DAC) ? s->prop_dac.channels :
  1641. s->prop_adc.channels));
  1642. CS_DBGOUT(CS_FUNCTION, 2,
  1643. printk(KERN_INFO "cs4281: prog_dmabuf()-\n"));
  1644. return 0;
  1645. }
  1646. static int prog_dmabuf_adc(struct cs4281_state *s)
  1647. {
  1648. unsigned long va;
  1649. unsigned count;
  1650. int c;
  1651. stop_adc(s);
  1652. s->dma_adc.type = CS_TYPE_ADC;
  1653. if ((c = prog_dmabuf(s, &s->dma_adc)))
  1654. return c;
  1655. if (s->dma_adc.rawbuf) {
  1656. memset(s->dma_adc.rawbuf,
  1657. (s->prop_adc.
  1658. fmt & (AFMT_U8 | AFMT_U16_LE)) ? 0x80 : 0,
  1659. s->dma_adc.dmasize);
  1660. }
  1661. if (s->tmpbuff) {
  1662. memset(s->tmpbuff,
  1663. (s->prop_adc.
  1664. fmt & (AFMT_U8 | AFMT_U16_LE)) ? 0x80 : 0,
  1665. PAGE_SIZE << s->buforder_tmpbuff);
  1666. }
  1667. va = virt_to_bus(s->dma_adc.rawbuf);
  1668. count = s->dma_adc.dmasize;
  1669. if (s->prop_adc.
  1670. fmt & (AFMT_S16_LE | AFMT_U16_LE | AFMT_S16_BE | AFMT_U16_BE))
  1671. count /= 2; // 16-bit.
  1672. if (s->prop_adc.channels > 1)
  1673. count /= 2; // Assume stereo.
  1674. CS_DBGOUT(CS_WAVE_READ, 3, printk(KERN_INFO
  1675. "cs4281: prog_dmabuf_adc(): count=%d va=0x%.8x\n",
  1676. count, (unsigned) va));
  1677. writel(va, s->pBA0 + BA0_DBA1); // Set buffer start address.
  1678. writel(count - 1, s->pBA0 + BA0_DBC1); // Set count.
  1679. s->dma_adc.ready = 1;
  1680. return 0;
  1681. }
  1682. static int prog_dmabuf_dac(struct cs4281_state *s)
  1683. {
  1684. unsigned long va;
  1685. unsigned count;
  1686. int c;
  1687. stop_dac(s);
  1688. s->dma_dac.type = CS_TYPE_DAC;
  1689. if ((c = prog_dmabuf(s, &s->dma_dac)))
  1690. return c;
  1691. memset(s->dma_dac.rawbuf,
  1692. (s->prop_dac.fmt & (AFMT_U8 | AFMT_U16_LE)) ? 0x80 : 0,
  1693. s->dma_dac.dmasize);
  1694. va = virt_to_bus(s->dma_dac.rawbuf);
  1695. count = s->dma_dac.dmasize;
  1696. if (s->prop_dac.
  1697. fmt & (AFMT_S16_LE | AFMT_U16_LE | AFMT_S16_BE | AFMT_U16_BE))
  1698. count /= 2; // 16-bit.
  1699. if (s->prop_dac.channels > 1)
  1700. count /= 2; // Assume stereo.
  1701. writel(va, s->pBA0 + BA0_DBA0); // Set buffer start address.
  1702. writel(count - 1, s->pBA0 + BA0_DBC0); // Set count.
  1703. CS_DBGOUT(CS_WAVE_WRITE, 3, printk(KERN_INFO
  1704. "cs4281: prog_dmabuf_dac(): count=%d va=0x%.8x\n",
  1705. count, (unsigned) va));
  1706. s->dma_dac.ready = 1;
  1707. return 0;
  1708. }
  1709. static void clear_advance(void *buf, unsigned bsize, unsigned bptr,
  1710. unsigned len, unsigned char c)
  1711. {
  1712. if (bptr + len > bsize) {
  1713. unsigned x = bsize - bptr;
  1714. memset(((char *) buf) + bptr, c, x);
  1715. bptr = 0;
  1716. len -= x;
  1717. }
  1718. CS_DBGOUT(CS_WAVE_WRITE, 4, printk(KERN_INFO
  1719. "cs4281: clear_advance(): memset %d at %p for %d size \n",
  1720. (unsigned)c, ((char *) buf) + bptr, len));
  1721. memset(((char *) buf) + bptr, c, len);
  1722. }
  1723. // call with spinlock held!
  1724. static void cs4281_update_ptr(struct cs4281_state *s, int intflag)
  1725. {
  1726. int diff;
  1727. unsigned hwptr, va;
  1728. // update ADC pointer
  1729. if (s->ena & FMODE_READ) {
  1730. hwptr = readl(s->pBA0 + BA0_DCA1); // Read capture DMA address.
  1731. va = virt_to_bus(s->dma_adc.rawbuf);
  1732. hwptr -= (unsigned) va;
  1733. diff =
  1734. (s->dma_adc.dmasize + hwptr -
  1735. s->dma_adc.hwptr) % s->dma_adc.dmasize;
  1736. s->dma_adc.hwptr = hwptr;
  1737. s->dma_adc.total_bytes += diff;
  1738. s->dma_adc.count += diff;
  1739. if (s->dma_adc.count > s->dma_adc.dmasize)
  1740. s->dma_adc.count = s->dma_adc.dmasize;
  1741. if (s->dma_adc.mapped) {
  1742. if (s->dma_adc.count >=
  1743. (signed) s->dma_adc.fragsize) wake_up(&s->
  1744. dma_adc.
  1745. wait);
  1746. } else {
  1747. if (s->dma_adc.count > 0)
  1748. wake_up(&s->dma_adc.wait);
  1749. }
  1750. CS_DBGOUT(CS_PARMS, 8, printk(KERN_INFO
  1751. "cs4281: cs4281_update_ptr(): s=%p hwptr=%d total_bytes=%d count=%d \n",
  1752. s, s->dma_adc.hwptr, s->dma_adc.total_bytes, s->dma_adc.count));
  1753. }
  1754. // update DAC pointer
  1755. //
  1756. // check for end of buffer, means that we are going to wait for another interrupt
  1757. // to allow silence to fill the fifos on the part, to keep pops down to a minimum.
  1758. //
  1759. if (s->ena & FMODE_WRITE) {
  1760. hwptr = readl(s->pBA0 + BA0_DCA0); // Read play DMA address.
  1761. va = virt_to_bus(s->dma_dac.rawbuf);
  1762. hwptr -= (unsigned) va;
  1763. diff = (s->dma_dac.dmasize + hwptr -
  1764. s->dma_dac.hwptr) % s->dma_dac.dmasize;
  1765. s->dma_dac.hwptr = hwptr;
  1766. s->dma_dac.total_bytes += diff;
  1767. if (s->dma_dac.mapped) {
  1768. s->dma_dac.count += diff;
  1769. if (s->dma_dac.count >= s->dma_dac.fragsize) {
  1770. s->dma_dac.wakeup = 1;
  1771. wake_up(&s->dma_dac.wait);
  1772. if (s->dma_dac.count > s->dma_dac.dmasize)
  1773. s->dma_dac.count &=
  1774. s->dma_dac.dmasize - 1;
  1775. }
  1776. } else {
  1777. s->dma_dac.count -= diff;
  1778. if (s->dma_dac.count <= 0) {
  1779. //
  1780. // fill with silence, and do not shut down the DAC.
  1781. // Continue to play silence until the _release.
  1782. //
  1783. CS_DBGOUT(CS_WAVE_WRITE, 6, printk(KERN_INFO
  1784. "cs4281: cs4281_update_ptr(): memset %d at %p for %d size \n",
  1785. (unsigned)(s->prop_dac.fmt &
  1786. (AFMT_U8 | AFMT_U16_LE)) ? 0x80 : 0,
  1787. s->dma_dac.rawbuf, s->dma_dac.dmasize));
  1788. memset(s->dma_dac.rawbuf,
  1789. (s->prop_dac.
  1790. fmt & (AFMT_U8 | AFMT_U16_LE)) ?
  1791. 0x80 : 0, s->dma_dac.dmasize);
  1792. if (s->dma_dac.count < 0) {
  1793. s->dma_dac.underrun = 1;
  1794. s->dma_dac.count = 0;
  1795. CS_DBGOUT(CS_ERROR, 9, printk(KERN_INFO
  1796. "cs4281: cs4281_update_ptr(): underrun\n"));
  1797. }
  1798. } else if (s->dma_dac.count <=
  1799. (signed) s->dma_dac.fragsize
  1800. && !s->dma_dac.endcleared) {
  1801. clear_advance(s->dma_dac.rawbuf,
  1802. s->dma_dac.dmasize,
  1803. s->dma_dac.swptr,
  1804. s->dma_dac.fragsize,
  1805. (s->prop_dac.
  1806. fmt & (AFMT_U8 |
  1807. AFMT_U16_LE)) ? 0x80
  1808. : 0);
  1809. s->dma_dac.endcleared = 1;
  1810. }
  1811. if ( (s->dma_dac.count <= (signed) s->dma_dac.dmasize/2) ||
  1812. intflag)
  1813. {
  1814. wake_up(&s->dma_dac.wait);
  1815. }
  1816. }
  1817. CS_DBGOUT(CS_PARMS, 8, printk(KERN_INFO
  1818. "cs4281: cs4281_update_ptr(): s=%p hwptr=%d total_bytes=%d count=%d \n",
  1819. s, s->dma_dac.hwptr, s->dma_dac.total_bytes, s->dma_dac.count));
  1820. }
  1821. }
  1822. // ---------------------------------------------------------------------
  1823. static void prog_codec(struct cs4281_state *s, unsigned type)
  1824. {
  1825. unsigned long flags;
  1826. unsigned temp1, format;
  1827. CS_DBGOUT(CS_FUNCTION, 2,
  1828. printk(KERN_INFO "cs4281: prog_codec()+ \n"));
  1829. spin_lock_irqsave(&s->lock, flags);
  1830. if (type == CS_TYPE_ADC) {
  1831. temp1 = readl(s->pBA0 + BA0_DCR1);
  1832. writel(temp1 | DCRn_MSK, s->pBA0 + BA0_DCR1); // Stop capture DMA, if active.
  1833. // program sampling rates
  1834. // Note, for CS4281, capture & play rates can be set independently.
  1835. cs4281_record_rate(s, s->prop_adc.rate);
  1836. // program ADC parameters
  1837. format = DMRn_DMA | DMRn_AUTO | DMRn_TR_WRITE;
  1838. if (s->prop_adc.
  1839. fmt & (AFMT_S16_LE | AFMT_U16_LE | AFMT_S16_BE | AFMT_U16_BE)) { // 16-bit
  1840. if (s->prop_adc.fmt & (AFMT_S16_BE | AFMT_U16_BE)) // Big-endian?
  1841. format |= DMRn_BEND;
  1842. if (s->prop_adc.fmt & (AFMT_U16_LE | AFMT_U16_BE))
  1843. format |= DMRn_USIGN; // Unsigned.
  1844. } else
  1845. format |= DMRn_SIZE8 | DMRn_USIGN; // 8-bit, unsigned
  1846. if (s->prop_adc.channels < 2)
  1847. format |= DMRn_MONO;
  1848. writel(format, s->pBA0 + BA0_DMR1);
  1849. CS_DBGOUT(CS_PARMS, 2, printk(KERN_INFO
  1850. "cs4281: prog_codec(): adc %s %s %s rate=%d DMR0 format=0x%.8x\n",
  1851. (format & DMRn_SIZE8) ? "8" : "16",
  1852. (format & DMRn_USIGN) ? "Unsigned" : "Signed",
  1853. (format & DMRn_MONO) ? "Mono" : "Stereo",
  1854. s->prop_adc.rate, format));
  1855. s->ena &= ~FMODE_READ; // not capturing data yet
  1856. }
  1857. if (type == CS_TYPE_DAC) {
  1858. temp1 = readl(s->pBA0 + BA0_DCR0);
  1859. writel(temp1 | DCRn_MSK, s->pBA0 + BA0_DCR0); // Stop play DMA, if active.
  1860. // program sampling rates
  1861. // Note, for CS4281, capture & play rates can be set independently.
  1862. cs4281_play_rate(s, s->prop_dac.rate);
  1863. // program DAC parameters
  1864. format = DMRn_DMA | DMRn_AUTO | DMRn_TR_READ;
  1865. if (s->prop_dac.
  1866. fmt & (AFMT_S16_LE | AFMT_U16_LE | AFMT_S16_BE | AFMT_U16_BE)) { // 16-bit
  1867. if (s->prop_dac.fmt & (AFMT_S16_BE | AFMT_U16_BE))
  1868. format |= DMRn_BEND; // Big Endian.
  1869. if (s->prop_dac.fmt & (AFMT_U16_LE | AFMT_U16_BE))
  1870. format |= DMRn_USIGN; // Unsigned.
  1871. } else
  1872. format |= DMRn_SIZE8 | DMRn_USIGN; // 8-bit, unsigned
  1873. if (s->prop_dac.channels < 2)
  1874. format |= DMRn_MONO;
  1875. writel(format, s->pBA0 + BA0_DMR0);
  1876. CS_DBGOUT(CS_PARMS, 2, printk(KERN_INFO
  1877. "cs4281: prog_codec(): dac %s %s %s rate=%d DMR0 format=0x%.8x\n",
  1878. (format & DMRn_SIZE8) ? "8" : "16",
  1879. (format & DMRn_USIGN) ? "Unsigned" : "Signed",
  1880. (format & DMRn_MONO) ? "Mono" : "Stereo",
  1881. s->prop_dac.rate, format));
  1882. s->ena &= ~FMODE_WRITE; // not capturing data yet
  1883. }
  1884. spin_unlock_irqrestore(&s->lock, flags);
  1885. CS_DBGOUT(CS_FUNCTION, 2,
  1886. printk(KERN_INFO "cs4281: prog_codec()- \n"));
  1887. }
  1888. static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
  1889. unsigned long arg)
  1890. {
  1891. // Index to mixer_src[] is value of AC97 Input Mux Select Reg.
  1892. // Value of array member is recording source Device ID Mask.
  1893. static const unsigned int mixer_src[8] = {
  1894. SOUND_MASK_MIC, SOUND_MASK_CD, 0, SOUND_MASK_LINE1,
  1895. SOUND_MASK_LINE, SOUND_MASK_VOLUME, 0, 0
  1896. };
  1897. void __user *argp = (void __user *)arg;
  1898. // Index of mixtable1[] member is Device ID
  1899. // and must be <= SOUND_MIXER_NRDEVICES.
  1900. // Value of array member is index into s->mix.vol[]
  1901. static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
  1902. [SOUND_MIXER_PCM] = 1, // voice
  1903. [SOUND_MIXER_LINE1] = 2, // AUX
  1904. [SOUND_MIXER_CD] = 3, // CD
  1905. [SOUND_MIXER_LINE] = 4, // Line
  1906. [SOUND_MIXER_SYNTH] = 5, // FM
  1907. [SOUND_MIXER_MIC] = 6, // Mic
  1908. [SOUND_MIXER_SPEAKER] = 7, // Speaker
  1909. [SOUND_MIXER_RECLEV] = 8, // Recording level
  1910. [SOUND_MIXER_VOLUME] = 9 // Master Volume
  1911. };
  1912. static const unsigned mixreg[] = {
  1913. BA0_AC97_PCM_OUT_VOLUME,
  1914. BA0_AC97_AUX_VOLUME,
  1915. BA0_AC97_CD_VOLUME,
  1916. BA0_AC97_LINE_IN_VOLUME
  1917. };
  1918. unsigned char l, r, rl, rr, vidx;
  1919. unsigned char attentbl[11] =
  1920. { 63, 42, 26, 17, 14, 11, 8, 6, 4, 2, 0 };
  1921. unsigned temp1;
  1922. int i, val;
  1923. VALIDATE_STATE(s);
  1924. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
  1925. "cs4281: mixer_ioctl(): s=%p cmd=0x%.8x\n", s, cmd));
  1926. #if CSDEBUG
  1927. cs_printioctl(cmd);
  1928. #endif
  1929. #if CSDEBUG_INTERFACE
  1930. if ((cmd == SOUND_MIXER_CS_GETDBGMASK) ||
  1931. (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
  1932. (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
  1933. (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
  1934. (cmd == SOUND_MIXER_CS_APM))
  1935. {
  1936. switch (cmd) {
  1937. case SOUND_MIXER_CS_GETDBGMASK:
  1938. return put_user(cs_debugmask,
  1939. (unsigned long __user *) argp);
  1940. case SOUND_MIXER_CS_GETDBGLEVEL:
  1941. return put_user(cs_debuglevel,
  1942. (unsigned long __user *) argp);
  1943. case SOUND_MIXER_CS_SETDBGMASK:
  1944. if (get_user(val, (unsigned long __user *) argp))
  1945. return -EFAULT;
  1946. cs_debugmask = val;
  1947. return 0;
  1948. case SOUND_MIXER_CS_SETDBGLEVEL:
  1949. if (get_user(val, (unsigned long __user *) argp))
  1950. return -EFAULT;
  1951. cs_debuglevel = val;
  1952. return 0;
  1953. #ifndef NOT_CS4281_PM
  1954. case SOUND_MIXER_CS_APM:
  1955. if (get_user(val, (unsigned long __user *) argp))
  1956. return -EFAULT;
  1957. if(val == CS_IOCTL_CMD_SUSPEND)
  1958. cs4281_suspend(s);
  1959. else if(val == CS_IOCTL_CMD_RESUME)
  1960. cs4281_resume(s);
  1961. else
  1962. {
  1963. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
  1964. "cs4281: mixer_ioctl(): invalid APM cmd (%d)\n",
  1965. val));
  1966. }
  1967. return 0;
  1968. #endif
  1969. default:
  1970. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
  1971. "cs4281: mixer_ioctl(): ERROR unknown debug cmd\n"));
  1972. return 0;
  1973. }
  1974. }
  1975. #endif
  1976. if (cmd == SOUND_MIXER_PRIVATE1) {
  1977. // enable/disable/query mixer preamp
  1978. if (get_user(val, (int __user *) argp))
  1979. return -EFAULT;
  1980. if (val != -1) {
  1981. cs4281_read_ac97(s, BA0_AC97_MIC_VOLUME, &temp1);
  1982. temp1 = val ? (temp1 | 0x40) : (temp1 & 0xffbf);
  1983. cs4281_write_ac97(s, BA0_AC97_MIC_VOLUME, temp1);
  1984. }
  1985. cs4281_read_ac97(s, BA0_AC97_MIC_VOLUME, &temp1);
  1986. val = (temp1 & 0x40) ? 1 : 0;
  1987. return put_user(val, (int __user *) argp);
  1988. }
  1989. if (cmd == SOUND_MIXER_PRIVATE2) {
  1990. // enable/disable/query spatializer
  1991. if (get_user(val, (int __user *)argp))
  1992. return -EFAULT;
  1993. if (val != -1) {
  1994. temp1 = (val & 0x3f) >> 2;
  1995. cs4281_write_ac97(s, BA0_AC97_3D_CONTROL, temp1);
  1996. cs4281_read_ac97(s, BA0_AC97_GENERAL_PURPOSE,
  1997. &temp1);
  1998. cs4281_write_ac97(s, BA0_AC97_GENERAL_PURPOSE,
  1999. temp1 | 0x2000);
  2000. }
  2001. cs4281_read_ac97(s, BA0_AC97_3D_CONTROL, &temp1);
  2002. return put_user((temp1 << 2) | 3, (int __user *)argp);
  2003. }
  2004. if (cmd == SOUND_MIXER_INFO) {
  2005. mixer_info info;
  2006. strlcpy(info.id, "CS4281", sizeof(info.id));
  2007. strlcpy(info.name, "Crystal CS4281", sizeof(info.name));
  2008. info.modify_counter = s->mix.modcnt;
  2009. if (copy_to_user(argp, &info, sizeof(info)))
  2010. return -EFAULT;
  2011. return 0;
  2012. }
  2013. if (cmd == SOUND_OLD_MIXER_INFO) {
  2014. _old_mixer_info info;
  2015. strlcpy(info.id, "CS4281", sizeof(info.id));
  2016. strlcpy(info.name, "Crystal CS4281", sizeof(info.name));
  2017. if (copy_to_user(argp, &info, sizeof(info)))
  2018. return -EFAULT;
  2019. return 0;
  2020. }
  2021. if (cmd == OSS_GETVERSION)
  2022. return put_user(SOUND_VERSION, (int __user *) argp);
  2023. if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
  2024. return -EINVAL;
  2025. // If ioctl has only the SIOC_READ bit(bit 31)
  2026. // on, process the only-read commands.
  2027. if (_SIOC_DIR(cmd) == _SIOC_READ) {
  2028. switch (_IOC_NR(cmd)) {
  2029. case SOUND_MIXER_RECSRC: // Arg contains a bit for each recording source
  2030. cs4281_read_ac97(s, BA0_AC97_RECORD_SELECT, &temp1);
  2031. return put_user(mixer_src[temp1&7], (int __user *)argp);
  2032. case SOUND_MIXER_DEVMASK: // Arg contains a bit for each supported device
  2033. return put_user(SOUND_MASK_PCM | SOUND_MASK_SYNTH |
  2034. SOUND_MASK_CD | SOUND_MASK_LINE |
  2035. SOUND_MASK_LINE1 | SOUND_MASK_MIC |
  2036. SOUND_MASK_VOLUME |
  2037. SOUND_MASK_RECLEV |
  2038. SOUND_MASK_SPEAKER, (int __user *)argp);
  2039. case SOUND_MIXER_RECMASK: // Arg contains a bit for each supported recording source
  2040. return put_user(SOUND_MASK_LINE | SOUND_MASK_MIC |
  2041. SOUND_MASK_CD | SOUND_MASK_VOLUME |
  2042. SOUND_MASK_LINE1, (int __user *) argp);
  2043. case SOUND_MIXER_STEREODEVS: // Mixer channels supporting stereo
  2044. return put_user(SOUND_MASK_PCM | SOUND_MASK_SYNTH |
  2045. SOUND_MASK_CD | SOUND_MASK_LINE |
  2046. SOUND_MASK_LINE1 | SOUND_MASK_MIC |
  2047. SOUND_MASK_VOLUME |
  2048. SOUND_MASK_RECLEV, (int __user *)argp);
  2049. case SOUND_MIXER_CAPS:
  2050. return put_user(SOUND_CAP_EXCL_INPUT, (int __user *)argp);
  2051. default:
  2052. i = _IOC_NR(cmd);
  2053. if (i >= SOUND_MIXER_NRDEVICES
  2054. || !(vidx = mixtable1[i]))
  2055. return -EINVAL;
  2056. return put_user(s->mix.vol[vidx - 1], (int __user *)argp);
  2057. }
  2058. }
  2059. // If ioctl doesn't have both the SIOC_READ and
  2060. // the SIOC_WRITE bit set, return invalid.
  2061. if (_SIOC_DIR(cmd) != (_SIOC_READ | _SIOC_WRITE))
  2062. return -EINVAL;
  2063. // Increment the count of volume writes.
  2064. s->mix.modcnt++;
  2065. // Isolate the command; it must be a write.
  2066. switch (_IOC_NR(cmd)) {
  2067. case SOUND_MIXER_RECSRC: // Arg contains a bit for each recording source
  2068. if (get_user(val, (int __user *)argp))
  2069. return -EFAULT;
  2070. i = hweight32(val); // i = # bits on in val.
  2071. if (i != 1) // One & only 1 bit must be on.
  2072. return 0;
  2073. for (i = 0; i < sizeof(mixer_src) / sizeof(int); i++) {
  2074. if (val == mixer_src[i]) {
  2075. temp1 = (i << 8) | i;
  2076. cs4281_write_ac97(s,
  2077. BA0_AC97_RECORD_SELECT,
  2078. temp1);
  2079. return 0;
  2080. }
  2081. }
  2082. return 0;
  2083. case SOUND_MIXER_VOLUME:
  2084. if (get_user(val, (int __user *)argp))
  2085. return -EFAULT;
  2086. l = val & 0xff;
  2087. if (l > 100)
  2088. l = 100; // Max soundcard.h vol is 100.
  2089. if (l < 6) {
  2090. rl = 63;
  2091. l = 0;
  2092. } else
  2093. rl = attentbl[(10 * l) / 100]; // Convert 0-100 vol to 63-0 atten.
  2094. r = (val >> 8) & 0xff;
  2095. if (r > 100)
  2096. r = 100; // Max right volume is 100, too
  2097. if (r < 6) {
  2098. rr = 63;
  2099. r = 0;
  2100. } else
  2101. rr = attentbl[(10 * r) / 100]; // Convert volume to attenuation.
  2102. if ((rl > 60) && (rr > 60)) // If both l & r are 'low',
  2103. temp1 = 0x8000; // turn on the mute bit.
  2104. else
  2105. temp1 = 0;
  2106. temp1 |= (rl << 8) | rr;
  2107. cs4281_write_ac97(s, BA0_AC97_MASTER_VOLUME, temp1);
  2108. cs4281_write_ac97(s, BA0_AC97_HEADPHONE_VOLUME, temp1);
  2109. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  2110. s->mix.vol[8] = ((unsigned int) r << 8) | l;
  2111. #else
  2112. s->mix.vol[8] = val;
  2113. #endif
  2114. return put_user(s->mix.vol[8], (int __user *)argp);
  2115. case SOUND_MIXER_SPEAKER:
  2116. if (get_user(val, (int __user *)argp))
  2117. return -EFAULT;
  2118. l = val & 0xff;
  2119. if (l > 100)
  2120. l = 100;
  2121. if (l < 3) {
  2122. rl = 0;
  2123. l = 0;
  2124. } else {
  2125. rl = (l * 2 - 5) / 13; // Convert 0-100 range to 0-15.
  2126. l = (rl * 13 + 5) / 2;
  2127. }
  2128. if (rl < 3) {
  2129. temp1 = 0x8000;
  2130. rl = 0;
  2131. } else
  2132. temp1 = 0;
  2133. rl = 15 - rl; // Convert volume to attenuation.
  2134. temp1 |= rl << 1;
  2135. cs4281_write_ac97(s, BA0_AC97_PC_BEEP_VOLUME, temp1);
  2136. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  2137. s->mix.vol[6] = l << 8;
  2138. #else
  2139. s->mix.vol[6] = val;
  2140. #endif
  2141. return put_user(s->mix.vol[6], (int __user *)argp);
  2142. case SOUND_MIXER_RECLEV:
  2143. if (get_user(val, (int __user *)argp))
  2144. return -EFAULT;
  2145. l = val & 0xff;
  2146. if (l > 100)
  2147. l = 100;
  2148. r = (val >> 8) & 0xff;
  2149. if (r > 100)
  2150. r = 100;
  2151. rl = (l * 2 - 5) / 13; // Convert 0-100 scale to 0-15.
  2152. rr = (r * 2 - 5) / 13;
  2153. if (rl < 3 && rr < 3)
  2154. temp1 = 0x8000;
  2155. else
  2156. temp1 = 0;
  2157. temp1 = temp1 | (rl << 8) | rr;
  2158. cs4281_write_ac97(s, BA0_AC97_RECORD_GAIN, temp1);
  2159. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  2160. s->mix.vol[7] = ((unsigned int) r << 8) | l;
  2161. #else
  2162. s->mix.vol[7] = val;
  2163. #endif
  2164. return put_user(s->mix.vol[7], (int __user *)argp);
  2165. case SOUND_MIXER_MIC:
  2166. if (get_user(val, (int __user *)argp))
  2167. return -EFAULT;
  2168. l = val & 0xff;
  2169. if (l > 100)
  2170. l = 100;
  2171. if (l < 1) {
  2172. l = 0;
  2173. rl = 0;
  2174. } else {
  2175. rl = ((unsigned) l * 5 - 4) / 16; // Convert 0-100 range to 0-31.
  2176. l = (rl * 16 + 4) / 5;
  2177. }
  2178. cs4281_read_ac97(s, BA0_AC97_MIC_VOLUME, &temp1);
  2179. temp1 &= 0x40; // Isolate 20db gain bit.
  2180. if (rl < 3) {
  2181. temp1 |= 0x8000;
  2182. rl = 0;
  2183. }
  2184. rl = 31 - rl; // Convert volume to attenuation.
  2185. temp1 |= rl;
  2186. cs4281_write_ac97(s, BA0_AC97_MIC_VOLUME, temp1);
  2187. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  2188. s->mix.vol[5] = val << 8;
  2189. #else
  2190. s->mix.vol[5] = val;
  2191. #endif
  2192. return put_user(s->mix.vol[5], (int __user *)argp);
  2193. case SOUND_MIXER_SYNTH:
  2194. if (get_user(val, (int __user *)argp))
  2195. return -EFAULT;
  2196. l = val & 0xff;
  2197. if (l > 100)
  2198. l = 100;
  2199. if (get_user(val, (int __user *)argp))
  2200. return -EFAULT;
  2201. r = (val >> 8) & 0xff;
  2202. if (r > 100)
  2203. r = 100;
  2204. rl = (l * 2 - 11) / 3; // Convert 0-100 range to 0-63.
  2205. rr = (r * 2 - 11) / 3;
  2206. if (rl < 3) // If l is low, turn on
  2207. temp1 = 0x0080; // the mute bit.
  2208. else
  2209. temp1 = 0;
  2210. rl = 63 - rl; // Convert vol to attenuation.
  2211. writel(temp1 | rl, s->pBA0 + BA0_FMLVC);
  2212. if (rr < 3) // If rr is low, turn on
  2213. temp1 = 0x0080; // the mute bit.
  2214. else
  2215. temp1 = 0;
  2216. rr = 63 - rr; // Convert vol to attenuation.
  2217. writel(temp1 | rr, s->pBA0 + BA0_FMRVC);
  2218. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  2219. s->mix.vol[4] = (r << 8) | l;
  2220. #else
  2221. s->mix.vol[4] = val;
  2222. #endif
  2223. return put_user(s->mix.vol[4], (int __user *)argp);
  2224. default:
  2225. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  2226. "cs4281: mixer_ioctl(): default\n"));
  2227. i = _IOC_NR(cmd);
  2228. if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
  2229. return -EINVAL;
  2230. if (get_user(val, (int __user *)argp))
  2231. return -EFAULT;
  2232. l = val & 0xff;
  2233. if (l > 100)
  2234. l = 100;
  2235. if (l < 1) {
  2236. l = 0;
  2237. rl = 31;
  2238. } else
  2239. rl = (attentbl[(l * 10) / 100]) >> 1;
  2240. r = (val >> 8) & 0xff;
  2241. if (r > 100)
  2242. r = 100;
  2243. if (r < 1) {
  2244. r = 0;
  2245. rr = 31;
  2246. } else
  2247. rr = (attentbl[(r * 10) / 100]) >> 1;
  2248. if ((rl > 30) && (rr > 30))
  2249. temp1 = 0x8000;
  2250. else
  2251. temp1 = 0;
  2252. temp1 = temp1 | (rl << 8) | rr;
  2253. cs4281_write_ac97(s, mixreg[vidx - 1], temp1);
  2254. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  2255. s->mix.vol[vidx - 1] = ((unsigned int) r << 8) | l;
  2256. #else
  2257. s->mix.vol[vidx - 1] = val;
  2258. #endif
  2259. #ifndef NOT_CS4281_PM
  2260. CS_DBGOUT(CS_PM, 9, printk(KERN_INFO
  2261. "write ac97 mixreg[%d]=0x%x mix.vol[]=0x%x\n",
  2262. vidx-1,temp1,s->mix.vol[vidx-1]));
  2263. #endif
  2264. return put_user(s->mix.vol[vidx - 1], (int __user *)argp);
  2265. }
  2266. }
  2267. // ---------------------------------------------------------------------
  2268. static int cs4281_open_mixdev(struct inode *inode, struct file *file)
  2269. {
  2270. unsigned int minor = iminor(inode);
  2271. struct cs4281_state *s=NULL;
  2272. struct list_head *entry;
  2273. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
  2274. printk(KERN_INFO "cs4281: cs4281_open_mixdev()+\n"));
  2275. list_for_each(entry, &cs4281_devs)
  2276. {
  2277. s = list_entry(entry, struct cs4281_state, list);
  2278. if(s->dev_mixer == minor)
  2279. break;
  2280. }
  2281. if (!s)
  2282. {
  2283. CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
  2284. printk(KERN_INFO "cs4281: cs4281_open_mixdev()- -ENODEV\n"));
  2285. return -ENODEV;
  2286. }
  2287. VALIDATE_STATE(s);
  2288. file->private_data = s;
  2289. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
  2290. printk(KERN_INFO "cs4281: cs4281_open_mixdev()- 0\n"));
  2291. return nonseekable_open(inode, file);
  2292. }
  2293. static int cs4281_release_mixdev(struct inode *inode, struct file *file)
  2294. {
  2295. struct cs4281_state *s =
  2296. (struct cs4281_state *) file->private_data;
  2297. VALIDATE_STATE(s);
  2298. return 0;
  2299. }
  2300. static int cs4281_ioctl_mixdev(struct inode *inode, struct file *file,
  2301. unsigned int cmd, unsigned long arg)
  2302. {
  2303. return mixer_ioctl((struct cs4281_state *) file->private_data, cmd,
  2304. arg);
  2305. }
  2306. // ******************************************************************************************
  2307. // Mixer file operations struct.
  2308. // ******************************************************************************************
  2309. static /*const */ struct file_operations cs4281_mixer_fops = {
  2310. .owner = THIS_MODULE,
  2311. .llseek = no_llseek,
  2312. .ioctl = cs4281_ioctl_mixdev,
  2313. .open = cs4281_open_mixdev,
  2314. .release = cs4281_release_mixdev,
  2315. };
  2316. // ---------------------------------------------------------------------
  2317. static int drain_adc(struct cs4281_state *s, int nonblock)
  2318. {
  2319. DECLARE_WAITQUEUE(wait, current);
  2320. unsigned long flags;
  2321. int count;
  2322. unsigned tmo;
  2323. if (s->dma_adc.mapped)
  2324. return 0;
  2325. add_wait_queue(&s->dma_adc.wait, &wait);
  2326. for (;;) {
  2327. set_current_state(TASK_INTERRUPTIBLE);
  2328. spin_lock_irqsave(&s->lock, flags);
  2329. count = s->dma_adc.count;
  2330. CS_DBGOUT(CS_FUNCTION, 2,
  2331. printk(KERN_INFO "cs4281: drain_adc() %d\n", count));
  2332. spin_unlock_irqrestore(&s->lock, flags);
  2333. if (count <= 0) {
  2334. CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
  2335. "cs4281: drain_adc() count<0\n"));
  2336. break;
  2337. }
  2338. if (signal_pending(current))
  2339. break;
  2340. if (nonblock) {
  2341. remove_wait_queue(&s->dma_adc.wait, &wait);
  2342. current->state = TASK_RUNNING;
  2343. return -EBUSY;
  2344. }
  2345. tmo =
  2346. 3 * HZ * (count +
  2347. s->dma_adc.fragsize) / 2 / s->prop_adc.rate;
  2348. if (s->prop_adc.fmt & (AFMT_S16_LE | AFMT_U16_LE))
  2349. tmo >>= 1;
  2350. if (s->prop_adc.channels > 1)
  2351. tmo >>= 1;
  2352. if (!schedule_timeout(tmo + 1))
  2353. printk(KERN_DEBUG "cs4281: dma timed out??\n");
  2354. }
  2355. remove_wait_queue(&s->dma_adc.wait, &wait);
  2356. current->state = TASK_RUNNING;
  2357. if (signal_pending(current))
  2358. return -ERESTARTSYS;
  2359. return 0;
  2360. }
  2361. static int drain_dac(struct cs4281_state *s, int nonblock)
  2362. {
  2363. DECLARE_WAITQUEUE(wait, current);
  2364. unsigned long flags;
  2365. int count;
  2366. unsigned tmo;
  2367. if (s->dma_dac.mapped)
  2368. return 0;
  2369. add_wait_queue(&s->dma_dac.wait, &wait);
  2370. for (;;) {
  2371. set_current_state(TASK_INTERRUPTIBLE);
  2372. spin_lock_irqsave(&s->lock, flags);
  2373. count = s->dma_dac.count;
  2374. spin_unlock_irqrestore(&s->lock, flags);
  2375. if (count <= 0)
  2376. break;
  2377. if (signal_pending(current))
  2378. break;
  2379. if (nonblock) {
  2380. remove_wait_queue(&s->dma_dac.wait, &wait);
  2381. current->state = TASK_RUNNING;
  2382. return -EBUSY;
  2383. }
  2384. tmo =
  2385. 3 * HZ * (count +
  2386. s->dma_dac.fragsize) / 2 / s->prop_dac.rate;
  2387. if (s->prop_dac.fmt & (AFMT_S16_LE | AFMT_U16_LE))
  2388. tmo >>= 1;
  2389. if (s->prop_dac.channels > 1)
  2390. tmo >>= 1;
  2391. if (!schedule_timeout(tmo + 1))
  2392. printk(KERN_DEBUG "cs4281: dma timed out??\n");
  2393. }
  2394. remove_wait_queue(&s->dma_dac.wait, &wait);
  2395. current->state = TASK_RUNNING;
  2396. if (signal_pending(current))
  2397. return -ERESTARTSYS;
  2398. return 0;
  2399. }
  2400. //****************************************************************************
  2401. //
  2402. // CopySamples copies 16-bit stereo samples from the source to the
  2403. // destination, possibly converting down to either 8-bit or mono or both.
  2404. // count specifies the number of output bytes to write.
  2405. //
  2406. // Arguments:
  2407. //
  2408. // dst - Pointer to a destination buffer.
  2409. // src - Pointer to a source buffer
  2410. // count - The number of bytes to copy into the destination buffer.
  2411. // iChannels - Stereo - 2
  2412. // Mono - 1
  2413. // fmt - AFMT_xxx (soundcard.h formats)
  2414. //
  2415. // NOTES: only call this routine for conversion to 8bit from 16bit
  2416. //
  2417. //****************************************************************************
  2418. static void CopySamples(char *dst, char *src, int count, int iChannels,
  2419. unsigned fmt)
  2420. {
  2421. unsigned short *psSrc;
  2422. long lAudioSample;
  2423. CS_DBGOUT(CS_FUNCTION, 2,
  2424. printk(KERN_INFO "cs4281: CopySamples()+ "));
  2425. CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
  2426. " dst=%p src=%p count=%d iChannels=%d fmt=0x%x\n",
  2427. dst, src, (unsigned) count, (unsigned) iChannels, (unsigned) fmt));
  2428. // Gershwin does format conversion in hardware so normally
  2429. // we don't do any host based coversion. The data formatter
  2430. // truncates 16 bit data to 8 bit and that causes some hiss.
  2431. // We have already forced the HW to do 16 bit sampling and
  2432. // 2 channel so that we can use software to round instead
  2433. // of truncate
  2434. //
  2435. // See if the data should be output as 8-bit unsigned stereo.
  2436. // or if the data should be output at 8-bit unsigned mono.
  2437. //
  2438. if ( ((iChannels == 2) && (fmt & AFMT_U8)) ||
  2439. ((iChannels == 1) && (fmt & AFMT_U8)) ) {
  2440. //
  2441. // Convert each 16-bit unsigned stereo sample to 8-bit unsigned
  2442. // stereo using rounding.
  2443. //
  2444. psSrc = (unsigned short *) src;
  2445. count = count / 2;
  2446. while (count--) {
  2447. lAudioSample = (long) psSrc[count] + (long) 0x80;
  2448. if (lAudioSample > 0xffff) {
  2449. lAudioSample = 0xffff;
  2450. }
  2451. dst[count] = (char) (lAudioSample >> 8);
  2452. }
  2453. }
  2454. //
  2455. // check for 8-bit signed stereo.
  2456. //
  2457. else if ((iChannels == 2) && (fmt & AFMT_S8)) {
  2458. //
  2459. // Convert each 16-bit stereo sample to 8-bit stereo using rounding.
  2460. //
  2461. psSrc = (short *) src;
  2462. while (count--) {
  2463. lAudioSample =
  2464. (((long) psSrc[0] + (long) psSrc[1]) / 2);
  2465. psSrc += 2;
  2466. *dst++ = (char) ((short) lAudioSample >> 8);
  2467. }
  2468. }
  2469. //
  2470. // Otherwise, the data should be output as 8-bit signed mono.
  2471. //
  2472. else if ((iChannels == 1) && (fmt & AFMT_S8)) {
  2473. //
  2474. // Convert each 16-bit signed mono sample to 8-bit signed mono
  2475. // using rounding.
  2476. //
  2477. psSrc = (short *) src;
  2478. count = count / 2;
  2479. while (count--) {
  2480. lAudioSample =
  2481. (((long) psSrc[0] + (long) psSrc[1]) / 2);
  2482. if (lAudioSample > 0x7fff) {
  2483. lAudioSample = 0x7fff;
  2484. }
  2485. psSrc += 2;
  2486. *dst++ = (char) ((short) lAudioSample >> 8);
  2487. }
  2488. }
  2489. }
  2490. //
  2491. // cs_copy_to_user()
  2492. // replacement for the standard copy_to_user, to allow for a conversion from
  2493. // 16 bit to 8 bit if the record conversion is active. the cs4281 has some
  2494. // issues with 8 bit capture, so the driver always captures data in 16 bit
  2495. // and then if the user requested 8 bit, converts from 16 to 8 bit.
  2496. //
  2497. static unsigned cs_copy_to_user(struct cs4281_state *s, void __user *dest,
  2498. unsigned *hwsrc, unsigned cnt,
  2499. unsigned *copied)
  2500. {
  2501. void *src = hwsrc; //default to the standard destination buffer addr
  2502. CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
  2503. "cs_copy_to_user()+ fmt=0x%x fmt_o=0x%x cnt=%d dest=%p\n",
  2504. s->prop_adc.fmt, s->prop_adc.fmt_original,
  2505. (unsigned) cnt, dest));
  2506. if (cnt > s->dma_adc.dmasize) {
  2507. cnt = s->dma_adc.dmasize;
  2508. }
  2509. if (!cnt) {
  2510. *copied = 0;
  2511. return 0;
  2512. }
  2513. if (s->conversion) {
  2514. if (!s->tmpbuff) {
  2515. *copied = cnt / 2;
  2516. return 0;
  2517. }
  2518. CopySamples(s->tmpbuff, (void *) hwsrc, cnt,
  2519. (unsigned) s->prop_adc.channels,
  2520. s->prop_adc.fmt_original);
  2521. src = s->tmpbuff;
  2522. cnt = cnt / 2;
  2523. }
  2524. if (copy_to_user(dest, src, cnt)) {
  2525. *copied = 0;
  2526. return -EFAULT;
  2527. }
  2528. *copied = cnt;
  2529. CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
  2530. "cs4281: cs_copy_to_user()- copied bytes is %d \n", cnt));
  2531. return 0;
  2532. }
  2533. // ---------------------------------------------------------------------
  2534. static ssize_t cs4281_read(struct file *file, char __user *buffer, size_t count,
  2535. loff_t * ppos)
  2536. {
  2537. struct cs4281_state *s =
  2538. (struct cs4281_state *) file->private_data;
  2539. ssize_t ret;
  2540. unsigned long flags;
  2541. unsigned swptr;
  2542. int cnt;
  2543. unsigned copied = 0;
  2544. CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
  2545. printk(KERN_INFO "cs4281: cs4281_read()+ %Zu \n", count));
  2546. VALIDATE_STATE(s);
  2547. if (s->dma_adc.mapped)
  2548. return -ENXIO;
  2549. if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
  2550. return ret;
  2551. if (!access_ok(VERIFY_WRITE, buffer, count))
  2552. return -EFAULT;
  2553. ret = 0;
  2554. //
  2555. // "count" is the amount of bytes to read (from app), is decremented each loop
  2556. // by the amount of bytes that have been returned to the user buffer.
  2557. // "cnt" is the running total of each read from the buffer (changes each loop)
  2558. // "buffer" points to the app's buffer
  2559. // "ret" keeps a running total of the amount of bytes that have been copied
  2560. // to the user buffer.
  2561. // "copied" is the total bytes copied into the user buffer for each loop.
  2562. //
  2563. while (count > 0) {
  2564. CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
  2565. "_read() count>0 count=%Zu .count=%d .swptr=%d .hwptr=%d \n",
  2566. count, s->dma_adc.count,
  2567. s->dma_adc.swptr, s->dma_adc.hwptr));
  2568. spin_lock_irqsave(&s->lock, flags);
  2569. // get the current copy point of the sw buffer
  2570. swptr = s->dma_adc.swptr;
  2571. // cnt is the amount of unread bytes from the end of the
  2572. // hw buffer to the current sw pointer
  2573. cnt = s->dma_adc.dmasize - swptr;
  2574. // dma_adc.count is the current total bytes that have not been read.
  2575. // if the amount of unread bytes from the current sw pointer to the
  2576. // end of the buffer is greater than the current total bytes that
  2577. // have not been read, then set the "cnt" (unread bytes) to the
  2578. // amount of unread bytes.
  2579. if (s->dma_adc.count < cnt)
  2580. cnt = s->dma_adc.count;
  2581. spin_unlock_irqrestore(&s->lock, flags);
  2582. //
  2583. // if we are converting from 8/16 then we need to copy
  2584. // twice the number of 16 bit bytes then 8 bit bytes.
  2585. //
  2586. if (s->conversion) {
  2587. if (cnt > (count * 2))
  2588. cnt = (count * 2);
  2589. } else {
  2590. if (cnt > count)
  2591. cnt = count;
  2592. }
  2593. //
  2594. // "cnt" NOW is the smaller of the amount that will be read,
  2595. // and the amount that is requested in this read (or partial).
  2596. // if there are no bytes in the buffer to read, then start the
  2597. // ADC and wait for the interrupt handler to wake us up.
  2598. //
  2599. if (cnt <= 0) {
  2600. // start up the dma engine and then continue back to the top of
  2601. // the loop when wake up occurs.
  2602. start_adc(s);
  2603. if (file->f_flags & O_NONBLOCK)
  2604. return ret ? ret : -EAGAIN;
  2605. interruptible_sleep_on(&s->dma_adc.wait);
  2606. if (signal_pending(current))
  2607. return ret ? ret : -ERESTARTSYS;
  2608. continue;
  2609. }
  2610. // there are bytes in the buffer to read.
  2611. // copy from the hw buffer over to the user buffer.
  2612. // user buffer is designated by "buffer"
  2613. // virtual address to copy from is rawbuf+swptr
  2614. // the "cnt" is the number of bytes to read.
  2615. CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
  2616. "_read() copy_to cnt=%d count=%Zu ", cnt, count));
  2617. CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
  2618. " .dmasize=%d .count=%d buffer=%p ret=%Zd\n",
  2619. s->dma_adc.dmasize, s->dma_adc.count, buffer, ret));
  2620. if (cs_copy_to_user
  2621. (s, buffer, s->dma_adc.rawbuf + swptr, cnt, &copied))
  2622. return ret ? ret : -EFAULT;
  2623. swptr = (swptr + cnt) % s->dma_adc.dmasize;
  2624. spin_lock_irqsave(&s->lock, flags);
  2625. s->dma_adc.swptr = swptr;
  2626. s->dma_adc.count -= cnt;
  2627. spin_unlock_irqrestore(&s->lock, flags);
  2628. count -= copied;
  2629. buffer += copied;
  2630. ret += copied;
  2631. start_adc(s);
  2632. }
  2633. CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
  2634. printk(KERN_INFO "cs4281: cs4281_read()- %Zd\n", ret));
  2635. return ret;
  2636. }
  2637. static ssize_t cs4281_write(struct file *file, const char __user *buffer,
  2638. size_t count, loff_t * ppos)
  2639. {
  2640. struct cs4281_state *s =
  2641. (struct cs4281_state *) file->private_data;
  2642. ssize_t ret;
  2643. unsigned long flags;
  2644. unsigned swptr, hwptr, busaddr;
  2645. int cnt;
  2646. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
  2647. printk(KERN_INFO "cs4281: cs4281_write()+ count=%Zu\n",
  2648. count));
  2649. VALIDATE_STATE(s);
  2650. if (s->dma_dac.mapped)
  2651. return -ENXIO;
  2652. if (!s->dma_dac.ready && (ret = prog_dmabuf_dac(s)))
  2653. return ret;
  2654. if (!access_ok(VERIFY_READ, buffer, count))
  2655. return -EFAULT;
  2656. ret = 0;
  2657. while (count > 0) {
  2658. spin_lock_irqsave(&s->lock, flags);
  2659. if (s->dma_dac.count < 0) {
  2660. s->dma_dac.count = 0;
  2661. s->dma_dac.swptr = s->dma_dac.hwptr;
  2662. }
  2663. if (s->dma_dac.underrun) {
  2664. s->dma_dac.underrun = 0;
  2665. hwptr = readl(s->pBA0 + BA0_DCA0);
  2666. busaddr = virt_to_bus(s->dma_dac.rawbuf);
  2667. hwptr -= (unsigned) busaddr;
  2668. s->dma_dac.swptr = s->dma_dac.hwptr = hwptr;
  2669. }
  2670. swptr = s->dma_dac.swptr;
  2671. cnt = s->dma_dac.dmasize - swptr;
  2672. if (s->dma_dac.count + cnt > s->dma_dac.dmasize)
  2673. cnt = s->dma_dac.dmasize - s->dma_dac.count;
  2674. spin_unlock_irqrestore(&s->lock, flags);
  2675. if (cnt > count)
  2676. cnt = count;
  2677. if (cnt <= 0) {
  2678. start_dac(s);
  2679. if (file->f_flags & O_NONBLOCK)
  2680. return ret ? ret : -EAGAIN;
  2681. interruptible_sleep_on(&s->dma_dac.wait);
  2682. if (signal_pending(current))
  2683. return ret ? ret : -ERESTARTSYS;
  2684. continue;
  2685. }
  2686. if (copy_from_user(s->dma_dac.rawbuf + swptr, buffer, cnt))
  2687. return ret ? ret : -EFAULT;
  2688. swptr = (swptr + cnt) % s->dma_dac.dmasize;
  2689. spin_lock_irqsave(&s->lock, flags);
  2690. s->dma_dac.swptr = swptr;
  2691. s->dma_dac.count += cnt;
  2692. s->dma_dac.endcleared = 0;
  2693. spin_unlock_irqrestore(&s->lock, flags);
  2694. count -= cnt;
  2695. buffer += cnt;
  2696. ret += cnt;
  2697. start_dac(s);
  2698. }
  2699. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
  2700. printk(KERN_INFO "cs4281: cs4281_write()- %Zd\n", ret));
  2701. return ret;
  2702. }
  2703. static unsigned int cs4281_poll(struct file *file,
  2704. struct poll_table_struct *wait)
  2705. {
  2706. struct cs4281_state *s =
  2707. (struct cs4281_state *) file->private_data;
  2708. unsigned long flags;
  2709. unsigned int mask = 0;
  2710. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  2711. printk(KERN_INFO "cs4281: cs4281_poll()+\n"));
  2712. VALIDATE_STATE(s);
  2713. if (file->f_mode & FMODE_WRITE) {
  2714. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  2715. printk(KERN_INFO
  2716. "cs4281: cs4281_poll() wait on FMODE_WRITE\n"));
  2717. if(!s->dma_dac.ready && prog_dmabuf_dac(s))
  2718. return 0;
  2719. poll_wait(file, &s->dma_dac.wait, wait);
  2720. }
  2721. if (file->f_mode & FMODE_READ) {
  2722. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  2723. printk(KERN_INFO
  2724. "cs4281: cs4281_poll() wait on FMODE_READ\n"));
  2725. if(!s->dma_dac.ready && prog_dmabuf_adc(s))
  2726. return 0;
  2727. poll_wait(file, &s->dma_adc.wait, wait);
  2728. }
  2729. spin_lock_irqsave(&s->lock, flags);
  2730. cs4281_update_ptr(s,CS_FALSE);
  2731. if (file->f_mode & FMODE_WRITE) {
  2732. if (s->dma_dac.mapped) {
  2733. if (s->dma_dac.count >=
  2734. (signed) s->dma_dac.fragsize) {
  2735. if (s->dma_dac.wakeup)
  2736. mask |= POLLOUT | POLLWRNORM;
  2737. else
  2738. mask = 0;
  2739. s->dma_dac.wakeup = 0;
  2740. }
  2741. } else {
  2742. if ((signed) (s->dma_dac.dmasize/2) >= s->dma_dac.count)
  2743. mask |= POLLOUT | POLLWRNORM;
  2744. }
  2745. } else if (file->f_mode & FMODE_READ) {
  2746. if (s->dma_adc.mapped) {
  2747. if (s->dma_adc.count >= (signed) s->dma_adc.fragsize)
  2748. mask |= POLLIN | POLLRDNORM;
  2749. } else {
  2750. if (s->dma_adc.count > 0)
  2751. mask |= POLLIN | POLLRDNORM;
  2752. }
  2753. }
  2754. spin_unlock_irqrestore(&s->lock, flags);
  2755. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  2756. printk(KERN_INFO "cs4281: cs4281_poll()- 0x%.8x\n",
  2757. mask));
  2758. return mask;
  2759. }
  2760. static int cs4281_mmap(struct file *file, struct vm_area_struct *vma)
  2761. {
  2762. struct cs4281_state *s =
  2763. (struct cs4281_state *) file->private_data;
  2764. struct dmabuf *db;
  2765. int ret;
  2766. unsigned long size;
  2767. CS_DBGOUT(CS_FUNCTION | CS_PARMS | CS_OPEN, 4,
  2768. printk(KERN_INFO "cs4281: cs4281_mmap()+\n"));
  2769. VALIDATE_STATE(s);
  2770. if (vma->vm_flags & VM_WRITE) {
  2771. if ((ret = prog_dmabuf_dac(s)) != 0)
  2772. return ret;
  2773. db = &s->dma_dac;
  2774. } else if (vma->vm_flags & VM_READ) {
  2775. if ((ret = prog_dmabuf_adc(s)) != 0)
  2776. return ret;
  2777. db = &s->dma_adc;
  2778. } else
  2779. return -EINVAL;
  2780. //
  2781. // only support PLAYBACK for now
  2782. //
  2783. db = &s->dma_dac;
  2784. if (cs4x_pgoff(vma) != 0)
  2785. return -EINVAL;
  2786. size = vma->vm_end - vma->vm_start;
  2787. if (size > (PAGE_SIZE << db->buforder))
  2788. return -EINVAL;
  2789. if (remap_pfn_range(vma, vma->vm_start,
  2790. virt_to_phys(db->rawbuf) >> PAGE_SHIFT,
  2791. size, vma->vm_page_prot))
  2792. return -EAGAIN;
  2793. db->mapped = 1;
  2794. CS_DBGOUT(CS_FUNCTION | CS_PARMS | CS_OPEN, 4,
  2795. printk(KERN_INFO "cs4281: cs4281_mmap()- 0 size=%d\n",
  2796. (unsigned) size));
  2797. return 0;
  2798. }
  2799. static int cs4281_ioctl(struct inode *inode, struct file *file,
  2800. unsigned int cmd, unsigned long arg)
  2801. {
  2802. struct cs4281_state *s =
  2803. (struct cs4281_state *) file->private_data;
  2804. unsigned long flags;
  2805. audio_buf_info abinfo;
  2806. count_info cinfo;
  2807. int val, mapped, ret;
  2808. int __user *p = (int __user *)arg;
  2809. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
  2810. "cs4281: cs4281_ioctl(): file=%p cmd=0x%.8x\n", file, cmd));
  2811. #if CSDEBUG
  2812. cs_printioctl(cmd);
  2813. #endif
  2814. VALIDATE_STATE(s);
  2815. mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac.mapped) ||
  2816. ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
  2817. switch (cmd) {
  2818. case OSS_GETVERSION:
  2819. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2820. "cs4281: cs4281_ioctl(): SOUND_VERSION=0x%.8x\n",
  2821. SOUND_VERSION));
  2822. return put_user(SOUND_VERSION, p);
  2823. case SNDCTL_DSP_SYNC:
  2824. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  2825. "cs4281: cs4281_ioctl(): DSP_SYNC\n"));
  2826. if (file->f_mode & FMODE_WRITE)
  2827. return drain_dac(s,
  2828. 0 /*file->f_flags & O_NONBLOCK */
  2829. );
  2830. return 0;
  2831. case SNDCTL_DSP_SETDUPLEX:
  2832. return 0;
  2833. case SNDCTL_DSP_GETCAPS:
  2834. return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
  2835. DSP_CAP_TRIGGER | DSP_CAP_MMAP,
  2836. p);
  2837. case SNDCTL_DSP_RESET:
  2838. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  2839. "cs4281: cs4281_ioctl(): DSP_RESET\n"));
  2840. if (file->f_mode & FMODE_WRITE) {
  2841. stop_dac(s);
  2842. synchronize_irq(s->irq);
  2843. s->dma_dac.swptr = s->dma_dac.hwptr =
  2844. s->dma_dac.count = s->dma_dac.total_bytes =
  2845. s->dma_dac.blocks = s->dma_dac.wakeup = 0;
  2846. prog_codec(s, CS_TYPE_DAC);
  2847. }
  2848. if (file->f_mode & FMODE_READ) {
  2849. stop_adc(s);
  2850. synchronize_irq(s->irq);
  2851. s->dma_adc.swptr = s->dma_adc.hwptr =
  2852. s->dma_adc.count = s->dma_adc.total_bytes =
  2853. s->dma_adc.blocks = s->dma_dac.wakeup = 0;
  2854. prog_codec(s, CS_TYPE_ADC);
  2855. }
  2856. return 0;
  2857. case SNDCTL_DSP_SPEED:
  2858. if (get_user(val, p))
  2859. return -EFAULT;
  2860. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2861. "cs4281: cs4281_ioctl(): DSP_SPEED val=%d\n", val));
  2862. //
  2863. // support independent capture and playback channels
  2864. // assume that the file mode bit determines the
  2865. // direction of the data flow.
  2866. //
  2867. if (file->f_mode & FMODE_READ) {
  2868. if (val >= 0) {
  2869. stop_adc(s);
  2870. s->dma_adc.ready = 0;
  2871. // program sampling rates
  2872. if (val > 48000)
  2873. val = 48000;
  2874. if (val < 6300)
  2875. val = 6300;
  2876. s->prop_adc.rate = val;
  2877. prog_codec(s, CS_TYPE_ADC);
  2878. }
  2879. }
  2880. if (file->f_mode & FMODE_WRITE) {
  2881. if (val >= 0) {
  2882. stop_dac(s);
  2883. s->dma_dac.ready = 0;
  2884. // program sampling rates
  2885. if (val > 48000)
  2886. val = 48000;
  2887. if (val < 6300)
  2888. val = 6300;
  2889. s->prop_dac.rate = val;
  2890. prog_codec(s, CS_TYPE_DAC);
  2891. }
  2892. }
  2893. if (file->f_mode & FMODE_WRITE)
  2894. val = s->prop_dac.rate;
  2895. else if (file->f_mode & FMODE_READ)
  2896. val = s->prop_adc.rate;
  2897. return put_user(val, p);
  2898. case SNDCTL_DSP_STEREO:
  2899. if (get_user(val, p))
  2900. return -EFAULT;
  2901. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2902. "cs4281: cs4281_ioctl(): DSP_STEREO val=%d\n", val));
  2903. if (file->f_mode & FMODE_READ) {
  2904. stop_adc(s);
  2905. s->dma_adc.ready = 0;
  2906. s->prop_adc.channels = val ? 2 : 1;
  2907. prog_codec(s, CS_TYPE_ADC);
  2908. }
  2909. if (file->f_mode & FMODE_WRITE) {
  2910. stop_dac(s);
  2911. s->dma_dac.ready = 0;
  2912. s->prop_dac.channels = val ? 2 : 1;
  2913. prog_codec(s, CS_TYPE_DAC);
  2914. }
  2915. return 0;
  2916. case SNDCTL_DSP_CHANNELS:
  2917. if (get_user(val, p))
  2918. return -EFAULT;
  2919. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2920. "cs4281: cs4281_ioctl(): DSP_CHANNELS val=%d\n",
  2921. val));
  2922. if (val != 0) {
  2923. if (file->f_mode & FMODE_READ) {
  2924. stop_adc(s);
  2925. s->dma_adc.ready = 0;
  2926. if (val >= 2)
  2927. s->prop_adc.channels = 2;
  2928. else
  2929. s->prop_adc.channels = 1;
  2930. prog_codec(s, CS_TYPE_ADC);
  2931. }
  2932. if (file->f_mode & FMODE_WRITE) {
  2933. stop_dac(s);
  2934. s->dma_dac.ready = 0;
  2935. if (val >= 2)
  2936. s->prop_dac.channels = 2;
  2937. else
  2938. s->prop_dac.channels = 1;
  2939. prog_codec(s, CS_TYPE_DAC);
  2940. }
  2941. }
  2942. if (file->f_mode & FMODE_WRITE)
  2943. val = s->prop_dac.channels;
  2944. else if (file->f_mode & FMODE_READ)
  2945. val = s->prop_adc.channels;
  2946. return put_user(val, p);
  2947. case SNDCTL_DSP_GETFMTS: // Returns a mask
  2948. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2949. "cs4281: cs4281_ioctl(): DSP_GETFMT val=0x%.8x\n",
  2950. AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
  2951. AFMT_U8));
  2952. return put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
  2953. AFMT_U8, p);
  2954. case SNDCTL_DSP_SETFMT:
  2955. if (get_user(val, p))
  2956. return -EFAULT;
  2957. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2958. "cs4281: cs4281_ioctl(): DSP_SETFMT val=0x%.8x\n",
  2959. val));
  2960. if (val != AFMT_QUERY) {
  2961. if (file->f_mode & FMODE_READ) {
  2962. stop_adc(s);
  2963. s->dma_adc.ready = 0;
  2964. if (val != AFMT_S16_LE
  2965. && val != AFMT_U16_LE && val != AFMT_S8
  2966. && val != AFMT_U8)
  2967. val = AFMT_U8;
  2968. s->prop_adc.fmt = val;
  2969. s->prop_adc.fmt_original = s->prop_adc.fmt;
  2970. prog_codec(s, CS_TYPE_ADC);
  2971. }
  2972. if (file->f_mode & FMODE_WRITE) {
  2973. stop_dac(s);
  2974. s->dma_dac.ready = 0;
  2975. if (val != AFMT_S16_LE
  2976. && val != AFMT_U16_LE && val != AFMT_S8
  2977. && val != AFMT_U8)
  2978. val = AFMT_U8;
  2979. s->prop_dac.fmt = val;
  2980. s->prop_dac.fmt_original = s->prop_dac.fmt;
  2981. prog_codec(s, CS_TYPE_DAC);
  2982. }
  2983. } else {
  2984. if (file->f_mode & FMODE_WRITE)
  2985. val = s->prop_dac.fmt_original;
  2986. else if (file->f_mode & FMODE_READ)
  2987. val = s->prop_adc.fmt_original;
  2988. }
  2989. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  2990. "cs4281: cs4281_ioctl(): DSP_SETFMT return val=0x%.8x\n",
  2991. val));
  2992. return put_user(val, p);
  2993. case SNDCTL_DSP_POST:
  2994. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  2995. "cs4281: cs4281_ioctl(): DSP_POST\n"));
  2996. return 0;
  2997. case SNDCTL_DSP_GETTRIGGER:
  2998. val = 0;
  2999. if (file->f_mode & s->ena & FMODE_READ)
  3000. val |= PCM_ENABLE_INPUT;
  3001. if (file->f_mode & s->ena & FMODE_WRITE)
  3002. val |= PCM_ENABLE_OUTPUT;
  3003. return put_user(val, p);
  3004. case SNDCTL_DSP_SETTRIGGER:
  3005. if (get_user(val, p))
  3006. return -EFAULT;
  3007. if (file->f_mode & FMODE_READ) {
  3008. if (val & PCM_ENABLE_INPUT) {
  3009. if (!s->dma_adc.ready
  3010. && (ret = prog_dmabuf_adc(s)))
  3011. return ret;
  3012. start_adc(s);
  3013. } else
  3014. stop_adc(s);
  3015. }
  3016. if (file->f_mode & FMODE_WRITE) {
  3017. if (val & PCM_ENABLE_OUTPUT) {
  3018. if (!s->dma_dac.ready
  3019. && (ret = prog_dmabuf_dac(s)))
  3020. return ret;
  3021. start_dac(s);
  3022. } else
  3023. stop_dac(s);
  3024. }
  3025. return 0;
  3026. case SNDCTL_DSP_GETOSPACE:
  3027. if (!(file->f_mode & FMODE_WRITE))
  3028. return -EINVAL;
  3029. if (!s->dma_dac.ready && (val = prog_dmabuf_dac(s)))
  3030. return val;
  3031. spin_lock_irqsave(&s->lock, flags);
  3032. cs4281_update_ptr(s,CS_FALSE);
  3033. abinfo.fragsize = s->dma_dac.fragsize;
  3034. if (s->dma_dac.mapped)
  3035. abinfo.bytes = s->dma_dac.dmasize;
  3036. else
  3037. abinfo.bytes =
  3038. s->dma_dac.dmasize - s->dma_dac.count;
  3039. abinfo.fragstotal = s->dma_dac.numfrag;
  3040. abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
  3041. CS_DBGOUT(CS_FUNCTION | CS_PARMS, 4, printk(KERN_INFO
  3042. "cs4281: cs4281_ioctl(): GETOSPACE .fragsize=%d .bytes=%d .fragstotal=%d .fragments=%d\n",
  3043. abinfo.fragsize,abinfo.bytes,abinfo.fragstotal,
  3044. abinfo.fragments));
  3045. spin_unlock_irqrestore(&s->lock, flags);
  3046. return copy_to_user(p, &abinfo,
  3047. sizeof(abinfo)) ? -EFAULT : 0;
  3048. case SNDCTL_DSP_GETISPACE:
  3049. if (!(file->f_mode & FMODE_READ))
  3050. return -EINVAL;
  3051. if (!s->dma_adc.ready && (val = prog_dmabuf_adc(s)))
  3052. return val;
  3053. spin_lock_irqsave(&s->lock, flags);
  3054. cs4281_update_ptr(s,CS_FALSE);
  3055. if (s->conversion) {
  3056. abinfo.fragsize = s->dma_adc.fragsize / 2;
  3057. abinfo.bytes = s->dma_adc.count / 2;
  3058. abinfo.fragstotal = s->dma_adc.numfrag;
  3059. abinfo.fragments =
  3060. abinfo.bytes >> (s->dma_adc.fragshift - 1);
  3061. } else {
  3062. abinfo.fragsize = s->dma_adc.fragsize;
  3063. abinfo.bytes = s->dma_adc.count;
  3064. abinfo.fragstotal = s->dma_adc.numfrag;
  3065. abinfo.fragments =
  3066. abinfo.bytes >> s->dma_adc.fragshift;
  3067. }
  3068. spin_unlock_irqrestore(&s->lock, flags);
  3069. return copy_to_user(p, &abinfo,
  3070. sizeof(abinfo)) ? -EFAULT : 0;
  3071. case SNDCTL_DSP_NONBLOCK:
  3072. file->f_flags |= O_NONBLOCK;
  3073. return 0;
  3074. case SNDCTL_DSP_GETODELAY:
  3075. if (!(file->f_mode & FMODE_WRITE))
  3076. return -EINVAL;
  3077. if(!s->dma_dac.ready && prog_dmabuf_dac(s))
  3078. return 0;
  3079. spin_lock_irqsave(&s->lock, flags);
  3080. cs4281_update_ptr(s,CS_FALSE);
  3081. val = s->dma_dac.count;
  3082. spin_unlock_irqrestore(&s->lock, flags);
  3083. return put_user(val, p);
  3084. case SNDCTL_DSP_GETIPTR:
  3085. if (!(file->f_mode & FMODE_READ))
  3086. return -EINVAL;
  3087. if(!s->dma_adc.ready && prog_dmabuf_adc(s))
  3088. return 0;
  3089. spin_lock_irqsave(&s->lock, flags);
  3090. cs4281_update_ptr(s,CS_FALSE);
  3091. cinfo.bytes = s->dma_adc.total_bytes;
  3092. if (s->dma_adc.mapped) {
  3093. cinfo.blocks =
  3094. (cinfo.bytes >> s->dma_adc.fragshift) -
  3095. s->dma_adc.blocks;
  3096. s->dma_adc.blocks =
  3097. cinfo.bytes >> s->dma_adc.fragshift;
  3098. } else {
  3099. if (s->conversion) {
  3100. cinfo.blocks =
  3101. s->dma_adc.count /
  3102. 2 >> (s->dma_adc.fragshift - 1);
  3103. } else
  3104. cinfo.blocks =
  3105. s->dma_adc.count >> s->dma_adc.
  3106. fragshift;
  3107. }
  3108. if (s->conversion)
  3109. cinfo.ptr = s->dma_adc.hwptr / 2;
  3110. else
  3111. cinfo.ptr = s->dma_adc.hwptr;
  3112. if (s->dma_adc.mapped)
  3113. s->dma_adc.count &= s->dma_adc.fragsize - 1;
  3114. spin_unlock_irqrestore(&s->lock, flags);
  3115. if (copy_to_user(p, &cinfo, sizeof(cinfo)))
  3116. return -EFAULT;
  3117. return 0;
  3118. case SNDCTL_DSP_GETOPTR:
  3119. if (!(file->f_mode & FMODE_WRITE))
  3120. return -EINVAL;
  3121. if(!s->dma_dac.ready && prog_dmabuf_dac(s))
  3122. return 0;
  3123. spin_lock_irqsave(&s->lock, flags);
  3124. cs4281_update_ptr(s,CS_FALSE);
  3125. cinfo.bytes = s->dma_dac.total_bytes;
  3126. if (s->dma_dac.mapped) {
  3127. cinfo.blocks =
  3128. (cinfo.bytes >> s->dma_dac.fragshift) -
  3129. s->dma_dac.blocks;
  3130. s->dma_dac.blocks =
  3131. cinfo.bytes >> s->dma_dac.fragshift;
  3132. } else {
  3133. cinfo.blocks =
  3134. s->dma_dac.count >> s->dma_dac.fragshift;
  3135. }
  3136. cinfo.ptr = s->dma_dac.hwptr;
  3137. if (s->dma_dac.mapped)
  3138. s->dma_dac.count &= s->dma_dac.fragsize - 1;
  3139. spin_unlock_irqrestore(&s->lock, flags);
  3140. if (copy_to_user(p, &cinfo, sizeof(cinfo)))
  3141. return -EFAULT;
  3142. return 0;
  3143. case SNDCTL_DSP_GETBLKSIZE:
  3144. if (file->f_mode & FMODE_WRITE) {
  3145. if ((val = prog_dmabuf_dac(s)))
  3146. return val;
  3147. return put_user(s->dma_dac.fragsize, p);
  3148. }
  3149. if ((val = prog_dmabuf_adc(s)))
  3150. return val;
  3151. if (s->conversion)
  3152. return put_user(s->dma_adc.fragsize / 2, p);
  3153. else
  3154. return put_user(s->dma_adc.fragsize, p);
  3155. case SNDCTL_DSP_SETFRAGMENT:
  3156. if (get_user(val, p))
  3157. return -EFAULT;
  3158. return 0; // Say OK, but do nothing.
  3159. case SNDCTL_DSP_SUBDIVIDE:
  3160. if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision)
  3161. || (file->f_mode & FMODE_WRITE
  3162. && s->dma_dac.subdivision)) return -EINVAL;
  3163. if (get_user(val, p))
  3164. return -EFAULT;
  3165. if (val != 1 && val != 2 && val != 4)
  3166. return -EINVAL;
  3167. if (file->f_mode & FMODE_READ)
  3168. s->dma_adc.subdivision = val;
  3169. else if (file->f_mode & FMODE_WRITE)
  3170. s->dma_dac.subdivision = val;
  3171. return 0;
  3172. case SOUND_PCM_READ_RATE:
  3173. if (file->f_mode & FMODE_READ)
  3174. return put_user(s->prop_adc.rate, p);
  3175. else if (file->f_mode & FMODE_WRITE)
  3176. return put_user(s->prop_dac.rate, p);
  3177. case SOUND_PCM_READ_CHANNELS:
  3178. if (file->f_mode & FMODE_READ)
  3179. return put_user(s->prop_adc.channels, p);
  3180. else if (file->f_mode & FMODE_WRITE)
  3181. return put_user(s->prop_dac.channels, p);
  3182. case SOUND_PCM_READ_BITS:
  3183. if (file->f_mode & FMODE_READ)
  3184. return
  3185. put_user(
  3186. (s->prop_adc.
  3187. fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
  3188. p);
  3189. else if (file->f_mode & FMODE_WRITE)
  3190. return
  3191. put_user(
  3192. (s->prop_dac.
  3193. fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
  3194. p);
  3195. case SOUND_PCM_WRITE_FILTER:
  3196. case SNDCTL_DSP_SETSYNCRO:
  3197. case SOUND_PCM_READ_FILTER:
  3198. return -EINVAL;
  3199. }
  3200. return mixer_ioctl(s, cmd, arg);
  3201. }
  3202. static int cs4281_release(struct inode *inode, struct file *file)
  3203. {
  3204. struct cs4281_state *s =
  3205. (struct cs4281_state *) file->private_data;
  3206. CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk(KERN_INFO
  3207. "cs4281: cs4281_release(): inode=%p file=%p f_mode=%d\n",
  3208. inode, file, file->f_mode));
  3209. VALIDATE_STATE(s);
  3210. if (file->f_mode & FMODE_WRITE) {
  3211. drain_dac(s, file->f_flags & O_NONBLOCK);
  3212. down(&s->open_sem_dac);
  3213. stop_dac(s);
  3214. dealloc_dmabuf(s, &s->dma_dac);
  3215. s->open_mode &= ~FMODE_WRITE;
  3216. up(&s->open_sem_dac);
  3217. wake_up(&s->open_wait_dac);
  3218. }
  3219. if (file->f_mode & FMODE_READ) {
  3220. drain_adc(s, file->f_flags & O_NONBLOCK);
  3221. down(&s->open_sem_adc);
  3222. stop_adc(s);
  3223. dealloc_dmabuf(s, &s->dma_adc);
  3224. s->open_mode &= ~FMODE_READ;
  3225. up(&s->open_sem_adc);
  3226. wake_up(&s->open_wait_adc);
  3227. }
  3228. return 0;
  3229. }
  3230. static int cs4281_open(struct inode *inode, struct file *file)
  3231. {
  3232. unsigned int minor = iminor(inode);
  3233. struct cs4281_state *s=NULL;
  3234. struct list_head *entry;
  3235. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  3236. "cs4281: cs4281_open(): inode=%p file=%p f_mode=0x%x\n",
  3237. inode, file, file->f_mode));
  3238. list_for_each(entry, &cs4281_devs)
  3239. {
  3240. s = list_entry(entry, struct cs4281_state, list);
  3241. if (!((s->dev_audio ^ minor) & ~0xf))
  3242. break;
  3243. }
  3244. if (entry == &cs4281_devs)
  3245. return -ENODEV;
  3246. if (!s) {
  3247. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  3248. "cs4281: cs4281_open(): Error - unable to find audio state struct\n"));
  3249. return -ENODEV;
  3250. }
  3251. VALIDATE_STATE(s);
  3252. file->private_data = s;
  3253. // wait for device to become free
  3254. if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) {
  3255. CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO
  3256. "cs4281: cs4281_open(): Error - must open READ and/or WRITE\n"));
  3257. return -ENODEV;
  3258. }
  3259. if (file->f_mode & FMODE_WRITE) {
  3260. down(&s->open_sem_dac);
  3261. while (s->open_mode & FMODE_WRITE) {
  3262. if (file->f_flags & O_NONBLOCK) {
  3263. up(&s->open_sem_dac);
  3264. return -EBUSY;
  3265. }
  3266. up(&s->open_sem_dac);
  3267. interruptible_sleep_on(&s->open_wait_dac);
  3268. if (signal_pending(current))
  3269. return -ERESTARTSYS;
  3270. down(&s->open_sem_dac);
  3271. }
  3272. }
  3273. if (file->f_mode & FMODE_READ) {
  3274. down(&s->open_sem_adc);
  3275. while (s->open_mode & FMODE_READ) {
  3276. if (file->f_flags & O_NONBLOCK) {
  3277. up(&s->open_sem_adc);
  3278. return -EBUSY;
  3279. }
  3280. up(&s->open_sem_adc);
  3281. interruptible_sleep_on(&s->open_wait_adc);
  3282. if (signal_pending(current))
  3283. return -ERESTARTSYS;
  3284. down(&s->open_sem_adc);
  3285. }
  3286. }
  3287. s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
  3288. if (file->f_mode & FMODE_READ) {
  3289. s->prop_adc.fmt = AFMT_U8;
  3290. s->prop_adc.fmt_original = s->prop_adc.fmt;
  3291. s->prop_adc.channels = 1;
  3292. s->prop_adc.rate = 8000;
  3293. s->prop_adc.clkdiv = 96 | 0x80;
  3294. s->conversion = 0;
  3295. s->ena &= ~FMODE_READ;
  3296. s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
  3297. s->dma_adc.subdivision = 0;
  3298. up(&s->open_sem_adc);
  3299. if (prog_dmabuf_adc(s)) {
  3300. CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
  3301. "cs4281: adc Program dmabufs failed.\n"));
  3302. cs4281_release(inode, file);
  3303. return -ENOMEM;
  3304. }
  3305. prog_codec(s, CS_TYPE_ADC);
  3306. }
  3307. if (file->f_mode & FMODE_WRITE) {
  3308. s->prop_dac.fmt = AFMT_U8;
  3309. s->prop_dac.fmt_original = s->prop_dac.fmt;
  3310. s->prop_dac.channels = 1;
  3311. s->prop_dac.rate = 8000;
  3312. s->prop_dac.clkdiv = 96 | 0x80;
  3313. s->conversion = 0;
  3314. s->ena &= ~FMODE_WRITE;
  3315. s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
  3316. s->dma_dac.subdivision = 0;
  3317. up(&s->open_sem_dac);
  3318. if (prog_dmabuf_dac(s)) {
  3319. CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
  3320. "cs4281: dac Program dmabufs failed.\n"));
  3321. cs4281_release(inode, file);
  3322. return -ENOMEM;
  3323. }
  3324. prog_codec(s, CS_TYPE_DAC);
  3325. }
  3326. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2,
  3327. printk(KERN_INFO "cs4281: cs4281_open()- 0\n"));
  3328. return nonseekable_open(inode, file);
  3329. }
  3330. // ******************************************************************************************
  3331. // Wave (audio) file operations struct.
  3332. // ******************************************************************************************
  3333. static /*const */ struct file_operations cs4281_audio_fops = {
  3334. .owner = THIS_MODULE,
  3335. .llseek = no_llseek,
  3336. .read = cs4281_read,
  3337. .write = cs4281_write,
  3338. .poll = cs4281_poll,
  3339. .ioctl = cs4281_ioctl,
  3340. .mmap = cs4281_mmap,
  3341. .open = cs4281_open,
  3342. .release = cs4281_release,
  3343. };
  3344. // ---------------------------------------------------------------------
  3345. // hold spinlock for the following!
  3346. static void cs4281_handle_midi(struct cs4281_state *s)
  3347. {
  3348. unsigned char ch;
  3349. int wake;
  3350. unsigned temp1;
  3351. wake = 0;
  3352. while (!(readl(s->pBA0 + BA0_MIDSR) & 0x80)) {
  3353. ch = readl(s->pBA0 + BA0_MIDRP);
  3354. if (s->midi.icnt < MIDIINBUF) {
  3355. s->midi.ibuf[s->midi.iwr] = ch;
  3356. s->midi.iwr = (s->midi.iwr + 1) % MIDIINBUF;
  3357. s->midi.icnt++;
  3358. }
  3359. wake = 1;
  3360. }
  3361. if (wake)
  3362. wake_up(&s->midi.iwait);
  3363. wake = 0;
  3364. while (!(readl(s->pBA0 + BA0_MIDSR) & 0x40) && s->midi.ocnt > 0) {
  3365. temp1 = (s->midi.obuf[s->midi.ord]) & 0x000000ff;
  3366. writel(temp1, s->pBA0 + BA0_MIDWP);
  3367. s->midi.ord = (s->midi.ord + 1) % MIDIOUTBUF;
  3368. s->midi.ocnt--;
  3369. if (s->midi.ocnt < MIDIOUTBUF - 16)
  3370. wake = 1;
  3371. }
  3372. if (wake)
  3373. wake_up(&s->midi.owait);
  3374. }
  3375. static irqreturn_t cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  3376. {
  3377. struct cs4281_state *s = (struct cs4281_state *) dev_id;
  3378. unsigned int temp1;
  3379. // fastpath out, to ease interrupt sharing
  3380. temp1 = readl(s->pBA0 + BA0_HISR); // Get Int Status reg.
  3381. CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
  3382. "cs4281: cs4281_interrupt() BA0_HISR=0x%.8x\n", temp1));
  3383. /*
  3384. * If not DMA or MIDI interrupt, then just return.
  3385. */
  3386. if (!(temp1 & (HISR_DMA0 | HISR_DMA1 | HISR_MIDI))) {
  3387. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR);
  3388. CS_DBGOUT(CS_INTERRUPT, 9, printk(KERN_INFO
  3389. "cs4281: cs4281_interrupt(): returning not cs4281 interrupt.\n"));
  3390. return IRQ_NONE;
  3391. }
  3392. if (temp1 & HISR_DMA0) // If play interrupt,
  3393. readl(s->pBA0 + BA0_HDSR0); // clear the source.
  3394. if (temp1 & HISR_DMA1) // Same for play.
  3395. readl(s->pBA0 + BA0_HDSR1);
  3396. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); // Local EOI
  3397. spin_lock(&s->lock);
  3398. cs4281_update_ptr(s,CS_TRUE);
  3399. cs4281_handle_midi(s);
  3400. spin_unlock(&s->lock);
  3401. return IRQ_HANDLED;
  3402. }
  3403. // **************************************************************************
  3404. static void cs4281_midi_timer(unsigned long data)
  3405. {
  3406. struct cs4281_state *s = (struct cs4281_state *) data;
  3407. unsigned long flags;
  3408. spin_lock_irqsave(&s->lock, flags);
  3409. cs4281_handle_midi(s);
  3410. spin_unlock_irqrestore(&s->lock, flags);
  3411. s->midi.timer.expires = jiffies + 1;
  3412. add_timer(&s->midi.timer);
  3413. }
  3414. // ---------------------------------------------------------------------
  3415. static ssize_t cs4281_midi_read(struct file *file, char __user *buffer,
  3416. size_t count, loff_t * ppos)
  3417. {
  3418. struct cs4281_state *s =
  3419. (struct cs4281_state *) file->private_data;
  3420. ssize_t ret;
  3421. unsigned long flags;
  3422. unsigned ptr;
  3423. int cnt;
  3424. VALIDATE_STATE(s);
  3425. if (!access_ok(VERIFY_WRITE, buffer, count))
  3426. return -EFAULT;
  3427. ret = 0;
  3428. while (count > 0) {
  3429. spin_lock_irqsave(&s->lock, flags);
  3430. ptr = s->midi.ird;
  3431. cnt = MIDIINBUF - ptr;
  3432. if (s->midi.icnt < cnt)
  3433. cnt = s->midi.icnt;
  3434. spin_unlock_irqrestore(&s->lock, flags);
  3435. if (cnt > count)
  3436. cnt = count;
  3437. if (cnt <= 0) {
  3438. if (file->f_flags & O_NONBLOCK)
  3439. return ret ? ret : -EAGAIN;
  3440. interruptible_sleep_on(&s->midi.iwait);
  3441. if (signal_pending(current))
  3442. return ret ? ret : -ERESTARTSYS;
  3443. continue;
  3444. }
  3445. if (copy_to_user(buffer, s->midi.ibuf + ptr, cnt))
  3446. return ret ? ret : -EFAULT;
  3447. ptr = (ptr + cnt) % MIDIINBUF;
  3448. spin_lock_irqsave(&s->lock, flags);
  3449. s->midi.ird = ptr;
  3450. s->midi.icnt -= cnt;
  3451. spin_unlock_irqrestore(&s->lock, flags);
  3452. count -= cnt;
  3453. buffer += cnt;
  3454. ret += cnt;
  3455. }
  3456. return ret;
  3457. }
  3458. static ssize_t cs4281_midi_write(struct file *file, const char __user *buffer,
  3459. size_t count, loff_t * ppos)
  3460. {
  3461. struct cs4281_state *s =
  3462. (struct cs4281_state *) file->private_data;
  3463. ssize_t ret;
  3464. unsigned long flags;
  3465. unsigned ptr;
  3466. int cnt;
  3467. VALIDATE_STATE(s);
  3468. if (!access_ok(VERIFY_READ, buffer, count))
  3469. return -EFAULT;
  3470. ret = 0;
  3471. while (count > 0) {
  3472. spin_lock_irqsave(&s->lock, flags);
  3473. ptr = s->midi.owr;
  3474. cnt = MIDIOUTBUF - ptr;
  3475. if (s->midi.ocnt + cnt > MIDIOUTBUF)
  3476. cnt = MIDIOUTBUF - s->midi.ocnt;
  3477. if (cnt <= 0)
  3478. cs4281_handle_midi(s);
  3479. spin_unlock_irqrestore(&s->lock, flags);
  3480. if (cnt > count)
  3481. cnt = count;
  3482. if (cnt <= 0) {
  3483. if (file->f_flags & O_NONBLOCK)
  3484. return ret ? ret : -EAGAIN;
  3485. interruptible_sleep_on(&s->midi.owait);
  3486. if (signal_pending(current))
  3487. return ret ? ret : -ERESTARTSYS;
  3488. continue;
  3489. }
  3490. if (copy_from_user(s->midi.obuf + ptr, buffer, cnt))
  3491. return ret ? ret : -EFAULT;
  3492. ptr = (ptr + cnt) % MIDIOUTBUF;
  3493. spin_lock_irqsave(&s->lock, flags);
  3494. s->midi.owr = ptr;
  3495. s->midi.ocnt += cnt;
  3496. spin_unlock_irqrestore(&s->lock, flags);
  3497. count -= cnt;
  3498. buffer += cnt;
  3499. ret += cnt;
  3500. spin_lock_irqsave(&s->lock, flags);
  3501. cs4281_handle_midi(s);
  3502. spin_unlock_irqrestore(&s->lock, flags);
  3503. }
  3504. return ret;
  3505. }
  3506. static unsigned int cs4281_midi_poll(struct file *file,
  3507. struct poll_table_struct *wait)
  3508. {
  3509. struct cs4281_state *s =
  3510. (struct cs4281_state *) file->private_data;
  3511. unsigned long flags;
  3512. unsigned int mask = 0;
  3513. VALIDATE_STATE(s);
  3514. if (file->f_flags & FMODE_WRITE)
  3515. poll_wait(file, &s->midi.owait, wait);
  3516. if (file->f_flags & FMODE_READ)
  3517. poll_wait(file, &s->midi.iwait, wait);
  3518. spin_lock_irqsave(&s->lock, flags);
  3519. if (file->f_flags & FMODE_READ) {
  3520. if (s->midi.icnt > 0)
  3521. mask |= POLLIN | POLLRDNORM;
  3522. }
  3523. if (file->f_flags & FMODE_WRITE) {
  3524. if (s->midi.ocnt < MIDIOUTBUF)
  3525. mask |= POLLOUT | POLLWRNORM;
  3526. }
  3527. spin_unlock_irqrestore(&s->lock, flags);
  3528. return mask;
  3529. }
  3530. static int cs4281_midi_open(struct inode *inode, struct file *file)
  3531. {
  3532. unsigned long flags, temp1;
  3533. unsigned int minor = iminor(inode);
  3534. struct cs4281_state *s=NULL;
  3535. struct list_head *entry;
  3536. list_for_each(entry, &cs4281_devs)
  3537. {
  3538. s = list_entry(entry, struct cs4281_state, list);
  3539. if (s->dev_midi == minor)
  3540. break;
  3541. }
  3542. if (entry == &cs4281_devs)
  3543. return -ENODEV;
  3544. if (!s)
  3545. {
  3546. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  3547. "cs4281: cs4281_open(): Error - unable to find audio state struct\n"));
  3548. return -ENODEV;
  3549. }
  3550. VALIDATE_STATE(s);
  3551. file->private_data = s;
  3552. // wait for device to become free
  3553. down(&s->open_sem);
  3554. while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
  3555. if (file->f_flags & O_NONBLOCK) {
  3556. up(&s->open_sem);
  3557. return -EBUSY;
  3558. }
  3559. up(&s->open_sem);
  3560. interruptible_sleep_on(&s->open_wait);
  3561. if (signal_pending(current))
  3562. return -ERESTARTSYS;
  3563. down(&s->open_sem);
  3564. }
  3565. spin_lock_irqsave(&s->lock, flags);
  3566. if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
  3567. s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
  3568. s->midi.ord = s->midi.owr = s->midi.ocnt = 0;
  3569. writel(1, s->pBA0 + BA0_MIDCR); // Reset the interface.
  3570. writel(0, s->pBA0 + BA0_MIDCR); // Return to normal mode.
  3571. s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
  3572. writel(0x0000000f, s->pBA0 + BA0_MIDCR); // Enable transmit, record, ints.
  3573. temp1 = readl(s->pBA0 + BA0_HIMR);
  3574. writel(temp1 & 0xffbfffff, s->pBA0 + BA0_HIMR); // Enable midi int. recognition.
  3575. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); // Enable interrupts
  3576. init_timer(&s->midi.timer);
  3577. s->midi.timer.expires = jiffies + 1;
  3578. s->midi.timer.data = (unsigned long) s;
  3579. s->midi.timer.function = cs4281_midi_timer;
  3580. add_timer(&s->midi.timer);
  3581. }
  3582. if (file->f_mode & FMODE_READ) {
  3583. s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
  3584. }
  3585. if (file->f_mode & FMODE_WRITE) {
  3586. s->midi.ord = s->midi.owr = s->midi.ocnt = 0;
  3587. }
  3588. spin_unlock_irqrestore(&s->lock, flags);
  3589. s->open_mode |=
  3590. (file->
  3591. f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ |
  3592. FMODE_MIDI_WRITE);
  3593. up(&s->open_sem);
  3594. return nonseekable_open(inode, file);
  3595. }
  3596. static int cs4281_midi_release(struct inode *inode, struct file *file)
  3597. {
  3598. struct cs4281_state *s =
  3599. (struct cs4281_state *) file->private_data;
  3600. DECLARE_WAITQUEUE(wait, current);
  3601. unsigned long flags;
  3602. unsigned count, tmo;
  3603. VALIDATE_STATE(s);
  3604. if (file->f_mode & FMODE_WRITE) {
  3605. add_wait_queue(&s->midi.owait, &wait);
  3606. for (;;) {
  3607. set_current_state(TASK_INTERRUPTIBLE);
  3608. spin_lock_irqsave(&s->lock, flags);
  3609. count = s->midi.ocnt;
  3610. spin_unlock_irqrestore(&s->lock, flags);
  3611. if (count <= 0)
  3612. break;
  3613. if (signal_pending(current))
  3614. break;
  3615. if (file->f_flags & O_NONBLOCK) {
  3616. remove_wait_queue(&s->midi.owait, &wait);
  3617. current->state = TASK_RUNNING;
  3618. return -EBUSY;
  3619. }
  3620. tmo = (count * HZ) / 3100;
  3621. if (!schedule_timeout(tmo ? : 1) && tmo)
  3622. printk(KERN_DEBUG
  3623. "cs4281: midi timed out??\n");
  3624. }
  3625. remove_wait_queue(&s->midi.owait, &wait);
  3626. current->state = TASK_RUNNING;
  3627. }
  3628. down(&s->open_sem);
  3629. s->open_mode &=
  3630. (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ |
  3631. FMODE_MIDI_WRITE);
  3632. spin_lock_irqsave(&s->lock, flags);
  3633. if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
  3634. writel(0, s->pBA0 + BA0_MIDCR); // Disable Midi interrupts.
  3635. del_timer(&s->midi.timer);
  3636. }
  3637. spin_unlock_irqrestore(&s->lock, flags);
  3638. up(&s->open_sem);
  3639. wake_up(&s->open_wait);
  3640. return 0;
  3641. }
  3642. // ******************************************************************************************
  3643. // Midi file operations struct.
  3644. // ******************************************************************************************
  3645. static /*const */ struct file_operations cs4281_midi_fops = {
  3646. .owner = THIS_MODULE,
  3647. .llseek = no_llseek,
  3648. .read = cs4281_midi_read,
  3649. .write = cs4281_midi_write,
  3650. .poll = cs4281_midi_poll,
  3651. .open = cs4281_midi_open,
  3652. .release = cs4281_midi_release,
  3653. };
  3654. // ---------------------------------------------------------------------
  3655. // maximum number of devices
  3656. #define NR_DEVICE 8 // Only eight devices supported currently.
  3657. // ---------------------------------------------------------------------
  3658. static struct initvol {
  3659. int mixch;
  3660. int vol;
  3661. } initvol[] __devinitdata = {
  3662. {
  3663. SOUND_MIXER_WRITE_VOLUME, 0x4040}, {
  3664. SOUND_MIXER_WRITE_PCM, 0x4040}, {
  3665. SOUND_MIXER_WRITE_SYNTH, 0x4040}, {
  3666. SOUND_MIXER_WRITE_CD, 0x4040}, {
  3667. SOUND_MIXER_WRITE_LINE, 0x4040}, {
  3668. SOUND_MIXER_WRITE_LINE1, 0x4040}, {
  3669. SOUND_MIXER_WRITE_RECLEV, 0x0000}, {
  3670. SOUND_MIXER_WRITE_SPEAKER, 0x4040}, {
  3671. SOUND_MIXER_WRITE_MIC, 0x0000}
  3672. };
  3673. #ifndef NOT_CS4281_PM
  3674. static void __devinit cs4281_BuildFIFO(
  3675. struct cs4281_pipeline *p,
  3676. struct cs4281_state *s)
  3677. {
  3678. switch(p->number)
  3679. {
  3680. case 0: /* playback */
  3681. {
  3682. p->u32FCRnAddress = BA0_FCR0;
  3683. p->u32FSICnAddress = BA0_FSIC0;
  3684. p->u32FPDRnAddress = BA0_FPDR0;
  3685. break;
  3686. }
  3687. case 1: /* capture */
  3688. {
  3689. p->u32FCRnAddress = BA0_FCR1;
  3690. p->u32FSICnAddress = BA0_FSIC1;
  3691. p->u32FPDRnAddress = BA0_FPDR1;
  3692. break;
  3693. }
  3694. case 2:
  3695. {
  3696. p->u32FCRnAddress = BA0_FCR2;
  3697. p->u32FSICnAddress = BA0_FSIC2;
  3698. p->u32FPDRnAddress = BA0_FPDR2;
  3699. break;
  3700. }
  3701. case 3:
  3702. {
  3703. p->u32FCRnAddress = BA0_FCR3;
  3704. p->u32FSICnAddress = BA0_FSIC3;
  3705. p->u32FPDRnAddress = BA0_FPDR3;
  3706. break;
  3707. }
  3708. default:
  3709. break;
  3710. }
  3711. //
  3712. // first read the hardware to initialize the member variables
  3713. //
  3714. p->u32FCRnValue = readl(s->pBA0 + p->u32FCRnAddress);
  3715. p->u32FSICnValue = readl(s->pBA0 + p->u32FSICnAddress);
  3716. p->u32FPDRnValue = readl(s->pBA0 + p->u32FPDRnAddress);
  3717. }
  3718. static void __devinit cs4281_BuildDMAengine(
  3719. struct cs4281_pipeline *p,
  3720. struct cs4281_state *s)
  3721. {
  3722. /*
  3723. * initialize all the addresses of this pipeline dma info.
  3724. */
  3725. switch(p->number)
  3726. {
  3727. case 0: /* playback */
  3728. {
  3729. p->u32DBAnAddress = BA0_DBA0;
  3730. p->u32DCAnAddress = BA0_DCA0;
  3731. p->u32DBCnAddress = BA0_DBC0;
  3732. p->u32DCCnAddress = BA0_DCC0;
  3733. p->u32DMRnAddress = BA0_DMR0;
  3734. p->u32DCRnAddress = BA0_DCR0;
  3735. p->u32HDSRnAddress = BA0_HDSR0;
  3736. break;
  3737. }
  3738. case 1: /* capture */
  3739. {
  3740. p->u32DBAnAddress = BA0_DBA1;
  3741. p->u32DCAnAddress = BA0_DCA1;
  3742. p->u32DBCnAddress = BA0_DBC1;
  3743. p->u32DCCnAddress = BA0_DCC1;
  3744. p->u32DMRnAddress = BA0_DMR1;
  3745. p->u32DCRnAddress = BA0_DCR1;
  3746. p->u32HDSRnAddress = BA0_HDSR1;
  3747. break;
  3748. }
  3749. case 2:
  3750. {
  3751. p->u32DBAnAddress = BA0_DBA2;
  3752. p->u32DCAnAddress = BA0_DCA2;
  3753. p->u32DBCnAddress = BA0_DBC2;
  3754. p->u32DCCnAddress = BA0_DCC2;
  3755. p->u32DMRnAddress = BA0_DMR2;
  3756. p->u32DCRnAddress = BA0_DCR2;
  3757. p->u32HDSRnAddress = BA0_HDSR2;
  3758. break;
  3759. }
  3760. case 3:
  3761. {
  3762. p->u32DBAnAddress = BA0_DBA3;
  3763. p->u32DCAnAddress = BA0_DCA3;
  3764. p->u32DBCnAddress = BA0_DBC3;
  3765. p->u32DCCnAddress = BA0_DCC3;
  3766. p->u32DMRnAddress = BA0_DMR3;
  3767. p->u32DCRnAddress = BA0_DCR3;
  3768. p->u32HDSRnAddress = BA0_HDSR3;
  3769. break;
  3770. }
  3771. default:
  3772. break;
  3773. }
  3774. //
  3775. // Initialize the dma values for this pipeline
  3776. //
  3777. p->u32DBAnValue = readl(s->pBA0 + p->u32DBAnAddress);
  3778. p->u32DBCnValue = readl(s->pBA0 + p->u32DBCnAddress);
  3779. p->u32DMRnValue = readl(s->pBA0 + p->u32DMRnAddress);
  3780. p->u32DCRnValue = readl(s->pBA0 + p->u32DCRnAddress);
  3781. }
  3782. static void __devinit cs4281_InitPM(struct cs4281_state *s)
  3783. {
  3784. int i;
  3785. struct cs4281_pipeline *p;
  3786. for(i=0;i<CS4281_NUMBER_OF_PIPELINES;i++)
  3787. {
  3788. p = &s->pl[i];
  3789. p->number = i;
  3790. cs4281_BuildDMAengine(p,s);
  3791. cs4281_BuildFIFO(p,s);
  3792. /*
  3793. * currently only 2 pipelines are used
  3794. * so, only set the valid bit on the playback and capture.
  3795. */
  3796. if( (i == CS4281_PLAYBACK_PIPELINE_NUMBER) ||
  3797. (i == CS4281_CAPTURE_PIPELINE_NUMBER))
  3798. p->flags |= CS4281_PIPELINE_VALID;
  3799. }
  3800. s->pm.u32SSPM_BITS = 0x7e; /* rev c, use 0x7c for rev a or b */
  3801. }
  3802. #endif
  3803. static int __devinit cs4281_probe(struct pci_dev *pcidev,
  3804. const struct pci_device_id *pciid)
  3805. {
  3806. #ifndef NOT_CS4281_PM
  3807. struct pm_dev *pmdev;
  3808. #endif
  3809. struct cs4281_state *s;
  3810. dma_addr_t dma_mask;
  3811. mm_segment_t fs;
  3812. int i, val;
  3813. unsigned int temp1, temp2;
  3814. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
  3815. printk(KERN_INFO "cs4281: probe()+\n"));
  3816. if (pci_enable_device(pcidev)) {
  3817. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  3818. "cs4281: pci_enable_device() failed\n"));
  3819. return -1;
  3820. }
  3821. if (!(pci_resource_flags(pcidev, 0) & IORESOURCE_MEM) ||
  3822. !(pci_resource_flags(pcidev, 1) & IORESOURCE_MEM)) {
  3823. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  3824. "cs4281: probe()- Memory region not assigned\n"));
  3825. return -ENODEV;
  3826. }
  3827. if (pcidev->irq == 0) {
  3828. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  3829. "cs4281: probe() IRQ not assigned\n"));
  3830. return -ENODEV;
  3831. }
  3832. dma_mask = 0xffffffff; /* this enables playback and recording */
  3833. i = pci_set_dma_mask(pcidev, dma_mask);
  3834. if (i) {
  3835. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  3836. "cs4281: probe() architecture does not support 32bit PCI busmaster DMA\n"));
  3837. return i;
  3838. }
  3839. if (!(s = kmalloc(sizeof(struct cs4281_state), GFP_KERNEL))) {
  3840. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  3841. "cs4281: probe() no memory for state struct.\n"));
  3842. return -1;
  3843. }
  3844. memset(s, 0, sizeof(struct cs4281_state));
  3845. init_waitqueue_head(&s->dma_adc.wait);
  3846. init_waitqueue_head(&s->dma_dac.wait);
  3847. init_waitqueue_head(&s->open_wait);
  3848. init_waitqueue_head(&s->open_wait_adc);
  3849. init_waitqueue_head(&s->open_wait_dac);
  3850. init_waitqueue_head(&s->midi.iwait);
  3851. init_waitqueue_head(&s->midi.owait);
  3852. init_MUTEX(&s->open_sem);
  3853. init_MUTEX(&s->open_sem_adc);
  3854. init_MUTEX(&s->open_sem_dac);
  3855. spin_lock_init(&s->lock);
  3856. s->pBA0phys = pci_resource_start(pcidev, 0);
  3857. s->pBA1phys = pci_resource_start(pcidev, 1);
  3858. /* Convert phys to linear. */
  3859. s->pBA0 = ioremap_nocache(s->pBA0phys, 4096);
  3860. if (!s->pBA0) {
  3861. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_ERR
  3862. "cs4281: BA0 I/O mapping failed. Skipping part.\n"));
  3863. goto err_free;
  3864. }
  3865. s->pBA1 = ioremap_nocache(s->pBA1phys, 65536);
  3866. if (!s->pBA1) {
  3867. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_ERR
  3868. "cs4281: BA1 I/O mapping failed. Skipping part.\n"));
  3869. goto err_unmap;
  3870. }
  3871. temp1 = readl(s->pBA0 + BA0_PCICFG00);
  3872. temp2 = readl(s->pBA0 + BA0_PCICFG04);
  3873. CS_DBGOUT(CS_INIT, 2,
  3874. printk(KERN_INFO
  3875. "cs4281: probe() BA0=0x%.8x BA1=0x%.8x pBA0=%p pBA1=%p \n",
  3876. (unsigned) temp1, (unsigned) temp2, s->pBA0, s->pBA1));
  3877. CS_DBGOUT(CS_INIT, 2,
  3878. printk(KERN_INFO
  3879. "cs4281: probe() pBA0phys=0x%.8x pBA1phys=0x%.8x\n",
  3880. (unsigned) s->pBA0phys, (unsigned) s->pBA1phys));
  3881. #ifndef NOT_CS4281_PM
  3882. s->pm.flags = CS4281_PM_IDLE;
  3883. #endif
  3884. temp1 = cs4281_hw_init(s);
  3885. if (temp1) {
  3886. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_ERR
  3887. "cs4281: cs4281_hw_init() failed. Skipping part.\n"));
  3888. goto err_irq;
  3889. }
  3890. s->magic = CS4281_MAGIC;
  3891. s->pcidev = pcidev;
  3892. s->irq = pcidev->irq;
  3893. if (request_irq
  3894. (s->irq, cs4281_interrupt, SA_SHIRQ, "Crystal CS4281", s)) {
  3895. CS_DBGOUT(CS_INIT | CS_ERROR, 1,
  3896. printk(KERN_ERR "cs4281: irq %u in use\n", s->irq));
  3897. goto err_irq;
  3898. }
  3899. if ((s->dev_audio = register_sound_dsp(&cs4281_audio_fops, -1)) <
  3900. 0) {
  3901. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  3902. "cs4281: probe() register_sound_dsp() failed.\n"));
  3903. goto err_dev1;
  3904. }
  3905. if ((s->dev_mixer = register_sound_mixer(&cs4281_mixer_fops, -1)) <
  3906. 0) {
  3907. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  3908. "cs4281: probe() register_sound_mixer() failed.\n"));
  3909. goto err_dev2;
  3910. }
  3911. if ((s->dev_midi = register_sound_midi(&cs4281_midi_fops, -1)) < 0) {
  3912. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  3913. "cs4281: probe() register_sound_midi() failed.\n"));
  3914. goto err_dev3;
  3915. }
  3916. #ifndef NOT_CS4281_PM
  3917. cs4281_InitPM(s);
  3918. pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pcidev), cs4281_pm_callback);
  3919. if (pmdev)
  3920. {
  3921. CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
  3922. "cs4281: probe() pm_register() succeeded (%p).\n", pmdev));
  3923. pmdev->data = s;
  3924. }
  3925. else
  3926. {
  3927. CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 0, printk(KERN_INFO
  3928. "cs4281: probe() pm_register() failed (%p).\n", pmdev));
  3929. s->pm.flags |= CS4281_PM_NOT_REGISTERED;
  3930. }
  3931. #endif
  3932. pci_set_master(pcidev); // enable bus mastering
  3933. fs = get_fs();
  3934. set_fs(KERNEL_DS);
  3935. val = SOUND_MASK_LINE;
  3936. mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long) &val);
  3937. for (i = 0; i < sizeof(initvol) / sizeof(initvol[0]); i++) {
  3938. val = initvol[i].vol;
  3939. mixer_ioctl(s, initvol[i].mixch, (unsigned long) &val);
  3940. }
  3941. val = 1; // enable mic preamp
  3942. mixer_ioctl(s, SOUND_MIXER_PRIVATE1, (unsigned long) &val);
  3943. set_fs(fs);
  3944. pci_set_drvdata(pcidev, s);
  3945. list_add(&s->list, &cs4281_devs);
  3946. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  3947. "cs4281: probe()- device allocated successfully\n"));
  3948. return 0;
  3949. err_dev3:
  3950. unregister_sound_mixer(s->dev_mixer);
  3951. err_dev2:
  3952. unregister_sound_dsp(s->dev_audio);
  3953. err_dev1:
  3954. free_irq(s->irq, s);
  3955. err_irq:
  3956. iounmap(s->pBA1);
  3957. err_unmap:
  3958. iounmap(s->pBA0);
  3959. err_free:
  3960. kfree(s);
  3961. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
  3962. "cs4281: probe()- no device allocated\n"));
  3963. return -ENODEV;
  3964. } // probe_cs4281
  3965. // ---------------------------------------------------------------------
  3966. static void __devexit cs4281_remove(struct pci_dev *pci_dev)
  3967. {
  3968. struct cs4281_state *s = pci_get_drvdata(pci_dev);
  3969. // stop DMA controller
  3970. synchronize_irq(s->irq);
  3971. free_irq(s->irq, s);
  3972. unregister_sound_dsp(s->dev_audio);
  3973. unregister_sound_mixer(s->dev_mixer);
  3974. unregister_sound_midi(s->dev_midi);
  3975. iounmap(s->pBA1);
  3976. iounmap(s->pBA0);
  3977. pci_set_drvdata(pci_dev,NULL);
  3978. list_del(&s->list);
  3979. kfree(s);
  3980. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  3981. "cs4281: cs4281_remove()-: remove successful\n"));
  3982. }
  3983. static struct pci_device_id cs4281_pci_tbl[] = {
  3984. {
  3985. .vendor = PCI_VENDOR_ID_CIRRUS,
  3986. .device = PCI_DEVICE_ID_CRYSTAL_CS4281,
  3987. .subvendor = PCI_ANY_ID,
  3988. .subdevice = PCI_ANY_ID,
  3989. },
  3990. { 0, },
  3991. };
  3992. MODULE_DEVICE_TABLE(pci, cs4281_pci_tbl);
  3993. static struct pci_driver cs4281_pci_driver = {
  3994. .name = "cs4281",
  3995. .id_table = cs4281_pci_tbl,
  3996. .probe = cs4281_probe,
  3997. .remove = __devexit_p(cs4281_remove),
  3998. .suspend = CS4281_SUSPEND_TBL,
  3999. .resume = CS4281_RESUME_TBL,
  4000. };
  4001. static int __init cs4281_init_module(void)
  4002. {
  4003. int rtn = 0;
  4004. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  4005. "cs4281: cs4281_init_module()+ \n"));
  4006. printk(KERN_INFO "cs4281: version v%d.%02d.%d time " __TIME__ " "
  4007. __DATE__ "\n", CS4281_MAJOR_VERSION, CS4281_MINOR_VERSION,
  4008. CS4281_ARCH);
  4009. rtn = pci_module_init(&cs4281_pci_driver);
  4010. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
  4011. printk(KERN_INFO "cs4281: cs4281_init_module()- (%d)\n",rtn));
  4012. return rtn;
  4013. }
  4014. static void __exit cs4281_cleanup_module(void)
  4015. {
  4016. pci_unregister_driver(&cs4281_pci_driver);
  4017. #ifndef NOT_CS4281_PM
  4018. cs_pm_unregister_all(cs4281_pm_callback);
  4019. #endif
  4020. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
  4021. printk(KERN_INFO "cs4281: cleanup_cs4281() finished\n"));
  4022. }
  4023. // ---------------------------------------------------------------------
  4024. MODULE_AUTHOR("gw boynton, audio@crystal.cirrus.com");
  4025. MODULE_DESCRIPTION("Cirrus Logic CS4281 Driver");
  4026. MODULE_LICENSE("GPL");
  4027. // ---------------------------------------------------------------------
  4028. module_init(cs4281_init_module);
  4029. module_exit(cs4281_cleanup_module);