1212#include <sof/lib/uuid.h>
1313#include <sof/trace/trace.h>
1414
15- #ifdef CONFIG_ACP_6_3
15+ #if defined( CONFIG_ACP_6_3 ) || defined( CONFIG_ACP_7_0 )
1616
1717SOF_DEFINE_REG_UUID (acp_sw_audio );
1818
1919DECLARE_TR_CTX (acp_sw_audio_tr , SOF_UUID (acp_sw_audio_uuid ), LOG_LEVEL_INFO );
2020
21+ #if defined(CONFIG_ACP_6_3 )
22+ #define DMA_CH_COUNT 8
23+ #elif defined(CONFIG_ACP_7_0 )
24+ #define DMA_CH_COUNT 12
25+ #endif
26+
2127//initialization of soundwire-0 fifos(Audio, BT and HS)
2228#define SW0_AUDIO_FIFO_SIZE 128
2329#define SW0_AUDIO_TX_FIFO_ADDR 0
@@ -31,10 +37,18 @@ DECLARE_TR_CTX(acp_sw_audio_tr, SOF_UUID(acp_sw_audio_uuid), LOG_LEVEL_INFO);
3137#define SW0_HS_TX_FIFO_ADDR (SW0_BT_RX_FIFO_ADDR + SW0_BT_FIFO_SIZE)
3238#define SW0_HS_RX_FIFO_ADDR (SW0_HS_TX_FIFO_ADDR + SW0_HS_FIFO_SIZE)
3339
34- //initialization of soundwire-1 fifo
35- #define SW1_FIFO_SIZE 128
36- #define SW1_TX_FIFO_ADDR (SW0_HS_RX_FIFO_ADDR + SW1_FIFO_SIZE)
37- #define SW1_RX_FIFO_ADDR (SW1_TX_FIFO_ADDR + SW1_FIFO_SIZE)
40+ //initialization of soundwire-1 fifos(Audio, BT and HS)
41+ #define SW1_AUDIO_FIFO_SIZE 128
42+ #define SW1_AUDIO_TX_FIFO_ADDR (SW0_HS_RX_FIFO_ADDR + SW0_HS_FIFO_SIZE)
43+ #define SW1_AUDIO_RX_FIFO_ADDR (SW1_AUDIO_TX_FIFO_ADDR + SW1_AUDIO_FIFO_SIZE)
44+
45+ #define SW1_BT_FIFO_SIZE 128
46+ #define SW1_BT_TX_FIFO_ADDR (SW1_AUDIO_RX_FIFO_ADDR + SW1_AUDIO_FIFO_SIZE)
47+ #define SW1_BT_RX_FIFO_ADDR (SW1_BT_TX_FIFO_ADDR + SW1_BT_FIFO_SIZE)
48+
49+ #define SW1_HS_FIFO_SIZE 128
50+ #define SW1_HS_TX_FIFO_ADDR (SW1_BT_RX_FIFO_ADDR + SW1_BT_FIFO_SIZE)
51+ #define SW1_HS_RX_FIFO_ADDR (SW1_HS_TX_FIFO_ADDR + SW1_HS_FIFO_SIZE)
3852
3953static uint32_t sw_audio_buff_size_playback ;
4054static uint32_t sw_audio_buff_size_capture ;
@@ -55,7 +69,7 @@ struct sw_dev_register {
5569 uint32_t statusindex ;
5670};
5771
58- static struct sw_dev_register sw_dev [8 ] = {
72+ static struct sw_dev_register sw_dev [DMA_CH_COUNT ] = {
5973{ACP_SW_HS_RX_EN , ACP_SW_HS_RX_EN_STATUS , ACP_HS_RX_FIFOADDR , SW0_HS_RX_FIFO_ADDR ,
6074ACP_HS_RX_FIFOSIZE , SW0_HS_FIFO_SIZE , ACP_HS_RX_RINGBUFADDR , ACP_HS_RX_RINGBUFSIZE ,
6175ACP_HS_RX_DMA_SIZE , ACP_HS_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT , ACP_DSP0_INTR_CNTL , 0 },
@@ -64,13 +78,13 @@ ACP_HS_RX_DMA_SIZE, ACP_HS_RX_INTR_WATERMARK_SIZE, ACP_DSP0_INTR_STAT, ACP_DSP0_
6478ACP_HS_TX_FIFOSIZE , SW0_HS_FIFO_SIZE , ACP_HS_TX_RINGBUFADDR , ACP_HS_TX_RINGBUFSIZE ,
6579ACP_HS_TX_DMA_SIZE , ACP_HS_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT , ACP_DSP0_INTR_CNTL , 1 },
6680
67- {ACP_P1_SW_BT_RX_EN , ACP_P1_SW_BT_RX_EN_STATUS , ACP_P1_BT_RX_FIFOADDR , SW1_RX_FIFO_ADDR ,
68- ACP_P1_BT_RX_FIFOSIZE , SW1_FIFO_SIZE , ACP_P1_BT_RX_RINGBUFADDR , ACP_P1_BT_RX_RINGBUFSIZE ,
81+ {ACP_P1_SW_BT_RX_EN , ACP_P1_SW_BT_RX_EN_STATUS , ACP_P1_BT_RX_FIFOADDR , SW1_BT_RX_FIFO_ADDR ,
82+ ACP_P1_BT_RX_FIFOSIZE , SW1_BT_FIFO_SIZE , ACP_P1_BT_RX_RINGBUFADDR , ACP_P1_BT_RX_RINGBUFSIZE ,
6983ACP_P1_BT_RX_DMA_SIZE , ACP_P1_BT_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
70842 },
7185
72- {ACP_P1_SW_BT_TX_EN , ACP_P1_SW_BT_TX_EN_STATUS , ACP_P1_BT_TX_FIFOADDR , SW1_TX_FIFO_ADDR ,
73- ACP_P1_BT_TX_FIFOSIZE , SW1_FIFO_SIZE , ACP_P1_BT_TX_RINGBUFADDR , ACP_P1_BT_TX_RINGBUFSIZE ,
86+ {ACP_P1_SW_BT_TX_EN , ACP_P1_SW_BT_TX_EN_STATUS , ACP_P1_BT_TX_FIFOADDR , SW1_BT_TX_FIFO_ADDR ,
87+ ACP_P1_BT_TX_FIFOSIZE , SW1_BT_FIFO_SIZE , ACP_P1_BT_TX_RINGBUFADDR , ACP_P1_BT_TX_RINGBUFSIZE ,
7488ACP_P1_BT_TX_DMA_SIZE , ACP_P1_BT_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
75893 },
7690
@@ -88,7 +102,29 @@ ACP_BT_RX_DMA_SIZE, ACP_BT_RX_INTR_WATERMARK_SIZE, ACP_DSP0_INTR_STAT, ACP_DSP0_
88102
89103{ACP_SW_BT_TX_EN , ACP_SW_BT_TX_EN_STATUS , ACP_BT_TX_FIFOADDR , SW0_BT_TX_FIFO_ADDR ,
90104ACP_BT_TX_FIFOSIZE , SW0_BT_FIFO_SIZE , ACP_BT_TX_RINGBUFADDR , ACP_BT_TX_RINGBUFSIZE ,
91- ACP_BT_TX_DMA_SIZE , ACP_BT_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT , ACP_DSP0_INTR_CNTL , 3 }
105+ ACP_BT_TX_DMA_SIZE , ACP_BT_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT , ACP_DSP0_INTR_CNTL , 3 },
106+
107+ #if defined(CONFIG_ACP_7_0 )
108+ {ACP_P1_SW_Audio_RX_EN , ACP_P1_SW_Audio_RX_EN_STATUS , ACP_P1_AUDIO_RX_FIFOADDR , SW1_AUDIO_RX_FIFO_ADDR ,
109+ ACP_P1_AUDIO_RX_FIFOSIZE , SW1_AUDIO_FIFO_SIZE , ACP_P1_AUDIO_RX_RINGBUFADDR , ACP_P1_AUDIO_RX_RINGBUFSIZE ,
110+ ACP_P1_AUDIO_RX_DMA_SIZE , ACP_P1_AUDIO_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
111+ 4 },
112+
113+ {ACP_P1_SW_Audio_TX_EN , ACP_P1_SW_Audio_TX_EN_STATUS , ACP_P1_AUDIO_TX_FIFOADDR , SW1_AUDIO_TX_FIFO_ADDR ,
114+ ACP_P1_AUDIO_TX_FIFOSIZE , SW1_AUDIO_FIFO_SIZE , ACP_P1_AUDIO_TX_RINGBUFADDR , ACP_P1_AUDIO_TX_RINGBUFSIZE ,
115+ ACP_P1_AUDIO_TX_DMA_SIZE , ACP_P1_AUDIO_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
116+ 5 },
117+
118+ {ACP_P1_SW_Headset_RX_EN , ACP_P1_SW_Headset_RX_EN_STATUS , ACP_P1_HS_RX_FIFOADDR , SW1_HS_RX_FIFO_ADDR ,
119+ ACP_P1_HS_RX_FIFOSIZE , SW1_HS_FIFO_SIZE , ACP_P1_HS_RX_RINGBUFADDR , ACP_P1_HS_RX_RINGBUFSIZE ,
120+ ACP_P1_HS_RX_DMA_SIZE , ACP_P1_HS_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
121+ 0 },
122+
123+ {ACP_P1_SW_Headset_TX_EN , ACP_P1_SW_Headset_TX_EN_STATUS , ACP_P1_HS_TX_FIFOADDR , SW1_HS_TX_FIFO_ADDR ,
124+ ACP_P1_HS_TX_FIFOSIZE , SW1_HS_FIFO_SIZE , ACP_P1_HS_TX_RINGBUFADDR , ACP_P1_HS_TX_RINGBUFSIZE ,
125+ ACP_P1_HS_TX_DMA_SIZE , ACP_P1_HS_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
126+ 1 },
127+ #endif
92128};
93129
94130/* allocate next free DMA channel */
@@ -136,7 +172,7 @@ static int acp_dai_sw_audio_dma_start(struct dma_chan_data *channel)
136172 uint32_t acp_pdm_en ;
137173 int i ;
138174
139- for (i = 0 ; i < 8 ; i += 2 ) {
175+ for (i = 0 ; i < DMA_CH_COUNT ; i += 2 ) {
140176 sw0_audio_tx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i ].sw_dev_en );
141177 sw0_audio_rx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i + 1 ].sw_dev_en );
142178 }
@@ -208,7 +244,7 @@ static int acp_dai_sw_audio_dma_stop(struct dma_chan_data *channel)
208244 return - EINVAL ;
209245 }
210246
211- for (i = 0 ; i < 8 ; i += 2 ) {
247+ for (i = 0 ; i < DMA_CH_COUNT ; i += 2 ) {
212248 sw0_audio_tx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i ].sw_dev_en );
213249 sw0_audio_rx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i + 1 ].sw_dev_en );
214250 }
@@ -420,6 +456,10 @@ static int acp_dai_sw_audio_dma_interrupt(struct dma_chan_data *channel, enum dm
420456 switch (channel -> index ) {
421457 case SDW1_ACP_P1_SW_BT_TX_EN_CH :
422458 case SDW1_ACP_P1_SW_BT_RX_EN_CH :
459+ case SDW1_ACP_P1_SW_AUDIO_RX_EN_CH :
460+ case SDW1_ACP_P1_SW_AUDIO_TX_EN_CH :
461+ case SDW1_ACP_P1_SW_HS_RX_EN_CH :
462+ case SDW1_ACP_P1_SW_HS_TX_EN_CH :
423463 acp_intr_stat1 = (acp_dsp0_intr_stat1_t )dma_reg_read (channel -> dma ,
424464 sw_dev [channel -> index ].sw_dev_dma_intr_status );
425465 status = acp_intr_stat1 .bits .audio_buffer_int_stat ;
@@ -435,6 +475,10 @@ static int acp_dai_sw_audio_dma_interrupt(struct dma_chan_data *channel, enum dm
435475 switch (channel -> index ) {
436476 case SDW1_ACP_P1_SW_BT_TX_EN_CH :
437477 case SDW1_ACP_P1_SW_BT_RX_EN_CH :
478+ case SDW1_ACP_P1_SW_AUDIO_RX_EN_CH :
479+ case SDW1_ACP_P1_SW_AUDIO_TX_EN_CH :
480+ case SDW1_ACP_P1_SW_HS_RX_EN_CH :
481+ case SDW1_ACP_P1_SW_HS_TX_EN_CH :
438482 acp_intr_stat1 .u32all = 0 ;
439483 acp_intr_stat1 .bits .audio_buffer_int_stat =
440484 (1 << sw_dev [channel -> index ].statusindex );
@@ -456,6 +500,10 @@ static int acp_dai_sw_audio_dma_interrupt(struct dma_chan_data *channel, enum dm
456500 switch (channel -> index ) {
457501 case SDW1_ACP_P1_SW_BT_TX_EN_CH :
458502 case SDW1_ACP_P1_SW_BT_RX_EN_CH :
503+ case SDW1_ACP_P1_SW_AUDIO_RX_EN_CH :
504+ case SDW1_ACP_P1_SW_AUDIO_TX_EN_CH :
505+ case SDW1_ACP_P1_SW_HS_RX_EN_CH :
506+ case SDW1_ACP_P1_SW_HS_TX_EN_CH :
459507 acp_intr_cntl1 = (acp_dsp0_intr_cntl1_t )dma_reg_read (channel -> dma ,
460508 sw_dev [channel -> index ].sw_dev_dma_intr_cntl );
461509 acp_intr_cntl1 .bits .audio_buffer_int_mask &=
@@ -479,6 +527,10 @@ static int acp_dai_sw_audio_dma_interrupt(struct dma_chan_data *channel, enum dm
479527 switch (channel -> index ) {
480528 case SDW1_ACP_P1_SW_BT_TX_EN_CH :
481529 case SDW1_ACP_P1_SW_BT_RX_EN_CH :
530+ case SDW1_ACP_P1_SW_AUDIO_RX_EN_CH :
531+ case SDW1_ACP_P1_SW_AUDIO_TX_EN_CH :
532+ case SDW1_ACP_P1_SW_HS_RX_EN_CH :
533+ case SDW1_ACP_P1_SW_HS_TX_EN_CH :
482534 acp_intr_cntl1 = (acp_dsp0_intr_cntl1_t )dma_reg_read (channel -> dma ,
483535 sw_dev [channel -> index ].sw_dev_dma_intr_cntl );
484536 acp_intr_cntl1 .bits .audio_buffer_int_mask |=
0 commit comments