Skip to content

Commit 3a94c8a

Browse files
saba-kareembroonie
authored andcommitted
ASoC: amd: acp: add code for scanning acp pdm controller
Add common code for scanning acp pdm controller and create platform device for the same. Signed-off-by: Syed Saba Kareem <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent d4c2d53 commit 3a94c8a

File tree

5 files changed

+86
-1
lines changed

5 files changed

+86
-1
lines changed

sound/soc/amd/acp/acp-legacy-common.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#include <linux/pci.h>
1717
#include <linux/export.h>
1818

19+
#define ACP_RENOIR_PDM_ADDR 0x02
20+
#define ACP_REMBRANDT_PDM_ADDR 0x03
21+
#define ACP63_PDM_ADDR 0x02
22+
1923
void acp_enable_interrupts(struct acp_dev_data *adata)
2024
{
2125
struct acp_resource *rsrc = adata->rsrc;
@@ -348,4 +352,52 @@ int smn_read(struct pci_dev *dev, u32 smn_addr)
348352
}
349353
EXPORT_SYMBOL_NS_GPL(smn_read, SND_SOC_ACP_COMMON);
350354

355+
int check_acp_pdm(struct pci_dev *pci, struct acp_chip_info *chip)
356+
{
357+
struct acpi_device *pdm_dev;
358+
const union acpi_object *obj;
359+
u32 pdm_addr, val;
360+
361+
val = readl(chip->base + ACP_PIN_CONFIG);
362+
switch (val) {
363+
case ACP_CONFIG_4:
364+
case ACP_CONFIG_5:
365+
case ACP_CONFIG_6:
366+
case ACP_CONFIG_7:
367+
case ACP_CONFIG_8:
368+
case ACP_CONFIG_10:
369+
case ACP_CONFIG_11:
370+
case ACP_CONFIG_12:
371+
case ACP_CONFIG_13:
372+
case ACP_CONFIG_14:
373+
break;
374+
default:
375+
return -EINVAL;
376+
}
377+
378+
switch (chip->acp_rev) {
379+
case ACP3X_DEV:
380+
pdm_addr = ACP_RENOIR_PDM_ADDR;
381+
break;
382+
case ACP6X_DEV:
383+
pdm_addr = ACP_REMBRANDT_PDM_ADDR;
384+
break;
385+
case ACP63_DEV:
386+
pdm_addr = ACP63_PDM_ADDR;
387+
break;
388+
default:
389+
return -EINVAL;
390+
}
391+
392+
pdm_dev = acpi_find_child_device(ACPI_COMPANION(&pci->dev), pdm_addr, 0);
393+
if (pdm_dev) {
394+
if (!acpi_dev_get_property(pdm_dev, "acp-audio-device-type",
395+
ACPI_TYPE_INTEGER, &obj) &&
396+
obj->integer.value == pdm_addr)
397+
return 0;
398+
}
399+
return -ENODEV;
400+
}
401+
EXPORT_SYMBOL_NS_GPL(check_acp_pdm, SND_SOC_ACP_COMMON);
402+
351403
MODULE_LICENSE("Dual BSD/GPL");

sound/soc/amd/acp/acp-pci.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
5555
int ret;
5656

5757
flag = snd_amd_acp_find_config(pci);
58-
if (flag != FLAG_AMD_LEGACY)
58+
if (flag != FLAG_AMD_LEGACY && flag != FLAG_AMD_LEGACY_ONLY_DMIC)
5959
return -ENODEV;
6060

6161
chip = devm_kzalloc(&pci->dev, sizeof(*chip), GFP_KERNEL);
@@ -129,6 +129,13 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
129129
}
130130
}
131131

132+
if (flag == FLAG_AMD_LEGACY_ONLY_DMIC) {
133+
ret = check_acp_pdm(pci, chip);
134+
if (ret < 0)
135+
goto skip_pdev_creation;
136+
}
137+
138+
chip->flag = flag;
132139
memset(&pdevinfo, 0, sizeof(pdevinfo));
133140

134141
pdevinfo.name = chip->name;
@@ -145,6 +152,8 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
145152
ret = PTR_ERR(pdev);
146153
goto unregister_dmic_dev;
147154
}
155+
156+
skip_pdev_creation:
148157
chip->chip_pdev = pdev;
149158
dev_set_drvdata(&pci->dev, chip);
150159
pm_runtime_set_autosuspend_delay(&pci->dev, 2000);

sound/soc/amd/acp/amd.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ struct acp_chip_info {
133133
unsigned int acp_rev; /* ACP Revision id */
134134
void __iomem *base; /* ACP memory PCI base */
135135
struct platform_device *chip_pdev;
136+
unsigned int flag; /* Distinguish b/w Legacy or Only PDM */
136137
};
137138

138139
struct acp_stream {
@@ -188,6 +189,25 @@ struct acp_dev_data {
188189
u32 xfer_rx_resolution[3];
189190
};
190191

192+
enum acp_config {
193+
ACP_CONFIG_0 = 0,
194+
ACP_CONFIG_1,
195+
ACP_CONFIG_2,
196+
ACP_CONFIG_3,
197+
ACP_CONFIG_4,
198+
ACP_CONFIG_5,
199+
ACP_CONFIG_6,
200+
ACP_CONFIG_7,
201+
ACP_CONFIG_8,
202+
ACP_CONFIG_9,
203+
ACP_CONFIG_10,
204+
ACP_CONFIG_11,
205+
ACP_CONFIG_12,
206+
ACP_CONFIG_13,
207+
ACP_CONFIG_14,
208+
ACP_CONFIG_15,
209+
};
210+
191211
extern const struct snd_soc_dai_ops asoc_acp_cpu_dai_ops;
192212
extern const struct snd_soc_dai_ops acp_dmic_dai_ops;
193213

@@ -214,6 +234,8 @@ void restore_acp_pdm_params(struct snd_pcm_substream *substream,
214234
int restore_acp_i2s_params(struct snd_pcm_substream *substream,
215235
struct acp_dev_data *adata, struct acp_stream *stream);
216236

237+
int check_acp_pdm(struct pci_dev *pci, struct acp_chip_info *chip);
238+
217239
static inline u64 acp_get_byte_count(struct acp_dev_data *adata, int dai_id, int direction)
218240
{
219241
u64 byte_count = 0, low = 0, high = 0;

sound/soc/amd/acp/chip_offset_byte.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define ACP_PGFSM_STATUS 0x1420
2020
#define ACP_SOFT_RESET 0x1000
2121
#define ACP_CONTROL 0x1004
22+
#define ACP_PIN_CONFIG 0x1440
2223

2324
#define ACP_EXTERNAL_INTR_REG_ADDR(adata, offset, ctrl) \
2425
(adata->acp_base + adata->rsrc->irq_reg_offset + offset + (ctrl * 0x04))

sound/soc/amd/mach-config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define FLAG_AMD_SOF BIT(1)
1616
#define FLAG_AMD_SOF_ONLY_DMIC BIT(2)
1717
#define FLAG_AMD_LEGACY BIT(3)
18+
#define FLAG_AMD_LEGACY_ONLY_DMIC BIT(4)
1819

1920
#define ACP_PCI_DEV_ID 0x15E2
2021

0 commit comments

Comments
 (0)