From c99f3fd6ae04ee46e2dfb0a617b9349c9776741e Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Fri, 6 Nov 2020 14:09:10 -0800 Subject: [PATCH] disp: msm: dsi: enable ESD trigger through debugfs in trsuted-vm Add support to trigger ESD through debugfs by directly modifying the reset GPIOs TLMM register in trusted-vm as GPIO driver support is not enabled. Change-Id: I859affe69c13dbe115a48b0a63a600a57027db58 Signed-off-by: Veera Sundaram Sankaran --- msm/dsi/dsi_display.c | 3 ++- msm/dsi/dsi_panel.c | 53 +++++++++++++++++++++++++++++++------------ msm/dsi/dsi_panel.h | 2 +- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index b32a066b0b..d7e734526e 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -1529,7 +1529,8 @@ static ssize_t debugfs_esd_trigger_check(struct file *file, if (display->esd_trigger) { DSI_INFO("ESD attack triggered by user\n"); - rc = dsi_panel_trigger_esd_attack(display->panel); + rc = dsi_panel_trigger_esd_attack(display->panel, + display->trusted_vm_env); if (rc) { DSI_ERR("Failed to trigger ESD attack\n"); goto error; diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 04026770c4..f21eae125e 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -191,29 +191,52 @@ static int dsi_panel_gpio_release(struct dsi_panel *panel) return rc; } -int dsi_panel_trigger_esd_attack(struct dsi_panel *panel) +int dsi_panel_trigger_esd_attack(struct dsi_panel *panel, bool trusted_vm_env) { - struct dsi_panel_reset_config *r_config; - if (!panel) { DSI_ERR("Invalid panel param\n"); return -EINVAL; } - r_config = &panel->reset_config; - if (!r_config) { - DSI_ERR("Invalid panel reset configuration\n"); - return -EINVAL; + /* toggle reset-gpio by writing directly to register in trusted-vm */ + if (trusted_vm_env) { + struct dsi_tlmm_gpio *gpio = NULL; + void __iomem *io; + u32 offset = 0x4; + int i; + + for (i = 0; i < panel->tlmm_gpio_count; i++) + if (!strcmp(panel->tlmm_gpio[i].name, "reset-gpio")) + gpio = &panel->tlmm_gpio[i]; + + if (!gpio) { + DSI_ERR("reset gpio not found\n"); + return -EINVAL; + } + + io = ioremap(gpio->addr, gpio->size); + writel_relaxed(0, io + offset); + iounmap(io); + + } else { + struct dsi_panel_reset_config *r_config = &panel->reset_config; + + if (!r_config) { + DSI_ERR("Invalid panel reset configuration\n"); + return -EINVAL; + } + + if (!gpio_is_valid(r_config->reset_gpio)) { + DSI_ERR("failed to pull down gpio\n"); + return -EINVAL; + } + gpio_set_value(r_config->reset_gpio, 0); } - 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; - } - DSI_ERR("failed to pull down gpio\n"); - return -EINVAL; + SDE_EVT32(SDE_EVTLOG_FUNC_CASE1); + DSI_INFO("GPIO pulled low to simulate ESD\n"); + + return 0; } static int dsi_panel_reset(struct dsi_panel *panel) diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 8bda41ad8b..994b23fc8f 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -298,7 +298,7 @@ struct dsi_panel *dsi_panel_get(struct device *parent, int topology_override, bool trusted_vm_env); -int dsi_panel_trigger_esd_attack(struct dsi_panel *panel); +int dsi_panel_trigger_esd_attack(struct dsi_panel *panel, bool trusted_vm_env); void dsi_panel_put(struct dsi_panel *panel);