From 88794fe9cb11ac43f6578f6f1f8c905bb7125f6a Mon Sep 17 00:00:00 2001 From: daiss1 Date: Mon, 10 May 2021 11:14:30 +0800 Subject: [PATCH] drm: Add the DC panel param feature Add the DC panel param feature which will be controlled from the user-space Change-Id: Iacb5d78c3a01874b21a3ceMontanafcc8362b1b03c29 Signed-off-by: daiss1 Reviewed-on: https://gerrit.mot.com/2041322 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Dezhen Hou Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- msm/dsi/dsi_defs.h | 5 ++++- msm/dsi/dsi_panel.c | 35 ++++++++++++++++++++++++++++++++++- msm/dsi/dsi_panel.h | 6 ++++++ msm/msm_drv.h | 2 ++ msm/sde/sde_connector.c | 10 ++++++++++ msm/sde/sde_motUtil.c | 3 +++ msm/sde/sde_motUtil.h | 1 + 7 files changed, 60 insertions(+), 2 deletions(-) diff --git a/msm/dsi/dsi_defs.h b/msm/dsi/dsi_defs.h index d6893e028642..51807392221f 100644 --- a/msm/dsi/dsi_defs.h +++ b/msm/dsi/dsi_defs.h @@ -273,7 +273,8 @@ enum dsi_dyn_clk_feature_type { * @DSI_CMD_SET_CABC_DIS: CABC DIS mode * @DSI_CMD_SET_DFPS_CMD_90: DFPS switch to 90 * @DSI_CMD_SET_DFPS_CMD_60: DFPS switch to 60 - + * @DSI_CMD_SET_DC_ON: DC mode on + * @DSI_CMD_SET_DC_OFF: DC mode off * @DSI_CMD_SET_MAX */ enum dsi_cmd_set_type { @@ -311,6 +312,8 @@ enum dsi_cmd_set_type { DSI_CMD_SET_CABC_DIS, DSI_CMD_SET_DFPS_CMD_90, DSI_CMD_SET_DFPS_CMD_60, + DSI_CMD_SET_DC_ON, + DSI_CMD_SET_DC_OFF, DSI_CMD_SET_MAX }; diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 5c78b3e60114..c7c52832ad4a 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -81,6 +81,16 @@ static struct panel_param_val_map cabc_map_s[CABC_STATE_NUM] = { {CABC_DIS_STATE, DSI_CMD_SET_CABC_DIS, NULL}, }; +static struct panel_param_val_map dc_map[DC_STATE_NUM] = { + {DC_OFF_STATE, DSI_CMD_SET_DC_OFF, NULL}, + {DC_ON_STATE, DSI_CMD_SET_DC_ON, NULL}, +}; + +static struct panel_param_val_map dc_map_s[DC_STATE_NUM] = { + {DC_OFF_STATE, DSI_CMD_SET_DC_OFF, NULL}, + {DC_ON_STATE, DSI_CMD_SET_DC_ON, NULL}, +}; + static struct panel_param dsi_panel_param[PANEL_IDX_MAX][PARAM_ID_NUM] = { { {"HBM", hbm_map, HBM_STATE_NUM, HBM_OFF_STATE, @@ -88,7 +98,9 @@ static struct panel_param dsi_panel_param[PANEL_IDX_MAX][PARAM_ID_NUM] = { {"CABC", cabc_map, CABC_STATE_NUM, CABC_UI_STATE, CABC_UI_STATE, false}, {"ACL", acl_map, ACL_STATE_NUM, ACL_OFF_STATE, - ACL_OFF_STATE, false} + ACL_OFF_STATE, false}, + {"DC", dc_map, DC_STATE_NUM, DC_OFF_STATE, + DC_OFF_STATE, false} }, { {"HBM", hbm_map_s, HBM_STATE_NUM, HBM_OFF_STATE, @@ -97,6 +109,8 @@ static struct panel_param dsi_panel_param[PANEL_IDX_MAX][PARAM_ID_NUM] = { ACL_OFF_STATE, false}, {"CABC", cabc_map_s, CABC_STATE_NUM, CABC_UI_STATE, CABC_UI_STATE, false}, + {"DC", dc_map_s, DC_STATE_NUM, DC_OFF_STATE, + DC_OFF_STATE, false} } }; @@ -1053,6 +1067,19 @@ static int dsi_panel_set_cabc(struct dsi_panel *panel, return rc; }; +static int dsi_panel_set_dc(struct dsi_panel *panel, + struct msm_param_info *param_info) +{ + int rc = 0; + + pr_info("Set DC to (%d)\n", param_info->value); + rc = dsi_panel_send_param_cmd(panel, param_info); + if (rc < 0) + DSI_ERR("%s: failed to send param cmds. ret=%d\n", __func__, rc); + + return rc; +}; + int dsi_panel_set_param(struct dsi_panel *panel, struct msm_param_info *param_info) { @@ -1074,6 +1101,8 @@ int dsi_panel_set_param(struct dsi_panel *panel, break; case PARAM_ACL_ID : dsi_panel_set_acl(panel, param_info); + case PARAM_DC_ID : + dsi_panel_set_dc(panel, param_info); break; default: DSI_ERR("%s: Invalid set_param type=%d\n", @@ -2214,6 +2243,8 @@ const char *cmd_set_prop_map[DSI_CMD_SET_MAX] = { "qcom,mdss-dsi-cabc-dis-command", "qcom,mdss-dsi-dfps-90-command", "qcom,mdss-dsi-dfps-60-command", + "qcom,mdss-dsi-dc-on-command", + "qcom,mdss-dsi-dc-off-command", }; const char *cmd_set_state_map[DSI_CMD_SET_MAX] = { @@ -2251,6 +2282,8 @@ const char *cmd_set_state_map[DSI_CMD_SET_MAX] = { "qcom,mdss-dsi-cabc-dis-command-state", "qcom,mdss-dsi-dfps-90-command-state", "qcom,mdss-dsi-dfps-60-command-state", + "qcom,mdss-dsi-dc-on-command-state", + "qcom,mdss-dsi-dc-off-command-state", }; int dsi_panel_get_cmd_pkt_count(const char *data, u32 length, u32 *cnt) diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index a28a6ad7b6af..71d28a2c99d5 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -245,6 +245,12 @@ enum cabc_state { CABC_STATE_NUM, }; +enum dc_state { + DC_OFF_STATE = 0, + DC_ON_STATE, + DC_STATE_NUM, +}; + struct panel_param_val_map { int state; enum dsi_cmd_set_type type; diff --git a/msm/msm_drv.h b/msm/msm_drv.h index 60409a3010d1..5288daada136 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -220,6 +220,7 @@ enum msm_mdp_conn_property { CONNECTOR_PROP_HBM, CONNECTOR_PROP_CABC, CONNECTOR_PROP_ACL, + CONNECTOR_PROP_DC, /* total # of properties */ CONNECTOR_PROP_COUNT }; @@ -368,6 +369,7 @@ enum msm_param_id { PARAM_HBM_ID = 0, PARAM_CABC_ID, PARAM_ACL_ID, + PARAM_DC_ID, PARAM_ID_NUM }; diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 8b5897ebf4e0..42dbfcd648f6 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -1589,6 +1589,14 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector, if (rc) goto end; break; + case CONNECTOR_PROP_DC: + param_info.value = val; + param_info.param_idx = PARAM_DC_ID; + param_info.param_conn_idx = CONNECTOR_PROP_DC; + rc = _sde_connector_update_param(c_conn, ¶m_info); + if (rc) + goto end; + break; default: break; } @@ -2689,6 +2697,8 @@ static int sde_connector_install_panel_params(struct sde_connector *c_conn) prop_idx = CONNECTOR_PROP_CABC; else if (!strncmp(param_cmds->param_name, "ACL", 3)) prop_idx = CONNECTOR_PROP_ACL; + else if (!strncmp(param_cmds->param_name, "DC", 2)) + prop_idx = CONNECTOR_PROP_DC; else { SDE_ERROR("Invalid param_name =%s\n", param_cmds->param_name); diff --git a/msm/sde/sde_motUtil.c b/msm/sde/sde_motUtil.c index 84ff35b4caee..dc8c00979a20 100644 --- a/msm/sde/sde_motUtil.c +++ b/msm/sde/sde_motUtil.c @@ -220,6 +220,9 @@ static int _sde_debugfs_motUtil_kms_prop_test(struct sde_kms *kms, case KMSPROPTEST_TYPE_CABC: conn_prop_idx = CONNECTOR_PROP_CABC; break; + case KMSPROPTEST_TYPE_DC: + conn_prop_idx = CONNECTOR_PROP_DC; + break; default: DRM_ERROR(" Invalid KMSPROPTEST_PROP_INDEX = %d\n", input[KMSPROPTEST_PROP_INDEX]); diff --git a/msm/sde/sde_motUtil.h b/msm/sde/sde_motUtil.h index 329977ae6ac1..0248418d1270 100644 --- a/msm/sde/sde_motUtil.h +++ b/msm/sde/sde_motUtil.h @@ -116,6 +116,7 @@ enum sde_motUtil_kmsPropTest_ConnPropType { KMSPROPTEST_TYPE_HBM, KMSPROPTEST_TYPE_ACL, KMSPROPTEST_TYPE_CABC, + KMSPROPTEST_TYPE_DC, }; struct motUtil {