Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/bridge: add psr support for panel bridge callbacks

This change will handle the psr entry exit cases in the panel
bridge atomic callback functions. For example, the panel power
should not turn off if the panel is entering psr.

Signed-off-by: Sankeerth Billakanti <quic_sbillaka@quicinc.com>
Signed-off-by: Vinod Polimera <quic_vpolimer@quicinc.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Patchwork: https://patchwork.freedesktop.org/patch/524721/
Link: https://lore.kernel.org/r/1677774797-31063-4-git-send-email-quic_vpolimer@quicinc.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

authored by

Vinod Polimera and committed by
Dmitry Baryshkov
d011db30 b67e0f53

+48
+48
drivers/gpu/drm/bridge/panel.c
··· 113 113 struct drm_bridge_state *old_bridge_state) 114 114 { 115 115 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 116 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 117 + struct drm_encoder *encoder = bridge->encoder; 118 + struct drm_crtc *crtc; 119 + struct drm_crtc_state *old_crtc_state; 120 + 121 + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder); 122 + if (!crtc) 123 + return; 124 + 125 + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); 126 + if (old_crtc_state && old_crtc_state->self_refresh_active) 127 + return; 116 128 117 129 drm_panel_prepare(panel_bridge->panel); 118 130 } ··· 133 121 struct drm_bridge_state *old_bridge_state) 134 122 { 135 123 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 124 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 125 + struct drm_encoder *encoder = bridge->encoder; 126 + struct drm_crtc *crtc; 127 + struct drm_crtc_state *old_crtc_state; 128 + 129 + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder); 130 + if (!crtc) 131 + return; 132 + 133 + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); 134 + if (old_crtc_state && old_crtc_state->self_refresh_active) 135 + return; 136 136 137 137 drm_panel_enable(panel_bridge->panel); 138 138 } ··· 153 129 struct drm_bridge_state *old_bridge_state) 154 130 { 155 131 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 132 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 133 + struct drm_encoder *encoder = bridge->encoder; 134 + struct drm_crtc *crtc; 135 + struct drm_crtc_state *new_crtc_state; 136 + 137 + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder); 138 + if (!crtc) 139 + return; 140 + 141 + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); 142 + if (new_crtc_state && new_crtc_state->self_refresh_active) 143 + return; 156 144 157 145 drm_panel_disable(panel_bridge->panel); 158 146 } ··· 173 137 struct drm_bridge_state *old_bridge_state) 174 138 { 175 139 struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); 140 + struct drm_atomic_state *atomic_state = old_bridge_state->base.state; 141 + struct drm_encoder *encoder = bridge->encoder; 142 + struct drm_crtc *crtc; 143 + struct drm_crtc_state *new_crtc_state; 144 + 145 + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder); 146 + if (!crtc) 147 + return; 148 + 149 + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); 150 + if (new_crtc_state && new_crtc_state->self_refresh_active) 151 + return; 176 152 177 153 drm_panel_unprepare(panel_bridge->panel); 178 154 }