diff options
author | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2011-12-19 16:41:33 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-12-20 05:23:17 -0500 |
commit | 9bd81acdb648509dbbc32d4da0477c9fae0d6a73 (patch) | |
tree | adfeea49b91ed3c7bf1590db3f0a331ab4ef1e98 /drivers/gpu/drm/gma500 | |
parent | a12d6a078e47e244a476b67c3f4b6ca03c138a99 (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.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/oaktrail_hdmi.c | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/oaktrail_lvds.c | 79 |
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 = { | |||
643 | void oaktrail_hdmi_init(struct drm_device *dev, | 643 | void 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 | |||
683 | failed_connector: | ||
684 | kfree(psb_intel_encoder); | ||
678 | } | 685 | } |
679 | 686 | ||
680 | static DEFINE_PCI_DEVICE_TABLE(hdmi_ids) = { | 687 | static 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 | */ |
45 | static void oaktrail_lvds_set_power(struct drm_device *dev, | 45 | static 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, | |||
77 | static void oaktrail_lvds_dpms(struct drm_encoder *encoder, int mode) | 78 | static 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, | |||
150 | static void oaktrail_lvds_prepare(struct drm_encoder *encoder) | 165 | static 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) | |||
185 | static void oaktrail_lvds_commit(struct drm_encoder *encoder) | 202 | static 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 | ||
197 | static const struct drm_encoder_helper_funcs oaktrail_lvds_helper_funcs = { | 216 | static 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, | |||
306 | void oaktrail_lvds_init(struct drm_device *dev, | 325 | void 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 | ||
412 | failed_find: | 435 | failed_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); |
445 | failed_connector: | ||
446 | kfree(psb_intel_encoder); | ||
422 | } | 447 | } |
423 | 448 | ||