diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index e9082185a375..49550470483e 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -72,7 +72,7 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder, | |||
72 | enum pipe *pipe) | 72 | enum pipe *pipe) |
73 | { | 73 | { |
74 | struct drm_device *dev = encoder->base.dev; | 74 | struct drm_device *dev = encoder->base.dev; |
75 | struct drm_i915_private *dev_priv = dev->dev_private; | 75 | struct drm_i915_private *dev_priv = to_i915(dev); |
76 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); | 76 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); |
77 | enum intel_display_power_domain power_domain; | 77 | enum intel_display_power_domain power_domain; |
78 | u32 tmp; | 78 | u32 tmp; |
@@ -106,7 +106,7 @@ static void intel_lvds_get_config(struct intel_encoder *encoder, | |||
106 | struct intel_crtc_state *pipe_config) | 106 | struct intel_crtc_state *pipe_config) |
107 | { | 107 | { |
108 | struct drm_device *dev = encoder->base.dev; | 108 | struct drm_device *dev = encoder->base.dev; |
109 | struct drm_i915_private *dev_priv = dev->dev_private; | 109 | struct drm_i915_private *dev_priv = to_i915(dev); |
110 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); | 110 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); |
111 | u32 tmp, flags = 0; | 111 | u32 tmp, flags = 0; |
112 | 112 | ||
@@ -140,7 +140,7 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder) | |||
140 | { | 140 | { |
141 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); | 141 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); |
142 | struct drm_device *dev = encoder->base.dev; | 142 | struct drm_device *dev = encoder->base.dev; |
143 | struct drm_i915_private *dev_priv = dev->dev_private; | 143 | struct drm_i915_private *dev_priv = to_i915(dev); |
144 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 144 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
145 | const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode; | 145 | const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode; |
146 | int pipe = crtc->pipe; | 146 | int pipe = crtc->pipe; |
@@ -184,8 +184,8 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder) | |||
184 | * panels behave in the two modes. For now, let's just maintain the | 184 | * panels behave in the two modes. For now, let's just maintain the |
185 | * value we got from the BIOS. | 185 | * value we got from the BIOS. |
186 | */ | 186 | */ |
187 | temp &= ~LVDS_A3_POWER_MASK; | 187 | temp &= ~LVDS_A3_POWER_MASK; |
188 | temp |= lvds_encoder->a3_power; | 188 | temp |= lvds_encoder->a3_power; |
189 | 189 | ||
190 | /* Set the dithering flag on LVDS as needed, note that there is no | 190 | /* Set the dithering flag on LVDS as needed, note that there is no |
191 | * special lvds dither control bit on pch-split platforms, dithering is | 191 | * special lvds dither control bit on pch-split platforms, dithering is |
@@ -216,7 +216,7 @@ static void intel_enable_lvds(struct intel_encoder *encoder) | |||
216 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); | 216 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); |
217 | struct intel_connector *intel_connector = | 217 | struct intel_connector *intel_connector = |
218 | &lvds_encoder->attached_connector->base; | 218 | &lvds_encoder->attached_connector->base; |
219 | struct drm_i915_private *dev_priv = dev->dev_private; | 219 | struct drm_i915_private *dev_priv = to_i915(dev); |
220 | i915_reg_t ctl_reg, stat_reg; | 220 | i915_reg_t ctl_reg, stat_reg; |
221 | 221 | ||
222 | if (HAS_PCH_SPLIT(dev)) { | 222 | if (HAS_PCH_SPLIT(dev)) { |
@@ -231,7 +231,7 @@ static void intel_enable_lvds(struct intel_encoder *encoder) | |||
231 | 231 | ||
232 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON); | 232 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON); |
233 | POSTING_READ(lvds_encoder->reg); | 233 | POSTING_READ(lvds_encoder->reg); |
234 | if (wait_for((I915_READ(stat_reg) & PP_ON) != 0, 1000)) | 234 | if (intel_wait_for_register(dev_priv, stat_reg, PP_ON, PP_ON, 1000)) |
235 | DRM_ERROR("timed out waiting for panel to power on\n"); | 235 | DRM_ERROR("timed out waiting for panel to power on\n"); |
236 | 236 | ||
237 | intel_panel_enable_backlight(intel_connector); | 237 | intel_panel_enable_backlight(intel_connector); |
@@ -241,7 +241,7 @@ static void intel_disable_lvds(struct intel_encoder *encoder) | |||
241 | { | 241 | { |
242 | struct drm_device *dev = encoder->base.dev; | 242 | struct drm_device *dev = encoder->base.dev; |
243 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); | 243 | struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); |
244 | struct drm_i915_private *dev_priv = dev->dev_private; | 244 | struct drm_i915_private *dev_priv = to_i915(dev); |
245 | i915_reg_t ctl_reg, stat_reg; | 245 | i915_reg_t ctl_reg, stat_reg; |
246 | 246 | ||
247 | if (HAS_PCH_SPLIT(dev)) { | 247 | if (HAS_PCH_SPLIT(dev)) { |
@@ -253,7 +253,7 @@ static void intel_disable_lvds(struct intel_encoder *encoder) | |||
253 | } | 253 | } |
254 | 254 | ||
255 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON); | 255 | I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON); |
256 | if (wait_for((I915_READ(stat_reg) & PP_ON) == 0, 1000)) | 256 | if (intel_wait_for_register(dev_priv, stat_reg, PP_ON, 0, 1000)) |
257 | DRM_ERROR("timed out waiting for panel to power off\n"); | 257 | DRM_ERROR("timed out waiting for panel to power off\n"); |
258 | 258 | ||
259 | I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) & ~LVDS_PORT_EN); | 259 | I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) & ~LVDS_PORT_EN); |
@@ -442,7 +442,7 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | |||
442 | container_of(nb, struct intel_lvds_connector, lid_notifier); | 442 | container_of(nb, struct intel_lvds_connector, lid_notifier); |
443 | struct drm_connector *connector = &lvds_connector->base.base; | 443 | struct drm_connector *connector = &lvds_connector->base.base; |
444 | struct drm_device *dev = connector->dev; | 444 | struct drm_device *dev = connector->dev; |
445 | struct drm_i915_private *dev_priv = dev->dev_private; | 445 | struct drm_i915_private *dev_priv = to_i915(dev); |
446 | 446 | ||
447 | if (dev->switch_power_state != DRM_SWITCH_POWER_ON) | 447 | if (dev->switch_power_state != DRM_SWITCH_POWER_ON) |
448 | return NOTIFY_OK; | 448 | return NOTIFY_OK; |
@@ -555,6 +555,7 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = { | |||
555 | .fill_modes = drm_helper_probe_single_connector_modes, | 555 | .fill_modes = drm_helper_probe_single_connector_modes, |
556 | .set_property = intel_lvds_set_property, | 556 | .set_property = intel_lvds_set_property, |
557 | .atomic_get_property = intel_connector_atomic_get_property, | 557 | .atomic_get_property = intel_connector_atomic_get_property, |
558 | .late_register = intel_connector_register, | ||
558 | .early_unregister = intel_connector_unregister, | 559 | .early_unregister = intel_connector_unregister, |
559 | .destroy = intel_lvds_destroy, | 560 | .destroy = intel_lvds_destroy, |
560 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, | 561 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, |
@@ -810,27 +811,29 @@ static const struct dmi_system_id intel_dual_link_lvds[] = { | |||
810 | { } /* terminating entry */ | 811 | { } /* terminating entry */ |
811 | }; | 812 | }; |
812 | 813 | ||
813 | bool intel_is_dual_link_lvds(struct drm_device *dev) | 814 | struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev) |
814 | { | 815 | { |
815 | struct intel_encoder *encoder; | 816 | struct intel_encoder *intel_encoder; |
816 | struct intel_lvds_encoder *lvds_encoder; | ||
817 | 817 | ||
818 | for_each_intel_encoder(dev, encoder) { | 818 | for_each_intel_encoder(dev, intel_encoder) |
819 | if (encoder->type == INTEL_OUTPUT_LVDS) { | 819 | if (intel_encoder->type == INTEL_OUTPUT_LVDS) |
820 | lvds_encoder = to_lvds_encoder(&encoder->base); | 820 | return intel_encoder; |
821 | 821 | ||
822 | return lvds_encoder->is_dual_link; | 822 | return NULL; |
823 | } | 823 | } |
824 | } | ||
825 | 824 | ||
826 | return false; | 825 | bool intel_is_dual_link_lvds(struct drm_device *dev) |
826 | { | ||
827 | struct intel_encoder *encoder = intel_get_lvds_encoder(dev); | ||
828 | |||
829 | return encoder && to_lvds_encoder(&encoder->base)->is_dual_link; | ||
827 | } | 830 | } |
828 | 831 | ||
829 | static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) | 832 | static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) |
830 | { | 833 | { |
831 | struct drm_device *dev = lvds_encoder->base.base.dev; | 834 | struct drm_device *dev = lvds_encoder->base.base.dev; |
832 | unsigned int val; | 835 | unsigned int val; |
833 | struct drm_i915_private *dev_priv = dev->dev_private; | 836 | struct drm_i915_private *dev_priv = to_i915(dev); |
834 | 837 | ||
835 | /* use the module option value if specified */ | 838 | /* use the module option value if specified */ |
836 | if (i915.lvds_channel_mode > 0) | 839 | if (i915.lvds_channel_mode > 0) |
@@ -880,7 +883,7 @@ static bool intel_lvds_supported(struct drm_device *dev) | |||
880 | */ | 883 | */ |
881 | void intel_lvds_init(struct drm_device *dev) | 884 | void intel_lvds_init(struct drm_device *dev) |
882 | { | 885 | { |
883 | struct drm_i915_private *dev_priv = dev->dev_private; | 886 | struct drm_i915_private *dev_priv = to_i915(dev); |
884 | struct intel_lvds_encoder *lvds_encoder; | 887 | struct intel_lvds_encoder *lvds_encoder; |
885 | struct intel_encoder *intel_encoder; | 888 | struct intel_encoder *intel_encoder; |
886 | struct intel_lvds_connector *lvds_connector; | 889 | struct intel_lvds_connector *lvds_connector; |
@@ -1118,6 +1121,7 @@ out: | |||
1118 | mutex_unlock(&dev->mode_config.mutex); | 1121 | mutex_unlock(&dev->mode_config.mutex); |
1119 | 1122 | ||
1120 | intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); | 1123 | intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); |
1124 | intel_panel_setup_backlight(connector, INVALID_PIPE); | ||
1121 | 1125 | ||
1122 | lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); | 1126 | lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); |
1123 | DRM_DEBUG_KMS("detected %s-link lvds configuration\n", | 1127 | DRM_DEBUG_KMS("detected %s-link lvds configuration\n", |
@@ -1130,9 +1134,6 @@ out: | |||
1130 | DRM_DEBUG_KMS("lid notifier registration failed\n"); | 1134 | DRM_DEBUG_KMS("lid notifier registration failed\n"); |
1131 | lvds_connector->lid_notifier.notifier_call = NULL; | 1135 | lvds_connector->lid_notifier.notifier_call = NULL; |
1132 | } | 1136 | } |
1133 | drm_connector_register(connector); | ||
1134 | |||
1135 | intel_panel_setup_backlight(connector, INVALID_PIPE); | ||
1136 | 1137 | ||
1137 | return; | 1138 | return; |
1138 | 1139 | ||