Skip to content

Commit cd75650

Browse files
authored
Merge pull request #20 from andr2000/pr_vsp1_drm
These are the fixes and improvements to Renesas VSP1 and R-Car DU modules backported from BSP 4.9/3.5.8. This BSP release is confirmed to properly work with VSP1 and IOMMU.
2 parents 50e55ac + 0f083e5 commit cd75650

23 files changed

+412
-236
lines changed

drivers/gpu/drm/bridge/dw-hdmi.c

Lines changed: 100 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,11 @@ static void dw_hdmi_i2c_init(struct dw_hdmi *hdmi)
224224
hdmi_writeb(hdmi, 0x00, HDMI_I2CM_SOFTRSTZ);
225225

226226
/* 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);
228232

229233
/* Set done, not acknowledged and arbitration interrupt polarities */
230234
hdmi_writeb(hdmi, HDMI_I2CM_INT_DONE_POL, HDMI_I2CM_INT);
@@ -720,8 +724,11 @@ static void hdmi_video_csc(struct dw_hdmi *hdmi)
720724

721725
/* Configure the CSC registers */
722726
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);
725732

726733
dw_hdmi_update_csc_coeffs(hdmi);
727734
}
@@ -771,12 +778,14 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
771778
}
772779

773780
/* 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+
}
780789

781790
hdmi_modb(hdmi, HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE,
782791
HDMI_VP_STUFF_PR_STUFFING_MASK, HDMI_VP_STUFF);
@@ -790,14 +799,20 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
790799
HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER;
791800
}
792801

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);
796809

797810
hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET,
798811
HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF);
799812

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+
}
801816

802817
if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) {
803818
vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
@@ -815,9 +830,15 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
815830
return;
816831
}
817832

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);
821842

822843
hdmi_modb(hdmi, HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
823844
HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE,
@@ -826,38 +847,58 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
826847

827848
hdmi_modb(hdmi, output_select, HDMI_VP_CONF_OUTPUT_SELECTOR_MASK,
828849
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);
829855
}
830856

831857
static inline void hdmi_phy_test_clear(struct dw_hdmi *hdmi,
832858
unsigned char bit)
833859
{
860+
if (hdmi->dev_type == RCAR_HDMI)
861+
return;
862+
834863
hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLR_OFFSET,
835864
HDMI_PHY_TST0_TSTCLR_MASK, HDMI_PHY_TST0);
836865
}
837866

838867
static inline void hdmi_phy_test_enable(struct dw_hdmi *hdmi,
839868
unsigned char bit)
840869
{
870+
if (hdmi->dev_type == RCAR_HDMI)
871+
return;
872+
841873
hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTEN_OFFSET,
842874
HDMI_PHY_TST0_TSTEN_MASK, HDMI_PHY_TST0);
843875
}
844876

845877
static inline void hdmi_phy_test_clock(struct dw_hdmi *hdmi,
846878
unsigned char bit)
847879
{
880+
if (hdmi->dev_type == RCAR_HDMI)
881+
return;
882+
848883
hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLK_OFFSET,
849884
HDMI_PHY_TST0_TSTCLK_MASK, HDMI_PHY_TST0);
850885
}
851886

852887
static inline void hdmi_phy_test_din(struct dw_hdmi *hdmi,
853888
unsigned char bit)
854889
{
890+
if (hdmi->dev_type == RCAR_HDMI)
891+
return;
892+
855893
hdmi_writeb(hdmi, bit, HDMI_PHY_TST1);
856894
}
857895

858896
static inline void hdmi_phy_test_dout(struct dw_hdmi *hdmi,
859897
unsigned char bit)
860898
{
899+
if (hdmi->dev_type == RCAR_HDMI)
900+
return;
901+
861902
hdmi_writeb(hdmi, bit, HDMI_PHY_TST2);
862903
}
863904

@@ -903,13 +944,19 @@ static int hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
903944

904945
static void dw_hdmi_phy_enable_powerdown(struct dw_hdmi *hdmi, bool enable)
905946
{
947+
if (hdmi->dev_type == RCAR_HDMI)
948+
return;
949+
906950
hdmi_mask_writeb(hdmi, !enable, HDMI_PHY_CONF0,
907951
HDMI_PHY_CONF0_PDZ_OFFSET,
908952
HDMI_PHY_CONF0_PDZ_MASK);
909953
}
910954

911955
static void dw_hdmi_phy_enable_tmds(struct dw_hdmi *hdmi, u8 enable)
912956
{
957+
if (hdmi->dev_type == RCAR_HDMI)
958+
return;
959+
913960
hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
914961
HDMI_PHY_CONF0_ENTMDS_OFFSET,
915962
HDMI_PHY_CONF0_ENTMDS_MASK);
@@ -1035,7 +1082,9 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi, unsigned char prep,
10351082
hdmi_writeb(hdmi, HDMI_MC_PHYRSTZ_DEASSERT, HDMI_MC_PHYRSTZ);
10361083
hdmi_writeb(hdmi, HDMI_MC_PHYRSTZ_ASSERT, HDMI_MC_PHYRSTZ);
10371084

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);
10391088

10401089
hdmi_phy_test_clear(hdmi, 1);
10411090
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)
15381587
hdmi_writeb(hdmi, 0x0c, HDMI_PHY_I2CM_INT_ADDR);
15391588
hdmi_writeb(hdmi, 0xcc, HDMI_PHY_I2CM_CTLINT_ADDR);
15401589
hdmi_writeb(hdmi, 0x0c, HDMI_AUD_INT);
1541-
hdmi_writeb(hdmi, 0xff, HDMI_A_APIINTMSK);
1590+
hdmi_writeb(hdmi, 0xdf, HDMI_A_APIINTMSK);
15421591
hdmi_writeb(hdmi, 0x7f, HDMI_CEC_MASK);
15431592
hdmi_writeb(hdmi, 0x44, HDMI_I2CM_INT);
15441593
hdmi_writeb(hdmi, 0x44, HDMI_I2CM_CTLINT);
15451594

15461595
/* 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);
15481597
hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT1);
15491598
hdmi_writeb(hdmi, 0x03, HDMI_IH_MUTE_FC_STAT2);
15501599
hdmi_writeb(hdmi, 0x1f, HDMI_IH_MUTE_AS_STAT0);
15511600
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);
15531602
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);
15551604
hdmi_writeb(hdmi, 0x03, HDMI_IH_MUTE_I2CMPHY_STAT0);
15561605

15571606
/* Enable top level interrupt bits in HDMI block */
@@ -1685,6 +1734,36 @@ static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge,
16851734
mutex_unlock(&hdmi->mutex);
16861735
}
16871736

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+
16881767
static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
16891768
{
16901769
struct dw_hdmi *hdmi = bridge->driver_private;
@@ -1693,12 +1772,6 @@ static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
16931772
hdmi->disabled = true;
16941773
dw_hdmi_update_power(hdmi);
16951774
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-
}
17021775
mutex_unlock(&hdmi->mutex);
17031776
}
17041777

