The panel is the only element of the display pipeline which never sees the atomic commit. Its prepare() and enable() callbacks get nothing but the panel, so a panel which has to be programmed differently depending on the mode can only guess it. The NT35950 driver, for example, saves the connector in get_modes() and reads connector->state->crtc->state while being prepared: without the locks, from the current state rather than from the one being committed, and with no way to reject a mode it doesn't know.
Every panel has a struct drm_bridge embedded into it, and the bridge already has all the missing parts: atomic_check(), a state object which can be subclassed and the commit passed to the callbacks. Rather than growing struct drm_panel_funcs into a copy of that, let the panel driver provide struct drm_bridge_funcs for the embedded bridge. This is opt-in: the panels which have no use for the atomic state keep using struct drm_panel_funcs and are not touched by it. To get there the bridge callbacks become the entry point to the panel, with drm_panel_prepare() and friends calling them rather than the other way around. The panel core still has to track the panel state, notify the panel followers and handle the backlight, so the driver doesn't fill in the power callbacks directly, it wraps its functions with the macros doing that part. NT35950 is converted as the first user. The bulk of the series is the cleanup of what the panel core and the bridge need from the panel driver, so that a panel providing the bridge callbacks doesn't need struct drm_panel_funcs for anything: - get_timings() had no callers. - The connector type was stored both in the panel and in its bridge, and the display drivers could override it while creating the panel bridge. - The orientation was read from the DT, stored and returned by nearly identical code in more than twenty panel drivers, and some of them also had to set it on the connector from get_modes(), with a TODO asking for a better place. The core reads it now. It is applied to the connector from the new connector_init() bridge callback, which is not specific to the panels: other bridges have properties to set up on the connector being created too (HDCP, DP link properties), and currently have nowhere to do it. - disable() and unprepare() returned an error which nobody could act on. Worse, a failed unprepare() left the panel marked as prepared, so it was never initialised again. Behaviour changes worth knowing about: - Panels with the rotation property whose driver ignored it now get the orientation property. In the tree this is the Motorola Mapphone panel (panel-dsi-cm). - sun6i_mipi_dsi, sti_dvo and the Tegra DSI get their panel after the DRM device has been registered, which is too late to create the property, so they lose the orientation which the panel drivers used to set from get_modes(). None of the rotated panels in the tree are used with them. - A panel implementing atomic_check() can only be driven through the bridge chain. The display drivers calling drm_panel_prepare() directly have no commit to pass. Signed-off-by: Dmitry Baryshkov <[email protected]> --- Dmitry Baryshkov (35): drm/panel: remove the get_timings() callback drm/panel: remove the unused struct panel_bridge drm/tidss: get the panel type from the embedded bridge drm/bridge: lvds-codec: use devm_drm_panel_bridge_add() drm/ingenic: use devm_drm_panel_bridge_add() drm: mxsfb: use devm_drm_panel_bridge_add() drm: rcar-du: use devm_drm_panel_bridge_add() drm: rz-du: use devm_drm_panel_bridge_add() drm/mcde: use drm_panel_bridge_add() drm/pl111: use drm_panel_bridge_add() drm/rockchip: lvds: use drm_panel_bridge_add() drm/rockchip: rgb: use drm_panel_bridge_add() drm/panel: remove the _typed() panel bridge functions drm/panel: remove drm_panel.connector_type drm/bridge: anx6345: set the panel orientation on the connector drm/exynos: dpi: set the panel orientation on the connector drm/fsl-dcu: set the panel orientation on the connector drm/logicvc: set the panel orientation on the connector drm/stm: lvds: set the panel orientation on the connector drm/sun4i: set the panel orientation on the connector drm/tegra: sor: set the panel orientation on the connector drm/panel: drop the orientation workaround from get_modes() drm/panel: read the panel orientation in the core drm/panel: use the orientation from the panel core drm/panel: remove the get_orientation() callback drm/bridge: add the connector_init callback drm/bridge-connector: let the bridges set up the connector drm/panel: let the bridges set up the panel connector drm/panel: set the orientation from the connector_init callback drm/panel: make the disable and unprepare callbacks return void drm/panel: don't hold the follower lock over the panel callbacks drm/panel: route the panel calls through the bridge callbacks drm/panel: let the panel drivers provide struct drm_bridge_funcs drm/panel: novatek-nt35950: provide struct drm_bridge_funcs drm/panel: novatek-nt35950: use the atomic state to select the mode Documentation/gpu/todo.rst | 1 - drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 5 + drivers/gpu/drm/bridge/lvds-codec.c | 3 +- drivers/gpu/drm/display/drm_bridge_connector.c | 12 +- drivers/gpu/drm/drm_bridge.c | 31 + drivers/gpu/drm/drm_connector.c | 8 +- drivers/gpu/drm/drm_panel.c | 653 +++++++++++++-------- drivers/gpu/drm/exynos/exynos_drm_dpi.c | 1 + drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 + drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 3 +- drivers/gpu/drm/logicvc/logicvc_interface.c | 7 + drivers/gpu/drm/mcde/mcde_drv.c | 3 +- drivers/gpu/drm/mxsfb/mxsfb_drv.c | 3 +- drivers/gpu/drm/panel/panel-abt-y030xx067a.c | 8 +- drivers/gpu/drm/panel/panel-anbernic-td4310.c | 18 +- drivers/gpu/drm/panel/panel-arm-versatile.c | 4 +- .../gpu/drm/panel/panel-asus-z00t-tm5p5-n35596.c | 4 +- drivers/gpu/drm/panel/panel-auo-a030jtn01.c | 8 +- drivers/gpu/drm/panel/panel-boe-bf060y8m-aj0.c | 4 +- drivers/gpu/drm/panel/panel-boe-himax8279d.c | 12 +- drivers/gpu/drm/panel/panel-boe-td4320.c | 4 +- .../gpu/drm/panel/panel-boe-th101mb31ig002-28a.c | 33 +- drivers/gpu/drm/panel/panel-boe-tv101wum-ll2.c | 4 +- drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 30 +- drivers/gpu/drm/panel/panel-chipone-icna35xx.c | 24 +- drivers/gpu/drm/panel/panel-chipwealth-ch13726a.c | 24 +- drivers/gpu/drm/panel/panel-dsi-cm.c | 11 +- drivers/gpu/drm/panel/panel-ebbg-ft8719.c | 8 +- drivers/gpu/drm/panel/panel-edp.c | 53 +- drivers/gpu/drm/panel/panel-elida-kd35t133.c | 22 +- drivers/gpu/drm/panel/panel-feixin-k101-im2ba02.c | 8 +- .../gpu/drm/panel/panel-feiyang-fy07024di26a30d.c | 8 +- drivers/gpu/drm/panel/panel-focaltech-ota7290b.c | 21 +- drivers/gpu/drm/panel/panel-himax-hx8279.c | 8 +- drivers/gpu/drm/panel/panel-himax-hx83102.c | 22 +- drivers/gpu/drm/panel/panel-himax-hx83112a.c | 8 +- drivers/gpu/drm/panel/panel-himax-hx83112b.c | 4 +- drivers/gpu/drm/panel/panel-himax-hx83121a.c | 4 +- drivers/gpu/drm/panel/panel-himax-hx8394.c | 24 +- drivers/gpu/drm/panel/panel-hydis-hv101hd1.c | 8 +- drivers/gpu/drm/panel/panel-ilitek-ili7807s.c | 4 +- drivers/gpu/drm/panel/panel-ilitek-ili7836a.c | 24 +- drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 12 +- drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 7 +- drivers/gpu/drm/panel/panel-ilitek-ili9488.c | 18 +- drivers/gpu/drm/panel/panel-ilitek-ili9805.c | 4 +- drivers/gpu/drm/panel/panel-ilitek-ili9806e-dsi.c | 18 +- drivers/gpu/drm/panel/panel-ilitek-ili9806e-spi.c | 4 +- drivers/gpu/drm/panel/panel-ilitek-ili9881c.c | 31 +- drivers/gpu/drm/panel/panel-ilitek-ili9882t.c | 24 +- drivers/gpu/drm/panel/panel-innolux-ej030na.c | 8 +- drivers/gpu/drm/panel/panel-innolux-p079zca.c | 10 +- drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c | 21 +- drivers/gpu/drm/panel/panel-jdi-fhd-r63452.c | 4 +- drivers/gpu/drm/panel/panel-jdi-lpm102a188a.c | 12 +- drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 8 +- drivers/gpu/drm/panel/panel-khadas-ts050.c | 12 +- drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c | 14 +- drivers/gpu/drm/panel/panel-leadtek-ltk050h3146w.c | 6 +- drivers/gpu/drm/panel/panel-leadtek-ltk500hd1829.c | 4 +- drivers/gpu/drm/panel/panel-lg-lb035q02.c | 4 +- drivers/gpu/drm/panel/panel-lg-ld070wx3.c | 4 +- drivers/gpu/drm/panel/panel-lg-lg4573.c | 4 +- drivers/gpu/drm/panel/panel-lg-sw43408.c | 7 +- drivers/gpu/drm/panel/panel-lincolntech-lcd197.c | 8 +- drivers/gpu/drm/panel/panel-lvds.c | 25 +- drivers/gpu/drm/panel/panel-lxd-m9189a.c | 8 +- .../gpu/drm/panel/panel-magnachip-d53e6ea8966.c | 8 +- drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c | 8 +- drivers/gpu/drm/panel/panel-motorola-mot.c | 8 +- drivers/gpu/drm/panel/panel-nec-nl8048hl11.c | 4 +- drivers/gpu/drm/panel/panel-newvision-nv3051d.c | 6 +- drivers/gpu/drm/panel/panel-newvision-nv3052c.c | 12 +- drivers/gpu/drm/panel/panel-novatek-nt35510.c | 12 +- drivers/gpu/drm/panel/panel-novatek-nt35532.c | 4 +- drivers/gpu/drm/panel/panel-novatek-nt35560.c | 6 +- drivers/gpu/drm/panel/panel-novatek-nt35950.c | 168 ++++-- drivers/gpu/drm/panel/panel-novatek-nt36523.c | 24 +- drivers/gpu/drm/panel/panel-novatek-nt36532.c | 4 +- drivers/gpu/drm/panel/panel-novatek-nt36536.c | 4 +- drivers/gpu/drm/panel/panel-novatek-nt36672a.c | 4 +- drivers/gpu/drm/panel/panel-novatek-nt36672e.c | 4 +- drivers/gpu/drm/panel/panel-novatek-nt37700f.c | 8 +- drivers/gpu/drm/panel/panel-novatek-nt37801.c | 4 +- drivers/gpu/drm/panel/panel-novatek-nt39016.c | 12 +- drivers/gpu/drm/panel/panel-novatek-nt51021.c | 4 +- drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c | 4 +- drivers/gpu/drm/panel/panel-orisetech-ota5601a.c | 12 +- drivers/gpu/drm/panel/panel-orisetech-otm8009a.c | 8 +- drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c | 8 +- .../gpu/drm/panel/panel-panasonic-vvx10f034n00.c | 7 +- .../gpu/drm/panel/panel-raspberrypi-touchscreen.c | 7 +- drivers/gpu/drm/panel/panel-raydium-rm67191.c | 16 +- drivers/gpu/drm/panel/panel-raydium-rm67200.c | 8 +- drivers/gpu/drm/panel/panel-raydium-rm68200.c | 4 +- drivers/gpu/drm/panel/panel-raydium-rm69220.c | 4 +- drivers/gpu/drm/panel/panel-raydium-rm692e5.c | 8 +- drivers/gpu/drm/panel/panel-raydium-rm69380.c | 4 +- drivers/gpu/drm/panel/panel-renesas-r61307.c | 8 +- drivers/gpu/drm/panel/panel-renesas-r63419.c | 25 +- drivers/gpu/drm/panel/panel-renesas-r69328.c | 8 +- drivers/gpu/drm/panel/panel-ronbo-rb070d30.c | 7 +- drivers/gpu/drm/panel/panel-samsung-ams581vf01.c | 4 +- drivers/gpu/drm/panel/panel-samsung-ams639rq08.c | 4 +- drivers/gpu/drm/panel/panel-samsung-atna33xc20.c | 14 +- drivers/gpu/drm/panel/panel-samsung-db7430.c | 8 +- drivers/gpu/drm/panel/panel-samsung-ld9040.c | 7 +- drivers/gpu/drm/panel/panel-samsung-ltl106hl02.c | 4 +- drivers/gpu/drm/panel/panel-samsung-s6d16d0.c | 8 +- drivers/gpu/drm/panel/panel-samsung-s6d27a1.c | 8 +- drivers/gpu/drm/panel/panel-samsung-s6d7aa0.c | 8 +- drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 8 +- drivers/gpu/drm/panel/panel-samsung-s6e3fc2x01.c | 8 +- drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c | 16 +- drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 8 +- drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c | 14 +- drivers/gpu/drm/panel/panel-samsung-s6e63m0.c | 13 +- .../drm/panel/panel-samsung-s6e88a0-ams427ap24.c | 4 +- .../drm/panel/panel-samsung-s6e88a0-ams452ef01.c | 4 +- drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c | 7 +- .../panel/panel-samsung-s6e8aa5x01-ams561ra01.c | 8 +- .../gpu/drm/panel/panel-samsung-s6e8fc0-m1906f9.c | 4 +- drivers/gpu/drm/panel/panel-samsung-sofef00.c | 8 +- drivers/gpu/drm/panel/panel-seiko-43wvf1g.c | 22 +- drivers/gpu/drm/panel/panel-sharp-lq079l1sx01.c | 4 +- drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c | 4 +- drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c | 7 +- drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c | 6 +- drivers/gpu/drm/panel/panel-sharp-ls060t1sx01.c | 4 +- drivers/gpu/drm/panel/panel-simple.c | 53 +- drivers/gpu/drm/panel/panel-sitronix-st7701.c | 28 +- drivers/gpu/drm/panel/panel-sitronix-st7703.c | 22 +- drivers/gpu/drm/panel/panel-sitronix-st7789v.c | 35 +- drivers/gpu/drm/panel/panel-sony-acx565akm.c | 4 +- drivers/gpu/drm/panel/panel-sony-td4353-jdi.c | 4 +- .../gpu/drm/panel/panel-sony-tulip-truly-nt35521.c | 8 +- .../gpu/drm/panel/panel-startek-kd070fhfid015.c | 4 +- drivers/gpu/drm/panel/panel-synaptics-r63353.c | 4 +- drivers/gpu/drm/panel/panel-synaptics-tddi.c | 8 +- drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c | 4 +- drivers/gpu/drm/panel/panel-tpo-td028ttec1.c | 8 +- drivers/gpu/drm/panel/panel-tpo-td043mtea1.c | 4 +- drivers/gpu/drm/panel/panel-tpo-tpg110.c | 4 +- drivers/gpu/drm/panel/panel-truly-nt35597.c | 8 +- drivers/gpu/drm/panel/panel-visionox-g2647fb105.c | 4 +- drivers/gpu/drm/panel/panel-visionox-r66451.c | 8 +- drivers/gpu/drm/panel/panel-visionox-rm69299.c | 4 +- drivers/gpu/drm/panel/panel-visionox-rm692e5.c | 8 +- drivers/gpu/drm/panel/panel-visionox-vtdr6130.c | 20 +- drivers/gpu/drm/panel/panel-widechips-ws2401.c | 8 +- drivers/gpu/drm/panel/panel-xinpeng-xpp055c272.c | 6 +- drivers/gpu/drm/pl111/pl111_drv.c | 3 +- drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c | 5 +- drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c | 5 +- drivers/gpu/drm/rockchip/rockchip_lvds.c | 2 +- drivers/gpu/drm/rockchip/rockchip_rgb.c | 3 +- drivers/gpu/drm/stm/lvds.c | 4 + drivers/gpu/drm/sun4i/sun4i_lvds.c | 2 + drivers/gpu/drm/sun4i/sun4i_rgb.c | 2 + drivers/gpu/drm/tegra/sor.c | 2 + drivers/gpu/drm/tidss/tidss_kms.c | 4 +- include/drm/drm_bridge.h | 23 + include/drm/drm_panel.h | 219 +++++-- 163 files changed, 1080 insertions(+), 1532 deletions(-) --- base-commit: 4305aa866f20288739b680c75fd44d9f029b0c0b change-id: 20261013-drm-panel-funcs-0fbc59bd8790 Best regards, -- With best wishes Dmitry
