cmpci.c 94 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381
  1. /*
  2. * cmpci.c -- C-Media PCI audio driver.
  3. *
  4. * Copyright (C) 1999 C-media support (support@cmedia.com.tw)
  5. *
  6. * Based on the PCI drivers by Thomas Sailer (sailer@ife.ee.ethz.ch)
  7. *
  8. * For update, visit:
  9. * http://www.cmedia.com.tw
  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. * Special thanks to David C. Niemi, Jan Pfeifer
  26. *
  27. *
  28. * Module command line parameters:
  29. * none so far
  30. *
  31. *
  32. * Supported devices:
  33. * /dev/dsp standard /dev/dsp device, (mostly) OSS compatible
  34. * /dev/mixer standard /dev/mixer device, (mostly) OSS compatible
  35. * /dev/midi simple MIDI UART interface, no ioctl
  36. *
  37. * The card has both an FM and a Wavetable synth, but I have to figure
  38. * out first how to drive them...
  39. *
  40. * Revision history
  41. * 06.05.98 0.1 Initial release
  42. * 10.05.98 0.2 Fixed many bugs, esp. ADC rate calculation
  43. * First stab at a simple midi interface (no bells&whistles)
  44. * 13.05.98 0.3 Fix stupid cut&paste error: set_adc_rate was called instead of
  45. * set_dac_rate in the FMODE_WRITE case in cm_open
  46. * Fix hwptr out of bounds (now mpg123 works)
  47. * 14.05.98 0.4 Don't allow excessive interrupt rates
  48. * 08.06.98 0.5 First release using Alan Cox' soundcore instead of miscdevice
  49. * 03.08.98 0.6 Do not include modversions.h
  50. * Now mixer behaviour can basically be selected between
  51. * "OSS documented" and "OSS actual" behaviour
  52. * 31.08.98 0.7 Fix realplayer problems - dac.count issues
  53. * 10.12.98 0.8 Fix drain_dac trying to wait on not yet initialized DMA
  54. * 16.12.98 0.9 Fix a few f_file & FMODE_ bugs
  55. * 06.01.99 0.10 remove the silly SA_INTERRUPT flag.
  56. * hopefully killed the egcs section type conflict
  57. * 12.03.99 0.11 cinfo.blocks should be reset after GETxPTR ioctl.
  58. * reported by Johan Maes <joma@telindus.be>
  59. * 22.03.99 0.12 return EAGAIN instead of EBUSY when O_NONBLOCK
  60. * read/write cannot be executed
  61. * 18.08.99 1.5 Only deallocate DMA buffer when unloading.
  62. * 02.09.99 1.6 Enable SPDIF LOOP
  63. * Change the mixer read back
  64. * 21.09.99 2.33 Use RCS version as driver version.
  65. * Add support for modem, S/PDIF loop and 4 channels.
  66. * (8738 only)
  67. * Fix bug cause x11amp cannot play.
  68. *
  69. * Fixes:
  70. * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  71. * 18/05/2001 - .bss nitpicks, fix a bug in set_dac_channels where it
  72. * was calling prog_dmabuf with s->lock held, call missing
  73. * unlock_kernel in cm_midi_release
  74. * 08/10/2001 - use set_current_state in some more places
  75. *
  76. * Carlos Eduardo Gorges <carlos@techlinux.com.br>
  77. * Fri May 25 2001
  78. * - SMP support ( spin[un]lock* revision )
  79. * - speaker mixer support
  80. * Mon Aug 13 2001
  81. * - optimizations and cleanups
  82. *
  83. * 03/01/2003 - open_mode fixes from Georg Acher <acher@in.tum.de>
  84. * Simon Braunschmidt <brasimon@web.de>
  85. * Sat Jan 31 2004
  86. * - provide support for opl3 FM by releasing IO range after initialization
  87. *
  88. * ChenLi Tien <cltien@cmedia.com.tw>
  89. * Mar 9 2004
  90. * - Fix S/PDIF out if spdif_loop enabled
  91. * - Load opl3 driver if enabled (fmio in proper range)
  92. * - Load mpu401 if enabled (mpuio in proper range)
  93. * Apr 5 2004
  94. * - Fix DUAL_DAC dma synchronization bug
  95. * - Check exist FM/MPU401 I/O before activate.
  96. * - Add AFTM_S16_BE format support, so MPlayer/Xine can play AC3/mutlichannel
  97. * on Mac
  98. * - Change to support kernel 2.6 so only small patch needed
  99. * - All parameters default to 0
  100. * - Add spdif_out to send PCM through S/PDIF out jack
  101. * - Add hw_copy to get 4-spaker output for general PCM/analog output
  102. *
  103. * Stefan Thater <stefan.thaeter@gmx.de>
  104. * Apr 5 2004
  105. * - Fix mute single channel for CD/Line-in/AUX-in
  106. */
  107. /*****************************************************************************/
  108. #include <linux/config.h>
  109. #include <linux/module.h>
  110. #include <linux/string.h>
  111. #include <linux/interrupt.h>
  112. #include <linux/ioport.h>
  113. #include <linux/sched.h>
  114. #include <linux/delay.h>
  115. #include <linux/sound.h>
  116. #include <linux/slab.h>
  117. #include <linux/soundcard.h>
  118. #include <linux/pci.h>
  119. #include <linux/init.h>
  120. #include <linux/poll.h>
  121. #include <linux/spinlock.h>
  122. #include <linux/smp_lock.h>
  123. #include <linux/bitops.h>
  124. #include <linux/wait.h>
  125. #include <linux/dma-mapping.h>
  126. #include <asm/io.h>
  127. #include <asm/page.h>
  128. #include <asm/uaccess.h>
  129. #ifdef CONFIG_SOUND_CMPCI_MIDI
  130. #include "sound_config.h"
  131. #include "mpu401.h"
  132. #endif
  133. #ifdef CONFIG_SOUND_CMPCI_FM
  134. #include "opl3.h"
  135. #endif
  136. #ifdef CONFIG_SOUND_CMPCI_JOYSTICK
  137. #include <linux/gameport.h>
  138. #include <linux/mutex.h>
  139. #endif
  140. /* --------------------------------------------------------------------- */
  141. #undef OSS_DOCUMENTED_MIXER_SEMANTICS
  142. #undef DMABYTEIO
  143. #define DBG(x) {}
  144. /* --------------------------------------------------------------------- */
  145. #define CM_MAGIC ((PCI_VENDOR_ID_CMEDIA<<16)|PCI_DEVICE_ID_CMEDIA_CM8338A)
  146. /* CM8338 registers definition ****************/
  147. #define CODEC_CMI_FUNCTRL0 (0x00)
  148. #define CODEC_CMI_FUNCTRL1 (0x04)
  149. #define CODEC_CMI_CHFORMAT (0x08)
  150. #define CODEC_CMI_INT_HLDCLR (0x0C)
  151. #define CODEC_CMI_INT_STATUS (0x10)
  152. #define CODEC_CMI_LEGACY_CTRL (0x14)
  153. #define CODEC_CMI_MISC_CTRL (0x18)
  154. #define CODEC_CMI_TDMA_POS (0x1C)
  155. #define CODEC_CMI_MIXER (0x20)
  156. #define CODEC_SB16_DATA (0x22)
  157. #define CODEC_SB16_ADDR (0x23)
  158. #define CODEC_CMI_MIXER1 (0x24)
  159. #define CODEC_CMI_MIXER2 (0x25)
  160. #define CODEC_CMI_AUX_VOL (0x26)
  161. #define CODEC_CMI_MISC (0x27)
  162. #define CODEC_CMI_AC97 (0x28)
  163. #define CODEC_CMI_CH0_FRAME1 (0x80)
  164. #define CODEC_CMI_CH0_FRAME2 (0x84)
  165. #define CODEC_CMI_CH1_FRAME1 (0x88)
  166. #define CODEC_CMI_CH1_FRAME2 (0x8C)
  167. #define CODEC_CMI_SPDIF_CTRL (0x90)
  168. #define CODEC_CMI_MISC_CTRL2 (0x92)
  169. #define CODEC_CMI_EXT_REG (0xF0)
  170. /* Mixer registers for SB16 ******************/
  171. #define DSP_MIX_DATARESETIDX ((unsigned char)(0x00))
  172. #define DSP_MIX_MASTERVOLIDX_L ((unsigned char)(0x30))
  173. #define DSP_MIX_MASTERVOLIDX_R ((unsigned char)(0x31))
  174. #define DSP_MIX_VOICEVOLIDX_L ((unsigned char)(0x32))
  175. #define DSP_MIX_VOICEVOLIDX_R ((unsigned char)(0x33))
  176. #define DSP_MIX_FMVOLIDX_L ((unsigned char)(0x34))
  177. #define DSP_MIX_FMVOLIDX_R ((unsigned char)(0x35))
  178. #define DSP_MIX_CDVOLIDX_L ((unsigned char)(0x36))
  179. #define DSP_MIX_CDVOLIDX_R ((unsigned char)(0x37))
  180. #define DSP_MIX_LINEVOLIDX_L ((unsigned char)(0x38))
  181. #define DSP_MIX_LINEVOLIDX_R ((unsigned char)(0x39))
  182. #define DSP_MIX_MICVOLIDX ((unsigned char)(0x3A))
  183. #define DSP_MIX_SPKRVOLIDX ((unsigned char)(0x3B))
  184. #define DSP_MIX_OUTMIXIDX ((unsigned char)(0x3C))
  185. #define DSP_MIX_ADCMIXIDX_L ((unsigned char)(0x3D))
  186. #define DSP_MIX_ADCMIXIDX_R ((unsigned char)(0x3E))
  187. #define DSP_MIX_INGAINIDX_L ((unsigned char)(0x3F))
  188. #define DSP_MIX_INGAINIDX_R ((unsigned char)(0x40))
  189. #define DSP_MIX_OUTGAINIDX_L ((unsigned char)(0x41))
  190. #define DSP_MIX_OUTGAINIDX_R ((unsigned char)(0x42))
  191. #define DSP_MIX_AGCIDX ((unsigned char)(0x43))
  192. #define DSP_MIX_TREBLEIDX_L ((unsigned char)(0x44))
  193. #define DSP_MIX_TREBLEIDX_R ((unsigned char)(0x45))
  194. #define DSP_MIX_BASSIDX_L ((unsigned char)(0x46))
  195. #define DSP_MIX_BASSIDX_R ((unsigned char)(0x47))
  196. #define DSP_MIX_EXTENSION ((unsigned char)(0xf0))
  197. // pseudo register for AUX
  198. #define DSP_MIX_AUXVOL_L ((unsigned char)(0x50))
  199. #define DSP_MIX_AUXVOL_R ((unsigned char)(0x51))
  200. // I/O length
  201. #define CM_EXTENT_CODEC 0x100
  202. #define CM_EXTENT_MIDI 0x2
  203. #define CM_EXTENT_SYNTH 0x4
  204. #define CM_EXTENT_GAME 0x8
  205. // Function Control Register 0 (00h)
  206. #define CHADC0 0x01
  207. #define CHADC1 0x02
  208. #define PAUSE0 0x04
  209. #define PAUSE1 0x08
  210. // Function Control Register 0+2 (02h)
  211. #define CHEN0 0x01
  212. #define CHEN1 0x02
  213. #define RST_CH0 0x04
  214. #define RST_CH1 0x08
  215. // Function Control Register 1 (04h)
  216. #define JYSTK_EN 0x02
  217. #define UART_EN 0x04
  218. #define SPDO2DAC 0x40
  219. #define SPDFLOOP 0x80
  220. // Function Control Register 1+1 (05h)
  221. #define SPDF_0 0x01
  222. #define SPDF_1 0x02
  223. #define ASFC 0x1c
  224. #define DSFC 0xe0
  225. #define SPDIF2DAC (SPDF_1 << 8 | SPDO2DAC)
  226. // Channel Format Register (08h)
  227. #define CM_CFMT_STEREO 0x01
  228. #define CM_CFMT_16BIT 0x02
  229. #define CM_CFMT_MASK 0x03
  230. #define POLVALID 0x20
  231. #define INVSPDIFI 0x80
  232. // Channel Format Register+2 (0ah)
  233. #define SPD24SEL 0x20
  234. // Channel Format Register+3 (0bh)
  235. #define CHB3D 0x20
  236. #define CHB3D5C 0x80
  237. // Interrupt Hold/Clear Register+2 (0eh)
  238. #define CH0_INT_EN 0x01
  239. #define CH1_INT_EN 0x02
  240. // Interrupt Register (10h)
  241. #define CHINT0 0x01
  242. #define CHINT1 0x02
  243. #define CH0BUSY 0x04
  244. #define CH1BUSY 0x08
  245. // Legacy Control/Status Register+1 (15h)
  246. #define EXBASEN 0x10
  247. #define BASE2LIN 0x20
  248. #define CENTR2LIN 0x40
  249. #define CB2LIN (BASE2LIN | CENTR2LIN)
  250. #define CHB3D6C 0x80
  251. // Legacy Control/Status Register+2 (16h)
  252. #define DAC2SPDO 0x20
  253. #define SPDCOPYRHT 0x40
  254. #define ENSPDOUT 0x80
  255. // Legacy Control/Status Register+3 (17h)
  256. #define FMSEL 0x03
  257. #define VSBSEL 0x0c
  258. #define VMPU 0x60
  259. #define NXCHG 0x80
  260. // Miscellaneous Control Register (18h)
  261. #define REAR2LIN 0x20
  262. #define MUTECH1 0x40
  263. #define ENCENTER 0x80
  264. // Miscellaneous Control Register+1 (19h)
  265. #define SELSPDIFI2 0x01
  266. #define SPDF_AC97 0x80
  267. // Miscellaneous Control Register+2 (1ah)
  268. #define AC3_EN 0x04
  269. #define FM_EN 0x08
  270. #define SPD32SEL 0x20
  271. #define XCHGDAC 0x40
  272. #define ENDBDAC 0x80
  273. // Miscellaneous Control Register+3 (1bh)
  274. #define SPDIFI48K 0x01
  275. #define SPDO5V 0x02
  276. #define N4SPK3D 0x04
  277. #define RESET 0x40
  278. #define PWD 0x80
  279. #define SPDIF48K (SPDIFI48K << 24 | SPDF_AC97 << 8)
  280. // Mixer1 (24h)
  281. #define CDPLAY 0x01
  282. #define X3DEN 0x02
  283. #define REAR2FRONT 0x10
  284. #define SPK4 0x20
  285. #define WSMUTE 0x40
  286. #define FMMUTE 0x80
  287. // Miscellaneous Register (27h)
  288. #define SPDVALID 0x02
  289. #define CENTR2MIC 0x04
  290. // Miscellaneous Register2 (92h)
  291. #define SPD32KFMT 0x10
  292. #define CM_CFMT_DACSHIFT 2
  293. #define CM_CFMT_ADCSHIFT 0
  294. #define CM_FREQ_DACSHIFT 5
  295. #define CM_FREQ_ADCSHIFT 2
  296. #define RSTDAC RST_CH1
  297. #define RSTADC RST_CH0
  298. #define ENDAC CHEN1
  299. #define ENADC CHEN0
  300. #define PAUSEDAC PAUSE1
  301. #define PAUSEADC PAUSE0
  302. #define CODEC_CMI_ADC_FRAME1 CODEC_CMI_CH0_FRAME1
  303. #define CODEC_CMI_ADC_FRAME2 CODEC_CMI_CH0_FRAME2
  304. #define CODEC_CMI_DAC_FRAME1 CODEC_CMI_CH1_FRAME1
  305. #define CODEC_CMI_DAC_FRAME2 CODEC_CMI_CH1_FRAME2
  306. #define DACINT CHINT1
  307. #define ADCINT CHINT0
  308. #define DACBUSY CH1BUSY
  309. #define ADCBUSY CH0BUSY
  310. #define ENDACINT CH1_INT_EN
  311. #define ENADCINT CH0_INT_EN
  312. static const unsigned sample_size[] = { 1, 2, 2, 4 };
  313. static const unsigned sample_shift[] = { 0, 1, 1, 2 };
  314. #define SND_DEV_DSP16 5
  315. #define NR_DEVICE 3 /* maximum number of devices */
  316. #define set_dac1_rate set_adc_rate
  317. #define set_dac1_rate_unlocked set_adc_rate_unlocked
  318. #define stop_dac1 stop_adc
  319. #define stop_dac1_unlocked stop_adc_unlocked
  320. #define get_dmadac1 get_dmaadc
  321. static unsigned int devindex = 0;
  322. //*********************************************/
  323. struct cm_state {
  324. /* magic */
  325. unsigned int magic;
  326. /* list of cmedia devices */
  327. struct list_head devs;
  328. /* the corresponding pci_dev structure */
  329. struct pci_dev *dev;
  330. int dev_audio; /* soundcore stuff */
  331. int dev_mixer;
  332. unsigned int iosb, iobase, iosynth,
  333. iomidi, iogame, irq; /* hardware resources */
  334. unsigned short deviceid; /* pci_id */
  335. struct { /* mixer stuff */
  336. unsigned int modcnt;
  337. unsigned short vol[13];
  338. } mix;
  339. unsigned int rateadc, ratedac; /* wave stuff */
  340. unsigned char fmt, enable;
  341. spinlock_t lock;
  342. struct mutex open_mutex;
  343. mode_t open_mode;
  344. wait_queue_head_t open_wait;
  345. struct dmabuf {
  346. void *rawbuf;
  347. dma_addr_t dmaaddr;
  348. unsigned buforder;
  349. unsigned numfrag;
  350. unsigned fragshift;
  351. unsigned hwptr, swptr;
  352. unsigned total_bytes;
  353. int count;
  354. unsigned error; /* over/underrun */
  355. wait_queue_head_t wait;
  356. unsigned fragsize; /* redundant, but makes calculations easier */
  357. unsigned dmasize;
  358. unsigned fragsamples;
  359. unsigned dmasamples;
  360. unsigned mapped:1; /* OSS stuff */
  361. unsigned ready:1;
  362. unsigned endcleared:1;
  363. unsigned enabled:1;
  364. unsigned ossfragshift;
  365. int ossmaxfrags;
  366. unsigned subdivision;
  367. } dma_dac, dma_adc;
  368. #ifdef CONFIG_SOUND_CMPCI_MIDI
  369. int midi_devc;
  370. struct address_info mpu_data;
  371. #endif
  372. #ifdef CONFIG_SOUND_CMPCI_JOYSTICK
  373. struct gameport *gameport;
  374. #endif
  375. int chip_version;
  376. int max_channels;
  377. int curr_channels;
  378. int capability; /* HW capability, various for chip versions */
  379. int status; /* HW or SW state */
  380. int spdif_counter; /* spdif frame counter */
  381. };
  382. /* flags used for capability */
  383. #define CAN_AC3_HW 0x00000001 /* 037 or later */
  384. #define CAN_AC3_SW 0x00000002 /* 033 or later */
  385. #define CAN_AC3 (CAN_AC3_HW | CAN_AC3_SW)
  386. #define CAN_DUAL_DAC 0x00000004 /* 033 or later */
  387. #define CAN_MULTI_CH_HW 0x00000008 /* 039 or later */
  388. #define CAN_MULTI_CH (CAN_MULTI_CH_HW | CAN_DUAL_DAC)
  389. #define CAN_LINE_AS_REAR 0x00000010 /* 033 or later */
  390. #define CAN_LINE_AS_BASS 0x00000020 /* 039 or later */
  391. #define CAN_MIC_AS_BASS 0x00000040 /* 039 or later */
  392. /* flags used for status */
  393. #define DO_AC3_HW 0x00000001
  394. #define DO_AC3_SW 0x00000002
  395. #define DO_AC3 (DO_AC3_HW | DO_AC3_SW)
  396. #define DO_DUAL_DAC 0x00000004
  397. #define DO_MULTI_CH_HW 0x00000008
  398. #define DO_MULTI_CH (DO_MULTI_CH_HW | DO_DUAL_DAC)
  399. #define DO_LINE_AS_REAR 0x00000010 /* 033 or later */
  400. #define DO_LINE_AS_BASS 0x00000020 /* 039 or later */
  401. #define DO_MIC_AS_BASS 0x00000040 /* 039 or later */
  402. #define DO_SPDIF_OUT 0x00000100
  403. #define DO_SPDIF_IN 0x00000200
  404. #define DO_SPDIF_LOOP 0x00000400
  405. #define DO_BIGENDIAN_W 0x00001000 /* used in PowerPC */
  406. #define DO_BIGENDIAN_R 0x00002000 /* used in PowerPC */
  407. static LIST_HEAD(devs);
  408. static int mpuio;
  409. static int fmio;
  410. static int joystick;
  411. static int spdif_inverse;
  412. static int spdif_loop;
  413. static int spdif_out;
  414. static int use_line_as_rear;
  415. static int use_line_as_bass;
  416. static int use_mic_as_bass;
  417. static int mic_boost;
  418. static int hw_copy;
  419. module_param(mpuio, int, 0);
  420. module_param(fmio, int, 0);
  421. module_param(joystick, bool, 0);
  422. module_param(spdif_inverse, bool, 0);
  423. module_param(spdif_loop, bool, 0);
  424. module_param(spdif_out, bool, 0);
  425. module_param(use_line_as_rear, bool, 0);
  426. module_param(use_line_as_bass, bool, 0);
  427. module_param(use_mic_as_bass, bool, 0);
  428. module_param(mic_boost, bool, 0);
  429. module_param(hw_copy, bool, 0);
  430. MODULE_PARM_DESC(mpuio, "(0x330, 0x320, 0x310, 0x300) Base of MPU-401, 0 to disable");
  431. MODULE_PARM_DESC(fmio, "(0x388, 0x3C8, 0x3E0) Base of OPL3, 0 to disable");
  432. MODULE_PARM_DESC(joystick, "(1/0) Enable joystick interface, still need joystick driver");
  433. MODULE_PARM_DESC(spdif_inverse, "(1/0) Invert S/PDIF-in signal");
  434. MODULE_PARM_DESC(spdif_loop, "(1/0) Route S/PDIF-in to S/PDIF-out directly");
  435. MODULE_PARM_DESC(spdif_out, "(1/0) Send PCM to S/PDIF-out (PCM volume will not function)");
  436. MODULE_PARM_DESC(use_line_as_rear, "(1/0) Use line-in jack as rear-out");
  437. MODULE_PARM_DESC(use_line_as_bass, "(1/0) Use line-in jack as bass/center");
  438. MODULE_PARM_DESC(use_mic_as_bass, "(1/0) Use mic-in jack as bass/center");
  439. MODULE_PARM_DESC(mic_boost, "(1/0) Enable microphone boost");
  440. MODULE_PARM_DESC(hw_copy, "Copy front channel to surround channel");
  441. /* --------------------------------------------------------------------- */
  442. static inline unsigned ld2(unsigned int x)
  443. {
  444. unsigned exp=16,l=5,r=0;
  445. static const unsigned num[]={0x2,0x4,0x10,0x100,0x10000};
  446. /* num: 2, 4, 16, 256, 65536 */
  447. /* exp: 1, 2, 4, 8, 16 */
  448. while(l--) {
  449. if( x >= num[l] ) {
  450. if(num[l]>2) x >>= exp;
  451. r+=exp;
  452. }
  453. exp>>=1;
  454. }
  455. return r;
  456. }
  457. /* --------------------------------------------------------------------- */
  458. static void maskb(unsigned int addr, unsigned int mask, unsigned int value)
  459. {
  460. outb((inb(addr) & mask) | value, addr);
  461. }
  462. static void maskw(unsigned int addr, unsigned int mask, unsigned int value)
  463. {
  464. outw((inw(addr) & mask) | value, addr);
  465. }
  466. static void maskl(unsigned int addr, unsigned int mask, unsigned int value)
  467. {
  468. outl((inl(addr) & mask) | value, addr);
  469. }
  470. static void set_dmadac1(struct cm_state *s, unsigned int addr, unsigned int count)
  471. {
  472. if (addr)
  473. outl(addr, s->iobase + CODEC_CMI_ADC_FRAME1);
  474. outw(count - 1, s->iobase + CODEC_CMI_ADC_FRAME2);
  475. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~CHADC0, 0);
  476. }
  477. static void set_dmaadc(struct cm_state *s, unsigned int addr, unsigned int count)
  478. {
  479. outl(addr, s->iobase + CODEC_CMI_ADC_FRAME1);
  480. outw(count - 1, s->iobase + CODEC_CMI_ADC_FRAME2);
  481. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, CHADC0);
  482. }
  483. static void set_dmadac(struct cm_state *s, unsigned int addr, unsigned int count)
  484. {
  485. outl(addr, s->iobase + CODEC_CMI_DAC_FRAME1);
  486. outw(count - 1, s->iobase + CODEC_CMI_DAC_FRAME2);
  487. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~CHADC1, 0);
  488. if (s->status & DO_DUAL_DAC)
  489. set_dmadac1(s, 0, count);
  490. }
  491. static void set_countadc(struct cm_state *s, unsigned count)
  492. {
  493. outw(count - 1, s->iobase + CODEC_CMI_ADC_FRAME2 + 2);
  494. }
  495. static void set_countdac(struct cm_state *s, unsigned count)
  496. {
  497. outw(count - 1, s->iobase + CODEC_CMI_DAC_FRAME2 + 2);
  498. if (s->status & DO_DUAL_DAC)
  499. set_countadc(s, count);
  500. }
  501. static unsigned get_dmadac(struct cm_state *s)
  502. {
  503. unsigned int curr_addr;
  504. curr_addr = inw(s->iobase + CODEC_CMI_DAC_FRAME2) + 1;
  505. curr_addr <<= sample_shift[(s->fmt >> CM_CFMT_DACSHIFT) & CM_CFMT_MASK];
  506. curr_addr = s->dma_dac.dmasize - curr_addr;
  507. return curr_addr;
  508. }
  509. static unsigned get_dmaadc(struct cm_state *s)
  510. {
  511. unsigned int curr_addr;
  512. curr_addr = inw(s->iobase + CODEC_CMI_ADC_FRAME2) + 1;
  513. curr_addr <<= sample_shift[(s->fmt >> CM_CFMT_ADCSHIFT) & CM_CFMT_MASK];
  514. curr_addr = s->dma_adc.dmasize - curr_addr;
  515. return curr_addr;
  516. }
  517. static void wrmixer(struct cm_state *s, unsigned char idx, unsigned char data)
  518. {
  519. unsigned char regval, pseudo;
  520. // pseudo register
  521. if (idx == DSP_MIX_AUXVOL_L) {
  522. data >>= 4;
  523. data &= 0x0f;
  524. regval = inb(s->iobase + CODEC_CMI_AUX_VOL) & ~0x0f;
  525. outb(regval | data, s->iobase + CODEC_CMI_AUX_VOL);
  526. return;
  527. }
  528. if (idx == DSP_MIX_AUXVOL_R) {
  529. data &= 0xf0;
  530. regval = inb(s->iobase + CODEC_CMI_AUX_VOL) & ~0xf0;
  531. outb(regval | data, s->iobase + CODEC_CMI_AUX_VOL);
  532. return;
  533. }
  534. outb(idx, s->iobase + CODEC_SB16_ADDR);
  535. udelay(10);
  536. // pseudo bits
  537. if (idx == DSP_MIX_OUTMIXIDX) {
  538. pseudo = data & ~0x1f;
  539. pseudo >>= 1;
  540. regval = inb(s->iobase + CODEC_CMI_MIXER2) & ~0x30;
  541. outb(regval | pseudo, s->iobase + CODEC_CMI_MIXER2);
  542. }
  543. if (idx == DSP_MIX_ADCMIXIDX_L) {
  544. pseudo = data & 0x80;
  545. pseudo >>= 1;
  546. regval = inb(s->iobase + CODEC_CMI_MIXER2) & ~0x40;
  547. outb(regval | pseudo, s->iobase + CODEC_CMI_MIXER2);
  548. }
  549. if (idx == DSP_MIX_ADCMIXIDX_R) {
  550. pseudo = data & 0x80;
  551. regval = inb(s->iobase + CODEC_CMI_MIXER2) & ~0x80;
  552. outb(regval | pseudo, s->iobase + CODEC_CMI_MIXER2);
  553. }
  554. outb(data, s->iobase + CODEC_SB16_DATA);
  555. udelay(10);
  556. }
  557. static unsigned char rdmixer(struct cm_state *s, unsigned char idx)
  558. {
  559. unsigned char v, pseudo;
  560. // pseudo register
  561. if (idx == DSP_MIX_AUXVOL_L) {
  562. v = inb(s->iobase + CODEC_CMI_AUX_VOL) & 0x0f;
  563. v <<= 4;
  564. return v;
  565. }
  566. if (idx == DSP_MIX_AUXVOL_L) {
  567. v = inb(s->iobase + CODEC_CMI_AUX_VOL) & 0xf0;
  568. return v;
  569. }
  570. outb(idx, s->iobase + CODEC_SB16_ADDR);
  571. udelay(10);
  572. v = inb(s->iobase + CODEC_SB16_DATA);
  573. udelay(10);
  574. // pseudo bits
  575. if (idx == DSP_MIX_OUTMIXIDX) {
  576. pseudo = inb(s->iobase + CODEC_CMI_MIXER2) & 0x30;
  577. pseudo <<= 1;
  578. v |= pseudo;
  579. }
  580. if (idx == DSP_MIX_ADCMIXIDX_L) {
  581. pseudo = inb(s->iobase + CODEC_CMI_MIXER2) & 0x40;
  582. pseudo <<= 1;
  583. v |= pseudo;
  584. }
  585. if (idx == DSP_MIX_ADCMIXIDX_R) {
  586. pseudo = inb(s->iobase + CODEC_CMI_MIXER2) & 0x80;
  587. v |= pseudo;
  588. }
  589. return v;
  590. }
  591. static void set_fmt_unlocked(struct cm_state *s, unsigned char mask, unsigned char data)
  592. {
  593. if (mask && s->chip_version > 0) { /* 8338 cannot keep this */
  594. s->fmt = inb(s->iobase + CODEC_CMI_CHFORMAT);
  595. udelay(10);
  596. }
  597. s->fmt = (s->fmt & mask) | data;
  598. outb(s->fmt, s->iobase + CODEC_CMI_CHFORMAT);
  599. udelay(10);
  600. }
  601. static void set_fmt(struct cm_state *s, unsigned char mask, unsigned char data)
  602. {
  603. unsigned long flags;
  604. spin_lock_irqsave(&s->lock, flags);
  605. set_fmt_unlocked(s,mask,data);
  606. spin_unlock_irqrestore(&s->lock, flags);
  607. }
  608. static void frobindir(struct cm_state *s, unsigned char idx, unsigned char mask, unsigned char data)
  609. {
  610. outb(idx, s->iobase + CODEC_SB16_ADDR);
  611. udelay(10);
  612. outb((inb(s->iobase + CODEC_SB16_DATA) & mask) | data, s->iobase + CODEC_SB16_DATA);
  613. udelay(10);
  614. }
  615. static struct {
  616. unsigned rate;
  617. unsigned lower;
  618. unsigned upper;
  619. unsigned char freq;
  620. } rate_lookup[] =
  621. {
  622. { 5512, (0 + 5512) / 2, (5512 + 8000) / 2, 0 },
  623. { 8000, (5512 + 8000) / 2, (8000 + 11025) / 2, 4 },
  624. { 11025, (8000 + 11025) / 2, (11025 + 16000) / 2, 1 },
  625. { 16000, (11025 + 16000) / 2, (16000 + 22050) / 2, 5 },
  626. { 22050, (16000 + 22050) / 2, (22050 + 32000) / 2, 2 },
  627. { 32000, (22050 + 32000) / 2, (32000 + 44100) / 2, 6 },
  628. { 44100, (32000 + 44100) / 2, (44100 + 48000) / 2, 3 },
  629. { 48000, (44100 + 48000) / 2, 48000, 7 }
  630. };
  631. static void set_spdif_copyright(struct cm_state *s, int spdif_copyright)
  632. {
  633. /* enable SPDIF-in Copyright */
  634. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~SPDCOPYRHT, spdif_copyright ? SPDCOPYRHT : 0);
  635. }
  636. static void set_spdif_loop(struct cm_state *s, int spdif_loop)
  637. {
  638. /* enable SPDIF loop */
  639. if (spdif_loop) {
  640. s->status |= DO_SPDIF_LOOP;
  641. /* turn on spdif-in to spdif-out */
  642. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, SPDFLOOP);
  643. } else {
  644. s->status &= ~DO_SPDIF_LOOP;
  645. /* turn off spdif-in to spdif-out */
  646. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~SPDFLOOP, 0);
  647. }
  648. }
  649. static void set_spdif_monitor(struct cm_state *s, int channel)
  650. {
  651. // SPDO2DAC
  652. maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~SPDO2DAC, channel == 2 ? SPDO2DAC : 0);
  653. // CDPLAY
  654. if (s->chip_version >= 39)
  655. maskb(s->iobase + CODEC_CMI_MIXER1, ~CDPLAY, channel ? CDPLAY : 0);
  656. }
  657. static void set_spdifout_level(struct cm_state *s, int level5v)
  658. {
  659. /* SPDO5V */
  660. if (s->chip_version > 0)
  661. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~SPDO5V, level5v ? SPDO5V : 0);
  662. }
  663. static void set_spdifin_inverse(struct cm_state *s, int spdif_inverse)
  664. {
  665. if (s->chip_version == 0) /* 8338 has not this feature */
  666. return;
  667. if (spdif_inverse) {
  668. /* turn on spdif-in inverse */
  669. if (s->chip_version >= 39)
  670. maskb(s->iobase + CODEC_CMI_CHFORMAT, ~0, INVSPDIFI);
  671. else
  672. maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 1);
  673. } else {
  674. /* turn off spdif-ininverse */
  675. if (s->chip_version >= 39)
  676. maskb(s->iobase + CODEC_CMI_CHFORMAT, ~INVSPDIFI, 0);
  677. else
  678. maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~1, 0);
  679. }
  680. }
  681. static void set_spdifin_channel2(struct cm_state *s, int channel2)
  682. {
  683. /* SELSPDIFI2 */
  684. if (s->chip_version >= 39)
  685. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 1, ~SELSPDIFI2, channel2 ? SELSPDIFI2 : 0);
  686. }
  687. static void set_spdifin_valid(struct cm_state *s, int valid)
  688. {
  689. /* SPDVALID */
  690. maskb(s->iobase + CODEC_CMI_MISC, ~SPDVALID, valid ? SPDVALID : 0);
  691. }
  692. static void set_spdifout_unlocked(struct cm_state *s, unsigned rate)
  693. {
  694. if (rate != 48000 && rate != 44100)
  695. rate = 0;
  696. if (rate == 48000 || rate == 44100) {
  697. set_spdif_loop(s, 0);
  698. // SPDF_1
  699. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~0, SPDF_1);
  700. // SPDIFI48K SPDF_AC97
  701. maskl(s->iobase + CODEC_CMI_MISC_CTRL, ~SPDIF48K, rate == 48000 ? SPDIF48K : 0);
  702. if (s->chip_version >= 55)
  703. // SPD32KFMT
  704. maskb(s->iobase + CODEC_CMI_MISC_CTRL2, ~SPD32KFMT, rate == 48000 ? SPD32KFMT : 0);
  705. if (s->chip_version > 0)
  706. // ENSPDOUT
  707. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~0, ENSPDOUT);
  708. // monitor SPDIF out
  709. set_spdif_monitor(s, 2);
  710. s->status |= DO_SPDIF_OUT;
  711. } else {
  712. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~SPDF_1, 0);
  713. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~ENSPDOUT, 0);
  714. // monitor none
  715. set_spdif_monitor(s, 0);
  716. s->status &= ~DO_SPDIF_OUT;
  717. }
  718. }
  719. static void set_spdifout(struct cm_state *s, unsigned rate)
  720. {
  721. unsigned long flags;
  722. spin_lock_irqsave(&s->lock, flags);
  723. set_spdifout_unlocked(s,rate);
  724. spin_unlock_irqrestore(&s->lock, flags);
  725. }
  726. static void set_spdifin_unlocked(struct cm_state *s, unsigned rate)
  727. {
  728. if (rate == 48000 || rate == 44100) {
  729. // SPDF_1
  730. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~0, SPDF_1);
  731. // SPDIFI48K SPDF_AC97
  732. maskl(s->iobase + CODEC_CMI_MISC_CTRL, ~SPDIF48K, rate == 48000 ? SPDIF48K : 0);
  733. s->status |= DO_SPDIF_IN;
  734. } else {
  735. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~SPDF_1, 0);
  736. s->status &= ~DO_SPDIF_IN;
  737. }
  738. }
  739. static void set_spdifin(struct cm_state *s, unsigned rate)
  740. {
  741. unsigned long flags;
  742. spin_lock_irqsave(&s->lock, flags);
  743. set_spdifin_unlocked(s,rate);
  744. spin_unlock_irqrestore(&s->lock, flags);
  745. }
  746. /* find parity for bit 4~30 */
  747. static unsigned parity(unsigned data)
  748. {
  749. unsigned parity = 0;
  750. int counter = 4;
  751. data >>= 4; // start from bit 4
  752. while (counter <= 30) {
  753. if (data & 1)
  754. parity++;
  755. data >>= 1;
  756. counter++;
  757. }
  758. return parity & 1;
  759. }
  760. static void set_ac3_unlocked(struct cm_state *s, unsigned rate)
  761. {
  762. if (!(s->capability & CAN_AC3))
  763. return;
  764. /* enable AC3 */
  765. if (rate && rate != 44100)
  766. rate = 48000;
  767. if (rate == 48000 || rate == 44100) {
  768. // mute DAC
  769. maskb(s->iobase + CODEC_CMI_MIXER1, ~0, WSMUTE);
  770. if (s->chip_version >= 39)
  771. maskb(s->iobase + CODEC_CMI_MISC_CTRL, ~0, MUTECH1);
  772. // AC3EN for 039, 0x04
  773. if (s->chip_version >= 39) {
  774. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, AC3_EN);
  775. if (s->chip_version == 55)
  776. maskb(s->iobase + CODEC_CMI_SPDIF_CTRL, ~2, 0);
  777. // AC3EN for 037, 0x10
  778. } else if (s->chip_version == 37)
  779. maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 0x10);
  780. if (s->capability & CAN_AC3_HW) {
  781. // SPD24SEL for 039, 0x20, but cannot be set
  782. if (s->chip_version == 39)
  783. maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, SPD24SEL);
  784. // SPD24SEL for 037, 0x02
  785. else if (s->chip_version == 37)
  786. maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 0x02);
  787. if (s->chip_version >= 39)
  788. maskb(s->iobase + CODEC_CMI_MIXER1, ~CDPLAY, 0);
  789. s->status |= DO_AC3_HW;
  790. } else {
  791. // SPD32SEL for 037 & 039
  792. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, SPD32SEL);
  793. // set 176K sample rate to fix 033 HW bug
  794. if (s->chip_version == 33) {
  795. if (rate == 48000)
  796. maskb(s->iobase + CODEC_CMI_CHFORMAT + 1, ~0, 0x08);
  797. else
  798. maskb(s->iobase + CODEC_CMI_CHFORMAT + 1, ~0x08, 0);
  799. }
  800. s->status |= DO_AC3_SW;
  801. }
  802. } else {
  803. maskb(s->iobase + CODEC_CMI_MIXER1, ~WSMUTE, 0);
  804. if (s->chip_version >= 39)
  805. maskb(s->iobase + CODEC_CMI_MISC_CTRL, ~MUTECH1, 0);
  806. maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~(SPD24SEL|0x12), 0);
  807. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~(SPD32SEL|AC3_EN), 0);
  808. if (s->chip_version == 33)
  809. maskb(s->iobase + CODEC_CMI_CHFORMAT + 1, ~0x08, 0);
  810. if (s->chip_version >= 39)
  811. maskb(s->iobase + CODEC_CMI_MIXER1, ~0, CDPLAY);
  812. s->status &= ~DO_AC3;
  813. }
  814. s->spdif_counter = 0;
  815. }
  816. static void set_line_as_rear(struct cm_state *s, int use_line_as_rear)
  817. {
  818. if (!(s->capability & CAN_LINE_AS_REAR))
  819. return;
  820. if (use_line_as_rear) {
  821. maskb(s->iobase + CODEC_CMI_MIXER1, ~0, SPK4);
  822. s->status |= DO_LINE_AS_REAR;
  823. } else {
  824. maskb(s->iobase + CODEC_CMI_MIXER1, ~SPK4, 0);
  825. s->status &= ~DO_LINE_AS_REAR;
  826. }
  827. }
  828. static void set_line_as_bass(struct cm_state *s, int use_line_as_bass)
  829. {
  830. if (!(s->capability & CAN_LINE_AS_BASS))
  831. return;
  832. if (use_line_as_bass) {
  833. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~0, CB2LIN);
  834. s->status |= DO_LINE_AS_BASS;
  835. } else {
  836. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~CB2LIN, 0);
  837. s->status &= ~DO_LINE_AS_BASS;
  838. }
  839. }
  840. static void set_mic_as_bass(struct cm_state *s, int use_mic_as_bass)
  841. {
  842. if (!(s->capability & CAN_MIC_AS_BASS))
  843. return;
  844. if (use_mic_as_bass) {
  845. maskb(s->iobase + CODEC_CMI_MISC, ~0, 0x04);
  846. s->status |= DO_MIC_AS_BASS;
  847. } else {
  848. maskb(s->iobase + CODEC_CMI_MISC, ~0x04, 0);
  849. s->status &= ~DO_MIC_AS_BASS;
  850. }
  851. }
  852. static void set_hw_copy(struct cm_state *s, int hw_copy)
  853. {
  854. if (s->max_channels > 2 && hw_copy)
  855. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~0, N4SPK3D);
  856. else
  857. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~N4SPK3D, 0);
  858. }
  859. static void set_ac3(struct cm_state *s, unsigned rate)
  860. {
  861. unsigned long flags;
  862. spin_lock_irqsave(&s->lock, flags);
  863. set_spdifout_unlocked(s, rate);
  864. set_ac3_unlocked(s, rate);
  865. spin_unlock_irqrestore(&s->lock, flags);
  866. }
  867. static int trans_ac3(struct cm_state *s, void *dest, const char __user *source, int size)
  868. {
  869. int i = size / 2;
  870. unsigned long data;
  871. unsigned short data16;
  872. unsigned long *dst = (unsigned long *) dest;
  873. unsigned short __user *src = (unsigned short __user *)source;
  874. int err;
  875. do {
  876. if ((err = __get_user(data16, src++)))
  877. return err;
  878. data = (unsigned long)le16_to_cpu(data16);
  879. data <<= 12; // ok for 16-bit data
  880. if (s->spdif_counter == 2 || s->spdif_counter == 3)
  881. data |= 0x40000000; // indicate AC-3 raw data
  882. if (parity(data))
  883. data |= 0x80000000; // parity
  884. if (s->spdif_counter == 0)
  885. data |= 3; // preamble 'M'
  886. else if (s->spdif_counter & 1)
  887. data |= 5; // odd, 'W'
  888. else
  889. data |= 9; // even, 'M'
  890. *dst++ = cpu_to_le32(data);
  891. s->spdif_counter++;
  892. if (s->spdif_counter == 384)
  893. s->spdif_counter = 0;
  894. } while (--i);
  895. return 0;
  896. }
  897. static void set_adc_rate_unlocked(struct cm_state *s, unsigned rate)
  898. {
  899. unsigned char freq = 4;
  900. int i;
  901. if (rate > 48000)
  902. rate = 48000;
  903. if (rate < 8000)
  904. rate = 8000;
  905. for (i = 0; i < sizeof(rate_lookup) / sizeof(rate_lookup[0]); i++) {
  906. if (rate > rate_lookup[i].lower && rate <= rate_lookup[i].upper) {
  907. rate = rate_lookup[i].rate;
  908. freq = rate_lookup[i].freq;
  909. break;
  910. }
  911. }
  912. s->rateadc = rate;
  913. freq <<= CM_FREQ_ADCSHIFT;
  914. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~ASFC, freq);
  915. }
  916. static void set_adc_rate(struct cm_state *s, unsigned rate)
  917. {
  918. unsigned long flags;
  919. unsigned char freq = 4;
  920. int i;
  921. if (rate > 48000)
  922. rate = 48000;
  923. if (rate < 8000)
  924. rate = 8000;
  925. for (i = 0; i < sizeof(rate_lookup) / sizeof(rate_lookup[0]); i++) {
  926. if (rate > rate_lookup[i].lower && rate <= rate_lookup[i].upper) {
  927. rate = rate_lookup[i].rate;
  928. freq = rate_lookup[i].freq;
  929. break;
  930. }
  931. }
  932. s->rateadc = rate;
  933. freq <<= CM_FREQ_ADCSHIFT;
  934. spin_lock_irqsave(&s->lock, flags);
  935. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~ASFC, freq);
  936. spin_unlock_irqrestore(&s->lock, flags);
  937. }
  938. static void set_dac_rate(struct cm_state *s, unsigned rate)
  939. {
  940. unsigned long flags;
  941. unsigned char freq = 4;
  942. int i;
  943. if (rate > 48000)
  944. rate = 48000;
  945. if (rate < 8000)
  946. rate = 8000;
  947. for (i = 0; i < sizeof(rate_lookup) / sizeof(rate_lookup[0]); i++) {
  948. if (rate > rate_lookup[i].lower && rate <= rate_lookup[i].upper) {
  949. rate = rate_lookup[i].rate;
  950. freq = rate_lookup[i].freq;
  951. break;
  952. }
  953. }
  954. s->ratedac = rate;
  955. freq <<= CM_FREQ_DACSHIFT;
  956. spin_lock_irqsave(&s->lock, flags);
  957. maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~DSFC, freq);
  958. spin_unlock_irqrestore(&s->lock, flags);
  959. if (s->curr_channels <= 2 && spdif_out)
  960. set_spdifout(s, rate);
  961. if (s->status & DO_DUAL_DAC)
  962. set_dac1_rate(s, rate);
  963. }
  964. /* --------------------------------------------------------------------- */
  965. static inline void reset_adc(struct cm_state *s)
  966. {
  967. /* reset bus master */
  968. outb(s->enable | RSTADC, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  969. udelay(10);
  970. outb(s->enable & ~RSTADC, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  971. }
  972. static inline void reset_dac(struct cm_state *s)
  973. {
  974. /* reset bus master */
  975. outb(s->enable | RSTDAC, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  976. udelay(10);
  977. outb(s->enable & ~RSTDAC, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  978. if (s->status & DO_DUAL_DAC)
  979. reset_adc(s);
  980. }
  981. static inline void pause_adc(struct cm_state *s)
  982. {
  983. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, PAUSEADC);
  984. }
  985. static inline void pause_dac(struct cm_state *s)
  986. {
  987. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, PAUSEDAC);
  988. if (s->status & DO_DUAL_DAC)
  989. pause_adc(s);
  990. }
  991. static inline void disable_adc(struct cm_state *s)
  992. {
  993. /* disable channel */
  994. s->enable &= ~ENADC;
  995. outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  996. reset_adc(s);
  997. }
  998. static inline void disable_dac(struct cm_state *s)
  999. {
  1000. /* disable channel */
  1001. s->enable &= ~ENDAC;
  1002. outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  1003. reset_dac(s);
  1004. if (s->status & DO_DUAL_DAC)
  1005. disable_adc(s);
  1006. }
  1007. static inline void enable_adc(struct cm_state *s)
  1008. {
  1009. if (!(s->enable & ENADC)) {
  1010. /* enable channel */
  1011. s->enable |= ENADC;
  1012. outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  1013. }
  1014. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~PAUSEADC, 0);
  1015. }
  1016. static inline void enable_dac_unlocked(struct cm_state *s)
  1017. {
  1018. if (!(s->enable & ENDAC)) {
  1019. /* enable channel */
  1020. s->enable |= ENDAC;
  1021. outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2);
  1022. }
  1023. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~PAUSEDAC, 0);
  1024. if (s->status & DO_DUAL_DAC)
  1025. enable_adc(s);
  1026. }
  1027. static inline void stop_adc_unlocked(struct cm_state *s)
  1028. {
  1029. if (s->enable & ENADC) {
  1030. /* disable interrupt */
  1031. maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~ENADCINT, 0);
  1032. disable_adc(s);
  1033. }
  1034. }
  1035. static inline void stop_adc(struct cm_state *s)
  1036. {
  1037. unsigned long flags;
  1038. spin_lock_irqsave(&s->lock, flags);
  1039. stop_adc_unlocked(s);
  1040. spin_unlock_irqrestore(&s->lock, flags);
  1041. }
  1042. static inline void stop_dac_unlocked(struct cm_state *s)
  1043. {
  1044. if (s->enable & ENDAC) {
  1045. /* disable interrupt */
  1046. maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~ENDACINT, 0);
  1047. disable_dac(s);
  1048. }
  1049. if (s->status & DO_DUAL_DAC)
  1050. stop_dac1_unlocked(s);
  1051. }
  1052. static inline void stop_dac(struct cm_state *s)
  1053. {
  1054. unsigned long flags;
  1055. spin_lock_irqsave(&s->lock, flags);
  1056. stop_dac_unlocked(s);
  1057. spin_unlock_irqrestore(&s->lock, flags);
  1058. }
  1059. static inline void start_adc_unlocked(struct cm_state *s)
  1060. {
  1061. if ((s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize))
  1062. && s->dma_adc.ready) {
  1063. /* enable interrupt */
  1064. maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, ENADCINT);
  1065. enable_adc(s);
  1066. }
  1067. }
  1068. static void start_adc(struct cm_state *s)
  1069. {
  1070. unsigned long flags;
  1071. spin_lock_irqsave(&s->lock, flags);
  1072. start_adc_unlocked(s);
  1073. spin_unlock_irqrestore(&s->lock, flags);
  1074. }
  1075. static void start_dac1_unlocked(struct cm_state *s)
  1076. {
  1077. if ((s->dma_adc.mapped || s->dma_adc.count > 0) && s->dma_adc.ready) {
  1078. /* enable interrupt */
  1079. maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, ENADCINT);
  1080. enable_dac_unlocked(s);
  1081. }
  1082. }
  1083. static void start_dac_unlocked(struct cm_state *s)
  1084. {
  1085. if ((s->dma_dac.mapped || s->dma_dac.count > 0) && s->dma_dac.ready) {
  1086. /* enable interrupt */
  1087. maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, ENDACINT);
  1088. enable_dac_unlocked(s);
  1089. }
  1090. if (s->status & DO_DUAL_DAC)
  1091. start_dac1_unlocked(s);
  1092. }
  1093. static void start_dac(struct cm_state *s)
  1094. {
  1095. unsigned long flags;
  1096. spin_lock_irqsave(&s->lock, flags);
  1097. start_dac_unlocked(s);
  1098. spin_unlock_irqrestore(&s->lock, flags);
  1099. }
  1100. static int prog_dmabuf(struct cm_state *s, unsigned rec);
  1101. static int set_dac_channels(struct cm_state *s, int channels)
  1102. {
  1103. unsigned long flags;
  1104. static unsigned int fmmute = 0;
  1105. spin_lock_irqsave(&s->lock, flags);
  1106. if ((channels > 2) && (channels <= s->max_channels)
  1107. && (((s->fmt >> CM_CFMT_DACSHIFT) & CM_CFMT_MASK) == (CM_CFMT_STEREO | CM_CFMT_16BIT))) {
  1108. set_spdifout_unlocked(s, 0);
  1109. if (s->capability & CAN_MULTI_CH_HW) {
  1110. // NXCHG
  1111. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0, NXCHG);
  1112. // CHB3D or CHB3D5C
  1113. maskb(s->iobase + CODEC_CMI_CHFORMAT + 3, ~(CHB3D5C|CHB3D), channels > 4 ? CHB3D5C : CHB3D);
  1114. // CHB3D6C
  1115. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~CHB3D6C, channels == 6 ? CHB3D6C : 0);
  1116. // ENCENTER
  1117. maskb(s->iobase + CODEC_CMI_MISC_CTRL, ~ENCENTER, channels == 6 ? ENCENTER : 0);
  1118. s->status |= DO_MULTI_CH_HW;
  1119. } else if (s->capability & CAN_DUAL_DAC) {
  1120. unsigned char fmtm = ~0, fmts = 0;
  1121. ssize_t ret;
  1122. // ENDBDAC, turn on double DAC mode
  1123. // XCHGDAC, CH0 -> back, CH1->front
  1124. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, ENDBDAC|XCHGDAC);
  1125. // mute FM
  1126. fmmute = inb(s->iobase + CODEC_CMI_MIXER1) & FMMUTE;
  1127. maskb(s->iobase + CODEC_CMI_MIXER1, ~0, FMMUTE);
  1128. s->status |= DO_DUAL_DAC;
  1129. // prepare secondary buffer
  1130. spin_unlock_irqrestore(&s->lock, flags);
  1131. ret = prog_dmabuf(s, 1);
  1132. if (ret) return ret;
  1133. spin_lock_irqsave(&s->lock, flags);
  1134. // copy the hw state
  1135. fmtm &= ~((CM_CFMT_STEREO | CM_CFMT_16BIT) << CM_CFMT_DACSHIFT);
  1136. fmtm &= ~((CM_CFMT_STEREO | CM_CFMT_16BIT) << CM_CFMT_ADCSHIFT);
  1137. // the HW only support 16-bit stereo
  1138. fmts |= CM_CFMT_16BIT << CM_CFMT_DACSHIFT;
  1139. fmts |= CM_CFMT_16BIT << CM_CFMT_ADCSHIFT;
  1140. fmts |= CM_CFMT_STEREO << CM_CFMT_DACSHIFT;
  1141. fmts |= CM_CFMT_STEREO << CM_CFMT_ADCSHIFT;
  1142. set_fmt_unlocked(s, fmtm, fmts);
  1143. set_adc_rate_unlocked(s, s->ratedac);
  1144. }
  1145. // disable 4 speaker mode (analog duplicate)
  1146. set_hw_copy(s, 0);
  1147. s->curr_channels = channels;
  1148. // enable jack redirect
  1149. set_line_as_rear(s, use_line_as_rear);
  1150. if (channels > 4) {
  1151. set_line_as_bass(s, use_line_as_bass);
  1152. set_mic_as_bass(s, use_mic_as_bass);
  1153. }
  1154. } else {
  1155. if (s->status & DO_MULTI_CH_HW) {
  1156. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~NXCHG, 0);
  1157. maskb(s->iobase + CODEC_CMI_CHFORMAT + 3, ~(CHB3D5C|CHB3D), 0);
  1158. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~CHB3D6C, 0);
  1159. } else if (s->status & DO_DUAL_DAC) {
  1160. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~ENDBDAC, 0);
  1161. maskb(s->iobase + CODEC_CMI_MIXER1, ~FMMUTE, fmmute);
  1162. }
  1163. // enable 4 speaker mode (analog duplicate)
  1164. set_hw_copy(s, hw_copy);
  1165. s->status &= ~DO_MULTI_CH;
  1166. s->curr_channels = s->fmt & (CM_CFMT_STEREO << CM_CFMT_DACSHIFT) ? 2 : 1;
  1167. // disable jack redirect
  1168. set_line_as_rear(s, hw_copy ? use_line_as_rear : 0);
  1169. set_line_as_bass(s, 0);
  1170. set_mic_as_bass(s, 0);
  1171. }
  1172. spin_unlock_irqrestore(&s->lock, flags);
  1173. return s->curr_channels;
  1174. }
  1175. /* --------------------------------------------------------------------- */
  1176. #define DMABUF_DEFAULTORDER (16-PAGE_SHIFT)
  1177. #define DMABUF_MINORDER 1
  1178. static void dealloc_dmabuf(struct cm_state *s, struct dmabuf *db)
  1179. {
  1180. struct page *pstart, *pend;
  1181. if (db->rawbuf) {
  1182. /* undo marking the pages as reserved */
  1183. pend = virt_to_page(db->rawbuf + (PAGE_SIZE << db->buforder) - 1);
  1184. for (pstart = virt_to_page(db->rawbuf); pstart <= pend; pstart++)
  1185. ClearPageReserved(pstart);
  1186. pci_free_consistent(s->dev, PAGE_SIZE << db->buforder, db->rawbuf, db->dmaaddr);
  1187. }
  1188. db->rawbuf = NULL;
  1189. db->mapped = db->ready = 0;
  1190. }
  1191. /* Ch1 is used for playback, Ch0 is used for recording */
  1192. static int prog_dmabuf(struct cm_state *s, unsigned rec)
  1193. {
  1194. struct dmabuf *db = rec ? &s->dma_adc : &s->dma_dac;
  1195. unsigned rate = rec ? s->rateadc : s->ratedac;
  1196. int order;
  1197. unsigned bytepersec;
  1198. unsigned bufs;
  1199. struct page *pstart, *pend;
  1200. unsigned char fmt;
  1201. unsigned long flags;
  1202. fmt = s->fmt;
  1203. if (rec) {
  1204. stop_adc(s);
  1205. fmt >>= CM_CFMT_ADCSHIFT;
  1206. } else {
  1207. stop_dac(s);
  1208. fmt >>= CM_CFMT_DACSHIFT;
  1209. }
  1210. fmt &= CM_CFMT_MASK;
  1211. db->hwptr = db->swptr = db->total_bytes = db->count = db->error = db->endcleared = 0;
  1212. if (!db->rawbuf) {
  1213. db->ready = db->mapped = 0;
  1214. for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--)
  1215. if ((db->rawbuf = pci_alloc_consistent(s->dev, PAGE_SIZE << order, &db->dmaaddr)))
  1216. break;
  1217. if (!db->rawbuf || !db->dmaaddr)
  1218. return -ENOMEM;
  1219. db->buforder = order;
  1220. /* now mark the pages as reserved; otherwise remap_pfn_range doesn't do what we want */
  1221. pend = virt_to_page(db->rawbuf + (PAGE_SIZE << db->buforder) - 1);
  1222. for (pstart = virt_to_page(db->rawbuf); pstart <= pend; pstart++)
  1223. SetPageReserved(pstart);
  1224. }
  1225. bytepersec = rate << sample_shift[fmt];
  1226. bufs = PAGE_SIZE << db->buforder;
  1227. if (db->ossfragshift) {
  1228. if ((1000 << db->ossfragshift) < bytepersec)
  1229. db->fragshift = ld2(bytepersec/1000);
  1230. else
  1231. db->fragshift = db->ossfragshift;
  1232. } else {
  1233. db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1));
  1234. if (db->fragshift < 3)
  1235. db->fragshift = 3;
  1236. }
  1237. db->numfrag = bufs >> db->fragshift;
  1238. while (db->numfrag < 4 && db->fragshift > 3) {
  1239. db->fragshift--;
  1240. db->numfrag = bufs >> db->fragshift;
  1241. }
  1242. db->fragsize = 1 << db->fragshift;
  1243. if (db->ossmaxfrags >= 4 && db->ossmaxfrags < db->numfrag)
  1244. db->numfrag = db->ossmaxfrags;
  1245. /* to make fragsize >= 4096 */
  1246. db->fragsamples = db->fragsize >> sample_shift[fmt];
  1247. db->dmasize = db->numfrag << db->fragshift;
  1248. db->dmasamples = db->dmasize >> sample_shift[fmt];
  1249. memset(db->rawbuf, (fmt & CM_CFMT_16BIT) ? 0 : 0x80, db->dmasize);
  1250. spin_lock_irqsave(&s->lock, flags);
  1251. if (rec) {
  1252. if (s->status & DO_DUAL_DAC)
  1253. set_dmadac1(s, db->dmaaddr, db->dmasize >> sample_shift[fmt]);
  1254. else
  1255. set_dmaadc(s, db->dmaaddr, db->dmasize >> sample_shift[fmt]);
  1256. /* program sample counts */
  1257. set_countdac(s, db->fragsamples);
  1258. } else {
  1259. set_dmadac(s, db->dmaaddr, db->dmasize >> sample_shift[fmt]);
  1260. /* program sample counts */
  1261. set_countdac(s, db->fragsamples);
  1262. }
  1263. spin_unlock_irqrestore(&s->lock, flags);
  1264. db->enabled = 1;
  1265. db->ready = 1;
  1266. return 0;
  1267. }
  1268. static inline void clear_advance(struct cm_state *s)
  1269. {
  1270. unsigned char c = (s->fmt & (CM_CFMT_16BIT << CM_CFMT_DACSHIFT)) ? 0 : 0x80;
  1271. unsigned char *buf = s->dma_dac.rawbuf;
  1272. unsigned char *buf1 = s->dma_adc.rawbuf;
  1273. unsigned bsize = s->dma_dac.dmasize;
  1274. unsigned bptr = s->dma_dac.swptr;
  1275. unsigned len = s->dma_dac.fragsize;
  1276. if (bptr + len > bsize) {
  1277. unsigned x = bsize - bptr;
  1278. memset(buf + bptr, c, x);
  1279. if (s->status & DO_DUAL_DAC)
  1280. memset(buf1 + bptr, c, x);
  1281. bptr = 0;
  1282. len -= x;
  1283. }
  1284. memset(buf + bptr, c, len);
  1285. if (s->status & DO_DUAL_DAC)
  1286. memset(buf1 + bptr, c, len);
  1287. }
  1288. /* call with spinlock held! */
  1289. static void cm_update_ptr(struct cm_state *s)
  1290. {
  1291. unsigned hwptr;
  1292. int diff;
  1293. /* update ADC pointer */
  1294. if (s->dma_adc.ready) {
  1295. if (s->status & DO_DUAL_DAC) {
  1296. /* the dac part will finish for this */
  1297. } else {
  1298. hwptr = get_dmaadc(s) % s->dma_adc.dmasize;
  1299. diff = (s->dma_adc.dmasize + hwptr - s->dma_adc.hwptr) % s->dma_adc.dmasize;
  1300. s->dma_adc.hwptr = hwptr;
  1301. s->dma_adc.total_bytes += diff;
  1302. s->dma_adc.count += diff;
  1303. if (s->dma_adc.count >= (signed)s->dma_adc.fragsize)
  1304. wake_up(&s->dma_adc.wait);
  1305. if (!s->dma_adc.mapped) {
  1306. if (s->dma_adc.count > (signed)(s->dma_adc.dmasize - ((3 * s->dma_adc.fragsize) >> 1))) {
  1307. pause_adc(s);
  1308. s->dma_adc.error++;
  1309. }
  1310. }
  1311. }
  1312. }
  1313. /* update DAC pointer */
  1314. if (s->dma_dac.ready) {
  1315. hwptr = get_dmadac(s) % s->dma_dac.dmasize;
  1316. diff = (s->dma_dac.dmasize + hwptr - s->dma_dac.hwptr) % s->dma_dac.dmasize;
  1317. s->dma_dac.hwptr = hwptr;
  1318. s->dma_dac.total_bytes += diff;
  1319. if (s->status & DO_DUAL_DAC) {
  1320. s->dma_adc.hwptr = hwptr;
  1321. s->dma_adc.total_bytes += diff;
  1322. }
  1323. if (s->dma_dac.mapped) {
  1324. s->dma_dac.count += diff;
  1325. if (s->status & DO_DUAL_DAC)
  1326. s->dma_adc.count += diff;
  1327. if (s->dma_dac.count >= (signed)s->dma_dac.fragsize)
  1328. wake_up(&s->dma_dac.wait);
  1329. } else {
  1330. s->dma_dac.count -= diff;
  1331. if (s->status & DO_DUAL_DAC)
  1332. s->dma_adc.count -= diff;
  1333. if (s->dma_dac.count <= 0) {
  1334. pause_dac(s);
  1335. s->dma_dac.error++;
  1336. } else if (s->dma_dac.count <= (signed)s->dma_dac.fragsize && !s->dma_dac.endcleared) {
  1337. clear_advance(s);
  1338. s->dma_dac.endcleared = 1;
  1339. if (s->status & DO_DUAL_DAC)
  1340. s->dma_adc.endcleared = 1;
  1341. }
  1342. if (s->dma_dac.count + (signed)s->dma_dac.fragsize <= (signed)s->dma_dac.dmasize)
  1343. wake_up(&s->dma_dac.wait);
  1344. }
  1345. }
  1346. }
  1347. static irqreturn_t cm_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1348. {
  1349. struct cm_state *s = (struct cm_state *)dev_id;
  1350. unsigned int intsrc, intstat;
  1351. unsigned char mask = 0;
  1352. /* fastpath out, to ease interrupt sharing */
  1353. intsrc = inl(s->iobase + CODEC_CMI_INT_STATUS);
  1354. if (!(intsrc & 0x80000000))
  1355. return IRQ_NONE;
  1356. spin_lock(&s->lock);
  1357. intstat = inb(s->iobase + CODEC_CMI_INT_HLDCLR + 2);
  1358. /* acknowledge interrupt */
  1359. if (intsrc & ADCINT)
  1360. mask |= ENADCINT;
  1361. if (intsrc & DACINT)
  1362. mask |= ENDACINT;
  1363. outb(intstat & ~mask, s->iobase + CODEC_CMI_INT_HLDCLR + 2);
  1364. outb(intstat | mask, s->iobase + CODEC_CMI_INT_HLDCLR + 2);
  1365. cm_update_ptr(s);
  1366. spin_unlock(&s->lock);
  1367. #ifdef CONFIG_SOUND_CMPCI_MIDI
  1368. if (intsrc & 0x00010000) { // UART interrupt
  1369. if (s->midi_devc && intchk_mpu401((void *)s->midi_devc))
  1370. mpuintr(irq, (void *)s->midi_devc, regs);
  1371. else
  1372. inb(s->iomidi);// dummy read
  1373. }
  1374. #endif
  1375. return IRQ_HANDLED;
  1376. }
  1377. /* --------------------------------------------------------------------- */
  1378. static const char invalid_magic[] = KERN_CRIT "cmpci: invalid magic value\n";
  1379. #define VALIDATE_STATE(s) \
  1380. ({ \
  1381. if (!(s) || (s)->magic != CM_MAGIC) { \
  1382. printk(invalid_magic); \
  1383. return -ENXIO; \
  1384. } \
  1385. })
  1386. /* --------------------------------------------------------------------- */
  1387. #define MT_4 1
  1388. #define MT_5MUTE 2
  1389. #define MT_4MUTEMONO 3
  1390. #define MT_6MUTE 4
  1391. #define MT_5MUTEMONO 5
  1392. static const struct {
  1393. unsigned left;
  1394. unsigned right;
  1395. unsigned type;
  1396. unsigned rec;
  1397. unsigned play;
  1398. } mixtable[SOUND_MIXER_NRDEVICES] = {
  1399. [SOUND_MIXER_CD] = { DSP_MIX_CDVOLIDX_L, DSP_MIX_CDVOLIDX_R, MT_5MUTE, 0x04, 0x06 },
  1400. [SOUND_MIXER_LINE] = { DSP_MIX_LINEVOLIDX_L, DSP_MIX_LINEVOLIDX_R, MT_5MUTE, 0x10, 0x18 },
  1401. [SOUND_MIXER_MIC] = { DSP_MIX_MICVOLIDX, DSP_MIX_MICVOLIDX, MT_5MUTEMONO, 0x01, 0x01 },
  1402. [SOUND_MIXER_SYNTH] = { DSP_MIX_FMVOLIDX_L, DSP_MIX_FMVOLIDX_R, MT_5MUTE, 0x40, 0x00 },
  1403. [SOUND_MIXER_VOLUME] = { DSP_MIX_MASTERVOLIDX_L, DSP_MIX_MASTERVOLIDX_R, MT_5MUTE, 0x00, 0x00 },
  1404. [SOUND_MIXER_PCM] = { DSP_MIX_VOICEVOLIDX_L, DSP_MIX_VOICEVOLIDX_R, MT_5MUTE, 0x00, 0x00 },
  1405. [SOUND_MIXER_LINE1] = { DSP_MIX_AUXVOL_L, DSP_MIX_AUXVOL_R, MT_5MUTE, 0x80, 0x60 },
  1406. [SOUND_MIXER_SPEAKER]= { DSP_MIX_SPKRVOLIDX, DSP_MIX_SPKRVOLIDX, MT_5MUTEMONO, 0x00, 0x01 }
  1407. };
  1408. static const unsigned char volidx[SOUND_MIXER_NRDEVICES] =
  1409. {
  1410. [SOUND_MIXER_CD] = 1,
  1411. [SOUND_MIXER_LINE] = 2,
  1412. [SOUND_MIXER_MIC] = 3,
  1413. [SOUND_MIXER_SYNTH] = 4,
  1414. [SOUND_MIXER_VOLUME] = 5,
  1415. [SOUND_MIXER_PCM] = 6,
  1416. [SOUND_MIXER_LINE1] = 7,
  1417. [SOUND_MIXER_SPEAKER]= 8
  1418. };
  1419. static unsigned mixer_outmask(struct cm_state *s)
  1420. {
  1421. unsigned long flags;
  1422. int i, j, k;
  1423. spin_lock_irqsave(&s->lock, flags);
  1424. j = rdmixer(s, DSP_MIX_OUTMIXIDX);
  1425. spin_unlock_irqrestore(&s->lock, flags);
  1426. for (k = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  1427. if (j & mixtable[i].play)
  1428. k |= 1 << i;
  1429. return k;
  1430. }
  1431. static unsigned mixer_recmask(struct cm_state *s)
  1432. {
  1433. unsigned long flags;
  1434. int i, j, k;
  1435. spin_lock_irqsave(&s->lock, flags);
  1436. j = rdmixer(s, DSP_MIX_ADCMIXIDX_L);
  1437. spin_unlock_irqrestore(&s->lock, flags);
  1438. for (k = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  1439. if (j & mixtable[i].rec)
  1440. k |= 1 << i;
  1441. return k;
  1442. }
  1443. static int mixer_ioctl(struct cm_state *s, unsigned int cmd, unsigned long arg)
  1444. {
  1445. unsigned long flags;
  1446. int i, val, j;
  1447. unsigned char l, r, rl, rr;
  1448. void __user *argp = (void __user *)arg;
  1449. int __user *p = argp;
  1450. VALIDATE_STATE(s);
  1451. if (cmd == SOUND_MIXER_INFO) {
  1452. mixer_info info;
  1453. memset(&info, 0, sizeof(info));
  1454. strlcpy(info.id, "cmpci", sizeof(info.id));
  1455. strlcpy(info.name, "C-Media PCI", sizeof(info.name));
  1456. info.modify_counter = s->mix.modcnt;
  1457. if (copy_to_user(argp, &info, sizeof(info)))
  1458. return -EFAULT;
  1459. return 0;
  1460. }
  1461. if (cmd == SOUND_OLD_MIXER_INFO) {
  1462. _old_mixer_info info;
  1463. memset(&info, 0, sizeof(info));
  1464. strlcpy(info.id, "cmpci", sizeof(info.id));
  1465. strlcpy(info.name, "C-Media cmpci", sizeof(info.name));
  1466. if (copy_to_user(argp, &info, sizeof(info)))
  1467. return -EFAULT;
  1468. return 0;
  1469. }
  1470. if (cmd == OSS_GETVERSION)
  1471. return put_user(SOUND_VERSION, p);
  1472. if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
  1473. return -EINVAL;
  1474. if (_SIOC_DIR(cmd) == _SIOC_READ) {
  1475. switch (_IOC_NR(cmd)) {
  1476. case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */
  1477. val = mixer_recmask(s);
  1478. return put_user(val, p);
  1479. case SOUND_MIXER_OUTSRC: /* Arg contains a bit for each recording source */
  1480. val = mixer_outmask(s);
  1481. return put_user(val, p);
  1482. case SOUND_MIXER_DEVMASK: /* Arg contains a bit for each supported device */
  1483. for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  1484. if (mixtable[i].type)
  1485. val |= 1 << i;
  1486. return put_user(val, p);
  1487. case SOUND_MIXER_RECMASK: /* Arg contains a bit for each supported recording source */
  1488. for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  1489. if (mixtable[i].rec)
  1490. val |= 1 << i;
  1491. return put_user(val, p);
  1492. case SOUND_MIXER_OUTMASK: /* Arg contains a bit for each supported recording source */
  1493. for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  1494. if (mixtable[i].play)
  1495. val |= 1 << i;
  1496. return put_user(val, p);
  1497. case SOUND_MIXER_STEREODEVS: /* Mixer channels supporting stereo */
  1498. for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  1499. if (mixtable[i].type && mixtable[i].type != MT_4MUTEMONO)
  1500. val |= 1 << i;
  1501. return put_user(val, p);
  1502. case SOUND_MIXER_CAPS:
  1503. return put_user(0, p);
  1504. default:
  1505. i = _IOC_NR(cmd);
  1506. if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].type)
  1507. return -EINVAL;
  1508. if (!volidx[i])
  1509. return -EINVAL;
  1510. return put_user(s->mix.vol[volidx[i]-1], p);
  1511. }
  1512. }
  1513. if (_SIOC_DIR(cmd) != (_SIOC_READ|_SIOC_WRITE))
  1514. return -EINVAL;
  1515. s->mix.modcnt++;
  1516. switch (_IOC_NR(cmd)) {
  1517. case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */
  1518. if (get_user(val, p))
  1519. return -EFAULT;
  1520. i = hweight32(val);
  1521. for (j = i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
  1522. if (!(val & (1 << i)))
  1523. continue;
  1524. if (!mixtable[i].rec) {
  1525. val &= ~(1 << i);
  1526. continue;
  1527. }
  1528. j |= mixtable[i].rec;
  1529. }
  1530. spin_lock_irqsave(&s->lock, flags);
  1531. wrmixer(s, DSP_MIX_ADCMIXIDX_L, j);
  1532. wrmixer(s, DSP_MIX_ADCMIXIDX_R, (j & 1) | (j>>1) | (j & 0x80));
  1533. spin_unlock_irqrestore(&s->lock, flags);
  1534. return 0;
  1535. case SOUND_MIXER_OUTSRC: /* Arg contains a bit for each recording source */
  1536. if (get_user(val, p))
  1537. return -EFAULT;
  1538. for (j = i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
  1539. if (!(val & (1 << i)))
  1540. continue;
  1541. if (!mixtable[i].play) {
  1542. val &= ~(1 << i);
  1543. continue;
  1544. }
  1545. j |= mixtable[i].play;
  1546. }
  1547. spin_lock_irqsave(&s->lock, flags);
  1548. wrmixer(s, DSP_MIX_OUTMIXIDX, j);
  1549. spin_unlock_irqrestore(&s->lock, flags);
  1550. return 0;
  1551. default:
  1552. i = _IOC_NR(cmd);
  1553. if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].type)
  1554. return -EINVAL;
  1555. if (get_user(val, p))
  1556. return -EFAULT;
  1557. l = val & 0xff;
  1558. r = (val >> 8) & 0xff;
  1559. if (l > 100)
  1560. l = 100;
  1561. if (r > 100)
  1562. r = 100;
  1563. spin_lock_irqsave(&s->lock, flags);
  1564. switch (mixtable[i].type) {
  1565. case MT_4:
  1566. if (l >= 10)
  1567. l -= 10;
  1568. if (r >= 10)
  1569. r -= 10;
  1570. frobindir(s, mixtable[i].left, 0xf0, l / 6);
  1571. frobindir(s, mixtable[i].right, 0xf0, l / 6);
  1572. break;
  1573. case MT_4MUTEMONO:
  1574. rl = (l < 4 ? 0 : (l - 5) / 3) & 31;
  1575. rr = (rl >> 2) & 7;
  1576. wrmixer(s, mixtable[i].left, rl<<3);
  1577. if (i == SOUND_MIXER_MIC)
  1578. maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr<<1);
  1579. break;
  1580. case MT_5MUTEMONO:
  1581. rl = l < 4 ? 0 : (l - 5) / 3;
  1582. wrmixer(s, mixtable[i].left, rl<<3);
  1583. l = rdmixer(s, DSP_MIX_OUTMIXIDX) & ~mixtable[i].play;
  1584. r = rl ? mixtable[i].play : 0;
  1585. wrmixer(s, DSP_MIX_OUTMIXIDX, l | r);
  1586. /* for recording */
  1587. if (i == SOUND_MIXER_MIC) {
  1588. if (s->chip_version >= 37) {
  1589. rr = rl >> 1;
  1590. maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, (rr&0x07)<<1);
  1591. frobindir(s, DSP_MIX_EXTENSION, ~0x01, rr>>3);
  1592. } else {
  1593. rr = rl >> 2;
  1594. maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr<<1);
  1595. }
  1596. }
  1597. break;
  1598. case MT_5MUTE:
  1599. rl = l < 4 ? 0 : (l - 5) / 3;
  1600. rr = r < 4 ? 0 : (r - 5) / 3;
  1601. wrmixer(s, mixtable[i].left, rl<<3);
  1602. wrmixer(s, mixtable[i].right, rr<<3);
  1603. l = rdmixer(s, DSP_MIX_OUTMIXIDX);
  1604. l &= ~mixtable[i].play;
  1605. r = (rl|rr) ? mixtable[i].play : 0;
  1606. wrmixer(s, DSP_MIX_OUTMIXIDX, l | r);
  1607. break;
  1608. case MT_6MUTE:
  1609. if (l < 6)
  1610. rl = 0x00;
  1611. else
  1612. rl = l * 2 / 3;
  1613. if (r < 6)
  1614. rr = 0x00;
  1615. else
  1616. rr = r * 2 / 3;
  1617. wrmixer(s, mixtable[i].left, rl);
  1618. wrmixer(s, mixtable[i].right, rr);
  1619. break;
  1620. }
  1621. spin_unlock_irqrestore(&s->lock, flags);
  1622. if (!volidx[i])
  1623. return -EINVAL;
  1624. s->mix.vol[volidx[i]-1] = val;
  1625. return put_user(s->mix.vol[volidx[i]-1], p);
  1626. }
  1627. }
  1628. /* --------------------------------------------------------------------- */
  1629. static int cm_open_mixdev(struct inode *inode, struct file *file)
  1630. {
  1631. int minor = iminor(inode);
  1632. struct list_head *list;
  1633. struct cm_state *s;
  1634. for (list = devs.next; ; list = list->next) {
  1635. if (list == &devs)
  1636. return -ENODEV;
  1637. s = list_entry(list, struct cm_state, devs);
  1638. if (s->dev_mixer == minor)
  1639. break;
  1640. }
  1641. VALIDATE_STATE(s);
  1642. file->private_data = s;
  1643. return nonseekable_open(inode, file);
  1644. }
  1645. static int cm_release_mixdev(struct inode *inode, struct file *file)
  1646. {
  1647. struct cm_state *s = (struct cm_state *)file->private_data;
  1648. VALIDATE_STATE(s);
  1649. return 0;
  1650. }
  1651. static int cm_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  1652. {
  1653. return mixer_ioctl((struct cm_state *)file->private_data, cmd, arg);
  1654. }
  1655. static /*const*/ struct file_operations cm_mixer_fops = {
  1656. .owner = THIS_MODULE,
  1657. .llseek = no_llseek,
  1658. .ioctl = cm_ioctl_mixdev,
  1659. .open = cm_open_mixdev,
  1660. .release = cm_release_mixdev,
  1661. };
  1662. /* --------------------------------------------------------------------- */
  1663. static int drain_dac(struct cm_state *s, int nonblock)
  1664. {
  1665. DECLARE_WAITQUEUE(wait, current);
  1666. unsigned long flags;
  1667. int count, tmo;
  1668. if (s->dma_dac.mapped || !s->dma_dac.ready)
  1669. return 0;
  1670. add_wait_queue(&s->dma_dac.wait, &wait);
  1671. for (;;) {
  1672. __set_current_state(TASK_INTERRUPTIBLE);
  1673. spin_lock_irqsave(&s->lock, flags);
  1674. count = s->dma_dac.count;
  1675. spin_unlock_irqrestore(&s->lock, flags);
  1676. if (count <= 0)
  1677. break;
  1678. if (signal_pending(current))
  1679. break;
  1680. if (nonblock) {
  1681. remove_wait_queue(&s->dma_dac.wait, &wait);
  1682. set_current_state(TASK_RUNNING);
  1683. return -EBUSY;
  1684. }
  1685. tmo = 3 * HZ * (count + s->dma_dac.fragsize) / 2 / s->ratedac;
  1686. tmo >>= sample_shift[(s->fmt >> CM_CFMT_DACSHIFT) & CM_CFMT_MASK];
  1687. if (!schedule_timeout(tmo + 1))
  1688. DBG(printk(KERN_DEBUG "cmpci: dma timed out??\n");)
  1689. }
  1690. remove_wait_queue(&s->dma_dac.wait, &wait);
  1691. set_current_state(TASK_RUNNING);
  1692. if (signal_pending(current))
  1693. return -ERESTARTSYS;
  1694. return 0;
  1695. }
  1696. /* --------------------------------------------------------------------- */
  1697. static ssize_t cm_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
  1698. {
  1699. struct cm_state *s = (struct cm_state *)file->private_data;
  1700. DECLARE_WAITQUEUE(wait, current);
  1701. ssize_t ret;
  1702. unsigned long flags;
  1703. unsigned swptr;
  1704. int cnt;
  1705. VALIDATE_STATE(s);
  1706. if (s->dma_adc.mapped)
  1707. return -ENXIO;
  1708. if (!s->dma_adc.ready && (ret = prog_dmabuf(s, 1)))
  1709. return ret;
  1710. if (!access_ok(VERIFY_WRITE, buffer, count))
  1711. return -EFAULT;
  1712. ret = 0;
  1713. add_wait_queue(&s->dma_adc.wait, &wait);
  1714. while (count > 0) {
  1715. spin_lock_irqsave(&s->lock, flags);
  1716. swptr = s->dma_adc.swptr;
  1717. cnt = s->dma_adc.dmasize-swptr;
  1718. if (s->dma_adc.count < cnt)
  1719. cnt = s->dma_adc.count;
  1720. if (cnt <= 0)
  1721. __set_current_state(TASK_INTERRUPTIBLE);
  1722. spin_unlock_irqrestore(&s->lock, flags);
  1723. if (cnt > count)
  1724. cnt = count;
  1725. if (cnt <= 0) {
  1726. if (s->dma_adc.enabled)
  1727. start_adc(s);
  1728. if (file->f_flags & O_NONBLOCK) {
  1729. if (!ret)
  1730. ret = -EAGAIN;
  1731. goto out;
  1732. }
  1733. if (!schedule_timeout(HZ)) {
  1734. printk(KERN_DEBUG "cmpci: read: chip lockup? dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
  1735. s->dma_adc.dmasize, s->dma_adc.fragsize, s->dma_adc.count,
  1736. s->dma_adc.hwptr, s->dma_adc.swptr);
  1737. spin_lock_irqsave(&s->lock, flags);
  1738. stop_adc_unlocked(s);
  1739. set_dmaadc(s, s->dma_adc.dmaaddr, s->dma_adc.dmasamples);
  1740. /* program sample counts */
  1741. set_countadc(s, s->dma_adc.fragsamples);
  1742. s->dma_adc.count = s->dma_adc.hwptr = s->dma_adc.swptr = 0;
  1743. spin_unlock_irqrestore(&s->lock, flags);
  1744. }
  1745. if (signal_pending(current)) {
  1746. if (!ret)
  1747. ret = -ERESTARTSYS;
  1748. goto out;
  1749. }
  1750. continue;
  1751. }
  1752. if (s->status & DO_BIGENDIAN_R) {
  1753. int i, err;
  1754. unsigned char *src;
  1755. char __user *dst = buffer;
  1756. unsigned char data[2];
  1757. src = (unsigned char *) (s->dma_adc.rawbuf + swptr);
  1758. // copy left/right sample at one time
  1759. for (i = 0; i < cnt / 2; i++) {
  1760. data[0] = src[1];
  1761. data[1] = src[0];
  1762. if ((err = __put_user(data[0], dst++))) {
  1763. ret = err;
  1764. goto out;
  1765. }
  1766. if ((err = __put_user(data[1], dst++))) {
  1767. ret = err;
  1768. goto out;
  1769. }
  1770. src += 2;
  1771. }
  1772. } else if (copy_to_user(buffer, s->dma_adc.rawbuf + swptr, cnt)) {
  1773. if (!ret)
  1774. ret = -EFAULT;
  1775. goto out;
  1776. }
  1777. swptr = (swptr + cnt) % s->dma_adc.dmasize;
  1778. spin_lock_irqsave(&s->lock, flags);
  1779. s->dma_adc.swptr = swptr;
  1780. s->dma_adc.count -= cnt;
  1781. count -= cnt;
  1782. buffer += cnt;
  1783. ret += cnt;
  1784. if (s->dma_adc.enabled)
  1785. start_adc_unlocked(s);
  1786. spin_unlock_irqrestore(&s->lock, flags);
  1787. }
  1788. out:
  1789. remove_wait_queue(&s->dma_adc.wait, &wait);
  1790. set_current_state(TASK_RUNNING);
  1791. return ret;
  1792. }
  1793. static ssize_t cm_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
  1794. {
  1795. struct cm_state *s = (struct cm_state *)file->private_data;
  1796. DECLARE_WAITQUEUE(wait, current);
  1797. ssize_t ret;
  1798. unsigned long flags;
  1799. unsigned swptr;
  1800. int cnt;
  1801. VALIDATE_STATE(s);
  1802. if (s->dma_dac.mapped)
  1803. return -ENXIO;
  1804. if (!s->dma_dac.ready && (ret = prog_dmabuf(s, 0)))
  1805. return ret;
  1806. if (!access_ok(VERIFY_READ, buffer, count))
  1807. return -EFAULT;
  1808. if (s->status & DO_DUAL_DAC) {
  1809. if (s->dma_adc.mapped)
  1810. return -ENXIO;
  1811. if (!s->dma_adc.ready && (ret = prog_dmabuf(s, 1)))
  1812. return ret;
  1813. }
  1814. if (!access_ok(VERIFY_READ, buffer, count))
  1815. return -EFAULT;
  1816. ret = 0;
  1817. add_wait_queue(&s->dma_dac.wait, &wait);
  1818. while (count > 0) {
  1819. spin_lock_irqsave(&s->lock, flags);
  1820. if (s->dma_dac.count < 0) {
  1821. s->dma_dac.count = 0;
  1822. s->dma_dac.swptr = s->dma_dac.hwptr;
  1823. }
  1824. if (s->status & DO_DUAL_DAC) {
  1825. s->dma_adc.swptr = s->dma_dac.swptr;
  1826. s->dma_adc.count = s->dma_dac.count;
  1827. s->dma_adc.endcleared = s->dma_dac.endcleared;
  1828. }
  1829. swptr = s->dma_dac.swptr;
  1830. cnt = s->dma_dac.dmasize-swptr;
  1831. if (s->status & DO_AC3_SW) {
  1832. if (s->dma_dac.count + 2 * cnt > s->dma_dac.dmasize)
  1833. cnt = (s->dma_dac.dmasize - s->dma_dac.count) / 2;
  1834. } else {
  1835. if (s->dma_dac.count + cnt > s->dma_dac.dmasize)
  1836. cnt = s->dma_dac.dmasize - s->dma_dac.count;
  1837. }
  1838. if (cnt <= 0)
  1839. __set_current_state(TASK_INTERRUPTIBLE);
  1840. spin_unlock_irqrestore(&s->lock, flags);
  1841. if (cnt > count)
  1842. cnt = count;
  1843. if ((s->status & DO_DUAL_DAC) && (cnt > count / 2))
  1844. cnt = count / 2;
  1845. if (cnt <= 0) {
  1846. if (s->dma_dac.enabled)
  1847. start_dac(s);
  1848. if (file->f_flags & O_NONBLOCK) {
  1849. if (!ret)
  1850. ret = -EAGAIN;
  1851. goto out;
  1852. }
  1853. if (!schedule_timeout(HZ)) {
  1854. printk(KERN_DEBUG "cmpci: write: chip lockup? dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
  1855. s->dma_dac.dmasize, s->dma_dac.fragsize, s->dma_dac.count,
  1856. s->dma_dac.hwptr, s->dma_dac.swptr);
  1857. spin_lock_irqsave(&s->lock, flags);
  1858. stop_dac_unlocked(s);
  1859. set_dmadac(s, s->dma_dac.dmaaddr, s->dma_dac.dmasamples);
  1860. /* program sample counts */
  1861. set_countdac(s, s->dma_dac.fragsamples);
  1862. s->dma_dac.count = s->dma_dac.hwptr = s->dma_dac.swptr = 0;
  1863. if (s->status & DO_DUAL_DAC) {
  1864. set_dmadac1(s, s->dma_adc.dmaaddr, s->dma_adc.dmasamples);
  1865. s->dma_adc.count = s->dma_adc.hwptr = s->dma_adc.swptr = 0;
  1866. }
  1867. spin_unlock_irqrestore(&s->lock, flags);
  1868. }
  1869. if (signal_pending(current)) {
  1870. if (!ret)
  1871. ret = -ERESTARTSYS;
  1872. goto out;
  1873. }
  1874. continue;
  1875. }
  1876. if (s->status & DO_AC3_SW) {
  1877. int err;
  1878. // clip exceeded data, caught by 033 and 037
  1879. if (swptr + 2 * cnt > s->dma_dac.dmasize)
  1880. cnt = (s->dma_dac.dmasize - swptr) / 2;
  1881. if ((err = trans_ac3(s, s->dma_dac.rawbuf + swptr, buffer, cnt))) {
  1882. ret = err;
  1883. goto out;
  1884. }
  1885. swptr = (swptr + 2 * cnt) % s->dma_dac.dmasize;
  1886. } else if ((s->status & DO_DUAL_DAC) && (s->status & DO_BIGENDIAN_W)) {
  1887. int i, err;
  1888. const char __user *src = buffer;
  1889. unsigned char *dst0, *dst1;
  1890. unsigned char data[8];
  1891. dst0 = (unsigned char *) (s->dma_dac.rawbuf + swptr);
  1892. dst1 = (unsigned char *) (s->dma_adc.rawbuf + swptr);
  1893. // copy left/right sample at one time
  1894. for (i = 0; i < cnt / 4; i++) {
  1895. if ((err = __get_user(data[0], src++))) {
  1896. ret = err;
  1897. goto out;
  1898. }
  1899. if ((err = __get_user(data[1], src++))) {
  1900. ret = err;
  1901. goto out;
  1902. }
  1903. if ((err = __get_user(data[2], src++))) {
  1904. ret = err;
  1905. goto out;
  1906. }
  1907. if ((err = __get_user(data[3], src++))) {
  1908. ret = err;
  1909. goto out;
  1910. }
  1911. if ((err = __get_user(data[4], src++))) {
  1912. ret = err;
  1913. goto out;
  1914. }
  1915. if ((err = __get_user(data[5], src++))) {
  1916. ret = err;
  1917. goto out;
  1918. }
  1919. if ((err = __get_user(data[6], src++))) {
  1920. ret = err;
  1921. goto out;
  1922. }
  1923. if ((err = __get_user(data[7], src++))) {
  1924. ret = err;
  1925. goto out;
  1926. }
  1927. dst0[0] = data[1];
  1928. dst0[1] = data[0];
  1929. dst0[2] = data[3];
  1930. dst0[3] = data[2];
  1931. dst1[0] = data[5];
  1932. dst1[1] = data[4];
  1933. dst1[2] = data[7];
  1934. dst1[3] = data[6];
  1935. dst0 += 4;
  1936. dst1 += 4;
  1937. }
  1938. swptr = (swptr + cnt) % s->dma_dac.dmasize;
  1939. } else if (s->status & DO_DUAL_DAC) {
  1940. int i, err;
  1941. unsigned long __user *src = (unsigned long __user *) buffer;
  1942. unsigned long *dst0, *dst1;
  1943. dst0 = (unsigned long *) (s->dma_dac.rawbuf + swptr);
  1944. dst1 = (unsigned long *) (s->dma_adc.rawbuf + swptr);
  1945. // copy left/right sample at one time
  1946. for (i = 0; i < cnt / 4; i++) {
  1947. if ((err = __get_user(*dst0++, src++))) {
  1948. ret = err;
  1949. goto out;
  1950. }
  1951. if ((err = __get_user(*dst1++, src++))) {
  1952. ret = err;
  1953. goto out;
  1954. }
  1955. }
  1956. swptr = (swptr + cnt) % s->dma_dac.dmasize;
  1957. } else if (s->status & DO_BIGENDIAN_W) {
  1958. int i, err;
  1959. const char __user *src = buffer;
  1960. unsigned char *dst;
  1961. unsigned char data[2];
  1962. dst = (unsigned char *) (s->dma_dac.rawbuf + swptr);
  1963. // swap hi/lo bytes for each sample
  1964. for (i = 0; i < cnt / 2; i++) {
  1965. if ((err = __get_user(data[0], src++))) {
  1966. ret = err;
  1967. goto out;
  1968. }
  1969. if ((err = __get_user(data[1], src++))) {
  1970. ret = err;
  1971. goto out;
  1972. }
  1973. dst[0] = data[1];
  1974. dst[1] = data[0];
  1975. dst += 2;
  1976. }
  1977. swptr = (swptr + cnt) % s->dma_dac.dmasize;
  1978. } else {
  1979. if (copy_from_user(s->dma_dac.rawbuf + swptr, buffer, cnt)) {
  1980. if (!ret)
  1981. ret = -EFAULT;
  1982. goto out;
  1983. }
  1984. swptr = (swptr + cnt) % s->dma_dac.dmasize;
  1985. }
  1986. spin_lock_irqsave(&s->lock, flags);
  1987. s->dma_dac.swptr = swptr;
  1988. s->dma_dac.count += cnt;
  1989. if (s->status & DO_AC3_SW)
  1990. s->dma_dac.count += cnt;
  1991. s->dma_dac.endcleared = 0;
  1992. spin_unlock_irqrestore(&s->lock, flags);
  1993. count -= cnt;
  1994. buffer += cnt;
  1995. ret += cnt;
  1996. if (s->status & DO_DUAL_DAC) {
  1997. count -= cnt;
  1998. buffer += cnt;
  1999. ret += cnt;
  2000. }
  2001. if (s->dma_dac.enabled)
  2002. start_dac(s);
  2003. }
  2004. out:
  2005. remove_wait_queue(&s->dma_dac.wait, &wait);
  2006. set_current_state(TASK_RUNNING);
  2007. return ret;
  2008. }
  2009. static unsigned int cm_poll(struct file *file, struct poll_table_struct *wait)
  2010. {
  2011. struct cm_state *s = (struct cm_state *)file->private_data;
  2012. unsigned long flags;
  2013. unsigned int mask = 0;
  2014. VALIDATE_STATE(s);
  2015. if (file->f_mode & FMODE_WRITE) {
  2016. if (!s->dma_dac.ready && prog_dmabuf(s, 0))
  2017. return 0;
  2018. poll_wait(file, &s->dma_dac.wait, wait);
  2019. }
  2020. if (file->f_mode & FMODE_READ) {
  2021. if (!s->dma_adc.ready && prog_dmabuf(s, 1))
  2022. return 0;
  2023. poll_wait(file, &s->dma_adc.wait, wait);
  2024. }
  2025. spin_lock_irqsave(&s->lock, flags);
  2026. cm_update_ptr(s);
  2027. if (file->f_mode & FMODE_READ) {
  2028. if (s->dma_adc.count >= (signed)s->dma_adc.fragsize)
  2029. mask |= POLLIN | POLLRDNORM;
  2030. }
  2031. if (file->f_mode & FMODE_WRITE) {
  2032. if (s->dma_dac.mapped) {
  2033. if (s->dma_dac.count >= (signed)s->dma_dac.fragsize)
  2034. mask |= POLLOUT | POLLWRNORM;
  2035. } else {
  2036. if ((signed)s->dma_dac.dmasize >= s->dma_dac.count + (signed)s->dma_dac.fragsize)
  2037. mask |= POLLOUT | POLLWRNORM;
  2038. }
  2039. }
  2040. spin_unlock_irqrestore(&s->lock, flags);
  2041. return mask;
  2042. }
  2043. static int cm_mmap(struct file *file, struct vm_area_struct *vma)
  2044. {
  2045. struct cm_state *s = (struct cm_state *)file->private_data;
  2046. struct dmabuf *db;
  2047. int ret = -EINVAL;
  2048. unsigned long size;
  2049. VALIDATE_STATE(s);
  2050. lock_kernel();
  2051. if (vma->vm_flags & VM_WRITE) {
  2052. if ((ret = prog_dmabuf(s, 0)) != 0)
  2053. goto out;
  2054. db = &s->dma_dac;
  2055. } else if (vma->vm_flags & VM_READ) {
  2056. if ((ret = prog_dmabuf(s, 1)) != 0)
  2057. goto out;
  2058. db = &s->dma_adc;
  2059. } else
  2060. goto out;
  2061. ret = -EINVAL;
  2062. if (vma->vm_pgoff != 0)
  2063. goto out;
  2064. size = vma->vm_end - vma->vm_start;
  2065. if (size > (PAGE_SIZE << db->buforder))
  2066. goto out;
  2067. ret = -EINVAL;
  2068. if (remap_pfn_range(vma, vma->vm_start,
  2069. virt_to_phys(db->rawbuf) >> PAGE_SHIFT,
  2070. size, vma->vm_page_prot))
  2071. goto out;
  2072. db->mapped = 1;
  2073. ret = 0;
  2074. out:
  2075. unlock_kernel();
  2076. return ret;
  2077. }
  2078. #define SNDCTL_SPDIF_COPYRIGHT _SIOW('S', 0, int) // set/reset S/PDIF copy protection
  2079. #define SNDCTL_SPDIF_LOOP _SIOW('S', 1, int) // set/reset S/PDIF loop
  2080. #define SNDCTL_SPDIF_MONITOR _SIOW('S', 2, int) // set S/PDIF monitor
  2081. #define SNDCTL_SPDIF_LEVEL _SIOW('S', 3, int) // set/reset S/PDIF out level
  2082. #define SNDCTL_SPDIF_INV _SIOW('S', 4, int) // set/reset S/PDIF in inverse
  2083. #define SNDCTL_SPDIF_SEL2 _SIOW('S', 5, int) // set S/PDIF in #2
  2084. #define SNDCTL_SPDIF_VALID _SIOW('S', 6, int) // set S/PDIF valid
  2085. #define SNDCTL_SPDIFOUT _SIOW('S', 7, int) // set S/PDIF out
  2086. #define SNDCTL_SPDIFIN _SIOW('S', 8, int) // set S/PDIF out
  2087. static int cm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  2088. {
  2089. struct cm_state *s = (struct cm_state *)file->private_data;
  2090. unsigned long flags;
  2091. audio_buf_info abinfo;
  2092. count_info cinfo;
  2093. int val, mapped, ret;
  2094. unsigned char fmtm, fmtd;
  2095. void __user *argp = (void __user *)arg;
  2096. int __user *p = argp;
  2097. VALIDATE_STATE(s);
  2098. mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac.mapped) ||
  2099. ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
  2100. switch (cmd) {
  2101. case OSS_GETVERSION:
  2102. return put_user(SOUND_VERSION, p);
  2103. case SNDCTL_DSP_SYNC:
  2104. if (file->f_mode & FMODE_WRITE)
  2105. return drain_dac(s, 0/*file->f_flags & O_NONBLOCK*/);
  2106. return 0;
  2107. case SNDCTL_DSP_SETDUPLEX:
  2108. return 0;
  2109. case SNDCTL_DSP_GETCAPS:
  2110. return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP | DSP_CAP_BIND, p);
  2111. case SNDCTL_DSP_RESET:
  2112. if (file->f_mode & FMODE_WRITE) {
  2113. stop_dac(s);
  2114. synchronize_irq(s->irq);
  2115. s->dma_dac.swptr = s->dma_dac.hwptr = s->dma_dac.count = s->dma_dac.total_bytes = 0;
  2116. if (s->status & DO_DUAL_DAC)
  2117. s->dma_adc.swptr = s->dma_adc.hwptr = s->dma_adc.count = s->dma_adc.total_bytes = 0;
  2118. }
  2119. if (file->f_mode & FMODE_READ) {
  2120. stop_adc(s);
  2121. synchronize_irq(s->irq);
  2122. s->dma_adc.swptr = s->dma_adc.hwptr = s->dma_adc.count = s->dma_adc.total_bytes = 0;
  2123. }
  2124. return 0;
  2125. case SNDCTL_DSP_SPEED:
  2126. if (get_user(val, p))
  2127. return -EFAULT;
  2128. if (val >= 0) {
  2129. if (file->f_mode & FMODE_READ) {
  2130. spin_lock_irqsave(&s->lock, flags);
  2131. stop_adc_unlocked(s);
  2132. s->dma_adc.ready = 0;
  2133. set_adc_rate_unlocked(s, val);
  2134. spin_unlock_irqrestore(&s->lock, flags);
  2135. }
  2136. if (file->f_mode & FMODE_WRITE) {
  2137. stop_dac(s);
  2138. s->dma_dac.ready = 0;
  2139. if (s->status & DO_DUAL_DAC)
  2140. s->dma_adc.ready = 0;
  2141. set_dac_rate(s, val);
  2142. }
  2143. }
  2144. return put_user((file->f_mode & FMODE_READ) ? s->rateadc : s->ratedac, p);
  2145. case SNDCTL_DSP_STEREO:
  2146. if (get_user(val, p))
  2147. return -EFAULT;
  2148. fmtd = 0;
  2149. fmtm = ~0;
  2150. if (file->f_mode & FMODE_READ) {
  2151. stop_adc(s);
  2152. s->dma_adc.ready = 0;
  2153. if (val)
  2154. fmtd |= CM_CFMT_STEREO << CM_CFMT_ADCSHIFT;
  2155. else
  2156. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_ADCSHIFT);
  2157. }
  2158. if (file->f_mode & FMODE_WRITE) {
  2159. stop_dac(s);
  2160. s->dma_dac.ready = 0;
  2161. if (val)
  2162. fmtd |= CM_CFMT_STEREO << CM_CFMT_DACSHIFT;
  2163. else
  2164. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_DACSHIFT);
  2165. if (s->status & DO_DUAL_DAC) {
  2166. s->dma_adc.ready = 0;
  2167. if (val)
  2168. fmtd |= CM_CFMT_STEREO << CM_CFMT_ADCSHIFT;
  2169. else
  2170. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_ADCSHIFT);
  2171. }
  2172. }
  2173. set_fmt(s, fmtm, fmtd);
  2174. return 0;
  2175. case SNDCTL_DSP_CHANNELS:
  2176. if (get_user(val, p))
  2177. return -EFAULT;
  2178. if (val != 0) {
  2179. fmtd = 0;
  2180. fmtm = ~0;
  2181. if (file->f_mode & FMODE_READ) {
  2182. stop_adc(s);
  2183. s->dma_adc.ready = 0;
  2184. if (val >= 2)
  2185. fmtd |= CM_CFMT_STEREO << CM_CFMT_ADCSHIFT;
  2186. else
  2187. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_ADCSHIFT);
  2188. }
  2189. if (file->f_mode & FMODE_WRITE) {
  2190. stop_dac(s);
  2191. s->dma_dac.ready = 0;
  2192. if (val >= 2)
  2193. fmtd |= CM_CFMT_STEREO << CM_CFMT_DACSHIFT;
  2194. else
  2195. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_DACSHIFT);
  2196. if (s->status & DO_DUAL_DAC) {
  2197. s->dma_adc.ready = 0;
  2198. if (val >= 2)
  2199. fmtd |= CM_CFMT_STEREO << CM_CFMT_ADCSHIFT;
  2200. else
  2201. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_ADCSHIFT);
  2202. }
  2203. }
  2204. set_fmt(s, fmtm, fmtd);
  2205. if ((s->capability & CAN_MULTI_CH)
  2206. && (file->f_mode & FMODE_WRITE)) {
  2207. val = set_dac_channels(s, val);
  2208. return put_user(val, p);
  2209. }
  2210. }
  2211. return put_user((s->fmt & ((file->f_mode & FMODE_READ) ? (CM_CFMT_STEREO << CM_CFMT_ADCSHIFT)
  2212. : (CM_CFMT_STEREO << CM_CFMT_DACSHIFT))) ? 2 : 1, p);
  2213. case SNDCTL_DSP_GETFMTS: /* Returns a mask */
  2214. return put_user(AFMT_S16_BE|AFMT_S16_LE|AFMT_U8|
  2215. ((s->capability & CAN_AC3) ? AFMT_AC3 : 0), p);
  2216. case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
  2217. if (get_user(val, p))
  2218. return -EFAULT;
  2219. if (val != AFMT_QUERY) {
  2220. fmtd = 0;
  2221. fmtm = ~0;
  2222. if (file->f_mode & FMODE_READ) {
  2223. stop_adc(s);
  2224. s->dma_adc.ready = 0;
  2225. if (val == AFMT_S16_BE || val == AFMT_S16_LE)
  2226. fmtd |= CM_CFMT_16BIT << CM_CFMT_ADCSHIFT;
  2227. else
  2228. fmtm &= ~(CM_CFMT_16BIT << CM_CFMT_ADCSHIFT);
  2229. if (val == AFMT_S16_BE)
  2230. s->status |= DO_BIGENDIAN_R;
  2231. else
  2232. s->status &= ~DO_BIGENDIAN_R;
  2233. }
  2234. if (file->f_mode & FMODE_WRITE) {
  2235. stop_dac(s);
  2236. s->dma_dac.ready = 0;
  2237. if (val == AFMT_S16_BE || val == AFMT_S16_LE || val == AFMT_AC3)
  2238. fmtd |= CM_CFMT_16BIT << CM_CFMT_DACSHIFT;
  2239. else
  2240. fmtm &= ~(CM_CFMT_16BIT << CM_CFMT_DACSHIFT);
  2241. if (val == AFMT_AC3) {
  2242. fmtd |= CM_CFMT_STEREO << CM_CFMT_DACSHIFT;
  2243. set_ac3(s, 48000);
  2244. } else
  2245. set_ac3(s, 0);
  2246. if (s->status & DO_DUAL_DAC) {
  2247. s->dma_adc.ready = 0;
  2248. if (val == AFMT_S16_BE || val == AFMT_S16_LE)
  2249. fmtd |= CM_CFMT_STEREO << CM_CFMT_ADCSHIFT;
  2250. else
  2251. fmtm &= ~(CM_CFMT_STEREO << CM_CFMT_ADCSHIFT);
  2252. }
  2253. if (val == AFMT_S16_BE)
  2254. s->status |= DO_BIGENDIAN_W;
  2255. else
  2256. s->status &= ~DO_BIGENDIAN_W;
  2257. }
  2258. set_fmt(s, fmtm, fmtd);
  2259. }
  2260. if (s->status & DO_AC3) return put_user(AFMT_AC3, p);
  2261. return put_user((s->fmt & ((file->f_mode & FMODE_READ) ? (CM_CFMT_16BIT << CM_CFMT_ADCSHIFT)
  2262. : (CM_CFMT_16BIT << CM_CFMT_DACSHIFT))) ? val : AFMT_U8, p);
  2263. case SNDCTL_DSP_POST:
  2264. return 0;
  2265. case SNDCTL_DSP_GETTRIGGER:
  2266. val = 0;
  2267. if (s->status & DO_DUAL_DAC) {
  2268. if (file->f_mode & FMODE_WRITE &&
  2269. (s->enable & ENDAC) &&
  2270. (s->enable & ENADC))
  2271. val |= PCM_ENABLE_OUTPUT;
  2272. return put_user(val, p);
  2273. }
  2274. if (file->f_mode & FMODE_READ && s->enable & ENADC)
  2275. val |= PCM_ENABLE_INPUT;
  2276. if (file->f_mode & FMODE_WRITE && s->enable & ENDAC)
  2277. val |= PCM_ENABLE_OUTPUT;
  2278. return put_user(val, p);
  2279. case SNDCTL_DSP_SETTRIGGER:
  2280. if (get_user(val, p))
  2281. return -EFAULT;
  2282. if (file->f_mode & FMODE_READ) {
  2283. if (val & PCM_ENABLE_INPUT) {
  2284. if (!s->dma_adc.ready && (ret = prog_dmabuf(s, 1)))
  2285. return ret;
  2286. s->dma_adc.enabled = 1;
  2287. start_adc(s);
  2288. } else {
  2289. s->dma_adc.enabled = 0;
  2290. stop_adc(s);
  2291. }
  2292. }
  2293. if (file->f_mode & FMODE_WRITE) {
  2294. if (val & PCM_ENABLE_OUTPUT) {
  2295. if (!s->dma_dac.ready && (ret = prog_dmabuf(s, 0)))
  2296. return ret;
  2297. if (s->status & DO_DUAL_DAC) {
  2298. if (!s->dma_adc.ready && (ret = prog_dmabuf(s, 1)))
  2299. return ret;
  2300. }
  2301. s->dma_dac.enabled = 1;
  2302. start_dac(s);
  2303. } else {
  2304. s->dma_dac.enabled = 0;
  2305. stop_dac(s);
  2306. }
  2307. }
  2308. return 0;
  2309. case SNDCTL_DSP_GETOSPACE:
  2310. if (!(file->f_mode & FMODE_WRITE))
  2311. return -EINVAL;
  2312. if (!(s->enable & ENDAC) && (val = prog_dmabuf(s, 0)) != 0)
  2313. return val;
  2314. spin_lock_irqsave(&s->lock, flags);
  2315. cm_update_ptr(s);
  2316. abinfo.fragsize = s->dma_dac.fragsize;
  2317. abinfo.bytes = s->dma_dac.dmasize - s->dma_dac.count;
  2318. abinfo.fragstotal = s->dma_dac.numfrag;
  2319. abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
  2320. spin_unlock_irqrestore(&s->lock, flags);
  2321. return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  2322. case SNDCTL_DSP_GETISPACE:
  2323. if (!(file->f_mode & FMODE_READ))
  2324. return -EINVAL;
  2325. if (!(s->enable & ENADC) && (val = prog_dmabuf(s, 1)) != 0)
  2326. return val;
  2327. spin_lock_irqsave(&s->lock, flags);
  2328. cm_update_ptr(s);
  2329. abinfo.fragsize = s->dma_adc.fragsize;
  2330. abinfo.bytes = s->dma_adc.count;
  2331. abinfo.fragstotal = s->dma_adc.numfrag;
  2332. abinfo.fragments = abinfo.bytes >> s->dma_adc.fragshift;
  2333. spin_unlock_irqrestore(&s->lock, flags);
  2334. return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  2335. case SNDCTL_DSP_NONBLOCK:
  2336. file->f_flags |= O_NONBLOCK;
  2337. return 0;
  2338. case SNDCTL_DSP_GETODELAY:
  2339. if (!(file->f_mode & FMODE_WRITE))
  2340. return -EINVAL;
  2341. spin_lock_irqsave(&s->lock, flags);
  2342. cm_update_ptr(s);
  2343. val = s->dma_dac.count;
  2344. spin_unlock_irqrestore(&s->lock, flags);
  2345. return put_user(val, p);
  2346. case SNDCTL_DSP_GETIPTR:
  2347. if (!(file->f_mode & FMODE_READ))
  2348. return -EINVAL;
  2349. spin_lock_irqsave(&s->lock, flags);
  2350. cm_update_ptr(s);
  2351. cinfo.bytes = s->dma_adc.total_bytes;
  2352. cinfo.blocks = s->dma_adc.count >> s->dma_adc.fragshift;
  2353. cinfo.ptr = s->dma_adc.hwptr;
  2354. if (s->dma_adc.mapped)
  2355. s->dma_adc.count &= s->dma_adc.fragsize-1;
  2356. spin_unlock_irqrestore(&s->lock, flags);
  2357. return copy_to_user(argp, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
  2358. case SNDCTL_DSP_GETOPTR:
  2359. if (!(file->f_mode & FMODE_WRITE))
  2360. return -EINVAL;
  2361. spin_lock_irqsave(&s->lock, flags);
  2362. cm_update_ptr(s);
  2363. cinfo.bytes = s->dma_dac.total_bytes;
  2364. cinfo.blocks = s->dma_dac.count >> s->dma_dac.fragshift;
  2365. cinfo.ptr = s->dma_dac.hwptr;
  2366. if (s->dma_dac.mapped)
  2367. s->dma_dac.count &= s->dma_dac.fragsize-1;
  2368. if (s->status & DO_DUAL_DAC) {
  2369. if (s->dma_adc.mapped)
  2370. s->dma_adc.count &= s->dma_adc.fragsize-1;
  2371. }
  2372. spin_unlock_irqrestore(&s->lock, flags);
  2373. return copy_to_user(argp, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
  2374. case SNDCTL_DSP_GETBLKSIZE:
  2375. if (file->f_mode & FMODE_WRITE) {
  2376. if ((val = prog_dmabuf(s, 0)))
  2377. return val;
  2378. if (s->status & DO_DUAL_DAC) {
  2379. if ((val = prog_dmabuf(s, 1)))
  2380. return val;
  2381. return put_user(2 * s->dma_dac.fragsize, p);
  2382. }
  2383. return put_user(s->dma_dac.fragsize, p);
  2384. }
  2385. if ((val = prog_dmabuf(s, 1)))
  2386. return val;
  2387. return put_user(s->dma_adc.fragsize, p);
  2388. case SNDCTL_DSP_SETFRAGMENT:
  2389. if (get_user(val, p))
  2390. return -EFAULT;
  2391. if (file->f_mode & FMODE_READ) {
  2392. s->dma_adc.ossfragshift = val & 0xffff;
  2393. s->dma_adc.ossmaxfrags = (val >> 16) & 0xffff;
  2394. if (s->dma_adc.ossfragshift < 4)
  2395. s->dma_adc.ossfragshift = 4;
  2396. if (s->dma_adc.ossfragshift > 15)
  2397. s->dma_adc.ossfragshift = 15;
  2398. if (s->dma_adc.ossmaxfrags < 4)
  2399. s->dma_adc.ossmaxfrags = 4;
  2400. }
  2401. if (file->f_mode & FMODE_WRITE) {
  2402. s->dma_dac.ossfragshift = val & 0xffff;
  2403. s->dma_dac.ossmaxfrags = (val >> 16) & 0xffff;
  2404. if (s->dma_dac.ossfragshift < 4)
  2405. s->dma_dac.ossfragshift = 4;
  2406. if (s->dma_dac.ossfragshift > 15)
  2407. s->dma_dac.ossfragshift = 15;
  2408. if (s->dma_dac.ossmaxfrags < 4)
  2409. s->dma_dac.ossmaxfrags = 4;
  2410. if (s->status & DO_DUAL_DAC) {
  2411. s->dma_adc.ossfragshift = s->dma_dac.ossfragshift;
  2412. s->dma_adc.ossmaxfrags = s->dma_dac.ossmaxfrags;
  2413. }
  2414. }
  2415. return 0;
  2416. case SNDCTL_DSP_SUBDIVIDE:
  2417. if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision) ||
  2418. (file->f_mode & FMODE_WRITE && s->dma_dac.subdivision))
  2419. return -EINVAL;
  2420. if (get_user(val, p))
  2421. return -EFAULT;
  2422. if (val != 1 && val != 2 && val != 4)
  2423. return -EINVAL;
  2424. if (file->f_mode & FMODE_READ)
  2425. s->dma_adc.subdivision = val;
  2426. if (file->f_mode & FMODE_WRITE) {
  2427. s->dma_dac.subdivision = val;
  2428. if (s->status & DO_DUAL_DAC)
  2429. s->dma_adc.subdivision = val;
  2430. }
  2431. return 0;
  2432. case SOUND_PCM_READ_RATE:
  2433. return put_user((file->f_mode & FMODE_READ) ? s->rateadc : s->ratedac, p);
  2434. case SOUND_PCM_READ_CHANNELS:
  2435. return put_user((s->fmt & ((file->f_mode & FMODE_READ) ? (CM_CFMT_STEREO << CM_CFMT_ADCSHIFT) : (CM_CFMT_STEREO << CM_CFMT_DACSHIFT))) ? 2 : 1, p);
  2436. case SOUND_PCM_READ_BITS:
  2437. return put_user((s->fmt & ((file->f_mode & FMODE_READ) ? (CM_CFMT_16BIT << CM_CFMT_ADCSHIFT) : (CM_CFMT_16BIT << CM_CFMT_DACSHIFT))) ? 16 : 8, p);
  2438. case SOUND_PCM_READ_FILTER:
  2439. return put_user((file->f_mode & FMODE_READ) ? s->rateadc : s->ratedac, p);
  2440. case SNDCTL_DSP_GETCHANNELMASK:
  2441. return put_user(DSP_BIND_FRONT|DSP_BIND_SURR|DSP_BIND_CENTER_LFE|DSP_BIND_SPDIF, p);
  2442. case SNDCTL_DSP_BIND_CHANNEL:
  2443. if (get_user(val, p))
  2444. return -EFAULT;
  2445. if (val == DSP_BIND_QUERY) {
  2446. val = DSP_BIND_FRONT;
  2447. if (s->status & DO_SPDIF_OUT)
  2448. val |= DSP_BIND_SPDIF;
  2449. else {
  2450. if (s->curr_channels == 4)
  2451. val |= DSP_BIND_SURR;
  2452. if (s->curr_channels > 4)
  2453. val |= DSP_BIND_CENTER_LFE;
  2454. }
  2455. } else {
  2456. if (file->f_mode & FMODE_READ) {
  2457. stop_adc(s);
  2458. s->dma_adc.ready = 0;
  2459. if (val & DSP_BIND_SPDIF) {
  2460. set_spdifin(s, s->rateadc);
  2461. if (!(s->status & DO_SPDIF_OUT))
  2462. val &= ~DSP_BIND_SPDIF;
  2463. }
  2464. }
  2465. if (file->f_mode & FMODE_WRITE) {
  2466. stop_dac(s);
  2467. s->dma_dac.ready = 0;
  2468. if (val & DSP_BIND_SPDIF) {
  2469. set_spdifout(s, s->ratedac);
  2470. set_dac_channels(s, s->fmt & (CM_CFMT_STEREO << CM_CFMT_DACSHIFT) ? 2 : 1);
  2471. if (!(s->status & DO_SPDIF_OUT))
  2472. val &= ~DSP_BIND_SPDIF;
  2473. } else {
  2474. int channels;
  2475. int mask;
  2476. mask = val & (DSP_BIND_FRONT|DSP_BIND_SURR|DSP_BIND_CENTER_LFE);
  2477. switch (mask) {
  2478. case DSP_BIND_FRONT:
  2479. channels = 2;
  2480. break;
  2481. case DSP_BIND_FRONT|DSP_BIND_SURR:
  2482. channels = 4;
  2483. break;
  2484. case DSP_BIND_FRONT|DSP_BIND_SURR|DSP_BIND_CENTER_LFE:
  2485. channels = 6;
  2486. break;
  2487. default:
  2488. channels = s->fmt & (CM_CFMT_STEREO << CM_CFMT_DACSHIFT) ? 2 : 1;
  2489. break;
  2490. }
  2491. set_dac_channels(s, channels);
  2492. }
  2493. }
  2494. }
  2495. return put_user(val, p);
  2496. case SOUND_PCM_WRITE_FILTER:
  2497. case SNDCTL_DSP_MAPINBUF:
  2498. case SNDCTL_DSP_MAPOUTBUF:
  2499. case SNDCTL_DSP_SETSYNCRO:
  2500. return -EINVAL;
  2501. case SNDCTL_SPDIF_COPYRIGHT:
  2502. if (get_user(val, p))
  2503. return -EFAULT;
  2504. set_spdif_copyright(s, val);
  2505. return 0;
  2506. case SNDCTL_SPDIF_LOOP:
  2507. if (get_user(val, p))
  2508. return -EFAULT;
  2509. set_spdif_loop(s, val);
  2510. return 0;
  2511. case SNDCTL_SPDIF_MONITOR:
  2512. if (get_user(val, p))
  2513. return -EFAULT;
  2514. set_spdif_monitor(s, val);
  2515. return 0;
  2516. case SNDCTL_SPDIF_LEVEL:
  2517. if (get_user(val, p))
  2518. return -EFAULT;
  2519. set_spdifout_level(s, val);
  2520. return 0;
  2521. case SNDCTL_SPDIF_INV:
  2522. if (get_user(val, p))
  2523. return -EFAULT;
  2524. set_spdifin_inverse(s, val);
  2525. return 0;
  2526. case SNDCTL_SPDIF_SEL2:
  2527. if (get_user(val, p))
  2528. return -EFAULT;
  2529. set_spdifin_channel2(s, val);
  2530. return 0;
  2531. case SNDCTL_SPDIF_VALID:
  2532. if (get_user(val, p))
  2533. return -EFAULT;
  2534. set_spdifin_valid(s, val);
  2535. return 0;
  2536. case SNDCTL_SPDIFOUT:
  2537. if (get_user(val, p))
  2538. return -EFAULT;
  2539. set_spdifout(s, val ? s->ratedac : 0);
  2540. return 0;
  2541. case SNDCTL_SPDIFIN:
  2542. if (get_user(val, p))
  2543. return -EFAULT;
  2544. set_spdifin(s, val ? s->rateadc : 0);
  2545. return 0;
  2546. }
  2547. return mixer_ioctl(s, cmd, arg);
  2548. }
  2549. static int cm_open(struct inode *inode, struct file *file)
  2550. {
  2551. int minor = iminor(inode);
  2552. DECLARE_WAITQUEUE(wait, current);
  2553. unsigned char fmtm = ~0, fmts = 0;
  2554. struct list_head *list;
  2555. struct cm_state *s;
  2556. for (list = devs.next; ; list = list->next) {
  2557. if (list == &devs)
  2558. return -ENODEV;
  2559. s = list_entry(list, struct cm_state, devs);
  2560. if (!((s->dev_audio ^ minor) & ~0xf))
  2561. break;
  2562. }
  2563. VALIDATE_STATE(s);
  2564. file->private_data = s;
  2565. /* wait for device to become free */
  2566. mutex_lock(&s->open_mutex);
  2567. while (s->open_mode & file->f_mode) {
  2568. if (file->f_flags & O_NONBLOCK) {
  2569. mutex_unlock(&s->open_mutex);
  2570. return -EBUSY;
  2571. }
  2572. add_wait_queue(&s->open_wait, &wait);
  2573. __set_current_state(TASK_INTERRUPTIBLE);
  2574. mutex_unlock(&s->open_mutex);
  2575. schedule();
  2576. remove_wait_queue(&s->open_wait, &wait);
  2577. set_current_state(TASK_RUNNING);
  2578. if (signal_pending(current))
  2579. return -ERESTARTSYS;
  2580. mutex_lock(&s->open_mutex);
  2581. }
  2582. if (file->f_mode & FMODE_READ) {
  2583. s->status &= ~DO_BIGENDIAN_R;
  2584. fmtm &= ~((CM_CFMT_STEREO | CM_CFMT_16BIT) << CM_CFMT_ADCSHIFT);
  2585. if ((minor & 0xf) == SND_DEV_DSP16)
  2586. fmts |= CM_CFMT_16BIT << CM_CFMT_ADCSHIFT;
  2587. s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0;
  2588. s->dma_adc.enabled = 1;
  2589. set_adc_rate(s, 8000);
  2590. // spdif-in is turnned off by default
  2591. set_spdifin(s, 0);
  2592. }
  2593. if (file->f_mode & FMODE_WRITE) {
  2594. s->status &= ~DO_BIGENDIAN_W;
  2595. fmtm &= ~((CM_CFMT_STEREO | CM_CFMT_16BIT) << CM_CFMT_DACSHIFT);
  2596. if ((minor & 0xf) == SND_DEV_DSP16)
  2597. fmts |= CM_CFMT_16BIT << CM_CFMT_DACSHIFT;
  2598. s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = s->dma_dac.subdivision = 0;
  2599. s->dma_dac.enabled = 1;
  2600. set_dac_rate(s, 8000);
  2601. // clear previous multichannel, spdif, ac3 state
  2602. set_spdifout(s, 0);
  2603. set_ac3(s, 0);
  2604. set_dac_channels(s, 1);
  2605. }
  2606. set_fmt(s, fmtm, fmts);
  2607. s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
  2608. mutex_unlock(&s->open_mutex);
  2609. return nonseekable_open(inode, file);
  2610. }
  2611. static int cm_release(struct inode *inode, struct file *file)
  2612. {
  2613. struct cm_state *s = (struct cm_state *)file->private_data;
  2614. VALIDATE_STATE(s);
  2615. lock_kernel();
  2616. if (file->f_mode & FMODE_WRITE)
  2617. drain_dac(s, file->f_flags & O_NONBLOCK);
  2618. mutex_lock(&s->open_mutex);
  2619. if (file->f_mode & FMODE_WRITE) {
  2620. stop_dac(s);
  2621. dealloc_dmabuf(s, &s->dma_dac);
  2622. if (s->status & DO_DUAL_DAC)
  2623. dealloc_dmabuf(s, &s->dma_adc);
  2624. if (s->status & DO_MULTI_CH)
  2625. set_dac_channels(s, 1);
  2626. if (s->status & DO_AC3)
  2627. set_ac3(s, 0);
  2628. if (s->status & DO_SPDIF_OUT)
  2629. set_spdifout(s, 0);
  2630. /* enable SPDIF loop */
  2631. set_spdif_loop(s, spdif_loop);
  2632. s->status &= ~DO_BIGENDIAN_W;
  2633. }
  2634. if (file->f_mode & FMODE_READ) {
  2635. stop_adc(s);
  2636. dealloc_dmabuf(s, &s->dma_adc);
  2637. s->status &= ~DO_BIGENDIAN_R;
  2638. }
  2639. s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE));
  2640. mutex_unlock(&s->open_mutex);
  2641. wake_up(&s->open_wait);
  2642. unlock_kernel();
  2643. return 0;
  2644. }
  2645. static /*const*/ struct file_operations cm_audio_fops = {
  2646. .owner = THIS_MODULE,
  2647. .llseek = no_llseek,
  2648. .read = cm_read,
  2649. .write = cm_write,
  2650. .poll = cm_poll,
  2651. .ioctl = cm_ioctl,
  2652. .mmap = cm_mmap,
  2653. .open = cm_open,
  2654. .release = cm_release,
  2655. };
  2656. /* --------------------------------------------------------------------- */
  2657. static struct initvol {
  2658. int mixch;
  2659. int vol;
  2660. } initvol[] __devinitdata = {
  2661. { SOUND_MIXER_WRITE_CD, 0x4f4f },
  2662. { SOUND_MIXER_WRITE_LINE, 0x4f4f },
  2663. { SOUND_MIXER_WRITE_MIC, 0x4f4f },
  2664. { SOUND_MIXER_WRITE_SYNTH, 0x4f4f },
  2665. { SOUND_MIXER_WRITE_VOLUME, 0x4f4f },
  2666. { SOUND_MIXER_WRITE_PCM, 0x4f4f }
  2667. };
  2668. /* check chip version and capability */
  2669. static int query_chip(struct cm_state *s)
  2670. {
  2671. int ChipVersion = -1;
  2672. unsigned char RegValue;
  2673. // check reg 0Ch, bit 24-31
  2674. RegValue = inb(s->iobase + CODEC_CMI_INT_HLDCLR + 3);
  2675. if (RegValue == 0) {
  2676. // check reg 08h, bit 24-28
  2677. RegValue = inb(s->iobase + CODEC_CMI_CHFORMAT + 3);
  2678. RegValue &= 0x1f;
  2679. if (RegValue == 0) {
  2680. ChipVersion = 33;
  2681. s->max_channels = 4;
  2682. s->capability |= CAN_AC3_SW;
  2683. s->capability |= CAN_DUAL_DAC;
  2684. } else {
  2685. ChipVersion = 37;
  2686. s->max_channels = 4;
  2687. s->capability |= CAN_AC3_HW;
  2688. s->capability |= CAN_DUAL_DAC;
  2689. }
  2690. } else {
  2691. // check reg 0Ch, bit 26
  2692. if (RegValue & (1 << (26-24))) {
  2693. ChipVersion = 39;
  2694. if (RegValue & (1 << (24-24)))
  2695. s->max_channels = 6;
  2696. else
  2697. s->max_channels = 4;
  2698. s->capability |= CAN_AC3_HW;
  2699. s->capability |= CAN_DUAL_DAC;
  2700. s->capability |= CAN_MULTI_CH_HW;
  2701. s->capability |= CAN_LINE_AS_BASS;
  2702. s->capability |= CAN_MIC_AS_BASS;
  2703. } else {
  2704. ChipVersion = 55; // 4 or 6 channels
  2705. s->max_channels = 6;
  2706. s->capability |= CAN_AC3_HW;
  2707. s->capability |= CAN_DUAL_DAC;
  2708. s->capability |= CAN_MULTI_CH_HW;
  2709. s->capability |= CAN_LINE_AS_BASS;
  2710. s->capability |= CAN_MIC_AS_BASS;
  2711. }
  2712. }
  2713. s->capability |= CAN_LINE_AS_REAR;
  2714. return ChipVersion;
  2715. }
  2716. #ifdef CONFIG_SOUND_CMPCI_JOYSTICK
  2717. static int __devinit cm_create_gameport(struct cm_state *s, int io_port)
  2718. {
  2719. struct gameport *gp;
  2720. if (!request_region(io_port, CM_EXTENT_GAME, "cmpci GAME")) {
  2721. printk(KERN_ERR "cmpci: gameport io ports 0x%#x in use\n", io_port);
  2722. return -EBUSY;
  2723. }
  2724. if (!(s->gameport = gp = gameport_allocate_port())) {
  2725. printk(KERN_ERR "cmpci: can not allocate memory for gameport\n");
  2726. release_region(io_port, CM_EXTENT_GAME);
  2727. return -ENOMEM;
  2728. }
  2729. gameport_set_name(gp, "C-Media GP");
  2730. gameport_set_phys(gp, "pci%s/gameport0", pci_name(s->dev));
  2731. gp->dev.parent = &s->dev->dev;
  2732. gp->io = io_port;
  2733. /* enable joystick */
  2734. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x02);
  2735. gameport_register_port(gp);
  2736. return 0;
  2737. }
  2738. static void __devexit cm_free_gameport(struct cm_state *s)
  2739. {
  2740. if (s->gameport) {
  2741. int gpio = s->gameport->io;
  2742. gameport_unregister_port(s->gameport);
  2743. s->gameport = NULL;
  2744. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x02, 0);
  2745. release_region(gpio, CM_EXTENT_GAME);
  2746. }
  2747. }
  2748. #else
  2749. static inline int cm_create_gameport(struct cm_state *s, int io_port) { return -ENOSYS; }
  2750. static inline void cm_free_gameport(struct cm_state *s) { }
  2751. #endif
  2752. #define echo_option(x)\
  2753. if (x) strcat(options, "" #x " ")
  2754. static int __devinit cm_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
  2755. {
  2756. struct cm_state *s;
  2757. mm_segment_t fs;
  2758. int i, val, ret;
  2759. unsigned char reg_mask;
  2760. int timeout;
  2761. struct resource *ports;
  2762. struct {
  2763. unsigned short deviceid;
  2764. char *devicename;
  2765. } devicetable[] = {
  2766. { PCI_DEVICE_ID_CMEDIA_CM8338A, "CM8338A" },
  2767. { PCI_DEVICE_ID_CMEDIA_CM8338B, "CM8338B" },
  2768. { PCI_DEVICE_ID_CMEDIA_CM8738, "CM8738" },
  2769. { PCI_DEVICE_ID_CMEDIA_CM8738B, "CM8738B" },
  2770. };
  2771. char *devicename = "unknown";
  2772. char options[256];
  2773. if ((ret = pci_enable_device(pcidev)))
  2774. return ret;
  2775. if (!(pci_resource_flags(pcidev, 0) & IORESOURCE_IO))
  2776. return -ENODEV;
  2777. if (pcidev->irq == 0)
  2778. return -ENODEV;
  2779. i = pci_set_dma_mask(pcidev, DMA_32BIT_MASK);
  2780. if (i) {
  2781. printk(KERN_WARNING "cmpci: architecture does not support 32bit PCI busmaster DMA\n");
  2782. return i;
  2783. }
  2784. s = kmalloc(sizeof(*s), GFP_KERNEL);
  2785. if (!s) {
  2786. printk(KERN_WARNING "cmpci: out of memory\n");
  2787. return -ENOMEM;
  2788. }
  2789. /* search device name */
  2790. for (i = 0; i < sizeof(devicetable) / sizeof(devicetable[0]); i++) {
  2791. if (devicetable[i].deviceid == pcidev->device) {
  2792. devicename = devicetable[i].devicename;
  2793. break;
  2794. }
  2795. }
  2796. memset(s, 0, sizeof(struct cm_state));
  2797. init_waitqueue_head(&s->dma_adc.wait);
  2798. init_waitqueue_head(&s->dma_dac.wait);
  2799. init_waitqueue_head(&s->open_wait);
  2800. mutex_init(&s->open_mutex);
  2801. spin_lock_init(&s->lock);
  2802. s->magic = CM_MAGIC;
  2803. s->dev = pcidev;
  2804. s->iobase = pci_resource_start(pcidev, 0);
  2805. s->iosynth = fmio;
  2806. s->iomidi = mpuio;
  2807. #ifdef CONFIG_SOUND_CMPCI_MIDI
  2808. s->midi_devc = 0;
  2809. #endif
  2810. s->status = 0;
  2811. if (s->iobase == 0)
  2812. return -ENODEV;
  2813. s->irq = pcidev->irq;
  2814. if (!request_region(s->iobase, CM_EXTENT_CODEC, "cmpci")) {
  2815. printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iobase, s->iobase+CM_EXTENT_CODEC-1);
  2816. ret = -EBUSY;
  2817. goto err_region5;
  2818. }
  2819. /* dump parameters */
  2820. strcpy(options, "cmpci: ");
  2821. echo_option(joystick);
  2822. echo_option(spdif_inverse);
  2823. echo_option(spdif_loop);
  2824. echo_option(spdif_out);
  2825. echo_option(use_line_as_rear);
  2826. echo_option(use_line_as_bass);
  2827. echo_option(use_mic_as_bass);
  2828. echo_option(mic_boost);
  2829. echo_option(hw_copy);
  2830. printk(KERN_INFO "%s\n", options);
  2831. /* initialize codec registers */
  2832. outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */
  2833. outb(0, s->iobase + CODEC_CMI_FUNCTRL0 + 2); /* disable channels */
  2834. /* reset mixer */
  2835. wrmixer(s, DSP_MIX_DATARESETIDX, 0);
  2836. /* request irq */
  2837. if ((ret = request_irq(s->irq, cm_interrupt, IRQF_SHARED, "cmpci", s))) {
  2838. printk(KERN_ERR "cmpci: irq %u in use\n", s->irq);
  2839. goto err_irq;
  2840. }
  2841. printk(KERN_INFO "cmpci: found %s adapter at io %#x irq %u\n",
  2842. devicename, s->iobase, s->irq);
  2843. /* register devices */
  2844. if ((s->dev_audio = register_sound_dsp(&cm_audio_fops, -1)) < 0) {
  2845. ret = s->dev_audio;
  2846. goto err_dev1;
  2847. }
  2848. if ((s->dev_mixer = register_sound_mixer(&cm_mixer_fops, -1)) < 0) {
  2849. ret = s->dev_mixer;
  2850. goto err_dev2;
  2851. }
  2852. pci_set_master(pcidev); /* enable bus mastering */
  2853. /* initialize the chips */
  2854. fs = get_fs();
  2855. set_fs(KERNEL_DS);
  2856. /* set mixer output */
  2857. frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, 0x1f);
  2858. /* set mixer input */
  2859. val = SOUND_MASK_LINE|SOUND_MASK_SYNTH|SOUND_MASK_CD|SOUND_MASK_MIC;
  2860. mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long)&val);
  2861. for (i = 0; i < sizeof(initvol)/sizeof(initvol[0]); i++) {
  2862. val = initvol[i].vol;
  2863. mixer_ioctl(s, initvol[i].mixch, (unsigned long)&val);
  2864. }
  2865. set_fs(fs);
  2866. /* use channel 1 for playback, channel 0 for record */
  2867. maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~CHADC1, CHADC0);
  2868. /* turn off VMIC3 - mic boost */
  2869. if (mic_boost)
  2870. maskb(s->iobase + CODEC_CMI_MIXER2, ~1, 0);
  2871. else
  2872. maskb(s->iobase + CODEC_CMI_MIXER2, ~0, 1);
  2873. s->deviceid = pcidev->device;
  2874. if (pcidev->device == PCI_DEVICE_ID_CMEDIA_CM8738
  2875. || pcidev->device == PCI_DEVICE_ID_CMEDIA_CM8738B) {
  2876. /* chip version and hw capability check */
  2877. s->chip_version = query_chip(s);
  2878. printk(KERN_INFO "cmpci: chip version = 0%d\n", s->chip_version);
  2879. /* set SPDIF-in inverse before enable SPDIF loop */
  2880. set_spdifin_inverse(s, spdif_inverse);
  2881. /* use SPDIF in #1 */
  2882. set_spdifin_channel2(s, 0);
  2883. } else {
  2884. s->chip_version = 0;
  2885. /* 8338 will fall here */
  2886. s->max_channels = 4;
  2887. s->capability |= CAN_DUAL_DAC;
  2888. s->capability |= CAN_LINE_AS_REAR;
  2889. }
  2890. /* enable SPDIF loop */
  2891. set_spdif_loop(s, spdif_loop);
  2892. // enable 4 speaker mode (analog duplicate)
  2893. set_hw_copy(s, hw_copy);
  2894. reg_mask = 0;
  2895. #ifdef CONFIG_SOUND_CMPCI_FM
  2896. /* disable FM */
  2897. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~8, 0);
  2898. if (s->iosynth) {
  2899. /* don't enable OPL3 if there is one */
  2900. if (opl3_detect(s->iosynth, NULL)) {
  2901. s->iosynth = 0;
  2902. } else {
  2903. /* set IO based at 0x388 */
  2904. switch (s->iosynth) {
  2905. case 0x388:
  2906. reg_mask = 0;
  2907. break;
  2908. case 0x3C8:
  2909. reg_mask = 0x01;
  2910. break;
  2911. case 0x3E0:
  2912. reg_mask = 0x02;
  2913. break;
  2914. case 0x3E8:
  2915. reg_mask = 0x03;
  2916. break;
  2917. default:
  2918. s->iosynth = 0;
  2919. break;
  2920. }
  2921. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0x03, reg_mask);
  2922. /* enable FM */
  2923. if (s->iosynth) {
  2924. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, 8);
  2925. if (opl3_detect(s->iosynth, NULL))
  2926. ret = opl3_init(s->iosynth, NULL, THIS_MODULE);
  2927. else {
  2928. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~8, 0);
  2929. s->iosynth = 0;
  2930. }
  2931. }
  2932. }
  2933. }
  2934. #endif
  2935. #ifdef CONFIG_SOUND_CMPCI_MIDI
  2936. switch (s->iomidi) {
  2937. case 0x330:
  2938. reg_mask = 0;
  2939. break;
  2940. case 0x320:
  2941. reg_mask = 0x20;
  2942. break;
  2943. case 0x310:
  2944. reg_mask = 0x40;
  2945. break;
  2946. case 0x300:
  2947. reg_mask = 0x60;
  2948. break;
  2949. default:
  2950. s->iomidi = 0;
  2951. goto skip_mpu;
  2952. }
  2953. ports = request_region(s->iomidi, 2, "mpu401");
  2954. if (!ports)
  2955. goto skip_mpu;
  2956. /* disable MPU-401 */
  2957. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x04, 0);
  2958. s->mpu_data.name = "cmpci mpu";
  2959. s->mpu_data.io_base = s->iomidi;
  2960. s->mpu_data.irq = -s->irq; // tell mpu401 to share irq
  2961. if (probe_mpu401(&s->mpu_data, ports)) {
  2962. release_region(s->iomidi, 2);
  2963. s->iomidi = 0;
  2964. goto skip_mpu;
  2965. }
  2966. maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0x60, reg_mask);
  2967. /* enable MPU-401 */
  2968. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x04);
  2969. /* clear all previously received interrupt */
  2970. for (timeout = 900000; timeout > 0; timeout--) {
  2971. if ((inb(s->iomidi + 1) && 0x80) == 0)
  2972. inb(s->iomidi);
  2973. else
  2974. break;
  2975. }
  2976. if (!probe_mpu401(&s->mpu_data, ports)) {
  2977. release_region(s->iomidi, 2);
  2978. s->iomidi = 0;
  2979. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x04);
  2980. } else {
  2981. attach_mpu401(&s->mpu_data, THIS_MODULE);
  2982. s->midi_devc = s->mpu_data.slots[1];
  2983. }
  2984. skip_mpu:
  2985. #endif
  2986. /* disable joystick port */
  2987. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x02, 0);
  2988. if (joystick)
  2989. cm_create_gameport(s, 0x200);
  2990. /* store it in the driver field */
  2991. pci_set_drvdata(pcidev, s);
  2992. /* put it into driver list */
  2993. list_add_tail(&s->devs, &devs);
  2994. /* increment devindex */
  2995. if (devindex < NR_DEVICE-1)
  2996. devindex++;
  2997. return 0;
  2998. err_dev2:
  2999. unregister_sound_dsp(s->dev_audio);
  3000. err_dev1:
  3001. printk(KERN_ERR "cmpci: cannot register misc device\n");
  3002. free_irq(s->irq, s);
  3003. err_irq:
  3004. release_region(s->iobase, CM_EXTENT_CODEC);
  3005. err_region5:
  3006. kfree(s);
  3007. return ret;
  3008. }
  3009. /* --------------------------------------------------------------------- */
  3010. MODULE_AUTHOR("ChenLi Tien, cltien@cmedia.com.tw");
  3011. MODULE_DESCRIPTION("CM8x38 Audio Driver");
  3012. MODULE_LICENSE("GPL");
  3013. static void __devexit cm_remove(struct pci_dev *dev)
  3014. {
  3015. struct cm_state *s = pci_get_drvdata(dev);
  3016. if (!s)
  3017. return;
  3018. cm_free_gameport(s);
  3019. #ifdef CONFIG_SOUND_CMPCI_FM
  3020. if (s->iosynth) {
  3021. /* disable FM */
  3022. maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~8, 0);
  3023. }
  3024. #endif
  3025. #ifdef CONFIG_SOUND_CMPCI_MIDI
  3026. if (s->iomidi) {
  3027. unload_mpu401(&s->mpu_data);
  3028. /* disable MPU-401 */
  3029. maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x04, 0);
  3030. }
  3031. #endif
  3032. set_spdif_loop(s, 0);
  3033. list_del(&s->devs);
  3034. outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */
  3035. synchronize_irq(s->irq);
  3036. outb(0, s->iobase + CODEC_CMI_FUNCTRL0 + 2); /* disable channels */
  3037. free_irq(s->irq, s);
  3038. /* reset mixer */
  3039. wrmixer(s, DSP_MIX_DATARESETIDX, 0);
  3040. release_region(s->iobase, CM_EXTENT_CODEC);
  3041. unregister_sound_dsp(s->dev_audio);
  3042. unregister_sound_mixer(s->dev_mixer);
  3043. kfree(s);
  3044. pci_set_drvdata(dev, NULL);
  3045. }
  3046. static struct pci_device_id id_table[] __devinitdata = {
  3047. { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
  3048. { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
  3049. { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
  3050. { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
  3051. { 0, }
  3052. };
  3053. MODULE_DEVICE_TABLE(pci, id_table);
  3054. static struct pci_driver cm_driver = {
  3055. .name = "cmpci",
  3056. .id_table = id_table,
  3057. .probe = cm_probe,
  3058. .remove = __devexit_p(cm_remove)
  3059. };
  3060. static int __init init_cmpci(void)
  3061. {
  3062. printk(KERN_INFO "cmpci: version $Revision: 6.82 $ time " __TIME__ " " __DATE__ "\n");
  3063. return pci_register_driver(&cm_driver);
  3064. }
  3065. static void __exit cleanup_cmpci(void)
  3066. {
  3067. printk(KERN_INFO "cmpci: unloading\n");
  3068. pci_unregister_driver(&cm_driver);
  3069. }
  3070. module_init(init_cmpci);
  3071. module_exit(cleanup_cmpci);