mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
sound fixes for 6.11-rc4
All small fixes, mostly for usual suspects, HD-audio and USB-audio device-specific fixes / quirks. The Cirrus codec support took the update of SPI header as well. Other than that, there is a regression fix in the sanity check of ALSA timer code. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAma/EPgOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9ulQ/+OOiA26nLVV1Jux5RubXjT3FEQlhvX2U2QFKs tZuJzlLCyQiT/xySSZpkxSiASKxxgiiiilhfrVAQyxOga2QCmaHwO7akrnH5yNvk J/pO2Z1bW7DUHuo9qjTq6rYf39EQ9NhhsM6563/dYyh7YkPZsQ3HPt4PiZUJmAKf pX1SqAp7cw/ZX7EfEc0ysoxv3DcJRBZYQbDid33qN/CAFqUFhoSAYzRVa22Emi4h 3eva4zkxiVe7K9slWdLILFVO1Cq3PJc843B2dhcZLJFDlYBN1W/ouU3oBnUchq0k TwtwPq7HM/vFafUtSi0k3vbmPSYpTdcz5rICYGKeoRxRVbMlxBXNiZmrSWMVLTys aN+GRHSM2Hq6L6Mqrs/RsYxhj0jmvNWnpEzJ/AC4ZGAWw0EBcr2jNZLcS5rdOxQx J4BenpXEt90qkPKo8YA9PcZAvG+vJasMIccL6+bm0PlxtLVFgLe7HVE+OBgktmyh AD3oU8FLwVIZv3OyJh1Q7UIHObQlWXJSGwfN+P3tWPoKVirfL0lyIrSTUyJnxARr YZqpSuFUX5WKAV42M60R3xlyt1vUjPvXWbbJfCwqcZ4PXInXf8JPLSa1lj3Wutb6 Gmv+hEJSFnQXw7s4dtkUheI96p5SI/gTernwgg0wDQ2Jt7d1jDQ7b51jADGZmVU3 C9mq2aI= =/QfS -----END PGP SIGNATURE----- Merge tag 'sound-6.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "All small fixes, mostly for usual suspects, HD-audio and USB-audio device-specific fixes / quirks. The Cirrus codec support took the update of SPI header as well. Other than that, there is a regression fix in the sanity check of ALSA timer code" * tag 'sound-6.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/tas2781: Use correct endian conversion ALSA: usb-audio: Support Yamaha P-125 quirk entry ALSA: hda: cs35l41: Remove redundant call to hda_cs_dsp_control_remove() ALSA: hda: cs35l56: Remove redundant call to hda_cs_dsp_control_remove() ALSA: hda/tas2781: fix wrong calibrated data order ALSA: usb-audio: Add delay quirk for VIVO USB-C-XE710 HEADSET ALSA: hda/realtek: Add support for new HP G12 laptops ALSA: hda/realtek: Fix noise from speakers on Lenovo IdeaPad 3 15IAU7 ALSA: timer: Relax start tick time check for slave timer elements spi: Add empty versions of ACPI functions
This commit is contained in:
commit
d58c542a33
@ -902,12 +902,29 @@ extern int devm_spi_register_controller(struct device *dev,
|
||||
struct spi_controller *ctlr);
|
||||
extern void spi_unregister_controller(struct spi_controller *ctlr);
|
||||
|
||||
#if IS_ENABLED(CONFIG_ACPI)
|
||||
#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SPI_MASTER)
|
||||
extern struct spi_controller *acpi_spi_find_controller_by_adev(struct acpi_device *adev);
|
||||
extern struct spi_device *acpi_spi_device_alloc(struct spi_controller *ctlr,
|
||||
struct acpi_device *adev,
|
||||
int index);
|
||||
int acpi_spi_count_resources(struct acpi_device *adev);
|
||||
#else
|
||||
static inline struct spi_controller *acpi_spi_find_controller_by_adev(struct acpi_device *adev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct spi_device *acpi_spi_device_alloc(struct spi_controller *ctlr,
|
||||
struct acpi_device *adev,
|
||||
int index)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int acpi_spi_count_resources(struct acpi_device *adev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -547,7 +547,7 @@ static int snd_timer_start1(struct snd_timer_instance *timeri,
|
||||
/* check the actual time for the start tick;
|
||||
* bail out as error if it's way too low (< 100us)
|
||||
*/
|
||||
if (start) {
|
||||
if (start && !(timer->hw.flags & SNDRV_TIMER_HW_SLAVE)) {
|
||||
if ((u64)snd_timer_hw_resolution(timer) * ticks < 100000)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ static const struct reg_sequence cs35l41_hda_mute[] = {
|
||||
};
|
||||
|
||||
static const struct cs_dsp_client_ops client_ops = {
|
||||
.control_remove = hda_cs_dsp_control_remove,
|
||||
/* cs_dsp requires the client to provide this even if it is empty */
|
||||
};
|
||||
|
||||
static int cs35l41_request_tuning_param_file(struct cs35l41_hda *cs35l41, char *tuning_filename,
|
||||
|
@ -413,7 +413,7 @@ static void cs35l56_hda_remove_controls(struct cs35l56_hda *cs35l56)
|
||||
}
|
||||
|
||||
static const struct cs_dsp_client_ops cs35l56_hda_client_ops = {
|
||||
.control_remove = hda_cs_dsp_control_remove,
|
||||
/* cs_dsp requires the client to provide this even if it is empty */
|
||||
};
|
||||
|
||||
static int cs35l56_hda_request_firmware_file(struct cs35l56_hda *cs35l56,
|
||||
|
@ -11,15 +11,18 @@
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/jack.h>
|
||||
#include <sound/hda_codec.h>
|
||||
@ -583,7 +586,6 @@ static void alc_shutup_pins(struct hda_codec *codec)
|
||||
switch (codec->core.vendor_id) {
|
||||
case 0x10ec0236:
|
||||
case 0x10ec0256:
|
||||
case 0x10ec0257:
|
||||
case 0x19e58326:
|
||||
case 0x10ec0283:
|
||||
case 0x10ec0285:
|
||||
@ -6856,6 +6858,86 @@ static void comp_generic_fixup(struct hda_codec *cdc, int action, const char *bu
|
||||
}
|
||||
}
|
||||
|
||||
static void cs35lxx_autodet_fixup(struct hda_codec *cdc,
|
||||
const struct hda_fixup *fix,
|
||||
int action)
|
||||
{
|
||||
struct device *dev = hda_codec_dev(cdc);
|
||||
struct acpi_device *adev;
|
||||
struct fwnode_handle *fwnode __free(fwnode_handle) = NULL;
|
||||
const char *bus = NULL;
|
||||
static const struct {
|
||||
const char *hid;
|
||||
const char *name;
|
||||
} acpi_ids[] = {{ "CSC3554", "cs35l54-hda" },
|
||||
{ "CSC3556", "cs35l56-hda" },
|
||||
{ "CSC3557", "cs35l57-hda" }};
|
||||
char *match;
|
||||
int i, count = 0, count_devindex = 0;
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
for (i = 0; i < ARRAY_SIZE(acpi_ids); ++i) {
|
||||
adev = acpi_dev_get_first_match_dev(acpi_ids[i].hid, NULL, -1);
|
||||
if (adev)
|
||||
break;
|
||||
}
|
||||
if (!adev) {
|
||||
dev_err(dev, "Failed to find ACPI entry for a Cirrus Amp\n");
|
||||
return;
|
||||
}
|
||||
|
||||
count = i2c_acpi_client_count(adev);
|
||||
if (count > 0) {
|
||||
bus = "i2c";
|
||||
} else {
|
||||
count = acpi_spi_count_resources(adev);
|
||||
if (count > 0)
|
||||
bus = "spi";
|
||||
}
|
||||
|
||||
fwnode = fwnode_handle_get(acpi_fwnode_handle(adev));
|
||||
acpi_dev_put(adev);
|
||||
|
||||
if (!bus) {
|
||||
dev_err(dev, "Did not find any buses for %s\n", acpi_ids[i].hid);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!fwnode) {
|
||||
dev_err(dev, "Could not get fwnode for %s\n", acpi_ids[i].hid);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* When available the cirrus,dev-index property is an accurate
|
||||
* count of the amps in a system and is used in preference to
|
||||
* the count of bus devices that can contain additional address
|
||||
* alias entries.
|
||||
*/
|
||||
count_devindex = fwnode_property_count_u32(fwnode, "cirrus,dev-index");
|
||||
if (count_devindex > 0)
|
||||
count = count_devindex;
|
||||
|
||||
match = devm_kasprintf(dev, GFP_KERNEL, "-%%s:00-%s.%%d", acpi_ids[i].name);
|
||||
if (!match)
|
||||
return;
|
||||
dev_info(dev, "Found %d %s on %s (%s)\n", count, acpi_ids[i].hid, bus, match);
|
||||
comp_generic_fixup(cdc, action, bus, acpi_ids[i].hid, match, count);
|
||||
|
||||
break;
|
||||
case HDA_FIXUP_ACT_FREE:
|
||||
/*
|
||||
* Pass the action on to comp_generic_fixup() so that
|
||||
* hda_component_manager functions can be called in just once
|
||||
* place. In this context the bus, hid, match_str or count
|
||||
* values do not need to be calculated.
|
||||
*/
|
||||
comp_generic_fixup(cdc, action, NULL, NULL, NULL, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
|
||||
{
|
||||
comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
|
||||
@ -7528,6 +7610,7 @@ enum {
|
||||
ALC256_FIXUP_CHROME_BOOK,
|
||||
ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7,
|
||||
ALC287_FIXUP_LENOVO_SSID_17AA3820,
|
||||
ALCXXX_FIXUP_CS35LXX,
|
||||
};
|
||||
|
||||
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
||||
@ -9857,6 +9940,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc287_fixup_lenovo_ssid_17aa3820,
|
||||
},
|
||||
[ALCXXX_FIXUP_CS35LXX] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs35lxx_autodet_fixup,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@ -10271,6 +10358,17 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d01, "HP ZBook Power 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d08, "HP EliteBook 1045 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d85, "HP EliteBook 1040 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d86, "HP Elite x360 1040 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d8c, "HP EliteBook 830 13 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d8d, "HP Elite x360 830 13 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d8e, "HP EliteBook 840 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d8f, "HP EliteBook 840 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d90, "HP EliteBook 860 16 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d91, "HP ZBook Firefly 14 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x103c, 0x8d92, "HP ZBook Firefly 16 G12", ALCXXX_FIXUP_CS35LXX),
|
||||
SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
|
||||
SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
|
@ -2,10 +2,12 @@
|
||||
//
|
||||
// TAS2781 HDA I2C driver
|
||||
//
|
||||
// Copyright 2023 Texas Instruments, Inc.
|
||||
// Copyright 2023 - 2024 Texas Instruments, Inc.
|
||||
//
|
||||
// Author: Shenghao Ding <shenghao-ding@ti.com>
|
||||
// Current maintainer: Baojun Xu <baojun.xu@ti.com>
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/crc8.h>
|
||||
#include <linux/crc32.h>
|
||||
@ -519,20 +521,22 @@ static void tas2781_apply_calib(struct tasdevice_priv *tas_priv)
|
||||
static const unsigned char rgno_array[CALIB_MAX] = {
|
||||
0x74, 0x0c, 0x14, 0x70, 0x7c,
|
||||
};
|
||||
unsigned char *data;
|
||||
int offset = 0;
|
||||
int i, j, rc;
|
||||
__be32 data;
|
||||
|
||||
for (i = 0; i < tas_priv->ndev; i++) {
|
||||
data = tas_priv->cali_data.data +
|
||||
i * TASDEVICE_SPEAKER_CALIBRATION_SIZE;
|
||||
for (j = 0; j < CALIB_MAX; j++) {
|
||||
data = cpu_to_be32(
|
||||
*(uint32_t *)&tas_priv->cali_data.data[offset]);
|
||||
rc = tasdevice_dev_bulk_write(tas_priv, i,
|
||||
TASDEVICE_REG(0, page_array[j], rgno_array[j]),
|
||||
&(data[4 * j]), 4);
|
||||
(unsigned char *)&data, 4);
|
||||
if (rc < 0)
|
||||
dev_err(tas_priv->dev,
|
||||
"chn %d calib %d bulk_wr err = %d\n",
|
||||
i, j, rc);
|
||||
offset += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -273,6 +273,7 @@ YAMAHA_DEVICE(0x105a, NULL),
|
||||
YAMAHA_DEVICE(0x105b, NULL),
|
||||
YAMAHA_DEVICE(0x105c, NULL),
|
||||
YAMAHA_DEVICE(0x105d, NULL),
|
||||
YAMAHA_DEVICE(0x1718, "P-125"),
|
||||
{
|
||||
USB_DEVICE(0x0499, 0x1503),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
|
@ -2221,6 +2221,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(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
|
||||
QUIRK_FLAG_IGNORE_CTL_ERROR),
|
||||
DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
|
||||
|
Loading…
Reference in New Issue
Block a user