Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Revert the check of NO_PRESENCE pincfg default bit ALSA: hda - Fix a regression for DMA-position check with CA0110 ALSA: hda - Fix silent output regression with ALC861 ALSA: control: remove compilation warning on 32-bit ALSA: ua101: fix crash when unplugging
This commit is contained in:
commit
9991357259
|
@ -1081,12 +1081,12 @@ static int snd_ctl_elem_init_enum_names(struct user_element *ue)
|
|||
char *names, *p;
|
||||
size_t buf_len, name_len;
|
||||
unsigned int i;
|
||||
const uintptr_t user_ptrval = ue->info.value.enumerated.names_ptr;
|
||||
|
||||
if (ue->info.value.enumerated.names_length > 64 * 1024)
|
||||
return -EINVAL;
|
||||
|
||||
names = memdup_user(
|
||||
(const void __user *)ue->info.value.enumerated.names_ptr,
|
||||
names = memdup_user((const void __user *)user_ptrval,
|
||||
ue->info.value.enumerated.names_length);
|
||||
if (IS_ERR(names))
|
||||
return PTR_ERR(names);
|
||||
|
|
|
@ -3063,12 +3063,12 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
|
|||
.class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
|
||||
.class_mask = 0xffffff,
|
||||
.driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
|
||||
AZX_DCAPS_RIRB_PRE_DELAY },
|
||||
AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
|
||||
#else
|
||||
/* this entry seems still valid -- i.e. without emu20kx chip */
|
||||
{ PCI_DEVICE(0x1102, 0x0009),
|
||||
.driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
|
||||
AZX_DCAPS_RIRB_PRE_DELAY },
|
||||
AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
|
||||
#endif
|
||||
/* Vortex86MX */
|
||||
{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
|
||||
|
|
|
@ -511,8 +511,11 @@ int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid);
|
|||
static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid)
|
||||
{
|
||||
return (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT) &&
|
||||
!(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid) &
|
||||
AC_DEFCFG_MISC_NO_PRESENCE)) &&
|
||||
/* disable MISC_NO_PRESENCE check because it may break too
|
||||
* many devices
|
||||
*/
|
||||
/*(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid) &
|
||||
AC_DEFCFG_MISC_NO_PRESENCE)) &&*/
|
||||
(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP);
|
||||
}
|
||||
|
||||
|
|
|
@ -3329,6 +3329,12 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
|
|||
if (nid)
|
||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
||||
AMP_OUT_ZERO);
|
||||
|
||||
/* unmute DAC if it's not assigned to a mixer */
|
||||
nid = alc_look_for_out_mute_nid(codec, pin, dac);
|
||||
if (nid == mix && nid_has_mute(codec, dac, HDA_OUTPUT))
|
||||
snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
||||
AMP_OUT_ZERO);
|
||||
}
|
||||
|
||||
static void alc_auto_init_multi_out(struct hda_codec *codec)
|
||||
|
|
|
@ -459,7 +459,8 @@ static void kill_stream_urbs(struct ua101_stream *stream)
|
|||
unsigned int i;
|
||||
|
||||
for (i = 0; i < stream->queue_length; ++i)
|
||||
usb_kill_urb(&stream->urbs[i]->urb);
|
||||
if (stream->urbs[i])
|
||||
usb_kill_urb(&stream->urbs[i]->urb);
|
||||
}
|
||||
|
||||
static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index)
|
||||
|
@ -484,6 +485,9 @@ static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index)
|
|||
{
|
||||
struct usb_host_interface *alts;
|
||||
|
||||
if (!ua->intf[intf_index])
|
||||
return;
|
||||
|
||||
alts = ua->intf[intf_index]->cur_altsetting;
|
||||
if (alts->desc.bAlternateSetting != 0) {
|
||||
int err = usb_set_interface(ua->dev,
|
||||
|
@ -1144,27 +1148,37 @@ static void free_stream_urbs(struct ua101_stream *stream)
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < stream->queue_length; ++i)
|
||||
for (i = 0; i < stream->queue_length; ++i) {
|
||||
kfree(stream->urbs[i]);
|
||||
stream->urbs[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void free_usb_related_resources(struct ua101 *ua,
|
||||
struct usb_interface *interface)
|
||||
{
|
||||
unsigned int i;
|
||||
struct usb_interface *intf;
|
||||
|
||||
mutex_lock(&ua->mutex);
|
||||
free_stream_urbs(&ua->capture);
|
||||
free_stream_urbs(&ua->playback);
|
||||
mutex_unlock(&ua->mutex);
|
||||
free_stream_buffers(ua, &ua->capture);
|
||||
free_stream_buffers(ua, &ua->playback);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ua->intf); ++i)
|
||||
if (ua->intf[i]) {
|
||||
usb_set_intfdata(ua->intf[i], NULL);
|
||||
if (ua->intf[i] != interface)
|
||||
for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) {
|
||||
mutex_lock(&ua->mutex);
|
||||
intf = ua->intf[i];
|
||||
ua->intf[i] = NULL;
|
||||
mutex_unlock(&ua->mutex);
|
||||
if (intf) {
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (intf != interface)
|
||||
usb_driver_release_interface(&ua101_driver,
|
||||
ua->intf[i]);
|
||||
intf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ua101_card_free(struct snd_card *card)
|
||||
|
|
Loading…
Reference in New Issue