summaryrefslogtreecommitdiff
path: root/linux/gamma_dma.c
diff options
context:
space:
mode:
authorLeif Delgass <ldelgass@users.sourceforge.net>2003-04-26 22:28:56 +0000
committerLeif Delgass <ldelgass@users.sourceforge.net>2003-04-26 22:28:56 +0000
commitf2a0c5438dc83171de1007a68e4f98e35b5a8fbe (patch)
treef886e31d758dda4c3460465d0f6be13921efbe58 /linux/gamma_dma.c
parenta79adaab72bde726ce4c08184997f34b31014d9e (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/gamma_dma.c')
-rw-r--r--linux/gamma_dma.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/linux/gamma_dma.c b/linux/gamma_dma.c
index 691c55a4..0aacc4e9 100644
--- a/linux/gamma_dma.c
+++ b/linux/gamma_dma.c
@@ -645,6 +645,14 @@ int gamma_do_cleanup_dma( drm_device_t *dev )
{
DRM_DEBUG( "%s\n", __FUNCTION__ );
+#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 ) {
drm_gamma_private_t *dev_priv = dev->dev_private;
@@ -666,6 +674,8 @@ int gamma_dma_init( struct inode *inode, struct file *filp,
drm_device_t *dev = priv->dev;
drm_gamma_init_t init;
+ LOCK_TEST_WITH_RETURN( dev, filp );
+
if ( copy_from_user( &init, (drm_gamma_init_t *)arg, sizeof(init) ) )
return -EFAULT;
@@ -838,6 +848,8 @@ void DRM(driver_irq_postinstall)( drm_device_t *dev ) {
void DRM(driver_irq_uninstall)( drm_device_t *dev ) {
drm_gamma_private_t *dev_priv =
(drm_gamma_private_t *)dev->dev_private;
+ if (!dev_priv)
+ return;
while(GAMMA_READ(GAMMA_INFIFOSPACE) < 3);