diff options
| author | Xiaoming Zhou <zhoux@codeaurora.org> | 2013-05-16 11:28:51 -0400 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:17:36 -0700 |
| commit | 055e47dc6d278aa7ca208a2ef4c67eecf906de9e (patch) | |
| tree | 99a0000e27c6670969ca7f5cf70d9bbecfe0f59a | |
| parent | 6f6acad339e37888439d8273329e829048bd5c7a (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.c | 67 |
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) { /* |
