[Sound-open-firmware] [PATCH_V4] cnl: dma: refine dma interrupt processing on cnl

rander.wang rander.wang at linux.intel.com
Tue Mar 13 13:06:50 CET 2018


Hi Liam,

On 3/13/2018 5:11 PM, Liam Girdwood wrote:
> On Tue, 2018-03-13 at 13:58 +0800, Rander Wang wrote:
>> On cnl, all the dma share the same interrupt pin, so
>> all the dma controller need to be checked in interrupt
>> function.
>>
>> ---
>> V4: refine code style
>>
>> Signed-off-by: Rander Wang <rander.wang at linux.intel.com>
>> ---
>>   src/drivers/dw-dma.c | 29 ++++++++++++++++++++++++++++-
>>   1 file changed, 28 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c
>> index 7659bec..690dafc 100644
>> --- a/src/drivers/dw-dma.c
>> +++ b/src/drivers/dw-dma.c
>> @@ -1032,7 +1032,7 @@ static int dw_dma_probe(struct dma *dma)
>>   #else
>>   
>>   /* this will probably be called at the end of every period copied */
>> -static void dw_dma_irq_handler(void *data)
>> +static void dma_irq_handler(void *data)
>>   {
>>   	struct dma *dma = (struct dma *)data;
>>   	struct dma_pdata *p = dma_get_drvdata(dma);
>> @@ -1138,6 +1138,33 @@ static void dw_dma_irq_handler(void *data)
>>   	}
>>   }
>>   
>> +#if defined CONFIG_CANNONLAKE
>> +/*All the dma share the same interrupt on CNL, so check each dma*/
>> +/*controller when interrupt coming, then do the work            */
>> +static void dw_dma_irq_handler(void *data)
>> +{
>> +	struct dma *dma;
>> +	uint32_t status_intr;
>> +
>> +	/*check interrupt status of DMA controller 0*/
>> +	dma = dma_get(DMA_GP_LP_DMAC0);
>> +	status_intr = dw_read(dma, DW_INTR_STATUS);
>> +	if (status_intr)
>> +		dma_irq_handler(dma);
>> +
>> +	/*check interrupt status of DMA controller 1*/
>> +	dma = dma_get(DMA_GP_LP_DMAC1);
>> +	status_intr = dw_read(dma, DW_INTR_STATUS);
>> +	if (status_intr)
>> +		dma_irq_handler(dma);
>> +}
>> +#else
>> +static void dw_dma_irq_handler(void *data)
>> +{
> Why do we have this wrapper ? If both DMA IRQ handlers have the same name we can
> register them once and wont need a wrapper.
>
> Liam
>
   you mean to check the platform in the dw_dma_irq_handler ? for marco 
definition DMA_GP_LP_DMAC0

is only available on CNL & APL, still need ifdef.

Rander

>
>
>> +	dma_irq_handler(data);
>> +}
>> +#endif
>> +
>>   static int dw_dma_probe(struct dma *dma)
>>   {
>>   	struct dma_pdata *dw_pdata;


More information about the Sound-open-firmware mailing list