tizen 2.4 release
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_sd7798d_mipi.c
1 /* drivers/video/sprdfb/lcd_sd7798d_mipi.c\r
2  *\r
3  * Support for sd7798d mipi LCD device\r
4  *\r
5  * Copyright (C) 2010 Spreadtrum\r
6  */\r
7 \r
8 #include <asm/arch/sprd_lcd.h>\r
9 #include "../sprdfb.h"\r
10 #define printk printf\r
11 \r
12 #define  LCD_DEBUG\r
13 #ifdef LCD_DEBUG\r
14 #define LCD_PRINT printk\r
15 #else\r
16 #define LCD_PRINT(...)\r
17 #endif\r
18 \r
19 #define MAX_DATA   150\r
20 \r
21 \r
22 \r
23 typedef struct LCM_Init_Code_tag {\r
24         unsigned int tag;\r
25         unsigned char data[MAX_DATA];\r
26 }LCM_Init_Code;\r
27 \r
28 typedef struct LCM_force_cmd_code_tag{\r
29         unsigned int datatype;\r
30         LCM_Init_Code real_cmd_code;\r
31 }LCM_Force_Cmd_Code;\r
32 \r
33 #define LCM_TAG_SHIFT 24\r
34 #define LCM_TAG_MASK  ((1 << 24) -1)\r
35 #define LCM_SEND(len) ((1 << LCM_TAG_SHIFT)| len)\r
36 #define LCM_SLEEP(ms) ((2 << LCM_TAG_SHIFT)| ms)\r
37 //#define ARRAY_SIZE(array) ( sizeof(array) / sizeof(array[0]))\r
38 \r
39 #define LCM_TAG_SEND  (1<< 0)\r
40 #define LCM_TAG_SLEEP (1 << 1)\r
41 \r
42 \r
43 static LCM_Init_Code init_data[] = {\r
44         {LCM_SEND(6), {4, 0, 0xB9, 0xF1, 0x08, 0x00} },\r
45         {LCM_SEND(10), {8, 0, 0xB1, 0x31, 0x0C, 0x0C, 0xA7, 0x33, 0x01, 0xB7} },\r
46         {LCM_SEND(6), {4, 0, 0xC6, 0x00, 0x00, 0xFD} },\r
47         {LCM_SEND(7), {5, 0, 0xE3, 0x03, 0x03, 0x03, 0x03} },\r
48         {LCM_SEND(5), {3, 0, 0xB8, 0x06, 0x22} },\r
49         {LCM_SLEEP(10)},\r
50         {LCM_SEND(21), {19, 0, 0xBA, 0x31, 0x00, 0x44, 0x25, 0x91, 0x0A, 0x00, 0x00, 0xC2, 0x34, 0x00, 0x00, 0x04, 0x02, 0x1D, \r
51                                 0xB9, 0xEE, 0x40} },\r
52         {LCM_SEND(11), {9, 0, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0A, 0x25, 0x20} },\r
53         {LCM_SEND(2), {0xB4, 0x00} },\r
54         {LCM_SEND(2), {0xCC, 0x0E} },\r
55         {LCM_SEND(2), {0xBC, 0x67} },\r
56         {LCM_SEND(2), {0xB2, 0x03} },\r
57         {LCM_SEND(8), {6, 0, 0xC0, 0x73, 0x50, 0x00, 0x08, 0x70} },\r
58         {LCM_SEND(54), {52, 0, 0xE9, 0x00, 0x00, 0x06, 0x00, 0x00, 0x6E, 0x29, 0x12, 0x30, 0x00, 0x48, 0x08, 0x6E, 0x29, 0x47, \r
59                                 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x89, 0x98, 0x33, 0x11, 0x77, 0x55, \r
60                                 0x13, 0x00, 0x00, 0x89, 0x98, 0x22, 0x00, 0x66, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, \r
61                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} },\r
62         {LCM_SEND(39), {37, 0, 0xEA, 0x00, 0x00, 0x98, 0x98, 0x44, 0x66, 0x00, 0x22, 0x20, 0x00, 0x00, 0x98, 0x98, 0x55, 0x77, \r
63                                 0x11, 0x33, 0x31, 0x30, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
64                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} },\r
65         {LCM_SEND(37), {35, 0, 0xE0, 0x01, 0x09, 0x0D, 0x2E, 0x36, 0x3F, 0x10, 0x31, 0x07, 0x0D, 0x11, 0x15, 0x13, 0x16, 0x15, \r
66                                 0x32, 0x38, 0x01, 0x05, 0x05, 0x30, 0x35, 0x3F, 0x0E, 0x30, 0x04, 0x09, 0x0A, 0x0D, 0x12, \r
67                                 0x0D, 0x0F, 0x2C, 0x35} },\r
68         {LCM_SEND(1), {0x11} },\r
69         {LCM_SLEEP(120)},\r
70         {LCM_SEND(1), {0x29} },\r
71         {LCM_SLEEP(20)},\r
72 \r
73 };\r
74 \r
75 static LCM_Init_Code disp_on =  {LCM_SEND(1), {0x29}};\r
76 \r
77 static LCM_Init_Code sleep_in[] =  {\r
78         {LCM_SEND(1), {0x28}},\r
79         {LCM_SLEEP(150)},       //>150ms\r
80         {LCM_SEND(1), {0x10}},\r
81         {LCM_SLEEP(150)},       //>150ms\r
82 };\r
83 \r
84 static LCM_Init_Code sleep_out[] =  {\r
85         {LCM_SEND(1), {0x11}},\r
86         {LCM_SLEEP(120)},//>120ms\r
87         {LCM_SEND(1), {0x29}},\r
88         {LCM_SLEEP(20)}, //>20ms\r
89 };\r
90 \r
91 //extern void (*lcd_panel_cabc_pwm_bl)(int brightness);\r
92 //extern void backlight_control(int brigtness);\r
93 static int32_t sd7798d_mipi_init(struct panel_spec *self)\r
94 {\r
95         int32_t i;\r
96         LCM_Init_Code *init = init_data;\r
97         unsigned int tag;\r
98 \r
99         //lcd_panel_cabc_pwm_bl = backlight_control;\r
100 \r
101         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
102         mipi_dcs_write_t mipi_dcs_write = self->info.mipi->ops->mipi_dcs_write;\r
103         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
104 \r
105         LCD_PRINT("lcd_sd7798d_init\n");\r
106 \r
107         mipi_set_cmd_mode();\r
108         mipi_eotp_set(0,0);\r
109 \r
110         for(i = 0; i < ARRAY_SIZE(init_data); i++){\r
111                 tag = (init->tag >>24);\r
112                 if(tag & LCM_TAG_SEND){\r
113                         mipi_dcs_write(init->data, (init->tag & LCM_TAG_MASK));\r
114                         udelay(20);\r
115                 }else if(tag & LCM_TAG_SLEEP){\r
116                         mdelay(init->tag & LCM_TAG_MASK);//udelay((init->tag & LCM_TAG_MASK) * 1000);\r
117                 }\r
118                 init++;\r
119         }\r
120         mipi_eotp_set(0,0);\r
121 \r
122         return 0;\r
123 }\r
124 \r
125 static uint32_t sd7798d_readid(struct panel_spec *self)\r
126 {\r
127         uint32 j =0;\r
128         uint8_t read_data[3] = {0};\r
129         int32_t read_rtn = 0;\r
130         uint8_t param[2] = {0};\r
131         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
132         mipi_force_write_t mipi_force_write = self->info.mipi->ops->mipi_force_write;\r
133         mipi_force_read_t mipi_force_read = self->info.mipi->ops->mipi_force_read;\r
134         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
135 \r
136         LCD_PRINT("lcd_sd7798d_mipi read id!\n");\r
137 \r
138         mipi_set_cmd_mode();\r
139         mipi_eotp_set(0,0);\r
140 \r
141         for(j = 0; j < 4; j++){\r
142                 param[0] = 0x01;\r
143                 param[1] = 0x00;\r
144                 mipi_force_write(0x37, param, 2);\r
145                 read_rtn = mipi_force_read(0xda,1,&read_data[0]);\r
146                 read_rtn = mipi_force_read(0xdb,1,&read_data[1]);\r
147                 read_rtn = mipi_force_read(0xdc,1,&read_data[2]);\r
148                 if((0x55 == read_data[0])&&(0xB8 == read_data[1])&&(0xf0 == read_data[2]))\r
149                 {\r
150                         LCD_PRINT("lcd_sd7798d_mipi read id success!\n");\r
151                         return 0x55b8f0;\r
152                 }\r
153         }\r
154         LCD_PRINT("lcd_sd7798d_mipi read id fail! 0xda,0xdb,0xdc is 0x%x,0x%x,0x%x!\n",read_data[0],read_data[1],read_data[2]);\r
155         mipi_eotp_set(0,0);\r
156         return 0;\r
157 }\r
158 \r
159 static struct panel_operations lcd_sd7798d_mipi_operations = {\r
160         .panel_init = sd7798d_mipi_init,\r
161         .panel_readid = sd7798d_readid,\r
162 };\r
163 \r
164 static struct timing_rgb lcd_sd7798d_mipi_timing = {\r
165         .hfp = 145,  /* unit: pixel */\r
166         .hbp = 90,\r
167         .hsync = 70,\r
168         .vfp = 10, /*unit: line*/\r
169         .vbp = 12,\r
170         .vsync = 4,\r
171 };\r
172 \r
173 \r
174 static struct info_mipi lcd_sd7798d_mipi_info = {\r
175         .work_mode  = SPRDFB_MIPI_MODE_VIDEO,\r
176         .video_bus_width = 24, /*18,16*/\r
177         .lan_number =   2,\r
178         .phy_feq =481*1000,\r
179         .h_sync_pol = SPRDFB_POLARITY_POS,\r
180         .v_sync_pol = SPRDFB_POLARITY_POS,\r
181         .de_pol = SPRDFB_POLARITY_POS,\r
182         .te_pol = SPRDFB_POLARITY_POS,\r
183         .color_mode_pol = SPRDFB_POLARITY_NEG,\r
184         .shut_down_pol = SPRDFB_POLARITY_NEG,\r
185         .timing = &lcd_sd7798d_mipi_timing,\r
186         .ops = NULL,\r
187 };\r
188 \r
189 struct panel_spec lcd_sd7798d_mipi_spec = {\r
190         .width = 480,\r
191         .height = 800,\r
192         .fps = 60,\r
193         .type = LCD_MODE_DSI,\r
194         .direction = LCD_DIRECT_NORMAL,\r
195         .info = {\r
196                 .mipi = &lcd_sd7798d_mipi_info\r
197         },\r
198         .ops = &lcd_sd7798d_mipi_operations,\r
199 };\r