nec_vrc5477.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:53k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /***********************************************************************
  2.  * Copyright 2001 MontaVista Software Inc.
  3.  * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
  4.  *
  5.  * drivers/sound/nec_vrc5477.c
  6.  *     AC97 sound dirver for NEC Vrc5477 chip (an integrated, 
  7.  *     multi-function controller chip for MIPS CPUs)
  8.  *
  9.  * VRA support Copyright 2001 Bradley D. LaRonde <brad@ltc.com>
  10.  *
  11.  * This program is free software; you can redistribute  it and/or modify it
  12.  * under  the terms of  the GNU General  Public License as published by the
  13.  * Free Software Foundation;  either version 2 of the  License, or (at your
  14.  * option) any later version.
  15.  ***********************************************************************
  16.  */
  17. /*
  18.  * This code is derived from ite8172.c, which is written by Steve Longerbeam.
  19.  *
  20.  * Features:
  21.  *   Currently we only support the following capabilities:
  22.  * . mono output to PCM L/R (line out).
  23.  * . stereo output to PCM L/R (line out).
  24.  * . mono input from PCM L (line in).
  25.  * . stereo output from PCM (line in).
  26.  * . sampling rate at 48k or variable sampling rate 
  27.  * . support /dev/dsp, /dev/mixer devices, standard OSS devices.
  28.  * . only support 16-bit PCM format (hardware limit, no software
  29.  *   translation) 
  30.  * . support duplex, but no trigger or realtime.
  31.  *
  32.  *   Specifically the following are not supported:
  33.  * . app-set frag size.
  34.  * . mmap'ed buffer access
  35.  */
  36. /* 
  37.  * Original comments from ite8172.c file.
  38.  */
  39. /*
  40.  *
  41.  * Notes:
  42.  *
  43.  *  1. Much of the OSS buffer allocation, ioctl's, and mmap'ing are
  44.  *     taken, slightly modified or not at all, from the ES1371 driver,
  45.  *     so refer to the credits in es1371.c for those. The rest of the
  46.  *     code (probe, open, read, write, the ISR, etc.) is new.
  47.  *  2. The following support is untested:
  48.  *      * Memory mapping the audio buffers, and the ioctl controls that go
  49.  *        with it.
  50.  *      * S/PDIF output.
  51.  *  3. The following is not supported:
  52.  *      * I2S input.
  53.  *      * legacy audio mode.
  54.  *  4. Support for volume button interrupts is implemented but doesn't
  55.  *     work yet.
  56.  *
  57.  *  Revision history
  58.  *    02.08.2001  0.1   Initial release
  59.  */
  60. #include <linux/version.h>
  61. #include <linux/module.h>
  62. #include <linux/string.h>
  63. #include <linux/kernel.h>
  64. #include <linux/ioport.h>
  65. #include <linux/sched.h>
  66. #include <linux/delay.h>
  67. #include <linux/sound.h>
  68. #include <linux/slab.h>
  69. #include <linux/soundcard.h>
  70. #include <linux/pci.h>
  71. #include <linux/init.h>
  72. #include <linux/poll.h>
  73. #include <linux/bitops.h>
  74. #include <linux/proc_fs.h>
  75. #include <linux/spinlock.h>
  76. #include <linux/smp_lock.h>
  77. #include <linux/ac97_codec.h>
  78. #include <linux/wrapper.h>
  79. #include <asm/io.h>
  80. #include <asm/dma.h>
  81. #include <asm/uaccess.h>
  82. #include <asm/hardirq.h>
  83. /* -------------------debug macros -------------------------------------- */
  84. /* #undef VRC5477_AC97_DEBUG */
  85. #define VRC5477_AC97_DEBUG
  86. #undef VRC5477_AC97_VERBOSE_DEBUG
  87. /* #define VRC5477_AC97_VERBOSE_DEBUG */
  88. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  89. #define VRC5477_AC97_DEBUG
  90. #endif
  91. #if defined(VRC5477_AC97_DEBUG)
  92. #include <linux/kernel.h>
  93. #define ASSERT(x)  if (!(x)) { 
  94. panic("assertion failed at %s:%d: %sn", __FILE__, __LINE__, #x); }
  95. #else
  96. #define ASSERT(x)
  97. #endif /* VRC5477_AC97_DEBUG */
  98. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  99. static u16 inTicket=0;  /* check sync between intr & write */
  100. static u16 outTicket=0;
  101. #endif
  102. /* --------------------------------------------------------------------- */
  103. #undef OSS_DOCUMENTED_MIXER_SEMANTICS
  104. static const unsigned sample_shift[] = { 0, 1, 1, 2 };
  105. #define         VRC5477_INT_CLR         0x0
  106. #define         VRC5477_INT_STATUS 0x0
  107. #define         VRC5477_CODEC_WR        0x4
  108. #define         VRC5477_CODEC_RD        0x8
  109. #define         VRC5477_CTRL            0x18
  110. #define         VRC5477_ACLINK_CTRL     0x1c
  111. #define         VRC5477_INT_MASK        0x24
  112. #define VRC5477_DAC1_CTRL 0x30
  113. #define VRC5477_DAC1L 0x34
  114. #define VRC5477_DAC1_BADDR 0x38
  115. #define VRC5477_DAC2_CTRL 0x3c
  116. #define VRC5477_DAC2L 0x40
  117. #define VRC5477_DAC2_BADDR 0x44
  118. #define VRC5477_DAC3_CTRL 0x48
  119. #define VRC5477_DAC3L 0x4c
  120. #define VRC5477_DAC3_BADDR 0x50
  121. #define VRC5477_ADC1_CTRL 0x54
  122. #define VRC5477_ADC1L 0x58
  123. #define VRC5477_ADC1_BADDR 0x5c
  124. #define VRC5477_ADC2_CTRL 0x60
  125. #define VRC5477_ADC2L 0x64
  126. #define VRC5477_ADC2_BADDR 0x68
  127. #define VRC5477_ADC3_CTRL 0x6c
  128. #define VRC5477_ADC3L 0x70
  129. #define VRC5477_ADC3_BADDR 0x74
  130. #define VRC5477_CODEC_WR_RWC (1 << 23)
  131. #define VRC5477_CODEC_RD_RRDYA (1 << 31)
  132. #define VRC5477_CODEC_RD_RRDYD (1 << 30)
  133. #define VRC5477_ACLINK_CTRL_RST_ON (1 << 15)
  134. #define VRC5477_ACLINK_CTRL_RST_TIME 0x7f
  135. #define VRC5477_ACLINK_CTRL_SYNC_ON (1 << 30)
  136. #define VRC5477_ACLINK_CTRL_CK_STOP_ON (1 << 31)
  137. #define VRC5477_CTRL_DAC2ENB (1 << 15) 
  138. #define VRC5477_CTRL_ADC2ENB (1 << 14) 
  139. #define VRC5477_CTRL_DAC1ENB (1 << 13) 
  140. #define VRC5477_CTRL_ADC1ENB (1 << 12) 
  141. #define VRC5477_INT_MASK_NMASK (1 << 31) 
  142. #define VRC5477_INT_MASK_DAC1END (1 << 5) 
  143. #define VRC5477_INT_MASK_DAC2END (1 << 4) 
  144. #define VRC5477_INT_MASK_DAC3END (1 << 3) 
  145. #define VRC5477_INT_MASK_ADC1END (1 << 2) 
  146. #define VRC5477_INT_MASK_ADC2END (1 << 1) 
  147. #define VRC5477_INT_MASK_ADC3END (1 << 0) 
  148. #define VRC5477_DMA_ACTIVATION (1 << 31)
  149. #define VRC5477_DMA_WIP (1 << 30)
  150. #define VRC5477_AC97_MODULE_NAME "NEC_Vrc5477_audio"
  151. #define PFX VRC5477_AC97_MODULE_NAME ": "
  152. /* --------------------------------------------------------------------- */
  153. struct vrc5477_ac97_state {
  154. /* list of vrc5477_ac97 devices */
  155. struct list_head devs;
  156. /* the corresponding pci_dev structure */
  157. struct pci_dev *dev;
  158. /* soundcore stuff */
  159. int dev_audio;
  160. /* hardware resources */
  161. unsigned long io;
  162. unsigned int irq;
  163. #ifdef VRC5477_AC97_DEBUG
  164. /* debug /proc entry */
  165. struct proc_dir_entry *ps;
  166. struct proc_dir_entry *ac97_ps;
  167. #endif /* VRC5477_AC97_DEBUG */
  168. struct ac97_codec codec;
  169. unsigned dacChannels, adcChannels;
  170. unsigned short dacRate, adcRate;
  171. unsigned short extended_status;
  172. spinlock_t lock;
  173. struct semaphore open_sem;
  174. mode_t open_mode;
  175. wait_queue_head_t open_wait;
  176. struct dmabuf {
  177. void *lbuf, *rbuf;
  178. dma_addr_t lbufDma, rbufDma;
  179. unsigned bufOrder;
  180. unsigned numFrag;
  181. unsigned fragShift;
  182. unsigned fragSize; /* redundant */
  183. unsigned fragTotalSize; /* = numFrag * fragSize(real)  */
  184. unsigned nextIn;
  185. unsigned nextOut;
  186. int count;
  187. unsigned error; /* over/underrun */
  188. wait_queue_head_t wait;
  189. /* OSS stuff */
  190. unsigned stopped:1;
  191. unsigned ready:1;
  192. } dma_dac, dma_adc;
  193. #define WORK_BUF_SIZE 2048
  194. struct {
  195. u16 lchannel;
  196. u16 rchannel;
  197. } workBuf[WORK_BUF_SIZE/4];
  198. };
  199. /* --------------------------------------------------------------------- */
  200. static LIST_HEAD(devs);
  201. /* --------------------------------------------------------------------- */
  202. static inline unsigned ld2(unsigned int x)
  203. {
  204.     unsigned r = 0;
  205.     if (x >= 0x10000) {
  206. x >>= 16;
  207. r += 16;
  208.     }
  209.     if (x >= 0x100) {
  210. x >>= 8;
  211. r += 8;
  212.     }
  213.     if (x >= 0x10) {
  214. x >>= 4;
  215. r += 4;
  216.     }
  217.     if (x >= 4) {
  218. x >>= 2;
  219. r += 2;
  220.     }
  221.     if (x >= 2)
  222. r++;
  223.     return r;
  224. }
  225. /* --------------------------------------------------------------------- */
  226. static u16 rdcodec(struct ac97_codec *codec, u8 addr)
  227. {
  228. struct vrc5477_ac97_state *s = 
  229. (struct vrc5477_ac97_state *)codec->private_data;
  230. unsigned long flags;
  231. u32 result;
  232. spin_lock_irqsave(&s->lock, flags);
  233. /* wait until we can access codec registers */
  234. while (inl(s->io + VRC5477_CODEC_WR) & 0x80000000);
  235. /* write the address and "read" command to codec */
  236. addr = addr & 0x7f;
  237. outl((addr << 16) | VRC5477_CODEC_WR_RWC, s->io + VRC5477_CODEC_WR);
  238. /* get the return result */
  239. udelay(100); /* workaround hardware bug */
  240. while ( (result = inl(s->io + VRC5477_CODEC_RD)) & 
  241.                 (VRC5477_CODEC_RD_RRDYA | VRC5477_CODEC_RD_RRDYD) ) {
  242. /* we get either addr or data, or both */
  243. if (result & VRC5477_CODEC_RD_RRDYA) {
  244. ASSERT(addr == ((result >> 16) & 0x7f) );
  245. }
  246. if (result & VRC5477_CODEC_RD_RRDYD) {
  247. break;
  248. }
  249. }
  250. spin_unlock_irqrestore(&s->lock, flags);
  251. return result & 0xffff;;
  252. }
  253. static void wrcodec(struct ac97_codec *codec, u8 addr, u16 data)
  254. {
  255. struct vrc5477_ac97_state *s = 
  256. (struct vrc5477_ac97_state *)codec->private_data;
  257. unsigned long flags;
  258. spin_lock_irqsave(&s->lock, flags);
  259. /* wait until we can access codec registers */
  260. while (inl(s->io + VRC5477_CODEC_WR) & 0x80000000);
  261. /* write the address and value to codec */
  262. outl((addr << 16) | data, s->io + VRC5477_CODEC_WR);
  263. spin_unlock_irqrestore(&s->lock, flags);
  264. }
  265. static void waitcodec(struct ac97_codec *codec)
  266. {
  267. struct vrc5477_ac97_state *s = 
  268. (struct vrc5477_ac97_state *)codec->private_data;
  269. /* wait until we can access codec registers */
  270. while (inl(s->io + VRC5477_CODEC_WR) & 0x80000000);
  271. }
  272. static int ac97_codec_not_present(struct ac97_codec *codec)
  273. {
  274. struct vrc5477_ac97_state *s = 
  275. (struct vrc5477_ac97_state *)codec->private_data;
  276. unsigned long flags;
  277. unsigned short count  = 0xffff; 
  278. spin_lock_irqsave(&s->lock, flags);
  279. /* wait until we can access codec registers */
  280. do {
  281.        if (!(inl(s->io + VRC5477_CODEC_WR) & 0x80000000))
  282.        break;
  283. } while (--count);
  284. if (count == 0) {
  285. spin_unlock_irqrestore(&s->lock, flags);
  286. return -1;
  287. }
  288. /* write 0 to reset */
  289. outl((AC97_RESET << 16) | 0, s->io + VRC5477_CODEC_WR);
  290. /* test whether we get a response from ac97 chip */
  291. count  = 0xffff; 
  292. do { 
  293.        if (!(inl(s->io + VRC5477_CODEC_WR) & 0x80000000))
  294.        break;
  295. } while (--count);
  296. if (count == 0) {
  297. spin_unlock_irqrestore(&s->lock, flags);
  298. return -1;
  299. }
  300. spin_unlock_irqrestore(&s->lock, flags);
  301. return 0;
  302. }
  303. /* --------------------------------------------------------------------- */
  304. static void vrc5477_ac97_delay(int msec)
  305. {
  306. unsigned long tmo;
  307. signed long tmo2;
  308. if (in_interrupt())
  309. return;
  310.     
  311. tmo = jiffies + (msec*HZ)/1000;
  312. for (;;) {
  313. tmo2 = tmo - jiffies;
  314. if (tmo2 <= 0)
  315. break;
  316. schedule_timeout(tmo2);
  317. }
  318. }
  319. static void set_adc_rate(struct vrc5477_ac97_state *s, unsigned rate)
  320. {
  321. wrcodec(&s->codec, AC97_PCM_LR_ADC_RATE, rate);
  322. s->adcRate = rate;
  323. }
  324. static void set_dac_rate(struct vrc5477_ac97_state *s, unsigned rate)
  325. {
  326. if(s->extended_status & AC97_EXTSTAT_VRA) {
  327. wrcodec(&s->codec, AC97_PCM_FRONT_DAC_RATE, rate);
  328. s->dacRate = rdcodec(&s->codec, AC97_PCM_FRONT_DAC_RATE);
  329. }
  330. }
  331. /* --------------------------------------------------------------------- */
  332. static inline void 
  333. stop_dac(struct vrc5477_ac97_state *s)
  334. {
  335. struct dmabuf* db = &s->dma_dac;
  336. unsigned long flags;
  337. u32 temp;
  338.     
  339. spin_lock_irqsave(&s->lock, flags);
  340. if (db->stopped) {
  341. spin_unlock_irqrestore(&s->lock, flags);
  342. return;
  343. }
  344. /* deactivate the dma */
  345. outl(0, s->io + VRC5477_DAC1_CTRL);
  346. outl(0, s->io + VRC5477_DAC2_CTRL);
  347. /* wait for DAM completely stop */
  348. while (inl(s->io + VRC5477_DAC1_CTRL) & VRC5477_DMA_WIP);
  349. while (inl(s->io + VRC5477_DAC2_CTRL) & VRC5477_DMA_WIP);
  350. /* disable dac slots in aclink */
  351. temp = inl(s->io + VRC5477_CTRL);
  352. temp &= ~ (VRC5477_CTRL_DAC1ENB | VRC5477_CTRL_DAC2ENB);
  353. outl (temp, s->io + VRC5477_CTRL);
  354. /* disable interrupts */
  355. temp = inl(s->io + VRC5477_INT_MASK);
  356. temp &= ~ (VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END); 
  357. outl (temp, s->io + VRC5477_INT_MASK);
  358. /* clear pending ones */
  359. outl(VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END, 
  360.      s->io +  VRC5477_INT_CLR);
  361.     
  362. db->stopped = 1;
  363.     
  364. spin_unlock_irqrestore(&s->lock, flags);
  365. }
  366. static void start_dac(struct vrc5477_ac97_state *s)
  367. {
  368. struct dmabuf* db = &s->dma_dac;
  369. unsigned long flags;
  370. u32 dmaLength;
  371. u32 temp;
  372. spin_lock_irqsave(&s->lock, flags);
  373. if (!db->stopped) {
  374. spin_unlock_irqrestore(&s->lock, flags);
  375. return;
  376. }
  377. /* we should have some data to do the DMA trasnfer */
  378. ASSERT(db->count >= db->fragSize);
  379. /* clear pending fales interrupts */
  380. outl(VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END, 
  381.      s->io +  VRC5477_INT_CLR);
  382. /* enable interrupts */
  383. temp = inl(s->io + VRC5477_INT_MASK);
  384. temp |= VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END;
  385. outl(temp, s->io +  VRC5477_INT_MASK);
  386. /* setup dma base addr */
  387. outl(db->lbufDma + db->nextOut, s->io + VRC5477_DAC1_BADDR);
  388. if (s->dacChannels == 1) {
  389. outl(db->lbufDma + db->nextOut, s->io + VRC5477_DAC2_BADDR);
  390. } else {
  391. outl(db->rbufDma + db->nextOut, s->io + VRC5477_DAC2_BADDR);
  392. }
  393. /* set dma length, in the unit of 0x10 bytes */
  394. dmaLength = db->fragSize >> 4;
  395. outl(dmaLength, s->io + VRC5477_DAC1L);
  396. outl(dmaLength, s->io + VRC5477_DAC2L);
  397. /* activate dma */
  398. outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_DAC1_CTRL);
  399. outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_DAC2_CTRL);
  400. /* enable dac slots - we should hear the music now! */
  401. temp = inl(s->io + VRC5477_CTRL);
  402. temp |= (VRC5477_CTRL_DAC1ENB | VRC5477_CTRL_DAC2ENB);
  403. outl (temp, s->io + VRC5477_CTRL);
  404. /* it is time to setup next dma transfer */
  405. ASSERT(inl(s->io + VRC5477_DAC1_CTRL) & VRC5477_DMA_WIP);
  406. ASSERT(inl(s->io + VRC5477_DAC2_CTRL) & VRC5477_DMA_WIP);
  407. temp = db->nextOut + db->fragSize;
  408. if (temp >= db->fragTotalSize) {
  409. ASSERT(temp == db->fragTotalSize);
  410. temp = 0;
  411. }
  412. outl(db->lbufDma + temp, s->io + VRC5477_DAC1_BADDR);
  413. if (s->dacChannels == 1) {
  414. outl(db->lbufDma + temp, s->io + VRC5477_DAC2_BADDR);
  415. } else {
  416. outl(db->rbufDma + temp, s->io + VRC5477_DAC2_BADDR);
  417. }
  418. db->stopped = 0;
  419. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  420. outTicket = *(u16*)(db->lbuf+db->nextOut);
  421. if (db->count > db->fragSize) {
  422. ASSERT((u16)(outTicket+1) == *(u16*)(db->lbuf+temp));
  423. }
  424. #endif
  425. spin_unlock_irqrestore(&s->lock, flags);
  426. }
  427. static inline void stop_adc(struct vrc5477_ac97_state *s)
  428. {
  429. struct dmabuf* db = &s->dma_adc;
  430. unsigned long flags;
  431. u32 temp;
  432.     
  433. spin_lock_irqsave(&s->lock, flags);
  434. if (db->stopped) {
  435. spin_unlock_irqrestore(&s->lock, flags);
  436. return;
  437. }
  438. /* deactivate the dma */
  439. outl(0, s->io + VRC5477_ADC1_CTRL);
  440. outl(0, s->io + VRC5477_ADC2_CTRL);
  441. /* disable adc slots in aclink */
  442. temp = inl(s->io + VRC5477_CTRL);
  443. temp &= ~ (VRC5477_CTRL_ADC1ENB | VRC5477_CTRL_ADC2ENB);
  444. outl (temp, s->io + VRC5477_CTRL);
  445. /* disable interrupts */
  446.         temp = inl(s->io + VRC5477_INT_MASK);
  447.         temp &= ~ (VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END); 
  448.         outl (temp, s->io + VRC5477_INT_MASK);
  449. /* clear pending ones */
  450. outl(VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END, 
  451.      s->io +  VRC5477_INT_CLR);
  452.     
  453. db->stopped = 1;
  454. spin_unlock_irqrestore(&s->lock, flags);
  455. }
  456. static void start_adc(struct vrc5477_ac97_state *s)
  457. {
  458. struct dmabuf* db = &s->dma_adc;
  459. unsigned long flags;
  460. u32 dmaLength;
  461. u32 temp;
  462. spin_lock_irqsave(&s->lock, flags);
  463. if (!db->stopped) {
  464. spin_unlock_irqrestore(&s->lock, flags);
  465. return;
  466. }
  467. /* we should at least have some free space in the buffer */
  468. ASSERT(db->count < db->fragTotalSize - db->fragSize * 2);
  469. /* clear pending ones */
  470. outl(VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END, 
  471.      s->io +  VRC5477_INT_CLR);
  472.         /* enable interrupts */
  473.         temp = inl(s->io + VRC5477_INT_MASK);
  474.         temp |= VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END;
  475.         outl(temp, s->io +  VRC5477_INT_MASK);
  476. /* setup dma base addr */
  477. outl(db->lbufDma + db->nextIn, s->io + VRC5477_ADC1_BADDR);
  478. outl(db->rbufDma + db->nextIn, s->io + VRC5477_ADC2_BADDR);
  479. /* setup dma length */
  480. dmaLength = db->fragSize >> 4;
  481. outl(dmaLength, s->io + VRC5477_ADC1L);
  482. outl(dmaLength, s->io + VRC5477_ADC2L);
  483. /* activate dma */
  484. outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_ADC1_CTRL);
  485. outl(VRC5477_DMA_ACTIVATION, s->io + VRC5477_ADC2_CTRL);
  486. /* enable adc slots */
  487. temp = inl(s->io + VRC5477_CTRL);
  488. temp |= (VRC5477_CTRL_ADC1ENB | VRC5477_CTRL_ADC2ENB);
  489. outl (temp, s->io + VRC5477_CTRL);
  490. /* it is time to setup next dma transfer */
  491. temp = db->nextIn + db->fragSize;
  492. if (temp >= db->fragTotalSize) {
  493. ASSERT(temp == db->fragTotalSize);
  494. temp = 0;
  495. }
  496. outl(db->lbufDma + temp, s->io + VRC5477_ADC1_BADDR);
  497. outl(db->rbufDma + temp, s->io + VRC5477_ADC2_BADDR);
  498. db->stopped = 0;
  499. spin_unlock_irqrestore(&s->lock, flags);
  500. }
  501. /* --------------------------------------------------------------------- */
  502. #define DMABUF_DEFAULTORDER (16-PAGE_SHIFT)
  503. #define DMABUF_MINORDER 1
  504. static inline void dealloc_dmabuf(struct vrc5477_ac97_state *s, 
  505.   struct dmabuf *db)
  506. {
  507. if (db->lbuf) {
  508. ASSERT(db->rbuf);
  509. pci_free_consistent(s->dev, PAGE_SIZE << db->bufOrder,
  510.     db->lbuf, db->lbufDma);
  511. pci_free_consistent(s->dev, PAGE_SIZE << db->bufOrder,
  512.     db->rbuf, db->rbufDma);
  513. db->lbuf = db->rbuf = NULL;
  514. }
  515. db->nextIn = db->nextOut = 0;
  516. db->ready = 0;
  517. }
  518. static int prog_dmabuf(struct vrc5477_ac97_state *s, 
  519.        struct dmabuf *db,
  520.        unsigned rate)
  521. {
  522. int order;
  523. unsigned bufsize;
  524. if (!db->lbuf) {
  525. ASSERT(!db->rbuf);
  526. db->ready = 0;
  527. for (order = DMABUF_DEFAULTORDER; 
  528.      order >= DMABUF_MINORDER; 
  529.      order--) {
  530. db->lbuf = pci_alloc_consistent(s->dev,
  531. PAGE_SIZE << order,
  532. &db->lbufDma);
  533. db->rbuf = pci_alloc_consistent(s->dev,
  534. PAGE_SIZE << order,
  535. &db->rbufDma);
  536. if (db->lbuf && db->rbuf) break;
  537. if (db->lbuf) {
  538.     ASSERT(!db->rbuf);
  539.     pci_free_consistent(s->dev, 
  540. PAGE_SIZE << order,
  541. db->lbuf,
  542. db->lbufDma);
  543. }
  544. }
  545. if (!db->lbuf) {
  546. ASSERT(!db->rbuf);
  547. return -ENOMEM;
  548. }
  549. db->bufOrder = order;
  550. }
  551. db->count = 0;
  552. db->nextIn = db->nextOut = 0;
  553.     
  554. bufsize = PAGE_SIZE << db->bufOrder;
  555. db->fragShift = ld2(rate * 2 / 100);
  556. if (db->fragShift < 4) db->fragShift = 4;
  557. db->numFrag = bufsize >> db->fragShift;
  558. while (db->numFrag < 4 && db->fragShift > 4) {
  559. db->fragShift--;
  560. db->numFrag = bufsize >> db->fragShift;
  561. }
  562. db->fragSize = 1 << db->fragShift;
  563. db->fragTotalSize = db->numFrag << db->fragShift;
  564. memset(db->lbuf, 0, db->fragTotalSize);
  565. memset(db->rbuf, 0, db->fragTotalSize);
  566.     
  567. db->ready = 1;
  568. return 0;
  569. }
  570. static inline int prog_dmabuf_adc(struct vrc5477_ac97_state *s)
  571. {
  572.     stop_adc(s);
  573.     return prog_dmabuf(s, &s->dma_adc, s->adcRate);
  574. }
  575. static inline int prog_dmabuf_dac(struct vrc5477_ac97_state *s)
  576. {
  577.     stop_dac(s);
  578.     return prog_dmabuf(s, &s->dma_dac, s->dacRate);
  579. }
  580. /* --------------------------------------------------------------------- */
  581. /* hold spinlock for the following! */
  582. static inline void vrc5477_ac97_adc_interrupt(struct vrc5477_ac97_state *s)
  583. {
  584. struct dmabuf* adc = &s->dma_adc;
  585. unsigned temp;
  586. /* we need two frags avaiable because one is already being used
  587.  * and the other will be used when next interrupt happens.
  588.  */
  589. if (adc->count >= adc->fragTotalSize - adc->fragSize) {
  590. stop_adc(s);
  591. adc->error++;
  592. printk(KERN_INFO PFX "adc overrunn");
  593. return;
  594. }
  595. /* set the base addr for next DMA transfer */
  596. temp = adc->nextIn + 2*adc->fragSize;
  597. if (temp >= adc->fragTotalSize) {
  598. ASSERT( (temp == adc->fragTotalSize) ||
  599.                              (temp == adc->fragTotalSize + adc->fragSize) );
  600. temp -= adc->fragTotalSize;
  601. }
  602. outl(adc->lbufDma + temp, s->io + VRC5477_ADC1_BADDR);
  603. outl(adc->rbufDma + temp, s->io + VRC5477_ADC2_BADDR);
  604. /* adjust nextIn */
  605. adc->nextIn += adc->fragSize;
  606. if (adc->nextIn >= adc->fragTotalSize) {
  607. ASSERT(adc->nextIn == adc->fragTotalSize);
  608. adc->nextIn = 0;
  609. }
  610. /* adjust count */
  611. adc->count += adc->fragSize;
  612. /* wake up anybody listening */
  613. if (waitqueue_active(&adc->wait)) {
  614. wake_up_interruptible(&adc->wait);
  615. }
  616. }
  617. static inline void vrc5477_ac97_dac_interrupt(struct vrc5477_ac97_state *s)
  618. {
  619. struct dmabuf* dac = &s->dma_dac;
  620. unsigned temp;
  621. /* next DMA transfer should already started */
  622. // ASSERT(inl(s->io + VRC5477_DAC1_CTRL) & VRC5477_DMA_WIP);
  623. // ASSERT(inl(s->io + VRC5477_DAC2_CTRL) & VRC5477_DMA_WIP);
  624. /* let us set for next next DMA transfer */
  625. temp = dac->nextOut + dac->fragSize*2;
  626. if (temp >= dac->fragTotalSize) {
  627. ASSERT( (temp == dac->fragTotalSize) || 
  628.                              (temp == dac->fragTotalSize + dac->fragSize) );
  629. temp -= dac->fragTotalSize;
  630. }
  631. outl(dac->lbufDma + temp, s->io + VRC5477_DAC1_BADDR);
  632. if (s->dacChannels == 1) {
  633. outl(dac->lbufDma + temp, s->io + VRC5477_DAC2_BADDR);
  634. } else {
  635. outl(dac->rbufDma + temp, s->io + VRC5477_DAC2_BADDR);
  636. }
  637. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  638. if (*(u16*)(dac->lbuf +  dac->nextOut) != outTicket) {
  639. printk("assert fail: - %d vs %dn", 
  640.         *(u16*)(dac->lbuf +  dac->nextOut),
  641.                         outTicket);
  642.                 ASSERT(1 == 0);
  643. }
  644. #endif
  645. /* adjust nextOut pointer */
  646. dac->nextOut += dac->fragSize;
  647. if (dac->nextOut >= dac->fragTotalSize) {
  648. ASSERT(dac->nextOut == dac->fragTotalSize);
  649. dac->nextOut = 0;
  650. }
  651. /* adjust count */
  652. dac->count -= dac->fragSize;
  653. if (dac->count <=0 ) {
  654. /* buffer under run */
  655. dac->count = 0;
  656. dac->nextIn = dac->nextOut;
  657. stop_dac(s);
  658. }
  659. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  660. if (dac->count) {
  661. outTicket ++;
  662. ASSERT(*(u16*)(dac->lbuf +  dac->nextOut) == outTicket);
  663. }
  664. #endif
  665. /* we cannot have both under run and someone is waiting on us */
  666. ASSERT(! (waitqueue_active(&dac->wait) && (dac->count <= 0)) );
  667. /* wake up anybody listening */
  668. if (waitqueue_active(&dac->wait))
  669. wake_up_interruptible(&dac->wait);
  670. }
  671. static void vrc5477_ac97_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  672. {
  673. struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)dev_id;
  674. u32 irqStatus;
  675. u32 adcInterrupts, dacInterrupts;
  676. spin_lock(&s->lock);
  677. /* get irqStatus and clear the detected ones */
  678. irqStatus = inl(s->io + VRC5477_INT_STATUS);
  679. outl(irqStatus, s->io + VRC5477_INT_CLR);
  680. /* let us see what we get */
  681. dacInterrupts = VRC5477_INT_MASK_DAC1END | VRC5477_INT_MASK_DAC2END;
  682. adcInterrupts = VRC5477_INT_MASK_ADC1END | VRC5477_INT_MASK_ADC2END;
  683. if (irqStatus & dacInterrupts) {
  684. /* we should get both interrupts, but just in case ...  */
  685. if (irqStatus & VRC5477_INT_MASK_DAC1END) {
  686. vrc5477_ac97_dac_interrupt(s);
  687. }
  688. if ( (irqStatus & dacInterrupts) != dacInterrupts ) {
  689. printk(KERN_WARNING "vrc5477_ac97 : dac interrupts not in sync!!!n");
  690. stop_dac(s);
  691. start_dac(s);
  692. }
  693. } else if (irqStatus & adcInterrupts) {
  694. /* we should get both interrupts, but just in case ...  */
  695. if(irqStatus & VRC5477_INT_MASK_ADC1END) {
  696. vrc5477_ac97_adc_interrupt(s);
  697. if ( (irqStatus & adcInterrupts) != adcInterrupts ) {
  698. printk(KERN_WARNING "vrc5477_ac97 : adc interrupts not in sync!!!n");
  699. stop_adc(s);
  700. start_adc(s);
  701. }
  702. }
  703. spin_unlock(&s->lock);
  704. }
  705. /* --------------------------------------------------------------------- */
  706. static int vrc5477_ac97_open_mixdev(struct inode *inode, struct file *file)
  707. {
  708. int minor = MINOR(inode->i_rdev);
  709. struct list_head *list;
  710. struct vrc5477_ac97_state *s;
  711. for (list = devs.next; ; list = list->next) {
  712. if (list == &devs)
  713. return -ENODEV;
  714. s = list_entry(list, struct vrc5477_ac97_state, devs);
  715. if (s->codec.dev_mixer == minor)
  716. break;
  717. }
  718. file->private_data = s;
  719. return 0;
  720. }
  721. static int vrc5477_ac97_release_mixdev(struct inode *inode, struct file *file)
  722. {
  723. return 0;
  724. }
  725. static int mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
  726. unsigned long arg)
  727. {
  728. return codec->mixer_ioctl(codec, cmd, arg);
  729. }
  730. static int vrc5477_ac97_ioctl_mixdev(struct inode *inode, struct file *file,
  731.      unsigned int cmd, unsigned long arg)
  732. {
  733.     struct vrc5477_ac97_state *s = 
  734.     (struct vrc5477_ac97_state *)file->private_data;
  735.     struct ac97_codec *codec = &s->codec;
  736.     return mixdev_ioctl(codec, cmd, arg);
  737. }
  738. static /*const*/ struct file_operations vrc5477_ac97_mixer_fops = {
  739. owner: THIS_MODULE,
  740. llseek: no_llseek,
  741. ioctl: vrc5477_ac97_ioctl_mixdev,
  742. open: vrc5477_ac97_open_mixdev,
  743. release: vrc5477_ac97_release_mixdev,
  744. };
  745. /* --------------------------------------------------------------------- */
  746. static int drain_dac(struct vrc5477_ac97_state *s, int nonblock)
  747. {
  748. unsigned long flags;
  749. int count, tmo;
  750. if (!s->dma_dac.ready)
  751. return 0;
  752. for (;;) {
  753. spin_lock_irqsave(&s->lock, flags);
  754. count = s->dma_dac.count;
  755. spin_unlock_irqrestore(&s->lock, flags);
  756. if (count <= 0)
  757. break;
  758. if (signal_pending(current))
  759. break;
  760. if (nonblock)
  761. return -EBUSY;
  762. tmo = 1000 * count / s->dacRate / 2;
  763. vrc5477_ac97_delay(tmo);
  764. }
  765. if (signal_pending(current))
  766. return -ERESTARTSYS;
  767. return 0;
  768. }
  769. /* --------------------------------------------------------------------- */
  770. static int inline 
  771. copy_two_channel_adc_to_user(struct vrc5477_ac97_state *s, 
  772.              char *buffer, 
  773.      int copyCount)
  774. {
  775. struct dmabuf *db = &s->dma_adc;
  776. int bufStart = db->nextOut;
  777. for (; copyCount > 0; ) {
  778. int i;
  779. int count = copyCount;
  780. if (count > WORK_BUF_SIZE/2) count = WORK_BUF_SIZE/2;
  781. for (i=0; i< count/2; i++) {
  782. s->workBuf[i].lchannel = 
  783. *(u16*)(db->lbuf + bufStart + i*2);
  784. s->workBuf[i].rchannel = 
  785. *(u16*)(db->rbuf + bufStart + i*2);
  786. }
  787. if (copy_to_user(buffer, s->workBuf, count*2)) {
  788. return -1;
  789. }
  790. copyCount -= count;
  791. bufStart += count;
  792. ASSERT(bufStart <= db->fragTotalSize);
  793. buffer += count *2;
  794. }
  795. return 0;
  796. }
  797. /* return the total bytes that is copied */
  798. static int inline 
  799. copy_adc_to_user(struct vrc5477_ac97_state *s,
  800.  char * buffer,
  801.  size_t count,
  802.  int avail)
  803. {
  804. struct dmabuf *db = &s->dma_adc;
  805. int copyCount=0;
  806. int copyFragCount=0;
  807. int totalCopyCount = 0;
  808. int totalCopyFragCount = 0;
  809. unsigned long flags;
  810. /* adjust count to signel channel byte count */
  811. count >>= s->adcChannels - 1;
  812. /* we may have to "copy" twice as ring buffer wraps around */
  813. for (; (avail > 0) && (count > 0); ) {
  814. /* determine max possible copy count for single channel */
  815. copyCount = count;
  816. if (copyCount > avail) {
  817. copyCount = avail;
  818. }
  819. if (copyCount + db->nextOut > db->fragTotalSize) {
  820. copyCount = db->fragTotalSize - db->nextOut;
  821. ASSERT((copyCount % db->fragSize) == 0);
  822. }
  823. copyFragCount = (copyCount-1) >> db->fragShift;
  824. copyFragCount = (copyFragCount+1) << db->fragShift;
  825. ASSERT(copyFragCount >= copyCount);
  826. /* we copy differently based on adc channels */
  827. if (s->adcChannels == 1) {
  828. if (copy_to_user(buffer, 
  829.  db->lbuf + db->nextOut, 
  830.  copyCount)) 
  831. return -1;
  832. } else {
  833. /* *sigh* we have to mix two streams into one  */
  834. if (copy_two_channel_adc_to_user(s, buffer, copyCount))
  835. return -1;
  836. }
  837. count -= copyCount;
  838. totalCopyCount += copyCount;
  839. avail -= copyFragCount;
  840. totalCopyFragCount += copyFragCount;
  841. buffer += copyCount << (s->adcChannels-1);
  842. db->nextOut += copyFragCount;
  843. if (db->nextOut >= db->fragTotalSize) {
  844. ASSERT(db->nextOut == db->fragTotalSize);
  845. db->nextOut = 0;
  846. }
  847. ASSERT((copyFragCount % db->fragSize) == 0);
  848. ASSERT( (count == 0) || (copyCount == copyFragCount));
  849. }
  850. spin_lock_irqsave(&s->lock, flags);
  851.         db->count -= totalCopyFragCount;
  852.         spin_unlock_irqrestore(&s->lock, flags);
  853. return totalCopyCount << (s->adcChannels-1);
  854. }
  855. static ssize_t 
  856. vrc5477_ac97_read(struct file *file, 
  857.   char *buffer,
  858.   size_t count, 
  859.   loff_t *ppos)
  860. {
  861. struct vrc5477_ac97_state *s = 
  862. (struct vrc5477_ac97_state *)file->private_data;
  863. struct dmabuf *db = &s->dma_adc;
  864. ssize_t ret = 0;
  865. unsigned long flags;
  866. int copyCount;
  867. size_t avail;
  868. if (ppos != &file->f_pos)
  869. return -ESPIPE;
  870. if (!access_ok(VERIFY_WRITE, buffer, count))
  871. return -EFAULT;
  872. ASSERT(db->ready);
  873. while (count > 0) {
  874. // wait for samples in capture buffer
  875. do {
  876. spin_lock_irqsave(&s->lock, flags);
  877. if (db->stopped)
  878. start_adc(s);
  879. avail = db->count;
  880. spin_unlock_irqrestore(&s->lock, flags);
  881. if (avail <= 0) {
  882. if (file->f_flags & O_NONBLOCK) {
  883. if (!ret)
  884. ret = -EAGAIN;
  885. return ret;
  886. }
  887. interruptible_sleep_on(&db->wait);
  888. if (signal_pending(current)) {
  889. if (!ret)
  890. ret = -ERESTARTSYS;
  891. return ret;
  892. }
  893. }
  894. } while (avail <= 0);
  895. ASSERT( (avail % db->fragSize) == 0);
  896. copyCount = copy_adc_to_user(s, buffer, count, avail);
  897. if (copyCount <=0 ) {
  898. if (!ret) ret = -EFAULT;
  899. return ret;
  900. }
  901. count -= copyCount;
  902. buffer += copyCount;
  903. ret += copyCount;
  904. } // while (count > 0)
  905. return ret;
  906. }
  907. static int inline 
  908. copy_two_channel_dac_from_user(struct vrc5477_ac97_state *s, 
  909.        const char *buffer, 
  910.        int copyCount)
  911. {
  912. struct dmabuf *db = &s->dma_dac;
  913. int bufStart = db->nextIn;
  914. ASSERT(db->ready);
  915.         for (; copyCount > 0; ) {
  916.                 int i;
  917.                 int count = copyCount;
  918.                 if (count > WORK_BUF_SIZE/2) count = WORK_BUF_SIZE/2;
  919.                 if (copy_from_user(s->workBuf, buffer, count*2)) {
  920.                         return -1;
  921.                 }
  922.                 for (i=0; i< count/2; i++) {
  923. *(u16*)(db->lbuf + bufStart + i*2) = 
  924. s->workBuf[i].lchannel;
  925. *(u16*)(db->rbuf + bufStart + i*2) = 
  926. s->workBuf[i].rchannel;
  927.                 }
  928.                 copyCount -= count;
  929. bufStart += count;
  930. ASSERT(bufStart <= db->fragTotalSize);
  931.                 buffer += count *2;
  932.         }
  933.         return 0;
  934. }
  935. /* return the total bytes that is copied */
  936. static int inline 
  937. copy_dac_from_user(struct vrc5477_ac97_state *s, 
  938.    const char *buffer, 
  939.    size_t count, 
  940.    int avail)
  941. {
  942.         struct dmabuf *db = &s->dma_dac;
  943.         int copyCount=0;
  944.         int copyFragCount=0;
  945.         int totalCopyCount = 0;
  946.         int totalCopyFragCount = 0;
  947.         unsigned long flags;
  948. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  949. int i;
  950. #endif
  951.         /* adjust count to signel channel byte count */
  952.         count >>= s->dacChannels - 1;
  953.         /* we may have to "copy" twice as ring buffer wraps around */
  954.         for (; (avail > 0) && (count > 0); ) {
  955.                 /* determine max possible copy count for single channel */
  956.                 copyCount = count;
  957.                 if (copyCount > avail) {
  958.                         copyCount = avail;
  959. }
  960.                 if (copyCount + db->nextIn > db->fragTotalSize) {
  961.                         copyCount = db->fragTotalSize - db->nextIn;
  962.                         ASSERT(copyCount > 0);
  963.                 }
  964. copyFragCount = copyCount;
  965. ASSERT(copyFragCount >= copyCount);
  966. /* we copy differently based on the number channels */
  967. if (s->dacChannels == 1) {
  968. if (copy_from_user(db->lbuf + db->nextIn,
  969.    buffer,
  970.    copyCount)) 
  971. return -1;
  972. /* fill gaps with 0 */
  973. memset(db->lbuf + db->nextIn + copyCount,
  974.        0,
  975.        copyFragCount - copyCount);
  976. } else {
  977. /* we have demux the stream into two separate ones */
  978. if (copy_two_channel_dac_from_user(s, buffer, copyCount))
  979. return -1;
  980. /* fill gaps with 0 */
  981. memset(db->lbuf + db->nextIn + copyCount,
  982.        0,
  983.        copyFragCount - copyCount);
  984. memset(db->rbuf + db->nextIn + copyCount,
  985.        0,
  986.        copyFragCount - copyCount);
  987. }
  988. #if defined(VRC5477_AC97_VERBOSE_DEBUG)
  989. for (i=0; i< copyFragCount; i+= db->fragSize) {
  990. *(u16*)(db->lbuf + db->nextIn + i) = inTicket ++;
  991. }
  992. #endif
  993. count -= copyCount;
  994. totalCopyCount =+ copyCount;
  995. avail -= copyFragCount;
  996. totalCopyFragCount += copyFragCount;
  997. buffer += copyCount << (s->dacChannels - 1);
  998. db->nextIn += copyFragCount;
  999. if (db->nextIn >= db->fragTotalSize) {
  1000. ASSERT(db->nextIn == db->fragTotalSize);
  1001. db->nextIn = 0;
  1002. }
  1003. ASSERT( (count == 0) || (copyCount == copyFragCount));
  1004. }
  1005. spin_lock_irqsave(&s->lock, flags);
  1006.         db->count += totalCopyFragCount;
  1007. if (db->stopped) {
  1008. start_dac(s);
  1009. }
  1010. /* nextIn should not be equal to nextOut unless we are full */
  1011. ASSERT( ( (db->count == db->fragTotalSize) && 
  1012.                        (db->nextIn == db->nextOut) ) ||
  1013.                      ( (db->count < db->fragTotalSize) &&
  1014.                        (db->nextIn != db->nextOut) ) );
  1015.         spin_unlock_irqrestore(&s->lock, flags);
  1016.         return totalCopyCount << (s->dacChannels-1);
  1017. }
  1018. static ssize_t vrc5477_ac97_write(struct file *file, const char *buffer,
  1019.   size_t count, loff_t *ppos)
  1020. {
  1021. struct vrc5477_ac97_state *s = 
  1022. (struct vrc5477_ac97_state *)file->private_data;
  1023. struct dmabuf *db = &s->dma_dac;
  1024. ssize_t ret;
  1025. unsigned long flags;
  1026. int copyCount, avail;
  1027. if (ppos != &file->f_pos)
  1028. return -ESPIPE;
  1029. if (!access_ok(VERIFY_READ, buffer, count))
  1030. return -EFAULT;
  1031. ret = 0;
  1032.     
  1033. while (count > 0) {
  1034. // wait for space in playback buffer
  1035. do {
  1036. spin_lock_irqsave(&s->lock, flags);
  1037. avail = db->fragTotalSize - db->count;
  1038. spin_unlock_irqrestore(&s->lock, flags);
  1039. if (avail <= 0) {
  1040. if (file->f_flags & O_NONBLOCK) {
  1041. if (!ret)
  1042. ret = -EAGAIN;
  1043. return ret;
  1044. }
  1045. interruptible_sleep_on(&db->wait);
  1046. if (signal_pending(current)) {
  1047. if (!ret)
  1048. ret = -ERESTARTSYS;
  1049. return ret;
  1050. }
  1051. }
  1052. } while (avail <= 0);
  1053. copyCount = copy_dac_from_user(s, buffer, count, avail);
  1054. if (copyCount < 0) {
  1055. if (!ret) ret = -EFAULT;
  1056. return ret;
  1057. }
  1058. count -= copyCount;
  1059. buffer += copyCount;
  1060. ret += copyCount;
  1061. } // while (count > 0)
  1062. return ret;
  1063. }
  1064. /* No kernel lock - we have our own spinlock */
  1065. static unsigned int vrc5477_ac97_poll(struct file *file,
  1066.       struct poll_table_struct *wait)
  1067. {
  1068. struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)file->private_data;
  1069. unsigned long flags;
  1070. unsigned int mask = 0;
  1071. if (file->f_mode & FMODE_WRITE)
  1072. poll_wait(file, &s->dma_dac.wait, wait);
  1073. if (file->f_mode & FMODE_READ)
  1074. poll_wait(file, &s->dma_adc.wait, wait);
  1075. spin_lock_irqsave(&s->lock, flags);
  1076. if (file->f_mode & FMODE_READ) {
  1077. if (s->dma_adc.count >= (signed)s->dma_adc.fragSize)
  1078. mask |= POLLIN | POLLRDNORM;
  1079. }
  1080. if (file->f_mode & FMODE_WRITE) {
  1081. if ((signed)s->dma_dac.fragTotalSize >=
  1082.     s->dma_dac.count + (signed)s->dma_dac.fragSize)
  1083. mask |= POLLOUT | POLLWRNORM;
  1084. }
  1085. spin_unlock_irqrestore(&s->lock, flags);
  1086. return mask;
  1087. }
  1088. #ifdef VRC5477_AC97_DEBUG
  1089. static struct ioctl_str_t {
  1090.     unsigned int cmd;
  1091.     const char* str;
  1092. } ioctl_str[] = {
  1093.     {SNDCTL_DSP_RESET, "SNDCTL_DSP_RESET"},
  1094.     {SNDCTL_DSP_SYNC, "SNDCTL_DSP_SYNC"},
  1095.     {SNDCTL_DSP_SPEED, "SNDCTL_DSP_SPEED"},
  1096.     {SNDCTL_DSP_STEREO, "SNDCTL_DSP_STEREO"},
  1097.     {SNDCTL_DSP_GETBLKSIZE, "SNDCTL_DSP_GETBLKSIZE"},
  1098.     {SNDCTL_DSP_SETFMT, "SNDCTL_DSP_SETFMT"},
  1099.     {SNDCTL_DSP_SAMPLESIZE, "SNDCTL_DSP_SAMPLESIZE"},
  1100.     {SNDCTL_DSP_CHANNELS, "SNDCTL_DSP_CHANNELS"},
  1101.     {SOUND_PCM_WRITE_CHANNELS, "SOUND_PCM_WRITE_CHANNELS"},
  1102.     {SOUND_PCM_WRITE_FILTER, "SOUND_PCM_WRITE_FILTER"},
  1103.     {SNDCTL_DSP_POST, "SNDCTL_DSP_POST"},
  1104.     {SNDCTL_DSP_SUBDIVIDE, "SNDCTL_DSP_SUBDIVIDE"},
  1105.     {SNDCTL_DSP_SETFRAGMENT, "SNDCTL_DSP_SETFRAGMENT"},
  1106.     {SNDCTL_DSP_GETFMTS, "SNDCTL_DSP_GETFMTS"},
  1107.     {SNDCTL_DSP_GETOSPACE, "SNDCTL_DSP_GETOSPACE"},
  1108.     {SNDCTL_DSP_GETISPACE, "SNDCTL_DSP_GETISPACE"},
  1109.     {SNDCTL_DSP_NONBLOCK, "SNDCTL_DSP_NONBLOCK"},
  1110.     {SNDCTL_DSP_GETCAPS, "SNDCTL_DSP_GETCAPS"},
  1111.     {SNDCTL_DSP_GETTRIGGER, "SNDCTL_DSP_GETTRIGGER"},
  1112.     {SNDCTL_DSP_SETTRIGGER, "SNDCTL_DSP_SETTRIGGER"},
  1113.     {SNDCTL_DSP_GETIPTR, "SNDCTL_DSP_GETIPTR"},
  1114.     {SNDCTL_DSP_GETOPTR, "SNDCTL_DSP_GETOPTR"},
  1115.     {SNDCTL_DSP_MAPINBUF, "SNDCTL_DSP_MAPINBUF"},
  1116.     {SNDCTL_DSP_MAPOUTBUF, "SNDCTL_DSP_MAPOUTBUF"},
  1117.     {SNDCTL_DSP_SETSYNCRO, "SNDCTL_DSP_SETSYNCRO"},
  1118.     {SNDCTL_DSP_SETDUPLEX, "SNDCTL_DSP_SETDUPLEX"},
  1119.     {SNDCTL_DSP_GETODELAY, "SNDCTL_DSP_GETODELAY"},
  1120.     {SNDCTL_DSP_GETCHANNELMASK, "SNDCTL_DSP_GETCHANNELMASK"},
  1121.     {SNDCTL_DSP_BIND_CHANNEL, "SNDCTL_DSP_BIND_CHANNEL"},
  1122.     {OSS_GETVERSION, "OSS_GETVERSION"},
  1123.     {SOUND_PCM_READ_RATE, "SOUND_PCM_READ_RATE"},
  1124.     {SOUND_PCM_READ_CHANNELS, "SOUND_PCM_READ_CHANNELS"},
  1125.     {SOUND_PCM_READ_BITS, "SOUND_PCM_READ_BITS"},
  1126.     {SOUND_PCM_READ_FILTER, "SOUND_PCM_READ_FILTER"}
  1127. };
  1128. #endif    
  1129. static int vrc5477_ac97_ioctl(struct inode *inode, struct file *file,
  1130. unsigned int cmd, unsigned long arg)
  1131. {
  1132. struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)file->private_data;
  1133. unsigned long flags;
  1134. audio_buf_info abinfo;
  1135. int count;
  1136. int val, ret;
  1137. #ifdef VRC5477_AC97_DEBUG
  1138. for (count=0; count<sizeof(ioctl_str)/sizeof(ioctl_str[0]); count++) {
  1139. if (ioctl_str[count].cmd == cmd)
  1140. break;
  1141. }
  1142. if (count < sizeof(ioctl_str)/sizeof(ioctl_str[0]))
  1143. printk(KERN_INFO PFX "ioctl %sn", ioctl_str[count].str);
  1144. else
  1145. printk(KERN_INFO PFX "ioctl unknown, 0x%xn", cmd);
  1146. #endif
  1147.     
  1148. switch (cmd) {
  1149. case OSS_GETVERSION:
  1150. return put_user(SOUND_VERSION, (int *)arg);
  1151. case SNDCTL_DSP_SYNC:
  1152. if (file->f_mode & FMODE_WRITE)
  1153. return drain_dac(s, file->f_flags & O_NONBLOCK);
  1154. return 0;
  1155. case SNDCTL_DSP_SETDUPLEX:
  1156. return 0;
  1157. case SNDCTL_DSP_GETCAPS:
  1158. return put_user(DSP_CAP_DUPLEX, (int *)arg);
  1159. case SNDCTL_DSP_RESET:
  1160. if (file->f_mode & FMODE_WRITE) {
  1161. stop_dac(s);
  1162. synchronize_irq();
  1163. s->dma_dac.count = 0;
  1164. s->dma_dac.nextIn = s->dma_dac.nextOut = 0;
  1165. }
  1166. if (file->f_mode & FMODE_READ) {
  1167. stop_adc(s);
  1168. synchronize_irq();
  1169. s->dma_adc.count = 0;
  1170. s->dma_adc.nextIn = s->dma_adc.nextOut = 0;
  1171. }
  1172. return 0;
  1173. case SNDCTL_DSP_SPEED:
  1174. if (get_user(val, (int *)arg))
  1175. return -EFAULT;
  1176. if (val >= 0) {
  1177. if (file->f_mode & FMODE_READ) {
  1178. stop_adc(s);
  1179. set_adc_rate(s, val);
  1180. if ((ret = prog_dmabuf_adc(s)))
  1181. return ret;
  1182. }
  1183. if (file->f_mode & FMODE_WRITE) {
  1184. stop_dac(s);
  1185. set_dac_rate(s, val);
  1186. if ((ret = prog_dmabuf_dac(s)))
  1187. return ret;
  1188. }
  1189. }
  1190. return put_user((file->f_mode & FMODE_READ) ?
  1191. s->adcRate : s->dacRate, (int *)arg);
  1192. case SNDCTL_DSP_STEREO:
  1193. if (get_user(val, (int *)arg))
  1194. return -EFAULT;
  1195. if (file->f_mode & FMODE_READ) {
  1196. stop_adc(s);
  1197. if (val)
  1198. s->adcChannels = 2;
  1199. else
  1200. s->adcChannels = 1;
  1201. if ((ret = prog_dmabuf_adc(s)))
  1202. return ret;
  1203. }
  1204. if (file->f_mode & FMODE_WRITE) {
  1205. stop_dac(s);
  1206. if (val)
  1207. s->dacChannels = 2;
  1208. else
  1209. s->dacChannels = 1;
  1210. if ((ret = prog_dmabuf_dac(s)))
  1211. return ret;
  1212. }
  1213. return 0;
  1214. case SNDCTL_DSP_CHANNELS:
  1215. if (get_user(val, (int *)arg))
  1216. return -EFAULT;
  1217. if (val != 0) {
  1218. if ( (val != 1) && (val != 2)) val = 2;
  1219. if (file->f_mode & FMODE_READ) {
  1220. stop_adc(s);
  1221. s->dacChannels = val;
  1222. if ((ret = prog_dmabuf_adc(s)))
  1223. return ret;
  1224. }
  1225. if (file->f_mode & FMODE_WRITE) {
  1226. stop_dac(s);
  1227. s->dacChannels = val;
  1228. if ((ret = prog_dmabuf_dac(s)))
  1229. return ret;
  1230. }
  1231. }
  1232. return put_user(val, (int *)arg);
  1233. case SNDCTL_DSP_GETFMTS: /* Returns a mask */
  1234. return put_user(AFMT_S16_LE, (int *)arg);
  1235. case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
  1236. if (get_user(val, (int *)arg))
  1237. return -EFAULT;
  1238. if (val != AFMT_QUERY) {
  1239. if (val != AFMT_S16_LE) return -EINVAL;
  1240. if (file->f_mode & FMODE_READ) {
  1241. stop_adc(s);
  1242. if ((ret = prog_dmabuf_adc(s)))
  1243. return ret;
  1244. }
  1245. if (file->f_mode & FMODE_WRITE) {
  1246. stop_dac(s);
  1247. if ((ret = prog_dmabuf_dac(s)))
  1248. return ret;
  1249. }
  1250. } else {
  1251. val = AFMT_S16_LE;
  1252. }
  1253. return put_user(val, (int *)arg);
  1254. case SNDCTL_DSP_POST:
  1255. return 0;
  1256. case SNDCTL_DSP_GETTRIGGER:
  1257. case SNDCTL_DSP_SETTRIGGER:
  1258. /* NO trigger */
  1259. return -EINVAL;
  1260. case SNDCTL_DSP_GETOSPACE:
  1261. if (!(file->f_mode & FMODE_WRITE))
  1262. return -EINVAL;
  1263. abinfo.fragsize = s->dma_dac.fragSize << (s->dacChannels-1);
  1264. spin_lock_irqsave(&s->lock, flags);
  1265. count = s->dma_dac.count;
  1266. spin_unlock_irqrestore(&s->lock, flags);
  1267. abinfo.bytes = (s->dma_dac.fragTotalSize - count) << 
  1268. (s->dacChannels-1);
  1269. abinfo.fragstotal = s->dma_dac.numFrag;
  1270. abinfo.fragments = abinfo.bytes >> s->dma_dac.fragShift >> 
  1271. (s->dacChannels-1);      
  1272. return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  1273. case SNDCTL_DSP_GETISPACE:
  1274. if (!(file->f_mode & FMODE_READ))
  1275. return -EINVAL;
  1276. abinfo.fragsize = s->dma_adc.fragSize << (s->adcChannels-1);
  1277. spin_lock_irqsave(&s->lock, flags);
  1278. count = s->dma_adc.count;
  1279. spin_unlock_irqrestore(&s->lock, flags);
  1280. if (count < 0)
  1281. count = 0;
  1282. abinfo.bytes = count << (s->adcChannels-1);
  1283. abinfo.fragstotal = s->dma_adc.numFrag;
  1284. abinfo.fragments = (abinfo.bytes >> s->dma_adc.fragShift) >>
  1285. (s->adcChannels-1);      
  1286. return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  1287. case SNDCTL_DSP_NONBLOCK:
  1288. file->f_flags |= O_NONBLOCK;
  1289. return 0;
  1290. case SNDCTL_DSP_GETODELAY:
  1291. if (!(file->f_mode & FMODE_WRITE))
  1292. return -EINVAL;
  1293. spin_lock_irqsave(&s->lock, flags);
  1294. count = s->dma_dac.count;
  1295. spin_unlock_irqrestore(&s->lock, flags);
  1296. return put_user(count, (int *)arg);
  1297. case SNDCTL_DSP_GETIPTR:
  1298. case SNDCTL_DSP_GETOPTR:
  1299. /* we cannot get DMA ptr */
  1300. return -EINVAL;
  1301. case SNDCTL_DSP_GETBLKSIZE:
  1302. if (file->f_mode & FMODE_WRITE)
  1303. return put_user(s->dma_dac.fragSize << (s->dacChannels-1), (int *)arg);
  1304. else
  1305. return put_user(s->dma_adc.fragSize << (s->adcChannels-1), (int *)arg);
  1306. case SNDCTL_DSP_SETFRAGMENT:
  1307. /* we ignore fragment size request */
  1308. return 0;
  1309. case SNDCTL_DSP_SUBDIVIDE:
  1310. /* what is this for? [jsun] */
  1311. return 0;
  1312. case SOUND_PCM_READ_RATE:
  1313. return put_user((file->f_mode & FMODE_READ) ?
  1314. s->adcRate : s->dacRate, (int *)arg);
  1315. case SOUND_PCM_READ_CHANNELS:
  1316. if (file->f_mode & FMODE_READ)
  1317. return put_user(s->adcChannels, (int *)arg);
  1318. else
  1319. return put_user(s->dacChannels ? 2 : 1, (int *)arg);
  1320.     
  1321. case SOUND_PCM_READ_BITS:
  1322. return put_user(16, (int *)arg);
  1323. case SOUND_PCM_WRITE_FILTER:
  1324. case SNDCTL_DSP_SETSYNCRO:
  1325. case SOUND_PCM_READ_FILTER:
  1326. return -EINVAL;
  1327. }
  1328. return mixdev_ioctl(&s->codec, cmd, arg);
  1329. }
  1330. static int vrc5477_ac97_open(struct inode *inode, struct file *file)
  1331. {
  1332. int minor = MINOR(inode->i_rdev);
  1333. DECLARE_WAITQUEUE(wait, current);
  1334. unsigned long flags;
  1335. struct list_head *list;
  1336. struct vrc5477_ac97_state *s;
  1337. int ret=0;
  1338.     
  1339. for (list = devs.next; ; list = list->next) {
  1340. if (list == &devs)
  1341. return -ENODEV;
  1342. s = list_entry(list, struct vrc5477_ac97_state, devs);
  1343. if (!((s->dev_audio ^ minor) & ~0xf))
  1344. break;
  1345. }
  1346. file->private_data = s;
  1347. /* wait for device to become free */
  1348. down(&s->open_sem);
  1349. while (s->open_mode & file->f_mode) {
  1350. if (file->f_flags & O_NONBLOCK) {
  1351. up(&s->open_sem);
  1352. return -EBUSY;
  1353. }
  1354. add_wait_queue(&s->open_wait, &wait);
  1355. __set_current_state(TASK_INTERRUPTIBLE);
  1356. up(&s->open_sem);
  1357. schedule();
  1358. remove_wait_queue(&s->open_wait, &wait);
  1359. set_current_state(TASK_RUNNING);
  1360. if (signal_pending(current))
  1361. return -ERESTARTSYS;
  1362. down(&s->open_sem);
  1363. }
  1364. spin_lock_irqsave(&s->lock, flags);
  1365. if (file->f_mode & FMODE_READ) {
  1366. /* set default settings */
  1367. set_adc_rate(s, 48000);
  1368. s->adcChannels = 2;
  1369. ret = prog_dmabuf_adc(s);
  1370. if (ret) goto bailout;
  1371. }
  1372. if (file->f_mode & FMODE_WRITE) {
  1373. /* set default settings */
  1374. set_dac_rate(s, 48000);
  1375. s->dacChannels = 2;
  1376. ret = prog_dmabuf_dac(s);
  1377. if (ret) goto bailout;
  1378. }
  1379. s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
  1380.  bailout:
  1381. spin_unlock_irqrestore(&s->lock, flags);
  1382. up(&s->open_sem);
  1383. return ret;
  1384. }
  1385. static int vrc5477_ac97_release(struct inode *inode, struct file *file)
  1386. {
  1387. struct vrc5477_ac97_state *s = 
  1388. (struct vrc5477_ac97_state *)file->private_data;
  1389. lock_kernel();
  1390. if (file->f_mode & FMODE_WRITE)
  1391. drain_dac(s, file->f_flags & O_NONBLOCK);
  1392. down(&s->open_sem);
  1393. if (file->f_mode & FMODE_WRITE) {
  1394. stop_dac(s);
  1395. dealloc_dmabuf(s, &s->dma_dac);
  1396. }
  1397. if (file->f_mode & FMODE_READ) {
  1398. stop_adc(s);
  1399. dealloc_dmabuf(s, &s->dma_adc);
  1400. }
  1401. s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
  1402. up(&s->open_sem);
  1403. wake_up(&s->open_wait);
  1404. unlock_kernel();
  1405. return 0;
  1406. }
  1407. static /*const*/ struct file_operations vrc5477_ac97_audio_fops = {
  1408. owner: THIS_MODULE,
  1409. llseek: no_llseek,
  1410. read: vrc5477_ac97_read,
  1411. write: vrc5477_ac97_write,
  1412. poll: vrc5477_ac97_poll,
  1413. ioctl: vrc5477_ac97_ioctl,
  1414. // mmap: vrc5477_ac97_mmap,
  1415. open: vrc5477_ac97_open,
  1416. release: vrc5477_ac97_release,
  1417. };
  1418. /* --------------------------------------------------------------------- */
  1419. /* --------------------------------------------------------------------- */
  1420. /*
  1421.  * for debugging purposes, we'll create a proc device that dumps the
  1422.  * CODEC chipstate
  1423.  */
  1424. #ifdef VRC5477_AC97_DEBUG
  1425. struct {
  1426.        const char *regname;
  1427.        unsigned regaddr;
  1428. } vrc5477_ac97_regs[] = {
  1429. {"VRC5477_INT_STATUS", VRC5477_INT_STATUS},
  1430. {"VRC5477_CODEC_WR", VRC5477_CODEC_WR},
  1431. {"VRC5477_CODEC_RD", VRC5477_CODEC_RD},
  1432. {"VRC5477_CTRL", VRC5477_CTRL},
  1433. {"VRC5477_ACLINK_CTRL", VRC5477_ACLINK_CTRL},
  1434. {"VRC5477_INT_MASK", VRC5477_INT_MASK},
  1435. {"VRC5477_DAC1_CTRL", VRC5477_DAC1_CTRL},
  1436. {"VRC5477_DAC1L", VRC5477_DAC1L},
  1437. {"VRC5477_DAC1_BADDR", VRC5477_DAC1_BADDR},
  1438. {"VRC5477_DAC2_CTRL", VRC5477_DAC2_CTRL},
  1439. {"VRC5477_DAC2L", VRC5477_DAC2L},
  1440. {"VRC5477_DAC2_BADDR", VRC5477_DAC2_BADDR},
  1441. {"VRC5477_DAC3_CTRL", VRC5477_DAC3_CTRL},
  1442. {"VRC5477_DAC3L", VRC5477_DAC3L},
  1443. {"VRC5477_DAC3_BADDR", VRC5477_DAC3_BADDR},
  1444. {"VRC5477_ADC1_CTRL", VRC5477_ADC1_CTRL},
  1445. {"VRC5477_ADC1L", VRC5477_ADC1L},
  1446. {"VRC5477_ADC1_BADDR", VRC5477_ADC1_BADDR},
  1447. {"VRC5477_ADC2_CTRL", VRC5477_ADC2_CTRL},
  1448. {"VRC5477_ADC2L", VRC5477_ADC2L},
  1449. {"VRC5477_ADC2_BADDR", VRC5477_ADC2_BADDR},
  1450. {"VRC5477_ADC3_CTRL", VRC5477_ADC3_CTRL},
  1451. {"VRC5477_ADC3L", VRC5477_ADC3L},
  1452. {"VRC5477_ADC3_BADDR", VRC5477_ADC3_BADDR},
  1453. {NULL, 0x0}
  1454. };
  1455. static int proc_vrc5477_ac97_dump (char *buf, char **start, off_t fpos,
  1456.    int length, int *eof, void *data)
  1457. {
  1458. struct vrc5477_ac97_state *s;
  1459. int cnt, len = 0;
  1460. if (list_empty(&devs))
  1461. return 0;
  1462. s = list_entry(devs.next, struct vrc5477_ac97_state, devs);
  1463. /* print out header */
  1464. len += sprintf(buf + len, "nttVrc5477 Audio Debugnn");
  1465. // print out digital controller state
  1466. len += sprintf (buf + len, "NEC Vrc5477 Audio Controller registersn");
  1467. len += sprintf (buf + len, "---------------------------------n");
  1468. for (cnt=0; vrc5477_ac97_regs[cnt].regname != NULL; cnt++) {
  1469. len+= sprintf (buf + len, "%-20s = %08xn",
  1470.        vrc5477_ac97_regs[cnt].regname,
  1471.        inl(s->io + vrc5477_ac97_regs[cnt].regaddr));
  1472. }
  1473.    
  1474. /* print out driver state */
  1475. len += sprintf (buf + len, "NEC Vrc5477 Audio driver statesn");
  1476. len += sprintf (buf + len, "---------------------------------n");
  1477. len += sprintf (buf + len, "dacChannels  = %dn", s->dacChannels);
  1478. len += sprintf (buf + len, "adcChannels  = %dn", s->adcChannels);
  1479. len += sprintf (buf + len, "dacRate  = %dn", s->dacRate);
  1480. len += sprintf (buf + len, "adcRate  = %dn", s->adcRate);
  1481. len += sprintf (buf + len, "dma_dac is %s readyn",  
  1482.                 s->dma_dac.ready? "" : "not");
  1483.         if (s->dma_dac.ready) {
  1484. len += sprintf (buf + len, "dma_dac is %s stopped.n",  
  1485.                         s->dma_dac.stopped? "" : "not");
  1486. len += sprintf (buf + len, "dma_dac.fragSize = %xn", 
  1487.                                 s->dma_dac.fragSize);
  1488. len += sprintf (buf + len, "dma_dac.fragShift = %xn", 
  1489.                                 s->dma_dac.fragShift);
  1490. len += sprintf (buf + len, "dma_dac.numFrag = %xn", 
  1491.                                 s->dma_dac.numFrag);
  1492. len += sprintf (buf + len, "dma_dac.fragTotalSize = %xn", 
  1493.                                 s->dma_dac.fragTotalSize);
  1494. len += sprintf (buf + len, "dma_dac.nextIn = %xn", 
  1495.                                 s->dma_dac.nextIn);
  1496. len += sprintf (buf + len, "dma_dac.nextOut = %xn", 
  1497.                                 s->dma_dac.nextOut);
  1498. len += sprintf (buf + len, "dma_dac.count = %xn", 
  1499.                                 s->dma_dac.count);
  1500. }
  1501. len += sprintf (buf + len, "dma_adc is %s readyn",  
  1502.                 s->dma_adc.ready? "" : "not");
  1503.         if (s->dma_adc.ready) {
  1504. len += sprintf (buf + len, "dma_adc is %s stopped.n",  
  1505.                         s->dma_adc.stopped? "" : "not");
  1506. len += sprintf (buf + len, "dma_adc.fragSize = %xn", 
  1507.                                 s->dma_adc.fragSize);
  1508. len += sprintf (buf + len, "dma_adc.fragShift = %xn", 
  1509.                                 s->dma_adc.fragShift);
  1510. len += sprintf (buf + len, "dma_adc.numFrag = %xn", 
  1511.                                 s->dma_adc.numFrag);
  1512. len += sprintf (buf + len, "dma_adc.fragTotalSize = %xn", 
  1513.                                 s->dma_adc.fragTotalSize);
  1514. len += sprintf (buf + len, "dma_adc.nextIn = %xn", 
  1515.                                 s->dma_adc.nextIn);
  1516. len += sprintf (buf + len, "dma_adc.nextOut = %xn", 
  1517.                                 s->dma_adc.nextOut);
  1518. len += sprintf (buf + len, "dma_adc.count = %xn", 
  1519.                                 s->dma_adc.count);
  1520. }
  1521.  
  1522. /* print out CODEC state */
  1523. len += sprintf (buf + len, "nAC97 CODEC registersn");
  1524. len += sprintf (buf + len, "----------------------n");
  1525. for (cnt=0; cnt <= 0x7e; cnt = cnt +2)
  1526. len+= sprintf (buf + len, "reg %02x = %04xn",
  1527.        cnt, rdcodec(&s->codec, cnt));
  1528. if (fpos >=len){
  1529. *start = buf;
  1530. *eof =1;
  1531. return 0;
  1532. }
  1533. *start = buf + fpos;
  1534. if ((len -= fpos) > length)
  1535. return length;
  1536. *eof =1;
  1537. return len;
  1538. }
  1539. #endif /* VRC5477_AC97_DEBUG */
  1540. /* --------------------------------------------------------------------- */
  1541. /* maximum number of devices; only used for command line params */
  1542. #define NR_DEVICE 5
  1543. static unsigned int devindex = 0;
  1544. MODULE_AUTHOR("Monta Vista Software, jsun@mvista.com or jsun@junsun.net");
  1545. MODULE_DESCRIPTION("NEC Vrc5477 audio (AC97) Driver");
  1546. MODULE_LICENSE("GPL");
  1547. static int __devinit vrc5477_ac97_probe(struct pci_dev *pcidev,
  1548. const struct pci_device_id *pciid)
  1549. {
  1550. struct vrc5477_ac97_state *s;
  1551. #ifdef VRC5477_AC97_DEBUG
  1552. char proc_str[80];
  1553. #endif
  1554. if (pcidev->irq == 0) 
  1555. return -1;
  1556. if (!(s = kmalloc(sizeof(struct vrc5477_ac97_state), GFP_KERNEL))) {
  1557. printk(KERN_ERR PFX "alloc of device struct failedn");
  1558. return -1;
  1559. }
  1560. memset(s, 0, sizeof(struct vrc5477_ac97_state));
  1561. init_waitqueue_head(&s->dma_adc.wait);
  1562. init_waitqueue_head(&s->dma_dac.wait);
  1563. init_waitqueue_head(&s->open_wait);
  1564. init_MUTEX(&s->open_sem);
  1565. spin_lock_init(&s->lock);
  1566. s->dev = pcidev;
  1567. s->io = pci_resource_start(pcidev, 0);
  1568. s->irq = pcidev->irq;
  1569. s->codec.private_data = s;
  1570. s->codec.id = 0;
  1571. s->codec.codec_read = rdcodec;
  1572. s->codec.codec_write = wrcodec;
  1573. s->codec.codec_wait = waitcodec;
  1574. /* setting some other default values such as
  1575.  * adcChannels, adcRate is done in open() so that
  1576.          * no persistent state across file opens.
  1577.  */
  1578. /* test if get response from ac97, if not return */
  1579.         if (ac97_codec_not_present(&(s->codec))) {
  1580. printk(KERN_ERR PFX "no ac97 codecn");
  1581. goto err_region;
  1582.         }
  1583. if (!request_region(s->io, pci_resource_len(pcidev,0),
  1584.     VRC5477_AC97_MODULE_NAME)) {
  1585. printk(KERN_ERR PFX "io ports %#lx->%#lx in usen",
  1586.        s->io, s->io + pci_resource_len(pcidev,0)-1);
  1587. goto err_region;
  1588. }
  1589. if (request_irq(s->irq, vrc5477_ac97_interrupt, SA_INTERRUPT,
  1590. VRC5477_AC97_MODULE_NAME, s)) {
  1591. printk(KERN_ERR PFX "irq %u in usen", s->irq);
  1592. goto err_irq;
  1593. }
  1594. printk(KERN_INFO PFX "IO at %#lx, IRQ %dn", s->io, s->irq);
  1595. /* register devices */
  1596. if ((s->dev_audio = register_sound_dsp(&vrc5477_ac97_audio_fops, -1)) < 0)
  1597. goto err_dev1;
  1598. if ((s->codec.dev_mixer =
  1599.      register_sound_mixer(&vrc5477_ac97_mixer_fops, -1)) < 0)
  1600. goto err_dev2;
  1601. #ifdef VRC5477_AC97_DEBUG
  1602. /* intialize the debug proc device */
  1603. s->ps = create_proc_read_entry(VRC5477_AC97_MODULE_NAME, 0, NULL,
  1604.        proc_vrc5477_ac97_dump, NULL);
  1605. #endif /* VRC5477_AC97_DEBUG */
  1606. /* enable pci io and bus mastering */
  1607. if (pci_enable_device(pcidev))
  1608. goto err_dev3;
  1609. pci_set_master(pcidev);
  1610. /* cold reset the AC97 */
  1611. outl(VRC5477_ACLINK_CTRL_RST_ON | VRC5477_ACLINK_CTRL_RST_TIME,
  1612.      s->io + VRC5477_ACLINK_CTRL);
  1613. while (inl(s->io + VRC5477_ACLINK_CTRL) & VRC5477_ACLINK_CTRL_RST_ON);
  1614. /* codec init */
  1615. if (!ac97_probe_codec(&s->codec))
  1616. goto err_dev3;
  1617. #ifdef VRC5477_AC97_DEBUG
  1618. sprintf(proc_str, "driver/%s/%d/ac97", 
  1619. VRC5477_AC97_MODULE_NAME, s->codec.id);
  1620. s->ac97_ps = create_proc_read_entry (proc_str, 0, NULL,
  1621.      ac97_read_proc, &s->codec);
  1622. /* TODO : why this proc file does not show up? */
  1623. #endif
  1624. /* Try to enable variable rate audio mode. */
  1625. wrcodec(&s->codec, AC97_EXTENDED_STATUS,
  1626. rdcodec(&s->codec, AC97_EXTENDED_STATUS) | AC97_EXTSTAT_VRA);
  1627. /* Did we enable it? */
  1628. if(rdcodec(&s->codec, AC97_EXTENDED_STATUS) & AC97_EXTSTAT_VRA)
  1629. s->extended_status |= AC97_EXTSTAT_VRA;
  1630. else {
  1631. s->dacRate = 48000;
  1632. printk(KERN_INFO PFX "VRA mode not enabled; rate fixed at %d.",
  1633. s->dacRate);
  1634. }
  1635.         /* let us get the default volumne louder */
  1636.         wrcodec(&s->codec, 0x2, 0x1010); /* master volume, middle */
  1637.         wrcodec(&s->codec, 0xc, 0x10); /* phone volume, middle */
  1638.         // wrcodec(&s->codec, 0xe, 0x10); /* misc volume, middle */
  1639. wrcodec(&s->codec, 0x10, 0x8000); /* line-in 2 line-out disable */
  1640.         wrcodec(&s->codec, 0x18, 0x0707); /* PCM out (line out) middle */
  1641. /* by default we select line in the input */
  1642. wrcodec(&s->codec, 0x1a, 0x0404);
  1643. wrcodec(&s->codec, 0x1c, 0x0f0f);
  1644. wrcodec(&s->codec, 0x1e, 0x07);
  1645. /* enable the master interrupt but disable all others */
  1646. outl(VRC5477_INT_MASK_NMASK, s->io + VRC5477_INT_MASK);
  1647. /* store it in the driver field */
  1648. pci_set_drvdata(pcidev, s);
  1649. pcidev->dma_mask = 0xffffffff;
  1650. /* put it into driver list */
  1651. list_add_tail(&s->devs, &devs);
  1652. /* increment devindex */
  1653. if (devindex < NR_DEVICE-1)
  1654. devindex++;
  1655. return 0;
  1656.  err_dev3:
  1657. unregister_sound_mixer(s->codec.dev_mixer);
  1658.  err_dev2:
  1659. unregister_sound_dsp(s->dev_audio);
  1660.  err_dev1:
  1661. printk(KERN_ERR PFX "cannot register misc devicen");
  1662. free_irq(s->irq, s);
  1663.  err_irq:
  1664. release_region(s->io, pci_resource_len(pcidev,0));
  1665.  err_region:
  1666. kfree(s);
  1667. return -1;
  1668. }
  1669. static void __devinit vrc5477_ac97_remove(struct pci_dev *dev)
  1670. {
  1671. struct vrc5477_ac97_state *s = pci_get_drvdata(dev);
  1672. if (!s)
  1673. return;
  1674. list_del(&s->devs);
  1675. #ifdef VRC5477_AC97_DEBUG
  1676. if (s->ps)
  1677. remove_proc_entry(VRC5477_AC97_MODULE_NAME, NULL);
  1678. #endif /* VRC5477_AC97_DEBUG */
  1679. synchronize_irq();
  1680. free_irq(s->irq, s);
  1681. release_region(s->io, pci_resource_len(dev,0));
  1682. unregister_sound_dsp(s->dev_audio);
  1683. unregister_sound_mixer(s->codec.dev_mixer);
  1684. kfree(s);
  1685. pci_set_drvdata(dev, NULL);
  1686. }
  1687. static struct pci_device_id id_table[] __devinitdata = {
  1688.     { PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_VRC5477_AC97, 
  1689.       PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
  1690.     { 0, }
  1691. };
  1692. MODULE_DEVICE_TABLE(pci, id_table);
  1693. static struct pci_driver vrc5477_ac97_driver = {
  1694. name: VRC5477_AC97_MODULE_NAME,
  1695. id_table: id_table,
  1696. probe: vrc5477_ac97_probe,
  1697. remove: vrc5477_ac97_remove
  1698. };
  1699. static int __init init_vrc5477_ac97(void)
  1700. {
  1701. if (!pci_present())   /* No PCI bus in this machine! */
  1702. return -ENODEV;
  1703. printk("Vrc5477 AC97 driver: version v0.2 time " __TIME__ " " __DATE__ " by Jun Sunn");
  1704. return pci_module_init(&vrc5477_ac97_driver);
  1705. }
  1706. static void __exit cleanup_vrc5477_ac97(void)
  1707. {
  1708. printk(KERN_INFO PFX "unloadingn");
  1709. pci_unregister_driver(&vrc5477_ac97_driver);
  1710. }
  1711. module_init(init_vrc5477_ac97);
  1712. module_exit(cleanup_vrc5477_ac97);