mirror of https://github.com/torvalds/linux.git
ALSA: ice1712: Use guard() for spin locks
Clean up the code using guard() for spin locks. Merely code refactoring, and no behavior change. Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://patch.msgid.link/20250829144342.4290-36-tiwai@suse.de
This commit is contained in:
parent
9da230b3b2
commit
d0b8e41904
|
|
@ -202,15 +202,13 @@ static int delta_spdif_default_put(struct snd_ice1712 *ice, struct snd_ctl_elem_
|
|||
int change;
|
||||
|
||||
val = snd_cs8403_encode_spdif_bits(&ucontrol->value.iec958);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
change = ice->spdif.cs8403_bits != val;
|
||||
ice->spdif.cs8403_bits = val;
|
||||
if (change && ice->playback_pro_substream == NULL) {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
snd_ice1712_delta_cs8403_spdif_write(ice, val);
|
||||
} else {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
change = ice->spdif.cs8403_bits != val;
|
||||
ice->spdif.cs8403_bits = val;
|
||||
if (!change || ice->playback_pro_substream)
|
||||
return change;
|
||||
}
|
||||
snd_ice1712_delta_cs8403_spdif_write(ice, val);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -225,15 +223,13 @@ static int delta_spdif_stream_put(struct snd_ice1712 *ice, struct snd_ctl_elem_v
|
|||
int change;
|
||||
|
||||
val = snd_cs8403_encode_spdif_bits(&ucontrol->value.iec958);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
change = ice->spdif.cs8403_stream_bits != val;
|
||||
ice->spdif.cs8403_stream_bits = val;
|
||||
if (change && ice->playback_pro_substream != NULL) {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
snd_ice1712_delta_cs8403_spdif_write(ice, val);
|
||||
} else {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
change = ice->spdif.cs8403_stream_bits != val;
|
||||
ice->spdif.cs8403_stream_bits = val;
|
||||
if (!change || ice->playback_pro_substream)
|
||||
return change;
|
||||
}
|
||||
snd_ice1712_delta_cs8403_spdif_write(ice, val);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -375,23 +371,22 @@ static void delta_open_spdif(struct snd_ice1712 *ice, struct snd_pcm_substream *
|
|||
/* set up */
|
||||
static void delta_setup_spdif(struct snd_ice1712 *ice, int rate)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int tmp;
|
||||
int change;
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
tmp = ice->spdif.cs8403_stream_bits;
|
||||
if (tmp & 0x01) /* consumer */
|
||||
tmp &= (tmp & 0x01) ? ~0x06 : ~0x18;
|
||||
switch (rate) {
|
||||
case 32000: tmp |= (tmp & 0x01) ? 0x04 : 0x00; break;
|
||||
case 44100: tmp |= (tmp & 0x01) ? 0x00 : 0x10; break;
|
||||
case 48000: tmp |= (tmp & 0x01) ? 0x02 : 0x08; break;
|
||||
default: tmp |= (tmp & 0x01) ? 0x00 : 0x18; break;
|
||||
scoped_guard(spinlock_irqsave, &ice->reg_lock) {
|
||||
tmp = ice->spdif.cs8403_stream_bits;
|
||||
if (tmp & 0x01) /* consumer */
|
||||
tmp &= (tmp & 0x01) ? ~0x06 : ~0x18;
|
||||
switch (rate) {
|
||||
case 32000: tmp |= (tmp & 0x01) ? 0x04 : 0x00; break;
|
||||
case 44100: tmp |= (tmp & 0x01) ? 0x00 : 0x10; break;
|
||||
case 48000: tmp |= (tmp & 0x01) ? 0x02 : 0x08; break;
|
||||
default: tmp |= (tmp & 0x01) ? 0x00 : 0x18; break;
|
||||
}
|
||||
change = ice->spdif.cs8403_stream_bits != tmp;
|
||||
ice->spdif.cs8403_stream_bits = tmp;
|
||||
}
|
||||
change = ice->spdif.cs8403_stream_bits != tmp;
|
||||
ice->spdif.cs8403_stream_bits = tmp;
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
if (change)
|
||||
snd_ctl_notify(ice->card, SNDRV_CTL_EVENT_MASK_VALUE, &ice->spdif.stream_ctl->id);
|
||||
snd_ice1712_delta_cs8403_spdif_write(ice, tmp);
|
||||
|
|
|
|||
|
|
@ -260,15 +260,13 @@ static int ews88_spdif_default_put(struct snd_ice1712 *ice, struct snd_ctl_elem_
|
|||
int change;
|
||||
|
||||
val = snd_cs8404_encode_spdif_bits(&ucontrol->value.iec958);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
change = ice->spdif.cs8403_bits != val;
|
||||
ice->spdif.cs8403_bits = val;
|
||||
if (change && ice->playback_pro_substream == NULL) {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
snd_ice1712_ews_cs8404_spdif_write(ice, val);
|
||||
} else {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
change = ice->spdif.cs8403_bits != val;
|
||||
ice->spdif.cs8403_bits = val;
|
||||
if (!change || ice->playback_pro_substream)
|
||||
return change;
|
||||
}
|
||||
snd_ice1712_ews_cs8404_spdif_write(ice, val);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -283,15 +281,13 @@ static int ews88_spdif_stream_put(struct snd_ice1712 *ice, struct snd_ctl_elem_v
|
|||
int change;
|
||||
|
||||
val = snd_cs8404_encode_spdif_bits(&ucontrol->value.iec958);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
change = ice->spdif.cs8403_stream_bits != val;
|
||||
ice->spdif.cs8403_stream_bits = val;
|
||||
if (change && ice->playback_pro_substream != NULL) {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
snd_ice1712_ews_cs8404_spdif_write(ice, val);
|
||||
} else {
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
change = ice->spdif.cs8403_stream_bits != val;
|
||||
ice->spdif.cs8403_stream_bits = val;
|
||||
if (!change || ice->playback_pro_substream)
|
||||
return change;
|
||||
}
|
||||
snd_ice1712_ews_cs8404_spdif_write(ice, val);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -305,23 +301,22 @@ static void ews88_open_spdif(struct snd_ice1712 *ice, struct snd_pcm_substream *
|
|||
/* set up SPDIF for EWS88MT / EWS88D */
|
||||
static void ews88_setup_spdif(struct snd_ice1712 *ice, int rate)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned char tmp;
|
||||
int change;
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
tmp = ice->spdif.cs8403_stream_bits;
|
||||
if (tmp & 0x10) /* consumer */
|
||||
tmp &= (tmp & 0x01) ? ~0x06 : ~0x60;
|
||||
switch (rate) {
|
||||
case 32000: tmp |= (tmp & 0x01) ? 0x02 : 0x00; break;
|
||||
case 44100: tmp |= (tmp & 0x01) ? 0x06 : 0x40; break;
|
||||
case 48000: tmp |= (tmp & 0x01) ? 0x04 : 0x20; break;
|
||||
default: tmp |= (tmp & 0x01) ? 0x06 : 0x40; break;
|
||||
scoped_guard(spinlock_irqsave, &ice->reg_lock) {
|
||||
tmp = ice->spdif.cs8403_stream_bits;
|
||||
if (tmp & 0x10) /* consumer */
|
||||
tmp &= (tmp & 0x01) ? ~0x06 : ~0x60;
|
||||
switch (rate) {
|
||||
case 32000: tmp |= (tmp & 0x01) ? 0x02 : 0x00; break;
|
||||
case 44100: tmp |= (tmp & 0x01) ? 0x06 : 0x40; break;
|
||||
case 48000: tmp |= (tmp & 0x01) ? 0x04 : 0x20; break;
|
||||
default: tmp |= (tmp & 0x01) ? 0x06 : 0x40; break;
|
||||
}
|
||||
change = ice->spdif.cs8403_stream_bits != tmp;
|
||||
ice->spdif.cs8403_stream_bits = tmp;
|
||||
}
|
||||
change = ice->spdif.cs8403_stream_bits != tmp;
|
||||
ice->spdif.cs8403_stream_bits = tmp;
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
if (change)
|
||||
snd_ctl_notify(ice->card, SNDRV_CTL_EVENT_MASK_VALUE, &ice->spdif.stream_ctl->id);
|
||||
snd_ice1712_ews_cs8404_spdif_write(ice, tmp);
|
||||
|
|
|
|||
|
|
@ -249,13 +249,12 @@ static int snd_ice1712_digmix_route_ac97_put(struct snd_kcontrol *kcontrol, stru
|
|||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||
unsigned char val, nval;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
val = inb(ICEMT(ice, MONITOR_ROUTECTRL));
|
||||
nval = val & ~ICE1712_ROUTE_AC97;
|
||||
if (ucontrol->value.integer.value[0])
|
||||
nval |= ICE1712_ROUTE_AC97;
|
||||
outb(nval, ICEMT(ice, MONITOR_ROUTECTRL));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return val != nval;
|
||||
}
|
||||
|
||||
|
|
@ -484,7 +483,7 @@ static int snd_ice1712_playback_trigger(struct snd_pcm_substream *substream,
|
|||
int result = 0;
|
||||
u32 tmp;
|
||||
|
||||
spin_lock(&ice->reg_lock);
|
||||
guard(spinlock)(&ice->reg_lock);
|
||||
tmp = snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL);
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START) {
|
||||
tmp |= 1;
|
||||
|
|
@ -498,7 +497,6 @@ static int snd_ice1712_playback_trigger(struct snd_pcm_substream *substream,
|
|||
result = -EINVAL;
|
||||
}
|
||||
snd_ice1712_write(ice, ICE1712_IREG_PBK_CTRL, tmp);
|
||||
spin_unlock(&ice->reg_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -509,7 +507,7 @@ static int snd_ice1712_playback_ds_trigger(struct snd_pcm_substream *substream,
|
|||
int result = 0;
|
||||
u32 tmp;
|
||||
|
||||
spin_lock(&ice->reg_lock);
|
||||
guard(spinlock)(&ice->reg_lock);
|
||||
tmp = snd_ice1712_ds_read(ice, substream->number * 2, ICE1712_DSC_CONTROL);
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START) {
|
||||
tmp |= 1;
|
||||
|
|
@ -523,7 +521,6 @@ static int snd_ice1712_playback_ds_trigger(struct snd_pcm_substream *substream,
|
|||
result = -EINVAL;
|
||||
}
|
||||
snd_ice1712_ds_write(ice, substream->number * 2, ICE1712_DSC_CONTROL, tmp);
|
||||
spin_unlock(&ice->reg_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -534,7 +531,7 @@ static int snd_ice1712_capture_trigger(struct snd_pcm_substream *substream,
|
|||
int result = 0;
|
||||
u8 tmp;
|
||||
|
||||
spin_lock(&ice->reg_lock);
|
||||
guard(spinlock)(&ice->reg_lock);
|
||||
tmp = snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL);
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START) {
|
||||
tmp |= 1;
|
||||
|
|
@ -544,7 +541,6 @@ static int snd_ice1712_capture_trigger(struct snd_pcm_substream *substream,
|
|||
result = -EINVAL;
|
||||
}
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_CTRL, tmp);
|
||||
spin_unlock(&ice->reg_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -564,7 +560,7 @@ static int snd_ice1712_playback_prepare(struct snd_pcm_substream *substream)
|
|||
rate = (runtime->rate * 8192) / 375;
|
||||
if (rate > 0x000fffff)
|
||||
rate = 0x000fffff;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
outb(0, ice->ddma_port + 15);
|
||||
outb(ICE1712_DMA_MODE_WRITE | ICE1712_DMA_AUTOINIT, ice->ddma_port + 0x0b);
|
||||
outl(runtime->dma_addr, ice->ddma_port + 0);
|
||||
|
|
@ -577,7 +573,6 @@ static int snd_ice1712_playback_prepare(struct snd_pcm_substream *substream)
|
|||
snd_ice1712_write(ice, ICE1712_IREG_PBK_COUNT_HI, period_size >> 8);
|
||||
snd_ice1712_write(ice, ICE1712_IREG_PBK_LEFT, 0);
|
||||
snd_ice1712_write(ice, ICE1712_IREG_PBK_RIGHT, 0);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -599,7 +594,7 @@ static int snd_ice1712_playback_ds_prepare(struct snd_pcm_substream *substream)
|
|||
ice->playback_con_active_buf[substream->number] = 0;
|
||||
ice->playback_con_virt_addr[substream->number] = runtime->dma_addr;
|
||||
chn = substream->number * 2;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
snd_ice1712_ds_write(ice, chn, ICE1712_DSC_ADDR0, runtime->dma_addr);
|
||||
snd_ice1712_ds_write(ice, chn, ICE1712_DSC_COUNT0, period_size);
|
||||
snd_ice1712_ds_write(ice, chn, ICE1712_DSC_ADDR1, runtime->dma_addr + (runtime->periods > 1 ? period_size + 1 : 0));
|
||||
|
|
@ -611,7 +606,6 @@ static int snd_ice1712_playback_ds_prepare(struct snd_pcm_substream *substream)
|
|||
snd_ice1712_ds_write(ice, chn + 1, ICE1712_DSC_RATE, rate);
|
||||
snd_ice1712_ds_write(ice, chn + 1, ICE1712_DSC_VOLUME, 0);
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -629,13 +623,13 @@ static int snd_ice1712_capture_prepare(struct snd_pcm_substream *substream)
|
|||
tmp &= ~0x04;
|
||||
if (runtime->channels == 2)
|
||||
tmp &= ~0x02;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
outl(ice->capture_con_virt_addr = runtime->dma_addr, ICEREG(ice, CONCAP_ADDR));
|
||||
outw(buf_size, ICEREG(ice, CONCAP_COUNT));
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_COUNT_HI, period_size >> 8);
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_COUNT_LO, period_size & 0xff);
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_CTRL, tmp);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
outl(ice->capture_con_virt_addr = runtime->dma_addr, ICEREG(ice, CONCAP_ADDR));
|
||||
outw(buf_size, ICEREG(ice, CONCAP_COUNT));
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_COUNT_HI, period_size >> 8);
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_COUNT_LO, period_size & 0xff);
|
||||
snd_ice1712_write(ice, ICE1712_IREG_CAP_CTRL, tmp);
|
||||
}
|
||||
snd_ac97_set_rate(ice->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -763,10 +757,9 @@ static int snd_ice1712_playback_ds_open(struct snd_pcm_substream *substream)
|
|||
|
||||
ice->playback_con_substream_ds[substream->number] = substream;
|
||||
runtime->hw = snd_ice1712_playback_ds;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
tmp = inw(ICEDS(ice, INTMASK)) & ~(1 << (substream->number * 2));
|
||||
outw(tmp, ICEDS(ice, INTMASK));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -796,10 +789,9 @@ static int snd_ice1712_playback_ds_close(struct snd_pcm_substream *substream)
|
|||
struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
|
||||
u32 tmp;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
tmp = inw(ICEDS(ice, INTMASK)) | (3 << (substream->number * 2));
|
||||
outw(tmp, ICEDS(ice, INTMASK));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
ice->playback_con_substream_ds[substream->number] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -911,14 +903,13 @@ static int snd_ice1712_pro_trigger(struct snd_pcm_substream *substream,
|
|||
return -EINVAL;
|
||||
what = ICE1712_PLAYBACK_PAUSE;
|
||||
snd_pcm_trigger_done(substream, substream);
|
||||
spin_lock(&ice->reg_lock);
|
||||
guard(spinlock)(&ice->reg_lock);
|
||||
old = inl(ICEMT(ice, PLAYBACK_CONTROL));
|
||||
if (cmd == SNDRV_PCM_TRIGGER_PAUSE_PUSH)
|
||||
old |= what;
|
||||
else
|
||||
old &= ~what;
|
||||
outl(old, ICEMT(ice, PLAYBACK_CONTROL));
|
||||
spin_unlock(&ice->reg_lock);
|
||||
break;
|
||||
}
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
|
|
@ -937,14 +928,13 @@ static int snd_ice1712_pro_trigger(struct snd_pcm_substream *substream,
|
|||
snd_pcm_trigger_done(s, substream);
|
||||
}
|
||||
}
|
||||
spin_lock(&ice->reg_lock);
|
||||
guard(spinlock)(&ice->reg_lock);
|
||||
old = inl(ICEMT(ice, PLAYBACK_CONTROL));
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START)
|
||||
old |= what;
|
||||
else
|
||||
old &= ~what;
|
||||
outl(old, ICEMT(ice, PLAYBACK_CONTROL));
|
||||
spin_unlock(&ice->reg_lock);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
@ -957,7 +947,6 @@ static int snd_ice1712_pro_trigger(struct snd_pcm_substream *substream,
|
|||
*/
|
||||
static void snd_ice1712_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, int force)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned char val, old;
|
||||
unsigned int i;
|
||||
|
||||
|
|
@ -982,24 +971,21 @@ static void snd_ice1712_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||
break;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
if (inb(ICEMT(ice, PLAYBACK_CONTROL)) & (ICE1712_CAPTURE_START_SHADOW|
|
||||
ICE1712_PLAYBACK_PAUSE|
|
||||
ICE1712_PLAYBACK_START)) {
|
||||
__out:
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return;
|
||||
scoped_guard(spinlock_irqsave, &ice->reg_lock) {
|
||||
if (inb(ICEMT(ice, PLAYBACK_CONTROL)) & (ICE1712_CAPTURE_START_SHADOW|
|
||||
ICE1712_PLAYBACK_PAUSE|
|
||||
ICE1712_PLAYBACK_START))
|
||||
return;
|
||||
if (!force && is_pro_rate_locked(ice))
|
||||
return;
|
||||
|
||||
old = inb(ICEMT(ice, RATE));
|
||||
if (!force && old == val)
|
||||
return;
|
||||
|
||||
ice->cur_rate = rate;
|
||||
outb(val, ICEMT(ice, RATE));
|
||||
}
|
||||
if (!force && is_pro_rate_locked(ice))
|
||||
goto __out;
|
||||
|
||||
old = inb(ICEMT(ice, RATE));
|
||||
if (!force && old == val)
|
||||
goto __out;
|
||||
|
||||
ice->cur_rate = rate;
|
||||
outb(val, ICEMT(ice, RATE));
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
|
||||
if (ice->gpio.set_pro_rate)
|
||||
ice->gpio.set_pro_rate(ice, rate);
|
||||
|
|
@ -1016,11 +1002,10 @@ static int snd_ice1712_playback_pro_prepare(struct snd_pcm_substream *substream)
|
|||
struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
|
||||
|
||||
ice->playback_pro_size = snd_pcm_lib_buffer_bytes(substream);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
outl(substream->runtime->dma_addr, ICEMT(ice, PLAYBACK_ADDR));
|
||||
outw((ice->playback_pro_size >> 2) - 1, ICEMT(ice, PLAYBACK_SIZE));
|
||||
outw((snd_pcm_lib_period_bytes(substream) >> 2) - 1, ICEMT(ice, PLAYBACK_COUNT));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1039,11 +1024,10 @@ static int snd_ice1712_capture_pro_prepare(struct snd_pcm_substream *substream)
|
|||
struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
|
||||
|
||||
ice->capture_pro_size = snd_pcm_lib_buffer_bytes(substream);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
outl(substream->runtime->dma_addr, ICEMT(ice, CAPTURE_ADDR));
|
||||
outw((ice->capture_pro_size >> 2) - 1, ICEMT(ice, CAPTURE_SIZE));
|
||||
outw((snd_pcm_lib_period_bytes(substream) >> 2) - 1, ICEMT(ice, CAPTURE_COUNT));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1258,12 +1242,11 @@ static int snd_ice1712_pro_mixer_switch_get(struct snd_kcontrol *kcontrol, struc
|
|||
int priv_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) +
|
||||
kcontrol->private_value;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
ucontrol->value.integer.value[0] =
|
||||
!((ice->pro_volumes[priv_idx] >> 15) & 1);
|
||||
ucontrol->value.integer.value[1] =
|
||||
!((ice->pro_volumes[priv_idx] >> 31) & 1);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1276,12 +1259,11 @@ static int snd_ice1712_pro_mixer_switch_put(struct snd_kcontrol *kcontrol, struc
|
|||
|
||||
nval = (ucontrol->value.integer.value[0] ? 0 : 0x00008000) |
|
||||
(ucontrol->value.integer.value[1] ? 0 : 0x80000000);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
nval |= ice->pro_volumes[priv_idx] & ~0x80008000;
|
||||
change = nval != ice->pro_volumes[priv_idx];
|
||||
ice->pro_volumes[priv_idx] = nval;
|
||||
snd_ice1712_update_volume(ice, priv_idx);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -1300,12 +1282,11 @@ static int snd_ice1712_pro_mixer_volume_get(struct snd_kcontrol *kcontrol, struc
|
|||
int priv_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id) +
|
||||
kcontrol->private_value;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
ucontrol->value.integer.value[0] =
|
||||
(ice->pro_volumes[priv_idx] >> 0) & 127;
|
||||
ucontrol->value.integer.value[1] =
|
||||
(ice->pro_volumes[priv_idx] >> 16) & 127;
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1318,12 +1299,11 @@ static int snd_ice1712_pro_mixer_volume_put(struct snd_kcontrol *kcontrol, struc
|
|||
|
||||
nval = (ucontrol->value.integer.value[0] & 127) |
|
||||
((ucontrol->value.integer.value[1] & 127) << 16);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
nval |= ice->pro_volumes[priv_idx] & ~0x007f007f;
|
||||
change = nval != ice->pro_volumes[priv_idx];
|
||||
ice->pro_volumes[priv_idx] = nval;
|
||||
snd_ice1712_update_volume(ice, priv_idx);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -1781,7 +1761,7 @@ static int snd_ice1712_pro_internal_clock_get(struct snd_kcontrol *kcontrol,
|
|||
};
|
||||
unsigned char val;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
if (is_spdif_master(ice)) {
|
||||
ucontrol->value.enumerated.item[0] = 13;
|
||||
} else {
|
||||
|
|
@ -1792,7 +1772,6 @@ static int snd_ice1712_pro_internal_clock_get(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
ucontrol->value.enumerated.item[0] = val;
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1916,10 +1895,9 @@ static int snd_ice1712_pro_rate_locking_put(struct snd_kcontrol *kcontrol,
|
|||
int change = 0, nval;
|
||||
|
||||
nval = ucontrol->value.integer.value[0] ? 1 : 0;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
change = PRO_RATE_LOCKED != nval;
|
||||
PRO_RATE_LOCKED = nval;
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -1947,10 +1925,9 @@ static int snd_ice1712_pro_rate_reset_put(struct snd_kcontrol *kcontrol,
|
|||
int change = 0, nval;
|
||||
|
||||
nval = ucontrol->value.integer.value[0] ? 1 : 0;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
change = PRO_RATE_RESET != nval;
|
||||
PRO_RATE_RESET = nval;
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -1986,10 +1963,10 @@ static int snd_ice1712_pro_route_analog_get(struct snd_kcontrol *kcontrol,
|
|||
int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
|
||||
unsigned int val, cval;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
val = inw(ICEMT(ice, ROUTE_PSDOUT03));
|
||||
cval = inl(ICEMT(ice, ROUTE_CAPTURE));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
val = inw(ICEMT(ice, ROUTE_PSDOUT03));
|
||||
cval = inl(ICEMT(ice, ROUTE_CAPTURE));
|
||||
}
|
||||
|
||||
val >>= ((idx % 2) * 8) + ((idx / 2) * 2);
|
||||
val &= 3;
|
||||
|
|
@ -2023,35 +2000,35 @@ static int snd_ice1712_pro_route_analog_put(struct snd_kcontrol *kcontrol,
|
|||
else
|
||||
nval = 0; /* pcm */
|
||||
shift = ((idx % 2) * 8) + ((idx / 2) * 2);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
val = old_val = inw(ICEMT(ice, ROUTE_PSDOUT03));
|
||||
val &= ~(0x03 << shift);
|
||||
val |= nval << shift;
|
||||
change = val != old_val;
|
||||
if (change)
|
||||
outw(val, ICEMT(ice, ROUTE_PSDOUT03));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
val = old_val = inw(ICEMT(ice, ROUTE_PSDOUT03));
|
||||
val &= ~(0x03 << shift);
|
||||
val |= nval << shift;
|
||||
change = val != old_val;
|
||||
if (change)
|
||||
outw(val, ICEMT(ice, ROUTE_PSDOUT03));
|
||||
}
|
||||
if (nval < 2) /* dig mixer of pcm */
|
||||
return change;
|
||||
|
||||
/* update CAPTURE */
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
val = old_val = inl(ICEMT(ice, ROUTE_CAPTURE));
|
||||
shift = ((idx / 2) * 8) + ((idx % 2) * 4);
|
||||
if (nval == 2) { /* analog in */
|
||||
nval = ucontrol->value.enumerated.item[0] - 1;
|
||||
val &= ~(0x07 << shift);
|
||||
val |= nval << shift;
|
||||
} else { /* spdif in */
|
||||
nval = (ucontrol->value.enumerated.item[0] - 9) << 3;
|
||||
val &= ~(0x08 << shift);
|
||||
val |= nval << shift;
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
val = old_val = inl(ICEMT(ice, ROUTE_CAPTURE));
|
||||
shift = ((idx / 2) * 8) + ((idx % 2) * 4);
|
||||
if (nval == 2) { /* analog in */
|
||||
nval = ucontrol->value.enumerated.item[0] - 1;
|
||||
val &= ~(0x07 << shift);
|
||||
val |= nval << shift;
|
||||
} else { /* spdif in */
|
||||
nval = (ucontrol->value.enumerated.item[0] - 9) << 3;
|
||||
val &= ~(0x08 << shift);
|
||||
val |= nval << shift;
|
||||
}
|
||||
if (val != old_val) {
|
||||
change = 1;
|
||||
outl(val, ICEMT(ice, ROUTE_CAPTURE));
|
||||
}
|
||||
}
|
||||
if (val != old_val) {
|
||||
change = 1;
|
||||
outl(val, ICEMT(ice, ROUTE_CAPTURE));
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -2084,7 +2061,7 @@ static int snd_ice1712_pro_route_spdif_put(struct snd_kcontrol *kcontrol,
|
|||
unsigned int val, old_val, nval;
|
||||
|
||||
/* update SPDOUT */
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
val = old_val = inw(ICEMT(ice, ROUTE_SPDOUT));
|
||||
if (ucontrol->value.enumerated.item[0] >= 11)
|
||||
nval = 1;
|
||||
|
|
@ -2110,7 +2087,6 @@ static int snd_ice1712_pro_route_spdif_put(struct snd_kcontrol *kcontrol,
|
|||
change = val != old_val;
|
||||
if (change)
|
||||
outw(val, ICEMT(ice, ROUTE_SPDOUT));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -2157,10 +2133,9 @@ static int snd_ice1712_pro_volume_rate_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||
int change;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
change = inb(ICEMT(ice, MONITOR_RATE)) != ucontrol->value.integer.value[0];
|
||||
outb(ucontrol->value.integer.value[0], ICEMT(ice, MONITOR_RATE));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -2188,12 +2163,11 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||
int idx;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
for (idx = 0; idx < 22; idx++) {
|
||||
outb(idx, ICEMT(ice, MONITOR_PEAKINDEX));
|
||||
ucontrol->value.integer.value[idx] = inb(ICEMT(ice, MONITOR_PEAKDATA));
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2675,11 +2649,11 @@ static int snd_ice1712_suspend(struct device *dev)
|
|||
|
||||
snd_ac97_suspend(ice->ac97);
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
ice->pm_saved_is_spdif_master = is_spdif_master(ice);
|
||||
ice->pm_saved_spdif_ctrl = inw(ICEMT(ice, ROUTE_SPDOUT));
|
||||
ice->pm_saved_route = inw(ICEMT(ice, ROUTE_PSDOUT03));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
ice->pm_saved_is_spdif_master = is_spdif_master(ice);
|
||||
ice->pm_saved_spdif_ctrl = inw(ICEMT(ice, ROUTE_SPDOUT));
|
||||
ice->pm_saved_route = inw(ICEMT(ice, ROUTE_PSDOUT03));
|
||||
}
|
||||
|
||||
if (ice->pm_suspend)
|
||||
ice->pm_suspend(ice);
|
||||
|
|
@ -2712,10 +2686,10 @@ static int snd_ice1712_resume(struct device *dev)
|
|||
|
||||
if (ice->pm_saved_is_spdif_master) {
|
||||
/* switching to external clock via SPDIF */
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
outb(inb(ICEMT(ice, RATE)) | ICE1712_SPDIF_MASTER,
|
||||
ICEMT(ice, RATE));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
outb(inb(ICEMT(ice, RATE)) | ICE1712_SPDIF_MASTER,
|
||||
ICEMT(ice, RATE));
|
||||
}
|
||||
snd_ice1712_set_input_clock_source(ice, 1);
|
||||
} else {
|
||||
/* internal on-card clock */
|
||||
|
|
|
|||
|
|
@ -288,9 +288,8 @@ static void vt1724_enable_midi_irq(struct snd_rawmidi_substream *substream,
|
|||
{
|
||||
struct snd_ice1712 *ice = substream->rmidi->private_data;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
enable_midi_irq(ice, flag, enable);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
}
|
||||
|
||||
static int vt1724_midi_output_open(struct snd_rawmidi_substream *s)
|
||||
|
|
@ -306,9 +305,8 @@ static int vt1724_midi_output_close(struct snd_rawmidi_substream *s)
|
|||
static void vt1724_midi_output_trigger(struct snd_rawmidi_substream *s, int up)
|
||||
{
|
||||
struct snd_ice1712 *ice = s->rmidi->private_data;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
guard(spinlock_irqsave)(&ice->reg_lock);
|
||||
if (up) {
|
||||
ice->midi_output = 1;
|
||||
vt1724_midi_write(ice);
|
||||
|
|
@ -316,7 +314,6 @@ static void vt1724_midi_output_trigger(struct snd_rawmidi_substream *s, int up)
|
|||
ice->midi_output = 0;
|
||||
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||
}
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
}
|
||||
|
||||
static void vt1724_midi_output_drain(struct snd_rawmidi_substream *s)
|
||||
|
|
@ -357,16 +354,14 @@ static int vt1724_midi_input_close(struct snd_rawmidi_substream *s)
|
|||
static void vt1724_midi_input_trigger(struct snd_rawmidi_substream *s, int up)
|
||||
{
|
||||
struct snd_ice1712 *ice = s->rmidi->private_data;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
guard(spinlock_irqsave)(&ice->reg_lock);
|
||||
if (up) {
|
||||
ice->midi_input = 1;
|
||||
vt1724_midi_read(ice);
|
||||
} else {
|
||||
ice->midi_input = 0;
|
||||
}
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
}
|
||||
|
||||
static const struct snd_rawmidi_ops vt1724_midi_input_ops = {
|
||||
|
|
@ -394,40 +389,39 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
|
|||
status &= status_mask;
|
||||
if (status == 0)
|
||||
break;
|
||||
spin_lock(&ice->reg_lock);
|
||||
if (++timeout > 10) {
|
||||
status = inb(ICEREG1724(ice, IRQSTAT));
|
||||
dev_err(ice->card->dev,
|
||||
"Too long irq loop, status = 0x%x\n", status);
|
||||
if (status & VT1724_IRQ_MPU_TX) {
|
||||
dev_err(ice->card->dev, "Disabling MPU_TX\n");
|
||||
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||
scoped_guard(spinlock, &ice->reg_lock) {
|
||||
if (++timeout > 10) {
|
||||
status = inb(ICEREG1724(ice, IRQSTAT));
|
||||
dev_err(ice->card->dev,
|
||||
"Too long irq loop, status = 0x%x\n", status);
|
||||
if (status & VT1724_IRQ_MPU_TX) {
|
||||
dev_err(ice->card->dev, "Disabling MPU_TX\n");
|
||||
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
spin_unlock(&ice->reg_lock);
|
||||
break;
|
||||
handled = 1;
|
||||
if (status & VT1724_IRQ_MPU_TX) {
|
||||
if (ice->midi_output)
|
||||
vt1724_midi_write(ice);
|
||||
else
|
||||
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||
/* Due to mysterical reasons, MPU_TX is always
|
||||
* generated (and can't be cleared) when a PCM
|
||||
* playback is going. So let's ignore at the
|
||||
* next loop.
|
||||
*/
|
||||
status_mask &= ~VT1724_IRQ_MPU_TX;
|
||||
}
|
||||
if (status & VT1724_IRQ_MPU_RX) {
|
||||
if (ice->midi_input)
|
||||
vt1724_midi_read(ice);
|
||||
else
|
||||
vt1724_midi_clear_rx(ice);
|
||||
}
|
||||
/* ack MPU irq */
|
||||
outb(status, ICEREG1724(ice, IRQSTAT));
|
||||
}
|
||||
handled = 1;
|
||||
if (status & VT1724_IRQ_MPU_TX) {
|
||||
if (ice->midi_output)
|
||||
vt1724_midi_write(ice);
|
||||
else
|
||||
enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
|
||||
/* Due to mysterical reasons, MPU_TX is always
|
||||
* generated (and can't be cleared) when a PCM
|
||||
* playback is going. So let's ignore at the
|
||||
* next loop.
|
||||
*/
|
||||
status_mask &= ~VT1724_IRQ_MPU_TX;
|
||||
}
|
||||
if (status & VT1724_IRQ_MPU_RX) {
|
||||
if (ice->midi_input)
|
||||
vt1724_midi_read(ice);
|
||||
else
|
||||
vt1724_midi_clear_rx(ice);
|
||||
}
|
||||
/* ack MPU irq */
|
||||
outb(status, ICEREG1724(ice, IRQSTAT));
|
||||
spin_unlock(&ice->reg_lock);
|
||||
if (status & VT1724_IRQ_MTPCM) {
|
||||
/*
|
||||
* Multi-track PCM
|
||||
|
|
@ -481,6 +475,7 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
|
|||
|
||||
}
|
||||
}
|
||||
out:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
|
|
@ -539,27 +534,27 @@ static int snd_vt1724_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
spin_lock(&ice->reg_lock);
|
||||
old = inb(ICEMT1724(ice, DMA_PAUSE));
|
||||
if (cmd == SNDRV_PCM_TRIGGER_PAUSE_PUSH)
|
||||
old |= what;
|
||||
else
|
||||
old &= ~what;
|
||||
outb(old, ICEMT1724(ice, DMA_PAUSE));
|
||||
spin_unlock(&ice->reg_lock);
|
||||
scoped_guard(spinlock, &ice->reg_lock) {
|
||||
old = inb(ICEMT1724(ice, DMA_PAUSE));
|
||||
if (cmd == SNDRV_PCM_TRIGGER_PAUSE_PUSH)
|
||||
old |= what;
|
||||
else
|
||||
old &= ~what;
|
||||
outb(old, ICEMT1724(ice, DMA_PAUSE));
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
spin_lock(&ice->reg_lock);
|
||||
old = inb(ICEMT1724(ice, DMA_CONTROL));
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START)
|
||||
old |= what;
|
||||
else
|
||||
old &= ~what;
|
||||
outb(old, ICEMT1724(ice, DMA_CONTROL));
|
||||
spin_unlock(&ice->reg_lock);
|
||||
scoped_guard(spinlock, &ice->reg_lock) {
|
||||
old = inb(ICEMT1724(ice, DMA_CONTROL));
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START)
|
||||
old |= what;
|
||||
else
|
||||
old &= ~what;
|
||||
outb(old, ICEMT1724(ice, DMA_CONTROL));
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
|
|
@ -625,7 +620,6 @@ static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice,
|
|||
static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
||||
int force)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned char mclk_change;
|
||||
unsigned int i, old_rate;
|
||||
bool call_set_rate = false;
|
||||
|
|
@ -633,34 +627,31 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) ||
|
||||
(inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) {
|
||||
/* running? we cannot change the rate now... */
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY;
|
||||
}
|
||||
if (!force && is_pro_rate_locked(ice)) {
|
||||
/* comparing required and current rate - makes sense for
|
||||
* internal clock only */
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return (rate == ice->cur_rate) ? 0 : -EBUSY;
|
||||
}
|
||||
|
||||
if (force || !ice->is_spdif_master(ice)) {
|
||||
/* force means the rate was switched by ucontrol, otherwise
|
||||
* setting clock rate for internal clock mode */
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (force || (old_rate != rate))
|
||||
call_set_rate = true;
|
||||
else if (rate == ice->cur_rate) {
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return 0;
|
||||
scoped_guard(spinlock_irqsave, &ice->reg_lock) {
|
||||
if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) ||
|
||||
(inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) {
|
||||
/* running? we cannot change the rate now... */
|
||||
return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY;
|
||||
}
|
||||
if (!force && is_pro_rate_locked(ice)) {
|
||||
/* comparing required and current rate - makes sense for
|
||||
* internal clock only */
|
||||
return (rate == ice->cur_rate) ? 0 : -EBUSY;
|
||||
}
|
||||
}
|
||||
|
||||
ice->cur_rate = rate;
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
if (force || !ice->is_spdif_master(ice)) {
|
||||
/* force means the rate was switched by ucontrol, otherwise
|
||||
* setting clock rate for internal clock mode */
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (force || (old_rate != rate))
|
||||
call_set_rate = true;
|
||||
else if (rate == ice->cur_rate) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ice->cur_rate = rate;
|
||||
}
|
||||
|
||||
if (call_set_rate)
|
||||
ice->set_rate(ice, rate);
|
||||
|
|
@ -755,7 +746,7 @@ static int snd_vt1724_playback_pro_prepare(struct snd_pcm_substream *substream)
|
|||
unsigned char val;
|
||||
unsigned int size;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
val = (8 - substream->runtime->channels) >> 1;
|
||||
outb(val, ICEMT1724(ice, BURST));
|
||||
|
||||
|
|
@ -770,8 +761,6 @@ static int snd_vt1724_playback_pro_prepare(struct snd_pcm_substream *substream)
|
|||
outw(size, ICEMT1724(ice, PLAYBACK_COUNT));
|
||||
outb(size >> 16, ICEMT1724(ice, PLAYBACK_COUNT) + 2);
|
||||
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
|
||||
/*
|
||||
dev_dbg(ice->card->dev, "pro prepare: ch = %d, addr = 0x%x, "
|
||||
"buffer = 0x%x, period = 0x%x\n",
|
||||
|
|
@ -825,13 +814,12 @@ static int snd_vt1724_pcm_prepare(struct snd_pcm_substream *substream)
|
|||
struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
|
||||
const struct vt1724_pcm_reg *reg = substream->runtime->private_data;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
outl(substream->runtime->dma_addr, ice->profi_port + reg->addr);
|
||||
outw((snd_pcm_lib_buffer_bytes(substream) >> 2) - 1,
|
||||
ice->profi_port + reg->size);
|
||||
outw((snd_pcm_lib_period_bytes(substream) >> 2) - 1,
|
||||
ice->profi_port + reg->count);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1160,9 +1148,8 @@ static void update_spdif_bits(struct snd_ice1712 *ice, unsigned int val)
|
|||
static void update_spdif_rate(struct snd_ice1712 *ice, unsigned int rate)
|
||||
{
|
||||
unsigned int val, nval;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ice->reg_lock, flags);
|
||||
guard(spinlock_irqsave)(&ice->reg_lock);
|
||||
nval = val = inw(ICEMT1724(ice, SPDIF_CTRL));
|
||||
nval &= ~(7 << 12);
|
||||
switch (rate) {
|
||||
|
|
@ -1176,7 +1163,6 @@ static void update_spdif_rate(struct snd_ice1712 *ice, unsigned int rate)
|
|||
}
|
||||
if (val != nval)
|
||||
update_spdif_bits(ice, nval);
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
}
|
||||
|
||||
static int snd_vt1724_playback_spdif_prepare(struct snd_pcm_substream *substream)
|
||||
|
|
@ -1362,11 +1348,11 @@ static int snd_vt1724_playback_indep_prepare(struct snd_pcm_substream *substream
|
|||
struct snd_ice1712 *ice = snd_pcm_substream_chip(substream);
|
||||
unsigned char val;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
val = 3 - substream->number;
|
||||
if (inb(ICEMT1724(ice, BURST)) < val)
|
||||
outb(val, ICEMT1724(ice, BURST));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
val = 3 - substream->number;
|
||||
if (inb(ICEMT1724(ice, BURST)) < val)
|
||||
outb(val, ICEMT1724(ice, BURST));
|
||||
}
|
||||
return snd_vt1724_pcm_prepare(substream);
|
||||
}
|
||||
|
||||
|
|
@ -1664,11 +1650,10 @@ static int snd_vt1724_spdif_default_put(struct snd_kcontrol *kcontrol,
|
|||
unsigned int val, old;
|
||||
|
||||
val = encode_spdif_bits(&ucontrol->value.iec958);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
old = inw(ICEMT1724(ice, SPDIF_CTRL));
|
||||
if (val != old)
|
||||
update_spdif_bits(ice, val);
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return val != old;
|
||||
}
|
||||
|
||||
|
|
@ -1739,14 +1724,13 @@ static int snd_vt1724_spdif_sw_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||
unsigned char old, val;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
old = val = inb(ICEREG1724(ice, SPDIF_CFG));
|
||||
val &= ~VT1724_CFG_SPDIF_OUT_EN;
|
||||
if (ucontrol->value.integer.value[0])
|
||||
val |= VT1724_CFG_SPDIF_OUT_EN;
|
||||
if (old != val)
|
||||
outb(val, ICEREG1724(ice, SPDIF_CFG));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return old != val;
|
||||
}
|
||||
|
||||
|
|
@ -1842,7 +1826,7 @@ static int snd_vt1724_pro_internal_clock_get(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int i, rate;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
if (ice->is_spdif_master(ice)) {
|
||||
ucontrol->value.enumerated.item[0] = ice->hw_rates->count +
|
||||
ice->get_spdif_master_type(ice);
|
||||
|
|
@ -1856,7 +1840,6 @@ static int snd_vt1724_pro_internal_clock_get(struct snd_kcontrol *kcontrol,
|
|||
}
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1887,29 +1870,31 @@ static int snd_vt1724_pro_internal_clock_put(struct snd_kcontrol *kcontrol,
|
|||
unsigned int old_rate, new_rate;
|
||||
unsigned int item = ucontrol->value.enumerated.item[0];
|
||||
unsigned int first_ext_clock = ice->hw_rates->count;
|
||||
bool set_pro_rate = false;
|
||||
|
||||
if (item > first_ext_clock + ice->ext_clock_count - 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* if rate = 0 => external clock */
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
if (ice->is_spdif_master(ice))
|
||||
old_rate = 0;
|
||||
else
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (item >= first_ext_clock) {
|
||||
/* switching to external clock */
|
||||
ice->set_spdif_clock(ice, item - first_ext_clock);
|
||||
new_rate = 0;
|
||||
} else {
|
||||
/* internal on-card clock */
|
||||
new_rate = ice->hw_rates->list[item];
|
||||
ice->pro_rate_default = new_rate;
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1);
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
if (ice->is_spdif_master(ice))
|
||||
old_rate = 0;
|
||||
else
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (item >= first_ext_clock) {
|
||||
/* switching to external clock */
|
||||
ice->set_spdif_clock(ice, item - first_ext_clock);
|
||||
new_rate = 0;
|
||||
} else {
|
||||
/* internal on-card clock */
|
||||
new_rate = ice->hw_rates->list[item];
|
||||
ice->pro_rate_default = new_rate;
|
||||
set_pro_rate = true;
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
|
||||
if (set_pro_rate)
|
||||
snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1);
|
||||
|
||||
/* the first switch to the ext. clock mode? */
|
||||
if (old_rate != new_rate && !new_rate) {
|
||||
|
|
@ -1949,10 +1934,9 @@ static int snd_vt1724_pro_rate_locking_put(struct snd_kcontrol *kcontrol,
|
|||
int change = 0, nval;
|
||||
|
||||
nval = ucontrol->value.integer.value[0] ? 1 : 0;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
change = PRO_RATE_LOCKED != nval;
|
||||
PRO_RATE_LOCKED = nval;
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -1980,10 +1964,9 @@ static int snd_vt1724_pro_rate_reset_put(struct snd_kcontrol *kcontrol,
|
|||
int change = 0, nval;
|
||||
|
||||
nval = ucontrol->value.integer.value[0] ? 1 : 0;
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
change = PRO_RATE_RESET != nval;
|
||||
PRO_RATE_RESET = nval;
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
|
@ -2138,13 +2121,12 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||
int idx;
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
guard(spinlock_irq)(&ice->reg_lock);
|
||||
for (idx = 0; idx < 22; idx++) {
|
||||
outb(idx, ICEMT1724(ice, MONITOR_PEAKINDEX));
|
||||
ucontrol->value.integer.value[idx] =
|
||||
inb(ICEMT1724(ice, MONITOR_PEAKDATA));
|
||||
}
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2689,12 +2671,12 @@ static int snd_vt1724_suspend(struct device *dev)
|
|||
|
||||
snd_ac97_suspend(ice->ac97);
|
||||
|
||||
spin_lock_irq(&ice->reg_lock);
|
||||
ice->pm_saved_is_spdif_master = ice->is_spdif_master(ice);
|
||||
ice->pm_saved_spdif_ctrl = inw(ICEMT1724(ice, SPDIF_CTRL));
|
||||
ice->pm_saved_spdif_cfg = inb(ICEREG1724(ice, SPDIF_CFG));
|
||||
ice->pm_saved_route = inl(ICEMT1724(ice, ROUTE_PLAYBACK));
|
||||
spin_unlock_irq(&ice->reg_lock);
|
||||
scoped_guard(spinlock_irq, &ice->reg_lock) {
|
||||
ice->pm_saved_is_spdif_master = ice->is_spdif_master(ice);
|
||||
ice->pm_saved_spdif_ctrl = inw(ICEMT1724(ice, SPDIF_CTRL));
|
||||
ice->pm_saved_spdif_cfg = inb(ICEREG1724(ice, SPDIF_CFG));
|
||||
ice->pm_saved_route = inl(ICEMT1724(ice, ROUTE_PLAYBACK));
|
||||
}
|
||||
|
||||
if (ice->pm_suspend)
|
||||
ice->pm_suspend(ice);
|
||||
|
|
|
|||
Loading…
Reference in New Issue