diff options
author | Vaibhav Hiremath <hvaibhav@ti.com> | 2010-03-27 08:37:07 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-17 23:52:43 -0400 |
commit | 085b54a24fd0c7353cd1b2d462879b7a4a4070fa (patch) | |
tree | 78cf85e84295e9713234ce38ffddddd86aad5374 /drivers/media/video/davinci | |
parent | fcc63274e69f95aee9dbb7c1dc3af3d2961813cc (diff) |
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>
Diffstat (limited to 'drivers/media/video/davinci')
-rw-r--r-- | drivers/media/video/davinci/vpfe_capture.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/media/video/davinci/vpfe_capture.c b/drivers/media/video/davinci/vpfe_capture.c index 398dbe71cb82..caeac199d15b 100644 --- a/drivers/media/video/davinci/vpfe_capture.c +++ b/drivers/media/video/davinci/vpfe_capture.c | |||
@@ -475,6 +475,11 @@ static int vpfe_initialize_device(struct vpfe_device *vpfe_dev) | |||
475 | ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev); | 475 | ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev); |
476 | if (!ret) | 476 | if (!ret) |
477 | vpfe_dev->initialized = 1; | 477 | vpfe_dev->initialized = 1; |
478 | |||
479 | /* Clear all VPFE/CCDC interrupts */ | ||
480 | if (vpfe_dev->cfg->clr_intr) | ||
481 | vpfe_dev->cfg->clr_intr(-1); | ||
482 | |||
478 | unlock: | 483 | unlock: |
479 | mutex_unlock(&ccdc_lock); | 484 | mutex_unlock(&ccdc_lock); |
480 | return ret; | 485 | return ret; |
@@ -562,7 +567,7 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id) | |||
562 | 567 | ||
563 | /* if streaming not started, don't do anything */ | 568 | /* if streaming not started, don't do anything */ |
564 | if (!vpfe_dev->started) | 569 | if (!vpfe_dev->started) |
565 | return IRQ_HANDLED; | 570 | goto clear_intr; |
566 | 571 | ||
567 | /* only for 6446 this will be applicable */ | 572 | /* only for 6446 this will be applicable */ |
568 | if (NULL != ccdc_dev->hw_ops.reset) | 573 | if (NULL != ccdc_dev->hw_ops.reset) |
@@ -574,7 +579,7 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id) | |||
574 | "frame format is progressive...\n"); | 579 | "frame format is progressive...\n"); |
575 | if (vpfe_dev->cur_frm != vpfe_dev->next_frm) | 580 | if (vpfe_dev->cur_frm != vpfe_dev->next_frm) |
576 | vpfe_process_buffer_complete(vpfe_dev); | 581 | vpfe_process_buffer_complete(vpfe_dev); |
577 | return IRQ_HANDLED; | 582 | goto clear_intr; |
578 | } | 583 | } |
579 | 584 | ||
580 | /* interlaced or TB capture check which field we are in hardware */ | 585 | /* 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) | |||
604 | addr += vpfe_dev->field_off; | 609 | addr += vpfe_dev->field_off; |
605 | ccdc_dev->hw_ops.setfbaddr(addr); | 610 | ccdc_dev->hw_ops.setfbaddr(addr); |
606 | } | 611 | } |
607 | return IRQ_HANDLED; | 612 | goto clear_intr; |
608 | } | 613 | } |
609 | /* | 614 | /* |
610 | * if one field is just being captured configure | 615 | * if one field is just being captured configure |
@@ -624,6 +629,10 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id) | |||
624 | */ | 629 | */ |
625 | vpfe_dev->field_id = fid; | 630 | vpfe_dev->field_id = fid; |
626 | } | 631 | } |
632 | clear_intr: | ||
633 | if (vpfe_dev->cfg->clr_intr) | ||
634 | vpfe_dev->cfg->clr_intr(irq); | ||
635 | |||
627 | return IRQ_HANDLED; | 636 | return IRQ_HANDLED; |
628 | } | 637 | } |
629 | 638 | ||
@@ -635,8 +644,11 @@ static irqreturn_t vdint1_isr(int irq, void *dev_id) | |||
635 | v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n"); | 644 | v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n"); |
636 | 645 | ||
637 | /* if streaming not started, don't do anything */ | 646 | /* if streaming not started, don't do anything */ |
638 | if (!vpfe_dev->started) | 647 | if (!vpfe_dev->started) { |
648 | if (vpfe_dev->cfg->clr_intr) | ||
649 | vpfe_dev->cfg->clr_intr(irq); | ||
639 | return IRQ_HANDLED; | 650 | return IRQ_HANDLED; |
651 | } | ||
640 | 652 | ||
641 | spin_lock(&vpfe_dev->dma_queue_lock); | 653 | spin_lock(&vpfe_dev->dma_queue_lock); |
642 | if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) && | 654 | if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) && |
@@ -644,6 +656,10 @@ static irqreturn_t vdint1_isr(int irq, void *dev_id) | |||
644 | vpfe_dev->cur_frm == vpfe_dev->next_frm) | 656 | vpfe_dev->cur_frm == vpfe_dev->next_frm) |
645 | vpfe_schedule_next_buffer(vpfe_dev); | 657 | vpfe_schedule_next_buffer(vpfe_dev); |
646 | spin_unlock(&vpfe_dev->dma_queue_lock); | 658 | spin_unlock(&vpfe_dev->dma_queue_lock); |
659 | |||
660 | if (vpfe_dev->cfg->clr_intr) | ||
661 | vpfe_dev->cfg->clr_intr(irq); | ||
662 | |||
647 | return IRQ_HANDLED; | 663 | return IRQ_HANDLED; |
648 | } | 664 | } |
649 | 665 | ||