__s32 Disp_set_out_interlace(__u32 sel) { __u32 i; __bool b_cvbs_out = 0; if (sunxi_is_sun5i()) return 0; if (gdisp.screen[sel].output_type == DISP_OUTPUT_TYPE_TV && (gdisp.screen[sel].tv_mode == DISP_TV_MOD_PAL || gdisp.screen[sel].tv_mode == DISP_TV_MOD_PAL_M || gdisp.screen[sel].tv_mode == DISP_TV_MOD_PAL_NC || gdisp.screen[sel].tv_mode == DISP_TV_MOD_NTSC)) { b_cvbs_out = 1; } gdisp.screen[sel].de_flicker_status |= DE_FLICKER_REQUIRED; BSP_disp_cfg_start(sel); /* when output device is cvbs */ if ((gdisp.screen[sel].de_flicker_status & DE_FLICKER_REQUIRED) && b_cvbs_out) { DE_BE_deflicker_enable(sel, TRUE); for (i = 0; i < 2; i++) { if ((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == sel)) { Scaler_Set_Outitl(i, FALSE); } } gdisp.screen[sel].de_flicker_status |= DE_FLICKER_USED; } else { DE_BE_deflicker_enable(sel, FALSE); for (i = 0; i < 2; i++) { if ((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == sel)) { Scaler_Set_Outitl(i, gdisp.screen[sel]. b_out_interlace); } } gdisp.screen[sel].de_flicker_status &= ~DE_FLICKER_USED; } DE_BE_Set_Outitl_enable(sel, gdisp.screen[sel].b_out_interlace); BSP_disp_cfg_finish(sel); return DIS_SUCCESS; }
/* * en : 0-close when vbi * en : 1- open when vbi * en : 2-close immediately */ __s32 Disp_de_flicker_enable(__u32 sel, __u32 en) { __disp_tv_mode_t tv_mode; __u32 scan_mode; __u32 scaler_index; tv_mode = gdisp.screen[sel].tv_mode; scan_mode = gdisp.screen[sel].b_out_interlace; if (sel) return -1; switch (en) { case 0: if (gdisp.screen[sel].iep_status & DE_FLICKER_USED) { BSP_disp_cfg_start(sel); for (scaler_index = 0; scaler_index < 2; scaler_index++) { if ((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) { Scaler_Set_Outitl(scaler_index, TRUE); gdisp.scaler[scaler_index].b_reg_change = TRUE; } } /* must do in sun5i */ DE_BE_Set_Outitl_enable(sel, TRUE); gdisp.screen[sel].iep_status &= DE_FLICKER_NEED_CLOSED; BSP_disp_cfg_finish(sel); } else { DE_INF("de: De-flicker hasn't opened yet!\n"); } break; case 1: /* when set DISP_CMD_DE_FLICKER_ON before */ if (gdisp.screen[sel].iep_status & DE_FLICKER_REQUIRED) { if ((gdisp.screen[sel].output_type == DISP_OUTPUT_TYPE_TV) && scan_mode && (gdisp.screen[sel].status & TV_ON)) { /* when interlaced tv on */ if (!(gdisp.screen[sel].iep_status & DE_FLICKER_USED)) { BSP_disp_cfg_start(sel); /* config defe to fit de-flicker */ for (scaler_index = 0; scaler_index < 2; scaler_index++) { if ((gdisp.scaler[scaler_index]. status & SCALER_USED) && (gdisp.scaler[scaler_index]. screen_index == sel)) { Scaler_Set_Outitl (scaler_index, FALSE); gdisp.scaler [scaler_index]. b_reg_change = TRUE; } } /* config debe to fit de-flicker */ /* must do in sun5i */ DE_BE_Set_Outitl_enable(sel, FALSE); Disp_de_flicker_init(sel); gdisp.screen[sel].iep_status |= DE_FLICKER_USED; BSP_disp_cfg_finish(sel); } else { DE_INF("de: De-flicker has already " "opened before !\n"); } } else { DE_INF("de: Will OPEN de-flicker when output to" " interlaced device !\n"); } } else { DE_INF("de: Run DISP_CMD_DE_FLICKER_ON will open " "de-flicker !\n"); } break; case 2: if (gdisp.screen[sel].iep_status & DE_FLICKER_USED) { BSP_disp_cfg_start(sel); for (scaler_index = 0; scaler_index < 2; scaler_index++) { if ((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) { Scaler_Set_Outitl(scaler_index, TRUE); gdisp.scaler[scaler_index]. b_reg_change = TRUE; } } /* must do in sun5i */ DE_BE_Set_Outitl_enable(sel, TRUE); Disp_de_flicker_close_proc(sel, 1); BSP_disp_cfg_finish(sel); } else { DE_INF("de: De-flicker hasn't opened yet!\n"); } break; } return 0; }