diff options
author | Dave Airlie <airlied@redhat.com> | 2009-12-07 23:03:47 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-12-07 23:03:47 -0500 |
commit | 3ff99164f67aae78a2bd2313f65ad55bddb1ffea (patch) | |
tree | d6bba03616d1be6ab9e6d9e92641a6f4047e1e15 /drivers/gpu/drm/drm_irq.c | |
parent | 1bd049fa895f9c6743f38b52ce14775f5a31ea63 (diff) | |
parent | f2b115e69d46344ae7afcaad5823496d2a0d8650 (diff) |
Merge remote branch 'anholt/drm-intel-next' into drm-linus
This merges the upstream Intel tree and fixes up numerous conflicts
due to patches merged into Linus tree later in -rc cycle.
Conflicts:
drivers/char/agp/intel-agp.c
drivers/gpu/drm/drm_dp_i2c_helper.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_suspend.c
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 6b3ce6d38848..7998ee66b317 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -429,15 +429,21 @@ int drm_vblank_get(struct drm_device *dev, int crtc) | |||
429 | 429 | ||
430 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 430 | spin_lock_irqsave(&dev->vbl_lock, irqflags); |
431 | /* Going from 0->1 means we have to enable interrupts again */ | 431 | /* Going from 0->1 means we have to enable interrupts again */ |
432 | if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1 && | 432 | if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) { |
433 | !dev->vblank_enabled[crtc]) { | 433 | if (!dev->vblank_enabled[crtc]) { |
434 | ret = dev->driver->enable_vblank(dev, crtc); | 434 | ret = dev->driver->enable_vblank(dev, crtc); |
435 | DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); | 435 | DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); |
436 | if (ret) | 436 | if (ret) |
437 | atomic_dec(&dev->vblank_refcount[crtc]); | ||
438 | else { | ||
439 | dev->vblank_enabled[crtc] = 1; | ||
440 | drm_update_vblank_count(dev, crtc); | ||
441 | } | ||
442 | } | ||
443 | } else { | ||
444 | if (!dev->vblank_enabled[crtc]) { | ||
437 | atomic_dec(&dev->vblank_refcount[crtc]); | 445 | atomic_dec(&dev->vblank_refcount[crtc]); |
438 | else { | 446 | ret = -EINVAL; |
439 | dev->vblank_enabled[crtc] = 1; | ||
440 | drm_update_vblank_count(dev, crtc); | ||
441 | } | 447 | } |
442 | } | 448 | } |
443 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | 449 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); |
@@ -464,6 +470,18 @@ void drm_vblank_put(struct drm_device *dev, int crtc) | |||
464 | } | 470 | } |
465 | EXPORT_SYMBOL(drm_vblank_put); | 471 | EXPORT_SYMBOL(drm_vblank_put); |
466 | 472 | ||
473 | void drm_vblank_off(struct drm_device *dev, int crtc) | ||
474 | { | ||
475 | unsigned long irqflags; | ||
476 | |||
477 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | ||
478 | DRM_WAKEUP(&dev->vbl_queue[crtc]); | ||
479 | dev->vblank_enabled[crtc] = 0; | ||
480 | dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc); | ||
481 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | ||
482 | } | ||
483 | EXPORT_SYMBOL(drm_vblank_off); | ||
484 | |||
467 | /** | 485 | /** |
468 | * drm_vblank_pre_modeset - account for vblanks across mode sets | 486 | * drm_vblank_pre_modeset - account for vblanks across mode sets |
469 | * @dev: DRM device | 487 | * @dev: DRM device |