@@ -719,50 +719,75 @@ static void pch_enable_backlight(struct intel_connector *connector)
719
719
enum pipe pipe = intel_get_pipe_from_connector (connector );
720
720
enum transcoder cpu_transcoder =
721
721
intel_pipe_to_cpu_transcoder (dev_priv , pipe );
722
- u32 tmp ;
723
-
724
- tmp = I915_READ (BLC_PWM_CPU_CTL2 );
722
+ u32 cpu_ctl2 , pch_ctl1 , pch_ctl2 ;
725
723
726
- /* Note that this can also get called through dpms changes. And
727
- * we don't track the backlight dpms state, hence check whether
728
- * we have to do anything first. */
729
- if (tmp & BLM_PWM_ENABLE )
730
- return ;
724
+ cpu_ctl2 = I915_READ (BLC_PWM_CPU_CTL2 );
725
+ if (cpu_ctl2 & BLM_PWM_ENABLE ) {
726
+ WARN (1 , "cpu backlight already enabled\n" );
727
+ cpu_ctl2 &= ~BLM_PWM_ENABLE ;
728
+ I915_WRITE (BLC_PWM_CPU_CTL2 , cpu_ctl2 );
729
+ }
731
730
732
- if (INTEL_INFO (dev )-> num_pipes == 3 )
733
- tmp &= ~BLM_PIPE_SELECT_IVB ;
734
- else
735
- tmp &= ~BLM_PIPE_SELECT ;
731
+ pch_ctl1 = I915_READ (BLC_PWM_PCH_CTL1 );
732
+ if (pch_ctl1 & BLM_PCH_PWM_ENABLE ) {
733
+ DRM_DEBUG_KMS ("pch backlight already enabled\n" );
734
+ pch_ctl1 &= ~BLM_PCH_PWM_ENABLE ;
735
+ I915_WRITE (BLC_PWM_PCH_CTL1 , pch_ctl1 );
736
+ }
736
737
737
738
if (cpu_transcoder == TRANSCODER_EDP )
738
- tmp | = BLM_TRANSCODER_EDP ;
739
+ cpu_ctl2 = BLM_TRANSCODER_EDP ;
739
740
else
740
- tmp |= BLM_PIPE (cpu_transcoder );
741
- tmp &= ~BLM_PWM_ENABLE ;
742
-
743
- I915_WRITE (BLC_PWM_CPU_CTL2 , tmp );
741
+ cpu_ctl2 = BLM_PIPE (cpu_transcoder );
742
+ I915_WRITE (BLC_PWM_CPU_CTL2 , cpu_ctl2 );
744
743
POSTING_READ (BLC_PWM_CPU_CTL2 );
745
- I915_WRITE (BLC_PWM_CPU_CTL2 , tmp | 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
- }
744
+ I915_WRITE (BLC_PWM_CPU_CTL2 , cpu_ctl2 | BLM_PWM_ENABLE );
753
745
754
- /*
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
- */
746
+ /* This won't stick until the above enable. */
759
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
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
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
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
797
struct drm_i915_private * dev_priv = dev -> dev_private ;
773
798
struct intel_panel * panel = & connector -> panel ;
774
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
780
- * we don't track the backlight dpms state, hence check whether
781
- * we have to do anything first. */
782
- if (tmp & BLM_PWM_ENABLE )
783
- return ;
809
+ freq = panel -> backlight .max ;
810
+ if (panel -> backlight .combination_mode )
811
+ freq /= 0xff ;
784
812
785
- tmp &= ~BLM_PIPE_SELECT ;
786
- tmp |= BLM_PIPE (pipe );
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 );
813
+ ctl = freq << 16 ;
814
+ I915_WRITE (BLC_PWM_CTL , ctl );
792
815
816
+ /* XXX: combine this into above write? */
793
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
829
static void vlv_enable_backlight (struct intel_connector * connector )
@@ -799,23 +832,27 @@ static void vlv_enable_backlight(struct intel_connector *connector)
799
832
struct drm_i915_private * dev_priv = dev -> dev_private ;
800
833
struct intel_panel * panel = & connector -> panel ;
801
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
807
- * we don't track the backlight dpms state, hence check whether
808
- * we have to do anything first. */
809
- if (tmp & BLM_PWM_ENABLE )
810
- return ;
844
+ ctl = panel -> backlight .max << 16 ;
845
+ I915_WRITE (VLV_BLC_PWM_CTL (pipe ), ctl );
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
854
POSTING_READ (VLV_BLC_PWM_CTL2 (pipe ));
816
- I915_WRITE (VLV_BLC_PWM_CTL2 (pipe ), tmp | BLM_PWM_ENABLE );
817
-
818
- intel_panel_actually_set_backlight (connector , panel -> backlight .level );
855
+ I915_WRITE (VLV_BLC_PWM_CTL2 (pipe ), ctl2 | BLM_PWM_ENABLE );
819
856
}
820
857
821
858
void intel_panel_enable_backlight (struct intel_connector * connector )
0 commit comments