]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
[media] media: ti-vpe: vpdma: Clear IRQs for individual lists
authorNikhil Devshatwar <nikhil.nd@ti.com>
Fri, 18 Nov 2016 23:20:24 +0000 (21:20 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 22 Nov 2016 09:49:55 +0000 (07:49 -0200)
VPDMA IRQs are registered for multiple lists
When clearing an IRQ for a list interrupt, all the
IRQs for the individual lists are to be cleared separately.

Signed-off-by: Nikhil Devshatwar <nikhil.nd@ti.com>
Signed-off-by: Benoit Parrot <bparrot@ti.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/platform/ti-vpe/vpdma.c
drivers/media/platform/ti-vpe/vpdma.h
drivers/media/platform/ti-vpe/vpe.c

index ffc281d2b0656e6cef8d556a7fb4e9ab26901d47..c0a4e035bc2a9517351931602814de7b3cc8f6e7 100644 (file)
@@ -953,12 +953,12 @@ unsigned int vpdma_get_list_mask(struct vpdma_data *vpdma, int irq_num)
 EXPORT_SYMBOL(vpdma_get_list_mask);
 
 /* clear previosuly occured list intterupts in the LIST_STAT register */
-void vpdma_clear_list_stat(struct vpdma_data *vpdma, int irq_num)
+void vpdma_clear_list_stat(struct vpdma_data *vpdma, int irq_num,
+                          int list_num)
 {
        u32 reg_addr = VPDMA_INT_LIST0_STAT + VPDMA_INTX_OFFSET * irq_num;
 
-       write_reg(vpdma, reg_addr,
-               read_reg(vpdma, reg_addr));
+       write_reg(vpdma, reg_addr, 3 << (list_num * 2));
 }
 EXPORT_SYMBOL(vpdma_clear_list_stat);
 
index f08f4370ce4a80624ee5a9b23ac9458590f5c84b..65961147e8f7092d4b484031e081cbd46a33e8fe 100644 (file)
@@ -244,7 +244,8 @@ int vpdma_list_cleanup(struct vpdma_data *vpdma, int list_num,
 /* vpdma list interrupt management */
 void vpdma_enable_list_complete_irq(struct vpdma_data *vpdma, int irq_num,
                int list_num, bool enable);
-void vpdma_clear_list_stat(struct vpdma_data *vpdma, int irq_num);
+void vpdma_clear_list_stat(struct vpdma_data *vpdma, int irq_num,
+                          int list_num);
 unsigned int vpdma_get_list_stat(struct vpdma_data *vpdma, int irq_num);
 unsigned int vpdma_get_list_mask(struct vpdma_data *vpdma, int irq_num);
 
index 151a9280bb85254645a9bdd5fae2dc59f5744f24..6fcdd0ea50e481c9ec25711854fe777a1de2e6bf 100644 (file)
@@ -1326,7 +1326,7 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data)
 
        if (irqst0) {
                if (irqst0 & VPE_INT0_LIST0_COMPLETE)
-                       vpdma_clear_list_stat(ctx->dev->vpdma, 0);
+                       vpdma_clear_list_stat(ctx->dev->vpdma, 0, 0);
 
                irqst0 &= ~(VPE_INT0_LIST0_COMPLETE);
        }