diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2012-10-26 17:05:46 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-11-11 17:51:06 -0500 |
commit | da63a9f2e4a1595f4890e38a0511d74bea1a51f0 (patch) | |
tree | c42e511a3e25fb0950959df5aea81eb8a67d9803 /drivers/gpu/drm/i915/intel_dp.c | |
parent | 30add22d8459f8ac28d7ead366129224e0d17c43 (diff) |
drm/i915: create intel_digital_port and use it
The goal is to have one single encoder capable of controlling both DP
and HDMI outputs. This patch just adds the initial infrastructure, no
functional changes.
Previously, both intel_dp and intel_hdmi were intel_encoders. Now,
these 2 structs do not have intel_encoder as members anymore. The new
struct intel_digital_port has intel_encoder as a member, and it also
includes intel_dp and intel_hdmi as members. In other words: see the
changes inside intel_drv.h: it's the most important change, everything
else is only to make it compile and work.
For now, each intel_digital_port is still only able to control one of
HDMI or DP, but not both together.
In the future we should also try to merge the common fields from
intel_dp and intel_hdmi (e.g., port).
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Damien Lespiau <damien.lespiau@intel.com>
[danvet: Add the missing ' ' spotted by Damien Lespiau.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 6cc6a5c81dc6..6810244fdb0c 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -47,7 +47,9 @@ | |||
47 | */ | 47 | */ |
48 | static bool is_edp(struct intel_dp *intel_dp) | 48 | static bool is_edp(struct intel_dp *intel_dp) |
49 | { | 49 | { |
50 | return intel_dp->base.type == INTEL_OUTPUT_EDP; | 50 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
51 | |||
52 | return intel_dig_port->base.type == INTEL_OUTPUT_EDP; | ||
51 | } | 53 | } |
52 | 54 | ||
53 | /** | 55 | /** |
@@ -76,7 +78,9 @@ static bool is_cpu_edp(struct intel_dp *intel_dp) | |||
76 | 78 | ||
77 | static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp) | 79 | static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp) |
78 | { | 80 | { |
79 | return intel_dp->base.base.dev; | 81 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
82 | |||
83 | return intel_dig_port->base.base.dev; | ||
80 | } | 84 | } |
81 | 85 | ||
82 | static struct intel_dp *intel_attached_dp(struct drm_connector *connector) | 86 | static struct intel_dp *intel_attached_dp(struct drm_connector *connector) |
@@ -1169,9 +1173,10 @@ void ironlake_edp_panel_off(struct intel_dp *intel_dp) | |||
1169 | 1173 | ||
1170 | void ironlake_edp_backlight_on(struct intel_dp *intel_dp) | 1174 | void ironlake_edp_backlight_on(struct intel_dp *intel_dp) |
1171 | { | 1175 | { |
1172 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1176 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
1177 | struct drm_device *dev = intel_dig_port->base.base.dev; | ||
1173 | struct drm_i915_private *dev_priv = dev->dev_private; | 1178 | struct drm_i915_private *dev_priv = dev->dev_private; |
1174 | int pipe = to_intel_crtc(intel_dp->base.base.crtc)->pipe; | 1179 | int pipe = to_intel_crtc(intel_dig_port->base.base.crtc)->pipe; |
1175 | u32 pp; | 1180 | u32 pp; |
1176 | 1181 | ||
1177 | if (!is_edp(intel_dp)) | 1182 | if (!is_edp(intel_dp)) |
@@ -1214,8 +1219,9 @@ void ironlake_edp_backlight_off(struct intel_dp *intel_dp) | |||
1214 | 1219 | ||
1215 | static void ironlake_edp_pll_on(struct intel_dp *intel_dp) | 1220 | static void ironlake_edp_pll_on(struct intel_dp *intel_dp) |
1216 | { | 1221 | { |
1217 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1222 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
1218 | struct drm_crtc *crtc = intel_dp->base.base.crtc; | 1223 | struct drm_crtc *crtc = intel_dig_port->base.base.crtc; |
1224 | struct drm_device *dev = crtc->dev; | ||
1219 | struct drm_i915_private *dev_priv = dev->dev_private; | 1225 | struct drm_i915_private *dev_priv = dev->dev_private; |
1220 | u32 dpa_ctl; | 1226 | u32 dpa_ctl; |
1221 | 1227 | ||
@@ -1239,8 +1245,9 @@ static void ironlake_edp_pll_on(struct intel_dp *intel_dp) | |||
1239 | 1245 | ||
1240 | static void ironlake_edp_pll_off(struct intel_dp *intel_dp) | 1246 | static void ironlake_edp_pll_off(struct intel_dp *intel_dp) |
1241 | { | 1247 | { |
1242 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1248 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
1243 | struct drm_crtc *crtc = intel_dp->base.base.crtc; | 1249 | struct drm_crtc *crtc = intel_dig_port->base.base.crtc; |
1250 | struct drm_device *dev = crtc->dev; | ||
1244 | struct drm_i915_private *dev_priv = dev->dev_private; | 1251 | struct drm_i915_private *dev_priv = dev->dev_private; |
1245 | u32 dpa_ctl; | 1252 | u32 dpa_ctl; |
1246 | 1253 | ||
@@ -1773,7 +1780,7 @@ intel_dp_set_link_train(struct intel_dp *intel_dp, | |||
1773 | void | 1780 | void |
1774 | intel_dp_start_link_train(struct intel_dp *intel_dp) | 1781 | intel_dp_start_link_train(struct intel_dp *intel_dp) |
1775 | { | 1782 | { |
1776 | struct drm_encoder *encoder = &intel_dp->base.base; | 1783 | struct drm_encoder *encoder = &dp_to_dig_port(intel_dp)->base.base; |
1777 | struct drm_device *dev = encoder->dev; | 1784 | struct drm_device *dev = encoder->dev; |
1778 | int i; | 1785 | int i; |
1779 | uint8_t voltage; | 1786 | uint8_t voltage; |
@@ -1946,7 +1953,8 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) | |||
1946 | static void | 1953 | static void |
1947 | intel_dp_link_down(struct intel_dp *intel_dp) | 1954 | intel_dp_link_down(struct intel_dp *intel_dp) |
1948 | { | 1955 | { |
1949 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1956 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
1957 | struct drm_device *dev = intel_dig_port->base.base.dev; | ||
1950 | struct drm_i915_private *dev_priv = dev->dev_private; | 1958 | struct drm_i915_private *dev_priv = dev->dev_private; |
1951 | uint32_t DP = intel_dp->DP; | 1959 | uint32_t DP = intel_dp->DP; |
1952 | 1960 | ||
@@ -1986,7 +1994,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
1986 | 1994 | ||
1987 | if (HAS_PCH_IBX(dev) && | 1995 | if (HAS_PCH_IBX(dev) && |
1988 | I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) { | 1996 | I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) { |
1989 | struct drm_crtc *crtc = intel_dp->base.base.crtc; | 1997 | struct drm_crtc *crtc = intel_dig_port->base.base.crtc; |
1990 | 1998 | ||
1991 | /* Hardware workaround: leaving our transcoder select | 1999 | /* Hardware workaround: leaving our transcoder select |
1992 | * set to transcoder B while it's off will prevent the | 2000 | * set to transcoder B while it's off will prevent the |
@@ -2102,13 +2110,14 @@ intel_dp_handle_test_request(struct intel_dp *intel_dp) | |||
2102 | static void | 2110 | static void |
2103 | intel_dp_check_link_status(struct intel_dp *intel_dp) | 2111 | intel_dp_check_link_status(struct intel_dp *intel_dp) |
2104 | { | 2112 | { |
2113 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; | ||
2105 | u8 sink_irq_vector; | 2114 | u8 sink_irq_vector; |
2106 | u8 link_status[DP_LINK_STATUS_SIZE]; | 2115 | u8 link_status[DP_LINK_STATUS_SIZE]; |
2107 | 2116 | ||
2108 | if (!intel_dp->base.connectors_active) | 2117 | if (!intel_encoder->connectors_active) |
2109 | return; | 2118 | return; |
2110 | 2119 | ||
2111 | if (WARN_ON(!intel_dp->base.base.crtc)) | 2120 | if (WARN_ON(!intel_encoder->base.crtc)) |
2112 | return; | 2121 | return; |
2113 | 2122 | ||
2114 | /* Try to read receiver status if the link appears to be up */ | 2123 | /* Try to read receiver status if the link appears to be up */ |
@@ -2139,7 +2148,7 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) | |||
2139 | 2148 | ||
2140 | if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) { | 2149 | if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) { |
2141 | DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", | 2150 | DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", |
2142 | drm_get_encoder_name(&intel_dp->base.base)); | 2151 | drm_get_encoder_name(&intel_encoder->base)); |
2143 | intel_dp_start_link_train(intel_dp); | 2152 | intel_dp_start_link_train(intel_dp); |
2144 | intel_dp_complete_link_train(intel_dp); | 2153 | intel_dp_complete_link_train(intel_dp); |
2145 | } | 2154 | } |
@@ -2368,7 +2377,8 @@ intel_dp_set_property(struct drm_connector *connector, | |||
2368 | { | 2377 | { |
2369 | struct drm_i915_private *dev_priv = connector->dev->dev_private; | 2378 | struct drm_i915_private *dev_priv = connector->dev->dev_private; |
2370 | struct intel_connector *intel_connector = to_intel_connector(connector); | 2379 | struct intel_connector *intel_connector = to_intel_connector(connector); |
2371 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 2380 | struct intel_encoder *intel_encoder = intel_attached_encoder(connector); |
2381 | struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base); | ||
2372 | int ret; | 2382 | int ret; |
2373 | 2383 | ||
2374 | ret = drm_connector_property_set_value(connector, property, val); | 2384 | ret = drm_connector_property_set_value(connector, property, val); |
@@ -2423,8 +2433,8 @@ intel_dp_set_property(struct drm_connector *connector, | |||
2423 | return -EINVAL; | 2433 | return -EINVAL; |
2424 | 2434 | ||
2425 | done: | 2435 | done: |
2426 | if (intel_dp->base.base.crtc) { | 2436 | if (intel_encoder->base.crtc) { |
2427 | struct drm_crtc *crtc = intel_dp->base.base.crtc; | 2437 | struct drm_crtc *crtc = intel_encoder->base.crtc; |
2428 | intel_set_mode(crtc, &crtc->mode, | 2438 | intel_set_mode(crtc, &crtc->mode, |
2429 | crtc->x, crtc->y, crtc->fb); | 2439 | crtc->x, crtc->y, crtc->fb); |
2430 | } | 2440 | } |
@@ -2454,7 +2464,8 @@ intel_dp_destroy(struct drm_connector *connector) | |||
2454 | 2464 | ||
2455 | static void intel_dp_encoder_destroy(struct drm_encoder *encoder) | 2465 | static void intel_dp_encoder_destroy(struct drm_encoder *encoder) |
2456 | { | 2466 | { |
2457 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | 2467 | struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); |
2468 | struct intel_dp *intel_dp = &intel_dig_port->dp; | ||
2458 | 2469 | ||
2459 | i2c_del_adapter(&intel_dp->adapter); | 2470 | i2c_del_adapter(&intel_dp->adapter); |
2460 | drm_encoder_cleanup(encoder); | 2471 | drm_encoder_cleanup(encoder); |
@@ -2462,7 +2473,7 @@ static void intel_dp_encoder_destroy(struct drm_encoder *encoder) | |||
2462 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | 2473 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); |
2463 | ironlake_panel_vdd_off_sync(intel_dp); | 2474 | ironlake_panel_vdd_off_sync(intel_dp); |
2464 | } | 2475 | } |
2465 | kfree(intel_dp); | 2476 | kfree(intel_dig_port); |
2466 | } | 2477 | } |
2467 | 2478 | ||
2468 | static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { | 2479 | static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { |
@@ -2680,14 +2691,16 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port) | |||
2680 | struct intel_dp *intel_dp; | 2691 | struct intel_dp *intel_dp; |
2681 | struct intel_encoder *intel_encoder; | 2692 | struct intel_encoder *intel_encoder; |
2682 | struct intel_connector *intel_connector; | 2693 | struct intel_connector *intel_connector; |
2694 | struct intel_digital_port *intel_dig_port; | ||
2683 | struct drm_display_mode *fixed_mode = NULL; | 2695 | struct drm_display_mode *fixed_mode = NULL; |
2684 | const char *name = NULL; | 2696 | const char *name = NULL; |
2685 | int type; | 2697 | int type; |
2686 | 2698 | ||
2687 | intel_dp = kzalloc(sizeof(struct intel_dp), GFP_KERNEL); | 2699 | intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL); |
2688 | if (!intel_dp) | 2700 | if (!intel_dig_port) |
2689 | return; | 2701 | return; |
2690 | 2702 | ||
2703 | intel_dp = &intel_dig_port->dp; | ||
2691 | intel_dp->output_reg = output_reg; | 2704 | intel_dp->output_reg = output_reg; |
2692 | intel_dp->port = port; | 2705 | intel_dp->port = port; |
2693 | /* Preserve the current hw state. */ | 2706 | /* Preserve the current hw state. */ |
@@ -2695,10 +2708,10 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port) | |||
2695 | 2708 | ||
2696 | intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); | 2709 | intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); |
2697 | if (!intel_connector) { | 2710 | if (!intel_connector) { |
2698 | kfree(intel_dp); | 2711 | kfree(intel_dig_port); |
2699 | return; | 2712 | return; |
2700 | } | 2713 | } |
2701 | intel_encoder = &intel_dp->base; | 2714 | intel_encoder = &intel_dig_port->base; |
2702 | intel_dp->attached_connector = intel_connector; | 2715 | intel_dp->attached_connector = intel_connector; |
2703 | 2716 | ||
2704 | if (HAS_PCH_SPLIT(dev) && output_reg == PCH_DP_D) | 2717 | if (HAS_PCH_SPLIT(dev) && output_reg == PCH_DP_D) |