diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 76 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 33 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 2 |
13 files changed, 91 insertions, 77 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 14ecb4d13a1a..6d494432b19f 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -3598,14 +3598,12 @@ static int i8xx_irq_postinstall(struct drm_device *dev) | |||
| 3598 | ~(I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | 3598 | ~(I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | |
| 3599 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | 3599 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | |
| 3600 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | | 3600 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | |
| 3601 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT | | 3601 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT); |
| 3602 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | ||
| 3603 | I915_WRITE16(IMR, dev_priv->irq_mask); | 3602 | I915_WRITE16(IMR, dev_priv->irq_mask); |
| 3604 | 3603 | ||
| 3605 | I915_WRITE16(IER, | 3604 | I915_WRITE16(IER, |
| 3606 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | 3605 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | |
| 3607 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | 3606 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | |
| 3608 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT | | ||
| 3609 | I915_USER_INTERRUPT); | 3607 | I915_USER_INTERRUPT); |
| 3610 | POSTING_READ16(IER); | 3608 | POSTING_READ16(IER); |
| 3611 | 3609 | ||
| @@ -3767,14 +3765,12 @@ static int i915_irq_postinstall(struct drm_device *dev) | |||
| 3767 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | 3765 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | |
| 3768 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | 3766 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | |
| 3769 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | | 3767 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | |
| 3770 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT | | 3768 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT); |
| 3771 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | ||
| 3772 | 3769 | ||
| 3773 | enable_mask = | 3770 | enable_mask = |
| 3774 | I915_ASLE_INTERRUPT | | 3771 | I915_ASLE_INTERRUPT | |
| 3775 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | 3772 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | |
| 3776 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | 3773 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | |
| 3777 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT | | ||
| 3778 | I915_USER_INTERRUPT; | 3774 | I915_USER_INTERRUPT; |
| 3779 | 3775 | ||
| 3780 | if (I915_HAS_HOTPLUG(dev)) { | 3776 | if (I915_HAS_HOTPLUG(dev)) { |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 6095a998bdac..515d7123785d 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -851,7 +851,7 @@ void intel_crt_init(struct drm_device *dev) | |||
| 851 | if (!crt) | 851 | if (!crt) |
| 852 | return; | 852 | return; |
| 853 | 853 | ||
| 854 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 854 | intel_connector = intel_connector_alloc(); |
| 855 | if (!intel_connector) { | 855 | if (!intel_connector) { |
| 856 | kfree(crt); | 856 | kfree(crt); |
| 857 | return; | 857 | return; |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 47b9307da24b..3eb0efc2dd0d 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
| @@ -2200,7 +2200,7 @@ intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port) | |||
| 2200 | struct intel_connector *connector; | 2200 | struct intel_connector *connector; |
| 2201 | enum port port = intel_dig_port->port; | 2201 | enum port port = intel_dig_port->port; |
| 2202 | 2202 | ||
| 2203 | connector = kzalloc(sizeof(*connector), GFP_KERNEL); | 2203 | connector = intel_connector_alloc(); |
| 2204 | if (!connector) | 2204 | if (!connector) |
| 2205 | return NULL; | 2205 | return NULL; |
| 2206 | 2206 | ||
| @@ -2219,7 +2219,7 @@ intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port) | |||
| 2219 | struct intel_connector *connector; | 2219 | struct intel_connector *connector; |
| 2220 | enum port port = intel_dig_port->port; | 2220 | enum port port = intel_dig_port->port; |
| 2221 | 2221 | ||
| 2222 | connector = kzalloc(sizeof(*connector), GFP_KERNEL); | 2222 | connector = intel_connector_alloc(); |
| 2223 | if (!connector) | 2223 | if (!connector) |
| 2224 | return NULL; | 2224 | return NULL; |
| 2225 | 2225 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 75955fee6d24..d547d9c8dda2 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -5636,6 +5636,34 @@ static void intel_connector_check_state(struct intel_connector *connector) | |||
| 5636 | } | 5636 | } |
| 5637 | } | 5637 | } |
| 5638 | 5638 | ||
| 5639 | int intel_connector_init(struct intel_connector *connector) | ||
| 5640 | { | ||
| 5641 | struct drm_connector_state *connector_state; | ||
| 5642 | |||
| 5643 | connector_state = kzalloc(sizeof *connector_state, GFP_KERNEL); | ||
| 5644 | if (!connector_state) | ||
| 5645 | return -ENOMEM; | ||
| 5646 | |||
| 5647 | connector->base.state = connector_state; | ||
| 5648 | return 0; | ||
| 5649 | } | ||
| 5650 | |||
| 5651 | struct intel_connector *intel_connector_alloc(void) | ||
| 5652 | { | ||
| 5653 | struct intel_connector *connector; | ||
| 5654 | |||
| 5655 | connector = kzalloc(sizeof *connector, GFP_KERNEL); | ||
| 5656 | if (!connector) | ||
| 5657 | return NULL; | ||
| 5658 | |||
| 5659 | if (intel_connector_init(connector) < 0) { | ||
| 5660 | kfree(connector); | ||
| 5661 | return NULL; | ||
| 5662 | } | ||
| 5663 | |||
| 5664 | return connector; | ||
| 5665 | } | ||
| 5666 | |||
| 5639 | /* Even simpler default implementation, if there's really no special case to | 5667 | /* Even simpler default implementation, if there's really no special case to |
| 5640 | * consider. */ | 5668 | * consider. */ |
| 5641 | void intel_connector_dpms(struct drm_connector *connector, int mode) | 5669 | void intel_connector_dpms(struct drm_connector *connector, int mode) |
| @@ -13003,7 +13031,6 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 13003 | { | 13031 | { |
| 13004 | struct drm_i915_private *dev_priv = dev->dev_private; | 13032 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 13005 | struct intel_encoder *encoder; | 13033 | struct intel_encoder *encoder; |
| 13006 | struct drm_connector *connector; | ||
| 13007 | bool dpd_is_edp = false; | 13034 | bool dpd_is_edp = false; |
| 13008 | 13035 | ||
| 13009 | intel_lvds_init(dev); | 13036 | intel_lvds_init(dev); |
| @@ -13139,39 +13166,6 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 13139 | if (SUPPORTS_TV(dev)) | 13166 | if (SUPPORTS_TV(dev)) |
| 13140 | intel_tv_init(dev); | 13167 | intel_tv_init(dev); |
| 13141 | 13168 | ||
| 13142 | /* | ||
| 13143 | * FIXME: We don't have full atomic support yet, but we want to be | ||
| 13144 | * able to enable/test plane updates via the atomic interface in the | ||
| 13145 | * meantime. However as soon as we flip DRIVER_ATOMIC on, the DRM core | ||
| 13146 | * will take some atomic codepaths to lookup properties during | ||
| 13147 | * drmModeGetConnector() that unconditionally dereference | ||
| 13148 | * connector->state. | ||
| 13149 | * | ||
| 13150 | * We create a dummy connector state here for each connector to ensure | ||
| 13151 | * the DRM core doesn't try to dereference a NULL connector->state. | ||
| 13152 | * The actual connector properties will never be updated or contain | ||
| 13153 | * useful information, but since we're doing this specifically for | ||
| 13154 | * testing/debug of the plane operations (and only when a specific | ||
| 13155 | * kernel module option is given), that shouldn't really matter. | ||
| 13156 | * | ||
| 13157 | * We are also relying on these states to convert the legacy mode set | ||
| 13158 | * to use a drm_atomic_state struct. The states are kept consistent | ||
| 13159 | * with actual state, so that it is safe to rely on that instead of | ||
| 13160 | * the staged config. | ||
| 13161 | * | ||
| 13162 | * Once atomic support for crtc's + connectors lands, this loop should | ||
| 13163 | * be removed since we'll be setting up real connector state, which | ||
| 13164 | * will contain Intel-specific properties. | ||
| 13165 | */ | ||
| 13166 | list_for_each_entry(connector, | ||
| 13167 | &dev->mode_config.connector_list, | ||
| 13168 | head) { | ||
| 13169 | if (!WARN_ON(connector->state)) { | ||
| 13170 | connector->state = kzalloc(sizeof(*connector->state), | ||
| 13171 | GFP_KERNEL); | ||
| 13172 | } | ||
| 13173 | } | ||
| 13174 | |||
| 13175 | intel_psr_init(dev); | 13169 | intel_psr_init(dev); |
| 13176 | 13170 | ||
| 13177 | for_each_intel_encoder(dev, encoder) { | 13171 | for_each_intel_encoder(dev, encoder) { |
| @@ -14265,6 +14259,7 @@ void intel_modeset_gem_init(struct drm_device *dev) | |||
| 14265 | struct drm_i915_private *dev_priv = dev->dev_private; | 14259 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 14266 | struct drm_crtc *c; | 14260 | struct drm_crtc *c; |
| 14267 | struct drm_i915_gem_object *obj; | 14261 | struct drm_i915_gem_object *obj; |
| 14262 | int ret; | ||
| 14268 | 14263 | ||
| 14269 | mutex_lock(&dev->struct_mutex); | 14264 | mutex_lock(&dev->struct_mutex); |
| 14270 | intel_init_gt_powersave(dev); | 14265 | intel_init_gt_powersave(dev); |
| @@ -14289,16 +14284,18 @@ void intel_modeset_gem_init(struct drm_device *dev) | |||
| 14289 | * pinned & fenced. When we do the allocation it's too early | 14284 | * pinned & fenced. When we do the allocation it's too early |
| 14290 | * for this. | 14285 | * for this. |
| 14291 | */ | 14286 | */ |
| 14292 | mutex_lock(&dev->struct_mutex); | ||
| 14293 | for_each_crtc(dev, c) { | 14287 | for_each_crtc(dev, c) { |
| 14294 | obj = intel_fb_obj(c->primary->fb); | 14288 | obj = intel_fb_obj(c->primary->fb); |
| 14295 | if (obj == NULL) | 14289 | if (obj == NULL) |
| 14296 | continue; | 14290 | continue; |
| 14297 | 14291 | ||
| 14298 | if (intel_pin_and_fence_fb_obj(c->primary, | 14292 | mutex_lock(&dev->struct_mutex); |
| 14299 | c->primary->fb, | 14293 | ret = intel_pin_and_fence_fb_obj(c->primary, |
| 14300 | c->primary->state, | 14294 | c->primary->fb, |
| 14301 | NULL)) { | 14295 | c->primary->state, |
| 14296 | NULL); | ||
| 14297 | mutex_unlock(&dev->struct_mutex); | ||
| 14298 | if (ret) { | ||
| 14302 | DRM_ERROR("failed to pin boot fb on pipe %d\n", | 14299 | DRM_ERROR("failed to pin boot fb on pipe %d\n", |
| 14303 | to_intel_crtc(c)->pipe); | 14300 | to_intel_crtc(c)->pipe); |
| 14304 | drm_framebuffer_unreference(c->primary->fb); | 14301 | drm_framebuffer_unreference(c->primary->fb); |
| @@ -14306,7 +14303,6 @@ void intel_modeset_gem_init(struct drm_device *dev) | |||
| 14306 | update_state_fb(c->primary); | 14303 | update_state_fb(c->primary); |
| 14307 | } | 14304 | } |
| 14308 | } | 14305 | } |
| 14309 | mutex_unlock(&dev->struct_mutex); | ||
| 14310 | 14306 | ||
| 14311 | intel_backlight_register(dev); | 14307 | intel_backlight_register(dev); |
| 14312 | } | 14308 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index b70e635ccaf4..d0237102c27e 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -2742,11 +2742,6 @@ static void chv_pre_enable_dp(struct intel_encoder *encoder) | |||
| 2742 | 2742 | ||
| 2743 | /* Program Tx lane latency optimal setting*/ | 2743 | /* Program Tx lane latency optimal setting*/ |
| 2744 | for (i = 0; i < 4; i++) { | 2744 | for (i = 0; i < 4; i++) { |
| 2745 | /* Set the latency optimal bit */ | ||
| 2746 | data = (i == 1) ? 0x0 : 0x6; | ||
| 2747 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i), | ||
| 2748 | data << DPIO_FRC_LATENCY_SHFIT); | ||
| 2749 | |||
| 2750 | /* Set the upar bit */ | 2745 | /* Set the upar bit */ |
| 2751 | data = (i == 1) ? 0x0 : 0x1; | 2746 | data = (i == 1) ? 0x0 : 0x1; |
| 2752 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i), | 2747 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i), |
| @@ -5157,7 +5152,6 @@ static void intel_edp_drrs_downclock_work(struct work_struct *work) | |||
| 5157 | downclock_mode->vrefresh); | 5152 | downclock_mode->vrefresh); |
| 5158 | 5153 | ||
| 5159 | unlock: | 5154 | unlock: |
| 5160 | |||
| 5161 | mutex_unlock(&dev_priv->drrs.mutex); | 5155 | mutex_unlock(&dev_priv->drrs.mutex); |
| 5162 | } | 5156 | } |
| 5163 | 5157 | ||
| @@ -5179,12 +5173,17 @@ void intel_edp_drrs_invalidate(struct drm_device *dev, | |||
| 5179 | struct drm_crtc *crtc; | 5173 | struct drm_crtc *crtc; |
| 5180 | enum pipe pipe; | 5174 | enum pipe pipe; |
| 5181 | 5175 | ||
| 5182 | if (!dev_priv->drrs.dp) | 5176 | if (dev_priv->drrs.type == DRRS_NOT_SUPPORTED) |
| 5183 | return; | 5177 | return; |
| 5184 | 5178 | ||
| 5185 | cancel_delayed_work_sync(&dev_priv->drrs.work); | 5179 | cancel_delayed_work(&dev_priv->drrs.work); |
| 5186 | 5180 | ||
| 5187 | mutex_lock(&dev_priv->drrs.mutex); | 5181 | mutex_lock(&dev_priv->drrs.mutex); |
| 5182 | if (!dev_priv->drrs.dp) { | ||
| 5183 | mutex_unlock(&dev_priv->drrs.mutex); | ||
| 5184 | return; | ||
| 5185 | } | ||
| 5186 | |||
| 5188 | crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc; | 5187 | crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc; |
| 5189 | pipe = to_intel_crtc(crtc)->pipe; | 5188 | pipe = to_intel_crtc(crtc)->pipe; |
| 5190 | 5189 | ||
| @@ -5218,12 +5217,17 @@ void intel_edp_drrs_flush(struct drm_device *dev, | |||
| 5218 | struct drm_crtc *crtc; | 5217 | struct drm_crtc *crtc; |
| 5219 | enum pipe pipe; | 5218 | enum pipe pipe; |
| 5220 | 5219 | ||
| 5221 | if (!dev_priv->drrs.dp) | 5220 | if (dev_priv->drrs.type == DRRS_NOT_SUPPORTED) |
| 5222 | return; | 5221 | return; |
| 5223 | 5222 | ||
| 5224 | cancel_delayed_work_sync(&dev_priv->drrs.work); | 5223 | cancel_delayed_work(&dev_priv->drrs.work); |
| 5225 | 5224 | ||
| 5226 | mutex_lock(&dev_priv->drrs.mutex); | 5225 | mutex_lock(&dev_priv->drrs.mutex); |
| 5226 | if (!dev_priv->drrs.dp) { | ||
| 5227 | mutex_unlock(&dev_priv->drrs.mutex); | ||
| 5228 | return; | ||
| 5229 | } | ||
| 5230 | |||
| 5227 | crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc; | 5231 | crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc; |
| 5228 | pipe = to_intel_crtc(crtc)->pipe; | 5232 | pipe = to_intel_crtc(crtc)->pipe; |
| 5229 | dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits; | 5233 | dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits; |
| @@ -5294,6 +5298,9 @@ intel_dp_drrs_init(struct intel_connector *intel_connector, | |||
| 5294 | struct drm_i915_private *dev_priv = dev->dev_private; | 5298 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 5295 | struct drm_display_mode *downclock_mode = NULL; | 5299 | struct drm_display_mode *downclock_mode = NULL; |
| 5296 | 5300 | ||
| 5301 | INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work); | ||
| 5302 | mutex_init(&dev_priv->drrs.mutex); | ||
| 5303 | |||
| 5297 | if (INTEL_INFO(dev)->gen <= 6) { | 5304 | if (INTEL_INFO(dev)->gen <= 6) { |
| 5298 | DRM_DEBUG_KMS("DRRS supported for Gen7 and above\n"); | 5305 | DRM_DEBUG_KMS("DRRS supported for Gen7 and above\n"); |
| 5299 | return NULL; | 5306 | return NULL; |
| @@ -5312,10 +5319,6 @@ intel_dp_drrs_init(struct intel_connector *intel_connector, | |||
| 5312 | return NULL; | 5319 | return NULL; |
| 5313 | } | 5320 | } |
| 5314 | 5321 | ||
| 5315 | INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work); | ||
| 5316 | |||
| 5317 | mutex_init(&dev_priv->drrs.mutex); | ||
| 5318 | |||
| 5319 | dev_priv->drrs.type = dev_priv->vbt.drrs_type; | 5322 | dev_priv->drrs.type = dev_priv->vbt.drrs_type; |
| 5320 | 5323 | ||
| 5321 | dev_priv->drrs.refresh_rate_type = DRRS_HIGH_RR; | 5324 | dev_priv->drrs.refresh_rate_type = DRRS_HIGH_RR; |
| @@ -5587,7 +5590,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port) | |||
| 5587 | if (!intel_dig_port) | 5590 | if (!intel_dig_port) |
| 5588 | return; | 5591 | return; |
| 5589 | 5592 | ||
| 5590 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 5593 | intel_connector = intel_connector_alloc(); |
| 5591 | if (!intel_connector) { | 5594 | if (!intel_connector) { |
| 5592 | kfree(intel_dig_port); | 5595 | kfree(intel_dig_port); |
| 5593 | return; | 5596 | return; |
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 5329c855acce..5cb47482d29f 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
| @@ -415,7 +415,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo | |||
| 415 | struct drm_connector *connector; | 415 | struct drm_connector *connector; |
| 416 | int i; | 416 | int i; |
| 417 | 417 | ||
| 418 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 418 | intel_connector = intel_connector_alloc(); |
| 419 | if (!intel_connector) | 419 | if (!intel_connector) |
| 420 | return NULL; | 420 | return NULL; |
| 421 | 421 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 6036e3b73b7b..744db4d0c68f 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -930,6 +930,8 @@ void intel_crtc_restore_mode(struct drm_crtc *crtc); | |||
| 930 | void intel_crtc_control(struct drm_crtc *crtc, bool enable); | 930 | void intel_crtc_control(struct drm_crtc *crtc, bool enable); |
| 931 | void intel_crtc_update_dpms(struct drm_crtc *crtc); | 931 | void intel_crtc_update_dpms(struct drm_crtc *crtc); |
| 932 | void intel_encoder_destroy(struct drm_encoder *encoder); | 932 | void intel_encoder_destroy(struct drm_encoder *encoder); |
| 933 | int intel_connector_init(struct intel_connector *); | ||
| 934 | struct intel_connector *intel_connector_alloc(void); | ||
| 933 | void intel_connector_dpms(struct drm_connector *, int mode); | 935 | void intel_connector_dpms(struct drm_connector *, int mode); |
| 934 | bool intel_connector_get_hw_state(struct intel_connector *connector); | 936 | bool intel_connector_get_hw_state(struct intel_connector *connector); |
| 935 | void intel_modeset_check_state(struct drm_device *dev); | 937 | void intel_modeset_check_state(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 572251e9810b..51966426addf 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c | |||
| @@ -1007,7 +1007,7 @@ void intel_dsi_init(struct drm_device *dev) | |||
| 1007 | if (!intel_dsi) | 1007 | if (!intel_dsi) |
| 1008 | return; | 1008 | return; |
| 1009 | 1009 | ||
| 1010 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 1010 | intel_connector = intel_connector_alloc(); |
| 1011 | if (!intel_connector) { | 1011 | if (!intel_connector) { |
| 1012 | kfree(intel_dsi); | 1012 | kfree(intel_dsi); |
| 1013 | return; | 1013 | return; |
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 4ccd6c3f133d..770040ff486e 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
| @@ -469,7 +469,7 @@ void intel_dvo_init(struct drm_device *dev) | |||
| 469 | if (!intel_dvo) | 469 | if (!intel_dvo) |
| 470 | return; | 470 | return; |
| 471 | 471 | ||
| 472 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 472 | intel_connector = intel_connector_alloc(); |
| 473 | if (!intel_connector) { | 473 | if (!intel_connector) { |
| 474 | kfree(intel_dvo); | 474 | kfree(intel_dvo); |
| 475 | return; | 475 | return; |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index cacbafdad3ab..bfbe07b6ddce 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -1515,11 +1515,6 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder) | |||
| 1515 | 1515 | ||
| 1516 | /* Program Tx latency optimal setting */ | 1516 | /* Program Tx latency optimal setting */ |
| 1517 | for (i = 0; i < 4; i++) { | 1517 | for (i = 0; i < 4; i++) { |
| 1518 | /* Set the latency optimal bit */ | ||
| 1519 | data = (i == 1) ? 0x0 : 0x6; | ||
| 1520 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW11(ch, i), | ||
| 1521 | data << DPIO_FRC_LATENCY_SHFIT); | ||
| 1522 | |||
| 1523 | /* Set the upar bit */ | 1518 | /* Set the upar bit */ |
| 1524 | data = (i == 1) ? 0x0 : 0x1; | 1519 | data = (i == 1) ? 0x0 : 0x1; |
| 1525 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i), | 1520 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i), |
| @@ -1755,7 +1750,7 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port) | |||
| 1755 | if (!intel_dig_port) | 1750 | if (!intel_dig_port) |
| 1756 | return; | 1751 | return; |
| 1757 | 1752 | ||
| 1758 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 1753 | intel_connector = intel_connector_alloc(); |
| 1759 | if (!intel_connector) { | 1754 | if (!intel_connector) { |
| 1760 | kfree(intel_dig_port); | 1755 | kfree(intel_dig_port); |
| 1761 | return; | 1756 | return; |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 06d2da336f7c..5abda1d2c018 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -946,6 +946,12 @@ void intel_lvds_init(struct drm_device *dev) | |||
| 946 | return; | 946 | return; |
| 947 | } | 947 | } |
| 948 | 948 | ||
| 949 | if (intel_connector_init(&lvds_connector->base) < 0) { | ||
| 950 | kfree(lvds_connector); | ||
| 951 | kfree(lvds_encoder); | ||
| 952 | return; | ||
| 953 | } | ||
| 954 | |||
| 949 | lvds_encoder->attached_connector = lvds_connector; | 955 | lvds_encoder->attached_connector = lvds_connector; |
| 950 | 956 | ||
| 951 | intel_encoder = &lvds_encoder->base; | 957 | intel_encoder = &lvds_encoder->base; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index f5b7e1e7c5e0..e87d2f418de4 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2426,6 +2426,22 @@ intel_sdvo_add_hdmi_properties(struct intel_sdvo *intel_sdvo, | |||
| 2426 | } | 2426 | } |
| 2427 | } | 2427 | } |
| 2428 | 2428 | ||
| 2429 | static struct intel_sdvo_connector *intel_sdvo_connector_alloc(void) | ||
| 2430 | { | ||
| 2431 | struct intel_sdvo_connector *sdvo_connector; | ||
| 2432 | |||
| 2433 | sdvo_connector = kzalloc(sizeof(*sdvo_connector), GFP_KERNEL); | ||
| 2434 | if (!sdvo_connector) | ||
| 2435 | return NULL; | ||
| 2436 | |||
| 2437 | if (intel_connector_init(&sdvo_connector->base) < 0) { | ||
| 2438 | kfree(sdvo_connector); | ||
| 2439 | return NULL; | ||
| 2440 | } | ||
| 2441 | |||
| 2442 | return sdvo_connector; | ||
| 2443 | } | ||
| 2444 | |||
| 2429 | static bool | 2445 | static bool |
| 2430 | intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) | 2446 | intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) |
| 2431 | { | 2447 | { |
| @@ -2437,7 +2453,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) | |||
| 2437 | 2453 | ||
| 2438 | DRM_DEBUG_KMS("initialising DVI device %d\n", device); | 2454 | DRM_DEBUG_KMS("initialising DVI device %d\n", device); |
| 2439 | 2455 | ||
| 2440 | intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL); | 2456 | intel_sdvo_connector = intel_sdvo_connector_alloc(); |
| 2441 | if (!intel_sdvo_connector) | 2457 | if (!intel_sdvo_connector) |
| 2442 | return false; | 2458 | return false; |
| 2443 | 2459 | ||
| @@ -2491,7 +2507,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type) | |||
| 2491 | 2507 | ||
| 2492 | DRM_DEBUG_KMS("initialising TV type %d\n", type); | 2508 | DRM_DEBUG_KMS("initialising TV type %d\n", type); |
| 2493 | 2509 | ||
| 2494 | intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL); | 2510 | intel_sdvo_connector = intel_sdvo_connector_alloc(); |
| 2495 | if (!intel_sdvo_connector) | 2511 | if (!intel_sdvo_connector) |
| 2496 | return false; | 2512 | return false; |
| 2497 | 2513 | ||
| @@ -2570,7 +2586,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device) | |||
| 2570 | 2586 | ||
| 2571 | DRM_DEBUG_KMS("initialising LVDS device %d\n", device); | 2587 | DRM_DEBUG_KMS("initialising LVDS device %d\n", device); |
| 2572 | 2588 | ||
| 2573 | intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL); | 2589 | intel_sdvo_connector = intel_sdvo_connector_alloc(); |
| 2574 | if (!intel_sdvo_connector) | 2590 | if (!intel_sdvo_connector) |
| 2575 | return false; | 2591 | return false; |
| 2576 | 2592 | ||
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index bc1d9d740904..8b9d325bda3c 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -1621,7 +1621,7 @@ intel_tv_init(struct drm_device *dev) | |||
| 1621 | return; | 1621 | return; |
| 1622 | } | 1622 | } |
| 1623 | 1623 | ||
| 1624 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); | 1624 | intel_connector = intel_connector_alloc(); |
| 1625 | if (!intel_connector) { | 1625 | if (!intel_connector) { |
| 1626 | kfree(intel_tv); | 1626 | kfree(intel_tv); |
| 1627 | return; | 1627 | return; |
