Skip to content

Commit f722917

Browse files
vijendarmukundabroonie
authored andcommitted
ASoC: amd: ps: add SoundWire dma driver dma ops
Add SoundWire DMA driver dma ops for Pink Sardine platform. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Link: https://lore.kernel.org/r/20230612095903.2113464-5-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 665dd18 commit f722917

2 files changed

Lines changed: 464 additions & 0 deletions

File tree

sound/soc/amd/ps/acp63.h

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,49 @@
103103
#define ACP_SDW1_STAT BIT(2)
104104
#define ACP_ERROR_IRQ BIT(29)
105105

106+
#define ACP_AUDIO0_TX_THRESHOLD 0x1c
107+
#define ACP_AUDIO1_TX_THRESHOLD 0x1a
108+
#define ACP_AUDIO2_TX_THRESHOLD 0x18
109+
#define ACP_AUDIO0_RX_THRESHOLD 0x1b
110+
#define ACP_AUDIO1_RX_THRESHOLD 0x19
111+
#define ACP_AUDIO2_RX_THRESHOLD 0x17
112+
#define ACP_P1_AUDIO1_TX_THRESHOLD BIT(6)
113+
#define ACP_P1_AUDIO1_RX_THRESHOLD BIT(5)
114+
#define ACP_SDW_DMA_IRQ_MASK 0x1F800000
115+
#define ACP_P1_SDW_DMA_IRQ_MASK 0x60
116+
#define ACP63_SDW0_DMA_MAX_STREAMS 6
117+
#define ACP63_SDW1_DMA_MAX_STREAMS 2
118+
#define ACP_P1_AUDIO_TX_THRESHOLD 6
119+
#define SDW0_DMA_TX_IRQ_MASK(i) (ACP_AUDIO0_TX_THRESHOLD - (2 * (i)))
120+
#define SDW0_DMA_RX_IRQ_MASK(i) (ACP_AUDIO0_RX_THRESHOLD - (2 * (i)))
121+
#define SDW1_DMA_IRQ_MASK(i) (ACP_P1_AUDIO_TX_THRESHOLD - (i))
122+
123+
#define ACP_DELAY_US 5
124+
#define ACP_SDW_RING_BUFF_ADDR_OFFSET (128 * 1024)
125+
#define SDW0_MEM_WINDOW_START 0x4800000
126+
#define ACP_SDW_SRAM_PTE_OFFSET 0x03800400
127+
#define SDW0_PTE_OFFSET 0x400
128+
#define SDW_FIFO_SIZE 0x100
129+
#define SDW_DMA_SIZE 0x40
130+
#define ACP_SDW0_FIFO_OFFSET 0x100
131+
#define ACP_SDW_PTE_OFFSET 0x100
132+
#define SDW_FIFO_OFFSET 0x100
133+
#define SDW_PTE_OFFSET(i) (SDW0_PTE_OFFSET + ((i) * 0x600))
134+
#define ACP_SDW_FIFO_OFFSET(i) (ACP_SDW0_FIFO_OFFSET + ((i) * 0x500))
135+
#define SDW_MEM_WINDOW_START(i) (SDW0_MEM_WINDOW_START + ((i) * 0xC0000))
136+
137+
#define SDW_PLAYBACK_MIN_NUM_PERIODS 2
138+
#define SDW_PLAYBACK_MAX_NUM_PERIODS 8
139+
#define SDW_PLAYBACK_MAX_PERIOD_SIZE 8192
140+
#define SDW_PLAYBACK_MIN_PERIOD_SIZE 1024
141+
#define SDW_CAPTURE_MIN_NUM_PERIODS 2
142+
#define SDW_CAPTURE_MAX_NUM_PERIODS 8
143+
#define SDW_CAPTURE_MAX_PERIOD_SIZE 8192
144+
#define SDW_CAPTURE_MIN_PERIOD_SIZE 1024
145+
146+
#define SDW_MAX_BUFFER (SDW_PLAYBACK_MAX_PERIOD_SIZE * SDW_PLAYBACK_MAX_NUM_PERIODS)
147+
#define SDW_MIN_BUFFER SDW_MAX_BUFFER
148+
106149
enum acp_config {
107150
ACP_CONFIG_0 = 0,
108151
ACP_CONFIG_1,
@@ -140,6 +183,36 @@ struct pdm_dev_data {
140183
struct sdw_dma_dev_data {
141184
void __iomem *acp_base;
142185
struct mutex *acp_lock; /* used to protect acp common register access */
186+
struct snd_pcm_substream *sdw0_dma_stream[ACP63_SDW0_DMA_MAX_STREAMS];
187+
struct snd_pcm_substream *sdw1_dma_stream[ACP63_SDW1_DMA_MAX_STREAMS];
188+
};
189+
190+
struct acp_sdw_dma_stream {
191+
u16 num_pages;
192+
u16 channels;
193+
u32 stream_id;
194+
u32 instance;
195+
dma_addr_t dma_addr;
196+
u64 bytescount;
197+
};
198+
199+
union acp_sdw_dma_count {
200+
struct {
201+
u32 low;
202+
u32 high;
203+
} bcount;
204+
u64 bytescount;
205+
};
206+
207+
struct sdw_dma_ring_buf_reg {
208+
u32 reg_dma_size;
209+
u32 reg_fifo_addr;
210+
u32 reg_fifo_size;
211+
u32 reg_ring_buf_size;
212+
u32 reg_ring_buf_addr;
213+
u32 water_mark_size_reg;
214+
u32 pos_low_reg;
215+
u32 pos_high_reg;
143216
};
144217

145218
/**

0 commit comments

Comments
 (0)