Commit 8770bd8f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull sound fixes from Takashi Iwai:
 "A collection of small fixes. It became a bit larger than wished, but
  all of them are device-specific small fixes, and it should be still
  fairly safe to take at the last minute.

  Included are a few quirks and fixes for Intel, AMD, HD-audio, and
  USB-audio, as well as a race fix in aloop driver and corrections of
  Cirrus firmware kunit test"

* tag 'sound-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda/realtek: Enable headset mic for Acer Nitro 5
  ASoC: fsl_xcvr: fix missing lock in fsl_xcvr_mode_put()
  ASoC: dt-bindings: ti,tlv320aic3x: Add compatible string ti,tlv320aic23
  ASoC: amd: fix memory leak in acp3x pdm dma ops
  ALSA: usb-audio: fix broken logic in snd_audigy2nx_led_update()
  ALSA: aloop: Fix racy access at PCM trigger
  ASoC: rt1320: fix intermittent no-sound issue
  ASoC: SOF: Intel: use hdev->info.link_mask directly
  firmware: cs_dsp: rate-limit log messages in KUnit builds
  ASoC: amd: yc: Add quirk for HP 200 G2a 16
  ASoC: cs42l43: Correct handling of 3-pole jack load detection
  ASoC: Intel: sof_es8336: Add DMI quirk for Huawei BOD-WXX9
  ASoC: sof_sdw: Add a quirk for Lenovo laptop using sidecar amps with cs42l43
parents 5ca98c22 51db0528
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ maintainers:
properties:
  compatible:
    enum:
      - ti,tlv320aic23
      - ti,tlv320aic3x
      - ti,tlv320aic33
      - ti,tlv320aic3007
+37 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
 *                         Cirrus Logic International Semiconductor Ltd.
 */

#include <kunit/visibility.h>
#include <linux/cleanup.h>
#include <linux/ctype.h>
#include <linux/debugfs.h>
@@ -24,6 +25,41 @@
#include <linux/firmware/cirrus/cs_dsp.h>
#include <linux/firmware/cirrus/wmfw.h>

#include "cs_dsp.h"

/*
 * When the KUnit test is running the error-case tests will cause a lot
 * of messages. Rate-limit to prevent overflowing the kernel log buffer
 * during KUnit test runs.
 */
#if IS_ENABLED(CONFIG_FW_CS_DSP_KUNIT_TEST)
bool cs_dsp_suppress_err_messages;
EXPORT_SYMBOL_IF_KUNIT(cs_dsp_suppress_err_messages);

bool cs_dsp_suppress_warn_messages;
EXPORT_SYMBOL_IF_KUNIT(cs_dsp_suppress_warn_messages);

bool cs_dsp_suppress_info_messages;
EXPORT_SYMBOL_IF_KUNIT(cs_dsp_suppress_info_messages);

#define cs_dsp_err(_dsp, fmt, ...) \
	do { \
		if (!cs_dsp_suppress_err_messages) \
			dev_err_ratelimited(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__); \
	} while (false)
#define cs_dsp_warn(_dsp, fmt, ...) \
	do { \
		if (!cs_dsp_suppress_warn_messages) \
			dev_warn_ratelimited(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__); \
	} while (false)
#define cs_dsp_info(_dsp, fmt, ...) \
	do { \
		if (!cs_dsp_suppress_info_messages) \
			dev_info_ratelimited(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__); \
	} while (false)
