summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev/msm
diff options
context:
space:
mode:
authorTerence Hampson <thampson@codeaurora.org>2013-09-27 18:21:48 -0400
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:21:59 -0700
commit8dffa398f35f50af7d70daa5bdc11294cf0159a9 (patch)
treef21e92d4b4ab922f3ae57ccc684473e45b5a3223 /drivers/video/fbdev/msm
parent2c9982241ccf0e3cc1f293a8d77797ce42970e60 (diff)
mdss: mdp3: Add underrun counter to debugfs stat call
To allow for easier debug we added logs to output current underrun count. Change-Id: I61f3911b315193ae5550de0332c5abefe22c12ce Signed-off-by: Terence Hampson <thampson@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev/msm')
-rw-r--r--drivers/video/fbdev/msm/mdp3.c27
-rw-r--r--drivers/video/fbdev/msm/mdp3.h2
-rw-r--r--drivers/video/fbdev/msm/mdp3_dma.c3
3 files changed, 31 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdp3.c b/drivers/video/fbdev/msm/mdp3.c
index 0b0aa3d3ffc0..ec3b95411769 100644
--- a/drivers/video/fbdev/msm/mdp3.c
+++ b/drivers/video/fbdev/msm/mdp3.c
@@ -1806,6 +1806,14 @@ static int mdp3_panel_register_done(struct mdss_panel_data *pdata)
return rc;
}
+static int mdp3_debug_dump_stats(void *data, char *buf, int len)
+{
+ int total = 0;
+ total = scnprintf(buf, len, "underrun: %08u\n",
+ mdp3_res->underrun_cnt);
+ return total;
+}
+
static void mdp3_debug_enable_clock(int on)
{
if (on)
@@ -1825,7 +1833,7 @@ static int mdp3_debug_init(struct platform_device *pdev)
mdss_res = mdata;
- mdata->debug_inf.debug_dump_stats = NULL;
+ mdata->debug_inf.debug_dump_stats = mdp3_debug_dump_stats;
mdata->debug_inf.debug_enable_clock = mdp3_debug_enable_clock;
rc = mdss_debugfs_init(mdata);
@@ -1847,6 +1855,13 @@ static void mdp3_debug_deinit(struct platform_device *pdev)
}
}
+static void mdp3_dma_underrun_intr_handler(int type, void *arg)
+{
+ mdp3_res->underrun_cnt++;
+ pr_err("display underrun detected count=%d\n",
+ mdp3_res->underrun_cnt);
+}
+
static int mdp3_probe(struct platform_device *pdev)
{
int rc;
@@ -1857,6 +1872,11 @@ static int mdp3_probe(struct platform_device *pdev)
.fb_stride = mdp3_fb_stride,
};
+ struct mdp3_intr_cb underrun_cb = {
+ .cb = mdp3_dma_underrun_intr_handler,
+ .data = NULL,
+ };
+
if (!pdev->dev.of_node) {
pr_err("MDP driver only supports device tree probe\n");
return -ENOTSUPP;
@@ -1904,6 +1924,11 @@ static int mdp3_probe(struct platform_device *pdev)
if (rc)
pr_err("unable to register mdp instance\n");
+ rc = mdp3_set_intr_callback(MDP3_INTR_LCDC_UNDERFLOW,
+ &underrun_cb);
+ if (rc)
+ pr_err("unable to configure interrupt callback\n");
+
probe_done:
if (IS_ERR_VALUE(rc)) {
mdp3_res_deinit();
diff --git a/drivers/video/fbdev/msm/mdp3.h b/drivers/video/fbdev/msm/mdp3.h
index 764b23b3baee..68ebcd6670c6 100644
--- a/drivers/video/fbdev/msm/mdp3.h
+++ b/drivers/video/fbdev/msm/mdp3.h
@@ -143,6 +143,8 @@ struct mdp3_hw_resource {
u32 irq_ref_count[MDP3_MAX_INTR];
u32 irq_mask;
struct mdp3_intr_cb callbacks[MDP3_MAX_INTR];
+ u32 underrun_cnt;
+
int irq_registered;
u32 splash_mem_addr;
diff --git a/drivers/video/fbdev/msm/mdp3_dma.c b/drivers/video/fbdev/msm/mdp3_dma.c
index 27fba140d3bb..b08dd7903b7c 100644
--- a/drivers/video/fbdev/msm/mdp3_dma.c
+++ b/drivers/video/fbdev/msm/mdp3_dma.c
@@ -159,6 +159,7 @@ static int mdp3_dma_callback_setup(struct mdp3_dma *dma)
.data = dma,
};
+
struct mdp3_intr_cb hist_cb = {
.cb = mdp3_hist_done_intr_handler,
.data = dma,
@@ -298,6 +299,7 @@ static int mdp3_dmap_config(struct mdp3_dma *dma,
dma->output_config = *output_config;
mdp3_dma_sync_config(dma, source_config);
+ mdp3_irq_enable(MDP3_INTR_LCDC_UNDERFLOW);
mdp3_dma_callback_setup(dma);
return 0;
}
@@ -824,6 +826,7 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf)
mdp3_dma_callback_disable(dma, MDP3_DMA_CALLBACK_TYPE_VSYNC |
MDP3_DMA_CALLBACK_TYPE_DMA_DONE);
+ mdp3_irq_disable(MDP3_INTR_LCDC_UNDERFLOW);
init_completion(&dma->dma_comp);
dma->vsync_client.handler = NULL;