ASoC: amd: acp-da7219-max98357a: don't bind on Raven/Picasso boards

The "AMDI5682" ACPI HID is matched by two AMD ASoC machine drivers:
cz-da7219-max98357a (this driver, Carrizo/Stoney) and
acp3x-alc5682-max98357 (Raven/Picasso). cz-da7219-max98357a is linked
first and probes the platform device first; its DAI links reference the
Stoney ACP, which is absent on Raven/Picasso, so its card can never be
instantiated there.

This was harmless until commit 42d99857d6 ("ASoC: core: Move all users
to deferrable card binding"): devm_snd_soc_register_card() now returns 0
for a card left pending instead of propagating -EPROBE_DEFER, so
cz_probe() succeeds and permanently binds AMDI5682. acp3x-alc5682-max98357
never binds and the internal speakers and headphone jack get no card.

Detect Raven/Picasso (and later) by the ACP3.x audio coprocessor's
dedicated PCI function (1022:15e2); Carrizo/Stoney reach the ACP through
the GPU driver and have no such device. Return -ENODEV so the driver core
continues probing AMDI5682 with acp3x-alc5682-max98357.

Fixes: 42d99857d6 ("ASoC: core: Move all users to deferrable card binding")
Cc: stable@vger.kernel.org
Signed-off-by: Yorick Rommers <yorick-rommers@hotmail.com>
Tested-by: Yorick Rommers <yorick-rommers@hotmail.com>
Link: https://patch.msgid.link/20260907121228.13754-1-yorick-rommers@hotmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Yorick Rommers 2026-09-07 14:12:28 +02:00 committed by Mark Brown
parent 883e78c9e6
commit 7e125889f1
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -17,6 +17,7 @@
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/acpi.h>
#include <linux/pci.h>
#include "acp.h"
#include "../codecs/da7219.h"
@ -742,6 +743,18 @@ static const struct regulator_desc acp_da7219_desc = {
.n_voltages = 1,
};
/*
* The ACP3.x+ (Raven/Picasso and later) audio coprocessor is a dedicated PCI
* function. Carrizo/Stoney - the only platforms handled by this driver - reach
* the ACP through the GPU driver and have no such device.
*/
#define ACP3X_PCI_DEV_ID 0x15e2
static const struct pci_device_id acp3x_pci_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, ACP3X_PCI_DEV_ID) },
{ 0, },
};
static int cz_probe(struct platform_device *pdev)
{
int ret;
@ -750,6 +763,16 @@ static int cz_probe(struct platform_device *pdev)
struct regulator_dev *rdev;
struct device *dev = &pdev->dev;
/*
* AMDI5682 is also matched by acp3x-alc5682-max98357 (Raven/Picasso).
* If the ACP3.x PCI function is present this is such a board; return
* -ENODEV so that driver binds instead.
*/
if (pci_dev_present(acp3x_pci_ids)) {
dev_info(dev, "ACP3.x PCI device present, deferring to acp3x-alc5682-max98357\n");
return -ENODEV;
}
card = (struct snd_soc_card *)acp_soc_is_rltk_max(dev);
if (!card)
return -ENODEV;