aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2012-10-26 17:05:46 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-11-11 17:51:06 -0500
commitda63a9f2e4a1595f4890e38a0511d74bea1a51f0 (patch)
treec42e511a3e25fb0950959df5aea81eb8a67d9803 /drivers/gpu/drm/i915/intel_dp.c
parent30add22d8459f8ac28d7ead366129224e0d17c43 (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.c59
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 */
48static bool is_edp(struct intel_dp *intel_dp) 48static 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
77static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp) 79static 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
82static struct intel_dp *intel_attached_dp(struct drm_connector *connector) 86static 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
1170void ironlake_edp_backlight_on(struct intel_dp *intel_dp) 1174void 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
1215static void ironlake_edp_pll_on(struct intel_dp *intel_dp) 1220static 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
1240static void ironlake_edp_pll_off(struct intel_dp *intel_dp) 1246static 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,
1773void 1780void
1774intel_dp_start_link_train(struct intel_dp *intel_dp) 1781intel_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)
1946static void 1953static void
1947intel_dp_link_down(struct intel_dp *intel_dp) 1954intel_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)
2102static void 2110static void
2103intel_dp_check_link_status(struct intel_dp *intel_dp) 2111intel_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
2425done: 2435done:
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
2455static void intel_dp_encoder_destroy(struct drm_encoder *encoder) 2465static 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
2468static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { 2479static 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)