lkml.org 
[lkml]   [2023]   [Jan]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH Resend v11 07/15] drm/bridge: add psr support for panel bridge callbacks
    Date
    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>
    ---
    drivers/gpu/drm/bridge/panel.c | 48 ++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 48 insertions(+)

    diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
    index 04e9fb0..a2c6f30 100644
    --- a/drivers/gpu/drm/bridge/panel.c
    +++ b/drivers/gpu/drm/bridge/panel.c
    @@ -113,6 +113,18 @@ static void panel_bridge_atomic_pre_enable(struct drm_bridge *bridge,
    struct drm_bridge_state *old_bridge_state)
    {
    struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
    + struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
    + struct drm_encoder *encoder = bridge->encoder;
    + struct drm_crtc *crtc;
    + struct drm_crtc_state *old_crtc_state;
    +
    + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder);
    + if (!crtc)
    + return;
    +
    + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc);
    + if (old_crtc_state && old_crtc_state->self_refresh_active)
    + return;

    drm_panel_prepare(panel_bridge->panel);
    }
    @@ -121,6 +133,18 @@ static void panel_bridge_atomic_enable(struct drm_bridge *bridge,
    struct drm_bridge_state *old_bridge_state)
    {
    struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
    + struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
    + struct drm_encoder *encoder = bridge->encoder;
    + struct drm_crtc *crtc;
    + struct drm_crtc_state *old_crtc_state;
    +
    + crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, encoder);
    + if (!crtc)
    + return;
    +
    + old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc);
    + if (old_crtc_state && old_crtc_state->self_refresh_active)
    + return;

    drm_panel_enable(panel_bridge->panel);
    }
    @@ -129,6 +153,18 @@ static void panel_bridge_atomic_disable(struct drm_bridge *bridge,
    struct drm_bridge_state *old_bridge_state)
    {
    struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
    + struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
    + struct drm_encoder *encoder = bridge->encoder;
    + struct drm_crtc *crtc;
    + struct drm_crtc_state *new_crtc_state;
    +
    + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder);
    + if (!crtc)
    + return;
    +
    + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc);
    + if (new_crtc_state && new_crtc_state->self_refresh_active)
    + return;

    drm_panel_disable(panel_bridge->panel);
    }
    @@ -137,6 +173,18 @@ static void panel_bridge_atomic_post_disable(struct drm_bridge *bridge,
    struct drm_bridge_state *old_bridge_state)
    {
    struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
    + struct drm_atomic_state *atomic_state = old_bridge_state->base.state;
    + struct drm_encoder *encoder = bridge->encoder;
    + struct drm_crtc *crtc;
    + struct drm_crtc_state *new_crtc_state;
    +
    + crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, encoder);
    + if (!crtc)
    + return;
    +
    + new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc);
    + if (new_crtc_state && new_crtc_state->self_refresh_active)
    + return;

    drm_panel_unprepare(panel_bridge->panel);
    }
    --
    2.7.4
    \
     
     \ /
      Last update: 2023-03-26 23:47    [W:5.228 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site