aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_lvds.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c51
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
813bool intel_is_dual_link_lvds(struct drm_device *dev) 814struct 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; 825bool 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
829static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) 832static 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 */
881void intel_lvds_init(struct drm_device *dev) 884void 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