mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
synced 2025-09-14 00:29:50 +10:00
Almost all of this is driver specific fixes and new IDs that have come in during the merge window. A good chunk of them are simple ones from me which came about due to a bunch of Mediatek Chromebooks being enabled in KernelCI, there's more where that came from. We do have one small feature added to the PCM core by Claudiu Beznea in order to allow the sequencing required to resolve a noise issue with the Microchip PDMC driver. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmP/tTkACgkQJNaLcl1U h9CmiQf/cNpe4ZCxFQYXW4eucJfHT+qsT9fQongqe2Ash/IL4svBbbvPn4H1oW7i ce3r8u3RelNfa+H0g9cKD1anADlKresKr95HNl/INTG9g34IuqKA9dZVrXtBMlEz YCKQbxcR7PiyfI6bImoESGBBe/tm+WEE+mTEndxbtTsFbIsC/a2OORKulU4gzHKF ZEQBwgfbX/eH0a4xXyFMFxQHehlq/7fB2oEMo3ZCrYrus/NbQMsLFTp1RaPlXFh4 6bVR3DABG9MOzDiQoK86gb4HzADTirkw6cnsLkYRgCZSCLR5qR2xrBnd5ykqsRdg CZnV9C3sVkRcaTXoZoSbXMSzkbgB2Q== =IM/h -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.3' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.3 Almost all of this is driver specific fixes and new IDs that have come in during the merge window. A good chunk of them are simple ones from me which came about due to a bunch of Mediatek Chromebooks being enabled in KernelCI, there's more where that came from. We do have one small feature added to the PCM core by Claudiu Beznea in order to allow the sequencing required to resolve a noise issue with the Microchip PDMC driver.
327 lines
6.8 KiB
C
327 lines
6.8 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Machine driver for AMD Yellow Carp platform using DMIC
|
|
*
|
|
* Copyright 2021 Advanced Micro Devices, Inc.
|
|
*/
|
|
|
|
#include <sound/soc.h>
|
|
#include <sound/soc-dapm.h>
|
|
#include <linux/module.h>
|
|
#include <sound/pcm.h>
|
|
#include <sound/pcm_params.h>
|
|
#include <linux/io.h>
|
|
#include <linux/dmi.h>
|
|
#include <linux/acpi.h>
|
|
|
|
#include "acp6x.h"
|
|
|
|
#define DRV_NAME "acp_yc_mach"
|
|
|
|
SND_SOC_DAILINK_DEF(acp6x_pdm,
|
|
DAILINK_COMP_ARRAY(COMP_CPU("acp_yc_pdm_dma.0")));
|
|
|
|
SND_SOC_DAILINK_DEF(dmic_codec,
|
|
DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec.0",
|
|
"dmic-hifi")));
|
|
|
|
SND_SOC_DAILINK_DEF(pdm_platform,
|
|
DAILINK_COMP_ARRAY(COMP_PLATFORM("acp_yc_pdm_dma.0")));
|
|
|
|
static struct snd_soc_dai_link acp6x_dai_pdm[] = {
|
|
{
|
|
.name = "acp6x-dmic-capture",
|
|
.stream_name = "DMIC capture",
|
|
.capture_only = 1,
|
|
SND_SOC_DAILINK_REG(acp6x_pdm, dmic_codec, pdm_platform),
|
|
},
|
|
};
|
|
|
|
static struct snd_soc_card acp6x_card = {
|
|
.name = "acp6x",
|
|
.owner = THIS_MODULE,
|
|
.dai_link = acp6x_dai_pdm,
|
|
.num_links = 1,
|
|
};
|
|
|
|
static const struct dmi_system_id yc_acp_quirk_table[] = {
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D0"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D0"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D1"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D2"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D3"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D4"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21D5"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CF"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CG"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CQ"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CR"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CM"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CN"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CH"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CJ"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CK"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CL"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21EM"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21EN"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21J5"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "21J6"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "82"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "UM5302TA"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "M5402RA"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Alienware"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 14 2022"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 15 2022"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Razer"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Blade 14 (2022) - RZ09-0427"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "RB"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Swift SFA16-41"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "IRBIS"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "15NBC1011"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "HP"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16z-n000"),
|
|
}
|
|
},
|
|
{
|
|
.driver_data = &acp6x_card,
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "HP"),
|
|
DMI_MATCH(DMI_BOARD_NAME, "8A43"),
|
|
}
|
|
},
|
|
{}
|
|
};
|
|
|
|
static int acp6x_probe(struct platform_device *pdev)
|
|
{
|
|
const struct dmi_system_id *dmi_id;
|
|
struct acp6x_pdm *machine = NULL;
|
|
struct snd_soc_card *card;
|
|
struct acpi_device *adev;
|
|
int ret;
|
|
|
|
/* check the parent device's firmware node has _DSD or not */
|
|
adev = ACPI_COMPANION(pdev->dev.parent);
|
|
if (adev) {
|
|
const union acpi_object *obj;
|
|
|
|
if (!acpi_dev_get_property(adev, "AcpDmicConnected", ACPI_TYPE_INTEGER, &obj) &&
|
|
obj->integer.value == 1)
|
|
platform_set_drvdata(pdev, &acp6x_card);
|
|
}
|
|
|
|
/* check for any DMI overrides */
|
|
dmi_id = dmi_first_match(yc_acp_quirk_table);
|
|
if (dmi_id)
|
|
platform_set_drvdata(pdev, dmi_id->driver_data);
|
|
|
|
card = platform_get_drvdata(pdev);
|
|
if (!card)
|
|
return -ENODEV;
|
|
dev_info(&pdev->dev, "Enabling ACP DMIC support via %s", dmi_id ? "DMI" : "ACPI");
|
|
acp6x_card.dev = &pdev->dev;
|
|
|
|
snd_soc_card_set_drvdata(card, machine);
|
|
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
|
if (ret) {
|
|
return dev_err_probe(&pdev->dev, ret,
|
|
"snd_soc_register_card(%s) failed\n",
|
|
card->name);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver acp6x_mach_driver = {
|
|
.driver = {
|
|
.name = "acp_yc_mach",
|
|
.pm = &snd_soc_pm_ops,
|
|
},
|
|
.probe = acp6x_probe,
|
|
};
|
|
|
|
module_platform_driver(acp6x_mach_driver);
|
|
|
|
MODULE_AUTHOR("Vijendar.Mukunda@amd.com");
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_ALIAS("platform:" DRV_NAME);
|