diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 3 |
3 files changed, 23 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e522c702b04e..373c2a005ec1 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -5154,8 +5154,6 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 5154 | 5154 | ||
| 5155 | I915_WRITE(DSPCNTR(plane), dspcntr); | 5155 | I915_WRITE(DSPCNTR(plane), dspcntr); |
| 5156 | POSTING_READ(DSPCNTR(plane)); | 5156 | POSTING_READ(DSPCNTR(plane)); |
| 5157 | if (!HAS_PCH_SPLIT(dev)) | ||
| 5158 | intel_enable_plane(dev_priv, plane, pipe); | ||
| 5159 | 5157 | ||
| 5160 | ret = intel_pipe_set_base(crtc, x, y, old_fb); | 5158 | ret = intel_pipe_set_base(crtc, x, y, old_fb); |
| 5161 | 5159 | ||
| @@ -5605,9 +5603,9 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc) | |||
| 5605 | intel_clock_t clock; | 5603 | intel_clock_t clock; |
| 5606 | 5604 | ||
| 5607 | if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) | 5605 | if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) |
| 5608 | fp = FP0(pipe); | 5606 | fp = I915_READ(FP0(pipe)); |
| 5609 | else | 5607 | else |
| 5610 | fp = FP1(pipe); | 5608 | fp = I915_READ(FP1(pipe)); |
| 5611 | 5609 | ||
| 5612 | clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; | 5610 | clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; |
| 5613 | if (IS_PINEVIEW(dev)) { | 5611 | if (IS_PINEVIEW(dev)) { |
| @@ -6579,8 +6577,10 @@ intel_user_framebuffer_create(struct drm_device *dev, | |||
| 6579 | return ERR_PTR(-ENOENT); | 6577 | return ERR_PTR(-ENOENT); |
| 6580 | 6578 | ||
| 6581 | intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); | 6579 | intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); |
| 6582 | if (!intel_fb) | 6580 | if (!intel_fb) { |
| 6581 | drm_gem_object_unreference_unlocked(&obj->base); | ||
| 6583 | return ERR_PTR(-ENOMEM); | 6582 | return ERR_PTR(-ENOMEM); |
| 6583 | } | ||
| 6584 | 6584 | ||
| 6585 | ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj); | 6585 | ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj); |
| 6586 | if (ret) { | 6586 | if (ret) { |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index cb8578b7e443..a4d80314e7f8 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1470,7 +1470,8 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
| 1470 | 1470 | ||
| 1471 | if (!HAS_PCH_CPT(dev) && | 1471 | if (!HAS_PCH_CPT(dev) && |
| 1472 | I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) { | 1472 | I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) { |
| 1473 | struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc); | 1473 | struct drm_crtc *crtc = intel_dp->base.base.crtc; |
| 1474 | |||
| 1474 | /* Hardware workaround: leaving our transcoder select | 1475 | /* Hardware workaround: leaving our transcoder select |
| 1475 | * set to transcoder B while it's off will prevent the | 1476 | * set to transcoder B while it's off will prevent the |
| 1476 | * corresponding HDMI output on transcoder A. | 1477 | * corresponding HDMI output on transcoder A. |
| @@ -1485,7 +1486,19 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
| 1485 | /* Changes to enable or select take place the vblank | 1486 | /* Changes to enable or select take place the vblank |
| 1486 | * after being written. | 1487 | * after being written. |
| 1487 | */ | 1488 | */ |
| 1488 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 1489 | if (crtc == NULL) { |
| 1490 | /* We can arrive here never having been attached | ||
| 1491 | * to a CRTC, for instance, due to inheriting | ||
| 1492 | * random state from the BIOS. | ||
| 1493 | * | ||
| 1494 | * If the pipe is not running, play safe and | ||
| 1495 | * wait for the clocks to stabilise before | ||
| 1496 | * continuing. | ||
| 1497 | */ | ||
| 1498 | POSTING_READ(intel_dp->output_reg); | ||
| 1499 | msleep(50); | ||
| 1500 | } else | ||
| 1501 | intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe); | ||
| 1489 | } | 1502 | } |
| 1490 | 1503 | ||
| 1491 | I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); | 1504 | I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index a562bd2648c7..67cb076d271b 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -539,6 +539,9 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | |||
| 539 | struct drm_device *dev = dev_priv->dev; | 539 | struct drm_device *dev = dev_priv->dev; |
| 540 | struct drm_connector *connector = dev_priv->int_lvds_connector; | 540 | struct drm_connector *connector = dev_priv->int_lvds_connector; |
| 541 | 541 | ||
| 542 | if (dev->switch_power_state != DRM_SWITCH_POWER_ON) | ||
| 543 | return NOTIFY_OK; | ||
| 544 | |||
| 542 | /* | 545 | /* |
| 543 | * check and update the status of LVDS connector after receiving | 546 | * check and update the status of LVDS connector after receiving |
| 544 | * the LID nofication event. | 547 | * the LID nofication event. |
