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: m-kariche...@ti.com

>-----Original Message-----
>From: Hiremath, Vaibhav
>Sent: Wednesday, November 18, 2009 6:35 AM
>To: linux-media@vger.kernel.org
>Cc: hverk...@xs4all.nl; Karicheri, Muralidharan; Hiremath, Vaibhav
>Subject: [PATCH] VPFE Capture: Add call back function for interrupt clear
>to vpfe_cfg
>
>From: Vaibhav Hiremath <hvaib...@ti.com>
>
>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 <hvaib...@ti.com>
>---
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to