|
16 | 16 | #include <linux/pci.h> |
17 | 17 | #include <linux/export.h> |
18 | 18 |
|
| 19 | +#define ACP_RENOIR_PDM_ADDR 0x02 |
| 20 | +#define ACP_REMBRANDT_PDM_ADDR 0x03 |
| 21 | +#define ACP63_PDM_ADDR 0x02 |
| 22 | + |
19 | 23 | void acp_enable_interrupts(struct acp_dev_data *adata) |
20 | 24 | { |
21 | 25 | struct acp_resource *rsrc = adata->rsrc; |
@@ -348,4 +352,52 @@ int smn_read(struct pci_dev *dev, u32 smn_addr) |
348 | 352 | } |
349 | 353 | EXPORT_SYMBOL_NS_GPL(smn_read, SND_SOC_ACP_COMMON); |
350 | 354 |
|
| 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 | + |
351 | 403 | MODULE_LICENSE("Dual BSD/GPL"); |
0 commit comments