• Stephan Gerhold's avatar
    drm/msm/dsi: Delay drm_panel_enable() until dsi_mgr_bridge_enable() · e5400750
    Stephan Gerhold authored
    At the moment, the MSM DSI driver calls drm_panel_enable() rather early
    from the DSI bridge pre_enable() function. At this point, the encoder
    (e.g. MDP5) is not enabled, so we have not started transmitting
    video data.
    
    However, the drm_panel_funcs documentation states that enable()
    should be called on the panel *after* video data is being transmitted:
    
      The .prepare() function is typically called before the display controller
      starts to transmit video data. [...] After the display controller has
      started transmitting video data, it's safe to call the .enable() function.
      This will typically enable the backlight to make the image on screen visible.
    
    Calling drm_panel_enable() too early causes problems for some panels:
    The TFT LCD panel used in the Samsung Galaxy Tab A 9.7 (2015) (APQ8016)
    uses the MIPI_DCS_SET_DISPLAY_BRIGHTNESS command to control
    backlight/brightness of the screen. The enable sequence is therefore:
    
      drm_panel_enable()
        drm_panel_funcs.enable():
          backlight_enable()
            backlight_ops.update_status():
              mipi_dsi_dcs_set_display_brightness(dsi, bl->props.brightness);
    
    The panel seems to silently ignore the MIPI_DCS_SET_DISPLAY_BRIGHTNESS
    command if it is sent too early. This prevents setting the initial brightness,
    causing the display to be enabled with minimum brightness instead.
    Adding various delays in the panel initialization code does not result
    in any difference.
    
    On the other hand, moving drm_panel_enable() to dsi_mgr_bridge_enable()
    fixes the problem, indicating that the panel requires the video stream
    to be active before the brightness command is accepted.
    
    Therefore: Move drm_panel_enable() to dsi_mgr_bridge_enable() to
    delay calling it until video data is being transmitted.
    
    Move drm_panel_disable() to dsi_mgr_bridge_disable() for similar reasons.
    (This is not strictly required for the panel affected above...)
    Tested-by: default avatarJasper Korten <jja2000@gmail.com>
    Signed-off-by: default avatarStephan Gerhold <stephan@gerhold.net>
    Tested-by: default avatarJeffrey Hugo <jeffrey.l.hugo@gmail.com>
    Reviewed-by: default avatarJeffrey Hugo <jeffrey.l.hugo@gmail.com>
    Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
    e5400750
dsi_manager.c 21.6 KB