Describe the bug
After upgrading from linux-image-6.12.75+rpt-rpi-v8 to linux-image-6.18.29+rpt-rpi-v8, DSI panels using the generic compatible = "panel-dsi" binding fail to initialise. The display shows the DSI test pattern (rainbow bars) instead of the framebuffer. dmesg shows:
panel-simple-dsi fe700000.dsi.0: Specify missing connector_type
panel-simple-dsi fe700000.dsi.0: supply power not found, using dummy regulator
WARNING: CPU: 1 PID: 216 at drivers/gpu/drm/panel/panel-simple.c:487 panel_simple_probe+0x758/0x7d8 [panel_simple]
panel-simple-dsi fe700000.dsi.0: Reject override mode: no timings specified
The same overlay and panel work correctly on 6.12.75 and 6.12.62.
Hardware
Raspberry Pi CM4 on BTT Manta M4P V2.1 carrier
Waveshare 3.5" DSI LCD (E) panel, 640×480, RGB888
Overlay: Waveshare_35DSI with the 35E parameter preset
Root cause analysis
In drivers/gpu/drm/panel/panel-simple.c, panel_simple_dsi_probe() was refactored between 6.12 and 6.18:
6.12 builds the DT descriptor before calling panel_simple_probe:
cdesc = of_device_get_match_data(...);
if (desc == &panel_dsi) {
panel_dsi_dt_probe(dev, dt_desc);
desc = dt_desc;
}
panel_simple_probe(dev, &desc->desc);
6.18 calls panel_simple_probe first, then tries to build the DT descriptor:
cpanel = panel_simple_probe(dev); // hits parse_panel_timing_node, dies
desc = container_of(panel->desc, ...);
if (desc == &panel_dsi) {
panel_dsi_dt_probe(dev, dt_desc);
desc = dt_desc;
}
Inside panel_simple_probe, this code runs for all non-DPI panels and rejects the generic DSI case before the DT descriptor is built:
cif (!of_device_is_compatible(dev->of_node, "panel-dpi") &&
!of_get_display_timing(dev->of_node, "panel-timing", &dt))
panel_simple_parse_panel_timing_node(dev, panel, &dt);
panel_simple_parse_panel_timing_node() requires desc->num_timings > 0, which is never true for the generic &panel_dsi descriptor — that's the whole point of the generic binding.
Steps to reproduce the behaviour
Use any overlay with compatible = "panel-dsi" + panel-timing subnode (e.g. in-tree vc4-kms-dsi-generic or Waveshare_35DSI)
Boot 6.18.29 — display shows DSI test bars
Boot 6.12.75 — display works
Device (s)
Raspberry Pi CM4
System
Raspberry Pi reference 2022-09-22
Generated using pi-gen, https://github.com/RPi-Distro/pi-gen, 005a8c73b05a2cab394073150208bf4f069e861a, stage2
May 8 2026 18:13:05
Copyright (c) 2012 Broadcom
version ae9a8ea9f3ca745de6f357bd7fc8307721ad38b7 (clean) (release) (start)
Linux reddwarf 6.12.75+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.75-1+rpt1 (2026-03-11) aarch64 GNU/Linux
Linux reddwarf 6.18.29+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.18.29-1+rpt1 aarch64 GNU/Linux
Logs
panel-simple-dsi fe700000.dsi.0: Specify missing connector_type
panel-simple-dsi fe700000.dsi.0: supply power not found, using dummy regulator
WARNING: CPU: 1 PID: 216 at drivers/gpu/drm/panel/panel-simple.c:487 panel_simple_probe+0x758/0x7d8 [panel_simple]
panel-simple-dsi fe700000.dsi.0: Reject override mode: no timings specified
Additional context
Suggested fix
Mirror the existing DPI fallback for the generic DSI case: either teach panel_simple_probe to call panel_dsi_dt_probe() early when the matched desc is &panel_dsi, or have panel_simple_dsi_probe build dt_desc before invoking panel_simple_probe (the 6.12 ordering).
Describe the bug
After upgrading from linux-image-6.12.75+rpt-rpi-v8 to linux-image-6.18.29+rpt-rpi-v8, DSI panels using the generic compatible = "panel-dsi" binding fail to initialise. The display shows the DSI test pattern (rainbow bars) instead of the framebuffer. dmesg shows:
The same overlay and panel work correctly on 6.12.75 and 6.12.62.
Hardware
Raspberry Pi CM4 on BTT Manta M4P V2.1 carrier
Waveshare 3.5" DSI LCD (E) panel, 640×480, RGB888
Overlay: Waveshare_35DSI with the 35E parameter preset
Root cause analysis
In drivers/gpu/drm/panel/panel-simple.c, panel_simple_dsi_probe() was refactored between 6.12 and 6.18:
6.12 builds the DT descriptor before calling panel_simple_probe:
6.18 calls panel_simple_probe first, then tries to build the DT descriptor:
Inside panel_simple_probe, this code runs for all non-DPI panels and rejects the generic DSI case before the DT descriptor is built:
panel_simple_parse_panel_timing_node() requires desc->num_timings > 0, which is never true for the generic &panel_dsi descriptor — that's the whole point of the generic binding.
Steps to reproduce the behaviour
Use any overlay with compatible = "panel-dsi" + panel-timing subnode (e.g. in-tree vc4-kms-dsi-generic or Waveshare_35DSI)
Boot 6.18.29 — display shows DSI test bars
Boot 6.12.75 — display works
Device (s)
Raspberry Pi CM4
System
Raspberry Pi reference 2022-09-22
Generated using pi-gen, https://github.com/RPi-Distro/pi-gen, 005a8c73b05a2cab394073150208bf4f069e861a, stage2
May 8 2026 18:13:05
Copyright (c) 2012 Broadcom
version ae9a8ea9f3ca745de6f357bd7fc8307721ad38b7 (clean) (release) (start)
Linux reddwarf 6.12.75+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.75-1+rpt1 (2026-03-11) aarch64 GNU/Linux
Linux reddwarf 6.18.29+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.18.29-1+rpt1 aarch64 GNU/Linux
Logs
panel-simple-dsi fe700000.dsi.0: Specify missing connector_type
panel-simple-dsi fe700000.dsi.0: supply power not found, using dummy regulator
WARNING: CPU: 1 PID: 216 at drivers/gpu/drm/panel/panel-simple.c:487 panel_simple_probe+0x758/0x7d8 [panel_simple]
panel-simple-dsi fe700000.dsi.0: Reject override mode: no timings specified
Additional context
Suggested fix
Mirror the existing DPI fallback for the generic DSI case: either teach panel_simple_probe to call panel_dsi_dt_probe() early when the matched desc is &panel_dsi, or have panel_simple_dsi_probe build dt_desc before invoking panel_simple_probe (the 6.12 ordering).