Commit d58c542a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents 37b20e9a 829e2a23
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -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

/*
+1 −1
Original line number Diff line number Diff line
@@ -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;
	}
+1 −1
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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,
+99 −1
Original line number Diff line number Diff line
@@ -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),
Loading