Merge tag 'sound-5.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai: "Nothing to worry at this stage but all nice small changes: - A regression fix for AMD GPU detection in HD-audio - A long-standing sleep-in-atomic fix for an ice1724 device - Usual suspects, the device-specific quirks for HD- and USB-audio" * tag 'sound-5.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/realtek - Enable the bass speaker of ASUS UX431FLC ALSA: ice1724: Fix sleep-in-atomic in Infrasonic Quartet support code ALSA: hda/realtek - Add Bass Speaker and fixed dac for bass speaker ALSA: hda - Apply sync-write workaround to old Intel platforms, too ALSA: hda/hdmi - fix atpx_present when CLASS is not VGA ALSA: usb-audio: fix set_format altsetting sanity check ALSA: hda/realtek - Add headset Mic no shutup for ALC283 ALSA: usb-audio: set the interface format after resume on Dell WD19
This commit is contained in:
@@ -282,12 +282,13 @@ enum {
|
|||||||
|
|
||||||
/* quirks for old Intel chipsets */
|
/* quirks for old Intel chipsets */
|
||||||
#define AZX_DCAPS_INTEL_ICH \
|
#define AZX_DCAPS_INTEL_ICH \
|
||||||
(AZX_DCAPS_OLD_SSYNC | AZX_DCAPS_NO_ALIGN_BUFSIZE)
|
(AZX_DCAPS_OLD_SSYNC | AZX_DCAPS_NO_ALIGN_BUFSIZE |\
|
||||||
|
AZX_DCAPS_SYNC_WRITE)
|
||||||
|
|
||||||
/* quirks for Intel PCH */
|
/* quirks for Intel PCH */
|
||||||
#define AZX_DCAPS_INTEL_PCH_BASE \
|
#define AZX_DCAPS_INTEL_PCH_BASE \
|
||||||
(AZX_DCAPS_NO_ALIGN_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY |\
|
(AZX_DCAPS_NO_ALIGN_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY |\
|
||||||
AZX_DCAPS_SNOOP_TYPE(SCH))
|
AZX_DCAPS_SNOOP_TYPE(SCH) | AZX_DCAPS_SYNC_WRITE)
|
||||||
|
|
||||||
/* PCH up to IVB; no runtime PM; bind with i915 gfx */
|
/* PCH up to IVB; no runtime PM; bind with i915 gfx */
|
||||||
#define AZX_DCAPS_INTEL_PCH_NOPM \
|
#define AZX_DCAPS_INTEL_PCH_NOPM \
|
||||||
@@ -302,13 +303,13 @@ enum {
|
|||||||
#define AZX_DCAPS_INTEL_HASWELL \
|
#define AZX_DCAPS_INTEL_HASWELL \
|
||||||
(/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_COUNT_LPIB_DELAY |\
|
(/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_COUNT_LPIB_DELAY |\
|
||||||
AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_COMPONENT |\
|
AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_COMPONENT |\
|
||||||
AZX_DCAPS_SNOOP_TYPE(SCH))
|
AZX_DCAPS_SNOOP_TYPE(SCH) | AZX_DCAPS_SYNC_WRITE)
|
||||||
|
|
||||||
/* Broadwell HDMI can't use position buffer reliably, force to use LPIB */
|
/* Broadwell HDMI can't use position buffer reliably, force to use LPIB */
|
||||||
#define AZX_DCAPS_INTEL_BROADWELL \
|
#define AZX_DCAPS_INTEL_BROADWELL \
|
||||||
(/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_POSFIX_LPIB |\
|
(/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_POSFIX_LPIB |\
|
||||||
AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_COMPONENT |\
|
AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_COMPONENT |\
|
||||||
AZX_DCAPS_SNOOP_TYPE(SCH))
|
AZX_DCAPS_SNOOP_TYPE(SCH) | AZX_DCAPS_SYNC_WRITE)
|
||||||
|
|
||||||
#define AZX_DCAPS_INTEL_BAYTRAIL \
|
#define AZX_DCAPS_INTEL_BAYTRAIL \
|
||||||
(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_I915_COMPONENT)
|
(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_I915_COMPONENT)
|
||||||
@@ -1410,7 +1411,17 @@ static bool atpx_present(void)
|
|||||||
acpi_handle dhandle, atpx_handle;
|
acpi_handle dhandle, atpx_handle;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
|
||||||
while ((pdev = pci_get_class(PCI_BASE_CLASS_DISPLAY << 16, pdev)) != NULL) {
|
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
|
||||||
|
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||||
|
if (dhandle) {
|
||||||
|
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
||||||
|
if (!ACPI_FAILURE(status)) {
|
||||||
|
pci_dev_put(pdev);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
|
||||||
dhandle = ACPI_HANDLE(&pdev->dev);
|
dhandle = ACPI_HANDLE(&pdev->dev);
|
||||||
if (dhandle) {
|
if (dhandle) {
|
||||||
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
||||||
|
|||||||
@@ -501,6 +501,7 @@ static void alc_shutup_pins(struct hda_codec *codec)
|
|||||||
struct alc_spec *spec = codec->spec;
|
struct alc_spec *spec = codec->spec;
|
||||||
|
|
||||||
switch (codec->core.vendor_id) {
|
switch (codec->core.vendor_id) {
|
||||||
|
case 0x10ec0283:
|
||||||
case 0x10ec0286:
|
case 0x10ec0286:
|
||||||
case 0x10ec0288:
|
case 0x10ec0288:
|
||||||
case 0x10ec0298:
|
case 0x10ec0298:
|
||||||
@@ -5904,9 +5905,12 @@ enum {
|
|||||||
ALC256_FIXUP_ASUS_HEADSET_MIC,
|
ALC256_FIXUP_ASUS_HEADSET_MIC,
|
||||||
ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
|
ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||||
ALC299_FIXUP_PREDATOR_SPK,
|
ALC299_FIXUP_PREDATOR_SPK,
|
||||||
ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC,
|
|
||||||
ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
|
ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
|
||||||
ALC294_FIXUP_ASUS_INTSPK_GPIO,
|
ALC289_FIXUP_DELL_SPK2,
|
||||||
|
ALC289_FIXUP_DUAL_SPK,
|
||||||
|
ALC294_FIXUP_SPK2_TO_DAC1,
|
||||||
|
ALC294_FIXUP_ASUS_DUAL_SPK,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hda_fixup alc269_fixups[] = {
|
static const struct hda_fixup alc269_fixups[] = {
|
||||||
@@ -6981,16 +6985,6 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||||||
{ }
|
{ }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC] = {
|
|
||||||
.type = HDA_FIXUP_PINS,
|
|
||||||
.v.pins = (const struct hda_pintbl[]) {
|
|
||||||
{ 0x14, 0x411111f0 }, /* disable confusing internal speaker */
|
|
||||||
{ 0x19, 0x04a11150 }, /* use as headset mic, without its own jack detect */
|
|
||||||
{ }
|
|
||||||
},
|
|
||||||
.chained = true,
|
|
||||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
|
||||||
},
|
|
||||||
[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
|
[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
|
||||||
.type = HDA_FIXUP_PINS,
|
.type = HDA_FIXUP_PINS,
|
||||||
.v.pins = (const struct hda_pintbl[]) {
|
.v.pins = (const struct hda_pintbl[]) {
|
||||||
@@ -7001,13 +6995,35 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
|
.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
|
||||||
},
|
},
|
||||||
[ALC294_FIXUP_ASUS_INTSPK_GPIO] = {
|
[ALC289_FIXUP_DELL_SPK2] = {
|
||||||
|
.type = HDA_FIXUP_PINS,
|
||||||
|
.v.pins = (const struct hda_pintbl[]) {
|
||||||
|
{ 0x17, 0x90170130 }, /* bass spk */
|
||||||
|
{ }
|
||||||
|
},
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
|
||||||
|
},
|
||||||
|
[ALC289_FIXUP_DUAL_SPK] = {
|
||||||
|
.type = HDA_FIXUP_FUNC,
|
||||||
|
.v.func = alc285_fixup_speaker2_to_dac1,
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = ALC289_FIXUP_DELL_SPK2
|
||||||
|
},
|
||||||
|
[ALC294_FIXUP_SPK2_TO_DAC1] = {
|
||||||
|
.type = HDA_FIXUP_FUNC,
|
||||||
|
.v.func = alc285_fixup_speaker2_to_dac1,
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
|
||||||
|
},
|
||||||
|
[ALC294_FIXUP_ASUS_DUAL_SPK] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
/* The GPIO must be pulled to initialize the AMP */
|
/* The GPIO must be pulled to initialize the AMP */
|
||||||
.v.func = alc_fixup_gpio4,
|
.v.func = alc_fixup_gpio4,
|
||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC
|
.chain_id = ALC294_FIXUP_SPK2_TO_DAC1
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
@@ -7080,6 +7096,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
|
SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
|
||||||
SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
||||||
@@ -7167,7 +7185,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
||||||
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_INTSPK_GPIO),
|
SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
|
||||||
SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
|
||||||
|
|||||||
@@ -647,6 +647,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned char mclk_change;
|
unsigned char mclk_change;
|
||||||
unsigned int i, old_rate;
|
unsigned int i, old_rate;
|
||||||
|
bool call_set_rate = false;
|
||||||
|
|
||||||
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
|
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -670,7 +671,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||||||
* setting clock rate for internal clock mode */
|
* setting clock rate for internal clock mode */
|
||||||
old_rate = ice->get_rate(ice);
|
old_rate = ice->get_rate(ice);
|
||||||
if (force || (old_rate != rate))
|
if (force || (old_rate != rate))
|
||||||
ice->set_rate(ice, rate);
|
call_set_rate = true;
|
||||||
else if (rate == ice->cur_rate) {
|
else if (rate == ice->cur_rate) {
|
||||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -678,12 +679,14 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ice->cur_rate = rate;
|
ice->cur_rate = rate;
|
||||||
|
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||||
|
|
||||||
|
if (call_set_rate)
|
||||||
|
ice->set_rate(ice, rate);
|
||||||
|
|
||||||
/* setting master clock */
|
/* setting master clock */
|
||||||
mclk_change = ice->set_mclk(ice, rate);
|
mclk_change = ice->set_mclk(ice, rate);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
|
||||||
|
|
||||||
if (mclk_change && ice->gpio.i2s_mclk_changed)
|
if (mclk_change && ice->gpio.i2s_mclk_changed)
|
||||||
ice->gpio.i2s_mclk_changed(ice);
|
ice->gpio.i2s_mclk_changed(ice);
|
||||||
if (ice->gpio.set_pro_rate)
|
if (ice->gpio.set_pro_rate)
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ struct snd_usb_substream {
|
|||||||
struct snd_usb_endpoint *sync_endpoint;
|
struct snd_usb_endpoint *sync_endpoint;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
bool need_setup_ep; /* (re)configure EP at prepare? */
|
bool need_setup_ep; /* (re)configure EP at prepare? */
|
||||||
|
bool need_setup_fmt; /* (re)configure fmt after resume? */
|
||||||
unsigned int speed; /* USB_SPEED_XXX */
|
unsigned int speed; /* USB_SPEED_XXX */
|
||||||
|
|
||||||
u64 formats; /* format bitmasks (all or'ed) */
|
u64 formats; /* format bitmasks (all or'ed) */
|
||||||
|
|||||||
@@ -506,15 +506,15 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
|
|||||||
if (WARN_ON(!iface))
|
if (WARN_ON(!iface))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
alts = usb_altnum_to_altsetting(iface, fmt->altsetting);
|
alts = usb_altnum_to_altsetting(iface, fmt->altsetting);
|
||||||
altsd = get_iface_desc(alts);
|
if (WARN_ON(!alts))
|
||||||
if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
altsd = get_iface_desc(alts);
|
||||||
|
|
||||||
if (fmt == subs->cur_audiofmt)
|
if (fmt == subs->cur_audiofmt && !subs->need_setup_fmt)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* close the old interface */
|
/* close the old interface */
|
||||||
if (subs->interface >= 0 && subs->interface != fmt->iface) {
|
if (subs->interface >= 0 && (subs->interface != fmt->iface || subs->need_setup_fmt)) {
|
||||||
if (!subs->stream->chip->keep_iface) {
|
if (!subs->stream->chip->keep_iface) {
|
||||||
err = usb_set_interface(subs->dev, subs->interface, 0);
|
err = usb_set_interface(subs->dev, subs->interface, 0);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
@@ -528,6 +528,9 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
|
|||||||
subs->altset_idx = 0;
|
subs->altset_idx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (subs->need_setup_fmt)
|
||||||
|
subs->need_setup_fmt = false;
|
||||||
|
|
||||||
/* set interface */
|
/* set interface */
|
||||||
if (iface->cur_altsetting != alts) {
|
if (iface->cur_altsetting != alts) {
|
||||||
err = snd_usb_select_mode_quirk(subs, fmt);
|
err = snd_usb_select_mode_quirk(subs, fmt);
|
||||||
@@ -1728,6 +1731,13 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea
|
|||||||
subs->data_endpoint->retire_data_urb = retire_playback_urb;
|
subs->data_endpoint->retire_data_urb = retire_playback_urb;
|
||||||
subs->running = 0;
|
subs->running = 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||||
|
if (subs->stream->chip->setup_fmt_after_resume_quirk) {
|
||||||
|
stop_endpoints(subs, true);
|
||||||
|
subs->need_setup_fmt = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -1760,6 +1770,13 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream
|
|||||||
subs->data_endpoint->retire_data_urb = retire_capture_urb;
|
subs->data_endpoint->retire_data_urb = retire_capture_urb;
|
||||||
subs->running = 1;
|
subs->running = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||||
|
if (subs->stream->chip->setup_fmt_after_resume_quirk) {
|
||||||
|
stop_endpoints(subs, true);
|
||||||
|
subs->need_setup_fmt = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|||||||
@@ -3466,7 +3466,8 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
|||||||
.vendor_name = "Dell",
|
.vendor_name = "Dell",
|
||||||
.product_name = "WD19 Dock",
|
.product_name = "WD19 Dock",
|
||||||
.profile_name = "Dell-WD15-Dock",
|
.profile_name = "Dell-WD15-Dock",
|
||||||
.ifnum = QUIRK_NO_INTERFACE
|
.ifnum = QUIRK_ANY_INTERFACE,
|
||||||
|
.type = QUIRK_SETUP_FMT_AFTER_RESUME
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/* MOTU Microbook II */
|
/* MOTU Microbook II */
|
||||||
|
|||||||
@@ -508,6 +508,16 @@ static int create_standard_mixer_quirk(struct snd_usb_audio *chip,
|
|||||||
return snd_usb_create_mixer(chip, quirk->ifnum, 0);
|
return snd_usb_create_mixer(chip, quirk->ifnum, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int setup_fmt_after_resume_quirk(struct snd_usb_audio *chip,
|
||||||
|
struct usb_interface *iface,
|
||||||
|
struct usb_driver *driver,
|
||||||
|
const struct snd_usb_audio_quirk *quirk)
|
||||||
|
{
|
||||||
|
chip->setup_fmt_after_resume_quirk = 1;
|
||||||
|
return 1; /* Continue with creating streams and mixer */
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* audio-interface quirks
|
* audio-interface quirks
|
||||||
*
|
*
|
||||||
@@ -546,6 +556,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
|
|||||||
[QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
|
[QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
|
||||||
[QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk,
|
[QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk,
|
||||||
[QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
|
[QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
|
||||||
|
[QUIRK_SETUP_FMT_AFTER_RESUME] = setup_fmt_after_resume_quirk,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (quirk->type < QUIRK_TYPE_COUNT) {
|
if (quirk->type < QUIRK_TYPE_COUNT) {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ struct snd_usb_audio {
|
|||||||
wait_queue_head_t shutdown_wait;
|
wait_queue_head_t shutdown_wait;
|
||||||
unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
|
unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
|
||||||
unsigned int tx_length_quirk:1; /* Put length specifier in transfers */
|
unsigned int tx_length_quirk:1; /* Put length specifier in transfers */
|
||||||
|
unsigned int setup_fmt_after_resume_quirk:1; /* setup the format to interface after resume */
|
||||||
int num_interfaces;
|
int num_interfaces;
|
||||||
int num_suspended_intf;
|
int num_suspended_intf;
|
||||||
int sample_rate_read_error;
|
int sample_rate_read_error;
|
||||||
@@ -98,6 +98,7 @@ enum quirk_type {
|
|||||||
QUIRK_AUDIO_EDIROL_UAXX,
|
QUIRK_AUDIO_EDIROL_UAXX,
|
||||||
QUIRK_AUDIO_ALIGN_TRANSFER,
|
QUIRK_AUDIO_ALIGN_TRANSFER,
|
||||||
QUIRK_AUDIO_STANDARD_MIXER,
|
QUIRK_AUDIO_STANDARD_MIXER,
|
||||||
|
QUIRK_SETUP_FMT_AFTER_RESUME,
|
||||||
|
|
||||||
QUIRK_TYPE_COUNT
|
QUIRK_TYPE_COUNT
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user