136 lines
5.7 KiB
Diff
136 lines
5.7 KiB
Diff
diff --git a/sound/core/init.c b/sound/core/init.c
|
|
--- a/sound/core/init.c
|
|
+++ b/sound/core/init.c
|
|
@@ -364,7 +364,7 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
|
|
sound_debugfs_root);
|
|
#endif
|
|
#ifdef CONFIG_SND_CTL_DEBUG
|
|
- card->value_buf = kmalloc(sizeof(*card->value_buf), GFP_KERNEL);
|
|
+ card->value_buf = kmalloc_obj(*card->value_buf);
|
|
if (!card->value_buf)
|
|
return -ENOMEM;
|
|
#endif
|
|
diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
|
|
--- a/sound/hda/codecs/realtek/alc269.c
|
|
+++ b/sound/hda/codecs/realtek/alc269.c
|
|
@@ -4304,6 +4304,7 @@ enum {
|
|
ALC287_FIXUP_LEGION_16ACHG6,
|
|
ALC287_FIXUP_CS35L41_I2C_2,
|
|
ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
|
|
+ ALC287_FIXUP_CS35L41_I2C_2_HP_MUTE_LEDS,
|
|
ALC287_FIXUP_CS35L41_I2C_4,
|
|
ALC245_FIXUP_CS35L41_SPI_1,
|
|
ALC245_FIXUP_CS35L41_SPI_2,
|
|
@@ -6615,6 +6616,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|
.chained = true,
|
|
.chain_id = ALC285_FIXUP_HP_MUTE_LED,
|
|
},
|
|
+ [ALC287_FIXUP_CS35L41_I2C_2_HP_MUTE_LEDS] = {
|
|
+ .type = HDA_FIXUP_FUNC,
|
|
+ .v.func = cs35l41_fixup_i2c_two,
|
|
+ .chained = true,
|
|
+ .chain_id = ALC245_FIXUP_HP_X360_MUTE_LEDS,
|
|
+ },
|
|
[ALC287_FIXUP_CS35L41_I2C_4] = {
|
|
.type = HDA_FIXUP_FUNC,
|
|
.v.func = cs35l41_fixup_i2c_four,
|
|
@@ -7372,6 +7379,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
|
|
SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
|
|
+ SND_PCI_QUIRK(0x103c, 0x8259, "HP OMEN 15-ax202nf", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
|
SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
|
|
SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
|
SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
|
|
@@ -7582,6 +7590,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
|
SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
|
SND_PCI_QUIRK(0x103c, 0x8ba9, "HP Omen 16-wd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT),
|
|
+ SND_PCI_QUIRK(0x103c, 0x8bb1, "HP Victus 15-fa1xxx (MB 8BB1)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
|
|
SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
|
SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
|
SND_PCI_QUIRK(0x103c, 0x8bb6, "HP Laptop 15-fd0039nt", ALC236_FIXUP_HP_15_FD0XXX),
|
|
@@ -7674,7 +7683,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x103c, 0x8d92, "HP ZBook Firefly 16 G12", ALC285_FIXUP_HP_GPIO_LED),
|
|
SND_PCI_QUIRK(0x103c, 0x8dcd, "HP Victus 15-fa2xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
|
|
SND_PCI_QUIRK(0x103c, 0x8d9b, "HP 17 Turbine OmniBook 7 UMA", ALC287_FIXUP_CS35L41_I2C_2),
|
|
- SND_PCI_QUIRK(0x103c, 0x8d9c, "HP 17 Turbine OmniBook 7 DIS", ALC287_FIXUP_CS35L41_I2C_2),
|
|
+ SND_PCI_QUIRK(0x103c, 0x8d9c, "HP 17 Turbine OmniBook 7 DIS", ALC287_FIXUP_CS35L41_I2C_2_HP_MUTE_LEDS),
|
|
SND_PCI_QUIRK(0x103c, 0x8d9d, "HP 17 Turbine OmniBook X UMA", ALC287_FIXUP_CS35L41_I2C_2),
|
|
SND_PCI_QUIRK(0x103c, 0x8d9e, "HP 17 Turbine OmniBook X DIS", ALC287_FIXUP_CS35L41_I2C_2),
|
|
SND_PCI_QUIRK(0x103c, 0x8d9f, "HP 14 Cadet (x360)", ALC287_FIXUP_CS35L41_I2C_2),
|
|
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
|
|
--- a/sound/usb/endpoint.c
|
|
+++ b/sound/usb/endpoint.c
|
|
@@ -449,7 +449,9 @@ static void push_back_to_ready_list(struct snd_usb_endpoint *ep,
|
|
struct snd_urb_ctx *ctx)
|
|
{
|
|
guard(spinlock_irqsave)(&ep->lock);
|
|
- list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs);
|
|
+ /* ctx may still be linked: a stale completion racing a stop/restart. */
|
|
+ if (list_empty(&ctx->ready_list))
|
|
+ list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs);
|
|
}
|
|
|
|
/*
|
|
@@ -1037,6 +1039,7 @@ void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep)
|
|
*/
|
|
static int stop_urbs(struct snd_usb_endpoint *ep, bool force, bool keep_pending)
|
|
{
|
|
+ struct snd_urb_ctx *ctx, *n;
|
|
unsigned int i;
|
|
|
|
if (!force && atomic_read(&ep->running))
|
|
@@ -1046,7 +1049,9 @@ static int stop_urbs(struct snd_usb_endpoint *ep, bool force, bool keep_pending)
|
|
return 0;
|
|
|
|
scoped_guard(spinlock_irqsave, &ep->lock) {
|
|
- INIT_LIST_HEAD(&ep->ready_playback_urbs);
|
|
+ /* Unlink each ctx; INIT_LIST_HEAD() alone would leave them looking linked. */
|
|
+ list_for_each_entry_safe(ctx, n, &ep->ready_playback_urbs, ready_list)
|
|
+ list_del_init(&ctx->ready_list);
|
|
ep->next_packet_head = 0;
|
|
ep->next_packet_queued = 0;
|
|
}
|
|
diff --git a/sound/usb/implicit.c b/sound/usb/implicit.c
|
|
--- a/sound/usb/implicit.c
|
|
+++ b/sound/usb/implicit.c
|
|
@@ -76,6 +76,7 @@ static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = {
|
|
|
|
/* Implicit feedback quirk table for capture: only FIXED type */
|
|
static const struct snd_usb_implicit_fb_match capture_implicit_fb_quirks[] = {
|
|
+ IMPLICIT_FB_FIXED_DEV(0x1397, 0x0004, 0x01, 1), /* Behringer FCA1616 */
|
|
{} /* terminator */
|
|
};
|
|
|
|
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
|
--- a/sound/usb/mixer_maps.c
|
|
+++ b/sound/usb/mixer_maps.c
|
|
@@ -531,6 +531,15 @@ static const struct usbmix_name_map audient_id24_map[] = {
|
|
{}
|
|
};
|
|
|
|
+/*
|
|
+ * The GC553Pro returns no data for GET_CUR on its advertised mute control.
|
|
+ * SET_CUR succeeds but does not mute capture, so skip the control entirely.
|
|
+ */
|
|
+static const struct usbmix_name_map avermedia_gc553pro_map[] = {
|
|
+ { 3, NULL, UAC_FU_MUTE },
|
|
+ {}
|
|
+};
|
|
+
|
|
/*
|
|
* Control map entries
|
|
*/
|
|
@@ -577,6 +586,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|
.id = USB_ID(0x0763, 0x2031),
|
|
.selector_map = c400_selectors,
|
|
},
|
|
+ {
|
|
+ .id = USB_ID(0x07ca, 0x1553),
|
|
+ .map = avermedia_gc553pro_map,
|
|
+ },
|
|
{
|
|
.id = USB_ID(0x08bb, 0x2702),
|
|
.map = linex_map,
|