diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | msm/Kbuild | 2 | ||||
-rw-r--r-- | msm/dsi/dsi_display.c | 15 | ||||
-rw-r--r-- | msm/dsi/dsi_display.h | 12 | ||||
-rw-r--r-- | msm/dsi/dsi_drm.c | 12 | ||||
-rw-r--r-- | msm/dsi/dsi_panel.c | 43 | ||||
-rw-r--r-- | msm/dsi/dsi_panel.h | 1 | ||||
-rw-r--r-- | msm/sde/sde_connector.c | 35 | ||||
-rw-r--r-- | msm/sde/sde_connector.h | 12 | ||||
-rw-r--r-- | msm/sde/sde_kms.c | 1 |
10 files changed, 112 insertions, 24 deletions
@@ -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) @@ -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, |