sound fixes for v3.10-rc7
Only driver/device-specific small fixes that are pretty safe to apply: - USB-audio Android and Logitech webcam fixes - HD-audio MacBook Air 4,2 quirk - Complete Dell headset quirk entries that were introduced in 3.10 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAABAgAGBQJRwE63AAoJEGwxgFQ9KSmkp/MP/3Se0DcqqBtw//LKWShfLzMH TnJ/gyfcU/0dEc26zYHVjhcJzkLu3E52ROso5xpvidPlfuiq59JnK/Rh753dznIt ifU0y1j94md7aX67HwHHRR/erZoz3T7ImPnHjRXsoozi3/t/GFroKpQaS3aQwD8u dWgfQ2V7+W7IJaqRsDzD3w1EN8yy/L8OAD34vYX1kJ4moYY2xbKDPCiQAfCqNDqI J4rAtr22KcEIjefRJlubptqm7Nd26r7rcfZtygf6zlxef1BRp9rgC+XlLySm6FNo lSmRDkfP5/2Z9/rbUgLKw6lZafBCuFsD56E87DD7lDayJ6IpoHsp4s3/yUV5x/cv Hyv1GGvgqna1dbAX/r7Do3SOjz++L8zJlxVr0xcLEC9abDtJwm832DaMg5N36AzD qKiYQrjFe/qAkncN0UyDGCZLtqIH++oNN8C/pWdejlUlN3GE+IAFV8sBQraAFeOR GVEbX7TYG70ozpHsR1MAAVz7fCq1RRtaSkO0pyV9NM4qvjbBSndPG3mfPuepk9/N zAFdm88n3/iwPWWVUSZ7Z6KYa6OR9YK/ROjFUnTqt+H7732ZLVexpDelEuGUPDtA +xk79M880SSDsm7CNl8Pihw47pwF1sMNcdwsBWIrbKVIMzeh0gnN+DKzRMLV6SBU 0JD7zSwvG9jUfGJK0g3m =rE5q -----END PGP SIGNATURE----- Merge tag 'sound-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Only driver/device-specific small fixes that are pretty safe to apply: - USB-audio Android and Logitech webcam fixes - HD-audio MacBook Air 4,2 quirk - Complete Dell headset quirk entries that were introduced in 3.10" * tag 'sound-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Add models for Dell headset jacks ALSA: usb-audio: Fix invalid volume resolution for Logitech HD Webcam c310 ALSA: hda - Fix pin configurations for MacBook Air 4,2 ALSA: usb-audio: work around Android accessory firmware bug ALSA: hda - Headset mic support for three more machines
This commit is contained in:
commit
2601ded7fd
|
@ -29,6 +29,8 @@ ALC269/270/275/276/280/282
|
||||||
alc271-dmic Enable ALC271X digital mic workaround
|
alc271-dmic Enable ALC271X digital mic workaround
|
||||||
inv-dmic Inverted internal mic workaround
|
inv-dmic Inverted internal mic workaround
|
||||||
lenovo-dock Enables docking station I/O for some Lenovos
|
lenovo-dock Enables docking station I/O for some Lenovos
|
||||||
|
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||||
|
dell-headset-dock Headset jack (without mic-in), and also dock I/O
|
||||||
|
|
||||||
ALC662/663/272
|
ALC662/663/272
|
||||||
==============
|
==============
|
||||||
|
@ -42,6 +44,7 @@ ALC662/663/272
|
||||||
asus-mode7 ASUS
|
asus-mode7 ASUS
|
||||||
asus-mode8 ASUS
|
asus-mode8 ASUS
|
||||||
inv-dmic Inverted internal mic workaround
|
inv-dmic Inverted internal mic workaround
|
||||||
|
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||||
|
|
||||||
ALC680
|
ALC680
|
||||||
======
|
======
|
||||||
|
|
|
@ -58,6 +58,7 @@ enum {
|
||||||
CS420X_GPIO_23,
|
CS420X_GPIO_23,
|
||||||
CS420X_MBP101,
|
CS420X_MBP101,
|
||||||
CS420X_MBP81,
|
CS420X_MBP81,
|
||||||
|
CS420X_MBA42,
|
||||||
CS420X_AUTO,
|
CS420X_AUTO,
|
||||||
/* aliases */
|
/* aliases */
|
||||||
CS420X_IMAC27_122 = CS420X_GPIO_23,
|
CS420X_IMAC27_122 = CS420X_GPIO_23,
|
||||||
|
@ -346,6 +347,7 @@ static const struct hda_model_fixup cs420x_models[] = {
|
||||||
{ .id = CS420X_APPLE, .name = "apple" },
|
{ .id = CS420X_APPLE, .name = "apple" },
|
||||||
{ .id = CS420X_MBP101, .name = "mbp101" },
|
{ .id = CS420X_MBP101, .name = "mbp101" },
|
||||||
{ .id = CS420X_MBP81, .name = "mbp81" },
|
{ .id = CS420X_MBP81, .name = "mbp81" },
|
||||||
|
{ .id = CS420X_MBA42, .name = "mba42" },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -361,6 +363,7 @@ static const struct snd_pci_quirk cs420x_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81),
|
SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81),
|
||||||
SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122),
|
SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122),
|
||||||
SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101),
|
SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101),
|
||||||
|
SND_PCI_QUIRK(0x106b, 0x5b00, "MacBookAir 4,2", CS420X_MBA42),
|
||||||
SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE),
|
SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE),
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
@ -414,6 +417,20 @@ static const struct hda_pintbl mbp101_pincfgs[] = {
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct hda_pintbl mba42_pincfgs[] = {
|
||||||
|
{ 0x09, 0x012b4030 }, /* HP */
|
||||||
|
{ 0x0a, 0x400000f0 },
|
||||||
|
{ 0x0b, 0x90100120 }, /* speaker */
|
||||||
|
{ 0x0c, 0x400000f0 },
|
||||||
|
{ 0x0d, 0x90a00110 }, /* mic */
|
||||||
|
{ 0x0e, 0x400000f0 },
|
||||||
|
{ 0x0f, 0x400000f0 },
|
||||||
|
{ 0x10, 0x400000f0 },
|
||||||
|
{ 0x12, 0x400000f0 },
|
||||||
|
{ 0x15, 0x400000f0 },
|
||||||
|
{} /* terminator */
|
||||||
|
};
|
||||||
|
|
||||||
static void cs420x_fixup_gpio_13(struct hda_codec *codec,
|
static void cs420x_fixup_gpio_13(struct hda_codec *codec,
|
||||||
const struct hda_fixup *fix, int action)
|
const struct hda_fixup *fix, int action)
|
||||||
{
|
{
|
||||||
|
@ -482,6 +499,12 @@ static const struct hda_fixup cs420x_fixups[] = {
|
||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = CS420X_GPIO_13,
|
.chain_id = CS420X_GPIO_13,
|
||||||
},
|
},
|
||||||
|
[CS420X_MBA42] = {
|
||||||
|
.type = HDA_FIXUP_PINS,
|
||||||
|
.v.pins = mba42_pincfgs,
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = CS420X_GPIO_13,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cs_spec *cs_alloc_spec(struct hda_codec *codec, int vendor_nid)
|
static struct cs_spec *cs_alloc_spec(struct hda_codec *codec, int vendor_nid)
|
||||||
|
|
|
@ -3483,6 +3483,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x1028, 0x05ca, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05ca, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05cb, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05cb, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05de, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05de, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x05e0, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05e9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05e9, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05ea, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05ea, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05eb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05eb, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
|
@ -3494,6 +3495,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_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),
|
||||||
SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
|
||||||
|
@ -3596,6 +3599,8 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||||
{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
||||||
{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
|
{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
|
||||||
{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
|
{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
|
||||||
|
{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
|
||||||
|
{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4275,6 +4280,7 @@ static const struct hda_model_fixup alc662_fixup_models[] = {
|
||||||
{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
|
{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
|
||||||
{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
|
{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
|
||||||
{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
|
||||||
|
{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -147,14 +147,32 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alts = &iface->altsetting[0];
|
||||||
|
altsd = get_iface_desc(alts);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Android with both accessory and audio interfaces enabled gets the
|
||||||
|
* interface numbers wrong.
|
||||||
|
*/
|
||||||
|
if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) ||
|
||||||
|
chip->usb_id == USB_ID(0x18d1, 0x2d05)) &&
|
||||||
|
interface == 0 &&
|
||||||
|
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
|
||||||
|
altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) {
|
||||||
|
interface = 2;
|
||||||
|
iface = usb_ifnum_to_if(dev, interface);
|
||||||
|
if (!iface)
|
||||||
|
return -EINVAL;
|
||||||
|
alts = &iface->altsetting[0];
|
||||||
|
altsd = get_iface_desc(alts);
|
||||||
|
}
|
||||||
|
|
||||||
if (usb_interface_claimed(iface)) {
|
if (usb_interface_claimed(iface)) {
|
||||||
snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n",
|
snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n",
|
||||||
dev->devnum, ctrlif, interface);
|
dev->devnum, ctrlif, interface);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
alts = &iface->altsetting[0];
|
|
||||||
altsd = get_iface_desc(alts);
|
|
||||||
if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
|
if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
|
||||||
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
|
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
|
||||||
altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) {
|
altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) {
|
||||||
|
|
|
@ -885,6 +885,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
||||||
|
|
||||||
case USB_ID(0x046d, 0x0808):
|
case USB_ID(0x046d, 0x0808):
|
||||||
case USB_ID(0x046d, 0x0809):
|
case USB_ID(0x046d, 0x0809):
|
||||||
|
case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */
|
||||||
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
|
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
|
||||||
case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
|
case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
|
||||||
case USB_ID(0x046d, 0x0991):
|
case USB_ID(0x046d, 0x0991):
|
||||||
|
|
Loading…
Reference in New Issue