static void hisifb_vsync_ctrl_workqueue_handler(struct work_struct *work) { struct hisi_fb_data_type *hisifd = NULL; struct hisifb_vsync *vsync_ctrl = NULL; struct hisi_fb_panel_data *pdata = NULL; unsigned long flags = 0; vsync_ctrl = container_of(work, typeof(*vsync_ctrl), vsync_ctrl_work); BUG_ON(vsync_ctrl == NULL); hisifd = vsync_ctrl->hisifd; BUG_ON(hisifd == NULL); pdata = dev_get_platdata(&hisifd->pdev->dev); BUG_ON(pdata == NULL); down(&(hisifd->blank_sem)); if (!hisifd->panel_power_on) { HISI_FB_DEBUG("fb%d, panel is power off!", hisifd->index); up(&(hisifd->blank_sem)); return; } mutex_lock(&(vsync_ctrl->vsync_lock)); if (vsync_ctrl->vsync_ctrl_disabled_set && (vsync_ctrl->vsync_ctrl_expire_count == 0) && vsync_ctrl->vsync_ctrl_enabled && !vsync_ctrl->vsync_enabled) { HISI_FB_DEBUG("fb%d, dss clk off!\n", hisifd->index); spin_lock_irqsave(&(vsync_ctrl->spin_lock), flags); if (pdata->vsync_ctrl) { pdata->vsync_ctrl(hisifd->pdev, 0); } else { HISI_FB_ERR("fb%d, vsync_ctrl not supported!\n", hisifd->index); } vsync_ctrl->vsync_ctrl_enabled = 0; vsync_ctrl->vsync_ctrl_disabled_set = 0; spin_unlock_irqrestore(&(vsync_ctrl->spin_lock), flags); if (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_MIPI_ULPS) { mipi_dsi_ulps_cfg(hisifd, 0); } if (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_CLK_OFF) { dpe_clk_disable(hisifd); mipi_dsi_clk_disable(hisifd); } if (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_VCC_OFF) { dpe_regulator_disable(hisifd); } } mutex_unlock(&(vsync_ctrl->vsync_lock)); if (vsync_ctrl->vsync_report_fnc) { vsync_ctrl->vsync_report_fnc(1); } up(&(hisifd->blank_sem)); }
static int dpe_off(struct platform_device *pdev) { int ret = 0; struct k3_fb_data_type *k3fd = NULL; BUG_ON(pdev == NULL); k3fd = platform_get_drvdata(pdev); BUG_ON(k3fd == NULL); K3_FB_DEBUG("fb%d, +.\n", k3fd->index); if (k3fd->panel_info.vsync_ctrl_type == VSYNC_CTRL_NONE) { dpe_interrupt_mask(k3fd); dpe_irq_disable(k3fd); } else { if (k3fd->vsync_ctrl.vsync_ctrl_enabled == 1) { if (k3fd->panel_info.vsync_ctrl_type & VSYNC_CTRL_ISR_OFF) { dpe_interrupt_mask(k3fd); dpe_irq_disable(k3fd); K3_FB_INFO("fb%d, need to disable dpe irq! vsync_ctrl_enabled=%d.\n", k3fd->index, k3fd->vsync_ctrl.vsync_ctrl_enabled); } } } ret = panel_next_off(pdev); dpe_deinit(k3fd); dpe_regulator_disable(k3fd); if (k3fd->index != PRIMARY_PANEL_IDX) { if (k3fd_list[PRIMARY_PANEL_IDX] && (k3fd_list[PRIMARY_PANEL_IDX]->panel_info.vsync_ctrl_type & VSYNC_CTRL_CLK_OFF)) { K3_FB_DEBUG("fb%d, pdp clk disable!\n", k3fd->index); dpe_clk_disable(k3fd_list[PRIMARY_PANEL_IDX]); } } /* reset DSI */ if (is_mipi_panel(k3fd)) { if (is_dual_mipi_panel(k3fd)) { outp32(k3fd->crgperi_base + PERRSTEN3_OFFSET, 0x00030000); } else { outp32(k3fd->crgperi_base + PERRSTEN3_OFFSET, 0x00020000); } } K3_FB_DEBUG("fb%d, -.\n", k3fd->index); return ret; }
int hisifb_vsync_resume(struct hisi_fb_data_type *hisifd) { struct hisifb_vsync *vsync_ctrl = NULL; BUG_ON(hisifd == NULL); vsync_ctrl = &(hisifd->vsync_ctrl); BUG_ON(vsync_ctrl == NULL); vsync_ctrl->vsync_enabled = 0; vsync_ctrl->vsync_ctrl_expire_count = 0; vsync_ctrl->vsync_ctrl_disabled_set = 0; vsync_ctrl->vsync_ctrl_enabled = 1; vsync_ctrl->vsync_ctrl_isr_enabled = 1; //vsync_ctrl->vsync_infinite = 0; atomic_set(&(vsync_ctrl->buffer_updated), 1); #if 0 if (hisifd->panel_info.vsync_ctrl_type != VSYNC_CTRL_NONE) { if ((hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_MIPI_ULPS) || (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_CLK_OFF) || (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_VCC_OFF)) { if (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_MIPI_ULPS) { mipi_dsi_ulps_cfg(hisifd, 0); } if (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_CLK_OFF) { dpe_inner_clk_disable(hisifd); dpe_common_clk_disable(hisifd); mipi_dsi_clk_disable(hisifd); } if (hisifd->panel_info.vsync_ctrl_type & VSYNC_CTRL_VCC_OFF) { dpe_regulator_disable(hisifd); } } } #endif return 0; }