summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaoming Zhou <zhoux@codeaurora.org>2013-05-16 11:28:51 -0400
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:17:36 -0700
commit055e47dc6d278aa7ca208a2ef4c67eecf906de9e (patch)
tree99a0000e27c6670969ca7f5cf70d9bbecfe0f59a
parent6f6acad339e37888439d8273329e829048bd5c7a (diff)
msm: mdss: cleanup dsi interrupt handling logic
Use reference counting for DSI interrupt enable/disable, masking out DSI_MDP_DONE interrupt. Change-Id: I83a8136b8bfeeebd2cbb6a8f711b4dd818f49bd2 Signed-off-by: Xiaoming Zhou <zhoux@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/dsi_host_v2.c67
1 files changed, 11 insertions, 56 deletions
diff --git a/drivers/video/fbdev/msm/dsi_host_v2.c b/drivers/video/fbdev/msm/dsi_host_v2.c
index e1c95f2c256d..21f41063dc01 100644
--- a/drivers/video/fbdev/msm/dsi_host_v2.c
+++ b/drivers/video/fbdev/msm/dsi_host_v2.c
@@ -35,8 +35,7 @@ struct dsi_host_v2_private {
struct completion dma_comp;
int irq_enabled;
spinlock_t irq_lock;
- spinlock_t mdp_lock;
- int mdp_busy;
+
int irq_no;
unsigned char *dsi_base;
struct device dis_dev;
@@ -57,7 +56,6 @@ int msm_dsi_init(void)
init_completion(&dsi_host_private->dma_comp);
spin_lock_init(&dsi_host_private->irq_lock);
- spin_lock_init(&dsi_host_private->mdp_lock);
return 0;
}
@@ -140,14 +138,10 @@ void msm_dsi_enable_irq(void)
unsigned long flags;
spin_lock_irqsave(&dsi_host_private->irq_lock, flags);
- if (dsi_host_private->irq_enabled) {
- pr_debug("%s: IRQ aleady enabled\n", __func__);
- spin_unlock_irqrestore(&dsi_host_private->irq_lock, flags);
- return;
- }
+ dsi_host_private->irq_enabled++;
+ if (dsi_host_private->irq_enabled == 1)
+ enable_irq(dsi_host_private->irq_no);
- enable_irq(dsi_host_private->irq_no);
- dsi_host_private->irq_enabled = 1;
spin_unlock_irqrestore(&dsi_host_private->irq_lock, flags);
}
@@ -156,26 +150,19 @@ void msm_dsi_disable_irq(void)
unsigned long flags;
spin_lock_irqsave(&dsi_host_private->irq_lock, flags);
- if (dsi_host_private->irq_enabled == 0) {
- pr_debug("%s: IRQ already disabled\n", __func__);
- spin_unlock_irqrestore(&dsi_host_private->irq_lock, flags);
- return;
- }
- disable_irq(dsi_host_private->irq_no);
- dsi_host_private->irq_enabled = 0;
+ dsi_host_private->irq_enabled--;
+ if (dsi_host_private->irq_enabled == 0)
+ disable_irq(dsi_host_private->irq_no);
+
spin_unlock_irqrestore(&dsi_host_private->irq_lock, flags);
}
void msm_dsi_disable_irq_nosync(void)
{
spin_lock(&dsi_host_private->irq_lock);
- if (dsi_host_private->irq_enabled == 0) {
- pr_debug("%s: IRQ cannot be disabled\n", __func__);
- spin_unlock(&dsi_host_private->irq_lock);
- return;
- }
- disable_irq_nosync(dsi_host_private->irq_no);
- dsi_host_private->irq_enabled = 0;
+ dsi_host_private->irq_enabled--;
+ if (dsi_host_private->irq_enabled == 0)
+ disable_irq_nosync(dsi_host_private->irq_no);
spin_unlock(&dsi_host_private->irq_lock);
}
@@ -192,13 +179,6 @@ irqreturn_t msm_dsi_isr(int irq, void *ptr)
if (isr & DSI_INTR_CMD_DMA_DONE)
complete(&dsi_host_private->dma_comp);
- if (isr & DSI_INTR_CMD_MDP_DONE) {
- spin_lock(&dsi_host_private->mdp_lock);
- dsi_host_private->mdp_busy = false;
- msm_dsi_disable_irq_nosync();
- spin_unlock(&dsi_host_private->mdp_lock);
- }
-
return IRQ_HANDLED;
}
@@ -448,16 +428,6 @@ void msm_dsi_op_mode_config(int mode, struct mdss_panel_data *pdata)
wmb();
}
-void msm_dsi_cmd_mdp_start(void)
-{
- unsigned long flag;
-
- spin_lock_irqsave(&dsi_host_private->mdp_lock, flag);
- msm_dsi_enable_irq();
- dsi_host_private->mdp_busy = true;
- spin_unlock_irqrestore(&dsi_host_private->mdp_lock, flag);
-}
-
int msm_dsi_cmd_reg_tx(u32 data)
{
unsigned char *ctrl_base = dsi_host_private->dsi_base;
@@ -551,7 +521,6 @@ int msm_dsi_cmds_tx(struct mdss_panel_data *pdata,
struct dsi_cmd_desc *cm;
u32 dsi_ctrl, ctrl;
int i, video_mode;
- unsigned long flag;
unsigned char *ctrl_base = dsi_host_private->dsi_base;
/* turn on cmd mode
@@ -566,13 +535,9 @@ int msm_dsi_cmds_tx(struct mdss_panel_data *pdata,
MIPI_OUTP(ctrl_base + DSI_CTRL, ctrl);
}
- spin_lock_irqsave(&dsi_host_private->mdp_lock, flag);
msm_dsi_enable_irq();
- dsi_host_private->mdp_busy = true;
- spin_unlock_irqrestore(&dsi_host_private->mdp_lock, flag);
cm = cmds;
- dsi_buf_init(tp);
for (i = 0; i < cnt; i++) {
dsi_buf_init(tp);
dsi_cmd_dma_add(tp, cm);
@@ -582,10 +547,7 @@ int msm_dsi_cmds_tx(struct mdss_panel_data *pdata,
cm++;
}
- spin_lock_irqsave(&dsi_host_private->mdp_lock, flag);
- dsi_host_private->mdp_busy = false;
msm_dsi_disable_irq();
- spin_unlock_irqrestore(&dsi_host_private->mdp_lock, flag);
if (video_mode)
MIPI_OUTP(ctrl_base + DSI_CTRL, dsi_ctrl);
@@ -617,7 +579,6 @@ int msm_dsi_cmds_rx(struct mdss_panel_data *pdata,
struct dsi_cmd_desc *cmds, int rlen)
{
int cnt, len, diff, pkt_size;
- unsigned long flag;
char cmd;
if (pdata->panel_info.mipi.no_max_pkt_size)
@@ -645,10 +606,7 @@ int msm_dsi_cmds_rx(struct mdss_panel_data *pdata,
cnt = len + 6; /* 4 bytes header + 2 bytes crc */
}
- spin_lock_irqsave(&dsi_host_private->mdp_lock, flag);
msm_dsi_enable_irq();
- dsi_host_private->mdp_busy = true;
- spin_unlock_irqrestore(&dsi_host_private->mdp_lock, flag);
if (!pdata->panel_info.mipi.no_max_pkt_size) {
/* packet size need to be set at every read */
@@ -681,10 +639,7 @@ int msm_dsi_cmds_rx(struct mdss_panel_data *pdata,
msm_dsi_cmd_dma_rx(rp, cnt);
- spin_lock_irqsave(&dsi_host_private->mdp_lock, flag);
- dsi_host_private->mdp_busy = false;
msm_dsi_disable_irq();
- spin_unlock_irqrestore(&dsi_host_private->mdp_lock, flag);
if (pdata->panel_info.mipi.no_max_pkt_size) {
/*