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;
59 void sprdfb_panel_remove(struct sprdfb_device *dev);
61 static ushort colormap[256];
63 static struct panel_cfg panel_cfg[] = {
64 #ifdef CONFIG_FB_LCD_S6E8AA5X01_MIPI
67 .panel = &lcd_s6e8aa5x01_mipi_spec,
70 #ifdef CONFIG_FB_LCD_S6E88OA_MIPI
73 .panel = &lcd_s6e88oa_mipi_spec,
76 #ifdef CONFIG_FB_LCD_NT35510_MIPI
79 .panel = &lcd_nt35510_mipi_spec,
83 #ifdef CONFIG_FB_LCD_NT35516_MIPI
86 .panel = &lcd_nt35516_mipi_spec,
90 #ifdef CONFIG_FB_LCD_HX8394D_MIPI
93 .panel = &lcd_hx8394d_mipi_spec,
97 #ifdef CONFIG_FB_LCD_NT35516_MCU
100 .panel = &lcd_nt35516_mcu_spec,
104 #ifdef CONFIG_FB_LCD_NT35516_RGB_SPI
107 .panel = &lcd_nt35516_rgb_spi_spec,
111 #ifdef CONFIG_FB_LCD_OTM8018B_MIPI
114 .panel = &lcd_otm8018b_mipi_spec,
118 #ifdef CONFIG_FB_LCD_HX8363_MCU
121 .panel = &lcd_hx8363_mcu_spec,
125 #ifdef CONFIG_FB_LCD_VIVA_RGB_SPI
128 .panel = &lcd_panel_hx8363_rgb_spi_spec_viva,
132 #ifdef CONFIG_FB_LCD_RM68180_MIPI
135 .panel = &lcd_rm68180_mipi_spec,
139 #ifdef CONFIG_FB_LCD_HX8363_RGB_SPI
142 .panel = &lcd_panel_hx8363_rgb_spi_spec,
146 #ifdef CONFIG_FB_LCD_S6D0139
149 .panel = &lcd_s6d0139_spec,
153 #ifdef CONFIG_FB_LCD_OTM1283A_MIPI
156 .panel = &lcd_otm1283a_mipi_spec,
160 #ifdef CONFIG_FB_LCD_SSD2075_MIPI
163 .panel = &lcd_ssd2075_mipi_spec,
167 #ifdef CONFIG_FB_LCD_ST7789V_MCU
170 .panel = &lcd_panel_st7789v,
174 #ifdef CONFIG_FB_LCD_SC7798_RGB_SPI
177 .panel = &lcd_panel_sc7798_rgb_spi,
181 #if defined(CONFIG_FB_LCD_HX8369B_MIPI) || defined(CONFIG_FB_LCD_HX8369B_MIPI_COREPRIMELITE)
184 .panel = &lcd_hx8369b_mipi_spec,
188 #if defined (CONFIG_FB_LCD_HX8369B_MIPI) ||defined (CONFIG_FB_LCD_HX8369B_MIPI_KIRAN3G)
191 .panel = &lcd_hx8369b_mipi_spec,
195 #if defined(CONFIG_FB_LCD_SD7798D_MIPI_COREPRIMELITE)
198 .panel = &lcd_sd7798d_mipi_spec,
202 #ifdef CONFIG_FB_LCD_NT35502_MIPI
205 .panel = &lcd_nt35502_mipi_spec,
209 #ifdef CONFIG_FB_LCD_NT51017_MIPI
212 .panel = &lcd_nt51017_mipi_spec,
217 #ifdef CONFIG_FB_LCD_ILI9341
220 .panel = &lcd_panel_ili9341,
224 #ifdef CONFIG_FB_LCD_ILI9486
227 .panel = &lcd_panel_ili9486,
231 #ifdef CONFIG_FB_LCD_ILI9486_RGB_SPI
234 .panel = &lcd_panel_ili9486_rgb_spi,
238 #ifdef CONFIG_FB_LCD_ILI9486S1_MIPI
241 .panel = &lcd_ili9486s1_mipi_spec,
245 #ifdef CONFIG_FB_LCD_HX8369B_MIPI_VIVALTO_VE
248 .panel = &lcd_hx8369b_mipi_vivaltoVE_spec,
252 #ifdef CONFIG_FB_LCD_VX5B3D_MIPI
255 .panel = &lcd_vx5b3d_mipi_spec,
259 #ifdef CONFIG_FB_LCD_GRANDNEO_MIPI
262 .panel = &lcd_hx8369b_grandneo_mipi_spec,
266 #ifdef CONFIG_FB_LCD_TSHARK2_J3_MIPI
269 .panel = &lcd_hx8369b_tshark2_j3_mipi_spec,
273 #ifdef CONFIG_FB_LCD_SD7798D_MIPI
276 .panel = &lcd_sd7798d_mipi_spec,
280 #ifdef CONFIG_FB_LCD_S6D77A1_MIPI_PIKEA_J1
283 .panel = &lcd_s6d77a1_mipi_spec,
287 #ifdef CONFIG_FB_LCD_NT51017_LVDS
290 .panel = &lcd_nt51017_mipi_lvds_spec,
293 #ifdef CONFIG_FB_LCD_T8861_MIPI
296 .panel = &lcd_t8861_mipi_spec,
299 #ifdef CONFIG_FB_LCD_HX8379A_MIPI
302 .panel = &lcd_hx8379a_mipi_spec,
305 #ifdef CONFIG_FB_LCD_HX8389C_MIPI
308 .panel = &lcd_hx8389c_mipi_spec,
311 #ifdef CONFIG_FB_LCD_ILI6150_LVDS
314 .panel = &ili6150_lvds_spec,
317 #ifdef CONFIG_FB_LCD_ILI9806E_MIPI
320 .panel = &lcd_ili9806e_mipi_spec,
323 #ifdef CONFIG_FB_LCD_ILI9806E_2_MIPI
326 .panel = &lcd_ili9806e_2_mipi_spec,
329 #ifdef CONFIG_FB_LCD_OTM8019A_MIPI
332 .panel = &lcd_otm8019a_mipi_spec,
335 #ifdef CONFIG_FB_LCD_FL10802_MIPI
338 .panel = &lcd_fl10802_mipi_spec,
341 #ifdef CONFIG_FB_LCD_JD9161_MIPI
344 .panel = &lcd_jd9161_mipi_spec,
348 #ifdef CONFIG_FB_LCD_HX8394D_MIPI
351 .panel = &lcd_hx8394d_mipi_spec,
356 #ifdef CONFIG_LCD_FWVGA
357 vidinfo_t panel_info = {
365 #ifdef CONFIG_LCD_WVGA
366 vidinfo_t panel_info = {
374 #ifdef CONFIG_LCD_HVGA
375 vidinfo_t panel_info = {
383 #ifdef CONFIG_LCD_QVGA
384 vidinfo_t panel_info = {
392 #ifdef CONFIG_LCD_QHD
393 vidinfo_t panel_info = {
401 #ifdef CONFIG_LCD_PAD_1024
402 vidinfo_t panel_info = {
409 #ifdef CONFIG_LCD_720P //thomaszhang@20130412
410 vidinfo_t panel_info = {
418 #ifdef CONFIG_LCD_HD //LiWei
419 vidinfo_t panel_info = {
426 #ifdef CONFIG_LCD_PAD_WXGA
427 vidinfo_t panel_info = {
436 static int32_t panel_reset_dispc(struct panel_spec *self)
438 sprd_gpio_request(NULL, 103);
439 sprd_gpio_direction_output(NULL, 103, 0);
440 sprd_gpio_set(NULL, 103, 1);
442 sprd_gpio_set(NULL, 103, 0);
444 sprd_gpio_set(NULL, 103, 1);
450 static void panel_reset(struct sprdfb_device *dev)
452 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
454 //clk/data lane enter LP
455 if(NULL != dev->if_ctrl->panel_if_before_panel_reset){
456 dev->if_ctrl->panel_if_before_panel_reset(dev);
461 panel_reset_dispc(dev->panel);
464 static int panel_mount(struct sprdfb_device *dev, struct panel_spec *panel)
468 printf("sprdfb: [%s], type = %d\n",__FUNCTION__, panel->type);
471 case SPRDFB_PANEL_TYPE_MCU:
472 dev->if_ctrl = &sprdfb_mcu_ctrl;
474 case SPRDFB_PANEL_TYPE_RGB:
475 case SPRDFB_PANEL_TYPE_LVDS:
476 dev->if_ctrl = &sprdfb_rgb_ctrl;
478 #if ((!defined(CONFIG_SC7710G2)) && (!defined(CONFIG_SPX15)))
479 case SPRDFB_PANEL_TYPE_MIPI:
480 dev->if_ctrl = &sprdfb_mipi_ctrl;
484 printf("sprdfb: [%s]: erro panel type.(%d)",__FUNCTION__, panel->type);
490 if(NULL == dev->if_ctrl){
494 if(dev->if_ctrl->panel_if_check){
495 rval = dev->if_ctrl->panel_if_check(panel);
499 printf("sprdfb: [%s] check panel fail!\n", __FUNCTION__);
506 if(NULL == dev->panel->ops->panel_reset){
507 dev->panel->ops->panel_reset = panel_reset_dispc;
510 dev->if_ctrl->panel_if_mount(dev);
516 int panel_init(struct sprdfb_device *dev)
518 if((NULL == dev) || (NULL == dev->panel)){
519 printf("sprdfb: [%s]: Invalid param\n", __FUNCTION__);
523 FB_PRINT("sprdfb: [%s], type = %d\n",__FUNCTION__, dev->panel->type);
525 if(NULL != dev->if_ctrl->panel_if_init){
526 dev->if_ctrl->panel_if_init(dev);
531 int panel_ready(struct sprdfb_device *dev)
533 if((NULL == dev) || (NULL == dev->panel)){
534 printf("sprdfb: [%s]: Invalid param\n", __FUNCTION__);
538 FB_PRINT("sprdfb: [%s], type = %d\n",__FUNCTION__, dev->panel->type);
540 if(NULL != dev->if_ctrl->panel_if_ready){
541 dev->if_ctrl->panel_if_ready(dev);
548 static struct panel_spec *adapt_panel_from_readid(struct sprdfb_device *dev)
550 int id, i, ret, b_panel_reset=0;
552 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
554 for(i = 0;i<(sizeof(panel_cfg))/(sizeof(panel_cfg[0]));i++) {
555 printf("sprdfb: [%s]: try panel 0x%x\n", __FUNCTION__, panel_cfg[i].lcd_id);
556 ret = panel_mount(dev, panel_cfg[i].panel);
558 printf("sprdfb: panel_mount failed!\n");
561 dev->ctrl->update_clk(dev);
563 if ((b_panel_reset==0) || (1 == dev->panel->is_need_reset))
568 id = dev->panel->ops->panel_readid(dev->panel);
569 if(id == panel_cfg[i].lcd_id) {
570 printf("sprdfb: [%s]: LCD Panel 0x%x is attached!\n", __FUNCTION__, panel_cfg[i].lcd_id);
572 dev->panel->ops->panel_init(dev->panel); //zxdebug modify for LCD adaptor
573 save_lcd_id_to_kernel(id);
574 dev->panel->ops->panel_check_mtp(dev->panel);
575 dev->panel->ops->panel_check_elvss(dev->panel);
576 dev->panel->ops->panel_check_hbm(dev->panel);
579 return panel_cfg[i].panel;
580 } else { //zxdbg for LCD adaptor
581 printf("sprdfb: [%s]: LCD Panel 0x%x attached fail!go next\n", __FUNCTION__, panel_cfg[i].lcd_id);
582 sprdfb_panel_remove(dev); //zxdebug modify for LCD adaptor
586 printf("sprdfb: [%s]: final failed to attach LCD Panel!\n", __FUNCTION__);
590 uint16_t sprdfb_panel_probe(struct sprdfb_device *dev)
592 struct panel_spec *panel;
595 printf("sprdfb: [%s]: Invalid param\n", __FUNCTION__);
599 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
601 /* can not be here in normal; we should get correct device id from uboot */
602 panel = adapt_panel_from_readid(dev);
605 FB_PRINT("sprdfb: [%s] got panel\n", __FUNCTION__);
609 printf("sprdfb: [%s] can not got panel\n", __FUNCTION__);
614 void sprdfb_panel_invalidate_rect(struct panel_spec *self,
615 uint16_t left, uint16_t top,
616 uint16_t right, uint16_t bottom)
618 FB_PRINT("sprdfb: [%s]\n, (%d, %d, %d,%d)",__FUNCTION__, left, top, right, bottom);
620 if(NULL != self->ops->panel_invalidate_rect){
621 self->ops->panel_invalidate_rect(self, left, top, right, bottom);
625 void sprdfb_panel_invalidate(struct panel_spec *self)
627 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
629 if(NULL != self->ops->panel_invalidate){
630 self->ops->panel_invalidate(self);
634 void sprdfb_panel_before_refresh(struct sprdfb_device *dev)
636 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
638 if(NULL != dev->if_ctrl->panel_if_before_refresh)
639 dev->if_ctrl->panel_if_before_refresh(dev);
642 void sprdfb_panel_after_refresh(struct sprdfb_device *dev)
644 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
646 if(NULL != dev->if_ctrl->panel_if_after_refresh)
647 dev->if_ctrl->panel_if_after_refresh(dev);
650 void sprdfb_panel_remove(struct sprdfb_device *dev)
652 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
654 if((NULL != dev->if_ctrl) && (NULL != dev->if_ctrl->panel_if_uninit)){
655 dev->if_ctrl->panel_if_uninit(dev);