linux/sound/oss/sb_common.c
<<
>>
Prefs
   1/*
   2 * sound/oss/sb_common.c
   3 *
   4 * Common routines for Sound Blaster compatible cards.
   5 *
   6 *
   7 * Copyright (C) by Hannu Savolainen 1993-1997
   8 *
   9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
  10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
  11 * for more info.
  12 *
  13 *
  14 * Daniel J. Rodriksson: Modified sbintr to handle 8 and 16 bit interrupts
  15 *                       for full duplex support ( only sb16 by now )
  16 * Rolf Fokkens:         Added (BETA?) support for ES1887 chips.
  17 * (fokkensr@vertis.nl)  Which means: You can adjust the recording levels.
  18 *
  19 * 2000/01/18 - separated sb_card and sb_common -
  20 * Jeff Garzik <jgarzik@pobox.com>
  21 *
  22 * 2000/09/18 - got rid of attach_uart401
  23 * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  24 *
  25 * 2001/01/26 - replaced CLI/STI with spinlocks
  26 * Chris Rankin <rankinc@zipworld.com.au>
  27 */
  28
  29#include <linux/init.h>
  30#include <linux/interrupt.h>
  31#include <linux/module.h>
  32#include <linux/delay.h>
  33#include <linux/spinlock.h>
  34#include <linux/slab.h>
  35
  36#include "sound_config.h"
  37#include "sound_firmware.h"
  38
  39#include "mpu401.h"
  40
  41#include "sb_mixer.h"
  42#include "sb.h"
  43#include "sb_ess.h"
  44
  45/*
  46 * global module flag
  47 */
  48
  49int sb_be_quiet;
  50
  51static sb_devc *detected_devc;  /* For communication from probe to init */
  52static sb_devc *last_devc;      /* For MPU401 initialization */
  53
  54static unsigned char jazz_irq_bits[] = {
  55        0, 0, 2, 3, 0, 1, 0, 4, 0, 2, 5, 0, 0, 0, 0, 6
  56};
  57
  58static unsigned char jazz_dma_bits[] = {
  59        0, 1, 0, 2, 0, 3, 0, 4
  60};
  61
  62void *smw_free;
  63
  64/*
  65 * Jazz16 chipset specific control variables
  66 */
  67
  68static int jazz16_base;                 /* Not detected */
  69static unsigned char jazz16_bits;       /* I/O relocation bits */
  70static DEFINE_SPINLOCK(jazz16_lock);
  71
  72/*
  73 * Logitech Soundman Wave specific initialization code
  74 */
  75
  76#ifdef SMW_MIDI0001_INCLUDED
  77#include "smw-midi0001.h"
  78#else
  79static unsigned char *smw_ucode;
  80static int      smw_ucodeLen;
  81
  82#endif
  83
  84static sb_devc *last_sb;                /* Last sb loaded */
  85
  86int sb_dsp_command(sb_devc * devc, unsigned char val)
  87{
  88        int i;
  89        unsigned long limit;
  90
  91        limit = jiffies + HZ / 10;      /* Timeout */
  92        
  93        /*
  94         * Note! the i<500000 is an emergency exit. The sb_dsp_command() is sometimes
  95         * called while interrupts are disabled. This means that the timer is
  96         * disabled also. However the timeout situation is a abnormal condition.
  97         * Normally the DSP should be ready to accept commands after just couple of
  98         * loops.
  99         */
 100
 101        for (i = 0; i < 500000 && (limit-jiffies)>0; i++)
 102        {
 103                if ((inb(DSP_STATUS) & 0x80) == 0)
 104                {
 105                        outb((val), DSP_COMMAND);
 106                        return 1;
 107                }
 108        }
 109        printk(KERN_WARNING "Sound Blaster:  DSP command(%x) timeout.\n", val);
 110        return 0;
 111}
 112
 113int sb_dsp_get_byte(sb_devc * devc)
 114{
 115        int i;
 116
 117        for (i = 1000; i; i--)
 118        {
 119                if (inb(DSP_DATA_AVAIL) & 0x80)
 120                        return inb(DSP_READ);
 121        }
 122        return 0xffff;
 123}
 124
 125static void sb_intr (sb_devc *devc)
 126{
 127        int status;
 128        unsigned char   src = 0xff;
 129
 130        if (devc->model == MDL_SB16)
 131        {
 132                src = sb_getmixer(devc, IRQ_STAT);      /* Interrupt source register */
 133
 134                if (src & 4)                                            /* MPU401 interrupt */
 135                        if(devc->midi_irq_cookie)
 136                                uart401intr(devc->irq, devc->midi_irq_cookie);
 137
 138                if (!(src & 3))
 139                        return; /* Not a DSP interrupt */
 140        }
 141        if (devc->intr_active && (!devc->fullduplex || (src & 0x01)))
 142        {
 143                switch (devc->irq_mode)
 144                {
 145                        case IMODE_OUTPUT:
 146                                DMAbuf_outputintr(devc->dev, 1);
 147                                break;
 148
 149                        case IMODE_INPUT:
 150                                DMAbuf_inputintr(devc->dev);
 151                                break;
 152
 153                        case IMODE_INIT:
 154                                break;
 155
 156                        case IMODE_MIDI:
 157                                sb_midi_interrupt(devc);
 158                                break;
 159
 160                        default:
 161                                /* printk(KERN_WARNING "Sound Blaster: Unexpected interrupt\n"); */
 162                                ;
 163                }
 164        }
 165        else if (devc->intr_active_16 && (src & 0x02))
 166        {
 167                switch (devc->irq_mode_16)
 168                {
 169                        case IMODE_OUTPUT:
 170                                DMAbuf_outputintr(devc->dev, 1);
 171                                break;
 172
 173                        case IMODE_INPUT:
 174                                DMAbuf_inputintr(devc->dev);
 175                                break;
 176
 177                        case IMODE_INIT:
 178                                break;
 179
 180                        default:
 181                                /* printk(KERN_WARNING "Sound Blaster: Unexpected interrupt\n"); */
 182                                ;
 183                }
 184        }
 185        /*
 186         * Acknowledge interrupts 
 187         */
 188
 189        if (src & 0x01)
 190                status = inb(DSP_DATA_AVAIL);
 191
 192        if (devc->model == MDL_SB16 && src & 0x02)
 193                status = inb(DSP_DATA_AVL16);
 194}
 195
 196static void pci_intr(sb_devc *devc)
 197{
 198        int src = inb(devc->pcibase+0x1A);
 199        src&=3;
 200        if(src)
 201                sb_intr(devc);
 202}
 203
 204static irqreturn_t sbintr(int irq, void *dev_id)
 205{
 206        sb_devc *devc = dev_id;
 207
 208        devc->irq_ok = 1;
 209
 210        switch (devc->model) {
 211        case MDL_ESSPCI:
 212                pci_intr (devc);
 213                break;
 214                
 215        case MDL_ESS:
 216                ess_intr (devc);
 217                break;
 218        default:
 219                sb_intr (devc);
 220                break;
 221        }
 222        return IRQ_HANDLED;
 223}
 224
 225int sb_dsp_reset(sb_devc * devc)
 226{
 227        int loopc;
 228
 229        if (devc->model == MDL_ESS) return ess_dsp_reset (devc);
 230
 231        /* This is only for non-ESS chips */
 232
 233        outb(1, DSP_RESET);
 234
 235        udelay(10);
 236        outb(0, DSP_RESET);
 237        udelay(30);
 238
 239        for (loopc = 0; loopc < 1000 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++);
 240
 241        if (inb(DSP_READ) != 0xAA)
 242        {
 243                DDB(printk("sb: No response to RESET\n"));
 244                return 0;       /* Sorry */
 245        }
 246
 247        return 1;
 248}
 249
 250static void dsp_get_vers(sb_devc * devc)
 251{
 252        int i;
 253
 254        unsigned long   flags;
 255
 256        DDB(printk("Entered dsp_get_vers()\n"));
 257        spin_lock_irqsave(&devc->lock, flags);
 258        devc->major = devc->minor = 0;
 259        sb_dsp_command(devc, 0xe1);     /* Get version */
 260
 261        for (i = 100000; i; i--)
 262        {
 263                if (inb(DSP_DATA_AVAIL) & 0x80)
 264                {
 265                        if (devc->major == 0)
 266                                devc->major = inb(DSP_READ);
 267                        else
 268                        {
 269                                devc->minor = inb(DSP_READ);
 270                                break;
 271                        }
 272                }
 273        }
 274        spin_unlock_irqrestore(&devc->lock, flags);
 275        DDB(printk("DSP version %d.%02d\n", devc->major, devc->minor));
 276}
 277
 278static int sb16_set_dma_hw(sb_devc * devc)
 279{
 280        int bits;
 281
 282        if (devc->dma8 != 0 && devc->dma8 != 1 && devc->dma8 != 3)
 283        {
 284                printk(KERN_ERR "SB16: Invalid 8 bit DMA (%d)\n", devc->dma8);
 285                return 0;
 286        }
 287        bits = (1 << devc->dma8);
 288
 289        if (devc->dma16 >= 5 && devc->dma16 <= 7)
 290                bits |= (1 << devc->dma16);
 291
 292        sb_setmixer(devc, DMA_NR, bits);
 293        return 1;
 294}
 295
 296static void sb16_set_mpu_port(sb_devc * devc, struct address_info *hw_config)
 297{
 298        /*
 299         * This routine initializes new MIDI port setup register of SB Vibra (CT2502).
 300         */
 301        unsigned char   bits = sb_getmixer(devc, 0x84) & ~0x06;
 302
 303        switch (hw_config->io_base)
 304        {
 305                case 0x300:
 306                        sb_setmixer(devc, 0x84, bits | 0x04);
 307                        break;
 308
 309                case 0x330:
 310                        sb_setmixer(devc, 0x84, bits | 0x00);
 311                        break;
 312
 313                default:
 314                        sb_setmixer(devc, 0x84, bits | 0x02);           /* Disable MPU */
 315                        printk(KERN_ERR "SB16: Invalid MIDI I/O port %x\n", hw_config->io_base);
 316        }
 317}
 318
 319static int sb16_set_irq_hw(sb_devc * devc, int level)
 320{
 321        int ival;
 322
 323        switch (level)
 324        {
 325                case 5:
 326                        ival = 2;
 327                        break;
 328                case 7:
 329                        ival = 4;
 330                        break;
 331                case 9:
 332                        ival = 1;
 333                        break;
 334                case 10:
 335                        ival = 8;
 336                        break;
 337                default:
 338                        printk(KERN_ERR "SB16: Invalid IRQ%d\n", level);
 339                        return 0;
 340        }
 341        sb_setmixer(devc, IRQ_NR, ival);
 342        return 1;
 343}
 344
 345static void relocate_Jazz16(sb_devc * devc, struct address_info *hw_config)
 346{
 347        unsigned char bits = 0;
 348        unsigned long flags;
 349
 350        if (jazz16_base != 0 && jazz16_base != hw_config->io_base)
 351                return;
 352
 353        switch (hw_config->io_base)
 354        {
 355                case 0x220:
 356                        bits = 1;
 357                        break;
 358                case 0x240:
 359                        bits = 2;
 360                        break;
 361                case 0x260:
 362                        bits = 3;
 363                        break;
 364                default:
 365                        return;
 366        }
 367        bits = jazz16_bits = bits << 5;
 368        jazz16_base = hw_config->io_base;
 369
 370        /*
 371         *      Magic wake up sequence by writing to 0x201 (aka Joystick port)
 372         */
 373        spin_lock_irqsave(&jazz16_lock, flags);
 374        outb((0xAF), 0x201);
 375        outb((0x50), 0x201);
 376        outb((bits), 0x201);
 377        spin_unlock_irqrestore(&jazz16_lock, flags);
 378}
 379
 380static int init_Jazz16(sb_devc * devc, struct address_info *hw_config)
 381{
 382        char name[100];
 383        /*
 384         * First try to check that the card has Jazz16 chip. It identifies itself
 385         * by returning 0x12 as response to DSP command 0xfa.
 386         */
 387
 388        if (!sb_dsp_command(devc, 0xfa))
 389                return 0;
 390
 391        if (sb_dsp_get_byte(devc) != 0x12)
 392                return 0;
 393
 394        /*
 395         * OK so far. Now configure the IRQ and DMA channel used by the card.
 396         */
 397        if (hw_config->irq < 1 || hw_config->irq > 15 || jazz_irq_bits[hw_config->irq] == 0)
 398        {
 399                printk(KERN_ERR "Jazz16: Invalid interrupt (IRQ%d)\n", hw_config->irq);
 400                return 0;
 401        }
 402        if (hw_config->dma < 0 || hw_config->dma > 3 || jazz_dma_bits[hw_config->dma] == 0)
 403        {
 404                  printk(KERN_ERR "Jazz16: Invalid 8 bit DMA (DMA%d)\n", hw_config->dma);
 405                  return 0;
 406        }
 407        if (hw_config->dma2 < 0)
 408        {
 409                printk(KERN_ERR "Jazz16: No 16 bit DMA channel defined\n");
 410                return 0;
 411        }
 412        if (hw_config->dma2 < 5 || hw_config->dma2 > 7 || jazz_dma_bits[hw_config->dma2] == 0)
 413        {
 414                printk(KERN_ERR "Jazz16: Invalid 16 bit DMA (DMA%d)\n", hw_config->dma2);
 415                return 0;
 416        }
 417        devc->dma16 = hw_config->dma2;
 418
 419        if (!sb_dsp_command(devc, 0xfb))
 420                return 0;
 421
 422        if (!sb_dsp_command(devc, jazz_dma_bits[hw_config->dma] |
 423                        (jazz_dma_bits[hw_config->dma2] << 4)))
 424                return 0;
 425
 426        if (!sb_dsp_command(devc, jazz_irq_bits[hw_config->irq]))
 427                return 0;
 428
 429        /*
 430         * Now we have configured a standard Jazz16 device. 
 431         */
 432        devc->model = MDL_JAZZ;
 433        strcpy(name, "Jazz16");
 434
 435        hw_config->name = "Jazz16";
 436        devc->caps |= SB_NO_MIDI;
 437        return 1;
 438}
 439
 440static void relocate_ess1688(sb_devc * devc)
 441{
 442        unsigned char bits;
 443
 444        switch (devc->base)
 445        {
 446                case 0x220:
 447                        bits = 0x04;
 448                        break;
 449                case 0x230:
 450                        bits = 0x05;
 451                        break;
 452                case 0x240:
 453                        bits = 0x06;
 454                        break;
 455                case 0x250:
 456                        bits = 0x07;
 457                        break;
 458                default:
 459                        return; /* Wrong port */
 460        }
 461
 462        DDB(printk("Doing ESS1688 address selection\n"));
 463        
 464        /*
 465         * ES1688 supports two alternative ways for software address config.
 466         * First try the so called Read-Sequence-Key method.
 467         */
 468
 469        /* Reset the sequence logic */
 470        inb(0x229);
 471        inb(0x229);
 472        inb(0x229);
 473
 474        /* Perform the read sequence */
 475        inb(0x22b);
 476        inb(0x229);
 477        inb(0x22b);
 478        inb(0x229);
 479        inb(0x229);
 480        inb(0x22b);
 481        inb(0x229);
 482
 483        /* Select the base address by reading from it. Then probe using the port. */
 484        inb(devc->base);
 485        if (sb_dsp_reset(devc)) /* Bingo */
 486                return;
 487
 488#if 0                           /* This causes system lockups (Nokia 386/25 at least) */
 489        /*
 490         * The last resort is the system control register method.
 491         */
 492
 493        outb((0x00), 0xfb);     /* 0xFB is the unlock register */
 494        outb((0x00), 0xe0);     /* Select index 0 */
 495        outb((bits), 0xe1);     /* Write the config bits */
 496        outb((0x00), 0xf9);     /* 0xFB is the lock register */
 497#endif
 498}
 499
 500int sb_dsp_detect(struct address_info *hw_config, int pci, int pciio, struct sb_module_options *sbmo)
 501{
 502        sb_devc sb_info;
 503        sb_devc *devc = &sb_info;
 504
 505        memset((char *) &sb_info, 0, sizeof(sb_info));  /* Zero everything */
 506
 507        /* Copy module options in place */
 508        if(sbmo) memcpy(&devc->sbmo, sbmo, sizeof(struct sb_module_options));
 509
 510        sb_info.my_mididev = -1;
 511        sb_info.my_mixerdev = -1;
 512        sb_info.dev = -1;
 513
 514        /*
 515         * Initialize variables 
 516         */
 517        
 518        DDB(printk("sb_dsp_detect(%x) entered\n", hw_config->io_base));
 519
 520        spin_lock_init(&devc->lock);
 521        devc->type = hw_config->card_subtype;
 522
 523        devc->base = hw_config->io_base;
 524        devc->irq = hw_config->irq;
 525        devc->dma8 = hw_config->dma;
 526
 527        devc->dma16 = -1;
 528        devc->pcibase = pciio;
 529        
 530        if(pci == SB_PCI_ESSMAESTRO)
 531        {
 532                devc->model = MDL_ESSPCI;
 533                devc->caps |= SB_PCI_IRQ;
 534                hw_config->driver_use_1 |= SB_PCI_IRQ;
 535                hw_config->card_subtype = MDL_ESSPCI;
 536        }
 537        
 538        if(pci == SB_PCI_YAMAHA)
 539        {
 540                devc->model = MDL_YMPCI;
 541                devc->caps |= SB_PCI_IRQ;
 542                hw_config->driver_use_1 |= SB_PCI_IRQ;
 543                hw_config->card_subtype = MDL_YMPCI;
 544                
 545                printk("Yamaha PCI mode.\n");
 546        }
 547        
 548        if (devc->sbmo.acer)
 549        {
 550                unsigned long flags;
 551
 552                spin_lock_irqsave(&devc->lock, flags);
 553                inb(devc->base + 0x09);
 554                inb(devc->base + 0x09);
 555                inb(devc->base + 0x09);
 556                inb(devc->base + 0x0b);
 557                inb(devc->base + 0x09);
 558                inb(devc->base + 0x0b);
 559                inb(devc->base + 0x09);
 560                inb(devc->base + 0x09);
 561                inb(devc->base + 0x0b);
 562                inb(devc->base + 0x09);
 563                inb(devc->base + 0x00);
 564                spin_unlock_irqrestore(&devc->lock, flags);
 565        }
 566        /*
 567         * Detect the device
 568         */
 569
 570        if (sb_dsp_reset(devc))
 571                dsp_get_vers(devc);
 572        else
 573                devc->major = 0;
 574
 575        if (devc->type == 0 || devc->type == MDL_JAZZ || devc->type == MDL_SMW)
 576                if (devc->major == 0 || (devc->major == 3 && devc->minor == 1))
 577                        relocate_Jazz16(devc, hw_config);
 578
 579        if (devc->major == 0 && (devc->type == MDL_ESS || devc->type == 0))
 580                relocate_ess1688(devc);
 581
 582        if (!sb_dsp_reset(devc))
 583        {
 584                DDB(printk("SB reset failed\n"));
 585#ifdef MODULE
 586                printk(KERN_INFO "sb: dsp reset failed.\n");
 587#endif
 588                return 0;
 589        }
 590        if (devc->major == 0)
 591                dsp_get_vers(devc);
 592
 593        if (devc->major == 3 && devc->minor == 1)
 594        {
 595                if (devc->type == MDL_AZTECH)           /* SG Washington? */
 596                {
 597                        if (sb_dsp_command(devc, 0x09))
 598                                if (sb_dsp_command(devc, 0x00)) /* Enter WSS mode */
 599                                {
 600                                        int i;
 601
 602                                        /* Have some delay */
 603                                        for (i = 0; i < 10000; i++)
 604                                                inb(DSP_DATA_AVAIL);
 605                                        devc->caps = SB_NO_AUDIO | SB_NO_MIDI;  /* Mixer only */
 606                                        devc->model = MDL_AZTECH;
 607                                }
 608                }
 609        }
 610        
 611        if(devc->type == MDL_ESSPCI)
 612                devc->model = MDL_ESSPCI;
 613                
 614        if(devc->type == MDL_YMPCI)
 615        {
 616                printk("YMPCI selected\n");
 617                devc->model = MDL_YMPCI;
 618        }
 619                
 620        /*
 621         * Save device information for sb_dsp_init()
 622         */
 623
 624
 625        detected_devc = kmemdup(devc, sizeof(sb_devc), GFP_KERNEL);
 626        if (detected_devc == NULL)
 627        {
 628                printk(KERN_ERR "sb: Can't allocate memory for device information\n");
 629                return 0;
 630        }
 631        MDB(printk(KERN_INFO "SB %d.%02d detected OK (%x)\n", devc->major, devc->minor, hw_config->io_base));
 632        return 1;
 633}
 634
 635int sb_dsp_init(struct address_info *hw_config, struct module *owner)
 636{
 637        sb_devc *devc;
 638        char name[100];
 639        extern int sb_be_quiet;
 640        int     mixer22, mixer30;
 641        
 642/*
 643 * Check if we had detected a SB device earlier
 644 */
 645        DDB(printk("sb_dsp_init(%x) entered\n", hw_config->io_base));
 646        name[0] = 0;
 647
 648        if (detected_devc == NULL)
 649        {
 650                MDB(printk("No detected device\n"));
 651                return 0;
 652        }
 653        devc = detected_devc;
 654        detected_devc = NULL;
 655
 656        if (devc->base != hw_config->io_base)
 657        {
 658                DDB(printk("I/O port mismatch\n"));
 659                release_region(devc->base, 16);
 660                return 0;
 661        }
 662        /*
 663         * Now continue initialization of the device
 664         */
 665
 666        devc->caps = hw_config->driver_use_1;
 667
 668        if (!((devc->caps & SB_NO_AUDIO) && (devc->caps & SB_NO_MIDI)) && hw_config->irq > 0)
 669        {                       /* IRQ setup */
 670                
 671                /*
 672                 *      ESS PCI cards do shared PCI IRQ stuff. Since they
 673                 *      will get shared PCI irq lines we must cope.
 674                 */
 675                 
 676                int i=(devc->caps&SB_PCI_IRQ)?IRQF_SHARED:0;
 677                
 678                if (request_irq(hw_config->irq, sbintr, i, "soundblaster", devc) < 0)
 679                {
 680                        printk(KERN_ERR "SB: Can't allocate IRQ%d\n", hw_config->irq);
 681                        release_region(devc->base, 16);
 682                        return 0;
 683                }
 684                devc->irq_ok = 0;
 685
 686                if (devc->major == 4)
 687                        if (!sb16_set_irq_hw(devc, devc->irq))  /* Unsupported IRQ */
 688                        {
 689                                free_irq(devc->irq, devc);
 690                                release_region(devc->base, 16);
 691                                return 0;
 692                        }
 693                if ((devc->type == 0 || devc->type == MDL_ESS) &&
 694                        devc->major == 3 && devc->minor == 1)
 695                {               /* Handle various chipsets which claim they are SB Pro compatible */
 696                        if ((devc->type != 0 && devc->type != MDL_ESS) ||
 697                                !ess_init(devc, hw_config))
 698                        {
 699                                if ((devc->type != 0 && devc->type != MDL_JAZZ &&
 700                                         devc->type != MDL_SMW) || !init_Jazz16(devc, hw_config))
 701                                {
 702                                        DDB(printk("This is a genuine SB Pro\n"));
 703                                }
 704                        }
 705                }
 706                if (devc->major == 4 && devc->minor <= 11 )     /* Won't work */
 707                        devc->irq_ok = 1;
 708                else
 709                {
 710                        int n;
 711
 712                        for (n = 0; n < 3 && devc->irq_ok == 0; n++)
 713                        {
 714                                if (sb_dsp_command(devc, 0xf2)) /* Cause interrupt immediately */
 715                                {
 716                                        int i;
 717
 718                                        for (i = 0; !devc->irq_ok && i < 10000; i++);
 719                                }
 720                        }
 721                        if (!devc->irq_ok)
 722                                printk(KERN_WARNING "sb: Interrupt test on IRQ%d failed - Probable IRQ conflict\n", devc->irq);
 723                        else
 724                        {
 725                                DDB(printk("IRQ test OK (IRQ%d)\n", devc->irq));
 726                        }
 727                }
 728        }                       /* IRQ setup */
 729
 730        last_sb = devc;
 731        
 732        switch (devc->major)
 733        {
 734                case 1:         /* SB 1.0 or 1.5 */
 735                        devc->model = hw_config->card_subtype = MDL_SB1;
 736                        break;
 737
 738                case 2:         /* SB 2.x */
 739                        if (devc->minor == 0)
 740                                devc->model = hw_config->card_subtype = MDL_SB2;
 741                        else
 742                                devc->model = hw_config->card_subtype = MDL_SB201;
 743                        break;
 744
 745                case 3:         /* SB Pro and most clones */
 746                        switch (devc->model) {
 747                        case 0:
 748                                devc->model = hw_config->card_subtype = MDL_SBPRO;
 749                                if (hw_config->name == NULL)
 750                                        hw_config->name = "Sound Blaster Pro (8 BIT ONLY)";
 751                                break;
 752                        case MDL_ESS:
 753                                ess_dsp_init(devc, hw_config);
 754                                break;
 755                        }
 756                        break;
 757
 758                case 4:
 759                        devc->model = hw_config->card_subtype = MDL_SB16;
 760                        /* 
 761                         * ALS007 and ALS100 return DSP version 4.2 and have 2 post-reset !=0
 762                         * registers at 0x3c and 0x4c (output ctrl registers on ALS007) whereas
 763                         * a "standard" SB16 doesn't have a register at 0x4c.  ALS100 actively
 764                         * updates register 0x22 whenever 0x30 changes, as per the SB16 spec.
 765                         * Since ALS007 doesn't, this can be used to differentiate the 2 cards.
 766                         */
 767                        if ((devc->minor == 2) && sb_getmixer(devc,0x3c) && sb_getmixer(devc,0x4c)) 
 768                        {
 769                                mixer30 = sb_getmixer(devc,0x30);
 770                                sb_setmixer(devc,0x22,(mixer22=sb_getmixer(devc,0x22)) & 0x0f);
 771                                sb_setmixer(devc,0x30,0xff);
 772                                /* ALS100 will force 0x30 to 0xf8 like SB16; ALS007 will allow 0xff. */
 773                                /* Register 0x22 & 0xf0 on ALS100 == 0xf0; on ALS007 it == 0x10.     */
 774                                if ((sb_getmixer(devc,0x30) != 0xff) || ((sb_getmixer(devc,0x22) & 0xf0) != 0x10)) 
 775                                {
 776                                        devc->submodel = SUBMDL_ALS100;
 777                                        if (hw_config->name == NULL)
 778                                                hw_config->name = "Sound Blaster 16 (ALS-100)";
 779                                }
 780                                else
 781                                {
 782                                        sb_setmixer(devc,0x3c,0x1f);    /* Enable all inputs */
 783                                        sb_setmixer(devc,0x4c,0x1f);
 784                                        sb_setmixer(devc,0x22,mixer22); /* Restore 0x22 to original value */
 785                                        devc->submodel = SUBMDL_ALS007;
 786                                        if (hw_config->name == NULL)
 787                                                hw_config->name = "Sound Blaster 16 (ALS-007)";
 788                                }
 789                                sb_setmixer(devc,0x30,mixer30);
 790                        }
 791                        else if (hw_config->name == NULL)
 792                                hw_config->name = "Sound Blaster 16";
 793
 794                        if (hw_config->dma2 == -1)
 795                                devc->dma16 = devc->dma8;
 796                        else if (hw_config->dma2 < 5 || hw_config->dma2 > 7)
 797                        {
 798                                printk(KERN_WARNING  "SB16: Bad or missing 16 bit DMA channel\n");
 799                                devc->dma16 = devc->dma8;
 800                        }
 801                        else
 802                                devc->dma16 = hw_config->dma2;
 803
 804                        if(!sb16_set_dma_hw(devc)) {
 805                                free_irq(devc->irq, devc);
 806                                release_region(hw_config->io_base, 16);
 807                                return 0;
 808                        }
 809
 810                        devc->caps |= SB_NO_MIDI;
 811        }
 812
 813        if (!(devc->caps & SB_NO_MIXER))
 814                if (devc->major == 3 || devc->major == 4)
 815                        sb_mixer_init(devc, owner);
 816
 817        if (!(devc->caps & SB_NO_MIDI))
 818                sb_dsp_midi_init(devc, owner);
 819
 820        if (hw_config->name == NULL)
 821                hw_config->name = "Sound Blaster (8 BIT/MONO ONLY)";
 822
 823        sprintf(name, "%s (%d.%02d)", hw_config->name, devc->major, devc->minor);
 824        conf_printf(name, hw_config);
 825
 826        /*
 827         * Assuming that a sound card is Sound Blaster (compatible) is the most common
 828         * configuration error and the mother of all problems. Usually sound cards
 829         * emulate SB Pro but in addition they have a 16 bit native mode which should be
 830         * used in Unix. See Readme.cards for more information about configuring OSS/Free
 831         * properly.
 832         */
 833        if (devc->model <= MDL_SBPRO)
 834        {
 835                if (devc->major == 3 && devc->minor != 1)       /* "True" SB Pro should have v3.1 (rare ones may have 3.2). */
 836                {
 837                        printk(KERN_INFO "This sound card may not be fully Sound Blaster Pro compatible.\n");
 838                        printk(KERN_INFO "In many cases there is another way to configure OSS so that\n");
 839                        printk(KERN_INFO "it works properly with OSS (for example in 16 bit mode).\n");
 840                        printk(KERN_INFO "Please ignore this message if you _really_ have a SB Pro.\n");
 841                }
 842                else if (!sb_be_quiet && devc->model == MDL_SBPRO)
 843                {
 844                        printk(KERN_INFO "SB DSP version is just %d.%02d which means that your card is\n", devc->major, devc->minor);
 845                        printk(KERN_INFO "several years old (8 bit only device) or alternatively the sound driver\n");
 846                        printk(KERN_INFO "is incorrectly configured.\n");
 847                }
 848        }
 849        hw_config->card_subtype = devc->model;
 850        hw_config->slots[0]=devc->dev;
 851        last_devc = devc;       /* For SB MPU detection */
 852
 853        if (!(devc->caps & SB_NO_AUDIO) && devc->dma8 >= 0)
 854        {
 855                if (sound_alloc_dma(devc->dma8, "SoundBlaster8"))
 856                {
 857                        printk(KERN_WARNING "Sound Blaster: Can't allocate 8 bit DMA channel %d\n", devc->dma8);
 858                }
 859                if (devc->dma16 >= 0 && devc->dma16 != devc->dma8)
 860                {
 861                        if (sound_alloc_dma(devc->dma16, "SoundBlaster16"))
 862                                printk(KERN_WARNING "Sound Blaster:  can't allocate 16 bit DMA channel %d.\n", devc->dma16);
 863                }
 864                sb_audio_init(devc, name, owner);
 865                hw_config->slots[0]=devc->dev;
 866        }
 867        else
 868        {
 869                MDB(printk("Sound Blaster:  no audio devices found.\n"));
 870        }
 871        return 1;
 872}
 873
 874/* if (sbmpu) below we allow mpu401 to manage the midi devs
 875   otherwise we have to unload them. (Andrzej Krzysztofowicz) */
 876   
 877void sb_dsp_unload(struct address_info *hw_config, int sbmpu)
 878{
 879        sb_devc *devc;
 880
 881        devc = audio_devs[hw_config->slots[0]]->devc;
 882
 883        if (devc && devc->base == hw_config->io_base)
 884        {
 885                if ((devc->model & MDL_ESS) && devc->pcibase)
 886                        release_region(devc->pcibase, 8);
 887
 888                release_region(devc->base, 16);
 889
 890                if (!(devc->caps & SB_NO_AUDIO))
 891                {
 892                        sound_free_dma(devc->dma8);
 893                        if (devc->dma16 >= 0)
 894                                sound_free_dma(devc->dma16);
 895                }
 896                if (!(devc->caps & SB_NO_AUDIO && devc->caps & SB_NO_MIDI))
 897                {
 898                        if (devc->irq > 0)
 899                                free_irq(devc->irq, devc);
 900
 901                        sb_mixer_unload(devc);
 902                        /* We don't have to do this bit any more the UART401 is its own
 903                                master  -- Krzysztof Halasa */
 904                        /* But we have to do it, if UART401 is not detected */
 905                        if (!sbmpu)
 906                                sound_unload_mididev(devc->my_mididev);
 907                        sound_unload_audiodev(devc->dev);
 908                }
 909                kfree(devc);
 910        }
 911        else
 912                release_region(hw_config->io_base, 16);
 913
 914        kfree(detected_devc);
 915}
 916
 917/*
 918 *      Mixer access routines
 919 *
 920 *      ES1887 modifications: some mixer registers reside in the
 921 *      range above 0xa0. These must be accessed in another way.
 922 */
 923
 924void sb_setmixer(sb_devc * devc, unsigned int port, unsigned int value)
 925{
 926        unsigned long flags;
 927
 928        if (devc->model == MDL_ESS) {
 929                ess_setmixer (devc, port, value);
 930                return;
 931        }
 932
 933        spin_lock_irqsave(&devc->lock, flags);
 934
 935        outb(((unsigned char) (port & 0xff)), MIXER_ADDR);
 936        udelay(20);
 937        outb(((unsigned char) (value & 0xff)), MIXER_DATA);
 938        udelay(20);
 939
 940        spin_unlock_irqrestore(&devc->lock, flags);
 941}
 942
 943unsigned int sb_getmixer(sb_devc * devc, unsigned int port)
 944{
 945        unsigned int val;
 946        unsigned long flags;
 947
 948        if (devc->model == MDL_ESS) return ess_getmixer (devc, port);
 949
 950        spin_lock_irqsave(&devc->lock, flags);
 951
 952        outb(((unsigned char) (port & 0xff)), MIXER_ADDR);
 953        udelay(20);
 954        val = inb(MIXER_DATA);
 955        udelay(20);
 956
 957        spin_unlock_irqrestore(&devc->lock, flags);
 958
 959        return val;
 960}
 961
 962void sb_chgmixer
 963        (sb_devc * devc, unsigned int reg, unsigned int mask, unsigned int val)
 964{
 965        int value;
 966
 967        value = sb_getmixer(devc, reg);
 968        value = (value & ~mask) | (val & mask);
 969        sb_setmixer(devc, reg, value);
 970}
 971
 972/*
 973 *      MPU401 MIDI initialization.
 974 */
 975
 976static void smw_putmem(sb_devc * devc, int base, int addr, unsigned char val)
 977{
 978        unsigned long flags;
 979
 980        spin_lock_irqsave(&jazz16_lock, flags);  /* NOT the SB card? */
 981
 982        outb((addr & 0xff), base + 1);  /* Low address bits */
 983        outb((addr >> 8), base + 2);    /* High address bits */
 984        outb((val), base);      /* Data */
 985
 986        spin_unlock_irqrestore(&jazz16_lock, flags);
 987}
 988
 989static unsigned char smw_getmem(sb_devc * devc, int base, int addr)
 990{
 991        unsigned long flags;
 992        unsigned char val;
 993
 994        spin_lock_irqsave(&jazz16_lock, flags);  /* NOT the SB card? */
 995
 996        outb((addr & 0xff), base + 1);  /* Low address bits */
 997        outb((addr >> 8), base + 2);    /* High address bits */
 998        val = inb(base);        /* Data */
 999
1000        spin_unlock_irqrestore(&jazz16_lock, flags);
1001        return val;
1002}
1003
1004static int smw_midi_init(sb_devc * devc, struct address_info *hw_config)
1005{
1006        int mpu_base = hw_config->io_base;
1007        int mp_base = mpu_base + 4;             /* Microcontroller base */
1008        int i;
1009        unsigned char control;
1010
1011
1012        /*
1013         *  Reset the microcontroller so that the RAM can be accessed
1014         */
1015
1016        control = inb(mpu_base + 7);
1017        outb((control | 3), mpu_base + 7);      /* Set last two bits to 1 (?) */
1018        outb(((control & 0xfe) | 2), mpu_base + 7);     /* xxxxxxx0 resets the mc */
1019
1020        mdelay(3);      /* Wait at least 1ms */
1021
1022        outb((control & 0xfc), mpu_base + 7);   /* xxxxxx00 enables RAM */
1023
1024        /*
1025         *  Detect microcontroller by probing the 8k RAM area
1026         */
1027        smw_putmem(devc, mp_base, 0, 0x00);
1028        smw_putmem(devc, mp_base, 1, 0xff);
1029        udelay(10);
1030
1031        if (smw_getmem(devc, mp_base, 0) != 0x00 || smw_getmem(devc, mp_base, 1) != 0xff)
1032        {
1033                DDB(printk("SM Wave: No microcontroller RAM detected (%02x, %02x)\n", smw_getmem(devc, mp_base, 0), smw_getmem(devc, mp_base, 1)));
1034                return 0;       /* No RAM */
1035        }
1036        /*
1037         *  There is RAM so assume it's really a SM Wave
1038         */
1039
1040        devc->model = MDL_SMW;
1041        smw_mixer_init(devc);
1042
1043#ifdef MODULE
1044        if (!smw_ucode)
1045        {
1046                smw_ucodeLen = mod_firmware_load("/etc/sound/midi0001.bin", (void *) &smw_ucode);
1047                smw_free = smw_ucode;
1048        }
1049#endif
1050        if (smw_ucodeLen > 0)
1051        {
1052                if (smw_ucodeLen != 8192)
1053                {
1054                        printk(KERN_ERR "SM Wave: Invalid microcode (MIDI0001.BIN) length\n");
1055                        return 1;
1056                }
1057                /*
1058                 *  Download microcode
1059                 */
1060
1061                for (i = 0; i < 8192; i++)
1062                        smw_putmem(devc, mp_base, i, smw_ucode[i]);
1063
1064                /*
1065                 *  Verify microcode
1066                 */
1067
1068                for (i = 0; i < 8192; i++)
1069                        if (smw_getmem(devc, mp_base, i) != smw_ucode[i])
1070                        {
1071                                printk(KERN_ERR "SM Wave: Microcode verification failed\n");
1072                                return 0;
1073                        }
1074        }
1075        control = 0;
1076#ifdef SMW_SCSI_IRQ
1077        /*
1078         * Set the SCSI interrupt (IRQ2/9, IRQ3 or IRQ10). The SCSI interrupt
1079         * is disabled by default.
1080         *
1081         * FIXME - make this a module option
1082         *
1083         * BTW the Zilog 5380 SCSI controller is located at MPU base + 0x10.
1084         */
1085        {
1086                static unsigned char scsi_irq_bits[] = {
1087                        0, 0, 3, 1, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0
1088                };
1089                control |= scsi_irq_bits[SMW_SCSI_IRQ] << 6;
1090        }
1091#endif
1092
1093#ifdef SMW_OPL4_ENABLE
1094        /*
1095         *  Make the OPL4 chip visible on the PC bus at 0x380.
1096         *
1097         *  There is no need to enable this feature since this driver
1098         *  doesn't support OPL4 yet. Also there is no RAM in SM Wave so
1099         *  enabling OPL4 is pretty useless.
1100         */
1101        control |= 0x10;        /* Uses IRQ12 if bit 0x20 == 0 */
1102        /* control |= 0x20;      Uncomment this if you want to use IRQ7 */
1103#endif
1104        outb((control | 0x03), mpu_base + 7);   /* xxxxxx11 restarts */
1105        hw_config->name = "SoundMan Wave";
1106        return 1;
1107}
1108
1109static int init_Jazz16_midi(sb_devc * devc, struct address_info *hw_config)
1110{
1111        int mpu_base = hw_config->io_base;
1112        int sb_base = devc->base;
1113        int irq = hw_config->irq;
1114
1115        unsigned char bits = 0;
1116        unsigned long flags;
1117
1118        if (irq < 0)
1119                irq *= -1;
1120
1121        if (irq < 1 || irq > 15 ||
1122            jazz_irq_bits[irq] == 0)
1123        {
1124                printk(KERN_ERR "Jazz16: Invalid MIDI interrupt (IRQ%d)\n", irq);
1125                return 0;
1126        }
1127        switch (sb_base)
1128        {
1129                case 0x220:
1130                        bits = 1;
1131                        break;
1132                case 0x240:
1133                        bits = 2;
1134                        break;
1135                case 0x260:
1136                        bits = 3;
1137                        break;
1138                default:
1139                        return 0;
1140        }
1141        bits = jazz16_bits = bits << 5;
1142        switch (mpu_base)
1143        {
1144                case 0x310:
1145                        bits |= 1;
1146                        break;
1147                case 0x320:
1148                        bits |= 2;
1149                        break;
1150                case 0x330:
1151                        bits |= 3;
1152                        break;
1153                default:
1154                        printk(KERN_ERR "Jazz16: Invalid MIDI I/O port %x\n", mpu_base);
1155                        return 0;
1156        }
1157        /*
1158         *      Magic wake up sequence by writing to 0x201 (aka Joystick port)
1159         */
1160        spin_lock_irqsave(&jazz16_lock, flags);
1161        outb(0xAF, 0x201);
1162        outb(0x50, 0x201);
1163        outb(bits, 0x201);
1164        spin_unlock_irqrestore(&jazz16_lock, flags);
1165
1166        hw_config->name = "Jazz16";
1167        smw_midi_init(devc, hw_config);
1168
1169        if (!sb_dsp_command(devc, 0xfb))
1170                return 0;
1171
1172        if (!sb_dsp_command(devc, jazz_dma_bits[devc->dma8] |
1173                            (jazz_dma_bits[devc->dma16] << 4)))
1174                return 0;
1175
1176        if (!sb_dsp_command(devc, jazz_irq_bits[devc->irq] |
1177                            (jazz_irq_bits[irq] << 4)))
1178                return 0;
1179
1180        return 1;
1181}
1182
1183int probe_sbmpu(struct address_info *hw_config, struct module *owner)
1184{
1185        sb_devc *devc = last_devc;
1186        int ret;
1187
1188        if (last_devc == NULL)
1189                return 0;
1190
1191        last_devc = NULL;
1192
1193        if (hw_config->io_base <= 0)
1194        {
1195                /* The real vibra16 is fine about this, but we have to go
1196                   wipe up after Cyrix again */
1197                           
1198                if(devc->model == MDL_SB16 && devc->minor >= 12)
1199                {
1200                        unsigned char   bits = sb_getmixer(devc, 0x84) & ~0x06;
1201                        sb_setmixer(devc, 0x84, bits | 0x02);           /* Disable MPU */
1202                }
1203                return 0;
1204        }
1205
1206#if defined(CONFIG_SOUND_MPU401)
1207        if (devc->model == MDL_ESS)
1208        {
1209                struct resource *ports;
1210                ports = request_region(hw_config->io_base, 2, "mpu401");
1211                if (!ports) {
1212                        printk(KERN_ERR "sbmpu: I/O port conflict (%x)\n", hw_config->io_base);
1213                        return 0;
1214                }
1215                if (!ess_midi_init(devc, hw_config)) {
1216                        release_region(hw_config->io_base, 2);
1217                        return 0;
1218                }
1219                hw_config->name = "ESS1xxx MPU";
1220                devc->midi_irq_cookie = NULL;
1221                if (!probe_mpu401(hw_config, ports)) {
1222                        release_region(hw_config->io_base, 2);
1223                        return 0;
1224                }
1225                attach_mpu401(hw_config, owner);
1226                if (last_sb->irq == -hw_config->irq)
1227                        last_sb->midi_irq_cookie =
1228                                (void *)(long) hw_config->slots[1];
1229                return 1;
1230        }
1231#endif
1232
1233        switch (devc->model)
1234        {
1235                case MDL_SB16:
1236                        if (hw_config->io_base != 0x300 && hw_config->io_base != 0x330)
1237                        {
1238                                printk(KERN_ERR "SB16: Invalid MIDI port %x\n", hw_config->io_base);
1239                                return 0;
1240                        }
1241                        hw_config->name = "Sound Blaster 16";
1242                        if (hw_config->irq < 3 || hw_config->irq == devc->irq)
1243                                hw_config->irq = -devc->irq;
1244                        if (devc->minor > 12)           /* What is Vibra's version??? */
1245                                sb16_set_mpu_port(devc, hw_config);
1246                        break;
1247
1248                case MDL_JAZZ:
1249                        if (hw_config->irq < 3 || hw_config->irq == devc->irq)
1250                                hw_config->irq = -devc->irq;
1251                        if (!init_Jazz16_midi(devc, hw_config))
1252                                return 0;
1253                        break;
1254
1255                case MDL_YMPCI:
1256                        hw_config->name = "Yamaha PCI Legacy";
1257                        printk("Yamaha PCI legacy UART401 check.\n");
1258                        break;
1259                default:
1260                        return 0;
1261        }
1262        
1263        ret = probe_uart401(hw_config, owner);
1264        if (ret)
1265                last_sb->midi_irq_cookie=midi_devs[hw_config->slots[4]]->devc;
1266        return ret;
1267}
1268
1269void unload_sbmpu(struct address_info *hw_config)
1270{
1271#if defined(CONFIG_SOUND_MPU401)
1272        if (!strcmp (hw_config->name, "ESS1xxx MPU")) {
1273                unload_mpu401(hw_config);
1274                return;
1275        }
1276#endif
1277        unload_uart401(hw_config);
1278}
1279
1280EXPORT_SYMBOL(sb_dsp_init);
1281EXPORT_SYMBOL(sb_dsp_detect);
1282EXPORT_SYMBOL(sb_dsp_unload);
1283EXPORT_SYMBOL(sb_be_quiet);
1284EXPORT_SYMBOL(probe_sbmpu);
1285EXPORT_SYMBOL(unload_sbmpu);
1286EXPORT_SYMBOL(smw_free);
1287MODULE_LICENSE("GPL");
1288