Skip to content

Commit ae7f6d5

Browse files
committed
Merge tag 'mediatek-drm-next-6.14' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next
Mediatek DRM Next for Linux 6.14 1. dp: Add sdp path reset 2. dp: Support flexible length of DP calibration data Signed-off-by: Dave Airlie <[email protected]> From: Chun-Kuang Hu <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 9cc06db + ba58115 commit ae7f6d5

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

drivers/gpu/drm/mediatek/mtk_dp.c

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,18 @@ static void mtk_dp_digital_sw_reset(struct mtk_dp *mtk_dp)
11351135
0, DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0);
11361136
}
11371137

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+
11381150
static void mtk_dp_set_lanes(struct mtk_dp *mtk_dp, int lanes)
11391151
{
11401152
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)
11651177
buf = (u32 *)nvmem_cell_read(cell, &len);
11661178
nvmem_cell_put(cell);
11671179

1168-
if (IS_ERR(buf) || ((len / sizeof(u32)) != 4)) {
1180+
if (IS_ERR(buf)) {
11691181
dev_warn(dev, "Failed to read nvmem_cell_read\n");
1170-
1171-
if (!IS_ERR(buf))
1172-
kfree(buf);
1173-
11741182
goto use_default_val;
11751183
}
11761184

1185+
/* The cell length is in bytes. Convert it to be compatible with u32 buffer. */
1186+
len /= sizeof(u32);
1187+
11771188
for (i = 0; i < MTK_DP_CAL_MAX; i++) {
11781189
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+
11791199
cal_data[i] = (buf[fmt->idx] >> fmt->shift) & fmt->mask;
11801200

11811201
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,
23972417
DP_PWR_STATE_BANDGAP_TPLL,
23982418
DP_PWR_STATE_MASK);
23992419

2420+
/* SDP path reset sw*/
2421+
mtk_dp_sdp_path_reset(mtk_dp);
2422+
24002423
/* Ensure the sink is muted */
24012424
msleep(20);
24022425
}

drivers/gpu/drm/mediatek/mtk_dp_reg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
#define MTK_DP_ENC0_P0_3004 0x3004
8787
#define VIDEO_M_CODE_SEL_DP_ENC0_P0_MASK BIT(8)
8888
#define DP_TX_ENCODER_4P_RESET_SW_DP_ENC0_P0 BIT(9)
89+
#define SDP_RESET_SW_DP_ENC0_P0 BIT(13)
8990
#define MTK_DP_ENC0_P0_3010 0x3010
9091
#define HTOTAL_SW_DP_ENC0_P0_MASK GENMASK(15, 0)
9192
#define MTK_DP_ENC0_P0_3014 0x3014

0 commit comments

Comments
 (0)