ALSA: ice1712: Fix boundary checks in PCM pointer ops
commit 4f8e940095536bc002a81666a4107a581c84e9b9 upstream. PCM pointer callbacks in ice1712 driver check the buffer size boundary wrongly between bytes and frames. This leads to PCM core warnings like: snd_pcm_update_hw_ptr0: 105 callbacks suppressed ALSA pcm_lib.c:352 BUG: pcmC3D0c:0, pos = 5461, buffer size = 5461, period size = 2730 This patch fixes these checks to be placed after the proper unit conversions. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
4ce77a7a6c
commit
f13dbe1e97
@@ -685,9 +685,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pointer(struct snd_pcm_substream *
|
||||
if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1))
|
||||
return 0;
|
||||
ptr = runtime->buffer_size - inw(ice->ddma_port + 4);
|
||||
ptr = bytes_to_frames(substream->runtime, ptr);
|
||||
if (ptr == runtime->buffer_size)
|
||||
ptr = 0;
|
||||
return bytes_to_frames(substream->runtime, ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substream *substream)
|
||||
@@ -704,9 +705,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substrea
|
||||
addr = ICE1712_DSC_ADDR0;
|
||||
ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) -
|
||||
ice->playback_con_virt_addr[substream->number];
|
||||
ptr = bytes_to_frames(substream->runtime, ptr);
|
||||
if (ptr == substream->runtime->buffer_size)
|
||||
ptr = 0;
|
||||
return bytes_to_frames(substream->runtime, ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *substream)
|
||||
@@ -717,9 +719,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *s
|
||||
if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1))
|
||||
return 0;
|
||||
ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr;
|
||||
ptr = bytes_to_frames(substream->runtime, ptr);
|
||||
if (ptr == substream->runtime->buffer_size)
|
||||
ptr = 0;
|
||||
return bytes_to_frames(substream->runtime, ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static const struct snd_pcm_hardware snd_ice1712_playback = {
|
||||
@@ -1113,9 +1116,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pro_pointer(struct snd_pcm_substre
|
||||
if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START))
|
||||
return 0;
|
||||
ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2);
|
||||
ptr = bytes_to_frames(substream->runtime, ptr);
|
||||
if (ptr == substream->runtime->buffer_size)
|
||||
ptr = 0;
|
||||
return bytes_to_frames(substream->runtime, ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substream *substream)
|
||||
@@ -1126,9 +1130,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substrea
|
||||
if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW))
|
||||
return 0;
|
||||
ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2);
|
||||
ptr = bytes_to_frames(substream->runtime, ptr);
|
||||
if (ptr == substream->runtime->buffer_size)
|
||||
ptr = 0;
|
||||
return bytes_to_frames(substream->runtime, ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static const struct snd_pcm_hardware snd_ice1712_playback_pro = {
|
||||
|
||||
Reference in New Issue
Block a user