mirror of
https://github.com/torvalds/linux.git
synced 2026-09-13 15:40:03 +02:00
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 commit42d99857d6("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:
parent
883e78c9e6
commit
7e125889f1
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user