diff options
Diffstat (limited to 'drivers/media/video/cx18/cx18-irq.c')
-rw-r--r-- | drivers/media/video/cx18/cx18-irq.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/media/video/cx18/cx18-irq.c b/drivers/media/video/cx18/cx18-irq.c index 447fc9c391ac..a366259bbb7b 100644 --- a/drivers/media/video/cx18/cx18-irq.c +++ b/drivers/media/video/cx18/cx18-irq.c | |||
@@ -142,16 +142,19 @@ irqreturn_t cx18_irq_handler(int irq, void *dev_id) | |||
142 | 142 | ||
143 | spin_lock(&cx->dma_reg_lock); | 143 | spin_lock(&cx->dma_reg_lock); |
144 | 144 | ||
145 | hw2_mask = cx18_read_reg(cx, HW2_INT_MASK5_PCI); | ||
146 | hw2 = cx18_read_reg(cx, HW2_INT_CLR_STATUS) & hw2_mask; | ||
147 | sw2_mask = cx18_read_reg(cx, SW2_INT_ENABLE_PCI) | IRQ_EPU_TO_HPU_ACK; | ||
148 | sw2 = cx18_read_reg(cx, SW2_INT_STATUS) & sw2_mask; | ||
149 | sw1_mask = cx18_read_reg(cx, SW1_INT_ENABLE_PCI) | IRQ_EPU_TO_HPU; | 145 | sw1_mask = cx18_read_reg(cx, SW1_INT_ENABLE_PCI) | IRQ_EPU_TO_HPU; |
150 | sw1 = cx18_read_reg(cx, SW1_INT_STATUS) & sw1_mask; | 146 | sw1 = cx18_read_reg(cx, SW1_INT_STATUS) & sw1_mask; |
147 | sw2_mask = cx18_read_reg(cx, SW2_INT_ENABLE_PCI) | IRQ_EPU_TO_HPU_ACK; | ||
148 | sw2 = cx18_read_reg(cx, SW2_INT_STATUS) & sw2_mask; | ||
149 | hw2_mask = cx18_read_reg(cx, HW2_INT_MASK5_PCI); | ||
150 | hw2 = cx18_read_reg(cx, HW2_INT_CLR_STATUS) & hw2_mask; | ||
151 | 151 | ||
152 | cx18_write_reg_noretry(cx, sw2&sw2_mask, SW2_INT_STATUS); | 152 | if (sw1) |
153 | cx18_write_reg_noretry(cx, sw1&sw1_mask, SW1_INT_STATUS); | 153 | cx18_write_reg_expect(cx, sw1, SW1_INT_STATUS, ~sw1, sw1); |
154 | cx18_write_reg_noretry(cx, hw2&hw2_mask, HW2_INT_CLR_STATUS); | 154 | if (sw2) |
155 | cx18_write_reg_expect(cx, sw2, SW2_INT_STATUS, ~sw2, sw2); | ||
156 | if (hw2) | ||
157 | cx18_write_reg_expect(cx, hw2, HW2_INT_CLR_STATUS, ~hw2, hw2); | ||
155 | 158 | ||
156 | if (sw1 || sw2 || hw2) | 159 | if (sw1 || sw2 || hw2) |
157 | CX18_DEBUG_HI_IRQ("SW1: %x SW2: %x HW2: %x\n", sw1, sw2, hw2); | 160 | CX18_DEBUG_HI_IRQ("SW1: %x SW2: %x HW2: %x\n", sw1, sw2, hw2); |
@@ -178,5 +181,5 @@ irqreturn_t cx18_irq_handler(int irq, void *dev_id) | |||
178 | hpu_cmd(cx, sw1); | 181 | hpu_cmd(cx, sw1); |
179 | spin_unlock(&cx->dma_reg_lock); | 182 | spin_unlock(&cx->dma_reg_lock); |
180 | 183 | ||
181 | return (hw2 | sw1 | sw2) ? IRQ_HANDLED : IRQ_NONE; | 184 | return (sw1 || sw2 || hw2) ? IRQ_HANDLED : IRQ_NONE; |
182 | } | 185 | } |