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