if (done_a) { vino_frame_done(&vino_drvdata->a, fc_a); dprintk("channel A frame done, interrupt: %d\n", intr); } if (done_b) { vino_frame_done(&vino_drvdata->b, fc_b); dprintk("channel B frame done, interrupt: %d\n", intr); }  
static irqreturn_t vino_interrupt(int irq, void *dev_id, struct pt_regs *regs){	u32 intr;	unsigned int fc_a, fc_b;	int done_a = 0;	int done_b = 0;	spin_lock(&vino_drvdata->vino_lock);	intr = vino->intr_status;	fc_a = vino->a.field_counter / 2;	fc_b = vino->b.field_counter / 2;	// TODO: handle error-interrupts in some special way ? 	if (intr & VINO_INTSTAT_A) {		if (intr & VINO_INTSTAT_A_EOF) {			vino_drvdata->a.field++;			if (vino_drvdata->a.field > 1) {				vino_dma_stop(&vino_drvdata->a);				vino_clear_interrupt(&vino_drvdata->a);				vino_drvdata->a.field = 0;				done_a = 1;			}			dprintk("intr: channel A end-of-field interrupt: "				"%04x\n", intr);		} else {			vino_dma_stop(&vino_drvdata->a);			vino_clear_interrupt(&vino_drvdata->a);			done_a = 1;			dprintk("channel A error interrupt: %04x\n", intr);		}	}	if (intr & VINO_INTSTAT_B) {		if (intr & VINO_INTSTAT_B_EOF) {			vino_drvdata->b.field++;			if (vino_drvdata->b.field > 1) {				vino_dma_stop(&vino_drvdata->b);				vino_clear_interrupt(&vino_drvdata->b);				vino_drvdata->b.field = 0;				done_b = 1;			}			dprintk("intr: channel B end-of-field interrupt: "				"%04x\n", intr);		} else {			vino_dma_stop(&vino_drvdata->b);			vino_clear_interrupt(&vino_drvdata->b);			done_b = 1;			dprintk("channel B error interrupt: %04x\n", intr);		}	}	/* always remember to clear interrupt status */	vino->intr_status = ~intr;	spin_unlock(&vino_drvdata->vino_lock);	if (done_a) {		vino_frame_done(&vino_drvdata->a, fc_a);		dprintk("channel A frame done, interrupt: %d\n", intr);	}	if (done_b) {		vino_frame_done(&vino_drvdata->b, fc_b);		dprintk("channel B frame done, interrupt: %d\n", intr);	}	return IRQ_HANDLED;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/a637a114f36b94a1ad8b9867f43bac0414958420/vino.c/buggy/drivers/media/video/vino.c