Lines Matching +full:reset +full:- +full:n +full:- +full:io
1 // SPDX-License-Identifier: GPL-2.0-or-later
16 * the following is a copy of the 2.4.18 OSS FREE file-heading comment:
21 * -- If MSND_CLASSIC is defined:
23 * -> driver for Turtle Beach Classic/Monterey/Tahiti
25 * -- Else
27 * -> driver for Turtle Beach Pinnacle/Fiji
29 * 12-3-2000 Modified IO port validation Steve Sycamore
45 #include <linux/io.h>
62 # define DEV_NAME "msnd-classic"
66 # define DEV_NAME "msnd-pinnacle"
71 chip->play_sample_size = snd_pcm_format_width(DEFSAMPLESIZE);
72 chip->play_sample_rate = DEFSAMPLERATE;
73 chip->play_channels = DEFCHANNELS;
74 chip->capture_sample_size = snd_pcm_format_width(DEFSAMPLESIZE);
75 chip->capture_sample_rate = DEFSAMPLERATE;
76 chip->capture_channels = DEFCHANNELS;
83 if (chip->banksPlayed < 3)
84 dev_dbg(chip->card->dev, "%08X: HIMT_PLAY_DONE: %i\n",
87 if (chip->last_playbank == LOBYTE(wMessage)) {
88 dev_dbg(chip->card->dev,
89 "chip.last_playbank == LOBYTE(wMessage)\n");
92 chip->banksPlayed++;
94 if (test_bit(F_WRITING, &chip->flags))
97 chip->last_playbank = LOBYTE(wMessage);
98 chip->playDMAPos += chip->play_period_bytes;
99 if (chip->playDMAPos > chip->playLimit)
100 chip->playDMAPos = 0;
101 snd_pcm_period_elapsed(chip->playback_substream);
106 if (chip->last_recbank == LOBYTE(wMessage))
108 chip->last_recbank = LOBYTE(wMessage);
109 chip->captureDMAPos += chip->capturePeriodBytes;
110 if (chip->captureDMAPos > (chip->captureLimit))
111 chip->captureDMAPos = 0;
113 if (test_bit(F_READING, &chip->flags))
114 snd_msnd_DARQ(chip, chip->last_recbank);
116 snd_pcm_period_elapsed(chip->capture_substream);
125 dev_dbg(chip->card->dev,
126 LOGNAME ": Play underflow %i\n",
127 chip->banksPlayed);
128 if (chip->banksPlayed > 2)
129 clear_bit(F_WRITING, &chip->flags);
133 dev_dbg(chip->card->dev, LOGNAME ": Record overflow\n");
134 clear_bit(F_READING, &chip->flags);
138 dev_dbg(chip->card->dev, LOGNAME
139 ": DSP message %d 0x%02x\n",
146 dev_dbg(chip->card->dev, LOGNAME ": HIMT message %d 0x%02x\n",
155 void __iomem *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF;
159 /* inb(chip->io + HP_RXL); */
162 head = readw(chip->DSPQ + JQS_wHead);
163 tail = readw(chip->DSPQ + JQS_wTail);
164 size = readw(chip->DSPQ + JQS_wSize);
171 writew(head, chip->DSPQ + JQS_wHead);
175 inb(chip->io + HP_RXL);
182 long io = chip->io;
185 outb(HPDSPRESET_ON, io + HP_DSPR);
189 *info = inb(io + HP_INFO);
191 outb(HPDSPRESET_OFF, io + HP_DSPR);
193 while (timeout-- > 0) {
194 if (inb(io + HP_CVR) == HP_CVR_DEF)
198 dev_err(chip->card->dev, LOGNAME ": Cannot reset DSP\n");
200 return -EIO;
205 struct snd_msnd *chip = card->private_data;
213 if (!request_region(chip->io, DSP_NUMIO, "probing")) {
214 dev_err(card->dev, LOGNAME ": I/O port conflict\n");
215 return -ENODEV;
219 release_region(chip->io, DSP_NUMIO);
220 return -ENODEV;
224 strscpy(card->shortname, "Classic/Tahiti/Monterey");
225 strscpy(card->longname, "Turtle Beach Multisound");
226 dev_info(card->dev, LOGNAME ": %s, "
227 "I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
228 card->shortname,
229 chip->io, chip->io + DSP_NUMIO - 1,
230 chip->irq,
231 chip->base, chip->base + 0x7fff);
254 strscpy(card->shortname, pin);
258 strscpy(card->shortname, pin);
262 strscpy(card->shortname, pin);
266 strscpy(card->shortname, pin);
270 strscpy(card->shortname, fiji);
274 strscpy(card->shortname, fiji);
278 strscpy(card->shortname, fiji);
281 rev = "A-B (Fiji) or A-E (Pinnacle)";
282 strscpy(card->shortname, pinfiji);
285 strscpy(card->longname, "Turtle Beach Multisound Pinnacle");
286 dev_info(card->dev, LOGNAME ": %s revision %s, Xilinx version %s, "
287 "I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
288 card->shortname,
290 chip->io, chip->io + DSP_NUMIO - 1,
291 chip->irq,
292 chip->base, chip->base + 0x7fff);
295 release_region(chip->io, DSP_NUMIO);
305 outb(chip->memid, chip->io + HP_MEMM);
307 outb(HPBLKSEL_0, chip->io + HP_BLKS);
309 chip->SMA = chip->mappedbase + SMA_STRUCT_START;
312 mastVolLeft = readw(chip->SMA + SMA_wCurrMastVolLeft);
313 mastVolRight = readw(chip->SMA + SMA_wCurrMastVolRight);
316 memset_io(chip->mappedbase, 0, 0x8000);
319 scoped_guard(spinlock_irqsave, &chip->lock) {
320 outb(HPBLKSEL_1, chip->io + HP_BLKS);
321 memset_io(chip->mappedbase, 0, 0x8000);
322 outb(HPBLKSEL_0, chip->io + HP_BLKS);
326 chip->DAPQ = chip->mappedbase + DAPQ_OFFSET;
327 snd_msnd_init_queue(chip->DAPQ, DAPQ_DATA_BUFF, DAPQ_BUFF_SIZE);
330 chip->DARQ = chip->mappedbase + DARQ_OFFSET;
331 snd_msnd_init_queue(chip->DARQ, DARQ_DATA_BUFF, DARQ_BUFF_SIZE);
334 chip->MODQ = chip->mappedbase + MODQ_OFFSET;
335 snd_msnd_init_queue(chip->MODQ, MODQ_DATA_BUFF, MODQ_BUFF_SIZE);
338 chip->MIDQ = chip->mappedbase + MIDQ_OFFSET;
339 snd_msnd_init_queue(chip->MIDQ, MIDQ_DATA_BUFF, MIDQ_BUFF_SIZE);
341 /* DSP -> host message queue */
342 chip->DSPQ = chip->mappedbase + DSPQ_OFFSET;
343 snd_msnd_init_queue(chip->DSPQ, DSPQ_DATA_BUFF, DSPQ_BUFF_SIZE);
347 writew(1, chip->SMA + SMA_wCurrPlayFormat);
348 writew(chip->play_sample_size, chip->SMA + SMA_wCurrPlaySampleSize);
349 writew(chip->play_channels, chip->SMA + SMA_wCurrPlayChannels);
350 writew(chip->play_sample_rate, chip->SMA + SMA_wCurrPlaySampleRate);
352 writew(chip->play_sample_rate, chip->SMA + SMA_wCalFreqAtoD);
353 writew(mastVolLeft, chip->SMA + SMA_wCurrMastVolLeft);
354 writew(mastVolRight, chip->SMA + SMA_wCurrMastVolRight);
356 writel(0x00010000, chip->SMA + SMA_dwCurrPlayPitch);
357 writel(0x00000001, chip->SMA + SMA_dwCurrPlayRate);
359 writew(0x303, chip->SMA + SMA_wCurrInputTagBits);
369 struct snd_msnd *chip = card->private_data;
373 outb(HPBLKSEL_0, chip->io + HP_BLKS);
375 err = request_firmware(&init_fw, INITCODEFILE, card->dev);
377 dev_err(card->dev, LOGNAME ": Error loading " INITCODEFILE);
380 err = request_firmware(&perm_fw, PERMCODEFILE, card->dev);
382 dev_err(card->dev, LOGNAME ": Error loading " PERMCODEFILE);
386 memcpy_toio(chip->mappedbase, perm_fw->data, perm_fw->size);
387 if (snd_msnd_upload_host(chip, init_fw->data, init_fw->size) < 0) {
388 dev_warn(card->dev, LOGNAME ": Error uploading to DSP\n");
389 err = -ENODEV;
392 dev_info(card->dev, LOGNAME ": DSP firmware uploaded\n");
405 outb(HPPRORESET_ON, chip->io + HP_PROR);
407 outb(HPPRORESET_OFF, chip->io + HP_PROR);
414 struct snd_msnd *chip = card->private_data;
418 outb(HPWAITSTATE_0, chip->io + HP_WAIT);
419 outb(HPBITMODE_16, chip->io + HP_BITM);
425 dev_warn(card->dev, LOGNAME ": Cannot initialize SMA\n");
435 dev_warn(card->dev, LOGNAME ": Cannot upload DSP code\n");
441 while (readw(chip->mappedbase)) {
443 if (!timeout--) {
444 dev_err(card->dev, LOGNAME ": DSP reset timeout\n");
445 return -EIO;
455 struct snd_msnd *chip = card->private_data;
458 if (test_bit(F_RESETTING, &chip->flags) || ++chip->nresets > 10)
461 set_bit(F_RESETTING, &chip->flags);
466 dev_warn(card->dev, LOGNAME ": DSP reset failed\n");
468 clear_bit(F_RESETTING, &chip->flags);
477 snd_msnd_dsp_full_reset(chip->card);
483 dev_dbg(chip->card->dev, "snd_msnd_calibrate_adc(%i)\n", srate);
484 writew(srate, chip->SMA + SMA_wCalFreqAtoD);
485 if (chip->calibrate_signal == 0)
486 writew(readw(chip->SMA + SMA_wCurrHostStatusFlags)
487 | 0x0001, chip->SMA + SMA_wCurrHostStatusFlags);
489 writew(readw(chip->SMA + SMA_wCurrHostStatusFlags)
490 & ~0x0001, chip->SMA + SMA_wCurrHostStatusFlags);
496 dev_warn(chip->card->dev, LOGNAME ": ADC calibration failed\n");
497 return -EIO;
505 snd_msnd_enable_irq(mpu->private_data);
506 snd_msnd_send_dsp_cmd(mpu->private_data, HDEX_MIDI_IN_START);
512 snd_msnd_send_dsp_cmd(mpu->private_data, HDEX_MIDI_IN_STOP);
513 snd_msnd_disable_irq(mpu->private_data);
521 struct snd_msnd *chip = card->private_data;
524 err = devm_request_irq(card->dev, chip->irq, snd_msnd_interrupt, 0,
525 card->shortname, chip);
527 dev_err(card->dev, LOGNAME ": Couldn't grab IRQ %d\n", chip->irq);
530 card->sync_irq = chip->irq;
531 if (!devm_request_region(card->dev, chip->io, DSP_NUMIO,
532 card->shortname))
533 return -EBUSY;
535 if (!devm_request_mem_region(card->dev, chip->base, BUFFSIZE,
536 card->shortname)) {
537 dev_err(card->dev, LOGNAME
538 ": unable to grab memory region 0x%lx-0x%lx\n",
539 chip->base, chip->base + BUFFSIZE - 1);
540 return -EBUSY;
542 chip->mappedbase = devm_ioremap(card->dev, chip->base, 0x8000);
543 if (!chip->mappedbase) {
544 dev_err(card->dev, LOGNAME
545 ": unable to map memory region 0x%lx-0x%lx\n",
546 chip->base, chip->base + BUFFSIZE - 1);
547 return -EIO;
556 dev_err(card->dev, LOGNAME ": error creating new PCM device\n");
562 dev_err(card->dev, LOGNAME ": error creating new Mixer device\n");
575 &chip->rmidi);
577 dev_err(card->dev, LOGNAME
578 ": error creating new Midi device\n");
581 mpu = chip->rmidi->private_data;
583 mpu->open_input = snd_msnd_mpu401_open;
584 mpu->close_input = snd_msnd_mpu401_close;
585 mpu->private_data = chip;
588 disable_irq(chip->irq);
589 snd_msnd_calibrate_adc(chip, chip->play_sample_rate);
609 dev_err(chip->card->dev, LOGNAME ": %s: I/O error\n", __func__);
610 return -EIO;
615 static int snd_msnd_write_cfg_io0(struct snd_msnd *chip, int cfg, int num, u16 io)
618 return -EIO;
619 if (snd_msnd_write_cfg(chip, cfg, IREG_IO0_BASEHI, HIBYTE(io)))
620 return -EIO;
621 if (snd_msnd_write_cfg(chip, cfg, IREG_IO0_BASELO, LOBYTE(io)))
622 return -EIO;
626 static int snd_msnd_write_cfg_io1(struct snd_msnd *chip, int cfg, int num, u16 io)
629 return -EIO;
630 if (snd_msnd_write_cfg(chip, cfg, IREG_IO1_BASEHI, HIBYTE(io)))
631 return -EIO;
632 if (snd_msnd_write_cfg(chip, cfg, IREG_IO1_BASELO, LOBYTE(io)))
633 return -EIO;
640 return -EIO;
642 return -EIO;
644 return -EIO;
655 return -EIO;
657 return -EIO;
659 return -EIO;
662 return -EIO;
669 return -EIO;
671 return -EIO;
680 return -EIO;
682 return -EIO;
684 return -EIO;
686 return -EIO;
688 return -EIO;
690 return -EIO;
698 /* Reset devices if told to */
699 dev_info(chip->card->dev, LOGNAME ": Resetting all devices\n");
702 return -EIO;
708 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
716 static long io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
733 static int reset[SNDRV_CARDS];
736 static int write_ndelay[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 1 };
755 module_param_hw_array(io, long, ioport, NULL, 0444);
756 MODULE_PARM_DESC(io, "IO port #");
764 module_param_array(reset, int, NULL, 0444);
776 if (io[i] == SNDRV_AUTO_PORT)
780 dev_warn(pdev, LOGNAME ": io, irq and mem must be set\n");
785 if (!(io[i] == 0x290 ||
786 io[i] == 0x260 ||
787 io[i] == 0x250 ||
788 io[i] == 0x240 ||
789 io[i] == 0x230 ||
790 io[i] == 0x220 ||
791 io[i] == 0x210 ||
792 io[i] == 0x3e0)) {
793 dev_err(pdev, LOGNAME ": \"io\" - DSP I/O base must be set "
795 "or 0x3E0\n");
799 if (io[i] < 0x100 || io[i] > 0x3e0 || (io[i] % 0x10) != 0) {
801 ": \"io\" - DSP I/O base must within the range 0x100 "
802 "to 0x3E0 and must be evenly divisible by 0x10\n");
814 ": \"irq\" - must be set to 5, 7, 9, 10, 11 or 12\n");
824 dev_err(pdev, LOGNAME ": \"mem\" - must be set to "
826 "0xe8000\n");
832 dev_info(pdev, LOGNAME ": Assuming PnP mode\n");
836 "(or unspecified for PnP mode)\n");
855 dev_info(pdev, LOGNAME ": Assuming PnP mode\n");
856 return -ENODEV;
864 chip = card->private_data;
865 chip->card = card;
870 chip->irqid = HPIRQ_5; break;
872 chip->irqid = HPIRQ_7; break;
874 chip->irqid = HPIRQ_9; break;
876 chip->irqid = HPIRQ_10; break;
878 chip->irqid = HPIRQ_11; break;
880 chip->irqid = HPIRQ_12; break;
885 chip->memid = HPMEM_B000; break;
887 chip->memid = HPMEM_C800; break;
889 chip->memid = HPMEM_D000; break;
891 chip->memid = HPMEM_D800; break;
893 chip->memid = HPMEM_E000; break;
895 chip->memid = HPMEM_E800; break;
898 dev_info(pdev, LOGNAME ": Non-PnP mode: configuring at port 0x%lx\n",
901 if (!devm_request_region(card->dev, cfg[idx], 2,
903 dev_err(pdev, LOGNAME ": Config port 0x%lx conflict\n",
905 return -EIO;
907 if (reset[idx])
909 return -EIO;
913 io[idx], 0,
925 ": Configuring MPU to I/O 0x%lx IRQ %d\n",
940 ": Configuring IDE to I/O 0x%lx, 0x%lx IRQ %d\n",
953 ": Configuring joystick to I/O 0x%lx\n",
967 chip->type = msndClassic;
969 chip->type = msndPinnacle;
971 chip->io = io[idx];
972 chip->irq = irq[idx];
973 chip->base = mem[idx];
975 chip->calibrate_signal = calibrate_signal ? 1 : 0;
976 chip->recsrc = 0;
977 chip->dspq_data_buff = DSPQ_DATA_BUFF;
978 chip->dspq_buff_size = DSPQ_BUFF_SIZE;
980 clear_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
982 set_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
985 set_bit(F_HAVEDIGITAL, &chip->flags);
987 spin_lock_init(&chip->lock);
990 dev_err(pdev, LOGNAME ": Probe failed\n");
996 dev_err(pdev, LOGNAME ": Attach failed\n");
1029 return -ENODEV;
1034 pnp_dev = pnp_request_card_device(pcard, pid->devs[0].id, NULL);
1036 return -ENODEV;
1038 mpu_dev = pnp_request_card_device(pcard, pid->devs[1].id, NULL);
1040 return -ENODEV;
1043 dev_info(&pcard->card->dev, "msnd_pinnacle: device is inactive\n");
1044 return -EBUSY;
1048 dev_info(&pcard->card->dev, "msnd_pinnacle: MPU device is inactive\n");
1049 return -EBUSY;
1056 ret = snd_devm_card_new(&pcard->card->dev,
1062 chip = card->private_data;
1063 chip->card = card;
1068 io[idx] = pnp_port_start(pnp_dev, 0);
1076 chip->type = msndClassic;
1078 chip->type = msndPinnacle;
1080 chip->io = io[idx];
1081 chip->irq = irq[idx];
1082 chip->base = mem[idx];
1084 chip->calibrate_signal = calibrate_signal ? 1 : 0;
1085 chip->recsrc = 0;
1086 chip->dspq_data_buff = DSPQ_DATA_BUFF;
1087 chip->dspq_buff_size = DSPQ_BUFF_SIZE;
1089 clear_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
1091 set_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
1094 set_bit(F_HAVEDIGITAL, &chip->flags);
1096 spin_lock_init(&chip->lock);
1099 dev_err(&pcard->card->dev, LOGNAME ": Probe failed\n");
1105 dev_err(&pcard->card->dev, LOGNAME ": Attach failed\n");