diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-14 15:44:00 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-14 15:44:00 -0400 |
commit | 0a264b6db702e0e9bdf8b037c61c951f87785bfc (patch) | |
tree | 2c41f6dababaabca41c5fc9225989c7151e04ed3 /sound/isa | |
parent | 1e5a2b1fbb41c619c1abbe9b853269d3d932cdf1 (diff) | |
parent | b9091b1c654953cc9615f282704a6df8e31549cf (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.c | 30 | ||||
-rw-r--r-- | sound/isa/msnd/msnd_pinnacle.c | 23 |
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 | } |
143 | EXPORT_SYMBOL(snd_msndmidi_input_read); | 143 | EXPORT_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; |