xref: /kernel/linux/linux-6.6/sound/soc/amd/yc/acp6x.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AMD ALSA SoC PDM Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2021 Advanced Micro Devices, Inc. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "acp6x_chip_offset_byte.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define ACP_DEVICE_ID 0x15E2
1162306a36Sopenharmony_ci#define ACP6x_PHY_BASE_ADDRESS 0x1240000
1262306a36Sopenharmony_ci#define ACP6x_REG_START		0x1240000
1362306a36Sopenharmony_ci#define ACP6x_REG_END		0x1250200
1462306a36Sopenharmony_ci#define ACP6x_DEVS		3
1562306a36Sopenharmony_ci#define ACP6x_PDM_MODE		1
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK	0x00010001
1862306a36Sopenharmony_ci#define ACP_PGFSM_CNTL_POWER_ON_MASK	1
1962306a36Sopenharmony_ci#define ACP_PGFSM_CNTL_POWER_OFF_MASK	0
2062306a36Sopenharmony_ci#define ACP_PGFSM_STATUS_MASK		3
2162306a36Sopenharmony_ci#define ACP_POWERED_ON			0
2262306a36Sopenharmony_ci#define ACP_POWER_ON_IN_PROGRESS	1
2362306a36Sopenharmony_ci#define ACP_POWERED_OFF			2
2462306a36Sopenharmony_ci#define ACP_POWER_OFF_IN_PROGRESS	3
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define ACP_ERROR_MASK 0x20000000
2762306a36Sopenharmony_ci#define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF
2862306a36Sopenharmony_ci#define PDM_DMA_STAT 0x10
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define PDM_DMA_INTR_MASK	0x10000
3162306a36Sopenharmony_ci#define ACP_ERROR_STAT	29
3262306a36Sopenharmony_ci#define PDM_DECIMATION_FACTOR	2
3362306a36Sopenharmony_ci#define ACP_PDM_CLK_FREQ_MASK	7
3462306a36Sopenharmony_ci#define ACP_WOV_GAIN_CONTROL	GENMASK(4, 3)
3562306a36Sopenharmony_ci#define ACP_PDM_ENABLE		1
3662306a36Sopenharmony_ci#define ACP_PDM_DISABLE		0
3762306a36Sopenharmony_ci#define ACP_PDM_DMA_EN_STATUS	2
3862306a36Sopenharmony_ci#define TWO_CH		2
3962306a36Sopenharmony_ci#define DELAY_US	5
4062306a36Sopenharmony_ci#define ACP_COUNTER	20000
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define ACP_SRAM_PTE_OFFSET	0x03800000
4362306a36Sopenharmony_ci#define PAGE_SIZE_4K_ENABLE	2
4462306a36Sopenharmony_ci#define PDM_PTE_OFFSET		0
4562306a36Sopenharmony_ci#define PDM_MEM_WINDOW_START	0x4000000
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define CAPTURE_MIN_NUM_PERIODS     4
4862306a36Sopenharmony_ci#define CAPTURE_MAX_NUM_PERIODS     4
4962306a36Sopenharmony_ci#define CAPTURE_MAX_PERIOD_SIZE     8192
5062306a36Sopenharmony_ci#define CAPTURE_MIN_PERIOD_SIZE     4096
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS)
5362306a36Sopenharmony_ci#define MIN_BUFFER MAX_BUFFER
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* time in ms for runtime suspend delay */
5662306a36Sopenharmony_ci#define ACP_SUSPEND_DELAY_MS	2000
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cienum acp_config {
5962306a36Sopenharmony_ci	ACP_CONFIG_0 = 0,
6062306a36Sopenharmony_ci	ACP_CONFIG_1,
6162306a36Sopenharmony_ci	ACP_CONFIG_2,
6262306a36Sopenharmony_ci	ACP_CONFIG_3,
6362306a36Sopenharmony_ci	ACP_CONFIG_4,
6462306a36Sopenharmony_ci	ACP_CONFIG_5,
6562306a36Sopenharmony_ci	ACP_CONFIG_6,
6662306a36Sopenharmony_ci	ACP_CONFIG_7,
6762306a36Sopenharmony_ci	ACP_CONFIG_8,
6862306a36Sopenharmony_ci	ACP_CONFIG_9,
6962306a36Sopenharmony_ci	ACP_CONFIG_10,
7062306a36Sopenharmony_ci	ACP_CONFIG_11,
7162306a36Sopenharmony_ci	ACP_CONFIG_12,
7262306a36Sopenharmony_ci	ACP_CONFIG_13,
7362306a36Sopenharmony_ci	ACP_CONFIG_14,
7462306a36Sopenharmony_ci	ACP_CONFIG_15,
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct pdm_dev_data {
7862306a36Sopenharmony_ci	u32 pdm_irq;
7962306a36Sopenharmony_ci	void __iomem *acp6x_base;
8062306a36Sopenharmony_ci	struct snd_pcm_substream *capture_stream;
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistruct pdm_stream_instance {
8462306a36Sopenharmony_ci	u16 num_pages;
8562306a36Sopenharmony_ci	u16 channels;
8662306a36Sopenharmony_ci	dma_addr_t dma_addr;
8762306a36Sopenharmony_ci	u64 bytescount;
8862306a36Sopenharmony_ci	void __iomem *acp6x_base;
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciunion acp_pdm_dma_count {
9262306a36Sopenharmony_ci	struct {
9362306a36Sopenharmony_ci	u32 low;
9462306a36Sopenharmony_ci	u32 high;
9562306a36Sopenharmony_ci	} bcount;
9662306a36Sopenharmony_ci	u64 bytescount;
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline u32 acp6x_readl(void __iomem *base_addr)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	return readl(base_addr - ACP6x_PHY_BASE_ADDRESS);
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic inline void acp6x_writel(u32 val, void __iomem *base_addr)
10562306a36Sopenharmony_ci{
10662306a36Sopenharmony_ci	writel(val, base_addr - ACP6x_PHY_BASE_ADDRESS);
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciint snd_amd_acp_find_config(struct pci_dev *pci);
11062306a36Sopenharmony_ci
111