diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 23599c36503f..cbc06596659a 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -2356,15 +2356,18 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder, | |||
2356 | struct drm_i915_private *dev_priv = dev->dev_private; | 2356 | struct drm_i915_private *dev_priv = dev->dev_private; |
2357 | enum intel_display_power_domain power_domain; | 2357 | enum intel_display_power_domain power_domain; |
2358 | u32 tmp; | 2358 | u32 tmp; |
2359 | bool ret; | ||
2359 | 2360 | ||
2360 | power_domain = intel_display_port_power_domain(encoder); | 2361 | power_domain = intel_display_port_power_domain(encoder); |
2361 | if (!intel_display_power_is_enabled(dev_priv, power_domain)) | 2362 | if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) |
2362 | return false; | 2363 | return false; |
2363 | 2364 | ||
2365 | ret = false; | ||
2366 | |||
2364 | tmp = I915_READ(intel_dp->output_reg); | 2367 | tmp = I915_READ(intel_dp->output_reg); |
2365 | 2368 | ||
2366 | if (!(tmp & DP_PORT_EN)) | 2369 | if (!(tmp & DP_PORT_EN)) |
2367 | return false; | 2370 | goto out; |
2368 | 2371 | ||
2369 | if (IS_GEN7(dev) && port == PORT_A) { | 2372 | if (IS_GEN7(dev) && port == PORT_A) { |
2370 | *pipe = PORT_TO_PIPE_CPT(tmp); | 2373 | *pipe = PORT_TO_PIPE_CPT(tmp); |
@@ -2375,7 +2378,9 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder, | |||
2375 | u32 trans_dp = I915_READ(TRANS_DP_CTL(p)); | 2378 | u32 trans_dp = I915_READ(TRANS_DP_CTL(p)); |
2376 | if (TRANS_DP_PIPE_TO_PORT(trans_dp) == port) { | 2379 | if (TRANS_DP_PIPE_TO_PORT(trans_dp) == port) { |
2377 | *pipe = p; | 2380 | *pipe = p; |
2378 | return true; | 2381 | ret = true; |
2382 | |||
2383 | goto out; | ||
2379 | } | 2384 | } |
2380 | } | 2385 | } |
2381 | 2386 | ||
@@ -2387,7 +2392,12 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder, | |||
2387 | *pipe = PORT_TO_PIPE(tmp); | 2392 | *pipe = PORT_TO_PIPE(tmp); |
2388 | } | 2393 | } |
2389 | 2394 | ||
2390 | return true; | 2395 | ret = true; |
2396 | |||
2397 | out: | ||
2398 | intel_display_power_put(dev_priv, power_domain); | ||
2399 | |||
2400 | return ret; | ||
2391 | } | 2401 | } |
2392 | 2402 | ||
2393 | static void intel_dp_get_config(struct intel_encoder *encoder, | 2403 | static void intel_dp_get_config(struct intel_encoder *encoder, |
@@ -4487,20 +4497,20 @@ static bool g4x_digital_port_connected(struct drm_i915_private *dev_priv, | |||
4487 | return I915_READ(PORT_HOTPLUG_STAT) & bit; | 4497 | return I915_READ(PORT_HOTPLUG_STAT) & bit; |
4488 | } | 4498 | } |
4489 | 4499 | ||
4490 | static bool vlv_digital_port_connected(struct drm_i915_private *dev_priv, | 4500 | static bool gm45_digital_port_connected(struct drm_i915_private *dev_priv, |
4491 | struct intel_digital_port *port) | 4501 | struct intel_digital_port *port) |
4492 | { | 4502 | { |
4493 | u32 bit; | 4503 | u32 bit; |
4494 | 4504 | ||
4495 | switch (port->port) { | 4505 | switch (port->port) { |
4496 | case PORT_B: | 4506 | case PORT_B: |
4497 | bit = PORTB_HOTPLUG_LIVE_STATUS_VLV; | 4507 | bit = PORTB_HOTPLUG_LIVE_STATUS_GM45; |
4498 | break; | 4508 | break; |
4499 | case PORT_C: | 4509 | case PORT_C: |
4500 | bit = PORTC_HOTPLUG_LIVE_STATUS_VLV; | 4510 | bit = PORTC_HOTPLUG_LIVE_STATUS_GM45; |
4501 | break; | 4511 | break; |
4502 | case PORT_D: | 4512 | case PORT_D: |
4503 | bit = PORTD_HOTPLUG_LIVE_STATUS_VLV; | 4513 | bit = PORTD_HOTPLUG_LIVE_STATUS_GM45; |
4504 | break; | 4514 | break; |
4505 | default: | 4515 | default: |
4506 | MISSING_CASE(port->port); | 4516 | MISSING_CASE(port->port); |
@@ -4548,12 +4558,12 @@ bool intel_digital_port_connected(struct drm_i915_private *dev_priv, | |||
4548 | { | 4558 | { |
4549 | if (HAS_PCH_IBX(dev_priv)) | 4559 | if (HAS_PCH_IBX(dev_priv)) |
4550 | return ibx_digital_port_connected(dev_priv, port); | 4560 | return ibx_digital_port_connected(dev_priv, port); |
4551 | if (HAS_PCH_SPLIT(dev_priv)) | 4561 | else if (HAS_PCH_SPLIT(dev_priv)) |
4552 | return cpt_digital_port_connected(dev_priv, port); | 4562 | return cpt_digital_port_connected(dev_priv, port); |
4553 | else if (IS_BROXTON(dev_priv)) | 4563 | else if (IS_BROXTON(dev_priv)) |
4554 | return bxt_digital_port_connected(dev_priv, port); | 4564 | return bxt_digital_port_connected(dev_priv, port); |
4555 | else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) | 4565 | else if (IS_GM45(dev_priv)) |
4556 | return vlv_digital_port_connected(dev_priv, port); | 4566 | return gm45_digital_port_connected(dev_priv, port); |
4557 | else | 4567 | else |
4558 | return g4x_digital_port_connected(dev_priv, port); | 4568 | return g4x_digital_port_connected(dev_priv, port); |
4559 | } | 4569 | } |