diff options
author | Jani Nikula <jani.nikula@intel.com> | 2013-11-14 05:13:41 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-11-14 06:21:47 -0500 |
commit | b35684b8fa94e04f55fd38bf672b737741d2f9e2 (patch) | |
tree | d41fa761edf174cd88422f862e3a13e121c6e95d | |
parent | 636baebfa62fa31b204bc5a816700bd2fd135e57 (diff) |
drm/i915: do full backlight setup at enable time
We should now have all the information we need to do a full
initialization of the backlight registers.
v2: Keep QUIRK_NO_PCH_PWM_ENABLE for now (Imre).
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 149 |
1 files changed, 93 insertions, 56 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 0e8f0a3d3bf6..0986472d4254 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -719,50 +719,75 @@ static void pch_enable_backlight(struct intel_connector *connector) | |||
719 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 719 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
720 | enum transcoder cpu_transcoder = | 720 | enum transcoder cpu_transcoder = |
721 | intel_pipe_to_cpu_transcoder(dev_priv, pipe); | 721 | intel_pipe_to_cpu_transcoder(dev_priv, pipe); |
722 | u32 tmp; | 722 | u32 cpu_ctl2, pch_ctl1, pch_ctl2; |
723 | |||
724 | tmp = I915_READ(BLC_PWM_CPU_CTL2); | ||
725 | 723 | ||
726 | /* Note that this can also get called through dpms changes. And | 724 | cpu_ctl2 = I915_READ(BLC_PWM_CPU_CTL2); |
727 | * we don't track the backlight dpms state, hence check whether | 725 | if (cpu_ctl2 & BLM_PWM_ENABLE) { |
728 | * we have to do anything first. */ | 726 | WARN(1, "cpu backlight already enabled\n"); |
729 | if (tmp & BLM_PWM_ENABLE) | 727 | cpu_ctl2 &= ~BLM_PWM_ENABLE; |
730 | return; | 728 | I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2); |
729 | } | ||
731 | 730 | ||
732 | if (INTEL_INFO(dev)->num_pipes == 3) | 731 | pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1); |
733 | tmp &= ~BLM_PIPE_SELECT_IVB; | 732 | if (pch_ctl1 & BLM_PCH_PWM_ENABLE) { |
734 | else | 733 | DRM_DEBUG_KMS("pch backlight already enabled\n"); |
735 | tmp &= ~BLM_PIPE_SELECT; | 734 | pch_ctl1 &= ~BLM_PCH_PWM_ENABLE; |
735 | I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1); | ||
736 | } | ||
736 | 737 | ||
737 | if (cpu_transcoder == TRANSCODER_EDP) | 738 | if (cpu_transcoder == TRANSCODER_EDP) |
738 | tmp |= BLM_TRANSCODER_EDP; | 739 | cpu_ctl2 = BLM_TRANSCODER_EDP; |
739 | else | 740 | else |
740 | tmp |= BLM_PIPE(cpu_transcoder); | 741 | cpu_ctl2 = BLM_PIPE(cpu_transcoder); |
741 | tmp &= ~BLM_PWM_ENABLE; | 742 | I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2); |
742 | |||
743 | I915_WRITE(BLC_PWM_CPU_CTL2, tmp); | ||
744 | POSTING_READ(BLC_PWM_CPU_CTL2); | 743 | POSTING_READ(BLC_PWM_CPU_CTL2); |
745 | I915_WRITE(BLC_PWM_CPU_CTL2, tmp | BLM_PWM_ENABLE); | 744 | I915_WRITE(BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE); |
746 | |||
747 | if (!(dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE)) { | ||
748 | tmp = I915_READ(BLC_PWM_PCH_CTL1); | ||
749 | tmp |= BLM_PCH_PWM_ENABLE; | ||
750 | tmp &= ~BLM_PCH_OVERRIDE_ENABLE; | ||
751 | I915_WRITE(BLC_PWM_PCH_CTL1, tmp); | ||
752 | } | ||
753 | 745 | ||
754 | /* | 746 | /* This won't stick until the above enable. */ |
755 | * Call below after setting BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1. | ||
756 | * BLC_PWM_CPU_CTL may be cleared to zero automatically when these | ||
757 | * registers are set. | ||
758 | */ | ||
759 | intel_panel_actually_set_backlight(connector, panel->backlight.level); | 747 | intel_panel_actually_set_backlight(connector, panel->backlight.level); |
748 | |||
749 | pch_ctl2 = panel->backlight.max << 16; | ||
750 | I915_WRITE(BLC_PWM_PCH_CTL2, pch_ctl2); | ||
751 | |||
752 | /* XXX: transitional */ | ||
753 | if (dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE) | ||
754 | return; | ||
755 | |||
756 | pch_ctl1 = 0; | ||
757 | if (panel->backlight.active_low_pwm) | ||
758 | pch_ctl1 |= BLM_PCH_POLARITY; | ||
759 | I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1); | ||
760 | POSTING_READ(BLC_PWM_PCH_CTL1); | ||
761 | I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1 | BLM_PCH_PWM_ENABLE); | ||
760 | } | 762 | } |
761 | 763 | ||
762 | static void i9xx_enable_backlight(struct intel_connector *connector) | 764 | static void i9xx_enable_backlight(struct intel_connector *connector) |
763 | { | 765 | { |
766 | struct drm_device *dev = connector->base.dev; | ||
767 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
764 | struct intel_panel *panel = &connector->panel; | 768 | struct intel_panel *panel = &connector->panel; |
769 | u32 ctl, freq; | ||
770 | |||
771 | ctl = I915_READ(BLC_PWM_CTL); | ||
772 | if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) { | ||
773 | WARN(1, "backlight already enabled\n"); | ||
774 | I915_WRITE(BLC_PWM_CTL, 0); | ||
775 | } | ||
765 | 776 | ||
777 | freq = panel->backlight.max; | ||
778 | if (panel->backlight.combination_mode) | ||
779 | freq /= 0xff; | ||
780 | |||
781 | ctl = freq << 17; | ||
782 | if (IS_GEN2(dev) && panel->backlight.combination_mode) | ||
783 | ctl |= BLM_LEGACY_MODE; | ||
784 | if (IS_PINEVIEW(dev) && panel->backlight.active_low_pwm) | ||
785 | ctl |= BLM_POLARITY_PNV; | ||
786 | |||
787 | I915_WRITE(BLC_PWM_CTL, ctl); | ||
788 | POSTING_READ(BLC_PWM_CTL); | ||
789 | |||
790 | /* XXX: combine this into above write? */ | ||
766 | intel_panel_actually_set_backlight(connector, panel->backlight.level); | 791 | intel_panel_actually_set_backlight(connector, panel->backlight.level); |
767 | } | 792 | } |
768 | 793 | ||
@@ -772,25 +797,33 @@ static void i965_enable_backlight(struct intel_connector *connector) | |||
772 | struct drm_i915_private *dev_priv = dev->dev_private; | 797 | struct drm_i915_private *dev_priv = dev->dev_private; |
773 | struct intel_panel *panel = &connector->panel; | 798 | struct intel_panel *panel = &connector->panel; |
774 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 799 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
775 | u32 tmp; | 800 | u32 ctl, ctl2, freq; |
776 | 801 | ||
777 | tmp = I915_READ(BLC_PWM_CTL2); | 802 | ctl2 = I915_READ(BLC_PWM_CTL2); |
803 | if (ctl2 & BLM_PWM_ENABLE) { | ||
804 | WARN(1, "backlight already enabled\n"); | ||
805 | ctl2 &= ~BLM_PWM_ENABLE; | ||
806 | I915_WRITE(BLC_PWM_CTL2, ctl2); | ||
807 | } | ||
778 | 808 | ||
779 | /* Note that this can also get called through dpms changes. And | 809 | freq = panel->backlight.max; |
780 | * we don't track the backlight dpms state, hence check whether | 810 | if (panel->backlight.combination_mode) |
781 | * we have to do anything first. */ | 811 | freq /= 0xff; |
782 | if (tmp & BLM_PWM_ENABLE) | ||
783 | return; | ||
784 | 812 | ||
785 | tmp &= ~BLM_PIPE_SELECT; | 813 | ctl = freq << 16; |
786 | tmp |= BLM_PIPE(pipe); | 814 | I915_WRITE(BLC_PWM_CTL, ctl); |
787 | tmp &= ~BLM_PWM_ENABLE; | ||
788 | |||
789 | I915_WRITE(BLC_PWM_CTL2, tmp); | ||
790 | POSTING_READ(BLC_PWM_CTL2); | ||
791 | I915_WRITE(BLC_PWM_CTL2, tmp | BLM_PWM_ENABLE); | ||
792 | 815 | ||
816 | /* XXX: combine this into above write? */ | ||
793 | intel_panel_actually_set_backlight(connector, panel->backlight.level); | 817 | intel_panel_actually_set_backlight(connector, panel->backlight.level); |
818 | |||
819 | ctl2 = BLM_PIPE(pipe); | ||
820 | if (panel->backlight.combination_mode) | ||
821 | ctl2 |= BLM_COMBINATION_MODE; | ||
822 | if (panel->backlight.active_low_pwm) | ||
823 | ctl2 |= BLM_POLARITY_I965; | ||
824 | I915_WRITE(BLC_PWM_CTL2, ctl2); | ||
825 | POSTING_READ(BLC_PWM_CTL2); | ||
826 | I915_WRITE(BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE); | ||
794 | } | 827 | } |
795 | 828 | ||
796 | static void vlv_enable_backlight(struct intel_connector *connector) | 829 | static void vlv_enable_backlight(struct intel_connector *connector) |
@@ -799,23 +832,27 @@ static void vlv_enable_backlight(struct intel_connector *connector) | |||
799 | struct drm_i915_private *dev_priv = dev->dev_private; | 832 | struct drm_i915_private *dev_priv = dev->dev_private; |
800 | struct intel_panel *panel = &connector->panel; | 833 | struct intel_panel *panel = &connector->panel; |
801 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 834 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
802 | u32 tmp; | 835 | u32 ctl, ctl2; |
803 | 836 | ||
804 | tmp = I915_READ(VLV_BLC_PWM_CTL2(pipe)); | 837 | ctl2 = I915_READ(VLV_BLC_PWM_CTL2(pipe)); |
838 | if (ctl2 & BLM_PWM_ENABLE) { | ||
839 | WARN(1, "backlight already enabled\n"); | ||
840 | ctl2 &= ~BLM_PWM_ENABLE; | ||
841 | I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2); | ||
842 | } | ||
805 | 843 | ||
806 | /* Note that this can also get called through dpms changes. And | 844 | ctl = panel->backlight.max << 16; |
807 | * we don't track the backlight dpms state, hence check whether | 845 | I915_WRITE(VLV_BLC_PWM_CTL(pipe), ctl); |
808 | * we have to do anything first. */ | ||
809 | if (tmp & BLM_PWM_ENABLE) | ||
810 | return; | ||
811 | 846 | ||
812 | tmp &= ~BLM_PWM_ENABLE; | 847 | /* XXX: combine this into above write? */ |
848 | intel_panel_actually_set_backlight(connector, panel->backlight.level); | ||
813 | 849 | ||
814 | I915_WRITE(VLV_BLC_PWM_CTL2(pipe), tmp); | 850 | ctl2 = 0; |
851 | if (panel->backlight.active_low_pwm) | ||
852 | ctl2 |= BLM_POLARITY_I965; | ||
853 | I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2); | ||
815 | POSTING_READ(VLV_BLC_PWM_CTL2(pipe)); | 854 | POSTING_READ(VLV_BLC_PWM_CTL2(pipe)); |
816 | I915_WRITE(VLV_BLC_PWM_CTL2(pipe), tmp | BLM_PWM_ENABLE); | 855 | I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2 | BLM_PWM_ENABLE); |
817 | |||
818 | intel_panel_actually_set_backlight(connector, panel->backlight.level); | ||
819 | } | 856 | } |
820 | 857 | ||
821 | void intel_panel_enable_backlight(struct intel_connector *connector) | 858 | void intel_panel_enable_backlight(struct intel_connector *connector) |