aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPatrik Jakobsson <patrik.r.jakobsson@gmail.com>2011-12-19 16:40:45 -0500
committerDave Airlie <airlied@redhat.com>2011-12-20 05:23:12 -0500
commit9c8cee471392258271bdf36361903d306a0c2dd6 (patch)
tree1705ae21eefbae944405ae92c71b95bd1c0a79fd /drivers
parent1730f89bfcff353484672cdcefbef13b2f374176 (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')
-rw-r--r--drivers/gpu/drm/gma500/psb_intel_lvds.c152
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 */
217static void psb_intel_lvds_set_power(struct drm_device *dev, 220static 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,
250static void psb_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode) 253static 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)
346int psb_intel_lvds_mode_valid(struct drm_connector *connector, 348int 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,
440static void psb_intel_lvds_prepare(struct drm_encoder *encoder) 443static 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)
458static void psb_intel_lvds_commit(struct drm_encoder *encoder) 461static 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
471static void psb_intel_lvds_mode_set(struct drm_encoder *encoder, 474static 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
520static int psb_intel_lvds_get_modes(struct drm_connector *connector) 523static 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 */
561void psb_intel_lvds_destroy(struct drm_connector *connector) 565void 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 */
695void psb_intel_lvds_init(struct drm_device *dev, 700void 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
843failed_find: 855failed_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);
846failed_ddc: 858failed_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);
849failed_blc_i2c: 861failed_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); 864failed_connector:
865 if (psb_intel_connector)
866 kfree(psb_intel_connector);
853} 867}
854 868