aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2013-11-14 05:13:41 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-14 06:21:47 -0500
commitb35684b8fa94e04f55fd38bf672b737741d2f9e2 (patch)
treed41fa761edf174cd88422f862e3a13e121c6e95d
parent636baebfa62fa31b204bc5a816700bd2fd135e57 (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.c149
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
762static void i9xx_enable_backlight(struct intel_connector *connector) 764static 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
796static void vlv_enable_backlight(struct intel_connector *connector) 829static 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
821void intel_panel_enable_backlight(struct intel_connector *connector) 858void intel_panel_enable_backlight(struct intel_connector *connector)