@@ -27,26 +27,76 @@ const struct snd_acp_hw_ops acp_common_hw_ops = {
2727 /* ACP hardware initilizations */
2828 .acp_init = acp_init ,
2929 .acp_deinit = acp_deinit ,
30+
31+ /* ACP Interrupts*/
32+ .irq = acp_irq_handler ,
33+ .en_interrupts = acp_enable_interrupts ,
34+ .dis_interrupts = acp_disable_interrupts ,
3035};
3136EXPORT_SYMBOL_NS_GPL (acp_common_hw_ops , "SND_SOC_ACP_COMMON" );
32- void acp_enable_interrupts (struct acp_dev_data * adata )
37+
38+ irqreturn_t acp_irq_handler (int irq , void * data )
3339{
40+ struct acp_chip_info * chip = data ;
41+ struct acp_dev_data * adata = chip -> adata ;
3442 struct acp_resource * rsrc = adata -> rsrc ;
43+ struct acp_stream * stream ;
44+ u16 i2s_flag = 0 ;
45+ u32 ext_intr_stat , ext_intr_stat1 ;
46+
47+ if (adata -> rsrc -> no_of_ctrls == 2 )
48+ ext_intr_stat1 = readl (ACP_EXTERNAL_INTR_STAT (chip , (rsrc -> irqp_used - 1 )));
49+
50+ ext_intr_stat = readl (ACP_EXTERNAL_INTR_STAT (chip , rsrc -> irqp_used ));
51+
52+ spin_lock (& adata -> acp_lock );
53+ list_for_each_entry (stream , & adata -> stream_list , list ) {
54+ if (ext_intr_stat & stream -> irq_bit ) {
55+ writel (stream -> irq_bit ,
56+ ACP_EXTERNAL_INTR_STAT (chip , rsrc -> irqp_used ));
57+ snd_pcm_period_elapsed (stream -> substream );
58+ i2s_flag = 1 ;
59+ }
60+ if (adata -> rsrc -> no_of_ctrls == 2 ) {
61+ if (ext_intr_stat1 & stream -> irq_bit ) {
62+ writel (stream -> irq_bit , ACP_EXTERNAL_INTR_STAT (chip ,
63+ (rsrc -> irqp_used - 1 )));
64+ snd_pcm_period_elapsed (stream -> substream );
65+ i2s_flag = 1 ;
66+ }
67+ }
68+ }
69+ spin_unlock (& adata -> acp_lock );
70+ if (i2s_flag )
71+ return IRQ_HANDLED ;
72+
73+ return IRQ_NONE ;
74+ }
75+
76+ int acp_enable_interrupts (struct acp_chip_info * chip )
77+ {
78+ struct acp_resource * rsrc ;
3579 u32 ext_intr_ctrl ;
3680
37- writel (0x01 , ACP_EXTERNAL_INTR_ENB (adata ));
38- ext_intr_ctrl = readl (ACP_EXTERNAL_INTR_CNTL (adata , rsrc -> irqp_used ));
81+ rsrc = chip -> rsrc ;
82+ writel (0x01 , ACP_EXTERNAL_INTR_ENB (chip ));
83+ ext_intr_ctrl = readl (ACP_EXTERNAL_INTR_CNTL (chip , rsrc -> irqp_used ));
3984 ext_intr_ctrl |= ACP_ERROR_MASK ;
40- writel (ext_intr_ctrl , ACP_EXTERNAL_INTR_CNTL (adata , rsrc -> irqp_used ));
85+ writel (ext_intr_ctrl , ACP_EXTERNAL_INTR_CNTL (chip , rsrc -> irqp_used ));
86+
87+ return 0 ;
4188}
4289EXPORT_SYMBOL_NS_GPL (acp_enable_interrupts , "SND_SOC_ACP_COMMON" );
4390
44- void acp_disable_interrupts (struct acp_dev_data * adata )
91+ int acp_disable_interrupts (struct acp_chip_info * chip )
4592{
46- struct acp_resource * rsrc = adata -> rsrc ;
93+ struct acp_resource * rsrc ;
94+
95+ rsrc = chip -> rsrc ;
96+ writel (ACP_EXT_INTR_STAT_CLEAR_MASK , ACP_EXTERNAL_INTR_STAT (chip , rsrc -> irqp_used ));
97+ writel (0x00 , ACP_EXTERNAL_INTR_ENB (chip ));
4798
48- writel (ACP_EXT_INTR_STAT_CLEAR_MASK , ACP_EXTERNAL_INTR_STAT (adata , rsrc -> irqp_used ));
49- writel (0x00 , ACP_EXTERNAL_INTR_ENB (adata ));
99+ return 0 ;
50100}
51101EXPORT_SYMBOL_NS_GPL (acp_disable_interrupts , "SND_SOC_ACP_COMMON" );
52102
@@ -90,19 +140,23 @@ void restore_acp_pdm_params(struct snd_pcm_substream *substream,
90140 struct acp_dev_data * adata )
91141{
92142 struct snd_soc_dai * dai ;
143+ struct device * dev ;
144+ struct acp_chip_info * chip ;
93145 struct snd_soc_pcm_runtime * soc_runtime ;
94146 u32 ext_int_ctrl ;
95147
96148 soc_runtime = snd_soc_substream_to_rtd (substream );
97149 dai = snd_soc_rtd_to_cpu (soc_runtime , 0 );
150+ dev = dai -> component -> dev ;
151+ chip = dev_get_platdata (dev );
98152 /* Programming channel mask and sampling rate */
99153 writel (adata -> ch_mask , adata -> acp_base + ACP_WOV_PDM_NO_OF_CHANNELS );
100154 writel (PDM_DEC_64 , adata -> acp_base + ACP_WOV_PDM_DECIMATION_FACTOR );
101155
102156 /* Enabling ACP Pdm interuppts */
103- ext_int_ctrl = readl (ACP_EXTERNAL_INTR_CNTL (adata , 0 ));
157+ ext_int_ctrl = readl (ACP_EXTERNAL_INTR_CNTL (chip , 0 ));
104158 ext_int_ctrl |= PDM_DMA_INTR_MASK ;
105- writel (ext_int_ctrl , ACP_EXTERNAL_INTR_CNTL (adata , 0 ));
159+ writel (ext_int_ctrl , ACP_EXTERNAL_INTR_CNTL (chip , 0 ));
106160 set_acp_pdm_clk (substream , dai );
107161}
108162EXPORT_SYMBOL_NS_GPL (restore_acp_pdm_params , "SND_SOC_ACP_COMMON" );
@@ -113,6 +167,7 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,
113167 struct device * dev = dai -> component -> dev ;
114168 struct acp_dev_data * adata = dev_get_drvdata (dev );
115169 struct acp_resource * rsrc = adata -> rsrc ;
170+ struct acp_chip_info * chip = dev_get_platdata (dev );
116171 struct acp_stream * stream = substream -> runtime -> private_data ;
117172 u32 reg_dma_size , reg_fifo_size , reg_fifo_addr ;
118173 u32 phy_addr , acp_fifo_addr , ext_int_ctrl ;
@@ -185,15 +240,15 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,
185240 writel (acp_fifo_addr , adata -> acp_base + reg_fifo_addr );
186241 writel (FIFO_SIZE , adata -> acp_base + reg_fifo_size );
187242
188- ext_int_ctrl = readl (ACP_EXTERNAL_INTR_CNTL (adata , rsrc -> irqp_used ));
243+ ext_int_ctrl = readl (ACP_EXTERNAL_INTR_CNTL (chip , rsrc -> irqp_used ));
189244 ext_int_ctrl |= BIT (I2S_RX_THRESHOLD (rsrc -> offset )) |
190245 BIT (BT_RX_THRESHOLD (rsrc -> offset )) |
191246 BIT (I2S_TX_THRESHOLD (rsrc -> offset )) |
192247 BIT (BT_TX_THRESHOLD (rsrc -> offset )) |
193248 BIT (HS_RX_THRESHOLD (rsrc -> offset )) |
194249 BIT (HS_TX_THRESHOLD (rsrc -> offset ));
195250
196- writel (ext_int_ctrl , ACP_EXTERNAL_INTR_CNTL (adata , rsrc -> irqp_used ));
251+ writel (ext_int_ctrl , ACP_EXTERNAL_INTR_CNTL (chip , rsrc -> irqp_used ));
197252 return 0 ;
198253}
199254
0 commit comments