cmpci.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:89k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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