Loading Documentation/devicetree/bindings/drm/msm/mdss-dsi-panel.txt +4 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,9 @@ Optional properties: 255 = default value. - qcom,mdss-brightness-max-level: Specifies the max brightness level supported. 255 = default value. - qcom,bl-update-flag: A string that specifies controls for backlight update of the panel. "delay_until_first_frame" = Delay backlight update of the panel until the first frame is received from the HW. - qcom,mdss-dsi-interleave-mode: Specifies interleave mode. 0 = default value. - qcom,mdss-dsi-panel-type: Specifies the panel operating mode. Loading Loading @@ -600,6 +603,7 @@ Example: qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = < 15>; qcom,mdss-brightness-max-level = <255>; qcom,bl-update-flag = "delay_until_first_frame"; qcom,mdss-dsi-interleave-mode = <0>; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-te-check-enable; Loading drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +12 −0 Original line number Diff line number Diff line Loading @@ -1998,6 +1998,7 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, { int rc = 0; const char *bl_type; const char *data; u32 val = 0; bl_type = of_get_property(of_node, Loading @@ -2017,6 +2018,17 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN; } data = of_get_property(of_node, "qcom,bl-update-flag", NULL); if (!data) { panel->bl_config.bl_update = BL_UPDATE_NONE; } else if (!strcmp(data, "delay_until_first_frame")) { panel->bl_config.bl_update = BL_UPDATE_DELAY_UNTIL_FIRST_FRAME; } else { pr_debug("[%s] No valid bl-update-flag: %s\n", panel->name, data); panel->bl_config.bl_update = BL_UPDATE_NONE; } panel->bl_config.bl_scale = MAX_BL_SCALE_LEVEL; panel->bl_config.bl_scale_ad = MAX_AD_BL_SCALE_LEVEL; Loading drivers/gpu/drm/msm/dsi-staging/dsi_panel.h +6 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,11 @@ enum dsi_backlight_type { DSI_BACKLIGHT_MAX, }; enum bl_update_flag { BL_UPDATE_DELAY_UNTIL_FIRST_FRAME, BL_UPDATE_NONE, }; enum { MODE_GPIO_NOT_VALID = 0, MODE_SEL_DUAL_PORT, Loading Loading @@ -93,6 +98,7 @@ struct dsi_panel_phy_props { struct dsi_backlight_config { enum dsi_backlight_type type; enum bl_update_flag bl_update; u32 bl_min_level; u32 bl_max_level; Loading drivers/gpu/drm/msm/sde/sde_connector.c +41 −6 Original line number Diff line number Diff line Loading @@ -89,12 +89,19 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) if (!bl_lvl && brightness) bl_lvl = 1; if (display->panel->bl_config.bl_update == BL_UPDATE_DELAY_UNTIL_FIRST_FRAME && !c_conn->allow_bl_update) { c_conn->unset_bl_level = bl_lvl; return 0; } if (c_conn->ops.set_backlight) { event.type = DRM_EVENT_SYS_BACKLIGHT; event.length = sizeof(u32); msm_mode_object_event_notify(&c_conn->base.base, c_conn->base.dev, &event, (u8 *)&brightness); rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl); c_conn->unset_bl_level = 0; } return rc; Loading Loading @@ -519,6 +526,15 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn) bl_config = &dsi_display->panel->bl_config; if (dsi_display->panel->bl_config.bl_update == BL_UPDATE_DELAY_UNTIL_FIRST_FRAME && !c_conn->allow_bl_update) { c_conn->unset_bl_level = bl_config->bl_level; return 0; } if (c_conn->unset_bl_level) bl_config->bl_level = c_conn->unset_bl_level; if (c_conn->bl_scale > MAX_BL_SCALE_LEVEL) bl_config->bl_scale = MAX_BL_SCALE_LEVEL; else Loading @@ -533,6 +549,7 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn) bl_config->bl_scale, bl_config->bl_scale_ad, bl_config->bl_level); rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level); c_conn->unset_bl_level = 0; return rc; } Loading Loading @@ -572,8 +589,11 @@ static int _sde_connector_update_dirty_properties( } } /* Special handling for postproc properties */ if (c_conn->bl_scale_dirty) { /* * Special handling for postproc properties and * for updating backlight if any unset backlight level is present */ if (c_conn->bl_scale_dirty || c_conn->unset_bl_level) { _sde_connector_update_bl_scale(c_conn); c_conn->bl_scale_dirty = false; } Loading Loading @@ -639,29 +659,44 @@ void sde_connector_helper_bridge_disable(struct drm_connector *connector) sde_connector_schedule_status_work(connector, false); c_conn = to_sde_connector(connector); if (c_conn->panel_dead) { if (c_conn->bl_device) { c_conn->bl_device->props.power = FB_BLANK_POWERDOWN; c_conn->bl_device->props.state |= BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); } c_conn->allow_bl_update = false; } void sde_connector_helper_bridge_enable(struct drm_connector *connector) { struct sde_connector *c_conn = NULL; struct dsi_display *display; if (!connector) return; c_conn = to_sde_connector(connector); display = (struct dsi_display *) c_conn->display; /* * Special handling for some panels which need atleast * one frame to be transferred to GRAM before enabling backlight. * So delay backlight update to these panels until the * first frame commit is received from the HW. */ if (display->panel->bl_config.bl_update == BL_UPDATE_DELAY_UNTIL_FIRST_FRAME) sde_encoder_wait_for_event(c_conn->encoder, MSM_ENC_TX_COMPLETE); c_conn->allow_bl_update = true; /* Special handling for ESD recovery case */ if (c_conn->panel_dead) { if (c_conn->bl_device) { c_conn->bl_device->props.power = FB_BLANK_UNBLANK; c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); c_conn->panel_dead = false; } c_conn->panel_dead = false; } int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable) Loading drivers/gpu/drm/msm/sde/sde_connector.h +5 −1 Original line number Diff line number Diff line Loading @@ -329,7 +329,9 @@ struct sde_connector_evt { * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed * @bl_scale: BL scale value for ABA feature * @bl_scale_ad: BL scale value for AD feature * last_cmd_tx_sts: status of the last command transfer * @unset_bl_level: BL level that needs to be set later * @allow_bl_update: Flag to indicate if BL update is allowed currently or not * @last_cmd_tx_sts: status of the last command transfer */ struct sde_connector { struct drm_connector base; Loading Loading @@ -373,6 +375,8 @@ struct sde_connector { bool bl_scale_dirty; u32 bl_scale; u32 bl_scale_ad; u32 unset_bl_level; bool allow_bl_update; bool last_cmd_tx_sts; }; Loading Loading
Documentation/devicetree/bindings/drm/msm/mdss-dsi-panel.txt +4 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,9 @@ Optional properties: 255 = default value. - qcom,mdss-brightness-max-level: Specifies the max brightness level supported. 255 = default value. - qcom,bl-update-flag: A string that specifies controls for backlight update of the panel. "delay_until_first_frame" = Delay backlight update of the panel until the first frame is received from the HW. - qcom,mdss-dsi-interleave-mode: Specifies interleave mode. 0 = default value. - qcom,mdss-dsi-panel-type: Specifies the panel operating mode. Loading Loading @@ -600,6 +603,7 @@ Example: qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = < 15>; qcom,mdss-brightness-max-level = <255>; qcom,bl-update-flag = "delay_until_first_frame"; qcom,mdss-dsi-interleave-mode = <0>; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-te-check-enable; Loading
drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +12 −0 Original line number Diff line number Diff line Loading @@ -1998,6 +1998,7 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, { int rc = 0; const char *bl_type; const char *data; u32 val = 0; bl_type = of_get_property(of_node, Loading @@ -2017,6 +2018,17 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN; } data = of_get_property(of_node, "qcom,bl-update-flag", NULL); if (!data) { panel->bl_config.bl_update = BL_UPDATE_NONE; } else if (!strcmp(data, "delay_until_first_frame")) { panel->bl_config.bl_update = BL_UPDATE_DELAY_UNTIL_FIRST_FRAME; } else { pr_debug("[%s] No valid bl-update-flag: %s\n", panel->name, data); panel->bl_config.bl_update = BL_UPDATE_NONE; } panel->bl_config.bl_scale = MAX_BL_SCALE_LEVEL; panel->bl_config.bl_scale_ad = MAX_AD_BL_SCALE_LEVEL; Loading
drivers/gpu/drm/msm/dsi-staging/dsi_panel.h +6 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,11 @@ enum dsi_backlight_type { DSI_BACKLIGHT_MAX, }; enum bl_update_flag { BL_UPDATE_DELAY_UNTIL_FIRST_FRAME, BL_UPDATE_NONE, }; enum { MODE_GPIO_NOT_VALID = 0, MODE_SEL_DUAL_PORT, Loading Loading @@ -93,6 +98,7 @@ struct dsi_panel_phy_props { struct dsi_backlight_config { enum dsi_backlight_type type; enum bl_update_flag bl_update; u32 bl_min_level; u32 bl_max_level; Loading
drivers/gpu/drm/msm/sde/sde_connector.c +41 −6 Original line number Diff line number Diff line Loading @@ -89,12 +89,19 @@ static int sde_backlight_device_update_status(struct backlight_device *bd) if (!bl_lvl && brightness) bl_lvl = 1; if (display->panel->bl_config.bl_update == BL_UPDATE_DELAY_UNTIL_FIRST_FRAME && !c_conn->allow_bl_update) { c_conn->unset_bl_level = bl_lvl; return 0; } if (c_conn->ops.set_backlight) { event.type = DRM_EVENT_SYS_BACKLIGHT; event.length = sizeof(u32); msm_mode_object_event_notify(&c_conn->base.base, c_conn->base.dev, &event, (u8 *)&brightness); rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl); c_conn->unset_bl_level = 0; } return rc; Loading Loading @@ -519,6 +526,15 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn) bl_config = &dsi_display->panel->bl_config; if (dsi_display->panel->bl_config.bl_update == BL_UPDATE_DELAY_UNTIL_FIRST_FRAME && !c_conn->allow_bl_update) { c_conn->unset_bl_level = bl_config->bl_level; return 0; } if (c_conn->unset_bl_level) bl_config->bl_level = c_conn->unset_bl_level; if (c_conn->bl_scale > MAX_BL_SCALE_LEVEL) bl_config->bl_scale = MAX_BL_SCALE_LEVEL; else Loading @@ -533,6 +549,7 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn) bl_config->bl_scale, bl_config->bl_scale_ad, bl_config->bl_level); rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level); c_conn->unset_bl_level = 0; return rc; } Loading Loading @@ -572,8 +589,11 @@ static int _sde_connector_update_dirty_properties( } } /* Special handling for postproc properties */ if (c_conn->bl_scale_dirty) { /* * Special handling for postproc properties and * for updating backlight if any unset backlight level is present */ if (c_conn->bl_scale_dirty || c_conn->unset_bl_level) { _sde_connector_update_bl_scale(c_conn); c_conn->bl_scale_dirty = false; } Loading Loading @@ -639,29 +659,44 @@ void sde_connector_helper_bridge_disable(struct drm_connector *connector) sde_connector_schedule_status_work(connector, false); c_conn = to_sde_connector(connector); if (c_conn->panel_dead) { if (c_conn->bl_device) { c_conn->bl_device->props.power = FB_BLANK_POWERDOWN; c_conn->bl_device->props.state |= BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); } c_conn->allow_bl_update = false; } void sde_connector_helper_bridge_enable(struct drm_connector *connector) { struct sde_connector *c_conn = NULL; struct dsi_display *display; if (!connector) return; c_conn = to_sde_connector(connector); display = (struct dsi_display *) c_conn->display; /* * Special handling for some panels which need atleast * one frame to be transferred to GRAM before enabling backlight. * So delay backlight update to these panels until the * first frame commit is received from the HW. */ if (display->panel->bl_config.bl_update == BL_UPDATE_DELAY_UNTIL_FIRST_FRAME) sde_encoder_wait_for_event(c_conn->encoder, MSM_ENC_TX_COMPLETE); c_conn->allow_bl_update = true; /* Special handling for ESD recovery case */ if (c_conn->panel_dead) { if (c_conn->bl_device) { c_conn->bl_device->props.power = FB_BLANK_UNBLANK; c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); c_conn->panel_dead = false; } c_conn->panel_dead = false; } int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable) Loading
drivers/gpu/drm/msm/sde/sde_connector.h +5 −1 Original line number Diff line number Diff line Loading @@ -329,7 +329,9 @@ struct sde_connector_evt { * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed * @bl_scale: BL scale value for ABA feature * @bl_scale_ad: BL scale value for AD feature * last_cmd_tx_sts: status of the last command transfer * @unset_bl_level: BL level that needs to be set later * @allow_bl_update: Flag to indicate if BL update is allowed currently or not * @last_cmd_tx_sts: status of the last command transfer */ struct sde_connector { struct drm_connector base; Loading Loading @@ -373,6 +375,8 @@ struct sde_connector { bool bl_scale_dirty; u32 bl_scale; u32 bl_scale_ad; u32 unset_bl_level; bool allow_bl_update; bool last_cmd_tx_sts; }; Loading