aboutsummaryrefslogtreecommitdiff
path: root/linux-core/drm_lock.c
diff options
context:
space:
mode:
authorMichel Dänzer <michel@tungstengraphics.com>2006-08-16 15:47:22 +0200
committerMichel Dänzer <michel@tungstengraphics.com>2006-09-28 15:41:35 +0200
commitd817cc1f30060fcc4a85a05b2de8a2a1687421b5 (patch)
treeda580f2b7ae12bca335a37773f64287167fc5085 /linux-core/drm_lock.c
parent0c7d7f43610f705e8536a949cf2407efaa5ec217 (diff)
Add support for interrupt triggered driver callback with lock held to DRM core.
Diffstat (limited to 'linux-core/drm_lock.c')
-rw-r--r--linux-core/drm_lock.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/linux-core/drm_lock.c b/linux-core/drm_lock.c
index 7aa00bc2..fa677bae 100644
--- a/linux-core/drm_lock.c
+++ b/linux-core/drm_lock.c
@@ -152,6 +152,7 @@ int drm_unlock(struct inode *inode, struct file *filp,
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev;
drm_lock_t lock;
+ unsigned int irqflags;
if (copy_from_user(&lock, (drm_lock_t __user *) arg, sizeof(lock)))
return -EFAULT;
@@ -162,6 +163,16 @@ int drm_unlock(struct inode *inode, struct file *filp,
return -EINVAL;
}
+ spin_lock_irqsave(&dev->tasklet_lock, irqflags);
+
+ if (dev->locked_tasklet_func) {
+ dev->locked_tasklet_func(dev);
+
+ dev->locked_tasklet_func = NULL;
+ }
+
+ spin_unlock_irqrestore(&dev->tasklet_lock, irqflags);
+
atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]);
/* kernel_context_switch isn't used by any of the x86 drm