Loading Documentation/devicetree/bindings/drm/msm/mdss-dsi-panel.txt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -187,6 +187,9 @@ Optional properties: 255 = default value. 255 = default value. - qcom,mdss-brightness-max-level: Specifies the max brightness level supported. - qcom,mdss-brightness-max-level: Specifies the max brightness level supported. 255 = default value. 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. - qcom,mdss-dsi-interleave-mode: Specifies interleave mode. 0 = default value. 0 = default value. - qcom,mdss-dsi-panel-type: Specifies the panel operating mode. - qcom,mdss-dsi-panel-type: Specifies the panel operating mode. Loading Loading @@ -599,6 +602,7 @@ Example: qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = < 15>; qcom,mdss-dsi-bl-max-level = < 15>; qcom,mdss-brightness-max-level = <255>; qcom,mdss-brightness-max-level = <255>; qcom,bl-update-flag = "delay_until_first_frame"; qcom,mdss-dsi-interleave-mode = <0>; qcom,mdss-dsi-interleave-mode = <0>; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-te-check-enable; qcom,mdss-dsi-te-check-enable; Loading drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +12 −0 Original line number Original line Diff line number Diff line Loading @@ -1958,6 +1958,7 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, { { int rc = 0; int rc = 0; const char *bl_type; const char *bl_type; const char *data; u32 val = 0; u32 val = 0; bl_type = of_get_property(of_node, bl_type = of_get_property(of_node, Loading @@ -1977,6 +1978,17 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN; 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 = MAX_BL_SCALE_LEVEL; panel->bl_config.bl_scale_ad = MAX_AD_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 Original line Diff line number Diff line Loading @@ -51,6 +51,11 @@ enum dsi_backlight_type { DSI_BACKLIGHT_MAX, DSI_BACKLIGHT_MAX, }; }; enum bl_update_flag { BL_UPDATE_DELAY_UNTIL_FIRST_FRAME, BL_UPDATE_NONE, }; enum { enum { MODE_GPIO_NOT_VALID = 0, MODE_GPIO_NOT_VALID = 0, MODE_SEL_DUAL_PORT, MODE_SEL_DUAL_PORT, Loading Loading @@ -85,6 +90,7 @@ struct dsi_panel_phy_props { struct dsi_backlight_config { struct dsi_backlight_config { enum dsi_backlight_type type; enum dsi_backlight_type type; enum bl_update_flag bl_update; u32 bl_min_level; u32 bl_min_level; u32 bl_max_level; u32 bl_max_level; Loading drivers/gpu/drm/msm/sde/sde_connector.c +41 −6 Original line number Original line 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) if (!bl_lvl && brightness) bl_lvl = 1; 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) { if (c_conn->ops.set_backlight) { event.type = DRM_EVENT_SYS_BACKLIGHT; event.type = DRM_EVENT_SYS_BACKLIGHT; event.length = sizeof(u32); event.length = sizeof(u32); msm_mode_object_event_notify(&c_conn->base.base, msm_mode_object_event_notify(&c_conn->base.base, c_conn->base.dev, &event, (u8 *)&brightness); c_conn->base.dev, &event, (u8 *)&brightness); rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl); rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl); c_conn->unset_bl_level = 0; } } return rc; 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; 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) if (c_conn->bl_scale > MAX_BL_SCALE_LEVEL) bl_config->bl_scale = MAX_BL_SCALE_LEVEL; bl_config->bl_scale = MAX_BL_SCALE_LEVEL; else 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_scale, bl_config->bl_scale_ad, bl_config->bl_level); bl_config->bl_level); rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level); rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level); c_conn->unset_bl_level = 0; return rc; 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); _sde_connector_update_bl_scale(c_conn); c_conn->bl_scale_dirty = false; 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); sde_connector_schedule_status_work(connector, false); c_conn = to_sde_connector(connector); 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.power = FB_BLANK_POWERDOWN; c_conn->bl_device->props.state |= BL_CORE_FBBLANK; c_conn->bl_device->props.state |= BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); backlight_update_status(c_conn->bl_device); } } c_conn->allow_bl_update = false; } } void sde_connector_helper_bridge_enable(struct drm_connector *connector) void sde_connector_helper_bridge_enable(struct drm_connector *connector) { { struct sde_connector *c_conn = NULL; struct sde_connector *c_conn = NULL; struct dsi_display *display; if (!connector) if (!connector) return; return; c_conn = to_sde_connector(connector); 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->bl_device) { if (c_conn->panel_dead) { c_conn->bl_device->props.power = FB_BLANK_UNBLANK; c_conn->bl_device->props.power = FB_BLANK_UNBLANK; c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK; c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); 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) 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 Original line 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_dirty: Flag to indicate PP BL scale value(s) is changed * @bl_scale: BL scale value for ABA feature * @bl_scale: BL scale value for ABA feature * @bl_scale_ad: BL scale value for AD 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 sde_connector { struct drm_connector base; struct drm_connector base; Loading Loading @@ -373,6 +375,8 @@ struct sde_connector { bool bl_scale_dirty; bool bl_scale_dirty; u32 bl_scale; u32 bl_scale; u32 bl_scale_ad; u32 bl_scale_ad; u32 unset_bl_level; bool allow_bl_update; bool last_cmd_tx_sts; bool last_cmd_tx_sts; }; }; Loading Loading
Documentation/devicetree/bindings/drm/msm/mdss-dsi-panel.txt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -187,6 +187,9 @@ Optional properties: 255 = default value. 255 = default value. - qcom,mdss-brightness-max-level: Specifies the max brightness level supported. - qcom,mdss-brightness-max-level: Specifies the max brightness level supported. 255 = default value. 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. - qcom,mdss-dsi-interleave-mode: Specifies interleave mode. 0 = default value. 0 = default value. - qcom,mdss-dsi-panel-type: Specifies the panel operating mode. - qcom,mdss-dsi-panel-type: Specifies the panel operating mode. Loading Loading @@ -599,6 +602,7 @@ Example: qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = < 15>; qcom,mdss-dsi-bl-max-level = < 15>; qcom,mdss-brightness-max-level = <255>; qcom,mdss-brightness-max-level = <255>; qcom,bl-update-flag = "delay_until_first_frame"; qcom,mdss-dsi-interleave-mode = <0>; qcom,mdss-dsi-interleave-mode = <0>; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-te-check-enable; qcom,mdss-dsi-te-check-enable; Loading
drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +12 −0 Original line number Original line Diff line number Diff line Loading @@ -1958,6 +1958,7 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, { { int rc = 0; int rc = 0; const char *bl_type; const char *bl_type; const char *data; u32 val = 0; u32 val = 0; bl_type = of_get_property(of_node, bl_type = of_get_property(of_node, Loading @@ -1977,6 +1978,17 @@ static int dsi_panel_parse_bl_config(struct dsi_panel *panel, panel->bl_config.type = DSI_BACKLIGHT_UNKNOWN; 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 = MAX_BL_SCALE_LEVEL; panel->bl_config.bl_scale_ad = MAX_AD_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 Original line Diff line number Diff line Loading @@ -51,6 +51,11 @@ enum dsi_backlight_type { DSI_BACKLIGHT_MAX, DSI_BACKLIGHT_MAX, }; }; enum bl_update_flag { BL_UPDATE_DELAY_UNTIL_FIRST_FRAME, BL_UPDATE_NONE, }; enum { enum { MODE_GPIO_NOT_VALID = 0, MODE_GPIO_NOT_VALID = 0, MODE_SEL_DUAL_PORT, MODE_SEL_DUAL_PORT, Loading Loading @@ -85,6 +90,7 @@ struct dsi_panel_phy_props { struct dsi_backlight_config { struct dsi_backlight_config { enum dsi_backlight_type type; enum dsi_backlight_type type; enum bl_update_flag bl_update; u32 bl_min_level; u32 bl_min_level; u32 bl_max_level; u32 bl_max_level; Loading
drivers/gpu/drm/msm/sde/sde_connector.c +41 −6 Original line number Original line 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) if (!bl_lvl && brightness) bl_lvl = 1; 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) { if (c_conn->ops.set_backlight) { event.type = DRM_EVENT_SYS_BACKLIGHT; event.type = DRM_EVENT_SYS_BACKLIGHT; event.length = sizeof(u32); event.length = sizeof(u32); msm_mode_object_event_notify(&c_conn->base.base, msm_mode_object_event_notify(&c_conn->base.base, c_conn->base.dev, &event, (u8 *)&brightness); c_conn->base.dev, &event, (u8 *)&brightness); rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl); rc = c_conn->ops.set_backlight(c_conn->display, bl_lvl); c_conn->unset_bl_level = 0; } } return rc; 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; 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) if (c_conn->bl_scale > MAX_BL_SCALE_LEVEL) bl_config->bl_scale = MAX_BL_SCALE_LEVEL; bl_config->bl_scale = MAX_BL_SCALE_LEVEL; else 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_scale, bl_config->bl_scale_ad, bl_config->bl_level); bl_config->bl_level); rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level); rc = c_conn->ops.set_backlight(dsi_display, bl_config->bl_level); c_conn->unset_bl_level = 0; return rc; 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); _sde_connector_update_bl_scale(c_conn); c_conn->bl_scale_dirty = false; 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); sde_connector_schedule_status_work(connector, false); c_conn = to_sde_connector(connector); 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.power = FB_BLANK_POWERDOWN; c_conn->bl_device->props.state |= BL_CORE_FBBLANK; c_conn->bl_device->props.state |= BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); backlight_update_status(c_conn->bl_device); } } c_conn->allow_bl_update = false; } } void sde_connector_helper_bridge_enable(struct drm_connector *connector) void sde_connector_helper_bridge_enable(struct drm_connector *connector) { { struct sde_connector *c_conn = NULL; struct sde_connector *c_conn = NULL; struct dsi_display *display; if (!connector) if (!connector) return; return; c_conn = to_sde_connector(connector); 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->bl_device) { if (c_conn->panel_dead) { c_conn->bl_device->props.power = FB_BLANK_UNBLANK; c_conn->bl_device->props.power = FB_BLANK_UNBLANK; c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK; c_conn->bl_device->props.state &= ~BL_CORE_FBBLANK; backlight_update_status(c_conn->bl_device); 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) 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 Original line 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_dirty: Flag to indicate PP BL scale value(s) is changed * @bl_scale: BL scale value for ABA feature * @bl_scale: BL scale value for ABA feature * @bl_scale_ad: BL scale value for AD 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 sde_connector { struct drm_connector base; struct drm_connector base; Loading Loading @@ -373,6 +375,8 @@ struct sde_connector { bool bl_scale_dirty; bool bl_scale_dirty; u32 bl_scale; u32 bl_scale; u32 bl_scale_ad; u32 bl_scale_ad; u32 unset_bl_level; bool allow_bl_update; bool last_cmd_tx_sts; bool last_cmd_tx_sts; }; }; Loading