s32 hdmi_clk_exit(struct disp_hdmi *hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } if(hdmi_init_flags == 1) { hdmi_init_flags = 0; hdmip->hdmi_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->hdmi_clk.clk); OSAL_CCMU_MclkOnOff(hdmip->hdmi_clk.h_clk, CLK_OFF); OSAL_CCMU_CloseMclk(hdmip->hdmi_clk.h_clk); hdmip->hdmi_ddc_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->hdmi_ddc_clk.clk); OSAL_CCMU_MclkOnOff(hdmip->hdmi_ddc_clk.h_clk, CLK_OFF); OSAL_CCMU_CloseMclk(hdmip->hdmi_ddc_clk.h_clk); #if defined(__LINUX_PLAT__) { unsigned long flags; spin_lock_irqsave(&hdmi_data_lock, flags); #endif hdmip->hdmi_clk.enabled = 0; hdmip->hdmi_ddc_clk.enabled = 0; #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&hdmi_data_lock, flags); } #endif } return 0; }
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; }
static s32 disp_hdmi_set_mode(struct disp_hdmi* hdmi, disp_tv_mode mode) { s32 ret = 0; struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_set_mode == NULL) { DE_WRN("hdmi mode is null!\n"); return -1; } ret = hdmip->hdmi_func.hdmi_set_mode(mode); if(ret == 0) { hdmip->mode = mode; #if defined(CONFIG_ARCH_SUN9IW1P1) switch(mode) { case DISP_TV_MOD_480I: case DISP_TV_MOD_576I: case DISP_TV_MOD_1080I_50HZ: case DISP_TV_MOD_1080I_60HZ: disp_al_cfg_itl(hdmi->channel_id, 1); break; default: disp_al_cfg_itl(hdmi->channel_id, 0); } #endif } return ret; }
s32 disp_hdmi_disable(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->enabled == 0) { DE_WRN("hdmi%d is already closed\n", hdmi->channel_id); return DIS_FAIL; } disp_al_hdmi_disable(hdmi->channel_id); hdmi_clk_disable(hdmi); if(hdmip->hdmi_func.hdmi_close == NULL) return -1; hdmip->hdmi_func.hdmi_close(); #if defined(__LINUX_PLAT__) { unsigned long flags; spin_lock_irqsave(&hdmi_data_lock, flags); #endif hdmip->enabled = 0; #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&hdmi_data_lock, flags); } #endif return 0; }
s32 hdmi_clk_config(struct disp_hdmi *hdmi) { // u32 pll_freq; // u32 clk_div; struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } //set hdmi clk hdmip->hdmi_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->hdmi_clk.clk); if(hdmip->hdmi_clk.enabled == 0) { OSAL_CCMU_MclkOnOff(hdmip->hdmi_clk.h_clk, CLK_ON); #if defined(__LINUX_PLAT__) { unsigned long flags; spin_lock_irqsave(&hdmi_data_lock, flags); #endif hdmip->hdmi_clk.enabled = 1; #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&hdmi_data_lock, flags); } #endif } OSAL_CCMU_SetMclkFreq(hdmip->hdmi_clk.h_clk, hdmip->video_info->pixel_clk * (hdmip->video_info->avi_pr + 1)); OSAL_CCMU_CloseMclk(hdmip->hdmi_clk.h_clk); hdmip->hdmi_ddc_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->hdmi_ddc_clk.clk); if(hdmip->hdmi_ddc_clk.enabled == 0) { OSAL_CCMU_MclkOnOff(hdmip->hdmi_ddc_clk.h_clk, CLK_ON); #if defined(__LINUX_PLAT__) { unsigned long flags; spin_lock_irqsave(&hdmi_data_lock, flags); #endif hdmip->hdmi_ddc_clk.enabled = 1; #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&hdmi_data_lock, flags); } #endif } OSAL_CCMU_CloseMclk(hdmip->hdmi_ddc_clk.h_clk); //set lcd clk hdmip->lcd_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->lcd_clk.clk); OSAL_CCMU_SetMclkSrc(hdmip->lcd_clk.h_clk); //OSAL_CCMU_SetSrcFreq(hdmip->lcd_clk.clk, 0); OSAL_CCMU_SetMclkFreq(hdmip->lcd_clk.h_clk, hdmip->video_info->pixel_clk * (hdmip->video_info->avi_pr + 1)); OSAL_CCMU_MclkOnOff(hdmip->lcd_clk.h_clk, CLK_ON); OSAL_CCMU_CloseMclk(hdmip->lcd_clk.h_clk); return 0; }
s32 disp_hdmi_enable(struct disp_hdmi* hdmi) { s32 index, ret; struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_get_video_timing_info == NULL) { DE_WRN("hdmi_get_video_timing_info func is null\n"); return DIS_FAIL; } hdmip->hdmi_func.hdmi_get_video_timing_info(&(hdmip->video_info)); if(hdmip->video_info == NULL) { DE_WRN("video info is null\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_get_video_info_index == NULL) { DE_WRN("hdmi_get_video_info_index func is null\n"); return DIS_FAIL; } index = hdmip->hdmi_func.hdmi_get_video_info_index(hdmip->mode); if(index < 0) { DE_WRN("hdmi get video info index fail\n"); return DIS_FAIL; } hdmip->video_info = hdmip->video_info + index; hdmi_clk_enable(hdmi); disp_al_hdmi_init(hdmi->channel_id, hdmip->support_4k); disp_al_hdmi_cfg(hdmi->channel_id, hdmip->video_info); disp_al_hdmi_enable(hdmi->channel_id); if(hdmip->hdmi_func.hdmi_open == NULL) return -1; ret = hdmip->hdmi_func.hdmi_open(); #if defined(__LINUX_PLAT__) { unsigned long flags; spin_lock_irqsave(&hdmi_data_lock, flags); #endif hdmip->enabled = 1; #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&hdmi_data_lock, flags); } #endif return ret; }
static s32 disp_hdmi_get_input_color_range(struct disp_device* hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } return DISP_COLOR_RANGE_16_235; }
s32 disp_hdmi_get_mode(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } return hdmip->mode; }
static s32 disp_hdmi_is_enabled(struct disp_device* hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } return hdmip->enabled; }
static s32 hdmi_clk_exit(struct disp_hdmi *hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } return 0; }
static s32 hdmi_clk_init(struct disp_device *hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } disp_sys_clk_set_parent(hdmip->clk, hdmip->clk_parent); return 0; }
s32 disp_hdmi_get_HPD_status(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if (hdmip->hdmi_func.hdmi_get_HPD_status) return hdmip->hdmi_func.hdmi_get_HPD_status(); return DIS_FAIL; }
static s32 disp_hdmi_init(struct disp_device* hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi init null hdl!\n"); return DIS_FAIL; } hdmi_clk_init(hdmi); return 0; }
static s32 disp_hdmi_set_func(struct disp_hdmi* hdmi, disp_hdmi_func * func) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } memcpy(&hdmip->hdmi_func, func, sizeof(disp_hdmi_func)); return 0; }
static s32 disp_hdmi_get_edid(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return 0; } if(hdmip->hdmi_func.hdmi_get_edid == NULL) return 0; return hdmip->hdmi_func.hdmi_get_edid(); }
static s32 hdmi_clk_enable(struct disp_device *hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } hdmi_clk_config(hdmi); disp_sys_clk_enable(hdmip->clk); return 0; }
s32 disp_hdmi_get_input_csc(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_get_input_csc == NULL) return -1; return hdmip->hdmi_func.hdmi_get_input_csc(); }
s32 disp_hdmi_check_support_mode(struct disp_hdmi* hdmi, u8 mode) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_mode_support == NULL) return -1; return hdmip->hdmi_func.hdmi_mode_support(mode); }
static s32 hdmi_clk_config(struct disp_device *hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); unsigned long rate = 0; if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } rate = hdmip->video_info->pixel_clk * (hdmip->video_info->pixel_repeat + 1); disp_sys_clk_set_rate(hdmip->clk, rate); return 0; }
static s32 disp_hdmi_resume(struct disp_hdmi* hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); DE_WRN("\n"); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_resume != NULL) { hdmip->hdmi_func.hdmi_resume(); } return 0; }
s32 disp_hdmi_enable(struct disp_device* hdmi) { unsigned long flags; struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); struct disp_manager *mgr = NULL; if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } mgr = hdmi->manager; if(!mgr) { DE_WRN("hdmi%d's mgr is NULL\n", hdmi->disp); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_get_video_timing_info == NULL) { DE_WRN("hdmi_get_video_timing_info func is null\n"); return DIS_FAIL; } hdmip->hdmi_func.hdmi_get_video_timing_info(&(hdmip->video_info)); if(hdmip->video_info == NULL) { DE_WRN("video info is null\n"); return DIS_FAIL; } memcpy(&hdmi->timings, hdmip->video_info, sizeof(disp_video_timings)); if(mgr->enable) mgr->enable(mgr); disp_sys_register_irq(hdmip->irq_no,0,disp_hdmi_event_proc,(void*)hdmi->disp,0,0); disp_sys_enable_irq(hdmip->irq_no); hdmi_clk_enable(hdmi); disp_al_hdmi_cfg(hdmi->disp, hdmip->video_info); disp_al_hdmi_enable(hdmi->disp); if(NULL != hdmip->hdmi_func.hdmi_open) hdmip->hdmi_func.hdmi_open(); else DE_WRN("hdmi_open is NULL\n"); disp_sys_irqlock((void*)&hdmi_data_lock, &flags); hdmip->enabled = 1; disp_sys_irqunlock((void*)&hdmi_data_lock, &flags); return 0; }
s32 hdmi_clk_enable(struct disp_hdmi *hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } hdmi_clk_config(hdmi); if(hdmip->drc_clk.clk) disp_al_hdmi_clk_enable(hdmip->drc_clk.clk); disp_al_hdmi_enable(hdmi->channel_id); return 0; }
s32 disp_hdmi_get_vendor_id(struct disp_hdmi* hdmi, __u8 *id) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); __inf("disp_hdmi_get_vendor_id\n"); if((NULL == hdmi) || (NULL == hdmip)){ DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_get_vendor_id == NULL){ __inf("hdmi_get_vendor_id NULL"); return -1; } return hdmip->hdmi_func.hdmi_get_vendor_id(id); }
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; }
static s32 hdmi_clk_disable(struct disp_hdmi *hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } disp_al_hdmi_disable(hdmi->channel_id); hdmip->lcd_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->lcd_clk.clk); OSAL_CCMU_MclkOnOff(hdmip->lcd_clk.h_clk, CLK_OFF); OSAL_CCMU_CloseMclk(hdmip->lcd_clk.h_clk); if(hdmip->drc_clk.clk) disp_al_hdmi_clk_disable(hdmip->drc_clk.clk); return 0; }
s32 disp_hdmi_set_mode(struct disp_hdmi* hdmi, disp_tv_mode mode) { s32 ret = 0; struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } if(hdmip->hdmi_func.hdmi_set_mode == NULL) { DE_WRN("hdmi mode is null!\n"); return -1; } ret = hdmip->hdmi_func.hdmi_set_mode(mode); if(ret == 0) hdmip->mode = mode; return ret; }
static s32 hdmi_clk_enable(struct disp_hdmi *hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } if((NULL == hdmi->p_sw_init_flag) || (0 == *(hdmi->p_sw_init_flag))) { hdmi_clk_config(hdmi); } if(hdmip->drc_clk.clk && ((NULL == hdmi->p_sw_init_flag) || (0 == *(hdmi->p_sw_init_flag)))) disp_al_hdmi_clk_enable(hdmip->drc_clk.clk); if((NULL == hdmi->p_sw_init_flag) || (0 == *(hdmi->p_sw_init_flag))) { disp_al_hdmi_enable(hdmi->channel_id); } else { //disp_al_hdmi_enable_sw(hdmi->channel_id); } return 0; }
s32 disp_hdmi_set_func(struct disp_hdmi* hdmi, disp_hdmi_func * func) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } hdmip->hdmi_func.hdmi_open = func->hdmi_open; hdmip->hdmi_func.hdmi_close= func->hdmi_close; hdmip->hdmi_func.hdmi_set_mode= func->hdmi_set_mode; hdmip->hdmi_func.hdmi_mode_support= func->hdmi_mode_support; hdmip->hdmi_func.hdmi_get_HPD_status = func->hdmi_get_HPD_status; hdmip->hdmi_func.hdmi_get_input_csc= func->hdmi_get_input_csc; hdmip->hdmi_func.hdmi_set_pll = func->hdmi_set_pll; hdmip->hdmi_func.hdmi_get_video_timing_info = func->hdmi_get_video_timing_info; hdmip->hdmi_func.hdmi_get_video_info_index = func->hdmi_get_video_info_index; return 0; }
static s32 disp_hdmi_disable(struct disp_device* hdmi) { struct disp_device_private_data *hdmip = disp_hdmi_get_priv(hdmi); unsigned long flags; struct disp_manager *mgr = NULL; if((NULL == hdmi) || (NULL == hdmip)) { DE_WRN("hdmi set func null hdl!\n"); return DIS_FAIL; } mgr = hdmi->manager; if(!mgr) { DE_WRN("hdmi%d's mgr is NULL\n", hdmi->disp); return DIS_FAIL; } if(hdmip->enabled == 0) { DE_WRN("hdmi%d is already closed\n", hdmi->disp); return DIS_FAIL; } disp_al_hdmi_disable(hdmi->disp); hdmi_clk_disable(hdmi); if(hdmip->hdmi_func.hdmi_close == NULL) return -1; hdmip->hdmi_func.hdmi_close(); if(mgr->disable) mgr->disable(mgr); disp_sys_irqlock((void*)&hdmi_data_lock, &flags); hdmip->enabled = 0; disp_sys_irqunlock((void*)&hdmi_data_lock, &flags); disp_sys_disable_irq(hdmip->irq_no); disp_sys_unregister_irq(hdmip->irq_no, disp_hdmi_event_proc,(void*)hdmi->disp); return 0; }
static s32 hdmi_clk_config(struct disp_hdmi *hdmi) { struct disp_hdmi_private_data *hdmip = disp_hdmi_get_priv(hdmi); if(!hdmi || !hdmip) { DE_WRN("hdmi clk init null hdl!\n"); return DIS_FAIL; } //set hdmi clk hdmip->hdmi_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->hdmi_clk.clk); OSAL_CCMU_SetMclkFreq(hdmip->hdmi_clk.h_clk, hdmip->video_info->pixel_clk * (hdmip->video_info->avi_pr + 1)); OSAL_CCMU_CloseMclk(hdmip->hdmi_clk.h_clk); //set lcd clk hdmip->lcd_clk.h_clk = OSAL_CCMU_OpenMclk(hdmip->lcd_clk.clk); OSAL_CCMU_SetMclkSrc(hdmip->lcd_clk.h_clk); OSAL_CCMU_SetMclkFreq(hdmip->lcd_clk.h_clk, hdmip->video_info->pixel_clk * (hdmip->video_info->avi_pr + 1)); OSAL_CCMU_MclkOnOff(hdmip->lcd_clk.h_clk, CLK_ON); OSAL_CCMU_CloseMclk(hdmip->lcd_clk.h_clk); return 0; }