diff options
author | Leif Delgass <ldelgass@users.sourceforge.net> | 2003-04-26 22:28:56 +0000 |
---|---|---|
committer | Leif Delgass <ldelgass@users.sourceforge.net> | 2003-04-26 22:28:56 +0000 |
commit | f2a0c5438dc83171de1007a68e4f98e35b5a8fbe (patch) | |
tree | f886e31d758dda4c3460465d0f6be13921efbe58 /linux/i830_irq.c | |
parent | a79adaab72bde726ce4c08184997f34b31014d9e (diff) |
Ensure driver has been initialized (dev_private != NULL) before installing
irq handler in DRM(irq_install). Modify all drivers to ensure irq
handler is removed before cleanup and cleanup is called at takedown.
Remove unused buffer private struct fields in i810, i830. Check for
lock on init/cleanup in all drivers except i810/i830. The current DDX
for i810 and i830 doesn't hold the lock on kernel init (FIXME?).
Diffstat (limited to 'linux/i830_irq.c')
-rw-r--r-- | linux/i830_irq.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/linux/i830_irq.c b/linux/i830_irq.c index cedafc0d..1fcd9f0a 100644 --- a/linux/i830_irq.c +++ b/linux/i830_irq.c @@ -41,12 +41,12 @@ void DRM(dma_service)(int irq, void *device, struct pt_regs *regs) drm_device_t *dev = (drm_device_t *)device; drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; u16 temp; - + temp = I830_READ16(I830REG_INT_IDENTITY_R); - printk("%s: %x\n", __FUNCTION__, temp); - - if(temp == 0) - return; + DRM_DEBUG("%x\n", temp); + + if (temp == 0) + return; I830_WRITE16(I830REG_INT_IDENTITY_R, temp); @@ -176,3 +176,34 @@ int i830_irq_wait( struct inode *inode, struct file *filp, unsigned int cmd, return i830_wait_irq( dev, irqwait.irq_seq ); } + +/* drm_dma.h hooks +*/ +void DRM(driver_irq_preinstall)( drm_device_t *dev ) { + drm_i830_private_t *dev_priv = + (drm_i830_private_t *)dev->dev_private; + + I830_WRITE16( I830REG_HWSTAM, 0xffff ); + I830_WRITE16( I830REG_INT_MASK_R, 0x0 ); + I830_WRITE16( I830REG_INT_ENABLE_R, 0x0 ); +} + +void DRM(driver_irq_postinstall)( drm_device_t *dev ) { + drm_i830_private_t *dev_priv = + (drm_i830_private_t *)dev->dev_private; + + I830_WRITE16( I830REG_INT_ENABLE_R, 0x2 ); + atomic_set(&dev_priv->irq_received, 0); + atomic_set(&dev_priv->irq_emitted, 0); + init_waitqueue_head(&dev_priv->irq_queue); +} + +void DRM(driver_irq_uninstall)( drm_device_t *dev ) { + drm_i830_private_t *dev_priv = + (drm_i830_private_t *)dev->dev_private; + if (!dev_priv) + return; + + I830_WRITE16( I830REG_INT_MASK_R, 0xffff ); + I830_WRITE16( I830REG_INT_ENABLE_R, 0x0 ); +} |