提交 92d71005 编写于 作者: T Takashi Iwai

ALSA: ice1724 - Check error in set_rate function

The set_rate might return error but the current code doesn't check it.
This patch adds a proper error check.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 413f81eb
...@@ -626,7 +626,7 @@ static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice, ...@@ -626,7 +626,7 @@ static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice,
return 0; return 0;
} }
static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
int force) int force)
{ {
unsigned long flags; unsigned long flags;
...@@ -634,17 +634,18 @@ static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, ...@@ -634,17 +634,18 @@ static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
unsigned int i, old_rate; unsigned int i, old_rate;
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1]) if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
return; return -EINVAL;
spin_lock_irqsave(&ice->reg_lock, flags); spin_lock_irqsave(&ice->reg_lock, flags);
if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) || if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) ||
(inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) {
/* running? we cannot change the rate now... */ /* running? we cannot change the rate now... */
spin_unlock_irqrestore(&ice->reg_lock, flags); spin_unlock_irqrestore(&ice->reg_lock, flags);
return; return -EBUSY;
} }
if (!force && is_pro_rate_locked(ice)) { if (!force && is_pro_rate_locked(ice)) {
spin_unlock_irqrestore(&ice->reg_lock, flags); spin_unlock_irqrestore(&ice->reg_lock, flags);
return; return (rate == ice->cur_rate) ? 0 : -EBUSY;
} }
old_rate = ice->get_rate(ice); old_rate = ice->get_rate(ice);
...@@ -652,7 +653,7 @@ static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, ...@@ -652,7 +653,7 @@ static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
ice->set_rate(ice, rate); ice->set_rate(ice, rate);
else if (rate == ice->cur_rate) { else if (rate == ice->cur_rate) {
spin_unlock_irqrestore(&ice->reg_lock, flags); spin_unlock_irqrestore(&ice->reg_lock, flags);
return; return 0;
} }
ice->cur_rate = rate; ice->cur_rate = rate;
...@@ -674,13 +675,15 @@ static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, ...@@ -674,13 +675,15 @@ static void snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
} }
if (ice->spdif.ops.setup_rate) if (ice->spdif.ops.setup_rate)
ice->spdif.ops.setup_rate(ice, rate); ice->spdif.ops.setup_rate(ice, rate);
return 0;
} }
static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *hw_params) struct snd_pcm_hw_params *hw_params)
{ {
struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
int i, chs; int i, chs, err;
chs = params_channels(hw_params); chs = params_channels(hw_params);
mutex_lock(&ice->open_mutex); mutex_lock(&ice->open_mutex);
...@@ -715,7 +718,11 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -715,7 +718,11 @@ static int snd_vt1724_pcm_hw_params(struct snd_pcm_substream *substream,
} }
} }
mutex_unlock(&ice->open_mutex); mutex_unlock(&ice->open_mutex);
snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0);
err = snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0);
if (err < 0)
return err;
return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册