11eb2852eSVijendar Mukunda /* SPDX-License-Identifier: GPL-2.0+ */ 21eb2852eSVijendar Mukunda /* 31eb2852eSVijendar Mukunda * AMD ALSA SoC PDM Driver 41eb2852eSVijendar Mukunda * 51eb2852eSVijendar Mukunda * Copyright 2020 Advanced Micro Devices, Inc. 61eb2852eSVijendar Mukunda */ 71eb2852eSVijendar Mukunda 81eb2852eSVijendar Mukunda #include "rn_chip_offset_byte.h" 91eb2852eSVijendar Mukunda 10b208c3bcSVijendar Mukunda #define ACP_DEVS 3 111eb2852eSVijendar Mukunda #define ACP_PHY_BASE_ADDRESS 0x1240000 1266c4f558SVijendar Mukunda #define ACP_REG_START 0x1240000 1366c4f558SVijendar Mukunda #define ACP_REG_END 0x1250200 1466c4f558SVijendar Mukunda 151eb2852eSVijendar Mukunda #define ACP_DEVICE_ID 0x15E2 1685ded495SVijendar Mukunda #define ACP_POWER_ON 0x00 1785ded495SVijendar Mukunda #define ACP_POWER_ON_IN_PROGRESS 0x01 1885ded495SVijendar Mukunda #define ACP_POWER_OFF 0x02 1985ded495SVijendar Mukunda #define ACP_POWER_OFF_IN_PROGRESS 0x03 2085ded495SVijendar Mukunda #define ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK 0x00010001 2185ded495SVijendar Mukunda 2285ded495SVijendar Mukunda #define ACP_PGFSM_CNTL_POWER_ON_MASK 0x01 2385ded495SVijendar Mukunda #define ACP_PGFSM_CNTL_POWER_OFF_MASK 0x00 2485ded495SVijendar Mukunda #define ACP_PGFSM_STATUS_MASK 0x03 2585ded495SVijendar Mukunda #define ACP_POWERED_ON 0x00 2685ded495SVijendar Mukunda #define ACP_POWER_ON_IN_PROGRESS 0x01 2785ded495SVijendar Mukunda #define ACP_POWERED_OFF 0x02 2885ded495SVijendar Mukunda #define ACP_POWER_OFF_IN_PROGRESS 0x03 2985ded495SVijendar Mukunda 3085ded495SVijendar Mukunda #define ACP_ERROR_MASK 0x20000000 3185ded495SVijendar Mukunda #define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF 32b9901654SVijendar Mukunda #define PDM_DMA_STAT 0x10 334a767b1dSVijendar Mukunda #define PDM_DMA_INTR_MASK 0x10000 344a767b1dSVijendar Mukunda #define ACP_ERROR_STAT 29 35370e7ddeSVijendar Mukunda #define PDM_DECIMATION_FACTOR 0x2 36370e7ddeSVijendar Mukunda #define ACP_PDM_CLK_FREQ_MASK 0x07 37*b7d8d4ecSMario Limonciello #define ACP_WOV_GAIN_CONTROL GENMASK(4, 3) 38370e7ddeSVijendar Mukunda #define ACP_PDM_ENABLE 0x01 39370e7ddeSVijendar Mukunda #define ACP_PDM_DISABLE 0x00 40370e7ddeSVijendar Mukunda #define ACP_PDM_DMA_EN_STATUS 0x02 41370e7ddeSVijendar Mukunda #define TWO_CH 0x02 42370e7ddeSVijendar Mukunda #define DELAY_US 5 43370e7ddeSVijendar Mukunda #define ACP_COUNTER 20000 44c346e768SVijendar Mukunda /* time in ms for runtime suspend delay */ 45c346e768SVijendar Mukunda #define ACP_SUSPEND_DELAY_MS 2000 461eb2852eSVijendar Mukunda 474a767b1dSVijendar Mukunda #define ACP_SRAM_PTE_OFFSET 0x02050000 484a767b1dSVijendar Mukunda #define PAGE_SIZE_4K_ENABLE 0x2 494a767b1dSVijendar Mukunda #define MEM_WINDOW_START 0x4000000 504a767b1dSVijendar Mukunda 514a767b1dSVijendar Mukunda #define CAPTURE_MIN_NUM_PERIODS 4 524a767b1dSVijendar Mukunda #define CAPTURE_MAX_NUM_PERIODS 4 534a767b1dSVijendar Mukunda #define CAPTURE_MAX_PERIOD_SIZE 8192 544a767b1dSVijendar Mukunda #define CAPTURE_MIN_PERIOD_SIZE 4096 554a767b1dSVijendar Mukunda 564a767b1dSVijendar Mukunda #define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS) 574a767b1dSVijendar Mukunda #define MIN_BUFFER MAX_BUFFER 589e0d21e1SVijendar Mukunda #define ACP_DMIC_AUTO -1 599e0d21e1SVijendar Mukunda 60f621a367SVijendar Mukunda struct pdm_dev_data { 61b9901654SVijendar Mukunda u32 pdm_irq; 62f621a367SVijendar Mukunda void __iomem *acp_base; 63f621a367SVijendar Mukunda struct snd_pcm_substream *capture_stream; 64f621a367SVijendar Mukunda }; 65f621a367SVijendar Mukunda 664a767b1dSVijendar Mukunda struct pdm_stream_instance { 674a767b1dSVijendar Mukunda u16 num_pages; 684a767b1dSVijendar Mukunda u16 channels; 694a767b1dSVijendar Mukunda dma_addr_t dma_addr; 704a767b1dSVijendar Mukunda u64 bytescount; 714a767b1dSVijendar Mukunda void __iomem *acp_base; 724a767b1dSVijendar Mukunda }; 734a767b1dSVijendar Mukunda 744a767b1dSVijendar Mukunda union acp_pdm_dma_count { 754a767b1dSVijendar Mukunda struct { 764a767b1dSVijendar Mukunda u32 low; 774a767b1dSVijendar Mukunda u32 high; 784a767b1dSVijendar Mukunda } bcount; 794a767b1dSVijendar Mukunda u64 bytescount; 804a767b1dSVijendar Mukunda }; 814a767b1dSVijendar Mukunda rn_readl(void __iomem * base_addr)821eb2852eSVijendar Mukundastatic inline u32 rn_readl(void __iomem *base_addr) 831eb2852eSVijendar Mukunda { 841eb2852eSVijendar Mukunda return readl(base_addr - ACP_PHY_BASE_ADDRESS); 851eb2852eSVijendar Mukunda } 861eb2852eSVijendar Mukunda rn_writel(u32 val,void __iomem * base_addr)871eb2852eSVijendar Mukundastatic inline void rn_writel(u32 val, void __iomem *base_addr) 881eb2852eSVijendar Mukunda { 891eb2852eSVijendar Mukunda writel(val, base_addr - ACP_PHY_BASE_ADDRESS); 901eb2852eSVijendar Mukunda } 912d7d9f36SAjit Kumar Pandey 922d7d9f36SAjit Kumar Pandey /* Machine configuration */ 932d7d9f36SAjit Kumar Pandey int snd_amd_acp_find_config(struct pci_dev *pci); 94