drm: fix radeon irq properly

After the previous fix in 2.6.12, this patch should properly fix the
radeon IRQ handling code.

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Dave Airlie <airlied@linux.ie>

authored by Dave Airlie and committed by Dave Airlie 6921e331 bc54fd1a

+13 -14
+13 -14
drivers/char/drm/radeon_irq.c
··· 35 35 #include "radeon_drm.h" 36 36 #include "radeon_drv.h" 37 37 38 + static __inline__ u32 radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv, u32 mask) 39 + { 40 + u32 irqs = RADEON_READ(RADEON_GEN_INT_STATUS) & mask; 41 + if (irqs) 42 + RADEON_WRITE(RADEON_GEN_INT_STATUS, irqs); 43 + return irqs; 44 + } 45 + 38 46 /* Interrupts - Used for device synchronization and flushing in the 39 47 * following circumstances: 40 48 * ··· 71 63 /* Only consider the bits we're interested in - others could be used 72 64 * outside the DRM 73 65 */ 74 - stat = RADEON_READ(RADEON_GEN_INT_STATUS) 75 - & (RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT); 66 + stat = radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK | 67 + RADEON_CRTC_VBLANK_STAT)); 76 68 if (!stat) 77 69 return IRQ_NONE; 78 70 ··· 88 80 drm_vbl_send_signals( dev ); 89 81 } 90 82 91 - /* Acknowledge interrupts we handle */ 92 - RADEON_WRITE(RADEON_GEN_INT_STATUS, stat); 93 83 return IRQ_HANDLED; 94 - } 95 - 96 - static __inline__ void radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv) 97 - { 98 - u32 tmp = RADEON_READ( RADEON_GEN_INT_STATUS ) 99 - & (RADEON_SW_INT_TEST_ACK | RADEON_CRTC_VBLANK_STAT); 100 - if (tmp) 101 - RADEON_WRITE( RADEON_GEN_INT_STATUS, tmp ); 102 84 } 103 85 104 86 static int radeon_emit_irq(drm_device_t *dev) ··· 139 141 return DRM_ERR(EINVAL); 140 142 } 141 143 142 - radeon_acknowledge_irqs( dev_priv ); 144 + radeon_acknowledge_irqs(dev_priv, RADEON_CRTC_VBLANK_STAT); 143 145 144 146 dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; 145 147 ··· 217 219 RADEON_WRITE( RADEON_GEN_INT_CNTL, 0 ); 218 220 219 221 /* Clear bits if they're already high */ 220 - radeon_acknowledge_irqs( dev_priv ); 222 + radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK | 223 + RADEON_CRTC_VBLANK_STAT)); 221 224 } 222 225 223 226 void radeon_driver_irq_postinstall( drm_device_t *dev ) {