diff options
Diffstat (limited to 'drivers/gpu/drm/gma500/psb_intel_lvds.c')
-rw-r--r-- | drivers/gpu/drm/gma500/psb_intel_lvds.c | 75 |
1 files changed, 32 insertions, 43 deletions
diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c b/drivers/gpu/drm/gma500/psb_intel_lvds.c index 9fa5fa2e6192..32342f6990d9 100644 --- a/drivers/gpu/drm/gma500/psb_intel_lvds.c +++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c | |||
@@ -267,10 +267,9 @@ static void psb_intel_lvds_save(struct drm_connector *connector) | |||
267 | struct drm_device *dev = connector->dev; | 267 | struct drm_device *dev = connector->dev; |
268 | struct drm_psb_private *dev_priv = | 268 | struct drm_psb_private *dev_priv = |
269 | (struct drm_psb_private *)dev->dev_private; | 269 | (struct drm_psb_private *)dev->dev_private; |
270 | struct psb_intel_encoder *psb_intel_encoder = | 270 | struct gma_encoder *gma_encoder = gma_attached_encoder(connector); |
271 | psb_intel_attached_encoder(connector); | ||
272 | struct psb_intel_lvds_priv *lvds_priv = | 271 | struct psb_intel_lvds_priv *lvds_priv = |
273 | (struct psb_intel_lvds_priv *)psb_intel_encoder->dev_priv; | 272 | (struct psb_intel_lvds_priv *)gma_encoder->dev_priv; |
274 | 273 | ||
275 | lvds_priv->savePP_ON = REG_READ(LVDSPP_ON); | 274 | lvds_priv->savePP_ON = REG_READ(LVDSPP_ON); |
276 | lvds_priv->savePP_OFF = REG_READ(LVDSPP_OFF); | 275 | lvds_priv->savePP_OFF = REG_READ(LVDSPP_OFF); |
@@ -307,10 +306,9 @@ static void psb_intel_lvds_restore(struct drm_connector *connector) | |||
307 | { | 306 | { |
308 | struct drm_device *dev = connector->dev; | 307 | struct drm_device *dev = connector->dev; |
309 | u32 pp_status; | 308 | u32 pp_status; |
310 | struct psb_intel_encoder *psb_intel_encoder = | 309 | struct gma_encoder *gma_encoder = gma_attached_encoder(connector); |
311 | psb_intel_attached_encoder(connector); | ||
312 | struct psb_intel_lvds_priv *lvds_priv = | 310 | struct psb_intel_lvds_priv *lvds_priv = |
313 | (struct psb_intel_lvds_priv *)psb_intel_encoder->dev_priv; | 311 | (struct psb_intel_lvds_priv *)gma_encoder->dev_priv; |
314 | 312 | ||
315 | dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", | 313 | dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", |
316 | lvds_priv->savePP_ON, | 314 | lvds_priv->savePP_ON, |
@@ -349,12 +347,11 @@ int psb_intel_lvds_mode_valid(struct drm_connector *connector, | |||
349 | struct drm_display_mode *mode) | 347 | struct drm_display_mode *mode) |
350 | { | 348 | { |
351 | struct drm_psb_private *dev_priv = connector->dev->dev_private; | 349 | struct drm_psb_private *dev_priv = connector->dev->dev_private; |
352 | struct psb_intel_encoder *psb_intel_encoder = | 350 | struct gma_encoder *gma_encoder = gma_attached_encoder(connector); |
353 | psb_intel_attached_encoder(connector); | ||
354 | struct drm_display_mode *fixed_mode = | 351 | struct drm_display_mode *fixed_mode = |
355 | dev_priv->mode_dev.panel_fixed_mode; | 352 | dev_priv->mode_dev.panel_fixed_mode; |
356 | 353 | ||
357 | if (psb_intel_encoder->type == INTEL_OUTPUT_MIPI2) | 354 | if (gma_encoder->type == INTEL_OUTPUT_MIPI2) |
358 | fixed_mode = dev_priv->mode_dev.panel_fixed_mode2; | 355 | fixed_mode = dev_priv->mode_dev.panel_fixed_mode2; |
359 | 356 | ||
360 | /* just in case */ | 357 | /* just in case */ |
@@ -381,22 +378,20 @@ bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
381 | struct drm_device *dev = encoder->dev; | 378 | struct drm_device *dev = encoder->dev; |
382 | struct drm_psb_private *dev_priv = dev->dev_private; | 379 | struct drm_psb_private *dev_priv = dev->dev_private; |
383 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | 380 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; |
384 | struct psb_intel_crtc *psb_intel_crtc = | 381 | struct gma_crtc *gma_crtc = to_gma_crtc(encoder->crtc); |
385 | to_psb_intel_crtc(encoder->crtc); | ||
386 | struct drm_encoder *tmp_encoder; | 382 | struct drm_encoder *tmp_encoder; |
387 | struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode; | 383 | struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode; |
388 | struct psb_intel_encoder *psb_intel_encoder = | 384 | struct gma_encoder *gma_encoder = to_gma_encoder(encoder); |
389 | to_psb_intel_encoder(encoder); | ||
390 | 385 | ||
391 | if (psb_intel_encoder->type == INTEL_OUTPUT_MIPI2) | 386 | if (gma_encoder->type == INTEL_OUTPUT_MIPI2) |
392 | panel_fixed_mode = mode_dev->panel_fixed_mode2; | 387 | panel_fixed_mode = mode_dev->panel_fixed_mode2; |
393 | 388 | ||
394 | /* PSB requires the LVDS is on pipe B, MRST has only one pipe anyway */ | 389 | /* PSB requires the LVDS is on pipe B, MRST has only one pipe anyway */ |
395 | if (!IS_MRST(dev) && psb_intel_crtc->pipe == 0) { | 390 | if (!IS_MRST(dev) && gma_crtc->pipe == 0) { |
396 | printk(KERN_ERR "Can't support LVDS on pipe A\n"); | 391 | printk(KERN_ERR "Can't support LVDS on pipe A\n"); |
397 | return false; | 392 | return false; |
398 | } | 393 | } |
399 | if (IS_MRST(dev) && psb_intel_crtc->pipe != 0) { | 394 | if (IS_MRST(dev) && gma_crtc->pipe != 0) { |
400 | printk(KERN_ERR "Must use PIPE A\n"); | 395 | printk(KERN_ERR "Must use PIPE A\n"); |
401 | return false; | 396 | return false; |
402 | } | 397 | } |
@@ -525,9 +520,8 @@ static int psb_intel_lvds_get_modes(struct drm_connector *connector) | |||
525 | struct drm_device *dev = connector->dev; | 520 | struct drm_device *dev = connector->dev; |
526 | struct drm_psb_private *dev_priv = dev->dev_private; | 521 | struct drm_psb_private *dev_priv = dev->dev_private; |
527 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; | 522 | struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; |
528 | struct psb_intel_encoder *psb_intel_encoder = | 523 | struct gma_encoder *gma_encoder = gma_attached_encoder(connector); |
529 | psb_intel_attached_encoder(connector); | 524 | struct psb_intel_lvds_priv *lvds_priv = gma_encoder->dev_priv; |
530 | struct psb_intel_lvds_priv *lvds_priv = psb_intel_encoder->dev_priv; | ||
531 | int ret = 0; | 525 | int ret = 0; |
532 | 526 | ||
533 | if (!IS_MRST(dev)) | 527 | if (!IS_MRST(dev)) |
@@ -564,9 +558,8 @@ static int psb_intel_lvds_get_modes(struct drm_connector *connector) | |||
564 | */ | 558 | */ |
565 | void psb_intel_lvds_destroy(struct drm_connector *connector) | 559 | void psb_intel_lvds_destroy(struct drm_connector *connector) |
566 | { | 560 | { |
567 | struct psb_intel_encoder *psb_intel_encoder = | 561 | struct gma_encoder *gma_encoder = gma_attached_encoder(connector); |
568 | psb_intel_attached_encoder(connector); | 562 | struct psb_intel_lvds_priv *lvds_priv = gma_encoder->dev_priv; |
569 | struct psb_intel_lvds_priv *lvds_priv = psb_intel_encoder->dev_priv; | ||
570 | 563 | ||
571 | if (lvds_priv->ddc_bus) | 564 | if (lvds_priv->ddc_bus) |
572 | psb_intel_i2c_destroy(lvds_priv->ddc_bus); | 565 | psb_intel_i2c_destroy(lvds_priv->ddc_bus); |
@@ -585,8 +578,7 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, | |||
585 | return -1; | 578 | return -1; |
586 | 579 | ||
587 | if (!strcmp(property->name, "scaling mode")) { | 580 | if (!strcmp(property->name, "scaling mode")) { |
588 | struct psb_intel_crtc *crtc = | 581 | struct gma_crtc *crtc = to_gma_crtc(encoder->crtc); |
589 | to_psb_intel_crtc(encoder->crtc); | ||
590 | uint64_t curval; | 582 | uint64_t curval; |
591 | 583 | ||
592 | if (!crtc) | 584 | if (!crtc) |
@@ -656,7 +648,7 @@ const struct drm_connector_helper_funcs | |||
656 | psb_intel_lvds_connector_helper_funcs = { | 648 | psb_intel_lvds_connector_helper_funcs = { |
657 | .get_modes = psb_intel_lvds_get_modes, | 649 | .get_modes = psb_intel_lvds_get_modes, |
658 | .mode_valid = psb_intel_lvds_mode_valid, | 650 | .mode_valid = psb_intel_lvds_mode_valid, |
659 | .best_encoder = psb_intel_best_encoder, | 651 | .best_encoder = gma_best_encoder, |
660 | }; | 652 | }; |
661 | 653 | ||
662 | const struct drm_connector_funcs psb_intel_lvds_connector_funcs = { | 654 | const struct drm_connector_funcs psb_intel_lvds_connector_funcs = { |
@@ -691,8 +683,8 @@ const struct drm_encoder_funcs psb_intel_lvds_enc_funcs = { | |||
691 | void psb_intel_lvds_init(struct drm_device *dev, | 683 | void psb_intel_lvds_init(struct drm_device *dev, |
692 | struct psb_intel_mode_device *mode_dev) | 684 | struct psb_intel_mode_device *mode_dev) |
693 | { | 685 | { |
694 | struct psb_intel_encoder *psb_intel_encoder; | 686 | struct gma_encoder *gma_encoder; |
695 | struct psb_intel_connector *psb_intel_connector; | 687 | struct gma_connector *gma_connector; |
696 | struct psb_intel_lvds_priv *lvds_priv; | 688 | struct psb_intel_lvds_priv *lvds_priv; |
697 | struct drm_connector *connector; | 689 | struct drm_connector *connector; |
698 | struct drm_encoder *encoder; | 690 | struct drm_encoder *encoder; |
@@ -702,17 +694,15 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
702 | u32 lvds; | 694 | u32 lvds; |
703 | int pipe; | 695 | int pipe; |
704 | 696 | ||
705 | psb_intel_encoder = | 697 | gma_encoder = kzalloc(sizeof(struct gma_encoder), GFP_KERNEL); |
706 | kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL); | 698 | if (!gma_encoder) { |
707 | if (!psb_intel_encoder) { | 699 | dev_err(dev->dev, "gma_encoder allocation error\n"); |
708 | dev_err(dev->dev, "psb_intel_encoder allocation error\n"); | ||
709 | return; | 700 | return; |
710 | } | 701 | } |
711 | 702 | ||
712 | psb_intel_connector = | 703 | gma_connector = kzalloc(sizeof(struct gma_connector), GFP_KERNEL); |
713 | kzalloc(sizeof(struct psb_intel_connector), GFP_KERNEL); | 704 | if (!gma_connector) { |
714 | if (!psb_intel_connector) { | 705 | dev_err(dev->dev, "gma_connector allocation error\n"); |
715 | dev_err(dev->dev, "psb_intel_connector allocation error\n"); | ||
716 | goto failed_encoder; | 706 | goto failed_encoder; |
717 | } | 707 | } |
718 | 708 | ||
@@ -722,10 +712,10 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
722 | goto failed_connector; | 712 | goto failed_connector; |
723 | } | 713 | } |
724 | 714 | ||
725 | psb_intel_encoder->dev_priv = lvds_priv; | 715 | gma_encoder->dev_priv = lvds_priv; |
726 | 716 | ||
727 | connector = &psb_intel_connector->base; | 717 | connector = &gma_connector->base; |
728 | encoder = &psb_intel_encoder->base; | 718 | encoder = &gma_encoder->base; |
729 | drm_connector_init(dev, connector, | 719 | drm_connector_init(dev, connector, |
730 | &psb_intel_lvds_connector_funcs, | 720 | &psb_intel_lvds_connector_funcs, |
731 | DRM_MODE_CONNECTOR_LVDS); | 721 | DRM_MODE_CONNECTOR_LVDS); |
@@ -734,9 +724,8 @@ void psb_intel_lvds_init(struct drm_device *dev, | |||
734 | &psb_intel_lvds_enc_funcs, | 724 | &psb_intel_lvds_enc_funcs, |
735 | DRM_MODE_ENCODER_LVDS); | 725 | DRM_MODE_ENCODER_LVDS); |
736 | 726 | ||
737 | psb_intel_connector_attach_encoder(psb_intel_connector, | 727 | gma_connector_attach_encoder(gma_connector, gma_encoder); |
738 | psb_intel_encoder); | 728 | gma_encoder->type = INTEL_OUTPUT_LVDS; |
739 | psb_intel_encoder->type = INTEL_OUTPUT_LVDS; | ||
740 | 729 | ||
741 | drm_encoder_helper_add(encoder, &psb_intel_lvds_helper_funcs); | 730 | drm_encoder_helper_add(encoder, &psb_intel_lvds_helper_funcs); |
742 | drm_connector_helper_add(connector, | 731 | drm_connector_helper_add(connector, |
@@ -851,8 +840,8 @@ failed_blc_i2c: | |||
851 | drm_encoder_cleanup(encoder); | 840 | drm_encoder_cleanup(encoder); |
852 | drm_connector_cleanup(connector); | 841 | drm_connector_cleanup(connector); |
853 | failed_connector: | 842 | failed_connector: |
854 | kfree(psb_intel_connector); | 843 | kfree(gma_connector); |
855 | failed_encoder: | 844 | failed_encoder: |
856 | kfree(psb_intel_encoder); | 845 | kfree(gma_encoder); |
857 | } | 846 | } |
858 | 847 | ||