Skip to content

Commit d62dec8

Browse files
committed
Merge tag 'mediatek-drm-next-20260117' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next
Mediatek DRM Next - 20260117 1. mtk_hdmi_v2: Remove unneeded semicolon 2. Move DP training to hotplug thread 3. Convert legacy DRM logging to drm_* helpers in mtk_crtc.c 4. mtk_dsi: Add support for High Speed (HS) mode 5. Add HDMI support for Mediatek Genio 510/700/1200-EVK and Radxa NIO-12L boards Signed-off-by: Dave Airlie <airlied@redhat.com> From: Chun-Kuang Hu <chunkuang.hu@kernel.org> Link: https://patch.msgid.link/20260117005152.3770-1-chunkuang.hu@kernel.org
2 parents 95adee9 + 79643af commit d62dec8

5 files changed

Lines changed: 87 additions & 33 deletions

File tree

Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ properties:
2626
- enum:
2727
- mediatek,mt7623-hdmi-phy
2828
- const: mediatek,mt2701-hdmi-phy
29+
- items:
30+
- enum:
31+
- mediatek,mt8188-hdmi-phy
32+
- const: mediatek,mt8195-hdmi-phy
2933
- const: mediatek,mt2701-hdmi-phy
3034
- const: mediatek,mt8173-hdmi-phy
3135
- const: mediatek,mt8195-hdmi-phy
@@ -34,16 +38,23 @@ properties:
3438
maxItems: 1
3539

3640
clocks:
41+
minItems: 1
3742
items:
3843
- description: PLL reference clock
44+
- description: HDMI 26MHz clock
45+
- description: HDMI PLL1 clock
46+
- description: HDMI PLL2 clock
3947

4048
clock-names:
49+
minItems: 1
4150
items:
4251
- const: pll_ref
52+
- const: 26m
53+
- const: pll1
54+
- const: pll2
4355

4456
clock-output-names:
45-
items:
46-
- const: hdmitx_dig_cts
57+
maxItems: 1
4758

4859
"#phy-cells":
4960
const: 0
@@ -76,6 +87,20 @@ required:
7687
- "#phy-cells"
7788
- "#clock-cells"
7889

90+
allOf:
91+
- if:
92+
not:
93+
properties:
94+
compatible:
95+
contains:
96+
const: mediatek,mt8195-hdmi-phy
97+
then:
98+
properties:
99+
clocks:
100+
maxItems: 1
101+
clock-names:
102+
maxItems: 1
103+
79104
additionalProperties: false
80105

81106
examples:

drivers/gpu/drm/mediatek/mtk_crtc.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,14 @@ static void mtk_crtc_mode_set_nofb(struct drm_crtc *crtc)
225225

226226
static int mtk_crtc_ddp_clk_enable(struct mtk_crtc *mtk_crtc)
227227
{
228+
struct drm_device *dev = mtk_crtc->base.dev;
228229
int ret;
229230
int i;
230231

231232
for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
232233
ret = mtk_ddp_comp_clk_enable(mtk_crtc->ddp_comp[i]);
233234
if (ret) {
234-
DRM_ERROR("Failed to enable clock %d: %d\n", i, ret);
235+
drm_err(dev, "Failed to enable clock %d: %d\n", i, ret);
235236
goto err;
236237
}
237238
}
@@ -343,6 +344,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_crtc *mtk_crtc)
343344
struct drm_connector *connector;
344345
struct drm_encoder *encoder;
345346
struct drm_connector_list_iter conn_iter;
347+
struct drm_device *dev = mtk_crtc->base.dev;
346348
unsigned int width, height, vrefresh, bpc = MTK_MAX_BPC;
347349
int ret;
348350
int i;
@@ -371,19 +373,19 @@ static int mtk_crtc_ddp_hw_init(struct mtk_crtc *mtk_crtc)
371373

372374
ret = pm_runtime_resume_and_get(crtc->dev->dev);
373375
if (ret < 0) {
374-
DRM_ERROR("Failed to enable power domain: %d\n", ret);
376+
drm_err(dev, "Failed to enable power domain: %d\n", ret);
375377
return ret;
376378
}
377379

378380
ret = mtk_mutex_prepare(mtk_crtc->mutex);
379381
if (ret < 0) {
380-
DRM_ERROR("Failed to enable mutex clock: %d\n", ret);
382+
drm_err(dev, "Failed to enable mutex clock: %d\n", ret);
381383
goto err_pm_runtime_put;
382384
}
383385

384386
ret = mtk_crtc_ddp_clk_enable(mtk_crtc);
385387
if (ret < 0) {
386-
DRM_ERROR("Failed to enable component clocks: %d\n", ret);
388+
drm_err(dev, "Failed to enable component clocks: %d\n", ret);
387389
goto err_mutex_unprepare;
388390
}
389391

@@ -648,11 +650,12 @@ static void mtk_crtc_ddp_irq(void *data)
648650
struct mtk_drm_private *priv = crtc->dev->dev_private;
649651