#define cs_dsp_dbg(_dsp, fmt, ...) \
	dev_dbg_ratelimited(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
#else
#define cs_dsp_err(_dsp, fmt, ...) \
	dev_err(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
#define cs_dsp_warn(_dsp, fmt, ...) \
@@ -32,6 +68,7 @@
	dev_info(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
#define cs_dsp_dbg(_dsp, fmt, ...) \
	dev_dbg(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
#endif

#define ADSP1_CONTROL_1                   0x00
#define ADSP1_CONTROL_2                   0x02
+18 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * cs_dsp.h  --  Private header for cs_dsp driver.
 *
 * Copyright (C) 2026 Cirrus Logic, Inc. and
 *                    Cirrus Logic International Semiconductor Ltd.
 */

#ifndef FW_CS_DSP_H
#define FW_CS_DSP_H

#if IS_ENABLED(CONFIG_KUNIT)
extern bool cs_dsp_suppress_err_messages;
extern bool cs_dsp_suppress_warn_messages;
extern bool cs_dsp_suppress_info_messages;
#endif

#endif /* ifndef FW_CS_DSP_H */
+21 −1
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#include <linux/random.h>
#include <linux/regmap.h>

#include "../cs_dsp.h"

/*
 * Test method is:
 *
@@ -2224,7 +2226,22 @@ static int cs_dsp_bin_test_common_init(struct kunit *test, struct cs_dsp *dsp)
		return ret;

	/* Automatically call cs_dsp_remove() when test case ends */
	return kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
	ret = kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
	if (ret)
		return ret;

	/*
	 * The large number of test cases will cause an unusually large amount
	 * of dev_info() messages from cs_dsp, so suppress these.
	 */
	cs_dsp_suppress_info_messages = true;

	return 0;
}

static void cs_dsp_bin_test_exit(struct kunit *test)
{
	cs_dsp_suppress_info_messages = false;
}

static int cs_dsp_bin_test_halo_init(struct kunit *test)
@@ -2536,18 +2553,21 @@ static struct kunit_case cs_dsp_bin_test_cases_adsp2[] = {
static struct kunit_suite cs_dsp_bin_test_halo = {
	.name = "cs_dsp_bin_halo",
	.init = cs_dsp_bin_test_halo_init,
	.exit = cs_dsp_bin_test_exit,
	.test_cases = cs_dsp_bin_test_cases_halo,
};

static struct kunit_suite cs_dsp_bin_test_adsp2_32bit = {
	.name = "cs_dsp_bin_adsp2_32bit",
	.init = cs_dsp_bin_test_adsp2_32bit_init,
	.exit = cs_dsp_bin_test_exit,
	.test_cases = cs_dsp_bin_test_cases_adsp2,
};

static struct kunit_suite cs_dsp_bin_test_adsp2_16bit = {
	.name = "cs_dsp_bin_adsp2_16bit",
	.init = cs_dsp_bin_test_adsp2_16bit_init,
	.exit = cs_dsp_bin_test_exit,
	.test_cases = cs_dsp_bin_test_cases_adsp2,
};

+18 −6
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@
#include <linux/string.h>
#include <linux/vmalloc.h>

#include "../cs_dsp.h"

KUNIT_DEFINE_ACTION_WRAPPER(_put_device_wrapper, put_device, struct device *);
KUNIT_DEFINE_ACTION_WRAPPER(_cs_dsp_remove_wrapper, cs_dsp_remove, struct cs_dsp *);

@@ -380,11 +382,9 @@ static void bin_block_payload_len_garbage(struct kunit *test)

static void cs_dsp_bin_err_test_exit(struct kunit *test)
{
	/*
	 * Testing error conditions can produce a lot of log output
	 * from cs_dsp error messages, so rate limit the test cases.
	 */
	usleep_range(200, 500);
	cs_dsp_suppress_err_messages = false;
	cs_dsp_suppress_warn_messages = false;
	cs_dsp_suppress_info_messages = false;
}

static int cs_dsp_bin_err_test_common_init(struct kunit *test, struct cs_dsp *dsp,
@@ -474,7 +474,19 @@ static int cs_dsp_bin_err_test_common_init(struct kunit *test, struct cs_dsp *ds
		return ret;

	/* Automatically call cs_dsp_remove() when test case ends */
	return kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
	ret = kunit_add_action_or_reset(priv->test, _cs_dsp_remove_wrapper, dsp);
	if (ret)
		return ret;

	/*
	 * Testing error conditions can produce a lot of log output
	 * from cs_dsp error messages, so suppress messages.
	 */
	cs_dsp_suppress_err_messages = true;
	cs_dsp_suppress_warn_messages = true;
	cs_dsp_suppress_info_messages = true;

	return 0;
}

static int cs_dsp_bin_err_test_halo_init(struct kunit *test)
Loading