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 <[email protected]>
41 MODULE_DESCRIPTION("OPTi92X - CS4231");
43 MODULE_DESCRIPTION("OPTi92X - AD1848");
47 static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
76 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for opti9xx driver.");
82 MODULE_PARM_DESC(mpu_irq, "MPU-401 irq # for opti9xx driver.");
104 #define OPTi93X_PORT(chip, r) ((chip)->port + OPTi93X_##r)
141 .devs = { { "OPT0000" }, { "OPT0002" }, { "OPT0005" } },
145 .devs = { { "OPT9250" }, { "OPT0002" }, { "OPT0005" } },
149 { .id = "OPT0931", .devs = { { "OPT9310" }, { "OPT0002" } },
173 chip->hardware = hardware; in snd_opti9xx_init()
174 strcpy(chip->name, snd_opti9xx_names[hardware]); in snd_opti9xx_init()
176 spin_lock_init(&chip->lock); in snd_opti9xx_init()
178 chip->irq = -1; in snd_opti9xx_init()
182 if (isapnp && chip->mc_base) in snd_opti9xx_init()
184 chip->mc_base |= 0xc00; in snd_opti9xx_init()
188 chip->mc_base = 0xf8c; in snd_opti9xx_init()
189 chip->mc_base_size = opti9xx_mc_size[hardware]; in snd_opti9xx_init()
192 chip->mc_base_size = opti9xx_mc_size[hardware]; in snd_opti9xx_init()
199 chip->password = (hardware == OPTi9XX_HW_82C928) ? 0xe2 : 0xe3; in snd_opti9xx_init()
200 chip->pwd_reg = 3; in snd_opti9xx_init()
205 chip->password = 0xe5; in snd_opti9xx_init()
206 chip->pwd_reg = 3; in snd_opti9xx_init()
213 chip->mc_base = (hardware == OPTi9XX_HW_82C930) ? 0xf8f : 0xf8d; in snd_opti9xx_init()
214 if (!chip->mc_indir_index) in snd_opti9xx_init()
215 chip->mc_indir_index = 0xe0e; in snd_opti9xx_init()
216 chip->password = 0xe4; in snd_opti9xx_init()
217 chip->pwd_reg = 0; in snd_opti9xx_init()
222 dev_err(chip->card->dev, "chip %d not supported\n", hardware); in snd_opti9xx_init()
223 return -ENODEV; in snd_opti9xx_init()
234 spin_lock_irqsave(&chip->lock, flags); in snd_opti9xx_read()
235 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read()
237 switch (chip->hardware) { in snd_opti9xx_read()
242 outb(reg, chip->mc_base + 8); in snd_opti9xx_read()
243 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read()
244 retval = inb(chip->mc_base + 9); in snd_opti9xx_read()
251 retval = inb(chip->mc_base + reg); in snd_opti9xx_read()
258 outb(reg, chip->mc_indir_index); in snd_opti9xx_read()
259 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read()
260 retval = inb(chip->mc_indir_index + 1); in snd_opti9xx_read()
265 dev_err(chip->card->dev, "chip %d not supported\n", chip->hardware); in snd_opti9xx_read()
268 spin_unlock_irqrestore(&chip->lock, flags); in snd_opti9xx_read()
277 spin_lock_irqsave(&chip->lock, flags); in snd_opti9xx_write()
278 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_write()
280 switch (chip->hardware) { in snd_opti9xx_write()
285 outb(reg, chip->mc_base + 8); in snd_opti9xx_write()
286 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_write()
287 outb(value, chip->mc_base + 9); in snd_opti9xx_write()
294 outb(value, chip->mc_base + reg); in snd_opti9xx_write()
301 outb(reg, chip->mc_indir_index); in snd_opti9xx_write()
302 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_write()
303 outb(value, chip->mc_indir_index + 1); in snd_opti9xx_write()
308 dev_err(chip->card->dev, "chip %d not supported\n", chip->hardware); in snd_opti9xx_write()
311 spin_unlock_irqrestore(&chip->lock, flags); in snd_opti9xx_write()
334 switch (chip->hardware) { in snd_opti9xx_configure()
397 (chip->hardware == OPTi9XX_HW_82C930 ? 0x00 : 0x04), in snd_opti9xx_configure()
404 dev_err(chip->card->dev, "chip %d not supported\n", chip->hardware); in snd_opti9xx_configure()
405 return -EINVAL; in snd_opti9xx_configure()
411 chip->wss_base = 0x530; in snd_opti9xx_configure()
415 chip->wss_base = 0x604; in snd_opti9xx_configure()
419 chip->wss_base = 0xe80; in snd_opti9xx_configure()
423 chip->wss_base = 0xf40; in snd_opti9xx_configure()
427 dev_warn(chip->card->dev, "WSS port 0x%lx not valid\n", port); in snd_opti9xx_configure()
452 dev_warn(chip->card->dev, "WSS irq # %d not valid\n", irq); in snd_opti9xx_configure()
467 dev_warn(chip->card->dev, "WSS dma1 # %d not valid\n", dma1); in snd_opti9xx_configure()
473 dev_err(chip->card->dev, "don't want to share dmas\n"); in snd_opti9xx_configure()
474 return -EBUSY; in snd_opti9xx_configure()
482 dev_warn(chip->card->dev, "WSS dma2 # %d not valid\n", dma2); in snd_opti9xx_configure()
489 outb(irq_bits << 3 | dma_bits, chip->wss_base); in snd_opti9xx_configure()
495 if (chip->hardware > OPTi9XX_HW_82C928) { in snd_opti9xx_configure()
498 case -1: in snd_opti9xx_configure()
513 dev_warn(chip->card->dev, in snd_opti9xx_configure()
514 "MPU-401 port 0x%lx not valid\n", mpu_port); in snd_opti9xx_configure()
532 dev_warn(chip->card->dev, "MPU-401 irq # %d not valid\n", in snd_opti9xx_configure()
549 static const DECLARE_TLV_DB_SCALE(db_scale_5bit_3db_step, -9300, 300, 0);
550 static const DECLARE_TLV_DB_SCALE(db_scale_5bit, -4650, 150, 0);
551 static const DECLARE_TLV_DB_SCALE(db_scale_4bit_12db_max, -3300, 300, 0);
578 WSS_DOUBLE("Aux Playback Switch", 0,
580 WSS_DOUBLE_TLV("Aux Playback Volume", 0,
592 if (snd_BUG_ON(!chip || !chip->pcm)) in snd_opti93x_mixer()
593 return -EINVAL; in snd_opti93x_mixer()
595 card = chip->card; in snd_opti93x_mixer()
597 strcpy(card->mixername, chip->pcm->name); in snd_opti93x_mixer()
603 strcpy(id1.name, "Aux Playback Switch"); in snd_opti93x_mixer()
607 dev_err(card->dev, "Cannot rename opti93x control\n"); in snd_opti93x_mixer()
611 strcpy(id1.name, "Aux Playback Switch"); id1.index = 1; in snd_opti93x_mixer()
615 dev_err(card->dev, "Cannot rename opti93x control\n"); in snd_opti93x_mixer()
619 strcpy(id1.name, "Aux Playback Volume"); id1.index = 1; in snd_opti93x_mixer()
639 struct snd_wss *codec = chip->codec; in snd_opti93x_interrupt()
646 if ((status & OPTi93X_IRQ_PLAYBACK) && codec->playback_substream) in snd_opti93x_interrupt()
647 snd_pcm_period_elapsed(codec->playback_substream); in snd_opti93x_interrupt()
648 if ((status & OPTi93X_IRQ_CAPTURE) && codec->capture_substream) { in snd_opti93x_interrupt()
650 snd_pcm_period_elapsed(codec->capture_substream); in snd_opti93x_interrupt()
666 chip->res_mc_base = in snd_opti9xx_read_check()
667 devm_request_region(card->dev, chip->mc_base, in snd_opti9xx_read_check()
668 chip->mc_base_size, "OPTi9xx MC"); in snd_opti9xx_read_check()
669 if (!chip->res_mc_base) in snd_opti9xx_read_check()
670 return -EBUSY; in snd_opti9xx_read_check()
673 if (value != 0xff && value != inb(chip->mc_base + OPTi9XX_MC_REG(1))) in snd_opti9xx_read_check()
677 chip->res_mc_indir = in snd_opti9xx_read_check()
678 devm_request_region(card->dev, chip->mc_indir_index, 2, in snd_opti9xx_read_check()
680 if (!chip->res_mc_indir) in snd_opti9xx_read_check()
681 return -EBUSY; in snd_opti9xx_read_check()
683 spin_lock_irqsave(&chip->lock, flags); in snd_opti9xx_read_check()
684 outb(chip->password, chip->mc_base + chip->pwd_reg); in snd_opti9xx_read_check()
685 outb(((chip->mc_indir_index & 0x1f0) >> 4), chip->mc_base); in snd_opti9xx_read_check()
686 spin_unlock_irqrestore(&chip->lock, flags); in snd_opti9xx_read_check()
689 snd_opti9xx_write(chip, OPTi9XX_MC_REG(7), 0xff - value); in snd_opti9xx_read_check()
690 if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value) in snd_opti9xx_read_check()
693 devm_release_resource(card->dev, chip->res_mc_indir); in snd_opti9xx_read_check()
694 chip->res_mc_indir = NULL; in snd_opti9xx_read_check()
696 devm_release_resource(card->dev, chip->res_mc_base); in snd_opti9xx_read_check()
697 chip->res_mc_base = NULL; in snd_opti9xx_read_check()
699 return -ENODEV; in snd_opti9xx_read_check()
710 for (i = OPTi9XX_HW_82C931; i >= OPTi9XX_HW_82C930; i--) {
720 chip->mc_indir_index = 0;
723 return -ENODEV;
738 pdev = pnp_request_card_device(card, pid->devs[0].id, NULL);
740 return -EBUSY;
744 dev_err(chip->card->dev, "AUDIO pnp configure failure: %d\n", err);
749 port = pnp_port_start(pdev, 0) - 4;
751 /* adjust mc_indir_index - some cards report it at 0xe?d,
753 chip->mc_indir_index = (pnp_port_start(pdev, 3) & ~0xf) | 0xe;
755 devmc = pnp_request_card_device(card, pid->devs[2].id, NULL);
757 return -EBUSY;
761 dev_err(chip->card->dev, "MC pnp configure failure: %d\n", err);
771 chip->mc_base = pnp_port_start(devmc, 0) - 1;
772 chip->mc_base_size = pnp_port_len(devmc, 0) + 1;
780 devmpu = pnp_request_card_device(card, pid->devs[1].id, NULL);
785 dev_err(chip->card->dev, "MPU401 pnp configure failure\n");
786 mpu_port = -1;
792 return pid->driver_data;
798 static const long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
801 struct snd_opti9xx *chip = card->private_data;
809 xdma2 = -1;
815 dev_err(card->dev, "unable to find a free WSS port\n");
816 return -EBUSY;
824 error = snd_wss_create(card, chip->wss_base + 4, -1, irq, dma1, xdma2,
833 chip->codec = codec;
851 error = devm_request_irq(card->dev, irq, snd_opti93x_interrupt,
852 0, DEV_NAME" - WSS", chip);
854 dev_err(card->dev, "opti9xx: can't grab IRQ %d\n", irq);
858 chip->irq = irq;
859 card->sync_irq = chip->irq;
860 strcpy(card->driver, chip->name);
861 sprintf(card->shortname, "OPTi %s", card->driver);
863 scnprintf(card->longname, sizeof(card->longname),
865 card->shortname, codec->pcm->name,
866 chip->wss_base + 4, irq, dma1, xdma2);
868 scnprintf(card->longname, sizeof(card->longname),
870 card->shortname, codec->pcm->name, chip->wss_base + 4, irq,
880 dev_warn(card->dev, "no MPU-401 device at 0x%lx?\n",
887 if (chip->hardware == OPTi9XX_HW_82C928 ||
888 chip->hardware == OPTi9XX_HW_82C929 ||
889 chip->hardware == OPTi9XX_HW_82C924) {
894 if (snd_opl4_create(card, fm_port, fm_port - 8,
904 dev_warn(card->dev, "no OPL device at 0x%lx-0x%lx\n",
905 fm_port, fm_port + 4 - 1);
947 static const long possible_mpu_ports[] = {0x300, 0x310, 0x320, 0x330, -1};
949 static const int possible_irqs[] = {5, 9, 10, 11, 7, -1};
951 static const int possible_irqs[] = {9, 10, 11, 7, -1};
953 static const int possible_mpu_irqs[] = {5, 9, 10, 7, -1};
954 static const int possible_dma1s[] = {3, 1, 0, -1};
956 static const int possible_dma2s[][2] = {{1,-1}, {0,-1}, {-1,-1}, {0,-1}};
963 return -EBUSY;
970 return -EBUSY;
977 return -EBUSY;
984 return -EBUSY;
992 return -EBUSY;
1001 error = snd_card_opti9xx_detect(card, card->private_data);
1014 struct snd_opti9xx *chip = card->private_data;
1017 chip->codec->suspend(chip->codec);
1023 struct snd_opti9xx *chip = card->private_data;
1028 xdma2 = -1;
1035 chip->codec->resume(chip->codec);
1073 return -EBUSY;
1075 return -ENODEV;
1076 error = snd_opti9xx_card_new(&pcard->card->dev, &card);
1079 chip = card->private_data;
1080 chip->card = card;
1094 return -ENODEV;
1102 dev_err(card->dev, "OPTI chip not found\n");