summaryrefslogtreecommitdiff
path: root/msm/dsi/dsi_panel.c
diff options
context:
space:
mode:
Diffstat (limited to 'msm/dsi/dsi_panel.c')
-rw-r--r--msm/dsi/dsi_panel.c95
1 files changed, 87 insertions, 8 deletions
diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c
index 603f4bf9..ef6605b0 100644
--- a/msm/dsi/dsi_panel.c
+++ b/msm/dsi/dsi_panel.c
@@ -13,6 +13,7 @@
#include "dsi_panel.h"
#include "dsi_ctrl_hw.h"
#include "dsi_parser.h"
+#include "sde_dbg.h"
/**
* topology is currently defined by a set of following 3 values:
@@ -352,6 +353,7 @@ int dsi_panel_trigger_esd_attack(struct dsi_panel *panel)
if (gpio_is_valid(r_config->reset_gpio)) {
gpio_set_value(r_config->reset_gpio, 0);
+ SDE_EVT32(SDE_EVTLOG_FUNC_CASE1);
DSI_INFO("GPIO pulled low to simulate ESD\n");
return 0;
}
@@ -491,7 +493,8 @@ static int dsi_panel_power_off(struct dsi_panel *panel)
if (gpio_is_valid(panel->reset_config.disp_en_gpio))
gpio_set_value(panel->reset_config.disp_en_gpio, 0);
- if (gpio_is_valid(panel->reset_config.reset_gpio))
+ if (gpio_is_valid(panel->reset_config.reset_gpio) &&
+ !panel->reset_gpio_always_on)
gpio_set_value(panel->reset_config.reset_gpio, 0);
if (gpio_is_valid(panel->reset_config.lcd_mode_sel_gpio))
@@ -945,6 +948,9 @@ static int dsi_panel_parse_misc_host_config(struct dsi_host_common_cfg *host,
DSI_DEBUG("[%s] t_clk_pre = %d\n", name, val);
}
+ host->t_clk_pre_extend = utils->read_bool(utils->data,
+ "qcom,mdss-dsi-t-clk-pre-extend");
+
host->ignore_rx_eot = utils->read_bool(utils->data,
"qcom,mdss-dsi-rx-eot-ignore");
@@ -1429,8 +1435,15 @@ static int dsi_panel_parse_qsync_caps(struct dsi_panel *panel,
struct device_node *of_node)
{
int rc = 0;
- u32 val = 0;
+ u32 val = 0, i;
+ struct dsi_qsync_capabilities *qsync_caps = &panel->qsync_caps;
+ struct dsi_parser_utils *utils = &panel->utils;
+ const char *name = panel->name;
+ /**
+ * "mdss-dsi-qsync-min-refresh-rate" is defined in cmd mode and
+ * video mode when there is only one qsync min fps present.
+ */
rc = of_property_read_u32(of_node,
"qcom,mdss-dsi-qsync-min-refresh-rate",
&val);
@@ -1438,8 +1451,75 @@ static int dsi_panel_parse_qsync_caps(struct dsi_panel *panel,
DSI_DEBUG("[%s] qsync min fps not defined rc:%d\n",
panel->name, rc);
- panel->qsync_min_fps = val;
+ qsync_caps->qsync_min_fps = val;
+
+ /**
+ * "dsi-supported-qsync-min-fps-list" may be defined in video
+ * mode, only in dfps case when "qcom,dsi-supported-dfps-list"
+ * is defined.
+ */
+ qsync_caps->qsync_min_fps_list_len = utils->count_u32_elems(utils->data,
+ "qcom,dsi-supported-qsync-min-fps-list");
+ if (qsync_caps->qsync_min_fps_list_len < 1)
+ goto qsync_support;
+
+ /**
+ * qcom,dsi-supported-qsync-min-fps-list cannot be defined
+ * along with qcom,mdss-dsi-qsync-min-refresh-rate.
+ */
+ if (qsync_caps->qsync_min_fps_list_len >= 1 &&
+ qsync_caps->qsync_min_fps) {
+ DSI_ERR("[%s] Both qsync nodes are defined\n",
+ name);
+ rc = -EINVAL;
+ goto error;
+ }
+ if (panel->dfps_caps.dfps_list_len !=
+ qsync_caps->qsync_min_fps_list_len) {
+ DSI_ERR("[%s] Qsync min fps list mismatch with dfps\n", name);
+ rc = -EINVAL;
+ goto error;
+ }
+
+ qsync_caps->qsync_min_fps_list =
+ kcalloc(qsync_caps->qsync_min_fps_list_len, sizeof(u32),
+ GFP_KERNEL);
+ if (!qsync_caps->qsync_min_fps_list) {
+ rc = -ENOMEM;
+ goto error;
+ }
+
+ rc = utils->read_u32_array(utils->data,
+ "qcom,dsi-supported-qsync-min-fps-list",
+ qsync_caps->qsync_min_fps_list,
+ qsync_caps->qsync_min_fps_list_len);
+ if (rc) {
+ DSI_ERR("[%s] Qsync min fps list parse failed\n", name);
+ rc = -EINVAL;
+ goto error;
+ }
+
+ qsync_caps->qsync_min_fps = qsync_caps->qsync_min_fps_list[0];
+
+ for (i = 1; i < qsync_caps->qsync_min_fps_list_len; i++) {
+ if (qsync_caps->qsync_min_fps_list[i] <
+ qsync_caps->qsync_min_fps)
+ qsync_caps->qsync_min_fps =
+ qsync_caps->qsync_min_fps_list[i];
+ }
+
+qsync_support:
+ /* allow qsync support only if DFPS is with VFP approach */
+ if ((panel->dfps_caps.dfps_support) &&
+ !(panel->dfps_caps.type == DSI_DFPS_IMMEDIATE_VFP))
+ panel->qsync_caps.qsync_min_fps = 0;
+
+error:
+ if (rc < 0) {
+ qsync_caps->qsync_min_fps = 0;
+ qsync_caps->qsync_min_fps_list_len = 0;
+ }
return rc;
}
@@ -2217,6 +2297,9 @@ static int dsi_panel_parse_misc_features(struct dsi_panel *panel)
panel->lp11_init = utils->read_bool(utils->data,
"qcom,mdss-dsi-lp11-init");
+ panel->reset_gpio_always_on = utils->read_bool(utils->data,
+ "qcom,platform-reset-gpio-always-on");
+
if (!utils->read_u32(utils->data,
"qcom,mdss-dsi-init-delay-us",
&val)) {
@@ -3426,11 +3509,6 @@ struct dsi_panel *dsi_panel_get(struct device *parent,
if (rc)
DSI_DEBUG("failed to parse qsync features, rc=%d\n", rc);
- /* allow qsync support only if DFPS is with VFP approach */
- if ((panel->dfps_caps.dfps_support) &&
- !(panel->dfps_caps.type == DSI_DFPS_IMMEDIATE_VFP))
- panel->qsync_min_fps = 0;
-
rc = dsi_panel_parse_dyn_clk_caps(panel);
if (rc)
DSI_ERR("failed to parse dynamic clk config, rc=%d\n", rc);
@@ -4922,6 +5000,7 @@ int dsi_panel_send_roi_dcs(struct dsi_panel *panel, int ctrl_idx,
}
DSI_DEBUG("[%s] send roi x %d y %d w %d h %d\n", panel->name,
roi->x, roi->y, roi->w, roi->h);
+ SDE_EVT32(roi->x, roi->y, roi->w, roi->h);
mutex_lock(&panel->panel_lock);