12
12
#include <sof/lib/uuid.h>
13
13
#include <sof/trace/trace.h>
14
14
15
- #ifdef CONFIG_ACP_6_3
15
+ #if defined( CONFIG_ACP_6_3 ) || defined( CONFIG_ACP_7_0 )
16
16
17
17
SOF_DEFINE_REG_UUID (acp_sw_audio );
18
18
19
19
DECLARE_TR_CTX (acp_sw_audio_tr , SOF_UUID (acp_sw_audio_uuid ), LOG_LEVEL_INFO );
20
20
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
+
21
27
//initialization of soundwire-0 fifos(Audio, BT and HS)
22
28
#define SW0_AUDIO_FIFO_SIZE 128
23
29
#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);
31
37
#define SW0_HS_TX_FIFO_ADDR (SW0_BT_RX_FIFO_ADDR + SW0_BT_FIFO_SIZE)
32
38
#define SW0_HS_RX_FIFO_ADDR (SW0_HS_TX_FIFO_ADDR + SW0_HS_FIFO_SIZE)
33
39
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)
38
52
39
53
static uint32_t sw_audio_buff_size_playback ;
40
54
static uint32_t sw_audio_buff_size_capture ;
@@ -55,7 +69,7 @@ struct sw_dev_register {
55
69
uint32_t statusindex ;
56
70
};
57
71
58
- static struct sw_dev_register sw_dev [8 ] = {
72
+ static struct sw_dev_register sw_dev [DMA_CH_COUNT ] = {
59
73
{ACP_SW_HS_RX_EN , ACP_SW_HS_RX_EN_STATUS , ACP_HS_RX_FIFOADDR , SW0_HS_RX_FIFO_ADDR ,
60
74
ACP_HS_RX_FIFOSIZE , SW0_HS_FIFO_SIZE , ACP_HS_RX_RINGBUFADDR , ACP_HS_RX_RINGBUFSIZE ,
61
75
ACP_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_
64
78
ACP_HS_TX_FIFOSIZE , SW0_HS_FIFO_SIZE , ACP_HS_TX_RINGBUFADDR , ACP_HS_TX_RINGBUFSIZE ,
65
79
ACP_HS_TX_DMA_SIZE , ACP_HS_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT , ACP_DSP0_INTR_CNTL , 1 },
66
80
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 ,
69
83
ACP_P1_BT_RX_DMA_SIZE , ACP_P1_BT_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
70
84
2 },
71
85
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 ,
74
88
ACP_P1_BT_TX_DMA_SIZE , ACP_P1_BT_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 ,
75
89
3 },
76
90
@@ -88,7 +102,29 @@ ACP_BT_RX_DMA_SIZE, ACP_BT_RX_INTR_WATERMARK_SIZE, ACP_DSP0_INTR_STAT, ACP_DSP0_
88
102
89
103
{ACP_SW_BT_TX_EN , ACP_SW_BT_TX_EN_STATUS , ACP_BT_TX_FIFOADDR , SW0_BT_TX_FIFO_ADDR ,
90
104
ACP_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 ,
109
+ SW1_AUDIO_RX_FIFO_ADDR , ACP_P1_AUDIO_RX_FIFOSIZE , SW1_AUDIO_FIFO_SIZE ,
110
+ ACP_P1_AUDIO_RX_RINGBUFADDR , ACP_P1_AUDIO_RX_RINGBUFSIZE , ACP_P1_AUDIO_RX_DMA_SIZE ,
111
+ ACP_P1_AUDIO_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 , 4 },
112
+
113
+ {ACP_P1_SW_AUDIO_TX_EN , ACP_P1_SW_AUDIO_TX_EN_STATUS , ACP_P1_AUDIO_TX_FIFOADDR ,
114
+ SW1_AUDIO_TX_FIFO_ADDR , ACP_P1_AUDIO_TX_FIFOSIZE , SW1_AUDIO_FIFO_SIZE ,
115
+ ACP_P1_AUDIO_TX_RINGBUFADDR , ACP_P1_AUDIO_TX_RINGBUFSIZE , ACP_P1_AUDIO_TX_DMA_SIZE ,
116
+ ACP_P1_AUDIO_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 , 5 },
117
+
118
+ {ACP_P1_SW_HEADSET_RX_EN , ACP_P1_SW_HEADSET_RX_EN_STATUS , ACP_P1_HS_RX_FIFOADDR ,
119
+ SW1_HS_RX_FIFO_ADDR , ACP_P1_HS_RX_FIFOSIZE , SW1_HS_FIFO_SIZE ,
120
+ ACP_P1_HS_RX_RINGBUFADDR , ACP_P1_HS_RX_RINGBUFSIZE , ACP_P1_HS_RX_DMA_SIZE ,
121
+ ACP_P1_HS_RX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 , 0 },
122
+
123
+ {ACP_P1_SW_HEADSET_TX_EN , ACP_P1_SW_HEADSET_TX_EN_STATUS , ACP_P1_HS_TX_FIFOADDR ,
124
+ SW1_HS_TX_FIFO_ADDR , ACP_P1_HS_TX_FIFOSIZE , SW1_HS_FIFO_SIZE ,
125
+ ACP_P1_HS_TX_RINGBUFADDR , ACP_P1_HS_TX_RINGBUFSIZE , ACP_P1_HS_TX_DMA_SIZE ,
126
+ ACP_P1_HS_TX_INTR_WATERMARK_SIZE , ACP_DSP0_INTR_STAT1 , ACP_DSP0_INTR_CNTL1 , 1 },
127
+ #endif
92
128
};
93
129
94
130
/* allocate next free DMA channel */
@@ -136,7 +172,7 @@ static int acp_dai_sw_audio_dma_start(struct dma_chan_data *channel)
136
172
uint32_t acp_pdm_en ;
137
173
int i ;
138
174
139
- for (i = 0 ; i < 8 ; i += 2 ) {
175
+ for (i = 0 ; i < DMA_CH_COUNT ; i += 2 ) {
140
176
sw0_audio_tx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i ].sw_dev_en );
141
177
sw0_audio_rx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i + 1 ].sw_dev_en );
142
178
}
@@ -208,7 +244,7 @@ static int acp_dai_sw_audio_dma_stop(struct dma_chan_data *channel)
208
244
return - EINVAL ;
209
245
}
210
246
211
- for (i = 0 ; i < 8 ; i += 2 ) {
247
+ for (i = 0 ; i < DMA_CH_COUNT ; i += 2 ) {
212
248
sw0_audio_tx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i ].sw_dev_en );
213
249
sw0_audio_rx_en |= io_reg_read (PU_REGISTER_BASE + sw_dev [i + 1 ].sw_dev_en );
214
250
}
@@ -420,6 +456,10 @@ static int acp_dai_sw_audio_dma_interrupt(struct dma_chan_data *channel, enum dm
420
456
switch (channel -> index ) {
421
457
case SDW1_ACP_P1_SW_BT_TX_EN_CH :
422
458
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 :
423
463
acp_intr_stat1 = (acp_dsp0_intr_stat1_t )dma_reg_read (channel -> dma ,
424
464
sw_dev [channel -> index ].sw_dev_dma_intr_status );
425
465
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
435
475
switch (channel -> index ) {
436
476
case SDW1_ACP_P1_SW_BT_TX_EN_CH :
437
477
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 :
438
482
acp_intr_stat1 .u32all = 0 ;
439
483
acp_intr_stat1 .bits .audio_buffer_int_stat =
440
484
(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
456
500
switch (channel -> index ) {
457
501
case SDW1_ACP_P1_SW_BT_TX_EN_CH :
458
502
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 :
459
507
acp_intr_cntl1 = (acp_dsp0_intr_cntl1_t )dma_reg_read (channel -> dma ,
460
508
sw_dev [channel -> index ].sw_dev_dma_intr_cntl );
461
509
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
479
527
switch (channel -> index ) {
480
528
case SDW1_ACP_P1_SW_BT_TX_EN_CH :
481
529
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 :
482
534
acp_intr_cntl1 = (acp_dsp0_intr_cntl1_t )dma_reg_read (channel -> dma ,
483
535
sw_dev [channel -> index ].sw_dev_dma_intr_cntl );
484
536
acp_intr_cntl1 .bits .audio_buffer_int_mask |=
0 commit comments