change source file mode to 0644 instead of 0755
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / lcd / lcd_nt51017_goyal_mipi.c
1 /* drivers/video/sprdfb/lcd_nt51017_mipi.c\r
2  *\r
3  * Support for nt51017 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 typedef struct LCM_Init_Code_tag {\r
22         unsigned int tag;\r
23         unsigned char data[MAX_DATA];\r
24 }LCM_Init_Code;\r
25 \r
26 typedef struct LCM_force_cmd_code_tag{\r
27         unsigned int datatype;\r
28         LCM_Init_Code real_cmd_code;\r
29 }LCM_Force_Cmd_Code;\r
30 \r
31 #define LCM_TAG_SHIFT 24\r
32 #define LCM_TAG_MASK  ((1 << 24) -1)\r
33 #define LCM_SEND(len) ((1 << LCM_TAG_SHIFT)| len)\r
34 #define LCM_SLEEP(ms) ((2 << LCM_TAG_SHIFT)| ms)\r
35 //#define ARRAY_SIZE(array) ( sizeof(array) / sizeof(array[0]))\r
36 \r
37 #define LCM_TAG_SEND  (1<< 0)\r
38 #define LCM_TAG_SLEEP (1 << 1)\r
39 \r
40 \r
41 \r
42 \r
43 static LCM_Init_Code init_data[] = {\r
44  {LCM_SEND(2), {0x83, 0x96} },\r
45  {LCM_SEND(2), {0x84, 0x69} },\r
46  {LCM_SEND(2), {0x92, 0x19} },\r
47  {LCM_SEND(2), {0x83, 0x00} },\r
48  {LCM_SEND(2), {0x84, 0x00} },\r
49  {LCM_SEND(2), {0x96, 0x00} },\r
50 \r
51 };\r
52 \r
53 \r
54 static LCM_Init_Code sleep_in[] =  {\r
55 \r
56         {LCM_SEND(1), {0x11}},\r
57         {LCM_SLEEP(170)},\r
58 };\r
59 \r
60 static LCM_Init_Code sleep_out[] =  {\r
61         {LCM_SEND(1), {0x10}},\r
62         {LCM_SLEEP(170)},\r
63 \r
64 };\r
65 \r
66 \r
67 static int32_t nt51017_mipi_init(struct panel_spec *self)\r
68 {\r
69 \r
70         sprd_gpio_request(NULL, BACKLIGHT_GPIO);\r
71         sprd_gpio_direction_output(NULL, BACKLIGHT_GPIO, 0);\r
72         sprd_gpio_request(NULL, 152);\r
73         sprd_gpio_direction_output(NULL, 152, 0);\r
74         sprd_gpio_request(NULL, 232);\r
75         sprd_gpio_direction_output(NULL, 232, 0);\r
76         sprd_gpio_request(NULL, 233);\r
77         sprd_gpio_direction_output(NULL, 233, 0);\r
78 \r
79         sprd_gpio_set(NULL, BACKLIGHT_GPIO, 1);\r
80         sprd_gpio_set(NULL, 152, 1);\r
81         mdelay(20);\r
82         sprd_gpio_set(NULL, 232, 1);\r
83         sprd_gpio_set(NULL, 233, 1);\r
84         mdelay(200);\r
85         int32_t i;\r
86         LCM_Init_Code *init = init_data;\r
87         unsigned int tag;\r
88 \r
89         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
90         mipi_dcs_write_t mipi_dcs_write = self->info.mipi->ops->mipi_dcs_write;\r
91         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
92 \r
93         LCD_PRINT("lcd_nt51017_init\n");\r
94 \r
95         mipi_set_cmd_mode();\r
96         mipi_eotp_set(0,0);\r
97 \r
98         for(i = 0; i < ARRAY_SIZE(init_data); i++){\r
99                 tag = (init->tag >>24);\r
100                 if(tag & LCM_TAG_SEND){\r
101                         mipi_dcs_write(init->data, (init->tag & LCM_TAG_MASK));\r
102                         udelay(20);\r
103                 }else if(tag & LCM_TAG_SLEEP){\r
104                         mdelay(init->tag & LCM_TAG_MASK);//udelay((init->tag & LCM_TAG_MASK) * 1000);\r
105                 }\r
106                 init++;\r
107         }\r
108         mipi_eotp_set(0,0);\r
109 \r
110         return 0;\r
111 }\r
112 \r
113 static uint32_t nt51017_readid(struct panel_spec *self)\r
114 {\r
115 #if 0\r
116         uint32 j =0;\r
117         uint8_t read_data[4] = {0};\r
118         int32_t read_rtn = 0;\r
119         uint8_t param[2] = {0};\r
120         mipi_set_cmd_mode_t mipi_set_cmd_mode = self->info.mipi->ops->mipi_set_cmd_mode;\r
121         mipi_force_write_t mipi_force_write = self->info.mipi->ops->mipi_force_write;\r
122         mipi_force_read_t mipi_force_read = self->info.mipi->ops->mipi_force_read;\r
123         mipi_eotp_set_t mipi_eotp_set = self->info.mipi->ops->mipi_eotp_set;\r
124 \r
125         LCD_PRINT("lcd_nt51017_mipi read id!\n");\r
126 \r
127         mipi_set_cmd_mode();\r
128         mipi_eotp_set(0,0);\r
129 \r
130         for(j = 0; j < 4; j++){\r
131                 param[0] = 0x01;\r
132                 param[1] = 0x00;\r
133                 mipi_force_write(0x37, param, 2);\r
134                 read_rtn = mipi_force_read(0xda,1,&read_data[0]);\r
135                 LCD_PRINT("lcd_nt51017_mipi read id 0xda value is 0x%x!\n",read_data[0]);\r
136 \r
137                 read_rtn = mipi_force_read(0xdb,1,&read_data[1]);\r
138                 LCD_PRINT("lcd_nt51017_mipi read id 0xdb value is 0x%x!\n",read_data[1]);\r
139 \r
140                 read_rtn = mipi_force_read(0xdc,1,&read_data[2]);\r
141                 LCD_PRINT("lcd_nt51017_mipi read id 0xdc value is 0x%x!\n",read_data[2]);\r
142 \r
143                 if((0x55 == read_data[0])&&(0xbf == read_data[1] || 0xc0 == read_data[1] || 0xbe == read_data[1])&&(0x90 == read_data[2])){\r
144                                 LCD_PRINT("lcd_nt51017_mipi read id success!\n");\r
145                                 return 0x8369;\r
146                 }\r
147         }\r
148 \r
149         mipi_eotp_set(0,0);\r
150 \r
151         LCD_PRINT("lcd_s6d77a1_mipi read id failed!\n");\r
152         return 0;\r
153 #endif\r
154         return 0x51017;\r
155 }\r
156 \r
157 static struct panel_operations lcd_nt51017_mipi_operations = {\r
158         .panel_init = nt51017_mipi_init,\r
159         .panel_readid = nt51017_readid,\r
160 };\r
161 \r
162 static struct timing_rgb lcd_nt51017_mipi_timing = {\r
163 \r
164         .hfp = 80,  /* unit: pixel */\r
165         .hbp = 80,\r
166         .hsync = 1,\r
167         .vfp = 18, /*unit: line*/\r
168         .vbp = 23,\r
169         .vsync = 1,\r
170 \r
171 };\r
172 \r
173 \r
174 static struct info_mipi lcd_nt51017_mipi_info = {\r
175         .work_mode  = SPRDFB_MIPI_MODE_VIDEO,\r
176         .video_bus_width = 24, /*18,16*/\r
177         .lan_number =   4,\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_nt51017_mipi_timing,\r
186         .ops = NULL,\r
187 };\r
188 \r
189 struct panel_spec lcd_nt51017_mipi_spec = {\r
190         .width = 800,\r
191         .height =1280 ,\r
192         .fps = 60,\r
193         .type = LCD_MODE_DSI,\r
194         .direction = LCD_DIRECT_NORMAL,\r
195         //.suspend_mode = SEND_SLEEP_CMD,\r
196         .info = {\r
197                 .mipi = &lcd_nt51017_mipi_info\r
198         },\r
199         .ops = &lcd_nt51017_mipi_operations,\r
200 };\r