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

嵌入式Linux

开发平台:

Unix_Linux

  1.  /*
  2.  **********************************************************************
  3.  *     main.c - Creative EMU10K1 audio driver
  4.  *     Copyright 1999, 2000 Creative Labs, Inc.
  5.  *
  6.  **********************************************************************
  7.  *
  8.  *     Date                 Author          Summary of changes
  9.  *     ----                 ------          ------------------
  10.  *     October 20, 1999     Bertrand Lee    base code release
  11.  *     November 2, 1999     Alan Cox        cleaned up stuff
  12.  *
  13.  **********************************************************************
  14.  *
  15.  *     This program is free software; you can redistribute it and/or
  16.  *     modify it under the terms of the GNU General Public License as
  17.  *     published by the Free Software Foundation; either version 2 of
  18.  *     the License, or (at your option) any later version.
  19.  *
  20.  *     This program is distributed in the hope that it will be useful,
  21.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  *     GNU General Public License for more details.
  24.  *
  25.  *     You should have received a copy of the GNU General Public
  26.  *     License along with this program; if not, write to the Free
  27.  *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  28.  *     USA.
  29.  *
  30.  **********************************************************************
  31.  *
  32.  *      Supported devices:
  33.  *      /dev/dsp:        Standard /dev/dsp device, OSS-compatible
  34.  *      /dev/dsp1:       Routes to rear speakers only  
  35.  *      /dev/mixer:      Standard /dev/mixer device, OSS-compatible
  36.  *      /dev/midi:       Raw MIDI UART device, mostly OSS-compatible
  37.  * /dev/sequencer:  Sequencer Interface (requires sound.o)
  38.  *
  39.  *      Revision history:
  40.  *      0.1 beta Initial release
  41.  *      0.2 Lowered initial mixer vol. Improved on stuttering wave playback. Added MIDI UART support.
  42.  *      0.3 Fixed mixer routing bug, added APS, joystick support.
  43.  *      0.4 Added rear-channel, SPDIF support.
  44.  * 0.5 Source cleanup, SMP fixes, multiopen support, 64 bit arch fixes,
  45.  *     moved bh's to tasklets, moved to the new PCI driver initialization style.
  46.  * 0.6 Make use of pci_alloc_consistent, improve compatibility layer for 2.2 kernels,
  47.  *     code reorganization and cleanup.
  48.  * 0.7 Support for the Emu-APS. Bug fixes for voice cache setup, mmaped sound + poll().
  49.  *          Support for setting external TRAM size.
  50.  *      0.8 Make use of the kernel ac97 interface. Support for a dsp patch manager.
  51.  *      0.9 Re-enables rear speakers volume controls
  52.  *     0.10 Initializes rear speaker volume.
  53.  *     Dynamic patch storage allocation.
  54.  *     New private ioctls to change control gpr values.
  55.  *     Enable volume control interrupts.
  56.  *     By default enable dsp routes to digital out. 
  57.  *     0.11 Fixed fx / 4 problem.
  58.  *     0.12 Implemented mmaped for recording.
  59.  *     Fixed bug: not unreserving mmaped buffer pages.
  60.  *     IRQ handler cleanup.
  61.  *     0.13 Fixed problem with dsp1
  62.  *          Simplified dsp patch writing (inside the driver)
  63.  *     Fixed several bugs found by the Stanford tools
  64.  *     0.14 New control gpr to oss mixer mapping feature (Chris Purnell)
  65.  *          Added AC3 Passthrough Support (Juha Yrjola)
  66.  *          Added Support for 5.1 cards (digital out and the third analog out)
  67.  *     0.15 Added Sequencer Support (Daniel Mack)
  68.  *          Support for multichannel pcm playback (Eduard Hasenleithner)
  69.  *     0.16 Mixer improvements, added old treble/bass support (Daniel Bertrand)
  70.  *          Small code format cleanup.
  71.  *          Deadlock bug fix for emu10k1_volxxx_irqhandler().
  72.  *     0.17 Fix for mixer SOUND_MIXER_INFO ioctl.
  73.  *     Fix for HIGHMEM machines (emu10k1 can only do 31 bit bus master) 
  74.  *     midi poll initial implementation.
  75.  *     Small mixer fixes/cleanups.
  76.  *     Improved support for 5.1 cards.
  77.  *     0.18 Fix for possible leak in pci_alloc_consistent()
  78.  *          Cleaned up poll() functions (audio and midi). Don't start input.
  79.  *     Restrict DMA pages used to 512Mib range.
  80.  *     New AC97_BOOST mixer ioctl.
  81.  *
  82.  *********************************************************************/
  83. /* These are only included once per module */
  84. #include <linux/version.h>
  85. #include <linux/module.h>
  86. #include <linux/slab.h>
  87. #include <linux/init.h>
  88. #include <linux/delay.h>
  89. #include <linux/proc_fs.h>
  90. #include "hwaccess.h"
  91. #include "8010.h"
  92. #include "efxmgr.h"
  93. #include "cardwo.h"
  94. #include "cardwi.h"
  95. #include "cardmo.h"
  96. #include "cardmi.h"
  97. #include "recmgr.h"
  98. #include "ecard.h"
  99. #ifdef EMU10K1_SEQUENCER
  100. #define MIDI_SYNTH_NAME "EMU10K1 MIDI"
  101. #define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
  102.  
  103. #include "../sound_config.h"
  104. #include "../midi_synth.h"
  105. /* this should be in dev_table.h */
  106. #define SNDCARD_EMU10K1 46
  107. #endif
  108.  
  109. #define DRIVER_VERSION "0.18"
  110. /* the emu10k1 _seems_ to only supports 29 bit (512MiB) bit bus master */
  111. #define EMU10K1_DMA_MASK                0x1fffffff /* DMA buffer mask for pci_alloc_consist */
  112. #ifndef PCI_VENDOR_ID_CREATIVE
  113. #define PCI_VENDOR_ID_CREATIVE 0x1102
  114. #endif
  115. #ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1
  116. #define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002
  117. #endif
  118. #define EMU_APS_SUBID 0x40011102
  119.  
  120. enum {
  121. EMU10K1 = 0,
  122. };
  123. static char *card_names[] __devinitdata = {
  124. "EMU10K1",
  125. };
  126. static struct pci_device_id emu10k1_pci_tbl[] = {
  127. {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1,
  128.  PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1},
  129. {0,}
  130. };
  131. MODULE_DEVICE_TABLE(pci, emu10k1_pci_tbl);
  132. /* Global var instantiation */
  133. LIST_HEAD(emu10k1_devs);
  134. extern struct file_operations emu10k1_audio_fops;
  135. extern struct file_operations emu10k1_mixer_fops;
  136. extern struct file_operations emu10k1_midi_fops;
  137. #ifdef EMU10K1_SEQUENCER
  138. static struct midi_operations emu10k1_midi_operations;
  139. #endif
  140. extern void emu10k1_interrupt(int, void *, struct pt_regs *s);
  141. static int __devinit emu10k1_audio_init(struct emu10k1_card *card)
  142. {
  143. card->audio_dev = register_sound_dsp(&emu10k1_audio_fops, -1);
  144. if (card->audio_dev < 0) {
  145. printk(KERN_ERR "emu10k1: cannot register first audio device!n");
  146. goto err_dev;
  147. }
  148. card->audio_dev1 = register_sound_dsp(&emu10k1_audio_fops, -1);
  149. if (card->audio_dev1 < 0) {
  150. printk(KERN_ERR "emu10k1: cannot register second audio device!n");
  151. goto err_dev1;
  152. }
  153. /* Assign default playback voice parameters */
  154. card->mchannel_fx = 8;
  155. /* mono voice */
  156. card->waveout.send_a[0] = 0xff;
  157. card->waveout.send_b[0] = 0xff;
  158. card->waveout.send_c[0] = 0x00;
  159. card->waveout.send_d[0] = 0x00;
  160. card->waveout.send_routing[0] = 0x3210;
  161. /* stereo voice */
  162. /* left */
  163. card->waveout.send_a[1] = 0xff;
  164. card->waveout.send_b[1] = 0x00;
  165. card->waveout.send_c[1] = 0x00;
  166. card->waveout.send_d[1] = 0x00;
  167. card->waveout.send_routing[1] = 0x3210;
  168. /* right */
  169. card->waveout.send_a[2] = 0x00;
  170. card->waveout.send_b[2] = 0xff;
  171. card->waveout.send_c[2] = 0x00;
  172. card->waveout.send_d[2] = 0x00;
  173. card->waveout.send_routing[2] = 0x3210;
  174. /* Assign default recording parameters */
  175. /* FIXME */
  176. if(card->isaps)
  177. card->wavein.recsrc = WAVERECORD_FX;
  178. else
  179. card->wavein.recsrc = WAVERECORD_AC97;
  180. card->wavein.fxwc = 0x0003;
  181. return 0;
  182. err_dev1:
  183. unregister_sound_dsp(card->audio_dev);
  184. err_dev:
  185. return -ENODEV;
  186. }
  187. static void __devinit emu10k1_audio_cleanup(struct emu10k1_card *card)
  188. {
  189. unregister_sound_dsp(card->audio_dev1);
  190. unregister_sound_dsp(card->audio_dev);
  191. }
  192. static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
  193. {
  194. char s[32];
  195. struct ac97_codec *codec = &card->ac97;
  196. card->ac97.dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
  197. if (card->ac97.dev_mixer < 0) {
  198. printk(KERN_ERR "emu10k1: cannot register mixer devicen");
  199. return -EIO;
  200.         }
  201. card->ac97.private_data = card;
  202. if (!card->isaps) {
  203. card->ac97.id = 0;
  204. card->ac97.codec_read = emu10k1_ac97_read;
  205.          card->ac97.codec_write = emu10k1_ac97_write;
  206. if (ac97_probe_codec (&card->ac97) == 0) {
  207. printk(KERN_ERR "emu10k1: unable to probe AC97 codecn");
  208. goto err_out;
  209. }
  210. /* 5.1: Enable the additional AC97 Slots and unmute extra channels on AC97 codec */
  211. if (codec->codec_read(codec, AC97_EXTENDED_ID) & 0x0080){
  212. printk(KERN_INFO "emu10k1: SBLive! 5.1 card detectedn"); 
  213. sblive_writeptr(card, AC97SLOT, 0, AC97SLOT_CNTR | AC97SLOT_LFE);
  214. codec->codec_write(codec, AC97_SURROUND_MASTER, 0x0);
  215. }
  216. // Force 5bit:     
  217. //card->ac97.bit_resolution=5;
  218. if (!proc_mkdir ("driver/emu10k1", 0)) {
  219. printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1n");
  220. goto err_out;
  221. }
  222. sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
  223. if (!proc_mkdir (s, 0)) {
  224. printk(KERN_ERR "emu10k1: unable to create proc directory %sn", s);
  225. goto err_emu10k1_proc;
  226. }
  227. sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
  228. if (!create_proc_read_entry (s, 0, 0, ac97_read_proc, &card->ac97)) {
  229. printk(KERN_ERR "emu10k1: unable to create proc entry %sn", s);
  230. goto err_ac97_proc;
  231. }
  232. /* these will store the original values and never be modified */
  233. card->ac97_supported_mixers = card->ac97.supported_mixers;
  234. card->ac97_stereo_mixers = card->ac97.stereo_mixers;
  235. }
  236. return 0;
  237.  err_ac97_proc:
  238. sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
  239. remove_proc_entry(s, NULL);
  240.  err_emu10k1_proc:
  241. remove_proc_entry("driver/emu10k1", NULL);
  242.  err_out:
  243. unregister_sound_mixer (card->ac97.dev_mixer);
  244. return -EIO;
  245. }
  246. static void __devinit emu10k1_mixer_cleanup(struct emu10k1_card *card)
  247. {
  248. char s[32];
  249. if (!card->isaps) {
  250. sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
  251. remove_proc_entry(s, NULL);
  252. sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
  253. remove_proc_entry(s, NULL);
  254. remove_proc_entry("driver/emu10k1", NULL);
  255. }
  256. unregister_sound_mixer (card->ac97.dev_mixer);
  257. }
  258. static int __devinit emu10k1_midi_init(struct emu10k1_card *card)
  259. {
  260. int ret;
  261. card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
  262. if (card->midi_dev < 0) {
  263.                 printk(KERN_ERR "emu10k1: cannot register midi device!n");
  264. return -ENODEV;
  265.         }
  266. card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
  267. if (card->mpuout == NULL) {
  268. printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memoryn");
  269. ret = -ENOMEM;
  270. goto err_out1;
  271. }
  272. memset(card->mpuout, 0, sizeof(struct emu10k1_mpuout));
  273. card->mpuout->intr = 1;
  274. card->mpuout->status = FLAGS_AVAILABLE;
  275. card->mpuout->state = CARDMIDIOUT_STATE_DEFAULT;
  276. tasklet_init(&card->mpuout->tasklet, emu10k1_mpuout_bh, (unsigned long) card);
  277. spin_lock_init(&card->mpuout->lock);
  278. card->mpuin = kmalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL);
  279. if (card->mpuin == NULL) {
  280. printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuin: out of memoryn");
  281. ret = -ENOMEM;
  282.                 goto err_out2;
  283. }
  284. memset(card->mpuin, 0, sizeof(struct emu10k1_mpuin));
  285. card->mpuin->status = FLAGS_AVAILABLE;
  286. tasklet_init(&card->mpuin->tasklet, emu10k1_mpuin_bh, (unsigned long) card->mpuin);
  287. spin_lock_init(&card->mpuin->lock);
  288. /* Reset the MPU port */
  289. if (emu10k1_mpu_reset(card) < 0) {
  290. ERROR();
  291. ret = -EIO;
  292. goto err_out3;
  293. }
  294. #ifdef EMU10K1_SEQUENCER
  295. card->seq_dev = sound_alloc_mididev();
  296. if (card->seq_dev == -1)
  297. printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
  298. else {
  299. std_midi_synth.midi_dev = card->seq_dev;
  300. midi_devs[card->seq_dev] = 
  301. (struct midi_operations *)
  302. kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
  303. if (midi_devs[card->seq_dev] == NULL) {
  304. printk(KERN_ERR "emu10k1: unable to allocate memory!");
  305. sound_unload_mididev(card->seq_dev);
  306. card->seq_dev = -1;
  307. return 0;
  308. } else {
  309. memcpy((char *)midi_devs[card->seq_dev], 
  310. (char *)&emu10k1_midi_operations, 
  311. sizeof(struct midi_operations));
  312. midi_devs[card->seq_dev]->devc = card;
  313. sequencer_init();
  314. }
  315. }
  316. card->seq_mididev = 0;
  317. #endif
  318. return 0;
  319. err_out3:
  320. kfree(card->mpuin);
  321. err_out2:
  322. kfree(card->mpuout);
  323. err_out1:
  324. unregister_sound_midi(card->midi_dev);
  325. return ret;
  326. }
  327. static void __devinit emu10k1_midi_cleanup(struct emu10k1_card *card)
  328. {
  329. tasklet_kill(&card->mpuout->tasklet);
  330. kfree(card->mpuout);
  331. tasklet_kill(&card->mpuin->tasklet);
  332. kfree(card->mpuin);
  333. #ifdef EMU10K1_SEQUENCER
  334. if (card->seq_dev > -1) {
  335. kfree(midi_devs[card->seq_dev]);
  336. midi_devs[card->seq_dev] = NULL;
  337. sound_unload_mididev(card->seq_dev);
  338. card->seq_dev = -1;
  339. }
  340. #endif
  341. unregister_sound_midi(card->midi_dev);
  342. }
  343. static void __devinit voice_init(struct emu10k1_card *card)
  344. {
  345. int i;
  346. for (i = 0; i < NUM_G; i++)
  347. card->voicetable[i] = VOICE_USAGE_FREE;
  348. }
  349. static void __devinit timer_init(struct emu10k1_card *card)
  350. {
  351. INIT_LIST_HEAD(&card->timers);
  352. card->timer_delay = TIMER_STOPPED;
  353. card->timer_lock = SPIN_LOCK_UNLOCKED;
  354. }
  355. static void __devinit addxmgr_init(struct emu10k1_card *card)
  356. {
  357. u32 count;
  358. for (count = 0; count < MAXPAGES; count++)
  359. card->emupagetable[count] = 0;
  360. /* Mark first page as used */
  361. /* This page is reserved by the driver */
  362. card->emupagetable[0] = 0x8001;
  363. card->emupagetable[1] = MAXPAGES - 1;
  364. }
  365. static void __devinit fx_cleanup(struct patch_manager *mgr)
  366. {
  367. int i;
  368. for(i = 0; i < mgr->current_pages; i++)
  369. free_page((unsigned long) mgr->patch[i]);
  370. }
  371. static int __devinit fx_init(struct emu10k1_card *card)
  372. {
  373. struct patch_manager *mgr = &card->mgr;
  374. struct dsp_patch *patch;
  375. struct dsp_rpatch *rpatch;
  376. s32 left, right;
  377. int i;
  378. u32 pc = 0;
  379. u32 patch_n;
  380. for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
  381. mgr->ctrl_gpr[i][0] = -1;
  382. mgr->ctrl_gpr[i][1] = -1;
  383. }
  384. for (i = 0; i < 512; i++)
  385. OP(6, 0x40, 0x40, 0x40, 0x40);
  386. for (i = 0; i < 256; i++)
  387. sblive_writeptr_tag(card, 0,
  388.     FXGPREGBASE + i, 0,
  389.     TANKMEMADDRREGBASE + i, 0,
  390.     TAGLIST_END);
  391. /* !! The number bellow must equal the number of patches, currently 11 !! */
  392. mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
  393. for (i = 0; i < mgr->current_pages; i++) {
  394. mgr->patch[i] = (void *)__get_free_page(GFP_KERNEL);
  395. if (mgr->patch[i] == NULL) {
  396. mgr->current_pages = i;
  397. fx_cleanup(mgr);
  398. return -ENOMEM;
  399. }
  400. memset(mgr->patch[i], 0, PAGE_SIZE);
  401. }
  402. pc = 0;
  403. patch_n = 0;
  404. //first free GPR = 0x11b
  405. /* FX volume correction and Volume control*/
  406. INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
  407. GET_OUTPUT_GPR(patch, 0x100, 0x0);
  408. GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
  409. GET_DYNAMIC_GPR(patch, 0x112);
  410. OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4
  411. OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol
  412. INPUT_PATCH_END(patch);
  413. INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
  414. GET_OUTPUT_GPR(patch, 0x101, 0x1);
  415. GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
  416. GET_DYNAMIC_GPR(patch, 0x112);
  417. OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
  418. OP(0, 0x101, 0x040, 0x112, 0x107);
  419. INPUT_PATCH_END(patch);
  420. // CD-Digital In Volume control
  421. INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
  422. GET_OUTPUT_GPR(patch, 0x10c, 0x12);
  423. GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
  424. OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
  425. INPUT_PATCH_END(patch);
  426. INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
  427. GET_OUTPUT_GPR(patch, 0x10e, 0x13);
  428. GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
  429. OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
  430. INPUT_PATCH_END(patch);
  431. //Volume Correction for Multi-channel Inputs
  432. INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
  433. patch->input=patch->output=0x3F00;
  434. GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
  435. GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
  436. GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
  437. GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
  438. GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
  439. GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
  440. OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
  441. OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
  442. OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
  443. OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
  444. OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
  445. OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
  446. INPUT_PATCH_END(patch);
  447. //Routing patch start
  448. ROUTING_PATCH_START(rpatch, "Routing");
  449. GET_INPUT_GPR(rpatch, 0x100, 0x0);
  450. GET_INPUT_GPR(rpatch, 0x101, 0x1);
  451. GET_INPUT_GPR(rpatch, 0x10c, 0x12);
  452. GET_INPUT_GPR(rpatch, 0x10e, 0x13);
  453. GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
  454. GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
  455. GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
  456. GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
  457. GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
  458. GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
  459. GET_DYNAMIC_GPR(rpatch, 0x102);
  460. GET_DYNAMIC_GPR(rpatch, 0x103);
  461. GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
  462. GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
  463. GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
  464. GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
  465. /* input buffer */
  466. OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
  467. OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
  468. /* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
  469. OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
  470. CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
  471. CONNECT(PCM_IN_L, AC97_FRONT_L);
  472. CONNECT(SPDIF_CD_L, AC97_FRONT_L);
  473. OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
  474. CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
  475. CONNECT(PCM_IN_R, AC97_FRONT_R);
  476. CONNECT(SPDIF_CD_R, AC97_FRONT_R);
  477. /* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
  478. OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
  479. OP(6, 0x104, 0x104, 0x10c, 0x102);
  480. CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
  481. CONNECT(AC97_IN_L, ANALOG_REAR_L);
  482. CONNECT(PCM_IN_L, ANALOG_REAR_L);
  483. CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
  484. CONNECT(PCM1_IN_L, ANALOG_REAR_L);
  485. OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
  486. OP(6, 0x105, 0x105, 0x10e, 0x103);
  487. CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
  488. CONNECT(AC97_IN_R, ANALOG_REAR_R);
  489. CONNECT(PCM_IN_R, ANALOG_REAR_R);
  490. CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
  491. CONNECT(PCM1_IN_R, ANALOG_REAR_R);
  492. /* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
  493. OP(6, 0x10a, 0x100, 0x102, 0x10c);
  494. OP(6, 0x10a, 0x10a, 0x113, 0x40);
  495. CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
  496. CONNECT(PCM_IN_L, DIGITAL_OUT_L);
  497. CONNECT(AC97_IN_L, DIGITAL_OUT_L);
  498. CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
  499. OP(6, 0x10b, 0x101, 0x103, 0x10e);
  500. OP(6, 0x10b, 0x10b, 0x114, 0x40);
  501. CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
  502. CONNECT(PCM_IN_R, DIGITAL_OUT_R);
  503. CONNECT(AC97_IN_R, DIGITAL_OUT_R);
  504. CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
  505. /* AC97 In --> ADC Recording Buffer */
  506. OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
  507. CONNECT(AC97_IN_L, ADC_REC_L);
  508. OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
  509. CONNECT(AC97_IN_R, ADC_REC_R);
  510. /* fx12:Analog-Center */
  511. OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
  512. CONNECT(MULTI_CENTER, ANALOG_CENTER);
  513. /* fx11:Analog-LFE */
  514. OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
  515. CONNECT(MULTI_LFE, ANALOG_LFE);
  516. /* fx12:Digital-Center */
  517. OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
  518. CONNECT(MULTI_CENTER, DIGITAL_CENTER);
  519. /* fx11:Analog-LFE */
  520. OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
  521. CONNECT(MULTI_LFE, DIGITAL_LFE);
  522. ROUTING_PATCH_END(rpatch);
  523. // Rear volume control
  524. OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
  525. GET_INPUT_GPR(patch, 0x104, 0x8);
  526. GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
  527. OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
  528. OUTPUT_PATCH_END(patch);
  529. OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
  530. GET_INPUT_GPR(patch, 0x105, 0x9);
  531. GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
  532. OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
  533. OUTPUT_PATCH_END(patch);
  534. //Master volume control on front-digital
  535. OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
  536. GET_INPUT_GPR(patch, 0x10a, 0x2);
  537. GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
  538. OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
  539. OUTPUT_PATCH_END(patch);
  540. OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
  541. GET_INPUT_GPR(patch, 0x10b, 0x3);
  542. GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
  543. OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
  544. OUTPUT_PATCH_END(patch);
  545. /* delimiter patch */
  546. patch = PATCH(mgr, patch_n);
  547. patch->code_size = 0;
  548. sblive_writeptr(card, DBG, 0, 0);
  549. mgr->lock = SPIN_LOCK_UNLOCKED;
  550. //Master volume
  551. mgr->ctrl_gpr[SOUND_MIXER_VOLUME][0] = 8;
  552. mgr->ctrl_gpr[SOUND_MIXER_VOLUME][1] = 9;
  553. left = card->ac97.mixer_state[SOUND_MIXER_VOLUME] & 0xff;
  554. right = (card->ac97.mixer_state[SOUND_MIXER_VOLUME] >> 8) & 0xff;
  555. emu10k1_set_volume_gpr(card, 8, left, 1 << card->ac97.bit_resolution);
  556. emu10k1_set_volume_gpr(card, 9, right, 1 << card->ac97.bit_resolution);
  557. //Rear volume
  558. mgr->ctrl_gpr[ SOUND_MIXER_OGAIN ][0] = 0x19;
  559. mgr->ctrl_gpr[ SOUND_MIXER_OGAIN ][1] = 0x1a;
  560. left = right = 67;
  561. card->ac97.mixer_state[SOUND_MIXER_OGAIN] = (right << 8) | left;
  562. card->ac97.supported_mixers |= SOUND_MASK_OGAIN;
  563. card->ac97.stereo_mixers |= SOUND_MASK_OGAIN;
  564. emu10k1_set_volume_gpr(card, 0x19, left, VOL_5BIT);
  565. emu10k1_set_volume_gpr(card, 0x1a, right, VOL_5BIT);
  566. //PCM Volume
  567. mgr->ctrl_gpr[SOUND_MIXER_PCM][0] = 6;
  568. mgr->ctrl_gpr[SOUND_MIXER_PCM][1] = 7;
  569. left = card->ac97.mixer_state[SOUND_MIXER_PCM] & 0xff;
  570. right = (card->ac97.mixer_state[SOUND_MIXER_PCM] >> 8) & 0xff;
  571. emu10k1_set_volume_gpr(card, 6, left, VOL_5BIT);
  572. emu10k1_set_volume_gpr(card, 7, right, VOL_5BIT);
  573. //CD-Digital Volume
  574. mgr->ctrl_gpr[SOUND_MIXER_DIGITAL1][0] = 0xd;
  575. mgr->ctrl_gpr[SOUND_MIXER_DIGITAL1][1] = 0xf;
  576. left = right = 67;
  577. card->ac97.mixer_state[SOUND_MIXER_DIGITAL1] = (right << 8) | left; 
  578. card->ac97.supported_mixers |= SOUND_MASK_DIGITAL1;
  579. card->ac97.stereo_mixers |= SOUND_MASK_DIGITAL1;
  580. emu10k1_set_volume_gpr(card, 0xd, left, VOL_5BIT);
  581. emu10k1_set_volume_gpr(card, 0xf, right, VOL_5BIT);
  582. //hard wire the ac97's pcm, we'll do that in dsp code instead.
  583. emu10k1_ac97_write(&card->ac97, 0x18, 0x0);
  584. card->ac97_supported_mixers &= ~SOUND_MASK_PCM;
  585. card->ac97_stereo_mixers &= ~SOUND_MASK_PCM;
  586. //set Igain to 0dB by default, maybe consider hardwiring it here.
  587. emu10k1_ac97_write(&card->ac97, AC97_RECORD_GAIN, 0x0000);
  588. card->ac97.mixer_state[SOUND_MIXER_IGAIN] = 0x101; 
  589. return 0;
  590. }
  591. static int __devinit hw_init(struct emu10k1_card *card)
  592. {
  593. int nCh;
  594. u32 pagecount; /* tmp */
  595. int ret;
  596. /* Disable audio and lock cache */
  597. emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);
  598. /* Reset recording buffers */
  599. sblive_writeptr_tag(card, 0,
  600.     MICBS, ADCBS_BUFSIZE_NONE,
  601.     MICBA, 0,
  602.     FXBS, ADCBS_BUFSIZE_NONE,
  603.     FXBA, 0,
  604.     ADCBS, ADCBS_BUFSIZE_NONE,
  605.     ADCBA, 0,
  606.     TAGLIST_END);
  607. /* Disable channel interrupt */
  608. emu10k1_writefn0(card, INTE, 0);
  609. sblive_writeptr_tag(card, 0,
  610.     CLIEL, 0,
  611.     CLIEH, 0,
  612.     SOLEL, 0,
  613.     SOLEH, 0,
  614.     TAGLIST_END);
  615. /* Init envelope engine */
  616. for (nCh = 0; nCh < NUM_G; nCh++) {
  617. sblive_writeptr_tag(card, nCh,
  618.     DCYSUSV, 0,
  619.     IP, 0,
  620.     VTFT, 0xffff,
  621.     CVCF, 0xffff,
  622.     PTRX, 0,
  623.     //CPF, 0,
  624.     CCR, 0,
  625.     PSST, 0,
  626.     DSL, 0x10,
  627.     CCCA, 0,
  628.     Z1, 0,
  629.     Z2, 0,
  630.     FXRT, 0xd01c0000,
  631.     ATKHLDM, 0,
  632.     DCYSUSM, 0,
  633.     IFATN, 0xffff,
  634.     PEFE, 0,
  635.     FMMOD, 0,
  636.     TREMFRQ, 24, /* 1 Hz */
  637.     FM2FRQ2, 24, /* 1 Hz */
  638.     TEMPENV, 0,
  639.     /*** These are last so OFF prevents writing ***/
  640.     LFOVAL2, 0,
  641.     LFOVAL1, 0,
  642.     ATKHLDV, 0,
  643.     ENVVOL, 0,
  644.     ENVVAL, 0,
  645.                                     TAGLIST_END);
  646. sblive_writeptr(card, CPF, nCh, 0);
  647. }
  648. /*
  649.  ** Init to 0x02109204 :
  650.  ** Clock accuracy    = 0     (1000ppm)
  651.  ** Sample Rate       = 2     (48kHz)
  652.  ** Audio Channel     = 1     (Left of 2)
  653.  ** Source Number     = 0     (Unspecified)
  654.  ** Generation Status = 1     (Original for Cat Code 12)
  655.  ** Cat Code          = 12    (Digital Signal Mixer)
  656.  ** Mode              = 0     (Mode 0)
  657.  ** Emphasis          = 0     (None)
  658.  ** CP                = 1     (Copyright unasserted)
  659.  ** AN                = 0     (Digital audio)
  660.  ** P                 = 0     (Consumer)
  661.  */
  662. sblive_writeptr_tag(card, 0,
  663.     /* SPDIF0 */
  664.     SPCS0, (SPCS_CLKACCY_1000PPM | 0x002000000 |
  665.     SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
  666.     /* SPDIF1 */
  667.     SPCS1, (SPCS_CLKACCY_1000PPM | 0x002000000 |
  668.     SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
  669.     /* SPDIF2 & SPDIF3 */
  670.     SPCS2, (SPCS_CLKACCY_1000PPM | 0x002000000 |
  671.     SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
  672.     TAGLIST_END);
  673. ret = fx_init(card); /* initialize effects engine */
  674. if (ret < 0)
  675. return ret;
  676. card->tankmem.size = 0;
  677. card->virtualpagetable.size = MAXPAGES * sizeof(u32);
  678. card->virtualpagetable.addr = pci_alloc_consistent(card->pci_dev, card->virtualpagetable.size, &card->virtualpagetable.dma_handle);
  679. if (card->virtualpagetable.addr == NULL) {
  680. ERROR();
  681. ret = -ENOMEM;
  682. goto err0;
  683. }
  684. card->silentpage.size = EMUPAGESIZE;
  685. card->silentpage.addr = pci_alloc_consistent(card->pci_dev, card->silentpage.size, &card->silentpage.dma_handle);
  686. if (card->silentpage.addr == NULL) {
  687. ERROR();
  688. ret = -ENOMEM;
  689. goto err1;
  690. }
  691. for (pagecount = 0; pagecount < MAXPAGES; pagecount++)
  692. ((u32 *) card->virtualpagetable.addr)[pagecount] = cpu_to_le32((card->silentpage.dma_handle * 2) | pagecount);
  693. /* Init page table & tank memory base register */
  694. sblive_writeptr_tag(card, 0,
  695.     PTB, card->virtualpagetable.dma_handle,
  696.     TCB, 0,
  697.     TCBS, 0,
  698.     TAGLIST_END);
  699. for (nCh = 0; nCh < NUM_G; nCh++) {
  700. sblive_writeptr_tag(card, nCh,
  701.     MAPA, MAP_PTI_MASK | (card->silentpage.dma_handle * 2),
  702.     MAPB, MAP_PTI_MASK | (card->silentpage.dma_handle * 2),
  703.     TAGLIST_END);
  704. }
  705. /* Hokay, now enable the AUD bit */
  706. /* Enable Audio = 1 */
  707. /* Mute Disable Audio = 0 */
  708. /* Lock Tank Memory = 1 */
  709. /* Lock Sound Memory = 0 */
  710. /* Auto Mute = 1 */
  711. if (card->model == 0x20 || card->model == 0xc400 ||
  712.   (card->model == 0x21 && card->chiprev < 6))
  713.         emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
  714. else
  715. emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
  716. /* Enable Vol_Ctrl irqs */
  717. emu10k1_irq_enable(card, INTE_VOLINCRENABLE | INTE_VOLDECRENABLE | INTE_MUTEENABLE | INTE_FXDSPENABLE);
  718. /* FIXME: TOSLink detection */
  719. card->has_toslink = 0;
  720. /* Initialize digital passthrough variables */
  721. card->pt.pos_gpr = card->pt.intr_gpr = card->pt.enable_gpr = -1;
  722. card->pt.selected = 0;
  723. card->pt.state = PT_STATE_INACTIVE;
  724. card->pt.spcs_to_use = 0x01;
  725. card->pt.patch_name = "AC3pass";
  726. card->pt.intr_gpr_name = "count";
  727. card->pt.enable_gpr_name = "enable";
  728. card->pt.pos_gpr_name = "ptr";
  729. spin_lock_init(&card->pt.lock);
  730. init_waitqueue_head(&card->pt.wait);
  731. /* tmp = sblive_readfn0(card, HCFG);
  732. if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {
  733. sblive_writefn0(card, HCFG, tmp | 0x800);
  734. udelay(512);
  735. if (tmp != (sblive_readfn0(card, HCFG) & ~0x800)) {
  736. card->has_toslink = 1;
  737. sblive_writefn0(card, HCFG, tmp);
  738. }
  739. }
  740. */
  741. return 0;
  742.   err1:
  743. pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
  744.   err0:
  745. fx_cleanup(&card->mgr);
  746. return ret;
  747. }
  748. static int __devinit emu10k1_init(struct emu10k1_card *card)
  749. {
  750. /* Init Card */
  751. if (hw_init(card) < 0)
  752. return -1;
  753. voice_init(card);
  754. timer_init(card);
  755. addxmgr_init(card);
  756. DPD(2, "  hw control register -> %#xn", emu10k1_readfn0(card, HCFG));
  757. return 0;
  758. }
  759. static void __devinit emu10k1_cleanup(struct emu10k1_card *card)
  760. {
  761. int ch;
  762. emu10k1_writefn0(card, INTE, 0);
  763. /** Shutdown the chip **/
  764. for (ch = 0; ch < NUM_G; ch++)
  765. sblive_writeptr(card, DCYSUSV, ch, 0);
  766. for (ch = 0; ch < NUM_G; ch++) {
  767. sblive_writeptr_tag(card, ch,
  768.     VTFT, 0,
  769.     CVCF, 0,
  770.     PTRX, 0,
  771.     //CPF, 0,
  772.     TAGLIST_END);
  773. sblive_writeptr(card, CPF, ch, 0);
  774. }
  775. /* Disable audio and lock cache */
  776. emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);
  777. sblive_writeptr_tag(card, 0,
  778.                             PTB, 0,
  779.     /* Reset recording buffers */
  780.     MICBS, ADCBS_BUFSIZE_NONE,
  781.     MICBA, 0,
  782.     FXBS, ADCBS_BUFSIZE_NONE,
  783.     FXBA, 0,
  784.     FXWC, 0,
  785.     ADCBS, ADCBS_BUFSIZE_NONE,
  786.     ADCBA, 0,
  787.     TCBS, 0,
  788.     TCB, 0,
  789.     DBG, 0x8000,
  790.     /* Disable channel interrupt */
  791.     CLIEL, 0,
  792.     CLIEH, 0,
  793.     SOLEL, 0,
  794.     SOLEH, 0,
  795.     TAGLIST_END);
  796. pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
  797. pci_free_consistent(card->pci_dev, card->silentpage.size, card->silentpage.addr, card->silentpage.dma_handle);
  798. if(card->tankmem.size != 0)
  799. pci_free_consistent(card->pci_dev, card->tankmem.size, card->tankmem.addr, card->tankmem.dma_handle);
  800. /* release patch storage memory */
  801. fx_cleanup(&card->mgr);
  802. }
  803. /* Driver initialization routine */
  804. static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
  805. {
  806. struct emu10k1_card *card;
  807. u32 subsysvid;
  808. int ret;
  809. if (pci_set_dma_mask(pci_dev, EMU10K1_DMA_MASK)) {
  810. printk(KERN_ERR "emu10k1: architecture does not support 32bit PCI busmaster DMAn");
  811. return -ENODEV;
  812. }
  813. if (pci_enable_device(pci_dev))
  814. return -EIO;
  815. pci_set_master(pci_dev);
  816. if ((card = kmalloc(sizeof(struct emu10k1_card), GFP_KERNEL)) == NULL) {
  817.                 printk(KERN_ERR "emu10k1: out of memoryn");
  818.                 return -ENOMEM;
  819.         }
  820.         memset(card, 0, sizeof(struct emu10k1_card));
  821. card->iobase = pci_resource_start(pci_dev, 0);
  822. card->length = pci_resource_len(pci_dev, 0); 
  823. if (request_region(card->iobase, card->length, card_names[pci_id->driver_data]) == NULL) {
  824. printk(KERN_ERR "emu10k1: IO space in usen");
  825. ret = -EBUSY;
  826. goto err_region;
  827. }
  828. pci_set_drvdata(pci_dev, card);
  829. card->irq = pci_dev->irq;
  830. card->pci_dev = pci_dev;
  831. /* Reserve IRQ Line */
  832. if (request_irq(card->irq, emu10k1_interrupt, SA_SHIRQ, card_names[pci_id->driver_data], card)) {
  833. printk(KERN_ERR "emu10k1: IRQ in usen");
  834. ret = -EBUSY;
  835. goto err_irq;
  836. }
  837. pci_read_config_byte(pci_dev, PCI_REVISION_ID, &card->chiprev);
  838. pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &card->model);
  839. printk(KERN_INFO "emu10k1: %s rev %d model 0x%x found, IO at 0x%04lx-0x%04lx, IRQ %dn",
  840. card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,
  841. card->iobase + card->length - 1, card->irq);
  842. pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);
  843. card->isaps = (subsysvid == EMU_APS_SUBID);
  844. spin_lock_init(&card->lock);
  845. init_MUTEX(&card->open_sem);
  846. card->open_mode = 0;
  847. init_waitqueue_head(&card->open_wait);
  848. ret = emu10k1_audio_init(card);
  849. if(ret < 0) {
  850.                 printk(KERN_ERR "emu10k1: cannot initialize audio devicesn");
  851.                 goto err_audio;
  852.         }
  853. ret = emu10k1_mixer_init(card);
  854. if(ret < 0) {
  855. printk(KERN_ERR "emu10k1: cannot initialize AC97 codecn");
  856.                 goto err_mixer;
  857. }
  858. ret = emu10k1_midi_init(card);
  859. if (ret < 0) {
  860. printk(KERN_ERR "emu10k1: cannot register midi devicen");
  861. goto err_midi;
  862. }
  863. ret = emu10k1_init(card);
  864. if (ret < 0) {
  865. printk(KERN_ERR "emu10k1: cannot initialize devicen");
  866. goto err_emu10k1_init;
  867. }
  868. if (card->isaps)
  869. emu10k1_ecard_init(card);
  870. list_add(&card->list, &emu10k1_devs);
  871. return 0;
  872. err_emu10k1_init:
  873. emu10k1_midi_cleanup(card);
  874. err_midi:
  875. emu10k1_mixer_cleanup(card);
  876. err_mixer:
  877. emu10k1_audio_cleanup(card);
  878. err_audio:
  879. free_irq(card->irq, card);
  880. err_irq:
  881. release_region(card->iobase, card->length);
  882. pci_set_drvdata(pci_dev, NULL);
  883. err_region:
  884. kfree(card);
  885. return ret;
  886. }
  887. static void __devexit emu10k1_remove(struct pci_dev *pci_dev)
  888. {
  889. struct emu10k1_card *card = pci_get_drvdata(pci_dev);
  890. list_del(&card->list);
  891. emu10k1_cleanup(card);
  892. emu10k1_midi_cleanup(card);
  893. emu10k1_mixer_cleanup(card);
  894. emu10k1_audio_cleanup(card);
  895. free_irq(card->irq, card);
  896. release_region(card->iobase, card->length);
  897. kfree(card);
  898. pci_set_drvdata(pci_dev, NULL);
  899. }
  900. MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@opensource.creative.com)");
  901. MODULE_DESCRIPTION("Creative EMU10K1 PCI Audio Driver v" DRIVER_VERSION "nCopyright (C) 1999 Creative Technology Ltd.");
  902. MODULE_LICENSE("GPL");
  903. static struct pci_driver emu10k1_pci_driver = {
  904. name: "emu10k1",
  905. id_table: emu10k1_pci_tbl,
  906. probe: emu10k1_probe,
  907. remove: __devexit_p(emu10k1_remove),
  908. };
  909. static int __init emu10k1_init_module(void)
  910. {
  911. printk(KERN_INFO "Creative EMU10K1 PCI Audio Driver, version " DRIVER_VERSION ", " __TIME__ " " __DATE__ "n");
  912. return pci_module_init(&emu10k1_pci_driver);
  913. }
  914. static void __exit emu10k1_cleanup_module(void)
  915. {
  916. pci_unregister_driver(&emu10k1_pci_driver);
  917. return;
  918. }
  919. module_init(emu10k1_init_module);
  920. module_exit(emu10k1_cleanup_module);
  921. #ifdef EMU10K1_SEQUENCER
  922. /* in midi.c */
  923. extern int emu10k1_seq_midi_open(int dev, int mode, 
  924. void (*input)(int dev, unsigned char midi_byte),
  925. void (*output)(int dev));
  926. extern void emu10k1_seq_midi_close(int dev);
  927. extern int emu10k1_seq_midi_out(int dev, unsigned char midi_byte);
  928. extern int emu10k1_seq_midi_start_read(int dev);
  929. extern int emu10k1_seq_midi_end_read(int dev);
  930. extern void emu10k1_seq_midi_kick(int dev);
  931. extern int emu10k1_seq_midi_buffer_status(int dev);
  932. static struct midi_operations emu10k1_midi_operations =
  933. {
  934. THIS_MODULE,
  935. {"EMU10K1 MIDI", 0, 0, SNDCARD_EMU10K1},
  936. &std_midi_synth,
  937. {0},
  938. emu10k1_seq_midi_open,
  939. emu10k1_seq_midi_close,
  940. NULL,
  941. emu10k1_seq_midi_out,
  942. emu10k1_seq_midi_start_read,
  943. emu10k1_seq_midi_end_read,
  944. emu10k1_seq_midi_kick,
  945. NULL,
  946. emu10k1_seq_midi_buffer_status,
  947. NULL
  948. };
  949. #endif