static int __init mipi_cmd_nt35510_fwvga_init(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; lcd_panel_fwvga = get_lcd_panel_type(); if (MIPI_CMD_NT35510_BOE_FWVGA != lcd_panel_fwvga ) { return 0; } LCD_DEBUG("enter mipi_cmd_nt35510_fwvga_init \n"); mipi_dsi_buf_alloc(&nt35510_fwvga_tx_buf, DSI_BUF_SIZE); mipi_dsi_buf_alloc(&nt35510_fwvga_rx_buf, DSI_BUF_SIZE); ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &nt35510_fwvga_panel_data.panel_info; pinfo->xres = 480; pinfo->yres = 854; pinfo->type = MIPI_CMD_PANEL; pinfo->pdest = DISPLAY_1; pinfo->wait_cycle = 0; pinfo->bpp = 24; pinfo->bl_max = 255; pinfo->bl_min = 30; pinfo->fb_num = 2; /* increase the DSI bit clock to 490 MHz */ pinfo->clk_rate = 490000000; pinfo->lcd.refx100 = 6000; /* adjust refx100 to prevent tearing */ pinfo->mipi.mode = DSI_CMD_MODE; pinfo->mipi.dst_format = DSI_CMD_DST_FORMAT_RGB888; pinfo->mipi.vc = 0; pinfo->mipi.rgb_swap = DSI_RGB_SWAP_RGB; pinfo->mipi.data_lane0 = TRUE; pinfo->mipi.data_lane1 = TRUE; pinfo->mipi.t_clk_post = 0xB0;// min 60 + 128*UI pinfo->mipi.t_clk_pre = 0x2f;// min 8*UI pinfo->mipi.stream = 0; /* dma_p */ pinfo->mipi.mdp_trigger = DSI_CMD_TRIGGER_SW; pinfo->mipi.dma_trigger = DSI_CMD_TRIGGER_SW; pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_enable = TRUE; pinfo->mipi.te_sel = 1; /* TE from vsync gpio */ pinfo->mipi.interleave_max = 1; pinfo->mipi.insert_dcs_cmd = TRUE; pinfo->mipi.wr_mem_continue = 0x3c; pinfo->mipi.wr_mem_start = 0x2c; pinfo->mipi.dsi_phy_db = &dsi_cmd_mode_phy_db_nt35510_fwvga; pinfo->mipi.tx_eot_append = 0x01; pinfo->mipi.rx_eot_ignore = 0; pinfo->mipi.dlane_swap = 0x1; ret = platform_device_register(&this_device); if (ret) LCD_DEBUG("%s: failed to register device!\n", __func__); } return ret; }
static int __init truly_r61529_hvga_panel_init(void) { int ret; struct msm_panel_info *pinfo; /*< DTS2011122306018 fengwei 20111224 begin */ lcd_panel_hvga = get_lcd_panel_type(); /* DTS2011122306018 fengwei 20111224 end >*/ if((LCD_R61529_TRULY_HVGA != lcd_panel_hvga) && \ (msm_fb_detect_client(lCD_DRIVER_NAME)) ) { return 0; } LCD_DEBUG(" lcd_type=%s, lcd_panel_hvga = %d\n", lCD_DRIVER_NAME, lcd_panel_hvga); ret = platform_driver_register(&this_driver); if (ret) return ret; pinfo = &truly_r61529_hvga_panel_data.panel_info; pinfo->xres = 320; pinfo->yres = 480; pinfo->type = LCDC_PANEL; pinfo->pdest = DISPLAY_1; pinfo->wait_cycle = 0; pinfo->bpp = 18; pinfo->fb_num = 2; pinfo->bl_max = LCD_MAX_BACKLIGHT_LEVEL; pinfo->bl_min = LCD_MIN_BACKLIGHT_LEVEL; if(LCD_R61529_TRULY_HVGA== lcd_panel_hvga) { /* changge the frequency high */ pinfo->clk_rate = 9660 * 1000; /*for HVGA pixel clk*/ } else { pinfo->clk_rate = 8192000; /*for HVGA pixel clk*/ } pinfo->lcdc.h_back_porch = 20; pinfo->lcdc.h_front_porch = 40; pinfo->lcdc.h_pulse_width = 10; pinfo->lcdc.v_back_porch = 8; pinfo->lcdc.v_front_porch = 15; pinfo->lcdc.v_pulse_width = 2; pinfo->lcdc.border_clr = 0; /* blk */ pinfo->lcdc.underflow_clr = 0xff; /* blue */ pinfo->lcdc.hsync_skew = 0; ret = platform_device_register(&this_device); if (ret) platform_driver_unregister(&this_driver); return ret; }
static int __init nt35410_hvga_panel_init(void) { int ret; struct msm_panel_info *pinfo; lcd_panel_hvga = get_lcd_panel_type(); if((LCD_NT35410_CHIMEI_HVGA != lcd_panel_hvga) && \ (msm_fb_detect_client(lCD_DRIVER_NAME)) ) { return 0; } LCD_DEBUG(" lcd_type=%s, lcd_panel_hvga = %d\n", lCD_DRIVER_NAME, lcd_panel_hvga); ret = platform_driver_register(&this_driver); if (ret) return ret; pinfo = &nt35410_hvga_panel_data.panel_info; pinfo->xres = 320; pinfo->yres = 480; pinfo->type = LCDC_PANEL; pinfo->pdest = DISPLAY_1; pinfo->wait_cycle = 0; pinfo->bpp = 18; pinfo->fb_num = 2; pinfo->bl_max = LCD_MAX_BACKLIGHT_LEVEL; pinfo->bl_min = LCD_MIN_BACKLIGHT_LEVEL; if(LCD_NT35410_CHIMEI_HVGA == lcd_panel_hvga) { pinfo->clk_rate = 9660 * 1000; /*for HVGA pixel clk*/ } else { pinfo->clk_rate = 8192000; /*for HVGA pixel clk*/ } pinfo->lcdc.h_back_porch = 18; pinfo->lcdc.h_front_porch = 30; pinfo->lcdc.h_pulse_width = 4; pinfo->lcdc.v_back_porch = 3; pinfo->lcdc.v_front_porch = 55; pinfo->lcdc.v_pulse_width = 3; pinfo->lcdc.border_clr = 0; /* blk */ pinfo->lcdc.underflow_clr = 0xff; /* blue */ pinfo->lcdc.hsync_skew = 0; ret = platform_device_register(&this_device); if (ret) platform_driver_unregister(&this_driver); return ret; }
static int __init nt35582_init(void) { int ret; struct msm_panel_info *pinfo; lcd_panel_wvga=get_lcd_panel_type(); if((LCD_NT35582_TRULY_WVGA!=lcd_panel_wvga)&& (LCD_NT35582_BYD_WVGA!=lcd_panel_wvga)) { return 0; } LCD_DEBUG("------nt35582_init------\n"); ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &nt35582_panel_data.panel_info; pinfo->xres = 480; pinfo->yres = 800; pinfo->type = MDDI_PANEL; pinfo->pdest = DISPLAY_1; pinfo->mddi.vdopkt = MDDI_DEFAULT_PRIM_PIX_ATTR; pinfo->wait_cycle = 0; /* Set MDDI clk 192MHz,set 24bit per pixel, * adjust the start of data to sync with vsync signal */ /* change 24bit into 16bit */ pinfo->bpp = 16; pinfo->fb_num = 2; pinfo->clk_rate = 192000000; pinfo->clk_min = 192000000; pinfo->clk_max = 192000000; LCD_DEBUG("%s: BYD LCD and Truly LCD,set MDDI_CLK=%d \n",__func__, pinfo->clk_rate); pinfo->lcd.vsync_enable = TRUE; /* Reduce the fps,sync depend on the vsync signal*/ pinfo->lcd.refx100 = 4000; pinfo->lcd.v_back_porch = 0; pinfo->lcd.v_front_porch = 0; pinfo->lcd.v_pulse_width = 22; pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_notifier_period = 0; pinfo->bl_max = 255; ret = platform_device_register(&this_device); if (ret) { platform_driver_unregister(&this_driver); LCD_DEBUG("%s: Failed on platform_device_register(): rc=%d \n",__func__, ret); } } return ret; }
static int __init hx8347d_qvga_panel_init(void) { int ret; struct msm_panel_info *pinfo; lcd_panel_qvga = get_lcd_panel_type(); if((LCD_HX8347D_CHIMEI_QVGA!= lcd_panel_qvga) && (LCD_HX8347D_TRULY_QVGA!= lcd_panel_qvga) && (msm_fb_detect_client(LCD_DRIVER_NAME)) ) { return 0; } LCD_DEBUG(" lcd_type=%s, lcd_panel_qvga = %d\n", LCD_DRIVER_NAME, lcd_panel_qvga); ret = platform_driver_register(&this_driver); if (ret) return ret; pinfo = &hx8347d_qvga_panel_data.panel_info; pinfo->xres = 240; pinfo->yres = 320; pinfo->type = LCDC_PANEL; pinfo->pdest = DISPLAY_1; pinfo->wait_cycle = 0; pinfo->bpp = 18; pinfo->fb_num = 2; pinfo->bl_max = LCD_MAX_BACKLIGHT_LEVEL; pinfo->bl_min = LCD_MIN_BACKLIGHT_LEVEL; pinfo->clk_rate = 6125000; /*for QVGA pixel clk*/ pinfo->lcdc.h_back_porch = 2; pinfo->lcdc.h_front_porch = 2; pinfo->lcdc.h_pulse_width = 2; pinfo->lcdc.v_back_porch = 2; pinfo->lcdc.v_front_porch = 2; pinfo->lcdc.v_pulse_width = 2; pinfo->lcdc.border_clr = 0; /* blk */ pinfo->lcdc.underflow_clr = 0xff; /* blue */ pinfo->lcdc.hsync_skew = 0; ret = platform_device_register(&this_device); if (ret) platform_driver_unregister(&this_driver); return ret; }
/*=========================================================================== FUNCTION get_lcd_align_type DESCRIPTION This function probe which LCD align type should be used DEPENDENCIES RETURN VALUE None SIDE EFFECTS None ===========================================================================*/ lcd_align_type get_lcd_align_type (void) { lcd_panel_type hw_lcd_panel = LCD_NONE; lcd_align_type lcd_align = LCD_PANEL_ALIGN_LSB; hw_lcd_panel = get_lcd_panel_type(); if ((hw_lcd_panel == LCD_ILI9481DS_TIANMA_HVGA) ||(hw_lcd_panel == LCD_ILI9481D_INNOLUX_HVGA)) { lcd_align = LCD_PANEL_ALIGN_MSB; } else { lcd_align = LCD_PANEL_ALIGN_LSB; } return lcd_align; }
/** \brief Set up LCD panel * @param no parameters * @return 0 on success otherwise error value */ int setup_lcd_panel(void) { u8 lcd_type; int status; char blockname[33]; lcd_type = get_lcd_panel_type(); printk(BIOS_INFO, "LCD: Found panel type %d\n", lcd_type); switch (lcd_type) { case LCD_PANEL_TYPE_10_INCH: strcpy(blockname, "hwinfo10.hex"); break; case LCD_PANEL_TYPE_12_INCH: strcpy(blockname, "hwinfo12.hex"); break; case LCD_PANEL_TYPE_15_INCH: strcpy(blockname, "hwinfo15.hex"); break; case LCD_PANEL_TYPE_19_INCH: strcpy(blockname, "hwinfo19.hex"); break; case LCD_PANEL_TYPE_EDID: strcpy(blockname, "hwinfo.hex"); break; default: printk(BIOS_ERR, "LCD: No supported panel found.\n"); return 1; break; } /* Now that we have the panel type, set up the DP2LVDS converter */ status = ptn3460_init(blockname); if (status) printk(BIOS_ERR, "LCD: Setup PTN with status 0x%x\n", status); else printk(BIOS_INFO, "LCD: Setup PTN with status 0x%x\n", status); return status; }
void pwm_set_backlight(struct msm_fb_data_type *mfd) { lcd_panel_type lcd_panel_wvga = LCD_NONE; lcd_panel_wvga = get_lcd_panel_type(); if ((MIPI_RSP61408_CHIMEI_WVGA == lcd_panel_wvga ) || (MIPI_RSP61408_BYD_WVGA == lcd_panel_wvga ) || (MIPI_RSP61408_TRULY_WVGA == lcd_panel_wvga ) || (MIPI_HX8369A_TIANMA_WVGA == lcd_panel_wvga )) { /* keep duty is 75% of the quondam duty */ mfd->bl_level = mfd->bl_level * 75 / 100; } if (get_hw_lcd_ctrl_bl_type() == CTRL_BL_BY_MSM) { lcd_set_backlight_pwm(mfd->bl_level); } else { cabc_backlight_set(mfd); } return; }
/* FUNCTION get_hw_lcd_interface_type * DEPENDENCIES * get lcd interface type * affect nfc. * RETURN VALUE * lcd interface type:LCD_IS_MIPI or LCD_IS_RGB */ hw_lcd_interface_type get_hw_lcd_interface_type(void) { hw_lcd_interface_type lcd_interface_type; lcd_panel_type hw_lcd_panel = LCD_NONE; hw_lcd_panel = get_lcd_panel_type(); if (machine_is_msm7x30_u8800()) { lcd_interface_type = LCD_IS_MDDI_TYPE1; } /* U8820 board version A is MMDI type1, so config it type1 * Version B and other is MDDI type2, so config it according to LCD */ else if(machine_is_msm7x30_u8820()) { if(HW_VER_SUB_VA == get_hw_sub_board_id()) { lcd_interface_type = LCD_IS_MDDI_TYPE1; } else { switch(hw_lcd_panel) { case LCD_NT35582_BYD_WVGA: case LCD_NT35582_TRULY_WVGA: lcd_interface_type = LCD_IS_MDDI_TYPE1; break; case LCD_NT35510_ALPHA_SI_WVGA: lcd_interface_type = LCD_IS_MDDI_TYPE1; break; case LCD_NT35510_ALPHA_SI_WVGA_TYPE2: lcd_interface_type = LCD_IS_MDDI_TYPE2; break; default: lcd_interface_type = LCD_IS_MDDI_TYPE1; break; } } } else if (machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro()) { switch(hw_lcd_panel) { case LCD_NT35582_BYD_WVGA: case LCD_NT35582_TRULY_WVGA: lcd_interface_type = LCD_IS_MDDI_TYPE1; break; case LCD_NT35510_ALPHA_SI_WVGA: lcd_interface_type = LCD_IS_MDDI_TYPE1; break; case LCD_NT35510_ALPHA_SI_WVGA_TYPE2: lcd_interface_type = LCD_IS_MDDI_TYPE2; break; default: lcd_interface_type = LCD_IS_MDDI_TYPE1; break; } } else if (machine_is_msm8255_u8860() || machine_is_msm8255_c8860() || machine_is_msm8255_u8860lp() || machine_is_msm8255_u8860_r() || machine_is_msm8255_u8860_92() || machine_is_msm8255_u8680() || machine_is_msm8255_u8860_51() || machine_is_msm8255_u8730()) { lcd_interface_type = LCD_IS_MDDI_TYPE2; } else if (machine_is_msm8255_u8667()) { lcd_interface_type = LCD_IS_MDDI_TYPE1; } else if(machine_is_msm7x27a_U8185() ||machine_is_msm7x27a_M660()) { lcd_interface_type = LCD_IS_RGB; } else { lcd_interface_type = LCD_IS_MIPI_CMD; } return lcd_interface_type; }
static int __init nt35510_init_type2(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; bpp_type bpp = MDDI_OUT_16BPP; hw_lcd_interface_type mddi_port_type = get_hw_lcd_interface_type(); lcd_panel_wvga=get_lcd_panel_type(); if(LCD_NT35510_ALPHA_SI_WVGA_TYPE2 != lcd_panel_wvga) { return 0; } LCD_DEBUG("%s:------nt35510_init_type2------\n",__func__); /* Select which bpp accroding MDDI port type */ if(LCD_IS_MDDI_TYPE1 == mddi_port_type) { bpp = MDDI_OUT_16BPP; } else if(LCD_IS_MDDI_TYPE2 == mddi_port_type) { bpp = MDDI_OUT_24BPP; } else { bpp = MDDI_OUT_16BPP; } ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &nt35510_panel_data_type2.panel_info; pinfo->xres = 480; pinfo->yres = 800; pinfo->type = MDDI_PANEL; pinfo->pdest = DISPLAY_1; pinfo->mddi.vdopkt = MDDI_DEFAULT_PRIM_PIX_ATTR; pinfo->wait_cycle = 0; pinfo->bpp = (uint32)bpp; pinfo->fb_num = 2; pinfo->clk_rate = 192000000; pinfo->clk_min = 192000000; pinfo->clk_max = 192000000; pinfo->lcd.vsync_enable = TRUE; pinfo->lcd.refx100 = 6000; pinfo->lcd.v_back_porch = 0; pinfo->lcd.v_front_porch = 0; pinfo->lcd.v_pulse_width = 22; pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_notifier_period = 0; pinfo->bl_max = 255; ret = platform_device_register(&this_device); if (ret) { platform_driver_unregister(&this_driver); } } return ret; }
static int __init hx8357c_init(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; bpp_type bpp = MDDI_OUT_24BPP; hw_lcd_interface_type mddi_port_type = get_hw_lcd_interface_type(); lcd_panel_hvga = get_lcd_panel_type(); if( (MDDI_HX8357C_CHIMEI_HVGA != lcd_panel_hvga) && (MDDI_HX8357C_TIANMA_HVGA != lcd_panel_hvga) && (MDDI_HX8357C_CHIMEI_IPS_HVGA != lcd_panel_hvga)) { return 0; } LCD_DEBUG("%s:start init %s\n",__func__,this_device.name); /* Select which bpp accroding MDDI port type */ if(LCD_IS_MDDI_TYPE1 == mddi_port_type) { bpp = MDDI_OUT_16BPP; } else if(LCD_IS_MDDI_TYPE2 == mddi_port_type) { bpp = MDDI_OUT_24BPP; } else { bpp = MDDI_OUT_16BPP; } ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &hx8357c_panel_data.panel_info; pinfo->xres = 320; pinfo->yres = 480; pinfo->type = MDDI_PANEL; pinfo->pdest = DISPLAY_1; pinfo->mddi.vdopkt = MDDI_DEFAULT_PRIM_PIX_ATTR; pinfo->wait_cycle = 0; /* <DTS2012041903882 sunkai 20120510 begin */ pinfo->bpp = (uint32)18; //24->18. use to change LCD display bit /* DTS2012041903882 sunkai 20120510 end> */ pinfo->fb_num = 2; pinfo->clk_rate = 160000000; pinfo->clk_min = 160000000; pinfo->clk_max = 160000000; pinfo->lcd.vsync_enable = TRUE; pinfo->lcd.refx100 = 6000; pinfo->lcd.v_back_porch = 0; pinfo->lcd.v_front_porch = 0; pinfo->lcd.v_pulse_width = 22; pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_notifier_period = 0; pinfo->bl_max = 255; ret = platform_device_register(&this_device); if (ret) { platform_driver_unregister(&this_driver); } } return ret; }
char *get_lcd_panel_name(void) { lcd_panel_type hw_lcd_panel = LCD_NONE; char *pname = NULL; hw_lcd_panel = get_lcd_panel_type(); switch (hw_lcd_panel) { case LCD_S6D74A0_SAMSUNG_HVGA: pname = "SAMSUNG S6D74A0"; break; case LCD_ILI9325_INNOLUX_QVGA: pname = "INNOLUX ILI9325"; break; case LCD_ILI9325_BYD_QVGA: pname = "BYD ILI9325"; break; case LCD_ILI9325_WINTEK_QVGA: pname = "WINTEK ILI9325"; break; case LCD_SPFD5408B_KGM_QVGA: pname = "KGM SPFD5408B"; break; case LCD_HX8357A_BYD_QVGA: pname = "BYD HX8357A"; break; case LCD_HX8368A_SEIKO_QVGA: pname = "SEIKO HX8368A"; break; case LCD_HX8347D_TRULY_QVGA: pname = "TRULY HX8347D"; break; case LCD_ILI9325C_WINTEK_QVGA: pname = "WINTEK ILI9325C"; break; case LCD_NT35582_BYD_WVGA: pname = "BYD NT35582"; break; case LCD_NT35582_TRULY_WVGA: pname = "TRULY NT35582"; break; case LCD_NT35560_TOSHIBA_FWVGA: pname = "TOSHIBA NT35560"; break; case LCD_NT35510_ALPHA_SI_WVGA: pname = "TRULY NT35510"; break; case LCD_NT35510_ALPHA_SI_WVGA_TYPE2: pname = "SUCCESS NT35510"; break; /*< DTS2012021602342 zhongjinrong 20120224 begin */ case MDDI_RSP61408_CHIMEI_WVGA: pname = "CHIMEI RSP61408"; break; /*< DTS2012021007223 lijianzhao 20120211 begin */ case MDDI_RSP61408_BYD_WVGA: pname = "BYD RSP61408"; break; case MDDI_HX8369A_TIANMA_WVGA: pname = "TIANMA HX8369A"; break; case MDDI_HX8357C_TIANMA_HVGA: pname = "TIANMA HX8357C"; break; case MDDI_HX8357C_CHIMEI_HVGA: pname = "CHIMEI HX8357C"; break; case MDDI_HX8357C_CHIMEI_IPS_HVGA: pname = "CHIMEI IPS HX8357C"; break; /* DTS2012021007223 lijianzhao 20120211 end >*/ /* DTS2012021602342 zhongjinrong 20120224 end >*/ case LCD_HX8368A_TRULY_QVGA: pname = "TRULY HX8368A"; break; case LCD_HX8347D_CHIMEI_QVGA: pname = "CHIMEI HX8347D"; break; case LCD_HX8347G_TIANMA_QVGA: pname = "TIANMA HX8347G"; break; case LCD_HX8357B_TIANMA_HVGA: pname = "TIANMA HX8357B"; break; case LCD_HX8357C_TIANMA_HVGA: pname = "TIANMA HX8357C"; break; case LCD_R61529_TRULY_HVGA: pname = "TRULY R61529"; break; case LCD_ILI9481DS_TIANMA_HVGA: pname = "TIANMA ILI9481"; break; case LCD_ILI9481D_INNOLUX_HVGA: pname = "INNOLUX ILI9481"; break; case LCD_NT35410_CHIMEI_HVGA: pname = "CHIMEI NT35410"; break; case MIPI_RSP61408_CHIMEI_WVGA: pname = "CHIMEI RSP61408"; break; case MIPI_RSP61408_BYD_WVGA: pname = "BYD RSP61408"; break; /* <DTS2012022501992 liguosheng 20120229 begin */ case MIPI_RSP61408_TRULY_WVGA: pname = "TRULY RSP61408"; break; case MIPI_HX8357C_TIANMA_IPS_HVGA: pname = "TIANMA IPS HX8357C"; break; /* DTS2012022501992 liguosheng 20120229 end> */ case MIPI_HX8357C_CHIMEI_HVGA: pname = "CHIMEI HX8357C"; break; case MIPI_HX8357C_TIANMA_HVGA: pname = "TIANMA HX8357C"; break; case MIPI_HX8369A_TIANMA_WVGA: pname = "TIANMA HX8369A"; break; case MIPI_HX8357C_CHIMEI_IPS_HVGA: pname = "CHIMEI IPS HX8357C"; break; /*< DTS2012042605475 zhongjinrong 20120426 begin */ /*< DTS2012022401352 qitongliang 20120224 begin */ case MDDI_HX8357C_TIANMA_IPS_HVGA: pname = "TIANMA IPS HX8357C"; break; /* DTS2012022401352 qitongliang 20120224 end >*/ /* <DTS2012030102766 sunkai 20120301 begin */ case MDDI_RSP61408_TRULY_WVGA: pname = "TRULY RSP61408"; break; /* DTS2012030102766 sunkai 20120301 end> */ /* DTS2012042605475 zhongjinrong 20120426 end >*/ default: pname = "UNKNOWN LCD"; break; } return pname; }
static int __init rsp61408_init(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; bpp_type bpp = MDDI_OUT_24BPP; hw_lcd_interface_type mddi_port_type = get_hw_lcd_interface_type(); lcd_panel_wvga=get_lcd_panel_type(); if((MDDI_RSP61408_CHIMEI_WVGA != lcd_panel_wvga) && (MDDI_RSP61408_BYD_WVGA != lcd_panel_wvga)&& (MDDI_RSP61408_TRULY_WVGA != lcd_panel_wvga)) { return 0; } LCD_DEBUG("%s:start init %s\n",__func__,this_device.name); if(LCD_IS_MDDI_TYPE1 == mddi_port_type) { bpp = MDDI_OUT_16BPP; } else if(LCD_IS_MDDI_TYPE2 == mddi_port_type) { bpp = MDDI_OUT_24BPP; } else { bpp = MDDI_OUT_16BPP; } ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &rsp61408_panel_data.panel_info; pinfo->xres = 480; pinfo->yres = 800; pinfo->type = MDDI_PANEL; pinfo->pdest = DISPLAY_1; pinfo->mddi.vdopkt = MDDI_DEFAULT_PRIM_PIX_ATTR; pinfo->wait_cycle = 0; pinfo->bpp = (uint32)bpp; pinfo->fb_num = 2; pinfo->clk_rate = 192000000; pinfo->clk_min = 192000000; pinfo->clk_max = 192000000; pinfo->lcd.vsync_enable = TRUE; pinfo->lcd.refx100 = 6000; pinfo->lcd.v_back_porch = 0; pinfo->lcd.v_front_porch = 0; pinfo->lcd.v_pulse_width = 22; pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_notifier_period = 0; pinfo->bl_max = 255; ret = platform_device_register(&this_device); if (ret) { platform_driver_unregister(&this_driver); } } return ret; }
char *get_lcd_panel_name(void) { lcd_panel_type hw_lcd_panel = LCD_NONE; char *pname = NULL; hw_lcd_panel = get_lcd_panel_type(); switch (hw_lcd_panel) { case LCD_S6D74A0_SAMSUNG_HVGA: pname = "SAMSUNG S6D74A0"; break; case LCD_ILI9325_INNOLUX_QVGA: pname = "INNOLUX ILI9325"; break; case LCD_ILI9325_BYD_QVGA: pname = "BYD ILI9325"; break; case LCD_ILI9325_WINTEK_QVGA: pname = "WINTEK ILI9325"; break; case LCD_SPFD5408B_KGM_QVGA: pname = "KGM SPFD5408B"; break; case LCD_HX8357A_BYD_QVGA: pname = "BYD HX8357A"; break; case LCD_HX8368A_SEIKO_QVGA: pname = "SEIKO HX8368A"; break; case LCD_HX8347D_TRULY_QVGA: pname = "TRULY HX8347D"; break; case LCD_ILI9325C_WINTEK_QVGA: pname = "WINTEK ILI9325C"; break; case LCD_NT35582_BYD_WVGA: pname = "BYD NT35582"; break; case LCD_NT35582_TRULY_WVGA: pname = "TRULY NT35582"; break; case LCD_NT35560_TOSHIBA_FWVGA: pname = "TOSHIBA NT35560"; break; case LCD_NT35510_ALPHA_SI_WVGA: pname = "TRULY NT35510"; break; case LCD_NT35510_ALPHA_SI_WVGA_TYPE2: pname = "SUCCESS NT35510"; break; case MDDI_RSP61408_CHIMEI_WVGA: pname = "CHIMEI RSP61408"; break; case MDDI_RSP61408_BYD_WVGA: pname = "BYD RSP61408"; break; case MDDI_HX8369A_TIANMA_WVGA: pname = "TIANMA HX8369A"; break; case MDDI_HX8357C_TIANMA_HVGA: pname = "TIANMA HX8357C"; break; case MDDI_HX8357C_CHIMEI_HVGA: pname = "CHIMEI HX8357C"; break; case MDDI_HX8357C_CHIMEI_IPS_HVGA: pname = "CHIMEI IPS HX8357C"; break; case LCD_HX8368A_TRULY_QVGA: pname = "TRULY HX8368A"; break; case LCD_HX8347D_CHIMEI_QVGA: pname = "CHIMEI HX8347D"; break; case LCD_HX8347G_TIANMA_QVGA: pname = "TIANMA HX8347G"; break; case LCD_HX8357B_TIANMA_HVGA: pname = "TIANMA HX8357B"; break; case LCD_HX8357C_TIANMA_HVGA: pname = "TIANMA HX8357C"; break; case LCD_R61529_TRULY_HVGA: pname = "TRULY R61529"; break; case LCD_ILI9481DS_TIANMA_HVGA: pname = "TIANMA ILI9481"; break; case LCD_ILI9481D_INNOLUX_HVGA: pname = "INNOLUX ILI9481"; break; case LCD_NT35410_CHIMEI_HVGA: pname = "CHIMEI NT35410"; break; case MIPI_RSP61408_CHIMEI_WVGA: pname = "CHIMEI RSP61408"; break; case MIPI_RSP61408_BYD_WVGA: pname = "BYD RSP61408"; break; case MIPI_RSP61408_TRULY_WVGA: pname = "TRULY RSP61408"; break; case MIPI_HX8357C_TIANMA_IPS_HVGA: pname = "TIANMA IPS HX8357C"; break; case MIPI_HX8357C_CHIMEI_HVGA: pname = "CHIMEI HX8357C"; break; case MIPI_HX8357C_TIANMA_HVGA: pname = "TIANMA HX8357C"; break; case MIPI_HX8369A_TIANMA_WVGA: pname = "TIANMA HX8369A"; break; case MIPI_HX8357C_CHIMEI_IPS_HVGA: pname = "CHIMEI IPS HX8357C"; break; case MIPI_NT35516_TIANMA_QHD: pname = "TIANMA NT35516"; break; default: pname = "UNKNOWN LCD"; break; } return pname; }
static int __init mipi_video_hx8369b_wvga_init(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; lcd_panel_wvga = get_lcd_panel_type(); if ((MIPI_VIDEO_HX8369B_TIANMA_WVGA!= lcd_panel_wvga )) { return 0; } LCD_DEBUG("enter mipi_video_hx8369b_wvga_init \n"); mipi_dsi_buf_alloc(&hx8369b_tx_buf, DSI_BUF_SIZE); ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &hx8369b_panel_data.panel_info; pinfo->xres = 480; pinfo->yres = 800; pinfo->type = MIPI_VIDEO_PANEL; pinfo->pdest = DISPLAY_1; pinfo->wait_cycle = 0; pinfo->bpp = 24; /*modify setting parameter*/ pinfo->lcdc.h_back_porch = 140; pinfo->lcdc.h_front_porch = 140; pinfo->lcdc.h_pulse_width = 20; pinfo->lcdc.v_back_porch = 21; pinfo->lcdc.v_front_porch = 17; pinfo->lcdc.v_pulse_width = 4; pinfo->lcdc.border_clr = 0; /* blk */ pinfo->lcdc.underflow_clr = 0xff; /* blue */ /* number of dot_clk cycles HSYNC active edge is delayed from VSYNC active edge */ pinfo->lcdc.hsync_skew = 0; pinfo->bl_max = 255; pinfo->bl_min = 30; pinfo->fb_num = 3; pinfo->clk_rate = 460000000; pinfo->mipi.mode = DSI_VIDEO_MODE; pinfo->mipi.pulse_mode_hsa_he = TRUE; /* to false*/ pinfo->mipi.hfp_power_stop = TRUE; /* LP-11 during the HFP period */ pinfo->mipi.hbp_power_stop = TRUE; /* LP-11 during the HBP period */ pinfo->mipi.hsa_power_stop = TRUE; /* LP-11 during the HSA period */ /* LP-11 or let Command Mode Engine send packets in HS or LP mode for the BLLP of the last line of a frame */ pinfo->mipi.eof_bllp_power_stop = TRUE; /* LP-11 or let Command Mode Engine send packets in HS or LP mode for packets sent during BLLP period */ pinfo->mipi.bllp_power_stop = TRUE; pinfo->mipi.traffic_mode = DSI_BURST_MODE; pinfo->mipi.dst_format = DSI_VIDEO_DST_FORMAT_RGB888; pinfo->mipi.vc = 0; pinfo->mipi.rgb_swap = DSI_RGB_SWAP_RGB; pinfo->mipi.data_lane0 = TRUE; pinfo->mipi.data_lane1 = TRUE; pinfo->mipi.t_clk_post = 0xB0; pinfo->mipi.t_clk_pre = 0x2f; pinfo->mipi.stream = 0; /* dma_p */ pinfo->mipi.mdp_trigger = DSI_CMD_TRIGGER_SW; pinfo->mipi.dma_trigger = DSI_CMD_TRIGGER_SW; pinfo->mipi.frame_rate = 60; /* FIXME */ pinfo->mipi.dsi_phy_db = &dsi_video_mode_phy_db; pinfo->mipi.tx_eot_append = 0x01; pinfo->mipi.dlane_swap = 0x1; ret = platform_device_register(&this_device); if (ret) LCD_DEBUG("%s: failed to register device!\n", __func__); } return ret; }
int mdp_lcdc_on(struct platform_device *pdev) { int lcdc_width; int lcdc_height; int lcdc_bpp; int lcdc_border_clr; int lcdc_underflow_clr; int lcdc_hsync_skew; int hsync_period; int hsync_ctrl; int vsync_period; int display_hctl; int display_v_start; int display_v_end; int active_hctl; int active_h_start; int active_h_end; int active_v_start; int active_v_end; int ctrl_polarity; int h_back_porch; int h_front_porch; int v_back_porch; int v_front_porch; int hsync_pulse_width; int vsync_pulse_width; int hsync_polarity; int vsync_polarity; int data_en_polarity; int hsync_start_x; int hsync_end_x; uint8 *buf; int bpp; uint32 dma2_cfg_reg; struct fb_info *fbi; struct fb_var_screeninfo *var; struct msm_fb_data_type *mfd; uint32 dma_base; uint32 timer_base = LCDC_BASE; uint32 block = MDP_DMA2_BLOCK; int ret; uint32_t mask, curr; #ifdef CONFIG_HUAWEI_KERNEL lcd_panel_type lcdtype = LCD_NONE; lcd_align_type lcd_align = LCD_PANEL_ALIGN_LSB; #endif mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev); if (!mfd) return -ENODEV; if (mfd->key != MFD_KEY) return -EINVAL; fbi = mfd->fbi; var = &fbi->var; vsync_cntrl.dev = mfd->fbi->dev; atomic_set(&vsync_cntrl.suspend, 0); /* MDP cmd block enable */ mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE); bpp = fbi->var.bits_per_pixel / 8; buf = (uint8 *) fbi->fix.smem_start; buf += calc_fb_offset(mfd, fbi, bpp); #ifdef CONFIG_HUAWEI_KERNEL lcd_align = get_lcd_align_type(); if(lcd_align == LCD_PANEL_ALIGN_MSB) { dma2_cfg_reg = DMA_PACK_ALIGN_MSB| DMA_OUT_SEL_LCDC; } else { dma2_cfg_reg = DMA_PACK_ALIGN_LSB | DMA_OUT_SEL_LCDC; } #else dma2_cfg_reg = DMA_PACK_ALIGN_LSB | DMA_OUT_SEL_LCDC; #endif if (mfd->fb_imgType == MDP_BGR_565) dma2_cfg_reg |= DMA_PACK_PATTERN_BGR; else if (mfd->fb_imgType == MDP_RGBA_8888) dma2_cfg_reg |= DMA_PACK_PATTERN_BGR; else dma2_cfg_reg |= DMA_PACK_PATTERN_RGB; if (bpp == 2) dma2_cfg_reg |= DMA_IBUF_FORMAT_RGB565; else if (bpp == 3) dma2_cfg_reg |= DMA_IBUF_FORMAT_RGB888; else dma2_cfg_reg |= DMA_IBUF_FORMAT_xRGB8888_OR_ARGB8888; switch (mfd->panel_info.bpp) { case 24: dma2_cfg_reg |= DMA_DSTC0G_8BITS | DMA_DSTC1B_8BITS | DMA_DSTC2R_8BITS; break; case 18: dma2_cfg_reg |= DMA_DSTC0G_6BITS | DMA_DSTC1B_6BITS | DMA_DSTC2R_6BITS; break; case 16: dma2_cfg_reg |= DMA_DSTC0G_6BITS | DMA_DSTC1B_5BITS | DMA_DSTC2R_5BITS; break; default: printk(KERN_ERR "mdp lcdc can't support format %d bpp!\n", mfd->panel_info.bpp); return -ENODEV; } /* DMA register config */ dma_base = DMA_P_BASE; #ifdef CONFIG_FB_MSM_MDP40 if (mfd->panel.type == HDMI_PANEL) dma_base = DMA_E_BASE; #endif /* starting address */ MDP_OUTP(MDP_BASE + dma_base + 0x8, (uint32) buf); /* active window width and height */ MDP_OUTP(MDP_BASE + dma_base + 0x4, ((fbi->var.yres) << 16) | (fbi->var.xres)); /* buffer ystride */ MDP_OUTP(MDP_BASE + dma_base + 0xc, fbi->fix.line_length); /* x/y coordinate = always 0 for lcdc */ MDP_OUTP(MDP_BASE + dma_base + 0x10, 0); /* dma config */ curr = inpdw(MDP_BASE + DMA_P_BASE); mask = 0x0FFFFFFF; dma2_cfg_reg = (dma2_cfg_reg & mask) | (curr & ~mask); MDP_OUTP(MDP_BASE + dma_base, dma2_cfg_reg); /* * LCDC timing setting */ h_back_porch = var->left_margin; h_front_porch = var->right_margin; v_back_porch = var->upper_margin; v_front_porch = var->lower_margin; hsync_pulse_width = var->hsync_len; vsync_pulse_width = var->vsync_len; lcdc_border_clr = mfd->panel_info.lcdc.border_clr; lcdc_underflow_clr = mfd->panel_info.lcdc.underflow_clr; lcdc_hsync_skew = mfd->panel_info.lcdc.hsync_skew; lcdc_width = mfd->panel_info.xres; lcdc_height = mfd->panel_info.yres; lcdc_bpp = mfd->panel_info.bpp; hsync_period = hsync_pulse_width + h_back_porch + lcdc_width + h_front_porch; hsync_ctrl = (hsync_period << 16) | hsync_pulse_width; hsync_start_x = hsync_pulse_width + h_back_porch; hsync_end_x = hsync_period - h_front_porch - 1; display_hctl = (hsync_end_x << 16) | hsync_start_x; vsync_period = (vsync_pulse_width + v_back_porch + lcdc_height + v_front_porch) * hsync_period; display_v_start = (vsync_pulse_width + v_back_porch) * hsync_period + lcdc_hsync_skew; display_v_end = vsync_period - (v_front_porch * hsync_period) + lcdc_hsync_skew - 1; if (lcdc_width != var->xres) { active_h_start = hsync_start_x + first_pixel_start_x; active_h_end = active_h_start + var->xres - 1; active_hctl = ACTIVE_START_X_EN | (active_h_end << 16) | active_h_start; } else { active_hctl = 0; } if (lcdc_height != var->yres) { active_v_start = display_v_start + first_pixel_start_y * hsync_period; active_v_end = active_v_start + (var->yres) * hsync_period - 1; active_v_start |= ACTIVE_START_Y_EN; } else { active_v_start = 0; active_v_end = 0; } #ifdef CONFIG_FB_MSM_MDP40 if (mfd->panel.type == HDMI_PANEL) { block = MDP_DMA_E_BLOCK; timer_base = DTV_BASE; hsync_polarity = 0; vsync_polarity = 0; } else { hsync_polarity = 1; vsync_polarity = 1; } lcdc_underflow_clr |= 0x80000000; /* enable recovery */ #else hsync_polarity = 0; vsync_polarity = 0; #endif data_en_polarity = 0; ctrl_polarity = (data_en_polarity << 2) | (vsync_polarity << 1) | (hsync_polarity); if (!(mfd->cont_splash_done)) { mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); MDP_OUTP(MDP_BASE + timer_base, 0); } MDP_OUTP(MDP_BASE + timer_base + 0x4, hsync_ctrl); MDP_OUTP(MDP_BASE + timer_base + 0x8, vsync_period); MDP_OUTP(MDP_BASE + timer_base + 0xc, vsync_pulse_width * hsync_period); if (timer_base == LCDC_BASE) { MDP_OUTP(MDP_BASE + timer_base + 0x10, display_hctl); MDP_OUTP(MDP_BASE + timer_base + 0x14, display_v_start); MDP_OUTP(MDP_BASE + timer_base + 0x18, display_v_end); MDP_OUTP(MDP_BASE + timer_base + 0x28, lcdc_border_clr); MDP_OUTP(MDP_BASE + timer_base + 0x2c, lcdc_underflow_clr); MDP_OUTP(MDP_BASE + timer_base + 0x30, lcdc_hsync_skew); MDP_OUTP(MDP_BASE + timer_base + 0x38, ctrl_polarity); MDP_OUTP(MDP_BASE + timer_base + 0x1c, active_hctl); MDP_OUTP(MDP_BASE + timer_base + 0x20, active_v_start); MDP_OUTP(MDP_BASE + timer_base + 0x24, active_v_end); } else { MDP_OUTP(MDP_BASE + timer_base + 0x18, display_hctl); MDP_OUTP(MDP_BASE + timer_base + 0x1c, display_v_start); MDP_OUTP(MDP_BASE + timer_base + 0x20, display_v_end); MDP_OUTP(MDP_BASE + timer_base + 0x40, lcdc_border_clr); MDP_OUTP(MDP_BASE + timer_base + 0x44, lcdc_underflow_clr); MDP_OUTP(MDP_BASE + timer_base + 0x48, lcdc_hsync_skew); MDP_OUTP(MDP_BASE + timer_base + 0x50, ctrl_polarity); MDP_OUTP(MDP_BASE + timer_base + 0x2c, active_hctl); MDP_OUTP(MDP_BASE + timer_base + 0x30, active_v_start); MDP_OUTP(MDP_BASE + timer_base + 0x38, active_v_end); } #ifdef CONFIG_HUAWEI_KERNEL ret = 0; lcdtype = get_lcd_panel_type(); if( (LCD_HX8357C_TIANMA_HVGA != lcdtype )&&(LCD_HX8357B_TIANMA_HVGA != lcdtype )) { ret = panel_next_on(pdev); } #else ret = panel_next_on(pdev); #endif if (ret == 0) { /* enable LCDC block */ MDP_OUTP(MDP_BASE + timer_base, 1); mdp_pipe_ctrl(block, MDP_BLOCK_POWER_ON, FALSE); } /* MDP cmd block disable */ mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE); #ifdef CONFIG_HUAWEI_KERNEL /*need to send 2 frame pclk data before sending sleep out command*/ if( (LCD_HX8357C_TIANMA_HVGA == lcdtype )||(LCD_HX8357B_TIANMA_HVGA == lcdtype )) { msleep(50); ret = panel_next_on(pdev); } #endif /* delete some line */ if (!vsync_cntrl.sysfs_created) { ret = sysfs_create_group(&vsync_cntrl.dev->kobj, &vsync_fs_attr_group); if (ret) { pr_err("%s: sysfs creation failed, ret=%d\n", __func__, ret); return ret; } kobject_uevent(&vsync_cntrl.dev->kobj, KOBJ_ADD); pr_debug("%s: kobject_uevent(KOBJ_ADD)\n", __func__); vsync_cntrl.sysfs_created = 1; } return ret; }
static int __init hx8369a_init(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; bpp_type bpp = MDDI_OUT_16BPP; hw_lcd_interface_type mddi_port_type = get_hw_lcd_interface_type(); lcd_panel_wvga=get_lcd_panel_type(); /*< DTS2012021602342 zhongjinrong 20120224 begin */ if(MDDI_HX8369A_TIANMA_WVGA != lcd_panel_wvga) /* DTS2012021602342 zhongjinrong 20120224 end >*/ { return 0; } LCD_DEBUG("%s:start init %s\n",__func__,this_device.name); /* Select which bpp accroding MDDI port type */ if(LCD_IS_MDDI_TYPE1 == mddi_port_type) { bpp = MDDI_OUT_16BPP; } else if(LCD_IS_MDDI_TYPE2 == mddi_port_type) { bpp = MDDI_OUT_24BPP; } else { bpp = MDDI_OUT_16BPP; } ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &hx8369a_panel_data.panel_info; pinfo->xres = 480; pinfo->yres = 800; pinfo->type = MDDI_PANEL; pinfo->pdest = DISPLAY_1; pinfo->mddi.vdopkt = MDDI_DEFAULT_PRIM_PIX_ATTR; pinfo->wait_cycle = 0; pinfo->bpp = (uint32)bpp; pinfo->fb_num = 2; pinfo->clk_rate = 192000000; pinfo->clk_min = 192000000; pinfo->clk_max = 192000000; pinfo->lcd.vsync_enable = TRUE; pinfo->lcd.refx100 = 6000; pinfo->lcd.v_back_porch = 0; pinfo->lcd.v_front_porch = 0; pinfo->lcd.v_pulse_width = 22; pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_notifier_period = 0; pinfo->bl_max = 255; ret = platform_device_register(&this_device); if (ret) { platform_driver_unregister(&this_driver); LCD_DEBUG("%s: Failed on platform_device_register(): rc=%d \n",__func__, ret); } } return ret; }
static int __init mipi_cmd_hx8357c_hvga_init(void) { int ret = 0; struct msm_panel_info *pinfo = NULL; lcd_panel_hvga = get_lcd_panel_type(); if ((MIPI_HX8357C_CHIMEI_HVGA != lcd_panel_hvga ) && (MIPI_HX8357C_CHIMEI_IPS_HVGA != lcd_panel_hvga ) && (MIPI_HX8357C_TIANMA_HVGA != lcd_panel_hvga ) && (MIPI_HX8357C_TIANMA_IPS_HVGA != lcd_panel_hvga)) { return 0; } pr_info("enter mipi_cmd_hx8357c_hvga_init \n"); mipi_dsi_buf_alloc(&hx8357c_tx_buf, DSI_BUF_SIZE); ret = platform_driver_register(&this_driver); if (!ret) { pinfo = &hx8357c_panel_data.panel_info; pinfo->xres = 320; pinfo->yres = 480; pinfo->type = MIPI_CMD_PANEL; pinfo->pdest = DISPLAY_1; pinfo->wait_cycle = 0; pinfo->bpp = 24; pinfo->bl_max = 255; pinfo->bl_min = 30; pinfo->fb_num = 2; pinfo->clk_rate = 250000000;/* 60fps */ pinfo->lcd.refx100 = 6000; /* adjust refx100 to prevent tearing */ pinfo->mipi.mode = DSI_CMD_MODE; pinfo->mipi.dst_format = DSI_CMD_DST_FORMAT_RGB888; pinfo->mipi.vc = 0; pinfo->mipi.rgb_swap = DSI_RGB_SWAP_RGB; pinfo->mipi.data_lane0 = TRUE; pinfo->mipi.t_clk_post = 0x7f; pinfo->mipi.t_clk_pre = 0x2f; pinfo->mipi.stream = 0; /* dma_p */ pinfo->mipi.mdp_trigger = DSI_CMD_TRIGGER_SW; pinfo->mipi.dma_trigger = DSI_CMD_TRIGGER_SW; /*set hw te sync*/ pinfo->lcd.hw_vsync_mode = TRUE; pinfo->lcd.vsync_enable = TRUE; pinfo->mipi.te_sel = 1; /* TE from vsync gpio */ pinfo->mipi.interleave_max = 1; pinfo->mipi.insert_dcs_cmd = TRUE; pinfo->mipi.wr_mem_continue = 0x3c; pinfo->mipi.wr_mem_start = 0x2c; pinfo->mipi.dsi_phy_db = &dsi_cmd_mode_phy_db; pinfo->mipi.tx_eot_append = 0x01; pinfo->mipi.rx_eot_ignore = 0; pinfo->mipi.dlane_swap = 0x1; ret = platform_device_register(&this_device); if (ret) pr_err("%s: failed to register device!\n", __func__); } return ret; }
int backlight_pwm_gpio_config(void) { int rc; struct pm_gpio backlight_drv = { .direction = PM_GPIO_DIR_OUT, .output_buffer = PM_GPIO_OUT_BUF_CMOS, .output_value = 0, .pull = PM_GPIO_PULL_NO, .vin_sel = 0, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_2, .inv_int_pol = 1, }; /* U8800 use PM_GPIO25 as backlight's PWM,but U8820 use PM_GPIO26 */ if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro() || machine_is_msm8255_u8860() || machine_is_msm8255_c8860() || machine_is_msm8255_u8860lp() || machine_is_msm8255_u8860_r() || machine_is_msm8255_u8860_92() || machine_is_msm8255_u8680() || machine_is_msm8255_u8667() || machine_is_msm8255_u8860_51() || machine_is_msm8255_u8730()) { rc = pm8xxx_gpio_config( 24, &backlight_drv); } else if(machine_is_msm7x30_u8820()) { rc = pm8xxx_gpio_config( 25, &backlight_drv); } else { rc = -1; } if (rc) { pr_err("%s LCD backlight GPIO config failed\n", __func__); return rc; } return 0; } /* use the mmp pin like three-leds */ void msm_backlight_set(int level) { static uint8 last_level = 0; /*fix bug in new base-line 1025*/ #ifdef CONFIG_ARCH_MSM7X30 static boolean first_set_bl = TRUE; static struct pwm_device *bl_pwm; #endif //CONFIG_ARCH_MSM7X30 /* keep duty 10% < level < 100% */ #ifdef CONFIG_ARCH_MSM7X27A if(level) { #ifdef CONFIG_HUAWEI_OLD_BACKLIGHT level = ((level * PWM_LEVEL_ADJUST_LPG) / PWM_LEVEL ); if (level < BL_MIN_LEVEL_LPG) { level = BL_MIN_LEVEL_LPG; } #else if (level < BL_MIN_LEVEL) { level = BL_MIN_LEVEL; } #endif } if (last_level == level) { return ; } last_level = level; pmapp_disp_backlight_set_brightness(last_level); #endif #ifdef CONFIG_ARCH_MSM7X30 if(TRUE == first_set_bl) { backlight_pwm_gpio_config(); /* U8800 use PM_GPIO25 as backlight's PWM,but U8820 use PM_GPIO26 */ if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro() || machine_is_msm8255_u8860() || machine_is_msm8255_c8860() || machine_is_msm8255_u8860lp() || machine_is_msm8255_u8860_r() || machine_is_msm8255_u8860_92() || machine_is_msm8255_u8680() || machine_is_msm8255_u8667() || machine_is_msm8255_u8860_51() || machine_is_msm8255_u8730()) { bl_pwm = pwm_request(PM_GPIO25_PWM_ID, "backlight"); } else if(machine_is_msm7x30_u8820()) { bl_pwm = pwm_request(PM_GPIO26_PWM_ID, "backlight"); } else { bl_pwm = NULL; } if (NULL == bl_pwm || IS_ERR(bl_pwm)) { pr_err("%s: pwm_request() failed\n", __func__); bl_pwm = NULL; } first_set_bl = FALSE; } if (bl_pwm) { if(level) { level = ((level * PWM_LEVEL_ADJUST) / PWM_LEVEL + ADD_VALUE); if (level < BL_MIN_LEVEL) { level = BL_MIN_LEVEL; } } if (last_level == level) { return ; } last_level = level; pwm_config(bl_pwm, PWM_DUTY_LEVEL*level/NSEC_PER_USEC, PWM_PERIOD/NSEC_PER_USEC); pwm_enable(bl_pwm); } #endif } void cabc_backlight_set(struct msm_fb_data_type * mfd) { struct msm_fb_panel_data *pdata = NULL; uint32 bl_level = mfd->bl_level; /* keep duty 10% < level < 100% */ if (bl_level) { /****delete one line codes for backlight*****/ if (bl_level < BL_MIN_LEVEL) { bl_level = BL_MIN_LEVEL; } } /* backlight ctrl by LCD-self, like as CABC */ pdata = (struct msm_fb_panel_data *)mfd->pdev->dev.platform_data; if ((pdata) && (pdata->set_cabc_brightness)) { pdata->set_cabc_brightness(mfd,bl_level); } } void pwm_set_backlight(struct msm_fb_data_type *mfd) { #ifdef CONFIG_HUAWEI_OLD_BACKLIGHT lcd_panel_type lcd_panel_wvga = LCD_NONE; #endif /*When all the device are resume that can turn the light*/ if(atomic_read(&suspend_flag)) { mfd_local = mfd; backlight_set = TRUE; return; } #ifdef CONFIG_HUAWEI_OLD_BACKLIGHT lcd_panel_wvga = get_lcd_panel_type(); if ((MIPI_CMD_RSP61408_CHIMEI_WVGA == lcd_panel_wvga ) || (MIPI_CMD_RSP61408_BYD_WVGA == lcd_panel_wvga ) || (MIPI_CMD_RSP61408_TRULY_WVGA == lcd_panel_wvga ) || (MIPI_CMD_HX8369A_TIANMA_WVGA == lcd_panel_wvga )) { /* keep duty is 75% of the quondam duty */ mfd->bl_level = mfd->bl_level * 75 / 100; } #endif if (get_hw_lcd_ctrl_bl_type() == CTRL_BL_BY_MSM) { msm_backlight_set(mfd->bl_level); } else { cabc_backlight_set(mfd); } return; }
int backlight_pwm_gpio_config(void) { int rc; struct pm_gpio backlight_drv = { .direction = PM_GPIO_DIR_OUT, .output_buffer = PM_GPIO_OUT_BUF_CMOS, .output_value = 0, .pull = PM_GPIO_PULL_NO, .vin_sel = 0, .out_strength = PM_GPIO_STRENGTH_HIGH, .function = PM_GPIO_FUNC_2, .inv_int_pol = 1, }; /* U8800 use PM_GPIO25 as backlight's PWM,but U8820 use PM_GPIO26 */ /* < DTS2011102401822 liwei 20111024 begin */ if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro() || machine_is_msm8255_u8860() || machine_is_msm8255_c8860() || machine_is_msm8255_u8860lp() /* < DTS2012022905490 ganfan 20120301 begin */ || machine_is_msm8255_u8860_r() /* DTS2012022905490 ganfan 20120301 end > */ || machine_is_msm8255_u8860_92() || machine_is_msm8255_u8680() || machine_is_msm8255_u8667() || machine_is_msm8255_u8860_51() || machine_is_msm8255_u8730()) /* DTS2011102401822 liwei 20111024 end > */ /*< DTS2012051704510 houming 20120517 begin */ /* renew config the gpio value */ { rc = pm8xxx_gpio_config( PM8058_GPIO_PM_TO_SYS(24), &backlight_drv); } else if(machine_is_msm7x30_u8820()) { rc = pm8xxx_gpio_config( PM8058_GPIO_PM_TO_SYS(25), &backlight_drv); } /* DTS2012051704510 houming 20120517 end >*/ else { rc = -1; } if (rc) { pr_err("%s LCD backlight GPIO config failed\n", __func__); return rc; } return 0; } /* use the mmp pin like three-leds */ /*< DTS2012012101194 lijianzhao 20120121 begin */ void msm_backlight_set(int level) { static uint8 last_level = 0; static boolean first_set_bl = TRUE; /*< DTS2012042605475 zhongjinrong 20120426 begin */ /*< DTS2012032101654 liweiwu 20120321 begin */ /* keep duty 10% < level < 100% */ /* DTS2012032101654 liweiwu 20120321 end >*/ /* DTS2012042605475 zhongjinrong 20120426 end >*/ /*< DTS2012021602342 zhongjinrong 20120224 begin */ #ifdef CONFIG_ARCH_MSM7X27A /* DTS2012021602342 zhongjinrong 20120224 end >*/ if(level) { level = ((level * PWM_LEVEL_ADJUST_LPG) / PWM_LEVEL ); if (level < BL_MIN_LEVEL_LPG) { level = BL_MIN_LEVEL_LPG; } } if (last_level == level) { return ; } last_level = level; pmapp_disp_backlight_set_brightness(last_level); #endif #ifdef CONFIG_ARCH_MSM7X30 if(TRUE == first_set_bl) { backlight_pwm_gpio_config(); /* U8800 use PM_GPIO25 as backlight's PWM,but U8820 use PM_GPIO26 */ /* < DTS2011102401822 liwei 20111024 begin */ if(machine_is_msm7x30_u8800() || machine_is_msm7x30_u8800_51() || machine_is_msm8255_u8800_pro() || machine_is_msm8255_u8860() || machine_is_msm8255_c8860() || machine_is_msm8255_u8860lp() /* < DTS2012022905490 ganfan 20120301 begin */ || machine_is_msm8255_u8860_r() /* DTS2012022905490 ganfan 20120301 end > */ || machine_is_msm8255_u8860_92() || machine_is_msm8255_u8680() || machine_is_msm8255_u8667() || machine_is_msm8255_u8860_51() || machine_is_msm8255_u8730()) /* DTS2011102401822 liwei 20111024 end > */ { bl_pwm = pwm_request(PM_GPIO25_PWM_ID, "backlight"); } else if(machine_is_msm7x30_u8820()) { bl_pwm = pwm_request(PM_GPIO26_PWM_ID, "backlight"); } else { bl_pwm = NULL; } if (NULL == bl_pwm || IS_ERR(bl_pwm)) { pr_err("%s: pwm_request() failed\n", __func__); bl_pwm = NULL; } first_set_bl = FALSE; } if (bl_pwm) { if(level) { level = ((level * PWM_LEVEL_ADJUST) / PWM_LEVEL + ADD_VALUE); if (level < BL_MIN_LEVEL) { level = BL_MIN_LEVEL; } } if (last_level == level) { return ; } last_level = level; pwm_config(bl_pwm, PWM_DUTY_LEVEL*level/NSEC_PER_USEC, PWM_PERIOD/NSEC_PER_USEC); pwm_enable(bl_pwm); } #endif } /* DTS2012012101194 lijianzhao 20120121 end >*/ void cabc_backlight_set(struct msm_fb_data_type * mfd) { struct msm_fb_panel_data *pdata = NULL; uint32 bl_level = mfd->bl_level; /*< DTS2012042605475 zhongjinrong 20120426 begin */ /*< DTS2012032101654 liweiwu 20120321 begin */ /* keep duty 10% < level < 100% */ /* DTS2012032101654 liweiwu 20120321 end >*/ if (bl_level) { /*< DTS2012032101654 liweiwu 20120321 begin */ /****delete one line codes for backlight*****/ /* DTS2012032101654 liweiwu 20120321 end >*/ /* DTS2012042605475 zhongjinrong 20120426 end >*/ if (bl_level < BL_MIN_LEVEL) { bl_level = BL_MIN_LEVEL; } } /* backlight ctrl by LCD-self, like as CABC */ /*< DTS2012012101194 lijianzhao 20120121 begin */ pdata = (struct msm_fb_panel_data *)mfd->pdev->dev.platform_data; if ((pdata) && (pdata->set_cabc_brightness)) { pdata->set_cabc_brightness(mfd,bl_level); } /* DTS2012012101194 lijianzhao 20120121 end >*/ } /*< DTS2012022408079 zhongjinrong 20120306 begin */ void pwm_set_backlight(struct msm_fb_data_type *mfd) { lcd_panel_type lcd_panel_wvga = LCD_NONE; /*< DTS2011122704239 liuyuntao 20111229 begin */ /*When all the device are resume that can turn the light*/ if(atomic_read(&suspend_flag)) { mfd_local = mfd; backlight_set = TRUE; return; } /* DTS2011122704239 liuyuntao 20111229 end >*/ /*< DTS2012021601331 duanfei 20120216 begin */ /*< DTS2012021602342 zhongjinrong 20120224 begin */ #ifdef CONFIG_ARCH_MSM7X27A /* DTS2012021602342 zhongjinrong 20120224 end >*/ lcd_panel_wvga = get_lcd_panel_type(); /* <DTS2012022501992 liguosheng 20120229 begin */ if ((MIPI_RSP61408_CHIMEI_WVGA == lcd_panel_wvga ) || (MIPI_RSP61408_BYD_WVGA == lcd_panel_wvga ) || (MIPI_RSP61408_TRULY_WVGA == lcd_panel_wvga ) || (MIPI_HX8369A_TIANMA_WVGA == lcd_panel_wvga )) { /* keep duty is 75% of the quondam duty */ mfd->bl_level = mfd->bl_level * 75 / 100; } /* DTS2012022501992 liguosheng 20120229 end> */ #endif /* DTS2012021601331 duanfei 20120216 end >*/ if (get_hw_lcd_ctrl_bl_type() == CTRL_BL_BY_MSM) { msm_backlight_set(mfd->bl_level); } else { cabc_backlight_set(mfd); } return; }