static void lcdc_request_vsync(struct msm_panel_data *fb_panel, struct msmfb_callback *vsync_cb) { struct mdp_lcdc_info *lcdc = panel_to_lcdc(fb_panel); /* the vsync callback will start the dma */ vsync_cb->func(vsync_cb); // CotullaFIX start // F**K, who make calls from console with disabled interrupts, F**K THEM! if (irqs_disabled()) { struct mdp_lcdc_info *lcdc = panel_to_lcdc(fb_panel); uint32_t status; uint32_t i; // do it via polling for (i = 0; i < 20; i++) { status = mdp_readl(lcdc->mdp, MDP_INTR_STATUS); if (status & MDP_LCDC_FRAME_START) break; mdelay(1); } // clear intr at the end mdp_writel(lcdc->mdp, MDP_LCDC_FRAME_START, MDP_INTR_CLEAR); // vsync_cb->func(vsync_cb); } else { lcdc->got_vsync = 0; mdp_out_if_req_irq(mdp_dev, MSM_LCDC_INTERFACE, MDP_LCDC_FRAME_START, &lcdc->frame_start_cb); lcdc_wait_vsync(fb_panel); } // CotullaFIX end }
static void lcdc_request_vsync(struct msm_panel_data *fb_panel, struct msmfb_callback *vsync_cb) { struct mdp_lcdc_info *lcdc = panel_to_lcdc(fb_panel); /* the vsync callback will start the dma */ vsync_cb->func(vsync_cb); lcdc->got_vsync = 0; mdp_out_if_req_irq(mdp_dev, MSM_LCDC_INTERFACE, MDP_LCDC_FRAME_START, &lcdc->frame_start_cb); lcdc_wait_vsync(fb_panel); }
static void tvenc_request_vsync(struct msm_panel_data *fb_panel, struct msmfb_callback *vsync_cb) { struct tvenc_info *tvenc = panel_to_tv(fb_panel); /* the vsync callback will start the dma */ vsync_cb->func(vsync_cb); tvenc->got_vsync = 0; mdp_out_if_req_irq(mdp_dev, MSM_TV_INTERFACE, TV_OUT_FRAME_START, &tvenc->frame_start_cb); tvenc_wait_vsync(fb_panel); }
static void lcdc_clear_vsync(struct msm_panel_data *fb_panel) { struct mdp_lcdc_info *lcdc = panel_to_lcdc(fb_panel); lcdc->got_vsync = 0; mdp_out_if_req_irq(mdp_dev, MSM_LCDC_INTERFACE, 0, NULL); }
static void tvenc_clear_vsync(struct msm_panel_data *fb_panel) { struct tvenc_info *tvenc = panel_to_tv(fb_panel); tvenc->got_vsync = 0; mdp_out_if_req_irq(mdp_dev, MSM_TV_INTERFACE, 0, NULL); }