cmpci.c 94 KB

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