video: sprd: remove build warnings
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / sprdfb_dsi.c
1 /*\r
2  * Copyright (C) 2012 Spreadtrum Communications Inc.\r
3  *\r
4  */\r
5 #include <common.h>\r
6 \r
7 \r
8 #include <asm/io.h>\r
9 \r
10 #include "sprdfb.h"\r
11 #include "sprdfb_chip_common.h"\r
12 \r
13 #ifdef CONFIG_DSIH_VERSION_1P21A\r
14 #include "dsi_1_21a/mipi_dsih_local.h"\r
15 #include "dsi_1_21a/mipi_dsih_dphy.h"\r
16 #include "dsi_1_21a/mipi_dsih_hal.h"\r
17 #include "dsi_1_21a/mipi_dsih_api.h"\r
18 #else\r
19 #include "dsi_1_10a/mipi_dsih_local.h"\r
20 #include "dsi_1_10a/mipi_dsih_dphy.h"\r
21 #include "dsi_1_10a/mipi_dsih_hal.h"\r
22 #include "dsi_1_10a/mipi_dsih_api.h"\r
23 #endif\r
24 \r
25 #define DSI_PHY_REF_CLOCK (26*1000)\r
26 \r
27 #define DSI_EDPI_CFG (0x6c)\r
28 \r
29 \r
30 struct sprdfb_dsi_context {\r
31         uint16_t                        is_inited;\r
32 \r
33         dsih_ctrl_t     dsi_inst;\r
34 };\r
35 \r
36 static struct sprdfb_dsi_context dsi_ctx;\r
37 \r
38 static uint32_t dsi_core_read_function(uint32_t addr, uint32_t offset)\r
39 {\r
40         return __raw_readl(addr + offset);\r
41 }\r
42 \r
43 static void dsi_core_write_function(uint32_t addr, uint32_t offset, uint32_t data)\r
44 {\r
45         __raw_writel(data, addr + offset);\r
46 }\r
47 \r
48 \r
49 static void dsi_reset(void)\r
50 {\r
51         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
52         __raw_writel(__raw_readl(DSI_AHB_SOFT_RST) | (BIT_DSI_SOFT_RST), DSI_AHB_SOFT_RST);\r
53         udelay(10);\r
54         __raw_writel(__raw_readl(DSI_AHB_SOFT_RST) & (~(BIT_DSI_SOFT_RST)),DSI_AHB_SOFT_RST);\r
55 }\r
56 \r
57 int32_t dsi_early_int(void)\r
58 {\r
59         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
60 \r
61         if(dsi_ctx.is_inited){\r
62                 FB_PRINT("sprdfb: dispc early init warning!(has been inited)");\r
63                 return 0;\r
64         }\r
65 \r
66 #ifdef CONFIG_FPGA\r
67         usc28c_dsi_init();\r
68 #endif\r
69         dsi_reset();\r
70 \r
71         memset(&(dsi_ctx.dsi_inst), 0, sizeof(dsi_ctx.dsi_inst));\r
72 \r
73         dsi_ctx.is_inited = 1;\r
74         return 0;\r
75 }\r
76 \r
77 static int32_t dsi_edpi_setbuswidth(struct info_mipi * mipi)\r
78 {\r
79         dsih_color_coding_t color_coding = 0;\r
80 \r
81         switch(mipi->video_bus_width){\r
82         case 16:\r
83                 color_coding = COLOR_CODE_16BIT_CONFIG1;\r
84                 break;\r
85         case 18:\r
86                 color_coding = COLOR_CODE_18BIT_CONFIG1;\r
87                 break;\r
88         case 24:\r
89                 color_coding = COLOR_CODE_24BIT;\r
90                 break;\r
91         default:\r
92                 printf("sprdfb:[%s] fail, invalid video_bus_width\n", __FUNCTION__);\r
93                 break;\r
94         }\r
95 #ifdef CONFIG_DSIH_VERSION_1P21A\r
96         __raw_bits_or(color_coding,(DSI_CTL_BEGIN+R_DSI_HOST_DPI_COLOR_CODE));\r
97 #else\r
98         dsi_core_write_function(DSI_CTL_BEGIN,  R_DSI_HOST_DPI_CFG, (uint32_t)(color_coding<<2));\r
99 #endif\r
100         return 0;\r
101 }\r
102 \r
103 \r
104 static int32_t dsi_edpi_init(void)\r
105 {\r
106 #ifdef CONFIG_DSIH_VERSION_1P21A\r
107         dsi_core_write_function((uint32_t)DSI_CTL_BEGIN,  (uint32_t)R_DSI_HOST_EDPI_CMD_SIZE, 0x500);\r
108 #else\r
109         dsi_core_write_function((uint32_t)DSI_CTL_BEGIN,  (uint32_t)R_DSI_HOST_EDPI_CFG, 0x10500);\r
110 #endif\r
111         return 0;\r
112 }\r
113 \r
114 static int32_t dsi_dpi_init(struct sprdfb_device *dev)\r
115 {\r
116         dsih_dpi_video_t dpi_param = {0};\r
117         dsih_error_t result;\r
118         struct panel_spec* panel = dev->panel;\r
119         struct info_mipi * mipi = panel->info.mipi;\r
120 \r
121         dpi_param.no_of_lanes = mipi->lan_number;\r
122         dpi_param.byte_clock = mipi->phy_feq / 8;\r
123 #ifndef CONFIG_FPGA\r
124         dpi_param.pixel_clock = dev->dpi_clock/1000;//384*1000/11;//DSI_PHY_REF_CLOCK / 4;\r
125 #else\r
126         dpi_param.pixel_clock = 6500;\r
127 #endif\r
128 #ifdef CONFIG_DSIH_VERSION_1P21A\r
129         dpi_param.max_hs_to_lp_cycles = 4;//110;\r
130         dpi_param.max_lp_to_hs_cycles = 15;//10;\r
131         dpi_param.max_clk_hs_to_lp_cycles = 4;//110;\r
132         dpi_param.max_clk_lp_to_hs_cycles = 15;//10;\r
133 #endif\r
134         switch(mipi->video_bus_width){\r
135         case 16:\r
136                 dpi_param.color_coding = COLOR_CODE_16BIT_CONFIG1;\r
137                 break;\r
138         case 18:\r
139                 dpi_param.color_coding = COLOR_CODE_18BIT_CONFIG1;\r
140                 break;\r
141         case 24:\r
142                 dpi_param.color_coding = COLOR_CODE_24BIT;\r
143                 break;\r
144         default:\r
145                 printf("sprdfb:[%s] fail, invalid video_bus_width\n", __FUNCTION__);\r
146                 break;\r
147         }\r
148 \r
149         if(SPRDFB_POLARITY_POS == mipi ->h_sync_pol){\r
150                 dpi_param.h_polarity = 1;\r
151         }\r
152 \r
153         if(SPRDFB_POLARITY_POS == mipi ->v_sync_pol){\r
154                 dpi_param.v_polarity = 1;\r
155         }\r
156 \r
157         if(SPRDFB_POLARITY_POS == mipi ->de_pol){\r
158                 dpi_param.data_en_polarity = 1;\r
159         }\r
160 \r
161         dpi_param.h_active_pixels = panel->width;\r
162         dpi_param.h_sync_pixels = mipi->timing->hsync;\r
163         dpi_param.h_back_porch_pixels = mipi->timing->hbp;\r
164         dpi_param.h_total_pixels = panel->width + mipi->timing->hsync + mipi->timing->hbp + mipi->timing->hfp;\r
165 \r
166         dpi_param.v_active_lines = panel->height;\r
167         dpi_param.v_sync_lines = mipi->timing->vsync;\r
168         dpi_param.v_back_porch_lines = mipi->timing->vbp;\r
169         dpi_param.v_total_lines = panel->height + mipi->timing->vsync + mipi->timing->vbp + mipi->timing->vfp;\r
170 \r
171         dpi_param.receive_ack_packets = 0;\r
172         dpi_param.video_mode = VIDEO_BURST_WITH_SYNC_PULSES;\r
173         dpi_param.virtual_channel = 0;\r
174 #ifndef CONFIG_FB_LCD_ILI9486S1_MIPI
175         dpi_param.is_18_loosely = 0;\r
176 #else
177         dpi_param.is_18_loosely = 1;\r
178 #endif
179 \r
180         result = mipi_dsih_dpi_video(&(dsi_ctx.dsi_inst), &dpi_param);\r
181         if(result != OK){\r
182                 printf("sprdfb: [%s] mipi_dsih_dpi_video fail (%d)!\n", __FUNCTION__, result);\r
183                 return -1;\r
184         }\r
185 \r
186         return 0;\r
187 }\r
188 \r
189 static void dsi_log_error(const char * string)\r
190 {\r
191         FB_PRINT(string);\r
192 }\r
193 \r
194 \r
195 int32_t sprdfb_dsi_init(struct sprdfb_device *dev)\r
196 {\r
197         dsih_error_t result = OK;\r
198         dsih_ctrl_t* dsi_instance = &(dsi_ctx.dsi_inst);\r
199         dphy_t *phy = &(dsi_instance->phy_instance);\r
200         struct info_mipi * mipi = dev->panel->info.mipi;\r
201         int i = 0;\r
202 \r
203         dsi_enable();\r
204 \r
205         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
206 \r
207         dsi_early_int();\r
208         phy->address = DSI_CTL_BEGIN;\r
209         phy->core_read_function = dsi_core_read_function;\r
210         phy->core_write_function = dsi_core_write_function;\r
211         phy->log_error = dsi_log_error;\r
212         phy->log_info = NULL;\r
213         phy->reference_freq = DSI_PHY_REF_CLOCK;\r
214         dsi_instance->address = DSI_CTL_BEGIN;\r
215         dsi_instance->color_mode_polarity =mipi->color_mode_pol;\r
216         dsi_instance->shut_down_polarity = mipi->shut_down_pol;\r
217         dsi_instance->core_read_function = dsi_core_read_function;\r
218         dsi_instance->core_write_function = dsi_core_write_function;\r
219         dsi_instance->log_error = dsi_log_error;\r
220         dsi_instance->log_info = NULL;\r
221         /*in our rtl implementation, this is max rd time, not bta time and use 15bits*/\r
222         dsi_instance->max_bta_cycles = 0x6000;//10;\r
223         #ifndef CONFIG_DSIH_VERSION_1P21A\r
224         dsi_instance->max_hs_to_lp_cycles = 4;//110;\r
225         dsi_instance->max_lp_to_hs_cycles = 15;//10;\r
226         #endif\r
227         dsi_instance->max_lanes = mipi->lan_number;\r
228 \r
229         if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){\r
230                 dsi_edpi_init();\r
231         }/*else{\r
232                 dsi_dpi_init(dev->panel);\r
233         }*/\r
234 \r
235 /*\r
236         result = mipi_dsih_unregister_all_events(dsi_instance);\r
237         if(OK != result){\r
238                 FB_PRINT("sprdfb: [%s]: mipi_dsih_unregister_all_events fail (%d)!\n", __FUNCTION__, result);\r
239                 return -1;\r
240         }\r
241 */\r
242 #ifdef CONFIG_DSIH_VERSION_1P21A\r
243         dsi_core_write_function(DSI_CTL_BEGIN,  R_DSI_HOST_INT_MSK0, 0x1fffff);\r
244         dsi_core_write_function(DSI_CTL_BEGIN,  R_DSI_HOST_INT_MSK1, 0x3ffff);\r
245 #else\r
246         dsi_core_write_function(DSI_CTL_BEGIN,  R_DSI_HOST_ERROR_MSK0, 0x1fffff);\r
247         dsi_core_write_function(DSI_CTL_BEGIN,  R_DSI_HOST_ERROR_MSK1, 0x3ffff);\r
248 #endif\r
249         dsi_instance->phy_feq = dev->panel->info.mipi->phy_feq;\r
250 \r
251         result = mipi_dsih_open(dsi_instance);\r
252         if(OK != result){\r
253                 printf("sprdfb: [%s]: mipi_dsih_open fail (%d)!\n", __FUNCTION__, result);\r
254                 return -1;\r
255         }\r
256 \r
257         result = mipi_dsih_dphy_configure(phy,  mipi->lan_number, mipi->phy_feq);\r
258         if(OK != result){\r
259                 printf("sprdfb: [%s]: mipi_dsih_dphy_configure fail (%d)!\n", __FUNCTION__, result);\r
260                 return -1;\r
261         }\r
262 \r
263         while(5 != (dsi_core_read_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_STATUS) & 5)){\r
264                 if(0x0 == ++i%500000){\r
265                         printf("sprdfb: [%s] warning: busy waiting!\n", __FUNCTION__);\r
266                 }\r
267         }\r
268 \r
269         if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){\r
270                 dsi_edpi_setbuswidth(mipi);\r
271         }\r
272 \r
273         result = mipi_dsih_enable_rx(dsi_instance, 1);\r
274         if(OK != result){\r
275                 printf("sprdfb: [%s]: mipi_dsih_enable_rx fail (%d)!\n", __FUNCTION__, result);\r
276                 return -1;\r
277         }\r
278 \r
279         result = mipi_dsih_ecc_rx(dsi_instance, 1);\r
280         if(OK != result){\r
281                 printf("sprdfb: [%s]: mipi_dsih_ecc_rx fail (%d)!\n", __FUNCTION__, result);\r
282                 return -1;\r
283         }\r
284 \r
285         result = mipi_dsih_eotp_rx(dsi_instance, 1);\r
286         if(OK != result){\r
287                 printf("sprdfb: [%s]: mipi_dsih_eotp_rx fail (%d)!\n", __FUNCTION__, result);\r
288                 return -1;\r
289         }\r
290 \r
291         result = mipi_dsih_eotp_tx(dsi_instance, 1);\r
292         if(OK != result){\r
293                 printf("sprdfb: [%s]: mipi_dsih_eotp_tx fail (%d)!\n", __FUNCTION__, result);\r
294                 return -1;\r
295         }\r
296 \r
297         if(SPRDFB_MIPI_MODE_VIDEO == mipi->work_mode){\r
298                 dsi_dpi_init(dev);\r
299         }
300 \r
301 #ifdef CONFIG_DSIH_VERSION_1P21A\r
302         mipi_dsih_dphy_enable_nc_clk(&(dsi_instance->phy_instance), 0);\r
303 #endif
304 \r
305         return 0;\r
306 }\r
307 \r
308 int32_t sprdfb_dsi_uninit(struct sprdfb_device *dev)\r
309 {\r
310         dsih_error_t result;\r
311 #ifdef CONFIG_DSIH_VERSION_1P21A\r
312         mipi_dsih_dphy_enable_hs_clk(&(dsi_ctx.dsi_inst.phy_instance), 0);\r
313 #else\r
314         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_IF_CTRL, 0);\r
315 #endif\r
316 \r
317         result = mipi_dsih_close(&(dsi_ctx.dsi_inst));\r
318         if(OK != result){\r
319                 printf("sprdfb: [%s]: sprdfb_dsi_uninit fail (%d)!\n", __FUNCTION__, result);\r
320                 return -1;\r
321         } else {\r
322             dsi_ctx.dsi_inst.status = NOT_INITIALIZED;\r
323                 dsi_ctx.is_inited = 0;\r
324         }\r
325 \r
326         mdelay(3);\r
327     dsi_disable();\r
328         return 0;\r
329 }\r
330 \r
331 int32_t sprdfb_dsi_ready(struct sprdfb_device *dev)\r
332 {\r
333         struct info_mipi * mipi = dev->panel->info.mipi;\r
334 \r
335         if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){\r
336                 mipi_dsih_cmd_mode(&(dsi_ctx.dsi_inst), 1);\r
337 #ifdef CONFIG_DSIH_VERSION_1P21A\r
338             mipi_dsih_dphy_enable_hs_clk(&(dsi_ctx.dsi_inst.phy_instance), 1);\r
339         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_CMD_MODE_CFG, 0x0);\r
340 #else\r
341                 dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_CMD_MODE_CFG, 0x1);\r
342                 dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_IF_CTRL, 0x1);\r
343 #endif\r
344         }else{\r
345 #ifdef CONFIG_DSIH_VERSION_1P21A\r
346         mipi_dsih_dphy_enable_hs_clk(&(dsi_ctx.dsi_inst.phy_instance), 1);\r
347 #else\r
348                 dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_IF_CTRL, 0x1);\r
349 #endif\r
350                 mipi_dsih_video_mode(&(dsi_ctx.dsi_inst), 1);\r
351                 dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PWR_UP, 0);\r
352                 udelay(100);\r
353                 dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PWR_UP, 1);\r
354                 udelay(10*1000);\r
355 #ifdef CONFIG_DSIH_VERSION_1P21A\r
356                 dsi_core_read_function(DSI_CTL_BEGIN, R_DSI_HOST_INT_ST0);\r
357                 dsi_core_read_function(DSI_CTL_BEGIN, R_DSI_HOST_INT_ST1);\r
358 #else\r
359                 dsi_core_read_function(DSI_CTL_BEGIN, R_DSI_HOST_ERROR_ST0);\r
360                 dsi_core_read_function(DSI_CTL_BEGIN, R_DSI_HOST_ERROR_ST1);\r
361 #endif\r
362         }\r
363         return 0;\r
364 }\r
365 \r
366 \r
367 static int32_t sprdfb_dsi_set_lp_mode(void)\r
368 {\r
369 #ifndef CONFIG_DSIH_VERSION_1P21A\r
370         uint32_t reg_val;\r
371 #endif\r
372         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
373 \r
374         mipi_dsih_cmd_mode(&(dsi_ctx.dsi_inst), 1);\r
375 #ifdef CONFIG_DSIH_VERSION_1P21A\r
376         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_CMD_MODE_CFG, 0x01ffff00);\r
377         mipi_dsih_dphy_enable_hs_clk(&(dsi_ctx.dsi_inst.phy_instance), 0);\r
378 #else\r
379         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_CMD_MODE_CFG, 0x1fff);\r
380         reg_val = dsi_core_read_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_IF_CTRL);\r
381         reg_val = reg_val & (~(BIT(0)));\r
382         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_IF_CTRL,  reg_val);\r
383 #endif\r
384         return 0;\r
385 }\r
386 \r
387 static int32_t sprdfb_dsi_set_hs_mode(void)\r
388 {\r
389         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
390 \r
391         mipi_dsih_cmd_mode(&(dsi_ctx.dsi_inst), 1);\r
392 #ifdef CONFIG_DSIH_VERSION_1P21A\r
393         mipi_dsih_dphy_enable_hs_clk(&(dsi_ctx.dsi_inst.phy_instance), 1);\r
394         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_CMD_MODE_CFG, 0x0);\r
395 #else\r
396         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_CMD_MODE_CFG, 0x1);\r
397         dsi_core_write_function(DSI_CTL_BEGIN, R_DSI_HOST_PHY_IF_CTRL, 0x1);\r
398 #endif\r
399         return 0;\r
400 }\r
401 \r
402 int32_t sprdfb_dsi_before_panel_reset(struct sprdfb_device *dev)\r
403 {\r
404         sprdfb_dsi_set_lp_mode();\r
405         return 0;\r
406 }\r
407 \r
408 static int32_t sprdfb_dsi_set_cmd_mode(void)\r
409 {\r
410         mipi_dsih_cmd_mode(&(dsi_ctx.dsi_inst), 1);\r
411         return 0;\r
412 }\r
413 \r
414 static int32_t sprdfb_dsi_set_video_mode(void)\r
415 {\r
416         mipi_dsih_video_mode(&(dsi_ctx.dsi_inst), 1);\r
417         return 0;\r
418 }\r
419 \r
420 static int32_t sprdfb_dsi_gen_write(uint8_t *param, uint16_t param_length)\r
421 {\r
422         dsih_error_t result;\r
423 \r
424         result = mipi_dsih_gen_wr_cmd(&(dsi_ctx.dsi_inst), 0, param, param_length);\r
425 \r
426         if(OK != result){\r
427                 printf("sprdfb: [%s] error (%d)\n", __FUNCTION__, result);\r
428                 return -1;\r
429         }\r
430         return 0;\r
431 }\r
432 \r
433 #define LCM_SEND(len) ((1 << 24)| len)
434 #define LCM_TAG_MASK  ((1 << 24) -1)
435
436 static unsigned char set_bl_seq[] = {
437         0x51, 0xFF
438 };
439 void backlight_control(int brigtness)
440 {
441         set_bl_seq[1] = brigtness;
442         printf("%s : %d\n", __func__, brigtness);
443         sprdfb_dsi_gen_write(set_bl_seq, LCM_SEND(2) & LCM_TAG_MASK);
444 }
445
446 static int32_t sprdfb_dsi_gen_read(uint8_t *param, uint16_t param_length, uint8_t bytes_to_read, uint8_t *read_buffer)\r
447 {\r
448         uint16_t result;\r
449         result = mipi_dsih_gen_rd_cmd(&(dsi_ctx.dsi_inst), 0, param, param_length, bytes_to_read, read_buffer);\r
450         if(0 == result){\r
451                 printf("sprdfb: [%s] error (%d)\n", __FUNCTION__, result);\r
452                 return -1;\r
453         }\r
454         return 0;\r
455 }\r
456 \r
457 static int32_t sprdfb_dsi_dcs_write(uint8_t *param, uint16_t param_length)\r
458 {\r
459         dsih_error_t result;\r
460         result = mipi_dsih_dcs_wr_cmd(&(dsi_ctx.dsi_inst), 0, param, param_length);\r
461         if(OK != result){\r
462                 printf("sprdfb: [%s] error (%d)\n", __FUNCTION__, result);\r
463                 return -1;\r
464         }\r
465         return 0;\r
466 }\r
467 \r
468 static int32_t sprdfb_dsi_dcs_read(uint8_t command, uint8_t bytes_to_read, uint8_t *read_buffer)\r
469 {\r
470         uint16_t result;\r
471         result = mipi_dsih_dcs_rd_cmd(&(dsi_ctx.dsi_inst), 0, command, bytes_to_read, read_buffer);\r
472         if(0 == result){\r
473                 printf("sprdfb: [%s] error (%d)\n", __FUNCTION__, result);\r
474                 return -1;\r
475         }\r
476         return 0;\r
477 }\r
478 \r
479 static int32_t sprd_dsi_force_write(uint8_t data_type, uint8_t *p_params, uint16_t param_length)\r
480 {\r
481         int32_t iRtn = 0;\r
482 \r
483         iRtn = mipi_dsih_gen_wr_packet(&(dsi_ctx.dsi_inst), 0, data_type,  p_params, param_length);\r
484 \r
485         return iRtn;\r
486 }\r
487 \r
488 static int32_t sprd_dsi_force_read(uint8_t command, uint8_t bytes_to_read, uint8_t * read_buffer)\r
489 {\r
490         int32_t iRtn = 0;\r
491 \r
492         iRtn = mipi_dsih_gen_rd_packet(&(dsi_ctx.dsi_inst),  0,  6,  0, command,  bytes_to_read, read_buffer);\r
493 \r
494         return iRtn;\r
495 }\r
496 \r
497 static int32_t sprd_dsi_eotp_set(uint8_t rx_en, uint8_t tx_en)\r
498 {\r
499         dsih_ctrl_t *curInstancePtr = &(dsi_ctx.dsi_inst);\r
500         if(0 == rx_en)\r
501                 mipi_dsih_eotp_rx(curInstancePtr, 0);\r
502         else if(1 == rx_en)\r
503                 mipi_dsih_eotp_rx(curInstancePtr, 1);\r
504         if(0 == tx_en)\r
505                 mipi_dsih_eotp_tx(curInstancePtr, 0);\r
506         else if(1 == tx_en)\r
507                 mipi_dsih_eotp_tx(curInstancePtr, 1);\r
508         return 0;\r
509 }\r
510 \r
511 struct ops_mipi sprdfb_mipi_ops = {\r
512         .mipi_set_cmd_mode = sprdfb_dsi_set_cmd_mode,\r
513         .mipi_set_video_mode = sprdfb_dsi_set_video_mode,\r
514         .mipi_set_lp_mode = sprdfb_dsi_set_lp_mode,\r
515         .mipi_set_hs_mode = sprdfb_dsi_set_hs_mode,\r
516         .mipi_gen_write = sprdfb_dsi_gen_write,\r
517         .mipi_gen_read = sprdfb_dsi_gen_read,\r
518         .mipi_dcs_write = sprdfb_dsi_dcs_write,\r
519         .mipi_dcs_read = sprdfb_dsi_dcs_read,\r
520         .mipi_force_write = sprd_dsi_force_write,\r
521         .mipi_force_read = sprd_dsi_force_read,\r
522         .mipi_eotp_set = sprd_dsi_eotp_set,\r
523 };\r