static s32 disp_hdmi_init(struct disp_hdmi* hdmi) { s32 ret; u32 value = 0; struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi init null hdl!\n"); return DIS_FAIL; } if(!disp_al_query_hdmi_mod(hdmi->channel_id)) { DE_WRN("hdmi %d is not register\n", hdmi->channel_id); return DIS_FAIL; } ret = OSAL_Script_FetchParser_Data("hdmi_para", "hdmi_4k", &value, 1); if(ret == 0) hdmip->support_4k = value; if((NULL != hdmi->p_sw_init_flag) && (0 != *(hdmi->p_sw_init_flag))) { disp_al_hdmi_init_sw(hdmi->channel_id, hdmip->support_4k); } else { hdmi_clk_init(hdmi); disp_al_hdmi_init(hdmi->channel_id, hdmip->support_4k); } return 0; }
s32 disp_hdmi_exit(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi init null hdl!\n"); return DIS_FAIL; } if(!disp_al_query_hdmi_mod(hdmi->channel_id)) { DE_WRN("hdmi %d is not register\n", hdmi->channel_id); return DIS_FAIL; } disp_al_hdmi_exit(hdmi->channel_id); hdmi_clk_exit(hdmi); return 0; }
struct disp_hdmi_private_data *disp_hdmi_get_priv(struct disp_hdmi *hdmi) { if(NULL == hdmi) { DE_WRN("NULL hdl!\n"); return NULL; } if(!disp_al_query_hdmi_mod(hdmi->channel_id)) { DE_WRN("hdmi %d is not registered\n", hdmi->channel_id); return NULL; } if(!(bsp_disp_feat_get_supported_output_types(hdmi->channel_id) & DISP_OUTPUT_TYPE_HDMI)) { DE_WRN("screen %d do not support HDMI TYPE!\n", hdmi->channel_id); return NULL; } return &hdmi_private[hdmi->channel_id]; }
struct disp_hdmi* disp_get_hdmi(u32 screen_id) { u32 num_screens; num_screens = bsp_disp_feat_get_num_screens(); if(screen_id >= num_screens) { DE_WRN("screen_id %d out of range\n", screen_id); return NULL; } if(!(bsp_disp_feat_get_supported_output_types(screen_id) & DISP_OUTPUT_TYPE_HDMI)) { DE_WRN("screen_id %d do not support HDMI TYPE!\n", screen_id); return NULL; } if(!disp_al_query_hdmi_mod(screen_id)) { DE_WRN("hdmi %d is not registered\n", screen_id); return NULL; } return &hdmis[screen_id]; }
s32 disp_init_hdmi(__disp_bsp_init_para * para) { s32 ret; s32 value; //get sysconfig hdmi_used ret = OSAL_Script_FetchParser_Data("hdmi_para", "hdmi_used", &value, 1); if(ret == 0) hdmi_used = value; if(hdmi_used) { u32 num_screens; u32 screen_id; struct disp_hdmi* hdmi; struct disp_hdmi_private_data* hdmip; DE_INF("disp_init_hdmi\n"); #if defined(__LINUX_PLAT__) spin_lock_init(&hdmi_data_lock); #endif num_screens = bsp_disp_feat_get_num_screens(); hdmis = (struct disp_hdmi *)OSAL_malloc(sizeof(struct disp_hdmi) * num_screens); if(NULL == hdmis) { DE_WRN("malloc memory fail!\n"); return DIS_FAIL; } hdmi_private = (struct disp_hdmi_private_data *)OSAL_malloc(sizeof(struct disp_hdmi_private_data) * num_screens); if(NULL == hdmi_private) { DE_WRN("malloc memory fail!\n"); return DIS_FAIL; } for(screen_id=0; screen_id<num_screens; screen_id++) { hdmi = &hdmis[screen_id]; hdmip = &hdmi_private[screen_id]; if(!disp_al_query_hdmi_mod(screen_id)) { DE_WRN("hdmi mod %d is not registered\n", screen_id); continue; } if(!(bsp_disp_feat_get_supported_output_types(screen_id) & DISP_OUTPUT_TYPE_HDMI)) { DE_WRN("screen %d do not support HDMI TYPE!\n", screen_id); continue; } switch(screen_id) { case 0: hdmi->channel_id = 0; hdmi->name = "hdmi0"; hdmi->type = DISP_OUTPUT_TYPE_HDMI; hdmip->hdmi_clk.clk = MOD_CLK_HDMI; hdmip->hdmi_ddc_clk.clk = MOD_CLK_HDMI_DDC; hdmip->lcd_clk.clk = MOD_CLK_LCD0CH1; hdmip->drc_clk.clk = MOD_CLK_IEPDRC0; hdmip->drc_clk.clk_div = 3; break; case 1: hdmi->channel_id = 1; hdmi->name = "hdmi1"; hdmi->type = DISP_OUTPUT_TYPE_HDMI; hdmip->hdmi_clk.clk = MOD_CLK_HDMI; hdmip->hdmi_ddc_clk.clk = MOD_CLK_HDMI_DDC; hdmip->lcd_clk.clk = MOD_CLK_LCD1CH1; hdmip->drc_clk.clk = MOD_CLK_IEPDRC1; hdmip->drc_clk.clk_div = 3; break; case 2: break; default : break; } hdmip->mode = DISP_TV_MOD_720P_50HZ; hdmi->init = disp_hdmi_init; hdmi->exit = disp_hdmi_exit; hdmi->set_func = disp_hdmi_set_func; hdmi->enable = disp_hdmi_enable; hdmi->disable = disp_hdmi_disable; hdmi->is_enabled = disp_hdmi_is_enabled; hdmi->set_mode = disp_hdmi_set_mode; hdmi->get_mode = disp_hdmi_get_mode; hdmi->check_support_mode = disp_hdmi_check_support_mode; hdmi->get_input_csc = disp_hdmi_get_input_csc; hdmi->hdmi_get_HPD_status = disp_hdmi_get_HPD_status; hdmi->init(hdmi); } } return 0; }