aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/gma500
diff options
context:
space:
mode:
authorPatrik Jakobsson <patrik.r.jakobsson@gmail.com>2011-12-19 16:41:33 -0500
committerDave Airlie <airlied@redhat.com>2011-12-20 05:23:17 -0500
commit9bd81acdb648509dbbc32d4da0477c9fae0d6a73 (patch)
treeadfeea49b91ed3c7bf1590db3f0a331ab4ef1e98 /drivers/gpu/drm/gma500
parenta12d6a078e47e244a476b67c3f4b6ca03c138a99 (diff)
gma500: Convert Oaktrail to work with new output handling
Replace psb_intel_output with psb_intel_encoder and psb_intel_connector Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> [Changed Moorestown reference to Oaktrail] Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/gma500')
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_crtc.c18
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_hdmi.c29
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_lvds.c79
3 files changed, 79 insertions, 47 deletions
diff --git a/drivers/gpu/drm/gma500/oaktrail_crtc.c b/drivers/gpu/drm/gma500/oaktrail_crtc.c
index fe17e1f000b..9d12a3ee160 100644
--- a/drivers/gpu/drm/gma500/oaktrail_crtc.c
+++ b/drivers/gpu/drm/gma500/oaktrail_crtc.c
@@ -313,9 +313,9 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
313 bool is_crt = false, is_lvds = false, is_tv = false; 313 bool is_crt = false, is_lvds = false, is_tv = false;
314 bool is_mipi = false; 314 bool is_mipi = false;
315 struct drm_mode_config *mode_config = &dev->mode_config; 315 struct drm_mode_config *mode_config = &dev->mode_config;
316 struct psb_intel_output *psb_intel_output = NULL; 316 struct psb_intel_encoder *psb_intel_encoder = NULL;
317 uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN; 317 uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN;
318 struct drm_encoder *encoder; 318 struct drm_connector *connector;
319 319
320 if (!gma_power_begin(dev, true)) 320 if (!gma_power_begin(dev, true))
321 return 0; 321 return 0;
@@ -327,13 +327,13 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
327 adjusted_mode, 327 adjusted_mode,
328 sizeof(struct drm_display_mode)); 328 sizeof(struct drm_display_mode));
329 329
330 list_for_each_entry(encoder, &mode_config->encoder_list, head) { 330 list_for_each_entry(connector, &mode_config->connector_list, head) {
331 331 if (!connector->encoder || connector->encoder->crtc != crtc)
332 if (encoder->crtc != crtc)
333 continue; 332 continue;
334 333
335 psb_intel_output = enc_to_psb_intel_output(encoder); 334 psb_intel_encoder = psb_intel_attached_encoder(connector);
336 switch (psb_intel_output->type) { 335
336 switch (psb_intel_encoder->type) {
337 case INTEL_OUTPUT_LVDS: 337 case INTEL_OUTPUT_LVDS:
338 is_lvds = true; 338 is_lvds = true;
339 break; 339 break;
@@ -363,8 +363,8 @@ static int oaktrail_crtc_mode_set(struct drm_crtc *crtc,
363 ((mode->crtc_hdisplay - 1) << 16) | 363 ((mode->crtc_hdisplay - 1) << 16) |
364 (mode->crtc_vdisplay - 1)); 364 (mode->crtc_vdisplay - 1));
365 365
366 if (psb_intel_output) 366 if (psb_intel_encoder)
367 drm_connector_property_get_value(&psb_intel_output->base, 367 drm_connector_property_get_value(connector,
368 dev->mode_config.scaling_mode_property, &scalingType); 368 dev->mode_config.scaling_mode_property, &scalingType);
369 369
370 if (scalingType == DRM_MODE_SCALE_NO_SCALE) { 370 if (scalingType == DRM_MODE_SCALE_NO_SCALE) {
diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi.c b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
index 6f423c01c20..36878a60080 100644
--- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c
+++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
@@ -643,29 +643,33 @@ static const struct drm_encoder_funcs oaktrail_hdmi_enc_funcs = {
643void oaktrail_hdmi_init(struct drm_device *dev, 643void oaktrail_hdmi_init(struct drm_device *dev,
644 struct psb_intel_mode_device *mode_dev) 644 struct psb_intel_mode_device *mode_dev)
645{ 645{
646 struct psb_intel_output *psb_intel_output; 646 struct psb_intel_encoder *psb_intel_encoder;
647 struct psb_intel_connector *psb_intel_connector;
647 struct drm_connector *connector; 648 struct drm_connector *connector;
648 struct drm_encoder *encoder; 649 struct drm_encoder *encoder;
649 650
650 psb_intel_output = kzalloc(sizeof(struct psb_intel_output), GFP_KERNEL); 651 psb_intel_encoder = kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL);
651 if (!psb_intel_output) 652 if (!psb_intel_encoder)
652 return; 653 return;
653 654
654 psb_intel_output->mode_dev = mode_dev; 655 psb_intel_connector = kzalloc(sizeof(struct psb_intel_connector), GFP_KERNEL);
655 connector = &psb_intel_output->base; 656 if (!psb_intel_connector)
656 encoder = &psb_intel_output->enc; 657 goto failed_connector;
657 drm_connector_init(dev, &psb_intel_output->base, 658
659 connector = &psb_intel_connector->base;
660 encoder = &psb_intel_encoder->base;
661 drm_connector_init(dev, connector,
658 &oaktrail_hdmi_connector_funcs, 662 &oaktrail_hdmi_connector_funcs,
659 DRM_MODE_CONNECTOR_DVID); 663 DRM_MODE_CONNECTOR_DVID);
660 664
661 drm_encoder_init(dev, &psb_intel_output->enc, 665 drm_encoder_init(dev, encoder,
662 &oaktrail_hdmi_enc_funcs, 666 &oaktrail_hdmi_enc_funcs,
663 DRM_MODE_ENCODER_TMDS); 667 DRM_MODE_ENCODER_TMDS);
664 668
665 drm_mode_connector_attach_encoder(&psb_intel_output->base, 669 psb_intel_connector_attach_encoder(psb_intel_connector,
666 &psb_intel_output->enc); 670 psb_intel_encoder);
667 671
668 psb_intel_output->type = INTEL_OUTPUT_HDMI; 672 psb_intel_encoder->type = INTEL_OUTPUT_HDMI;
669 drm_encoder_helper_add(encoder, &oaktrail_hdmi_helper_funcs); 673 drm_encoder_helper_add(encoder, &oaktrail_hdmi_helper_funcs);
670 drm_connector_helper_add(connector, &oaktrail_hdmi_connector_helper_funcs); 674 drm_connector_helper_add(connector, &oaktrail_hdmi_connector_helper_funcs);
671 675
@@ -675,6 +679,9 @@ void oaktrail_hdmi_init(struct drm_device *dev,
675 drm_sysfs_connector_add(connector); 679 drm_sysfs_connector_add(connector);
676 680
677 return; 681 return;
682
683failed_connector:
684 kfree(psb_intel_encoder);
678} 685}
679 686
680static DEFINE_PCI_DEVICE_TABLE(hdmi_ids) = { 687static DEFINE_PCI_DEVICE_TABLE(hdmi_ids) = {
diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c b/drivers/gpu/drm/gma500/oaktrail_lvds.c
index 69659cad677..965d47cac0b 100644
--- a/drivers/gpu/drm/gma500/oaktrail_lvds.c
+++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c
@@ -43,7 +43,8 @@
43 * Sets the power state for the panel. 43 * Sets the power state for the panel.
44 */ 44 */
45static void oaktrail_lvds_set_power(struct drm_device *dev, 45static void oaktrail_lvds_set_power(struct drm_device *dev,
46 struct psb_intel_output *output, bool on) 46 struct psb_intel_encoder *psb_intel_encoder,
47 bool on)
47{ 48{
48 u32 pp_status; 49 u32 pp_status;
49 struct drm_psb_private *dev_priv = dev->dev_private; 50 struct drm_psb_private *dev_priv = dev->dev_private;
@@ -77,12 +78,13 @@ static void oaktrail_lvds_set_power(struct drm_device *dev,
77static void oaktrail_lvds_dpms(struct drm_encoder *encoder, int mode) 78static void oaktrail_lvds_dpms(struct drm_encoder *encoder, int mode)
78{ 79{
79 struct drm_device *dev = encoder->dev; 80 struct drm_device *dev = encoder->dev;
80 struct psb_intel_output *output = enc_to_psb_intel_output(encoder); 81 struct psb_intel_encoder *psb_intel_encoder =
82 to_psb_intel_encoder(encoder);
81 83
82 if (mode == DRM_MODE_DPMS_ON) 84 if (mode == DRM_MODE_DPMS_ON)
83 oaktrail_lvds_set_power(dev, output, true); 85 oaktrail_lvds_set_power(dev, psb_intel_encoder, true);
84 else 86 else
85 oaktrail_lvds_set_power(dev, output, false); 87 oaktrail_lvds_set_power(dev, psb_intel_encoder, false);
86 88
87 /* XXX: We never power down the LVDS pairs. */ 89 /* XXX: We never power down the LVDS pairs. */
88} 90}
@@ -91,10 +93,12 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
91 struct drm_display_mode *mode, 93 struct drm_display_mode *mode,
92 struct drm_display_mode *adjusted_mode) 94 struct drm_display_mode *adjusted_mode)
93{ 95{
94 struct psb_intel_mode_device *mode_dev =
95 enc_to_psb_intel_output(encoder)->mode_dev;
96 struct drm_device *dev = encoder->dev; 96 struct drm_device *dev = encoder->dev;
97 struct drm_psb_private *dev_priv = dev->dev_private; 97 struct drm_psb_private *dev_priv = dev->dev_private;
98 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
99 struct drm_mode_config *mode_config = &dev->mode_config;
100 struct drm_connector *connector = NULL;
101 struct drm_crtc *crtc = encoder->crtc;
98 u32 lvds_port; 102 u32 lvds_port;
99 uint64_t v = DRM_MODE_SCALE_FULLSCREEN; 103 uint64_t v = DRM_MODE_SCALE_FULLSCREEN;
100 104
@@ -118,8 +122,19 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
118 122
119 REG_WRITE(LVDS, lvds_port); 123 REG_WRITE(LVDS, lvds_port);
120 124
125 /* Find the connector we're trying to set up */
126 list_for_each_entry(connector, &mode_config->connector_list, head) {
127 if (!connector->encoder || connector->encoder->crtc != crtc)
128 continue;
129 }
130
131 if (!connector) {
132 DRM_ERROR("Couldn't find connector when setting mode");
133 return;
134 }
135
121 drm_connector_property_get_value( 136 drm_connector_property_get_value(
122 &enc_to_psb_intel_output(encoder)->base, 137 connector,
123 dev->mode_config.scaling_mode_property, 138 dev->mode_config.scaling_mode_property,
124 &v); 139 &v);
125 140
@@ -150,8 +165,10 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
150static void oaktrail_lvds_prepare(struct drm_encoder *encoder) 165static void oaktrail_lvds_prepare(struct drm_encoder *encoder)
151{ 166{
152 struct drm_device *dev = encoder->dev; 167 struct drm_device *dev = encoder->dev;
153 struct psb_intel_output *output = enc_to_psb_intel_output(encoder); 168 struct drm_psb_private *dev_priv = dev->dev_private;
154 struct psb_intel_mode_device *mode_dev = output->mode_dev; 169 struct psb_intel_encoder *psb_intel_encoder =
170 to_psb_intel_encoder(encoder);
171 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
155 172
156 if (!gma_power_begin(dev, true)) 173 if (!gma_power_begin(dev, true))
157 return; 174 return;
@@ -159,7 +176,7 @@ static void oaktrail_lvds_prepare(struct drm_encoder *encoder)
159 mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL); 176 mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL);
160 mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & 177 mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL &
161 BACKLIGHT_DUTY_CYCLE_MASK); 178 BACKLIGHT_DUTY_CYCLE_MASK);
162 oaktrail_lvds_set_power(dev, output, false); 179 oaktrail_lvds_set_power(dev, psb_intel_encoder, false);
163 gma_power_end(dev); 180 gma_power_end(dev);
164} 181}
165 182
@@ -185,13 +202,15 @@ static u32 oaktrail_lvds_get_max_backlight(struct drm_device *dev)
185static void oaktrail_lvds_commit(struct drm_encoder *encoder) 202static void oaktrail_lvds_commit(struct drm_encoder *encoder)
186{ 203{
187 struct drm_device *dev = encoder->dev; 204 struct drm_device *dev = encoder->dev;
188 struct psb_intel_output *output = enc_to_psb_intel_output(encoder); 205 struct drm_psb_private *dev_priv = dev->dev_private;
189 struct psb_intel_mode_device *mode_dev = output->mode_dev; 206 struct psb_intel_encoder *psb_intel_encoder =
207 to_psb_intel_encoder(encoder);
208 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
190 209
191 if (mode_dev->backlight_duty_cycle == 0) 210 if (mode_dev->backlight_duty_cycle == 0)
192 mode_dev->backlight_duty_cycle = 211 mode_dev->backlight_duty_cycle =
193 oaktrail_lvds_get_max_backlight(dev); 212 oaktrail_lvds_get_max_backlight(dev);
194 oaktrail_lvds_set_power(dev, output, true); 213 oaktrail_lvds_set_power(dev, psb_intel_encoder, true);
195} 214}
196 215
197static const struct drm_encoder_helper_funcs oaktrail_lvds_helper_funcs = { 216static const struct drm_encoder_helper_funcs oaktrail_lvds_helper_funcs = {
@@ -306,7 +325,8 @@ static void oaktrail_lvds_get_configuration_mode(struct drm_device *dev,
306void oaktrail_lvds_init(struct drm_device *dev, 325void oaktrail_lvds_init(struct drm_device *dev,
307 struct psb_intel_mode_device *mode_dev) 326 struct psb_intel_mode_device *mode_dev)
308{ 327{
309 struct psb_intel_output *psb_intel_output; 328 struct psb_intel_encoder *psb_intel_encoder;
329 struct psb_intel_connector *psb_intel_connector;
310 struct drm_connector *connector; 330 struct drm_connector *connector;
311 struct drm_encoder *encoder; 331 struct drm_encoder *encoder;
312 struct drm_psb_private *dev_priv = 332 struct drm_psb_private *dev_priv =
@@ -316,24 +336,27 @@ void oaktrail_lvds_init(struct drm_device *dev,
316 struct i2c_adapter *i2c_adap; 336 struct i2c_adapter *i2c_adap;
317 struct drm_display_mode *scan; /* *modes, *bios_mode; */ 337 struct drm_display_mode *scan; /* *modes, *bios_mode; */
318 338
319 psb_intel_output = kzalloc(sizeof(struct psb_intel_output), GFP_KERNEL); 339 psb_intel_encoder = kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL);
320 if (!psb_intel_output) 340 if (!psb_intel_encoder)
321 return; 341 return;
322 342
323 psb_intel_output->mode_dev = mode_dev; 343 psb_intel_connector = kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL);
324 connector = &psb_intel_output->base; 344 if (!psb_intel_connector)
325 encoder = &psb_intel_output->enc; 345 goto failed_connector;
346
347 connector = &psb_intel_connector->base;
348 encoder = &psb_intel_encoder->base;
326 dev_priv->is_lvds_on = true; 349 dev_priv->is_lvds_on = true;
327 drm_connector_init(dev, &psb_intel_output->base, 350 drm_connector_init(dev, connector,
328 &psb_intel_lvds_connector_funcs, 351 &psb_intel_lvds_connector_funcs,
329 DRM_MODE_CONNECTOR_LVDS); 352 DRM_MODE_CONNECTOR_LVDS);
330 353
331 drm_encoder_init(dev, &psb_intel_output->enc, &psb_intel_lvds_enc_funcs, 354 drm_encoder_init(dev, encoder, &psb_intel_lvds_enc_funcs,
332 DRM_MODE_ENCODER_LVDS); 355 DRM_MODE_ENCODER_LVDS);
333 356
334 drm_mode_connector_attach_encoder(&psb_intel_output->base, 357 psb_intel_connector_attach_encoder(psb_intel_connector,
335 &psb_intel_output->enc); 358 psb_intel_encoder);
336 psb_intel_output->type = INTEL_OUTPUT_LVDS; 359 psb_intel_encoder->type = INTEL_OUTPUT_LVDS;
337 360
338 drm_encoder_helper_add(encoder, &oaktrail_lvds_helper_funcs); 361 drm_encoder_helper_add(encoder, &oaktrail_lvds_helper_funcs);
339 drm_connector_helper_add(connector, 362 drm_connector_helper_add(connector,
@@ -411,13 +434,15 @@ out:
411 434
412failed_find: 435failed_find:
413 dev_dbg(dev->dev, "No LVDS modes found, disabling.\n"); 436 dev_dbg(dev->dev, "No LVDS modes found, disabling.\n");
414 if (psb_intel_output->ddc_bus) 437 if (psb_intel_encoder->ddc_bus)
415 psb_intel_i2c_destroy(psb_intel_output->ddc_bus); 438 psb_intel_i2c_destroy(psb_intel_encoder->ddc_bus);
416 439
417/* failed_ddc: */ 440/* failed_ddc: */
418 441
419 drm_encoder_cleanup(encoder); 442 drm_encoder_cleanup(encoder);
420 drm_connector_cleanup(connector); 443 drm_connector_cleanup(connector);
421 kfree(connector); 444 kfree(psb_intel_connector);
445failed_connector:
446 kfree(psb_intel_encoder);
422} 447}
423 448