drivers/gpu/drm/bridge/dw-hdmi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,6 +1059,9 @@ enum {
10591059
HDMI_I2CM_CTLINT_NAC_MASK = 0x40,
10601060
HDMI_I2CM_CTLINT_ARB_POL = 0x8,
10611061
HDMI_I2CM_CTLINT_ARB_MASK = 0x4,
1062+
1063+
/* I2CM_DIV field values */
1064+
HDMI_I2CM_DIV_FAST_STD_MODE_MASK = 0x08,
10621065
};
10631066

10641067
#endif /* __DW_HDMI_H__ */

drivers/gpu/drm/drm_atomic_helper.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,36 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
11441144
}
11451145
EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
11461146

1147+
/**
1148+
* drm_atomic_helper_wait_for_flip_done - wait for all page flips to be done
1149+
* @state: atomic state object
1150+
*
1151+
* Helper to, after atomic commit, wait for page flips on all effected
1152+
* crtcs (ie. before cleaning up old framebuffers using
1153+
* drm_atomic_helper_cleanup_planes()).
1154+
*/
1155+
void drm_atomic_helper_wait_for_flip_done(struct drm_device *dev,
1156+
struct drm_atomic_state *state)
1157+
{
1158+
struct drm_crtc_state *crtc_state;
1159+
struct drm_crtc *crtc;
1160+
int i;
1161+
1162+
for_each_crtc_in_state(state, crtc, crtc_state, i) {
1163+
struct drm_crtc_commit *commit = state->crtcs[i].commit;
1164+
int ret;
1165+
1166+
if (!commit)
1167+
continue;
1168+
1169+
ret = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
1170+
if (ret == 0)
1171+
DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1172+
crtc->base.id, crtc->name);
1173+
}
1174+
}
1175+
EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
1176+
11471177
/**
11481178
* drm_atomic_helper_commit_tail - commit atomic update to hardware
11491179
* @state: new modeset state to be committed

0 commit comments

Comments
 (0)