diff options
author | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2011-12-19 16:40:45 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-12-20 05:23:12 -0500 |
commit | 9c8cee471392258271bdf36361903d306a0c2dd6 (patch) | |
tree | 1705ae21eefbae944405ae92c71b95bd1c0a79fd /drivers/gpu/drm | |
parent | 1730f89bfcff353484672cdcefbef13b2f374176 (diff) |
gma500: Convert PSB LVDS to new output handling
LVDS for PSB now uses psb_intel_encoder and psb_intel_connectors instead of
psb_intel_output. i2c_bus and ddc_bus are moved to lvds_priv. There was also a
pointer to mode_dev (for no obvious reason) that we now get directly from
dev_priv.
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/gma500/psb_intel_lvds.c | 152 |
1 files changed, 83 insertions, 69 deletions
diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c b/drivers/gpu/drm/gma500/psb_intel_lvds.c index 21022e1a977a..a25e4ca5e91c 100644 --- a/drivers/gpu/drm/gma500/psb_intel_lvds.c +++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c | |||
@@ -59,6 +59,9 @@ struct psb_intel_lvds_priv { | |||
59 | uint32_t savePFIT_CONTROL; | 59 | uint32_t savePFIT_CONTROL; |
60 | uint32_t savePFIT_PGM_RATIOS; | 60 | uint32_t savePFIT_PGM_RATIOS; |
61 | uint32_t saveBLC_PWM_CTL; | 61 | uint32_t saveBLC_PWM_CTL; |
62 | |||
63 | struct psb_intel_i2c_chan *i2c_bus; | ||
64 | struct psb_intel_i2c_chan *ddc_bus; | ||
62 | }; | 65 | }; |
63 | 66 | ||
64 | 67 | ||
@@ -214,9 +217,10 @@ static void psb_intel_lvds_set_backlight(struct drm_device *dev, int level) | |||
214 | /* | 217 | /* |
215 | * Sets the power state for the panel. | 218 | * Sets the power state for the panel. |
216 | */ | 219 | */ |
217 | static void psb_intel_lvds_set_power(struct drm_device *dev, | 220 | static void psb_intel_lvds_set_power(struct drm_device *dev, bool on) |
218 | struct psb_intel_output *output, bool on) | ||
219 | { | 221 | { |
222 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
223 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | ||
220 | u32 pp_status; | 224 | u32 pp_status; |
221 | 225 | ||
222 | if (!gma_power_begin(dev, true)) { | 226 | if (!gma_power_begin(dev, true)) { |
@@ -232,8 +236,7 @@ static void psb_intel_lvds_set_power(struct drm_device *dev, | |||
232 | } while ((pp_status & PP_ON) == 0); | 236 | } while ((pp_status & PP_ON) == 0); |
233 | 237 | ||
234 | psb_intel_lvds_set_backlight(dev, | 238 | psb_intel_lvds_set_backlight(dev, |
235 | output-> | 239 | mode_dev->backlight_duty_cycle); |
236 | mode_dev->backlight_duty_cycle); | ||
237 | } else { | 240 | } else { |
238 | psb_intel_lvds_set_backlight(dev, 0); | 241 | psb_intel_lvds_set_backlight(dev, 0); |
239 | 242 | ||
@@ -250,12 +253,11 @@ static void psb_intel_lvds_set_power(struct drm_device *dev, | |||
250 | static void psb_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode) | 253 | static void psb_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode) |
251 | { | 254 | { |
252 | struct drm_device *dev = encoder->dev; | 255 | struct drm_device *dev = encoder->dev; |
253 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | ||
254 | 256 | ||
255 | if (mode == DRM_MODE_DPMS_ON) | 257 | if (mode == DRM_MODE_DPMS_ON) |
256 | psb_intel_lvds_set_power(dev, output, true); | 258 | psb_intel_lvds_set_power(dev, true); |
257 | else | 259 | else |
258 | psb_intel_lvds_set_power(dev, output, false); | 260 | psb_intel_lvds_set_power(dev, false); |
259 | 261 | ||
260 | /* XXX: We never power down the LVDS pairs. */ | 262 | /* XXX: We never power down the LVDS pairs. */ |
261 | } | 263 | } |
@@ -265,10 +267,10 @@ static void psb_intel_lvds_save(struct drm_connector *connector) | |||
265 | struct drm_device *dev = connector->dev; | 267 | struct drm_device *dev = connector->dev; |
266 | struct drm_psb_private *dev_priv = | 268 | struct drm_psb_private *dev_priv = |
267 | (struct drm_psb_private *)dev->dev_private; | 269 | (struct drm_psb_private *)dev->dev_private; |
268 | struct psb_intel_output *psb_intel_output = | 270 | struct psb_intel_encoder *psb_intel_encoder = |
269 | to_psb_intel_output(connector); | 271 | psb_intel_attached_encoder(connector); |
270 | struct psb_intel_lvds_priv *lvds_priv = | 272 | struct psb_intel_lvds_priv *lvds_priv = |
271 | (struct psb_intel_lvds_priv *)psb_intel_output->dev_priv; | 273 | (struct psb_intel_lvds_priv *)psb_intel_encoder->dev_priv; |
272 | 274 | ||
273 | lvds_priv->savePP_ON = REG_READ(LVDSPP_ON); | 275 | lvds_priv->savePP_ON = REG_READ(LVDSPP_ON); |
274 | lvds_priv->savePP_OFF = REG_READ(LVDSPP_OFF); | 276 | lvds_priv->savePP_OFF = REG_READ(LVDSPP_OFF); |
@@ -305,10 +307,10 @@ static void psb_intel_lvds_restore(struct drm_connector *connector) | |||
305 | { | 307 | { |
306 | struct drm_device *dev = connector->dev; | 308 | struct drm_device *dev = connector->dev; |
307 | u32 pp_status; | 309 | u32 pp_status; |
308 | struct psb_intel_output *psb_intel_output = | 310 | struct psb_intel_encoder *psb_intel_encoder = |
309 | to_psb_intel_output(connector); | 311 | psb_intel_attached_encoder(connector); |
310 | struct psb_intel_lvds_priv *lvds_priv = | 312 | struct psb_intel_lvds_priv *lvds_priv = |
311 | (struct psb_intel_lvds_priv *)psb_intel_output->dev_priv; | 313 | (struct psb_intel_lvds_priv *)psb_intel_encoder->dev_priv; |
312 | 314 | ||
313 | dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", | 315 | dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", |
314 | lvds_priv->savePP_ON, | 316 | lvds_priv->savePP_ON, |
@@ -346,13 +348,14 @@ static void psb_intel_lvds_restore(struct drm_connector *connector) | |||
346 | int psb_intel_lvds_mode_valid(struct drm_connector *connector, | 348 | int psb_intel_lvds_mode_valid(struct drm_connector *connector, |
347 | struct drm_display_mode *mode) | 349 | struct drm_display_mode *mode) |
348 | { | 350 | { |
349 | struct psb_intel_output *psb_intel_output = | 351 | struct drm_psb_private *dev_priv = connector->dev->dev_private; |
350 | to_psb_intel_output(connector); | 352 | struct psb_intel_encoder *psb_intel_encoder = |
353 | psb_intel_attached_encoder(connector); | ||
351 | struct drm_display_mode *fixed_mode = | 354 | struct drm_display_mode *fixed_mode = |
352 | psb_intel_output->mode_dev->panel_fixed_mode; | 355 | dev_priv->mode_dev.panel_fixed_mode; |
353 | 356 | ||
354 | if (psb_intel_output->type == INTEL_OUTPUT_MIPI2) | 357 | if (psb_intel_encoder->type == INTEL_OUTPUT_MIPI2) |
355 | fixed_mode = psb_intel_output->mode_dev->panel_fixed_mode2; | 358 | fixed_mode = dev_priv->mode_dev.panel_fixed_mode2; |
356 | 359 | ||
357 | /* just in case */ | 360 | /* just in case */ |
358 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | 361 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) |
@@ -375,17 +378,17 @@ bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
375 | struct drm_display_mode *mode, | 378 | struct drm_display_mode *mode, |
376 | struct drm_display_mode *adjusted_mode) | 379 | struct drm_display_mode *adjusted_mode) |
377 | { | 380 | { |
378 | struct psb_intel_mode_device *mode_dev = | ||
379 | enc_to_psb_intel_output(encoder)->mode_dev; | ||
380 | struct drm_device *dev = encoder->dev; | 381 | struct drm_device *dev = encoder->dev; |
382 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
383 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | ||
381 | struct psb_intel_crtc *psb_intel_crtc = | 384 | struct psb_intel_crtc *psb_intel_crtc = |
382 | to_psb_intel_crtc(encoder->crtc); | 385 | to_psb_intel_crtc(encoder->crtc); |
383 | struct drm_encoder *tmp_encoder; | 386 | struct drm_encoder *tmp_encoder; |
384 | struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode; | 387 | struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode; |
385 | struct psb_intel_output *psb_intel_output = | 388 | struct psb_intel_encoder *psb_intel_encoder = |
386 | enc_to_psb_intel_output(encoder); | 389 | to_psb_intel_encoder(encoder); |
387 | 390 | ||
388 | if (psb_intel_output->type == INTEL_OUTPUT_MIPI2) | 391 | if (psb_intel_encoder->type == INTEL_OUTPUT_MIPI2) |
389 | panel_fixed_mode = mode_dev->panel_fixed_mode2; | 392 | panel_fixed_mode = mode_dev->panel_fixed_mode2; |
390 | 393 | ||
391 | /* PSB requires the LVDS is on pipe B, MRST has only one pipe anyway */ | 394 | /* PSB requires the LVDS is on pipe B, MRST has only one pipe anyway */ |
@@ -440,8 +443,8 @@ bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
440 | static void psb_intel_lvds_prepare(struct drm_encoder *encoder) | 443 | static void psb_intel_lvds_prepare(struct drm_encoder *encoder) |
441 | { | 444 | { |
442 | struct drm_device *dev = encoder->dev; | 445 | struct drm_device *dev = encoder->dev; |
443 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 446 | struct drm_psb_private *dev_priv = dev->dev_private; |
444 | struct psb_intel_mode_device *mode_dev = output->mode_dev; | 447 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; |
445 | 448 | ||
446 | if (!gma_power_begin(dev, true)) | 449 | if (!gma_power_begin(dev, true)) |
447 | return; | 450 | return; |
@@ -450,7 +453,7 @@ static void psb_intel_lvds_prepare(struct drm_encoder *encoder) | |||
450 | mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & | 453 | mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & |
451 | BACKLIGHT_DUTY_CYCLE_MASK); | 454 | BACKLIGHT_DUTY_CYCLE_MASK); |
452 | 455 | ||
453 | psb_intel_lvds_set_power(dev, output, false); | 456 | psb_intel_lvds_set_power(dev, false); |
454 | 457 | ||
455 | gma_power_end(dev); | 458 | gma_power_end(dev); |
456 | } | 459 | } |
@@ -458,14 +461,14 @@ static void psb_intel_lvds_prepare(struct drm_encoder *encoder) | |||
458 | static void psb_intel_lvds_commit(struct drm_encoder *encoder) | 461 | static void psb_intel_lvds_commit(struct drm_encoder *encoder) |
459 | { | 462 | { |
460 | struct drm_device *dev = encoder->dev; | 463 | struct drm_device *dev = encoder->dev; |
461 | struct psb_intel_output *output = enc_to_psb_intel_output(encoder); | 464 | struct drm_psb_private *dev_priv = dev->dev_private; |
462 | struct psb_intel_mode_device *mode_dev = output->mode_dev; | 465 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; |
463 | 466 | ||
464 | if (mode_dev->backlight_duty_cycle == 0) | 467 | if (mode_dev->backlight_duty_cycle == 0) |
465 | mode_dev->backlight_duty_cycle = | 468 | mode_dev->backlight_duty_cycle = |
466 | psb_intel_lvds_get_max_backlight(dev); | 469 | psb_intel_lvds_get_max_backlight(dev); |
467 | 470 | ||
468 | psb_intel_lvds_set_power(dev, output, true); | 471 | psb_intel_lvds_set_power(dev, true); |
469 | } | 472 | } |
470 | 473 | ||
471 | static void psb_intel_lvds_mode_set(struct drm_encoder *encoder, | 474 | static void psb_intel_lvds_mode_set(struct drm_encoder *encoder, |
@@ -520,14 +523,15 @@ static enum drm_connector_status psb_intel_lvds_detect(struct drm_connector | |||
520 | static int psb_intel_lvds_get_modes(struct drm_connector *connector) | 523 | static int psb_intel_lvds_get_modes(struct drm_connector *connector) |
521 | { | 524 | { |
522 | struct drm_device *dev = connector->dev; | 525 | struct drm_device *dev = connector->dev; |
523 | struct psb_intel_output *psb_intel_output = | 526 | struct drm_psb_private *dev_priv = dev->dev_private; |
524 | to_psb_intel_output(connector); | 527 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; |
525 | struct psb_intel_mode_device *mode_dev = | 528 | struct psb_intel_encoder *psb_intel_encoder = |
526 | psb_intel_output->mode_dev; | 529 | psb_intel_attached_encoder(connector); |
530 | struct psb_intel_lvds_priv *lvds_priv = psb_intel_encoder->dev_priv; | ||
527 | int ret = 0; | 531 | int ret = 0; |
528 | 532 | ||
529 | if (!IS_MRST(dev)) | 533 | if (!IS_MRST(dev)) |
530 | ret = psb_intel_ddc_get_modes(psb_intel_output); | 534 | ret = psb_intel_ddc_get_modes(connector, &lvds_priv->i2c_bus->adapter); |
531 | 535 | ||
532 | if (ret) | 536 | if (ret) |
533 | return ret; | 537 | return ret; |
@@ -560,11 +564,12 @@ static int psb_intel_lvds_get_modes(struct drm_connector *connector) | |||
560 | */ | 564 | */ |
561 | void psb_intel_lvds_destroy(struct drm_connector *connector) | 565 | void psb_intel_lvds_destroy(struct drm_connector *connector) |
562 | { | 566 | { |
563 | struct psb_intel_output *psb_intel_output = | 567 | struct psb_intel_encoder *psb_intel_encoder = |
564 | to_psb_intel_output(connector); | 568 | psb_intel_attached_encoder(connector); |
569 | struct psb_intel_lvds_priv *lvds_priv = psb_intel_encoder->dev_priv; | ||
565 | 570 | ||
566 | if (psb_intel_output->ddc_bus) | 571 | if (lvds_priv->ddc_bus) |
567 | psb_intel_i2c_destroy(psb_intel_output->ddc_bus); | 572 | psb_intel_i2c_destroy(lvds_priv->ddc_bus); |
568 | drm_sysfs_connector_remove(connector); | 573 | drm_sysfs_connector_remove(connector); |
569 | drm_connector_cleanup(connector); | 574 | drm_connector_cleanup(connector); |
570 | kfree(connector); | 575 | kfree(connector); |
@@ -693,9 +698,10 @@ const struct drm_encoder_funcs psb_intel_lvds_enc_funcs = { | |||
693 | * modes we can display on the LVDS panel (if present). | 698 | * modes we can display on the LVDS panel (if present). |
694 | */ | 699 | */ |
695 | void psb_intel_lvds_init(struct drm_device *dev, | 700 | void psb_intel_lvds_init(struct drm_device *dev, |
696 | struct psb_intel_mode_device *mode_dev) | 701 | struct psb_intel_mode_device *mode_dev) |
697 | { | 702 | { |
698 | struct psb_intel_output *psb_intel_output; | 703 | struct psb_intel_encoder *psb_intel_encoder; |
704 | struct psb_intel_connector *psb_intel_connector; | ||
699 | struct psb_intel_lvds_priv *lvds_priv; | 705 | struct psb_intel_lvds_priv *lvds_priv; |
700 | struct drm_connector *connector; | 706 | struct drm_connector *connector; |
701 | struct drm_encoder *encoder; | 707 | struct drm_encoder *encoder; |
@@ -705,33 +711,43 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
705 | u32 lvds; | 711 | u32 lvds; |
706 | int pipe; | 712 | int pipe; |
707 | 713 | ||
708 | psb_intel_output = kzalloc(sizeof(struct psb_intel_output), GFP_KERNEL); | 714 | psb_intel_encoder = |
709 | if (!psb_intel_output) | 715 | kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL); |
716 | |||
717 | if (!psb_intel_encoder) { | ||
718 | dev_err(dev->dev, "psb_intel_encoder allocation error\n"); | ||
710 | return; | 719 | return; |
720 | } | ||
721 | |||
722 | psb_intel_connector = | ||
723 | kzalloc(sizeof(struct psb_intel_connector), GFP_KERNEL); | ||
724 | |||
725 | if (!psb_intel_connector) { | ||
726 | kfree(psb_intel_encoder); | ||
727 | dev_err(dev->dev, "psb_intel_connector allocation error\n"); | ||
728 | } | ||
711 | 729 | ||
712 | lvds_priv = kzalloc(sizeof(struct psb_intel_lvds_priv), GFP_KERNEL); | 730 | lvds_priv = kzalloc(sizeof(struct psb_intel_lvds_priv), GFP_KERNEL); |
713 | if (!lvds_priv) { | 731 | if (!lvds_priv) { |
714 | kfree(psb_intel_output); | ||
715 | dev_err(dev->dev, "LVDS private allocation error\n"); | 732 | dev_err(dev->dev, "LVDS private allocation error\n"); |
716 | return; | 733 | goto failed_connector; |
717 | } | 734 | } |
718 | 735 | ||
719 | psb_intel_output->dev_priv = lvds_priv; | 736 | psb_intel_encoder->dev_priv = lvds_priv; |
720 | psb_intel_output->mode_dev = mode_dev; | ||
721 | 737 | ||
722 | connector = &psb_intel_output->base; | 738 | connector = &psb_intel_connector->base; |
723 | encoder = &psb_intel_output->enc; | 739 | encoder = &psb_intel_encoder->base; |
724 | drm_connector_init(dev, &psb_intel_output->base, | 740 | drm_connector_init(dev, connector, |
725 | &psb_intel_lvds_connector_funcs, | 741 | &psb_intel_lvds_connector_funcs, |
726 | DRM_MODE_CONNECTOR_LVDS); | 742 | DRM_MODE_CONNECTOR_LVDS); |
727 | 743 | ||
728 | drm_encoder_init(dev, &psb_intel_output->enc, | 744 | drm_encoder_init(dev, encoder, |
729 | &psb_intel_lvds_enc_funcs, | 745 | &psb_intel_lvds_enc_funcs, |
730 | DRM_MODE_ENCODER_LVDS); | 746 | DRM_MODE_ENCODER_LVDS); |
731 | 747 | ||
732 | drm_mode_connector_attach_encoder(&psb_intel_output->base, | 748 | psb_intel_connector_attach_encoder(psb_intel_connector, |
733 | &psb_intel_output->enc); | 749 | psb_intel_encoder); |
734 | psb_intel_output->type = INTEL_OUTPUT_LVDS; | 750 | psb_intel_encoder->type = INTEL_OUTPUT_LVDS; |
735 | 751 | ||
736 | drm_encoder_helper_add(encoder, &psb_intel_lvds_helper_funcs); | 752 | drm_encoder_helper_add(encoder, &psb_intel_lvds_helper_funcs); |
737 | drm_connector_helper_add(connector, | 753 | drm_connector_helper_add(connector, |
@@ -752,16 +768,14 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
752 | * Set up I2C bus | 768 | * Set up I2C bus |
753 | * FIXME: distroy i2c_bus when exit | 769 | * FIXME: distroy i2c_bus when exit |
754 | */ | 770 | */ |
755 | psb_intel_output->i2c_bus = psb_intel_i2c_create(dev, | 771 | lvds_priv->i2c_bus = psb_intel_i2c_create(dev, GPIOB, "LVDSBLC_B"); |
756 | GPIOB, | 772 | if (!lvds_priv->i2c_bus) { |
757 | "LVDSBLC_B"); | ||
758 | if (!psb_intel_output->i2c_bus) { | ||
759 | dev_printk(KERN_ERR, | 773 | dev_printk(KERN_ERR, |
760 | &dev->pdev->dev, "I2C bus registration failed.\n"); | 774 | &dev->pdev->dev, "I2C bus registration failed.\n"); |
761 | goto failed_blc_i2c; | 775 | goto failed_blc_i2c; |
762 | } | 776 | } |
763 | psb_intel_output->i2c_bus->slave_addr = 0x2C; | 777 | lvds_priv->i2c_bus->slave_addr = 0x2C; |
764 | dev_priv->lvds_i2c_bus = psb_intel_output->i2c_bus; | 778 | dev_priv->lvds_i2c_bus = lvds_priv->i2c_bus; |
765 | 779 | ||
766 | /* | 780 | /* |
767 | * LVDS discovery: | 781 | * LVDS discovery: |
@@ -774,10 +788,8 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
774 | */ | 788 | */ |
775 | 789 | ||
776 | /* Set up the DDC bus. */ | 790 | /* Set up the DDC bus. */ |
777 | psb_intel_output->ddc_bus = psb_intel_i2c_create(dev, | 791 | lvds_priv->ddc_bus = psb_intel_i2c_create(dev, GPIOC, "LVDSDDC_C"); |
778 | GPIOC, | 792 | if (!lvds_priv->ddc_bus) { |
779 | "LVDSDDC_C"); | ||
780 | if (!psb_intel_output->ddc_bus) { | ||
781 | dev_printk(KERN_ERR, &dev->pdev->dev, | 793 | dev_printk(KERN_ERR, &dev->pdev->dev, |
782 | "DDC bus registration " "failed.\n"); | 794 | "DDC bus registration " "failed.\n"); |
783 | goto failed_ddc; | 795 | goto failed_ddc; |
@@ -787,7 +799,7 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
787 | * Attempt to get the fixed panel mode from DDC. Assume that the | 799 | * Attempt to get the fixed panel mode from DDC. Assume that the |
788 | * preferred mode is the right one. | 800 | * preferred mode is the right one. |
789 | */ | 801 | */ |
790 | psb_intel_ddc_get_modes(psb_intel_output); | 802 | psb_intel_ddc_get_modes(connector, &lvds_priv->ddc_bus->adapter); |
791 | list_for_each_entry(scan, &connector->probed_modes, head) { | 803 | list_for_each_entry(scan, &connector->probed_modes, head) { |
792 | if (scan->type & DRM_MODE_TYPE_PREFERRED) { | 804 | if (scan->type & DRM_MODE_TYPE_PREFERRED) { |
793 | mode_dev->panel_fixed_mode = | 805 | mode_dev->panel_fixed_mode = |
@@ -841,14 +853,16 @@ out: | |||
841 | return; | 853 | return; |
842 | 854 | ||
843 | failed_find: | 855 | failed_find: |
844 | if (psb_intel_output->ddc_bus) | 856 | if (lvds_priv->ddc_bus) |
845 | psb_intel_i2c_destroy(psb_intel_output->ddc_bus); | 857 | psb_intel_i2c_destroy(lvds_priv->ddc_bus); |
846 | failed_ddc: | 858 | failed_ddc: |
847 | if (psb_intel_output->i2c_bus) | 859 | if (lvds_priv->i2c_bus) |
848 | psb_intel_i2c_destroy(psb_intel_output->i2c_bus); | 860 | psb_intel_i2c_destroy(lvds_priv->i2c_bus); |
849 | failed_blc_i2c: | 861 | failed_blc_i2c: |
850 | drm_encoder_cleanup(encoder); | 862 | drm_encoder_cleanup(encoder); |
851 | drm_connector_cleanup(connector); | 863 | drm_connector_cleanup(connector); |
852 | kfree(connector); | 864 | failed_connector: |
865 | if (psb_intel_connector) | ||
866 | kfree(psb_intel_connector); | ||
853 | } | 867 | } |
854 | 868 | ||