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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * OSS driver for Linux 2.4.x for
  3.  *
  4.  * Trident 4D-Wave
  5.  * SiS 7018
  6.  * ALi 5451
  7.  * Tvia/IGST CyberPro 5050
  8.  *
  9.  * Driver: Alan Cox <alan@redhat.com>
  10.  *
  11.  *  Built from:
  12.  * Low level code: <audio@tridentmicro.com> from ALSA
  13.  * Framework: Thomas Sailer <sailer@ife.ee.ethz.ch>
  14.  * Extended by: Zach Brown <zab@redhat.com>  
  15.  *
  16.  *  Hacked up by:
  17.  * Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  18.  * Ollie Lho <ollie@sis.com.tw> SiS 7018 Audio Core Support
  19.  * Ching-Ling Lee <cling-li@ali.com.tw> ALi 5451 Audio Core Support 
  20.  * Matt Wu <mattwu@acersoftech.com.cn> ALi 5451 Audio Core Support
  21.  * Peter W鋍htler <pwaechtler@loewe-komp.de> CyberPro5050 support
  22.  *
  23.  *
  24.  * This program is free software; you can redistribute it and/or modify
  25.  * it under the terms of the GNU General Public License as published by
  26.  * the Free Software Foundation; either version 2 of the License, or
  27.  * (at your option) any later version.
  28.  *
  29.  * This program is distributed in the hope that it will be useful,
  30.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  31.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  32.  * GNU General Public License for more details.
  33.  *
  34.  * You should have received a copy of the GNU General Public License
  35.  * along with this program; if not, write to the Free Software
  36.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  37.  *
  38.  *  History
  39.  *  v0.14.9d
  40.  *   October 8 2001 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  41.  * use set_current_state, properly release resources on failure in
  42.  * trident_probe, get rid of check_region
  43.  *  v0.14.9c
  44.  * August 10 2001 Peter W鋍htler <pwaechtler@loewe-komp.de>
  45.  * added support for Tvia (formerly Integraphics/IGST) CyberPro5050
  46.  * this chip is often found in settop boxes (combined video+audio)
  47.  *  v0.14.9b
  48.  * Switch to static inline not extern inline (gcc 3)
  49.  *  v0.14.9a
  50.  * Aug 6 2001 Alan Cox
  51.  * 0.14.9 crashed on rmmod due to a timer/bh left running. Simplified
  52.  * the existing logic (the BH doesnt help as ac97 is lock_irqsave)
  53.  * and used del_timer_sync to clean up
  54.  * Fixed a problem where the ALi change broke my generic card
  55.  *  v0.14.9
  56.  * Jul 10 2001 Matt Wu
  57.  * Add H/W Volume Control
  58.  *  v0.14.8a
  59.  * July 7 2001 Alan Cox
  60.  * Moved Matt Wu's ac97 register cache into the card structure
  61.  *  v0.14.8
  62.  * Apr 30 2001 Matt Wu
  63.  * Set EBUF1 and EBUF2 to still mode
  64.  * Add dc97/ac97 reset function
  65.  * Fix power management: ali_restore_regs
  66.  *  unreleased 
  67.  * Mar 09 2001 Matt Wu
  68.  * Add cache for ac97 access
  69.  *  v0.14.7
  70.  * Feb 06 2001 Matt Wu
  71.  * Fix ac97 initialization
  72.  * Fix bug: an extra tail will be played when playing
  73.  * Jan 05 2001 Matt Wu
  74.  * Implement multi-channels and S/PDIF in support for ALi 1535+
  75.  *  v0.14.6 
  76.  * Nov 1 2000 Ching-Ling Lee
  77.  * Fix the bug of memory leak when switching 5.1-channels to 2 channels.
  78.  * Add lock protection into dynamic changing format of data.
  79.  * Oct 18 2000 Ching-Ling Lee
  80.  * 5.1-channels support for ALi
  81.  * June 28 2000 Ching-Ling Lee
  82.  * S/PDIF out/in(playback/record) support for ALi 1535+, using /proc to be selected by user
  83.  * Simple Power Management support for ALi
  84.  *  v0.14.5 May 23 2000 Ollie Lho
  85.  *   Misc bug fix from the Net
  86.  *  v0.14.4 May 20 2000 Aaron Holtzman
  87.  *   Fix kfree'd memory access in release
  88.  *   Fix race in open while looking for a free virtual channel slot
  89.  *   remove open_wait wq (which appears to be unused)
  90.  *  v0.14.3 May 10 2000 Ollie Lho
  91.  * fixed a small bug in trident_update_ptr, xmms 1.0.1 no longer uses 100% CPU
  92.  *  v0.14.2 Mar 29 2000 Ching-Ling Lee
  93.  * Add clear to silence advance in trident_update_ptr 
  94.  * fix invalid data of the end of the sound
  95.  *  v0.14.1 Mar 24 2000 Ching-Ling Lee
  96.  * ALi 5451 support added, playback and recording O.K.
  97.  * ALi 5451 originally developed and structured based on sonicvibes, and
  98.  * suggested to merge into this file by Alan Cox.
  99.  *  v0.14 Mar 15 2000 Ollie Lho
  100.  * 5.1 channel output support with channel binding. What's the Matrix ?
  101.  *  v0.13.1 Mar 10 2000 Ollie Lho
  102.  * few minor bugs on dual codec support, needs more testing
  103.  *  v0.13 Mar 03 2000 Ollie Lho
  104.  * new pci_* for 2.4 kernel, back ported to 2.2
  105.  *  v0.12 Feb 23 2000 Ollie Lho
  106.  * Preliminary Recording support
  107.  *  v0.11.2 Feb 19 2000 Ollie Lho
  108.  * removed incomplete full-dulplex support
  109.  *  v0.11.1 Jan 28 2000 Ollie Lho
  110.  * small bug in setting sample rate for 4d-nx (reported by Aaron)
  111.  *  v0.11 Jan 27 2000 Ollie Lho
  112.  * DMA bug, scheduler latency, second try
  113.  *  v0.10 Jan 24 2000 Ollie Lho
  114.  * DMA bug fixed, found kernel scheduling problem
  115.  *  v0.09 Jan 20 2000 Ollie Lho
  116.  * Clean up of channel register access routine (prepare for channel binding)
  117.  *  v0.08 Jan 14 2000 Ollie Lho
  118.  * Isolation of AC97 codec code
  119.  *  v0.07 Jan 13 2000 Ollie Lho
  120.  * Get rid of ugly old low level access routines (e.g. CHRegs.lp****)
  121.  *  v0.06 Jan 11 2000 Ollie Lho
  122.  * Preliminary support for dual (more ?) AC97 codecs
  123.  *  v0.05 Jan 08 2000 Luca Montecchiani <m.luca@iname.com>
  124.  * adapt to 2.3.x new __setup/__init call
  125.  *  v0.04 Dec 31 1999 Ollie Lho
  126.  * Multiple Open, using Middle Loop Interrupt to smooth playback
  127.  *  v0.03 Dec 24 1999 Ollie Lho
  128.  * mem leak in prog_dmabuf and dealloc_dmabuf removed
  129.  *  v0.02 Dec 15 1999 Ollie Lho
  130.  * SiS 7018 support added, playback O.K.
  131.  *  v0.01 Alan Cox et. al.
  132.  * Initial Release in kernel 2.3.30, does not work
  133.  * 
  134.  *  ToDo
  135.  * Clean up of low level channel register access code. (done)
  136.  * Fix the bug on dma buffer management in update_ptr, read/write, drain_dac (done)
  137.  * Dual AC97 codecs support (done)
  138.  * Recording support (done)
  139.  * Mmap support
  140.  * "Channel Binding" ioctl extension (done)
  141.  * new pci device driver interface for 2.4 kernel (done)
  142.  *
  143.  * Lock order (high->low)
  144.  * lock - hardware lock
  145.  * open_sem -  guard opens
  146.  * sem - guard dmabuf, write re-entry etc
  147.  */
  148. #include <linux/config.h>
  149. #include <linux/module.h>
  150. #include <linux/version.h>
  151. #include <linux/string.h>
  152. #include <linux/ctype.h>
  153. #include <linux/ioport.h>
  154. #include <linux/sched.h>
  155. #include <linux/delay.h>
  156. #include <linux/sound.h>
  157. #include <linux/slab.h>
  158. #include <linux/soundcard.h>
  159. #include <linux/pci.h>
  160. #include <asm/io.h>
  161. #include <asm/dma.h>
  162. #include <linux/init.h>
  163. #include <linux/poll.h>
  164. #include <linux/spinlock.h>
  165. #include <linux/smp_lock.h>
  166. #include <linux/ac97_codec.h>
  167. #include <linux/wrapper.h>
  168. #include <asm/uaccess.h>
  169. #include <asm/hardirq.h>
  170. #include <linux/bitops.h>
  171. #include <linux/proc_fs.h>
  172. #include <linux/interrupt.h>
  173. #if defined CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC
  174. #include <asm/hwrpb.h>
  175. #endif
  176. #include "trident.h"
  177. #include <linux/pm.h>
  178. #define DRIVER_VERSION "0.14.9d"
  179. /* magic numbers to protect our data structures */
  180. #define TRIDENT_CARD_MAGIC 0x5072696E /* "Prin" */
  181. #define TRIDENT_STATE_MAGIC 0x63657373 /* "cess" */
  182. #define TRIDENT_DMA_MASK 0x3fffffff /* DMA buffer mask for pci_alloc_consist */
  183. #define ALI_DMA_MASK 0xffffffff /* ALI Tridents lack the 30-bit limitation */
  184. #define NR_HW_CH 32
  185. /* maxinum nuber of AC97 codecs connected, AC97 2.0 defined 4, but 7018 and 4D-NX only
  186.    have 2 SDATA_IN lines (currently) */
  187. #define NR_AC97 2
  188. /* minor number of /dev/swmodem (temporary, experimental) */
  189. #define SND_DEV_SWMODEM 7
  190. static const unsigned ali_multi_channels_5_1[] = { /*ALI_SURR_LEFT_CHANNEL, ALI_SURR_RIGHT_CHANNEL,*/ ALI_CENTER_CHANNEL, ALI_LEF_CHANNEL, ALI_SURR_LEFT_CHANNEL, ALI_SURR_RIGHT_CHANNEL};
  191. static const unsigned sample_size[] = { 1, 2, 2, 4 };
  192. static const unsigned sample_shift[] = { 0, 1, 1, 2 };
  193. static const char invalid_magic[] = KERN_CRIT "trident: invalid magic value in %sn";
  194. enum {
  195. TRIDENT_4D_DX = 0,
  196. TRIDENT_4D_NX,
  197. SIS_7018,
  198. ALI_5451,
  199. CYBER5050
  200. };
  201. static char * card_names[] = {
  202. "Trident 4DWave DX",
  203. "Trident 4DWave NX",
  204. "SiS 7018 PCI Audio",
  205. "ALi Audio Accelerator",
  206. "Tvia/IGST CyberPro 5050"
  207. };
  208. static struct pci_device_id trident_pci_tbl [] __devinitdata = {
  209. {PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX,
  210.  PCI_ANY_ID, PCI_ANY_ID, 0, 0, TRIDENT_4D_DX},
  211. {PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX,
  212.  PCI_ANY_ID, PCI_ANY_ID, 0, 0, TRIDENT_4D_NX},
  213. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018,
  214.  PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_7018},
  215. {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI_5451,
  216.  PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI_5451},
  217. { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_5050, 
  218.  PCI_ANY_ID, PCI_ANY_ID, 0, 0, CYBER5050},
  219. {0,}
  220. };
  221. MODULE_DEVICE_TABLE (pci, trident_pci_tbl);
  222. /* "software" or virtual channel, an instance of opened /dev/dsp */
  223. struct trident_state {
  224. unsigned int magic;
  225. struct trident_card *card; /* Card info */
  226. /* file mode */
  227. mode_t open_mode;
  228. /* virtual channel number */
  229. int virt;
  230. struct dmabuf {
  231. /* wave sample stuff */
  232. unsigned int rate;
  233. unsigned char fmt, enable;
  234. /* hardware channel */
  235. struct trident_channel *channel;
  236. /* OSS buffer management stuff */
  237. void *rawbuf;
  238. dma_addr_t dma_handle;
  239. unsigned buforder;
  240. unsigned numfrag;
  241. unsigned fragshift;
  242. /* our buffer acts like a circular ring */
  243. unsigned hwptr; /* where dma last started, updated by update_ptr */
  244. unsigned swptr; /* where driver last clear/filled, updated by read/write */
  245. int count; /* bytes to be comsumed or been generated by dma machine */
  246. unsigned total_bytes; /* total bytes dmaed by hardware */
  247. unsigned error; /* number of over/underruns */
  248. wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */
  249. /* redundant, but makes calculations easier */
  250. unsigned fragsize;
  251. unsigned dmasize;
  252. unsigned fragsamples;
  253. /* OSS stuff */
  254. unsigned mapped:1;
  255. unsigned ready:1;
  256. unsigned endcleared:1;
  257. unsigned update_flag;
  258. unsigned ossfragshift;
  259. int ossmaxfrags;
  260. unsigned subdivision;
  261. } dmabuf;
  262. /* 5.1channels */
  263. struct trident_state *other_states[4];
  264. int multi_channels_adjust_count;
  265. unsigned chans_num;
  266. unsigned fmt_flag:1;
  267. /* Guard against mmap/write/read races */
  268. struct semaphore sem;
  269. };
  270. /* hardware channels */
  271. struct trident_channel {
  272. int  num; /* channel number */
  273. u32 lba; /* Loop Begine Address, where dma buffer starts */
  274. u32 eso; /* End Sample Offset, wehre dma buffer ends (in the unit of samples) */
  275. u32 delta; /* delta value, sample rate / 48k for playback, 48k/sample rate for recording */
  276. u16 attribute; /* control where PCM data go and come  */
  277. u16 fm_vol;
  278. u32 control; /* signed/unsigned, 8/16 bits, mono/stereo */
  279. };
  280. struct trident_pcm_bank_address {
  281. u32 start;
  282. u32 stop;
  283. u32 aint;
  284. u32 aint_en;
  285. };
  286. static struct trident_pcm_bank_address bank_a_addrs =
  287. {
  288. T4D_START_A,
  289. T4D_STOP_A,
  290. T4D_AINT_A,
  291. T4D_AINTEN_A
  292. };
  293. static struct trident_pcm_bank_address bank_b_addrs =
  294. {
  295. T4D_START_B,
  296. T4D_STOP_B,
  297. T4D_AINT_B,
  298. T4D_AINTEN_B
  299. };
  300. struct trident_pcm_bank {
  301. /* register addresses to control bank operations */
  302. struct trident_pcm_bank_address *addresses;
  303. /* each bank has 32 channels */
  304. u32 bitmap; /* channel allocation bitmap */
  305. struct trident_channel channels[32];
  306. };
  307. struct trident_card {
  308. unsigned int magic;
  309. /* We keep trident cards in a linked list */
  310. struct trident_card *next;
  311. /* single open lock mechanism, only used for recording */
  312. struct semaphore open_sem;
  313. /* The trident has a certain amount of cross channel interaction
  314.    so we use a single per card lock */
  315. spinlock_t lock;
  316. /* PCI device stuff */
  317. struct pci_dev * pci_dev;
  318. u16 pci_id;
  319. u8 revision;
  320. /* soundcore stuff */
  321. int dev_audio;
  322. /* structures for abstraction of hardware facilities, codecs, banks and channels*/
  323. struct ac97_codec *ac97_codec[NR_AC97];
  324. struct trident_pcm_bank banks[NR_BANKS];
  325. struct trident_state *states[NR_HW_CH];
  326. /* hardware resources */
  327. unsigned long iobase;
  328. u32 irq;
  329. /* Function support */
  330. struct trident_channel *(*alloc_pcm_channel)(struct trident_card *);
  331. struct trident_channel *(*alloc_rec_pcm_channel)(struct trident_card *);
  332. void (*free_pcm_channel)(struct trident_card *, unsigned int chan);
  333. void (*address_interrupt)(struct trident_card *);
  334. /* Added by Matt Wu 01-05-2001 for spdif in */
  335. int multi_channel_use_count;
  336. int rec_channel_use_count;
  337. u16 mixer_regs[64][NR_AC97]; /* Made card local by Alan */
  338. int mixer_regs_ready;
  339. /* Added for hardware volume control */
  340. int hwvolctl;
  341. struct timer_list timer;
  342. };
  343. /* table to map from CHANNELMASK to channel attribute for SiS 7018 */
  344. static u16 mask2attr [] =
  345. {
  346. PCM_LR, PCM_LR, SURR_LR, CENTER_LFE,
  347. HSET, MIC, MODEM_LINE1, MODEM_LINE2,
  348. I2S_LR, SPDIF_LR
  349. };
  350. /* table to map from channel attribute to CHANNELMASK for SiS 7018 */
  351. static int attr2mask [] = {
  352. DSP_BIND_MODEM1, DSP_BIND_MODEM2, DSP_BIND_FRONT, DSP_BIND_HANDSET,
  353. DSP_BIND_I2S, DSP_BIND_CENTER_LFE, DSP_BIND_SURR, DSP_BIND_SPDIF
  354. };
  355. /* Added by Matt Wu 01-05-2001 for spdif in */
  356. static int ali_close_multi_channels(void);
  357. static void ali_delay(struct trident_card *card,int interval);
  358. static void ali_detect_spdif_rate(struct trident_card *card);
  359. static void ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val);
  360. static u16 ali_ac97_read(struct ac97_codec *codec, u8 reg);
  361. static struct trident_card *devs;
  362. static void trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val);
  363. static u16 trident_ac97_get(struct ac97_codec *codec, u8 reg);
  364. static int trident_open_mixdev(struct inode *inode, struct file *file);
  365. static int trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
  366. unsigned long arg);
  367. static void ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val);
  368. static u16 ali_ac97_get(struct trident_card *card, int secondary, u8 reg);
  369. static void ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate);
  370. static void ali_enable_special_channel(struct trident_state *stat);
  371. static struct trident_channel *ali_alloc_rec_pcm_channel(struct trident_card *card);
  372. static struct trident_channel *ali_alloc_pcm_channel(struct trident_card *card);
  373. static void ali_restore_regs(struct trident_card *card);
  374. static void ali_save_regs(struct trident_card *card);
  375. static int trident_suspend(struct pci_dev *dev, u32 unused);
  376. static int trident_resume(struct pci_dev *dev);
  377. static void ali_free_pcm_channel(struct trident_card *card, unsigned int channel);
  378. static int ali_setup_multi_channels(struct trident_card *card, int chan_nums);
  379. static unsigned int ali_get_spdif_in_rate(struct trident_card *card);
  380. static void ali_setup_spdif_in(struct trident_card *card);
  381. static void ali_disable_spdif_in(struct trident_card *card);
  382. static void ali_disable_special_channel(struct trident_card *card, int ch);
  383. static void ali_setup_spdif_out(struct trident_card *card, int flag);
  384. static int ali_write_5_1(struct trident_state *state, const char *buffer,int cnt_for_multi_channel, unsigned int *copy_count, unsigned int *state_cnt);
  385. static int ali_allocate_other_states_resources(struct trident_state *state, int chan_nums);
  386. static void ali_free_other_states_resources(struct trident_state *state);
  387. /* save registers for ALi Power Management */
  388. static struct ali_saved_registers {
  389. unsigned long global_regs[ALI_GLOBAL_REGS];
  390. unsigned long channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
  391. unsigned mixer_regs[ALI_MIXER_REGS];
  392. } ali_registers;
  393. #define seek_offset(dma_ptr, buffer, cnt, offset, copy_count) (dma_ptr) += (offset);
  394. (buffer) += (offset);
  395. (cnt) -= (offset);
  396. (copy_count) += (offset);
  397. #define lock_set_fmt(state) {spin_lock_irqsave(&state->card->lock, flags);
  398. if (state->fmt_flag) {
  399. spin_unlock_irqrestore(&state->card->lock, flags);
  400. return -EFAULT;
  401. }
  402. state->fmt_flag = 1;
  403. spin_unlock_irqrestore(&state->card->lock, flags);}
  404. #define unlock_set_fmt(state) {spin_lock_irqsave(&state->card->lock, flags);
  405. state->fmt_flag = 0;
  406. spin_unlock_irqrestore(&state->card->lock, flags);}
  407. static int trident_enable_loop_interrupts(struct trident_card * card)
  408. {
  409. u32 global_control;
  410. global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR));
  411. switch (card->pci_id)
  412. {
  413. case PCI_DEVICE_ID_SI_7018:
  414. global_control |= (ENDLP_IE | MIDLP_IE| BANK_B_EN);
  415. break;
  416. case PCI_DEVICE_ID_ALI_5451:
  417. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  418. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  419. case PCI_DEVICE_ID_INTERG_5050:
  420. global_control |= (ENDLP_IE | MIDLP_IE);
  421. break;
  422. default:
  423. return FALSE;
  424. }
  425. outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR));
  426. #ifdef DEBUG
  427. printk("trident: Enable Loop Interrupts, globctl = 0x%08Xn",
  428. inl(TRID_REG(card, T4D_LFO_GC_CIR)));
  429. #endif
  430. return (TRUE);
  431. }
  432. static int trident_disable_loop_interrupts(struct trident_card * card)
  433. {
  434. u32 global_control;
  435. global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR));
  436. global_control &= ~(ENDLP_IE | MIDLP_IE);
  437. outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR));
  438. #ifdef DEBUG
  439. printk("trident: Disabled Loop Interrupts, globctl = 0x%08Xn",
  440.        global_control);
  441. #endif
  442. return (TRUE);
  443. }
  444. static void trident_enable_voice_irq(struct trident_card * card, unsigned int channel)
  445. {
  446. unsigned int mask = 1 << (channel & 0x1f);
  447. struct trident_pcm_bank *bank = &card->banks[channel >> 5];
  448. u32 reg, addr = bank->addresses->aint_en;
  449. reg = inl(TRID_REG(card, addr));
  450. reg |= mask;
  451. outl(reg, TRID_REG(card, addr));
  452. #ifdef DEBUG
  453. reg = inl(TRID_REG(card, addr));
  454. printk("trident: enabled IRQ on channel %d, %s = 0x%08x(addr:%X)n",
  455. channel, addr==T4D_AINTEN_B? "AINTEN_B":"AINTEN_A",reg,addr);
  456. #endif
  457. }
  458. static void trident_disable_voice_irq(struct trident_card * card, unsigned int channel)
  459. {
  460. unsigned int mask = 1 << (channel & 0x1f);
  461. struct trident_pcm_bank *bank = &card->banks[channel >> 5];
  462. u32 reg, addr = bank->addresses->aint_en;
  463. reg = inl(TRID_REG(card, addr));
  464. reg &= ~mask;
  465. outl(reg, TRID_REG(card, addr));
  466. /* Ack the channel in case the interrupt was set before we disable it. */
  467. outl(mask, TRID_REG(card, bank->addresses->aint));
  468. #ifdef DEBUG
  469. reg = inl(TRID_REG(card, addr));
  470. printk("trident: disabled IRQ on channel %d, %s = 0x%08x(addr:%X)n",
  471. channel, addr==T4D_AINTEN_B? "AINTEN_B":"AINTEN_A",reg,addr);
  472. #endif
  473. }
  474. static void trident_start_voice(struct trident_card * card, unsigned int channel)
  475. {
  476. unsigned int mask = 1 << (channel & 0x1f);
  477. struct trident_pcm_bank *bank = &card->banks[channel >> 5];
  478. u32 addr = bank->addresses->start;
  479. #ifdef DEBUG
  480. u32 reg;
  481. #endif
  482. outl(mask, TRID_REG(card, addr));
  483. #ifdef DEBUG
  484. reg = inl(TRID_REG(card, addr));
  485. printk("trident: start voice on channel %d, %s = 0x%08x(addr:%X)n",
  486. channel, addr==T4D_START_B? "START_B":"START_A",reg,addr);
  487. #endif
  488. }
  489. static void trident_stop_voice(struct trident_card * card, unsigned int channel)
  490. {
  491. unsigned int mask = 1 << (channel & 0x1f);
  492. struct trident_pcm_bank *bank = &card->banks[channel >> 5];
  493. u32 addr = bank->addresses->stop;
  494. #ifdef DEBUG
  495. u32 reg;
  496. #endif
  497. outl(mask, TRID_REG(card, addr));
  498. #ifdef DEBUG
  499. reg = inl(TRID_REG(card, addr));
  500. printk("trident: stop voice on channel %d, %s = 0x%08x(addr:%X)n",
  501. channel, addr==T4D_STOP_B? "STOP_B":"STOP_A",reg,addr);
  502. #endif
  503. }
  504. static u32 trident_get_interrupt_mask (struct trident_card * card, unsigned int channel)
  505. {
  506. struct trident_pcm_bank *bank = &card->banks[channel];
  507. u32 addr = bank->addresses->aint;
  508. return inl(TRID_REG(card, addr));
  509. }
  510. static int trident_check_channel_interrupt(struct trident_card * card, unsigned int channel)
  511. {
  512. unsigned int mask = 1 << (channel & 0x1f);
  513. u32 reg = trident_get_interrupt_mask (card, channel >> 5);
  514. #ifdef DEBUG
  515. if (reg & mask)
  516. printk("trident: channel %d has interrupt, %s = 0x%08xn",
  517. channel,reg==T4D_AINT_B? "AINT_B":"AINT_A", reg);
  518. #endif
  519. return (reg & mask) ? TRUE : FALSE;
  520. }
  521. static void trident_ack_channel_interrupt(struct trident_card * card, unsigned int channel)
  522. {
  523. unsigned int mask = 1 << (channel & 0x1f);
  524. struct trident_pcm_bank *bank = &card->banks[channel >> 5];
  525. u32 reg, addr = bank->addresses->aint;
  526. reg = inl(TRID_REG(card, addr));
  527. reg &= mask;
  528. outl(reg, TRID_REG(card, addr));
  529. #ifdef DEBUG
  530. reg = inl(TRID_REG(card, T4D_AINT_B));
  531. printk("trident: Ack channel %d interrupt, AINT_B = 0x%08xn",
  532.        channel, reg);
  533. #endif
  534. }
  535. static struct trident_channel * trident_alloc_pcm_channel(struct trident_card *card)
  536. {
  537. struct trident_pcm_bank *bank;
  538. int idx;
  539. bank = &card->banks[BANK_B];
  540. for (idx = 31; idx >= 0; idx--) {
  541. if (!(bank->bitmap & (1 << idx))) {
  542. struct trident_channel *channel = &bank->channels[idx];
  543. bank->bitmap |= 1 << idx;
  544. channel->num = idx + 32;
  545. return channel;
  546. }
  547. }
  548. /* no more free channels available */
  549. printk(KERN_ERR "trident: no more channels available on Bank B.n");
  550. return NULL;
  551. }
  552. static void trident_free_pcm_channel(struct trident_card *card, unsigned int channel)
  553. {
  554. int bank;
  555.         unsigned char b;
  556. if (channel < 31 || channel > 63)
  557. return;
  558. if (card->pci_id == PCI_DEVICE_ID_TRIDENT_4DWAVE_DX ||
  559.             card->pci_id == PCI_DEVICE_ID_TRIDENT_4DWAVE_NX) {
  560.           b = inb (TRID_REG(card, T4D_REC_CH));
  561.           if ((b & ~0x80) == channel)
  562.             outb(0x0, TRID_REG(card, T4D_REC_CH));
  563.         }
  564.             
  565. bank = channel >> 5;
  566. channel = channel & 0x1f;
  567.         
  568. card->banks[bank].bitmap &= ~(1 << (channel));
  569. }
  570. static struct trident_channel * cyber_alloc_pcm_channel(struct trident_card *card)
  571. {
  572. struct trident_pcm_bank *bank;
  573. int idx;
  574. /* The cyberpro 5050 has only 32 voices and one bank */
  575. /* .. at least they are not documented (if you want to call that 
  576.  * crap documentation), perhaps broken ? */
  577. bank = &card->banks[BANK_A];
  578. for (idx = 31; idx >= 0; idx--) {
  579. if (!(bank->bitmap & (1 << idx))) {
  580. struct trident_channel *channel = &bank->channels[idx];
  581. bank->bitmap |= 1 << idx;
  582. channel->num = idx;
  583. return channel;
  584. }
  585. }
  586. /* no more free channels available */
  587. printk(KERN_ERR "cyberpro5050: no more channels available on Bank A.n");
  588. return NULL;
  589. }
  590. static void cyber_free_pcm_channel(struct trident_card *card, unsigned int channel)
  591. {
  592. if (channel > 31)
  593. return;
  594. card->banks[BANK_A].bitmap &= ~(1 << (channel));
  595. }
  596. static inline void cyber_outidx(int port,int idx,int data)
  597. {
  598. outb(idx,port);
  599. outb(data,port+1);
  600. }
  601. static inline int cyber_inidx(int port,int idx)
  602. {
  603. outb(idx,port);
  604. return inb(port+1);
  605. }
  606. static int cyber_init_ritual(struct trident_card *card)
  607. {
  608. /* some black magic, taken from SDK samples */
  609. /* remove this and nothing will work */
  610. int portDat;
  611. int ret = 0;
  612. unsigned long flags;
  613. /*
  614.    * Keep interrupts off for the configure - we don't want to
  615.    * clash with another cyberpro config event
  616.    */
  617.  
  618. save_flags(flags);
  619. cli();
  620. portDat = cyber_inidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE);
  621. /* enable, if it was disabled */
  622. if( (portDat & CYBER_BMSK_AUENZ) != CYBER_BMSK_AUENZ_ENABLE ) {
  623. printk(KERN_INFO "cyberpro5050: enabling audio controllern" );
  624. cyber_outidx( CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE,
  625. portDat | CYBER_BMSK_AUENZ_ENABLE );
  626. /* check again if hardware is enabled now */
  627. portDat = cyber_inidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE);
  628. }
  629. if( (portDat & CYBER_BMSK_AUENZ) != CYBER_BMSK_AUENZ_ENABLE )
  630. {
  631. printk(KERN_ERR "cyberpro5050: initAudioAccess: no successn" );
  632. ret = -1;
  633. }
  634. else
  635. {
  636. cyber_outidx( CYBER_PORT_AUDIO, CYBER_IDX_IRQ_ENABLE, CYBER_BMSK_AUDIO_INT_ENABLE );
  637. cyber_outidx( CYBER_PORT_AUDIO, 0xbf, 0x01 );
  638. cyber_outidx( CYBER_PORT_AUDIO, 0xba, 0x20 );
  639. cyber_outidx( CYBER_PORT_AUDIO, 0xbb, 0x08 );
  640. cyber_outidx( CYBER_PORT_AUDIO, 0xbf, 0x02 );
  641. cyber_outidx( CYBER_PORT_AUDIO, 0xb3, 0x06 );
  642. cyber_outidx( CYBER_PORT_AUDIO, 0xbf, 0x00 );
  643. }
  644. restore_flags(flags);
  645. return ret;
  646. }
  647. /*  called with spin lock held */
  648. static int trident_load_channel_registers(struct trident_card *card, u32 *data, unsigned int channel)
  649. {
  650. int i;
  651. if (channel > 63)
  652. return FALSE;
  653. /* select hardware channel to write */
  654. outb(channel, TRID_REG(card, T4D_LFO_GC_CIR));
  655. /* Output the channel registers, but don't write register
  656.    three to an ALI chip. */
  657. for (i = 0; i < CHANNEL_REGS; i++) {
  658. if (i == 3 && card->pci_id == PCI_DEVICE_ID_ALI_5451)
  659. continue;
  660. outl(data[i], TRID_REG(card, CHANNEL_START + 4*i));
  661. }
  662. if (card->pci_id == PCI_DEVICE_ID_ALI_5451 ||
  663. card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
  664. outl(ALI_EMOD_Still, TRID_REG(card, ALI_EBUF1));
  665. outl(ALI_EMOD_Still, TRID_REG(card, ALI_EBUF2));
  666. }
  667. return TRUE;
  668. }
  669. /* called with spin lock held */
  670. static int trident_write_voice_regs(struct trident_state *state)
  671. {
  672. unsigned int data[CHANNEL_REGS + 1];
  673. struct trident_channel *channel;
  674. channel = state->dmabuf.channel;
  675. data[1] = channel->lba;
  676. data[4] = channel->control;
  677. switch (state->card->pci_id)
  678. {
  679. case PCI_DEVICE_ID_ALI_5451:
  680. data[0] = 0; /* Current Sample Offset */
  681. data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
  682. data[3] = 0;
  683. break;
  684. case PCI_DEVICE_ID_SI_7018:
  685. case PCI_DEVICE_ID_INTERG_5050:
  686. data[0] = 0; /* Current Sample Offset */
  687. data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
  688. data[3] = (channel->attribute << 16) | (channel->fm_vol & 0xffff);
  689. break;
  690. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  691. data[0] = 0; /* Current Sample Offset */
  692. data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
  693. data[3] = channel->fm_vol & 0xffff;
  694. break;
  695. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  696. data[0] = (channel->delta << 24);
  697. data[2] = ((channel->delta << 16) & 0xff000000) | (channel->eso & 0x00ffffff);
  698. data[3] = channel->fm_vol & 0xffff;
  699. break;
  700. default:
  701. return FALSE;
  702. }
  703. return trident_load_channel_registers(state->card, data, channel->num);
  704. }
  705. static int compute_rate_play(u32 rate)
  706. {
  707. int delta;
  708. /* We special case 44100 and 8000 since rounding with the equation
  709.    does not give us an accurate enough value. For 11025 and 22050
  710.    the equation gives us the best answer. All other frequencies will
  711.    also use the equation. JDW */
  712. if (rate == 44100)
  713. delta = 0xeb3;
  714. else if (rate == 8000)
  715. delta = 0x2ab;
  716. else if (rate == 48000)
  717. delta = 0x1000;
  718. else
  719. delta = (((rate << 12) + rate) / 48000) & 0x0000ffff;
  720. return delta;
  721. }
  722. static int compute_rate_rec(u32 rate)
  723. {
  724. int delta;
  725. if (rate == 44100)
  726. delta = 0x116a;
  727. else if (rate == 8000)
  728. delta = 0x6000;
  729. else if (rate == 48000)
  730. delta = 0x1000;
  731. else
  732. delta = ((48000 << 12) / rate) & 0x0000ffff;
  733. return delta;
  734. }
  735. /* set playback sample rate */
  736. static unsigned int trident_set_dac_rate(struct trident_state * state, unsigned int rate)
  737. {
  738. struct dmabuf *dmabuf = &state->dmabuf;
  739. if (rate > 48000)
  740. rate = 48000;
  741. if (rate < 4000)
  742. rate = 4000;
  743. dmabuf->rate = rate;
  744. dmabuf->channel->delta = compute_rate_play(rate);
  745. trident_write_voice_regs(state);
  746. #ifdef DEBUG
  747. printk("trident: called trident_set_dac_rate : rate = %dn", rate);
  748. #endif
  749. return rate;
  750. }
  751. /* set recording sample rate */
  752. static unsigned int trident_set_adc_rate(struct trident_state * state, unsigned int rate)
  753. {
  754. struct dmabuf *dmabuf = &state->dmabuf;
  755. if (rate > 48000)
  756. rate = 48000;
  757. if (rate < 4000)
  758. rate = 4000;
  759. dmabuf->rate = rate;
  760. dmabuf->channel->delta = compute_rate_rec(rate);
  761. trident_write_voice_regs(state);
  762. #ifdef DEBUG
  763. printk("trident: called trident_set_adc_rate : rate = %dn", rate);
  764. #endif
  765. return rate;
  766. }
  767. /* prepare channel attributes for playback */ 
  768. static void trident_play_setup(struct trident_state *state)
  769. {
  770. struct dmabuf *dmabuf = &state->dmabuf;
  771. struct trident_channel *channel = dmabuf->channel;
  772. channel->lba = dmabuf->dma_handle;
  773. channel->delta = compute_rate_play(dmabuf->rate);
  774. channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
  775. channel->eso -= 1;
  776. if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
  777. channel->attribute = 0;
  778. if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  779. if ((channel->num == ALI_SPDIF_IN_CHANNEL) || (channel->num == ALI_PCM_IN_CHANNEL))
  780. ali_disable_special_channel(state->card, channel->num);
  781. else if ((inl(TRID_REG(state->card, ALI_GLOBAL_CONTROL)) & ALI_SPDIF_OUT_CH_ENABLE) 
  782. && (channel->num == ALI_SPDIF_OUT_CHANNEL))
  783. {
  784. ali_set_spdif_out_rate(state->card, state->dmabuf.rate);
  785. state->dmabuf.channel->delta = 0x1000;
  786. }
  787. }
  788. }
  789. channel->fm_vol = 0x0;
  790. channel->control = CHANNEL_LOOP;
  791. if (dmabuf->fmt & TRIDENT_FMT_16BIT) {
  792. /* 16-bits */
  793. channel->control |= CHANNEL_16BITS;
  794. /* signed */
  795. channel->control |= CHANNEL_SIGNED;
  796. }
  797. if (dmabuf->fmt & TRIDENT_FMT_STEREO)
  798. /* stereo */
  799. channel->control |= CHANNEL_STEREO;
  800. #ifdef DEBUG
  801. printk("trident: trident_play_setup, LBA = 0x%08x, "
  802.        "Delta = 0x%08x, ESO = 0x%08x, Control = 0x%08xn",
  803.        channel->lba, channel->delta, channel->eso, channel->control);
  804. #endif
  805. trident_write_voice_regs(state);
  806. }
  807. /* prepare channel attributes for recording */
  808. static void trident_rec_setup(struct trident_state *state)
  809. {
  810. u16 w;
  811. u8  bval;
  812. struct trident_card *card = state->card;
  813. struct dmabuf *dmabuf = &state->dmabuf;
  814. struct trident_channel *channel = dmabuf->channel;
  815. unsigned int rate;
  816. /* Enable AC-97 ADC (capture) */
  817. switch (card->pci_id) 
  818. {
  819. case PCI_DEVICE_ID_ALI_5451:
  820. ali_enable_special_channel(state);
  821. break;
  822. case PCI_DEVICE_ID_SI_7018:
  823. /* for 7018, the ac97 is always in playback/record (duplex) mode */
  824. break;
  825. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  826. w = inb(TRID_REG(card, DX_ACR2_AC97_COM_STAT));
  827. outb(w | 0x48, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
  828. /* enable and set record channel */
  829. outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH));
  830. break;
  831. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  832. w = inw(TRID_REG(card, T4D_MISCINT));
  833. outw(w | 0x1000, TRID_REG(card, T4D_MISCINT));
  834. /* enable and set record channel */
  835. outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH));
  836. break;
  837. case PCI_DEVICE_ID_INTERG_5050:
  838. /* don't know yet, using special channel 22 in GC1(0xd4)? */
  839. break;
  840. default:
  841. return;
  842. }
  843. channel->lba = dmabuf->dma_handle;
  844. channel->delta = compute_rate_rec(dmabuf->rate);
  845. if ((card->pci_id == PCI_DEVICE_ID_ALI_5451) && (channel->num == ALI_SPDIF_IN_CHANNEL)) {
  846. rate = ali_get_spdif_in_rate(card);
  847. if (rate == 0)
  848. {
  849. printk(KERN_WARNING "trident: ALi 5451 S/PDIF input setup error!n");
  850. rate = 48000;
  851. }
  852. bval = inb(TRID_REG(card,ALI_SPDIF_CTRL));
  853. if (bval & 0x10)
  854. {
  855. outb(bval,TRID_REG(card,ALI_SPDIF_CTRL));
  856. printk(KERN_WARNING "trident: cleared ALi 5451 S/PDIF parity error flag.n");
  857. }
  858. if (rate != 48000)
  859. channel->delta = ((rate << 12) / dmabuf->rate) & 0x0000ffff;
  860. }
  861. channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
  862. channel->eso -= 1;
  863. if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
  864. channel->attribute = 0;
  865. }
  866. channel->fm_vol = 0x0;
  867. channel->control = CHANNEL_LOOP;
  868. if (dmabuf->fmt & TRIDENT_FMT_16BIT) {
  869. /* 16-bits */
  870. channel->control |= CHANNEL_16BITS;
  871. /* signed */
  872. channel->control |= CHANNEL_SIGNED;
  873. }
  874. if (dmabuf->fmt & TRIDENT_FMT_STEREO)
  875. /* stereo */
  876. channel->control |= CHANNEL_STEREO;
  877. #ifdef DEBUG
  878. printk("trident: trident_rec_setup, LBA = 0x%08x, "
  879.        "Delat = 0x%08x, ESO = 0x%08x, Control = 0x%08xn",
  880.        channel->lba, channel->delta, channel->eso, channel->control);
  881. #endif
  882. trident_write_voice_regs(state);
  883. }
  884. /* get current playback/recording dma buffer pointer (byte offset from LBA),
  885.    called with spinlock held! */
  886. static inline unsigned trident_get_dma_addr(struct trident_state *state)
  887. {
  888. struct dmabuf *dmabuf = &state->dmabuf;
  889. u32 cso;
  890. if (!dmabuf->enable)
  891. return 0;
  892. outb(dmabuf->channel->num, TRID_REG(state->card, T4D_LFO_GC_CIR));
  893. switch (state->card->pci_id) 
  894. {
  895. case PCI_DEVICE_ID_ALI_5451:
  896. case PCI_DEVICE_ID_SI_7018:
  897. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  898. case PCI_DEVICE_ID_INTERG_5050:
  899. /* 16 bits ESO, CSO for 7018 and DX */
  900. cso = inw(TRID_REG(state->card, CH_DX_CSO_ALPHA_FMS + 2));
  901. break;
  902. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  903. /* 24 bits ESO, CSO for NX */
  904. cso = inl(TRID_REG(state->card, CH_NX_DELTA_CSO)) & 0x00ffffff;
  905. break;
  906. default:
  907. return 0;
  908. }
  909. #ifdef DEBUG
  910. printk("trident: trident_get_dma_addr: chip reported channel: %d, "
  911.        "cso = 0x%04xn",
  912.        dmabuf->channel->num, cso);
  913. #endif
  914. /* ESO and CSO are in units of Samples, convert to byte offset */
  915. cso <<= sample_shift[dmabuf->fmt];
  916. return (cso % dmabuf->dmasize);
  917. }
  918. /* Stop recording (lock held) */
  919. static inline void __stop_adc(struct trident_state *state)
  920. {
  921. struct dmabuf *dmabuf = &state->dmabuf;
  922. unsigned int chan_num = dmabuf->channel->num;
  923. struct trident_card *card = state->card;
  924. dmabuf->enable &= ~ADC_RUNNING;
  925. trident_stop_voice(card, chan_num);
  926. trident_disable_voice_irq(card, chan_num);
  927. }
  928. static void stop_adc(struct trident_state *state)
  929. {
  930. struct trident_card *card = state->card;
  931. unsigned long flags;
  932. spin_lock_irqsave(&card->lock, flags);
  933. __stop_adc(state);
  934. spin_unlock_irqrestore(&card->lock, flags);
  935. }
  936. static void start_adc(struct trident_state *state)
  937. {
  938. struct dmabuf *dmabuf = &state->dmabuf;
  939. unsigned int chan_num = dmabuf->channel->num;
  940. struct trident_card *card = state->card;
  941. unsigned long flags;
  942. spin_lock_irqsave(&card->lock, flags);
  943. if ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize) && dmabuf->ready) {
  944. dmabuf->enable |= ADC_RUNNING;
  945. trident_enable_voice_irq(card, chan_num);
  946. trident_start_voice(card, chan_num);
  947. }
  948. spin_unlock_irqrestore(&card->lock, flags);
  949. }
  950. /* stop playback (lock held) */
  951. static inline void __stop_dac(struct trident_state *state)
  952. {
  953. struct dmabuf *dmabuf = &state->dmabuf;
  954. unsigned int chan_num = dmabuf->channel->num;
  955. struct trident_card *card = state->card;
  956. dmabuf->enable &= ~DAC_RUNNING;
  957. trident_stop_voice(card, chan_num);
  958. if (state->chans_num == 6) {
  959. trident_stop_voice(card, state->other_states[0]->dmabuf.channel->num);
  960. trident_stop_voice(card, state->other_states[1]->dmabuf.channel->num);
  961. trident_stop_voice(card, state->other_states[2]->dmabuf.channel->num);
  962. trident_stop_voice(card, state->other_states[3]->dmabuf.channel->num);
  963. }
  964. trident_disable_voice_irq(card, chan_num);
  965. }
  966. static void stop_dac(struct trident_state *state)
  967. {
  968. struct trident_card *card = state->card;
  969. unsigned long flags;
  970. spin_lock_irqsave(&card->lock, flags);
  971. __stop_dac(state);
  972. spin_unlock_irqrestore(&card->lock, flags);
  973. }
  974. static void start_dac(struct trident_state *state)
  975. {
  976. struct dmabuf *dmabuf = &state->dmabuf;
  977. unsigned int chan_num = dmabuf->channel->num;
  978. struct trident_card *card = state->card;
  979. unsigned long flags;
  980. spin_lock_irqsave(&card->lock, flags);
  981. if ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) {
  982. dmabuf->enable |= DAC_RUNNING;
  983. trident_enable_voice_irq(card, chan_num);
  984. trident_start_voice(card, chan_num);
  985. if (state->chans_num == 6) {
  986. trident_start_voice(card, state->other_states[0]->dmabuf.channel->num);
  987. trident_start_voice(card, state->other_states[1]->dmabuf.channel->num);
  988. trident_start_voice(card, state->other_states[2]->dmabuf.channel->num);
  989. trident_start_voice(card, state->other_states[3]->dmabuf.channel->num);
  990. }
  991. }
  992. spin_unlock_irqrestore(&card->lock, flags);
  993. }
  994. #define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
  995. #define DMABUF_MINORDER 1
  996. /* allocate DMA buffer, playback and recording buffer should be allocated seperately */
  997. static int alloc_dmabuf(struct trident_state *state)
  998. {
  999. struct dmabuf *dmabuf = &state->dmabuf;
  1000. void *rawbuf = NULL;
  1001. int order;
  1002. struct page *page, *pend;
  1003. /* alloc as big a chunk as we can, FIXME: is this necessary ?? */
  1004. for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--)
  1005. if ((rawbuf = pci_alloc_consistent(state->card->pci_dev,
  1006.    PAGE_SIZE << order,
  1007.    &dmabuf->dma_handle)))
  1008. break;
  1009. if (!rawbuf)
  1010. return -ENOMEM;
  1011. #ifdef DEBUG
  1012. printk("trident: allocated %ld (order = %d) bytes at %pn",
  1013.        PAGE_SIZE << order, order, rawbuf);
  1014. #endif
  1015. dmabuf->ready  = dmabuf->mapped = 0;
  1016. dmabuf->rawbuf = rawbuf;
  1017. dmabuf->buforder = order;
  1018. /* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */
  1019. pend = virt_to_page(rawbuf + (PAGE_SIZE << order) - 1);
  1020. for (page = virt_to_page(rawbuf); page <= pend; page++)
  1021. mem_map_reserve(page);
  1022. return 0;
  1023. }
  1024. /* free DMA buffer */
  1025. static void dealloc_dmabuf(struct trident_state *state)
  1026. {
  1027. struct dmabuf *dmabuf = &state->dmabuf;
  1028. struct page *page, *pend;
  1029. if (dmabuf->rawbuf) {
  1030. /* undo marking the pages as reserved */
  1031. pend = virt_to_page(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1);
  1032. for (page = virt_to_page(dmabuf->rawbuf); page <= pend; page++)
  1033. mem_map_unreserve(page);
  1034. pci_free_consistent(state->card->pci_dev, PAGE_SIZE << dmabuf->buforder,
  1035.     dmabuf->rawbuf, dmabuf->dma_handle);
  1036. }
  1037. dmabuf->rawbuf = NULL;
  1038. dmabuf->mapped = dmabuf->ready = 0;
  1039. }
  1040. static int prog_dmabuf(struct trident_state *state, unsigned rec)
  1041. {
  1042. struct dmabuf *dmabuf = &state->dmabuf;
  1043. unsigned bytepersec;
  1044. struct trident_state *s = state;
  1045. unsigned bufsize, dma_nums;
  1046. unsigned long flags;
  1047. int ret, i, order;
  1048. struct page *page, *pend;
  1049. lock_set_fmt(state);
  1050. if (state->chans_num == 6)
  1051. dma_nums = 5;
  1052. else  dma_nums = 1;
  1053. for (i = 0; i < dma_nums; i++) {
  1054. if (i > 0) {
  1055. s = state->other_states[i - 1];
  1056. dmabuf = &s->dmabuf;
  1057. dmabuf->fmt = state->dmabuf.fmt;
  1058. dmabuf->rate = state->dmabuf.rate;
  1059. }
  1060. spin_lock_irqsave(&s->card->lock, flags);
  1061. dmabuf->hwptr = dmabuf->swptr = dmabuf->total_bytes = 0;
  1062. dmabuf->count = dmabuf->error = 0;
  1063. spin_unlock_irqrestore(&s->card->lock, flags);
  1064. /* allocate DMA buffer if not allocated yet */
  1065. if (!dmabuf->rawbuf) {
  1066. if (i == 0) {
  1067. if ((ret = alloc_dmabuf(state))) {
  1068. unlock_set_fmt(state);
  1069. return ret;
  1070. }
  1071. }
  1072. else {
  1073. if ((order = state->dmabuf.buforder - 1) >= DMABUF_MINORDER) {
  1074. dmabuf->rawbuf = pci_alloc_consistent(state->card->pci_dev,
  1075.       PAGE_SIZE << order,
  1076.       &dmabuf->dma_handle);
  1077. }
  1078. if (!dmabuf->rawbuf) {
  1079. free_pages((unsigned long)state->dmabuf.rawbuf, state->dmabuf.buforder);
  1080. state->dmabuf.rawbuf = NULL;
  1081. i-=2;
  1082. for (; i >= 0; i--) {
  1083. pci_free_consistent(state->card->pci_dev,
  1084.     PAGE_SIZE << state->other_states[i]->dmabuf.buforder,
  1085.     state->other_states[i]->dmabuf.rawbuf,
  1086.     state->other_states[i]->dmabuf.dma_handle);
  1087. }
  1088. unlock_set_fmt(state);
  1089. return -ENOMEM;
  1090. }
  1091. dmabuf->ready  = dmabuf->mapped = 0;
  1092. dmabuf->buforder = order;
  1093. pend = virt_to_page(dmabuf->rawbuf + (PAGE_SIZE << order) - 1);
  1094. for (page = virt_to_page(dmabuf->rawbuf); page <= pend; page++)
  1095. mem_map_reserve(page);
  1096. }
  1097. }
  1098. /* FIXME: figure out all this OSS fragment stuff */
  1099. bytepersec = dmabuf->rate << sample_shift[dmabuf->fmt];
  1100. bufsize = PAGE_SIZE << dmabuf->buforder;
  1101. if (dmabuf->ossfragshift) {
  1102. if ((1000 << dmabuf->ossfragshift) < bytepersec)
  1103. dmabuf->fragshift = ld2(bytepersec/1000);
  1104. else
  1105. dmabuf->fragshift = dmabuf->ossfragshift;
  1106. } else {
  1107. /* lets hand out reasonable big ass buffers by default */
  1108. dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT -2);
  1109. }
  1110. dmabuf->numfrag = bufsize >> dmabuf->fragshift;
  1111. while (dmabuf->numfrag < 4 && dmabuf->fragshift > 3) {
  1112. dmabuf->fragshift--;
  1113. dmabuf->numfrag = bufsize >> dmabuf->fragshift;
  1114. }
  1115. dmabuf->fragsize = 1 << dmabuf->fragshift;
  1116. if (dmabuf->ossmaxfrags >= 4 && dmabuf->ossmaxfrags < dmabuf->numfrag)
  1117. dmabuf->numfrag = dmabuf->ossmaxfrags;
  1118. dmabuf->fragsamples = dmabuf->fragsize >> sample_shift[dmabuf->fmt];
  1119. dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift;
  1120. memset(dmabuf->rawbuf, (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80,
  1121.        dmabuf->dmasize);
  1122. spin_lock_irqsave(&s->card->lock, flags);
  1123. if (rec) {
  1124. trident_rec_setup(s);
  1125. } else {
  1126. trident_play_setup(s);
  1127. }
  1128. spin_unlock_irqrestore(&s->card->lock, flags);
  1129. /* set the ready flag for the dma buffer */
  1130. dmabuf->ready = 1;
  1131. #ifdef DEBUG
  1132. printk("trident: prog_dmabuf(%d), sample rate = %d, format = %d, numfrag = %d, "
  1133.        "fragsize = %d dmasize = %dn",
  1134.        dmabuf->channel->num, dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
  1135.        dmabuf->fragsize, dmabuf->dmasize);
  1136. #endif
  1137. }
  1138. unlock_set_fmt(state);
  1139. return 0;
  1140. }
  1141. /* we are doing quantum mechanics here, the buffer can only be empty, half or full filled i.e.
  1142.    |------------|------------|   or   |xxxxxxxxxxxx|------------|   or   |xxxxxxxxxxxx|xxxxxxxxxxxx|
  1143.    but we almost always get this
  1144.    |xxxxxx------|------------|   or   |xxxxxxxxxxxx|xxxxx-------|
  1145.    so we have to clear the tail space to "silence"
  1146.    |xxxxxx000000|------------|   or   |xxxxxxxxxxxx|xxxxxx000000|
  1147. */
  1148. static void trident_clear_tail(struct trident_state *state)
  1149. {
  1150. struct dmabuf *dmabuf = &state->dmabuf;
  1151. unsigned swptr;
  1152. unsigned char silence = (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80;
  1153. unsigned int len;
  1154. unsigned long flags;
  1155. spin_lock_irqsave(&state->card->lock, flags);
  1156. swptr = dmabuf->swptr;
  1157. spin_unlock_irqrestore(&state->card->lock, flags);
  1158. if (swptr == 0 || swptr == dmabuf->dmasize / 2 || swptr == dmabuf->dmasize)
  1159. return;
  1160. if (swptr < dmabuf->dmasize/2)
  1161. len = dmabuf->dmasize/2 - swptr;
  1162. else
  1163. len = dmabuf->dmasize - swptr;
  1164. memset(dmabuf->rawbuf + swptr, silence, len);
  1165. if(state->card->pci_id != PCI_DEVICE_ID_ALI_5451)
  1166. {
  1167. spin_lock_irqsave(&state->card->lock, flags);
  1168. dmabuf->swptr += len;
  1169. dmabuf->count += len;
  1170. spin_unlock_irqrestore(&state->card->lock, flags);
  1171. }
  1172. /* restart the dma machine in case it is halted */
  1173. start_dac(state);
  1174. }
  1175. static int drain_dac(struct trident_state *state, int nonblock)
  1176. {
  1177. DECLARE_WAITQUEUE(wait, current);
  1178. struct dmabuf *dmabuf = &state->dmabuf;
  1179. unsigned long flags;
  1180. unsigned long tmo;
  1181. int count;
  1182. unsigned long diff = 0;
  1183. if (dmabuf->mapped || !dmabuf->ready)
  1184. return 0;
  1185. add_wait_queue(&dmabuf->wait, &wait);
  1186. for (;;) {
  1187. /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
  1188.    every time to make the process really go to sleep */
  1189. set_current_state(TASK_INTERRUPTIBLE);
  1190. spin_lock_irqsave(&state->card->lock, flags);
  1191. count = dmabuf->count;
  1192. spin_unlock_irqrestore(&state->card->lock, flags);
  1193. if (count <= 0)
  1194. break;
  1195. if (signal_pending(current))
  1196. break;
  1197. if (nonblock) {
  1198. remove_wait_queue(&dmabuf->wait, &wait);
  1199. set_current_state(TASK_RUNNING);
  1200. return -EBUSY;
  1201. }
  1202. /* No matter how much data is left in the buffer, we have to wait until
  1203.    CSO == ESO/2 or CSO == ESO when address engine interrupts */
  1204.   if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451 ||
  1205.     state->card->pci_id == PCI_DEVICE_ID_INTERG_5050)
  1206. {
  1207. diff = dmabuf->swptr - trident_get_dma_addr(state) + dmabuf->dmasize ;
  1208. diff = diff % (dmabuf->dmasize);
  1209. tmo  = (diff * HZ) / dmabuf->rate;
  1210. }
  1211. else
  1212. {
  1213. tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
  1214. }
  1215. tmo >>= sample_shift[dmabuf->fmt];
  1216. if (!schedule_timeout(tmo ? tmo : 1) && tmo){
  1217. break;
  1218. }
  1219. }
  1220. remove_wait_queue(&dmabuf->wait, &wait);
  1221. set_current_state(TASK_RUNNING);
  1222. if (signal_pending(current))
  1223. return -ERESTARTSYS;
  1224. return 0;
  1225. }
  1226. /* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
  1227. static void trident_update_ptr(struct trident_state *state)
  1228. {
  1229. struct dmabuf *dmabuf = &state->dmabuf;
  1230. unsigned hwptr, swptr;
  1231. int clear_cnt = 0;
  1232. int diff;
  1233. unsigned char silence;
  1234. unsigned half_dmasize;
  1235. /* update hardware pointer */
  1236. hwptr = trident_get_dma_addr(state);
  1237. diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
  1238. dmabuf->hwptr = hwptr;
  1239. dmabuf->total_bytes += diff;
  1240. /* error handling and process wake up for ADC */
  1241. if (dmabuf->enable == ADC_RUNNING) {
  1242. if (dmabuf->mapped) {
  1243. dmabuf->count -= diff;
  1244. if (dmabuf->count >= (signed)dmabuf->fragsize)
  1245. wake_up(&dmabuf->wait);
  1246. } else {
  1247. dmabuf->count += diff;
  1248. if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
  1249. /* buffer underrun or buffer overrun, we have no way to recover
  1250.    it here, just stop the machine and let the process force hwptr
  1251.    and swptr to sync */
  1252. __stop_adc(state);
  1253. dmabuf->error++;
  1254. }
  1255. if (dmabuf->count < (signed)dmabuf->dmasize/2)
  1256. wake_up(&dmabuf->wait);
  1257. }
  1258. }
  1259. /* error handling and process wake up for DAC */
  1260. if (dmabuf->enable == DAC_RUNNING) {
  1261. if (dmabuf->mapped) {
  1262. dmabuf->count += diff;
  1263. if (dmabuf->count >= (signed)dmabuf->fragsize)
  1264. wake_up(&dmabuf->wait);
  1265. } else {
  1266. dmabuf->count -= diff;
  1267. if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
  1268. /* buffer underrun or buffer overrun, we have no way to recover
  1269.    it here, just stop the machine and let the process force hwptr
  1270.    and swptr to sync */
  1271. __stop_dac(state);
  1272. dmabuf->error++;
  1273. }
  1274. else if (!dmabuf->endcleared) {
  1275. swptr = dmabuf->swptr;
  1276. silence = (dmabuf->fmt & TRIDENT_FMT_16BIT ? 0 : 0x80);
  1277. if (dmabuf->update_flag & ALI_ADDRESS_INT_UPDATE) {
  1278. /* We must clear end data of 1/2 dmabuf if needed.
  1279.    According to 1/2 algorithm of Address Engine Interrupt,
  1280.    check the validation of the data of half dmasize. */
  1281. half_dmasize = dmabuf->dmasize / 2;
  1282. if ((diff = hwptr - half_dmasize) < 0 )
  1283. diff = hwptr;
  1284. if ((dmabuf->count + diff) < half_dmasize) {
  1285. //there is invalid data in the end of half buffer
  1286. if ((clear_cnt = half_dmasize - swptr) < 0)
  1287. clear_cnt += half_dmasize;
  1288. //clear the invalid data
  1289. memset (dmabuf->rawbuf + swptr,
  1290. silence, clear_cnt);
  1291. if (state->chans_num == 6) {
  1292. clear_cnt = clear_cnt / 2;
  1293. swptr = swptr / 2;
  1294. memset (state->other_states[0]->dmabuf.rawbuf + swptr,
  1295. silence, clear_cnt);
  1296. memset (state->other_states[1]->dmabuf.rawbuf + swptr,
  1297. silence, clear_cnt);
  1298. memset (state->other_states[2]->dmabuf.rawbuf + swptr,
  1299. silence, clear_cnt);
  1300. memset (state->other_states[3]->dmabuf.rawbuf + swptr,
  1301. silence, clear_cnt);
  1302. }
  1303. dmabuf->endcleared = 1;
  1304. }
  1305. } else if (dmabuf->count < (signed) dmabuf->fragsize) {
  1306. clear_cnt = dmabuf->fragsize;
  1307. if ((swptr + clear_cnt) > dmabuf->dmasize)
  1308. clear_cnt = dmabuf->dmasize - swptr;
  1309. memset (dmabuf->rawbuf + swptr, silence, clear_cnt);
  1310. if (state->chans_num == 6) {
  1311. clear_cnt = clear_cnt / 2;
  1312. swptr = swptr / 2;
  1313. memset (state->other_states[0]->dmabuf.rawbuf + swptr,
  1314. silence, clear_cnt);
  1315. memset (state->other_states[1]->dmabuf.rawbuf + swptr,
  1316. silence, clear_cnt);
  1317. memset (state->other_states[2]->dmabuf.rawbuf + swptr,
  1318. silence, clear_cnt);
  1319. memset (state->other_states[3]->dmabuf.rawbuf + swptr,
  1320. silence, clear_cnt);
  1321. }
  1322. dmabuf->endcleared = 1;
  1323. }
  1324. }
  1325. /* trident_update_ptr is called by interrupt handler or by process via
  1326.    ioctl/poll, we only wake up the waiting process when we have more
  1327.    than 1/2 buffer free (always true for interrupt handler) */
  1328. if (dmabuf->count < (signed)dmabuf->dmasize/2)
  1329. wake_up(&dmabuf->wait);
  1330. }
  1331. }
  1332. dmabuf->update_flag &= ~ALI_ADDRESS_INT_UPDATE;
  1333. }
  1334. static void trident_address_interrupt(struct trident_card *card)
  1335. {
  1336. int i;
  1337. struct trident_state *state;
  1338. /* Update the pointers for all channels we are running. */
  1339. /* FIXME: should read interrupt status only once */
  1340. for (i = 0; i < NR_HW_CH; i++) {
  1341. if (trident_check_channel_interrupt(card, 63 - i)) {
  1342. trident_ack_channel_interrupt(card, 63 - i);
  1343. if ((state = card->states[i]) != NULL) {
  1344. trident_update_ptr(state);
  1345. } else {
  1346. printk("trident: spurious channel irq %d.n",
  1347.        63 - i);
  1348. trident_stop_voice(card, 63 - i);
  1349. trident_disable_voice_irq(card, 63 - i);
  1350. }
  1351. }
  1352. }
  1353. }
  1354. static void ali_hwvol_control(struct trident_card *card, int opt)
  1355. {
  1356. u16 dwTemp, volume[2], mute, diff, *pVol[2];
  1357. dwTemp = ali_ac97_read(card->ac97_codec[0], 0x02);
  1358. mute = dwTemp & 0x8000;
  1359. volume[0] = dwTemp & 0x001f;
  1360. volume[1] = (dwTemp & 0x1f00) >> 8;
  1361. if (volume[0] < volume [1]) {
  1362. pVol[0] = &volume[0];
  1363. pVol[1] = &volume[1];
  1364. } else {
  1365. pVol[1] = &volume[0];
  1366. pVol[0] = &volume[1];
  1367. }
  1368. diff = *(pVol[1]) - *(pVol[0]);
  1369. if (opt == 1) {                     // MUTE
  1370. dwTemp ^= 0x8000;
  1371. ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
  1372. } else if (opt == 2) {   // Down
  1373. if (mute)
  1374. return;
  1375. if (*(pVol[1]) < 0x001f) {
  1376. (*pVol[1])++;
  1377. *(pVol[0]) = *(pVol[1]) - diff;
  1378. }
  1379. dwTemp &= 0xe0e0;
  1380. dwTemp |= (volume[0]) | (volume[1] << 8);
  1381. ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
  1382. card->ac97_codec[0]->mixer_state[0] = ((32-volume[0])*25/8) | (((32-volume[1])*25/8) << 8);
  1383. } else if (opt == 4) {   // Up
  1384. if (mute)
  1385. return;
  1386. if (*(pVol[0]) >0) {
  1387. (*pVol[0])--;
  1388. *(pVol[1]) = *(pVol[0]) + diff;
  1389. }
  1390. dwTemp &= 0xe0e0;
  1391. dwTemp |= (volume[0]) | (volume[1] << 8);
  1392. ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
  1393. card->ac97_codec[0]->mixer_state[0] = ((32-volume[0])*25/8) | (((32-volume[1])*25/8) << 8);
  1394. else 
  1395. {
  1396. /* Nothing needs doing */
  1397. }
  1398. }
  1399. /*
  1400.  * Re-enable reporting of vol change after 0.1 seconds
  1401.  */
  1402. static void ali_timeout(unsigned long ptr)
  1403. {
  1404. struct trident_card *card = (struct trident_card *)ptr;
  1405. u16 temp = 0;
  1406. /* Enable GPIO IRQ (MISCINT bit 18h)*/
  1407. temp = inw(TRID_REG(card, T4D_MISCINT + 2));
  1408. temp |= 0x0004;
  1409. outw(temp, TRID_REG(card, T4D_MISCINT + 2));
  1410. }
  1411. /*
  1412.  * Set up the timer to clear the vol change notification
  1413.  */
  1414.  
  1415. static void ali_set_timer(struct trident_card *card)
  1416. {
  1417. /* Add Timer Routine to Enable GPIO IRQ */
  1418. del_timer(&card->timer); /* Never queue twice */
  1419. card->timer.function = ali_timeout;
  1420. card->timer.data = (unsigned long) card;
  1421. card->timer.expires = jiffies + HZ/10;
  1422. add_timer(&card->timer);
  1423. }
  1424. /*
  1425.  * Process a GPIO event
  1426.  */
  1427.  
  1428. static void ali_queue_task(struct trident_card *card, int opt)
  1429. {
  1430. u16 temp;
  1431. /* Disable GPIO IRQ (MISCINT bit 18h)*/
  1432. temp = inw(TRID_REG(card, T4D_MISCINT + 2));
  1433. temp &= (u16)(~0x0004);
  1434. outw(temp, TRID_REG(card, T4D_MISCINT + 2));
  1435. /* Adjust the volume */
  1436. ali_hwvol_control(card, opt);
  1437. /* Set the timer for 1/10th sec */
  1438. ali_set_timer(card);
  1439. }
  1440. static void cyber_address_interrupt(struct trident_card *card)
  1441. {
  1442. int i,irq_status;
  1443. struct trident_state *state;
  1444. /* Update the pointers for all channels we are running. */
  1445. /* FIXED: read interrupt status only once */
  1446. irq_status=inl(TRID_REG(card, T4D_AINT_A) );
  1447. #ifdef DEBUG
  1448. printk("cyber_address_interrupt: irq_status 0x%Xn",irq_status);
  1449. #endif
  1450. for (i = 0; i < NR_HW_CH; i++) {
  1451. if (irq_status & ( 1 << (31 - i)) ) {
  1452. /* clear bit by writing a 1, zeroes are ignored */ 
  1453. outl( (1 <<(31-i)), TRID_REG(card, T4D_AINT_A));
  1454. #ifdef DEBUG
  1455. printk("cyber_interrupt: channel %dn", 31-i);
  1456. #endif
  1457. if ((state = card->states[i]) != NULL) {
  1458. trident_update_ptr(state);
  1459. } else {
  1460. printk("cyber5050: spurious channel irq %d.n",
  1461.        31 - i);
  1462. trident_stop_voice(card, 31 - i);
  1463. trident_disable_voice_irq(card, 31 - i);
  1464. }
  1465. }
  1466. }
  1467. }
  1468. static void trident_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1469. {
  1470. struct trident_card *card = (struct trident_card *)dev_id;
  1471. u32 event;
  1472. u32 gpio;
  1473. spin_lock(&card->lock);
  1474. event = inl(TRID_REG(card, T4D_MISCINT));
  1475. #ifdef DEBUG
  1476. printk("trident: trident_interrupt called, MISCINT = 0x%08xn", event);
  1477. #endif
  1478. if (event & ADDRESS_IRQ) {
  1479. card->address_interrupt(card);
  1480. }
  1481. if(card->pci_id == PCI_DEVICE_ID_ALI_5451)
  1482. {
  1483. /* GPIO IRQ (H/W Volume Control) */
  1484. event = inl(TRID_REG(card, T4D_MISCINT));
  1485. if (event & (1<<25)) {
  1486. gpio = inl(TRID_REG(card, ALI_GPIO));
  1487. if (!timer_pending(&card->timer)) 
  1488. ali_queue_task(card, gpio&0x07);
  1489. }
  1490. event = inl(TRID_REG(card, T4D_MISCINT));
  1491. outl(event | (ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(card, T4D_MISCINT));
  1492. spin_unlock(&card->lock);
  1493. return;
  1494. }
  1495. /* manually clear interrupt status, bad hardware design, blame T^2 */
  1496. outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
  1497.      TRID_REG(card, T4D_MISCINT));
  1498. spin_unlock(&card->lock);
  1499. }
  1500. /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
  1501.    the user's buffer.  it is filled by the dma machine and drained by this loop. */
  1502. static ssize_t trident_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
  1503. {
  1504. struct trident_state *state = (struct trident_state *)file->private_data;
  1505. struct dmabuf *dmabuf = &state->dmabuf;
  1506. ssize_t ret = 0;
  1507. unsigned long flags;
  1508. unsigned swptr;
  1509. int cnt;
  1510. #ifdef DEBUG
  1511. printk("trident: trident_read called, count = %dn", count);
  1512. #endif
  1513. VALIDATE_STATE(state);
  1514. if (ppos != &file->f_pos)
  1515. return -ESPIPE;
  1516. if (dmabuf->mapped)
  1517. return -ENXIO;
  1518. if (!access_ok(VERIFY_WRITE, buffer, count))
  1519. return -EFAULT;
  1520. down(&state->sem);
  1521. if (!dmabuf->ready && (ret = prog_dmabuf(state, 1)))
  1522. goto out;
  1523. while (count > 0) {
  1524. spin_lock_irqsave(&state->card->lock, flags);
  1525. if (dmabuf->count > (signed) dmabuf->dmasize) {
  1526. /* buffer overrun, we are recovering from sleep_on_timeout,
  1527.    resync hwptr and swptr, make process flush the buffer */
  1528. dmabuf->count = dmabuf->dmasize;
  1529. dmabuf->swptr = dmabuf->hwptr;
  1530. }
  1531. swptr = dmabuf->swptr;
  1532. cnt = dmabuf->dmasize - swptr;
  1533. if (dmabuf->count < cnt)
  1534. cnt = dmabuf->count;
  1535. spin_unlock_irqrestore(&state->card->lock, flags);
  1536. if (cnt > count)
  1537. cnt = count;
  1538. if (cnt <= 0) {
  1539. unsigned long tmo;
  1540. /* buffer is empty, start the dma machine and wait for data to be
  1541.    recorded */
  1542. start_adc(state);
  1543. if (file->f_flags & O_NONBLOCK) {
  1544. if (!ret) ret = -EAGAIN;
  1545. goto out;
  1546. }
  1547. up(&state->sem);
  1548. /* No matter how much space left in the buffer, we have to wait until
  1549.    CSO == ESO/2 or CSO == ESO when address engine interrupts */
  1550. tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
  1551. tmo >>= sample_shift[dmabuf->fmt];
  1552. /* There are two situations when sleep_on_timeout returns, one is when
  1553.    the interrupt is serviced correctly and the process is waked up by
  1554.    ISR ON TIME. Another is when timeout is expired, which means that
  1555.    either interrupt is NOT serviced correctly (pending interrupt) or it
  1556.    is TOO LATE for the process to be scheduled to run (scheduler latency)
  1557.    which results in a (potential) buffer overrun. And worse, there is
  1558.    NOTHING we can do to prevent it. */
  1559. if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
  1560. #ifdef DEBUG
  1561. printk(KERN_ERR "trident: recording schedule timeout, "
  1562.        "dmasz %u fragsz %u count %i hwptr %u swptr %un",
  1563.        dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
  1564.        dmabuf->hwptr, dmabuf->swptr);
  1565. #endif
  1566. /* a buffer overrun, we delay the recovery until next time the
  1567.    while loop begin and we REALLY have space to record */
  1568. }
  1569. if (signal_pending(current)) {
  1570. if(!ret) ret = -ERESTARTSYS;
  1571. goto out;
  1572. }
  1573. down(&state->sem);
  1574. if(dmabuf->mapped)
  1575. {
  1576. if(!ret)
  1577. ret = -ENXIO;
  1578. goto out;
  1579. }
  1580. continue;
  1581. }
  1582. if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) {
  1583. if (!ret) ret = -EFAULT;
  1584. goto out;
  1585. }
  1586. swptr = (swptr + cnt) % dmabuf->dmasize;
  1587. spin_lock_irqsave(&state->card->lock, flags);
  1588. dmabuf->swptr = swptr;
  1589. dmabuf->count -= cnt;
  1590. spin_unlock_irqrestore(&state->card->lock, flags);
  1591. count -= cnt;
  1592. buffer += cnt;
  1593. ret += cnt;
  1594. start_adc(state);
  1595. }
  1596. out:
  1597. up(&state->sem);
  1598. return ret;
  1599. }
  1600. /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
  1601.    the soundcard.  it is drained by the dma machine and filled by this loop. */
  1602. static ssize_t trident_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
  1603. {
  1604. struct trident_state *state = (struct trident_state *)file->private_data;
  1605. struct dmabuf *dmabuf = &state->dmabuf;
  1606. ssize_t ret;
  1607. unsigned long flags;
  1608. unsigned swptr;
  1609. int cnt;
  1610. unsigned int state_cnt;
  1611. unsigned int copy_count;
  1612. #ifdef DEBUG
  1613. printk("trident: trident_write called, count = %dn", count);
  1614. #endif
  1615. VALIDATE_STATE(state);
  1616. if (ppos != &file->f_pos)
  1617. return -ESPIPE;
  1618. /*
  1619.  * Guard against an mmap or ioctl while writing
  1620.  */
  1621.  
  1622. down(&state->sem);
  1623. if (dmabuf->mapped)
  1624. {
  1625. ret = -ENXIO;
  1626. goto out;
  1627. }
  1628. if (!dmabuf->ready && (ret = prog_dmabuf(state, 0)))
  1629. goto out;
  1630. if (!access_ok(VERIFY_READ, buffer, count))
  1631. {
  1632. ret= -EFAULT;
  1633. goto out;
  1634. }
  1635. ret = 0;
  1636. while (count > 0) {
  1637. spin_lock_irqsave(&state->card->lock, flags);
  1638. if (dmabuf->count < 0) {
  1639. /* buffer underrun, we are recovering from sleep_on_timeout,
  1640.    resync hwptr and swptr */
  1641. dmabuf->count = 0;
  1642. dmabuf->swptr = dmabuf->hwptr;
  1643. }
  1644. swptr = dmabuf->swptr;
  1645. cnt = dmabuf->dmasize - swptr;
  1646. if (dmabuf->count + cnt > dmabuf->dmasize)
  1647. cnt = dmabuf->dmasize - dmabuf->count;
  1648. spin_unlock_irqrestore(&state->card->lock, flags);
  1649. if (cnt > count)
  1650. cnt = count;
  1651. if (cnt <= 0) {
  1652. unsigned long tmo;
  1653. /* buffer is full, start the dma machine and wait for data to be
  1654.    played */
  1655. start_dac(state);
  1656. if (file->f_flags & O_NONBLOCK) {
  1657. if (!ret) ret = -EAGAIN;
  1658. goto out;
  1659. }
  1660. /* No matter how much data left in the buffer, we have to wait until
  1661.    CSO == ESO/2 or CSO == ESO when address engine interrupts */
  1662. lock_set_fmt(state);
  1663. tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
  1664. tmo >>= sample_shift[dmabuf->fmt];
  1665. unlock_set_fmt(state);
  1666. up(&state->sem);
  1667. /* There are two situations when sleep_on_timeout returns, one is when
  1668.    the interrupt is serviced correctly and the process is waked up by
  1669.    ISR ON TIME. Another is when timeout is expired, which means that
  1670.    either interrupt is NOT serviced correctly (pending interrupt) or it
  1671.    is TOO LATE for the process to be scheduled to run (scheduler latency)
  1672.    which results in a (potential) buffer underrun. And worse, there is
  1673.    NOTHING we can do to prevent it. */
  1674. if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
  1675. #ifdef DEBUG
  1676. printk(KERN_ERR "trident: playback schedule timeout, "
  1677.        "dmasz %u fragsz %u count %i hwptr %u swptr %un",
  1678.        dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
  1679.        dmabuf->hwptr, dmabuf->swptr);
  1680. #endif
  1681. /* a buffer underrun, we delay the recovery until next time the
  1682.    while loop begin and we REALLY have data to play */
  1683. }
  1684. if (signal_pending(current)) {
  1685. if (!ret) ret = -ERESTARTSYS;
  1686. goto out;
  1687. }
  1688. down(&state->sem);
  1689. if(dmabuf->mapped)
  1690. {
  1691. if(!ret)
  1692. ret = -ENXIO;
  1693. goto out;
  1694. }
  1695. continue;
  1696. }
  1697. lock_set_fmt(state);
  1698. if (state->chans_num == 6) {
  1699. copy_count = 0;
  1700. state_cnt = 0;
  1701. if (ali_write_5_1(state, buffer, cnt, &copy_count, &state_cnt) == -EFAULT) {
  1702. if (state_cnt){
  1703. swptr = (swptr + state_cnt) % dmabuf->dmasize;
  1704. spin_lock_irqsave(&state->card->lock, flags);
  1705. dmabuf->swptr = swptr;
  1706. dmabuf->count += state_cnt;
  1707. dmabuf->endcleared = 0;
  1708. spin_unlock_irqrestore(&state->card->lock, flags);
  1709. }
  1710. ret += copy_count;
  1711. if (!ret) ret = -EFAULT;
  1712. unlock_set_fmt(state);
  1713. goto out;
  1714. }
  1715. }
  1716. else {
  1717. if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
  1718. if (!ret) ret = -EFAULT;
  1719. unlock_set_fmt(state);
  1720. goto out;
  1721. }
  1722. state_cnt = cnt;
  1723. }
  1724. unlock_set_fmt(state);
  1725. swptr = (swptr + state_cnt) % dmabuf->dmasize;
  1726. spin_lock_irqsave(&state->card->lock, flags);
  1727. dmabuf->swptr = swptr;
  1728. dmabuf->count += state_cnt;
  1729. dmabuf->endcleared = 0;
  1730. spin_unlock_irqrestore(&state->card->lock, flags);
  1731. count -= cnt;
  1732. buffer += cnt;
  1733. ret += cnt;
  1734. start_dac(state);
  1735. }
  1736. out:
  1737. up(&state->sem);
  1738. return ret;
  1739. }
  1740. /* No kernel lock - we have our own spinlock */
  1741. static unsigned int trident_poll(struct file *file, struct poll_table_struct *wait)
  1742. {
  1743. struct trident_state *state = (struct trident_state *)file->private_data;
  1744. struct dmabuf *dmabuf = &state->dmabuf;
  1745. unsigned long flags;
  1746. unsigned int mask = 0;
  1747. VALIDATE_STATE(state);
  1748. /*
  1749.  * Guard against a parallel poll and write causing multiple
  1750.  * prog_dmabuf events
  1751.  */
  1752.  
  1753. down(&state->sem);
  1754. if (file->f_mode & FMODE_WRITE) {
  1755. if (!dmabuf->ready && prog_dmabuf(state, 0))
  1756. {
  1757. up(&state->sem);
  1758. return 0;
  1759. }
  1760. poll_wait(file, &dmabuf->wait, wait);
  1761. }
  1762. if (file->f_mode & FMODE_READ) {
  1763. if (!dmabuf->ready && prog_dmabuf(state, 1))
  1764. {
  1765. up(&state->sem);
  1766. return 0;
  1767. }
  1768. poll_wait(file, &dmabuf->wait, wait);
  1769. }
  1770. up(&state->sem);
  1771. spin_lock_irqsave(&state->card->lock, flags);
  1772. trident_update_ptr(state);
  1773. if (file->f_mode & FMODE_READ) {
  1774. if (dmabuf->count >= (signed)dmabuf->fragsize)
  1775. mask |= POLLIN | POLLRDNORM;
  1776. }
  1777. if (file->f_mode & FMODE_WRITE) {
  1778. if (dmabuf->mapped) {
  1779. if (dmabuf->count >= (signed)dmabuf->fragsize)
  1780. mask |= POLLOUT | POLLWRNORM;
  1781. } else {
  1782. if ((signed)dmabuf->dmasize >= dmabuf->count + (signed)dmabuf->fragsize)
  1783. mask |= POLLOUT | POLLWRNORM;
  1784. }
  1785. }
  1786. spin_unlock_irqrestore(&state->card->lock, flags);
  1787. return mask;
  1788. }
  1789. static int trident_mmap(struct file *file, struct vm_area_struct *vma)
  1790. {
  1791. struct trident_state *state = (struct trident_state *)file->private_data;
  1792. struct dmabuf *dmabuf = &state->dmabuf;
  1793. int ret = -EINVAL;
  1794. unsigned long size;
  1795. VALIDATE_STATE(state);
  1796. lock_kernel();
  1797. /*
  1798.  * Lock against poll read write or mmap creating buffers. Also lock
  1799.  * a read or write against an mmap.
  1800.  */
  1801.  
  1802. down(&state->sem);
  1803. if (vma->vm_flags & VM_WRITE) {
  1804. if ((ret = prog_dmabuf(state, 0)) != 0)
  1805. goto out;
  1806. } else if (vma->vm_flags & VM_READ) {
  1807. if ((ret = prog_dmabuf(state, 1)) != 0)
  1808. goto out;
  1809. } else
  1810. goto out;
  1811. ret = -EINVAL;
  1812. if (vma->vm_pgoff != 0)
  1813. goto out;
  1814. size = vma->vm_end - vma->vm_start;
  1815. if (size > (PAGE_SIZE << dmabuf->buforder))
  1816. goto out;
  1817. ret = -EAGAIN;
  1818. if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
  1819.      size, vma->vm_page_prot))
  1820. goto out;
  1821. dmabuf->mapped = 1;
  1822. ret = 0;
  1823. out:
  1824. up(&state->sem);
  1825. unlock_kernel();
  1826. return ret;
  1827. }
  1828. static int trident_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  1829. {
  1830. struct trident_state *state = (struct trident_state *)file->private_data;
  1831. struct dmabuf *dmabuf = &state->dmabuf;
  1832. unsigned long flags;
  1833. audio_buf_info abinfo;
  1834. count_info cinfo;
  1835. int val, mapped, ret = 0;
  1836. struct trident_card *card = state->card;
  1837. VALIDATE_STATE(state);
  1838. mapped = ((file->f_mode & FMODE_WRITE) && dmabuf->mapped) ||
  1839. ((file->f_mode & FMODE_READ) && dmabuf->mapped);
  1840. #ifdef DEBUG
  1841. printk("trident: trident_ioctl, command = %2d, arg = 0x%08xn",
  1842.        _IOC_NR(cmd), arg ? *(int *)arg : 0);
  1843. #endif
  1844. switch (cmd) 
  1845. {
  1846. case OSS_GETVERSION:
  1847. ret = put_user(SOUND_VERSION, (int *)arg);
  1848. break;
  1849. case SNDCTL_DSP_RESET:
  1850. /* FIXME: spin_lock ? */
  1851. if (file->f_mode & FMODE_WRITE) {
  1852. stop_dac(state);
  1853. synchronize_irq();
  1854. dmabuf->ready = 0;
  1855. dmabuf->swptr = dmabuf->hwptr = 0;
  1856. dmabuf->count = dmabuf->total_bytes = 0;
  1857. }
  1858. if (file->f_mode & FMODE_READ) {
  1859. stop_adc(state);
  1860. synchronize_irq();
  1861. dmabuf->ready = 0;
  1862. dmabuf->swptr = dmabuf->hwptr = 0;
  1863. dmabuf->count = dmabuf->total_bytes = 0;
  1864. }
  1865. break;
  1866. case SNDCTL_DSP_SYNC:
  1867. if (file->f_mode & FMODE_WRITE)
  1868. ret = drain_dac(state, file->f_flags & O_NONBLOCK);
  1869. break;
  1870. case SNDCTL_DSP_SPEED: /* set smaple rate */
  1871. if (get_user(val, (int *)arg))
  1872. {
  1873. ret = -EFAULT;
  1874. break;
  1875. }
  1876. if (val >= 0) {
  1877. if (file->f_mode & FMODE_WRITE) {
  1878. stop_dac(state);
  1879. dmabuf->ready = 0;
  1880. spin_lock_irqsave(&state->card->lock, flags);
  1881. trident_set_dac_rate(state, val);
  1882. spin_unlock_irqrestore(&state->card->lock, flags);
  1883. }
  1884. if (file->f_mode & FMODE_READ) {
  1885. stop_adc(state);
  1886. dmabuf->ready = 0;
  1887. spin_lock_irqsave(&state->card->lock, flags);
  1888. trident_set_adc_rate(state, val);
  1889. spin_unlock_irqrestore(&state->card->lock, flags);
  1890. }
  1891. }
  1892. ret = put_user(dmabuf->rate, (int *)arg);
  1893. break;
  1894. case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
  1895. if (get_user(val, (int *)arg))
  1896. {
  1897. ret = -EFAULT;
  1898. break;
  1899. }
  1900. lock_set_fmt(state);
  1901. if (file->f_mode & FMODE_WRITE) {
  1902. stop_dac(state);
  1903. dmabuf->ready = 0;
  1904. if (val)
  1905. dmabuf->fmt |= TRIDENT_FMT_STEREO;
  1906. else
  1907. dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
  1908. }
  1909. if (file->f_mode & FMODE_READ) {
  1910. stop_adc(state);
  1911. dmabuf->ready = 0;
  1912. if (val)
  1913. dmabuf->fmt |= TRIDENT_FMT_STEREO;
  1914. else
  1915. dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
  1916. }
  1917. unlock_set_fmt(state);
  1918. break;
  1919. case SNDCTL_DSP_GETBLKSIZE:
  1920. if (file->f_mode & FMODE_WRITE) {
  1921. if ((val = prog_dmabuf(state, 0)))
  1922. ret = val;
  1923. else
  1924. ret = put_user(dmabuf->fragsize, (int *)arg);
  1925. break;
  1926. }
  1927. if (file->f_mode & FMODE_READ) {
  1928. if ((val = prog_dmabuf(state, 1)))
  1929. ret = val;
  1930. else
  1931. ret = put_user(dmabuf->fragsize, (int *)arg);
  1932. break;
  1933. }
  1934. case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
  1935. ret = put_user(AFMT_S16_LE|AFMT_U16_LE|AFMT_S8|AFMT_U8, (int *)arg);
  1936. break;
  1937. case SNDCTL_DSP_SETFMT: /* Select sample format */
  1938. if (get_user(val, (int *)arg))
  1939. {
  1940. ret = -EFAULT;
  1941. break;
  1942. }
  1943. lock_set_fmt(state);
  1944. if (val != AFMT_QUERY) {
  1945. if (file->f_mode & FMODE_WRITE) {
  1946. stop_dac(state);
  1947. dmabuf->ready = 0;
  1948. if (val == AFMT_S16_LE)
  1949. dmabuf->fmt |= TRIDENT_FMT_16BIT;
  1950. else
  1951. dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
  1952. }
  1953. if (file->f_mode & FMODE_READ) {
  1954. stop_adc(state);
  1955. dmabuf->ready = 0;
  1956. if (val == AFMT_S16_LE)
  1957. dmabuf->fmt |= TRIDENT_FMT_16BIT;
  1958. else
  1959. dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
  1960. }
  1961. }
  1962. unlock_set_fmt(state);
  1963. ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ?
  1964. AFMT_S16_LE : AFMT_U8, (int *)arg);
  1965. break;
  1966. case SNDCTL_DSP_CHANNELS:
  1967. if (get_user(val, (int *)arg))
  1968. {
  1969. ret = -EFAULT;
  1970. break;
  1971. }
  1972. if (val != 0) {
  1973. lock_set_fmt(state);
  1974. if (file->f_mode & FMODE_WRITE) {
  1975. stop_dac(state);
  1976. dmabuf->ready = 0;
  1977. //prevent from memory leak
  1978. if ((state->chans_num > 2) && (state->chans_num != val)) {
  1979. ali_free_other_states_resources(state);
  1980. state->chans_num = 1;
  1981. }
  1982. if (val >= 2)
  1983. {
  1984. dmabuf->fmt |= TRIDENT_FMT_STEREO;
  1985. if ((val == 6) && (state->card->pci_id == PCI_DEVICE_ID_ALI_5451)) {
  1986. if( card->rec_channel_use_count > 0 )
  1987. {
  1988. printk(KERN_ERR "trident: Record is working on the card!n");
  1989. ret = -EBUSY;
  1990. break;
  1991. }
  1992. ret = ali_setup_multi_channels(state->card, 6);
  1993. if (ret < 0) {
  1994. unlock_set_fmt(state);
  1995. break;
  1996. }
  1997. down(&state->card->open_sem);
  1998. ret = ali_allocate_other_states_resources(state, 6);
  1999. if (ret < 0) {
  2000. up(&state->card->open_sem);
  2001. unlock_set_fmt(state);
  2002. break;
  2003. }
  2004. state->card->multi_channel_use_count ++;
  2005. up(&state->card->open_sem);
  2006. }
  2007. else val = 2; /*yield to 2-channels*/
  2008. }
  2009. else
  2010. dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
  2011. state->chans_num = val;
  2012. }
  2013. if (file->f_mode & FMODE_READ) {
  2014. stop_adc(state);
  2015. dmabuf->ready = 0;
  2016. if (val >= 2) {
  2017. if (!((file->f_mode & FMODE_WRITE) && (val == 6)))
  2018. val = 2;
  2019. dmabuf->fmt |= TRIDENT_FMT_STEREO;
  2020. }
  2021. else
  2022. dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
  2023. state->chans_num = val;
  2024. }
  2025. unlock_set_fmt(state);
  2026. }
  2027. ret = put_user(val, (int *)arg);
  2028. break;
  2029. case SNDCTL_DSP_POST:
  2030. /* Cause the working fragment to be output */
  2031. break;
  2032. case SNDCTL_DSP_SUBDIVIDE:
  2033. if (dmabuf->subdivision)
  2034. {
  2035. ret = -EINVAL;
  2036. break;
  2037. }
  2038. if (get_user(val, (int *)arg))
  2039. {
  2040. ret = -EFAULT;
  2041. break;
  2042. }
  2043. if (val != 1 && val != 2 && val != 4)
  2044. {
  2045. ret = -EINVAL;
  2046. break;
  2047. }
  2048. dmabuf->subdivision = val;
  2049. break;
  2050. case SNDCTL_DSP_SETFRAGMENT:
  2051. if (get_user(val, (int *)arg))
  2052. {
  2053. ret = -EFAULT;
  2054. break;
  2055. }
  2056. dmabuf->ossfragshift = val & 0xffff;
  2057. dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
  2058. if (dmabuf->ossfragshift < 4)
  2059. dmabuf->ossfragshift = 4;
  2060. if (dmabuf->ossfragshift > 15)
  2061. dmabuf->ossfragshift = 15;
  2062. if (dmabuf->ossmaxfrags < 4)
  2063. dmabuf->ossmaxfrags = 4;
  2064. break;
  2065. case SNDCTL_DSP_GETOSPACE:
  2066. if (!(file->f_mode & FMODE_WRITE))
  2067. {
  2068. ret = -EINVAL;
  2069. break;
  2070. }
  2071. if (!dmabuf->ready && (val = prog_dmabuf(state, 0)) != 0)
  2072. ret = val;
  2073. break;
  2074. }
  2075. spin_lock_irqsave(&state->card->lock, flags);
  2076. trident_update_ptr(state);
  2077. abinfo.fragsize = dmabuf->fragsize;
  2078. abinfo.bytes = dmabuf->dmasize - dmabuf->count;
  2079. abinfo.fragstotal = dmabuf->numfrag;
  2080. abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
  2081. spin_unlock_irqrestore(&state->card->lock, flags);
  2082. ret = copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  2083. break;
  2084. case SNDCTL_DSP_GETISPACE:
  2085. if (!(file->f_mode & FMODE_READ))
  2086. {
  2087. ret = -EINVAL;
  2088. break;
  2089. }
  2090. if (!dmabuf->ready && (val = prog_dmabuf(state, 1)) != 0)
  2091. {
  2092. ret = val;
  2093. break;
  2094. }
  2095. spin_lock_irqsave(&state->card->lock, flags);
  2096. trident_update_ptr(state);
  2097. abinfo.fragsize = dmabuf->fragsize;
  2098. abinfo.bytes = dmabuf->count;
  2099. abinfo.fragstotal = dmabuf->numfrag;
  2100. abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
  2101. spin_unlock_irqrestore(&state->card->lock, flags);
  2102. ret = copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
  2103. break;
  2104. case SNDCTL_DSP_NONBLOCK:
  2105. file->f_flags |= O_NONBLOCK;
  2106. break;
  2107. case SNDCTL_DSP_GETCAPS:
  2108. ret = put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP|DSP_CAP_BIND,
  2109.     (int *)arg);
  2110. break;
  2111. case SNDCTL_DSP_GETTRIGGER:
  2112. val = 0;
  2113. if ((file->f_mode & FMODE_READ) && dmabuf->enable)
  2114. val |= PCM_ENABLE_INPUT;
  2115. if ((file->f_mode & FMODE_WRITE) && dmabuf->enable)
  2116. val |= PCM_ENABLE_OUTPUT;
  2117. ret = put_user(val, (int *)arg);
  2118. break;
  2119. case SNDCTL_DSP_SETTRIGGER:
  2120. if (get_user(val, (int *)arg))
  2121. {
  2122. ret = -EFAULT;
  2123. break;
  2124. }
  2125. if (file->f_mode & FMODE_READ) {
  2126. if (val & PCM_ENABLE_INPUT) {
  2127. if (!dmabuf->ready && (ret = prog_dmabuf(state, 1)))
  2128. break;
  2129. start_adc(state);
  2130. } else
  2131. stop_adc(state);
  2132. }
  2133. if (file->f_mode & FMODE_WRITE) {
  2134. if (val & PCM_ENABLE_OUTPUT) {
  2135. if (!dmabuf->ready && (ret = prog_dmabuf(state, 0)))
  2136. break;
  2137. start_dac(state);
  2138. } else
  2139. stop_dac(state);
  2140. }
  2141. break;
  2142. case SNDCTL_DSP_GETIPTR:
  2143. if (!(file->f_mode & FMODE_READ))
  2144. {
  2145. ret = -EINVAL;
  2146. break;
  2147. }
  2148. if (!dmabuf->ready && (val = prog_dmabuf(state, 1)) != 0)
  2149. {
  2150. ret = val;
  2151. break;
  2152. }
  2153. spin_lock_irqsave(&state->card->lock, flags);
  2154. trident_update_ptr(state);
  2155. cinfo.bytes = dmabuf->total_bytes;
  2156. cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
  2157. cinfo.ptr = dmabuf->hwptr;
  2158. if (dmabuf->mapped)
  2159. dmabuf->count &= dmabuf->fragsize-1;
  2160. spin_unlock_irqrestore(&state->card->lock, flags);
  2161. ret = copy_to_user((void *)arg, &cinfo, sizeof(cinfo));
  2162. break;
  2163. case SNDCTL_DSP_GETOPTR:
  2164. if (!(file->f_mode & FMODE_WRITE))
  2165. {
  2166. ret = -EINVAL;
  2167. break;
  2168. }
  2169. if (!dmabuf->ready && (val = prog_dmabuf(state, 0)) != 0)
  2170. {
  2171. ret = val;
  2172. break;
  2173. }
  2174. spin_lock_irqsave(&state->card->lock, flags);
  2175. trident_update_ptr(state);
  2176. cinfo.bytes = dmabuf->total_bytes;
  2177. cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
  2178. cinfo.ptr = dmabuf->hwptr;
  2179. if (dmabuf->mapped)
  2180. dmabuf->count &= dmabuf->fragsize-1;
  2181. spin_unlock_irqrestore(&state->card->lock, flags);
  2182. ret = copy_to_user((void *)arg, &cinfo, sizeof(cinfo))?-EFAULT:0;
  2183. break;
  2184. case SNDCTL_DSP_SETDUPLEX:
  2185. ret = -EINVAL;
  2186. break;
  2187. case SNDCTL_DSP_GETODELAY:
  2188. if (!(file->f_mode & FMODE_WRITE))
  2189. {
  2190. ret = -EINVAL;
  2191. break;
  2192. }
  2193. if (!dmabuf->ready && (val = prog_dmabuf(state, 0)) != 0)
  2194. {
  2195. ret = val;
  2196. break;
  2197. }
  2198. spin_lock_irqsave(&state->card->lock, flags);
  2199. trident_update_ptr(state);
  2200. val = dmabuf->count;
  2201. spin_unlock_irqrestore(&state->card->lock, flags);
  2202. ret = put_user(val, (int *)arg);
  2203. break;
  2204. case SOUND_PCM_READ_RATE:
  2205. ret = put_user(dmabuf->rate, (int *)arg);
  2206. break;
  2207. case SOUND_PCM_READ_CHANNELS:
  2208. ret = put_user((dmabuf->fmt & TRIDENT_FMT_STEREO) ? 2 : 1,
  2209. (int *)arg);
  2210. break;
  2211. case SOUND_PCM_READ_BITS:
  2212. ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ?
  2213. AFMT_S16_LE : AFMT_U8, (int *)arg);
  2214. break;
  2215. case SNDCTL_DSP_GETCHANNELMASK:
  2216. ret = put_user(DSP_BIND_FRONT|DSP_BIND_SURR|DSP_BIND_CENTER_LFE,
  2217. (int *)arg);
  2218. break;
  2219. case SNDCTL_DSP_BIND_CHANNEL:
  2220. if (state->card->pci_id != PCI_DEVICE_ID_SI_7018)
  2221. {
  2222. ret = -EINVAL;
  2223. break;
  2224. }
  2225. if (get_user(val, (int *)arg))
  2226. {
  2227. ret = -EFAULT;
  2228. break;
  2229. }
  2230. if (val == DSP_BIND_QUERY) {
  2231. val = dmabuf->channel->attribute | 0x3c00;
  2232. val = attr2mask[val >> 8];
  2233. } else {
  2234. dmabuf->ready = 0;
  2235. if (file->f_mode & FMODE_READ)
  2236. dmabuf->channel->attribute = (CHANNEL_REC|SRC_ENABLE);
  2237. if (file->f_mode & FMODE_WRITE)
  2238. dmabuf->channel->attribute = (CHANNEL_SPC_PB|SRC_ENABLE);
  2239. dmabuf->channel->attribute |= mask2attr[ffs(val)];
  2240. }
  2241. ret = put_user(val, (int *)arg);
  2242. break;
  2243. case SNDCTL_DSP_MAPINBUF:
  2244. case SNDCTL_DSP_MAPOUTBUF:
  2245. case SNDCTL_DSP_SETSYNCRO:
  2246. case SOUND_PCM_WRITE_FILTER:
  2247. case SOUND_PCM_READ_FILTER:
  2248. default:
  2249. ret = -EINVAL;
  2250. break;
  2251. }
  2252. return ret;
  2253. }
  2254. static int trident_open(struct inode *inode, struct file *file)
  2255. {
  2256. int i = 0;
  2257. int minor = MINOR(inode->i_rdev);
  2258. struct trident_card *card = devs;
  2259. struct trident_state *state = NULL;
  2260. struct dmabuf *dmabuf = NULL;
  2261. /* Added by Matt Wu 01-05-2001 */
  2262. if(file->f_mode & FMODE_READ)
  2263. {
  2264. if(card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  2265. if (card->multi_channel_use_count > 0)
  2266. return -EBUSY;
  2267. }
  2268. }
  2269. /* find an available virtual channel (instance of /dev/dsp) */
  2270. while (card != NULL) {
  2271. down(&card->open_sem);
  2272. if(file->f_mode & FMODE_READ)
  2273. {
  2274. /* Skip opens on cards that are in 6 channel mode */
  2275. if (card->multi_channel_use_count > 0)
  2276. {
  2277. up(&card->open_sem);
  2278. card = card->next;
  2279. continue;
  2280. }
  2281. }
  2282. for (i = 0; i < NR_HW_CH; i++) {
  2283. if (card->states[i] == NULL) {
  2284. state = card->states[i] = (struct trident_state *)
  2285. kmalloc(sizeof(struct trident_state), GFP_KERNEL);
  2286. if (state == NULL) {
  2287. return -ENOMEM;
  2288. }
  2289. memset(state, 0, sizeof(struct trident_state));
  2290. init_MUTEX(&state->sem);
  2291. dmabuf = &state->dmabuf;
  2292. goto found_virt;
  2293. }
  2294. }
  2295. up(&card->open_sem);
  2296. card = card->next;
  2297. }
  2298. /* no more virtual channel avaiable */
  2299. if (!state) {
  2300. return -ENODEV;
  2301. }
  2302.  found_virt:
  2303. /* found a free virtual channel, allocate hardware channels */
  2304. if(file->f_mode & FMODE_READ)
  2305. dmabuf->channel = card->alloc_rec_pcm_channel(card);
  2306. else
  2307. dmabuf->channel = card->alloc_pcm_channel(card);
  2308. if (dmabuf->channel == NULL) {
  2309. kfree (card->states[i]);
  2310. card->states[i] = NULL;
  2311. return -ENODEV;
  2312. }
  2313. /* initialize the virtual channel */
  2314. state->virt = i;
  2315. state->card = card;
  2316. state->magic = TRIDENT_STATE_MAGIC;
  2317. init_waitqueue_head(&dmabuf->wait);
  2318. file->private_data = state;
  2319. /* set default sample format. According to OSS Programmer's Guide  /dev/dsp
  2320.    should be default to unsigned 8-bits, mono, with sample rate 8kHz and
  2321.    /dev/dspW will accept 16-bits sample */
  2322. if (file->f_mode & FMODE_WRITE) {
  2323. dmabuf->fmt &= ~TRIDENT_FMT_MASK;
  2324. if ((minor & 0x0f) == SND_DEV_DSP16)
  2325. dmabuf->fmt |= TRIDENT_FMT_16BIT;
  2326. dmabuf->ossfragshift = 0;
  2327. dmabuf->ossmaxfrags  = 0;
  2328. dmabuf->subdivision  = 0;
  2329. if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
  2330. /* set default channel attribute to normal playback */
  2331. dmabuf->channel->attribute = CHANNEL_PB;
  2332. }
  2333. trident_set_dac_rate(state, 8000);
  2334. }
  2335. if (file->f_mode & FMODE_READ) {
  2336. /* FIXME: Trident 4d can only record in signed 16-bits stereo, 48kHz sample,
  2337.    to be dealed with in trident_set_adc_rate() ?? */
  2338. dmabuf->fmt &= ~TRIDENT_FMT_MASK;
  2339. if ((minor & 0x0f) == SND_DEV_DSP16)
  2340. dmabuf->fmt |= TRIDENT_FMT_16BIT;
  2341. dmabuf->ossfragshift = 0;
  2342. dmabuf->ossmaxfrags  = 0;
  2343. dmabuf->subdivision  = 0;
  2344. if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
  2345. /* set default channel attribute to 0x8a80, record from
  2346.    PCM L/R FIFO and mono = (left + right + 1)/2*/
  2347. dmabuf->channel->attribute =
  2348. (CHANNEL_REC|PCM_LR|MONO_MIX);
  2349. }
  2350. trident_set_adc_rate(state, 8000);
  2351. /* Added by Matt Wu 01-05-2001 */
  2352. if(card->pci_id == PCI_DEVICE_ID_ALI_5451)
  2353. card->rec_channel_use_count ++;
  2354. }
  2355. state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
  2356. up(&card->open_sem);
  2357. #ifdef DEBUG
  2358.        printk(KERN_ERR "trident: open virtual channel %d, hard channel %dn", 
  2359.               state->virt, dmabuf->channel->num);
  2360. #endif
  2361. return 0;
  2362. }
  2363. static int trident_release(struct inode *inode, struct file *file)
  2364. {
  2365. struct trident_state *state = (struct trident_state *)file->private_data;
  2366. struct trident_card *card;
  2367. struct dmabuf *dmabuf;
  2368. unsigned long flags;
  2369. lock_kernel();
  2370. card = state->card;
  2371. dmabuf = &state->dmabuf;
  2372. VALIDATE_STATE(state);
  2373. if (file->f_mode & FMODE_WRITE) {
  2374. trident_clear_tail(state);
  2375. drain_dac(state, file->f_flags & O_NONBLOCK);
  2376. }
  2377. #ifdef DEBUG
  2378. printk(KERN_ERR "trident: closing virtual channel %d, hard channel %dn", 
  2379. state->virt, dmabuf->channel->num);
  2380. #endif
  2381. /* stop DMA state machine and free DMA buffers/channels */
  2382. down(&card->open_sem);
  2383. if (file->f_mode & FMODE_WRITE) {
  2384. stop_dac(state);
  2385. lock_set_fmt(state);
  2386. unlock_set_fmt(state);
  2387. dealloc_dmabuf(state);
  2388. state->card->free_pcm_channel(state->card, dmabuf->channel->num);
  2389. /* Added by Matt Wu */
  2390. if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  2391. if (state->chans_num > 2) {
  2392. if (card->multi_channel_use_count-- < 0)
  2393. card->multi_channel_use_count = 0;
  2394. if (card->multi_channel_use_count == 0)
  2395. ali_close_multi_channels();
  2396. ali_free_other_states_resources(state);
  2397. }
  2398. }
  2399. }
  2400. if (file->f_mode & FMODE_READ) {
  2401. stop_adc(state);
  2402. dealloc_dmabuf(state);
  2403. state->card->free_pcm_channel(state->card, dmabuf->channel->num);
  2404. /* Added by Matt Wu */
  2405. if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  2406. if( card->rec_channel_use_count-- < 0 )
  2407. card->rec_channel_use_count = 0;
  2408. }
  2409. }
  2410. card->states[state->virt] = NULL;
  2411. kfree(state);
  2412. /* we're covered by the open_sem */
  2413. up(&card->open_sem);
  2414. unlock_kernel();
  2415. return 0;
  2416. }
  2417. static /*const*/ struct file_operations trident_audio_fops = {
  2418. owner: THIS_MODULE,
  2419. llseek: no_llseek,
  2420. read: trident_read,
  2421. write: trident_write,
  2422. poll: trident_poll,
  2423. ioctl: trident_ioctl,
  2424. mmap: trident_mmap,
  2425. open: trident_open,
  2426. release: trident_release,
  2427. };
  2428. /* trident specific AC97 functions */
  2429. /* Write AC97 codec registers */
  2430. static void trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val)
  2431. {
  2432. struct trident_card *card = (struct trident_card *)codec->private_data;
  2433. unsigned int address, mask, busy;
  2434. unsigned short count  = 0xffff;
  2435. unsigned long flags;
  2436. u32 data;
  2437. data = ((u32) val) << 16;
  2438. switch (card->pci_id)
  2439. {
  2440. default:
  2441. case PCI_DEVICE_ID_SI_7018:
  2442. address = SI_AC97_WRITE;
  2443. mask = SI_AC97_BUSY_WRITE | SI_AC97_AUDIO_BUSY;
  2444. if (codec->id)
  2445. mask |= SI_AC97_SECONDARY;
  2446. busy = SI_AC97_BUSY_WRITE;
  2447. break;
  2448. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  2449. address = DX_ACR0_AC97_W;
  2450. mask = busy = DX_AC97_BUSY_WRITE;
  2451. break;
  2452. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  2453. address = NX_ACR1_AC97_W;
  2454. mask = NX_AC97_BUSY_WRITE;
  2455. if (codec->id)
  2456. mask |= NX_AC97_WRITE_SECONDARY;
  2457. busy = NX_AC97_BUSY_WRITE;
  2458. break;
  2459. case PCI_DEVICE_ID_INTERG_5050:
  2460. address = SI_AC97_WRITE;
  2461. mask = busy = SI_AC97_BUSY_WRITE;
  2462. if (codec->id)
  2463. mask |= SI_AC97_SECONDARY;
  2464. break;
  2465. }
  2466. spin_lock_irqsave(&card->lock, flags);
  2467. do {
  2468. if ((inw(TRID_REG(card, address)) & busy) == 0)
  2469. break;
  2470. } while (count--);
  2471. data |= (mask | (reg & AC97_REG_ADDR));
  2472. if (count == 0) {
  2473. printk(KERN_ERR "trident: AC97 CODEC write timed out.n");
  2474. spin_unlock_irqrestore(&card->lock, flags);
  2475. return;
  2476. }
  2477. outl(data, TRID_REG(card, address));
  2478. spin_unlock_irqrestore(&card->lock, flags);
  2479. }
  2480. /* Read AC97 codec registers */
  2481. static u16 trident_ac97_get(struct ac97_codec *codec, u8 reg)
  2482. {
  2483. struct trident_card *card = (struct trident_card *)codec->private_data;
  2484. unsigned int address, mask, busy;
  2485. unsigned short count = 0xffff;
  2486. unsigned long flags;
  2487. u32 data;
  2488. switch (card->pci_id)
  2489. {
  2490. default:
  2491. case PCI_DEVICE_ID_SI_7018:
  2492. address = SI_AC97_READ;
  2493. mask = SI_AC97_BUSY_READ | SI_AC97_AUDIO_BUSY;
  2494. if (codec->id)
  2495. mask |= SI_AC97_SECONDARY;
  2496. busy = SI_AC97_BUSY_READ;
  2497. break;
  2498. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  2499. address = DX_ACR1_AC97_R;
  2500. mask = busy = DX_AC97_BUSY_READ;
  2501. break;
  2502. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  2503. if (codec->id)
  2504. address = NX_ACR3_AC97_R_SECONDARY;
  2505. else
  2506. address = NX_ACR2_AC97_R_PRIMARY;
  2507. mask = NX_AC97_BUSY_READ;
  2508. busy = NX_AC97_BUSY_READ | NX_AC97_BUSY_DATA;
  2509. break;
  2510. case PCI_DEVICE_ID_INTERG_5050:
  2511. address = SI_AC97_READ;
  2512. mask = busy = SI_AC97_BUSY_READ;
  2513. if (codec->id)
  2514. mask |= SI_AC97_SECONDARY;
  2515. break;
  2516. }
  2517. data = (mask | (reg & AC97_REG_ADDR));
  2518. spin_lock_irqsave(&card->lock, flags);
  2519. outl(data, TRID_REG(card, address));
  2520. do {
  2521. data = inl(TRID_REG(card, address));
  2522. if ((data & busy) == 0)
  2523. break;
  2524. } while (count--);
  2525. spin_unlock_irqrestore(&card->lock, flags);
  2526. if (count == 0) {
  2527. printk(KERN_ERR "trident: AC97 CODEC read timed out.n");
  2528. data = 0;
  2529. }
  2530. return ((u16) (data >> 16));
  2531. }
  2532. /* Write AC97 codec registers for ALi*/
  2533. static void ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val)
  2534. {
  2535. unsigned int address, mask;
  2536. unsigned int wCount1 = 0xffff;
  2537. unsigned int wCount2= 0xffff;
  2538. unsigned long chk1, chk2;
  2539. unsigned long flags;
  2540. u32 data;
  2541. data = ((u32) val) << 16;
  2542. if(!card)
  2543. BUG();
  2544. address = ALI_AC97_WRITE;
  2545. mask = ALI_AC97_WRITE_ACTION | ALI_AC97_AUDIO_BUSY;
  2546. if (secondary)
  2547. mask |= ALI_AC97_SECONDARY;
  2548. if (card->revision == ALI_5451_V02)
  2549. mask |= ALI_AC97_WRITE_MIXER_REGISTER;
  2550. spin_lock_irqsave(&card->lock, flags);
  2551. while (wCount1--) {
  2552. if ((inw(TRID_REG(card, address)) & ALI_AC97_BUSY_WRITE) == 0) {
  2553. data |= (mask | (reg & AC97_REG_ADDR));
  2554. chk1 = inl(TRID_REG(card,  ALI_STIMER));
  2555. chk2 = inl(TRID_REG(card,  ALI_STIMER));
  2556. while (wCount2-- && (chk1 == chk2))
  2557. chk2 = inl(TRID_REG(card,  ALI_STIMER));
  2558. if (wCount2 == 0) {
  2559. spin_unlock_irqrestore(&card->lock, flags);
  2560. return;
  2561. }
  2562. outl(data, TRID_REG(card, address)); //write!
  2563. spin_unlock_irqrestore(&card->lock, flags);
  2564. return; //success
  2565. }
  2566. inw(TRID_REG(card, address)); //wait for a read cycle
  2567. }
  2568. printk(KERN_ERR "ali: AC97 CODEC write timed out.n");
  2569. spin_unlock_irqrestore(&card->lock, flags);
  2570. return;
  2571. }
  2572. /* Read AC97 codec registers for ALi*/
  2573. static u16 ali_ac97_get(struct trident_card *card, int secondary, u8 reg)
  2574. {
  2575. unsigned int address, mask;
  2576.         unsigned int wCount1 = 0xffff;
  2577.         unsigned int wCount2= 0xffff;
  2578.         unsigned long chk1, chk2;
  2579. unsigned long flags;
  2580. u32 data;
  2581. if(!card)
  2582. BUG();
  2583. address = ALI_AC97_READ;
  2584. if (card->revision == ALI_5451_V02) {
  2585. address = ALI_AC97_WRITE;
  2586. }
  2587. mask = ALI_AC97_READ_ACTION | ALI_AC97_AUDIO_BUSY;
  2588. if (secondary)
  2589. mask |= ALI_AC97_SECONDARY;
  2590. spin_lock_irqsave(&card->lock, flags);
  2591. data = (mask | (reg & AC97_REG_ADDR));
  2592. while (wCount1--) {
  2593. if ((inw(TRID_REG(card, address)) & ALI_AC97_BUSY_READ) == 0) {
  2594. chk1 = inl(TRID_REG(card,  ALI_STIMER));
  2595. chk2 = inl(TRID_REG(card,  ALI_STIMER));
  2596. while (wCount2-- && (chk1 == chk2))
  2597. chk2 = inl(TRID_REG(card,  ALI_STIMER));
  2598. if (wCount2 == 0) {
  2599. printk(KERN_ERR "ali: AC97 CODEC read timed out.n");
  2600. spin_unlock_irqrestore(&card->lock, flags);
  2601. return 0;
  2602. }
  2603. outl(data, TRID_REG(card, address)); //read!
  2604. wCount2 = 0xffff;
  2605. while (wCount2--) {
  2606. if ((inw(TRID_REG(card, address)) & ALI_AC97_BUSY_READ) == 0) {
  2607. data = inl(TRID_REG(card, address));
  2608. spin_unlock_irqrestore(&card->lock, flags);
  2609. return ((u16) (data >> 16));
  2610. }
  2611. }
  2612. }
  2613. inw(TRID_REG(card, address)); //wait a read cycle
  2614. }
  2615. spin_unlock_irqrestore(&card->lock, flags);
  2616. printk(KERN_ERR "ali: AC97 CODEC read timed out.n");
  2617. return 0;
  2618. }
  2619. static void ali_enable_special_channel(struct trident_state *stat)
  2620. {
  2621. struct trident_card *card = stat->card;
  2622. unsigned long s_channels;
  2623. s_channels = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2624. s_channels |= (1<<stat->dmabuf.channel->num);
  2625. outl(s_channels, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2626. }
  2627. static u16 ali_ac97_read(struct ac97_codec *codec, u8 reg)
  2628. {
  2629. int id;
  2630. u16 data;
  2631. struct trident_card *card = NULL;
  2632. /* Added by Matt Wu */
  2633. if (!codec)
  2634. BUG();
  2635. card = (struct trident_card *)codec->private_data;
  2636. if(!card->mixer_regs_ready)
  2637. return ali_ac97_get(card, codec->id, reg);
  2638. if(codec->id)
  2639. id = 1;
  2640. else
  2641. id = 0;
  2642. data = card->mixer_regs[reg/2][id];
  2643. return data;
  2644. }
  2645. static void ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val)
  2646. {
  2647. int id;
  2648. struct trident_card *card;
  2649. /*  Added by Matt Wu */
  2650. if (!codec)
  2651. BUG();
  2652. card = (struct trident_card *)codec->private_data;
  2653. if (!card->mixer_regs_ready)
  2654. {
  2655. ali_ac97_set(card, codec->id, reg, val);
  2656. return;
  2657. }
  2658. if(codec->id)
  2659. id = 1;
  2660. else
  2661. id = 0;
  2662. card->mixer_regs[reg/2][id] = val;
  2663. ali_ac97_set(card, codec->id, reg, val);
  2664. }
  2665. /*
  2666. flag: ALI_SPDIF_OUT_TO_SPDIF_OUT
  2667. ALI_PCM_TO_SPDIF_OUT
  2668. */
  2669. static void ali_setup_spdif_out(struct trident_card *card, int flag)
  2670. {
  2671. unsigned long spdif;
  2672. unsigned char ch;
  2673.         char temp;
  2674.         struct pci_dev *pci_dev = NULL;
  2675.         pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, pci_dev);
  2676.         if (pci_dev == NULL)
  2677.                 return;
  2678.         pci_read_config_byte(pci_dev, 0x61, &temp);
  2679.         temp |= 0x40;
  2680.         pci_write_config_byte(pci_dev, 0x61, temp);
  2681.         pci_read_config_byte(pci_dev, 0x7d, &temp);
  2682.         temp |= 0x01;
  2683.         pci_write_config_byte(pci_dev, 0x7d, temp);
  2684.         pci_read_config_byte(pci_dev, 0x7e, &temp);
  2685.         temp &= (~0x20);
  2686.         temp |= 0x10;
  2687.         pci_write_config_byte(pci_dev, 0x7e, temp);
  2688. ch = inb(TRID_REG(card, ALI_SCTRL));
  2689. outb(ch | ALI_SPDIF_OUT_ENABLE, TRID_REG(card, ALI_SCTRL));
  2690. ch = inb(TRID_REG(card, ALI_SPDIF_CTRL));
  2691. outb(ch & ALI_SPDIF_OUT_CH_STATUS, TRID_REG(card, ALI_SPDIF_CTRL));
  2692.    
  2693. if (flag & ALI_SPDIF_OUT_TO_SPDIF_OUT) {
  2694.    spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2695.     spdif |= ALI_SPDIF_OUT_CH_ENABLE;
  2696.     spdif &= ALI_SPDIF_OUT_SEL_SPDIF;
  2697.     outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2698. spdif = inw(TRID_REG(card, ALI_SPDIF_CS));
  2699. if (flag & ALI_SPDIF_OUT_NON_PCM)
  2700.     spdif |= 0x0002;
  2701. else spdif &= (~0x0002);
  2702.     outw(spdif, TRID_REG(card, ALI_SPDIF_CS));
  2703.     }
  2704.     else {
  2705.     spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2706.     spdif |= ALI_SPDIF_OUT_SEL_PCM;
  2707.     outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2708.     }
  2709. }
  2710. static void ali_disable_special_channel(struct trident_card *card, int ch)
  2711. {
  2712. unsigned long sc;
  2713. sc = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2714. sc &= ~(1 << ch);
  2715. outl(sc, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2716. }
  2717. static void ali_disable_spdif_in(struct trident_card *card)
  2718. {
  2719. unsigned long spdif;
  2720. spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2721. spdif &= (~ALI_SPDIF_IN_SUPPORT);
  2722. outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2723. ali_disable_special_channel(card, ALI_SPDIF_IN_CHANNEL);
  2724. }
  2725. static void ali_setup_spdif_in(struct trident_card *card)
  2726. {
  2727. unsigned long spdif;
  2728. //Set SPDIF IN Supported
  2729. spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2730. spdif |= ALI_SPDIF_IN_SUPPORT;
  2731. outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2732. //Set SPDIF IN Rec
  2733. spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
  2734. spdif |= ALI_SPDIF_IN_CH_ENABLE;
  2735. outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
  2736. spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
  2737. spdif |= ALI_SPDIF_IN_CH_STATUS;
  2738. outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
  2739. /*
  2740. spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
  2741. spdif |= ALI_SPDIF_IN_FUNC_ENABLE;
  2742. outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
  2743. */
  2744. }
  2745. static void ali_delay(struct trident_card *card,int interval)
  2746. {
  2747. unsigned long  begintimer,currenttimer;
  2748. begintimer   = inl(TRID_REG(card,  ALI_STIMER));
  2749. currenttimer = inl(TRID_REG(card,  ALI_STIMER));
  2750. while (currenttimer < begintimer + interval)
  2751. currenttimer = inl(TRID_REG(card,  ALI_STIMER));
  2752. }
  2753. static void ali_detect_spdif_rate(struct trident_card *card)
  2754. {
  2755. u16 wval  = 0;
  2756. u16 count = 0;
  2757. u8  bval = 0, R1 = 0, R2 = 0;
  2758. bval  = inb(TRID_REG(card,ALI_SPDIF_CTRL));
  2759. bval |= 0x02;
  2760. outb(bval,TRID_REG(card,ALI_SPDIF_CTRL));
  2761. bval  = inb(TRID_REG(card,ALI_SPDIF_CTRL + 1));
  2762. bval |= 0x1F;
  2763. outb(bval,TRID_REG(card,ALI_SPDIF_CTRL + 1));
  2764. while (((R1 < 0x0B )||(R1 > 0x0E)) && (R1 != 0x12) && count <= 50000)
  2765. {
  2766. count ++;
  2767. ali_delay(card, 6);
  2768. bval = inb(TRID_REG(card,ALI_SPDIF_CTRL + 1));
  2769. R1 = bval & 0x1F;
  2770. }
  2771. if (count > 50000)
  2772. {
  2773. printk(KERN_WARNING "trident: Error in ali_detect_spdif_rate!n");
  2774. return;
  2775. }
  2776. count = 0;
  2777. while (count <= 50000)
  2778. {
  2779. count ++;
  2780. ali_delay(card, 6);
  2781. bval = inb(TRID_REG(card,ALI_SPDIF_CTRL + 1));
  2782. R2 = bval & 0x1F;
  2783. if(R2 != R1)
  2784. R1 = R2;
  2785. else
  2786. break;
  2787. }
  2788. if (count > 50000)
  2789. {
  2790. printk(KERN_WARNING "trident: Error in ali_detect_spdif_rate!n");
  2791. return;
  2792. }
  2793. switch (R2)
  2794. {
  2795. case 0x0b:
  2796. case 0x0c:
  2797. case 0x0d:
  2798. case 0x0e:
  2799. wval  = inw(TRID_REG(card,ALI_SPDIF_CTRL + 2));
  2800. wval &= 0xE0F0;
  2801. wval |= (u16)0x09 << 8 | (u16)0x05;
  2802. outw(wval,TRID_REG(card,ALI_SPDIF_CTRL + 2));
  2803. bval  = inb(TRID_REG(card,ALI_SPDIF_CS +3)) & 0xF0;
  2804. outb(bval|0x02,TRID_REG(card,ALI_SPDIF_CS + 3));
  2805. break;
  2806. case 0x12:
  2807. wval  = inw(TRID_REG(card,ALI_SPDIF_CTRL + 2));
  2808. wval &= 0xE0F0;
  2809. wval |= (u16)0x0E << 8 | (u16)0x08;
  2810. outw(wval,TRID_REG(card,ALI_SPDIF_CTRL + 2));
  2811. bval  = inb(TRID_REG(card,ALI_SPDIF_CS +3)) & 0xF0;
  2812. outb(bval|0x03,TRID_REG(card,ALI_SPDIF_CS + 3));
  2813. break;
  2814. default:
  2815. break;
  2816. }
  2817. }
  2818. static unsigned int ali_get_spdif_in_rate(struct trident_card *card)
  2819. {
  2820. u32 dwRate = 0;
  2821. u8 bval = 0;
  2822. ali_detect_spdif_rate(card);
  2823. bval  = inb(TRID_REG(card,ALI_SPDIF_CTRL));
  2824. bval &= 0x7F;
  2825. bval |= 0x40;
  2826. outb(bval,TRID_REG(card,ALI_SPDIF_CTRL));
  2827. bval  = inb(TRID_REG(card,ALI_SPDIF_CS + 3));
  2828. bval &= 0x0F;
  2829. switch (bval)
  2830. {
  2831. case 0:
  2832. dwRate = 44100;
  2833. break;
  2834. case 1:
  2835. dwRate = 48000;
  2836. break;
  2837. case 2:
  2838. dwRate = 32000;
  2839. break;
  2840. default:
  2841. // Error occurs
  2842. break;
  2843. }
  2844. return dwRate;
  2845. }
  2846. static int ali_close_multi_channels(void)
  2847. {
  2848. char temp = 0;
  2849. struct pci_dev *pci_dev = NULL;
  2850.         pci_dev = pci_find_device(PCI_VENDOR_ID_AL,PCI_DEVICE_ID_AL_M1533, pci_dev);
  2851.         if (pci_dev == NULL)
  2852.                 return -1;
  2853. temp = 0x80;
  2854. pci_write_config_byte(pci_dev, 0x59, ~temp);
  2855. pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, pci_dev);
  2856. if (pci_dev == NULL)
  2857.                 return -1;
  2858. temp = 0x20;
  2859. pci_write_config_byte(pci_dev, 0xB8, ~temp);
  2860. return 0;
  2861. }
  2862. static int ali_setup_multi_channels(struct trident_card *card, int chan_nums)
  2863. {
  2864. unsigned long dwValue;
  2865. char temp = 0;
  2866. struct pci_dev *pci_dev = NULL;
  2867. pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, pci_dev);
  2868. if (pci_dev == NULL)
  2869.                 return -1;
  2870. temp = 0x80;
  2871. pci_write_config_byte(pci_dev, 0x59, temp);
  2872. pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, pci_dev);
  2873.   if (pci_dev == NULL)
  2874.                 return -1;
  2875. temp = 0x20;
  2876. pci_write_config_byte(pci_dev, (int)0xB8,(u8) temp);
  2877. if (chan_nums == 6) {
  2878. dwValue = inl(TRID_REG(card, ALI_SCTRL)) | 0x000f0000;
  2879. outl(dwValue, TRID_REG(card, ALI_SCTRL));
  2880. mdelay(4);
  2881. dwValue = inl(TRID_REG(card, ALI_SCTRL));
  2882. if (dwValue & 0x2000000) {
  2883. ali_ac97_write(card->ac97_codec[0], 0x02, 8080);
  2884. ali_ac97_write(card->ac97_codec[0], 0x36, 0);
  2885. ali_ac97_write(card->ac97_codec[0], 0x38, 0);
  2886. ali_ac97_write(card->ac97_codec[1], 0x36, 0);
  2887. ali_ac97_write(card->ac97_codec[1], 0x38, 0);
  2888. ali_ac97_write(card->ac97_codec[1], 0x02, 0x0606);
  2889. ali_ac97_write(card->ac97_codec[1], 0x18, 0x0303);
  2890. ali_ac97_write(card->ac97_codec[1], 0x74, 0x3);
  2891. return 1;
  2892. }
  2893. }
  2894. return -EINVAL;
  2895. }
  2896. static void ali_free_pcm_channel(struct trident_card *card, unsigned int channel)
  2897. {
  2898. int bank;
  2899. if (channel > 31)
  2900. return;
  2901. bank = channel >> 5;
  2902. channel = channel & 0x1f;
  2903. card->banks[bank].bitmap &= ~(1 << (channel));
  2904. }
  2905. static int ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
  2906. {
  2907. struct trident_card *card = state->card;
  2908. struct trident_state *s;
  2909. int i, state_count = 0;
  2910. struct trident_pcm_bank *bank;
  2911. struct trident_channel *channel;
  2912. bank = &card->banks[BANK_A];
  2913. if (chan_nums == 6) {
  2914. for(i = 0;(i < ALI_CHANNELS) && (state_count != 4); i++) {
  2915. if (!card->states[i]) {
  2916. if (!(bank->bitmap & (1 << ali_multi_channels_5_1[state_count]))) {
  2917. bank->bitmap |= (1 << ali_multi_channels_5_1[state_count]);
  2918. channel = &bank->channels[ali_multi_channels_5_1[state_count]];
  2919. channel->num = ali_multi_channels_5_1[state_count];
  2920. }
  2921. else {
  2922. state_count--;
  2923. for (; state_count >= 0; state_count--) {
  2924. kfree(state->other_states[state_count]);
  2925. ali_free_pcm_channel(card, ali_multi_channels_5_1[state_count]);
  2926. }
  2927. return -EBUSY;
  2928. }
  2929. s = card->states[i] = (struct trident_state *)
  2930. kmalloc(sizeof(struct trident_state), GFP_KERNEL);
  2931. if (!s) {
  2932. ali_free_pcm_channel(card, ali_multi_channels_5_1[state_count]);
  2933. state_count--;
  2934. for (; state_count >= 0; state_count--) {
  2935. ali_free_pcm_channel(card, ali_multi_channels_5_1[state_count]);
  2936. kfree(state->other_states[state_count]);
  2937. }
  2938. return -ENOMEM;
  2939. }
  2940. memset(s, 0, sizeof(struct trident_state));
  2941. s->dmabuf.channel = channel;
  2942. s->dmabuf.ossfragshift = s->dmabuf.ossmaxfrags = s->dmabuf.subdivision = 0;
  2943. init_waitqueue_head(&s->dmabuf.wait);
  2944. s->magic = card->magic;
  2945. s->card = card;
  2946. s->virt = i;
  2947. ali_enable_special_channel(s);
  2948. state->other_states[state_count++] = s;
  2949. }
  2950. }
  2951. if (state_count != 4) {
  2952. state_count--;
  2953. for (; state_count >= 0; state_count--) {
  2954. kfree(state->other_states[state_count]);
  2955. ali_free_pcm_channel(card, ali_multi_channels_5_1[state_count]);
  2956. }
  2957. return -EBUSY;
  2958. }
  2959. }
  2960. return 0;
  2961. }
  2962. static void ali_save_regs(struct trident_card *card)
  2963. {
  2964. unsigned long flags;
  2965. int i, j;
  2966. save_flags(flags); 
  2967. cli();
  2968. ali_registers.global_regs[0x2c] = inl(TRID_REG(card,T4D_MISCINT));
  2969. //ali_registers.global_regs[0x20] = inl(TRID_REG(card,T4D_START_A));
  2970. ali_registers.global_regs[0x21] = inl(TRID_REG(card,T4D_STOP_A));
  2971. //disable all IRQ bits
  2972. outl(ALI_DISABLE_ALL_IRQ, TRID_REG(card, T4D_MISCINT));
  2973. for (i = 1; i < ALI_MIXER_REGS; i++)
  2974. ali_registers.mixer_regs[i] = ali_ac97_read (card->ac97_codec[0], i*2);
  2975. for (i = 0; i < ALI_GLOBAL_REGS; i++)
  2976. {
  2977. if ((i*4 == T4D_MISCINT) || (i*4 == T4D_STOP_A))
  2978. continue;
  2979. ali_registers.global_regs[i] = inl(TRID_REG(card, i*4));
  2980. }
  2981. for (i = 0; i < ALI_CHANNELS; i++) 
  2982. {
  2983. outb(i,TRID_REG(card, T4D_LFO_GC_CIR));
  2984. for (j = 0; j < ALI_CHANNEL_REGS; j++) 
  2985. ali_registers.channel_regs[i][j] = inl(TRID_REG(card, j*4 + 0xe0));
  2986. }
  2987. //Stop all HW channel
  2988. outl(ALI_STOP_ALL_CHANNELS, TRID_REG(card, T4D_STOP_A));
  2989. restore_flags(flags);
  2990. }
  2991. static void ali_restore_regs(struct trident_card *card)
  2992. {
  2993. unsigned long flags;
  2994. int i, j;
  2995. save_flags(flags); 
  2996. cli();
  2997. for (i = 1; i < ALI_MIXER_REGS; i++)
  2998. ali_ac97_write(card->ac97_codec[0], i*2, ali_registers.mixer_regs[i]);
  2999. for (i = 0; i < ALI_CHANNELS; i++) 
  3000. {
  3001. outb(i,TRID_REG(card, T4D_LFO_GC_CIR));
  3002. for (j = 0; j < ALI_CHANNEL_REGS; j++) 
  3003. outl(ali_registers.channel_regs[i][j], TRID_REG(card, j*4 + 0xe0));
  3004. }
  3005. for (i = 0; i < ALI_GLOBAL_REGS; i++)
  3006. {
  3007. if ((i*4 == T4D_MISCINT) || (i*4 == T4D_STOP_A) || (i*4 == T4D_START_A))
  3008. continue;
  3009. outl(ali_registers.global_regs[i], TRID_REG(card, i*4));
  3010. }
  3011. //start HW channel
  3012. outl(ali_registers.global_regs[0x20], TRID_REG(card,T4D_START_A));
  3013. //restore IRQ enable bits
  3014. outl(ali_registers.global_regs[0x2c], TRID_REG(card,T4D_MISCINT));
  3015. restore_flags(flags);
  3016. }
  3017. static int trident_suspend(struct pci_dev *dev, u32 unused)
  3018. {
  3019. struct trident_card *card = (struct trident_card *) dev;
  3020. if(card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3021. ali_save_regs(card);
  3022. }
  3023. return 0;
  3024. }
  3025. static int trident_resume(struct pci_dev *dev)
  3026. {
  3027. struct trident_card *card = (struct trident_card *) dev;
  3028. if(card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3029. ali_restore_regs(card);
  3030. }
  3031. return 0;
  3032. }
  3033. static struct trident_channel *ali_alloc_pcm_channel(struct trident_card *card)
  3034. {
  3035. struct trident_pcm_bank *bank;
  3036. int idx;
  3037. bank = &card->banks[BANK_A];
  3038. if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) & (ALI_SPDIF_OUT_CH_ENABLE)) {
  3039. idx = ALI_SPDIF_OUT_CHANNEL;
  3040. if (!(bank->bitmap & (1 << idx))) {
  3041. struct trident_channel *channel = &bank->channels[idx];
  3042. bank->bitmap |= 1 << idx;
  3043. channel->num = idx;
  3044. return channel;
  3045. }
  3046. }
  3047. for (idx = ALI_PCM_OUT_CHANNEL_FIRST; idx <= ALI_PCM_OUT_CHANNEL_LAST ; idx++) {
  3048. if (!(bank->bitmap & (1 << idx))) {
  3049. struct trident_channel *channel = &bank->channels[idx];
  3050. bank->bitmap |= 1 << idx;
  3051. channel->num = idx;
  3052. return channel;
  3053. }
  3054. }
  3055. /* no more free channels avaliable */
  3056. // printk(KERN_ERR "ali: no more channels available on Bank A.n");
  3057. return NULL;
  3058. }
  3059. static struct trident_channel *ali_alloc_rec_pcm_channel(struct trident_card *card)
  3060. {
  3061. struct trident_pcm_bank *bank;
  3062. int idx;
  3063. if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) & ALI_SPDIF_IN_SUPPORT)
  3064. idx = ALI_SPDIF_IN_CHANNEL;
  3065. else idx = ALI_PCM_IN_CHANNEL;
  3066. bank = &card->banks[BANK_A];
  3067. if (!(bank->bitmap & (1 << idx))) {
  3068. struct trident_channel *channel = &bank->channels[idx];
  3069. bank->bitmap |= 1 << idx;
  3070. channel->num = idx;
  3071. return channel;
  3072. }
  3073. /* no free recordable channels avaliable */
  3074. // printk(KERN_ERR "ali: no recordable channels available on Bank A.n");
  3075. return NULL;
  3076. }
  3077. static void ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate)
  3078. {
  3079. unsigned char ch_st_sel;
  3080. unsigned short status_rate;
  3081. switch(rate) {
  3082. case 44100:
  3083. status_rate = 0;
  3084. break;
  3085. case 32000:
  3086. status_rate = 0x300;
  3087. break;
  3088. case 48000:
  3089. default:
  3090. status_rate = 0x200;
  3091. break;
  3092. }
  3093. ch_st_sel = inb(TRID_REG(card, ALI_SPDIF_CTRL)) & ALI_SPDIF_OUT_CH_STATUS; //select spdif_out
  3094. ch_st_sel |= 0x80; //select right
  3095. outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
  3096. outb(status_rate | 0x20, TRID_REG(card, ALI_SPDIF_CS + 2));
  3097. ch_st_sel &= (~0x80); //select left
  3098. outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
  3099. outw(status_rate | 0x10, TRID_REG(card, ALI_SPDIF_CS + 2));
  3100. }
  3101. static void ali_address_interrupt(struct trident_card *card)
  3102. {
  3103. int i, channel;
  3104. struct trident_state *state;
  3105. u32 mask, channel_mask;
  3106. mask = trident_get_interrupt_mask (card, 0);
  3107. for (i = 0; i < NR_HW_CH; i++) {
  3108. if ((state = card->states[i]) == NULL)
  3109. continue;
  3110. channel = state->dmabuf.channel->num;
  3111. if ((channel_mask = 1 << channel) & mask) {
  3112. mask &= ~channel_mask;
  3113. trident_ack_channel_interrupt(card, channel);
  3114. udelay(100);
  3115. state->dmabuf.update_flag |= ALI_ADDRESS_INT_UPDATE;
  3116. trident_update_ptr(state);
  3117. }
  3118. }
  3119. if (mask) {
  3120. for (i = 0; i < NR_HW_CH; i++) {
  3121. if (mask & (1 << i)) {
  3122. printk("ali: spurious channel irq %d.n", i);
  3123. trident_ack_channel_interrupt(card, i);
  3124. trident_stop_voice(card, i);
  3125. trident_disable_voice_irq(card, i);
  3126. }
  3127. }
  3128. }
  3129. }
  3130. /* Updating the values of counters of other_states' DMAs without lock 
  3131. protection is no harm because all DMAs of multi-channels and interrupt
  3132. depend on a master state's DMA, and changing the counters of the master
  3133. state DMA is protected by a spinlock.
  3134. */
  3135. static int ali_write_5_1(struct trident_state *state,  const char *buf, int cnt_for_multi_channel, unsigned int *copy_count, unsigned int *state_cnt)
  3136. {
  3137. struct dmabuf *dmabuf = &state->dmabuf;
  3138. struct dmabuf *dmabuf_temp;
  3139. const char *buffer = buf;
  3140. unsigned swptr, other_dma_nums, sample_s;
  3141. unsigned int i, loop;
  3142. other_dma_nums = 4;
  3143. sample_s = sample_size[dmabuf->fmt] >> 1;
  3144. swptr = dmabuf->swptr;
  3145. if ((i = state->multi_channels_adjust_count) > 0) {
  3146. if (i == 1) {
  3147. if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
  3148. return -EFAULT;
  3149. seek_offset(swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3150. i--;
  3151. (*state_cnt) += sample_s;
  3152. state->multi_channels_adjust_count++;
  3153. }
  3154. else i = i - (state->chans_num - other_dma_nums);
  3155. for (; (i < other_dma_nums) && (cnt_for_multi_channel > 0); i++) {
  3156. dmabuf_temp = &state->other_states[i]->dmabuf;
  3157. if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr, buffer, sample_s))
  3158. return -EFAULT;
  3159. seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3160. }
  3161. if (cnt_for_multi_channel == 0)
  3162. state->multi_channels_adjust_count += i;
  3163. }
  3164. if (cnt_for_multi_channel > 0) {
  3165. loop = cnt_for_multi_channel / (state->chans_num * sample_s);
  3166. for (i = 0; i < loop; i++) {
  3167. if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s * 2))
  3168. return -EFAULT;
  3169. seek_offset(swptr, buffer, cnt_for_multi_channel, sample_s * 2, *copy_count);
  3170. (*state_cnt) += (sample_s * 2);
  3171. dmabuf_temp = &state->other_states[0]->dmabuf;
  3172. if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr, buffer, sample_s))
  3173. return -EFAULT;
  3174. seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3175. dmabuf_temp = &state->other_states[1]->dmabuf;
  3176. if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr, buffer, sample_s))
  3177. return -EFAULT;
  3178. seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3179. dmabuf_temp = &state->other_states[2]->dmabuf;
  3180. if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr, buffer, sample_s))
  3181. return -EFAULT;
  3182. seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3183. dmabuf_temp = &state->other_states[3]->dmabuf;
  3184. if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr, buffer, sample_s))
  3185. return -EFAULT;
  3186. seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3187. }
  3188. if (cnt_for_multi_channel > 0) {
  3189. state->multi_channels_adjust_count = cnt_for_multi_channel / sample_s;
  3190. if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
  3191. return -EFAULT;
  3192. seek_offset(swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3193. (*state_cnt) += sample_s;
  3194. if (cnt_for_multi_channel > 0) {
  3195. if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
  3196. return -EFAULT;
  3197. seek_offset(swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3198. (*state_cnt) += sample_s;
  3199. if (cnt_for_multi_channel > 0) {
  3200. loop = state->multi_channels_adjust_count - (state->chans_num - other_dma_nums);
  3201. for (i = 0; i < loop; i++) {
  3202. dmabuf_temp = &state->other_states[i]->dmabuf;
  3203. if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr, buffer, sample_s))
  3204. return -EFAULT;
  3205. seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel, sample_s, *copy_count);
  3206. }
  3207. }
  3208. }
  3209. }
  3210. else
  3211. state->multi_channels_adjust_count = 0;
  3212. }
  3213. for (i = 0; i < other_dma_nums; i++) {
  3214. dmabuf_temp = &state->other_states[i]->dmabuf;
  3215. dmabuf_temp->swptr = dmabuf_temp->swptr % dmabuf_temp->dmasize;
  3216. }
  3217. return *state_cnt;
  3218. }
  3219. static void ali_free_other_states_resources(struct trident_state *state)
  3220. {
  3221. int i;
  3222. struct trident_card *card = state->card;
  3223. struct trident_state *s;
  3224. unsigned other_states_count;
  3225. other_states_count = state->chans_num - 2; /* except PCM L/R channels*/
  3226. for ( i = 0; i < other_states_count; i++) {
  3227. s = state->other_states[i];
  3228. dealloc_dmabuf(s);
  3229. ali_disable_special_channel(s->card, s->dmabuf.channel->num);
  3230. state->card->free_pcm_channel(s->card, s->dmabuf.channel->num);
  3231. card->states[s->virt] = NULL;
  3232. kfree(s);
  3233. }
  3234. }
  3235. #ifdef CONFIG_PROC_FS
  3236. struct proc_dir_entry *res;
  3237. static int ali_write_proc(struct file *file, const char *buffer, unsigned long count, void *data)
  3238. {
  3239. struct trident_card *card = (struct trident_card *)data;
  3240. unsigned long flags;
  3241. char c;
  3242. if (count<0)
  3243. return -EINVAL;
  3244. if (count == 0)
  3245. return 0;
  3246. if (get_user(c, buffer))
  3247. return -EFAULT;
  3248. spin_lock_irqsave(&card->lock, flags);
  3249. switch (c) {
  3250.     case '0':
  3251. ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
  3252. ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
  3253. break;
  3254.     case '1':
  3255. ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT|ALI_SPDIF_OUT_PCM);
  3256. break;
  3257.     case '2':
  3258. ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT|ALI_SPDIF_OUT_NON_PCM);
  3259. break;
  3260.     case '3':
  3261. ali_disable_spdif_in(card); //default
  3262. break;
  3263.     case '4':
  3264. ali_setup_spdif_in(card);
  3265. break;
  3266. }
  3267. spin_unlock_irqrestore(&card->lock, flags);
  3268. return count;
  3269. }
  3270. #endif
  3271. /* OSS /dev/mixer file operation methods */
  3272. static int trident_open_mixdev(struct inode *inode, struct file *file)
  3273. {
  3274. int i = 0;
  3275. int minor = MINOR(inode->i_rdev);
  3276. struct trident_card *card = devs;
  3277. for (card = devs; card != NULL; card = card->next)
  3278. for (i = 0; i < NR_AC97; i++)
  3279. if (card->ac97_codec[i] != NULL &&
  3280.     card->ac97_codec[i]->dev_mixer == minor)
  3281. goto match;
  3282. if (!card) {
  3283. return -ENODEV;
  3284. }
  3285.  match:
  3286. file->private_data = card->ac97_codec[i];
  3287. return 0;
  3288. }
  3289. static int trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
  3290. unsigned long arg)
  3291. {
  3292. struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
  3293. return codec->mixer_ioctl(codec, cmd, arg);
  3294. }
  3295. static /*const*/ struct file_operations trident_mixer_fops = {
  3296. owner: THIS_MODULE,
  3297. llseek: no_llseek,
  3298. ioctl: trident_ioctl_mixdev,
  3299. open: trident_open_mixdev,
  3300. };
  3301. static int ali_reset_5451(struct trident_card *card)
  3302. {
  3303. struct pci_dev *pci_dev = NULL;
  3304. unsigned int   dwVal;
  3305. unsigned short wCount, wReg;
  3306. pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, pci_dev);
  3307. if (pci_dev == NULL)
  3308. return -1;
  3309. pci_read_config_dword(pci_dev, 0x7c, &dwVal);
  3310. pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
  3311. udelay(5000);
  3312. pci_read_config_dword(pci_dev, 0x7c, &dwVal);
  3313. pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
  3314. udelay(5000);
  3315. pci_dev = card->pci_dev;
  3316. if (pci_dev == NULL)
  3317. return -1;
  3318. pci_read_config_dword(pci_dev, 0x44, &dwVal);
  3319. pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
  3320. udelay(500);
  3321. pci_read_config_dword(pci_dev, 0x44, &dwVal);
  3322. pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
  3323. udelay(5000);
  3324. wCount = 200;
  3325. while(wCount--) {
  3326. wReg = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
  3327. if((wReg & 0x000f) == 0x000f)
  3328. return 0;
  3329. udelay(500);
  3330. }
  3331. return 0;
  3332. }
  3333. /* AC97 codec initialisation. */
  3334. static int __init trident_ac97_init(struct trident_card *card)
  3335. {
  3336. int num_ac97 = 0;
  3337. unsigned long ready_2nd = 0;
  3338. struct ac97_codec *codec;
  3339. int i = 0;
  3340. /* initialize controller side of AC link, and find out if secondary codes
  3341.    really exist */
  3342. switch (card->pci_id)
  3343. {
  3344. case PCI_DEVICE_ID_ALI_5451:
  3345. if (ali_reset_5451(card)) 
  3346. {
  3347. printk(KERN_ERR "trident_ac97_init: error resetting 5451.n");
  3348. return -1;
  3349. }
  3350. outl(0x80000001,TRID_REG(card, ALI_GLOBAL_CONTROL));
  3351. outl(0x00000000,TRID_REG(card, T4D_AINTEN_A));
  3352. outl(0xffffffff,TRID_REG(card, T4D_AINT_A));
  3353. outl(0x00000000,TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
  3354. outb(0x10, TRID_REG(card, ALI_MPUR2));
  3355. ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
  3356. ready_2nd &= 0x3fff;
  3357. outl(ready_2nd | PCMOUT | 0x8000, TRID_REG(card, ALI_SCTRL));
  3358. ready_2nd = inl(TRID_REG(card, ALI_SCTRL)); 
  3359. ready_2nd &= SI_AC97_SECONDARY_READY;
  3360. if (card->revision < ALI_5451_V02)
  3361. ready_2nd = 0;
  3362. break;
  3363. case PCI_DEVICE_ID_SI_7018:
  3364. /* disable AC97 GPIO interrupt */
  3365. outl(0x00, TRID_REG(card, SI_AC97_GPIO));
  3366. /* when power up the AC link is in cold reset mode so stop it */
  3367. outl(PCMOUT|SURROUT|CENTEROUT|LFEOUT|SECONDARY_ID,
  3368.      TRID_REG(card, SI_SERIAL_INTF_CTRL));
  3369. /* it take a long time to recover from a cold reset (especially when you have
  3370.    more than one codec) */
  3371. udelay(2000);
  3372. ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
  3373. ready_2nd &= SI_AC97_SECONDARY_READY;
  3374. break;
  3375. case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
  3376. /* playback on */
  3377. outl(DX_AC97_PLAYBACK, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
  3378. break;
  3379. case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
  3380. /* enable AC97 Output Slot 3,4 (PCM Left/Right Playback) */
  3381. outl(NX_AC97_PCM_OUTPUT, TRID_REG(card, NX_ACR0_AC97_COM_STAT));
  3382. ready_2nd = inl(TRID_REG(card, NX_ACR0_AC97_COM_STAT));
  3383. ready_2nd &= NX_AC97_SECONDARY_READY;
  3384. break;
  3385. case PCI_DEVICE_ID_INTERG_5050:
  3386. /* disable AC97 GPIO interrupt */
  3387. outl(0x00, TRID_REG(card, SI_AC97_GPIO));
  3388. /* when power up, the AC link is in cold reset mode, so stop it */
  3389. outl(PCMOUT|SURROUT|CENTEROUT|LFEOUT,
  3390.      TRID_REG(card, SI_SERIAL_INTF_CTRL));
  3391. /* it take a long time to recover from a cold reset (especially when you have
  3392.    more than one codec) */
  3393. udelay(2000);
  3394. ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
  3395. ready_2nd &= SI_AC97_SECONDARY_READY;
  3396. break;
  3397. }
  3398. for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
  3399. if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL)
  3400. return -ENOMEM;
  3401. memset(codec, 0, sizeof(struct ac97_codec));
  3402. /* initialize some basic codec information, other fields will be filled
  3403.    in ac97_probe_codec */
  3404. codec->private_data = card;
  3405. codec->id = num_ac97;
  3406. if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3407. codec->codec_read = ali_ac97_read;
  3408. codec->codec_write = ali_ac97_write;
  3409. }
  3410. else {
  3411. codec->codec_read = trident_ac97_get;
  3412. codec->codec_write = trident_ac97_set;
  3413. }
  3414. if (ac97_probe_codec(codec) == 0)
  3415. break;
  3416. if ((codec->dev_mixer = register_sound_mixer(&trident_mixer_fops, -1)) < 0) {
  3417. printk(KERN_ERR "trident: couldn't register mixer!n");
  3418. kfree(codec);
  3419. break;
  3420. }
  3421. card->ac97_codec[num_ac97] = codec;
  3422. /* if there is no secondary codec at all, don't probe any more */
  3423. if (!ready_2nd)
  3424. break;
  3425. }
  3426. if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3427. for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
  3428. if (card->ac97_codec[num_ac97] == NULL)
  3429. break;
  3430. for (i=0; i<64;i++)
  3431. card->mixer_regs[i][num_ac97] = ali_ac97_get(card, num_ac97,i*2);
  3432. }
  3433. }
  3434. return num_ac97+1;
  3435. }
  3436. /* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered 
  3437.    until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
  3438. static int __init trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
  3439. {
  3440. unsigned long iobase;
  3441. struct trident_card *card;
  3442. u8 bits;
  3443. u8 revision;
  3444. int i = 0;
  3445. u16 temp;
  3446. struct pci_dev *pci_dev_m1533 = NULL;
  3447. int rc = -ENODEV;
  3448. u64 dma_mask;
  3449. if (pci_enable_device(pci_dev))
  3450. goto out;
  3451. if (pci_dev->device == PCI_DEVICE_ID_ALI_5451)
  3452. dma_mask = ALI_DMA_MASK;
  3453. else
  3454. dma_mask = TRIDENT_DMA_MASK;
  3455. if (pci_set_dma_mask(pci_dev, dma_mask)) {
  3456. printk(KERN_ERR "trident: architecture does not support"
  3457.        " %s PCI busmaster DMAn",
  3458.        pci_dev->device == PCI_DEVICE_ID_ALI_5451 ?
  3459.        "32-bit" : "30-bit");
  3460. goto out;
  3461. }
  3462. pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
  3463. if (pci_id->device == PCI_DEVICE_ID_INTERG_5050)
  3464. iobase = pci_resource_start(pci_dev, 1);
  3465. else
  3466. iobase = pci_resource_start(pci_dev, 0);
  3467. if (!request_region(iobase, 256, card_names[pci_id->driver_data])) {
  3468. printk(KERN_ERR "trident: can't allocate I/O space at 0x%4.4lxn",
  3469.        iobase);
  3470. goto out;
  3471. }
  3472. rc = -ENOMEM;
  3473. if ((card = kmalloc(sizeof(struct trident_card), GFP_KERNEL)) == NULL) {
  3474. printk(KERN_ERR "trident: out of memoryn");
  3475. goto out_release_region;
  3476. }
  3477. memset(card, 0, sizeof(*card));
  3478. card->iobase = iobase;
  3479. card->pci_dev = pci_dev;
  3480. card->pci_id = pci_id->device;
  3481. card->revision = revision;
  3482. card->irq = pci_dev->irq;
  3483. card->next = devs;
  3484. card->magic = TRIDENT_CARD_MAGIC;
  3485. card->banks[BANK_A].addresses = &bank_a_addrs;
  3486. card->banks[BANK_A].bitmap = 0UL;
  3487. card->banks[BANK_B].addresses = &bank_b_addrs;
  3488. card->banks[BANK_B].bitmap = 0UL;
  3489. init_MUTEX(&card->open_sem);
  3490. spin_lock_init(&card->lock);
  3491. init_timer(&card->timer);
  3492. devs = card;
  3493. pci_set_master(pci_dev);
  3494. printk(KERN_INFO "trident: %s found at IO 0x%04lx, IRQ %dn",
  3495.        card_names[pci_id->driver_data], card->iobase, card->irq);
  3496. if(card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3497. /* ALi channel Management */
  3498. card->alloc_pcm_channel = ali_alloc_pcm_channel;
  3499. card->alloc_rec_pcm_channel = ali_alloc_rec_pcm_channel;
  3500. card->free_pcm_channel = ali_free_pcm_channel;
  3501. card->address_interrupt = ali_address_interrupt;
  3502. /* Added by Matt Wu 01-05-2001 for spdif in */
  3503. card->multi_channel_use_count = 0;
  3504. card->rec_channel_use_count = 0;
  3505. /* ALi SPDIF OUT function */
  3506. if(card->revision == ALI_5451_V02) {
  3507. ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
  3508. #ifdef CONFIG_PROC_FS
  3509. res = create_proc_entry("ALi5451", 0, NULL);
  3510. if (res) {
  3511. res->write_proc = ali_write_proc;
  3512. res->data = card;
  3513. }
  3514. #endif
  3515. }
  3516. /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
  3517. card->hwvolctl = 0;
  3518. pci_dev_m1533 = pci_find_device(PCI_VENDOR_ID_AL,PCI_DEVICE_ID_AL_M1533, pci_dev_m1533);
  3519. rc = -ENODEV;
  3520. if (pci_dev_m1533 == NULL)
  3521. goto out_proc_fs;
  3522. pci_read_config_byte(pci_dev_m1533, 0x63, &bits);
  3523. if (bits & (1<<5))
  3524. card->hwvolctl = 1;
  3525. if (card->hwvolctl) 
  3526. {
  3527. /* Clear m1533 pci cfg 78h bit 30 to zero, which makes
  3528.    GPIO11/12/13 work as ACGP_UP/DOWN/MUTE. */
  3529. pci_read_config_byte(pci_dev_m1533, 0x7b, &bits);
  3530. bits &= 0xbf; /*clear bit 6 */
  3531. pci_write_config_byte(pci_dev_m1533, 0x7b, bits);
  3532. }
  3533. }
  3534. else if(card->pci_id == PCI_DEVICE_ID_INTERG_5050)
  3535. {
  3536. card->alloc_pcm_channel = cyber_alloc_pcm_channel;
  3537. card->alloc_rec_pcm_channel = cyber_alloc_pcm_channel;
  3538. card->free_pcm_channel = cyber_free_pcm_channel;
  3539. card->address_interrupt = cyber_address_interrupt;
  3540. cyber_init_ritual(card);
  3541. }
  3542. else
  3543. {
  3544. card->alloc_pcm_channel = trident_alloc_pcm_channel;
  3545. card->alloc_rec_pcm_channel = trident_alloc_pcm_channel;
  3546. card->free_pcm_channel = trident_free_pcm_channel;
  3547. card->address_interrupt = trident_address_interrupt;
  3548. }
  3549. /* claim our irq */
  3550. rc = -ENODEV;
  3551. if (request_irq(card->irq, &trident_interrupt, SA_SHIRQ,
  3552. card_names[pci_id->driver_data], card)) {
  3553. printk(KERN_ERR "trident: unable to allocate irq %dn", card->irq);
  3554. goto out_proc_fs;
  3555. }
  3556. /* register /dev/dsp */
  3557. if ((card->dev_audio = register_sound_dsp(&trident_audio_fops, -1)) < 0) {
  3558. printk(KERN_ERR "trident: couldn't register DSP device!n");
  3559. goto out_free_irq;
  3560. }
  3561. card->mixer_regs_ready = 0;
  3562. /* initialize AC97 codec and register /dev/mixer */
  3563. if (trident_ac97_init(card) <= 0) {
  3564. /* unregister audio devices */
  3565. for (i = 0; i < NR_AC97; i++) {
  3566. if (card->ac97_codec[i] != NULL) {
  3567. unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
  3568. kfree (card->ac97_codec[i]);
  3569. }
  3570. }
  3571. goto out_unregister_sound_dsp;
  3572. }
  3573. card->mixer_regs_ready = 1;
  3574. outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
  3575. if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3576. /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
  3577. if(card->hwvolctl) 
  3578. {
  3579. /* Enable GPIO IRQ (MISCINT bit 18h)*/
  3580. temp = inw(TRID_REG(card, T4D_MISCINT + 2));
  3581. temp |= 0x0004;
  3582. outw(temp, TRID_REG(card, T4D_MISCINT + 2));
  3583. /* Enable H/W Volume Control GLOVAL CONTROL bit 0*/
  3584. temp = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
  3585. temp |= 0x0001;
  3586. outw(temp, TRID_REG(card, ALI_GLOBAL_CONTROL));
  3587. }
  3588. if(card->revision == ALI_5451_V02)
  3589. ali_close_multi_channels();
  3590. /* edited by HMSEO for GT sound */
  3591. #if defined CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC
  3592. {
  3593. u16 ac97_data;
  3594. extern struct hwrpb_struct *hwrpb;
  3595. if ((hwrpb->sys_type) == 201) {
  3596. printk(KERN_INFO "trident: Running on Alpha system type Nautilusn");
  3597. ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
  3598. ali_ac97_set(card, 0, AC97_POWER_CONTROL, ac97_data | ALI_EAPD_POWER_DOWN);
  3599. }
  3600. }
  3601. #endif
  3602. /* edited by HMSEO for GT sound*/
  3603. }
  3604. rc = 0;
  3605. pci_set_drvdata(pci_dev, card);
  3606. /* Enable Address Engine Interrupts */
  3607. trident_enable_loop_interrupts(card);
  3608. out: return rc;
  3609. out_unregister_sound_dsp:
  3610. unregister_sound_dsp(card->dev_audio);
  3611. out_free_irq:
  3612. free_irq(card->irq, card);
  3613. out_proc_fs:
  3614. #ifdef CONFIG_PROC_FS
  3615. if (res) {
  3616. remove_proc_entry("ALi5451", NULL);
  3617. res = NULL;
  3618. }
  3619. #endif
  3620. kfree(card);
  3621. devs = NULL;
  3622. out_release_region:
  3623. release_region(iobase, 256);
  3624. goto out;
  3625. }
  3626. static void __devexit trident_remove(struct pci_dev *pci_dev)
  3627. {
  3628. int i;
  3629. struct trident_card *card = pci_get_drvdata(pci_dev);
  3630. /*
  3631.    * Kill running timers before unload. We can't have them
  3632.    * going off after rmmod!
  3633.    */
  3634. if(card->hwvolctl)
  3635. del_timer_sync(&card->timer);
  3636. /* ALi S/PDIF and Power Management */
  3637. if(card->pci_id == PCI_DEVICE_ID_ALI_5451) {
  3638. ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
  3639.                 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
  3640.                 ali_disable_spdif_in(card);
  3641. #ifdef CONFIG_PROC_FS
  3642. remove_proc_entry("ALi5451", NULL);
  3643. #endif
  3644. }
  3645. /* Kill interrupts, and SP/DIF */
  3646. trident_disable_loop_interrupts(card);
  3647. /* free hardware resources */
  3648. free_irq(card->irq, card);
  3649. release_region(card->iobase, 256);
  3650. /* unregister audio devices */
  3651. for (i = 0; i < NR_AC97; i++)
  3652. if (card->ac97_codec[i] != NULL) {
  3653. unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
  3654. kfree (card->ac97_codec[i]);
  3655. }
  3656. unregister_sound_dsp(card->dev_audio);
  3657. kfree(card);
  3658. pci_set_drvdata(pci_dev, NULL);
  3659. }
  3660. MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee");
  3661. MODULE_DESCRIPTION("Trident 4DWave/SiS 7018/ALi 5451 and Tvia/IGST CyberPro5050 PCI Audio Driver");
  3662. MODULE_LICENSE("GPL");
  3663. #define TRIDENT_MODULE_NAME "trident"
  3664. static struct pci_driver trident_pci_driver = {
  3665. name: TRIDENT_MODULE_NAME,
  3666. id_table: trident_pci_tbl,
  3667. probe: trident_probe,
  3668. remove: __devexit_p(trident_remove),
  3669. suspend: trident_suspend,
  3670. resume: trident_resume
  3671. };
  3672. static int __init trident_init_module (void)
  3673. {
  3674. if (!pci_present())   /* No PCI bus in this machine! */
  3675. return -ENODEV;
  3676. printk(KERN_INFO "Trident 4DWave/SiS 7018/ALi 5451,Tvia CyberPro 5050 PCI Audio, version "
  3677.        DRIVER_VERSION ", " __TIME__ " " __DATE__ "n");
  3678. if (!pci_register_driver(&trident_pci_driver)) {
  3679. pci_unregister_driver(&trident_pci_driver);
  3680.                 return -ENODEV;
  3681. }
  3682. return 0;
  3683. }
  3684. static void __exit trident_cleanup_module (void)
  3685. {
  3686. pci_unregister_driver(&trident_pci_driver);
  3687. }
  3688. module_init(trident_init_module);
  3689. module_exit(trident_cleanup_module);