Skip to content

Commit

Permalink
ASoC: amd: acp: Refactor acp machine select
Browse files Browse the repository at this point in the history
Refactor and move acp machine select function from acp platform
driver to acp pci driver and assign platform specific acpi machines
to chip->machines.

Signed-off-by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com>
Link: https://patch.msgid.link/20250310183201.11979-6-venkataprasad.potturu@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Venkata Prasad Potturu authored and Mark Brown committed Mar 11, 2025
1 parent a8b9d2d commit 6e60db7
Show file tree
Hide file tree
Showing 8 changed files with 114 additions and 124 deletions.
28 changes: 28 additions & 0 deletions sound/soc/amd/acp/acp-legacy-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#include <linux/pci.h>
#include <linux/export.h>

#include "../mach-config.h"

#define ACP_RENOIR_PDM_ADDR 0x02
#define ACP_REMBRANDT_PDM_ADDR 0x03
#define ACP63_PDM_ADDR 0x02
Expand Down Expand Up @@ -350,6 +352,32 @@ int acp_deinit(struct acp_chip_info *chip)
return 0;
}
EXPORT_SYMBOL_NS_GPL(acp_deinit, "SND_SOC_ACP_COMMON");
int acp_machine_select(struct acp_chip_info *chip)
{
struct snd_soc_acpi_mach *mach;
int size, platform;

if (chip->flag == FLAG_AMD_LEGACY_ONLY_DMIC) {
platform = chip->acp_rev;
chip->mach_dev = platform_device_register_data(chip->dev, "acp-pdm-mach",
PLATFORM_DEVID_NONE, &platform,
sizeof(platform));
} else {
size = sizeof(*chip->machines);
mach = snd_soc_acpi_find_machine(chip->machines);
if (!mach) {
dev_err(chip->dev, "warning: No matching ASoC machine driver found\n");
return -EINVAL;
}
mach->mach_params.subsystem_rev = chip->acp_rev;
chip->mach_dev = platform_device_register_data(chip->dev, mach->drv_name,
PLATFORM_DEVID_NONE, mach, size);
}
if (IS_ERR(chip->mach_dev))
dev_warn(chip->dev, "Unable to register Machine device\n");
return 0;
}
EXPORT_SYMBOL_NS_GPL(acp_machine_select, "SND_SOC_ACP_COMMON");

