static ssize_t disp_vsync_event_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int err; unsigned long val; err = strict_strtoul(buf, 10, &val); if (err) { printk("Invalid size\n"); return err; } if((val>1)) { printk("Invalid value, 0/1 is expected!\n"); }else { bsp_disp_vsync_event_enable(sel, val); } return count; }
long disp_ioctl(void *hd, unsigned int cmd, void *arg) { unsigned long karg[4]; unsigned long ubuffer[4] = {0}; s32 ret = 0; int num_screens = 2; num_screens = bsp_disp_feat_get_num_screens(); if (copy_from_user((void*)karg,(void*)arg, 4*sizeof(unsigned long))) { __wrn("copy_from_user fail\n"); return -1; } ubuffer[0] = *(unsigned long*)karg; ubuffer[1] = (*(unsigned long*)(karg+1)); ubuffer[2] = (*(unsigned long*)(karg+2)); ubuffer[3] = (*(unsigned long*)(karg+3)); if(cmd < DISP_CMD_FB_REQUEST) { if(ubuffer[0] >= num_screens) { __wrn("para err in disp_ioctl, cmd = 0x%x,screen id = %d\n", cmd, (int)ubuffer[0]); return -1; } } if(DISPLAY_DEEP_SLEEP == suspend_status) { __wrn("ioctl:%x fail when in suspend!\n", cmd); return -1; } if(cmd == disp_cmd_print) { // OSAL_PRINTF("cmd:0x%x,%ld,%ld\n",cmd, ubuffer[0], ubuffer[1]); } switch(cmd) { //----disp global---- case DISP_CMD_SET_BKCOLOR: { disp_color_info para; if(copy_from_user(¶, (void*)ubuffer[1],sizeof(disp_color_info))) { __wrn("copy_from_user fail\n"); return -1; } ret = bsp_disp_set_back_color(ubuffer[0], ¶); break; } case DISP_CMD_GET_OUTPUT_TYPE: if(DISPLAY_NORMAL == suspend_status) { ret = bsp_disp_get_output_type(ubuffer[0]); } else { ret = suspend_output_type[ubuffer[0]]; } if(DISP_OUTPUT_TYPE_LCD == ret) { ret = bsp_disp_get_lcd_output_type(ubuffer[0]); } break; case DISP_CMD_GET_SCN_WIDTH: ret = bsp_disp_get_screen_width(ubuffer[0]); break; case DISP_CMD_GET_SCN_HEIGHT: ret = bsp_disp_get_screen_height(ubuffer[0]); break; case DISP_CMD_SHADOW_PROTECT: ret = bsp_disp_shadow_protect(ubuffer[0], ubuffer[1]); break; case DISP_CMD_VSYNC_EVENT_EN: ret = bsp_disp_vsync_event_enable(ubuffer[0], ubuffer[1]); break; //----layer---- case DISP_CMD_LAYER_ENABLE: ret = bsp_disp_layer_enable(ubuffer[0], ubuffer[1]); break; case DISP_CMD_LAYER_DISABLE: ret = bsp_disp_layer_disable(ubuffer[0], ubuffer[1]); break; case DISP_CMD_LAYER_SET_INFO: { disp_layer_info para; if(copy_from_user(¶, (void*)ubuffer[2],sizeof(disp_layer_info))) { return -1; } ret = bsp_disp_layer_set_info(ubuffer[0], ubuffer[1], ¶); break; } case DISP_CMD_LAYER_GET_INFO: { disp_layer_info para; ret = bsp_disp_layer_get_info(ubuffer[0], ubuffer[1], ¶); if(copy_to_user((void*)ubuffer[2],¶, sizeof(disp_layer_info))) { __wrn("copy_to_user fail\n"); return -1; } break; } case DISP_CMD_LAYER_GET_FRAME_ID: ret = bsp_disp_layer_get_frame_id(ubuffer[0], ubuffer[1]); break; //----lcd---- case DISP_CMD_LCD_ENABLE: ret = drv_lcd_enable(ubuffer[0]); suspend_output_type[ubuffer[0]] = DISP_OUTPUT_TYPE_LCD; break; case DISP_CMD_LCD_DISABLE: ret = drv_lcd_disable(ubuffer[0]); suspend_output_type[ubuffer[0]] = DISP_OUTPUT_TYPE_NONE; break; case DISP_CMD_LCD_SET_BRIGHTNESS: ret = bsp_disp_lcd_set_bright(ubuffer[0], ubuffer[1]); break; case DISP_CMD_LCD_GET_BRIGHTNESS: ret = bsp_disp_lcd_get_bright(ubuffer[0]); break; case DISP_CMD_LCD_BACKLIGHT_ENABLE: if(DISPLAY_NORMAL == suspend_status) { ret = bsp_disp_lcd_backlight_enable(ubuffer[0]); } break; case DISP_CMD_LCD_BACKLIGHT_DISABLE: if(DISPLAY_NORMAL == suspend_status) { ret = bsp_disp_lcd_backlight_disable(ubuffer[0]); } break; #if (defined CONFIG_ARCH_SUN9IW1P1) //----hdmi---- case DISP_CMD_HDMI_ENABLE: ret = bsp_disp_hdmi_enable(ubuffer[0]); suspend_output_type[ubuffer[0]] = DISP_OUTPUT_TYPE_HDMI; break; case DISP_CMD_HDMI_DISABLE: ret = bsp_disp_hdmi_disable(ubuffer[0]); suspend_output_type[ubuffer[0]] = DISP_OUTPUT_TYPE_NONE; break; case DISP_CMD_HDMI_SET_MODE: ret = bsp_disp_hdmi_set_mode(ubuffer[0], ubuffer[1]); break; case DISP_CMD_HDMI_GET_MODE: ret = bsp_disp_hdmi_get_mode(ubuffer[0]); break; case DISP_CMD_HDMI_SUPPORT_MODE: ret = bsp_disp_hdmi_check_support_mode(ubuffer[0], ubuffer[1]); break; case DISP_CMD_HDMI_GET_HPD_STATUS: ret = bsp_disp_hdmi_get_hpd_status(ubuffer[0]); break; #endif #if 0 case DISP_CMD_HDMI_SUPPORT_MODE: ret = bsp_disp_hdmi_check_support_mode(ubuffer[0], ubuffer[1]); break; case DISP_CMD_HDMI_SET_SRC: ret = bsp_disp_hdmi_set_src(ubuffer[0], (disp_lcd_src)ubuffer[1]); break; //----framebuffer---- case DISP_CMD_FB_REQUEST: { disp_fb_create_info para; if(copy_from_user(¶, (void __user *)ubuffer[1],sizeof(disp_fb_create_info))) { __wrn("copy_from_user fail\n"); return -1; } ret = Display_Fb_Request(ubuffer[0], ¶); break; } case DISP_CMD_FB_RELEASE: ret = Display_Fb_Release(ubuffer[0]); break; case DISP_CMD_FB_GET_PARA: { disp_fb_create_info para; ret = Display_Fb_get_para(ubuffer[0], ¶); if(copy_to_user((void __user *)ubuffer[1],¶, sizeof(disp_fb_create_info))) { __wrn("copy_to_user fail\n"); return -1; } break; } case DISP_CMD_GET_DISP_INIT_PARA: { disp_init_para para; ret = Display_get_disp_init_para(¶); if(copy_to_user((void __user *)ubuffer[0],¶, sizeof(disp_init_para))) { __wrn("copy_to_user fail\n"); return -1; } break; } #endif //----enhance---- case DISP_CMD_SET_BRIGHT: ret = bsp_disp_smcl_set_bright(ubuffer[0], ubuffer[1]); break; case DISP_CMD_GET_BRIGHT: ret = bsp_disp_smcl_get_bright(ubuffer[0]); break; case DISP_CMD_SET_CONTRAST: ret = bsp_disp_smcl_set_contrast(ubuffer[0], ubuffer[1]); break; case DISP_CMD_GET_CONTRAST: ret = bsp_disp_smcl_get_contrast(ubuffer[0]); break; case DISP_CMD_SET_SATURATION: ret = bsp_disp_smcl_set_saturation(ubuffer[0], ubuffer[1]); break; case DISP_CMD_GET_SATURATION: ret = bsp_disp_smcl_get_saturation(ubuffer[0]); break; case DISP_CMD_SET_HUE: ret = bsp_disp_smcl_set_hue(ubuffer[0], ubuffer[1]); break; case DISP_CMD_GET_HUE: ret = bsp_disp_smcl_get_hue(ubuffer[0]); break; case DISP_CMD_ENHANCE_ENABLE: ret = bsp_disp_smcl_enable(ubuffer[0]); break; case DISP_CMD_ENHANCE_DISABLE: ret = bsp_disp_smcl_disable(ubuffer[0]); break; case DISP_CMD_GET_ENHANCE_EN: ret = bsp_disp_smcl_is_enabled(ubuffer[0]); break; case DISP_CMD_SET_ENHANCE_MODE: ret = bsp_disp_smcl_set_mode(ubuffer[0], ubuffer[1]); break; case DISP_CMD_GET_ENHANCE_MODE: ret = bsp_disp_smcl_get_mode(ubuffer[0]); break; case DISP_CMD_SET_ENHANCE_WINDOW: { disp_window para; if(copy_from_user(¶, (void*)ubuffer[1],sizeof(disp_window))) { __wrn("copy_from_user fail\n"); return -1; } ret = bsp_disp_smcl_set_window(ubuffer[0], ¶); break; } case DISP_CMD_GET_ENHANCE_WINDOW: { disp_window para; ret = bsp_disp_smcl_get_window(ubuffer[0], ¶); if(copy_to_user((void*)ubuffer[1],¶, sizeof(disp_window))) { __wrn("copy_to_user fail\n"); return -1; } break; } case DISP_CMD_DRC_ENABLE: ret = bsp_disp_smbl_enable(ubuffer[0]); break; case DISP_CMD_DRC_DISABLE: ret = bsp_disp_smbl_disable(ubuffer[0]); break; case DISP_CMD_GET_DRC_EN: ret = bsp_disp_smbl_is_enabled(ubuffer[0]); break; case DISP_CMD_DRC_SET_WINDOW: { disp_window para; if(copy_from_user(¶, (void*)ubuffer[1],sizeof(disp_window))) { __wrn("copy_from_user fail\n"); return -1; } ret = bsp_disp_smbl_set_window(ubuffer[0], ¶); break; } case DISP_CMD_DRC_GET_WINDOW: { disp_window para; ret = bsp_disp_smbl_get_window(ubuffer[0], ¶); if(copy_to_user((void*)ubuffer[1],¶, sizeof(disp_window))) { __wrn("copy_to_user fail\n"); return -1; } break; } #if defined(CONFIG_ARCH_SUN9IW1P1) //---- cursor ---- case DISP_CMD_CURSOR_ENABLE: ret = bsp_disp_cursor_enable(ubuffer[0]); break; case DISP_CMD_CURSOR_DISABLE: ret = bsp_disp_cursor_disable(ubuffer[0]); break; case DISP_CMD_CURSOR_SET_POS: { disp_position para; if(copy_from_user(¶, (void*)ubuffer[1],sizeof(disp_position))) { __wrn("copy_from_user fail\n"); return -1; } ret = bsp_disp_cursor_set_pos(ubuffer[0], ¶); break; } case DISP_CMD_CURSOR_GET_POS: { disp_position para; ret = bsp_disp_cursor_get_pos(ubuffer[0], ¶); if(copy_to_user((void*)ubuffer[1],¶, sizeof(disp_position))) { __wrn("copy_to_user fail\n"); return -1; } break; } case DISP_CMD_CURSOR_SET_FB: { disp_cursor_fb para; if(copy_from_user(¶, (void*)ubuffer[1],sizeof(disp_cursor_fb))) { __wrn("copy_from_user fail\n"); return -1; } ret = bsp_disp_cursor_set_fb(ubuffer[0], ¶); break; } case DISP_CMD_CURSOR_SET_PALETTE: if((ubuffer[1] == 0) || ((int)ubuffer[3] <= 0)) { __wrn("para invalid in display ioctrl DISP_CMD_HWC_SET_PALETTE_TABLE,buffer:0x%x, size:0x%x\n", (unsigned int)ubuffer[1], (unsigned int)ubuffer[3]); return -1; } if(copy_from_user(gbuffer, (void*)ubuffer[1],ubuffer[3])) { __wrn("copy_from_user fail\n"); return -1; } ret = bsp_disp_cursor_set_palette(ubuffer[0], (void*)gbuffer, ubuffer[2], ubuffer[3]); break; #if 0 //----for test---- case DISP_CMD_MEM_REQUEST: ret = disp_mem_request(ubuffer[0],ubuffer[1]); break; case DISP_CMD_MEM_RELEASE: ret = disp_mem_release(ubuffer[0]); break; case DISP_CMD_MEM_SELIDX: g_disp_mm_sel = ubuffer[0]; break; case DISP_CMD_MEM_GETADR: ret = g_disp_mm[ubuffer[0]].mem_start; break; // case DISP_CMD_PRINT_REG: // ret = bsp_disp_print_reg(1, ubuffer[0], 0); // break; #endif #endif case DISP_CMD_SET_EXIT_MODE: ret = g_disp_drv.exit_mode = ubuffer[0]; break; case DISP_CMD_LCD_CHECK_OPEN_FINISH: ret = drv_lcd_check_open_finished(ubuffer[0]); break; case DISP_CMD_LCD_CHECK_CLOSE_FINISH: ret = drv_lcd_check_close_finished(ubuffer[0]); break; #if defined(CONFIG_ARCH_TV) //----for tv ---- case DISP_CMD_TV_ON: #if defined(CONFIG_ARCH_SUN9IW1P1) ret = drv_lcd_enable(ubuffer[0]); suspend_output_type[ubuffer[0]] = DISP_OUTPUT_TYPE_LCD; #endif break; case DISP_CMD_TV_OFF: #if defined(CONFIG_ARCH_SUN9IW1P1) ret = drv_lcd_disable(ubuffer[0]); suspend_output_type[ubuffer[0]] = DISP_OUTPUT_TYPE_NONE; #endif break; case DISP_CMD_TV_GET_MODE: #if defined(CONFIG_ARCH_SUN9IW1P1) ret = bsp_disp_lcd_get_tv_mode(ubuffer[0]); #endif break; case DISP_CMD_TV_SET_MODE: #if defined(CONFIG_ARCH_SUN9IW1P1) ret = bsp_disp_lcd_set_tv_mode(ubuffer[0], ubuffer[1]); #endif break; #endif //#if defined(CONFIG_ARCH_TV) default: break; } return ret; }
long disp_ioctl(void *hd, unsigned int cmd, void *arg) { unsigned long karg[4]; unsigned long ubuffer[4] = {0}; s32 ret = 0; int num_screens = 2; struct disp_manager *mgr = NULL; struct disp_device *dispdev = NULL; struct disp_enhance *enhance = NULL; struct disp_smbl *smbl = NULL; struct disp_capture *cptr = NULL; num_screens = bsp_disp_feat_get_num_screens(); if (copy_from_user((void*)karg,(void*)arg, 4*sizeof(unsigned long))) { __wrn("copy_from_user fail\n"); return -1; } ubuffer[0] = *(unsigned long*)karg; ubuffer[1] = (*(unsigned long*)(karg+1)); ubuffer[2] = (*(unsigned long*)(karg+2)); ubuffer[3] = (*(unsigned long*)(karg+3)); if(ubuffer[0] < num_screens) mgr = g_disp_drv.mgr[ubuffer[0]]; if(mgr) { dispdev = mgr->device; enhance = mgr->enhance; smbl = mgr->smbl; cptr = mgr->cptr; } if(cmd < DISP_FB_REQUEST) { if(ubuffer[0] >= num_screens) { __wrn("para err in disp_ioctl, cmd = 0x%x,screen id = %d\n", cmd, (int)ubuffer[0]); return -1; } } if(DISPLAY_DEEP_SLEEP == suspend_status) { __wrn("ioctl:%x fail when in suspend!\n", cmd); return -1; } if(cmd == disp_cmd_print) { //__wrn("cmd:0x%x,%ld,%ld\n",cmd, ubuffer[0], ubuffer[1]); } switch(cmd) { //----disp global---- case DISP_SET_BKCOLOR: { disp_color para; if(copy_from_user(¶, (void*)ubuffer[1],sizeof(disp_color))) { __wrn("copy_from_user fail\n"); return -1; } if(mgr && (mgr->set_back_color != NULL)) ret = mgr->set_back_color(mgr, ¶); break; } case DISP_GET_OUTPUT_TYPE: { if(mgr && mgr->device) ret = mgr->device->type; break; } case DISP_GET_SCN_WIDTH: { unsigned int width = 0,height = 0; if(mgr && mgr->device && mgr->device->get_resolution) { mgr->device->get_resolution(mgr->device, &width, &height); } ret = width; break; } case DISP_GET_SCN_HEIGHT: { unsigned int width = 0,height = 0; if(mgr && mgr->device && mgr->device->get_resolution) { mgr->device->get_resolution(mgr->device, &width, &height); } ret = height; break; } case DISP_VSYNC_EVENT_EN: { ret = bsp_disp_vsync_event_enable(ubuffer[0], ubuffer[1]); break; } case DISP_SHADOW_PROTECT: { ret = bsp_disp_shadow_protect(ubuffer[0], ubuffer[1]); break; } case DISP_BLANK: { if(ubuffer[1]) { if(dispdev && dispdev->disable) ret = dispdev->disable(dispdev); } else { if(dispdev && dispdev->enable) ret = dispdev->enable(dispdev); } break; } case DISP_DEVICE_SWITCH: { if(ubuffer[1] == (unsigned long)DISP_OUTPUT_TYPE_LCD) ret = drv_lcd_enable(ubuffer[0]); else ret = bsp_disp_device_switch(ubuffer[0], (disp_output_type)ubuffer[1], (disp_tv_mode)ubuffer[2]); break; } //----layer---- case DISP_LAYER_SET_CONFIG: { disp_layer_config para; if(copy_from_user(¶, (void *)ubuffer[1],sizeof(disp_layer_config))) { __wrn("copy_from_user fail\n"); return -1; } if(mgr && mgr->set_layer_config) ret = mgr->set_layer_config(mgr, ¶, ubuffer[2]); break; } case DISP_LAYER_GET_CONFIG: { disp_layer_config para; if(copy_from_user(¶, (void *)ubuffer[1],sizeof(disp_layer_config))) { __wrn("copy_from_user fail\n"); return -1; } if(mgr && mgr->get_layer_config) ret = mgr->get_layer_config(mgr, ¶, ubuffer[2]); if(copy_to_user(¶, (void *)ubuffer[1], sizeof(disp_layer_config))) { __wrn("copy_to_user fail\n"); return -1; } break; } //----lcd---- case DISP_LCD_SET_BRIGHTNESS: { if(dispdev && (DISP_OUTPUT_TYPE_LCD == dispdev->type)) { ret = dispdev->set_bright(dispdev, ubuffer[1]); } break; } case DISP_LCD_GET_BRIGHTNESS: { if(dispdev && (DISP_OUTPUT_TYPE_LCD == dispdev->type)) { ret = dispdev->get_bright(dispdev); } break; } case DISP_HDMI_GET_HPD_STATUS: if(DISPLAY_NORMAL == suspend_status) { ret = bsp_disp_hdmi_get_hpd_status(ubuffer[0]); } else { ret = 0; } break; case DISP_HDMI_SUPPORT_MODE: ret = bsp_disp_hdmi_check_support_mode(ubuffer[0], ubuffer[1]); break; case DISP_TV_GET_HPD_STATUS: if(DISPLAY_NORMAL == suspend_status) { ret = bsp_disp_tv_get_hpd_status(ubuffer[0]); } else { ret = 0; } break; case DISP_HDMI_GET_EDID: { u8 *buf; u32 bytes = 1024; ret = 0; buf = (u8*)bsp_disp_hdmi_get_edid(ubuffer[0]); if(buf) { bytes = (ubuffer[2] > bytes)?bytes:ubuffer[2]; if(copy_to_user(buf, (void *)ubuffer[1], bytes)) { __wrn("copy_to_user fail\n"); } else { ret = bytes; } } break; } #if 0 case DISP_CMD_HDMI_SET_SRC: ret = bsp_disp_hdmi_set_src(ubuffer[0], (disp_lcd_src)ubuffer[1]); break; //----framebuffer---- case DISP_CMD_FB_REQUEST: { disp_fb_create_info para; if(copy_from_user(¶, (void *)ubuffer[1],sizeof(disp_fb_create_info))) { __wrn("copy_from_user fail\n"); return -1; } ret = Display_Fb_Request(ubuffer[0], ¶); break; } case DISP_CMD_FB_RELEASE: ret = Display_Fb_Release(ubuffer[0]); break; case DISP_CMD_FB_GET_PARA: { disp_fb_create_info para; ret = Display_Fb_get_para(ubuffer[0], ¶); if(copy_to_user((void *)ubuffer[1],¶, sizeof(disp_fb_create_info))) { __wrn("copy_to_user fail\n"); return -1; } break; } case DISP_CMD_GET_DISP_INIT_PARA: { disp_init_para para; ret = Display_get_disp_init_para(¶); if(copy_to_user((void *)ubuffer[0],¶, sizeof(disp_init_para))) { __wrn("copy_to_user fail\n"); return -1; } break; } #endif //----enhance---- case DISP_ENHANCE_ENABLE: { if(enhance && enhance->enable) ret = enhance->enable(enhance); break; } case DISP_ENHANCE_DISABLE: { if(enhance && enhance->disable) ret = enhance->disable(enhance); break; } //---smart backlight -- case DISP_SMBL_ENABLE: { if(smbl && smbl->enable) ret = smbl->enable(smbl); break; } case DISP_SMBL_DISABLE: { if(smbl && smbl->disable) ret = smbl->disable(smbl); break; } case DISP_SMBL_SET_WINDOW: { disp_rect rect; if(copy_from_user(&rect, (void *)ubuffer[1],sizeof(disp_rect))) { __wrn("copy_from_user fail\n"); return -1; } if(smbl && smbl->set_window) ret = smbl->set_window(smbl, &rect); break; } //---capture -- case DISP_CAPTURE_START: { if(cptr && cptr->start) ret = cptr->start(cptr); break; } case DISP_CAPTURE_STOP: { if(cptr && cptr->stop) ret = cptr->stop(cptr); break; } case DISP_CAPTURE_COMMIT: { disp_capture_info info; if(copy_from_user(&info, (void *)ubuffer[1],sizeof(disp_capture_info))) { __wrn("copy_from_user fail\n"); return -1; } if(cptr && cptr->commmit) ret = cptr->commmit(cptr, &info); break; } #if defined(CONFIG_ARCH_SUN9IW1P1) #if 0 //----for test---- case DISP_CMD_MEM_REQUEST: ret = disp_mem_request(ubuffer[0],ubuffer[1]); break; case DISP_CMD_MEM_RELEASE: ret = disp_mem_release(ubuffer[0]); break; case DISP_CMD_MEM_SELIDX: g_disp_mm_sel = ubuffer[0]; break; case DISP_CMD_MEM_GETADR: ret = g_disp_mm[ubuffer[0]].mem_start; break; // case DISP_CMD_PRINT_REG: // ret = bsp_disp_print_reg(1, ubuffer[0], 0); // break; #endif #endif case DISP_SET_EXIT_MODE: ret = g_disp_drv.exit_mode = ubuffer[0]; break; case DISP_LCD_CHECK_OPEN_FINISH: ret = drv_lcd_check_open_finished(ubuffer[0]); break; case DISP_LCD_CHECK_CLOSE_FINISH: ret = drv_lcd_check_close_finished(ubuffer[0]); break; default: break; } return ret; }