sound fixes for 6.1-rc5
Things look calming down, as this contains only a few small fixes. - Fix for a corner-case bug with SG-buffer page allocation helper - A regression fix for Roland USB-audio device probe - A potential memory leak fix at the error path - Handful quirks and device-specific fixes for HD- and USB-audio -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmNt/G8OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+t/Q//bmvq2YLb1RL0T0wIJQGGi3vuigxzx9J+r4ny 5fNel816R9JVHnimA7J1GbFIj8l63qiUu/dHMOmNDjqdSZ1KLbu8DpAZu4tL+KKo XpmiXuFZlepgPGYY10kQG85EiuHriF7z1yKJ8QoP3ELIqBi/m77+qJ4JUk2XlPoT 4o4FCit9UQwd4xJ4EmUw3N6bPUumb6Uw0as8Qdfrw5P14VB5ev882eW7iQaeMxhd S35IdXdqLGHVdPJXq38Wx8cvEyCFhS2SsG0QT5kul1Zg0ld5HSaN3V7rg0uKYcLQ +2JfW5wcZwmcYTLpvfdMF/HNWN8RbEoexCUIlWsd7xzlFpB8Z6/EOPGxy2tXIwVb rsElYlb9yeKTnyvTe2hRfHIWZH6s6eYqncv+/gpzxIwVBJ9Is8sMm7upxxki5bky QPwnjWU3iiyJ7sjA+kU25aTdjdHQawz2ds0GILkoi5EnfcAj1fz4FJ+3l4C+Epsf SL+OhcWxDeTggpK3p4lbJIIRY4k38VYXRXjE4gaYn7wdLlXS3SMQgFa6lU6uU286 m4OU/6clOctbBtkX41bicZcG7RzLyb/ns8W0hIhxaJA/QQP/7Jg03PebYe0fyQhu wfMoeqnTHJaRfAOo8K7sEdmffHEJMifUzwNn7NoSxVsvPLWx/HvivdMx0hzGUgai eTqQcEg= =vmwO -----END PGP SIGNATURE----- Merge tag 'sound-6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Things look calming down, as this contains only a few small fixes: - Fix for a corner-case bug with SG-buffer page allocation helper - A regression fix for Roland USB-audio device probe - A potential memory leak fix at the error path - Handful quirks and device-specific fixes for HD- and USB-audio" * tag 'sound-6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda: fix potential memleak in 'add_widget_node' ALSA: memalloc: Don't fall back for SG-buffer with IOMMU ALSA: usb-audio: add quirk to fix Hamedal C20 disconnect issue ALSA: hda/realtek: Add Positivo C6300 model quirk ALSA: usb-audio: Add DSD support for Accuphase DAC-60 ALSA: usb-audio: Add quirk entry for M-Audio Micro ALSA: hda/hdmi - enable runtime pm for more AMD display audio ALSA: usb-audio: Remove redundant workaround for Roland quirk ALSA: usb-audio: Yet more regression for for the delayed card registration ALSA: hda/ca0132: add quirk for EVGA Z390 DARK ALSA: hda: clarify comments on SCF changes ALSA: arm: pxa: pxa2xx-ac97-lib: fix return value check of platform_get_irq() ALSA: hda/realtek: Add quirk for ASUS Zenbook using CS35L41
This commit is contained in:
commit
64b4aef17e
@ -402,8 +402,10 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
|
||||
goto err_clk2;
|
||||
|
||||
irq = platform_get_irq(dev, 0);
|
||||
if (!irq)
|
||||
if (irq < 0) {
|
||||
ret = irq;
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
ret = request_irq(irq, pxa2xx_ac97_irq, 0, "AC97", NULL);
|
||||
if (ret < 0)
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dma-map-ops.h>
|
||||
#include <linux/genalloc.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/vmalloc.h>
|
||||
@ -541,19 +542,20 @@ static void *snd_dma_noncontig_alloc(struct snd_dma_buffer *dmab, size_t size)
|
||||
struct sg_table *sgt;
|
||||
void *p;
|
||||
|
||||
sgt = dma_alloc_noncontiguous(dmab->dev.dev, size, dmab->dev.dir,
|
||||
DEFAULT_GFP, 0);
|
||||
if (!sgt) {
|
||||
#ifdef CONFIG_SND_DMA_SGBUF
|
||||
if (!get_dma_ops(dmab->dev.dev)) {
|
||||
if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG)
|
||||
dmab->dev.type = SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK;
|
||||
else
|
||||
dmab->dev.type = SNDRV_DMA_TYPE_DEV_SG_FALLBACK;
|
||||
return snd_dma_sg_fallback_alloc(dmab, size);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
sgt = dma_alloc_noncontiguous(dmab->dev.dev, size, dmab->dev.dir,
|
||||
DEFAULT_GFP, 0);
|
||||
if (!sgt)
|
||||
return NULL;
|
||||
|
||||
dmab->dev.need_sync = dma_need_sync(dmab->dev.dev,
|
||||
sg_dma_address(sgt->sgl));
|
||||
@ -857,7 +859,7 @@ static const struct snd_malloc_ops snd_dma_noncoherent_ops = {
|
||||
/*
|
||||
* Entry points
|
||||
*/
|
||||
static const struct snd_malloc_ops *dma_ops[] = {
|
||||
static const struct snd_malloc_ops *snd_dma_ops[] = {
|
||||
[SNDRV_DMA_TYPE_CONTINUOUS] = &snd_dma_continuous_ops,
|
||||
[SNDRV_DMA_TYPE_VMALLOC] = &snd_dma_vmalloc_ops,
|
||||
#ifdef CONFIG_HAS_DMA
|
||||
@ -883,7 +885,7 @@ static const struct snd_malloc_ops *snd_dma_get_ops(struct snd_dma_buffer *dmab)
|
||||
if (WARN_ON_ONCE(!dmab))
|
||||
return NULL;
|
||||
if (WARN_ON_ONCE(dmab->dev.type <= SNDRV_DMA_TYPE_UNKNOWN ||
|
||||
dmab->dev.type >= ARRAY_SIZE(dma_ops)))
|
||||
dmab->dev.type >= ARRAY_SIZE(snd_dma_ops)))
|
||||
return NULL;
|
||||
return dma_ops[dmab->dev.type];
|
||||
return snd_dma_ops[dmab->dev.type];
|
||||
}
|
||||
|
@ -346,8 +346,10 @@ static int add_widget_node(struct kobject *parent, hda_nid_t nid,
|
||||
return -ENOMEM;
|
||||
kobject_init(kobj, &widget_ktype);
|
||||
err = kobject_add(kobj, parent, "%02x", nid);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
kobject_put(kobj);
|
||||
return err;
|
||||
}
|
||||
err = sysfs_create_group(kobj, group);
|
||||
if (err < 0) {
|
||||
kobject_put(kobj);
|
||||
|
@ -485,8 +485,8 @@ static int intel_ml_lctl_set_power(struct azx *chip, int state)
|
||||
int timeout;
|
||||
|
||||
/*
|
||||
* the codecs are sharing the first link setting by default
|
||||
* If other links are enabled for stream, they need similar fix
|
||||
* Changes to LCTL.SCF are only needed for the first multi-link dealing
|
||||
* with external codecs
|
||||
*/
|
||||
val = readl(bus->mlcap + AZX_ML_BASE + AZX_REG_ML_LCTL);
|
||||
val &= ~AZX_ML_LCTL_SPA;
|
||||
@ -513,7 +513,7 @@ static void intel_init_lctl(struct azx *chip)
|
||||
|
||||
/* 0. check lctl register value is correct or not */
|
||||
val = readl(bus->mlcap + AZX_ML_BASE + AZX_REG_ML_LCTL);
|
||||
/* if SCF is already set, let's use it */
|
||||
/* only perform additional configurations if the SCF is initially based on 6MHz */
|
||||
if ((val & AZX_ML_LCTL_SCF) != 0)
|
||||
return;
|
||||
|
||||
@ -531,7 +531,7 @@ static void intel_init_lctl(struct azx *chip)
|
||||
if (ret)
|
||||
goto set_spa;
|
||||
|
||||
/* 2. update SCF to select a properly audio clock*/
|
||||
/* 2. update SCF to select an audio clock different from 6MHz */
|
||||
val &= ~AZX_ML_LCTL_SCF;
|
||||
val |= intel_get_lctl_scf(chip);
|
||||
writel(val, bus->mlcap + AZX_ML_BASE + AZX_REG_ML_LCTL);
|
||||
@ -2711,6 +2711,9 @@ static const struct pci_device_id azx_ids[] = {
|
||||
{ PCI_DEVICE(0x1002, 0xab28),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab30),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
{ PCI_DEVICE(0x1002, 0xab38),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
|
||||
AZX_DCAPS_PM_RUNTIME },
|
||||
|
@ -1306,6 +1306,7 @@ static const struct snd_pci_quirk ca0132_quirks[] = {
|
||||
SND_PCI_QUIRK(0x1458, 0xA026, "Gigabyte G1.Sniper Z97", QUIRK_R3DI),
|
||||
SND_PCI_QUIRK(0x1458, 0xA036, "Gigabyte GA-Z170X-Gaming 7", QUIRK_R3DI),
|
||||
SND_PCI_QUIRK(0x3842, 0x1038, "EVGA X99 Classified", QUIRK_R3DI),
|
||||
SND_PCI_QUIRK(0x3842, 0x1055, "EVGA Z390 DARK", QUIRK_R3DI),
|
||||
SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D),
|
||||
SND_PCI_QUIRK(0x1102, 0x0018, "Recon3D", QUIRK_R3D),
|
||||
SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5),
|
||||
|
@ -9404,6 +9404,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
|
||||
SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
|
||||
@ -9608,6 +9609,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
|
||||
SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
|
||||
SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
|
||||
SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
|
||||
|
@ -742,6 +742,18 @@ get_alias_quirk(struct usb_device *dev, unsigned int id)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* register card if we reach to the last interface or to the specified
|
||||
* one given via option
|
||||
*/
|
||||
static int try_to_register_card(struct snd_usb_audio *chip, int ifnum)
|
||||
{
|
||||
if (check_delayed_register_option(chip) == ifnum ||
|
||||
chip->last_iface == ifnum ||
|
||||
usb_interface_claimed(usb_ifnum_to_if(chip->dev, chip->last_iface)))
|
||||
return snd_card_register(chip->card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* probe the active usb device
|
||||
*
|
||||
@ -880,15 +892,9 @@ static int usb_audio_probe(struct usb_interface *intf,
|
||||
chip->need_delayed_register = false; /* clear again */
|
||||
}
|
||||
|
||||
/* register card if we reach to the last interface or to the specified
|
||||
* one given via option
|
||||
*/
|
||||
if (check_delayed_register_option(chip) == ifnum ||
|
||||
usb_interface_claimed(usb_ifnum_to_if(dev, chip->last_iface))) {
|
||||
err = snd_card_register(chip->card);
|
||||
if (err < 0)
|
||||
goto __error;
|
||||
}
|
||||
err = try_to_register_card(chip, ifnum);
|
||||
if (err < 0)
|
||||
goto __error_no_register;
|
||||
|
||||
if (chip->quirk_flags & QUIRK_FLAG_SHARE_MEDIA_DEVICE) {
|
||||
/* don't want to fail when snd_media_device_create() fails */
|
||||
@ -907,6 +913,11 @@ static int usb_audio_probe(struct usb_interface *intf,
|
||||
return 0;
|
||||
|
||||
__error:
|
||||
/* in the case of error in secondary interface, still try to register */
|
||||
if (chip)
|
||||
try_to_register_card(chip, ifnum);
|
||||
|
||||
__error_no_register:
|
||||
if (chip) {
|
||||
/* chip->active is inside the chip->card object,
|
||||
* decrement before memory is possibly returned.
|
||||
|
@ -931,7 +931,8 @@ void snd_usb_endpoint_close(struct snd_usb_audio *chip,
|
||||
usb_audio_dbg(chip, "Closing EP 0x%x (count %d)\n",
|
||||
ep->ep_num, ep->opened);
|
||||
|
||||
if (!--ep->iface_ref->opened)
|
||||
if (!--ep->iface_ref->opened &&
|
||||
!(chip->quirk_flags & QUIRK_FLAG_IFACE_SKIP_CLOSE))
|
||||
endpoint_set_interface(chip, ep, false);
|
||||
|
||||
if (!--ep->opened) {
|
||||
|
@ -2049,6 +2049,10 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
/* M-Audio Micro */
|
||||
USB_DEVICE_VENDOR_SPEC(0x0763, 0x201a),
|
||||
},
|
||||
{
|
||||
USB_DEVICE_VENDOR_SPEC(0x0763, 0x2030),
|
||||
.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
|
||||
|
@ -376,7 +376,8 @@ static int create_auto_midi_quirk(struct snd_usb_audio *chip,
|
||||
|
||||
static int create_autodetect_quirk(struct snd_usb_audio *chip,
|
||||
struct usb_interface *iface,
|
||||
struct usb_driver *driver)
|
||||
struct usb_driver *driver,
|
||||
const struct snd_usb_audio_quirk *quirk)
|
||||
{
|
||||
int err;
|
||||
|
||||
@ -386,45 +387,6 @@ static int create_autodetect_quirk(struct snd_usb_audio *chip,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int create_autodetect_quirks(struct snd_usb_audio *chip,
|
||||
struct usb_interface *iface,
|
||||
struct usb_driver *driver,
|
||||
const struct snd_usb_audio_quirk *quirk)
|
||||
{
|
||||
int probed_ifnum = get_iface_desc(iface->altsetting)->bInterfaceNumber;
|
||||
int ifcount, ifnum, err;
|
||||
|
||||
err = create_autodetect_quirk(chip, iface, driver);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/*
|
||||
* ALSA PCM playback/capture devices cannot be registered in two steps,
|
||||
* so we have to claim the other corresponding interface here.
|
||||
*/
|
||||
ifcount = chip->dev->actconfig->desc.bNumInterfaces;
|
||||
for (ifnum = 0; ifnum < ifcount; ifnum++) {
|
||||
if (ifnum == probed_ifnum || quirk->ifnum >= 0)
|
||||
continue;
|
||||
iface = usb_ifnum_to_if(chip->dev, ifnum);
|
||||
if (!iface ||
|
||||
usb_interface_claimed(iface) ||
|
||||
get_iface_desc(iface->altsetting)->bInterfaceClass !=
|
||||
USB_CLASS_VENDOR_SPEC)
|
||||
continue;
|
||||
|
||||
err = create_autodetect_quirk(chip, iface, driver);
|
||||
if (err >= 0) {
|
||||
err = usb_driver_claim_interface(driver, iface,
|
||||
USB_AUDIO_IFACE_UNUSED);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a stream for an Edirol UA-700/UA-25/UA-4FX interface.
|
||||
* The only way to detect the sample rate is by looking at wMaxPacketSize.
|
||||
@ -554,7 +516,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
|
||||
static const quirk_func_t quirk_funcs[] = {
|
||||
[QUIRK_IGNORE_INTERFACE] = ignore_interface_quirk,
|
||||
[QUIRK_COMPOSITE] = create_composite_quirk,
|
||||
[QUIRK_AUTODETECT] = create_autodetect_quirks,
|
||||
[QUIRK_AUTODETECT] = create_autodetect_quirk,
|
||||
[QUIRK_MIDI_STANDARD_INTERFACE] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_FIXED_ENDPOINT] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_YAMAHA] = create_any_midi_quirk,
|
||||
@ -1913,6 +1875,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
||||
/* XMOS based USB DACs */
|
||||
switch (chip->usb_id) {
|
||||
case USB_ID(0x1511, 0x0037): /* AURALiC VEGA */
|
||||
case USB_ID(0x21ed, 0xd75a): /* Accuphase DAC-60 option card */
|
||||
case USB_ID(0x2522, 0x0012): /* LH Labs VI DAC Infinity */
|
||||
case USB_ID(0x2772, 0x0230): /* Pro-Ject Pre Box S2 Digital */
|
||||
if (fp->altsetting == 2)
|
||||
@ -2185,6 +2148,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
QUIRK_FLAG_GENERIC_IMPLICIT_FB),
|
||||
DEVICE_FLG(0x2b53, 0x0031, /* Fiero SC-01 (firmware v1.1.0) */
|
||||
QUIRK_FLAG_GENERIC_IMPLICIT_FB),
|
||||
DEVICE_FLG(0x0525, 0xa4ad, /* Hamedal C20 usb camero */
|
||||
QUIRK_FLAG_IFACE_SKIP_CLOSE),
|
||||
|
||||
/* Vendor matches */
|
||||
VENDOR_FLG(0x045e, /* MS Lifecam */
|
||||
|
@ -170,6 +170,8 @@ extern bool snd_usb_skip_validation;
|
||||
* Apply the generic implicit feedback sync mode (same as implicit_fb=1 option)
|
||||
* QUIRK_FLAG_SKIP_IMPLICIT_FB
|
||||
* Don't apply implicit feedback sync mode
|
||||
* QUIRK_FLAG_IFACE_SKIP_CLOSE
|
||||
* Don't closed interface during setting sample rate
|
||||
*/
|
||||
|
||||
#define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
|
||||
@ -191,5 +193,6 @@ extern bool snd_usb_skip_validation;
|
||||
#define QUIRK_FLAG_SET_IFACE_FIRST (1U << 16)
|
||||
#define QUIRK_FLAG_GENERIC_IMPLICIT_FB (1U << 17)
|
||||
#define QUIRK_FLAG_SKIP_IMPLICIT_FB (1U << 18)
|
||||
#define QUIRK_FLAG_IFACE_SKIP_CLOSE (1U << 19)
|
||||
|
||||
#endif /* __USBAUDIO_H */
|
||||
|
Loading…
Reference in New Issue
Block a user