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

Linux/Unix编程

开发平台:

Unix_Linux

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