summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorRay Zhang <rayz@codeaurora.org>2014-12-10 15:30:48 +0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:11:41 -0700
commit197399a2dace7275d94cfb7b5c38bc12839e451f (patch)
tree23daa558bc2b1d675efd979b3cfffdf9e2f44354 /drivers/video/fbdev
parent4aef0900ff34106e850c8e83f0d40a424da8e407 (diff)
msm: mdss: Disable idle pc during unblank
Disable idle pc during unblank, because LPM could introduce big delay from waiting for DSI DMA. Change-Id: Id11bf3f3015fa1ea4b22d1e1c2abd380cd8b65a2 Signed-off-by: Ray Zhang <rayz@codeaurora.org> Signed-off-by: Padmanabhan Komanduru <pkomandu@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c
index b6d3eb5e2873..1904bf395ed5 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.c
+++ b/drivers/video/fbdev/msm/mdss_dsi.c
@@ -25,6 +25,7 @@
#include <linux/clk.h>
#include <linux/uaccess.h>
#include <linux/msm-bus.h>
+#include <linux/pm_qos.h>
#include "mdss.h"
#include "mdss_panel.h"
@@ -37,6 +38,30 @@
/* Master structure to hold all the information about the DSI/panel */
static struct mdss_dsi_data *mdss_dsi_res;
+#define DSI_DISABLE_PC_LATENCY 100
+#define DSI_ENABLE_PC_LATENCY PM_QOS_DEFAULT_VALUE
+
+static struct pm_qos_request mdss_dsi_pm_qos_request;
+
+static void mdss_dsi_pm_qos_add_request(void)
+{
+ pr_debug("%s: add request", __func__);
+ pm_qos_add_request(&mdss_dsi_pm_qos_request, PM_QOS_CPU_DMA_LATENCY,
+ PM_QOS_DEFAULT_VALUE);
+}
+
+static void mdss_dsi_pm_qos_remove_request(void)
+{
+ pr_debug("%s: remove request", __func__);
+ pm_qos_remove_request(&mdss_dsi_pm_qos_request);
+}
+
+static void mdss_dsi_pm_qos_update_request(int val)
+{
+ pr_debug("%s: update request %d", __func__, val);
+ pm_qos_update_request(&mdss_dsi_pm_qos_request, val);
+}
+
static int mdss_dsi_pinctrl_set_state(struct mdss_dsi_ctrl_pdata *ctrl_pdata,
bool active);
@@ -1407,6 +1432,8 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata)
__func__, ctrl_pdata, ctrl_pdata->ndx,
pdata->panel_info.blank_state, ctrl_pdata->ctrl_state);
+ mdss_dsi_pm_qos_update_request(DSI_DISABLE_PC_LATENCY);
+
if (mdss_dsi_is_ctrl_clk_master(ctrl_pdata))
sctrl = mdss_dsi_get_ctrl_clk_slave();
@@ -1448,6 +1475,9 @@ error:
if (sctrl)
mdss_dsi_clk_ctrl(sctrl, sctrl->dsi_clk_handle,
MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
+
+ mdss_dsi_pm_qos_update_request(DSI_ENABLE_PC_LATENCY);
+
pr_debug("%s-:\n", __func__);
return ret;
@@ -2686,6 +2716,8 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
else
ctrl_pdata->shared_data->dsi1_active = true;
+ mdss_dsi_pm_qos_add_request();
+
return 0;
error_shadow_clk_deinit:
@@ -3145,6 +3177,8 @@ static int mdss_dsi_ctrl_remove(struct platform_device *pdev)
return -ENODEV;
}
+ mdss_dsi_pm_qos_remove_request();
+
if (msm_dss_config_vreg(&pdev->dev,
ctrl_pdata->panel_power_data.vreg_config,
ctrl_pdata->panel_power_data.num_vreg, 1) < 0)