Commit 99913572 authored by Linus Torvalds's avatar Linus Torvalds

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
parents c861cd3e f4419172
...@@ -1081,12 +1081,12 @@ static int snd_ctl_elem_init_enum_names(struct user_element *ue) ...@@ -1081,12 +1081,12 @@ static int snd_ctl_elem_init_enum_names(struct user_element *ue)
char *names, *p; char *names, *p;
size_t buf_len, name_len; size_t buf_len, name_len;
unsigned int i; unsigned int i;
const uintptr_t user_ptrval = ue->info.value.enumerated.names_ptr;
if (ue->info.value.enumerated.names_length > 64 * 1024) if (ue->info.value.enumerated.names_length > 64 * 1024)
return -EINVAL; return -EINVAL;
names = memdup_user( names = memdup_user((const void __user *)user_ptrval,
(const void __user *)ue->info.value.enumerated.names_ptr,
ue->info.value.enumerated.names_length); ue->info.value.enumerated.names_length);
if (IS_ERR(names)) if (IS_ERR(names))
return PTR_ERR(names); return PTR_ERR(names);
......
...@@ -3063,12 +3063,12 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { ...@@ -3063,12 +3063,12 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
.class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
.class_mask = 0xffffff, .class_mask = 0xffffff,
.driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
AZX_DCAPS_RIRB_PRE_DELAY }, AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
#else #else
/* this entry seems still valid -- i.e. without emu20kx chip */ /* this entry seems still valid -- i.e. without emu20kx chip */
{ PCI_DEVICE(0x1102, 0x0009), { PCI_DEVICE(0x1102, 0x0009),
.driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
AZX_DCAPS_RIRB_PRE_DELAY }, AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
#endif #endif
/* Vortex86MX */ /* Vortex86MX */
{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, { 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); ...@@ -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) 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) && return (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT) &&
!(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid) & /* disable MISC_NO_PRESENCE check because it may break too
AC_DEFCFG_MISC_NO_PRESENCE)) && * 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); (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP);
} }
......
...@@ -3329,6 +3329,12 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec, ...@@ -3329,6 +3329,12 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
if (nid) if (nid)
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_OUT_ZERO); 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) static void alc_auto_init_multi_out(struct hda_codec *codec)
......
...@@ -459,7 +459,8 @@ static void kill_stream_urbs(struct ua101_stream *stream) ...@@ -459,7 +459,8 @@ static void kill_stream_urbs(struct ua101_stream *stream)
unsigned int i; unsigned int i;
for (i = 0; i < stream->queue_length; ++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) 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) ...@@ -484,6 +485,9 @@ static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index)
{ {
struct usb_host_interface *alts; struct usb_host_interface *alts;
if (!ua->intf[intf_index])
return;
alts = ua->intf[intf_index]->cur_altsetting; alts = ua->intf[intf_index]->cur_altsetting;
if (alts->desc.bAlternateSetting != 0) { if (alts->desc.bAlternateSetting != 0) {
int err = usb_set_interface(ua->dev, int err = usb_set_interface(ua->dev,
...@@ -1144,27 +1148,37 @@ static void free_stream_urbs(struct ua101_stream *stream) ...@@ -1144,27 +1148,37 @@ static void free_stream_urbs(struct ua101_stream *stream)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < stream->queue_length; ++i) for (i = 0; i < stream->queue_length; ++i) {
kfree(stream->urbs[i]); kfree(stream->urbs[i]);
stream->urbs[i] = NULL;
}
} }
static void free_usb_related_resources(struct ua101 *ua, static void free_usb_related_resources(struct ua101 *ua,
struct usb_interface *interface) struct usb_interface *interface)
{ {
unsigned int i; unsigned int i;
struct usb_interface *intf;
mutex_lock(&ua->mutex);
free_stream_urbs(&ua->capture); free_stream_urbs(&ua->capture);
free_stream_urbs(&ua->playback); free_stream_urbs(&ua->playback);
mutex_unlock(&ua->mutex);
free_stream_buffers(ua, &ua->capture); free_stream_buffers(ua, &ua->capture);
free_stream_buffers(ua, &ua->playback); free_stream_buffers(ua, &ua->playback);
for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) {
if (ua->intf[i]) { mutex_lock(&ua->mutex);
usb_set_intfdata(ua->intf[i], NULL); intf = ua->intf[i];
if (ua->intf[i] != interface) ua->intf[i] = NULL;
mutex_unlock(&ua->mutex);
if (intf) {
usb_set_intfdata(intf, NULL);
if (intf != interface)
usb_driver_release_interface(&ua101_driver, usb_driver_release_interface(&ua101_driver,
ua->intf[i]); intf);
} }
}
} }
static void ua101_card_free(struct snd_card *card) static void ua101_card_free(struct snd_card *card)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment