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

嵌入式Linux

开发平台:

Unix_Linux

  1. return -EFAULT;
  2. return 0;
  3. }
  4. if (cmd == OSS_GETVERSION)
  5. return put_user(SOUND_VERSION, (int *) arg);
  6. if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
  7. return -EINVAL;
  8. // If ioctl has only the SIOC_READ bit(bit 31)
  9. // on, process the only-read commands. 
  10. if (_SIOC_DIR(cmd) == _SIOC_READ) {
  11. switch (_IOC_NR(cmd)) {
  12. case SOUND_MIXER_RECSRC: // Arg contains a bit for each recording source 
  13. cs4281_read_ac97(s, BA0_AC97_RECORD_SELECT,
  14.  &temp1);
  15. return put_user(mixer_src[temp1 & 7], (int *) arg);
  16. case SOUND_MIXER_DEVMASK: // Arg contains a bit for each supported device 
  17. return put_user(SOUND_MASK_PCM | SOUND_MASK_SYNTH |
  18. SOUND_MASK_CD | SOUND_MASK_LINE |
  19. SOUND_MASK_LINE1 | SOUND_MASK_MIC |
  20. SOUND_MASK_VOLUME |
  21. SOUND_MASK_RECLEV |
  22. SOUND_MASK_SPEAKER, (int *) arg);
  23. case SOUND_MIXER_RECMASK: // Arg contains a bit for each supported recording source 
  24. return_mask = (((SOUND_MASK_LINE | SOUND_MASK_MIC |
  25. SOUND_MASK_CD | SOUND_MASK_VOLUME |
  26. SOUND_MASK_LINE1) ) & ~recsrc_invalid);
  27. CS_DBGOUT(CS_PARMS, 6, printk(KERN_INFO
  28. "cs4281: mixer_ioctl(): return_mask=0x%x recsrc_invalid=0x%xn",
  29. (unsigned)return_mask,(unsigned)recsrc_invalid));
  30. return put_user(return_mask, (int *) arg);
  31. case SOUND_MIXER_STEREODEVS: // Mixer channels supporting stereo 
  32. return put_user(SOUND_MASK_PCM | SOUND_MASK_SYNTH |
  33. SOUND_MASK_CD | SOUND_MASK_LINE |
  34. SOUND_MASK_LINE1 | SOUND_MASK_MIC |
  35. SOUND_MASK_VOLUME |
  36. SOUND_MASK_RECLEV, (int *) arg);
  37. case SOUND_MIXER_CAPS:
  38. return put_user(SOUND_CAP_EXCL_INPUT, (int *) arg);
  39. default:
  40. i = _IOC_NR(cmd);
  41. if (i >= SOUND_MIXER_NRDEVICES
  42.     || !(vidx = mixtable1[i]))
  43. return -EINVAL;
  44. return put_user(s->mix.vol[vidx - 1], (int *) arg);
  45. }
  46. }
  47. // If ioctl doesn't have both the SIOC_READ and 
  48. // the SIOC_WRITE bit set, return invalid.
  49. if (_SIOC_DIR(cmd) != (_SIOC_READ | _SIOC_WRITE))
  50. return -EINVAL;
  51. // Increment the count of volume writes.
  52. s->mix.modcnt++;
  53. // Isolate the command; it must be a write.
  54. switch (_IOC_NR(cmd)) {
  55. case SOUND_MIXER_RECSRC: // Arg contains a bit for each recording source 
  56. if (get_user(val, (int *) arg))
  57. return -EFAULT;
  58. i = hweight32(val); // i = # bits on in val.
  59. if (i != 1) // One & only 1 bit must be on.
  60. return 0;
  61. if(val & recsrc_invalid)
  62. {
  63. CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
  64. "cs4281: mixer_ioctl(): REC SOURCE select error - record source invalid on this system (0x%x)n",
  65. val));
  66. return -EINVAL;
  67. }
  68. for (i = 0; i < sizeof(mixer_src) / sizeof(int); i++) {
  69. if (val == mixer_src[i]) {
  70. temp1 = (i << 8) | i;
  71. cs4281_write_ac97(s,
  72.   BA0_AC97_RECORD_SELECT,
  73.   temp1);
  74. return 0;
  75. }
  76. }
  77. return 0;
  78. case SOUND_MIXER_VOLUME:
  79. if (get_user(val, (int *) arg))
  80. return -EFAULT;
  81. l = val & 0xff;
  82. if (l > 100)
  83. l = 100; // Max soundcard.h vol is 100.
  84. if (l < 6) {
  85. rl = 63;
  86. l = 0;
  87. } else
  88. rl = attentbl[(10 * l) / 100]; // Convert 0-100 vol to 63-0 atten.
  89. r = (val >> 8) & 0xff;
  90. if (r > 100)
  91. r = 100; // Max right volume is 100, too
  92. if (r < 6) {
  93. rr = 63;
  94. r = 0;
  95. } else
  96. rr = attentbl[(10 * r) / 100]; // Convert volume to attenuation.
  97. if ((rl > 60) && (rr > 60)) // If both l & r are 'low',          
  98. temp1 = 0x8000; //  turn on the mute bit.
  99. else
  100. temp1 = 0;
  101. temp1 |= (rl << 8) | rr;
  102. cs4281_write_ac97(s, BA0_AC97_MASTER_VOLUME, temp1);
  103. cs4281_write_ac97(s, BA0_AC97_HEADPHONE_VOLUME, temp1);
  104. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  105. s->mix.vol[8] = ((unsigned int) r << 8) | l;
  106. #else
  107. s->mix.vol[8] = val;
  108. #endif
  109. return put_user(s->mix.vol[8], (int *) arg);
  110. case SOUND_MIXER_SPEAKER:
  111. if (get_user(val, (int *) arg))
  112. return -EFAULT;
  113. l = val & 0xff;
  114. if (l > 100)
  115. l = 100;
  116. if (l < 3) {
  117. rl = 0;
  118. l = 0;
  119. } else {
  120. rl = (l * 2 - 5) / 13; // Convert 0-100 range to 0-15.
  121. l = (rl * 13 + 5) / 2;
  122. }
  123. if (rl < 3) {
  124. temp1 = 0x8000;
  125. rl = 0;
  126. } else
  127. temp1 = 0;
  128. rl = 15 - rl; // Convert volume to attenuation.
  129. temp1 |= rl << 1;
  130. cs4281_write_ac97(s, BA0_AC97_PC_BEEP_VOLUME, temp1);
  131. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  132. s->mix.vol[6] = l << 8;
  133. #else
  134. s->mix.vol[6] = val;
  135. #endif
  136. return put_user(s->mix.vol[6], (int *) arg);
  137. case SOUND_MIXER_RECLEV:
  138. if (get_user(val, (int *) arg))
  139. return -EFAULT;
  140. l = val & 0xff;
  141. if (l > 100)
  142. l = 100;
  143. r = (val >> 8) & 0xff;
  144. if (r > 100)
  145. r = 100;
  146. rl = (l * 2 - 5) / 13; // Convert 0-100 scale to 0-15.
  147. rr = (r * 2 - 5) / 13;
  148. if (rl < 3 && rr < 3)
  149. temp1 = 0x8000;
  150. else
  151. temp1 = 0;
  152. temp1 = temp1 | (rl << 8) | rr;
  153. cs4281_write_ac97(s, BA0_AC97_RECORD_GAIN, temp1);
  154. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  155. s->mix.vol[7] = ((unsigned int) r << 8) | l;
  156. #else
  157. s->mix.vol[7] = val;
  158. #endif
  159. return put_user(s->mix.vol[7], (int *) arg);
  160. case SOUND_MIXER_MIC:
  161. if (get_user(val, (int *) arg))
  162. return -EFAULT;
  163. l = val & 0xff;
  164. if (l > 100)
  165. l = 100;
  166. if (l < 1) {
  167. l = 0;
  168. rl = 0;
  169. } else {
  170. rl = ((unsigned) l * 5 - 4) / 16; // Convert 0-100 range to 0-31.
  171. l = (rl * 16 + 4) / 5;
  172. }
  173. cs4281_read_ac97(s, BA0_AC97_MIC_VOLUME, &temp1);
  174. temp1 &= 0x40; // Isolate 20db gain bit.
  175. if (rl < 3) {
  176. temp1 |= 0x8000;
  177. rl = 0;
  178. }
  179. rl = 31 - rl; // Convert volume to attenuation.
  180. temp1 |= rl;
  181. cs4281_write_ac97(s, BA0_AC97_MIC_VOLUME, temp1);
  182. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  183. s->mix.vol[5] = val << 8;
  184. #else
  185. s->mix.vol[5] = val;
  186. #endif
  187. return put_user(s->mix.vol[5], (int *) arg);
  188. case SOUND_MIXER_SYNTH:
  189. if (get_user(val, (int *) arg))
  190. return -EFAULT;
  191. l = val & 0xff;
  192. if (l > 100)
  193. l = 100;
  194. if (get_user(val, (int *) arg))
  195. return -EFAULT;
  196. r = (val >> 8) & 0xff;
  197. if (r > 100)
  198. r = 100;
  199. rl = (l * 2 - 11) / 3; // Convert 0-100 range to 0-63.
  200. rr = (r * 2 - 11) / 3;
  201. if (rl < 3) // If l is low, turn on
  202. temp1 = 0x0080; //  the mute bit.
  203. else
  204. temp1 = 0;
  205. rl = 63 - rl; // Convert vol to attenuation.
  206. writel(temp1 | rl, s->pBA0 + BA0_FMLVC);
  207. if (rr < 3) //  If rr is low, turn on
  208. temp1 = 0x0080; //   the mute bit.
  209. else
  210. temp1 = 0;
  211. rr = 63 - rr; // Convert vol to attenuation.
  212. writel(temp1 | rr, s->pBA0 + BA0_FMRVC);
  213. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  214. s->mix.vol[4] = (r << 8) | l;
  215. #else
  216. s->mix.vol[4] = val;
  217. #endif
  218. return put_user(s->mix.vol[4], (int *) arg);
  219. default:
  220. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  221. "cs4281: mixer_ioctl(): defaultn"));
  222. i = _IOC_NR(cmd);
  223. if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
  224. return -EINVAL;
  225. if (get_user(val, (int *) arg))
  226. return -EFAULT;
  227. l = val & 0xff;
  228. if (l > 100)
  229. l = 100;
  230. if (l < 1) {
  231. l = 0;
  232. rl = 31;
  233. } else
  234. rl = (attentbl[(l * 10) / 100]) >> 1;
  235. r = (val >> 8) & 0xff;
  236. if (r > 100)
  237. r = 100;
  238. if (r < 1) {
  239. r = 0;
  240. rr = 31;
  241. } else
  242. rr = (attentbl[(r * 10) / 100]) >> 1;
  243. if ((rl > 30) && (rr > 30))
  244. temp1 = 0x8000;
  245. else
  246. temp1 = 0;
  247. temp1 = temp1 | (rl << 8) | rr;
  248. cs4281_write_ac97(s, mixreg[vidx - 1], temp1);
  249. #ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
  250. s->mix.vol[vidx - 1] = ((unsigned int) r << 8) | l;
  251. #else
  252. s->mix.vol[vidx - 1] = val;
  253. #endif
  254. #ifndef NOT_CS4281_PM
  255. CS_DBGOUT(CS_PM, 9, printk(KERN_INFO 
  256. "write ac97 mixreg[%d]=0x%x mix.vol[]=0x%xn", 
  257. vidx-1,temp1,s->mix.vol[vidx-1]));
  258. #endif
  259. return put_user(s->mix.vol[vidx - 1], (int *) arg);
  260. }
  261. }
  262. // --------------------------------------------------------------------- 
  263. static loff_t cs4281_llseek(struct file *file, loff_t offset, int origin)
  264. {
  265. return -ESPIPE;
  266. }
  267. // --------------------------------------------------------------------- 
  268. static int cs4281_open_mixdev(struct inode *inode, struct file *file)
  269. {
  270. int minor = MINOR(inode->i_rdev);
  271. struct cs4281_state *s=NULL;
  272. struct list_head *entry;
  273. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
  274.   printk(KERN_INFO "cs4281: cs4281_open_mixdev()+n"));
  275. list_for_each(entry, &cs4281_devs)
  276. {
  277. s = list_entry(entry, struct cs4281_state, list);
  278. if(s->dev_mixer == minor)
  279. break;
  280. }
  281. if (!s)
  282. {
  283. CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
  284. printk(KERN_INFO "cs4281: cs4281_open_mixdev()- -ENODEVn"));
  285. return -ENODEV;
  286. }
  287. VALIDATE_STATE(s);
  288. file->private_data = s;
  289. MOD_INC_USE_COUNT;
  290. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
  291.   printk(KERN_INFO "cs4281: cs4281_open_mixdev()- 0n"));
  292. return 0;
  293. }
  294. static int cs4281_release_mixdev(struct inode *inode, struct file *file)
  295. {
  296. struct cs4281_state *s =
  297.     (struct cs4281_state *) file->private_data;
  298. VALIDATE_STATE(s);
  299. MOD_DEC_USE_COUNT;
  300. return 0;
  301. }
  302. static int cs4281_ioctl_mixdev(struct inode *inode, struct file *file,
  303.        unsigned int cmd, unsigned long arg)
  304. {
  305. return mixer_ioctl((struct cs4281_state *) file->private_data, cmd,
  306.    arg);
  307. }
  308. // ******************************************************************************************
  309. //   Mixer file operations struct.
  310. // ******************************************************************************************
  311. static /*const */ struct file_operations cs4281_mixer_fops = {
  312. llseek:cs4281_llseek,
  313. ioctl:cs4281_ioctl_mixdev,
  314. open:cs4281_open_mixdev,
  315. release:cs4281_release_mixdev,
  316. };
  317. // --------------------------------------------------------------------- 
  318. static int drain_adc(struct cs4281_state *s, int nonblock)
  319. {
  320. DECLARE_WAITQUEUE(wait, current);
  321. unsigned long flags;
  322. int count;
  323. unsigned tmo;
  324. if (s->dma_adc.mapped)
  325. return 0;
  326. add_wait_queue(&s->dma_adc.wait, &wait);
  327. for (;;) {
  328. set_current_state(TASK_INTERRUPTIBLE);
  329. spin_lock_irqsave(&s->lock, flags);
  330. count = s->dma_adc.count;
  331. CS_DBGOUT(CS_FUNCTION, 2,
  332.   printk(KERN_INFO "cs4281: drain_adc() %dn", count));
  333. spin_unlock_irqrestore(&s->lock, flags);
  334. if (count <= 0) {
  335. CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
  336.  "cs4281: drain_adc() count<0n"));
  337. break;
  338. }
  339. if (signal_pending(current))
  340. break;
  341. if (nonblock) {
  342. remove_wait_queue(&s->dma_adc.wait, &wait);
  343. current->state = TASK_RUNNING;
  344. return -EBUSY;
  345. }
  346. tmo =
  347.     3 * HZ * (count +
  348.       s->dma_adc.fragsize) / 2 / s->prop_adc.rate;
  349. if (s->prop_adc.fmt & (AFMT_S16_LE | AFMT_U16_LE))
  350. tmo >>= 1;
  351. if (s->prop_adc.channels > 1)
  352. tmo >>= 1;
  353. if (!schedule_timeout(tmo + 1))
  354. printk(KERN_DEBUG "cs4281: dma timed out??n");
  355. }
  356. remove_wait_queue(&s->dma_adc.wait, &wait);
  357. current->state = TASK_RUNNING;
  358. if (signal_pending(current))
  359. return -ERESTARTSYS;
  360. return 0;
  361. }
  362. static int drain_dac(struct cs4281_state *s, int nonblock)
  363. {
  364. DECLARE_WAITQUEUE(wait, current);
  365. unsigned long flags;
  366. int count;
  367. unsigned tmo;
  368. CS_DBGOUT(CS_FUNCTION, 2,
  369.   printk(KERN_INFO "cs4281: drain_dac()+n"));
  370. if (s->dma_dac.mapped)
  371. {
  372. CS_DBGOUT(CS_FUNCTION, 2,
  373.   printk(KERN_INFO "cs4281: drain_dac()- (mmap) 0n"));
  374. return 0;
  375. }
  376. if (s->ena & FMODE_WRITE)
  377. add_wait_queue(&s->dma_dac.wait, &wait);
  378. else
  379. return 0;
  380. for (;;) {
  381. set_current_state(TASK_INTERRUPTIBLE);
  382. spin_lock_irqsave(&s->lock, flags);
  383. count = s->dma_dac.count;
  384. spin_unlock_irqrestore(&s->lock, flags);
  385. if (count <= 0)
  386. break;
  387. if (signal_pending(current))
  388. break;
  389. if (nonblock) {
  390. remove_wait_queue(&s->dma_dac.wait, &wait);
  391. current->state = TASK_RUNNING;
  392. CS_DBGOUT(CS_FUNCTION, 2,
  393.   printk(KERN_INFO "cs4281: drain_dac()- -EBUSYn"));
  394. return -EBUSY;
  395. }
  396. tmo =
  397.     3 * HZ * (count +
  398.       s->dma_dac.fragsize) / 2 / s->prop_dac.rate;
  399. if (s->prop_dac.fmt & (AFMT_S16_LE | AFMT_U16_LE))
  400. tmo >>= 1;
  401. if (s->prop_dac.channels > 1)
  402. tmo >>= 1;
  403. if (!schedule_timeout(tmo + 1))
  404. printk(KERN_DEBUG "cs4281: dma timed out??n");
  405. }
  406. remove_wait_queue(&s->dma_dac.wait, &wait);
  407. current->state = TASK_RUNNING;
  408. if (signal_pending(current))
  409. {
  410. CS_DBGOUT(CS_FUNCTION, 2,
  411.   printk(KERN_INFO "cs4281: drain_dac()- -ERESTARTSYSn"));
  412. return -ERESTARTSYS;
  413. }
  414. CS_DBGOUT(CS_FUNCTION, 2,
  415.   printk(KERN_INFO "cs4281: drain_dac()- 0n"));
  416. return 0;
  417. }
  418. //****************************************************************************
  419. //
  420. // CopySamples copies 16-bit stereo samples from the source to the
  421. // destination, possibly converting down to either 8-bit or mono or both.
  422. // count specifies the number of output bytes to write.
  423. //
  424. //  Arguments:
  425. //
  426. //  dst             - Pointer to a destination buffer.
  427. //  src             - Pointer to a source buffer
  428. //  count           - The number of bytes to copy into the destination buffer.
  429. //  iChannels       - Stereo - 2
  430. //                    Mono   - 1
  431. //  fmt             - AFMT_xxx (soundcard.h formats)
  432. //
  433. // NOTES: only call this routine for conversion to 8bit from 16bit
  434. //
  435. //****************************************************************************
  436. static void CopySamples(char *dst, char *src, int count, int iChannels,
  437. unsigned fmt)
  438. {
  439. unsigned short *psSrc;
  440. long lAudioSample;
  441. CS_DBGOUT(CS_FUNCTION, 2,
  442.   printk(KERN_INFO "cs4281: CopySamples()+ "));
  443. CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
  444.  " dst=0x%x src=0x%x count=%d iChannels=%d fmt=0x%xn",
  445.  (unsigned) dst, (unsigned) src, (unsigned) count,
  446.  (unsigned) iChannels, (unsigned) fmt));
  447. // Gershwin does format conversion in hardware so normally
  448. // we don't do any host based coversion. The data formatter
  449. // truncates 16 bit data to 8 bit and that causes some hiss.
  450. // We have already forced the HW to do 16 bit sampling and 
  451. // 2 channel so that we can use software to round instead 
  452. // of truncate
  453. //
  454. // See if the data should be output as 8-bit unsigned stereo.
  455. // or if the data should be output at 8-bit unsigned mono.
  456. //
  457. if ( ((iChannels == 2) && (fmt & AFMT_U8)) ||
  458. ((iChannels == 1) && (fmt & AFMT_U8)) ) {
  459. //
  460. // Convert each 16-bit unsigned stereo sample to 8-bit unsigned 
  461. // stereo using rounding.
  462. //
  463. psSrc = (unsigned short *) src;
  464. count = count / 2;
  465. while (count--) {
  466. lAudioSample = (long) psSrc[count] + (long) 0x80;
  467. if (lAudioSample > 0xffff) {
  468. lAudioSample = 0xffff;
  469. }
  470. dst[count] = (char) (lAudioSample >> 8);
  471. }
  472. }
  473. //
  474. // check for 8-bit signed stereo.
  475. //
  476. else if ((iChannels == 2) && (fmt & AFMT_S8)) {
  477. //
  478. // Convert each 16-bit stereo sample to 8-bit stereo using rounding.
  479. //
  480. psSrc = (short *) src;
  481. while (count--) {
  482. lAudioSample =
  483.     (((long) psSrc[0] + (long) psSrc[1]) / 2);
  484. psSrc += 2;
  485. *dst++ = (char) ((short) lAudioSample >> 8);
  486. }
  487. }
  488. //
  489. // Otherwise, the data should be output as 8-bit signed mono.
  490. //
  491. else if ((iChannels == 1) && (fmt & AFMT_S8)) {
  492. //
  493. // Convert each 16-bit signed mono sample to 8-bit signed mono 
  494. // using rounding.
  495. //
  496. psSrc = (short *) src;
  497. count = count / 2;
  498. while (count--) {
  499. lAudioSample =
  500.     (((long) psSrc[0] + (long) psSrc[1]) / 2);
  501. if (lAudioSample > 0x7fff) {
  502. lAudioSample = 0x7fff;
  503. }
  504. psSrc += 2;
  505. *dst++ = (char) ((short) lAudioSample >> 8);
  506. }
  507. }
  508. }
  509. //
  510. // cs_copy_to_user()
  511. // replacement for the standard copy_to_user, to allow for a conversion from
  512. // 16 bit to 8 bit if the record conversion is active.  the cs4281 has some
  513. // issues with 8 bit capture, so the driver always captures data in 16 bit
  514. // and then if the user requested 8 bit, converts from 16 to 8 bit.
  515. //
  516. static unsigned cs_copy_to_user(struct cs4281_state *s, void *dest,
  517. unsigned *hwsrc, unsigned cnt,
  518. unsigned *copied)
  519. {
  520. void *src = hwsrc; //default to the standard destination buffer addr
  521. CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO
  522. "cs_copy_to_user()+ fmt=0x%x fmt_o=0x%x cnt=%d dest=0x%.8xn",
  523. s->prop_adc.fmt, s->prop_adc.fmt_original,
  524. (unsigned) cnt, (unsigned) dest));
  525. if (cnt > s->dma_adc.dmasize) {
  526. cnt = s->dma_adc.dmasize;
  527. }
  528. if (!cnt) {
  529. *copied = 0;
  530. return 0;
  531. }
  532. if (s->conversion) {
  533. if (!s->tmpbuff) {
  534. *copied = cnt / 2;
  535. return 0;
  536. }
  537. CopySamples(s->tmpbuff, (void *) hwsrc, cnt,
  538.     (unsigned) s->prop_adc.channels,
  539.     s->prop_adc.fmt_original);
  540. src = s->tmpbuff;
  541. cnt = cnt / 2;
  542. }
  543. if (copy_to_user(dest, src, cnt)) {
  544. *copied = 0;
  545. return -EFAULT;
  546. }
  547. *copied = cnt;
  548. CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO
  549. "cs4281: cs_copy_to_user()- copied bytes is %d n", cnt));
  550. return 0;
  551. }
  552. // --------------------------------------------------------------------- 
  553. static ssize_t cs4281_read(struct file *file, char *buffer, size_t count,
  554.    loff_t * ppos)
  555. {
  556. struct cs4281_state *s =
  557.     (struct cs4281_state *) file->private_data;
  558. ssize_t ret;
  559. unsigned long flags;
  560. unsigned swptr;
  561. int cnt;
  562. unsigned copied = 0;
  563. CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
  564.   printk(KERN_INFO "cs4281: cs4281_read()+ %d n", count));
  565. VALIDATE_STATE(s);
  566. if (ppos != &file->f_pos)
  567. return -ESPIPE;
  568. if (s->dma_adc.mapped)
  569. return -ENXIO;
  570. if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
  571. return ret;
  572. if (!access_ok(VERIFY_WRITE, buffer, count))
  573. return -EFAULT;
  574. ret = 0;
  575. //
  576. // "count" is the amount of bytes to read (from app), is decremented each loop
  577. //      by the amount of bytes that have been returned to the user buffer.
  578. // "cnt" is the running total of each read from the buffer (changes each loop)
  579. // "buffer" points to the app's buffer
  580. // "ret" keeps a running total of the amount of bytes that have been copied
  581. //      to the user buffer.
  582. // "copied" is the total bytes copied into the user buffer for each loop.
  583. //
  584. while (count > 0) {
  585. CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
  586. "_read() count>0 count=%d .count=%d .swptr=%d .hwptr=%d n",
  587. count, s->dma_adc.count,
  588. s->dma_adc.swptr, s->dma_adc.hwptr));
  589. spin_lock_irqsave(&s->lock, flags);
  590. // get the current copy point of the sw buffer
  591. swptr = s->dma_adc.swptr;
  592. // cnt is the amount of unread bytes from the end of the 
  593. // hw buffer to the current sw pointer
  594. cnt = s->dma_adc.dmasize - swptr;
  595. // dma_adc.count is the current total bytes that have not been read.
  596. // if the amount of unread bytes from the current sw pointer to the
  597. // end of the buffer is greater than the current total bytes that
  598. // have not been read, then set the "cnt" (unread bytes) to the
  599. // amount of unread bytes.  
  600. if (s->dma_adc.count < cnt)
  601. cnt = s->dma_adc.count;
  602. spin_unlock_irqrestore(&s->lock, flags);
  603. //
  604. // if we are converting from 8/16 then we need to copy
  605. // twice the number of 16 bit bytes then 8 bit bytes.
  606. // 
  607. if (s->conversion) {
  608. if (cnt > (count * 2))
  609. cnt = (count * 2);
  610. } else {
  611. if (cnt > count)
  612. cnt = count;
  613. }
  614. //
  615. // "cnt" NOW is the smaller of the amount that will be read,
  616. // and the amount that is requested in this read (or partial).
  617. // if there are no bytes in the buffer to read, then start the
  618. // ADC and wait for the interrupt handler to wake us up.
  619. //
  620. if (cnt <= 0) {
  621. // start up the dma engine and then continue back to the top of
  622. // the loop when wake up occurs.
  623. start_adc(s);
  624. if (file->f_flags & O_NONBLOCK)
  625. return ret ? ret : -EAGAIN;
  626. interruptible_sleep_on(&s->dma_adc.wait);
  627. if (signal_pending(current))
  628. return ret ? ret : -ERESTARTSYS;
  629. continue;
  630. }
  631. // there are bytes in the buffer to read.
  632. // copy from the hw buffer over to the user buffer.
  633. // user buffer is designated by "buffer"
  634. // virtual address to copy from is rawbuf+swptr
  635. // the "cnt" is the number of bytes to read.
  636. CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO
  637. "_read() copy_to cnt=%d count=%d ", cnt, count));
  638. CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
  639.  " .dmasize=%d .count=%d buffer=0x%.8x ret=%dn",
  640.  s->dma_adc.dmasize, s->dma_adc.count,
  641.  (unsigned) buffer, ret));
  642. if (cs_copy_to_user
  643.     (s, buffer, s->dma_adc.rawbuf + swptr, cnt, &copied))
  644. return ret ? ret : -EFAULT;
  645. swptr = (swptr + cnt) % s->dma_adc.dmasize;
  646. spin_lock_irqsave(&s->lock, flags);
  647. s->dma_adc.swptr = swptr;
  648. s->dma_adc.count -= cnt;
  649. spin_unlock_irqrestore(&s->lock, flags);
  650. count -= copied;
  651. buffer += copied;
  652. ret += copied;
  653. start_adc(s);
  654. }
  655. CS_DBGOUT(CS_FUNCTION | CS_WAVE_READ, 2,
  656.   printk(KERN_INFO "cs4281: cs4281_read()- %dn", ret));
  657. return ret;
  658. }
  659. static ssize_t cs4281_write(struct file *file, const char *buffer,
  660.     size_t count, loff_t * ppos)
  661. {
  662. struct cs4281_state *s =
  663.     (struct cs4281_state *) file->private_data;
  664. ssize_t ret;
  665. unsigned long flags;
  666. unsigned swptr, hwptr, busaddr;
  667. int cnt;
  668. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
  669.   printk(KERN_INFO "cs4281: cs4281_write()+ count=%dn",
  670.  count));
  671. VALIDATE_STATE(s);
  672. if (ppos != &file->f_pos)
  673. return -ESPIPE;
  674. if (s->dma_dac.mapped)
  675. return -ENXIO;
  676. if (!s->dma_dac.ready && (ret = prog_dmabuf_dac(s)))
  677. return ret;
  678. if (!access_ok(VERIFY_READ, buffer, count))
  679. return -EFAULT;
  680. ret = 0;
  681. while (count > 0) {
  682. spin_lock_irqsave(&s->lock, flags);
  683. if (s->dma_dac.count < 0) {
  684. s->dma_dac.count = 0;
  685. s->dma_dac.swptr = s->dma_dac.hwptr;
  686. }
  687. if (s->dma_dac.underrun) {
  688. s->dma_dac.underrun = 0;
  689. hwptr = readl(s->pBA0 + BA0_DCA0);
  690. busaddr = virt_to_bus(s->dma_dac.rawbuf);
  691. hwptr -= (unsigned) busaddr;
  692. s->dma_dac.swptr = s->dma_dac.hwptr = hwptr;
  693. }
  694. swptr = s->dma_dac.swptr;
  695. cnt = s->dma_dac.dmasize - swptr;
  696. if (s->dma_dac.count + cnt > s->dma_dac.dmasize)
  697. cnt = s->dma_dac.dmasize - s->dma_dac.count;
  698. spin_unlock_irqrestore(&s->lock, flags);
  699. if (cnt > count)
  700. cnt = count;
  701. if (cnt <= 0) {
  702. start_dac(s);
  703. if (file->f_flags & O_NONBLOCK)
  704. return ret ? ret : -EAGAIN;
  705. interruptible_sleep_on(&s->dma_dac.wait);
  706. if (signal_pending(current))
  707. return ret ? ret : -ERESTARTSYS;
  708. continue;
  709. }
  710. if (copy_from_user(s->dma_dac.rawbuf + swptr, buffer, cnt))
  711. return ret ? ret : -EFAULT;
  712. swptr = (swptr + cnt) % s->dma_dac.dmasize;
  713. spin_lock_irqsave(&s->lock, flags);
  714. s->dma_dac.swptr = swptr;
  715. s->dma_dac.count += cnt;
  716. s->dma_dac.endcleared = 0;
  717. spin_unlock_irqrestore(&s->lock, flags);
  718. count -= cnt;
  719. buffer += cnt;
  720. ret += cnt;
  721. start_dac(s);
  722. }
  723. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE, 2,
  724.   printk(KERN_INFO "cs4281: cs4281_write()- %dn", ret));
  725. return ret;
  726. }
  727. /*
  728. * cs4281_poll(struct file *file, struct poll_table_struct *wait)
  729. */
  730. static unsigned int cs4281_poll(struct file *file,
  731. struct poll_table_struct *wait)
  732. {
  733. struct cs4281_state *s =
  734.     (struct cs4281_state *) file->private_data;
  735. unsigned long flags;
  736. unsigned int mask = 0;
  737. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  738.   printk(KERN_INFO "cs4281: cs4281_poll()+ wait=0x%xn", (unsigned)wait));
  739. VALIDATE_STATE(s);
  740. if (file->f_mode & FMODE_WRITE) {
  741. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  742.   printk(KERN_INFO
  743.  "cs4281: cs4281_poll() wait on FMODE_WRITEn"));
  744. if(!s->dma_dac.ready && prog_dmabuf_dac(s))
  745. return 0;
  746. poll_wait(file, &s->dma_dac.wait, wait);
  747. } else if (file->f_mode & FMODE_READ) {
  748. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  749.   printk(KERN_INFO
  750.  "cs4281: cs4281_poll() wait on FMODE_READn"));
  751. if(!s->dma_adc.ready && prog_dmabuf_adc(s))
  752. return 0;
  753. poll_wait(file, &s->dma_adc.wait, wait);
  754. }
  755. spin_lock_irqsave(&s->lock, flags);
  756. if (file->f_mode & FMODE_WRITE) {
  757. if (s->dma_dac.mapped) {
  758. if (s->dma_dac.count >=
  759.     (signed) s->dma_dac.fragsize) {
  760. if (s->dma_dac.wakeup)
  761. mask |= POLLOUT | POLLWRNORM;
  762. else
  763. mask = 0;
  764. s->dma_dac.wakeup = 0;
  765. }
  766. } else {
  767. if ((signed) (s->dma_dac.dmasize/2) >= s->dma_dac.count)
  768. mask |= POLLOUT | POLLWRNORM;
  769. }
  770. } else if (file->f_mode & FMODE_READ) {
  771. if (s->dma_adc.mapped) {
  772. if (s->dma_adc.count >= (signed) s->dma_adc.fragsize) 
  773. mask |= POLLIN | POLLRDNORM;
  774. } else {
  775. if (s->dma_adc.count > 0)
  776. mask |= POLLIN | POLLRDNORM;
  777. }
  778. }
  779. spin_unlock_irqrestore(&s->lock, flags);
  780. CS_DBGOUT(CS_FUNCTION | CS_WAVE_WRITE | CS_WAVE_READ, 4,
  781.   printk(KERN_INFO "cs4281: cs4281_poll()- 0x%.8xn",
  782.  mask));
  783. return mask;
  784. }
  785. static int cs4281_mmap(struct file *file, struct vm_area_struct *vma)
  786. {
  787. struct cs4281_state *s =
  788.     (struct cs4281_state *) file->private_data;
  789. struct dmabuf *db;
  790. int ret;
  791. unsigned long size;
  792. CS_DBGOUT(CS_FUNCTION | CS_PARMS | CS_OPEN, 4,
  793.   printk(KERN_INFO "cs4281: cs4281_mmap()+n"));
  794. VALIDATE_STATE(s);
  795. if (vma->vm_flags & VM_WRITE) {
  796. if ((ret = prog_dmabuf_dac(s)) != 0)
  797. return ret;
  798. db = &s->dma_dac;
  799. } else if (vma->vm_flags & VM_READ) {
  800. if ((ret = prog_dmabuf_adc(s)) != 0)
  801. return ret;
  802. db = &s->dma_adc;
  803. } else
  804. return -EINVAL;
  805. //
  806. // only support PLAYBACK for now
  807. //
  808. db = &s->dma_dac;
  809. if ((vma->vm_pgoff) != 0)
  810. return -EINVAL;
  811. size = vma->vm_end - vma->vm_start;
  812. if (size > (PAGE_SIZE << db->buforder))
  813. return -EINVAL;
  814. if (remap_page_range
  815.     (vma->vm_start, virt_to_phys(db->rawbuf), size,
  816.      vma->vm_page_prot)) return -EAGAIN;
  817. db->mapped = 1;
  818. CS_DBGOUT(CS_FUNCTION | CS_PARMS | CS_OPEN, 4,
  819.   printk(KERN_INFO "cs4281: cs4281_mmap()- 0 size=%dn",
  820.  (unsigned) size));
  821. return 0;
  822. }
  823. static int cs4281_ioctl(struct inode *inode, struct file *file,
  824. unsigned int cmd, unsigned long arg)
  825. {
  826. struct cs4281_state *s =
  827.     (struct cs4281_state *) file->private_data;
  828. unsigned long flags;
  829. audio_buf_info abinfo;
  830. count_info cinfo;
  831. int val, mapped, ret;
  832. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
  833.  "cs4281: cs4281_ioctl(): file=0x%.8x cmd=0x%.8xn",
  834.  (unsigned) file, cmd));
  835. #if CSDEBUG
  836. cs_printioctl(cmd);
  837. #endif
  838. VALIDATE_STATE(s);
  839. mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac.mapped) ||
  840.     ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
  841. switch (cmd) {
  842. case OSS_GETVERSION:
  843. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  844. "cs4281: cs4281_ioctl(): SOUND_VERSION=0x%.8xn",
  845.  SOUND_VERSION));
  846. return put_user(SOUND_VERSION, (int *) arg);
  847. case SNDCTL_DSP_SYNC:
  848. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  849.  "cs4281: cs4281_ioctl(): DSP_SYNCn"));
  850. if (file->f_mode & FMODE_WRITE)
  851. return drain_dac(s,
  852.  0 /*file->f_flags & O_NONBLOCK */
  853.  );
  854. return 0;
  855. case SNDCTL_DSP_SETDUPLEX:
  856. return 0;
  857. case SNDCTL_DSP_GETCAPS:
  858. return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
  859. DSP_CAP_TRIGGER | DSP_CAP_MMAP,
  860. (int *) arg);
  861. case SNDCTL_DSP_RESET:
  862. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  863.  "cs4281: cs4281_ioctl(): DSP_RESETn"));
  864. if (file->f_mode & FMODE_WRITE) {
  865. stop_dac(s);
  866. synchronize_irq();
  867. s->dma_dac.swptr = s->dma_dac.hwptr =
  868.     s->dma_dac.count = s->dma_dac.total_bytes =
  869.     s->dma_dac.blocks = s->dma_dac.wakeup = 0;
  870. prog_codec(s, CS_TYPE_DAC);
  871. }
  872. if (file->f_mode & FMODE_READ) {
  873. stop_adc(s);
  874. synchronize_irq();
  875. s->dma_adc.swptr = s->dma_adc.hwptr =
  876.     s->dma_adc.count = s->dma_adc.total_bytes =
  877.     s->dma_adc.blocks = s->dma_dac.wakeup = 0;
  878. prog_codec(s, CS_TYPE_ADC);
  879. }
  880. return 0;
  881. case SNDCTL_DSP_SPEED:
  882. if (get_user(val, (int *) arg))
  883. return -EFAULT;
  884. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  885.  "cs4281: cs4281_ioctl(): DSP_SPEED val=%dn", val));
  886. //
  887. // support independent capture and playback channels
  888. // assume that the file mode bit determines the 
  889. // direction of the data flow.
  890. //
  891. if (file->f_mode & FMODE_READ) {
  892. if (val >= 0) {
  893. stop_adc(s);
  894. s->dma_adc.ready = 0;
  895. // program sampling rates 
  896. if (val > 48000)
  897. val = 48000;
  898. if (val < 6300)
  899. val = 6300;
  900. s->prop_adc.rate = val;
  901. prog_codec(s, CS_TYPE_ADC);
  902. }
  903. }
  904. if (file->f_mode & FMODE_WRITE) {
  905. if (val >= 0) {
  906. stop_dac(s);
  907. s->dma_dac.ready = 0;
  908. // program sampling rates 
  909. if (val > 48000)
  910. val = 48000;
  911. if (val < 6300)
  912. val = 6300;
  913. s->prop_dac.rate = val;
  914. prog_codec(s, CS_TYPE_DAC);
  915. }
  916. }
  917. if (file->f_mode & FMODE_WRITE)
  918. val = s->prop_dac.rate;
  919. else if (file->f_mode & FMODE_READ)
  920. val = s->prop_adc.rate;
  921. return put_user(val, (int *) arg);
  922. case SNDCTL_DSP_STEREO:
  923. if (get_user(val, (int *) arg))
  924. return -EFAULT;
  925. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  926.  "cs4281: cs4281_ioctl(): DSP_STEREO val=%dn", val));
  927. if (file->f_mode & FMODE_READ) {
  928. stop_adc(s);
  929. s->dma_adc.ready = 0;
  930. s->prop_adc.channels = val ? 2 : 1;
  931. prog_codec(s, CS_TYPE_ADC);
  932. }
  933. if (file->f_mode & FMODE_WRITE) {
  934. stop_dac(s);
  935. s->dma_dac.ready = 0;
  936. s->prop_dac.channels = val ? 2 : 1;
  937. prog_codec(s, CS_TYPE_DAC);
  938. }
  939. return 0;
  940. case SNDCTL_DSP_CHANNELS:
  941. if (get_user(val, (int *) arg))
  942. return -EFAULT;
  943. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  944.  "cs4281: cs4281_ioctl(): DSP_CHANNELS val=%dn",
  945.  val));
  946. if (val != 0) {
  947. if (file->f_mode & FMODE_READ) {
  948. stop_adc(s);
  949. s->dma_adc.ready = 0;
  950. if (val >= 2)
  951. s->prop_adc.channels = 2;
  952. else
  953. s->prop_adc.channels = 1;
  954. prog_codec(s, CS_TYPE_ADC);
  955. }
  956. if (file->f_mode & FMODE_WRITE) {
  957. stop_dac(s);
  958. s->dma_dac.ready = 0;
  959. if (val >= 2)
  960. s->prop_dac.channels = 2;
  961. else
  962. s->prop_dac.channels = 1;
  963. prog_codec(s, CS_TYPE_DAC);
  964. }
  965. }
  966. if (file->f_mode & FMODE_WRITE)
  967. val = s->prop_dac.channels;
  968. else if (file->f_mode & FMODE_READ)
  969. val = s->prop_adc.channels;
  970. return put_user(val, (int *) arg);
  971. case SNDCTL_DSP_GETFMTS: // Returns a mask 
  972. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  973. "cs4281: cs4281_ioctl(): DSP_GETFMT val=0x%.8xn",
  974.  AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
  975.  AFMT_U8));
  976. return put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
  977. AFMT_U8, (int *) arg);
  978. case SNDCTL_DSP_SETFMT:
  979. if (get_user(val, (int *) arg))
  980. return -EFAULT;
  981. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  982.  "cs4281: cs4281_ioctl(): DSP_SETFMT val=0x%.8xn",
  983.  val));
  984. if (val != AFMT_QUERY) {
  985. if (file->f_mode & FMODE_READ) {
  986. stop_adc(s);
  987. s->dma_adc.ready = 0;
  988. if (val != AFMT_S16_LE
  989.     && val != AFMT_U16_LE && val != AFMT_S8
  990.     && val != AFMT_U8)
  991. val = AFMT_U8;
  992. s->prop_adc.fmt = val;
  993. s->prop_adc.fmt_original = s->prop_adc.fmt;
  994. prog_codec(s, CS_TYPE_ADC);
  995. }
  996. if (file->f_mode & FMODE_WRITE) {
  997. stop_dac(s);
  998. s->dma_dac.ready = 0;
  999. if (val != AFMT_S16_LE
  1000.     && val != AFMT_U16_LE && val != AFMT_S8
  1001.     && val != AFMT_U8)
  1002. val = AFMT_U8;
  1003. s->prop_dac.fmt = val;
  1004. s->prop_dac.fmt_original = s->prop_dac.fmt;
  1005. prog_codec(s, CS_TYPE_DAC);
  1006. }
  1007. } else {
  1008. if (file->f_mode & FMODE_WRITE)
  1009. val = s->prop_dac.fmt_original;
  1010. else if (file->f_mode & FMODE_READ)
  1011. val = s->prop_adc.fmt_original;
  1012. }
  1013. CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
  1014.   "cs4281: cs4281_ioctl(): DSP_SETFMT return val=0x%.8xn", 
  1015. val));
  1016. return put_user(val, (int *) arg);
  1017. case SNDCTL_DSP_POST:
  1018. CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
  1019.  "cs4281: cs4281_ioctl(): DSP_POSTn"));
  1020. return 0;
  1021. case SNDCTL_DSP_GETTRIGGER:
  1022. val = 0;
  1023. if (file->f_mode & s->ena & FMODE_READ)
  1024. val |= PCM_ENABLE_INPUT;
  1025. if (file->f_mode & s->ena & FMODE_WRITE)
  1026. val |= PCM_ENABLE_OUTPUT;
  1027. return put_user(val, (int *) arg);
  1028. case SNDCTL_DSP_SETTRIGGER:
  1029. if (get_user(val, (int *) arg))
  1030. return -EFAULT;
  1031. if (file->f_mode & FMODE_READ) {
  1032. if (val & PCM_ENABLE_INPUT) {
  1033. if (!s->dma_adc.ready
  1034.     && (ret = prog_dmabuf_adc(s)))
  1035. return ret;
  1036. start_adc(s);
  1037. } else
  1038. stop_adc(s);
  1039. }
  1040. if (file->f_mode & FMODE_WRITE) {
  1041. if (val & PCM_ENABLE_OUTPUT) {
  1042. if (!s->dma_dac.ready
  1043.     && (ret = prog_dmabuf_dac(s)))
  1044. return ret;
  1045. start_dac(s);
  1046. } else
  1047. stop_dac(s);
  1048. }
  1049. return 0;
  1050. case SNDCTL_DSP_GETOSPACE:
  1051. if (!(file->f_mode & FMODE_WRITE))
  1052. return -EINVAL;
  1053. if (!s->dma_dac.ready && (val = prog_dmabuf_dac(s)))
  1054. return val;
  1055. spin_lock_irqsave(&s->lock, flags);
  1056. cs4281_update_ptr(s,CS_TRUE);
  1057. abinfo.fragsize = s->dma_dac.fragsize;
  1058. if (s->dma_dac.mapped)
  1059. abinfo.bytes = s->dma_dac.dmasize;
  1060. else
  1061. abinfo.bytes =
  1062.     s->dma_dac.dmasize - s->dma_dac.count;
  1063. abinfo.fragstotal = s->dma_dac.numfrag;
  1064. abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
  1065. CS_DBGOUT(CS_FUNCTION | CS_PARMS, 4, printk(KERN_INFO
  1066. "cs4281: cs4281_ioctl(): GETOSPACE .fragsize=%d .bytes=%d .fragstotal=%d .fragments=%dn",
  1067. abinfo.fragsize,abinfo.bytes,abinfo.fragstotal,
  1068. abinfo.fragments));
  1069. spin_unlock_irqrestore(&s->lock, flags);
  1070. return copy_to_user((void *) arg, &abinfo,
  1071.     sizeof(abinfo)) ? -EFAULT : 0;
  1072. case SNDCTL_DSP_GETISPACE:
  1073. if (!(file->f_mode & FMODE_READ))
  1074. return -EINVAL;
  1075. if (!s->dma_adc.ready && (val = prog_dmabuf_adc(s)))
  1076. return val;
  1077. spin_lock_irqsave(&s->lock, flags);
  1078. cs4281_update_ptr(s,CS_TRUE);
  1079. if (s->conversion) {
  1080. abinfo.fragsize = s->dma_adc.fragsize / 2;
  1081. abinfo.bytes = s->dma_adc.count / 2;
  1082. abinfo.fragstotal = s->dma_adc.numfrag;
  1083. abinfo.fragments =
  1084.     abinfo.bytes >> (s->dma_adc.fragshift - 1);
  1085. } else {
  1086. abinfo.fragsize = s->dma_adc.fragsize;
  1087. abinfo.bytes = s->dma_adc.count;
  1088. abinfo.fragstotal = s->dma_adc.numfrag;
  1089. abinfo.fragments =
  1090.     abinfo.bytes >> s->dma_adc.fragshift;
  1091. }
  1092. spin_unlock_irqrestore(&s->lock, flags);
  1093. return copy_to_user((void *) arg, &abinfo,
  1094.     sizeof(abinfo)) ? -EFAULT : 0;
  1095. case SNDCTL_DSP_NONBLOCK:
  1096. file->f_flags |= O_NONBLOCK;
  1097. return 0;
  1098. case SNDCTL_DSP_GETODELAY:
  1099. if (!(file->f_mode & FMODE_WRITE))
  1100. return -EINVAL;
  1101. if(!s->dma_dac.ready && prog_dmabuf_dac(s))
  1102. return 0;
  1103. spin_lock_irqsave(&s->lock, flags);
  1104. cs4281_update_ptr(s,CS_TRUE);
  1105. val = s->dma_dac.count;
  1106. spin_unlock_irqrestore(&s->lock, flags);
  1107. return put_user(val, (int *) arg);
  1108. case SNDCTL_DSP_GETIPTR:
  1109. if (!(file->f_mode & FMODE_READ))
  1110. return -EINVAL;
  1111. if(!s->dma_adc.ready && prog_dmabuf_adc(s))
  1112. return 0;
  1113. spin_lock_irqsave(&s->lock, flags);
  1114. cs4281_update_ptr(s,CS_TRUE);
  1115. cinfo.bytes = s->dma_adc.total_bytes;
  1116. if (s->dma_adc.mapped) {
  1117. cinfo.blocks =
  1118.     (cinfo.bytes >> s->dma_adc.fragshift) -
  1119.     s->dma_adc.blocks;
  1120. s->dma_adc.blocks =
  1121.     cinfo.bytes >> s->dma_adc.fragshift;
  1122. } else {
  1123. if (s->conversion) {
  1124. cinfo.blocks =
  1125.     s->dma_adc.count /
  1126.     2 >> (s->dma_adc.fragshift - 1);
  1127. } else
  1128. cinfo.blocks =
  1129.     s->dma_adc.count >> s->dma_adc.
  1130.     fragshift;
  1131. }
  1132. if (s->conversion)
  1133. cinfo.ptr = s->dma_adc.hwptr / 2;
  1134. else
  1135. cinfo.ptr = s->dma_adc.hwptr;
  1136. if (s->dma_adc.mapped)
  1137. s->dma_adc.count &= s->dma_adc.fragsize - 1;
  1138. spin_unlock_irqrestore(&s->lock, flags);
  1139. return copy_to_user((void *) arg, &cinfo, sizeof(cinfo));
  1140. case SNDCTL_DSP_GETOPTR:
  1141. if (!(file->f_mode & FMODE_WRITE))
  1142. return -EINVAL;
  1143. if(!s->dma_dac.ready && prog_dmabuf_dac(s))
  1144. return 0;
  1145. spin_lock_irqsave(&s->lock, flags);
  1146. cs4281_update_ptr(s,CS_TRUE);
  1147. cinfo.bytes = s->dma_dac.total_bytes;
  1148. if (s->dma_dac.mapped) {
  1149. cinfo.blocks =
  1150.     (cinfo.bytes >> s->dma_dac.fragshift) -
  1151.     s->dma_dac.blocks;
  1152. s->dma_dac.blocks =
  1153.     cinfo.bytes >> s->dma_dac.fragshift;
  1154. } else {
  1155. cinfo.blocks =
  1156.     s->dma_dac.count >> s->dma_dac.fragshift;
  1157. }
  1158. cinfo.ptr = s->dma_dac.hwptr;
  1159. if (s->dma_dac.mapped)
  1160. s->dma_dac.count &= s->dma_dac.fragsize - 1;
  1161. spin_unlock_irqrestore(&s->lock, flags);
  1162. return copy_to_user((void *) arg, &cinfo, sizeof(cinfo));
  1163. case SNDCTL_DSP_GETBLKSIZE:
  1164. if (file->f_mode & FMODE_WRITE) {
  1165. if ((val = prog_dmabuf_dac(s)))
  1166. return val;
  1167. return put_user(s->dma_dac.fragsize, (int *) arg);
  1168. }
  1169. if ((val = prog_dmabuf_adc(s)))
  1170. return val;
  1171. if (s->conversion)
  1172. return put_user(s->dma_adc.fragsize / 2,
  1173. (int *) arg);
  1174. else
  1175. return put_user(s->dma_adc.fragsize, (int *) arg);
  1176. case SNDCTL_DSP_SETFRAGMENT:
  1177. if (get_user(val, (int *) arg))
  1178. return -EFAULT;
  1179. CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO
  1180. "cs4281: cs4281_ioctl(): Attempt to set fragsize=%d fragnum=%dn",
  1181. 1 << (val & 0xffff), (val >> 16) & 0xffff  ));
  1182. return 0; // Say OK, but do nothing.
  1183. case SNDCTL_DSP_SUBDIVIDE:
  1184. if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision)
  1185.     || (file->f_mode & FMODE_WRITE
  1186. && s->dma_dac.subdivision)) return -EINVAL;
  1187. if (get_user(val, (int *) arg))
  1188. return -EFAULT;
  1189. if (val != 1 && val != 2 && val != 4)
  1190. return -EINVAL;
  1191. if (file->f_mode & FMODE_READ)
  1192. s->dma_adc.subdivision = val;
  1193. else if (file->f_mode & FMODE_WRITE)
  1194. s->dma_dac.subdivision = val;
  1195. return 0;
  1196. case SOUND_PCM_READ_RATE:
  1197. if (file->f_mode & FMODE_READ)
  1198. return put_user(s->prop_adc.rate, (int *) arg);
  1199. else if (file->f_mode & FMODE_WRITE)
  1200. return put_user(s->prop_dac.rate, (int *) arg);
  1201. case SOUND_PCM_READ_CHANNELS:
  1202. if (file->f_mode & FMODE_READ)
  1203. return put_user(s->prop_adc.channels, (int *) arg);
  1204. else if (file->f_mode & FMODE_WRITE)
  1205. return put_user(s->prop_dac.channels, (int *) arg);
  1206. case SOUND_PCM_READ_BITS:
  1207. if (file->f_mode & FMODE_READ)
  1208. return
  1209.     put_user(
  1210.      (s->prop_adc.
  1211.       fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
  1212.      (int *) arg);
  1213. else if (file->f_mode & FMODE_WRITE)
  1214. return
  1215.     put_user(
  1216.      (s->prop_dac.
  1217.       fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
  1218.      (int *) arg);
  1219. case SOUND_PCM_WRITE_FILTER:
  1220. case SNDCTL_DSP_SETSYNCRO:
  1221. case SOUND_PCM_READ_FILTER:
  1222. return -EINVAL;
  1223. }
  1224. return mixer_ioctl(s, cmd, arg);
  1225. }
  1226. static int cs4281_release(struct inode *inode, struct file *file)
  1227. {
  1228. struct cs4281_state *s =
  1229.     (struct cs4281_state *) file->private_data;
  1230. CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk(KERN_INFO
  1231.  "cs4281: cs4281_release(): inode=0x%.8x file=0x%.8x f_mode=%dn",
  1232.  (unsigned) inode, (unsigned) file, file->f_mode));
  1233. VALIDATE_STATE(s);
  1234. if (file->f_mode & FMODE_WRITE) {
  1235. drain_dac(s, file->f_flags & O_NONBLOCK);
  1236. down(&s->open_sem_dac);
  1237. stop_dac(s);
  1238. dealloc_dmabuf(s, &s->dma_dac);
  1239. s->open_mode &= ~FMODE_WRITE;
  1240. up(&s->open_sem_dac);
  1241. wake_up(&s->open_wait_dac);
  1242. MOD_DEC_USE_COUNT;
  1243. }
  1244. if (file->f_mode & FMODE_READ) {
  1245. drain_adc(s, file->f_flags & O_NONBLOCK);
  1246. down(&s->open_sem_adc);
  1247. stop_adc(s);
  1248. dealloc_dmabuf(s, &s->dma_adc);
  1249. s->open_mode &= ~FMODE_READ;
  1250. up(&s->open_sem_adc);
  1251. wake_up(&s->open_wait_adc);
  1252. MOD_DEC_USE_COUNT;
  1253. }
  1254. return 0;
  1255. }
  1256. static int cs4281_open(struct inode *inode, struct file *file)
  1257. {
  1258. int minor = MINOR(inode->i_rdev);
  1259. struct cs4281_state *s=NULL;
  1260. struct list_head *entry;
  1261. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  1262. "cs4281: cs4281_open(): inode=0x%.8x file=0x%.8x f_mode=0x%xn",
  1263. (unsigned) inode, (unsigned) file, file->f_mode));
  1264. list_for_each(entry, &cs4281_devs)
  1265. {
  1266. s = list_entry(entry, struct cs4281_state, list);
  1267. if (!((s->dev_audio ^ minor) & ~0xf))
  1268. break;
  1269. }
  1270. if (entry == &cs4281_devs)
  1271. return -ENODEV;
  1272. if (!s) {
  1273. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  1274. "cs4281: cs4281_open(): Error - unable to find audio state structn"));
  1275. return -ENODEV;
  1276. }
  1277. VALIDATE_STATE(s);
  1278. file->private_data = s;
  1279. // wait for device to become free 
  1280. if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) {
  1281. CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO
  1282.  "cs4281: cs4281_open(): Error - must open READ and/or WRITEn"));
  1283. return -ENODEV;
  1284. }
  1285. if (file->f_mode & FMODE_WRITE) {
  1286. down(&s->open_sem_dac);
  1287. while (s->open_mode & FMODE_WRITE) {
  1288. if (file->f_flags & O_NONBLOCK) {
  1289. up(&s->open_sem_dac);
  1290. return -EBUSY;
  1291. }
  1292. up(&s->open_sem_dac);
  1293. interruptible_sleep_on(&s->open_wait_dac);
  1294. if (signal_pending(current))
  1295. return -ERESTARTSYS;
  1296. down(&s->open_sem_dac);
  1297. }
  1298. }
  1299. if (file->f_mode & FMODE_READ) {
  1300. down(&s->open_sem_adc);
  1301. while (s->open_mode & FMODE_READ) {
  1302. if (file->f_flags & O_NONBLOCK) {
  1303. up(&s->open_sem_adc);
  1304. return -EBUSY;
  1305. }
  1306. up(&s->open_sem_adc);
  1307. interruptible_sleep_on(&s->open_wait_adc);
  1308. if (signal_pending(current))
  1309. return -ERESTARTSYS;
  1310. down(&s->open_sem_adc);
  1311. }
  1312. }
  1313. s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
  1314. if (file->f_mode & FMODE_READ) {
  1315. s->prop_adc.fmt = AFMT_U8;
  1316. s->prop_adc.fmt_original = s->prop_adc.fmt;
  1317. s->prop_adc.channels = 1;
  1318. s->prop_adc.rate = 8000;
  1319. s->prop_adc.clkdiv = 96 | 0x80;
  1320. s->conversion = 0;
  1321. s->ena &= ~FMODE_READ;
  1322. s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
  1323.     s->dma_adc.subdivision = 0;
  1324. up(&s->open_sem_adc);
  1325. MOD_INC_USE_COUNT;
  1326. if (prog_dmabuf_adc(s)) {
  1327. CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
  1328. "cs4281: adc Program dmabufs failed.n"));
  1329. cs4281_release(inode, file);
  1330. return -ENOMEM;
  1331. }
  1332. prog_codec(s, CS_TYPE_ADC);
  1333. }
  1334. if (file->f_mode & FMODE_WRITE) {
  1335. s->prop_dac.fmt = AFMT_U8;
  1336. s->prop_dac.fmt_original = s->prop_dac.fmt;
  1337. s->prop_dac.channels = 1;
  1338. s->prop_dac.rate = 8000;
  1339. s->prop_dac.clkdiv = 96 | 0x80;
  1340. s->conversion = 0;
  1341. s->ena &= ~FMODE_WRITE;
  1342. s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
  1343.     s->dma_dac.subdivision = 0;
  1344. up(&s->open_sem_dac);
  1345. MOD_INC_USE_COUNT;
  1346. if (prog_dmabuf_dac(s)) {
  1347. CS_DBGOUT(CS_OPEN | CS_ERROR, 2, printk(KERN_ERR
  1348. "cs4281: dac Program dmabufs failed.n"));
  1349. cs4281_release(inode, file);
  1350. return -ENOMEM;
  1351. }
  1352. prog_codec(s, CS_TYPE_DAC);
  1353. }
  1354. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2,
  1355.   printk(KERN_INFO "cs4281: cs4281_open()- 0n"));
  1356. return 0;
  1357. }
  1358. // ******************************************************************************************
  1359. //   Wave (audio) file operations struct.
  1360. // ******************************************************************************************
  1361. static /*const */ struct file_operations cs4281_audio_fops = {
  1362. llseek:cs4281_llseek,
  1363. read:cs4281_read,
  1364. write:cs4281_write,
  1365. poll:cs4281_poll,
  1366. ioctl:cs4281_ioctl,
  1367. mmap:cs4281_mmap,
  1368. open:cs4281_open,
  1369. release:cs4281_release,
  1370. };
  1371. // --------------------------------------------------------------------- 
  1372. // hold spinlock for the following! 
  1373. static void cs4281_handle_midi(struct cs4281_state *s)
  1374. {
  1375. unsigned char ch;
  1376. int wake;
  1377. unsigned temp1;
  1378. wake = 0;
  1379. while (!(readl(s->pBA0 + BA0_MIDSR) & 0x80)) {
  1380. ch = readl(s->pBA0 + BA0_MIDRP);
  1381. if (s->midi.icnt < MIDIINBUF) {
  1382. s->midi.ibuf[s->midi.iwr] = ch;
  1383. s->midi.iwr = (s->midi.iwr + 1) % MIDIINBUF;
  1384. s->midi.icnt++;
  1385. }
  1386. wake = 1;
  1387. }
  1388. if (wake)
  1389. wake_up(&s->midi.iwait);
  1390. wake = 0;
  1391. while (!(readl(s->pBA0 + BA0_MIDSR) & 0x40) && s->midi.ocnt > 0) {
  1392. temp1 = (s->midi.obuf[s->midi.ord]) & 0x000000ff;
  1393. writel(temp1, s->pBA0 + BA0_MIDWP);
  1394. s->midi.ord = (s->midi.ord + 1) % MIDIOUTBUF;
  1395. s->midi.ocnt--;
  1396. if (s->midi.ocnt < MIDIOUTBUF - 16)
  1397. wake = 1;
  1398. }
  1399. if (wake)
  1400. wake_up(&s->midi.owait);
  1401. }
  1402. static void cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1403. {
  1404. struct cs4281_state *s = (struct cs4281_state *) dev_id;
  1405. unsigned int temp1;
  1406. // fastpath out, to ease interrupt sharing 
  1407. temp1 = readl(s->pBA0 + BA0_HISR); // Get Int Status reg.
  1408. CS_DBGOUT(CS_INTERRUPT, 6, printk(KERN_INFO
  1409.   "cs4281: cs4281_interrupt() BA0_HISR=0x%.8xn", temp1));
  1410. /*
  1411. * If not DMA or MIDI interrupt, then just return.
  1412. */
  1413. if (!(temp1 & (HISR_DMA0 | HISR_DMA1 | HISR_MIDI))) {
  1414. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR);
  1415. CS_DBGOUT(CS_INTERRUPT, 9, printk(KERN_INFO
  1416. "cs4281: cs4281_interrupt(): returning not cs4281 interrupt.n"));
  1417. return;
  1418. }
  1419. if (temp1 & HISR_DMA0) // If play interrupt,
  1420. readl(s->pBA0 + BA0_HDSR0); //   clear the source.
  1421. if (temp1 & HISR_DMA1) // Same for play.
  1422. readl(s->pBA0 + BA0_HDSR1);
  1423. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); // Local EOI
  1424. spin_lock(&s->lock);
  1425. cs4281_update_ptr(s,CS_TRUE);
  1426. cs4281_handle_midi(s);
  1427. spin_unlock(&s->lock);
  1428. }
  1429. // **************************************************************************
  1430. static void cs4281_midi_timer(unsigned long data)
  1431. {
  1432. struct cs4281_state *s = (struct cs4281_state *) data;
  1433. unsigned long flags;
  1434. spin_lock_irqsave(&s->lock, flags);
  1435. cs4281_handle_midi(s);
  1436. spin_unlock_irqrestore(&s->lock, flags);
  1437. s->midi.timer.expires = jiffies + 1;
  1438. add_timer(&s->midi.timer);
  1439. }
  1440. // --------------------------------------------------------------------- 
  1441. static ssize_t cs4281_midi_read(struct file *file, char *buffer,
  1442. size_t count, loff_t * ppos)
  1443. {
  1444. struct cs4281_state *s =
  1445.     (struct cs4281_state *) file->private_data;
  1446. ssize_t ret;
  1447. unsigned long flags;
  1448. unsigned ptr;
  1449. int cnt;
  1450. VALIDATE_STATE(s);
  1451. if (ppos != &file->f_pos)
  1452. return -ESPIPE;
  1453. if (!access_ok(VERIFY_WRITE, buffer, count))
  1454. return -EFAULT;
  1455. ret = 0;
  1456. while (count > 0) {
  1457. spin_lock_irqsave(&s->lock, flags);
  1458. ptr = s->midi.ird;
  1459. cnt = MIDIINBUF - ptr;
  1460. if (s->midi.icnt < cnt)
  1461. cnt = s->midi.icnt;
  1462. spin_unlock_irqrestore(&s->lock, flags);
  1463. if (cnt > count)
  1464. cnt = count;
  1465. if (cnt <= 0) {
  1466. if (file->f_flags & O_NONBLOCK)
  1467. return ret ? ret : -EAGAIN;
  1468. interruptible_sleep_on(&s->midi.iwait);
  1469. if (signal_pending(current))
  1470. return ret ? ret : -ERESTARTSYS;
  1471. continue;
  1472. }
  1473. if (copy_to_user(buffer, s->midi.ibuf + ptr, cnt))
  1474. return ret ? ret : -EFAULT;
  1475. ptr = (ptr + cnt) % MIDIINBUF;
  1476. spin_lock_irqsave(&s->lock, flags);
  1477. s->midi.ird = ptr;
  1478. s->midi.icnt -= cnt;
  1479. spin_unlock_irqrestore(&s->lock, flags);
  1480. count -= cnt;
  1481. buffer += cnt;
  1482. ret += cnt;
  1483. }
  1484. return ret;
  1485. }
  1486. static ssize_t cs4281_midi_write(struct file *file, const char *buffer,
  1487.  size_t count, loff_t * ppos)
  1488. {
  1489. struct cs4281_state *s =
  1490.     (struct cs4281_state *) file->private_data;
  1491. ssize_t ret;
  1492. unsigned long flags;
  1493. unsigned ptr;
  1494. int cnt;
  1495. VALIDATE_STATE(s);
  1496. if (ppos != &file->f_pos)
  1497. return -ESPIPE;
  1498. if (!access_ok(VERIFY_READ, buffer, count))
  1499. return -EFAULT;
  1500. ret = 0;
  1501. while (count > 0) {
  1502. spin_lock_irqsave(&s->lock, flags);
  1503. ptr = s->midi.owr;
  1504. cnt = MIDIOUTBUF - ptr;
  1505. if (s->midi.ocnt + cnt > MIDIOUTBUF)
  1506. cnt = MIDIOUTBUF - s->midi.ocnt;
  1507. if (cnt <= 0)
  1508. cs4281_handle_midi(s);
  1509. spin_unlock_irqrestore(&s->lock, flags);
  1510. if (cnt > count)
  1511. cnt = count;
  1512. if (cnt <= 0) {
  1513. if (file->f_flags & O_NONBLOCK)
  1514. return ret ? ret : -EAGAIN;
  1515. interruptible_sleep_on(&s->midi.owait);
  1516. if (signal_pending(current))
  1517. return ret ? ret : -ERESTARTSYS;
  1518. continue;
  1519. }
  1520. if (copy_from_user(s->midi.obuf + ptr, buffer, cnt))
  1521. return ret ? ret : -EFAULT;
  1522. ptr = (ptr + cnt) % MIDIOUTBUF;
  1523. spin_lock_irqsave(&s->lock, flags);
  1524. s->midi.owr = ptr;
  1525. s->midi.ocnt += cnt;
  1526. spin_unlock_irqrestore(&s->lock, flags);
  1527. count -= cnt;
  1528. buffer += cnt;
  1529. ret += cnt;
  1530. spin_lock_irqsave(&s->lock, flags);
  1531. cs4281_handle_midi(s);
  1532. spin_unlock_irqrestore(&s->lock, flags);
  1533. }
  1534. return ret;
  1535. }
  1536. static unsigned int cs4281_midi_poll(struct file *file,
  1537.      struct poll_table_struct *wait)
  1538. {
  1539. struct cs4281_state *s =
  1540.     (struct cs4281_state *) file->private_data;
  1541. unsigned long flags;
  1542. unsigned int mask = 0;
  1543. VALIDATE_STATE(s);
  1544. if (file->f_flags & FMODE_WRITE)
  1545. poll_wait(file, &s->midi.owait, wait);
  1546. if (file->f_flags & FMODE_READ)
  1547. poll_wait(file, &s->midi.iwait, wait);
  1548. spin_lock_irqsave(&s->lock, flags);
  1549. if (file->f_flags & FMODE_READ) {
  1550. if (s->midi.icnt > 0)
  1551. mask |= POLLIN | POLLRDNORM;
  1552. }
  1553. if (file->f_flags & FMODE_WRITE) {
  1554. if (s->midi.ocnt < MIDIOUTBUF)
  1555. mask |= POLLOUT | POLLWRNORM;
  1556. }
  1557. spin_unlock_irqrestore(&s->lock, flags);
  1558. return mask;
  1559. }
  1560. static int cs4281_midi_open(struct inode *inode, struct file *file)
  1561. {
  1562. unsigned long flags, temp1;
  1563. int minor = MINOR(inode->i_rdev);
  1564. struct cs4281_state *s=NULL;
  1565. struct list_head *entry;
  1566. list_for_each(entry, &cs4281_devs)
  1567. {
  1568. s = list_entry(entry, struct cs4281_state, list);
  1569. if (s->dev_midi == minor)
  1570. break;
  1571. }
  1572. if (entry == &cs4281_devs)
  1573. return -ENODEV;
  1574. if (!s)
  1575. {
  1576. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  1577. "cs4281: cs4281_open(): Error - unable to find audio state structn"));
  1578. return -ENODEV;
  1579. }
  1580. VALIDATE_STATE(s);
  1581. file->private_data = s;
  1582. // wait for device to become free 
  1583. down(&s->open_sem);
  1584. while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
  1585. if (file->f_flags & O_NONBLOCK) {
  1586. up(&s->open_sem);
  1587. return -EBUSY;
  1588. }
  1589. up(&s->open_sem);
  1590. interruptible_sleep_on(&s->open_wait);
  1591. if (signal_pending(current))
  1592. return -ERESTARTSYS;
  1593. down(&s->open_sem);
  1594. }
  1595. spin_lock_irqsave(&s->lock, flags);
  1596. if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
  1597. s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
  1598. s->midi.ord = s->midi.owr = s->midi.ocnt = 0;
  1599. writel(1, s->pBA0 + BA0_MIDCR); // Reset the interface.
  1600. writel(0, s->pBA0 + BA0_MIDCR); // Return to normal mode.
  1601. s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
  1602. writel(0x0000000f, s->pBA0 + BA0_MIDCR); // Enable transmit, record, ints.
  1603. temp1 = readl(s->pBA0 + BA0_HIMR);
  1604. writel(temp1 & 0xffbfffff, s->pBA0 + BA0_HIMR); // Enable midi int. recognition.
  1605. writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); // Enable interrupts
  1606. init_timer(&s->midi.timer);
  1607. s->midi.timer.expires = jiffies + 1;
  1608. s->midi.timer.data = (unsigned long) s;
  1609. s->midi.timer.function = cs4281_midi_timer;
  1610. add_timer(&s->midi.timer);
  1611. }
  1612. if (file->f_mode & FMODE_READ) {
  1613. s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
  1614. }
  1615. if (file->f_mode & FMODE_WRITE) {
  1616. s->midi.ord = s->midi.owr = s->midi.ocnt = 0;
  1617. }
  1618. spin_unlock_irqrestore(&s->lock, flags);
  1619. s->open_mode |=
  1620.     (file->
  1621.      f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ |
  1622.     FMODE_MIDI_WRITE);
  1623. up(&s->open_sem);
  1624. MOD_INC_USE_COUNT;
  1625. return 0;
  1626. }
  1627. static int cs4281_midi_release(struct inode *inode, struct file *file)
  1628. {
  1629. struct cs4281_state *s =
  1630.     (struct cs4281_state *) file->private_data;
  1631. DECLARE_WAITQUEUE(wait, current);
  1632. unsigned long flags;
  1633. unsigned count, tmo;
  1634. VALIDATE_STATE(s);
  1635. if (file->f_mode & FMODE_WRITE) {
  1636. add_wait_queue(&s->midi.owait, &wait);
  1637. for (;;) {
  1638. set_current_state(TASK_INTERRUPTIBLE);
  1639. spin_lock_irqsave(&s->lock, flags);
  1640. count = s->midi.ocnt;
  1641. spin_unlock_irqrestore(&s->lock, flags);
  1642. if (count <= 0)
  1643. break;
  1644. if (signal_pending(current))
  1645. break;
  1646. if (file->f_flags & O_NONBLOCK) {
  1647. remove_wait_queue(&s->midi.owait, &wait);
  1648. current->state = TASK_RUNNING;
  1649. return -EBUSY;
  1650. }
  1651. tmo = (count * HZ) / 3100;
  1652. if (!schedule_timeout(tmo ? : 1) && tmo)
  1653. printk(KERN_DEBUG
  1654.        "cs4281: midi timed out??n");
  1655. }
  1656. remove_wait_queue(&s->midi.owait, &wait);
  1657. current->state = TASK_RUNNING;
  1658. }
  1659. down(&s->open_sem);
  1660. s->open_mode &=
  1661.     (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ |
  1662.      FMODE_MIDI_WRITE);
  1663. spin_lock_irqsave(&s->lock, flags);
  1664. if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
  1665. writel(0, s->pBA0 + BA0_MIDCR); // Disable Midi interrupts.  
  1666. del_timer(&s->midi.timer);
  1667. }
  1668. spin_unlock_irqrestore(&s->lock, flags);
  1669. up(&s->open_sem);
  1670. wake_up(&s->open_wait);
  1671. MOD_DEC_USE_COUNT;
  1672. return 0;
  1673. }
  1674. // ******************************************************************************************
  1675. //   Midi file operations struct.
  1676. // ******************************************************************************************
  1677. static /*const */ struct file_operations cs4281_midi_fops = {
  1678. llseek:cs4281_llseek,
  1679. read:cs4281_midi_read,
  1680. write:cs4281_midi_write,
  1681. poll:cs4281_midi_poll,
  1682. open:cs4281_midi_open,
  1683. release:cs4281_midi_release,
  1684. };
  1685. // --------------------------------------------------------------------- 
  1686. // maximum number of devices 
  1687. #define NR_DEVICE 8 // Only eight devices supported currently.
  1688. // --------------------------------------------------------------------- 
  1689. static struct initvol {
  1690. int mixch;
  1691. int vol;
  1692. } initvol[] __initdata = {
  1693. {
  1694. SOUND_MIXER_WRITE_VOLUME, 0x4040}, {
  1695. SOUND_MIXER_WRITE_PCM, 0x4040}, {
  1696. SOUND_MIXER_WRITE_SYNTH, 0x4040}, {
  1697. SOUND_MIXER_WRITE_CD, 0x4040}, {
  1698. SOUND_MIXER_WRITE_LINE, 0x4040}, {
  1699. SOUND_MIXER_WRITE_LINE1, 0x4040}, {
  1700. SOUND_MIXER_WRITE_RECLEV, 0x0000}, {
  1701. SOUND_MIXER_WRITE_SPEAKER, 0x4040}, {
  1702. SOUND_MIXER_WRITE_MIC, 0x0000}
  1703. };
  1704. #ifndef NOT_CS4281_PM
  1705. void __devinit cs4281_BuildFIFO(
  1706. struct cs4281_pipeline *p, 
  1707. struct cs4281_state *s)
  1708. {
  1709. switch(p->number)
  1710. {
  1711. case 0:  /* playback */
  1712. {
  1713. p->u32FCRnAddress  =  BA0_FCR0;
  1714. p->u32FSICnAddress = BA0_FSIC0;
  1715. p->u32FPDRnAddress = BA0_FPDR0;
  1716. break;
  1717. }
  1718. case 1:  /* capture */
  1719. {
  1720. p->u32FCRnAddress  =  BA0_FCR1;
  1721. p->u32FSICnAddress = BA0_FSIC1;
  1722. p->u32FPDRnAddress = BA0_FPDR1;
  1723. break;
  1724. }
  1725. case 2: 
  1726. {
  1727. p->u32FCRnAddress  =  BA0_FCR2;
  1728. p->u32FSICnAddress = BA0_FSIC2;
  1729. p->u32FPDRnAddress = BA0_FPDR2;
  1730. break;
  1731. }
  1732. case 3: 
  1733. {
  1734. p->u32FCRnAddress  =  BA0_FCR3;
  1735. p->u32FSICnAddress = BA0_FSIC3;
  1736. p->u32FPDRnAddress = BA0_FPDR3;
  1737. break;
  1738. }
  1739. default:
  1740. break;
  1741. }
  1742. //
  1743. // first read the hardware to initialize the member variables
  1744. //
  1745. p->u32FCRnValue = readl(s->pBA0 + p->u32FCRnAddress);
  1746. p->u32FSICnValue = readl(s->pBA0 + p->u32FSICnAddress);
  1747. p->u32FPDRnValue = readl(s->pBA0 + p->u32FPDRnAddress);
  1748. }
  1749. void __devinit cs4281_BuildDMAengine(
  1750. struct cs4281_pipeline *p, 
  1751. struct cs4281_state *s)
  1752. {
  1753. /*
  1754. * initialize all the addresses of this pipeline dma info.
  1755. */
  1756. switch(p->number)
  1757. {
  1758. case 0:  /* playback */
  1759. {
  1760. p->u32DBAnAddress = BA0_DBA0;
  1761. p->u32DCAnAddress = BA0_DCA0;
  1762. p->u32DBCnAddress = BA0_DBC0;
  1763. p->u32DCCnAddress = BA0_DCC0;
  1764. p->u32DMRnAddress = BA0_DMR0;
  1765. p->u32DCRnAddress = BA0_DCR0;
  1766. p->u32HDSRnAddress = BA0_HDSR0;
  1767. break;
  1768. }
  1769. case 1: /* capture */
  1770. {
  1771. p->u32DBAnAddress = BA0_DBA1;
  1772. p->u32DCAnAddress = BA0_DCA1;
  1773. p->u32DBCnAddress = BA0_DBC1;
  1774. p->u32DCCnAddress = BA0_DCC1;
  1775. p->u32DMRnAddress = BA0_DMR1;
  1776. p->u32DCRnAddress = BA0_DCR1;
  1777. p->u32HDSRnAddress = BA0_HDSR1;
  1778. break;
  1779. }
  1780. case 2:
  1781. {
  1782. p->u32DBAnAddress = BA0_DBA2;
  1783. p->u32DCAnAddress = BA0_DCA2;
  1784. p->u32DBCnAddress = BA0_DBC2;
  1785. p->u32DCCnAddress = BA0_DCC2;
  1786. p->u32DMRnAddress = BA0_DMR2;
  1787. p->u32DCRnAddress = BA0_DCR2;
  1788. p->u32HDSRnAddress = BA0_HDSR2;
  1789. break;
  1790. }
  1791. case 3:
  1792. {
  1793. p->u32DBAnAddress = BA0_DBA3;
  1794. p->u32DCAnAddress = BA0_DCA3;
  1795. p->u32DBCnAddress = BA0_DBC3;
  1796. p->u32DCCnAddress = BA0_DCC3;
  1797. p->u32DMRnAddress = BA0_DMR3;
  1798. p->u32DCRnAddress = BA0_DCR3;
  1799. p->u32HDSRnAddress = BA0_HDSR3;
  1800. break;
  1801. }
  1802. default:
  1803. break;
  1804. }
  1805. //
  1806. // Initialize the dma values for this pipeline
  1807. //
  1808. p->u32DBAnValue = readl(s->pBA0 + p->u32DBAnAddress);
  1809. p->u32DBCnValue = readl(s->pBA0 + p->u32DBCnAddress);
  1810. p->u32DMRnValue = readl(s->pBA0 + p->u32DMRnAddress);
  1811. p->u32DCRnValue = readl(s->pBA0 + p->u32DCRnAddress);
  1812. }
  1813. void __devinit cs4281_InitPM(struct cs4281_state *s)
  1814. {
  1815. int i;
  1816. struct cs4281_pipeline *p;
  1817. for(i=0;i<CS4281_NUMBER_OF_PIPELINES;i++)
  1818. {
  1819. p = &s->pl[i];
  1820. p->number = i;
  1821. cs4281_BuildDMAengine(p,s);
  1822. cs4281_BuildFIFO(p,s);
  1823. /*
  1824. * currently only  2 pipelines are used
  1825. * so, only set the valid bit on the playback and capture.
  1826. */
  1827. if( (i == CS4281_PLAYBACK_PIPELINE_NUMBER) || 
  1828. (i == CS4281_CAPTURE_PIPELINE_NUMBER))
  1829. p->flags |= CS4281_PIPELINE_VALID;
  1830. }
  1831. s->pm.u32SSPM_BITS = 0x7e;  /* rev c, use 0x7c for rev a or b */
  1832. }
  1833. #endif
  1834. /*
  1835. * ss_vendor and ss_id must be setup prior to calling this routine.
  1836. * setup the invalid recording source bitmask,
  1837. * and also return a valid default initialization value as
  1838. * the return value;
  1839. */
  1840. static int cs4281_setup_record_src(struct cs4281_state *s)
  1841. {
  1842. if(s->ss_vendor == PCI_VENDOR_ID_TOSHIBA)
  1843. {
  1844. if(s->ss_id == SS_ID_TOSHIBA_1640CDT)
  1845. {
  1846. CS_DBGOUT(CS_PARMS, 2, printk(KERN_INFO
  1847.   "cs4281: cs4281_setup_record_src(): setting LINE invalidn"));
  1848. recsrc_invalid |= SOUND_MASK_LINE;
  1849. }
  1850. }
  1851. /*
  1852. * only return a valid recsrc value here, default to something useful.
  1853. */
  1854. if(!(recsrc_invalid & SOUND_MASK_MIC))
  1855. return(SOUND_MASK_MIC);
  1856. else if(!(recsrc_invalid & SOUND_MASK_LINE))
  1857. return(SOUND_MASK_LINE);
  1858. else if(!(recsrc_invalid & SOUND_MASK_LINE1))
  1859. return(SOUND_MASK_LINE1);
  1860. return 0;
  1861. }
  1862. static int __devinit cs4281_probe(struct pci_dev *pcidev,
  1863.   const struct pci_device_id *pciid)
  1864. {
  1865. #ifndef NOT_CS4281_PM
  1866. struct pm_dev *pmdev;
  1867. #endif
  1868. struct cs4281_state *s;
  1869. dma_addr_t dma_mask;
  1870. mm_segment_t fs;
  1871. int i, val;
  1872. unsigned int temp1, temp2;
  1873. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
  1874.   printk(KERN_INFO "cs4281: probe()+n"));
  1875. if (pci_enable_device(pcidev)) {
  1876. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  1877.  "cs4281: pci_enable_device() failedn"));
  1878. return -1;
  1879. }
  1880. if (!(pci_resource_flags(pcidev, 0) & IORESOURCE_MEM) ||
  1881.     !(pci_resource_flags(pcidev, 1) & IORESOURCE_MEM)) {
  1882.   CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  1883.    "cs4281: probe()- Memory region not assignedn"));
  1884. return -ENODEV;
  1885.   }
  1886.   if (pcidev->irq == 0) {
  1887.   CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  1888.    "cs4281: probe() IRQ not assignedn"));
  1889. return -ENODEV;
  1890.   }
  1891. dma_mask = 0xffffffff; /* this enables playback and recording */
  1892. i = pci_set_dma_mask(pcidev, dma_mask);
  1893. if (i) {
  1894.   CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  1895.         "cs4281: probe() architecture does not support 32bit PCI busmaster DMAn"));
  1896. return i;
  1897.   }
  1898. if (!(s = kmalloc(sizeof(struct cs4281_state), GFP_KERNEL))) {
  1899. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  1900.       "cs4281: probe() no memory for state struct.n"));
  1901. return -1;
  1902. }
  1903. memset(s, 0, sizeof(struct cs4281_state));
  1904. init_waitqueue_head(&s->dma_adc.wait);
  1905. init_waitqueue_head(&s->dma_dac.wait);
  1906. init_waitqueue_head(&s->open_wait);
  1907. init_waitqueue_head(&s->open_wait_adc);
  1908. init_waitqueue_head(&s->open_wait_dac);
  1909. init_waitqueue_head(&s->midi.iwait);
  1910. init_waitqueue_head(&s->midi.owait);
  1911. init_MUTEX(&s->open_sem);
  1912. init_MUTEX(&s->open_sem_adc);
  1913. init_MUTEX(&s->open_sem_dac);
  1914. spin_lock_init(&s->lock);
  1915. s->pBA0phys = pci_resource_start(pcidev, 0);
  1916. s->pBA1phys = pci_resource_start(pcidev, 1);
  1917. /* Convert phys to linear. */
  1918. s->pBA0 = ioremap_nocache(s->pBA0phys, 4096);
  1919. if (!s->pBA0) {
  1920. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_ERR
  1921.  "cs4281: BA0 I/O mapping failed. Skipping part.n"));
  1922. goto err_free;
  1923. }
  1924. s->pBA1 = ioremap_nocache(s->pBA1phys, 65536);
  1925. if (!s->pBA1) {
  1926. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_ERR
  1927.  "cs4281: BA1 I/O mapping failed. Skipping part.n"));
  1928. goto err_unmap;
  1929. }
  1930. temp1 = readl(s->pBA0 + BA0_PCICFG00);
  1931. temp2 = readl(s->pBA0 + BA0_PCICFG04);
  1932. CS_DBGOUT(CS_INIT, 2,
  1933.   printk(KERN_INFO
  1934.  "cs4281: probe() BA0=0x%.8x BA1=0x%.8x pBA0=0x%.8x pBA1=0x%.8x n",
  1935.  (unsigned) temp1, (unsigned) temp2,
  1936.  (unsigned) s->pBA0, (unsigned) s->pBA1));
  1937. CS_DBGOUT(CS_INIT, 2,
  1938.   printk(KERN_INFO
  1939.  "cs4281: probe() pBA0phys=0x%.8x pBA1phys=0x%.8xn",
  1940.  (unsigned) s->pBA0phys, (unsigned) s->pBA1phys));
  1941. #ifndef NOT_CS4281_PM
  1942. s->pm.flags = CS4281_PM_IDLE;
  1943. #endif
  1944. temp1 = cs4281_hw_init(s);
  1945. if (temp1) {
  1946. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_ERR
  1947.  "cs4281: cs4281_hw_init() failed. Skipping part.n"));
  1948. goto err_irq;
  1949. }
  1950. s->magic = CS4281_MAGIC;
  1951. s->pcidev = pcidev;
  1952. s->irq = pcidev->irq;
  1953. if (request_irq
  1954.     (s->irq, cs4281_interrupt, SA_SHIRQ, "Crystal CS4281", s)) {
  1955. CS_DBGOUT(CS_INIT | CS_ERROR, 1,
  1956.   printk(KERN_ERR "cs4281: irq %u in usen", s->irq));
  1957. goto err_irq;
  1958. }
  1959. if ((s->dev_audio = register_sound_dsp(&cs4281_audio_fops, -1)) <
  1960.     0) {
  1961. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  1962.  "cs4281: probe() register_sound_dsp() failed.n"));
  1963. goto err_dev1;
  1964. }
  1965. if ((s->dev_mixer = register_sound_mixer(&cs4281_mixer_fops, -1)) <
  1966.     0) {
  1967. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  1968.  "cs4281: probe() register_sound_mixer() failed.n"));
  1969. goto err_dev2;
  1970. }
  1971. if ((s->dev_midi = register_sound_midi(&cs4281_midi_fops, -1)) < 0) {
  1972. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  1973.  "cs4281: probe() register_sound_midi() failed.n"));
  1974. goto err_dev3;
  1975. }
  1976. #ifndef NOT_CS4281_PM
  1977. cs4281_InitPM(s);
  1978. pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pcidev), cs4281_pm_callback);
  1979. if (pmdev)
  1980. {
  1981. CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
  1982.  "cs4281: probe() pm_register() succeeded (0x%x).n",
  1983. (unsigned)pmdev));
  1984. pmdev->data = s;
  1985. }
  1986. else
  1987. {
  1988. CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 0, printk(KERN_INFO
  1989.  "cs4281: probe() pm_register() failed (0x%x).n",
  1990. (unsigned)pmdev));
  1991. s->pm.flags |= CS4281_PM_NOT_REGISTERED;
  1992. }
  1993. #endif
  1994. pci_set_master(pcidev); // enable bus mastering 
  1995. pci_read_config_word(pcidev, PCI_SUBSYSTEM_VENDOR_ID, &s->ss_vendor);
  1996. pci_read_config_word(pcidev, PCI_SUBSYSTEM_ID, &s->ss_id);
  1997. printk(KERN_INFO "cs4281: Subsystem vendor/id (%04X:%04X) IRQ %dn",
  1998. s->ss_vendor, s->ss_id, s->irq);
  1999. if(!recsrc_invalid)
  2000. val = cs4281_setup_record_src(s);
  2001. else
  2002. val = SOUND_MASK_MIC;
  2003. fs = get_fs();
  2004. set_fs(KERNEL_DS);
  2005. mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long) &val);
  2006. for (i = 0; i < sizeof(initvol) / sizeof(initvol[0]); i++) {
  2007. val = initvol[i].vol;
  2008. mixer_ioctl(s, initvol[i].mixch, (unsigned long) &val);
  2009. }
  2010. val = 1; // enable mic preamp 
  2011. mixer_ioctl(s, SOUND_MIXER_PRIVATE1, (unsigned long) &val);
  2012. set_fs(fs);
  2013. pci_set_drvdata(pcidev, s);
  2014. list_add(&s->list, &cs4281_devs);
  2015. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2016. "cs4281: probe()- device allocated successfullyn"));
  2017. return 0;
  2018.       err_dev3:
  2019. unregister_sound_mixer(s->dev_mixer);
  2020.       err_dev2:
  2021. unregister_sound_dsp(s->dev_audio);
  2022.       err_dev1:
  2023. free_irq(s->irq, s);
  2024.       err_irq:
  2025. iounmap(s->pBA1);
  2026.       err_unmap:
  2027. iounmap(s->pBA0);
  2028.       err_free:
  2029. kfree(s);
  2030. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
  2031. "cs4281: probe()- no device allocatedn"));
  2032. return -ENODEV;
  2033. } // probe_cs4281
  2034. // --------------------------------------------------------------------- 
  2035. static void __devinit cs4281_remove(struct pci_dev *pci_dev)
  2036. {
  2037. struct cs4281_state *s = pci_get_drvdata(pci_dev);
  2038. // stop DMA controller 
  2039. synchronize_irq();
  2040. free_irq(s->irq, s);
  2041. unregister_sound_dsp(s->dev_audio);
  2042. unregister_sound_mixer(s->dev_mixer);
  2043. unregister_sound_midi(s->dev_midi);
  2044. iounmap(s->pBA1);
  2045. iounmap(s->pBA0);
  2046. pci_set_drvdata(pci_dev, s);
  2047. list_del(&s->list);
  2048. kfree(s);
  2049. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2050.  "cs4281: cs4281_remove()-: remove successfuln"));
  2051. }
  2052. static struct pci_device_id cs4281_pci_tbl[] __devinitdata = {
  2053. {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CRYSTAL_CS4281,
  2054.  PCI_ANY_ID, PCI_ANY_ID, 0, 0},
  2055. {0,}
  2056. };
  2057. MODULE_DEVICE_TABLE(pci, cs4281_pci_tbl);
  2058. struct pci_driver cs4281_pci_driver = {
  2059. name:"cs4281",
  2060. id_table:cs4281_pci_tbl,
  2061. probe:cs4281_probe,
  2062. remove:cs4281_remove,
  2063. suspend:CS4281_SUSPEND_TBL,
  2064. resume:CS4281_RESUME_TBL,
  2065. };
  2066. int __init cs4281_init_module(void)
  2067. {
  2068. int rtn = 0;
  2069. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO 
  2070. "cs4281: cs4281_init_module()+ n"));
  2071. if (!pci_present()) { /* No PCI bus in this machine! */
  2072. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2073. "cs4281: cs4281_init_module()- no pci bus foundn"));
  2074. return -ENODEV;
  2075. }
  2076. printk(KERN_INFO "cs4281: version v%d.%02d.%d time " __TIME__ " "
  2077.        __DATE__ "n", CS4281_MAJOR_VERSION, CS4281_MINOR_VERSION,
  2078.        CS4281_ARCH);
  2079. rtn = pci_module_init(&cs4281_pci_driver);
  2080. if(rtn == -ENODEV)
  2081. {
  2082. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk( 
  2083. "cs4281: Unable to locate any cs4281 device with valid IDs 0x%x-0x%xn",
  2084. PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CRYSTAL_CS4281));
  2085. }
  2086. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
  2087.   printk(KERN_INFO "cs4281: cs4281_init_module()- (%d)n",rtn));
  2088. return rtn;
  2089. }
  2090. void __exit cs4281_cleanup_module(void)
  2091. {
  2092. pci_unregister_driver(&cs4281_pci_driver);
  2093. #ifndef NOT_CS4281_PM
  2094. cs_pm_unregister_all(cs4281_pm_callback);
  2095. #endif
  2096. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
  2097.   printk(KERN_INFO "cs4281: cleanup_cs4281() finishedn"));
  2098. }
  2099. // --------------------------------------------------------------------- 
  2100. MODULE_AUTHOR("gw boynton, pcaudio@crystal.cirrus.com");
  2101. MODULE_DESCRIPTION("Cirrus Logic CS4281 Driver");
  2102. MODULE_LICENSE("GPL");
  2103. // --------------------------------------------------------------------- 
  2104. module_init(cs4281_init_module);
  2105. module_exit(cs4281_cleanup_module);
  2106. #ifndef MODULE
  2107. int __init init_cs4281(void)
  2108. {
  2109. return cs4281_init_module();
  2110. }
  2111. #endif
  2112. #include "cs4281pm-24.c"