diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 67 |
4 files changed, 102 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index b2023d7c1d6b..b0dd4ea8133f 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -745,6 +745,9 @@ struct i915_suspend_saved_registers { | |||
| 745 | u32 saveBLC_HIST_CTL; | 745 | u32 saveBLC_HIST_CTL; |
| 746 | u32 saveBLC_PWM_CTL; | 746 | u32 saveBLC_PWM_CTL; |
| 747 | u32 saveBLC_PWM_CTL2; | 747 | u32 saveBLC_PWM_CTL2; |
| 748 | u32 saveBLC_HIST_CTL_B; | ||
| 749 | u32 saveBLC_PWM_CTL_B; | ||
| 750 | u32 saveBLC_PWM_CTL2_B; | ||
| 748 | u32 saveBLC_CPU_PWM_CTL; | 751 | u32 saveBLC_CPU_PWM_CTL; |
| 749 | u32 saveBLC_CPU_PWM_CTL2; | 752 | u32 saveBLC_CPU_PWM_CTL2; |
| 750 | u32 saveFPB0; | 753 | u32 saveFPB0; |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 98d7263fba67..04896da9001c 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -2395,6 +2395,21 @@ | |||
| 2395 | 2395 | ||
| 2396 | #define PFIT_AUTO_RATIOS (dev_priv->info->display_mmio_offset + 0x61238) | 2396 | #define PFIT_AUTO_RATIOS (dev_priv->info->display_mmio_offset + 0x61238) |
| 2397 | 2397 | ||
| 2398 | #define _VLV_BLC_PWM_CTL2_A (dev_priv->info->display_mmio_offset + 0x61250) | ||
| 2399 | #define _VLV_BLC_PWM_CTL2_B (dev_priv->info->display_mmio_offset + 0x61350) | ||
| 2400 | #define VLV_BLC_PWM_CTL2(pipe) _PIPE(pipe, _VLV_BLC_PWM_CTL2_A, \ | ||
| 2401 | _VLV_BLC_PWM_CTL2_B) | ||
| 2402 | |||
| 2403 | #define _VLV_BLC_PWM_CTL_A (dev_priv->info->display_mmio_offset + 0x61254) | ||
| 2404 | #define _VLV_BLC_PWM_CTL_B (dev_priv->info->display_mmio_offset + 0x61354) | ||
| 2405 | #define VLV_BLC_PWM_CTL(pipe) _PIPE(pipe, _VLV_BLC_PWM_CTL_A, \ | ||
| 2406 | _VLV_BLC_PWM_CTL_B) | ||
| 2407 | |||
| 2408 | #define _VLV_BLC_HIST_CTL_A (dev_priv->info->display_mmio_offset + 0x61260) | ||
| 2409 | #define _VLV_BLC_HIST_CTL_B (dev_priv->info->display_mmio_offset + 0x61360) | ||
| 2410 | #define VLV_BLC_HIST_CTL(pipe) _PIPE(pipe, _VLV_BLC_HIST_CTL_A, \ | ||
| 2411 | _VLV_BLC_HIST_CTL_B) | ||
| 2412 | |||
| 2398 | /* Backlight control */ | 2413 | /* Backlight control */ |
| 2399 | #define BLC_PWM_CTL2 (dev_priv->info->display_mmio_offset + 0x61250) /* 965+ only */ | 2414 | #define BLC_PWM_CTL2 (dev_priv->info->display_mmio_offset + 0x61250) /* 965+ only */ |
| 2400 | #define BLM_PWM_ENABLE (1 << 31) | 2415 | #define BLM_PWM_ENABLE (1 << 31) |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index a088f1f46bdb..98790c7cccb1 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -214,6 +214,22 @@ static void i915_save_display(struct drm_device *dev) | |||
| 214 | dev_priv->regfile.saveBLC_CPU_PWM_CTL2 = I915_READ(BLC_PWM_CPU_CTL2); | 214 | dev_priv->regfile.saveBLC_CPU_PWM_CTL2 = I915_READ(BLC_PWM_CPU_CTL2); |
| 215 | if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) | 215 | if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) |
| 216 | dev_priv->regfile.saveLVDS = I915_READ(PCH_LVDS); | 216 | dev_priv->regfile.saveLVDS = I915_READ(PCH_LVDS); |
| 217 | } else if (IS_VALLEYVIEW(dev)) { | ||
| 218 | dev_priv->regfile.savePP_CONTROL = I915_READ(PP_CONTROL); | ||
| 219 | dev_priv->regfile.savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); | ||
| 220 | |||
| 221 | dev_priv->regfile.saveBLC_PWM_CTL = | ||
| 222 | I915_READ(VLV_BLC_PWM_CTL(PIPE_A)); | ||
| 223 | dev_priv->regfile.saveBLC_HIST_CTL = | ||
| 224 | I915_READ(VLV_BLC_HIST_CTL(PIPE_A)); | ||
| 225 | dev_priv->regfile.saveBLC_PWM_CTL2 = | ||
| 226 | I915_READ(VLV_BLC_PWM_CTL2(PIPE_A)); | ||
| 227 | dev_priv->regfile.saveBLC_PWM_CTL_B = | ||
| 228 | I915_READ(VLV_BLC_PWM_CTL(PIPE_B)); | ||
| 229 | dev_priv->regfile.saveBLC_HIST_CTL_B = | ||
| 230 | I915_READ(VLV_BLC_HIST_CTL(PIPE_B)); | ||
| 231 | dev_priv->regfile.saveBLC_PWM_CTL2_B = | ||
| 232 | I915_READ(VLV_BLC_PWM_CTL2(PIPE_B)); | ||
| 217 | } else { | 233 | } else { |
| 218 | dev_priv->regfile.savePP_CONTROL = I915_READ(PP_CONTROL); | 234 | dev_priv->regfile.savePP_CONTROL = I915_READ(PP_CONTROL); |
| 219 | dev_priv->regfile.savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); | 235 | dev_priv->regfile.savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); |
| @@ -302,6 +318,19 @@ static void i915_restore_display(struct drm_device *dev) | |||
| 302 | I915_WRITE(PCH_PP_CONTROL, dev_priv->regfile.savePP_CONTROL); | 318 | I915_WRITE(PCH_PP_CONTROL, dev_priv->regfile.savePP_CONTROL); |
| 303 | I915_WRITE(RSTDBYCTL, | 319 | I915_WRITE(RSTDBYCTL, |
| 304 | dev_priv->regfile.saveMCHBAR_RENDER_STANDBY); | 320 | dev_priv->regfile.saveMCHBAR_RENDER_STANDBY); |
| 321 | } else if (IS_VALLEYVIEW(dev)) { | ||
| 322 | I915_WRITE(VLV_BLC_PWM_CTL(PIPE_A), | ||
| 323 | dev_priv->regfile.saveBLC_PWM_CTL); | ||
| 324 | I915_WRITE(VLV_BLC_HIST_CTL(PIPE_A), | ||
| 325 | dev_priv->regfile.saveBLC_HIST_CTL); | ||
| 326 | I915_WRITE(VLV_BLC_PWM_CTL2(PIPE_A), | ||
| 327 | dev_priv->regfile.saveBLC_PWM_CTL2); | ||
| 328 | I915_WRITE(VLV_BLC_PWM_CTL(PIPE_B), | ||
| 329 | dev_priv->regfile.saveBLC_PWM_CTL); | ||
| 330 | I915_WRITE(VLV_BLC_HIST_CTL(PIPE_B), | ||
| 331 | dev_priv->regfile.saveBLC_HIST_CTL); | ||
| 332 | I915_WRITE(VLV_BLC_PWM_CTL2(PIPE_B), | ||
| 333 | dev_priv->regfile.saveBLC_PWM_CTL2); | ||
| 305 | } else { | 334 | } else { |
| 306 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->regfile.savePFIT_PGM_RATIOS); | 335 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->regfile.savePFIT_PGM_RATIOS); |
| 307 | I915_WRITE(BLC_PWM_CTL, dev_priv->regfile.saveBLC_PWM_CTL); | 336 | I915_WRITE(BLC_PWM_CTL, dev_priv->regfile.saveBLC_PWM_CTL); |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 17ddcb00bd26..cad41ac330e8 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -358,6 +358,21 @@ static u32 i915_read_blc_pwm_ctl(struct drm_device *dev, enum pipe pipe) | |||
| 358 | val = dev_priv->regfile.saveBLC_PWM_CTL2; | 358 | val = dev_priv->regfile.saveBLC_PWM_CTL2; |
| 359 | I915_WRITE(BLC_PWM_PCH_CTL2, val); | 359 | I915_WRITE(BLC_PWM_PCH_CTL2, val); |
| 360 | } | 360 | } |
| 361 | } else if (IS_VALLEYVIEW(dev)) { | ||
| 362 | val = I915_READ(VLV_BLC_PWM_CTL(pipe)); | ||
| 363 | if (dev_priv->regfile.saveBLC_PWM_CTL == 0) { | ||
| 364 | dev_priv->regfile.saveBLC_PWM_CTL = val; | ||
| 365 | dev_priv->regfile.saveBLC_PWM_CTL2 = | ||
| 366 | I915_READ(VLV_BLC_PWM_CTL2(pipe)); | ||
| 367 | } else if (val == 0) { | ||
| 368 | val = dev_priv->regfile.saveBLC_PWM_CTL; | ||
| 369 | I915_WRITE(VLV_BLC_PWM_CTL(pipe), val); | ||
| 370 | I915_WRITE(VLV_BLC_PWM_CTL2(pipe), | ||
| 371 | dev_priv->regfile.saveBLC_PWM_CTL2); | ||
| 372 | } | ||
| 373 | |||
| 374 | if (!val) | ||
| 375 | val = 0x0f42ffff; | ||
| 361 | } else { | 376 | } else { |
| 362 | val = I915_READ(BLC_PWM_CTL); | 377 | val = I915_READ(BLC_PWM_CTL); |
| 363 | if (dev_priv->regfile.saveBLC_PWM_CTL == 0) { | 378 | if (dev_priv->regfile.saveBLC_PWM_CTL == 0) { |
| @@ -372,9 +387,6 @@ static u32 i915_read_blc_pwm_ctl(struct drm_device *dev, enum pipe pipe) | |||
| 372 | I915_WRITE(BLC_PWM_CTL2, | 387 | I915_WRITE(BLC_PWM_CTL2, |
| 373 | dev_priv->regfile.saveBLC_PWM_CTL2); | 388 | dev_priv->regfile.saveBLC_PWM_CTL2); |
| 374 | } | 389 | } |
| 375 | |||
| 376 | if (IS_VALLEYVIEW(dev) && !val) | ||
| 377 | val = 0x0f42ffff; | ||
| 378 | } | 390 | } |
| 379 | 391 | ||
| 380 | return val; | 392 | return val; |
| @@ -435,13 +447,19 @@ static u32 intel_panel_get_backlight(struct drm_device *dev, | |||
| 435 | struct drm_i915_private *dev_priv = dev->dev_private; | 447 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 436 | u32 val; | 448 | u32 val; |
| 437 | unsigned long flags; | 449 | unsigned long flags; |
| 450 | int reg; | ||
| 438 | 451 | ||
| 439 | spin_lock_irqsave(&dev_priv->backlight.lock, flags); | 452 | spin_lock_irqsave(&dev_priv->backlight.lock, flags); |
| 440 | 453 | ||
| 441 | if (HAS_PCH_SPLIT(dev)) { | 454 | if (HAS_PCH_SPLIT(dev)) { |
| 442 | val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; | 455 | val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; |
| 443 | } else { | 456 | } else { |
| 444 | val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; | 457 | if (IS_VALLEYVIEW(dev)) |
| 458 | reg = VLV_BLC_PWM_CTL(pipe); | ||
| 459 | else | ||
| 460 | reg = BLC_PWM_CTL; | ||
| 461 | |||
| 462 | val = I915_READ(reg) & BACKLIGHT_DUTY_CYCLE_MASK; | ||
| 445 | if (INTEL_INFO(dev)->gen < 4) | 463 | if (INTEL_INFO(dev)->gen < 4) |
| 446 | val >>= 1; | 464 | val >>= 1; |
| 447 | 465 | ||
| @@ -473,6 +491,7 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, | |||
| 473 | { | 491 | { |
| 474 | struct drm_i915_private *dev_priv = dev->dev_private; | 492 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 475 | u32 tmp; | 493 | u32 tmp; |
| 494 | int reg; | ||
| 476 | 495 | ||
| 477 | DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); | 496 | DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); |
| 478 | level = intel_panel_compute_brightness(dev, pipe, level); | 497 | level = intel_panel_compute_brightness(dev, pipe, level); |
| @@ -493,11 +512,16 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, | |||
| 493 | pci_write_config_byte(dev->pdev, PCI_LBPC, lbpc); | 512 | pci_write_config_byte(dev->pdev, PCI_LBPC, lbpc); |
| 494 | } | 513 | } |
| 495 | 514 | ||
| 496 | tmp = I915_READ(BLC_PWM_CTL); | 515 | if (IS_VALLEYVIEW(dev)) |
| 516 | reg = VLV_BLC_PWM_CTL(pipe); | ||
| 517 | else | ||
| 518 | reg = BLC_PWM_CTL; | ||
| 519 | |||
| 520 | tmp = I915_READ(reg); | ||
| 497 | if (INTEL_INFO(dev)->gen < 4) | 521 | if (INTEL_INFO(dev)->gen < 4) |
| 498 | level <<= 1; | 522 | level <<= 1; |
| 499 | tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; | 523 | tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; |
| 500 | I915_WRITE(BLC_PWM_CTL, tmp | level); | 524 | I915_WRITE(reg, tmp | level); |
| 501 | } | 525 | } |
| 502 | 526 | ||
| 503 | /* set backlight brightness to level in range [0..max] */ | 527 | /* set backlight brightness to level in range [0..max] */ |
| @@ -566,7 +590,12 @@ void intel_panel_disable_backlight(struct intel_connector *connector) | |||
| 566 | if (INTEL_INFO(dev)->gen >= 4) { | 590 | if (INTEL_INFO(dev)->gen >= 4) { |
| 567 | uint32_t reg, tmp; | 591 | uint32_t reg, tmp; |
| 568 | 592 | ||
| 569 | reg = HAS_PCH_SPLIT(dev) ? BLC_PWM_CPU_CTL2 : BLC_PWM_CTL2; | 593 | if (HAS_PCH_SPLIT(dev)) |
| 594 | reg = BLC_PWM_CPU_CTL2; | ||
| 595 | else if (IS_VALLEYVIEW(dev)) | ||
| 596 | reg = VLV_BLC_PWM_CTL2(pipe); | ||
| 597 | else | ||
| 598 | reg = BLC_PWM_CTL2; | ||
| 570 | 599 | ||
| 571 | I915_WRITE(reg, I915_READ(reg) & ~BLM_PWM_ENABLE); | 600 | I915_WRITE(reg, I915_READ(reg) & ~BLM_PWM_ENABLE); |
| 572 | 601 | ||
| @@ -607,8 +636,12 @@ void intel_panel_enable_backlight(struct intel_connector *connector) | |||
| 607 | if (INTEL_INFO(dev)->gen >= 4) { | 636 | if (INTEL_INFO(dev)->gen >= 4) { |
| 608 | uint32_t reg, tmp; | 637 | uint32_t reg, tmp; |
| 609 | 638 | ||
| 610 | reg = HAS_PCH_SPLIT(dev) ? BLC_PWM_CPU_CTL2 : BLC_PWM_CTL2; | 639 | if (HAS_PCH_SPLIT(dev)) |
| 611 | 640 | reg = BLC_PWM_CPU_CTL2; | |
| 641 | else if (IS_VALLEYVIEW(dev)) | ||
| 642 | reg = VLV_BLC_PWM_CTL2(pipe); | ||
| 643 | else | ||
| 644 | reg = BLC_PWM_CTL2; | ||
| 612 | 645 | ||
| 613 | tmp = I915_READ(reg); | 646 | tmp = I915_READ(reg); |
| 614 | 647 | ||
| @@ -660,9 +693,19 @@ static void intel_panel_init_backlight_regs(struct drm_device *dev) | |||
| 660 | struct drm_i915_private *dev_priv = dev->dev_private; | 693 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 661 | 694 | ||
| 662 | if (IS_VALLEYVIEW(dev)) { | 695 | if (IS_VALLEYVIEW(dev)) { |
| 663 | u32 cur_val = I915_READ(BLC_PWM_CTL) & | 696 | enum pipe pipe; |
| 664 | BACKLIGHT_DUTY_CYCLE_MASK; | 697 | |
| 665 | I915_WRITE(BLC_PWM_CTL, (0xf42 << 16) | cur_val); | 698 | for_each_pipe(pipe) { |
| 699 | u32 cur_val = I915_READ(VLV_BLC_PWM_CTL(pipe)); | ||
| 700 | |||
| 701 | /* Skip if the modulation freq is already set */ | ||
| 702 | if (cur_val & ~BACKLIGHT_DUTY_CYCLE_MASK) | ||
| 703 | continue; | ||
| 704 | |||
| 705 | cur_val &= BACKLIGHT_DUTY_CYCLE_MASK; | ||
| 706 | I915_WRITE(VLV_BLC_PWM_CTL(pipe), (0xf42 << 16) | | ||
| 707 | cur_val); | ||
| 708 | } | ||
| 666 | } | 709 | } |
| 667 | } | 710 | } |
| 668 | 711 | ||
