1
0
Fork 0

V4L/DVB: V4L: vpfe_capture: Add call back function for interrupt clear for vpfe_cfg

For the devices like AM3517, it is expected that driver clears the
interrupt in ISR. Since this is device spcific, callback function
added to the platform_data.

Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: Muralidharan Karicheri <mkaricheri@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
hifive-unleashed-5.1
Vaibhav Hiremath 2010-03-27 09:37:07 -03:00 committed by Mauro Carvalho Chehab
parent fcc63274e6
commit 085b54a24f
2 changed files with 22 additions and 4 deletions

View File

@ -475,6 +475,11 @@ static int vpfe_initialize_device(struct vpfe_device *vpfe_dev)
ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev); ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev);
if (!ret) if (!ret)
vpfe_dev->initialized = 1; vpfe_dev->initialized = 1;
/* Clear all VPFE/CCDC interrupts */
if (vpfe_dev->cfg->clr_intr)
vpfe_dev->cfg->clr_intr(-1);
unlock: unlock:
mutex_unlock(&ccdc_lock); mutex_unlock(&ccdc_lock);
return ret; return ret;
@ -562,7 +567,7 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
/* if streaming not started, don't do anything */ /* if streaming not started, don't do anything */
if (!vpfe_dev->started) if (!vpfe_dev->started)
return IRQ_HANDLED; goto clear_intr;
/* only for 6446 this will be applicable */ /* only for 6446 this will be applicable */
if (NULL != ccdc_dev->hw_ops.reset) if (NULL != ccdc_dev->hw_ops.reset)
@ -574,7 +579,7 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
"frame format is progressive...\n"); "frame format is progressive...\n");
if (vpfe_dev->cur_frm != vpfe_dev->next_frm) if (vpfe_dev->cur_frm != vpfe_dev->next_frm)
vpfe_process_buffer_complete(vpfe_dev); vpfe_process_buffer_complete(vpfe_dev);
return IRQ_HANDLED; goto clear_intr;
} }
/* interlaced or TB capture check which field we are in hardware */ /* interlaced or TB capture check which field we are in hardware */
@ -604,7 +609,7 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
addr += vpfe_dev->field_off; addr += vpfe_dev->field_off;
ccdc_dev->hw_ops.setfbaddr(addr); ccdc_dev->hw_ops.setfbaddr(addr);
} }
return IRQ_HANDLED; goto clear_intr;
} }
/* /*
* if one field is just being captured configure * if one field is just being captured configure
@ -624,6 +629,10 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
*/ */
vpfe_dev->field_id = fid; vpfe_dev->field_id = fid;
} }
clear_intr:
if (vpfe_dev->cfg->clr_intr)
vpfe_dev->cfg->clr_intr(irq);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
@ -635,8 +644,11 @@ static irqreturn_t vdint1_isr(int irq, void *dev_id)
v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n"); v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n");
/* if streaming not started, don't do anything */ /* if streaming not started, don't do anything */
if (!vpfe_dev->started) if (!vpfe_dev->started) {
if (vpfe_dev->cfg->clr_intr)
vpfe_dev->cfg->clr_intr(irq);
return IRQ_HANDLED; return IRQ_HANDLED;
}
spin_lock(&vpfe_dev->dma_queue_lock); spin_lock(&vpfe_dev->dma_queue_lock);
if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) && if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) &&
@ -644,6 +656,10 @@ static irqreturn_t vdint1_isr(int irq, void *dev_id)
vpfe_dev->cur_frm == vpfe_dev->next_frm) vpfe_dev->cur_frm == vpfe_dev->next_frm)
vpfe_schedule_next_buffer(vpfe_dev); vpfe_schedule_next_buffer(vpfe_dev);
spin_unlock(&vpfe_dev->dma_queue_lock); spin_unlock(&vpfe_dev->dma_queue_lock);
if (vpfe_dev->cfg->clr_intr)
vpfe_dev->cfg->clr_intr(irq);
return IRQ_HANDLED; return IRQ_HANDLED;
} }

View File

@ -94,6 +94,8 @@ struct vpfe_config {
/* vpfe clock */ /* vpfe clock */
struct clk *vpssclk; struct clk *vpssclk;
struct clk *slaveclk; struct clk *slaveclk;
/* Function for Clearing the interrupt */
void (*clr_intr)(int vdint);
}; };
struct vpfe_device { struct vpfe_device {