@@ -224,7 +224,11 @@ static void dw_hdmi_i2c_init(struct dw_hdmi *hdmi)
224
224
hdmi_writeb (hdmi , 0x00 , HDMI_I2CM_SOFTRSTZ );
225
225
226
226
/* Set Standard Mode speed (determined to be 100KHz on iMX6) */
227
- hdmi_writeb (hdmi , 0x00 , HDMI_I2CM_DIV );
227
+ if (hdmi -> dev_type == RCAR_HDMI )
228
+ hdmi_modb (hdmi , 0x00 , HDMI_I2CM_DIV_FAST_STD_MODE_MASK ,
229
+ HDMI_I2CM_DIV );
230
+ else
231
+ hdmi_writeb (hdmi , 0x00 , HDMI_I2CM_DIV );
228
232
229
233
/* Set done, not acknowledged and arbitration interrupt polarities */
230
234
hdmi_writeb (hdmi , HDMI_I2CM_INT_DONE_POL , HDMI_I2CM_INT );
@@ -720,8 +724,11 @@ static void hdmi_video_csc(struct dw_hdmi *hdmi)
720
724
721
725
/* Configure the CSC registers */
722
726
hdmi_writeb (hdmi , interpolation | decimation , HDMI_CSC_CFG );
723
- hdmi_modb (hdmi , color_depth , HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK ,
724
- HDMI_CSC_SCALE );
727
+
728
+ if (hdmi -> dev_type != RCAR_HDMI )
729
+ hdmi_modb (hdmi , color_depth ,
730
+ HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK ,
731
+ HDMI_CSC_SCALE );
725
732
726
733
dw_hdmi_update_csc_coeffs (hdmi );
727
734
}
@@ -771,12 +778,14 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
771
778
}
772
779
773
780
/* set the packetizer registers */
774
- val = ((color_depth << HDMI_VP_PR_CD_COLOR_DEPTH_OFFSET ) &
775
- HDMI_VP_PR_CD_COLOR_DEPTH_MASK ) |
776
- ((hdmi_data -> pix_repet_factor <<
777
- HDMI_VP_PR_CD_DESIRED_PR_FACTOR_OFFSET ) &
778
- HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK );
779
- hdmi_writeb (hdmi , val , HDMI_VP_PR_CD );
781
+ if (hdmi -> dev_type != RCAR_HDMI ) {
782
+ val = ((color_depth << HDMI_VP_PR_CD_COLOR_DEPTH_OFFSET ) &
783
+ HDMI_VP_PR_CD_COLOR_DEPTH_MASK ) |
784
+ ((hdmi_data -> pix_repet_factor <<
785
+ HDMI_VP_PR_CD_DESIRED_PR_FACTOR_OFFSET ) &
786
+ HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK );
787
+ hdmi_writeb (hdmi , val , HDMI_VP_PR_CD );
788
+ }
780
789
781
790
hdmi_modb (hdmi , HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE ,
782
791
HDMI_VP_STUFF_PR_STUFFING_MASK , HDMI_VP_STUFF );
@@ -790,14 +799,20 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
790
799
HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER ;
791
800
}
792
801
793
- hdmi_modb (hdmi , vp_conf ,
794
- HDMI_VP_CONF_PR_EN_MASK |
795
- HDMI_VP_CONF_BYPASS_SELECT_MASK , HDMI_VP_CONF );
802
+ if (hdmi -> dev_type == RCAR_HDMI )
803
+ hdmi_modb (hdmi , vp_conf ,
804
+ HDMI_VP_CONF_BYPASS_SELECT_MASK , HDMI_VP_CONF );
805
+ else
806
+ hdmi_modb (hdmi , vp_conf ,
807
+ HDMI_VP_CONF_PR_EN_MASK |
808
+ HDMI_VP_CONF_BYPASS_SELECT_MASK , HDMI_VP_CONF );
796
809
797
810
hdmi_modb (hdmi , 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET ,
798
811
HDMI_VP_STUFF_IDEFAULT_PHASE_MASK , HDMI_VP_STUFF );
799
812
800
- hdmi_writeb (hdmi , remap_size , HDMI_VP_REMAP );
813
+ if (hdmi -> dev_type != RCAR_HDMI ) {
814
+ hdmi_writeb (hdmi , remap_size , HDMI_VP_REMAP );
815
+ }
801
816
802
817
if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP ) {
803
818
vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
@@ -815,9 +830,15 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
815
830
return ;
816
831
}
817
832
818
- hdmi_modb (hdmi , vp_conf ,
819
- HDMI_VP_CONF_BYPASS_EN_MASK | HDMI_VP_CONF_PP_EN_ENMASK |
820
- HDMI_VP_CONF_YCC422_EN_MASK , HDMI_VP_CONF );
833
+ if (hdmi -> dev_type == RCAR_HDMI )
834
+ hdmi_modb (hdmi , vp_conf ,
835
+ HDMI_VP_CONF_BYPASS_EN_MASK |
836
+ HDMI_VP_CONF_YCC422_EN_MASK , HDMI_VP_CONF );
837
+ else
838
+ hdmi_modb (hdmi , vp_conf ,
839
+ HDMI_VP_CONF_BYPASS_EN_MASK |
840
+ HDMI_VP_CONF_PP_EN_ENMASK |
841
+ HDMI_VP_CONF_YCC422_EN_MASK , HDMI_VP_CONF );
821
842
822
843
hdmi_modb (hdmi , HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
823
844
HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE ,
@@ -826,38 +847,58 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
826
847
827
848
hdmi_modb (hdmi , output_select , HDMI_VP_CONF_OUTPUT_SELECTOR_MASK ,
828
849
HDMI_VP_CONF );
850
+
851
+ /* ycc422_stuffing bit only in R-Car */
852
+ if (hdmi -> dev_type == RCAR_HDMI )
853
+ hdmi_writeb (hdmi , HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE ,
854
+ HDMI_VP_STUFF );
829
855
}
830
856
831
857
static inline void hdmi_phy_test_clear (struct dw_hdmi * hdmi ,
832
858
unsigned char bit )
833
859
{
860
+ if (hdmi -> dev_type == RCAR_HDMI )
861
+ return ;
862
+
834
863
hdmi_modb (hdmi , bit << HDMI_PHY_TST0_TSTCLR_OFFSET ,
835
864
HDMI_PHY_TST0_TSTCLR_MASK , HDMI_PHY_TST0 );
836
865
}
837
866
838
867
static inline void hdmi_phy_test_enable (struct dw_hdmi * hdmi ,
839
868
unsigned char bit )
840
869
{
870
+ if (hdmi -> dev_type == RCAR_HDMI )
871
+ return ;
872
+
841
873
hdmi_modb (hdmi , bit << HDMI_PHY_TST0_TSTEN_OFFSET ,
842
874
HDMI_PHY_TST0_TSTEN_MASK , HDMI_PHY_TST0 );
843
875
}
844
876
845
877
static inline void hdmi_phy_test_clock (struct dw_hdmi * hdmi ,
846
878
unsigned char bit )
847
879
{
880
+ if (hdmi -> dev_type == RCAR_HDMI )
881
+ return ;
882
+
848
883
hdmi_modb (hdmi , bit << HDMI_PHY_TST0_TSTCLK_OFFSET ,
849
884
HDMI_PHY_TST0_TSTCLK_MASK , HDMI_PHY_TST0 );
850
885
}
851
886
852
887
static inline void hdmi_phy_test_din (struct dw_hdmi * hdmi ,
853
888
unsigned char bit )
854
889
{
890
+ if (hdmi -> dev_type == RCAR_HDMI )
891
+ return ;
892
+
855
893
hdmi_writeb (hdmi , bit , HDMI_PHY_TST1 );
856
894
}
857
895
858
896
static inline void hdmi_phy_test_dout (struct dw_hdmi * hdmi ,
859
897
unsigned char bit )
860
898
{
899
+ if (hdmi -> dev_type == RCAR_HDMI )
900
+ return ;
901
+
861
902
hdmi_writeb (hdmi , bit , HDMI_PHY_TST2 );
862
903
}
863
904
@@ -903,13 +944,19 @@ static int hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
903
944
904
945
static void dw_hdmi_phy_enable_powerdown (struct dw_hdmi * hdmi , bool enable )
905
946
{
947
+ if (hdmi -> dev_type == RCAR_HDMI )
948
+ return ;
949
+
906
950
hdmi_mask_writeb (hdmi , !enable , HDMI_PHY_CONF0 ,
907
951
HDMI_PHY_CONF0_PDZ_OFFSET ,
908
952
HDMI_PHY_CONF0_PDZ_MASK );
909
953
}
910
954
911
955
static void dw_hdmi_phy_enable_tmds (struct dw_hdmi * hdmi , u8 enable )
912
956
{
957
+ if (hdmi -> dev_type == RCAR_HDMI )
958
+ return ;
959
+
913
960
hdmi_mask_writeb (hdmi , enable , HDMI_PHY_CONF0 ,
914
961
HDMI_PHY_CONF0_ENTMDS_OFFSET ,
915
962
HDMI_PHY_CONF0_ENTMDS_MASK );
@@ -1035,7 +1082,9 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi, unsigned char prep,
1035
1082
hdmi_writeb (hdmi , HDMI_MC_PHYRSTZ_DEASSERT , HDMI_MC_PHYRSTZ );
1036
1083
hdmi_writeb (hdmi , HDMI_MC_PHYRSTZ_ASSERT , HDMI_MC_PHYRSTZ );
1037
1084
1038
- hdmi_writeb (hdmi , HDMI_MC_HEACPHY_RST_ASSERT , HDMI_MC_HEACPHY_RST );
1085
+ if (hdmi -> dev_type != RCAR_HDMI )
1086
+ hdmi_writeb (hdmi , HDMI_MC_HEACPHY_RST_ASSERT ,
1087
+ HDMI_MC_HEACPHY_RST );
1039
1088
1040
1089
hdmi_phy_test_clear (hdmi , 1 );
1041
1090
hdmi_writeb (hdmi , HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2 ,
@@ -1538,20 +1587,20 @@ static void initialize_hdmi_rcar_ih_mutes(struct dw_hdmi *hdmi)
1538
1587
hdmi_writeb (hdmi , 0x0c , HDMI_PHY_I2CM_INT_ADDR );
1539
1588
hdmi_writeb (hdmi , 0xcc , HDMI_PHY_I2CM_CTLINT_ADDR );
1540
1589
hdmi_writeb (hdmi , 0x0c , HDMI_AUD_INT );
1541
- hdmi_writeb (hdmi , 0xff , HDMI_A_APIINTMSK );
1590
+ hdmi_writeb (hdmi , 0xdf , HDMI_A_APIINTMSK );
1542
1591
hdmi_writeb (hdmi , 0x7f , HDMI_CEC_MASK );
1543
1592
hdmi_writeb (hdmi , 0x44 , HDMI_I2CM_INT );
1544
1593
hdmi_writeb (hdmi , 0x44 , HDMI_I2CM_CTLINT );
1545
1594
1546
1595
/* Disable interrupts in the IH_MUTE_* registers */
1547
- hdmi_writeb (hdmi , 0xff , HDMI_IH_MUTE_FC_STAT0 );
1596
+ hdmi_writeb (hdmi , 0xc7 , HDMI_IH_MUTE_FC_STAT0 );
1548
1597
hdmi_writeb (hdmi , 0xff , HDMI_IH_MUTE_FC_STAT1 );
1549
1598
hdmi_writeb (hdmi , 0x03 , HDMI_IH_MUTE_FC_STAT2 );
1550
1599
hdmi_writeb (hdmi , 0x1f , HDMI_IH_MUTE_AS_STAT0 );
1551
1600
hdmi_writeb (hdmi , 0x3f , HDMI_IH_MUTE_PHY_STAT0 );
1552
- hdmi_writeb (hdmi , 0x0f , HDMI_IH_MUTE_I2CM_STAT0 );
1601
+ hdmi_writeb (hdmi , 0x03 , HDMI_IH_MUTE_I2CM_STAT0 );
1553
1602
hdmi_writeb (hdmi , 0x7f , HDMI_IH_MUTE_CEC_STAT0 );
1554
- hdmi_writeb (hdmi , 0xff , HDMI_IH_MUTE_VP_STAT0 );
1603
+ hdmi_writeb (hdmi , 0x0f , HDMI_IH_MUTE_VP_STAT0 );
1555
1604
hdmi_writeb (hdmi , 0x03 , HDMI_IH_MUTE_I2CMPHY_STAT0 );
1556
1605
1557
1606
/* Enable top level interrupt bits in HDMI block */
@@ -1685,6 +1734,36 @@ static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge,
1685
1734
mutex_unlock (& hdmi -> mutex );
1686
1735
}
1687
1736
1737
+ /*
1738
+ * This function controls clocks of dw_hdmi through drm_bridge
1739
+ * at system suspend/resume.
1740
+ * Arguments:
1741
+ * bridge: drm_bridge that contains dw_hdmi.
1742
+ * flag: controlled flag.
1743
+ * 0: is used when suspend.
1744
+ * 1: is used when resume.
1745
+ */
1746
+ void dw_hdmi_s2r_ctrl (struct drm_bridge * bridge , int flag )
1747
+ {
1748
+ struct dw_hdmi * hdmi = bridge -> driver_private ;
1749
+
1750
+ if (hdmi -> dev_type != RCAR_HDMI )
1751
+ return ;
1752
+
1753
+ if (flag ) { /* enable clk */
1754
+ if (hdmi -> isfr_clk )
1755
+ clk_prepare_enable (hdmi -> isfr_clk );
1756
+ if (hdmi -> iahb_clk )
1757
+ clk_prepare_enable (hdmi -> iahb_clk );
1758
+ } else { /* disable clk */
1759
+ if (hdmi -> isfr_clk )
1760
+ clk_disable_unprepare (hdmi -> isfr_clk );
1761
+ if (hdmi -> iahb_clk )
1762
+ clk_disable_unprepare (hdmi -> iahb_clk );
1763
+ }
1764
+ }
1765
+ EXPORT_SYMBOL_GPL (dw_hdmi_s2r_ctrl );
1766
+
1688
1767
static void dw_hdmi_bridge_disable (struct drm_bridge * bridge )
1689
1768
{
1690
1769
struct dw_hdmi * hdmi = bridge -> driver_private ;
@@ -1693,12 +1772,6 @@ static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
1693
1772
hdmi -> disabled = true;
1694
1773
dw_hdmi_update_power (hdmi );
1695
1774
dw_hdmi_update_phy_mask (hdmi );
1696
-
1697
- if (hdmi -> dev_type == RCAR_HDMI ) {
1698
- hdmi_writeb (hdmi , 0x3f , HDMI_IH_MUTE_PHY_STAT0 );
1699
- hdmi_writeb (hdmi , HDMI_PHY_HPD | HDMI_PHY_RX_SENSE ,
1700
- HDMI_PHY_POL0 );
1701
- }
1702
1775
mutex_unlock (& hdmi -> mutex );
1703
1776
}
1704
1777
0 commit comments