0001
0002
0003
0004
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;
0027 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
0028 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
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;
0033 static long sb_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
0034 static long wss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
0035 static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
0036 static long midi_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
0037 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
0038 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
0039 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
0040 static int opl3sa3_ymode[SNDRV_CARDS];
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
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
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
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;
0106 unsigned long port;
0107 struct resource *res_port;
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;
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" },
0127 { .id = "" }
0128 };
0129
0130 MODULE_DEVICE_TABLE(pnp, snd_opl3sa2_pnpbiosids);
0131
0132 static const struct pnp_card_device_id snd_opl3sa2_pnpids[] = {
0133
0134 { .id = "YMH0020", .devs = { { "YMH0021" } } },
0135
0136 { .id = "YMH0030", .devs = { { "YMH0021" } } },
0137
0138 { .id = "YMH0800", .devs = { { "YMH0021" } } },
0139
0140 { .id = "YMH0801", .devs = { { "YMH0021" } } },
0141
0142 { .id = "NMX2200", .devs = { { "YMH2210" } } },
0143
0144 { .id = "NMX2200", .devs = { { "NMX2210" } } },
0145
0146 { .id = "" }
0147 };
0148
0149 MODULE_DEVICE_TABLE(pnp_card, snd_opl3sa2_pnpids);
0150
0151 #endif
0152
0153
0154
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);
0160 printk(KERN_DEBUG "read [0x%lx] = 0x%x\n", port, inb(port));
0161 #endif
0162 outb(reg, chip->port);
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
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
0184 static void __snd_opl3sa2_write(struct snd_opl3sa2 *chip, unsigned char reg, unsigned char value)
0185 {
0186 #if 0
0187 outb(0x1d, port);
0188 #endif
0189 outb(reg, chip->port);
0190 outb(value, chip->port + 1);
0191 chip->ctlregs[reg] = value;
0192 }
0193
0194
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
0219
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;
0230 break;
0231 default:
0232 chip->version = 3;
0233
0234
0235
0236
0237
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
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
0259
0260 snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
0261 if (chip->version > 2) {
0262
0263 snd_opl3sa2_write(chip, OPL3SA2_SYS_CTRL, (chip->ymode << 4));
0264 } else {
0265
0266 snd_opl3sa2_write(chip, OPL3SA2_SYS_CTRL, 0x00);
0267 }
0268 snd_opl3sa2_write(chip, OPL3SA2_IRQ_CONFIG, 0x0d);
0269 if (chip->single_dma) {
0270 snd_opl3sa2_write(chip, OPL3SA2_DMA_CONFIG, 0x03);
0271 } else {
0272 snd_opl3sa2_write(chip, OPL3SA2_DMA_CONFIG, 0x21);
0273 }
0274 snd_opl3sa2_write(chip, OPL3SA2_MISC, 0x80 | (tmp & 7));
0275 if (chip->version > 2) {
0276 snd_opl3sa2_write(chip, OPL3SA3_DGTL_DOWN, 0x00);
0277 snd_opl3sa2_write(chip, OPL3SA3_ANLG_DOWN, 0x00);
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) {
0306 handled = 1;
0307 snd_wss_interrupt(irq, chip->wss);
0308 }
0309
0310 if (status & 0x40) {
0311 handled = 1;
0312
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
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
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
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
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
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
0570 snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
0571
0572
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
0582 chip->wss->resume(chip->wss);
0583
0584 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
0585 return 0;
0586 }
0587 #endif
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
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
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;
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
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)