diff --git a/msm/dsi/dsi_defs.h b/msm/dsi/dsi_defs.h index 7479bf16a86c..3e22080635dc 100644 --- a/msm/dsi/dsi_defs.h +++ b/msm/dsi/dsi_defs.h @@ -262,6 +262,7 @@ enum dsi_dyn_clk_feature_type { * @DSI_CMD_SET_POST_TIMING_SWITCH: Post timing switch * @DSI_CMD_SET_QSYNC_ON Enable qsync mode * @DSI_CMD_SET_QSYNC_OFF Disable qsync mode + * @DSI_CMD_SET_HBM_FOD_ON: Turning HBM_FOD on * @DSI_CMD_SET_HBM_ON: Turning HBM on * @DSI_CMD_SET_HBM_OFF: Turning HBM off * @DSI_CMD_SET_ACL_ON: Turning ACL on @@ -292,6 +293,7 @@ enum dsi_cmd_set_type { DSI_CMD_SET_POST_TIMING_SWITCH, DSI_CMD_SET_QSYNC_ON, DSI_CMD_SET_QSYNC_OFF, + DSI_CMD_SET_HBM_FOD_ON, DSI_CMD_SET_HBM_ON, DSI_CMD_SET_HBM_OFF, DSI_CMD_SET_ACL_ON, diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 0236ac59252a..a46e016948cd 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -45,6 +45,7 @@ static struct panel_param_val_map hbm_map[HBM_STATE_NUM] = { {HBM_OFF_STATE, DSI_CMD_SET_HBM_OFF, NULL}, {HBM_ON_STATE, DSI_CMD_SET_HBM_ON, NULL}, + {HBM_FOD_ON_STATE, DSI_CMD_SET_HBM_FOD_ON, NULL}, }; static struct panel_param_val_map acl_map[ACL_STATE_NUM] = { @@ -755,6 +756,10 @@ static int dsi_panel_send_param_cmd(struct dsi_panel *panel, panel_param->default_value, panel_param->value); mutex_lock(&panel->panel_lock); + + if (param_info->value >= panel_param->val_max) + param_info->value = panel_param->val_max - 1; + if (panel_param->value == param_info->value) { DSI_INFO("(mode=%d): requested value=%d is same. Do nothing\n", @@ -1952,6 +1957,7 @@ const char *cmd_set_prop_map[DSI_CMD_SET_MAX] = { "qcom,mdss-dsi-post-mode-switch-on-command", "qcom,mdss-dsi-qsync-on-commands", "qcom,mdss-dsi-qsync-off-commands", + "qcom,mdss-dsi-hbm-fod-on-command", "qcom,mdss-dsi-hbm-on-command", "qcom,mdss-dsi-hbm-off-command", "qcom,mdss-dsi-acl-on-command", @@ -1982,6 +1988,7 @@ const char *cmd_set_state_map[DSI_CMD_SET_MAX] = { "qcom,mdss-dsi-post-mode-switch-on-command-state", "qcom,mdss-dsi-qsync-on-commands-state", "qcom,mdss-dsi-qsync-off-commands-state", + "qcom,mdss-dsi-hbm-fod-on-command-state", "qcom,mdss-dsi-hbm-on-command-state", "qcom,mdss-dsi-hbm-off-command-state", "qcom,mdss-dsi-acl-on-command-state", @@ -3716,6 +3723,12 @@ static int dsi_panel_parse_param_prop(struct dsi_panel *panel, if (!prop) continue; + if ((type == DSI_CMD_SET_HBM_FOD_ON) && + (!panel->panel_hbm_fod)) { + param->val_max -= 1; + continue; + } + rc = dsi_panel_parse_cmd_sets_sub(param_map->cmds, type, utils); if (rc) { @@ -3732,6 +3745,9 @@ static int dsi_panel_parse_param_prop(struct dsi_panel *panel, } } + panel->panel_hbm_fod = of_property_read_bool(of_node, + "qcom,mdss-dsi-hbm-fod"); + return rc; parse_err: diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 4be81859ce79..2a2e61bbc2f6 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -201,6 +201,7 @@ enum acl_state { enum hbm_state { HBM_OFF_STATE = 0, HBM_ON_STATE, + HBM_FOD_ON_STATE, HBM_STATE_NUM }; @@ -213,7 +214,7 @@ struct panel_param_val_map { struct panel_param { const char *param_name; struct panel_param_val_map *val_map; - const u16 val_max; + u16 val_max; const u16 default_value; u16 value; bool is_supported; @@ -312,6 +313,8 @@ struct dsi_panel { u32 disp_on_chk_val; bool no_panel_on_read_support; + bool panel_hbm_fod; + struct panel_param *param_cmds; };