650652
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
653+
struct drm_device *dev = mtk_crtc->base.dev;
651654
if (!priv->data->shadow_register && !mtk_crtc->cmdq_client.chan)
652655
mtk_crtc_ddp_config(crtc, NULL);
653656
else if (mtk_crtc->cmdq_vblank_cnt > 0 && --mtk_crtc->cmdq_vblank_cnt == 0)
654-
DRM_ERROR("mtk_crtc %d CMDQ execute command timeout!\n",
655-
drm_crtc_index(&mtk_crtc->base));
657+
drm_err(dev, "mtk_crtc %d CMDQ execute command timeout!\n",
658+
drm_crtc_index(&mtk_crtc->base));
656659
#else
657660
if (!priv->data->shadow_register)
658661
mtk_crtc_ddp_config(crtc, NULL);
@@ -776,9 +779,10 @@ static void mtk_crtc_atomic_enable(struct drm_crtc *crtc,
776779
{
777780
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
778781
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
782+
struct drm_device *dev = mtk_crtc->base.dev;
779783
int ret;
780784

781-
DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
785+
drm_dbg_driver(dev, "%s %d\n", __func__, crtc->base.id);
782786

783787
ret = mtk_ddp_comp_power_on(comp);
784788
if (ret < 0) {
@@ -803,9 +807,10 @@ static void mtk_crtc_atomic_disable(struct drm_crtc *crtc,
803807
{
804808
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
805809
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
810+
struct drm_device *dev = mtk_crtc->base.dev;
806811
int i;
807812

808-
DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
813+
drm_dbg_driver(dev, "%s %d\n", __func__, crtc->base.id);
809814
if (!mtk_crtc->enabled)
810815
return;
811816

@@ -845,10 +850,11 @@ static void mtk_crtc_atomic_begin(struct drm_crtc *crtc,
845850
crtc);
846851
struct mtk_crtc_state *mtk_crtc_state = to_mtk_crtc_state(crtc_state);
847852
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
853+
struct drm_device *dev = mtk_crtc->base.dev;
848854
unsigned long flags;
849855

850856
if (mtk_crtc->event && mtk_crtc_state->base.event)
851-
DRM_ERROR("new event while there is still a pending event\n");
857+
drm_err(dev, "new event while there is still a pending event\n");
852858

853859
if (mtk_crtc_state->base.event) {
854860
mtk_crtc_state->base.event->pipe = drm_crtc_index(crtc);

drivers/gpu/drm/mediatek/mtk_dp.c

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,6 +1976,7 @@ static irqreturn_t mtk_dp_hpd_event_thread(int hpd, void *dev)
19761976
struct mtk_dp *mtk_dp = dev;
19771977
unsigned long flags;
19781978
u32 status;
1979+
int ret;
19791980

19801981
if (mtk_dp->need_debounce && mtk_dp->train_info.cable_plugged_in)
19811982
msleep(100);
@@ -1994,9 +1995,28 @@ static irqreturn_t mtk_dp_hpd_event_thread(int hpd, void *dev)
19941995
memset(&mtk_dp->info.audio_cur_cfg, 0,
19951996
sizeof(mtk_dp->info.audio_cur_cfg));
19961997

1998+
mtk_dp->enabled = false;
1999+
/* power off aux */
2000+
mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
2001+
DP_PWR_STATE_BANDGAP_TPLL,
2002+
DP_PWR_STATE_MASK);
2003+
19972004
mtk_dp->need_debounce = false;
19982005
mod_timer(&mtk_dp->debounce_timer,
19992006
jiffies + msecs_to_jiffies(100) - 1);
2007+
} else {
2008+
mtk_dp_aux_panel_poweron(mtk_dp, true);
2009+
2010+
ret = mtk_dp_parse_capabilities(mtk_dp);
2011+
if (ret)
2012+
drm_err(mtk_dp->drm_dev, "Can't parse capabilities\n");
2013+
2014+
/* Training */
2015+
ret = mtk_dp_training(mtk_dp);
2016+
if (ret)
2017+
drm_err(mtk_dp->drm_dev, "Training failed, %d\n", ret);
2018+
2019+
mtk_dp->enabled = true;
20002020
}
20012021
}
20022022

@@ -2168,7 +2188,8 @@ static const struct drm_edid *mtk_dp_edid_read(struct drm_bridge *bridge,
21682188
* Parse capability here to let atomic_get_input_bus_fmts and
21692189
* mode_valid use the capability to calculate sink bitrates.
21702190
*/
2171-
if (mtk_dp_parse_capabilities(mtk_dp)) {
2191+
if (mtk_dp->bridge.type == DRM_MODE_CONNECTOR_eDP &&
2192+
mtk_dp_parse_capabilities(mtk_dp)) {
21722193
drm_err(mtk_dp->drm_dev, "Can't parse capabilities\n");
21732194
drm_edid_free(drm_edid);
21742195
drm_edid = NULL;
@@ -2366,13 +2387,15 @@ static void mtk_dp_bridge_atomic_enable(struct drm_bridge *bridge,
23662387
return;
23672388
}
23682389

2369-
mtk_dp_aux_panel_poweron(mtk_dp, true);
2390+
if (mtk_dp->data->bridge_type == DRM_MODE_CONNECTOR_eDP) {
2391+
mtk_dp_aux_panel_poweron(mtk_dp, true);
23702392

2371-
/* Training */
2372-
ret = mtk_dp_training(mtk_dp);
2373-
if (ret) {
2374-
drm_err(mtk_dp->drm_dev, "Training failed, %d\n", ret);
2375-
goto power_off_aux;
2393+
/* Training */
2394+
ret = mtk_dp_training(mtk_dp);
2395+
if (ret) {
2396+
drm_err(mtk_dp->drm_dev, "Training failed, %d\n", ret);
2397+
goto power_off_aux;
2398+
}
23762399
}
23772400

23782401
ret = mtk_dp_video_config(mtk_dp);
@@ -2392,7 +2415,9 @@ static void mtk_dp_bridge_atomic_enable(struct drm_bridge *bridge,
23922415
sizeof(mtk_dp->info.audio_cur_cfg));
23932416
}
23942417

2395-
mtk_dp->enabled = true;
2418+
if (mtk_dp->data->bridge_type == DRM_MODE_CONNECTOR_eDP)
2419+
mtk_dp->enabled = true;
2420+
23962421
mtk_dp_update_plugged_status(mtk_dp);
23972422

23982423
return;
@@ -2407,21 +2432,15 @@ static void mtk_dp_bridge_atomic_disable(struct drm_bridge *bridge,
24072432
{
24082433
struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
24092434

2410-
mtk_dp->enabled = false;
2435+
if (mtk_dp->data->bridge_type == DRM_MODE_CONNECTOR_eDP) {
2436+
mtk_dp->enabled = false;
2437+
mtk_dp_aux_panel_poweron(mtk_dp, false);
2438+
}
2439+
24112440
mtk_dp_update_plugged_status(mtk_dp);
24122441
mtk_dp_video_enable(mtk_dp, false);
24132442
mtk_dp_audio_mute(mtk_dp, true);
24142443

2415-
if (mtk_dp->train_info.cable_plugged_in) {
2416-
drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D3);
2417-
usleep_range(2000, 3000);
2418-
}
2419-
2420-
/* power off aux */
2421-
mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
2422-
DP_PWR_STATE_BANDGAP_TPLL,
2423-
DP_PWR_STATE_MASK);
2424-
24252444
/* SDP path reset sw*/
24262445
mtk_dp_sdp_path_reset(mtk_dp);
24272446

drivers/gpu/drm/mediatek/mtk_dsi.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
#define SHORT_PACKET 0
153153
#define LONG_PACKET 2
154154
#define BTA BIT(2)
155+
#define HSTX BIT(3)
155156
#define DATA_ID GENMASK(15, 8)
156157
#define DATA_0 GENMASK(23, 16)
157158
#define DATA_1 GENMASK(31, 24)
@@ -1080,6 +1081,9 @@ static void mtk_dsi_cmdq(struct mtk_dsi *dsi, const struct mipi_dsi_msg *msg)
10801081
else
10811082
config = (msg->tx_len > 2) ? LONG_PACKET : SHORT_PACKET;
10821083

1084+
if (!(msg->flags & MIPI_DSI_MSG_USE_LPM))
1085+
config |= HSTX;
1086+
10831087
if (msg->tx_len > 2) {
10841088
cmdq_size = 1 + (msg->tx_len + 3) / 4;
10851089
cmdq_off = 4;

drivers/gpu/drm/mediatek/mtk_hdmi_v2.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ static void mtk_hdmi_v2_change_video_resolution(struct mtk_hdmi *hdmi,
746746
case HDMI_COLORSPACE_YUV420:
747747
mtk_hdmi_yuv420_downsampling(hdmi, true);
748748
break;
749-
};
749+
}
750750
}
751751

752752
static void mtk_hdmi_v2_output_set_display_mode(struct mtk_hdmi *hdmi,
@@ -1157,7 +1157,7 @@ static int mtk_hdmi_v2_hdmi_clear_infoframe(struct drm_bridge *bridge,
11571157
case HDMI_INFOFRAME_TYPE_DRM:
11581158
default:
11591159
break;
1160-
};
1160+
}
11611161

11621162
return 0;
11631163
}
@@ -1185,7 +1185,7 @@ static int mtk_hdmi_v2_hdmi_write_infoframe(struct drm_bridge *bridge,
11851185
default:
11861186
dev_err(hdmi->dev, "Unsupported HDMI infoframe type %u\n", type);
11871187
break;
1188-
};
1188+
}
11891189

11901190
return 0;
11911191
}

0 commit comments

Comments
 (0)