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

嵌入式Linux

开发平台:

Unix_Linux

  1. }
  2. return -ENODEV;
  3. case SNDCTL_DSP_GETISPACE:
  4. if (!(file->f_mode & FMODE_READ))
  5. return -EINVAL;
  6. state = (struct cs_state *)card->states[0];
  7. if(state)
  8. {
  9. dmabuf = &state->dmabuf;
  10. spin_lock_irqsave(&state->card->lock, flags);
  11. cs_update_ptr(card, CS_TRUE);
  12. abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
  13. abinfo.bytes = dmabuf->count/dmabuf->divisor;
  14. abinfo.fragstotal = dmabuf->numfrag;
  15. abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
  16. spin_unlock_irqrestore(&state->card->lock, flags);
  17. return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  18. }
  19. return -ENODEV;
  20. case SNDCTL_DSP_NONBLOCK:
  21. file->f_flags |= O_NONBLOCK;
  22. return 0;
  23. case SNDCTL_DSP_GETCAPS:
  24. return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
  25.     (int *)arg);
  26. case SNDCTL_DSP_GETTRIGGER:
  27. val = 0;
  28. CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+n") );
  29. if (file->f_mode & FMODE_WRITE)
  30. {
  31. state = (struct cs_state *)card->states[1];
  32. if(state)
  33. {
  34. dmabuf = &state->dmabuf;
  35. if(dmabuf->enable & DAC_RUNNING)
  36. val |= PCM_ENABLE_INPUT;
  37. }
  38. }
  39. if (file->f_mode & FMODE_READ)
  40. {
  41. if(state)
  42. {
  43. state = (struct cs_state *)card->states[0];
  44. dmabuf = &state->dmabuf;
  45. if(dmabuf->enable & ADC_RUNNING)
  46. val |= PCM_ENABLE_OUTPUT;
  47. }
  48. }
  49. CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%xn",val) );
  50. return put_user(val, (int *)arg);
  51. case SNDCTL_DSP_SETTRIGGER:
  52. if (get_user(val, (int *)arg))
  53. return -EFAULT;
  54. if (file->f_mode & FMODE_READ) {
  55. state = (struct cs_state *)card->states[0];
  56. if(state)
  57. {
  58. dmabuf = &state->dmabuf;
  59. if (val & PCM_ENABLE_INPUT) {
  60. if (!dmabuf->ready && (ret = prog_dmabuf(state)))
  61. return ret;
  62. start_adc(state);
  63. } else
  64. stop_adc(state);
  65. }
  66. }
  67. if (file->f_mode & FMODE_WRITE) {
  68. state = (struct cs_state *)card->states[1];
  69. if(state)
  70. {
  71. dmabuf = &state->dmabuf;
  72. if (val & PCM_ENABLE_OUTPUT) {
  73. if (!dmabuf->ready && (ret = prog_dmabuf(state)))
  74. return ret;
  75. start_dac(state);
  76. } else
  77. stop_dac(state);
  78. }
  79. }
  80. return 0;
  81. case SNDCTL_DSP_GETIPTR:
  82. if (!(file->f_mode & FMODE_READ))
  83. return -EINVAL;
  84. state = (struct cs_state *)card->states[0];
  85. if(state)
  86. {
  87. dmabuf = &state->dmabuf;
  88. spin_lock_irqsave(&state->card->lock, flags);
  89. cs_update_ptr(card, CS_TRUE);
  90. cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
  91. cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
  92. cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
  93. spin_unlock_irqrestore(&state->card->lock, flags);
  94. return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
  95. }
  96. return -ENODEV;
  97. case SNDCTL_DSP_GETOPTR:
  98. if (!(file->f_mode & FMODE_WRITE))
  99. return -EINVAL;
  100. state = (struct cs_state *)card->states[1];
  101. if(state)
  102. {
  103. dmabuf = &state->dmabuf;
  104. spin_lock_irqsave(&state->card->lock, flags);
  105. cs_update_ptr(card, CS_TRUE);
  106. cinfo.bytes = dmabuf->total_bytes;
  107. if (dmabuf->mapped)
  108. {
  109. cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift) 
  110. - dmabuf->blocks;
  111. CS_DBGOUT(CS_PARMS, 8, 
  112. printk("total_bytes=%d blocks=%d dmabuf->blocks=%dn", 
  113. cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
  114. dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
  115. }
  116. else
  117. {
  118. cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
  119. }
  120. cinfo.ptr = dmabuf->hwptr;
  121. CS_DBGOUT(CS_PARMS, 4, printk(
  122.     "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%dn",
  123. cinfo.bytes,cinfo.blocks,cinfo.ptr) );
  124. spin_unlock_irqrestore(&state->card->lock, flags);
  125. return copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
  126. }
  127. return -ENODEV;
  128. case SNDCTL_DSP_SETDUPLEX:
  129. return 0;
  130. case SNDCTL_DSP_GETODELAY:
  131. if (!(file->f_mode & FMODE_WRITE))
  132. return -EINVAL;
  133. state = (struct cs_state *)card->states[1];
  134. if(state)
  135. {
  136. dmabuf = &state->dmabuf;
  137. spin_lock_irqsave(&state->card->lock, flags);
  138. cs_update_ptr(card, CS_TRUE);
  139. val = dmabuf->count;
  140. spin_unlock_irqrestore(&state->card->lock, flags);
  141. }
  142. else
  143. val = 0;
  144. return put_user(val, (int *)arg);
  145. case SOUND_PCM_READ_RATE:
  146. if(file->f_mode & FMODE_READ)
  147. state = (struct cs_state *)card->states[0];
  148. else 
  149. state = (struct cs_state *)card->states[1];
  150. if(state)
  151. {
  152. dmabuf = &state->dmabuf;
  153. return put_user(dmabuf->rate, (int *)arg);
  154. }
  155. return put_user(0, (int *)arg);
  156. case SOUND_PCM_READ_CHANNELS:
  157. if(file->f_mode & FMODE_READ)
  158. state = (struct cs_state *)card->states[0];
  159. else 
  160. state = (struct cs_state *)card->states[1];
  161. if(state)
  162. {
  163. dmabuf = &state->dmabuf;
  164. return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
  165. (int *)arg);
  166. }
  167. return put_user(0, (int *)arg);
  168. case SOUND_PCM_READ_BITS:
  169. if(file->f_mode & FMODE_READ)
  170. state = (struct cs_state *)card->states[0];
  171. else 
  172. state = (struct cs_state *)card->states[1];
  173. if(state)
  174. {
  175. dmabuf = &state->dmabuf;
  176. return put_user((dmabuf->fmt & CS_FMT_16BIT) ? 
  177.    AFMT_S16_LE : AFMT_U8, (int *)arg);
  178. }
  179. return put_user(0, (int *)arg);
  180. case SNDCTL_DSP_MAPINBUF:
  181. case SNDCTL_DSP_MAPOUTBUF:
  182. case SNDCTL_DSP_SETSYNCRO:
  183. case SOUND_PCM_WRITE_FILTER:
  184. case SOUND_PCM_READ_FILTER:
  185. return -EINVAL;
  186. }
  187. return -EINVAL;
  188. }
  189. /*
  190.  * AMP control - null AMP
  191.  */
  192.  
  193. static void amp_none(struct cs_card *card, int change)
  194. {
  195. }
  196. /*
  197.  * Crystal EAPD mode
  198.  */
  199.  
  200. static void amp_voyetra(struct cs_card *card, int change)
  201. {
  202. /* Manage the EAPD bit on the Crystal 4297 
  203.    and the Analog AD1885 */
  204.    
  205. int old=card->amplifier;
  206. card->amplifier+=change;
  207. if(card->amplifier && !old)
  208. {
  209. /* Turn the EAPD amp on */
  210. cs_ac97_set(card->ac97_codec[0],  AC97_POWER_CONTROL, 
  211. cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
  212. 0x8000);
  213. }
  214. else if(old && !card->amplifier)
  215. {
  216. /* Turn the EAPD amp off */
  217. cs_ac97_set(card->ac97_codec[0],  AC97_POWER_CONTROL, 
  218. cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
  219. ~0x8000);
  220. }
  221. }
  222.        
  223. /*
  224.  * Game Theatre XP card - EGPIO[2] is used to enable the external amp.
  225.  */
  226.  
  227. static void amp_hercules(struct cs_card *card, int change)
  228. {
  229. int old=card->amplifier;
  230. if(!card)
  231. {
  232. CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO 
  233. "cs46xx: amp_hercules() called before initialized.n"));
  234. return;
  235. }
  236. card->amplifier+=change;
  237. if( (card->amplifier && !old) && !(hercules_egpio_disable))
  238. {
  239. CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO 
  240. "cs46xx: amp_hercules() external amp enabledn"));
  241. cs461x_pokeBA0(card, BA0_EGPIODR, 
  242. EGPIODR_GPOE2);     /* enable EGPIO2 output */
  243. cs461x_pokeBA0(card, BA0_EGPIOPTR, 
  244. EGPIOPTR_GPPT2);   /* open-drain on output */
  245. }
  246. else if(old && !card->amplifier)
  247. {
  248. CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO 
  249. "cs46xx: amp_hercules() external amp disabledn"));
  250. cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
  251. cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
  252. }
  253. }
  254. /*
  255.  * Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
  256.  * whenever we need to beat on the chip.
  257.  *
  258.  * The original idea and code for this hack comes from David Kaiser at
  259.  * Linuxcare. Perhaps one day Crystal will document their chips well
  260.  * enough to make them useful.
  261.  */
  262.  
  263. static void clkrun_hack(struct cs_card *card, int change)
  264. {
  265. struct pci_dev *acpi_dev;
  266. u16 control;
  267. u8 pp;
  268. unsigned long port;
  269. int old=card->active;
  270. card->active+=change;
  271. acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
  272. if(acpi_dev == NULL)
  273. return; /* Not a thinkpad thats for sure */
  274. /* Find the control port */
  275. pci_read_config_byte(acpi_dev, 0x41, &pp);
  276. port=pp<<8;
  277. /* Read ACPI port */
  278. control=inw(port+0x10);
  279. /* Flip CLKRUN off while running */
  280. if(!card->active && old)
  281. {
  282. CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
  283. "cs46xx: clkrun() enable clkrun - change=%d active=%dn",
  284. change,card->active));
  285. outw(control|0x2000, port+0x10);
  286. }
  287. else 
  288. {
  289. /*
  290. * sometimes on a resume the bit is set, so always reset the bit.
  291. */
  292. CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
  293. "cs46xx: clkrun() disable clkrun - change=%d active=%dn",
  294. change,card->active));
  295. outw(control&~0x2000, port+0x10);
  296. }
  297. }
  298. static int cs_open(struct inode *inode, struct file *file)
  299. {
  300. struct cs_card *card = (struct cs_card *)file->private_data;
  301. struct cs_state *state = NULL;
  302. struct dmabuf *dmabuf = NULL;
  303. struct list_head *entry;
  304.         int minor = MINOR(inode->i_rdev);
  305. int ret=0;
  306. unsigned int tmp;
  307. CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=0x%x %s %sn",
  308. (unsigned)file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
  309. file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
  310. list_for_each(entry, &cs46xx_devs)
  311. {
  312. card = list_entry(entry, struct cs_card, list);
  313. if (!((card->dev_audio ^ minor) & ~0xf))
  314. break;
  315. }
  316. if (entry == &cs46xx_devs)
  317. return -ENODEV;
  318. if (!card) {
  319. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
  320. "cs46xx: cs_open(): Error - unable to find audio card structn"));
  321. return -ENODEV;
  322. }
  323. /*
  324.  * hardcode state[0] for capture, [1] for playback
  325.  */
  326. if(file->f_mode & FMODE_READ)
  327. {
  328. CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READn") );
  329. if (card->states[0] == NULL) {
  330. state = card->states[0] = (struct cs_state *)
  331. kmalloc(sizeof(struct cs_state), GFP_KERNEL);
  332. if (state == NULL)
  333. return -ENOMEM;
  334. memset(state, 0, sizeof(struct cs_state));
  335. init_MUTEX(&state->sem);
  336. dmabuf = &state->dmabuf;
  337. dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL | GFP_DMA);
  338. if(dmabuf->pbuf==NULL)
  339. {
  340. kfree(state);
  341. card->states[0]=NULL;
  342. return -ENOMEM;
  343. }
  344. }
  345. else
  346. {
  347. state = card->states[0];
  348. if(state->open_mode & FMODE_READ)
  349. return -EBUSY;
  350. }
  351. dmabuf->channel = card->alloc_rec_pcm_channel(card);
  352. if (dmabuf->channel == NULL) {
  353. kfree (card->states[0]);
  354. card->states[0] = NULL;;
  355. return -ENODEV;
  356. }
  357. /* Now turn on external AMP if needed */
  358. state->card = card;
  359. state->card->active_ctrl(state->card,1);
  360. state->card->amplifier_ctrl(state->card,1);
  361. if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) )
  362. {
  363. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  364. "cs46xx: cs46xx_powerup of ADC failed (0x%x)n",tmp) );
  365. return -EIO;
  366. }
  367. dmabuf->channel->state = state;
  368. /* initialize the virtual channel */
  369. state->virt = 0;
  370. state->magic = CS_STATE_MAGIC;
  371. init_waitqueue_head(&dmabuf->wait);
  372. init_MUTEX(&state->open_sem);
  373. file->private_data = card;
  374. down(&state->open_sem);
  375. /* set default sample format. According to OSS Programmer's Guide  /dev/dsp
  376.    should be default to unsigned 8-bits, mono, with sample rate 8kHz and
  377.    /dev/dspW will accept 16-bits sample */
  378. /* Default input is 8bit mono */
  379. dmabuf->fmt &= ~CS_FMT_MASK;
  380. dmabuf->type = CS_TYPE_ADC;
  381. dmabuf->ossfragshift = 0;
  382. dmabuf->ossmaxfrags  = 0;
  383. dmabuf->subdivision  = 0;
  384. cs_set_adc_rate(state, 8000);
  385. cs_set_divisor(dmabuf);
  386. state->open_mode |= FMODE_READ;
  387. up(&state->open_sem);
  388. }
  389. if(file->f_mode & FMODE_WRITE)
  390. {
  391. CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITEn") );
  392. if (card->states[1] == NULL) {
  393. state = card->states[1] = (struct cs_state *)
  394. kmalloc(sizeof(struct cs_state), GFP_KERNEL);
  395. if (state == NULL)
  396. return -ENOMEM;
  397. memset(state, 0, sizeof(struct cs_state));
  398. init_MUTEX(&state->sem);
  399. dmabuf = &state->dmabuf;
  400. dmabuf->pbuf = (void *)get_free_page(GFP_KERNEL | GFP_DMA);
  401. if(dmabuf->pbuf==NULL)
  402. {
  403. kfree(state);
  404. card->states[1]=NULL;
  405. return -ENOMEM;
  406. }
  407. }
  408. else
  409. {
  410. state = card->states[1];
  411. if(state->open_mode & FMODE_WRITE)
  412. return -EBUSY;
  413. }
  414. dmabuf->channel = card->alloc_pcm_channel(card);
  415. if (dmabuf->channel == NULL) {
  416. kfree (card->states[1]);
  417. card->states[1] = NULL;;
  418. return -ENODEV;
  419. }
  420. /* Now turn on external AMP if needed */
  421. state->card = card;
  422. state->card->active_ctrl(state->card,1);
  423. state->card->amplifier_ctrl(state->card,1);
  424. if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) )
  425. {
  426. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  427. "cs46xx: cs46xx_powerup of DAC failed (0x%x)n",tmp) );
  428. return -EIO;
  429. }
  430. dmabuf->channel->state = state;
  431. /* initialize the virtual channel */
  432. state->virt = 1;
  433. state->magic = CS_STATE_MAGIC;
  434. init_waitqueue_head(&dmabuf->wait);
  435. init_MUTEX(&state->open_sem);
  436. file->private_data = card;
  437. down(&state->open_sem);
  438. /* set default sample format. According to OSS Programmer's Guide  /dev/dsp
  439.    should be default to unsigned 8-bits, mono, with sample rate 8kHz and
  440.    /dev/dspW will accept 16-bits sample */
  441. /* Default output is 8bit mono. */
  442. dmabuf->fmt &= ~CS_FMT_MASK;
  443. dmabuf->type = CS_TYPE_DAC;
  444. dmabuf->ossfragshift = 0;
  445. dmabuf->ossmaxfrags  = 0;
  446. dmabuf->subdivision  = 0;
  447. cs_set_dac_rate(state, 8000);
  448. cs_set_divisor(dmabuf);
  449. state->open_mode |= FMODE_WRITE;
  450. up(&state->open_sem);
  451. if((ret = prog_dmabuf(state)))
  452. return ret;
  453. }
  454. MOD_INC_USE_COUNT; /* for 2.2 */
  455. CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0n") );
  456. return 0;
  457. }
  458. static int cs_release(struct inode *inode, struct file *file)
  459. {
  460. struct cs_card *card = (struct cs_card *)file->private_data;
  461. struct dmabuf *dmabuf;
  462. struct cs_state *state;
  463. unsigned int tmp;
  464. CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=0x%x %s %sn",
  465. (unsigned)file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
  466. file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
  467. if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
  468. {
  469. return -EINVAL;
  470. }
  471. state = card->states[1];
  472. if(state)
  473. {
  474. if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) )
  475. {
  476. CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITEn") );
  477. dmabuf = &state->dmabuf;
  478. cs_clear_tail(state);
  479. drain_dac(state, file->f_flags & O_NONBLOCK);
  480. /* stop DMA state machine and free DMA buffers/channels */
  481. down(&state->open_sem);
  482. stop_dac(state);
  483. dealloc_dmabuf(state);
  484. state->card->free_pcm_channel(state->card, dmabuf->channel->num);
  485. free_page((unsigned long)state->dmabuf.pbuf);
  486. /* we're covered by the open_sem */
  487. up(&state->open_sem);
  488. state->card->states[state->virt] = NULL;
  489. state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
  490. if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) )
  491. {
  492. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO 
  493. "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)n",tmp) );
  494. }
  495. /* Now turn off external AMP if needed */
  496. state->card->amplifier_ctrl(state->card, -1);
  497. state->card->active_ctrl(state->card, -1);
  498. kfree(state);
  499. }
  500. }
  501. state = card->states[0];
  502. if(state)
  503. {
  504. if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) )
  505. {
  506. CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READn") );
  507. dmabuf = &state->dmabuf;
  508. down(&state->open_sem);
  509. stop_adc(state);
  510. dealloc_dmabuf(state);
  511. state->card->free_pcm_channel(state->card, dmabuf->channel->num);
  512. free_page((unsigned long)state->dmabuf.pbuf);
  513. /* we're covered by the open_sem */
  514. up(&state->open_sem);
  515. state->card->states[state->virt] = NULL;
  516. state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
  517. if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) )
  518. {
  519. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO 
  520. "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)n",tmp) );
  521. }
  522. /* Now turn off external AMP if needed */
  523. state->card->amplifier_ctrl(state->card, -1);
  524. state->card->active_ctrl(state->card, -1);
  525. kfree(state);
  526. }
  527. }
  528. CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0n") );
  529. MOD_DEC_USE_COUNT; /* For 2.2 */
  530. return 0;
  531. }
  532. static void printpm(struct cs_card *s)
  533. {
  534. CS_DBGOUT(CS_PM, 9, printk("pm struct:n"));
  535. CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%xn",
  536. (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
  537. CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%xn",
  538. s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
  539. CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%xn",
  540. s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
  541. CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%xn",
  542. s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
  543. CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%xn",
  544. s->pm.u32SSCR,s->pm.u32SRCSA));
  545. CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%xn",
  546. s->pm.u32DacASR,s->pm.u32AdcASR));
  547. CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%xn",
  548. s->pm.u32DacSR,s->pm.u32AdcSR));
  549. CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%xn",
  550. s->pm.u32MIDCR_Save));
  551. CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%xn",
  552. s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
  553. CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%xn",
  554. s->pm.u32AC97_master_volume));
  555. CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%xn",
  556. s->pm.u32AC97_headphone_volume));
  557. CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%xn",
  558. s->pm.u32AC97_master_volume_mono));
  559. CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%xn",
  560. s->pm.u32AC97_pcm_out_volume));
  561. CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %dn",
  562. s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
  563. CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %dn",
  564. s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
  565. }
  566. /****************************************************************************
  567. *
  568. *  Suspend - save the ac97 regs, mute the outputs and power down the part.  
  569. *
  570. ****************************************************************************/
  571. void cs46xx_ac97_suspend(struct cs_card *card)
  572. {
  573. int Count,i;
  574. struct ac97_codec *dev=card->ac97_codec[0];
  575. unsigned int tmp;
  576. CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+n"));
  577. if(card->states[1])
  578. {
  579. stop_dac(card->states[1]);
  580. resync_dma_ptrs(card->states[1]);
  581. }
  582. if(card->states[0])
  583. {
  584. stop_adc(card->states[0]);
  585. resync_dma_ptrs(card->states[0]);
  586. }
  587. for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
  588. && (i < CS46XX_AC97_NUMBER_RESTORE_REGS); 
  589. Count += 2, i++)
  590. {
  591. card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
  592. }
  593. /*
  594. * Save the ac97 volume registers as well as the current powerdown state.
  595. * Now, mute the all the outputs (master, headphone, and mono), as well
  596. * as the PCM volume, in preparation for powering down the entire part.
  597. card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev, 
  598. (u8)BA0_AC97_MASTER_VOLUME); 
  599. card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev, 
  600. (u8)BA0_AC97_HEADPHONE_VOLUME); 
  601. card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev, 
  602. (u8)BA0_AC97_MASTER_VOLUME_MONO); 
  603. card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev, 
  604. (u8)BA0_AC97_PCM_OUT_VOLUME);
  605. */ 
  606. /*
  607. * mute the outputs
  608. */
  609. cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
  610. cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
  611. cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
  612. cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
  613. /*
  614. * save the registers that cause pops
  615. */
  616. card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL); 
  617. card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE); 
  618. /*
  619. * And power down everything on the AC97 codec.
  620. * well, for now, only power down the DAC/ADC and MIXER VREFON components. 
  621. * trouble with removing VREF.
  622. */
  623. if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
  624. CS_POWER_MIXVON, CS_TRUE )) )
  625. {
  626. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  627. "cs46xx: cs46xx_ac97_suspend() failure (0x%x)n",tmp) );
  628. }
  629. CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-n"));
  630. }
  631. /****************************************************************************
  632. *
  633. *  Resume - power up the part and restore its registers..  
  634. *
  635. ****************************************************************************/
  636. void cs46xx_ac97_resume(struct cs_card *card)
  637. {
  638. int Count,i;
  639. struct ac97_codec *dev=card->ac97_codec[0];
  640. CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+n"));
  641. /*
  642. * First, we restore the state of the general purpose register.  This
  643. * contains the mic select (mic1 or mic2) and if we restore this after
  644. * we restore the mic volume/boost state and mic2 was selected at
  645. * suspend time, we will end up with a brief period of time where mic1
  646. * is selected with the volume/boost settings for mic2, causing
  647. * acoustic feedback.  So we restore the general purpose register
  648. * first, thereby getting the correct mic selected before we restore
  649. * the mic volume/boost.
  650. */
  651. cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE, 
  652. (u16)card->pm.u32AC97_general_purpose);
  653. /*
  654. * Now, while the outputs are still muted, restore the state of power
  655. * on the AC97 part.
  656. */
  657. cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
  658. mdelay(5 * cs_laptop_wait);
  659. /*
  660. * Restore just the first set of registers, from register number
  661. * 0x02 to the register number that ulHighestRegToRestore specifies.
  662. */
  663. for( Count = 0x2, i=0; 
  664. (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
  665. && (i < CS46XX_AC97_NUMBER_RESTORE_REGS); 
  666. Count += 2, i++)
  667. {
  668. cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
  669. }
  670. /* Check if we have to init the amplifier */
  671. if(card->amp_init)
  672. card->amp_init(card);
  673.         
  674. CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-n"));
  675. }
  676. static int cs46xx_restart_part(struct cs_card *card)
  677. {
  678. struct dmabuf *dmabuf;
  679. CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
  680. printk( "cs46xx: cs46xx_restart_part()+n"));
  681. if(card->states[1])
  682. {
  683. dmabuf = &card->states[1]->dmabuf;
  684. dmabuf->ready = 0;
  685. resync_dma_ptrs(card->states[1]);
  686. cs_set_divisor(dmabuf);
  687. if(__prog_dmabuf(card->states[1]))
  688. {
  689. CS_DBGOUT(CS_PM | CS_ERROR, 1, 
  690. printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac errorn"));
  691. return -1;
  692. }
  693. cs_set_dac_rate(card->states[1], dmabuf->rate);
  694. }
  695. if(card->states[0])
  696. {
  697. dmabuf = &card->states[0]->dmabuf;
  698. dmabuf->ready = 0;
  699. resync_dma_ptrs(card->states[0]);
  700. cs_set_divisor(dmabuf);
  701. if(__prog_dmabuf(card->states[0]))
  702. {
  703. CS_DBGOUT(CS_PM | CS_ERROR, 1, 
  704. printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc errorn"));
  705. return -1;
  706. }
  707. cs_set_adc_rate(card->states[0], dmabuf->rate);
  708. }
  709. card->pm.flags |= CS46XX_PM_RESUMED;
  710. if(card->states[0])
  711. start_adc(card->states[0]);
  712. if(card->states[1])
  713. start_dac(card->states[1]);
  714. card->pm.flags |= CS46XX_PM_IDLE;
  715. card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED 
  716. | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
  717. if(card->states[0])
  718. wake_up(&card->states[0]->dmabuf.wait);
  719. if(card->states[1])
  720. wake_up(&card->states[1]->dmabuf.wait);
  721. CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
  722. printk( "cs46xx: cs46xx_restart_part()-n"));
  723. return 0;
  724. }
  725. static void cs461x_reset(struct cs_card *card);
  726. static void cs461x_proc_stop(struct cs_card *card);
  727. static int cs46xx_suspend(struct cs_card *card, u32 state)
  728. {
  729. unsigned int tmp;
  730. CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
  731. printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=0x%xn",
  732. (unsigned)card->pm.flags,(unsigned)card));
  733. /*
  734. * check the current state, only suspend if IDLE
  735. */
  736. if(!(card->pm.flags & CS46XX_PM_IDLE))
  737. {
  738. CS_DBGOUT(CS_PM | CS_ERROR, 2, 
  739. printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLEn"));
  740. return 1;
  741. }
  742. card->pm.flags &= ~CS46XX_PM_IDLE;
  743. card->pm.flags |= CS46XX_PM_SUSPENDING;
  744. card->active_ctrl(card,1);
  745. tmp = cs461x_peek(card, BA1_PFIE);
  746. tmp &= ~0x0000f03f;
  747. tmp |=  0x00000010;
  748. cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
  749. tmp = cs461x_peek(card, BA1_CIE);
  750. tmp &= ~0x0000003f;
  751. tmp |=  0x00000011;
  752. cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
  753. /*
  754.          *  Stop playback DMA.
  755.  */
  756. tmp = cs461x_peek(card, BA1_PCTL);
  757. cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
  758. /*
  759.          *  Stop capture DMA.
  760.  */
  761. tmp = cs461x_peek(card, BA1_CCTL);
  762. cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
  763. if(card->states[1])
  764. {
  765. card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
  766. card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
  767. }
  768. if(card->states[0])
  769. {
  770. card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
  771. card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
  772. }
  773. cs46xx_ac97_suspend(card);
  774. /*
  775.          *  Reset the processor.
  776.          */
  777. cs461x_reset(card);
  778. cs461x_proc_stop(card);
  779. /*
  780.  *  Power down the DAC and ADC.  For now leave the other areas on.
  781.  */
  782. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
  783. /*
  784.  *  Power down the PLL.
  785.  */
  786. cs461x_pokeBA0(card, BA0_CLKCR1, 0);
  787. /*
  788.  *  Turn off the Processor by turning off the software clock enable flag in 
  789.  *  the clock control register.
  790.  */
  791. tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
  792. cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
  793. card->active_ctrl(card,-1);
  794. card->pm.flags &= ~CS46XX_PM_SUSPENDING;
  795. card->pm.flags |= CS46XX_PM_SUSPENDED;
  796. printpm(card);
  797. CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
  798. printk("cs46xx: cs46xx_suspend()- flags=0x%xn",
  799. (unsigned)card->pm.flags));
  800. return 0;
  801. }
  802. static int cs46xx_resume(struct cs_card *card)
  803. {
  804. int i;
  805. CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
  806. printk( "cs46xx: cs46xx_resume()+ flags=0x%xn",
  807. (unsigned)card->pm.flags));
  808. if(!(card->pm.flags & CS46XX_PM_SUSPENDED))
  809. {
  810. CS_DBGOUT(CS_PM | CS_ERROR, 2, 
  811. printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDEDn"));
  812. return 1;
  813. }
  814. card->pm.flags |= CS46XX_PM_RESUMING;
  815. card->pm.flags &= ~CS46XX_PM_SUSPENDED;
  816. printpm(card);
  817. card->active_ctrl(card, 1);
  818. for(i=0;i<5;i++)
  819. {
  820. if (cs_hardware_init(card) != 0)
  821. {
  822. CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
  823. "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()n"));
  824. mdelay(10 * cs_laptop_wait);
  825. cs461x_reset(card);
  826. continue;
  827. }
  828. break;
  829. }
  830. if(i>=4)
  831. {
  832. CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
  833. "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.n",i));
  834. return 0;
  835. }
  836. if(cs46xx_restart_part(card))
  837. {
  838. CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
  839. "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned errorn"));
  840. }
  841. card->active_ctrl(card, -1);
  842. CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%xn",
  843. (unsigned)card->pm.flags));
  844. return 0;
  845. }
  846. static /*const*/ struct file_operations cs461x_fops = {
  847. CS_OWNER CS_THIS_MODULE
  848. llseek: no_llseek,
  849. read: cs_read,
  850. write: cs_write,
  851. poll: cs_poll,
  852. ioctl: cs_ioctl,
  853. mmap: cs_mmap,
  854. open: cs_open,
  855. release: cs_release,
  856. };
  857. /* Write AC97 codec registers */
  858. static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
  859. {
  860. struct cs_card *card = dev->private_data;
  861. int count,loopcnt;
  862. unsigned int tmp;
  863. /*
  864.  *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
  865.  *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97 
  866.  *  3. Write ACCTL = Control Register = 460h for initiating the write
  867.  *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
  868.  *  5. if DCV not cleared, break and return error
  869.  *  6. Read ACSTS = Status Register = 464h, check VSTS bit
  870.  */
  871. cs461x_peekBA0(card, BA0_ACSDA);
  872. /*
  873.  *  Setup the AC97 control registers on the CS461x to send the
  874.  *  appropriate command to the AC97 to perform the read.
  875.  *  ACCAD = Command Address Register = 46Ch
  876.  *  ACCDA = Command Data Register = 470h
  877.  *  ACCTL = Control Register = 460h
  878.  *  set DCV - will clear when process completed
  879.  *  set CRW - Read command
  880.  *  set VFRM - valid frame enabled
  881.  *  set ESYN - ASYNC generation enabled
  882.  *  set RSTN - ARST# inactive, AC97 codec not reset
  883.  */
  884. cs461x_pokeBA0(card, BA0_ACCAD, reg);
  885. cs461x_pokeBA0(card, BA0_ACCDA, 0);
  886. cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
  887.      ACCTL_VFRM | ACCTL_ESYN |
  888.      ACCTL_RSTN);
  889. /*
  890.  *  Wait for the read to occur.
  891.  */
  892. if(!(card->pm.flags & CS46XX_PM_IDLE))
  893. loopcnt = 2000;
  894. else
  895. loopcnt = 500 * cs_laptop_wait;
  896.   loopcnt *= cs_laptop_wait;
  897. for (count = 0; count < loopcnt; count++) {
  898. /*
  899.  *  First, we want to wait for a short time.
  900.    */
  901. udelay(10 * cs_laptop_wait);
  902. /*
  903.  *  Now, check to see if the read has completed.
  904.  *  ACCTL = 460h, DCV should be reset by now and 460h = 17h
  905.  */
  906. if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
  907. break;
  908. }
  909. /*
  910.  *  Make sure the read completed.
  911.  */
  912. if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
  913. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  914. "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffffn", reg));
  915. return 0xffff;
  916. }
  917. /*
  918.  *  Wait for the valid status bit to go active.
  919.  */
  920. if(!(card->pm.flags & CS46XX_PM_IDLE))
  921. loopcnt = 2000;
  922. else
  923. loopcnt = 1000;
  924.   loopcnt *= cs_laptop_wait;
  925. for (count = 0; count < loopcnt; count++) {
  926. /*
  927.  *  Read the AC97 status register.
  928.  *  ACSTS = Status Register = 464h
  929.  *  VSTS - Valid Status
  930.  */
  931. if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
  932. break;
  933. udelay(10 * cs_laptop_wait);
  934. }
  935. /*
  936.  *  Make sure we got valid status.
  937.  */
  938. if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
  939. CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING 
  940. "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff n", 
  941. reg, tmp));
  942. return 0xffff;
  943. }
  944. /*
  945.  *  Read the data returned from the AC97 register.
  946.  *  ACSDA = Status Data Register = 474h
  947.  */
  948. CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
  949. "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%xn", 
  950. reg, cs461x_peekBA0(card, BA0_ACSDA),
  951. cs461x_peekBA0(card, BA0_ACCAD)));
  952. return(cs461x_peekBA0(card, BA0_ACSDA));
  953. }
  954. static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
  955. {
  956. struct cs_card *card = dev->private_data;
  957. int count;
  958. int val2 = 0;
  959. if(reg == AC97_CD_VOL)
  960. {
  961. val2 = cs_ac97_get(dev, AC97_CD_VOL);
  962. }
  963. /*
  964.  *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
  965.  *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
  966.  *  3. Write ACCTL = Control Register = 460h for initiating the write
  967.  *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
  968.  *  5. if DCV not cleared, break and return error
  969.  */
  970. /*
  971.  *  Setup the AC97 control registers on the CS461x to send the
  972.  *  appropriate command to the AC97 to perform the read.
  973.  *  ACCAD = Command Address Register = 46Ch
  974.  *  ACCDA = Command Data Register = 470h
  975.  *  ACCTL = Control Register = 460h
  976.  *  set DCV - will clear when process completed
  977.  *  reset CRW - Write command
  978.  *  set VFRM - valid frame enabled
  979.  *  set ESYN - ASYNC generation enabled
  980.  *  set RSTN - ARST# inactive, AC97 codec not reset
  981.          */
  982. cs461x_pokeBA0(card, BA0_ACCAD, reg);
  983. cs461x_pokeBA0(card, BA0_ACCDA, val);
  984. cs461x_peekBA0(card, BA0_ACCTL);
  985. cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
  986. cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
  987.              ACCTL_ESYN | ACCTL_RSTN);
  988. for (count = 0; count < 1000; count++) {
  989. /*
  990.  *  First, we want to wait for a short time.
  991.  */
  992. udelay(10 * cs_laptop_wait);
  993. /*
  994.  *  Now, check to see if the write has completed.
  995.  *  ACCTL = 460h, DCV should be reset by now and 460h = 07h
  996.  */
  997. if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
  998. break;
  999. }
  1000. /*
  1001.  *  Make sure the write completed.
  1002.  */
  1003. if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV)
  1004. {
  1005. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1006. "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%xn", reg, val));
  1007. }
  1008. /*
  1009.  * Adjust power if the mixer is selected/deselected according
  1010.  * to the CD.
  1011.  *
  1012.  * IF the CD is a valid input source (mixer or direct) AND
  1013.  * the CD is not muted THEN power is needed
  1014.  *
  1015.  * We do two things. When record select changes the input to
  1016.  * add/remove the CD we adjust the power count if the CD is
  1017.  * unmuted.
  1018.  *
  1019.  * When the CD mute changes we adjust the power level if the
  1020.  * CD was a valid input.
  1021.  *
  1022.  *      We also check for CD volume != 0, as the CD mute isn't
  1023.  *      normally tweaked from userspace.
  1024.  */
  1025.  
  1026. /* CD mute change ? */
  1027. if(reg==AC97_CD_VOL)
  1028. {
  1029. /* Mute bit change ? */
  1030. if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val))
  1031. {
  1032. /* This is a hack but its cleaner than the alternatives.
  1033.    Right now card->ac97_codec[0] might be NULL as we are
  1034.    still doing codec setup. This does an early assignment
  1035.    to avoid the problem if it occurs */
  1036.    
  1037. if(card->ac97_codec[0]==NULL)
  1038. card->ac97_codec[0]=dev;
  1039. /* Mute on */
  1040. if(val&0x8000 || val == 0x1f1f)
  1041. card->amplifier_ctrl(card, -1);
  1042. else /* Mute off power on */
  1043. {
  1044. if(card->amp_init)
  1045. card->amp_init(card);
  1046. card->amplifier_ctrl(card, 1);
  1047. }
  1048. }
  1049. }
  1050. }
  1051. /* OSS /dev/mixer file operation methods */
  1052. static int cs_open_mixdev(struct inode *inode, struct file *file)
  1053. {
  1054. int i=0;
  1055. int minor = MINOR(inode->i_rdev);
  1056. struct cs_card *card=NULL;
  1057. struct list_head *entry;
  1058. unsigned int tmp;
  1059. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
  1060.   printk(KERN_INFO "cs46xx: cs_open_mixdev()+n"));
  1061. list_for_each(entry, &cs46xx_devs)
  1062. {
  1063. card = list_entry(entry, struct cs_card, list);
  1064. for (i = 0; i < NR_AC97; i++)
  1065. if (card->ac97_codec[i] != NULL &&
  1066.     card->ac97_codec[i]->dev_mixer == minor)
  1067. goto match;
  1068. }
  1069. if (!card)
  1070. {
  1071. CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
  1072. printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEVn"));
  1073. return -ENODEV;
  1074. }
  1075.  match:
  1076. if(!card->ac97_codec[i])
  1077. return -ENODEV;
  1078. file->private_data = card->ac97_codec[i];
  1079. card->active_ctrl(card,1);
  1080. if(!CS_IN_USE(&card->mixer_use_cnt))
  1081. {
  1082. if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) )
  1083. {
  1084. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  1085. "cs46xx: cs_open_mixdev() powerup failure (0x%x)n",tmp) );
  1086. return -EIO;
  1087. }
  1088. }
  1089. card->amplifier_ctrl(card, 1);
  1090. CS_INC_USE_COUNT(&card->mixer_use_cnt);
  1091. MOD_INC_USE_COUNT; /* for 2.2 */
  1092. CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
  1093.   printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0n"));
  1094. return 0;
  1095. }
  1096. static int cs_release_mixdev(struct inode *inode, struct file *file)
  1097. {
  1098. int minor = MINOR(inode->i_rdev);
  1099. struct cs_card *card=NULL;
  1100. struct list_head *entry;
  1101. int i;
  1102. unsigned int tmp;
  1103. CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
  1104.   printk(KERN_INFO "cs46xx: cs_release_mixdev()+n"));
  1105. list_for_each(entry, &cs46xx_devs)
  1106. {
  1107. card = list_entry(entry, struct cs_card, list);
  1108. for (i = 0; i < NR_AC97; i++)
  1109. if (card->ac97_codec[i] != NULL &&
  1110.     card->ac97_codec[i]->dev_mixer == minor)
  1111. goto match;
  1112. }
  1113. if (!card)
  1114. {
  1115. CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
  1116. printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEVn"));
  1117. return -ENODEV;
  1118. }
  1119. match:
  1120. MOD_DEC_USE_COUNT; /* for 2.2 */
  1121. if(!CS_DEC_AND_TEST(&card->mixer_use_cnt))
  1122. {
  1123. CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
  1124.   printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0n"));
  1125. card->active_ctrl(card, -1);
  1126. card->amplifier_ctrl(card, -1);
  1127. return 0;
  1128. }
  1129. /*
  1130. * ok, no outstanding mixer opens, so powerdown.
  1131. */
  1132. if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) )
  1133. {
  1134. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  1135. "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)n",tmp) );
  1136. card->active_ctrl(card, -1);
  1137. card->amplifier_ctrl(card, -1);
  1138. return -EIO;
  1139. }
  1140. card->active_ctrl(card, -1);
  1141. card->amplifier_ctrl(card, -1);
  1142. CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
  1143.   printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0n"));
  1144. return 0;
  1145. }
  1146. void __exit cs46xx_cleanup_module(void);
  1147. static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
  1148. unsigned long arg)
  1149. {
  1150. struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
  1151. struct cs_card *card=NULL;
  1152. struct list_head *entry;
  1153. #if CSDEBUG_INTERFACE
  1154.         int val;
  1155. if(  (cmd == SOUND_MIXER_CS_GETDBGMASK) || 
  1156. (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
  1157. (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
  1158. (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
  1159. (cmd == SOUND_MIXER_CS_APM))
  1160. {
  1161.     switch(cmd)
  1162.     {
  1163. case SOUND_MIXER_CS_GETDBGMASK:
  1164. return put_user(cs_debugmask, (unsigned long *)arg);
  1165. case SOUND_MIXER_CS_GETDBGLEVEL:
  1166. return put_user(cs_debuglevel, (unsigned long *)arg);
  1167. case SOUND_MIXER_CS_SETDBGMASK:
  1168. if (get_user(val, (unsigned long *)arg))
  1169. return -EFAULT;
  1170. cs_debugmask = val;
  1171. return 0;
  1172. case SOUND_MIXER_CS_SETDBGLEVEL:
  1173. if (get_user(val, (unsigned long *)arg))
  1174. return -EFAULT;
  1175. cs_debuglevel = val;
  1176. return 0;
  1177. case SOUND_MIXER_CS_APM:
  1178. if (get_user(val, (unsigned long *) arg))
  1179. return -EFAULT;
  1180. if(val == CS_IOCTL_CMD_SUSPEND) 
  1181. {
  1182. list_for_each(entry, &cs46xx_devs)
  1183. {
  1184. card = list_entry(entry, struct cs_card, list);
  1185. cs46xx_suspend(card, 0);
  1186. }
  1187. }
  1188. else if(val == CS_IOCTL_CMD_RESUME)
  1189. {
  1190. list_for_each(entry, &cs46xx_devs)
  1191. {
  1192. card = list_entry(entry, struct cs_card, list);
  1193. cs46xx_resume(card);
  1194. }
  1195. }
  1196. else
  1197. {
  1198. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
  1199.     "cs46xx: mixer_ioctl(): invalid APM cmd (%d)n",
  1200. val));
  1201. }
  1202. return 0;
  1203. default:
  1204. CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO 
  1205. "cs46xx: mixer_ioctl(): ERROR unknown debug cmdn") );
  1206. return 0;
  1207.     }
  1208. }
  1209. #endif
  1210. return codec->mixer_ioctl(codec, cmd, arg);
  1211. }
  1212. static /*const*/ struct file_operations cs_mixer_fops = {
  1213. CS_OWNER CS_THIS_MODULE
  1214. llseek: no_llseek,
  1215. ioctl: cs_ioctl_mixdev,
  1216. open: cs_open_mixdev,
  1217. release: cs_release_mixdev,
  1218. };
  1219. /* AC97 codec initialisation. */
  1220. static int __init cs_ac97_init(struct cs_card *card)
  1221. {
  1222. int num_ac97 = 0;
  1223. int ready_2nd = 0;
  1224. struct ac97_codec *codec;
  1225. u16 eid;
  1226. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  1227. "cs46xx: cs_ac97_init()+n") );
  1228. for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
  1229. if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL)
  1230. return -ENOMEM;
  1231. memset(codec, 0, sizeof(struct ac97_codec));
  1232. /* initialize some basic codec information, other fields will be filled
  1233.    in ac97_probe_codec */
  1234. codec->private_data = card;
  1235. codec->id = num_ac97;
  1236. codec->codec_read = cs_ac97_get;
  1237. codec->codec_write = cs_ac97_set;
  1238. if (ac97_probe_codec(codec) == 0)
  1239. {
  1240. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  1241. "cs46xx: cs_ac97_init()- codec number %d not foundn",
  1242. num_ac97) );
  1243. card->ac97_codec[num_ac97] = 0;
  1244. break;
  1245. }
  1246. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  1247. "cs46xx: cs_ac97_init() found codec %dn",num_ac97) );
  1248. eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
  1249. if(eid==0xFFFFFF)
  1250. {
  1251. printk(KERN_WARNING "cs46xx: codec %d not presentn",num_ac97);
  1252. kfree(codec);
  1253. break;
  1254. }
  1255. card->ac97_features = eid;
  1256. if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
  1257. printk(KERN_ERR "cs46xx: couldn't register mixer!n");
  1258. kfree(codec);
  1259. break;
  1260. }
  1261. card->ac97_codec[num_ac97] = codec;
  1262. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  1263. "cs46xx: cs_ac97_init() ac97_codec[%d] set to 0x%xn",
  1264. (unsigned int)num_ac97,
  1265. (unsigned int)codec));
  1266. /* if there is no secondary codec at all, don't probe any more */
  1267. if (!ready_2nd)
  1268. {
  1269. num_ac97 += 1;
  1270. break;
  1271. }
  1272. }
  1273. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  1274. "cs46xx: cs_ac97_init()- %dn", (unsigned int)num_ac97));
  1275. return num_ac97;
  1276. }
  1277. /*
  1278.  * load the static image into the DSP
  1279.  */
  1280. #include "cs461x_image.h"
  1281. static void cs461x_download_image(struct cs_card *card)
  1282. {
  1283.     unsigned i, j, temp1, temp2, offset, count;
  1284.     unsigned char *pBA1 = ioremap(card->ba1_addr, 0x40000);
  1285.     for( i=0; i < CLEAR__COUNT; i++)
  1286.     {
  1287.         offset = ClrStat[i].BA1__DestByteOffset;
  1288.         count  = ClrStat[i].BA1__SourceSize;
  1289.         for(  temp1 = offset; temp1<(offset+count); temp1+=4 );
  1290.               writel(0, pBA1+temp1);
  1291.     }
  1292.     for(i=0; i<FILL__COUNT; i++)
  1293.     {
  1294.         temp2 = FillStat[i].Offset;
  1295.         for(j=0; j<(FillStat[i].Size)/4; j++)
  1296.         {
  1297.             temp1 = (FillStat[i]).pFill[j];
  1298.             writel(temp1, pBA1+temp2+j*4);
  1299.         }
  1300.     }
  1301.     iounmap(pBA1);
  1302. }
  1303. /*
  1304.  *  Chip reset
  1305.  */
  1306. static void cs461x_reset(struct cs_card *card)
  1307. {
  1308. int idx;
  1309. /*
  1310.  *  Write the reset bit of the SP control register.
  1311.  */
  1312. cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
  1313. /*
  1314.  *  Write the control register.
  1315.  */
  1316. cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
  1317. /*
  1318.  *  Clear the trap registers.
  1319.  */
  1320. for (idx = 0; idx < 8; idx++) {
  1321. cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
  1322. cs461x_poke(card, BA1_TWPR, 0xFFFF);
  1323. }
  1324. cs461x_poke(card, BA1_DREG, 0);
  1325. /*
  1326.  *  Set the frame timer to reflect the number of cycles per frame.
  1327.  */
  1328. cs461x_poke(card, BA1_FRMT, 0xadf);
  1329. }
  1330. static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
  1331. {
  1332. int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
  1333. unsigned int tmp;
  1334. /*
  1335.  *  See if the devices are powered down.  If so, we must power them up first
  1336.  *  or they will not respond.
  1337.  */
  1338. if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
  1339. cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
  1340. powerdown1 = 1;
  1341. }
  1342. /*
  1343.  *  We want to clear out the serial port FIFOs so we don't end up playing
  1344.  *  whatever random garbage happens to be in them.  We fill the sample FIFOS
  1345.  *  with zero (silence).
  1346.          */
  1347. cs461x_pokeBA0(card, BA0_SERBWP, 0);
  1348. /*
  1349. * Check for which FIFO locations to clear, if we are currently
  1350. * playing or capturing then we don't want to put in 128 bytes of
  1351. * "noise".
  1352.  */
  1353. if(type & CS_TYPE_DAC)
  1354. {
  1355. startfifo = 128;
  1356. endfifo = 256;
  1357. }
  1358. if(type & CS_TYPE_ADC)
  1359. {
  1360. startfifo = 0;
  1361. if(!endfifo)
  1362. endfifo = 128;
  1363. }
  1364. /*
  1365.  *  Fill sample FIFO locations (256 locations total).
  1366.  */
  1367. for (idx = startfifo; idx < endfifo; idx++) {
  1368. /*
  1369.  *  Make sure the previous FIFO write operation has completed.
  1370.  */
  1371. for (loop = 0; loop < 5; loop++) {
  1372. udelay(50);
  1373. if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
  1374. break;
  1375. }
  1376. if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
  1377. if (powerdown1)
  1378. cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
  1379. }
  1380. /*
  1381.  *  Write the serial port FIFO index.
  1382.  */
  1383. cs461x_pokeBA0(card, BA0_SERBAD, idx);
  1384. /*
  1385.  *  Tell the serial port to load the new value into the FIFO location.
  1386.  */
  1387. cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
  1388. }
  1389. /*
  1390.  *  Now, if we powered up the devices, then power them back down again.
  1391.  *  This is kinda ugly, but should never happen.
  1392.  */
  1393. if (powerdown1)
  1394. cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
  1395. }
  1396. static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
  1397. {
  1398. int count;
  1399. unsigned int tmp=0,muted=0;
  1400. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO 
  1401. "cs46xx: cs461x_powerdown()+ type=0x%xn",type));
  1402. if(!cs_powerdown && !suspendflag)
  1403. {
  1404. CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
  1405. "cs46xx: cs461x_powerdown() DISABLED exitingn"));
  1406. return 0;
  1407. }
  1408. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1409. CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
  1410. "cs46xx: cs461x_powerdown() powerdown reg=0x%xn",tmp));
  1411. /*
  1412. * if powering down only the VREF, and not powering down the DAC/ADC,
  1413. * then do not power down the VREF, UNLESS both the DAC and ADC are not
  1414. * currently powered down.  If powering down DAC and ADC, then
  1415. * it is possible to power down the VREF (ON).
  1416. */
  1417. if (    ((type & CS_POWER_MIXVON) && 
  1418.  (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))) )
  1419.       && 
  1420. ((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
  1421.  (tmp & CS_AC97_POWER_CONTROL_DAC_ON) ) )
  1422. {
  1423. CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
  1424. "cs46xx: cs461x_powerdown()- 0  unable to powerdown. tmp=0x%xn",tmp));
  1425. return 0;
  1426. }
  1427. /*
  1428. * for now, always keep power to the mixer block.
  1429. * not sure why it's a problem but it seems to be if we power off.
  1430. */
  1431. type &= ~CS_POWER_MIXVON;
  1432. type &= ~CS_POWER_MIXVOFF;
  1433. /*
  1434.  *  Power down indicated areas.
  1435.  */
  1436. if(type & CS_POWER_MIXVOFF)
  1437. {
  1438. CS_DBGOUT(CS_FUNCTION, 4, 
  1439. printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFFn"));
  1440. /*
  1441.  *  Power down the MIXER (VREF ON) on the AC97 card.  
  1442.  */
  1443. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1444. if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)
  1445. {
  1446. if(!muted)
  1447. {
  1448. cs_mute(card, CS_TRUE);
  1449. muted=1;
  1450. }
  1451. tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
  1452. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1453. /*
  1454.  *  Now, we wait until we sample a ready state.
  1455.  */
  1456. for (count = 0; count < 32; count++) {
  1457. /*
  1458.  *  First, lets wait a short while to let things settle out a
  1459.  *  bit, and to prevent retrying the read too quickly.
  1460.  */
  1461. udelay(500);
  1462. /*
  1463.  *  Read the current state of the power control register.
  1464.  */
  1465. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1466. CS_AC97_POWER_CONTROL_MIXVOFF_ON))
  1467. break;
  1468. }
  1469. /*
  1470.  *  Check the status..
  1471.  */
  1472. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1473. CS_AC97_POWER_CONTROL_MIXVOFF_ON)
  1474. {
  1475. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1476. "cs46xx: powerdown MIXVOFF failedn"));
  1477. return 1;
  1478. }
  1479. }
  1480. }
  1481. if(type & CS_POWER_MIXVON)
  1482. {
  1483. CS_DBGOUT(CS_FUNCTION, 4, 
  1484. printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVONn"));
  1485. /*
  1486.  *  Power down the MIXER (VREF ON) on the AC97 card.  
  1487.  */
  1488. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1489. if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)
  1490. {
  1491. if(!muted)
  1492. {
  1493. cs_mute(card, CS_TRUE);
  1494. muted=1;
  1495. }
  1496. tmp |= CS_AC97_POWER_CONTROL_MIXVON;
  1497. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1498. /*
  1499.  *  Now, we wait until we sample a ready state.
  1500.  */
  1501. for (count = 0; count < 32; count++) {
  1502. /*
  1503.  *  First, lets wait a short while to let things settle out a
  1504.  *  bit, and to prevent retrying the read too quickly.
  1505.  */
  1506. udelay(500);
  1507. /*
  1508.  *  Read the current state of the power control register.
  1509.  */
  1510. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1511. CS_AC97_POWER_CONTROL_MIXVON_ON))
  1512. break;
  1513. }
  1514. /*
  1515.  *  Check the status..
  1516.  */
  1517. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1518. CS_AC97_POWER_CONTROL_MIXVON_ON)
  1519. {
  1520. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1521. "cs46xx: powerdown MIXVON failedn"));
  1522. return 1;
  1523. }
  1524. }
  1525. }
  1526. if(type & CS_POWER_ADC)
  1527. {
  1528. /*
  1529.  *  Power down the ADC on the AC97 card.  
  1530.  */
  1531. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADCn"));
  1532. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1533. if (tmp & CS_AC97_POWER_CONTROL_ADC_ON)
  1534. {
  1535. if(!muted)
  1536. {
  1537. cs_mute(card, CS_TRUE);
  1538. muted=1;
  1539. }
  1540. tmp |= CS_AC97_POWER_CONTROL_ADC;
  1541. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1542. /*
  1543.  *  Now, we wait until we sample a ready state.
  1544.  */
  1545. for (count = 0; count < 32; count++) {
  1546. /*
  1547.  *  First, lets wait a short while to let things settle out a
  1548.  *  bit, and to prevent retrying the read too quickly.
  1549.  */
  1550. udelay(500);
  1551. /*
  1552.  *  Read the current state of the power control register.
  1553.  */
  1554. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1555. CS_AC97_POWER_CONTROL_ADC_ON))
  1556. break;
  1557. }
  1558. /*
  1559.  *  Check the status..
  1560.  */
  1561. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1562. CS_AC97_POWER_CONTROL_ADC_ON)
  1563. {
  1564. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1565. "cs46xx: powerdown ADC failedn"));
  1566. return 1;
  1567. }
  1568. }
  1569. }
  1570. if(type & CS_POWER_DAC)
  1571. {
  1572. /*
  1573.  *  Power down the DAC on the AC97 card.  
  1574.  */
  1575. CS_DBGOUT(CS_FUNCTION, 4, 
  1576. printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DACn"));
  1577. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1578. if (tmp & CS_AC97_POWER_CONTROL_DAC_ON)
  1579. {
  1580. if(!muted)
  1581. {
  1582. cs_mute(card, CS_TRUE);
  1583. muted=1;
  1584. }
  1585. tmp |= CS_AC97_POWER_CONTROL_DAC;
  1586. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1587. /*
  1588.  *  Now, we wait until we sample a ready state.
  1589.  */
  1590. for (count = 0; count < 32; count++) {
  1591. /*
  1592.  *  First, lets wait a short while to let things settle out a
  1593.  *  bit, and to prevent retrying the read too quickly.
  1594.  */
  1595. udelay(500);
  1596. /*
  1597.  *  Read the current state of the power control register.
  1598.  */
  1599. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1600. CS_AC97_POWER_CONTROL_DAC_ON))
  1601. break;
  1602. }
  1603. /*
  1604.  *  Check the status..
  1605.  */
  1606. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1607. CS_AC97_POWER_CONTROL_DAC_ON)
  1608. {
  1609. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1610. "cs46xx: powerdown DAC failedn"));
  1611. return 1;
  1612. }
  1613. }
  1614. }
  1615. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1616. if(muted)
  1617. cs_mute(card, CS_FALSE);
  1618. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO 
  1619. "cs46xx: cs461x_powerdown()- 0 tmp=0x%xn",tmp));
  1620. return 0;
  1621. }
  1622. static int cs46xx_powerup(struct cs_card *card, unsigned int type)
  1623. {
  1624. int count;
  1625. unsigned int tmp=0,muted=0;
  1626. CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
  1627. "cs46xx: cs46xx_powerup()+ type=0x%xn",type));
  1628. /*
  1629. * check for VREF and powerup if need to.
  1630. */
  1631. if(type & CS_POWER_MIXVON)
  1632. type |= CS_POWER_MIXVOFF;
  1633. if(type & (CS_POWER_DAC | CS_POWER_ADC))
  1634. type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
  1635. /*
  1636.  *  Power up indicated areas.
  1637.  */
  1638. if(type & CS_POWER_MIXVOFF)
  1639. {
  1640. CS_DBGOUT(CS_FUNCTION, 4, 
  1641. printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFFn"));
  1642. /*
  1643.  *  Power up the MIXER (VREF ON) on the AC97 card.  
  1644.  */
  1645. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1646. if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON))
  1647. {
  1648. if(!muted)
  1649. {
  1650. cs_mute(card, CS_TRUE);
  1651. muted=1;
  1652. }
  1653. tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
  1654. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1655. /*
  1656.  *  Now, we wait until we sample a ready state.
  1657.  */
  1658. for (count = 0; count < 32; count++) {
  1659. /*
  1660.  *  First, lets wait a short while to let things settle out a
  1661.  *  bit, and to prevent retrying the read too quickly.
  1662.  */
  1663. udelay(500);
  1664. /*
  1665.  *  Read the current state of the power control register.
  1666.  */
  1667. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1668. CS_AC97_POWER_CONTROL_MIXVOFF_ON)
  1669. break;
  1670. }
  1671. /*
  1672.  *  Check the status..
  1673.  */
  1674. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1675. CS_AC97_POWER_CONTROL_MIXVOFF_ON))
  1676. {
  1677. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1678. "cs46xx: powerup MIXVOFF failedn"));
  1679. return 1;
  1680. }
  1681. }
  1682. }
  1683. if(type & CS_POWER_MIXVON)
  1684. {
  1685. CS_DBGOUT(CS_FUNCTION, 4, 
  1686. printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVONn"));
  1687. /*
  1688.  *  Power up the MIXER (VREF ON) on the AC97 card.  
  1689.  */
  1690. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1691. if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON))
  1692. {
  1693. if(!muted)
  1694. {
  1695. cs_mute(card, CS_TRUE);
  1696. muted=1;
  1697. }
  1698. tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
  1699. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1700. /*
  1701.  *  Now, we wait until we sample a ready state.
  1702.  */
  1703. for (count = 0; count < 32; count++) {
  1704. /*
  1705.  *  First, lets wait a short while to let things settle out a
  1706.  *  bit, and to prevent retrying the read too quickly.
  1707.  */
  1708. udelay(500);
  1709. /*
  1710.  *  Read the current state of the power control register.
  1711.  */
  1712. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1713. CS_AC97_POWER_CONTROL_MIXVON_ON)
  1714. break;
  1715. }
  1716. /*
  1717.  *  Check the status..
  1718.  */
  1719. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1720. CS_AC97_POWER_CONTROL_MIXVON_ON))
  1721. {
  1722. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1723. "cs46xx: powerup MIXVON failedn"));
  1724. return 1;
  1725. }
  1726. }
  1727. }
  1728. if(type & CS_POWER_ADC)
  1729. {
  1730. /*
  1731.  *  Power up the ADC on the AC97 card.  
  1732.  */
  1733. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADCn"));
  1734. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1735. if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON))
  1736. {
  1737. if(!muted)
  1738. {
  1739. cs_mute(card, CS_TRUE);
  1740. muted=1;
  1741. }
  1742. tmp &= ~CS_AC97_POWER_CONTROL_ADC;
  1743. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1744. /*
  1745.  *  Now, we wait until we sample a ready state.
  1746.  */
  1747. for (count = 0; count < 32; count++) {
  1748. /*
  1749.  *  First, lets wait a short while to let things settle out a
  1750.  *  bit, and to prevent retrying the read too quickly.
  1751.  */
  1752. udelay(500);
  1753. /*
  1754.  *  Read the current state of the power control register.
  1755.  */
  1756. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1757. CS_AC97_POWER_CONTROL_ADC_ON)
  1758. break;
  1759. }
  1760. /*
  1761.  *  Check the status..
  1762.  */
  1763. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1764. CS_AC97_POWER_CONTROL_ADC_ON))
  1765. {
  1766. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1767. "cs46xx: powerup ADC failedn"));
  1768. return 1;
  1769. }
  1770. }
  1771. }
  1772. if(type & CS_POWER_DAC)
  1773. {
  1774. /*
  1775.  *  Power up the DAC on the AC97 card.  
  1776.  */
  1777. CS_DBGOUT(CS_FUNCTION, 4, 
  1778. printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DACn"));
  1779. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1780. if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON))
  1781. {
  1782. if(!muted)
  1783. {
  1784. cs_mute(card, CS_TRUE);
  1785. muted=1;
  1786. }
  1787. tmp &= ~CS_AC97_POWER_CONTROL_DAC;
  1788. cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
  1789. /*
  1790.  *  Now, we wait until we sample a ready state.
  1791.  */
  1792. for (count = 0; count < 32; count++) {
  1793. /*
  1794.  *  First, lets wait a short while to let things settle out a
  1795.  *  bit, and to prevent retrying the read too quickly.
  1796.  */
  1797. udelay(500);
  1798. /*
  1799.  *  Read the current state of the power control register.
  1800.  */
  1801. if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1802. CS_AC97_POWER_CONTROL_DAC_ON)
  1803. break;
  1804. }
  1805. /*
  1806.  *  Check the status..
  1807.  */
  1808. if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
  1809. CS_AC97_POWER_CONTROL_DAC_ON))
  1810. {
  1811. CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
  1812. "cs46xx: powerup DAC failedn"));
  1813. return 1;
  1814. }
  1815. }
  1816. }
  1817. tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
  1818. if(muted)
  1819. cs_mute(card, CS_FALSE);
  1820. CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO 
  1821. "cs46xx: cs46xx_powerup()- 0 tmp=0x%xn",tmp));
  1822. return 0;
  1823. }
  1824. static void cs461x_proc_start(struct cs_card *card)
  1825. {
  1826. int cnt;
  1827. /*
  1828.  *  Set the frame timer to reflect the number of cycles per frame.
  1829.  */
  1830. cs461x_poke(card, BA1_FRMT, 0xadf);
  1831. /*
  1832.  *  Turn on the run, run at frame, and DMA enable bits in the local copy of
  1833.  *  the SP control register.
  1834.  */
  1835. cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
  1836. /*
  1837.  *  Wait until the run at frame bit resets itself in the SP control
  1838.  *  register.
  1839.  */
  1840. for (cnt = 0; cnt < 25; cnt++) {
  1841. udelay(50);
  1842. if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
  1843. break;
  1844. }
  1845. if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
  1846. printk(KERN_WARNING "cs46xx: SPCR_RUNFR never resetn");
  1847. }
  1848. static void cs461x_proc_stop(struct cs_card *card)
  1849. {
  1850. /*
  1851.  *  Turn off the run, run at frame, and DMA enable bits in the local copy of
  1852.  *  the SP control register.
  1853.  */
  1854. cs461x_poke(card, BA1_SPCR, 0);
  1855. }
  1856. static int cs_hardware_init(struct cs_card *card)
  1857. {
  1858. unsigned long end_time;
  1859. unsigned int tmp,count;
  1860. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  1861. "cs46xx: cs_hardware_init()+n") );
  1862. /* 
  1863.  *  First, blast the clock control register to zero so that the PLL starts
  1864.          *  out in a known state, and blast the master serial port control register
  1865.          *  to zero so that the serial ports also start out in a known state.
  1866.          */
  1867.         cs461x_pokeBA0(card, BA0_CLKCR1, 0);
  1868.         cs461x_pokeBA0(card, BA0_SERMC1, 0);
  1869. /*
  1870.  *  If we are in AC97 mode, then we must set the part to a host controlled
  1871.          *  AC-link.  Otherwise, we won't be able to bring up the link.
  1872.          */        
  1873.         cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03); /* 1.03 card */
  1874.         /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
  1875.         /*
  1876.          *  Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
  1877.          *  spec) and then drive it high.  This is done for non AC97 modes since
  1878.          *  there might be logic external to the CS461x that uses the ARST# line
  1879.          *  for a reset.
  1880.          */
  1881.         cs461x_pokeBA0(card, BA0_ACCTL, 1);
  1882.         udelay(50);
  1883.         cs461x_pokeBA0(card, BA0_ACCTL, 0);
  1884.         udelay(50);
  1885.         cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
  1886. /*
  1887.  *  The first thing we do here is to enable sync generation.  As soon
  1888.  *  as we start receiving bit clock, we'll start producing the SYNC
  1889.  *  signal.
  1890.  */
  1891. cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
  1892. /*
  1893.  *  Now wait for a short while to allow the AC97 part to start
  1894.  *  generating bit clock (so we don't try to start the PLL without an
  1895.  *  input clock).
  1896.  */
  1897. mdelay(5 * cs_laptop_wait); /* 1 should be enough ?? (and pigs might fly) */
  1898. /*
  1899.  *  Set the serial port timing configuration, so that
  1900.  *  the clock control circuit gets its clock from the correct place.
  1901.  */
  1902. cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
  1903. /*
  1904. * The part seems to not be ready for a while after a resume.
  1905. * so, if we are resuming, then wait for 700 mils.  Note that 600 mils
  1906. * is not enough for some platforms! tested on an IBM Thinkpads and 
  1907. * reference cards.
  1908. */
  1909. if(!(card->pm.flags & CS46XX_PM_IDLE))
  1910. mdelay(initdelay);
  1911. /*
  1912.  *  Write the selected clock control setup to the hardware.  Do not turn on
  1913.  *  SWCE yet (if requested), so that the devices clocked by the output of
  1914.  *  PLL are not clocked until the PLL is stable.
  1915.  */
  1916. cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
  1917. cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
  1918. cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
  1919. /*
  1920.  *  Power up the PLL.
  1921.  */
  1922. cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
  1923. /*
  1924.          *  Wait until the PLL has stabilized.
  1925.  */
  1926. mdelay(5 * cs_laptop_wait); /* Again 1 should be enough ?? */
  1927. /*
  1928.  *  Turn on clocking of the core so that we can setup the serial ports.
  1929.  */
  1930. tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
  1931. cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
  1932. /*
  1933.  *  Fill the serial port FIFOs with silence.
  1934.  */
  1935. cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
  1936. /*
  1937.  *  Set the serial port FIFO pointer to the first sample in the FIFO.
  1938.  */
  1939. /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
  1940. /*
  1941.  *  Write the serial port configuration to the part.  The master
  1942.  *  enable bit is not set until all other values have been written.
  1943.  */
  1944. cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
  1945. cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
  1946. cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
  1947. mdelay(5 * cs_laptop_wait); /* Shouldnt be needed ?? */
  1948. /*
  1949. * If we are resuming under 2.2.x then we can not schedule a timeout.
  1950. * so, just spin the CPU.
  1951. */
  1952. if(card->pm.flags & CS46XX_PM_IDLE)
  1953. {
  1954. /*
  1955.  * Wait for the card ready signal from the AC97 card.
  1956.  */
  1957. end_time = jiffies + 3 * (HZ >> 2);
  1958. do {
  1959. /*
  1960.  *  Read the AC97 status register to see if we've seen a CODEC READY
  1961.  *  signal from the AC97 card.
  1962.  */
  1963. if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
  1964. break;
  1965. current->state = TASK_UNINTERRUPTIBLE;
  1966. schedule_timeout(1);
  1967. } while (time_before(jiffies, end_time));
  1968. }
  1969. else
  1970. {
  1971. for (count = 0; count < 100; count++) {
  1972. // First, we want to wait for a short time.
  1973. udelay(25 * cs_laptop_wait);
  1974. if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
  1975. break;
  1976. }
  1977. }
  1978. /*
  1979.  *  Make sure CODEC is READY.
  1980.  */
  1981. if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
  1982. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING  
  1983. "cs46xx: create - never read card ready from AC'97n"));
  1984. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING  
  1985. "cs46xx: probably not a bug, try using the CS4232 driver,n"));
  1986. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING  
  1987. "cs46xx: or turn off any automatic Power Management support in the BIOS.n"));
  1988. return -EIO;
  1989. }
  1990. /*
  1991.  *  Assert the vaid frame signal so that we can start sending commands
  1992.  *  to the AC97 card.
  1993.  */
  1994. cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
  1995. if(card->pm.flags & CS46XX_PM_IDLE)
  1996. {
  1997. /*
  1998.  *  Wait until we've sampled input slots 3 and 4 as valid, meaning that
  1999.  *  the card is pumping ADC data across the AC-link.
  2000.  */
  2001. end_time = jiffies + 3 * (HZ >> 2);
  2002. do {
  2003. /*
  2004.  *  Read the input slot valid register and see if input slots 3 and
  2005.  *  4 are valid yet.
  2006.  */
  2007. if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
  2008. break;
  2009. current->state = TASK_UNINTERRUPTIBLE;
  2010. schedule_timeout(1);
  2011. } while (time_before(jiffies, end_time));
  2012. }
  2013. else
  2014. {
  2015. for (count = 0; count < 100; count++) {
  2016. // First, we want to wait for a short time.
  2017. udelay(25 * cs_laptop_wait);
  2018. if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
  2019. break;
  2020. }
  2021. }
  2022. /*
  2023.  *  Make sure input slots 3 and 4 are valid.  If not, then return
  2024.  *  an error.
  2025.  */
  2026. if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
  2027. printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97n");
  2028. return -EIO;
  2029. }
  2030. /*
  2031.  *  Now, assert valid frame and the slot 3 and 4 valid bits.  This will
  2032.  *  commense the transfer of digital audio data to the AC97 card.
  2033.  */
  2034. cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
  2035. /*
  2036.  *  Turn off the Processor by turning off the software clock enable flag in 
  2037.  *  the clock control register.
  2038.  */
  2039. /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
  2040. /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
  2041. /*
  2042.          *  Reset the processor.
  2043.          */
  2044. cs461x_reset(card);
  2045. /*
  2046.          *  Download the image to the processor.
  2047.  */
  2048. cs461x_download_image(card);
  2049. /*
  2050.          *  Stop playback DMA.
  2051.  */
  2052. tmp = cs461x_peek(card, BA1_PCTL);
  2053. card->pctl = tmp & 0xffff0000;
  2054. cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
  2055. /*
  2056.          *  Stop capture DMA.
  2057.  */
  2058. tmp = cs461x_peek(card, BA1_CCTL);
  2059. card->cctl = tmp & 0x0000ffff;
  2060. cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
  2061. /* initialize AC97 codec and register /dev/mixer */
  2062. if(card->pm.flags & CS46XX_PM_IDLE)
  2063. {
  2064. if (cs_ac97_init(card) <= 0)
  2065. {
  2066. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  2067. "cs46xx: cs_ac97_init() failuren") );
  2068. return -EIO;
  2069. }
  2070. }
  2071. else
  2072. {
  2073. cs46xx_ac97_resume(card);
  2074. }
  2075. cs461x_proc_start(card);
  2076. /*
  2077.  *  Enable interrupts on the part.
  2078.  */
  2079. cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
  2080. tmp = cs461x_peek(card, BA1_PFIE);
  2081. tmp &= ~0x0000f03f;
  2082. cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt enable */
  2083. tmp = cs461x_peek(card, BA1_CIE);
  2084. tmp &= ~0x0000003f;
  2085. tmp |=  0x00000001;
  2086. cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt enable */
  2087. /*
  2088.  *  If IDLE then Power down the part.  We will power components up 
  2089.  *  when we need them.  
  2090.  */
  2091. if(card->pm.flags & CS46XX_PM_IDLE)
  2092. {
  2093. if(!cs_powerdown)
  2094. {
  2095. if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
  2096. CS_POWER_MIXVON )) )
  2097. {
  2098. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  2099. "cs46xx: cs461x_powerup() failure (0x%x)n",tmp) );
  2100. return -EIO;
  2101. }
  2102. }
  2103. else
  2104. {
  2105. if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
  2106. CS_POWER_MIXVON, CS_FALSE )) )
  2107. {
  2108. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  2109. "cs46xx: cs461x_powerdown() failure (0x%x)n",tmp) );
  2110. return -EIO;
  2111. }
  2112. }
  2113. }
  2114. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
  2115. "cs46xx: cs_hardware_init()- 0n"));
  2116. return 0;
  2117. }
  2118. /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered 
  2119.    until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
  2120.    
  2121. /*
  2122.  * Card subid table
  2123.  */
  2124.  
  2125. struct cs_card_type
  2126. {
  2127. u16 vendor;
  2128. u16 id;
  2129. char *name;
  2130. void (*amp)(struct cs_card *, int);
  2131. void (*amp_init)(struct cs_card *);
  2132. void (*active)(struct cs_card *, int);
  2133. };
  2134. static struct cs_card_type cards[]={
  2135. {0x1489, 0x7001, "Genius Soundmaker 128 value", amp_none, NULL, NULL},
  2136. {0x5053, 0x3357, "Voyetra", amp_voyetra, NULL, NULL},
  2137. {0x1071, 0x6003, "Mitac MI6020/21", amp_voyetra, NULL, NULL},
  2138. {0x14AF, 0x0050, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
  2139. {0x1681, 0x0050, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
  2140. {0x1681, 0x0051, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
  2141. {0x1681, 0x0052, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
  2142. {0x1681, 0x0053, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
  2143. {0x1681, 0x0054, "Hercules Game Theatre XP", amp_hercules, NULL, NULL},
  2144. {0x1681, 0xa010, "Hercules Fortissimo II", amp_none, NULL, NULL},
  2145. /* Not sure if the 570 needs the clkrun hack */
  2146. {PCI_VENDOR_ID_IBM, 0x0132, "Thinkpad 570", amp_none, NULL, clkrun_hack},
  2147. {PCI_VENDOR_ID_IBM, 0x0153, "Thinkpad 600X/A20/T20", amp_none, NULL, clkrun_hack},
  2148. {PCI_VENDOR_ID_IBM, 0x1010, "Thinkpad 600E (unsupported)", NULL, NULL, NULL},
  2149. {0, 0, "Card without SSID set", NULL, NULL, NULL },
  2150. {0, 0, NULL, NULL, NULL}
  2151. };
  2152. MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
  2153. MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
  2154. MODULE_LICENSE("GPL");
  2155. static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "n";
  2156. static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).n";
  2157. static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
  2158.   const struct pci_device_id *pciid)
  2159. {
  2160. struct pm_dev *pmdev;
  2161. int i,j;
  2162. u16 ss_card, ss_vendor;
  2163. struct cs_card *card;
  2164. dma_addr_t dma_mask;
  2165. struct cs_card_type *cp = &cards[0];
  2166. CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
  2167.   printk(KERN_INFO "cs46xx: probe()+n"));
  2168. dma_mask = 0xffffffff; /* this enables playback and recording */
  2169. if (pci_enable_device(pci_dev)) {
  2170. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
  2171.  "cs46xx: pci_enable_device() failedn"));
  2172. return -1;
  2173. }
  2174. if (!RSRCISMEMORYREGION(pci_dev, 0) ||
  2175.     !RSRCISMEMORYREGION(pci_dev, 1)) {
  2176. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  2177.  "cs46xx: probe()- Memory region not assignedn"));
  2178. return -1;
  2179. }
  2180. if (pci_dev->irq == 0) {
  2181. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  2182.  "cs46xx: probe() IRQ not assignedn"));
  2183. return -1;
  2184. }
  2185. if (!pci_dma_supported(pci_dev, 0xffffffff)) {
  2186. CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
  2187.       "cs46xx: probe() architecture does not support 32bit PCI busmaster DMAn"));
  2188. return -1;
  2189. }
  2190. pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
  2191. pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
  2192. if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
  2193. printk(KERN_ERR "cs46xx: out of memoryn");
  2194. return -ENOMEM;
  2195. }
  2196. memset(card, 0, sizeof(*card));
  2197. card->ba0_addr = RSRCADDRESS(pci_dev, 0);
  2198. card->ba1_addr = RSRCADDRESS(pci_dev, 1);
  2199. card->pci_dev = pci_dev;
  2200. card->irq = pci_dev->irq;
  2201. card->magic = CS_CARD_MAGIC;
  2202. spin_lock_init(&card->lock);
  2203. pci_set_master(pci_dev);
  2204. printk(cs46xx_banner);
  2205. printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %dn",
  2206.        card->ba0_addr, card->ba1_addr, card->irq);
  2207. card->alloc_pcm_channel = cs_alloc_pcm_channel;
  2208. card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
  2209. card->free_pcm_channel = cs_free_pcm_channel;
  2210. card->amplifier_ctrl = amp_none;
  2211. card->active_ctrl = amp_none;
  2212. while (cp->name)
  2213. {
  2214. if(cp->vendor == ss_vendor && cp->id == ss_card)
  2215. {
  2216. card->amplifier_ctrl = cp->amp;
  2217. if(cp->active)
  2218. card->active_ctrl = cp->active;
  2219. if(cp->amp_init)
  2220. card->amp_init = cp->amp_init;
  2221. break;
  2222. }
  2223. cp++;
  2224. }
  2225. if (cp->name==NULL)
  2226. {
  2227. printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %dn",
  2228. ss_vendor, ss_card, card->ba0_addr, card->ba1_addr,  card->irq);
  2229. }
  2230. else
  2231. {
  2232. printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %dn",
  2233. cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
  2234. }
  2235. if (card->amplifier_ctrl==NULL)
  2236. {
  2237. card->amplifier_ctrl = amp_none;
  2238. card->active_ctrl = clkrun_hack;
  2239. }
  2240. if (external_amp == 1)
  2241. {
  2242. printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.n");
  2243. card->amplifier_ctrl = amp_voyetra;
  2244. }
  2245. if (thinkpad == 1)
  2246. {
  2247. printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.n");
  2248. card->active_ctrl = clkrun_hack;
  2249. }
  2250. /*
  2251. * The thinkpads don't work well without runtime updating on their kernel 
  2252. * delay values (or any laptop with variable CPU speeds really).
  2253. * so, just to be safe set the init delay to 2100.  Eliminates
  2254. * failures on T21 Thinkpads.  remove this code when the udelay
  2255. * and mdelay kernel code is replaced by a pm timer, or the delays
  2256. * work well for battery and/or AC power both.
  2257. */
  2258. if(card->active_ctrl == clkrun_hack)
  2259. {
  2260. initdelay = 2100;
  2261. cs_laptop_wait = 5;
  2262. }
  2263. if((card->active_ctrl == clkrun_hack) && !(powerdown == 1))
  2264. {
  2265. /*
  2266. * for some currently unknown reason, powering down the DAC and ADC component
  2267. * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97 
  2268. * codec access problems.  probably the serial clock becomes unsynced. 
  2269. * added code to sync the chips back up, but only helped about 70% the time.
  2270. */
  2271. cs_powerdown = 0;
  2272. }
  2273. if(powerdown == 0)
  2274. cs_powerdown = 0;
  2275. card->active_ctrl(card, 1);
  2276. /* claim our iospace and irq */
  2277. card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
  2278. card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
  2279. card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
  2280. card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
  2281. card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
  2282. CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO 
  2283. "cs46xx: card=0x%x card->ba0=0x%.08xn",(unsigned)card,(unsigned)card->ba0) );
  2284. CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO 
  2285. "cs46xx: card->ba1=0x%.08x 0x%.08x 0x%.08x 0x%.08xn",
  2286. (unsigned)card->ba1.name.data0,
  2287. (unsigned)card->ba1.name.data1,
  2288. (unsigned)card->ba1.name.pmem,
  2289. (unsigned)card->ba1.name.reg) );
  2290. if(card->ba0 == 0 || card->ba1.name.data0 == 0 ||
  2291. card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
  2292. card->ba1.name.reg == 0)
  2293. goto fail2;
  2294. if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) {
  2295. printk(KERN_ERR "cs46xx: unable to allocate irq %dn", card->irq);
  2296. goto fail2;
  2297. }
  2298. /* register /dev/dsp */
  2299. if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
  2300. printk(KERN_ERR "cs46xx: unable to register dspn");
  2301. goto fail;
  2302. }
  2303.         /* register /dev/midi */
  2304.         if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
  2305.                 printk(KERN_ERR "cs46xx: unable to register midin");
  2306.                 
  2307. card->pm.flags |= CS46XX_PM_IDLE;
  2308. for(i=0;i<5;i++)
  2309. {
  2310. if (cs_hardware_init(card) != 0)
  2311. {
  2312. CS_DBGOUT(CS_ERROR, 4, printk(
  2313. "cs46xx: ERROR in cs_hardware_init()... retryingn"));
  2314. for (j = 0; j < NR_AC97; j++)
  2315. if (card->ac97_codec[j] != NULL) {
  2316. unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
  2317. kfree (card->ac97_codec[j]);
  2318. }
  2319. mdelay(10 * cs_laptop_wait);
  2320. continue;
  2321. }
  2322. break;
  2323. }
  2324. if(i>=4)
  2325. {
  2326. CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
  2327. "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.n",i));
  2328.                 unregister_sound_dsp(card->dev_audio);
  2329.                 if(card->dev_midi)
  2330.                         unregister_sound_midi(card->dev_midi);
  2331.                 goto fail;
  2332. }
  2333.         init_waitqueue_head(&card->midi.open_wait);
  2334.         init_MUTEX(&card->midi.open_sem);
  2335.         init_waitqueue_head(&card->midi.iwait);
  2336.         init_waitqueue_head(&card->midi.owait);
  2337.         cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);   
  2338.         cs461x_pokeBA0(card, BA0_MIDCR, 0);   
  2339. /* 
  2340. * Check if we have to init the amplifier, but probably already done
  2341. * since the CD logic in the ac97 init code will turn on the ext amp.
  2342. */
  2343. if(cp->amp_init)
  2344. cp->amp_init(card);
  2345.         card->active_ctrl(card, -1);
  2346. PCI_SET_DRIVER_DATA(pci_dev, card);
  2347. PCI_SET_DMA_MASK(pci_dev, dma_mask);
  2348. list_add(&card->list, &cs46xx_devs);
  2349. pmdev = cs_pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), cs46xx_pm_callback);
  2350. if (pmdev)
  2351. {
  2352. CS_DBGOUT(CS_INIT | CS_PM, 4, printk(KERN_INFO
  2353.  "cs46xx: probe() pm_register() succeeded (0x%x).n",
  2354. (unsigned)pmdev));
  2355. pmdev->data = card;
  2356. }
  2357. else
  2358. {
  2359. CS_DBGOUT(CS_INIT | CS_PM | CS_ERROR, 2, printk(KERN_INFO
  2360.  "cs46xx: probe() pm_register() failed (0x%x).n",
  2361. (unsigned)pmdev));
  2362. card->pm.flags |= CS46XX_PM_NOT_REGISTERED;
  2363. }
  2364. CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=0x%xn",
  2365. (unsigned)card->pm.flags,(unsigned)card));
  2366. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2367. "cs46xx: probe()- device allocated successfullyn"));
  2368.         return 0;
  2369. fail:
  2370. free_irq(card->irq, card);
  2371. fail2:
  2372. if(card->ba0)
  2373. iounmap(card->ba0);
  2374. if(card->ba1.name.data0)
  2375. iounmap(card->ba1.name.data0);
  2376. if(card->ba1.name.data1)
  2377. iounmap(card->ba1.name.data1);
  2378. if(card->ba1.name.pmem)
  2379. iounmap(card->ba1.name.pmem);
  2380. if(card->ba1.name.reg)
  2381. iounmap(card->ba1.name.reg);
  2382. kfree(card);
  2383. CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
  2384. "cs46xx: probe()- no device allocatedn"));
  2385. return -ENODEV;
  2386. } // probe_cs46xx
  2387. // --------------------------------------------------------------------- 
  2388. static void __devinit cs46xx_remove(struct pci_dev *pci_dev)
  2389. {
  2390. struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
  2391. int i;
  2392. unsigned int tmp;
  2393. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2394.  "cs46xx: cs46xx_remove()+n"));
  2395. card->active_ctrl(card,1);
  2396. tmp = cs461x_peek(card, BA1_PFIE);
  2397. tmp &= ~0x0000f03f;
  2398. tmp |=  0x00000010;
  2399. cs461x_poke(card, BA1_PFIE, tmp); /* playback interrupt disable */
  2400. tmp = cs461x_peek(card, BA1_CIE);
  2401. tmp &= ~0x0000003f;
  2402. tmp |=  0x00000011;
  2403. cs461x_poke(card, BA1_CIE, tmp); /* capture interrupt disable */
  2404. /*
  2405.          *  Stop playback DMA.
  2406.  */
  2407. tmp = cs461x_peek(card, BA1_PCTL);
  2408. cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
  2409. /*
  2410.          *  Stop capture DMA.
  2411.  */
  2412. tmp = cs461x_peek(card, BA1_CCTL);
  2413. cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
  2414. /*
  2415.          *  Reset the processor.
  2416.          */
  2417. cs461x_reset(card);
  2418. cs461x_proc_stop(card);
  2419. /*
  2420.  *  Power down the DAC and ADC.  We will power them up (if) when we need
  2421.  *  them.
  2422.  */
  2423. if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
  2424. CS_POWER_MIXVON, CS_TRUE )) )
  2425. {
  2426. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
  2427. "cs46xx: cs461x_powerdown() failure (0x%x)n",tmp) );
  2428. }
  2429. /*
  2430.  *  Power down the PLL.
  2431.  */
  2432. cs461x_pokeBA0(card, BA0_CLKCR1, 0);
  2433. /*
  2434.  *  Turn off the Processor by turning off the software clock enable flag in 
  2435.  *  the clock control register.
  2436.  */
  2437. tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
  2438. cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
  2439. card->active_ctrl(card,-1);
  2440. /* free hardware resources */
  2441. free_irq(card->irq, card);
  2442. iounmap(card->ba0);
  2443. iounmap(card->ba1.name.data0);
  2444. iounmap(card->ba1.name.data1);
  2445. iounmap(card->ba1.name.pmem);
  2446. iounmap(card->ba1.name.reg);
  2447. /* unregister audio devices */
  2448. for (i = 0; i < NR_AC97; i++)
  2449. if (card->ac97_codec[i] != NULL) {
  2450. unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
  2451. kfree (card->ac97_codec[i]);
  2452. }
  2453. unregister_sound_dsp(card->dev_audio);
  2454.         if(card->dev_midi)
  2455.                 unregister_sound_midi(card->dev_midi);
  2456. list_del(&card->list);
  2457. kfree(card);
  2458. PCI_SET_DRIVER_DATA(pci_dev,NULL);
  2459. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2460.  "cs46xx: cs46xx_remove()-: remove successfuln"));
  2461. }
  2462. enum {
  2463. CS46XX_4610 = 0,
  2464. CS46XX_4612,   /* same as 4630 */
  2465. CS46XX_4615,   /* same as 4624 */
  2466. };
  2467. static struct pci_device_id cs46xx_pci_tbl[] __devinitdata = {
  2468. {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4610},
  2469. {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4612, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4612},
  2470. {PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_4615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CS46XX_4615},
  2471. {0,}
  2472. };
  2473. MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
  2474. struct pci_driver cs46xx_pci_driver = {
  2475. name:"cs46xx",
  2476. id_table:cs46xx_pci_tbl,
  2477. probe:cs46xx_probe,
  2478. remove:cs46xx_remove,
  2479. suspend:CS46XX_SUSPEND_TBL,
  2480. resume:CS46XX_RESUME_TBL,
  2481. };
  2482. int __init cs46xx_init_module(void)
  2483. {
  2484. int rtn = 0;
  2485. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO 
  2486. "cs46xx: cs46xx_init_module()+ n"));
  2487. if (!pci_present()) { /* No PCI bus in this machine! */
  2488. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
  2489. "cs46xx: cs46xx_init_module()- no pci bus foundn"));
  2490. return -ENODEV;
  2491. }
  2492. rtn = pci_module_init(&cs46xx_pci_driver);
  2493. if(rtn == -ENODEV)
  2494. {
  2495. CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk( 
  2496. "cs46xx: Unable to detect valid cs46xx devicen"));
  2497. }
  2498. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
  2499.   printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)n",rtn));
  2500. return rtn;
  2501. }
  2502. void __exit cs46xx_cleanup_module(void)
  2503. {
  2504. pci_unregister_driver(&cs46xx_pci_driver);
  2505. cs_pm_unregister_all(cs46xx_pm_callback);
  2506. CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
  2507.   printk(KERN_INFO "cs46xx: cleanup_cs46xx() finishedn"));
  2508. }
  2509. module_init(cs46xx_init_module);
  2510. module_exit(cs46xx_cleanup_module);
  2511. int cs46xx_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
  2512. {
  2513. struct cs_card *card;
  2514. CS_DBGOUT(CS_PM, 2, printk(KERN_INFO 
  2515. "cs46xx: cs46xx_pm_callback dev=0x%x rqst=0x%x card=%dn",
  2516. (unsigned)dev,(unsigned)rqst,(unsigned)data));
  2517. card = (struct cs_card *) dev->data;
  2518. if (card) {
  2519. switch(rqst) {
  2520. case PM_SUSPEND:
  2521. CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
  2522. "cs46xx: PM suspend requestn"));
  2523. if(cs46xx_suspend(card, 0))
  2524. {
  2525.     CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
  2526. "cs46xx: PM suspend request refusedn"));
  2527. return 1; 
  2528. }
  2529. break;
  2530. case PM_RESUME:
  2531. CS_DBGOUT(CS_PM, 2, printk(KERN_INFO
  2532. "cs46xx: PM resume requestn"));
  2533. if(cs46xx_resume(card))
  2534. {
  2535.     CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
  2536. "cs46xx: PM resume request refusedn"));
  2537. return 1;
  2538. }
  2539. break;
  2540. }
  2541. }
  2542. return 0;
  2543. }
  2544. #if CS46XX_ACPI_SUPPORT
  2545. static int cs46xx_suspend_tbl(struct pci_dev *pcidev, u32 state)
  2546. {
  2547. struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
  2548. CS_DBGOUT(CS_PM | CS_FUNCTION, 2, 
  2549. printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl requestn"));
  2550. cs46xx_suspend(s, 0);
  2551. return 0;
  2552. }
  2553. static int cs46xx_resume_tbl(struct pci_dev *pcidev)
  2554. {
  2555. struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
  2556. CS_DBGOUT(CS_PM | CS_FUNCTION, 2, 
  2557. printk(KERN_INFO "cs46xx: cs46xx_resume_tbl requestn"));
  2558. cs46xx_resume(s);
  2559. return 0;
  2560. }
  2561. #endif