xref: /linux/sound/soc/amd/raven/acp3x.h (revision 6f6f28bf)
1d5a932e5SVijendar Mukunda /* SPDX-License-Identifier: GPL-2.0+ */
2d5a932e5SVijendar Mukunda /*
3d5a932e5SVijendar Mukunda  * AMD ALSA SoC PCM Driver
4d5a932e5SVijendar Mukunda  *
5d5a932e5SVijendar Mukunda  * Copyright 2016 Advanced Micro Devices, Inc.
6d5a932e5SVijendar Mukunda  */
7d5a932e5SVijendar Mukunda 
8e30d9128SMaruthi Srinivas Bayyavarapu #include "chip_offset_byte.h"
9c9fe7db6SRavulapati Vishnu vardhan rao #include <sound/pcm.h>
10703a6e22SRavulapati Vishnu vardhan rao #define I2S_SP_INSTANCE                 0x01
11703a6e22SRavulapati Vishnu vardhan rao #define I2S_BT_INSTANCE                 0x02
12703a6e22SRavulapati Vishnu vardhan rao 
13703a6e22SRavulapati Vishnu vardhan rao #define TDM_ENABLE 1
14703a6e22SRavulapati Vishnu vardhan rao #define TDM_DISABLE 0
15e30d9128SMaruthi Srinivas Bayyavarapu 
16a174a6c2SRavulapati Vishnu vardhan rao #define ACP3x_DEVS		4
17e30d9128SMaruthi Srinivas Bayyavarapu #define ACP3x_PHY_BASE_ADDRESS 0x1240000
187894a7e7SVijendar Mukunda #define	ACP3x_I2S_MODE	0
197894a7e7SVijendar Mukunda #define	ACP3x_REG_START	0x1240000
207894a7e7SVijendar Mukunda #define	ACP3x_REG_END	0x1250200
215def0136SRavulapati Vishnu vardhan rao #define ACP3x_I2STDM_REG_START	0x1242400
225def0136SRavulapati Vishnu vardhan rao #define ACP3x_I2STDM_REG_END	0x1242410
235def0136SRavulapati Vishnu vardhan rao #define ACP3x_BT_TDM_REG_START	0x1242800
245def0136SRavulapati Vishnu vardhan rao #define ACP3x_BT_TDM_REG_END	0x1242810
257894a7e7SVijendar Mukunda #define I2S_MODE	0x04
26703a6e22SRavulapati Vishnu vardhan rao #define	I2S_RX_THRESHOLD	27
27703a6e22SRavulapati Vishnu vardhan rao #define	I2S_TX_THRESHOLD	28
28ac289c7eSVijendar Mukunda #define	BT_TX_THRESHOLD 26
29ac289c7eSVijendar Mukunda #define	BT_RX_THRESHOLD 25
30703a6e22SRavulapati Vishnu vardhan rao #define ACP_ERR_INTR_MASK	29
31ac289c7eSVijendar Mukunda #define ACP3x_POWER_ON 0x00
32ac289c7eSVijendar Mukunda #define ACP3x_POWER_ON_IN_PROGRESS 0x01
33ac289c7eSVijendar Mukunda #define ACP3x_POWER_OFF 0x02
34ac289c7eSVijendar Mukunda #define ACP3x_POWER_OFF_IN_PROGRESS 0x03
35ac289c7eSVijendar Mukunda #define ACP3x_SOFT_RESET__SoftResetAudDone_MASK	0x00010001
36e30d9128SMaruthi Srinivas Bayyavarapu 
370b87d6bcSVijendar Mukunda #define ACP_SRAM_PTE_OFFSET	0x02050000
38703a6e22SRavulapati Vishnu vardhan rao #define ACP_SRAM_SP_PB_PTE_OFFSET	0x0
39703a6e22SRavulapati Vishnu vardhan rao #define ACP_SRAM_SP_CP_PTE_OFFSET	0x100
40703a6e22SRavulapati Vishnu vardhan rao #define ACP_SRAM_BT_PB_PTE_OFFSET	0x200
41703a6e22SRavulapati Vishnu vardhan rao #define ACP_SRAM_BT_CP_PTE_OFFSET	0x300
420b87d6bcSVijendar Mukunda #define PAGE_SIZE_4K_ENABLE 0x2
43703a6e22SRavulapati Vishnu vardhan rao #define I2S_SP_TX_MEM_WINDOW_START	0x4000000
44703a6e22SRavulapati Vishnu vardhan rao #define I2S_SP_RX_MEM_WINDOW_START	0x4020000
45703a6e22SRavulapati Vishnu vardhan rao #define I2S_BT_TX_MEM_WINDOW_START	0x4040000
46703a6e22SRavulapati Vishnu vardhan rao #define I2S_BT_RX_MEM_WINDOW_START	0x4060000
470b87d6bcSVijendar Mukunda 
48703a6e22SRavulapati Vishnu vardhan rao #define SP_PB_FIFO_ADDR_OFFSET		0x500
49703a6e22SRavulapati Vishnu vardhan rao #define SP_CAPT_FIFO_ADDR_OFFSET	0x700
50703a6e22SRavulapati Vishnu vardhan rao #define BT_PB_FIFO_ADDR_OFFSET		0x900
51703a6e22SRavulapati Vishnu vardhan rao #define BT_CAPT_FIFO_ADDR_OFFSET	0xB00
520b87d6bcSVijendar Mukunda #define PLAYBACK_MIN_NUM_PERIODS    2
530b87d6bcSVijendar Mukunda #define PLAYBACK_MAX_NUM_PERIODS    8
54703a6e22SRavulapati Vishnu vardhan rao #define PLAYBACK_MAX_PERIOD_SIZE    8192
55703a6e22SRavulapati Vishnu vardhan rao #define PLAYBACK_MIN_PERIOD_SIZE    1024
560b87d6bcSVijendar Mukunda #define CAPTURE_MIN_NUM_PERIODS     2
570b87d6bcSVijendar Mukunda #define CAPTURE_MAX_NUM_PERIODS     8
58703a6e22SRavulapati Vishnu vardhan rao #define CAPTURE_MAX_PERIOD_SIZE     8192
59703a6e22SRavulapati Vishnu vardhan rao #define CAPTURE_MIN_PERIOD_SIZE     1024
600b87d6bcSVijendar Mukunda 
610b87d6bcSVijendar Mukunda #define MAX_BUFFER (PLAYBACK_MAX_PERIOD_SIZE * PLAYBACK_MAX_NUM_PERIODS)
620b87d6bcSVijendar Mukunda #define MIN_BUFFER MAX_BUFFER
630b87d6bcSVijendar Mukunda #define FIFO_SIZE 0x100
640b87d6bcSVijendar Mukunda #define DMA_SIZE 0x40
6567aa06aeSVijendar Mukunda #define FRM_LEN 0x100
6667aa06aeSVijendar Mukunda 
6767aa06aeSVijendar Mukunda #define SLOT_WIDTH_8 0x08
6867aa06aeSVijendar Mukunda #define SLOT_WIDTH_16 0x10
6967aa06aeSVijendar Mukunda #define SLOT_WIDTH_24 0x18
7067aa06aeSVijendar Mukunda #define SLOT_WIDTH_32 0x20
71535fd141SRavulapati Vishnu vardhan rao #define ACP_PGFSM_CNTL_POWER_ON_MASK	0x01
72535fd141SRavulapati Vishnu vardhan rao #define ACP_PGFSM_CNTL_POWER_OFF_MASK	0x00
73535fd141SRavulapati Vishnu vardhan rao #define ACP_PGFSM_STATUS_MASK		0x03
74535fd141SRavulapati Vishnu vardhan rao #define ACP_POWERED_ON			0x00
75535fd141SRavulapati Vishnu vardhan rao #define ACP_POWER_ON_IN_PROGRESS	0x01
76535fd141SRavulapati Vishnu vardhan rao #define ACP_POWERED_OFF			0x02
77535fd141SRavulapati Vishnu vardhan rao #define ACP_POWER_OFF_IN_PROGRESS	0x03
7867aa06aeSVijendar Mukunda 
79a91ab650SAkshu Agrawal #define ACP3x_ITER_IRER_SAMP_LEN_MASK	0x38
806879e8e7SVijendar Mukunda #define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF
81a91ab650SAkshu Agrawal 
82c9fe7db6SRavulapati Vishnu vardhan rao struct acp3x_platform_info {
83c9fe7db6SRavulapati Vishnu vardhan rao 	u16 play_i2s_instance;
84c9fe7db6SRavulapati Vishnu vardhan rao 	u16 cap_i2s_instance;
85c9fe7db6SRavulapati Vishnu vardhan rao 	u16 capture_channel;
86c9fe7db6SRavulapati Vishnu vardhan rao };
87c9fe7db6SRavulapati Vishnu vardhan rao 
88c9fe7db6SRavulapati Vishnu vardhan rao struct i2s_dev_data {
89c9fe7db6SRavulapati Vishnu vardhan rao 	bool tdm_mode;
906f6f28bfSYueHaibing 	int i2s_irq;
91a43ea44dSRavulapati Vishnu vardhan rao 	u16 i2s_instance;
92c9fe7db6SRavulapati Vishnu vardhan rao 	u32 tdm_fmt;
93c9fe7db6SRavulapati Vishnu vardhan rao 	u32 substream_type;
94c9fe7db6SRavulapati Vishnu vardhan rao 	void __iomem *acp3x_base;
95c9fe7db6SRavulapati Vishnu vardhan rao 	struct snd_pcm_substream *play_stream;
96c9fe7db6SRavulapati Vishnu vardhan rao 	struct snd_pcm_substream *capture_stream;
97703a6e22SRavulapati Vishnu vardhan rao 	struct snd_pcm_substream *i2ssp_play_stream;
98703a6e22SRavulapati Vishnu vardhan rao 	struct snd_pcm_substream *i2ssp_capture_stream;
99c9fe7db6SRavulapati Vishnu vardhan rao };
100c9fe7db6SRavulapati Vishnu vardhan rao 
101c9fe7db6SRavulapati Vishnu vardhan rao struct i2s_stream_instance {
102c9fe7db6SRavulapati Vishnu vardhan rao 	u16 num_pages;
103703a6e22SRavulapati Vishnu vardhan rao 	u16 i2s_instance;
104703a6e22SRavulapati Vishnu vardhan rao 	u16 capture_channel;
105703a6e22SRavulapati Vishnu vardhan rao 	u16 direction;
106c9fe7db6SRavulapati Vishnu vardhan rao 	u16 channels;
107c9fe7db6SRavulapati Vishnu vardhan rao 	u32 xfer_resolution;
108703a6e22SRavulapati Vishnu vardhan rao 	u32 val;
109c9fe7db6SRavulapati Vishnu vardhan rao 	dma_addr_t dma_addr;
110703a6e22SRavulapati Vishnu vardhan rao 	u64 bytescount;
111c9fe7db6SRavulapati Vishnu vardhan rao 	void __iomem *acp3x_base;
112c9fe7db6SRavulapati Vishnu vardhan rao };
1130b87d6bcSVijendar Mukunda 
rv_readl(void __iomem * base_addr)114e30d9128SMaruthi Srinivas Bayyavarapu static inline u32 rv_readl(void __iomem *base_addr)
115e30d9128SMaruthi Srinivas Bayyavarapu {
116e30d9128SMaruthi Srinivas Bayyavarapu 	return readl(base_addr - ACP3x_PHY_BASE_ADDRESS);
117e30d9128SMaruthi Srinivas Bayyavarapu }
118e30d9128SMaruthi Srinivas Bayyavarapu 
rv_writel(u32 val,void __iomem * base_addr)119e30d9128SMaruthi Srinivas Bayyavarapu static inline void rv_writel(u32 val, void __iomem *base_addr)
120e30d9128SMaruthi Srinivas Bayyavarapu {
121e30d9128SMaruthi Srinivas Bayyavarapu 	writel(val, base_addr - ACP3x_PHY_BASE_ADDRESS);
122e30d9128SMaruthi Srinivas Bayyavarapu }
123c9fe7db6SRavulapati Vishnu vardhan rao 
acp_get_byte_count(struct i2s_stream_instance * rtd,int direction)124c9fe7db6SRavulapati Vishnu vardhan rao static inline u64 acp_get_byte_count(struct i2s_stream_instance *rtd,
125c9fe7db6SRavulapati Vishnu vardhan rao 							int direction)
126c9fe7db6SRavulapati Vishnu vardhan rao {
127c9fe7db6SRavulapati Vishnu vardhan rao 	u64 byte_count;
128c9fe7db6SRavulapati Vishnu vardhan rao 
129c9fe7db6SRavulapati Vishnu vardhan rao 	if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
130703a6e22SRavulapati Vishnu vardhan rao 		switch (rtd->i2s_instance) {
131703a6e22SRavulapati Vishnu vardhan rao 		case I2S_BT_INSTANCE:
132c9fe7db6SRavulapati Vishnu vardhan rao 			byte_count = rv_readl(rtd->acp3x_base +
133c9fe7db6SRavulapati Vishnu vardhan rao 					mmACP_BT_TX_LINEARPOSITIONCNTR_HIGH);
134c9fe7db6SRavulapati Vishnu vardhan rao 			byte_count |= rv_readl(rtd->acp3x_base +
135c9fe7db6SRavulapati Vishnu vardhan rao 					mmACP_BT_TX_LINEARPOSITIONCNTR_LOW);
136703a6e22SRavulapati Vishnu vardhan rao 			break;
137703a6e22SRavulapati Vishnu vardhan rao 		case I2S_SP_INSTANCE:
138703a6e22SRavulapati Vishnu vardhan rao 		default:
139703a6e22SRavulapati Vishnu vardhan rao 			byte_count = rv_readl(rtd->acp3x_base +
140703a6e22SRavulapati Vishnu vardhan rao 					mmACP_I2S_TX_LINEARPOSITIONCNTR_HIGH);
141703a6e22SRavulapati Vishnu vardhan rao 			byte_count |= rv_readl(rtd->acp3x_base +
142703a6e22SRavulapati Vishnu vardhan rao 					mmACP_I2S_TX_LINEARPOSITIONCNTR_LOW);
143703a6e22SRavulapati Vishnu vardhan rao 		}
144703a6e22SRavulapati Vishnu vardhan rao 
145c9fe7db6SRavulapati Vishnu vardhan rao 	} else {
146703a6e22SRavulapati Vishnu vardhan rao 		switch (rtd->i2s_instance) {
147703a6e22SRavulapati Vishnu vardhan rao 		case I2S_BT_INSTANCE:
148c9fe7db6SRavulapati Vishnu vardhan rao 			byte_count = rv_readl(rtd->acp3x_base +
149c9fe7db6SRavulapati Vishnu vardhan rao 					mmACP_BT_RX_LINEARPOSITIONCNTR_HIGH);
150c9fe7db6SRavulapati Vishnu vardhan rao 			byte_count |= rv_readl(rtd->acp3x_base +
151c9fe7db6SRavulapati Vishnu vardhan rao 					mmACP_BT_RX_LINEARPOSITIONCNTR_LOW);
152703a6e22SRavulapati Vishnu vardhan rao 			break;
153703a6e22SRavulapati Vishnu vardhan rao 		case I2S_SP_INSTANCE:
154703a6e22SRavulapati Vishnu vardhan rao 		default:
155703a6e22SRavulapati Vishnu vardhan rao 			byte_count = rv_readl(rtd->acp3x_base +
156703a6e22SRavulapati Vishnu vardhan rao 					mmACP_I2S_RX_LINEARPOSITIONCNTR_HIGH);
157703a6e22SRavulapati Vishnu vardhan rao 			byte_count |= rv_readl(rtd->acp3x_base +
158703a6e22SRavulapati Vishnu vardhan rao 					mmACP_I2S_RX_LINEARPOSITIONCNTR_LOW);
159703a6e22SRavulapati Vishnu vardhan rao 		}
160c9fe7db6SRavulapati Vishnu vardhan rao 	}
161c9fe7db6SRavulapati Vishnu vardhan rao 	return byte_count;
162c9fe7db6SRavulapati Vishnu vardhan rao }
163