static int mdp3_ctrl_res_req_clk(struct msm_fb_data_type *mfd, int status) { int rc = 0; if (status) { mdp3_clk_set_rate(MDP3_CLK_CORE, MDP_CORE_CLK_RATE, MDP3_CLIENT_DMA_P); mdp3_clk_set_rate(MDP3_CLK_VSYNC, MDP_VSYNC_CLK_RATE, MDP3_CLIENT_DMA_P); rc = mdp3_clk_prepare(); if (rc) { pr_err("mdp3 clk prepare fail\n"); return rc; } rc = mdp3_clk_enable(1, 1); if (rc) { pr_err("mdp3 clk enable fail\n"); mdp3_clk_unprepare(); return rc; } } else { rc = mdp3_clk_enable(0, 1); if (rc) pr_err("mdp3 clk disable fail\n"); else mdp3_clk_unprepare(); } return rc; }
void mdp3_dump_dma(void *data) { struct mdp3_dma *dma = (struct mdp3_dma *)data; u32 isr, mask; mdp3_clk_prepare(); mdp3_clk_enable(1, 0); isr = MDP3_REG_READ(MDP3_REG_INTR_STATUS); mask = MDP3_REG_READ(MDP3_REG_INTR_ENABLE); MDSS_TIMEOUT_LOG("-------- MDP3 INTERRUPT DATA ---------\n"); MDSS_TIMEOUT_LOG("MDP3_REG_INTR_STATUS: 0x%08X\n", isr); MDSS_TIMEOUT_LOG("MDP3_REG_INTR_ENABLE: 0x%08X\n", mask); MDSS_TIMEOUT_LOG("global irqs disabled: %d\n", irqs_disabled()); MDSS_TIMEOUT_LOG("------ MDP3 INTERRUPT DATA DONE ------\n"); if (dma) { MDSS_TIMEOUT_LOG("-------- MDP3 DMA DATA ---------\n"); MDSS_TIMEOUT_LOG("vsync_cnt=%u\n", dma->vsync_cnt); MDSS_TIMEOUT_LOG("------ MDP3 DMA DATA DONE ------\n"); } mdp3_clk_enable(0, 0); mdp3_clk_unprepare(); }
static int mdp3_ctrl_off(struct msm_fb_data_type *mfd) { int rc = 0; struct mdp3_session_data *mdp3_session; struct mdss_panel_data *panel; pr_debug("mdp3_ctrl_off\n"); mdp3_session = (struct mdp3_session_data *)mfd->mdp.private1; if (!mdp3_session || !mdp3_session->panel || !mdp3_session->dma || !mdp3_session->intf) { pr_err("mdp3_ctrl_on no device"); return -ENODEV; } panel = mdp3_session->panel; mutex_lock(&mdp3_session->lock); mutex_lock(&mdp3_session->offlock); if (!mdp3_session->status) { pr_debug("fb%d is off already", mfd->index); goto off_error; } mdp3_ctrl_clk_enable(mfd, 1); mdp3_histogram_stop(mdp3_session, MDP_BLOCK_DMA_P); rc = mdp3_session->dma->stop(mdp3_session->dma, mdp3_session->intf); if (rc) pr_debug("fail to stop the MDP3 dma\n"); if (panel->event_handler) rc = panel->event_handler(panel, MDSS_EVENT_PANEL_OFF, NULL); if (rc) pr_err("fail to turn off the panel\n"); mdp3_irq_deregister(); pr_debug("mdp3_ctrl_off stop clock\n"); if (mdp3_session->clk_on) { rc = mdp3_clk_enable(0, 1); if (rc) pr_err("mdp clock resource release failed\n"); pr_debug("mdp3_ctrl_off stop dsi controller\n"); if (panel->event_handler) rc = panel->event_handler(panel, MDSS_EVENT_BLANK, NULL); if (rc) pr_err("fail to turn off the panel\n"); } mdp3_clk_unprepare(); pr_debug("mdp3_ctrl_off release bus\n"); rc = mdp3_ctrl_res_req_bus(mfd, 0); if (rc) pr_err("mdp bus resource release failed\n"); rc = mdp3_iommu_disable(MDP3_CLIENT_DMA_P); if (rc) pr_err("fail to dettach MDP DMA SMMU\n"); mdp3_ctrl_notifier_unregister(mdp3_session, &mdp3_session->mfd->mdp_sync_pt_data.notifier); mdp3_batfet_ctrl(false); mdp3_session->vsync_enabled = 0; atomic_set(&mdp3_session->vsync_countdown, 0); mdp3_session->clk_on = 0; off_error: mdp3_session->status = 0; mdp3_bufq_deinit(&mdp3_session->bufq_out); if (mdp3_session->overlay.id != MSMFB_NEW_REQUEST) { mdp3_session->overlay.id = MSMFB_NEW_REQUEST; mdp3_bufq_deinit(&mdp3_session->bufq_in); } mutex_unlock(&mdp3_session->offlock); mutex_unlock(&mdp3_session->lock); return 0; }