/* interrupt handler */ static irqreturn_t interrupt_hw(int irq, void *dev_id) { struct saa7146_dev *dev = dev_id; u32 isr; u32 ack_isr; /* read out the interrupt status register */ ack_isr = isr = saa7146_read(dev, ISR); /* is this our interrupt? */ if ( 0 == isr ) { /* nope, some other device */ return IRQ_NONE; } if (dev->ext) { if (dev->ext->irq_mask & isr) { if (dev->ext->irq_func) dev->ext->irq_func(dev, &isr); isr &= ~dev->ext->irq_mask; } } if (0 != (isr & (MASK_27))) { DEB_INT(("irq: RPS0 (0x%08x).\n",isr)); if (dev->vv_data && dev->vv_callback) dev->vv_callback(dev,isr); isr &= ~MASK_27; } if (0 != (isr & (MASK_28))) { if (dev->vv_data && dev->vv_callback) dev->vv_callback(dev,isr); isr &= ~MASK_28; } if (0 != (isr & (MASK_16|MASK_17))) { SAA7146_IER_DISABLE(dev, MASK_16|MASK_17); /* only wake up if we expect something */ if (0 != dev->i2c_op) { dev->i2c_op = 0; wake_up(&dev->i2c_wq); } else { u32 psr = saa7146_read(dev, PSR); u32 ssr = saa7146_read(dev, SSR); #ifdef CONFIG_DEBUG_PRINTK printk(KERN_WARNING "%s: unexpected i2c irq: isr %08x psr %08x ssr %08x\n", dev->name, isr, psr, ssr); #else ; #endif } isr &= ~(MASK_16|MASK_17); } if( 0 != isr ) { ERR(("warning: interrupt enabled, but not handled properly.(0x%08x)\n",isr)); ERR(("disabling interrupt source(s)!\n")); SAA7146_IER_DISABLE(dev,isr); } saa7146_write(dev, ISR, ack_isr); return IRQ_HANDLED; }
static irqreturn_t interrupt_hw(int irq, void *dev_id) { struct saa7146_dev *dev = dev_id; u32 isr; u32 ack_isr; ack_isr = isr = saa7146_read(dev, ISR); if ( 0 == isr ) { return IRQ_NONE; } if (dev->ext) { if (dev->ext->irq_mask & isr) { if (dev->ext->irq_func) dev->ext->irq_func(dev, &isr); isr &= ~dev->ext->irq_mask; } } if (0 != (isr & (MASK_27))) { DEB_INT("irq: RPS0 (0x%08x)\n", isr); if (dev->vv_data && dev->vv_callback) dev->vv_callback(dev,isr); isr &= ~MASK_27; } if (0 != (isr & (MASK_28))) { if (dev->vv_data && dev->vv_callback) dev->vv_callback(dev,isr); isr &= ~MASK_28; } if (0 != (isr & (MASK_16|MASK_17))) { SAA7146_IER_DISABLE(dev, MASK_16|MASK_17); if (0 != dev->i2c_op) { dev->i2c_op = 0; wake_up(&dev->i2c_wq); } else { u32 psr = saa7146_read(dev, PSR); u32 ssr = saa7146_read(dev, SSR); pr_warn("%s: unexpected i2c irq: isr %08x psr %08x ssr %08x\n", dev->name, isr, psr, ssr); } isr &= ~(MASK_16|MASK_17); } if( 0 != isr ) { ERR("warning: interrupt enabled, but not handled properly.(0x%08x)\n", isr); ERR("disabling interrupt source(s)!\n"); SAA7146_IER_DISABLE(dev,isr); } saa7146_write(dev, ISR, ack_isr); return IRQ_HANDLED; }
void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, int vbi) { struct saa7146_buf *buf,*next = NULL; BUG_ON(!q); DEB_INT(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi)); assert_spin_locked(&dev->slock); if (!list_empty(&q->queue)) { /* activate next one from queue */ buf = list_entry(q->queue.next,struct saa7146_buf,vb.queue); list_del(&buf->vb.queue); if (!list_empty(&q->queue)) next = list_entry(q->queue.next,struct saa7146_buf, vb.queue); q->curr = buf; DEB_INT(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next)); buf->activate(dev,buf,next); } else {