mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
ASoC: amd: ps: implement api to retrieve acp device config
Implement API to retrieve acp device config and calculate platform device count and dev mask for platform device node creation. Currently for DMIC configuration, mask and dev count are calculated. Same api will be used to extend support for different ACP device configurations. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Link: https://lore.kernel.org/r/20221221172855.1618766-1-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
c71f5fa072
commit
2cdabbde0c
@ -54,6 +54,11 @@
|
||||
/* time in ms for runtime suspend delay */
|
||||
#define ACP_SUSPEND_DELAY_MS 2000
|
||||
|
||||
#define ACP63_DMIC_ADDR 2
|
||||
#define ACP63_PDM_MODE_DEVS 3
|
||||
#define ACP63_PDM_DEV_MASK 1
|
||||
#define ACP_DMIC_DEV 2
|
||||
|
||||
enum acp_config {
|
||||
ACP_CONFIG_0 = 0,
|
||||
ACP_CONFIG_1,
|
||||
@ -102,4 +107,6 @@ struct acp63_dev_data {
|
||||
struct resource *res;
|
||||
bool acp63_audio_mode;
|
||||
struct platform_device *pdev[ACP63_DEVS];
|
||||
u16 pdev_mask;
|
||||
u16 pdev_count;
|
||||
};
|
||||
|
@ -132,6 +132,39 @@ static irqreturn_t acp63_irq_handler(int irq, void *dev_id)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
static void get_acp63_device_config(u32 config, struct pci_dev *pci,
|
||||
struct acp63_dev_data *acp_data)
|
||||
{
|
||||
struct acpi_device *dmic_dev;
|
||||
const union acpi_object *obj;
|
||||
bool is_dmic_dev = false;
|
||||
|
||||
dmic_dev = acpi_find_child_device(ACPI_COMPANION(&pci->dev), ACP63_DMIC_ADDR, 0);
|
||||
if (dmic_dev) {
|
||||
if (!acpi_dev_get_property(dmic_dev, "acp-audio-device-type",
|
||||
ACPI_TYPE_INTEGER, &obj) &&
|
||||
obj->integer.value == ACP_DMIC_DEV)
|
||||
is_dmic_dev = true;
|
||||
}
|
||||
|
||||
switch (config) {
|
||||
case ACP_CONFIG_0:
|
||||
case ACP_CONFIG_1:
|
||||
case ACP_CONFIG_2:
|
||||
case ACP_CONFIG_3:
|
||||
case ACP_CONFIG_9:
|
||||
case ACP_CONFIG_15:
|
||||
dev_dbg(&pci->dev, "Audio Mode %d\n", config);
|
||||
break;
|
||||
default:
|
||||
if (is_dmic_dev) {
|
||||
acp_data->pdev_mask = ACP63_PDM_DEV_MASK;
|
||||
acp_data->pdev_count = ACP63_PDM_MODE_DEVS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int snd_acp63_probe(struct pci_dev *pci,
|
||||
const struct pci_device_id *pci_id)
|
||||
{
|
||||
@ -183,6 +216,7 @@ static int snd_acp63_probe(struct pci_dev *pci,
|
||||
if (ret)
|
||||
goto release_regions;
|
||||
val = acp63_readl(adata->acp63_base + ACP_PIN_CONFIG);
|
||||
get_acp63_device_config(val, pci, adata);
|
||||
switch (val) {
|
||||
case ACP_CONFIG_0:
|
||||
case ACP_CONFIG_1:
|
||||
@ -195,14 +229,14 @@ static int snd_acp63_probe(struct pci_dev *pci,
|
||||
default:
|
||||
|
||||
/* Checking DMIC hardware*/
|
||||
adev = acpi_find_child_device(ACPI_COMPANION(&pci->dev), 0x02, 0);
|
||||
adev = acpi_find_child_device(ACPI_COMPANION(&pci->dev), ACP63_DMIC_ADDR, 0);
|
||||
|
||||
if (!adev)
|
||||
break;
|
||||
|
||||
if (!acpi_dev_get_property(adev, "acp-audio-device-type",
|
||||
ACPI_TYPE_INTEGER, &obj) &&
|
||||
obj->integer.value == 2) {
|
||||
obj->integer.value == ACP_DMIC_DEV) {
|
||||
adata->res = devm_kzalloc(&pci->dev, sizeof(struct resource), GFP_KERNEL);
|
||||
if (!adata->res) {
|
||||
ret = -ENOMEM;
|
||||
|
Loading…
Reference in New Issue
Block a user