Re: [PATCH 2/5] ASoC: amd: acp7x: add ACP PCI driver probe/remove sequence
Mario Limonciello <[email protected]>
| Newsgroups | org.alsa-project.alsa-devel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-sound |
|---|---|
| Message-ID | <[email protected]> |
On 5/7/26 13:11, Vijendar Mukunda wrote: > Add ACP7.x PCI driver probe and remove sequence for ACP7.D/7.E/7.F > variants. > > Signed-off-by: Vijendar Mukunda <[email protected]> Reviewed-by: Mario Limonciello (AMD) <[email protected]> > --- > sound/soc/amd/acp7x/acp7x.h | 31 ++++++++++ > sound/soc/amd/acp7x/pci-acp7x.c | 100 ++++++++++++++++++++++++++++++++ > 2 files changed, 131 insertions(+) > create mode 100644 sound/soc/amd/acp7x/acp7x.h > create mode 100644 sound/soc/amd/acp7x/pci-acp7x.c > > diff --git a/sound/soc/amd/acp7x/acp7x.h b/sound/soc/amd/acp7x/acp7x.h > new file mode 100644 > index 000000000000..b4586a2afae4 > --- /dev/null > +++ b/sound/soc/amd/acp7x/acp7x.h > @@ -0,0 +1,31 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * AMD Common ACP header file for ACP7.X variants(ACP7.D/7.E/7.F) > + * > + * Copyright (C) 2026 Advanced Micro Devices, Inc. All rights reserved. > + */ > + > +#ifndef __SOUND_SOC_AMD_ACP7X_H > +#define __SOUND_SOC_AMD_ACP7X_H > + > +#include <linux/io.h> > +#include <linux/pci.h> > +#include <linux/types.h> > + > +#include <sound/acp7x_chip_offset_byte.h> > + > +#define ACP_DEVICE_ID 0x15E2 > +#define ACP7X_REG_START 0x1240000 > +#define ACP7X_REG_END 0x125C000 > + > +#define ACP7D_PCI_REV 0x7D > +#define ACP7E_PCI_REV 0x7E > +#define ACP7F_PCI_REV 0x7F > + > +int snd_amd_acp_find_config(struct pci_dev *pci); > + > +struct acp7x_dev_data { > + void __iomem *acp7x_base; > +}; > + > +#endif /* __SOUND_SOC_AMD_ACP7X_H */ > diff --git a/sound/soc/amd/acp7x/pci-acp7x.c b/sound/soc/amd/acp7x/pci-acp7x.c > new file mode 100644 > index 000000000000..476b3ae52634 > --- /dev/null > +++ b/sound/soc/amd/acp7x/pci-acp7x.c > @@ -0,0 +1,100 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * AMD common ACP PCI driver for ACP7.x variants > + * which includes ACP7.D/7.E/7.F and future variants > + * with same register layout. > + * > + * Copyright 2026 Advanced Micro Devices, Inc. > + */ > + > +#include <linux/errno.h> > +#include <linux/io.h> > +#include <linux/module.h> > +#include <linux/pci.h> > +#include <linux/slab.h> > +#include <linux/types.h> > + > +#include "acp7x.h" > + > +static int snd_acp7x_probe(struct pci_dev *pci, > + const struct pci_device_id *pci_id) > +{ > + struct acp7x_dev_data *adata; > + u32 addr; > + u32 flag; > + int ret; > + > + flag = snd_amd_acp_find_config(pci); > + if (flag) > + return -ENODEV; > + > + /* ACP PCI revision id check for ACP7.x platforms */ > + switch (pci->revision) { > + case ACP7D_PCI_REV: > + case ACP7E_PCI_REV: > + case ACP7F_PCI_REV: > + break; > + default: > + return -ENODEV; > + } > + if (pci_enable_device(pci)) { > + dev_err(&pci->dev, "pci_enable_device failed\n"); > + return -ENODEV; > + } > + > + ret = pci_request_regions(pci, "AMD ACP7.x audio"); > + if (ret < 0) { > + dev_err(&pci->dev, "pci_request_regions failed\n"); > + goto disable_pci; > + } > + adata = devm_kzalloc(&pci->dev, sizeof(struct acp7x_dev_data), > + GFP_KERNEL); > + if (!adata) { > + ret = -ENOMEM; > + goto release_regions; > + } > + addr = pci_resource_start(pci, 0); > + adata->acp7x_base = devm_ioremap(&pci->dev, addr, > + pci_resource_len(pci, 0)); > + if (!adata->acp7x_base) { > + ret = -ENOMEM; > + goto release_regions; > + } > + pci_set_master(pci); > + pci_set_drvdata(pci, adata); > + return 0; > + > +release_regions: > + pci_release_regions(pci); > +disable_pci: > + pci_disable_device(pci); > + > + return ret; > +} > + > +static void snd_acp7x_remove(struct pci_dev *pci) > +{ > + pci_release_regions(pci); > + pci_disable_device(pci); > +} > + > +static const struct pci_device_id snd_acp7x_ids[] = { > + { PCI_DEVICE(PCI_VENDOR_ID_AMD, ACP_DEVICE_ID), > + .class = PCI_CLASS_MULTIMEDIA_OTHER << 8, > + .class_mask = 0xffffff }, > + { 0, }, > +}; > +MODULE_DEVICE_TABLE(pci, snd_acp7x_ids); > + > +static struct pci_driver acp7x_pci_driver = { > + .name = KBUILD_MODNAME, > + .id_table = snd_acp7x_ids, > + .probe = snd_acp7x_probe, > + .remove = snd_acp7x_remove, > +}; > + > +module_pci_driver(acp7x_pci_driver); > + > +MODULE_AUTHOR("[email protected]"); > +MODULE_DESCRIPTION("AMD ACP PCI driver for ACP7.X"); > +MODULE_LICENSE("GPL");