Skip to content
/ linux Public

Commit 79f4248

Browse files
hvilleneuvedooSasha Levin
authored andcommitted
drm: renesas: rz-du: mipi_dsi: fix kernel panic when rebooting for some panels
[ Upstream commit 64aa8b3 ] Since commit 56de5e3 ("clk: renesas: r9a07g044: Add MSTOP for RZ/G2L") we may get the following kernel panic, for some panels, when rebooting: systemd-shutdown[1]: Rebooting. Call trace: ... do_serror+0x28/0x68 el1h_64_error_handler+0x34/0x50 el1h_64_error+0x6c/0x70 rzg2l_mipi_dsi_host_transfer+0x114/0x458 (P) mipi_dsi_device_transfer+0x44/0x58 mipi_dsi_dcs_set_display_off_multi+0x9c/0xc4 ili9881c_unprepare+0x38/0x88 drm_panel_unprepare+0xbc/0x108 This happens for panels that need to send MIPI-DSI commands in their unprepare() callback. Since the MIPI-DSI interface is stopped at that point, rzg2l_mipi_dsi_host_transfer() triggers the kernel panic. Fix by moving rzg2l_mipi_dsi_stop() to new callback function rzg2l_mipi_dsi_atomic_post_disable(). With this change we now have the correct power-down/stop sequence: systemd-shutdown[1]: Rebooting. rzg2l-mipi-dsi 10850000.dsi: rzg2l_mipi_dsi_atomic_disable(): entry ili9881c-dsi 10850000.dsi.0: ili9881c_unprepare(): entry rzg2l-mipi-dsi 10850000.dsi: rzg2l_mipi_dsi_atomic_post_disable(): entry reboot: Restarting system Suggested-by: Biju Das <biju.das.jz@bp.renesas.com> Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> Tested-by: Biju Das <biju.das.jz@bp.renesas.com> Link: https://patch.msgid.link/20260112154333.655352-1-hugo@hugovil.com Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent cb8b9a1 commit 79f4248

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,13 @@ static void rzg2l_mipi_dsi_atomic_disable(struct drm_bridge *bridge,
646646

647647
rzg2l_mipi_dsi_stop_video(dsi);
648648
rzg2l_mipi_dsi_stop_hs_clock(dsi);
649+
}
650+
651+
static void rzg2l_mipi_dsi_atomic_post_disable(struct drm_bridge *bridge,
652+
struct drm_atomic_state *state)
653+
{
654+
struct rzg2l_mipi_dsi *dsi = bridge_to_rzg2l_mipi_dsi(bridge);
655+
649656
rzg2l_mipi_dsi_stop(dsi);
650657
}
651658

@@ -681,6 +688,7 @@ static const struct drm_bridge_funcs rzg2l_mipi_dsi_bridge_ops = {
681688
.atomic_pre_enable = rzg2l_mipi_dsi_atomic_pre_enable,
682689
.atomic_enable = rzg2l_mipi_dsi_atomic_enable,
683690
.atomic_disable = rzg2l_mipi_dsi_atomic_disable,
691+
.atomic_post_disable = rzg2l_mipi_dsi_atomic_post_disable,
684692
.mode_valid = rzg2l_mipi_dsi_bridge_mode_valid,
685693
};
686694

0 commit comments

Comments
 (0)