sound fixes for 6.0-rc1
Includes a few usual updates for HD- and USB-audio and a trivial cleanup patch. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmL2IUcOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/wRBAAptfMcwQ4RmGYp95jCx+DgqWkDljFKi1BvW6b EB4M+/PcDeXcl8MGDc5C+NIBqI5ACaVx42mPlfN7a1eWuxPV3PADjpHJF01HYQ6r dOLic2+m1kaVnDw+jvegQv53BsFNVHaAJFaVmEofZudyHnY3SO+svQ+O4AbWvEGX SzAnSdvp7w8T5KEYLakJBnafnh/o7LFnjqMNxj4AkL8NU1g0asn6ddmr8AwC0gsJ FjWqOsmx5E+oQ5+UOBMjN6JmxuRTJLx8HFAzvRvDGv+uLUeQgRxWisMwQSMMVvfF R7KW5UzPcElNrSVzX2JdWUBcWsZ6AJc7LCwiLJ/Ysm3a2B6R6e3keAdLtmWIbQvJ 4WikB/JKGFeR7mwKSyLJOag7lk5qgC2xKuwcymr9pnYIPOxuU0jWEYmaJKBgxd3Y tqovRQo8XWpnJXvSXimufd31z0wVPZ62uYM4AGkxCODKV8dTpm3qentEeRiewwlF DpAZV1fNhLxEwEFb70wVUojvqoo+Q2T4GzpTt5h4ojgj3no+J+mJ2OcKa28Unz41 guVYXOEpry3oi6f7la4L8elAazmtZDgJMmBlA7yYmyn+kSlVS2sRZvoRbv0juZG0 ThfghG65VyYZOXCyWKSmgiQ1dmyrVt/4IP2IkYCVkSRevWkZDoVSFD/Y+Nt6tosN n0M7HGY= =RQJ7 -----END PGP SIGNATURE----- Merge tag 'sound-fix-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Includes a few usual updates for HD- and USB-audio and a trivial cleanup patch" * tag 'sound-fix-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda: Fix crash due to jack poll in suspend ALSA: hda/cirrus - support for iMac 12,1 model ALSA: usb-audio: make read-only array marker static const ALSA: hda/realtek: Add a quirk for HP OMEN 15 (8786) mute LED ALSA: usb-audio: More comprehensive mixer map for ASUS ROG Zenith II ALSA: scarlett2: Add Focusrite Clarett+ 8Pre support ALSA: hda/conexant: Add quirk for LENOVO 20149 Notebook model ALSA: ice1712: remove redundant assignment to new ALSA: hda/realtek: Add quirk for another Asus K42JZ model
This commit is contained in:
commit
4a9350597a
|
@ -2940,8 +2940,7 @@ static int hda_codec_runtime_suspend(struct device *dev)
|
||||||
if (!codec->card)
|
if (!codec->card)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!codec->bus->jackpoll_in_suspend)
|
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
|
||||||
|
|
||||||
state = hda_call_codec_suspend(codec);
|
state = hda_call_codec_suspend(codec);
|
||||||
if (codec->link_down_at_suspend ||
|
if (codec->link_down_at_suspend ||
|
||||||
|
@ -2949,6 +2948,11 @@ static int hda_codec_runtime_suspend(struct device *dev)
|
||||||
(state & AC_PWRST_CLK_STOP_OK)))
|
(state & AC_PWRST_CLK_STOP_OK)))
|
||||||
snd_hdac_codec_link_down(&codec->core);
|
snd_hdac_codec_link_down(&codec->core);
|
||||||
snd_hda_codec_display_power(codec, false);
|
snd_hda_codec_display_power(codec, false);
|
||||||
|
|
||||||
|
if (codec->bus->jackpoll_in_suspend &&
|
||||||
|
(dev->power.power_state.event != PM_EVENT_SUSPEND))
|
||||||
|
schedule_delayed_work(&codec->jackpoll_work,
|
||||||
|
codec->jackpoll_interval);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2972,6 +2976,9 @@ static int hda_codec_runtime_resume(struct device *dev)
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int hda_codec_pm_prepare(struct device *dev)
|
static int hda_codec_pm_prepare(struct device *dev)
|
||||||
{
|
{
|
||||||
|
struct hda_codec *codec = dev_to_hda_codec(dev);
|
||||||
|
|
||||||
|
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||||
dev->power.power_state = PMSG_SUSPEND;
|
dev->power.power_state = PMSG_SUSPEND;
|
||||||
return pm_runtime_suspended(dev);
|
return pm_runtime_suspended(dev);
|
||||||
}
|
}
|
||||||
|
@ -2991,9 +2998,6 @@ static void hda_codec_pm_complete(struct device *dev)
|
||||||
|
|
||||||
static int hda_codec_pm_suspend(struct device *dev)
|
static int hda_codec_pm_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct hda_codec *codec = dev_to_hda_codec(dev);
|
|
||||||
|
|
||||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
|
||||||
dev->power.power_state = PMSG_SUSPEND;
|
dev->power.power_state = PMSG_SUSPEND;
|
||||||
return pm_runtime_force_suspend(dev);
|
return pm_runtime_force_suspend(dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,6 +395,7 @@ static const struct snd_pci_quirk cs420x_fixup_tbl[] = {
|
||||||
|
|
||||||
/* codec SSID */
|
/* codec SSID */
|
||||||
SND_PCI_QUIRK(0x106b, 0x0600, "iMac 14,1", CS420X_IMAC27_122),
|
SND_PCI_QUIRK(0x106b, 0x0600, "iMac 14,1", CS420X_IMAC27_122),
|
||||||
|
SND_PCI_QUIRK(0x106b, 0x0900, "iMac 12,1", CS420X_IMAC27_122),
|
||||||
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),
|
||||||
|
|
|
@ -222,6 +222,7 @@ enum {
|
||||||
CXT_PINCFG_LEMOTE_A1205,
|
CXT_PINCFG_LEMOTE_A1205,
|
||||||
CXT_PINCFG_COMPAQ_CQ60,
|
CXT_PINCFG_COMPAQ_CQ60,
|
||||||
CXT_FIXUP_STEREO_DMIC,
|
CXT_FIXUP_STEREO_DMIC,
|
||||||
|
CXT_PINCFG_LENOVO_NOTEBOOK,
|
||||||
CXT_FIXUP_INC_MIC_BOOST,
|
CXT_FIXUP_INC_MIC_BOOST,
|
||||||
CXT_FIXUP_HEADPHONE_MIC_PIN,
|
CXT_FIXUP_HEADPHONE_MIC_PIN,
|
||||||
CXT_FIXUP_HEADPHONE_MIC,
|
CXT_FIXUP_HEADPHONE_MIC,
|
||||||
|
@ -772,6 +773,14 @@ static const struct hda_fixup cxt_fixups[] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = cxt_fixup_stereo_dmic,
|
.v.func = cxt_fixup_stereo_dmic,
|
||||||
},
|
},
|
||||||
|
[CXT_PINCFG_LENOVO_NOTEBOOK] = {
|
||||||
|
.type = HDA_FIXUP_PINS,
|
||||||
|
.v.pins = (const struct hda_pintbl[]) {
|
||||||
|
{ 0x1a, 0x05d71030 },
|
||||||
|
{ }
|
||||||
|
},
|
||||||
|
.chain_id = CXT_FIXUP_STEREO_DMIC,
|
||||||
|
},
|
||||||
[CXT_FIXUP_INC_MIC_BOOST] = {
|
[CXT_FIXUP_INC_MIC_BOOST] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = cxt5066_increase_mic_boost,
|
.v.func = cxt5066_increase_mic_boost,
|
||||||
|
@ -971,7 +980,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3905, "Lenovo G50-30", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x17aa, 0x3905, "Lenovo G50-30", CXT_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x390b, "Lenovo G50-80", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x17aa, 0x390b, "Lenovo G50-80", CXT_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_PINCFG_LENOVO_NOTEBOOK),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo G50-70", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo G50-70", CXT_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),
|
SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", CXT_FIXUP_THINKPAD_ACPI),
|
SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", CXT_FIXUP_THINKPAD_ACPI),
|
||||||
|
|
|
@ -6909,6 +6909,7 @@ enum {
|
||||||
ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
|
ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
|
||||||
ALC269VB_FIXUP_ASUS_ZENBOOK,
|
ALC269VB_FIXUP_ASUS_ZENBOOK,
|
||||||
ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
|
ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
|
||||||
|
ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||||
ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
|
ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
|
||||||
ALC269VB_FIXUP_ORDISSIMO_EVE2,
|
ALC269VB_FIXUP_ORDISSIMO_EVE2,
|
||||||
ALC283_FIXUP_CHROME_BOOK,
|
ALC283_FIXUP_CHROME_BOOK,
|
||||||
|
@ -7497,6 +7498,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
|
.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
|
||||||
},
|
},
|
||||||
|
[ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
|
||||||
|
.type = HDA_FIXUP_PINS,
|
||||||
|
.v.pins = (const struct hda_pintbl[]) {
|
||||||
|
{ 0x18, 0x01a110f0 }, /* use as headset mic */
|
||||||
|
{ }
|
||||||
|
},
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = ALC269_FIXUP_HEADSET_MIC
|
||||||
|
},
|
||||||
[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
|
[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc269_fixup_limit_int_mic_boost,
|
.v.func = alc269_fixup_limit_int_mic_boost,
|
||||||
|
@ -9203,6 +9213,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
|
SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
|
||||||
ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||||
|
SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
|
||||||
SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||||
|
@ -9274,6 +9285,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
||||||
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),
|
||||||
|
|
|
@ -566,7 +566,7 @@ static int qtet_ain12_sw_put(struct snd_kcontrol *kcontrol,
|
||||||
{
|
{
|
||||||
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
|
||||||
unsigned int old, new, tmp, masked_old;
|
unsigned int old, new, tmp, masked_old;
|
||||||
old = new = get_scr(ice);
|
old = get_scr(ice);
|
||||||
masked_old = old & (SCR_AIN12_SEL1 | SCR_AIN12_SEL0);
|
masked_old = old & (SCR_AIN12_SEL1 | SCR_AIN12_SEL0);
|
||||||
tmp = ucontrol->value.integer.value[0];
|
tmp = ucontrol->value.integer.value[0];
|
||||||
if (tmp == 2)
|
if (tmp == 2)
|
||||||
|
|
|
@ -387,6 +387,14 @@ static const struct usb_audio_device_name usb_audio_names[] = {
|
||||||
DEVICE_NAME(0x05e1, 0x0408, "Syntek", "STK1160"),
|
DEVICE_NAME(0x05e1, 0x0408, "Syntek", "STK1160"),
|
||||||
DEVICE_NAME(0x05e1, 0x0480, "Hauppauge", "Woodbury"),
|
DEVICE_NAME(0x05e1, 0x0480, "Hauppauge", "Woodbury"),
|
||||||
|
|
||||||
|
/* ASUS ROG Zenith II: this machine has also two devices, one for
|
||||||
|
* the front headphone and another for the rest
|
||||||
|
*/
|
||||||
|
PROFILE_NAME(0x0b05, 0x1915, "ASUS", "Zenith II Front Headphone",
|
||||||
|
"Zenith-II-Front-Headphone"),
|
||||||
|
PROFILE_NAME(0x0b05, 0x1916, "ASUS", "Zenith II Main Audio",
|
||||||
|
"Zenith-II-Main-Audio"),
|
||||||
|
|
||||||
/* ASUS ROG Strix */
|
/* ASUS ROG Strix */
|
||||||
PROFILE_NAME(0x0b05, 0x1917,
|
PROFILE_NAME(0x0b05, 0x1917,
|
||||||
"Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
|
"Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
|
||||||
|
|
|
@ -374,13 +374,28 @@ static const struct usbmix_name_map corsair_virtuoso_map[] = {
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Some mobos shipped with a dummy HD-audio show the invalid GET_MIN/GET_MAX
|
/* ASUS ROG Zenith II with Realtek ALC1220-VB */
|
||||||
* response for Input Gain Pad (id=19, control=12) and the connector status
|
static const struct usbmix_name_map asus_zenith_ii_map[] = {
|
||||||
* for SPDIF terminal (id=18). Skip them.
|
{ 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */
|
||||||
*/
|
{ 16, "Speaker" }, /* OT */
|
||||||
static const struct usbmix_name_map asus_rog_map[] = {
|
{ 22, "Speaker Playback" }, /* FU */
|
||||||
{ 18, NULL }, /* OT, connector control */
|
{ 7, "Line" }, /* IT */
|
||||||
{ 19, NULL, 12 }, /* FU, Input Gain Pad */
|
{ 19, "Line Capture" }, /* FU */
|
||||||
|
{ 8, "Mic" }, /* IT */
|
||||||
|
{ 20, "Mic Capture" }, /* FU */
|
||||||
|
{ 9, "Front Mic" }, /* IT */
|
||||||
|
{ 21, "Front Mic Capture" }, /* FU */
|
||||||
|
{ 17, "IEC958" }, /* OT */
|
||||||
|
{ 23, "IEC958 Playback" }, /* FU */
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct usbmix_connector_map asus_zenith_ii_connector_map[] = {
|
||||||
|
{ 10, 16 }, /* (Back) Speaker */
|
||||||
|
{ 11, 17 }, /* SPDIF */
|
||||||
|
{ 13, 7 }, /* Line */
|
||||||
|
{ 14, 8 }, /* Mic */
|
||||||
|
{ 15, 9 }, /* Front Mic */
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -611,9 +626,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||||
.map = gigabyte_b450_map,
|
.map = gigabyte_b450_map,
|
||||||
.connector_map = gigabyte_b450_connector_map,
|
.connector_map = gigabyte_b450_connector_map,
|
||||||
},
|
},
|
||||||
{ /* ASUS ROG Zenith II */
|
{ /* ASUS ROG Zenith II (main audio) */
|
||||||
.id = USB_ID(0x0b05, 0x1916),
|
.id = USB_ID(0x0b05, 0x1916),
|
||||||
.map = asus_rog_map,
|
.map = asus_zenith_ii_map,
|
||||||
|
.connector_map = asus_zenith_ii_connector_map,
|
||||||
},
|
},
|
||||||
{ /* ASUS ROG Strix */
|
{ /* ASUS ROG Strix */
|
||||||
.id = USB_ID(0x0b05, 0x1917),
|
.id = USB_ID(0x0b05, 0x1917),
|
||||||
|
|
|
@ -3420,6 +3420,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
|
||||||
case USB_ID(0x1235, 0x8213): /* Focusrite Scarlett 8i6 3rd Gen */
|
case USB_ID(0x1235, 0x8213): /* Focusrite Scarlett 8i6 3rd Gen */
|
||||||
case USB_ID(0x1235, 0x8214): /* Focusrite Scarlett 18i8 3rd Gen */
|
case USB_ID(0x1235, 0x8214): /* Focusrite Scarlett 18i8 3rd Gen */
|
||||||
case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
|
case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
|
||||||
|
case USB_ID(0x1235, 0x820c): /* Focusrite Clarett+ 8Pre */
|
||||||
err = snd_scarlett_gen2_init(mixer);
|
err = snd_scarlett_gen2_init(mixer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Focusrite Scarlett Gen 2/3 Driver for ALSA
|
* Focusrite Scarlett Gen 2/3 and Clarett+ Driver for ALSA
|
||||||
*
|
*
|
||||||
* Supported models:
|
* Supported models:
|
||||||
* - 6i6/18i8/18i20 Gen 2
|
* - 6i6/18i8/18i20 Gen 2
|
||||||
* - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3
|
* - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3
|
||||||
|
* - Clarett+ 8Pre
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018-2022 by Geoffrey D. Bennett <g at b4.vu>
|
* Copyright (c) 2018-2022 by Geoffrey D. Bennett <g at b4.vu>
|
||||||
* Copyright (c) 2020-2021 by Vladimir Sadovnikov <sadko4u@gmail.com>
|
* Copyright (c) 2020-2021 by Vladimir Sadovnikov <sadko4u@gmail.com>
|
||||||
|
* Copyright (c) 2022 by Christian Colglazier <christian@cacolglazier.com>
|
||||||
*
|
*
|
||||||
* Based on the Scarlett (Gen 1) Driver for ALSA:
|
* Based on the Scarlett (Gen 1) Driver for ALSA:
|
||||||
*
|
*
|
||||||
|
@ -51,6 +53,9 @@
|
||||||
* Support for phantom power, direct monitoring, speaker switching,
|
* Support for phantom power, direct monitoring, speaker switching,
|
||||||
* and talkback added in May-June 2021.
|
* and talkback added in May-June 2021.
|
||||||
*
|
*
|
||||||
|
* Support for Clarett+ 8Pre added in Aug 2022 by Christian
|
||||||
|
* Colglazier.
|
||||||
|
*
|
||||||
* This ALSA mixer gives access to (model-dependent):
|
* This ALSA mixer gives access to (model-dependent):
|
||||||
* - input, output, mixer-matrix muxes
|
* - input, output, mixer-matrix muxes
|
||||||
* - mixer-matrix gain stages
|
* - mixer-matrix gain stages
|
||||||
|
@ -203,7 +208,8 @@ enum {
|
||||||
SCARLETT2_CONFIG_SET_NO_MIXER = 0,
|
SCARLETT2_CONFIG_SET_NO_MIXER = 0,
|
||||||
SCARLETT2_CONFIG_SET_GEN_2 = 1,
|
SCARLETT2_CONFIG_SET_GEN_2 = 1,
|
||||||
SCARLETT2_CONFIG_SET_GEN_3 = 2,
|
SCARLETT2_CONFIG_SET_GEN_3 = 2,
|
||||||
SCARLETT2_CONFIG_SET_COUNT = 3
|
SCARLETT2_CONFIG_SET_CLARETT = 3,
|
||||||
|
SCARLETT2_CONFIG_SET_COUNT = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Hardware port types:
|
/* Hardware port types:
|
||||||
|
@ -841,6 +847,61 @@ static const struct scarlett2_device_info s18i20_gen3_info = {
|
||||||
} },
|
} },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct scarlett2_device_info clarett_8pre_info = {
|
||||||
|
.usb_id = USB_ID(0x1235, 0x820c),
|
||||||
|
|
||||||
|
.config_set = SCARLETT2_CONFIG_SET_CLARETT,
|
||||||
|
.line_out_hw_vol = 1,
|
||||||
|
.level_input_count = 2,
|
||||||
|
.air_input_count = 8,
|
||||||
|
|
||||||
|
.line_out_descrs = {
|
||||||
|
"Monitor L",
|
||||||
|
"Monitor R",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"Headphones 1 L",
|
||||||
|
"Headphones 1 R",
|
||||||
|
"Headphones 2 L",
|
||||||
|
"Headphones 2 R",
|
||||||
|
},
|
||||||
|
|
||||||
|
.port_count = {
|
||||||
|
[SCARLETT2_PORT_TYPE_NONE] = { 1, 0 },
|
||||||
|
[SCARLETT2_PORT_TYPE_ANALOGUE] = { 8, 10 },
|
||||||
|
[SCARLETT2_PORT_TYPE_SPDIF] = { 2, 2 },
|
||||||
|
[SCARLETT2_PORT_TYPE_ADAT] = { 8, 8 },
|
||||||
|
[SCARLETT2_PORT_TYPE_MIX] = { 10, 18 },
|
||||||
|
[SCARLETT2_PORT_TYPE_PCM] = { 20, 18 },
|
||||||
|
},
|
||||||
|
|
||||||
|
.mux_assignment = { {
|
||||||
|
{ SCARLETT2_PORT_TYPE_PCM, 0, 18 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_ANALOGUE, 0, 10 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_SPDIF, 0, 2 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_ADAT, 0, 8 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_MIX, 0, 18 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_NONE, 0, 8 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
}, {
|
||||||
|
{ SCARLETT2_PORT_TYPE_PCM, 0, 14 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_ANALOGUE, 0, 10 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_SPDIF, 0, 2 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_ADAT, 0, 4 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_MIX, 0, 18 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_NONE, 0, 8 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
}, {
|
||||||
|
{ SCARLETT2_PORT_TYPE_PCM, 0, 12 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_ANALOGUE, 0, 10 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_SPDIF, 0, 2 },
|
||||||
|
{ SCARLETT2_PORT_TYPE_NONE, 0, 22 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
} },
|
||||||
|
};
|
||||||
|
|
||||||
static const struct scarlett2_device_info *scarlett2_devices[] = {
|
static const struct scarlett2_device_info *scarlett2_devices[] = {
|
||||||
/* Supported Gen 2 devices */
|
/* Supported Gen 2 devices */
|
||||||
&s6i6_gen2_info,
|
&s6i6_gen2_info,
|
||||||
|
@ -855,6 +916,9 @@ static const struct scarlett2_device_info *scarlett2_devices[] = {
|
||||||
&s18i8_gen3_info,
|
&s18i8_gen3_info,
|
||||||
&s18i20_gen3_info,
|
&s18i20_gen3_info,
|
||||||
|
|
||||||
|
/* Supported Clarett+ devices */
|
||||||
|
&clarett_8pre_info,
|
||||||
|
|
||||||
/* End of list */
|
/* End of list */
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -1047,6 +1111,29 @@ static const struct scarlett2_config
|
||||||
|
|
||||||
[SCARLETT2_CONFIG_TALKBACK_MAP] = {
|
[SCARLETT2_CONFIG_TALKBACK_MAP] = {
|
||||||
.offset = 0xb0, .size = 16, .activate = 10 },
|
.offset = 0xb0, .size = 16, .activate = 10 },
|
||||||
|
|
||||||
|
/* Clarett+ 8Pre */
|
||||||
|
}, {
|
||||||
|
[SCARLETT2_CONFIG_DIM_MUTE] = {
|
||||||
|
.offset = 0x31, .size = 8, .activate = 2 },
|
||||||
|
|
||||||
|
[SCARLETT2_CONFIG_LINE_OUT_VOLUME] = {
|
||||||
|
.offset = 0x34, .size = 16, .activate = 1 },
|
||||||
|
|
||||||
|
[SCARLETT2_CONFIG_MUTE_SWITCH] = {
|
||||||
|
.offset = 0x5c, .size = 8, .activate = 1 },
|
||||||
|
|
||||||
|
[SCARLETT2_CONFIG_SW_HW_SWITCH] = {
|
||||||
|
.offset = 0x66, .size = 8, .activate = 3 },
|
||||||
|
|
||||||
|
[SCARLETT2_CONFIG_LEVEL_SWITCH] = {
|
||||||
|
.offset = 0x7c, .size = 8, .activate = 7 },
|
||||||
|
|
||||||
|
[SCARLETT2_CONFIG_AIR_SWITCH] = {
|
||||||
|
.offset = 0x95, .size = 8, .activate = 8 },
|
||||||
|
|
||||||
|
[SCARLETT2_CONFIG_STANDALONE_SWITCH] = {
|
||||||
|
.offset = 0x8d, .size = 8, .activate = 6 },
|
||||||
} };
|
} };
|
||||||
|
|
||||||
/* proprietary request/response format */
|
/* proprietary request/response format */
|
||||||
|
|
|
@ -1269,7 +1269,7 @@ static inline void fill_playback_urb_dsd_dop(struct snd_usb_substream *subs,
|
||||||
unsigned int wrap = subs->buffer_bytes;
|
unsigned int wrap = subs->buffer_bytes;
|
||||||
u8 *dst = urb->transfer_buffer;
|
u8 *dst = urb->transfer_buffer;
|
||||||
u8 *src = runtime->dma_area;
|
u8 *src = runtime->dma_area;
|
||||||
u8 marker[] = { 0x05, 0xfa };
|
static const u8 marker[] = { 0x05, 0xfa };
|
||||||
unsigned int queued = 0;
|
unsigned int queued = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue