|
@@ -308,11 +308,10 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
|
|
struct snd_usb_audio *chip = mixer->chip;
|
|
struct snd_usb_audio *chip = mixer->chip;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown) {
|
|
|
|
- err = -ENODEV;
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+
|
|
if (chip->usb_id == USB_ID(0x041e, 0x3042))
|
|
if (chip->usb_id == USB_ID(0x041e, 0x3042))
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
usb_sndctrlpipe(chip->dev, 0), 0x24,
|
|
usb_sndctrlpipe(chip->dev, 0), 0x24,
|
|
@@ -329,8 +328,7 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
|
|
usb_sndctrlpipe(chip->dev, 0), 0x24,
|
|
usb_sndctrlpipe(chip->dev, 0), 0x24,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
|
value, index + 2, NULL, 0);
|
|
value, index + 2, NULL, 0);
|
|
- out:
|
|
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -441,16 +439,15 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry,
|
|
|
|
|
|
for (i = 0; jacks[i].name; ++i) {
|
|
for (i = 0; jacks[i].name; ++i) {
|
|
snd_iprintf(buffer, "%s: ", jacks[i].name);
|
|
snd_iprintf(buffer, "%s: ", jacks[i].name);
|
|
- down_read(&mixer->chip->shutdown_rwsem);
|
|
|
|
- if (mixer->chip->shutdown)
|
|
|
|
- err = 0;
|
|
|
|
- else
|
|
|
|
- err = snd_usb_ctl_msg(mixer->chip->dev,
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(mixer->chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return;
|
|
|
|
+ err = snd_usb_ctl_msg(mixer->chip->dev,
|
|
usb_rcvctrlpipe(mixer->chip->dev, 0),
|
|
usb_rcvctrlpipe(mixer->chip->dev, 0),
|
|
UAC_GET_MEM, USB_DIR_IN | USB_TYPE_CLASS |
|
|
UAC_GET_MEM, USB_DIR_IN | USB_TYPE_CLASS |
|
|
USB_RECIP_INTERFACE, 0,
|
|
USB_RECIP_INTERFACE, 0,
|
|
jacks[i].unitid << 8, buf, 3);
|
|
jacks[i].unitid << 8, buf, 3);
|
|
- up_read(&mixer->chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(mixer->chip);
|
|
if (err == 3 && (buf[0] == 3 || buf[0] == 6))
|
|
if (err == 3 && (buf[0] == 3 || buf[0] == 6))
|
|
snd_iprintf(buffer, "%02x %02x\n", buf[1], buf[2]);
|
|
snd_iprintf(buffer, "%02x %02x\n", buf[1], buf[2]);
|
|
else
|
|
else
|
|
@@ -481,11 +478,9 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
|
|
int err;
|
|
int err;
|
|
unsigned char buf[2];
|
|
unsigned char buf[2];
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (mixer->chip->shutdown) {
|
|
|
|
- err = -ENODEV;
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
|
|
buf[0] = 0x01;
|
|
buf[0] = 0x01;
|
|
buf[1] = value ? 0x02 : 0x01;
|
|
buf[1] = value ? 0x02 : 0x01;
|
|
@@ -493,8 +488,7 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
|
|
usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
|
|
usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
|
|
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
|
|
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
|
|
0x0400, 0x0e00, buf, 2);
|
|
0x0400, 0x0e00, buf, 2);
|
|
- out:
|
|
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -554,15 +548,14 @@ static int snd_xonar_u1_switch_update(struct usb_mixer_interface *mixer,
|
|
struct snd_usb_audio *chip = mixer->chip;
|
|
struct snd_usb_audio *chip = mixer->chip;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown)
|
|
|
|
- err = -ENODEV;
|
|
|
|
- else
|
|
|
|
- err = snd_usb_ctl_msg(chip->dev,
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ err = snd_usb_ctl_msg(chip->dev,
|
|
usb_sndctrlpipe(chip->dev, 0), 0x08,
|
|
usb_sndctrlpipe(chip->dev, 0), 0x08,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
|
50, 0, &status, 1);
|
|
50, 0, &status, 1);
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -623,11 +616,9 @@ static int snd_mbox1_switch_update(struct usb_mixer_interface *mixer, int val)
|
|
int err;
|
|
int err;
|
|
unsigned char buff[3];
|
|
unsigned char buff[3];
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown) {
|
|
|
|
- err = -ENODEV;
|
|
|
|
- goto err;
|
|
|
|
- }
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
|
|
/* Prepare for magic command to toggle clock source */
|
|
/* Prepare for magic command to toggle clock source */
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
@@ -683,7 +674,7 @@ static int snd_mbox1_switch_update(struct usb_mixer_interface *mixer, int val)
|
|
goto err;
|
|
goto err;
|
|
|
|
|
|
err:
|
|
err:
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -778,15 +769,14 @@ static int snd_ni_update_cur_val(struct usb_mixer_elem_list *list)
|
|
unsigned int pval = list->kctl->private_value;
|
|
unsigned int pval = list->kctl->private_value;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown)
|
|
|
|
- err = -ENODEV;
|
|
|
|
- else
|
|
|
|
- err = usb_control_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0),
|
|
|
|
- (pval >> 16) & 0xff,
|
|
|
|
- USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
|
|
|
- pval >> 24, pval & 0xffff, NULL, 0, 1000);
|
|
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ err = usb_control_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0),
|
|
|
|
+ (pval >> 16) & 0xff,
|
|
|
|
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
|
|
|
|
+ pval >> 24, pval & 0xffff, NULL, 0, 1000);
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -944,18 +934,17 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
|
|
value[0] = pval >> 24;
|
|
value[0] = pval >> 24;
|
|
value[1] = 0;
|
|
value[1] = 0;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown)
|
|
|
|
- err = -ENODEV;
|
|
|
|
- else
|
|
|
|
- err = snd_usb_ctl_msg(chip->dev,
|
|
|
|
- usb_sndctrlpipe(chip->dev, 0),
|
|
|
|
- UAC_SET_CUR,
|
|
|
|
- USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
|
|
|
|
- pval & 0xff00,
|
|
|
|
- snd_usb_ctrl_intf(chip) | ((pval & 0xff) << 8),
|
|
|
|
- value, 2);
|
|
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ err = snd_usb_ctl_msg(chip->dev,
|
|
|
|
+ usb_sndctrlpipe(chip->dev, 0),
|
|
|
|
+ UAC_SET_CUR,
|
|
|
|
+ USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
|
|
|
|
+ pval & 0xff00,
|
|
|
|
+ snd_usb_ctrl_intf(chip) | ((pval & 0xff) << 8),
|
|
|
|
+ value, 2);
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1519,11 +1508,9 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
|
|
unsigned char data[3];
|
|
unsigned char data[3];
|
|
int rate;
|
|
int rate;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown) {
|
|
|
|
- err = -ENODEV;
|
|
|
|
- goto end;
|
|
|
|
- }
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
|
|
ucontrol->value.iec958.status[0] = kcontrol->private_value & 0xff;
|
|
ucontrol->value.iec958.status[0] = kcontrol->private_value & 0xff;
|
|
ucontrol->value.iec958.status[1] = (kcontrol->private_value >> 8) & 0xff;
|
|
ucontrol->value.iec958.status[1] = (kcontrol->private_value >> 8) & 0xff;
|
|
@@ -1551,7 +1538,7 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
err = 0;
|
|
err = 0;
|
|
end:
|
|
end:
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1562,11 +1549,9 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
|
|
u8 reg;
|
|
u8 reg;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown) {
|
|
|
|
- err = -ENODEV;
|
|
|
|
- goto end;
|
|
|
|
- }
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
|
|
reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
|
|
reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
@@ -1594,7 +1579,7 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
|
|
goto end;
|
|
goto end;
|
|
|
|
|
|
end:
|
|
end:
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1650,11 +1635,9 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
|
|
u8 reg = list->kctl->private_value;
|
|
u8 reg = list->kctl->private_value;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- down_read(&chip->shutdown_rwsem);
|
|
|
|
- if (chip->shutdown) {
|
|
|
|
- err = -ENODEV;
|
|
|
|
- goto end;
|
|
|
|
- }
|
|
|
|
|
|
+ err = snd_usb_lock_shutdown(chip);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
err = snd_usb_ctl_msg(chip->dev,
|
|
usb_sndctrlpipe(chip->dev, 0),
|
|
usb_sndctrlpipe(chip->dev, 0),
|
|
@@ -1665,8 +1648,7 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
|
|
NULL,
|
|
NULL,
|
|
0);
|
|
0);
|
|
|
|
|
|
- end:
|
|
|
|
- up_read(&chip->shutdown_rwsem);
|
|
|
|
|
|
+ snd_usb_unlock_shutdown(chip);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|