Lines Matching +full:aux +full:- +full:devs
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 card-opti92x-ad1848.c - driver for OPTi 82c92x based soundcards.
4 Copyright (C) 1998-2000 by Massimo Piccioni <dafastidio@libero.it>
42 MODULE_DESCRIPTION("OPTi92X - CS4231");
46 MODULE_DESCRIPTION("OPTi92X - AD1848");
53 static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
82 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for opti9xx driver.");
88 MODULE_PARM_DESC(mpu_irq, "MPU-401 irq # for opti9xx driver.");
110 #define OPTi93X_PORT(chip, r) ((chip)->port + OPTi93X_##r)
146 .devs = { { "OPT0000" }, { "OPT0002" }, { "OPT0005" } },
150 .devs = { { "OPT9250" }, { "OPT0002" }, { "OPT0005" } },
154 { .id = "OPT0931", .devs = { { "OPT9310" }, { "OPT0002" } },
178 chip->hardware = hardware; in snd_opti9xx_init()
179 strcpy(chip->name, snd_opti9xx_names[hardware]); in snd_opti9xx_init()
181 spin_lock_init(&chip->lock); in snd_opti9xx_init()
183 chip->irq = -1; in snd_opti9xx_init()
187 if (isapnp && chip->mc_base) in snd_opti9xx_init()
189 chip->mc_base |= 0xc00; in snd_opti9xx_init()
193 chip->mc_base = 0xf8c; in snd_opti9xx_init()
194 chip->mc_base_size = opti9xx_mc_size[hardware]; in snd_opti9xx_init()
197 chip->mc_base_size = opti9xx_mc_size[hardware]; in snd_opti9xx_init()
204 chip->password = (hardware == OPTi9XX_HW_82C928) ? 0xe2 : 0xe3; in snd_opti9xx_init()
205 chip->pwd_reg = 3; in snd_opti9xx_init()
210 chip->password = 0xe5; in snd_opti9xx_init()
211 chip->pwd_reg = 3; in snd_opti9xx_init()
218 chip->mc_base = (hardware == OPTi9XX_HW_82C930) ? 0xf8f : 0xf8d; in snd_opti9xx_init()
219 if (!chip->mc_indir_index) in snd_opti9xx_init()
220 chip->mc_indir_index = 0xe0e; in snd_opti9xx_init()
221 chip->password = 0xe4; in snd_opti9xx_init()
222 chip->pwd_reg = 0; in snd_opti9xx_init()
228 return -ENODEV; in snd_opti9xx_init()
239 spin_lock_irqsave(&chip->lock, flags); in snd_opti9xx_read()
240 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read()
242 switch (chip->hardware) { in snd_opti9xx_read()
247 outb(reg, chip->mc_base + 8); in snd_opti9xx_read()
248 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read()
249 retval = inb(chip->mc_base + 9); in snd_opti9xx_read()
256 retval = inb(chip->mc_base + reg); in snd_opti9xx_read()
263 outb(reg, chip->mc_indir_index); in snd_opti9xx_read()
264 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read()
265 retval = inb(chip->mc_indir_index + 1); in snd_opti9xx_read()
270 snd_printk(KERN_ERR "chip %d not supported\n", chip->hardware); in snd_opti9xx_read()
273 spin_unlock_irqrestore(&chip->lock, flags); in snd_opti9xx_read()
282 spin_lock_irqsave(&chip->lock, flags); in snd_opti9xx_write()
283 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_write()
285 switch (chip->hardware) { in snd_opti9xx_write()
290 outb(reg, chip->mc_base + 8); in snd_opti9xx_write()
291 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_write()
292 outb(value, chip->mc_base + 9); in snd_opti9xx_write()
299 outb(value, chip->mc_base + reg); in snd_opti9xx_write()
306 outb(reg, chip->mc_indir_index); in snd_opti9xx_write()
307 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_write()
308 outb(value, chip->mc_indir_index + 1); in snd_opti9xx_write()
313 snd_printk(KERN_ERR "chip %d not supported\n", chip->hardware); in snd_opti9xx_write()
316 spin_unlock_irqrestore(&chip->lock, flags); in snd_opti9xx_write()
339 switch (chip->hardware) { in snd_opti9xx_configure()
402 (chip->hardware == OPTi9XX_HW_82C930 ? 0x00 : 0x04), in snd_opti9xx_configure()
409 snd_printk(KERN_ERR "chip %d not supported\n", chip->hardware); in snd_opti9xx_configure()
410 return -EINVAL; in snd_opti9xx_configure()
416 chip->wss_base = 0x530; in snd_opti9xx_configure()
420 chip->wss_base = 0x604; in snd_opti9xx_configure()
424 chip->wss_base = 0xe80; in snd_opti9xx_configure()
428 chip->wss_base = 0xf40; in snd_opti9xx_configure()
479 return -EBUSY; in snd_opti9xx_configure()
494 outb(irq_bits << 3 | dma_bits, chip->wss_base); in snd_opti9xx_configure()
500 if (chip->hardware > OPTi9XX_HW_82C928) { in snd_opti9xx_configure()
503 case -1: in snd_opti9xx_configure()
519 "MPU-401 port 0x%lx not valid\n", mpu_port); in snd_opti9xx_configure()
537 snd_printk(KERN_WARNING "MPU-401 irq # %d not valid\n", in snd_opti9xx_configure()
554 static const DECLARE_TLV_DB_SCALE(db_scale_5bit_3db_step, -9300, 300, 0);
555 static const DECLARE_TLV_DB_SCALE(db_scale_5bit, -4650, 150, 0);
556 static const DECLARE_TLV_DB_SCALE(db_scale_4bit_12db_max, -3300, 300, 0);
583 WSS_DOUBLE("Aux Playback Switch", 0,
585 WSS_DOUBLE_TLV("Aux Playback Volume", 0,
597 if (snd_BUG_ON(!chip || !chip->pcm)) in snd_opti93x_mixer()
598 return -EINVAL; in snd_opti93x_mixer()
600 card = chip->card; in snd_opti93x_mixer()
602 strcpy(card->mixername, chip->pcm->name); in snd_opti93x_mixer()
608 strcpy(id1.name, "Aux Playback Switch"); in snd_opti93x_mixer()
616 strcpy(id1.name, "Aux Playback Switch"); id1.index = 1; in snd_opti93x_mixer()
624 strcpy(id1.name, "Aux Playback Volume"); id1.index = 1; in snd_opti93x_mixer()
644 struct snd_wss *codec = chip->codec; in snd_opti93x_interrupt()
651 if ((status & OPTi93X_IRQ_PLAYBACK) && codec->playback_substream) in snd_opti93x_interrupt()
652 snd_pcm_period_elapsed(codec->playback_substream); in snd_opti93x_interrupt()
653 if ((status & OPTi93X_IRQ_CAPTURE) && codec->capture_substream) { in snd_opti93x_interrupt()
655 snd_pcm_period_elapsed(codec->capture_substream); in snd_opti93x_interrupt()
670 chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, in snd_opti9xx_read_check()
672 if (chip->res_mc_base == NULL) in snd_opti9xx_read_check()
673 return -EBUSY; in snd_opti9xx_read_check()
676 if (value != 0xff && value != inb(chip->mc_base + OPTi9XX_MC_REG(1))) in snd_opti9xx_read_check()
680 chip->res_mc_indir = request_region(chip->mc_indir_index, 2, in snd_opti9xx_read_check()
682 if (chip->res_mc_indir == NULL) in snd_opti9xx_read_check()
683 return -EBUSY; in snd_opti9xx_read_check()
685 spin_lock_irqsave(&chip->lock, flags); in snd_opti9xx_read_check()
686 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read_check()
687 outb(((chip->mc_indir_index & 0x1f0) >> 4), chip->mc_base); in snd_opti9xx_read_check()
688 spin_unlock_irqrestore(&chip->lock, flags); in snd_opti9xx_read_check()
691 snd_opti9xx_write(chip, OPTi9XX_MC_REG(7), 0xff - value); in snd_opti9xx_read_check()
692 if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value) in snd_opti9xx_read_check()
695 release_and_free_resource(chip->res_mc_indir); in snd_opti9xx_read_check()
696 chip->res_mc_indir = NULL; in snd_opti9xx_read_check()
698 release_and_free_resource(chip->res_mc_base); in snd_opti9xx_read_check()
699 chip->res_mc_base = NULL; in snd_opti9xx_read_check()
701 return -ENODEV; in snd_opti9xx_read_check()
712 for (i = OPTi9XX_HW_82C931; i >= OPTi9XX_HW_82C930; i--) {
722 chip->mc_indir_index = 0;
725 return -ENODEV;
740 pdev = pnp_request_card_device(card, pid->devs[0].id, NULL);
742 return -EBUSY;
751 port = pnp_port_start(pdev, 0) - 4;
753 /* adjust mc_indir_index - some cards report it at 0xe?d,
755 chip->mc_indir_index = (pnp_port_start(pdev, 3) & ~0xf) | 0xe;
757 devmc = pnp_request_card_device(card, pid->devs[2].id, NULL);
759 return -EBUSY;
773 chip->mc_base = pnp_port_start(devmc, 0) - 1;
774 chip->mc_base_size = pnp_port_len(devmc, 0) + 1;
782 devmpu = pnp_request_card_device(card, pid->devs[1].id, NULL);
788 mpu_port = -1;
794 return pid->driver_data;
800 struct snd_opti9xx *chip = card->private_data;
804 if (chip->irq > 0) {
805 disable_irq(chip->irq);
806 free_irq(chip->irq, chip);
808 release_and_free_resource(chip->res_mc_indir);
810 release_and_free_resource(chip->res_mc_base);
816 static const long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
819 struct snd_opti9xx *chip = card->private_data;
827 xdma2 = -1;
834 return -EBUSY;
842 error = snd_wss_create(card, chip->wss_base + 4, -1, irq, dma1, xdma2,
851 chip->codec = codec;
870 0, DEV_NAME" - WSS", chip);
876 chip->irq = irq;
877 card->sync_irq = chip->irq;
878 strcpy(card->driver, chip->name);
879 sprintf(card->shortname, "OPTi %s", card->driver);
881 snprintf(card->longname, sizeof(card->longname),
883 card->shortname, codec->pcm->name,
884 chip->wss_base + 4, irq, dma1, xdma2);
886 snprintf(card->longname, sizeof(card->longname),
888 card->shortname, codec->pcm->name, chip->wss_base + 4, irq,
898 snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n",
905 if (chip->hardware == OPTi9XX_HW_82C928 ||
906 chip->hardware == OPTi9XX_HW_82C929 ||
907 chip->hardware == OPTi9XX_HW_82C924) {
912 if (snd_opl4_create(card, fm_port, fm_port - 8,
922 snd_printk(KERN_WARNING "no OPL device at 0x%lx-0x%lx\n",
923 fm_port, fm_port + 4 - 1);
944 card->private_free = snd_card_opti9xx_free;
966 static const long possible_mpu_ports[] = {0x300, 0x310, 0x320, 0x330, -1};
968 static const int possible_irqs[] = {5, 9, 10, 11, 7, -1};
970 static const int possible_irqs[] = {9, 10, 11, 7, -1};
972 static const int possible_mpu_irqs[] = {5, 9, 10, 7, -1};
973 static const int possible_dma1s[] = {3, 1, 0, -1};
975 static const int possible_dma2s[][2] = {{1,-1}, {0,-1}, {-1,-1}, {0,-1}};
981 return -EBUSY;
987 return -EBUSY;
993 return -EBUSY;
999 return -EBUSY;
1006 return -EBUSY;
1015 if ((error = snd_card_opti9xx_detect(card, card->private_data)) < 0) {
1037 struct snd_opti9xx *chip = card->private_data;
1040 chip->codec->suspend(chip->codec);
1046 struct snd_opti9xx *chip = card->private_data;
1051 xdma2 = -1;
1058 chip->codec->resume(chip->codec);
1097 return -EBUSY;
1099 return -ENODEV;
1100 error = snd_opti9xx_card_new(&pcard->card->dev, &card);
1103 chip = card->private_data;
1118 return -ENODEV;