Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Driver for Yamaha OPL3-SA[2,3] soundcards
0004  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
0005  */
0006 
0007 #include <linux/init.h>
0008 #include <linux/err.h>
0009 #include <linux/isa.h>
0010 #include <linux/interrupt.h>
0011 #include <linux/pm.h>
0012 #include <linux/pnp.h>
0013 #include <linux/module.h>
0014 #include <linux/io.h>
0015 #include <sound/core.h>
0016 #include <sound/wss.h>
0017 #include <sound/mpu401.h>
0018 #include <sound/opl3.h>
0019 #include <sound/initval.h>
0020 #include <sound/tlv.h>
0021 
0022 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
0023 MODULE_DESCRIPTION("Yamaha OPL3SA2+");
0024 MODULE_LICENSE("GPL");
0025 
0026 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;  /* Index 0-MAX */
0027 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;   /* ID for this card */
0028 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
0029 #ifdef CONFIG_PNP
0030 static bool isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
0031 #endif
0032 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0xf86,0x370,0x100 */
0033 static long sb_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;  /* 0x220,0x240,0x260 */
0034 static long wss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;/* 0x530,0xe80,0xf40,0x604 */
0035 static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;  /* 0x388 */
0036 static long midi_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;/* 0x330,0x300 */
0037 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;    /* 0,1,3,5,9,11,12,15 */
0038 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;   /* 1,3,5,6,7 */
0039 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;   /* 1,3,5,6,7 */
0040 static int opl3sa3_ymode[SNDRV_CARDS];   /* 0,1,2,3 */ /*SL Added*/
0041 
0042 module_param_array(index, int, NULL, 0444);
0043 MODULE_PARM_DESC(index, "Index value for OPL3-SA soundcard.");
0044 module_param_array(id, charp, NULL, 0444);
0045 MODULE_PARM_DESC(id, "ID string for OPL3-SA soundcard.");
0046 module_param_array(enable, bool, NULL, 0444);
0047 MODULE_PARM_DESC(enable, "Enable OPL3-SA soundcard.");
0048 #ifdef CONFIG_PNP
0049 module_param_array(isapnp, bool, NULL, 0444);
0050 MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
0051 #endif
0052 module_param_hw_array(port, long, ioport, NULL, 0444);
0053 MODULE_PARM_DESC(port, "Port # for OPL3-SA driver.");
0054 module_param_hw_array(sb_port, long, ioport, NULL, 0444);
0055 MODULE_PARM_DESC(sb_port, "SB port # for OPL3-SA driver.");
0056 module_param_hw_array(wss_port, long, ioport, NULL, 0444);
0057 MODULE_PARM_DESC(wss_port, "WSS port # for OPL3-SA driver.");
0058 module_param_hw_array(fm_port, long, ioport, NULL, 0444);
0059 MODULE_PARM_DESC(fm_port, "FM port # for OPL3-SA driver.");
0060 module_param_hw_array(midi_port, long, ioport, NULL, 0444);
0061 MODULE_PARM_DESC(midi_port, "MIDI port # for OPL3-SA driver.");
0062 module_param_hw_array(irq, int, irq, NULL, 0444);
0063 MODULE_PARM_DESC(irq, "IRQ # for OPL3-SA driver.");
0064 module_param_hw_array(dma1, int, dma, NULL, 0444);
0065 MODULE_PARM_DESC(dma1, "DMA1 # for OPL3-SA driver.");
0066 module_param_hw_array(dma2, int, dma, NULL, 0444);
0067 MODULE_PARM_DESC(dma2, "DMA2 # for OPL3-SA driver.");
0068 module_param_array(opl3sa3_ymode, int, NULL, 0444);
0069 MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi.");
0070 
0071 #ifdef CONFIG_PNP
0072 static int isa_registered;
0073 static int pnp_registered;
0074 static int pnpc_registered;
0075 #endif
0076 
0077 /* control ports */
0078 #define OPL3SA2_PM_CTRL     0x01
0079 #define OPL3SA2_SYS_CTRL        0x02
0080 #define OPL3SA2_IRQ_CONFIG  0x03
0081 #define OPL3SA2_IRQ_STATUS  0x04
0082 #define OPL3SA2_DMA_CONFIG  0x06
0083 #define OPL3SA2_MASTER_LEFT 0x07
0084 #define OPL3SA2_MASTER_RIGHT    0x08
0085 #define OPL3SA2_MIC     0x09
0086 #define OPL3SA2_MISC        0x0A
0087 
0088 /* opl3sa3 only */
0089 #define OPL3SA3_DGTL_DOWN   0x12
0090 #define OPL3SA3_ANLG_DOWN   0x13
0091 #define OPL3SA3_WIDE        0x14
0092 #define OPL3SA3_BASS        0x15
0093 #define OPL3SA3_TREBLE      0x16
0094 
0095 /* power management bits */
0096 #define OPL3SA2_PM_ADOWN        0x20
0097 #define OPL3SA2_PM_PSV      0x04        
0098 #define OPL3SA2_PM_PDN      0x02
0099 #define OPL3SA2_PM_PDX      0x01
0100 
0101 #define OPL3SA2_PM_D0   0x00
0102 #define OPL3SA2_PM_D3   (OPL3SA2_PM_ADOWN|OPL3SA2_PM_PSV|OPL3SA2_PM_PDN|OPL3SA2_PM_PDX)
0103 
0104 struct snd_opl3sa2 {
0105     int version;        /* 2 or 3 */
0106     unsigned long port; /* control port */
0107     struct resource *res_port; /* control port resource */
0108     int irq;
0109     int single_dma;
0110     spinlock_t reg_lock;
0111     struct snd_hwdep *synth;
0112     struct snd_rawmidi *rmidi;
0113     struct snd_wss *wss;
0114     unsigned char ctlregs[0x20];
0115     int ymode;      /* SL added */
0116     struct snd_kcontrol *master_switch;
0117     struct snd_kcontrol *master_volume;
0118 };
0119 
0120 #define PFX "opl3sa2: "
0121 
0122 #ifdef CONFIG_PNP
0123 
0124 static const struct pnp_device_id snd_opl3sa2_pnpbiosids[] = {
0125     { .id = "YMH0021" },
0126     { .id = "NMX2210" },    /* Gateway Solo 2500 */
0127     { .id = "" }        /* end */
0128 };
0129 
0130 MODULE_DEVICE_TABLE(pnp, snd_opl3sa2_pnpbiosids);
0131 
0132 static const struct pnp_card_device_id snd_opl3sa2_pnpids[] = {
0133     /* Yamaha YMF719E-S (Genius Sound Maker 3DX) */
0134     { .id = "YMH0020", .devs = { { "YMH0021" } } },
0135     /* Yamaha OPL3-SA3 (integrated on Intel's Pentium II AL440LX motherboard) */
0136     { .id = "YMH0030", .devs = { { "YMH0021" } } },
0137     /* Yamaha OPL3-SA2 */
0138     { .id = "YMH0800", .devs = { { "YMH0021" } } },
0139     /* Yamaha OPL3-SA2 */
0140     { .id = "YMH0801", .devs = { { "YMH0021" } } },
0141     /* NeoMagic MagicWave 3DX */
0142     { .id = "NMX2200", .devs = { { "YMH2210" } } },
0143     /* NeoMagic MagicWave 3D */
0144     { .id = "NMX2200", .devs = { { "NMX2210" } } },
0145     /* --- */
0146     { .id = "" }    /* end */
0147 };
0148 
0149 MODULE_DEVICE_TABLE(pnp_card, snd_opl3sa2_pnpids);
0150 
0151 #endif /* CONFIG_PNP */
0152 
0153 
0154 /* read control port (w/o spinlock) */
0155 static unsigned char __snd_opl3sa2_read(struct snd_opl3sa2 *chip, unsigned char reg)
0156 {
0157     unsigned char result;
0158 #if 0
0159     outb(0x1d, port);   /* password */
0160     printk(KERN_DEBUG "read [0x%lx] = 0x%x\n", port, inb(port));
0161 #endif
0162     outb(reg, chip->port);  /* register */
0163     result = inb(chip->port + 1);
0164 #if 0
0165     printk(KERN_DEBUG "read [0x%lx] = 0x%x [0x%x]\n",
0166            port, result, inb(port));
0167 #endif
0168     return result;
0169 }
0170 
0171 /* read control port (with spinlock) */
0172 static unsigned char snd_opl3sa2_read(struct snd_opl3sa2 *chip, unsigned char reg)
0173 {
0174     unsigned long flags;
0175     unsigned char result;
0176 
0177     spin_lock_irqsave(&chip->reg_lock, flags);
0178     result = __snd_opl3sa2_read(chip, reg);
0179     spin_unlock_irqrestore(&chip->reg_lock, flags);
0180     return result;
0181 }
0182 
0183 /* write control port (w/o spinlock) */
0184 static void __snd_opl3sa2_write(struct snd_opl3sa2 *chip, unsigned char reg, unsigned char value)
0185 {
0186 #if 0
0187     outb(0x1d, port);   /* password */
0188 #endif
0189     outb(reg, chip->port);  /* register */
0190     outb(value, chip->port + 1);
0191     chip->ctlregs[reg] = value;
0192 }
0193 
0194 /* write control port (with spinlock) */
0195 static void snd_opl3sa2_write(struct snd_opl3sa2 *chip, unsigned char reg, unsigned char value)
0196 {
0197     unsigned long flags;
0198     spin_lock_irqsave(&chip->reg_lock, flags);
0199     __snd_opl3sa2_write(chip, reg, value);
0200     spin_unlock_irqrestore(&chip->reg_lock, flags);
0201 }
0202 
0203 static int snd_opl3sa2_detect(struct snd_card *card)
0204 {
0205     struct snd_opl3sa2 *chip = card->private_data;
0206     unsigned long port;
0207     unsigned char tmp, tmp1;
0208     char str[2];
0209 
0210     port = chip->port;
0211     chip->res_port = devm_request_region(card->dev, port, 2,
0212                          "OPL3-SA control");
0213     if (!chip->res_port) {
0214         snd_printk(KERN_ERR PFX "can't grab port 0x%lx\n", port);
0215         return -EBUSY;
0216     }
0217     /*
0218     snd_printk(KERN_DEBUG "REG 0A = 0x%x\n",
0219            snd_opl3sa2_read(chip, 0x0a));
0220     */
0221     chip->version = 0;
0222     tmp = snd_opl3sa2_read(chip, OPL3SA2_MISC);
0223     if (tmp == 0xff) {
0224         snd_printd("OPL3-SA [0x%lx] detect = 0x%x\n", port, tmp);
0225         return -ENODEV;
0226     }
0227     switch (tmp & 0x07) {
0228     case 0x01:
0229         chip->version = 2; /* YMF711 */
0230         break;
0231     default:
0232         chip->version = 3;
0233         /* 0x02 - standard */
0234         /* 0x03 - YM715B */
0235         /* 0x04 - YM719 - OPL-SA4? */
0236         /* 0x05 - OPL3-SA3 - Libretto 100 */
0237         /* 0x07 - unknown - Neomagic MagicWave 3D */
0238         break;
0239     }
0240     str[0] = chip->version + '0';
0241     str[1] = 0;
0242     strcat(card->shortname, str);
0243     snd_opl3sa2_write(chip, OPL3SA2_MISC, tmp ^ 7);
0244     tmp1 = snd_opl3sa2_read(chip, OPL3SA2_MISC);
0245     if (tmp1 != tmp) {
0246         snd_printd("OPL3-SA [0x%lx] detect (1) = 0x%x (0x%x)\n", port, tmp, tmp1);
0247         return -ENODEV;
0248     }
0249     /* try if the MIC register is accessible */
0250     tmp = snd_opl3sa2_read(chip, OPL3SA2_MIC);
0251     snd_opl3sa2_write(chip, OPL3SA2_MIC, 0x8a);
0252     tmp1 = snd_opl3sa2_read(chip, OPL3SA2_MIC);
0253     if ((tmp1 & 0x9f) != 0x8a) {
0254         snd_printd("OPL3-SA [0x%lx] detect (2) = 0x%x (0x%x)\n", port, tmp, tmp1);
0255         return -ENODEV;
0256     }
0257     snd_opl3sa2_write(chip, OPL3SA2_MIC, 0x9f);
0258     /* initialization */
0259     /* Power Management - full on */
0260     snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
0261     if (chip->version > 2) {
0262         /* ymode is bits 4&5 (of 0 to 7) on all but opl3sa2 versions */
0263         snd_opl3sa2_write(chip, OPL3SA2_SYS_CTRL, (chip->ymode << 4));
0264     } else {
0265         /* default for opl3sa2 versions */
0266         snd_opl3sa2_write(chip, OPL3SA2_SYS_CTRL, 0x00);
0267     }
0268     snd_opl3sa2_write(chip, OPL3SA2_IRQ_CONFIG, 0x0d);  /* Interrupt Channel Configuration - IRQ A = OPL3 + MPU + WSS */
0269     if (chip->single_dma) {
0270         snd_opl3sa2_write(chip, OPL3SA2_DMA_CONFIG, 0x03);  /* DMA Configuration - DMA A = WSS-R + WSS-P */
0271     } else {
0272         snd_opl3sa2_write(chip, OPL3SA2_DMA_CONFIG, 0x21);  /* DMA Configuration - DMA B = WSS-R, DMA A = WSS-P */
0273     }
0274     snd_opl3sa2_write(chip, OPL3SA2_MISC, 0x80 | (tmp & 7));    /* Miscellaneous - default */
0275     if (chip->version > 2) {
0276         snd_opl3sa2_write(chip, OPL3SA3_DGTL_DOWN, 0x00);   /* Digital Block Partial Power Down - default */
0277         snd_opl3sa2_write(chip, OPL3SA3_ANLG_DOWN, 0x00);   /* Analog Block Partial Power Down - default */
0278     }
0279     return 0;
0280 }
0281 
0282 static irqreturn_t snd_opl3sa2_interrupt(int irq, void *dev_id)
0283 {
0284     unsigned short status;
0285     struct snd_card *card = dev_id;
0286     struct snd_opl3sa2 *chip;
0287     int handled = 0;
0288 
0289     if (card == NULL)
0290         return IRQ_NONE;
0291 
0292     chip = card->private_data;
0293     status = snd_opl3sa2_read(chip, OPL3SA2_IRQ_STATUS);
0294 
0295     if (status & 0x20) {
0296         handled = 1;
0297         snd_opl3_interrupt(chip->synth);
0298     }
0299 
0300     if ((status & 0x10) && chip->rmidi != NULL) {
0301         handled = 1;
0302         snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
0303     }
0304 
0305     if (status & 0x07) {    /* TI,CI,PI */
0306         handled = 1;
0307         snd_wss_interrupt(irq, chip->wss);
0308     }
0309 
0310     if (status & 0x40) { /* hardware volume change */
0311         handled = 1;
0312         /* reading from Master Lch register at 0x07 clears this bit */
0313         snd_opl3sa2_read(chip, OPL3SA2_MASTER_RIGHT);
0314         snd_opl3sa2_read(chip, OPL3SA2_MASTER_LEFT);
0315         if (chip->master_switch && chip->master_volume) {
0316             snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
0317                     &chip->master_switch->id);
0318             snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
0319                     &chip->master_volume->id);
0320         }
0321     }
0322     return IRQ_RETVAL(handled);
0323 }
0324 
0325 #define OPL3SA2_SINGLE(xname, xindex, reg, shift, mask, invert) \
0326 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
0327   .info = snd_wss_info_single, \
0328   .get = snd_opl3sa2_get_single, .put = snd_opl3sa2_put_single, \
0329   .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
0330 #define OPL3SA2_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
0331 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
0332   .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
0333   .name = xname, .index = xindex, \
0334   .info = snd_wss_info_single, \
0335   .get = snd_opl3sa2_get_single, .put = snd_opl3sa2_put_single, \
0336   .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
0337   .tlv = { .p = (xtlv) } }
0338 
0339 static int snd_opl3sa2_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0340 {
0341     struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);
0342     unsigned long flags;
0343     int reg = kcontrol->private_value & 0xff;
0344     int shift = (kcontrol->private_value >> 8) & 0xff;
0345     int mask = (kcontrol->private_value >> 16) & 0xff;
0346     int invert = (kcontrol->private_value >> 24) & 0xff;
0347 
0348     spin_lock_irqsave(&chip->reg_lock, flags);
0349     ucontrol->value.integer.value[0] = (chip->ctlregs[reg] >> shift) & mask;
0350     spin_unlock_irqrestore(&chip->reg_lock, flags);
0351     if (invert)
0352         ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
0353     return 0;
0354 }
0355 
0356 static int snd_opl3sa2_put_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0357 {
0358     struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);
0359     unsigned long flags;
0360     int reg = kcontrol->private_value & 0xff;
0361     int shift = (kcontrol->private_value >> 8) & 0xff;
0362     int mask = (kcontrol->private_value >> 16) & 0xff;
0363     int invert = (kcontrol->private_value >> 24) & 0xff;
0364     int change;
0365     unsigned short val, oval;
0366     
0367     val = (ucontrol->value.integer.value[0] & mask);
0368     if (invert)
0369         val = mask - val;
0370     val <<= shift;
0371     spin_lock_irqsave(&chip->reg_lock, flags);
0372     oval = chip->ctlregs[reg];
0373     val = (oval & ~(mask << shift)) | val;
0374     change = val != oval;
0375     __snd_opl3sa2_write(chip, reg, val);
0376     spin_unlock_irqrestore(&chip->reg_lock, flags);
0377     return change;
0378 }
0379 
0380 #define OPL3SA2_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
0381 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
0382   .info = snd_wss_info_double, \
0383   .get = snd_opl3sa2_get_double, .put = snd_opl3sa2_put_double, \
0384   .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
0385 #define OPL3SA2_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
0386 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
0387   .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
0388   .name = xname, .index = xindex, \
0389   .info = snd_wss_info_double, \
0390   .get = snd_opl3sa2_get_double, .put = snd_opl3sa2_put_double, \
0391   .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
0392   .tlv = { .p = (xtlv) } }
0393 
0394 static int snd_opl3sa2_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0395 {
0396     struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);
0397     unsigned long flags;
0398     int left_reg = kcontrol->private_value & 0xff;
0399     int right_reg = (kcontrol->private_value >> 8) & 0xff;
0400     int shift_left = (kcontrol->private_value >> 16) & 0x07;
0401     int shift_right = (kcontrol->private_value >> 19) & 0x07;
0402     int mask = (kcontrol->private_value >> 24) & 0xff;
0403     int invert = (kcontrol->private_value >> 22) & 1;
0404     
0405     spin_lock_irqsave(&chip->reg_lock, flags);
0406     ucontrol->value.integer.value[0] = (chip->ctlregs[left_reg] >> shift_left) & mask;
0407     ucontrol->value.integer.value[1] = (chip->ctlregs[right_reg] >> shift_right) & mask;
0408     spin_unlock_irqrestore(&chip->reg_lock, flags);
0409     if (invert) {
0410         ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
0411         ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
0412     }
0413     return 0;
0414 }
0415 
0416 static int snd_opl3sa2_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0417 {
0418     struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);
0419     unsigned long flags;
0420     int left_reg = kcontrol->private_value & 0xff;
0421     int right_reg = (kcontrol->private_value >> 8) & 0xff;
0422     int shift_left = (kcontrol->private_value >> 16) & 0x07;
0423     int shift_right = (kcontrol->private_value >> 19) & 0x07;
0424     int mask = (kcontrol->private_value >> 24) & 0xff;
0425     int invert = (kcontrol->private_value >> 22) & 1;
0426     int change;
0427     unsigned short val1, val2, oval1, oval2;
0428     
0429     val1 = ucontrol->value.integer.value[0] & mask;
0430     val2 = ucontrol->value.integer.value[1] & mask;
0431     if (invert) {
0432         val1 = mask - val1;
0433         val2 = mask - val2;
0434     }
0435     val1 <<= shift_left;
0436     val2 <<= shift_right;
0437     spin_lock_irqsave(&chip->reg_lock, flags);
0438     if (left_reg != right_reg) {
0439         oval1 = chip->ctlregs[left_reg];
0440         oval2 = chip->ctlregs[right_reg];
0441         val1 = (oval1 & ~(mask << shift_left)) | val1;
0442         val2 = (oval2 & ~(mask << shift_right)) | val2;
0443         change = val1 != oval1 || val2 != oval2;
0444         __snd_opl3sa2_write(chip, left_reg, val1);
0445         __snd_opl3sa2_write(chip, right_reg, val2);
0446     } else {
0447         oval1 = chip->ctlregs[left_reg];
0448         val1 = (oval1 & ~((mask << shift_left) | (mask << shift_right))) | val1 | val2;
0449         change = val1 != oval1;
0450         __snd_opl3sa2_write(chip, left_reg, val1);
0451     }
0452     spin_unlock_irqrestore(&chip->reg_lock, flags);
0453     return change;
0454 }
0455 
0456 static const DECLARE_TLV_DB_SCALE(db_scale_master, -3000, 200, 0);
0457 static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0);
0458 
0459 static const struct snd_kcontrol_new snd_opl3sa2_controls[] = {
0460 OPL3SA2_DOUBLE("Master Playback Switch", 0, 0x07, 0x08, 7, 7, 1, 1),
0461 OPL3SA2_DOUBLE_TLV("Master Playback Volume", 0, 0x07, 0x08, 0, 0, 15, 1,
0462            db_scale_master),
0463 OPL3SA2_SINGLE("Mic Playback Switch", 0, 0x09, 7, 1, 1),
0464 OPL3SA2_SINGLE_TLV("Mic Playback Volume", 0, 0x09, 0, 31, 1,
0465            db_scale_5bit_12db_max),
0466 OPL3SA2_SINGLE("ZV Port Switch", 0, 0x02, 0, 1, 0),
0467 };
0468 
0469 static const struct snd_kcontrol_new snd_opl3sa2_tone_controls[] = {
0470 OPL3SA2_DOUBLE("3D Control - Wide", 0, 0x14, 0x14, 4, 0, 7, 0),
0471 OPL3SA2_DOUBLE("Tone Control - Bass", 0, 0x15, 0x15, 4, 0, 7, 0),
0472 OPL3SA2_DOUBLE("Tone Control - Treble", 0, 0x16, 0x16, 4, 0, 7, 0)
0473 };
0474 
0475 static void snd_opl3sa2_master_free(struct snd_kcontrol *kcontrol)
0476 {
0477     struct snd_opl3sa2 *chip = snd_kcontrol_chip(kcontrol);
0478     chip->master_switch = NULL;
0479     chip->master_volume = NULL;
0480 }
0481 
0482 static int snd_opl3sa2_mixer(struct snd_card *card)
0483 {
0484     struct snd_opl3sa2 *chip = card->private_data;
0485     struct snd_ctl_elem_id id1, id2;
0486     struct snd_kcontrol *kctl;
0487     unsigned int idx;
0488     int err;
0489 
0490     memset(&id1, 0, sizeof(id1));
0491     memset(&id2, 0, sizeof(id2));
0492     id1.iface = id2.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
0493     /* reassign AUX0 to CD */
0494         strcpy(id1.name, "Aux Playback Switch");
0495         strcpy(id2.name, "CD Playback Switch");
0496     err = snd_ctl_rename_id(card, &id1, &id2);
0497     if (err < 0) {
0498         snd_printk(KERN_ERR "Cannot rename opl3sa2 control\n");
0499                 return err;
0500     }
0501         strcpy(id1.name, "Aux Playback Volume");
0502         strcpy(id2.name, "CD Playback Volume");
0503     err = snd_ctl_rename_id(card, &id1, &id2);
0504     if (err < 0) {
0505         snd_printk(KERN_ERR "Cannot rename opl3sa2 control\n");
0506                 return err;
0507     }
0508     /* reassign AUX1 to FM */
0509         strcpy(id1.name, "Aux Playback Switch"); id1.index = 1;
0510         strcpy(id2.name, "FM Playback Switch");
0511     err = snd_ctl_rename_id(card, &id1, &id2);
0512     if (err < 0) {
0513         snd_printk(KERN_ERR "Cannot rename opl3sa2 control\n");
0514                 return err;
0515     }
0516         strcpy(id1.name, "Aux Playback Volume");
0517         strcpy(id2.name, "FM Playback Volume");
0518     err = snd_ctl_rename_id(card, &id1, &id2);
0519     if (err < 0) {
0520         snd_printk(KERN_ERR "Cannot rename opl3sa2 control\n");
0521                 return err;
0522     }
0523     /* add OPL3SA2 controls */
0524     for (idx = 0; idx < ARRAY_SIZE(snd_opl3sa2_controls); idx++) {
0525         kctl = snd_ctl_new1(&snd_opl3sa2_controls[idx], chip);
0526         err = snd_ctl_add(card, kctl);
0527         if (err < 0)
0528             return err;
0529         switch (idx) {
0530         case 0: chip->master_switch = kctl; kctl->private_free = snd_opl3sa2_master_free; break;
0531         case 1: chip->master_volume = kctl; kctl->private_free = snd_opl3sa2_master_free; break;
0532         }
0533     }
0534     if (chip->version > 2) {
0535         for (idx = 0; idx < ARRAY_SIZE(snd_opl3sa2_tone_controls); idx++) {
0536             err = snd_ctl_add(card, snd_ctl_new1(&snd_opl3sa2_tone_controls[idx], chip));
0537             if (err < 0)
0538                 return err;
0539         }
0540     }
0541     return 0;
0542 }
0543 
0544 /* Power Management support functions */
0545 #ifdef CONFIG_PM
0546 static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)
0547 {
0548     if (card) {
0549         struct snd_opl3sa2 *chip = card->private_data;
0550 
0551         snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
0552         chip->wss->suspend(chip->wss);
0553         /* power down */
0554         snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
0555     }
0556 
0557     return 0;
0558 }
0559 
0560 static int snd_opl3sa2_resume(struct snd_card *card)
0561 {
0562     struct snd_opl3sa2 *chip;
0563     int i;
0564 
0565     if (!card)
0566         return 0;
0567 
0568     chip = card->private_data;
0569     /* power up */
0570     snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
0571 
0572     /* restore registers */
0573     for (i = 2; i <= 0x0a; i++) {
0574         if (i != OPL3SA2_IRQ_STATUS)
0575             snd_opl3sa2_write(chip, i, chip->ctlregs[i]);
0576     }
0577     if (chip->version > 2) {
0578         for (i = 0x12; i <= 0x16; i++)
0579             snd_opl3sa2_write(chip, i, chip->ctlregs[i]);
0580     }
0581     /* restore wss */
0582     chip->wss->resume(chip->wss);
0583 
0584     snd_power_change_state(card, SNDRV_CTL_POWER_D0);
0585     return 0;
0586 }
0587 #endif /* CONFIG_PM */
0588 
0589 #ifdef CONFIG_PNP
0590 static int snd_opl3sa2_pnp(int dev, struct snd_opl3sa2 *chip,
0591                struct pnp_dev *pdev)
0592 {
0593     if (pnp_activate_dev(pdev) < 0) {
0594         snd_printk(KERN_ERR "PnP configure failure (out of resources?)\n");
0595         return -EBUSY;
0596     }
0597     sb_port[dev] = pnp_port_start(pdev, 0);
0598     wss_port[dev] = pnp_port_start(pdev, 1);
0599     fm_port[dev] = pnp_port_start(pdev, 2);
0600     midi_port[dev] = pnp_port_start(pdev, 3);
0601     port[dev] = pnp_port_start(pdev, 4);
0602     dma1[dev] = pnp_dma(pdev, 0);
0603     dma2[dev] = pnp_dma(pdev, 1);
0604     irq[dev] = pnp_irq(pdev, 0);
0605     snd_printdd("%sPnP OPL3-SA: sb port=0x%lx, wss port=0x%lx, fm port=0x%lx, midi port=0x%lx\n",
0606         pnp_device_is_pnpbios(pdev) ? "BIOS" : "ISA", sb_port[dev], wss_port[dev], fm_port[dev], midi_port[dev]);
0607     snd_printdd("%sPnP OPL3-SA: control port=0x%lx, dma1=%i, dma2=%i, irq=%i\n",
0608         pnp_device_is_pnpbios(pdev) ? "BIOS" : "ISA", port[dev], dma1[dev], dma2[dev], irq[dev]);
0609     return 0;
0610 }
0611 #endif /* CONFIG_PNP */
0612 
0613 static int snd_opl3sa2_card_new(struct device *pdev, int dev,
0614                 struct snd_card **cardp)
0615 {
0616     struct snd_card *card;
0617     struct snd_opl3sa2 *chip;
0618     int err;
0619 
0620     err = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE,
0621                 sizeof(struct snd_opl3sa2), &card);
0622     if (err < 0)
0623         return err;
0624     strcpy(card->driver, "OPL3SA2");
0625     strcpy(card->shortname, "Yamaha OPL3-SA");
0626     chip = card->private_data;
0627     spin_lock_init(&chip->reg_lock);
0628     chip->irq = -1;
0629     *cardp = card;
0630     return 0;
0631 }
0632 
0633 static int snd_opl3sa2_probe(struct snd_card *card, int dev)
0634 {
0635     int xirq, xdma1, xdma2;
0636     struct snd_opl3sa2 *chip;
0637     struct snd_wss *wss;
0638     struct snd_opl3 *opl3;
0639     int err;
0640 
0641     /* initialise this card from supplied (or default) parameter*/ 
0642     chip = card->private_data;
0643     chip->ymode = opl3sa3_ymode[dev] & 0x03 ;
0644     chip->port = port[dev];
0645     xirq = irq[dev];
0646     xdma1 = dma1[dev];
0647     xdma2 = dma2[dev];
0648     if (xdma2 < 0)
0649         chip->single_dma = 1;
0650     err = snd_opl3sa2_detect(card);
0651     if (err < 0)
0652         return err;
0653     err = devm_request_irq(card->dev, xirq, snd_opl3sa2_interrupt, 0,
0654                    "OPL3-SA2", card);
0655     if (err) {
0656         snd_printk(KERN_ERR PFX "can't grab IRQ %d\n", xirq);
0657         return -ENODEV;
0658     }
0659     chip->irq = xirq;
0660     card->sync_irq = chip->irq;
0661     err = snd_wss_create(card,
0662                  wss_port[dev] + 4, -1,
0663                  xirq, xdma1, xdma2,
0664                  WSS_HW_OPL3SA2, WSS_HWSHARE_IRQ, &wss);
0665     if (err < 0) {
0666         snd_printd("Oops, WSS not detected at 0x%lx\n", wss_port[dev] + 4);
0667         return err;
0668     }
0669     chip->wss = wss;
0670     err = snd_wss_pcm(wss, 0);
0671     if (err < 0)
0672         return err;
0673     err = snd_wss_mixer(wss);
0674     if (err < 0)
0675         return err;
0676     err = snd_opl3sa2_mixer(card);
0677     if (err < 0)
0678         return err;
0679     err = snd_wss_timer(wss, 0);
0680     if (err < 0)
0681         return err;
0682     if (fm_port[dev] >= 0x340 && fm_port[dev] < 0x400) {
0683         err = snd_opl3_create(card, fm_port[dev],
0684                       fm_port[dev] + 2,
0685                       OPL3_HW_OPL3, 0, &opl3);
0686         if (err < 0)
0687             return err;
0688         err = snd_opl3_timer_new(opl3, 1, 2);
0689         if (err < 0)
0690             return err;
0691         err = snd_opl3_hwdep_new(opl3, 0, 1, &chip->synth);
0692         if (err < 0)
0693             return err;
0694     }
0695     if (midi_port[dev] >= 0x300 && midi_port[dev] < 0x340) {
0696         err = snd_mpu401_uart_new(card, 0, MPU401_HW_OPL3SA2,
0697                       midi_port[dev],
0698                       MPU401_INFO_IRQ_HOOK, -1,
0699                       &chip->rmidi);
0700         if (err < 0)
0701             return err;
0702     }
0703     sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
0704         card->shortname, chip->port, xirq, xdma1);
0705     if (xdma2 >= 0)
0706         sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
0707 
0708     return snd_card_register(card);
0709 }
0710 
0711 #ifdef CONFIG_PNP
0712 static int snd_opl3sa2_pnp_detect(struct pnp_dev *pdev,
0713                   const struct pnp_device_id *id)
0714 {
0715     static int dev;
0716     int err;
0717     struct snd_card *card;
0718 
0719     if (pnp_device_is_isapnp(pdev))
0720         return -ENOENT; /* we have another procedure - card */
0721     for (; dev < SNDRV_CARDS; dev++) {
0722         if (enable[dev] && isapnp[dev])
0723             break;
0724     }
0725     if (dev >= SNDRV_CARDS)
0726         return -ENODEV;
0727 
0728     err = snd_opl3sa2_card_new(&pdev->dev, dev, &card);
0729     if (err < 0)
0730         return err;
0731     err = snd_opl3sa2_pnp(dev, card->private_data, pdev);
0732     if (err < 0)
0733         return err;
0734     err = snd_opl3sa2_probe(card, dev);
0735     if (err < 0)
0736         return err;
0737     pnp_set_drvdata(pdev, card);
0738     dev++;
0739     return 0;
0740 }
0741 
0742 #ifdef CONFIG_PM
0743 static int snd_opl3sa2_pnp_suspend(struct pnp_dev *pdev, pm_message_t state)
0744 {
0745     return snd_opl3sa2_suspend(pnp_get_drvdata(pdev), state);
0746 }
0747 static int snd_opl3sa2_pnp_resume(struct pnp_dev *pdev)
0748 {
0749     return snd_opl3sa2_resume(pnp_get_drvdata(pdev));
0750 }
0751 #endif
0752 
0753 static struct pnp_driver opl3sa2_pnp_driver = {
0754     .name = "snd-opl3sa2-pnpbios",
0755     .id_table = snd_opl3sa2_pnpbiosids,
0756     .probe = snd_opl3sa2_pnp_detect,
0757 #ifdef CONFIG_PM
0758     .suspend = snd_opl3sa2_pnp_suspend,
0759     .resume = snd_opl3sa2_pnp_resume,
0760 #endif
0761 };
0762 
0763 static int snd_opl3sa2_pnp_cdetect(struct pnp_card_link *pcard,
0764                    const struct pnp_card_device_id *id)
0765 {
0766     static int dev;
0767     struct pnp_dev *pdev;
0768     int err;
0769     struct snd_card *card;
0770 
0771     pdev = pnp_request_card_device(pcard, id->devs[0].id, NULL);
0772     if (pdev == NULL) {
0773         snd_printk(KERN_ERR PFX "can't get pnp device from id '%s'\n",
0774                id->devs[0].id);
0775         return -EBUSY;
0776     }
0777     for (; dev < SNDRV_CARDS; dev++) {
0778         if (enable[dev] && isapnp[dev])
0779             break;
0780     }
0781     if (dev >= SNDRV_CARDS)
0782         return -ENODEV;
0783 
0784     err = snd_opl3sa2_card_new(&pdev->dev, dev, &card);
0785     if (err < 0)
0786         return err;
0787     err = snd_opl3sa2_pnp(dev, card->private_data, pdev);
0788     if (err < 0)
0789         return err;
0790     err = snd_opl3sa2_probe(card, dev);
0791     if (err < 0)
0792         return err;
0793     pnp_set_card_drvdata(pcard, card);
0794     dev++;
0795     return 0;
0796 }
0797 
0798 #ifdef CONFIG_PM
0799 static int snd_opl3sa2_pnp_csuspend(struct pnp_card_link *pcard, pm_message_t state)
0800 {
0801     return snd_opl3sa2_suspend(pnp_get_card_drvdata(pcard), state);
0802 }
0803 static int snd_opl3sa2_pnp_cresume(struct pnp_card_link *pcard)
0804 {
0805     return snd_opl3sa2_resume(pnp_get_card_drvdata(pcard));
0806 }
0807 #endif
0808 
0809 static struct pnp_card_driver opl3sa2_pnpc_driver = {
0810     .flags = PNP_DRIVER_RES_DISABLE,
0811     .name = "snd-opl3sa2-cpnp",
0812     .id_table = snd_opl3sa2_pnpids,
0813     .probe = snd_opl3sa2_pnp_cdetect,
0814 #ifdef CONFIG_PM
0815     .suspend = snd_opl3sa2_pnp_csuspend,
0816     .resume = snd_opl3sa2_pnp_cresume,
0817 #endif
0818 };
0819 #endif /* CONFIG_PNP */
0820 
0821 static int snd_opl3sa2_isa_match(struct device *pdev,
0822                  unsigned int dev)
0823 {
0824     if (!enable[dev])
0825         return 0;
0826 #ifdef CONFIG_PNP
0827     if (isapnp[dev])
0828         return 0;
0829 #endif
0830     if (port[dev] == SNDRV_AUTO_PORT) {
0831         snd_printk(KERN_ERR PFX "specify port\n");
0832         return 0;
0833     }
0834     if (wss_port[dev] == SNDRV_AUTO_PORT) {
0835         snd_printk(KERN_ERR PFX "specify wss_port\n");
0836         return 0;
0837     }
0838     if (fm_port[dev] == SNDRV_AUTO_PORT) {
0839         snd_printk(KERN_ERR PFX "specify fm_port\n");
0840         return 0;
0841     }
0842     if (midi_port[dev] == SNDRV_AUTO_PORT) {
0843         snd_printk(KERN_ERR PFX "specify midi_port\n");
0844         return 0;
0845     }
0846     return 1;
0847 }
0848 
0849 static int snd_opl3sa2_isa_probe(struct device *pdev,
0850                  unsigned int dev)
0851 {
0852     struct snd_card *card;
0853     int err;
0854 
0855     err = snd_opl3sa2_card_new(pdev, dev, &card);
0856     if (err < 0)
0857         return err;
0858     err = snd_opl3sa2_probe(card, dev);
0859     if (err < 0)
0860         return err;
0861     dev_set_drvdata(pdev, card);
0862     return 0;
0863 }
0864 
0865 #ifdef CONFIG_PM
0866 static int snd_opl3sa2_isa_suspend(struct device *dev, unsigned int n,
0867                    pm_message_t state)
0868 {
0869     return snd_opl3sa2_suspend(dev_get_drvdata(dev), state);
0870 }
0871 
0872 static int snd_opl3sa2_isa_resume(struct device *dev, unsigned int n)
0873 {
0874     return snd_opl3sa2_resume(dev_get_drvdata(dev));
0875 }
0876 #endif
0877 
0878 #define DEV_NAME "opl3sa2"
0879 
0880 static struct isa_driver snd_opl3sa2_isa_driver = {
0881     .match      = snd_opl3sa2_isa_match,
0882     .probe      = snd_opl3sa2_isa_probe,
0883 #ifdef CONFIG_PM
0884     .suspend    = snd_opl3sa2_isa_suspend,
0885     .resume     = snd_opl3sa2_isa_resume,
0886 #endif
0887     .driver     = {
0888         .name   = DEV_NAME
0889     },
0890 };
0891 
0892 static int __init alsa_card_opl3sa2_init(void)
0893 {
0894     int err;
0895 
0896     err = isa_register_driver(&snd_opl3sa2_isa_driver, SNDRV_CARDS);
0897 #ifdef CONFIG_PNP
0898     if (!err)
0899         isa_registered = 1;
0900 
0901     err = pnp_register_driver(&opl3sa2_pnp_driver);
0902     if (!err)
0903         pnp_registered = 1;
0904 
0905     err = pnp_register_card_driver(&opl3sa2_pnpc_driver);
0906     if (!err)
0907         pnpc_registered = 1;
0908 
0909     if (isa_registered || pnp_registered)
0910         err = 0;
0911 #endif
0912     return err;
0913 }
0914 
0915 static void __exit alsa_card_opl3sa2_exit(void)
0916 {
0917 #ifdef CONFIG_PNP
0918     if (pnpc_registered)
0919         pnp_unregister_card_driver(&opl3sa2_pnpc_driver);
0920     if (pnp_registered)
0921         pnp_unregister_driver(&opl3sa2_pnp_driver);
0922     if (isa_registered)
0923 #endif
0924         isa_unregister_driver(&snd_opl3sa2_isa_driver);
0925 }
0926 
0927 module_init(alsa_card_opl3sa2_init)
0928 module_exit(alsa_card_opl3sa2_exit)