diff options
Diffstat (limited to 'linux/i830_dma.c')
-rw-r--r-- | linux/i830_dma.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/linux/i830_dma.c b/linux/i830_dma.c index d206d5b5..af9c1cb7 100644 --- a/linux/i830_dma.c +++ b/linux/i830_dma.c @@ -234,16 +234,24 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d, return retcode; } -static int i830_dma_cleanup(drm_device_t *dev) +int i830_dma_cleanup(drm_device_t *dev) { drm_device_dma_t *dma = dev->dma; - if(dev->dev_private) { +#if _HAVE_DMA_IRQ + /* Make sure interrupts are disabled here because the uninstall ioctl + * may not have been called from userspace and after dev_private + * is freed, it's too late. + */ + if (dev->irq) DRM(irq_uninstall)(dev); +#endif + + if (dev->dev_private) { int i; drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private; - if(dev_priv->ring.virtual_start) { + if (dev_priv->ring.virtual_start) { DRM(ioremapfree)((void *) dev_priv->ring.virtual_start, dev_priv->ring.Size); } @@ -255,14 +263,6 @@ static int i830_dma_cleanup(drm_device_t *dev) I830_WRITE(0x02080, 0x1ffff000); } - /* Disable interrupts here because after dev_private - * is freed, it's too late. - */ - if (dev->irq) { - I830_WRITE16( I830REG_INT_MASK_R, 0xffff ); - I830_WRITE16( I830REG_INT_ENABLE_R, 0x0 ); - } - DRM(free)(dev->dev_private, sizeof(drm_i830_private_t), DRM_MEM_DRIVER); dev->dev_private = NULL; |