static int mdp3_dmap_histo_stop(struct mdp3_dma *dma) { unsigned long flag; int cb_type = MDP3_DMA_CALLBACK_TYPE_HIST_RESET_DONE | MDP3_DMA_CALLBACK_TYPE_HIST_DONE; spin_lock_irqsave(&dma->histo_lock, flag); MDP3_REG_WRITE(MDP3_REG_DMA_P_HIST_CANCEL_REQ, 1); MDP3_REG_WRITE(MDP3_REG_DMA_P_HIST_INTR_ENABLE, 0); wmb(); dma->histo_state = MDP3_DMA_HISTO_STATE_IDLE; complete(&dma->histo_comp); spin_unlock_irqrestore(&dma->histo_lock, flag); mdp3_dma_callback_disable(dma, cb_type); return 0; }
static int mdp3_dmap_histo_reset(struct mdp3_dma *dma) { unsigned long flag; int ret; u32 cgc; if (dma->histo_state == MDP3_DMA_HISTO_STATE_START) return -EINVAL; spin_lock_irqsave(&dma->histo_lock, flag); init_completion(&dma->histo_comp); cgc = MDP3_REG_READ(MDP3_REG_CGC_EN); cgc &= ~BIT(10); MDP3_REG_WRITE(MDP3_REG_CGC_EN, cgc); MDP3_REG_WRITE(MDP3_REG_DMA_P_HIST_INTR_ENABLE, BIT(0)|BIT(1)); MDP3_REG_WRITE(MDP3_REG_DMA_P_HIST_RESET_SEQ_START, 1); wmb(); dma->histo_state = MDP3_DMA_HISTO_STATE_RESET; spin_unlock_irqrestore(&dma->histo_lock, flag); mdp3_dma_callback_enable(dma, MDP3_DMA_CALLBACK_TYPE_HIST_RESET_DONE); ret = wait_for_completion_killable_timeout(&dma->histo_comp, msecs_to_jiffies(DMA_HISTO_RESET_TIMEOUT_MS)); if (ret == 0) { pr_err("mdp3_dmap_histo_reset time out\n"); ret = -ETIMEDOUT; } else if (ret < 0) { pr_err("mdp3_dmap_histo_reset interrupted\n"); } else { ret = 0; } mdp3_dma_callback_disable(dma, MDP3_DMA_CALLBACK_TYPE_HIST_RESET_DONE); cgc |= BIT(10); MDP3_REG_WRITE(MDP3_REG_CGC_EN, cgc); return ret; }