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

嵌入式Linux

开发平台:

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