Vaibhav,
In the interrupt handler, it is better to add something like below... The
same piece of code is repeated many times...
When ready to return IRQ_HANDLED
goto clear_int;
clear_int:
if (vpfe_dev->cfg->clr_intr)
vpfe_dev->cfg->clr_intr(irq);
return IRQ_HANDLED;
Murali Karicheri
Software Design Engineer
Texas Instruments Inc.
Germantown, MD 20874
phone: 301-407-9583
email: [email protected]
>-----Original Message-----
>From: Hiremath, Vaibhav
>Sent: Wednesday, November 18, 2009 6:35 AM
>To: [email protected]
>Cc: [email protected]; Karicheri, Muralidharan; Hiremath, Vaibhav
>Subject: [PATCH] VPFE Capture: Add call back function for interrupt clear
>to vpfe_cfg
>
>From: Vaibhav Hiremath <[email protected]>
>
>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 <[email protected]>
>---
> drivers/media/video/davinci/vpfe_capture.c | 26
>++++++++++++++++++++++++--
> include/media/davinci/vpfe_capture.h | 2 ++
> 2 files changed, 26 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/media/video/davinci/vpfe_capture.c
>b/drivers/media/video/davinci/vpfe_capture.c
>index 9b6b254..4c5152e 100644
>--- a/drivers/media/video/davinci/vpfe_capture.c
>+++ b/drivers/media/video/davinci/vpfe_capture.c
>@@ -563,6 +563,11 @@ static int vpfe_initialize_device(struct vpfe_device
>*vpfe_dev)
> ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev);
> if (!ret)
> vpfe_dev->initialized = 1;
>+
>+ /* Clear all VPFE/CCDC interrupts */
>+ if (vpfe_dev->cfg->clr_intr)
>+ vpfe_dev->cfg->clr_intr(-1);
>+
> unlock:
> mutex_unlock(&ccdc_lock);
> return ret;
>@@ -663,8 +668,11 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
> field = vpfe_dev->fmt.fmt.pix.field;
>
> /* 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;
>+ }
>
> /* only for 6446 this will be applicable */
> if (NULL != ccdc_dev->hw_ops.reset)
>@@ -676,6 +684,8 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
> "frame format is progressive...\n");
> if (vpfe_dev->cur_frm != vpfe_dev->next_frm)
> vpfe_process_buffer_complete(vpfe_dev);
>+ if (vpfe_dev->cfg->clr_intr)
>+ vpfe_dev->cfg->clr_intr(irq);
> return IRQ_HANDLED;
> }
>
>@@ -703,6 +713,8 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
> if (field == V4L2_FIELD_SEQ_TB)
> vpfe_schedule_bottom_field(vpfe_dev);
>
>+ if (vpfe_dev->cfg->clr_intr)
>+ vpfe_dev->cfg->clr_intr(irq);
> return IRQ_HANDLED;
> }
> /*
>@@ -723,6 +735,9 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
> */
> vpfe_dev->field_id = fid;
> }
>+ if (vpfe_dev->cfg->clr_intr)
>+ vpfe_dev->cfg->clr_intr(irq);
>+
> return IRQ_HANDLED;
> }
>
>@@ -734,8 +749,11 @@ static irqreturn_t vdint1_isr(int irq, void *dev_id)
> v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n");
>
> /* 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;
>+ }
>
> spin_lock(&vpfe_dev->dma_queue_lock);
> if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) &&
>@@ -743,6 +761,10 @@ static irqreturn_t vdint1_isr(int irq, void *dev_id)
> vpfe_dev->cur_frm == vpfe_dev->next_frm)
> vpfe_schedule_next_buffer(vpfe_dev);
> spin_unlock(&vpfe_dev->dma_queue_lock);
>+
>+ if (vpfe_dev->cfg->clr_intr)
>+ vpfe_dev->cfg->clr_intr(irq);
>+
> return IRQ_HANDLED;
> }
>
>diff --git a/include/media/davinci/vpfe_capture.h
>b/include/media/davinci/vpfe_capture.h
>index fc83d98..5a21265 100644
>--- a/include/media/davinci/vpfe_capture.h
>+++ b/include/media/davinci/vpfe_capture.h
>@@ -104,6 +104,8 @@ struct vpfe_config {
> char *ccdc;
> /* setup function for the input path */
> int (*setup_input)(enum vpfe_subdev_id id);
>+ /* Function for Clearing the interrupt */
>+ void (*clr_intr)(int vdint);
> /* number of clocks */
> int num_clocks;
> /* clocks used for vpfe capture */
>--
>1.6.2.4
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html