Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Patrik Jakobsson and committed by
Dave Airlie
9c8cee47 1730f89b

+86 -72
+86 -72
drivers/gpu/drm/gma500/psb_intel_lvds.c
··· 59 59 uint32_t savePFIT_CONTROL; 60 60 uint32_t savePFIT_PGM_RATIOS; 61 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 ··· 217 214 /* 218 215 * Sets the power state for the panel. 219 216 */ 220 - static void psb_intel_lvds_set_power(struct drm_device *dev, 221 - struct psb_intel_output *output, bool on) 217 + static void psb_intel_lvds_set_power(struct drm_device *dev, bool on) 222 218 { 219 + struct drm_psb_private *dev_priv = dev->dev_private; 220 + struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 223 221 u32 pp_status; 224 222 225 223 if (!gma_power_begin(dev, true)) { ··· 236 232 } while ((pp_status & PP_ON) == 0); 237 233 238 234 psb_intel_lvds_set_backlight(dev, 239 - output-> 240 - mode_dev->backlight_duty_cycle); 235 + mode_dev->backlight_duty_cycle); 241 236 } else { 242 237 psb_intel_lvds_set_backlight(dev, 0); 243 238 ··· 253 250 static void psb_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode) 254 251 { 255 252 struct drm_device *dev = encoder->dev; 256 - struct psb_intel_output *output = enc_to_psb_intel_output(encoder); 257 253 258 254 if (mode == DRM_MODE_DPMS_ON) 259 - psb_intel_lvds_set_power(dev, output, true); 255 + psb_intel_lvds_set_power(dev, true); 260 256 else 261 - psb_intel_lvds_set_power(dev, output, false); 257 + psb_intel_lvds_set_power(dev, false); 262 258 263 259 /* XXX: We never power down the LVDS pairs. */ 264 260 } ··· 267 265 struct drm_device *dev = connector->dev; 268 266 struct drm_psb_private *dev_priv = 269 267 (struct drm_psb_private *)dev->dev_private; 270 - struct psb_intel_output *psb_intel_output = 271 - to_psb_intel_output(connector); 268 + struct psb_intel_encoder *psb_intel_encoder = 269 + psb_intel_attached_encoder(connector); 272 270 struct psb_intel_lvds_priv *lvds_priv = 273 - (struct psb_intel_lvds_priv *)psb_intel_output->dev_priv; 271 + (struct psb_intel_lvds_priv *)psb_intel_encoder->dev_priv; 274 272 275 273 lvds_priv->savePP_ON = REG_READ(LVDSPP_ON); 276 274 lvds_priv->savePP_OFF = REG_READ(LVDSPP_OFF); ··· 307 305 { 308 306 struct drm_device *dev = connector->dev; 309 307 u32 pp_status; 310 - struct psb_intel_output *psb_intel_output = 311 - to_psb_intel_output(connector); 308 + struct psb_intel_encoder *psb_intel_encoder = 309 + psb_intel_attached_encoder(connector); 312 310 struct psb_intel_lvds_priv *lvds_priv = 313 - (struct psb_intel_lvds_priv *)psb_intel_output->dev_priv; 311 + (struct psb_intel_lvds_priv *)psb_intel_encoder->dev_priv; 314 312 315 313 dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", 316 314 lvds_priv->savePP_ON, ··· 348 346 int psb_intel_lvds_mode_valid(struct drm_connector *connector, 349 347 struct drm_display_mode *mode) 350 348 { 351 - struct psb_intel_output *psb_intel_output = 352 - to_psb_intel_output(connector); 349 + struct drm_psb_private *dev_priv = connector->dev->dev_private; 350 + struct psb_intel_encoder *psb_intel_encoder = 351 + psb_intel_attached_encoder(connector); 353 352 struct drm_display_mode *fixed_mode = 354 - psb_intel_output->mode_dev->panel_fixed_mode; 353 + dev_priv->mode_dev.panel_fixed_mode; 355 354 356 - if (psb_intel_output->type == INTEL_OUTPUT_MIPI2) 357 - fixed_mode = psb_intel_output->mode_dev->panel_fixed_mode2; 355 + if (psb_intel_encoder->type == INTEL_OUTPUT_MIPI2) 356 + fixed_mode = dev_priv->mode_dev.panel_fixed_mode2; 358 357 359 358 /* just in case */ 360 359 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) ··· 378 375 struct drm_display_mode *mode, 379 376 struct drm_display_mode *adjusted_mode) 380 377 { 381 - struct psb_intel_mode_device *mode_dev = 382 - enc_to_psb_intel_output(encoder)->mode_dev; 383 378 struct drm_device *dev = encoder->dev; 379 + struct drm_psb_private *dev_priv = dev->dev_private; 380 + struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 384 381 struct psb_intel_crtc *psb_intel_crtc = 385 382 to_psb_intel_crtc(encoder->crtc); 386 383 struct drm_encoder *tmp_encoder; 387 384 struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode; 388 - struct psb_intel_output *psb_intel_output = 389 - enc_to_psb_intel_output(encoder); 385 + struct psb_intel_encoder *psb_intel_encoder = 386 + to_psb_intel_encoder(encoder); 390 387 391 - if (psb_intel_output->type == INTEL_OUTPUT_MIPI2) 388 + if (psb_intel_encoder->type == INTEL_OUTPUT_MIPI2) 392 389 panel_fixed_mode = mode_dev->panel_fixed_mode2; 393 390 394 391 /* PSB requires the LVDS is on pipe B, MRST has only one pipe anyway */ ··· 443 440 static void psb_intel_lvds_prepare(struct drm_encoder *encoder) 444 441 { 445 442 struct drm_device *dev = encoder->dev; 446 - struct psb_intel_output *output = enc_to_psb_intel_output(encoder); 447 - struct psb_intel_mode_device *mode_dev = output->mode_dev; 443 + struct drm_psb_private *dev_priv = dev->dev_private; 444 + struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 448 445 449 446 if (!gma_power_begin(dev, true)) 450 447 return; ··· 453 450 mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL & 454 451 BACKLIGHT_DUTY_CYCLE_MASK); 455 452 456 - psb_intel_lvds_set_power(dev, output, false); 453 + psb_intel_lvds_set_power(dev, false); 457 454 458 455 gma_power_end(dev); 459 456 } ··· 461 458 static void psb_intel_lvds_commit(struct drm_encoder *encoder) 462 459 { 463 460 struct drm_device *dev = encoder->dev; 464 - struct psb_intel_output *output = enc_to_psb_intel_output(encoder); 465 - struct psb_intel_mode_device *mode_dev = output->mode_dev; 461 + struct drm_psb_private *dev_priv = dev->dev_private; 462 + struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 466 463 467 464 if (mode_dev->backlight_duty_cycle == 0) 468 465 mode_dev->backlight_duty_cycle = 469 466 psb_intel_lvds_get_max_backlight(dev); 470 467 471 - psb_intel_lvds_set_power(dev, output, true); 468 + psb_intel_lvds_set_power(dev, true); 472 469 } 473 470 474 471 static void psb_intel_lvds_mode_set(struct drm_encoder *encoder, ··· 523 520 static int psb_intel_lvds_get_modes(struct drm_connector *connector) 524 521 { 525 522 struct drm_device *dev = connector->dev; 526 - struct psb_intel_output *psb_intel_output = 527 - to_psb_intel_output(connector); 528 - struct psb_intel_mode_device *mode_dev = 529 - psb_intel_output->mode_dev; 523 + struct drm_psb_private *dev_priv = dev->dev_private; 524 + struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 525 + struct psb_intel_encoder *psb_intel_encoder = 526 + psb_intel_attached_encoder(connector); 527 + struct psb_intel_lvds_priv *lvds_priv = psb_intel_encoder->dev_priv; 530 528 int ret = 0; 531 529 532 530 if (!IS_MRST(dev)) 533 - ret = psb_intel_ddc_get_modes(psb_intel_output); 531 + ret = psb_intel_ddc_get_modes(connector, &lvds_priv->i2c_bus->adapter); 534 532 535 533 if (ret) 536 534 return ret; ··· 564 560 */ 565 561 void psb_intel_lvds_destroy(struct drm_connector *connector) 566 562 { 567 - struct psb_intel_output *psb_intel_output = 568 - to_psb_intel_output(connector); 563 + struct psb_intel_encoder *psb_intel_encoder = 564 + psb_intel_attached_encoder(connector); 565 + struct psb_intel_lvds_priv *lvds_priv = psb_intel_encoder->dev_priv; 569 566 570 - if (psb_intel_output->ddc_bus) 571 - psb_intel_i2c_destroy(psb_intel_output->ddc_bus); 567 + if (lvds_priv->ddc_bus) 568 + psb_intel_i2c_destroy(lvds_priv->ddc_bus); 572 569 drm_sysfs_connector_remove(connector); 573 570 drm_connector_cleanup(connector); 574 571 kfree(connector); ··· 698 693 * modes we can display on the LVDS panel (if present). 699 694 */ 700 695 void psb_intel_lvds_init(struct drm_device *dev, 701 - struct psb_intel_mode_device *mode_dev) 696 + struct psb_intel_mode_device *mode_dev) 702 697 { 703 - struct psb_intel_output *psb_intel_output; 698 + struct psb_intel_encoder *psb_intel_encoder; 699 + struct psb_intel_connector *psb_intel_connector; 704 700 struct psb_intel_lvds_priv *lvds_priv; 705 701 struct drm_connector *connector; 706 702 struct drm_encoder *encoder; ··· 711 705 u32 lvds; 712 706 int pipe; 713 707 714 - psb_intel_output = kzalloc(sizeof(struct psb_intel_output), GFP_KERNEL); 715 - if (!psb_intel_output) 716 - return; 708 + psb_intel_encoder = 709 + kzalloc(sizeof(struct psb_intel_encoder), GFP_KERNEL); 717 710 718 - lvds_priv = kzalloc(sizeof(struct psb_intel_lvds_priv), GFP_KERNEL); 719 - if (!lvds_priv) { 720 - kfree(psb_intel_output); 721 - dev_err(dev->dev, "LVDS private allocation error\n"); 711 + if (!psb_intel_encoder) { 712 + dev_err(dev->dev, "psb_intel_encoder allocation error\n"); 722 713 return; 723 714 } 724 715 725 - psb_intel_output->dev_priv = lvds_priv; 726 - psb_intel_output->mode_dev = mode_dev; 716 + psb_intel_connector = 717 + kzalloc(sizeof(struct psb_intel_connector), GFP_KERNEL); 727 718 728 - connector = &psb_intel_output->base; 729 - encoder = &psb_intel_output->enc; 730 - drm_connector_init(dev, &psb_intel_output->base, 719 + if (!psb_intel_connector) { 720 + kfree(psb_intel_encoder); 721 + dev_err(dev->dev, "psb_intel_connector allocation error\n"); 722 + } 723 + 724 + lvds_priv = kzalloc(sizeof(struct psb_intel_lvds_priv), GFP_KERNEL); 725 + if (!lvds_priv) { 726 + dev_err(dev->dev, "LVDS private allocation error\n"); 727 + goto failed_connector; 728 + } 729 + 730 + psb_intel_encoder->dev_priv = lvds_priv; 731 + 732 + connector = &psb_intel_connector->base; 733 + encoder = &psb_intel_encoder->base; 734 + drm_connector_init(dev, connector, 731 735 &psb_intel_lvds_connector_funcs, 732 736 DRM_MODE_CONNECTOR_LVDS); 733 737 734 - drm_encoder_init(dev, &psb_intel_output->enc, 738 + drm_encoder_init(dev, encoder, 735 739 &psb_intel_lvds_enc_funcs, 736 740 DRM_MODE_ENCODER_LVDS); 737 741 738 - drm_mode_connector_attach_encoder(&psb_intel_output->base, 739 - &psb_intel_output->enc); 740 - psb_intel_output->type = INTEL_OUTPUT_LVDS; 742 + psb_intel_connector_attach_encoder(psb_intel_connector, 743 + psb_intel_encoder); 744 + psb_intel_encoder->type = INTEL_OUTPUT_LVDS; 741 745 742 746 drm_encoder_helper_add(encoder, &psb_intel_lvds_helper_funcs); 743 747 drm_connector_helper_add(connector, ··· 768 752 * Set up I2C bus 769 753 * FIXME: distroy i2c_bus when exit 770 754 */ 771 - psb_intel_output->i2c_bus = psb_intel_i2c_create(dev, 772 - GPIOB, 773 - "LVDSBLC_B"); 774 - if (!psb_intel_output->i2c_bus) { 755 + lvds_priv->i2c_bus = psb_intel_i2c_create(dev, GPIOB, "LVDSBLC_B"); 756 + if (!lvds_priv->i2c_bus) { 775 757 dev_printk(KERN_ERR, 776 758 &dev->pdev->dev, "I2C bus registration failed.\n"); 777 759 goto failed_blc_i2c; 778 760 } 779 - psb_intel_output->i2c_bus->slave_addr = 0x2C; 780 - dev_priv->lvds_i2c_bus = psb_intel_output->i2c_bus; 761 + lvds_priv->i2c_bus->slave_addr = 0x2C; 762 + dev_priv->lvds_i2c_bus = lvds_priv->i2c_bus; 781 763 782 764 /* 783 765 * LVDS discovery: ··· 788 774 */ 789 775 790 776 /* Set up the DDC bus. */ 791 - psb_intel_output->ddc_bus = psb_intel_i2c_create(dev, 792 - GPIOC, 793 - "LVDSDDC_C"); 794 - if (!psb_intel_output->ddc_bus) { 777 + lvds_priv->ddc_bus = psb_intel_i2c_create(dev, GPIOC, "LVDSDDC_C"); 778 + if (!lvds_priv->ddc_bus) { 795 779 dev_printk(KERN_ERR, &dev->pdev->dev, 796 780 "DDC bus registration " "failed.\n"); 797 781 goto failed_ddc; ··· 799 787 * Attempt to get the fixed panel mode from DDC. Assume that the 800 788 * preferred mode is the right one. 801 789 */ 802 - psb_intel_ddc_get_modes(psb_intel_output); 790 + psb_intel_ddc_get_modes(connector, &lvds_priv->ddc_bus->adapter); 803 791 list_for_each_entry(scan, &connector->probed_modes, head) { 804 792 if (scan->type & DRM_MODE_TYPE_PREFERRED) { 805 793 mode_dev->panel_fixed_mode = ··· 853 841 return; 854 842 855 843 failed_find: 856 - if (psb_intel_output->ddc_bus) 857 - psb_intel_i2c_destroy(psb_intel_output->ddc_bus); 844 + if (lvds_priv->ddc_bus) 845 + psb_intel_i2c_destroy(lvds_priv->ddc_bus); 858 846 failed_ddc: 859 - if (psb_intel_output->i2c_bus) 860 - psb_intel_i2c_destroy(psb_intel_output->i2c_bus); 847 + if (lvds_priv->i2c_bus) 848 + psb_intel_i2c_destroy(lvds_priv->i2c_bus); 861 849 failed_blc_i2c: 862 850 drm_encoder_cleanup(encoder); 863 851 drm_connector_cleanup(connector); 864 - kfree(connector); 852 + failed_connector: 853 + if (psb_intel_connector) 854 + kfree(psb_intel_connector); 865 855 } 866 856