@@ -1135,6 +1135,18 @@ static void mtk_dp_digital_sw_reset(struct mtk_dp *mtk_dp)
1135
1135
0 , DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0 );
1136
1136
}
1137
1137
1138
+ static void mtk_dp_sdp_path_reset (struct mtk_dp * mtk_dp )
1139
+ {
1140
+ mtk_dp_update_bits (mtk_dp , MTK_DP_ENC0_P0_3004 ,
1141
+ SDP_RESET_SW_DP_ENC0_P0 ,
1142
+ SDP_RESET_SW_DP_ENC0_P0 );
1143
+
1144
+ /* Wait for sdp path reset to complete */
1145
+ usleep_range (1000 , 5000 );
1146
+ mtk_dp_update_bits (mtk_dp , MTK_DP_ENC0_P0_3004 ,
1147
+ 0 , SDP_RESET_SW_DP_ENC0_P0 );
1148
+ }
1149
+
1138
1150
static void mtk_dp_set_lanes (struct mtk_dp * mtk_dp , int lanes )
1139
1151
{
1140
1152
mtk_dp_update_bits (mtk_dp , MTK_DP_TRANS_P0_35F0 ,
@@ -1165,17 +1177,25 @@ static void mtk_dp_get_calibration_data(struct mtk_dp *mtk_dp)
1165
1177
buf = (u32 * )nvmem_cell_read (cell , & len );
1166
1178
nvmem_cell_put (cell );
1167
1179
1168
- if (IS_ERR (buf ) || (( len / sizeof ( u32 )) != 4 ) ) {
1180
+ if (IS_ERR (buf )) {
1169
1181
dev_warn (dev , "Failed to read nvmem_cell_read\n" );
1170
-
1171
- if (!IS_ERR (buf ))
1172
- kfree (buf );
1173
-
1174
1182
goto use_default_val ;
1175
1183
}
1176
1184
1185
+ /* The cell length is in bytes. Convert it to be compatible with u32 buffer. */
1186
+ len /= sizeof (u32 );
1187
+
1177
1188
for (i = 0 ; i < MTK_DP_CAL_MAX ; i ++ ) {
1178
1189
fmt = & mtk_dp -> data -> efuse_fmt [i ];
1190
+
1191
+ if (fmt -> idx >= len ) {
1192
+ dev_warn (mtk_dp -> dev ,
1193
+ "Out-of-bound efuse data access, fmt idx = %d, buf len = %zu\n" ,
1194
+ fmt -> idx , len );
1195
+ kfree (buf );
1196
+ goto use_default_val ;
1197
+ }
1198
+
1179
1199
cal_data [i ] = (buf [fmt -> idx ] >> fmt -> shift ) & fmt -> mask ;
1180
1200
1181
1201
if (cal_data [i ] < fmt -> min_val || cal_data [i ] > fmt -> max_val ) {
@@ -2397,6 +2417,9 @@ static void mtk_dp_bridge_atomic_disable(struct drm_bridge *bridge,
2397
2417
DP_PWR_STATE_BANDGAP_TPLL ,
2398
2418
DP_PWR_STATE_MASK );
2399
2419
2420
+ /* SDP path reset sw*/
2421
+ mtk_dp_sdp_path_reset (mtk_dp );
2422
+
2400
2423
/* Ensure the sink is muted */
2401
2424
msleep (20 );
2402
2425
}
0 commit comments