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 |
