s32 disp_init_tv(disp_bsp_init_para * para) //call by disp_display { s32 val; s32 type; type = disp_sys_script_get_item("tv_para", "tv_used", &val, 1); if(1 == type) g_tv_used = val; if(g_tv_used ) { __u32 num_screens; __u32 disp; struct disp_device* p_tv; struct disp_device_private_data* p_tvp; DE_WRN("[boot]disp_init_tv\n"); #if defined(__LINUX_PLAT__) spin_lock_init(&g_tv_data_lock); #endif DE_WRN("[DISP_TV] disp_init_tv enter g_tv_used\n"); num_screens = bsp_disp_feat_get_num_screens(); g_ptv_devices = (struct disp_device *)disp_sys_malloc(sizeof(struct disp_device) * num_screens); if(NULL == g_ptv_devices) { DE_WRN("malloc memory fail!\n"); return DIS_FAIL; } g_ptv_private = (struct disp_device_private_data *)disp_sys_malloc(sizeof(struct disp_device_private_data) * num_screens); if(NULL == g_ptv_private) { DE_WRN("malloc memory fail!\n"); return DIS_FAIL; } for(disp=0; disp<num_screens; disp++) { p_tv = &g_ptv_devices[disp]; p_tvp = &g_ptv_private[disp]; if(!bsp_disp_feat_is_supported_output_types(disp, DISP_OUTPUT_TYPE_TV)) { //modify 1 DE_WRN("screen %d do not support TV TYPE!\n", disp); continue; } p_tv->disp = disp; sprintf(p_tv->name, "tv%d", disp); p_tv->type = DISP_OUTPUT_TYPE_TV; p_tvp->tv_mode = DISP_TV_MOD_PAL; //modifyed p_tvp->irq_no = para->irq_no[DISP_MOD_LCD0 + disp]; //modify p_tvp->clk = "tcon1"; p_tvp->clk_parent = "pll_video0"; p_tv->set_manager = disp_device_set_manager; p_tv->unset_manager = disp_device_unset_manager; p_tv->get_resolution = disp_device_get_resolution; p_tv->get_timings = disp_device_get_timings; p_tv->init = disp_tv_init; p_tv->exit = disp_tv_exit; p_tv->set_tv_func = disp_tv_set_func; p_tv->enable = disp_tv_enable; p_tv->disable = disp_tv_disable; p_tv->is_enabled = disp_tv_is_enabled; p_tv->set_mode = disp_tv_set_mode; p_tv->get_mode = disp_tv_get_mode; p_tv->check_support_mode = disp_tv_check_support_mode; p_tv->get_input_csc = disp_tv_get_input_csc; p_tv->detect = disp_tv_detect; p_tv->suspend = disp_tv_suspend; p_tv->resume = disp_tv_resume; p_tv->init(p_tv); if(bsp_disp_feat_is_supported_output_types(disp, DISP_OUTPUT_TYPE_TV)) disp_device_register(p_tv); DE_WRN("[BOOOT_DISP_TV] disp tv device_registered\n"); } } return 0; }
struct disp_device* disp_vdevice_register(disp_vdevice_init_data *data) { struct disp_device *vdevice; struct disp_vdevice_private_data *vdevicep; vdevice = (struct disp_device *)disp_sys_malloc(sizeof(struct disp_device)); if(NULL == vdevice) { DE_WRN("malloc memory fail!\n"); return NULL; } vdevicep = (struct disp_vdevice_private_data *)disp_sys_malloc(sizeof(struct disp_vdevice_private_data)); if(NULL == vdevicep) { DE_WRN("malloc memory fail!\n"); disp_sys_free(vdevice); return NULL; } #if defined(__LINUX_PLAT__) mutex_init(&vdevicep->mlock); #endif memset(vdevice, 0, sizeof(struct disp_device)); memcpy(&vdevice->name, data->name, 32); vdevice->disp = data->disp; vdevice->fix_timing = data->fix_timing; vdevice->type = data->type; memcpy(&vdevicep->func, &data->func, sizeof(disp_device_func)); vdevicep->irq_no = gdisp.init_para.irq_no[DISP_MOD_LCD0 + vdevice->disp]; switch(vdevice->disp) { case 0: vdevicep->clk = DE_LCD_CLK0; break; case 1: vdevicep->clk = DE_LCD_CLK1;//TCON clk break; default: vdevicep->clk = DE_LCD_CLK0; } vdevicep->clk_parent = DE_LCD_CLK_SRC; vdevice->set_manager = disp_device_set_manager; vdevice->unset_manager = disp_device_unset_manager; vdevice->get_resolution = disp_device_get_resolution; vdevice->get_timings = disp_device_get_timings; vdevice->is_interlace = disp_device_is_interlace; vdevice->init = disp_vdevice_init; vdevice->exit = disp_vdevice_exit; vdevice->enable = disp_vdevice_enable; vdevice->sw_enable = disp_vdevice_sw_enable; vdevice->disable = disp_vdevice_disable; vdevice->is_enabled = disp_vdevice_is_enabled; vdevice->set_mode = disp_vdevice_set_mode; vdevice->get_mode = disp_vdevice_get_mode; vdevice->check_support_mode = disp_vdevice_check_support_mode; vdevice->get_input_csc = disp_vdevice_get_input_csc; vdevice->get_input_color_range = disp_vdevice_get_input_color_range; vdevice->suspend = disp_vdevice_suspend; vdevice->resume = disp_vdevice_resume; vdevice->detect = disp_vdevice_detect; vdevice->priv_data = (void*)vdevicep; vdevice->init(vdevice); disp_device_register(vdevice); if(gdisp.init_para.start_process) gdisp.init_para.start_process(); return vdevice; }
s32 disp_init_hdmi(disp_bsp_init_para * para) { s32 ret; s32 value; //get sysconfig hdmi_used ret = disp_sys_script_get_item("hdmi_para", "hdmi_used", &value, 1); if(ret == 1) hdmi_used = value; if(hdmi_used) { u32 num_screens; u32 disp; struct disp_device* hdmi; struct disp_device_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_device *)disp_sys_malloc(sizeof(struct disp_device) * num_screens); if(NULL == hdmis) { DE_WRN("malloc memory fail!\n"); return DIS_FAIL; } hdmi_private = (struct disp_device_private_data *)disp_sys_malloc(sizeof(struct disp_device_private_data) * num_screens); if(NULL == hdmi_private) { DE_WRN("malloc memory fail!\n"); return DIS_FAIL; } for(disp=0; disp<num_screens; disp++) { hdmi = &hdmis[disp]; hdmip = &hdmi_private[disp]; if(!bsp_disp_feat_is_supported_output_types(disp, DISP_OUTPUT_TYPE_HDMI)) { continue; } hdmi->disp = disp; sprintf(hdmi->name, "hdmi%d", disp); hdmi->type = DISP_OUTPUT_TYPE_HDMI; hdmip->mode = DISP_TV_MOD_720P_50HZ; hdmip->irq_no = para->irq_no[DISP_MOD_LCD0 + disp]; switch(disp) { case 0: hdmip->clk = DE_LCD_CLK0; break; case 1: hdmip->clk = DE_LCD_CLK1;//TCON clk break; default: hdmip->clk = DE_LCD_CLK0; } hdmip->clk_parent = DE_HDMI_CLK_SRC; hdmi->set_manager = disp_device_set_manager; hdmi->unset_manager = disp_device_unset_manager; hdmi->get_resolution = disp_device_get_resolution; hdmi->get_timings = disp_device_get_timings; hdmi->is_interlace = disp_device_is_interlace; 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->get_input_color_range = disp_hdmi_get_input_color_range; hdmi->suspend = disp_hdmi_suspend; hdmi->resume = disp_hdmi_resume; hdmi->detect = disp_hdmi_detect; if(bsp_disp_feat_is_supported_output_types(disp, DISP_OUTPUT_TYPE_HDMI)) { hdmi->init(hdmi); disp_device_register(hdmi); } } } return 0; }