void mdp3_dma_callback_disable(struct mdp3_dma *dma, int type) { int irq_bit; pr_debug("mdp3_dma_callback_disable type=%d\n", type); if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_VIDEO || dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_LCDC) { if (type & MDP3_DMA_CALLBACK_TYPE_VSYNC) mdp3_irq_disable(MDP3_INTR_LCDC_START_OF_FRAME); } else if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD) { if (type & MDP3_DMA_CALLBACK_TYPE_VSYNC) { irq_bit = MDP3_INTR_SYNC_PRIMARY_LINE; irq_bit += dma->dma_sel; mdp3_irq_disable(irq_bit); } if (type & MDP3_DMA_CALLBACK_TYPE_DMA_DONE) { irq_bit = MDP3_INTR_DMA_P_DONE; if (dma->dma_sel == MDP3_DMA_S) irq_bit = MDP3_INTR_DMA_S_DONE; mdp3_irq_disable(irq_bit); } } }
static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf) { int ret = 0; u32 status, display_status_bit; if (dma->dma_sel == MDP3_DMA_P) display_status_bit = BIT(6); else if (dma->dma_sel == MDP3_DMA_S) display_status_bit = BIT(7); else return -EINVAL; if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_VIDEO) display_status_bit |= BIT(11); intf->stop(intf); ret = readl_poll_timeout((mdp3_res->mdp_base + MDP3_REG_DISPLAY_STATUS), status, ((status & display_status_bit) == 0), DMA_STOP_POLL_SLEEP_US, DMA_STOP_POLL_TIMEOUT_US); 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; return ret; }