Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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  *    0.19a Added Support for Audigy Cards
 82  *          Real fix for kernel with highmem support (cast dma_handle to u32).
 83  *          Fix recording buffering parameters calculation.
 84  *          Use unsigned long for variables in bit ops.
 85  *    0.20a Fixed recording startup
 86  *          Fixed timer rate setting (it's a 16-bit register)
 87  *      0.21 Converted code to use pci_name() instead of accessing slot_name
 88  *          directly (Eugene Teo)
 89  *********************************************************************/
 90 
 91 /* These are only included once per module */
 92 #include <linux/module.h>
 93 #include <linux/slab.h>
 94 #include <linux/init.h>
 95 #include <linux/delay.h>
 96 #include <linux/proc_fs.h>
 97 
 98 #include "hwaccess.h"
 99 #include "8010.h"
100 #include "efxmgr.h"
101 #include "cardwo.h"
102 #include "cardwi.h"
103 #include "cardmo.h"
104 #include "cardmi.h"
105 #include "recmgr.h"
106 #include "ecard.h"
107 
108 
109 #ifdef EMU10K1_SEQUENCER
110 #define MIDI_SYNTH_NAME "EMU10K1 MIDI"
111 #define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
112  
113 #include "../sound_config.h"
114 #include "../midi_synth.h"
115 
116 /* this should be in dev_table.h */
117 #define SNDCARD_EMU10K1 46
118 #endif
119  
120 
121 /* the emu10k1 _seems_ to only supports 29 bit (512MiB) bit bus master */
122 #define EMU10K1_DMA_MASK                0x1fffffff      /* DMA buffer mask for pci_alloc_consist */
123 
124 #ifndef PCI_VENDOR_ID_CREATIVE
125 #define PCI_VENDOR_ID_CREATIVE 0x1102
126 #endif
127 
128 #ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1
129 #define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002
130 #endif
131 #ifndef PCI_DEVICE_ID_CREATIVE_AUDIGY
132 #define PCI_DEVICE_ID_CREATIVE_AUDIGY 0x0004
133 #endif
134 
135 #define EMU_APS_SUBID   0x40011102
136  
137 enum {
138         EMU10K1 = 0,
139         AUDIGY,
140 };
141 
142 static char *card_names[] __devinitdata = {
143         "EMU10K1",
144         "Audigy",
145 };
146 
147 static struct pci_device_id emu10k1_pci_tbl[] = {
148         {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1,
149          PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1},
150         {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_AUDIGY,
151          PCI_ANY_ID, PCI_ANY_ID, 0, 0, AUDIGY},
152         {0,}
153 };
154 
155 MODULE_DEVICE_TABLE(pci, emu10k1_pci_tbl);
156 
157 /* Global var instantiation */
158 
159 LIST_HEAD(emu10k1_devs);
160 
161 extern struct file_operations emu10k1_audio_fops;
162 extern struct file_operations emu10k1_mixer_fops;
163 extern struct file_operations emu10k1_midi_fops;
164 
165 #ifdef EMU10K1_SEQUENCER
166 static struct midi_operations emu10k1_midi_operations;
167 #endif
168 
169 extern irqreturn_t emu10k1_interrupt(int, void *, struct pt_regs *s);
170 
171 static int __devinit emu10k1_audio_init(struct emu10k1_card *card)
172 {
173         /* Assign default playback voice parameters */
174         if (card->is_audigy)
175                 card->mchannel_fx = 0;
176         else
177                 card->mchannel_fx = 8;
178 
179 
180         if (card->is_audigy) {
181                 /* mono voice */
182                 card->waveout.send_dcba[SEND_MONO] = 0xffffffff;
183                 card->waveout.send_hgfe[SEND_MONO] = 0x0000ffff;
184         
185                 /* stereo voice */
186                 /* left */
187                 card->waveout.send_dcba[SEND_LEFT] = 0x00ff00ff;
188                 card->waveout.send_hgfe[SEND_LEFT] = 0x00007f7f;        
189                 /* right */
190                 card->waveout.send_dcba[SEND_RIGHT] = 0xff00ff00;
191                 card->waveout.send_hgfe[SEND_RIGHT] = 0x00007f7f;
192 
193                 card->waveout.send_routing[ROUTE_PCM] = 0x03020100; // Regular pcm
194                 card->waveout.send_routing2[ROUTE_PCM] = 0x07060504;
195 
196                 card->waveout.send_routing[ROUTE_PT] = 0x3f3f3d3c; // Passthrough
197                 card->waveout.send_routing2[ROUTE_PT] = 0x3f3f3f3f;
198                 
199                 card->waveout.send_routing[ROUTE_PCM1] = 0x03020100; // Spare
200                 card->waveout.send_routing2[ROUTE_PCM1] = 0x07060404;
201                 
202         } else {
203                 /* mono voice */
204                 card->waveout.send_dcba[SEND_MONO] = 0x0000ffff;
205         
206                 /* stereo voice */
207                 /* left */
208                 card->waveout.send_dcba[SEND_LEFT] = 0x000000ff;
209                 /* right */
210                 card->waveout.send_dcba[SEND_RIGHT] = 0x0000ff00;
211 
212                 card->waveout.send_routing[ROUTE_PCM] = 0x3210; // pcm
213                 card->waveout.send_routing[ROUTE_PT] = 0x3210; // passthrough
214                 card->waveout.send_routing[ROUTE_PCM1] = 0x7654; // /dev/dsp1
215         }
216 
217         /* Assign default recording parameters */
218         /* FIXME */
219         if (card->is_aps)
220                 card->wavein.recsrc = WAVERECORD_FX;
221         else
222                 card->wavein.recsrc = WAVERECORD_AC97;
223 
224         card->wavein.fxwc = 0x0003;
225         return 0;
226 }
227 
228 static void emu10k1_audio_cleanup(struct emu10k1_card *card)
229 {
230 }
231 
232 static int __devinit emu10k1_register_devices(struct emu10k1_card *card)
233 {
234         card->audio_dev = register_sound_dsp(&emu10k1_audio_fops, -1);
235         if (card->audio_dev < 0) {
236                 printk(KERN_ERR "emu10k1: cannot register first audio device!\n");
237                 goto err_dev;
238         }
239 
240         card->audio_dev1 = register_sound_dsp(&emu10k1_audio_fops, -1);
241         if (card->audio_dev1 < 0) {
242                 printk(KERN_ERR "emu10k1: cannot register second audio device!\n");
243                 goto err_dev1;
244         }
245 
246         card->ac97->dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
247         if (card->ac97->dev_mixer < 0) {
248                 printk(KERN_ERR "emu10k1: cannot register mixer device\n");
249                 goto err_mixer;
250         }
251 
252         card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
253         if (card->midi_dev < 0) {
254                 printk(KERN_ERR "emu10k1: cannot register midi device!\n");
255                 goto err_midi;
256         }
257 
258 #ifdef EMU10K1_SEQUENCER
259         card->seq_dev = sound_alloc_mididev();
260         if (card->seq_dev == -1)
261                 printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
262         else {
263                 std_midi_synth.midi_dev = card->seq_dev;
264                 midi_devs[card->seq_dev] = 
265                         (struct midi_operations *)
266                         kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
267 
268                 if (midi_devs[card->seq_dev] == NULL) {
269                         printk(KERN_ERR "emu10k1: unable to allocate memory!");
270                         sound_unload_mididev(card->seq_dev);
271                         card->seq_dev = -1;
272                         /* return without error */
273                 } else {
274                         memcpy((char *)midi_devs[card->seq_dev], 
275                                 (char *)&emu10k1_midi_operations, 
276                                 sizeof(struct midi_operations));
277                         midi_devs[card->seq_dev]->devc = card;
278                         sequencer_init();
279                         card->seq_mididev = NULL;
280                 }
281         }
282 #endif
283         return 0;
284 
285 err_midi:
286         unregister_sound_mixer(card->ac97->dev_mixer);
287 err_mixer:
288         unregister_sound_dsp(card->audio_dev);
289 err_dev1:
290         unregister_sound_dsp(card->audio_dev);
291 err_dev:
292         return -ENODEV;
293 }
294 
295 static void emu10k1_unregister_devices(struct emu10k1_card *card)
296 {
297 #ifdef EMU10K1_SEQUENCER
298         if (card->seq_dev > -1) {
299                 kfree(midi_devs[card->seq_dev]);
300                 midi_devs[card->seq_dev] = NULL;
301                 sound_unload_mididev(card->seq_dev);
302                 card->seq_dev = -1;
303         }
304 #endif
305 
306         unregister_sound_midi(card->midi_dev);
307         unregister_sound_mixer(card->ac97->dev_mixer);
308         unregister_sound_dsp(card->audio_dev1);
309         unregister_sound_dsp(card->audio_dev);
310 }
311 
312 static int emu10k1_info_proc (char *page, char **start, off_t off,
313                               int count, int *eof, void *data)
314 {
315         struct emu10k1_card *card = data;
316         int len = 0;
317         
318         if (card == NULL)
319                 return -ENODEV;
320 
321         len += sprintf (page + len, "Driver Version : %s\n", DRIVER_VERSION);
322         len += sprintf (page + len, "Card type      : %s\n", card->is_aps ? "Aps" : (card->is_audigy ? "Audigy" : "Emu10k1"));
323         len += sprintf (page + len, "Revision       : %d\n", card->chiprev);
324         len += sprintf (page + len, "Model          : %#06x\n", card->model);
325         len += sprintf (page + len, "IO             : %#06lx-%#06lx\n", card->iobase, card->iobase + card->length - 1);
326         len += sprintf (page + len, "IRQ            : %d\n\n", card->irq);
327         
328         len += sprintf (page + len, "Registered /dev Entries:\n");
329         len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev / 16);
330         len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev1 / 16);
331         len += sprintf (page + len, "/dev/mixer%d\n", card->ac97->dev_mixer / 16);
332         len += sprintf (page + len, "/dev/midi%d\n", card->midi_dev / 16);
333 
334 #ifdef EMU10K1_SEQUENCER
335         len += sprintf (page + len, "/dev/sequencer\n");
336 #endif
337 
338         return len;
339 }
340 
341 static int __devinit emu10k1_proc_init(struct emu10k1_card *card)
342 {
343         char s[48];
344 
345         if (!proc_mkdir ("driver/emu10k1", NULL)) {
346                 printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1\n");
347                 goto err_out;
348         }
349 
350         sprintf(s, "driver/emu10k1/%s", pci_name(card->pci_dev));
351         if (!proc_mkdir (s, NULL)) {
352                 printk(KERN_ERR "emu10k1: unable to create proc directory %s\n", s);
353                 goto err_emu10k1_proc;
354         }
355 
356         sprintf(s, "driver/emu10k1/%s/info", pci_name(card->pci_dev));
357         if (!create_proc_read_entry (s, 0, NULL, emu10k1_info_proc, card)) {
358                 printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
359                 goto err_dev_proc;
360         }
361 
362         if (!card->is_aps) {
363                 sprintf(s, "driver/emu10k1/%s/ac97", pci_name(card->pci_dev));
364                 if (!create_proc_read_entry (s, 0, NULL, ac97_read_proc, card->ac97)) {
365                         printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
366                         goto err_proc_ac97;
367                 }
368         }
369 
370         return 0;
371 
372 err_proc_ac97:
373         sprintf(s, "driver/emu10k1/%s/info", pci_name(card->pci_dev));
374         remove_proc_entry(s, NULL);
375 
376 err_dev_proc:
377         sprintf(s, "driver/emu10k1/%s", pci_name(card->pci_dev));
378         remove_proc_entry(s, NULL);
379 
380 err_emu10k1_proc:
381         remove_proc_entry("driver/emu10k1", NULL);
382 
383 err_out:
384         return -EIO;
385 }
386 
387 static void emu10k1_proc_cleanup(struct emu10k1_card *card)
388 {
389         char s[48];
390 
391         if (!card->is_aps) {
392                 sprintf(s, "driver/emu10k1/%s/ac97", pci_name(card->pci_dev));
393                 remove_proc_entry(s, NULL);
394         }
395 
396         sprintf(s, "driver/emu10k1/%s/info", pci_name(card->pci_dev));
397         remove_proc_entry(s, NULL);
398 
399         sprintf(s, "driver/emu10k1/%s", pci_name(card->pci_dev));
400         remove_proc_entry(s, NULL);
401                 
402         remove_proc_entry("driver/emu10k1", NULL);
403 }
404 
405 static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
406 {
407         struct ac97_codec *codec  = ac97_alloc_codec();
408         
409         if(codec == NULL)
410         {
411                 printk(KERN_ERR "emu10k1: cannot allocate mixer\n");
412                 return -EIO;
413         }
414         card->ac97 = codec;
415         card->ac97->private_data = card;
416 
417         if (!card->is_aps) {
418                 card->ac97->id = 0;
419                 card->ac97->codec_read = emu10k1_ac97_read;
420                 card->ac97->codec_write = emu10k1_ac97_write;
421 
422                 if (ac97_probe_codec (card->ac97) == 0) {
423                         printk(KERN_ERR "emu10k1: unable to probe AC97 codec\n");
424                         goto err_out;
425                 }
426                 /* 5.1: Enable the additional AC97 Slots and unmute extra channels on AC97 codec */
427                 if (codec->codec_read(codec, AC97_EXTENDED_ID) & 0x0080){
428                         printk(KERN_INFO "emu10k1: SBLive! 5.1 card detected\n"); 
429                         sblive_writeptr(card, AC97SLOT, 0, AC97SLOT_CNTR | AC97SLOT_LFE);
430                         codec->codec_write(codec, AC97_SURROUND_MASTER, 0x0);
431                 }
432 
433                 // Force 5bit:              
434                 //card->ac97->bit_resolution=5;
435 
436                 /* these will store the original values and never be modified */
437                 card->ac97_supported_mixers = card->ac97->supported_mixers;
438                 card->ac97_stereo_mixers = card->ac97->stereo_mixers;
439         }
440 
441         return 0;
442 
443  err_out:
444         ac97_release_codec(card->ac97);
445         return -EIO;
446 }
447 
448 static void emu10k1_mixer_cleanup(struct emu10k1_card *card)
449 {
450         ac97_release_codec(card->ac97);
451 }
452 
453 static int __devinit emu10k1_midi_init(struct emu10k1_card *card)
454 {
455         int ret;
456 
457         card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
458         if (card->mpuout == NULL) {
459                 printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n");
460                 ret = -ENOMEM;
461                 goto err_out1;
462         }
463 
464         memset(card->mpuout, 0, sizeof(struct emu10k1_mpuout));
465 
466         card->mpuout->intr = 1;
467         card->mpuout->status = FLAGS_AVAILABLE;
468         card->mpuout->state = CARDMIDIOUT_STATE_DEFAULT;
469 
470         tasklet_init(&card->mpuout->tasklet, emu10k1_mpuout_bh, (unsigned long) card);
471 
472         spin_lock_init(&card->mpuout->lock);
473 
474         card->mpuin = kmalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL);
475         if (card->mpuin == NULL) {
476                 printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuin: out of memory\n");
477                 ret = -ENOMEM;
478                 goto err_out2;
479         }
480 
481         memset(card->mpuin, 0, sizeof(struct emu10k1_mpuin));
482 
483         card->mpuin->status = FLAGS_AVAILABLE;
484 
485         tasklet_init(&card->mpuin->tasklet, emu10k1_mpuin_bh, (unsigned long) card->mpuin);
486 
487         spin_lock_init(&card->mpuin->lock);
488 
489         /* Reset the MPU port */
490         if (emu10k1_mpu_reset(card) < 0) {
491                 ERROR();
492                 ret = -EIO;
493                 goto err_out3;
494         }
495 
496         return 0;
497 
498 err_out3:
499         kfree(card->mpuin);
500 err_out2:
501         kfree(card->mpuout);
502 err_out1:
503         return ret;
504 }
505 
506 static void emu10k1_midi_cleanup(struct emu10k1_card *card)
507 {
508         tasklet_kill(&card->mpuout->tasklet);
509         kfree(card->mpuout);
510 
511         tasklet_kill(&card->mpuin->tasklet);
512         kfree(card->mpuin);
513 }
514 
515 static void __devinit voice_init(struct emu10k1_card *card)
516 {
517         int i;
518 
519         for (i = 0; i < NUM_G; i++)
520                 card->voicetable[i] = VOICE_USAGE_FREE;
521 }
522 
523 static void __devinit timer_init(struct emu10k1_card *card)
524 {
525         INIT_LIST_HEAD(&card->timers);
526         card->timer_delay = TIMER_STOPPED;
527         spin_lock_init(&card->timer_lock);
528 }
529 
530 static void __devinit addxmgr_init(struct emu10k1_card *card)
531 {
532         u32 count;
533 
534         for (count = 0; count < MAXPAGES; count++)
535                 card->emupagetable[count] = 0;
536 
537         /* Mark first page as used */
538         /* This page is reserved by the driver */
539         card->emupagetable[0] = 0x8001;
540         card->emupagetable[1] = MAXPAGES - 1;
541 }
542 
543 static void fx_cleanup(struct patch_manager *mgr)
544 {
545         int i;
546         for(i = 0; i < mgr->current_pages; i++)
547                 free_page((unsigned long) mgr->patch[i]);
548 }
549 
550 static int __devinit fx_init(struct emu10k1_card *card)
551 {
552         struct patch_manager *mgr = &card->mgr;
553         struct dsp_patch *patch;
554         struct dsp_rpatch *rpatch;
555         s32 left, right;
556         int i;
557         u32 pc = 0;
558         u32 patch_n=0;
559         struct emu_efx_info_t emu_efx_info[2]=
560                 {{ 20, 10, 0x400, 0x100, 0x20 },
561                  { 24, 12, 0x600, 0x400, 0x60 },
562                 }; 
563                         
564 
565         for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
566                 mgr->ctrl_gpr[i][0] = -1;
567                 mgr->ctrl_gpr[i][1] = -1;
568         }
569 
570 
571         if (card->is_audigy)
572                 mgr->current_pages = (2 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
573         else
574                 /* !! The number below must equal the number of patches, currently 11 !! */
575                 mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
576         
577         for (i = 0; i < mgr->current_pages; i++) {
578                 mgr->patch[i] = (void *)__get_free_page(GFP_KERNEL);
579                 if (mgr->patch[i] == NULL) {
580                         mgr->current_pages = i;
581                         fx_cleanup(mgr);
582                         return -ENOMEM;
583                 }
584                 memset(mgr->patch[i], 0, PAGE_SIZE);
585         }
586 
587         if (card->is_audigy) {
588                 for (i = 0; i < 1024; i++)
589                         OP(0xf, 0x0c0, 0x0c0, 0x0cf, 0x0c0);
590 
591                 for (i = 0; i < 512 ; i++)
592                         sblive_writeptr(card, A_GPR_BASE+i,0,0);
593 
594                 pc=0;
595 
596                 //Pcm input volume
597                 OP(0, 0x402, 0x0c0, 0x406, 0x000);
598                 OP(0, 0x403, 0x0c0, 0x407, 0x001);
599 
600                 //CD-Digital input Volume
601                 OP(0, 0x404, 0x0c0, 0x40d, 0x42);
602                 OP(0, 0x405, 0x0c0, 0x40f, 0x43);
603 
604                 // CD + PCM 
605                 OP(6, 0x400, 0x0c0, 0x402, 0x404);
606                 OP(6, 0x401, 0x0c0, 0x403, 0x405);
607                 
608                 // Front Output + Master Volume
609                 OP(0, 0x68, 0x0c0, 0x408, 0x400);
610                 OP(0, 0x69, 0x0c0, 0x409, 0x401);
611 
612                 // Add-in analog inputs for other speakers
613                 OP(6, 0x400, 0x40, 0x400, 0xc0);
614                 OP(6, 0x401, 0x41, 0x401, 0xc0);
615 
616                 // Digital Front + Master Volume
617                 OP(0, 0x60, 0x0c0, 0x408, 0x400);
618                 OP(0, 0x61, 0x0c0, 0x409, 0x401);
619 
620                 // Rear Output + Rear Volume
621                 OP(0, 0x06e, 0x0c0, 0x419, 0x400);
622                 OP(0, 0x06f, 0x0c0, 0x41a, 0x401);              
623 
624                 // Digital Rear Output + Rear Volume
625                 OP(0, 0x066, 0x0c0, 0x419, 0x400);
626                 OP(0, 0x067, 0x0c0, 0x41a, 0x401);              
627 
628                 // Audigy Drive, Headphone out
629                 OP(6, 0x64, 0x0c0, 0x0c0, 0x400);
630                 OP(6, 0x65, 0x0c0, 0x0c0, 0x401);
631 
632                 // ac97 Recording
633                 OP(6, 0x76, 0x0c0, 0x0c0, 0x40);
634                 OP(6, 0x77, 0x0c0, 0x0c0, 0x41);
635                 
636                 // Center = sub = Left/2 + Right/2
637                 OP(0xe, 0x400, 0x401, 0xcd, 0x400);
638 
639                 // center/sub  Volume (master)
640                 OP(0, 0x06a, 0x0c0, 0x408, 0x400);
641                 OP(0, 0x06b, 0x0c0, 0x409, 0x400);
642 
643                 // Digital center/sub  Volume (master)
644                 OP(0, 0x062, 0x0c0, 0x408, 0x400);
645                 OP(0, 0x063, 0x0c0, 0x409, 0x400);
646 
647                 ROUTING_PATCH_START(rpatch, "Routing");
648                 ROUTING_PATCH_END(rpatch);
649 
650                 /* delimiter patch */
651                 patch = PATCH(mgr, patch_n);
652                 patch->code_size = 0;
653 
654         
655                 sblive_writeptr(card, 0x53, 0, 0);
656         } else {
657                 for (i = 0; i < 512 ; i++)
658                         OP(6, 0x40, 0x40, 0x40, 0x40);
659 
660                 for (i = 0; i < 256; i++)
661                         sblive_writeptr_tag(card, 0,
662                                             FXGPREGBASE + i, 0,
663                                             TANKMEMADDRREGBASE + i, 0,
664                                             TAGLIST_END);
665 
666                 
667                 pc = 0;
668 
669                 //first free GPR = 0x11b
670         
671                 
672                 /* FX volume correction and Volume control*/
673                 INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
674                 GET_OUTPUT_GPR(patch, 0x100, 0x0);
675                 GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
676                 GET_DYNAMIC_GPR(patch, 0x112);
677 
678                 OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4        
679                 OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol      
680                 INPUT_PATCH_END(patch);
681 
682 
683                 INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
684                 GET_OUTPUT_GPR(patch, 0x101, 0x1);
685                 GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
686                 GET_DYNAMIC_GPR(patch, 0x112);
687 
688                 OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
689                 OP(0, 0x101, 0x040, 0x112, 0x107);
690 
691                 INPUT_PATCH_END(patch);
692 
693 
694                 // CD-Digital In Volume control 
695                 INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
696                 GET_OUTPUT_GPR(patch, 0x10c, 0x12);
697                 GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
698 
699                 OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
700                 INPUT_PATCH_END(patch);
701 
702                 INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
703                 GET_OUTPUT_GPR(patch, 0x10e, 0x13);
704                 GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
705 
706                 OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
707                 INPUT_PATCH_END(patch);
708 
709                 //Volume Correction for Multi-channel Inputs    
710                 INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
711                 patch->input=patch->output=0x3F00;
712 
713                 GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
714                 GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
715                 GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
716                 GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
717                 GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
718                 GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
719 
720                 OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
721                 OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
722                 OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
723                 OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
724                 OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
725                 OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
726         
727                 INPUT_PATCH_END(patch);
728 
729 
730                 //Routing patch start   
731                 ROUTING_PATCH_START(rpatch, "Routing");
732                 GET_INPUT_GPR(rpatch, 0x100, 0x0);
733                 GET_INPUT_GPR(rpatch, 0x101, 0x1);
734                 GET_INPUT_GPR(rpatch, 0x10c, 0x12);
735                 GET_INPUT_GPR(rpatch, 0x10e, 0x13);
736                 GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
737                 GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
738                 GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
739                 GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
740                 GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
741                 GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
742 
743                 GET_DYNAMIC_GPR(rpatch, 0x102);
744                 GET_DYNAMIC_GPR(rpatch, 0x103);
745 
746                 GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
747                 GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
748                 GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
749                 GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
750                 
751                 
752                 /* input buffer */
753                 OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
754                 OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
755 
756 
757                 /* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
758                 OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
759 
760                 CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
761                 CONNECT(PCM_IN_L, AC97_FRONT_L);
762                 CONNECT(SPDIF_CD_L, AC97_FRONT_L);
763 
764                 OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
765 
766                 CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
767                 CONNECT(PCM_IN_R, AC97_FRONT_R);
768                 CONNECT(SPDIF_CD_R, AC97_FRONT_R);
769 
770                 /* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
771                 OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
772                 OP(6, 0x104, 0x104, 0x10c, 0x102);
773 
774                 CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
775                 CONNECT(AC97_IN_L, ANALOG_REAR_L);
776                 CONNECT(PCM_IN_L, ANALOG_REAR_L);
777                 CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
778                 CONNECT(PCM1_IN_L, ANALOG_REAR_L);
779 
780                 OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
781                 OP(6, 0x105, 0x105, 0x10e, 0x103);
782 
783                 CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
784                 CONNECT(AC97_IN_R, ANALOG_REAR_R);
785                 CONNECT(PCM_IN_R, ANALOG_REAR_R);
786                 CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
787                 CONNECT(PCM1_IN_R, ANALOG_REAR_R);
788 
789                 /* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
790                 OP(6, 0x10b, 0x100, 0x102, 0x10c);
791                 OP(6, 0x10b, 0x10b, 0x113, 0x40);
792 
793                 CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
794                 CONNECT(PCM_IN_L, DIGITAL_OUT_L);
795                 CONNECT(AC97_IN_L, DIGITAL_OUT_L);
796                 CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
797 
798                 OP(6, 0x10a, 0x101, 0x103, 0x10e);
799                 OP(6, 0x10b, 0x10b, 0x114, 0x40);
800 
801                 CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
802                 CONNECT(PCM_IN_R, DIGITAL_OUT_R);
803                 CONNECT(AC97_IN_R, DIGITAL_OUT_R);
804                 CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
805 
806                 /* AC97 In --> ADC Recording Buffer */
807                 OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
808 
809                 CONNECT(AC97_IN_L, ADC_REC_L);
810 
811                 OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
812 
813                 CONNECT(AC97_IN_R, ADC_REC_R);
814 
815 
816                 /* fx12:Analog-Center */
817                 OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
818                 CONNECT(MULTI_CENTER, ANALOG_CENTER);
819 
820                 /* fx11:Analog-LFE */
821                 OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
822                 CONNECT(MULTI_LFE, ANALOG_LFE);
823 
824                 /* fx12:Digital-Center */
825                 OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
826                 CONNECT(MULTI_CENTER, DIGITAL_CENTER);
827                 
828                 /* fx11:Analog-LFE */
829                 OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
830                 CONNECT(MULTI_LFE, DIGITAL_LFE);
831         
832                 ROUTING_PATCH_END(rpatch);
833 
834 
835                 // Rear volume control  
836                 OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
837                 GET_INPUT_GPR(patch, 0x104, 0x8);
838                 GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
839 
840                 OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
841                 OUTPUT_PATCH_END(patch);
842 
843                 OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
844                 GET_INPUT_GPR(patch, 0x105, 0x9);
845                 GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
846 
847                 OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
848                 OUTPUT_PATCH_END(patch);
849 
850 
851                 //Master volume control on front-digital        
852                 OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
853                 GET_INPUT_GPR(patch, 0x10a, 0x2);
854                 GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
855 
856                 OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
857                 OUTPUT_PATCH_END(patch);
858 
859 
860                 OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
861                 GET_INPUT_GPR(patch, 0x10b, 0x3);
862                 GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
863 
864                 OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
865                 OUTPUT_PATCH_END(patch);
866 
867 
868                 /* delimiter patch */
869                 patch = PATCH(mgr, patch_n);
870                 patch->code_size = 0;
871 
872         
873                 sblive_writeptr(card, DBG, 0, 0);
874         }
875 
876         spin_lock_init(&mgr->lock);
877 
878         // Set up Volume controls, try to keep this the same for both Audigy and Live
879 
880         //Master volume
881         mgr->ctrl_gpr[SOUND_MIXER_VOLUME][0] = 8;
882         mgr->ctrl_gpr[SOUND_MIXER_VOLUME][1] = 9;
883 
884         left = card->ac97->mixer_state[SOUND_MIXER_VOLUME] & 0xff;
885         right = (card->ac97->mixer_state[SOUND_MIXER_VOLUME] >> 8) & 0xff;
886 
887         emu10k1_set_volume_gpr(card, 8, left, 1 << card->ac97->bit_resolution);
888         emu10k1_set_volume_gpr(card, 9, right, 1 << card->ac97->bit_resolution);
889 
890         //Rear volume
891         mgr->ctrl_gpr[ SOUND_MIXER_OGAIN ][0] = 0x19;
892         mgr->ctrl_gpr[ SOUND_MIXER_OGAIN ][1] = 0x1a;
893 
894         left = right = 67;
895         card->ac97->mixer_state[SOUND_MIXER_OGAIN] = (right << 8) | left;
896 
897         card->ac97->supported_mixers |= SOUND_MASK_OGAIN;
898         card->ac97->stereo_mixers |= SOUND_MASK_OGAIN;
899 
900         emu10k1_set_volume_gpr(card, 0x19, left, VOL_5BIT);
901         emu10k1_set_volume_gpr(card, 0x1a, right, VOL_5BIT);
902 
903         //PCM Volume
904         mgr->ctrl_gpr[SOUND_MIXER_PCM][0] = 6;
905         mgr->ctrl_gpr[SOUND_MIXER_PCM][1] = 7;
906 
907         left = card->ac97->mixer_state[SOUND_MIXER_PCM] & 0xff;
908         right = (card->ac97->mixer_state[SOUND_MIXER_PCM] >> 8) & 0xff;
909 
910         emu10k1_set_volume_gpr(card, 6, left, VOL_5BIT);
911         emu10k1_set_volume_gpr(card, 7, right, VOL_5BIT);
912 
913         //CD-Digital Volume
914         mgr->ctrl_gpr[SOUND_MIXER_DIGITAL1][0] = 0xd;
915         mgr->ctrl_gpr[SOUND_MIXER_DIGITAL1][1] = 0xf;
916 
917         left = right = 67;
918         card->ac97->mixer_state[SOUND_MIXER_DIGITAL1] = (right << 8) | left; 
919 
920         card->ac97->supported_mixers |= SOUND_MASK_DIGITAL1;
921         card->ac97->stereo_mixers |= SOUND_MASK_DIGITAL1;
922 
923         emu10k1_set_volume_gpr(card, 0xd, left, VOL_5BIT);
924         emu10k1_set_volume_gpr(card, 0xf, right, VOL_5BIT);
925 
926 
927         //hard wire the ac97's pcm, pcm volume is done above using dsp code.
928         if (card->is_audigy)
929                 //for Audigy, we mute it and use the philips 6 channel DAC instead
930                 emu10k1_ac97_write(card->ac97, 0x18, 0x8000);
931         else
932                 //For the Live we hardwire it to full volume
933                 emu10k1_ac97_write(card->ac97, 0x18, 0x0);
934 
935         //remove it from the ac97_codec's control
936         card->ac97_supported_mixers &= ~SOUND_MASK_PCM;
937         card->ac97_stereo_mixers &= ~SOUND_MASK_PCM;
938 
939         //set Igain to 0dB by default, maybe consider hardwiring it here.
940         emu10k1_ac97_write(card->ac97, AC97_RECORD_GAIN, 0x0000);
941         card->ac97->mixer_state[SOUND_MIXER_IGAIN] = 0x101; 
942 
943         return 0;
944 }
945 
946 static int __devinit hw_init(struct emu10k1_card *card)
947 {
948         int nCh;
949         u32 pagecount; /* tmp */
950         int ret;
951 
952         /* Disable audio and lock cache */
953         emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);
954 
955         /* Reset recording buffers */
956         sblive_writeptr_tag(card, 0,
957                             MICBS, ADCBS_BUFSIZE_NONE,
958                             MICBA, 0,
959                             FXBS, ADCBS_BUFSIZE_NONE,
960                             FXBA, 0,
961                             ADCBS, ADCBS_BUFSIZE_NONE,
962                             ADCBA, 0,
963                             TAGLIST_END);
964 
965         /* Disable channel interrupt */
966         emu10k1_writefn0(card, INTE, 0);
967         sblive_writeptr_tag(card, 0,
968                             CLIEL, 0,
969                             CLIEH, 0,
970                             SOLEL, 0,
971                             SOLEH, 0,
972                             TAGLIST_END);
973 
974         if (card->is_audigy) {
975                 sblive_writeptr_tag(card,0,
976                                     0x5e,0xf00,
977                                     0x5f,0x3,
978                                     TAGLIST_END);
979         }
980 
981         /* Init envelope engine */
982         for (nCh = 0; nCh < NUM_G; nCh++) {
983                 sblive_writeptr_tag(card, nCh,
984                                     DCYSUSV, 0,
985                                     IP, 0,
986                                     VTFT, 0xffff,
987                                     CVCF, 0xffff,
988                                     PTRX, 0,
989                                     //CPF, 0,
990                                     CCR, 0,
991 
992                                     PSST, 0,
993                                     DSL, 0x10,
994                                     CCCA, 0,
995                                     Z1, 0,
996                                     Z2, 0,
997                                     FXRT, 0xd01c0000,
998 
999                                     ATKHLDM, 0,
1000                                     DCYSUSM, 0,
1001                                     IFATN, 0xffff,
1002                                     PEFE, 0,
1003                                     FMMOD, 0,
1004                                     TREMFRQ, 24,        /* 1 Hz */
1005                                     FM2FRQ2, 24,        /* 1 Hz */
1006                                     TEMPENV, 0,
1007 
1008                                     /*** These are last so OFF prevents writing ***/
1009                                     LFOVAL2, 0,
1010                                     LFOVAL1, 0,
1011                                     ATKHLDV, 0,
1012                                     ENVVOL, 0,
1013                                     ENVVAL, 0,
1014                                     TAGLIST_END);
1015                 sblive_writeptr(card, CPF, nCh, 0);
1016                 /*
1017                   Audigy FXRT initialization
1018                   reversed eng'd, may not be accurate.
1019                  */
1020                 if (card->is_audigy) {
1021                         sblive_writeptr_tag(card,nCh,
1022                                             0x4c,0x0,
1023                                             0x4d,0x0,
1024                                             0x4e,0x0,
1025                                             0x4f,0x0,
1026                                             A_FXRT1, 0x3f3f3f3f,
1027                                             A_FXRT2, 0x3f3f3f3f,
1028                                             A_SENDAMOUNTS, 0,
1029                                             TAGLIST_END);
1030                 }
1031         }
1032         
1033 
1034         /*
1035          ** Init to 0x02109204 :
1036          ** Clock accuracy    = 0     (1000ppm)
1037          ** Sample Rate       = 2     (48kHz)
1038          ** Audio Channel     = 1     (Left of 2)
1039          ** Source Number     = 0     (Unspecified)
1040          ** Generation Status = 1     (Original for Cat Code 12)
1041          ** Cat Code          = 12    (Digital Signal Mixer)
1042          ** Mode              = 0     (Mode 0)
1043          ** Emphasis          = 0     (None)
1044          ** CP                = 1     (Copyright unasserted)
1045          ** AN                = 0     (Digital audio)
1046          ** P                 = 0     (Consumer)
1047          */
1048 
1049         sblive_writeptr_tag(card, 0,
1050 
1051                             /* SPDIF0 */
1052                             SPCS0, (SPCS_CLKACCY_1000PPM | 0x002000000 |
1053                                     SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
1054 
1055                             /* SPDIF1 */
1056                             SPCS1, (SPCS_CLKACCY_1000PPM | 0x002000000 |
1057                                     SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
1058 
1059                             /* SPDIF2 & SPDIF3 */
1060                             SPCS2, (SPCS_CLKACCY_1000PPM | 0x002000000 |
1061                                     SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
1062 
1063                             TAGLIST_END);
1064 
1065         if (card->is_audigy && (card->chiprev == 4)) {
1066                 /* Hacks for Alice3 to work independent of haP16V driver */
1067                 u32 tmp;
1068 
1069                 //Setup SRCMulti_I2S SamplingRate
1070                 tmp = sblive_readptr(card, A_SPDIF_SAMPLERATE, 0);
1071                 tmp &= 0xfffff1ff;
1072                 tmp |= (0x2<<9);
1073                 sblive_writeptr(card, A_SPDIF_SAMPLERATE, 0, tmp);
1074 
1075                 /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */
1076                 emu10k1_writefn0(card, 0x20, 0x600000);
1077                 emu10k1_writefn0(card, 0x24, 0x14);
1078 
1079                 /* Setup SRCMulti Input Audio Enable */
1080                 emu10k1_writefn0(card, 0x20, 0x6E0000);
1081                 emu10k1_writefn0(card, 0x24, 0xFF00FF00);
1082         }
1083 
1084         ret = fx_init(card);            /* initialize effects engine */
1085         if (ret < 0)
1086                 return ret;
1087 
1088         card->tankmem.size = 0;
1089 
1090         card->virtualpagetable.size = MAXPAGES * sizeof(u32);
1091 
1092         card->virtualpagetable.addr = pci_alloc_consistent(card->pci_dev, card->virtualpagetable.size, &card->virtualpagetable.dma_handle);
1093         if (card->virtualpagetable.addr == NULL) {
1094                 ERROR();
1095                 ret = -ENOMEM;
1096                 goto err0;
1097         }
1098 
1099         card->silentpage.size = EMUPAGESIZE;
1100 
1101         card->silentpage.addr = pci_alloc_consistent(card->pci_dev, card->silentpage.size, &card->silentpage.dma_handle);
1102         if (card->silentpage.addr == NULL) {
1103                 ERROR();
1104                 ret = -ENOMEM;
1105                 goto err1;
1106         }
1107 
1108         for (pagecount = 0; pagecount < MAXPAGES; pagecount++)
1109                 ((u32 *) card->virtualpagetable.addr)[pagecount] = cpu_to_le32(((u32) card->silentpage.dma_handle * 2) | pagecount);
1110 
1111         /* Init page table & tank memory base register */
1112         sblive_writeptr_tag(card, 0,
1113                             PTB, (u32) card->virtualpagetable.dma_handle,
1114                             TCB, 0,
1115                             TCBS, 0,
1116                             TAGLIST_END);
1117 
1118         for (nCh = 0; nCh < NUM_G; nCh++) {
1119                 sblive_writeptr_tag(card, nCh,
1120                                     MAPA, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),
1121                                     MAPB, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),
1122                                     TAGLIST_END);
1123         }
1124 
1125         /* Hokay, now enable the AUD bit */
1126         /* Enable Audio = 1 */
1127         /* Mute Disable Audio = 0 */
1128         /* Lock Tank Memory = 1 */
1129         /* Lock Sound Memory = 0 */
1130         /* Auto Mute = 1 */
1131         if (card->is_audigy) {
1132                 if (card->chiprev == 4)
1133                         emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AC3ENABLE_CDSPDIF | HCFG_AC3ENABLE_GPSPDIF | HCFG_AUTOMUTE | HCFG_JOYENABLE);
1134                 else
1135                         emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AUTOMUTE | HCFG_JOYENABLE);
1136         } else {
1137                 if (card->model == 0x20 || card->model == 0xc400 ||
1138                  (card->model == 0x21 && card->chiprev < 6))
1139                         emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
1140                 else
1141                         emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
1142         }
1143         /* Enable Vol_Ctrl irqs */
1144         emu10k1_irq_enable(card, INTE_VOLINCRENABLE | INTE_VOLDECRENABLE | INTE_MUTEENABLE | INTE_FXDSPENABLE);
1145 
1146         if (card->is_audigy && (card->chiprev == 4)) {
1147                 /* Unmute Analog now.  Set GPO6 to 1 for Apollo.
1148                  * This has to be done after init ALice3 I2SOut beyond 48KHz.
1149                  * So, sequence is important. */
1150                 u32 tmp = emu10k1_readfn0(card, A_IOCFG);
1151                 tmp |= 0x0040;
1152                 emu10k1_writefn0(card, A_IOCFG, tmp);
1153         }
1154         
1155         /* FIXME: TOSLink detection */
1156         card->has_toslink = 0;
1157 
1158         /* Initialize digital passthrough variables */
1159         card->pt.pos_gpr = card->pt.intr_gpr = card->pt.enable_gpr = -1;
1160         card->pt.selected = 0;
1161         card->pt.state = PT_STATE_INACTIVE;
1162         card->pt.spcs_to_use = 0x01;
1163         card->pt.patch_name = "AC3pass";
1164         card->pt.intr_gpr_name = "count";
1165         card->pt.enable_gpr_name = "enable";
1166         card->pt.pos_gpr_name = "ptr";
1167         spin_lock_init(&card->pt.lock);
1168         init_waitqueue_head(&card->pt.wait);
1169 
1170 /*      tmp = sblive_readfn0(card, HCFG);
1171         if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {
1172                 sblive_writefn0(card, HCFG, tmp | 0x800);
1173 
1174                 udelay(512);
1175 
1176                 if (tmp != (sblive_readfn0(card, HCFG) & ~0x800)) {
1177                         card->has_toslink = 1;
1178                         sblive_writefn0(card, HCFG, tmp);
1179                 }
1180         }
1181 */
1182         return 0;
1183 
1184   err1:
1185         pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
1186   err0:
1187         fx_cleanup(&card->mgr);
1188 
1189         return ret;
1190 }
1191 
1192 static int __devinit emu10k1_init(struct emu10k1_card *card)
1193 {
1194         /* Init Card */
1195         if (hw_init(card) < 0)
1196                 return -1;
1197 
1198         voice_init(card);
1199         timer_init(card);
1200         addxmgr_init(card);
1201 
1202         DPD(2, "  hw control register -> %#x\n", emu10k1_readfn0(card, HCFG));
1203 
1204         return 0;
1205 }
1206 
1207 static void emu10k1_cleanup(struct emu10k1_card *card)
1208 {
1209         int ch;
1210 
1211         emu10k1_writefn0(card, INTE, 0);
1212 
1213         /** Shutdown the chip **/
1214         for (ch = 0; ch < NUM_G; ch++)
1215                 sblive_writeptr(card, DCYSUSV, ch, 0);
1216 
1217         for (ch = 0; ch < NUM_G; ch++) {
1218                 sblive_writeptr_tag(card, ch,
1219                                     VTFT, 0,
1220                                     CVCF, 0,
1221                                     PTRX, 0,
1222                                     //CPF, 0,
1223                                     TAGLIST_END);
1224                 sblive_writeptr(card, CPF, ch, 0);
1225         }
1226 
1227         /* Disable audio and lock cache */
1228         emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);
1229 
1230         sblive_writeptr_tag(card, 0,
1231                             PTB, 0,
1232 
1233                             /* Reset recording buffers */
1234                             MICBS, ADCBS_BUFSIZE_NONE,
1235                             MICBA, 0,
1236                             FXBS, ADCBS_BUFSIZE_NONE,
1237                             FXBA, 0,
1238                             FXWC, 0,
1239                             ADCBS, ADCBS_BUFSIZE_NONE,
1240                             ADCBA, 0,
1241                             TCBS, 0,
1242                             TCB, 0,
1243                             DBG, 0x8000,
1244 
1245                             /* Disable channel interrupt */
1246                             CLIEL, 0,
1247                             CLIEH, 0,
1248                             SOLEL, 0,
1249                             SOLEH, 0,
1250                             TAGLIST_END);
1251 
1252         if (card->is_audigy)
1253                 sblive_writeptr(card, 0, A_DBG,  A_DBG_SINGLE_STEP);
1254 
1255         pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
1256         pci_free_consistent(card->pci_dev, card->silentpage.size, card->silentpage.addr, card->silentpage.dma_handle);
1257         
1258         if(card->tankmem.size != 0)
1259                 pci_free_consistent(card->pci_dev, card->tankmem.size, card->tankmem.addr, card->tankmem.dma_handle);
1260 
1261         /* release patch storage memory */
1262         fx_cleanup(&card->mgr);
1263 }
1264 
1265 /* Driver initialization routine */
1266 static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
1267 {
1268         struct emu10k1_card *card;
1269         u32 subsysvid;
1270         int ret;
1271 
1272         if (pci_set_dma_mask(pci_dev, EMU10K1_DMA_MASK)) {
1273                 printk(KERN_ERR "emu10k1: architecture does not support 29bit PCI busmaster DMA\n");
1274                 return -ENODEV;
1275         }
1276 
1277         if (pci_enable_device(pci_dev))
1278                 return -EIO;
1279 
1280         pci_set_master(pci_dev);
1281 
1282         if ((card = kmalloc(sizeof(struct emu10k1_card), GFP_KERNEL)) == NULL) {
1283                 printk(KERN_ERR "emu10k1: out of memory\n");
1284                 return -ENOMEM;
1285         }
1286         memset(card, 0, sizeof(struct emu10k1_card));
1287 
1288         card->iobase = pci_resource_start(pci_dev, 0);
1289         card->length = pci_resource_len(pci_dev, 0); 
1290 
1291         if (request_region(card->iobase, card->length, card_names[pci_id->driver_data]) == NULL) {
1292                 printk(KERN_ERR "emu10k1: IO space in use\n");
1293                 ret = -EBUSY;
1294                 goto err_region;
1295         }
1296 
1297         pci_set_drvdata(pci_dev, card);
1298 
1299         card->irq = pci_dev->irq;
1300         card->pci_dev = pci_dev;
1301 
1302         /* Reserve IRQ Line */
1303         if (request_irq(card->irq, emu10k1_interrupt, SA_SHIRQ, card_names[pci_id->driver_data], card)) {
1304                 printk(KERN_ERR "emu10k1: IRQ in use\n");
1305                 ret = -EBUSY;
1306                 goto err_irq;
1307         }
1308 
1309         pci_read_config_byte(pci_dev, PCI_REVISION_ID, &card->chiprev);
1310         pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &card->model);
1311 
1312         printk(KERN_INFO "emu10k1: %s rev %d model %#04x found, IO at %#04lx-%#04lx, IRQ %d\n",
1313                 card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,
1314                 card->iobase + card->length - 1, card->irq);
1315 
1316         if (pci_id->device == PCI_DEVICE_ID_CREATIVE_AUDIGY)
1317                 card->is_audigy = 1;
1318 
1319         pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);
1320         card->is_aps = (subsysvid == EMU_APS_SUBID);
1321 
1322         spin_lock_init(&card->lock);
1323         init_MUTEX(&card->open_sem);
1324         card->open_mode = 0;
1325         init_waitqueue_head(&card->open_wait);
1326 
1327         ret = emu10k1_audio_init(card);
1328         if (ret < 0) {
1329                 printk(KERN_ERR "emu10k1: cannot initialize audio devices\n");
1330                 goto err_audio;
1331         }
1332 
1333         ret = emu10k1_mixer_init(card);
1334         if (ret < 0) {
1335                 printk(KERN_ERR "emu10k1: cannot initialize AC97 codec\n");
1336                 goto err_mixer;
1337         }
1338 
1339         ret = emu10k1_midi_init(card);
1340         if (ret < 0) {
1341                 printk(KERN_ERR "emu10k1: cannot register midi device\n");
1342                 goto err_midi;
1343         }
1344 
1345         ret = emu10k1_init(card);
1346         if (ret < 0) {
1347                 printk(KERN_ERR "emu10k1: cannot initialize device\n");
1348                 goto err_emu10k1_init;
1349         }
1350 
1351         if (card->is_aps)
1352                 emu10k1_ecard_init(card);
1353 
1354         ret = emu10k1_register_devices(card);
1355         if (ret < 0)
1356                 goto err_register;
1357 
1358         /* proc entries must be created after registering devices, as
1359          * emu10k1_info_proc prints card->audio_dev &co. */
1360         ret = emu10k1_proc_init(card);
1361         if (ret < 0) {
1362                 printk(KERN_ERR "emu10k1: cannot initialize proc directory\n");
1363                 goto err_proc;
1364         }
1365         
1366         list_add(&card->list, &emu10k1_devs);
1367 
1368         return 0;
1369 
1370 err_proc:
1371         emu10k1_unregister_devices(card);
1372 
1373 err_register:
1374         emu10k1_cleanup(card);
1375         
1376 err_emu10k1_init:
1377         emu10k1_midi_cleanup(card);
1378 
1379 err_midi:
1380         emu10k1_mixer_cleanup(card);
1381 
1382 err_mixer:
1383         emu10k1_audio_cleanup(card);
1384 
1385 err_audio:
1386         free_irq(card->irq, card);
1387 
1388 err_irq:
1389         release_region(card->iobase, card->length);
1390         pci_set_drvdata(pci_dev, NULL);
1391 
1392 err_region:
1393         kfree(card);
1394 
1395         return ret;
1396 }
1397 
1398 static void __devexit emu10k1_remove(struct pci_dev *pci_dev)
1399 {
1400         struct emu10k1_card *card = pci_get_drvdata(pci_dev);
1401 
1402         list_del(&card->list);
1403 
1404         emu10k1_unregister_devices(card);
1405         emu10k1_cleanup(card);
1406         emu10k1_midi_cleanup(card);
1407         emu10k1_mixer_cleanup(card);
1408         emu10k1_proc_cleanup(card);
1409         emu10k1_audio_cleanup(card);    
1410         free_irq(card->irq, card);
1411         release_region(card->iobase, card->length);
1412         kfree(card);
1413         pci_set_drvdata(pci_dev, NULL);
1414 }
1415 
1416 MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@lists.sourceforge.net)");
1417 MODULE_DESCRIPTION("Creative EMU10K1 PCI Audio Driver v" DRIVER_VERSION "\nCopyright (C) 1999 Creative Technology Ltd.");
1418 MODULE_LICENSE("GPL");
1419 
1420 static struct pci_driver emu10k1_pci_driver = {
1421         .name           = "emu10k1",
1422         .id_table       = emu10k1_pci_tbl,
1423         .probe          = emu10k1_probe,
1424         .remove         = __devexit_p(emu10k1_remove),
1425 };
1426 
1427 static int __init emu10k1_init_module(void)
1428 {
1429         printk(KERN_INFO "Creative EMU10K1 PCI Audio Driver, version " DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n");
1430 
1431         return pci_module_init(&emu10k1_pci_driver);
1432 }
1433 
1434 static void __exit emu10k1_cleanup_module(void)
1435 {
1436         pci_unregister_driver(&emu10k1_pci_driver);
1437 
1438         return;
1439 }
1440 
1441 module_init(emu10k1_init_module);
1442 module_exit(emu10k1_cleanup_module);
1443 
1444 #ifdef EMU10K1_SEQUENCER
1445 
1446 /* in midi.c */
1447 extern int emu10k1_seq_midi_open(int dev, int mode, 
1448                                 void (*input)(int dev, unsigned char midi_byte),
1449                                 void (*output)(int dev));
1450 extern void emu10k1_seq_midi_close(int dev);
1451 extern int emu10k1_seq_midi_out(int dev, unsigned char midi_byte);
1452 extern int emu10k1_seq_midi_start_read(int dev);
1453 extern int emu10k1_seq_midi_end_read(int dev);
1454 extern void emu10k1_seq_midi_kick(int dev);
1455 extern int emu10k1_seq_midi_buffer_status(int dev);
1456 
1457 static struct midi_operations emu10k1_midi_operations =
1458 {
1459         THIS_MODULE,
1460         {"EMU10K1 MIDI", 0, 0, SNDCARD_EMU10K1},
1461         &std_midi_synth,
1462         {0},
1463         emu10k1_seq_midi_open,
1464         emu10k1_seq_midi_close,
1465         NULL,
1466         emu10k1_seq_midi_out,
1467         emu10k1_seq_midi_start_read,
1468         emu10k1_seq_midi_end_read,
1469         emu10k1_seq_midi_kick,
1470         NULL,
1471         emu10k1_seq_midi_buffer_status,
1472         NULL
1473 };
1474 
1475 #endif
1476 
  This page was automatically generated by the LXR engine.