summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--msm/Kbuild2
-rw-r--r--msm/dsi/dsi_display.c15
-rw-r--r--msm/dsi/dsi_display.h12
-rw-r--r--msm/dsi/dsi_drm.c12
-rw-r--r--msm/dsi/dsi_panel.c43
-rw-r--r--msm/dsi/dsi_panel.h1
-rw-r--r--msm/sde/sde_connector.c35
-rw-r--r--msm/sde/sde_connector.h12
-rw-r--r--msm/sde/sde_kms.c1
10 files changed, 112 insertions, 24 deletions
diff --git a/Makefile b/Makefile
index 47413131..9822286a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-only
-KBUILD_OPTIONS+= DISPLAY_ROOT=$(KERNEL_SRC)/$(M)
+KBUILD_OPTIONS+= DISPLAY_ROOT=$(KERNEL_SRC)/$(M) \
+ KBUILD_EXTRA_SYMBOLS+=$(OUT_DIR)/../google-modules/nanohub/Module.symvers
all:
$(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS)
diff --git a/msm/Kbuild b/msm/Kbuild
index 3165ef70..a3384016 100644
--- a/msm/Kbuild
+++ b/msm/Kbuild
@@ -54,6 +54,7 @@ LINUX_INC += -I$(DISPLAY_ROOT) \
-I$(DISPLAY_ROOT)/include \
-I$(KERNEL_ROOT)/drivers/clk/qcom \
-I$(KERNEL_SRC)/drivers/clk/qcom \
+ -I$(KERNEL_SRC)/../google-modules/nanohub \
-I$(DISPLAY_ROOT)/include/linux \
-I$(DISPLAY_ROOT)/rotator \
-I$(DISPLAY_ROOT)/msm \
@@ -82,6 +83,7 @@ endif
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/display-drivers/hdcp/Module.symvers
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/display-drivers/msm/Module.symvers
+KBUILD_EXTRA_SYMBOLS +=$(OUT)/../google-modules/nanohub/Module.symvers
ifeq ($(call cc-option-yn, -Wheader-guard),y)
EXTRA_CFLAGS += -Wheader-guard
diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c
index fabc981a..476b54e8 100644
--- a/msm/dsi/dsi_display.c
+++ b/msm/dsi/dsi_display.c
@@ -1393,6 +1393,21 @@ int dsi_display_set_hbm(struct drm_connector *connector, bool cmd, void *disp)
return rc;
}
+int dsi_display_get_vendor_string(struct drm_connector *connector, void *display, char *buf,
+ u32 buf_len)
+{
+ struct dsi_display *disp = (struct dsi_display *)display;
+ int len = 0;
+
+ if (!disp || !disp->panel) {
+ DSI_ERR("Invalid param(s) dsi_display or dsi_panel");
+ return -EINVAL;
+ }
+
+ len = scnprintf(buf, buf_len, "%s", disp->panel->name);
+ return len;
+}
+
#if IS_ENABLED(CONFIG_DEBUG_FS)
static bool dsi_display_is_te_based_esd(struct dsi_display *display)
{
diff --git a/msm/dsi/dsi_display.h b/msm/dsi/dsi_display.h
index 2458fb13..144af668 100644
--- a/msm/dsi/dsi_display.h
+++ b/msm/dsi/dsi_display.h
@@ -879,4 +879,16 @@ int dsi_display_ctrl_vreg_off(struct dsi_display *display);
*/
int dsi_display_set_hbm(struct drm_connector *connector, bool cmd, void *disp);
+/**
+ * dsi_display_get_vendor_string() - Get panel's vendor string
+ * @connector: Pointer to drm connector structure
+ * @display: Pointer to private display structure
+ * @buf: String buffer
+ * @buf_len: String buffer length
+ *
+ * Return: Size of string written to buffer
+ */
+int dsi_display_get_vendor_string(struct drm_connector *connector, void *display, char *buf,
+ u32 buf_len);
+
#endif /* _DSI_DISPLAY_H_ */
diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c
index 33a2f508..7ee15865 100644
--- a/msm/dsi/dsi_drm.c
+++ b/msm/dsi/dsi_drm.c
@@ -9,6 +9,7 @@
#include <drm/drm_atomic.h>
#include "msm_kms.h"
+#include "nanohub_exports.h"
#include "sde_connector.h"
#include "dsi_drm.h"
#include "sde_trace.h"
@@ -180,6 +181,7 @@ static int dsi_bridge_attach(struct drm_bridge *bridge,
static void dsi_bridge_pre_enable(struct drm_bridge *bridge)
{
int rc = 0;
+ bool skip_panel_on_seq_check_enabled = false;
struct dsi_bridge *c_bridge = to_dsi_bridge(bridge);
if (!bridge) {
@@ -192,6 +194,9 @@ static void dsi_bridge_pre_enable(struct drm_bridge *bridge)
return;
}
+ if (!atomic_read(&c_bridge->display->panel->esd_recovery_pending))
+ skip_panel_on_seq_check_enabled = true;
+
atomic_set(&c_bridge->display->panel->esd_recovery_pending, 0);
/* By this point mode should have been validated through mode_fixup */
@@ -210,6 +215,13 @@ static void dsi_bridge_pre_enable(struct drm_bridge *bridge)
return;
}
+ c_bridge->display->panel->skip_panel_on_from_off = false;
+ if (skip_panel_on_seq_check_enabled)
+ if (nanohub_query_display_state_no_check() == MCU_DISPLAY_ON) {
+ DSI_INFO("skip panel on\n");
+ c_bridge->display->panel->skip_panel_on_from_off = true;
+ }
+
SDE_ATRACE_BEGIN("dsi_display_prepare");
rc = dsi_display_prepare(c_bridge->display);
if (rc) {
diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c
index 05b6190b..3202b126 100644
--- a/msm/dsi/dsi_panel.c
+++ b/msm/dsi/dsi_panel.c
@@ -277,6 +277,9 @@ static int dsi_panel_reset(struct dsi_panel *panel)
}
}
+ if (panel->skip_panel_on_from_off)
+ goto exit;
+
if (r_config->count) {
rc = gpio_direction_output(r_config->reset_gpio,
r_config->sequence[0].level);
@@ -4907,26 +4910,28 @@ int dsi_panel_enable(struct dsi_panel *panel)
mutex_lock(&panel->panel_lock);
- rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_ON);
- if (rc) {
- DSI_ERR("[%s] failed to send DSI_CMD_SET_ON cmds, rc=%d\n",
- panel->name, rc);
- goto error;
- }
-
- if (panel->panel_mode == DSI_OP_CMD_MODE) {
- rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_CMD_ON);
+ if (!panel->skip_panel_on_from_off) {
+ rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_ON);
if (rc) {
- DSI_ERR("[%s] failed to send DSI_CMD_SET_CMD_ON cmds, rc=%d\n",
- panel->name, rc);
+ DSI_ERR("[%s] failed to send DSI_CMD_SET_ON cmds, rc=%d\n", panel->name,
+ rc);
goto error;
}
- } else if (panel->panel_mode == DSI_OP_VIDEO_MODE) {
- rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_VID_ON);
- if (rc) {
- DSI_ERR("[%s] failed to send DSI_CMD_SET_VID_ON cmds, rc=%d\n",
- panel->name, rc);
- goto error;
+
+ if (panel->panel_mode == DSI_OP_CMD_MODE) {
+ rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_CMD_ON);
+ if (rc) {
+ DSI_ERR("[%s] failed to send DSI_CMD_SET_CMD_ON cmds, rc=%d\n",
+ panel->name, rc);
+ goto error;
+ }
+ } else if (panel->panel_mode == DSI_OP_VIDEO_MODE) {
+ rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_VID_ON);
+ if (rc) {
+ DSI_ERR("[%s] failed to send DSI_CMD_SET_VID_ON cmds, rc=%d\n",
+ panel->name, rc);
+ goto error;
+ }
}
}
panel->panel_initialized = true;
@@ -4945,6 +4950,9 @@ int dsi_panel_post_enable(struct dsi_panel *panel)
return -EINVAL;
}
+ if (panel->skip_panel_on_from_off)
+ return 0;
+
mutex_lock(&panel->panel_lock);
rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_POST_ON);
@@ -4953,6 +4961,7 @@ int dsi_panel_post_enable(struct dsi_panel *panel)
panel->name, rc);
goto error;
}
+
error:
mutex_unlock(&panel->panel_lock);
return rc;
diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h
index 5e97d8aa..423e167c 100644
--- a/msm/dsi/dsi_panel.h
+++ b/msm/dsi/dsi_panel.h
@@ -263,6 +263,7 @@ struct dsi_panel {
bool is_twm_en;
bool skip_panel_off;
+ bool skip_panel_on_from_off;
bool panel_initialized;
bool te_using_watchdog_timer;
struct dsi_qsync_capabilities qsync_caps;
diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c
index ba3b200d..6046f98b 100644
--- a/msm/sde/sde_connector.c
+++ b/msm/sde/sde_connector.c
@@ -1229,7 +1229,9 @@ void sde_connector_helper_bridge_enable(struct drm_connector *connector)
if (!sde_in_trusted_vm(sde_kms) && c_conn->bl_device && !display->poms_pending) {
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);
+ // skip restoring panel brightness when panel on sequence is skipped.
+ if (!(display->panel->skip_panel_on_from_off))
+ backlight_update_status(c_conn->bl_device);
}
}
@@ -3386,14 +3388,35 @@ static ssize_t twm_enable_show(struct device *device,
return scnprintf(buf, PAGE_SIZE, "%d\n", sde_conn->twm_en);
}
+static ssize_t vendor_string_show(struct device *device, struct device_attribute *attr, char *buf)
+{
+ struct drm_connector *conn;
+ struct sde_connector *sde_conn;
+ int len = 0;
+
+ conn = dev_get_drvdata(device);
+ sde_conn = to_sde_connector(conn);
+ if (!sde_conn->ops.get_vendor_string) {
+ SDE_ERROR("no cmd get_vendor_string for connector name %s\n", sde_conn->name);
+ return -EINVAL;
+ }
+
+ len = sde_conn->ops.get_vendor_string(conn, sde_conn->display, buf, PAGE_SIZE);
+ if (len <= 0) {
+ SDE_ERROR("cannot get vendor string %s\n", sde_conn->name);
+ return -EINVAL;
+ }
+
+ return len;
+}
+
static DEVICE_ATTR_RO(panel_power_state);
static DEVICE_ATTR_RW(twm_enable);
+static DEVICE_ATTR_RO(vendor_string);
-static struct attribute *sde_connector_dev_attrs[] = {
- &dev_attr_panel_power_state.attr,
- &dev_attr_twm_enable.attr,
- NULL
-};
+static struct attribute *sde_connector_dev_attrs[] = { &dev_attr_panel_power_state.attr,
+ &dev_attr_twm_enable.attr,
+ &dev_attr_vendor_string.attr, NULL };
static const struct attribute_group sde_connector_attr_group = {
.attrs = sde_connector_dev_attrs,
diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h
index c155bc68..cd0b2fa1 100644
--- a/msm/sde/sde_connector.h
+++ b/msm/sde/sde_connector.h
@@ -446,6 +446,18 @@ struct sde_connector_ops {
* Return: Zero on Success
*/
int (*set_hbm)(struct drm_connector *connector, bool cmd, void *disp);
+
+ /**
+ * get_vendor_string() - Get panel's vendor string
+ * @connector: Pointer to drm connector structure
+ * @display: Pointer to private display structure
+ * @buf: String buffer
+ * @buf_len: String buffer length
+ *
+ * Return: String length written to buffer
+ */
+ int (*get_vendor_string)(struct drm_connector *connector, void *display, char *buf,
+ u32 buf_len);
};
/**
diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c
index 2d834db7..5cfe7e24 100644
--- a/msm/sde/sde_kms.c
+++ b/msm/sde/sde_kms.c
@@ -1830,6 +1830,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
.get_num_lm_from_mode = dsi_conn_get_lm_from_mode,
.update_transfer_time = dsi_display_update_transfer_time,
.set_hbm = dsi_display_set_hbm,
+ .get_vendor_string = dsi_display_get_vendor_string,
};
static const struct sde_connector_ops wb_ops = {
.post_init = sde_wb_connector_post_init,