]> www.infradead.org Git - users/hch/misc.git/commitdiff
ALSA: ice1712: Use guard() for spin locks
authorTakashi Iwai <tiwai@suse.de>
Fri, 29 Aug 2025 14:43:10 +0000 (16:43 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 1 Sep 2025 11:52:41 +0000 (13:52 +0200)
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
sound/pci/ice1712/delta.c
sound/pci/ice1712/ews.c
sound/pci/ice1712/ice1712.c
sound/pci/ice1712/ice1724.c

index fa484e2a9a785463b8391661e850bf28feeba658..e5a9585cba4ccb951617171314ff8ee7893f4d50 100644 (file)
@@ -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);
index 8bb86b3c894e2b5aebd4caee5098242db1df795f..1dffcb011deb143f3a549f08d5906ce5d595d8a1 100644 (file)
@@ -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);
index 1aefd46ebf6b54bf2cd400e9f2bc77507af14ccd..1e39b985bef263d9e2704097957ff2431b63e51b 100644 (file)
@@ -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;
-       }
-       if (!force && is_pro_rate_locked(ice))
-               goto __out;
+       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)
-               goto __out;
+               old = inb(ICEMT(ice, RATE));
+               if (!force && old == val)
+                       return;
 
-       ice->cur_rate = rate;
-       outb(val, ICEMT(ice, RATE));
-       spin_unlock_irqrestore(&ice->reg_lock, flags);
+               ice->cur_rate = rate;
+               outb(val, ICEMT(ice, RATE));
+       }
 
        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;
-       }
-       if (val != old_val) {
-               change = 1;
-               outl(val, ICEMT(ice, ROUTE_CAPTURE));
+       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));
+               }
        }
-       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 */
index 5bf90e2fd19105ea7a8281a6c3dc9ccd750fd602..e2dbbbfbca9fa1f188b25bf24a50ddf1d9b00048 100644 (file)
@@ -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);
+               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;
+                       }
+                       handled = 1;
                        if (status & VT1724_IRQ_MPU_TX) {
-                               dev_err(ice->card->dev, "Disabling MPU_TX\n");
-                               enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0);
+                               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;
                        }
-                       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);
+                       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));
                }
-               /* 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;
-       }
+       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;
+               }
 
-       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;
+               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;
-       spin_unlock_irqrestore(&ice->reg_lock, flags);
+               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);