2 * Copyright (C) 2012 Spreadtrum Communications Inc.
8 #include <asm/arch/sprd_lcd.h>
9 #include <asm/arch/dispc_reg.h>
13 extern struct panel_if_ctrl sprdfb_mcu_ctrl;
14 extern struct panel_if_ctrl sprdfb_rgb_ctrl;
15 extern struct panel_if_ctrl sprdfb_mipi_ctrl;
17 extern struct panel_spec lcd_s6e8aa5x01_mipi_spec;
18 extern struct panel_spec lcd_s6e88oa_mipi_spec;
19 extern struct panel_spec lcd_nt35510_mipi_spec;
20 extern struct panel_spec lcd_nt35516_mipi_spec;
21 extern struct panel_spec lcd_nt35516_mcu_spec;
22 extern struct panel_spec lcd_nt35516_rgb_spi_spec;
23 extern struct panel_spec lcd_otm8018b_mipi_spec;
24 extern struct panel_spec lcd_hx8363_mcu_spec;
25 extern struct panel_spec lcd_panel_hx8363_rgb_spi_spec;
26 extern struct panel_spec lcd_panel_hx8363_rgb_spi_spec_viva;
27 extern struct panel_spec lcd_s6d0139_spec;
28 extern struct panel_spec lcd_otm1283a_mipi_spec;
29 extern struct panel_spec lcd_ssd2075_mipi_spec;
30 extern struct panel_spec lcd_panel_st7789v;
31 extern struct panel_spec lcd_panel_sc7798_rgb_spi;
32 extern struct panel_spec lcd_hx8369b_mipi_spec;
33 extern struct panel_spec lcd_sd7798d_mipi_spec;
34 extern struct panel_spec lcd_nt35502_mipi_spec;
35 extern struct panel_spec lcd_panel_ili9341;
36 extern struct panel_spec lcd_panel_ili9486;
37 extern struct panel_spec lcd_panel_ili9486_rgb_spi;
38 extern struct panel_spec lcd_ili9486s1_mipi_spec;
39 extern struct panel_spec lcd_nt51017_mipi_lvds_spec;
40 extern struct panel_spec lcd_t8861_mipi_spec;
41 extern struct panel_spec lcd_hx8379a_mipi_spec;
42 extern struct panel_spec lcd_hx8389c_mipi_spec;
43 extern struct panel_spec ili6150_lvds_spec;
44 extern struct panel_spec lcd_rm68180_mipi_spec;
45 extern struct panel_spec lcd_ili9806e_mipi_spec;
46 extern struct panel_spec lcd_ili9806e_2_mipi_spec;
47 extern struct panel_spec lcd_otm8019a_mipi_spec;
48 extern struct panel_spec lcd_fl10802_mipi_spec;
49 extern struct panel_spec lcd_jd9161_mipi_spec;
50 extern struct panel_spec lcd_hx8369b_mipi_vivaltoVE_spec;
51 extern struct panel_spec lcd_vx5b3d_mipi_spec;
52 extern struct panel_spec lcd_hx8369b_grandneo_mipi_spec;
53 extern struct panel_spec lcd_hx8369b_tshark2_j3_mipi_spec;
54 extern struct panel_spec lcd_sd7798d_mipi_spec;
55 extern struct panel_spec lcd_s6d77a1_mipi_spec;
56 extern struct panel_spec lcd_nt51017_mipi_spec;
57 extern struct panel_spec lcd_hx8394d_mipi_spec;
61 extern void save_lcd_id_to_kernel(uint32_t id);
62 extern int sprd_gpio_request(struct gpio_chip *chip, unsigned offset);
63 extern int sprd_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value);
64 extern void sprd_gpio_set(struct gpio_chip *chip, unsigned offset, int value);
66 void sprdfb_panel_remove(struct sprdfb_device *dev);
68 static ushort colormap[256];
70 static struct panel_cfg panel_cfg[] = {
71 #ifdef CONFIG_FB_LCD_S6E8AA5X01_MIPI
74 .panel = &lcd_s6e8aa5x01_mipi_spec,
77 #ifdef CONFIG_FB_LCD_S6E88OA_MIPI
80 .panel = &lcd_s6e88oa_mipi_spec,
83 #ifdef CONFIG_FB_LCD_NT35510_MIPI
86 .panel = &lcd_nt35510_mipi_spec,
90 #ifdef CONFIG_FB_LCD_NT35516_MIPI
93 .panel = &lcd_nt35516_mipi_spec,
97 #ifdef CONFIG_FB_LCD_HX8394D_MIPI
100 .panel = &lcd_hx8394d_mipi_spec,
104 #ifdef CONFIG_FB_LCD_NT35516_MCU
107 .panel = &lcd_nt35516_mcu_spec,
111 #ifdef CONFIG_FB_LCD_NT35516_RGB_SPI
114 .panel = &lcd_nt35516_rgb_spi_spec,
118 #ifdef CONFIG_FB_LCD_OTM8018B_MIPI
121 .panel = &lcd_otm8018b_mipi_spec,
125 #ifdef CONFIG_FB_LCD_HX8363_MCU
128 .panel = &lcd_hx8363_mcu_spec,
132 #ifdef CONFIG_FB_LCD_VIVA_RGB_SPI
135 .panel = &lcd_panel_hx8363_rgb_spi_spec_viva,
139 #ifdef CONFIG_FB_LCD_RM68180_MIPI
142 .panel = &lcd_rm68180_mipi_spec,
146 #ifdef CONFIG_FB_LCD_HX8363_RGB_SPI
149 .panel = &lcd_panel_hx8363_rgb_spi_spec,
153 #ifdef CONFIG_FB_LCD_S6D0139
156 .panel = &lcd_s6d0139_spec,
160 #ifdef CONFIG_FB_LCD_OTM1283A_MIPI
163 .panel = &lcd_otm1283a_mipi_spec,
167 #ifdef CONFIG_FB_LCD_SSD2075_MIPI
170 .panel = &lcd_ssd2075_mipi_spec,
174 #ifdef CONFIG_FB_LCD_ST7789V_MCU
177 .panel = &lcd_panel_st7789v,
181 #ifdef CONFIG_FB_LCD_SC7798_RGB_SPI
184 .panel = &lcd_panel_sc7798_rgb_spi,
188 #if defined(CONFIG_FB_LCD_HX8369B_MIPI) || defined(CONFIG_FB_LCD_HX8369B_MIPI_COREPRIMELITE)
191 .panel = &lcd_hx8369b_mipi_spec,
195 #if defined (CONFIG_FB_LCD_HX8369B_MIPI) ||defined (CONFIG_FB_LCD_HX8369B_MIPI_KIRAN3G)
198 .panel = &lcd_hx8369b_mipi_spec,
202 #if defined(CONFIG_FB_LCD_SD7798D_MIPI_COREPRIMELITE)
205 .panel = &lcd_sd7798d_mipi_spec,
209 #ifdef CONFIG_FB_LCD_NT35502_MIPI
212 .panel = &lcd_nt35502_mipi_spec,
216 #ifdef CONFIG_FB_LCD_NT51017_MIPI
219 .panel = &lcd_nt51017_mipi_spec,
224 #ifdef CONFIG_FB_LCD_ILI9341
227 .panel = &lcd_panel_ili9341,
231 #ifdef CONFIG_FB_LCD_ILI9486
234 .panel = &lcd_panel_ili9486,
238 #ifdef CONFIG_FB_LCD_ILI9486_RGB_SPI
241 .panel = &lcd_panel_ili9486_rgb_spi,
245 #ifdef CONFIG_FB_LCD_ILI9486S1_MIPI
248 .panel = &lcd_ili9486s1_mipi_spec,
252 #ifdef CONFIG_FB_LCD_HX8369B_MIPI_VIVALTO_VE
255 .panel = &lcd_hx8369b_mipi_vivaltoVE_spec,
259 #ifdef CONFIG_FB_LCD_VX5B3D_MIPI
262 .panel = &lcd_vx5b3d_mipi_spec,
266 #ifdef CONFIG_FB_LCD_GRANDNEO_MIPI
269 .panel = &lcd_hx8369b_grandneo_mipi_spec,
273 #ifdef CONFIG_FB_LCD_TSHARK2_J3_MIPI
276 .panel = &lcd_hx8369b_tshark2_j3_mipi_spec,
280 #ifdef CONFIG_FB_LCD_SD7798D_MIPI
283 .panel = &lcd_sd7798d_mipi_spec,
287 #ifdef CONFIG_FB_LCD_S6D77A1_MIPI_PIKEA_J1
290 .panel = &lcd_s6d77a1_mipi_spec,
294 #ifdef CONFIG_FB_LCD_NT51017_LVDS
297 .panel = &lcd_nt51017_mipi_lvds_spec,
300 #ifdef CONFIG_FB_LCD_T8861_MIPI
303 .panel = &lcd_t8861_mipi_spec,
306 #ifdef CONFIG_FB_LCD_HX8379A_MIPI
309 .panel = &lcd_hx8379a_mipi_spec,
312 #ifdef CONFIG_FB_LCD_HX8389C_MIPI
315 .panel = &lcd_hx8389c_mipi_spec,
318 #ifdef CONFIG_FB_LCD_ILI6150_LVDS
321 .panel = &ili6150_lvds_spec,
324 #ifdef CONFIG_FB_LCD_ILI9806E_MIPI
327 .panel = &lcd_ili9806e_mipi_spec,
330 #ifdef CONFIG_FB_LCD_ILI9806E_2_MIPI
333 .panel = &lcd_ili9806e_2_mipi_spec,
336 #ifdef CONFIG_FB_LCD_OTM8019A_MIPI
339 .panel = &lcd_otm8019a_mipi_spec,
342 #ifdef CONFIG_FB_LCD_FL10802_MIPI
345 .panel = &lcd_fl10802_mipi_spec,
348 #ifdef CONFIG_FB_LCD_JD9161_MIPI
351 .panel = &lcd_jd9161_mipi_spec,
355 #ifdef CONFIG_FB_LCD_HX8394D_MIPI
358 .panel = &lcd_hx8394d_mipi_spec,
363 #ifdef CONFIG_LCD_FWVGA
364 vidinfo_t panel_info = {
372 #ifdef CONFIG_LCD_WVGA
373 vidinfo_t panel_info = {
381 #ifdef CONFIG_LCD_HVGA
382 vidinfo_t panel_info = {
390 #ifdef CONFIG_LCD_QVGA
391 vidinfo_t panel_info = {
399 #ifdef CONFIG_LCD_QHD
400 vidinfo_t panel_info = {
408 #ifdef CONFIG_LCD_PAD_1024
409 vidinfo_t panel_info = {
416 #ifdef CONFIG_LCD_720P //thomaszhang@20130412
417 vidinfo_t panel_info = {
425 #ifdef CONFIG_LCD_HD //LiWei
426 vidinfo_t panel_info = {
433 #ifdef CONFIG_LCD_PAD_WXGA
434 vidinfo_t panel_info = {
443 static int32_t panel_reset_dispc(struct panel_spec *self)
445 sprd_gpio_request(NULL, 103);
446 sprd_gpio_direction_output(NULL, 103, 0);
447 sprd_gpio_set(NULL, 103, 1);
449 sprd_gpio_set(NULL, 103, 0);
451 sprd_gpio_set(NULL, 103, 1);
457 static void panel_reset(struct sprdfb_device *dev)
459 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
461 //clk/data lane enter LP
462 if(NULL != dev->if_ctrl->panel_if_before_panel_reset){
463 dev->if_ctrl->panel_if_before_panel_reset(dev);
468 panel_reset_dispc(dev->panel);
471 static int panel_mount(struct sprdfb_device *dev, struct panel_spec *panel)
475 printf("sprdfb: [%s], type = %d\n",__FUNCTION__, panel->type);
478 case SPRDFB_PANEL_TYPE_MCU:
479 dev->if_ctrl = &sprdfb_mcu_ctrl;
481 case SPRDFB_PANEL_TYPE_RGB:
482 case SPRDFB_PANEL_TYPE_LVDS:
483 dev->if_ctrl = &sprdfb_rgb_ctrl;
485 #if ((!defined(CONFIG_SC7710G2)) && (!defined(CONFIG_SPX15)))
486 case SPRDFB_PANEL_TYPE_MIPI:
487 dev->if_ctrl = &sprdfb_mipi_ctrl;
491 printf("sprdfb: [%s]: erro panel type.(%d)",__FUNCTION__, panel->type);
497 if(NULL == dev->if_ctrl){
501 if(dev->if_ctrl->panel_if_check){
502 rval = dev->if_ctrl->panel_if_check(panel);
506 printf("sprdfb: [%s] check panel fail!\n", __FUNCTION__);
513 if(NULL == dev->panel->ops->panel_reset){
514 dev->panel->ops->panel_reset = panel_reset_dispc;
517 dev->if_ctrl->panel_if_mount(dev);
523 int panel_init(struct sprdfb_device *dev)
525 if((NULL == dev) || (NULL == dev->panel)){
526 printf("sprdfb: [%s]: Invalid param\n", __FUNCTION__);
530 FB_PRINT("sprdfb: [%s], type = %d\n",__FUNCTION__, dev->panel->type);
532 if(NULL != dev->if_ctrl->panel_if_init){
533 dev->if_ctrl->panel_if_init(dev);
538 int panel_ready(struct sprdfb_device *dev)
540 if((NULL == dev) || (NULL == dev->panel)){
541 printf("sprdfb: [%s]: Invalid param\n", __FUNCTION__);
545 FB_PRINT("sprdfb: [%s], type = %d\n",__FUNCTION__, dev->panel->type);
547 if(NULL != dev->if_ctrl->panel_if_ready){
548 dev->if_ctrl->panel_if_ready(dev);
555 static struct panel_spec *adapt_panel_from_readid(struct sprdfb_device *dev)
557 int id, i, ret, b_panel_reset=0;
559 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
561 for(i = 0;i<(sizeof(panel_cfg))/(sizeof(panel_cfg[0]));i++) {
562 printf("sprdfb: [%s]: try panel 0x%x\n", __FUNCTION__, panel_cfg[i].lcd_id);
563 ret = panel_mount(dev, panel_cfg[i].panel);
565 printf("sprdfb: panel_mount failed!\n");
568 dev->ctrl->update_clk(dev);
570 if ((b_panel_reset==0) || (1 == dev->panel->is_need_reset))
575 id = dev->panel->ops->panel_readid(dev->panel);
576 if(id == panel_cfg[i].lcd_id) {
577 printf("sprdfb: [%s]: LCD Panel 0x%x is attached!\n", __FUNCTION__, panel_cfg[i].lcd_id);
579 dev->panel->ops->panel_init(dev->panel); //zxdebug modify for LCD adaptor
580 save_lcd_id_to_kernel(id);
581 dev->panel->ops->panel_check_mtp(dev->panel);
582 dev->panel->ops->panel_check_elvss(dev->panel);
583 dev->panel->ops->panel_check_hbm(dev->panel);
586 return panel_cfg[i].panel;
587 } else { //zxdbg for LCD adaptor
588 printf("sprdfb: [%s]: LCD Panel 0x%x attached fail!go next\n", __FUNCTION__, panel_cfg[i].lcd_id);
589 sprdfb_panel_remove(dev); //zxdebug modify for LCD adaptor
593 printf("sprdfb: [%s]: final failed to attach LCD Panel!\n", __FUNCTION__);
597 uint16_t sprdfb_panel_probe(struct sprdfb_device *dev)
599 struct panel_spec *panel;
602 printf("sprdfb: [%s]: Invalid param\n", __FUNCTION__);
606 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
608 /* can not be here in normal; we should get correct device id from uboot */
609 panel = adapt_panel_from_readid(dev);
612 FB_PRINT("sprdfb: [%s] got panel\n", __FUNCTION__);
616 printf("sprdfb: [%s] can not got panel\n", __FUNCTION__);
621 void sprdfb_panel_invalidate_rect(struct panel_spec *self,
622 uint16_t left, uint16_t top,
623 uint16_t right, uint16_t bottom)
625 FB_PRINT("sprdfb: [%s]\n, (%d, %d, %d,%d)",__FUNCTION__, left, top, right, bottom);
627 if(NULL != self->ops->panel_invalidate_rect){
628 self->ops->panel_invalidate_rect(self, left, top, right, bottom);
632 void sprdfb_panel_invalidate(struct panel_spec *self)
634 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
636 if(NULL != self->ops->panel_invalidate){
637 self->ops->panel_invalidate(self);
641 void sprdfb_panel_before_refresh(struct sprdfb_device *dev)
643 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
645 if(NULL != dev->if_ctrl->panel_if_before_refresh)
646 dev->if_ctrl->panel_if_before_refresh(dev);
649 void sprdfb_panel_after_refresh(struct sprdfb_device *dev)
651 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
653 if(NULL != dev->if_ctrl->panel_if_after_refresh)
654 dev->if_ctrl->panel_if_after_refresh(dev);
657 void sprdfb_panel_remove(struct sprdfb_device *dev)
659 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
661 if((NULL != dev->if_ctrl) && (NULL != dev->if_ctrl->panel_if_uninit)){
662 dev->if_ctrl->panel_if_uninit(dev);