static void check_acp3x_config(struct acp_chip_info *chip)
{
Expand Down
7 changes: 7 additions & 0 deletions sound/soc/amd/acp/acp-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,19 +127,23 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
case 0x01:
chip->name = "acp_asoc_renoir";
chip->acp_hw_ops_init = acp31_hw_ops_init;
chip->machines = snd_soc_acpi_amd_acp_machines;
break;
case 0x6f:
chip->name = "acp_asoc_rembrandt";
chip->acp_hw_ops_init = acp6x_hw_ops_init;
chip->machines = snd_soc_acpi_amd_rmb_acp_machines;
break;
case 0x63:
chip->name = "acp_asoc_acp63";
chip->acp_hw_ops_init = acp63_hw_ops_init;
chip->machines = snd_soc_acpi_amd_acp63_acp_machines;
break;
case 0x70:
case 0x71:
chip->name = "acp_asoc_acp70";
chip->acp_hw_ops_init = acp70_hw_ops_init;
chip->machines = snd_soc_acpi_amd_acp70_acp_machines;
break;
default:
dev_err(dev, "Unsupported device revision:0x%x\n", pci->revision);
Expand Down Expand Up @@ -175,6 +179,7 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
chip->chip_pdev = chip->acp_plat_dev;
chip->dev = &chip->acp_plat_dev->dev;

acp_machine_select(chip);
skip_pdev_creation:
dev_set_drvdata(&pci->dev, chip);
pm_runtime_set_autosuspend_delay(&pci->dev, 2000);
Expand Down Expand Up @@ -242,6 +247,8 @@ static void acp_pci_remove(struct pci_dev *pci)
platform_device_unregister(chip->dmic_codec_dev);
if (chip->acp_plat_dev)
platform_device_unregister(chip->acp_plat_dev);
if (chip->mach_dev)
platform_device_unregister(chip->mach_dev);

ret = acp_hw_deinit(chip);
if (ret)
Expand Down
28 changes: 0 additions & 28 deletions sound/soc/amd/acp/acp-platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include <linux/dma-mapping.h>

#include "amd.h"
#include "../mach-config.h"
#include "acp-mach.h"

#define DRV_NAME "acp_i2s_dma"
Expand Down Expand Up @@ -108,33 +107,6 @@ static const struct snd_pcm_hardware acp6x_pcm_hardware_capture = {
.periods_max = CAPTURE_MAX_NUM_PERIODS,
};

int acp_machine_select(struct acp_dev_data *adata)
{
struct snd_soc_acpi_mach *mach;
int size, platform;

if (adata->flag == FLAG_AMD_LEGACY_ONLY_DMIC) {
platform = adata->acp_rev;
adata->mach_dev = platform_device_register_data(adata->dev, "acp-pdm-mach",
PLATFORM_DEVID_NONE, &platform,
sizeof(platform));
} else {
size = sizeof(*adata->machines);
mach = snd_soc_acpi_find_machine(adata->machines);
if (!mach) {
dev_err(adata->dev, "warning: No matching ASoC machine driver found\n");
return -EINVAL;
}
mach->mach_params.subsystem_rev = adata->acp_rev;
adata->mach_dev = platform_device_register_data(adata->dev, mach->drv_name,
PLATFORM_DEVID_NONE, mach, size);
}
if (IS_ERR(adata->mach_dev))
dev_warn(adata->dev, "Unable to register Machine device\n");
return 0;
}
EXPORT_SYMBOL_NS_GPL(acp_machine_select, "SND_SOC_ACP_COMMON");

static irqreturn_t i2s_irq_handler(int irq, void *data)
{
struct acp_dev_data *adata = data;
Expand Down
32 changes: 0 additions & 32 deletions sound/soc/amd/acp/acp-rembrandt.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,36 +44,6 @@ static struct acp_resource rsrc = {
.sram_pte_offset = 0x03802800,
};

static struct snd_soc_acpi_codecs amp_rt1019 = {
.num_codecs = 1,
.codecs = {"10EC1019"}
};

static struct snd_soc_acpi_codecs amp_max = {
.num_codecs = 1,
.codecs = {"MX98360A"}
};

static struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_acp_machines[] = {
{
.id = "10508825",
.drv_name = "rmb-nau8825-max",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_max,
},
{
.id = "AMDI0007",
.drv_name = "rembrandt-acp",
},
{
.id = "RTL5682",
.drv_name = "rmb-rt5682s-rt1019",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_rt1019,
},
{},
};

static struct snd_soc_dai_driver acp_rmb_dai[] = {
{
.name = "acp-i2s-sp",
Expand Down Expand Up @@ -230,8 +200,6 @@ static int rembrandt_audio_probe(struct platform_device *pdev)
adata->acp_rev = chip->acp_rev;
adata->flag = chip->flag;
adata->is_i2s_config = chip->is_i2s_config;
adata->machines = snd_soc_acpi_amd_rmb_acp_machines;
acp_machine_select(adata);

dev_set_drvdata(dev, adata);

Expand Down
42 changes: 0 additions & 42 deletions sound/soc/amd/acp/acp-renoir.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,45 +36,6 @@ static struct acp_resource rsrc = {
.sram_pte_offset = 0x02052800,
};

static struct snd_soc_acpi_codecs amp_rt1019 = {
.num_codecs = 1,
.codecs = {"10EC1019"}
};

static struct snd_soc_acpi_codecs amp_max = {
.num_codecs = 1,
.codecs = {"MX98360A"}
};

static struct snd_soc_acpi_mach snd_soc_acpi_amd_acp_machines[] = {
{
.id = "10EC5682",
.drv_name = "acp3xalc56821019",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_rt1019,
},
{
.id = "RTL5682",
.drv_name = "acp3xalc5682sm98360",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_max,
},
{
.id = "RTL5682",
.drv_name = "acp3xalc5682s1019",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_rt1019,
},
{
.id = "AMDI1019",
.drv_name = "renoir-acp",
},
{
.id = "ESSX8336",
.drv_name = "acp3x-es83xx",
},
{},
};

static struct snd_soc_dai_driver acp_renoir_dai[] = {
{
Expand Down Expand Up @@ -188,9 +149,6 @@ static int renoir_audio_probe(struct platform_device *pdev)
adata->acp_rev = chip->acp_rev;
adata->flag = chip->flag;

adata->machines = snd_soc_acpi_amd_acp_machines;
acp_machine_select(adata);

dev_set_drvdata(dev, adata);
acp_enable_interrupts(adata);
acp_platform_register(dev);
Expand Down
10 changes: 0 additions & 10 deletions sound/soc/amd/acp/acp63.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,6 @@ static struct acp_resource rsrc = {
.sram_pte_offset = 0x03802800,
};

static struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_acp_machines[] = {
{
.id = "AMDI0052",
.drv_name = "acp63-acp",
},
{},
};

static struct snd_soc_dai_driver acp63_dai[] = {
{
.name = "acp-i2s-sp",
Expand Down Expand Up @@ -259,8 +251,6 @@ static int acp63_audio_probe(struct platform_device *pdev)
adata->acp_rev = chip->acp_rev;
adata->flag = chip->flag;
adata->is_i2s_config = chip->is_i2s_config;
adata->machines = snd_soc_acpi_amd_acp63_acp_machines;
acp_machine_select(adata);
dev_set_drvdata(dev, adata);

if (chip->is_i2s_config && rsrc.soc_mclk) {
Expand Down
10 changes: 0 additions & 10 deletions sound/soc/amd/acp/acp70.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,6 @@ static struct acp_resource rsrc = {
.sram_pte_offset = 0x03800000,
};

static struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_acp_machines[] = {
{
.id = "AMDI0029",
.drv_name = "acp70-acp",
},
{},
};

static struct snd_soc_dai_driver acp70_dai[] = {
{
.name = "acp-i2s-sp",
Expand Down Expand Up @@ -187,10 +179,8 @@ static int acp_acp70_audio_probe(struct platform_device *pdev)
adata->dai_driver = acp70_dai;
adata->num_dai = ARRAY_SIZE(acp70_dai);
adata->rsrc = &rsrc;
adata->machines = snd_soc_acpi_amd_acp70_acp_machines;
adata->acp_rev = chip->acp_rev;
adata->flag = chip->flag;
acp_machine_select(adata);

dev_set_drvdata(dev, adata);

Expand Down
81 changes: 79 additions & 2 deletions sound/soc/amd/acp/amd.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ struct acp_chip_info {
struct platform_device *chip_pdev;
struct platform_device *dmic_codec_dev;
struct platform_device *acp_plat_dev;
struct platform_device *mach_dev;
struct snd_soc_acpi_mach *machines;
u32 addr;
unsigned int flag; /* Distinguish b/w Legacy or Only PDM */
bool is_pdm_dev; /* flag set to true when ACP PDM controller exists */
Expand Down Expand Up @@ -195,7 +197,6 @@ struct acp_dev_data {
struct list_head stream_list;
spinlock_t acp_lock;

struct snd_soc_acpi_mach *machines;
struct platform_device *mach_dev;

u32 bclk_div;
Expand Down Expand Up @@ -245,13 +246,89 @@ enum acp_config {
ACP_CONFIG_20,
};

struct snd_soc_acpi_codecs amp_rt1019 = {
.num_codecs = 1,
.codecs = {"10EC1019"}
};

struct snd_soc_acpi_codecs amp_max = {
.num_codecs = 1,
.codecs = {"MX98360A"}
};

struct snd_soc_acpi_mach snd_soc_acpi_amd_acp_machines[] = {
{
.id = "10EC5682",
.drv_name = "acp3xalc56821019",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_rt1019,
},
{
.id = "RTL5682",
.drv_name = "acp3xalc5682sm98360",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_max,
},
{
.id = "RTL5682",
.drv_name = "acp3xalc5682s1019",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_rt1019,
},
{
.id = "AMDI1019",
.drv_name = "renoir-acp",
},
{
.id = "ESSX8336",
.drv_name = "acp3x-es83xx",
},
{},
};

struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_acp_machines[] = {
{
.id = "10508825",
.drv_name = "rmb-nau8825-max",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_max,
},
{
.id = "AMDI0007",
.drv_name = "rembrandt-acp",
},
{
.id = "RTL5682",
.drv_name = "rmb-rt5682s-rt1019",
.machine_quirk = snd_soc_acpi_codec_list,
.quirk_data = &amp_rt1019,
},
{},
};

struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_acp_machines[] = {
{
.id = "AMDI0052",
.drv_name = "acp63-acp",
},
{},
};

struct snd_soc_acpi_mach snd_soc_acpi_amd_acp70_acp_machines[] = {
{
.id = "AMDI0029",
.drv_name = "acp70-acp",
},
{},
};

extern const struct snd_soc_dai_ops asoc_acp_cpu_dai_ops;
extern const struct snd_soc_dai_ops acp_dmic_dai_ops;

int acp_platform_register(struct device *dev);
int acp_platform_unregister(struct device *dev);

int acp_machine_select(struct acp_dev_data *adata);
int acp_machine_select(struct acp_chip_info *chip);

int acp_init(struct acp_chip_info *chip);
int acp_deinit(struct acp_chip_info *chip);
Expand Down

0 comments on commit 6e60db7

Please sign in to comment.