summaryrefslogtreecommitdiffstats
path: root/sound/isa
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-14 15:44:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-14 15:44:00 -0400
commit0a264b6db702e0e9bdf8b037c61c951f87785bfc (patch)
tree2c41f6dababaabca41c5fc9225989c7151e04ed3 /sound/isa
parent1e5a2b1fbb41c619c1abbe9b853269d3d932cdf1 (diff)
parentb9091b1c654953cc9615f282704a6df8e31549cf (diff)
Merge tag 'sound-fix-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai: "Small last-minute fixes for 4.13-rc1: a couple of PCM fixes for m68k, a cleanup work for legacy ISA msnd driver, and a few HD-audio new IDs and quirks" * tag 'sound-fix-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Add hdmi id for a Geminilake variant ALSA: hda/realtek - New codec device ID for ALC1220 ALSA: pcm: Simplify check for dma_mmap_coherent() availability ALSA: pcm: Protect call to dma_mmap_coherent() by check for HAS_DMA ALSA: msnd: Optimize / harden DSP and MIDI loops ALSA: hda/realtek - change the location for one of two front microphones ALSA: opl4: Move inline before return type
Diffstat (limited to 'sound/isa')
-rw-r--r--sound/isa/msnd/msnd_midi.c30
-rw-r--r--sound/isa/msnd/msnd_pinnacle.c23
2 files changed, 27 insertions, 26 deletions
diff --git a/sound/isa/msnd/msnd_midi.c b/sound/isa/msnd/msnd_midi.c
index 912b5a9ccbab..013d8d1170fe 100644
--- a/sound/isa/msnd/msnd_midi.c
+++ b/sound/isa/msnd/msnd_midi.c
@@ -120,24 +120,24 @@ void snd_msndmidi_input_read(void *mpuv)
120 unsigned long flags; 120 unsigned long flags;
121 struct snd_msndmidi *mpu = mpuv; 121 struct snd_msndmidi *mpu = mpuv;
122 void *pwMIDQData = mpu->dev->mappedbase + MIDQ_DATA_BUFF; 122 void *pwMIDQData = mpu->dev->mappedbase + MIDQ_DATA_BUFF;
123 u16 head, tail, size;
123 124
124 spin_lock_irqsave(&mpu->input_lock, flags); 125 spin_lock_irqsave(&mpu->input_lock, flags);
125 while (readw(mpu->dev->MIDQ + JQS_wTail) != 126 head = readw(mpu->dev->MIDQ + JQS_wHead);
126 readw(mpu->dev->MIDQ + JQS_wHead)) { 127 tail = readw(mpu->dev->MIDQ + JQS_wTail);
127 u16 wTmp, val; 128 size = readw(mpu->dev->MIDQ + JQS_wSize);
128 val = readw(pwMIDQData + 2 * readw(mpu->dev->MIDQ + JQS_wHead)); 129 if (head > size || tail > size)
129 130 goto out;
130 if (test_bit(MSNDMIDI_MODE_BIT_INPUT_TRIGGER, 131 while (head != tail) {
131 &mpu->mode)) 132 unsigned char val = readw(pwMIDQData + 2 * head);
132 snd_rawmidi_receive(mpu->substream_input, 133
133 (unsigned char *)&val, 1); 134 if (test_bit(MSNDMIDI_MODE_BIT_INPUT_TRIGGER, &mpu->mode))
134 135 snd_rawmidi_receive(mpu->substream_input, &val, 1);
135 wTmp = readw(mpu->dev->MIDQ + JQS_wHead) + 1; 136 if (++head > size)
136 if (wTmp > readw(mpu->dev->MIDQ + JQS_wSize)) 137 head = 0;
137 writew(0, mpu->dev->MIDQ + JQS_wHead); 138 writew(head, mpu->dev->MIDQ + JQS_wHead);
138 else
139 writew(wTmp, mpu->dev->MIDQ + JQS_wHead);
140 } 139 }
140 out:
141 spin_unlock_irqrestore(&mpu->input_lock, flags); 141 spin_unlock_irqrestore(&mpu->input_lock, flags);
142} 142}
143EXPORT_SYMBOL(snd_msndmidi_input_read); 143EXPORT_SYMBOL(snd_msndmidi_input_read);
diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c
index ad4897337df5..fc4fb1904aef 100644
--- a/sound/isa/msnd/msnd_pinnacle.c
+++ b/sound/isa/msnd/msnd_pinnacle.c
@@ -170,23 +170,24 @@ static irqreturn_t snd_msnd_interrupt(int irq, void *dev_id)
170{ 170{
171 struct snd_msnd *chip = dev_id; 171 struct snd_msnd *chip = dev_id;
172 void *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF; 172 void *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF;
173 u16 head, tail, size;
173 174
174 /* Send ack to DSP */ 175 /* Send ack to DSP */
175 /* inb(chip->io + HP_RXL); */ 176 /* inb(chip->io + HP_RXL); */
176 177
177 /* Evaluate queued DSP messages */ 178 /* Evaluate queued DSP messages */
178 while (readw(chip->DSPQ + JQS_wTail) != readw(chip->DSPQ + JQS_wHead)) { 179 head = readw(chip->DSPQ + JQS_wHead);
179 u16 wTmp; 180 tail = readw(chip->DSPQ + JQS_wTail);
180 181 size = readw(chip->DSPQ + JQS_wSize);
181 snd_msnd_eval_dsp_msg(chip, 182 if (head > size || tail > size)
182 readw(pwDSPQData + 2 * readw(chip->DSPQ + JQS_wHead))); 183 goto out;
183 184 while (head != tail) {
184 wTmp = readw(chip->DSPQ + JQS_wHead) + 1; 185 snd_msnd_eval_dsp_msg(chip, readw(pwDSPQData + 2 * head));
185 if (wTmp > readw(chip->DSPQ + JQS_wSize)) 186 if (++head > size)
186 writew(0, chip->DSPQ + JQS_wHead); 187 head = 0;
187 else 188 writew(head, chip->DSPQ + JQS_wHead);
188 writew(wTmp, chip->DSPQ + JQS_wHead);
189 } 189 }
190 out:
190 /* Send ack to DSP */ 191 /* Send ack to DSP */
191 inb(chip->io + HP_RXL); 192 inb(chip->io + HP_RXL);
192 return IRQ_HANDLED; 193 return IRQ_HANDLED;