07071b0882a6116d11c22816ac02b75195a7b582
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / sprdfb_mipi.c
1 /*\r
2  * Copyright (C) 2012 Spreadtrum Communications Inc.\r
3  */\r
4 #include <common.h>\r
5 \r
6 #include <asm/arch/sprd_lcd.h>\r
7 #include <asm/arch/dispc_reg.h>\r
8 \r
9 \r
10 #include "sprdfb.h"\r
11 \r
12 extern struct ops_mipi sprdfb_mipi_ops;\r
13 \r
14 extern int32_t sprdfb_dsi_init(struct sprdfb_device *dev);\r
15 extern int32_t sprdfb_dsi_uninit(struct sprdfb_device *dev);\r
16 extern int32_t sprdfb_dsi_ready(struct sprdfb_device *dev);\r
17 \r
18 extern uint32_t rgb_calc_h_timing(struct timing_rgb *timing);\r
19 extern uint32_t rgb_calc_v_timing(struct timing_rgb *timing);\r
20 \r
21 \r
22 static uint32_t mipi_readid(struct panel_spec *self)\r
23 {\r
24         uint32_t id = 0;\r
25         return id;\r
26 }\r
27 \r
28 \r
29 static void mipi_dispc_init_config(struct panel_spec *panel)\r
30 {\r
31         uint32_t reg_val = 0;\r
32 \r
33         FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);\r
34 \r
35         if(NULL == panel){\r
36                 printf("sprdfb: [%s] fail.(Invalid Param)\n", __FUNCTION__);\r
37                 return;\r
38         }\r
39 \r
40         if(SPRDFB_PANEL_TYPE_MIPI != panel->type){\r
41                 printf("sprdfb: [%s] fail.(not  mcu panel)\n", __FUNCTION__);\r
42                 return;\r
43         }\r
44 \r
45         if(SPRDFB_MIPI_MODE_CMD == panel->info.mipi->work_mode){\r
46                 /*use edpi as interface*/\r
47 #if defined(CONFIG_SC8830) || defined(CONFIG_SC9630)\r
48                 dispc_write(0x3, DISPC_CTRL);\r
49 #else\r
50                 dispc_set_bits((1<<1), DISPC_CTRL);\r
51 #endif\r
52         }else{\r
53                 /*use dpi as interface*/\r
54 #if defined(CONFIG_SC8830) || defined(CONFIG_SC9630)\r
55                 dispc_write(0x1, DISPC_CTRL);\r
56 #endif\r
57         }\r
58 \r
59         /*h sync pol*/\r
60         if(SPRDFB_POLARITY_NEG == panel->info.mipi->h_sync_pol){\r
61                 reg_val |= (1<<0);\r
62         }\r
63 \r
64         /*v sync pol*/\r
65         if(SPRDFB_POLARITY_NEG == panel->info.mipi->v_sync_pol){\r
66                 reg_val |= (1<<1);\r
67         }\r
68 \r
69         /*de sync pol*/\r
70         if(SPRDFB_POLARITY_NEG == panel->info.mipi->de_pol){\r
71                 reg_val |= (1<<2);\r
72         }\r
73 \r
74         if(SPRDFB_MIPI_MODE_VIDEO == panel->info.mipi->work_mode){\r
75 #ifdef CONFIG_DPI_SINGLE_RUN\r
76                 /*single run mode*/\r
77                 reg_val |= (1<<3);\r
78 #endif\r
79         }else{\r
80                 if(!(panel->cap & PANEL_CAP_NOT_TEAR_SYNC)){\r
81                         printf("sprdfb: mipi_dispc_init_config not support TE\n");\r
82                         /*enable te*/\r
83                         reg_val |= (1<<8);\r
84                 }\r
85                 /*te pol*/\r
86                 if(SPRDFB_POLARITY_NEG == panel->info.mipi->te_pol){\r
87                         reg_val |= (1<<9);\r
88                 }\r
89                 /*use external te*/\r
90                 reg_val |= (1<<10);\r
91         }\r
92 \r
93         /*dpi bits*/\r
94         switch(panel->info.rgb->video_bus_width){\r
95         case 16:\r
96                 break;\r
97         case 18:\r
98                 reg_val |= (1 << 6);\r
99                 break;\r
100         case 24:\r
101                 reg_val |= (2 << 6);\r
102                 break;\r
103         default:\r
104                 break;\r
105         }\r
106 \r
107         dispc_write(reg_val, DISPC_DPI_CTRL);\r
108 \r
109         FB_PRINT("sprdfb: [%s] DISPC_DPI_CTRL = 0x%x\n", __FUNCTION__, dispc_read(DISPC_DPI_CTRL));\r
110 }\r
111 \r
112 static void mipi_dispc_set_timing(struct sprdfb_device *dev)\r
113 {\r
114         FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);\r
115 \r
116         dispc_write(dev->panel_timing.rgb_timing[RGB_LCD_H_TIMING], DISPC_DPI_H_TIMING);\r
117         dispc_write(dev->panel_timing.rgb_timing[RGB_LCD_V_TIMING], DISPC_DPI_V_TIMING);\r
118 }\r
119 \r
120 static int32_t sprdfb_mipi_panel_check(struct panel_spec *panel)\r
121 {\r
122         if(NULL == panel){\r
123                 printf("sprdfb: [%s] fail. (Invalid param)\n", __FUNCTION__);\r
124                 return 0;\r
125         }\r
126 \r
127         if(SPRDFB_PANEL_TYPE_MIPI != panel->type){\r
128                 printf("sprdfb: [%s] fail. (not mipi param)\n", __FUNCTION__);\r
129                 return 0;\r
130         }\r
131 \r
132         FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);\r
133 \r
134         return 1;\r
135 }\r
136 \r
137 static void sprdfb_mipi_panel_mount(struct sprdfb_device *dev)\r
138 {\r
139         if((NULL == dev) || (NULL == dev->panel)){\r
140                 printf("sprdfb: [%s]: Invalid Param\n", __FUNCTION__);\r
141                 return;\r
142         }\r
143 \r
144         FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);\r
145 \r
146         if(SPRDFB_MIPI_MODE_CMD == dev->panel->info.mipi->work_mode){\r
147                 dev->panel_if_type = SPRDFB_PANEL_IF_EDPI;\r
148         }else{\r
149                 dev->panel_if_type = SPRDFB_PANEL_IF_DPI;\r
150         }\r
151 \r
152         dev->panel->info.mipi->ops = &sprdfb_mipi_ops;\r
153 \r
154         if(NULL == dev->panel->ops->panel_readid){\r
155                 dev->panel->ops->panel_readid = mipi_readid;\r
156         }\r
157 \r
158         dev->panel_timing.rgb_timing[RGB_LCD_H_TIMING] = rgb_calc_h_timing(dev->panel->info.mipi->timing);\r
159         dev->panel_timing.rgb_timing[RGB_LCD_V_TIMING] = rgb_calc_v_timing(dev->panel->info.mipi->timing);\r
160 }\r
161 \r
162 static void sprdfb_mipi_panel_init(struct sprdfb_device *dev)\r
163 {\r
164         sprdfb_dsi_init(dev);\r
165 \r
166         mipi_dispc_init_config(dev->panel);\r
167         mipi_dispc_set_timing(dev);\r
168 }\r
169 \r
170 static void sprdfb_mipi_panel_uninit(struct sprdfb_device *dev)\r
171 {\r
172         sprdfb_dsi_uninit(dev);\r
173 }\r
174 \r
175 static void sprdfb_mipi_panel_ready(struct sprdfb_device *dev)\r
176 {\r
177         sprdfb_dsi_ready(dev);\r
178 }\r
179 \r
180 static void sprdfb_mipi_panel_suspend(struct sprdfb_device *dev)\r
181 {\r
182         sprdfb_dsi_uninit(dev);\r
183 }\r
184 \r
185 static void sprdfb_mipi_panel_resume(struct sprdfb_device *dev)\r
186 {\r
187         sprdfb_dsi_init(dev);\r
188 }\r
189 \r
190 \r
191 struct panel_if_ctrl sprdfb_mipi_ctrl = {\r
192         .if_name                = "mipi",\r
193         .panel_if_check         = sprdfb_mipi_panel_check,\r
194         .panel_if_mount                 = sprdfb_mipi_panel_mount,\r
195         .panel_if_init          = sprdfb_mipi_panel_init,\r
196         .panel_if_uninit                = sprdfb_mipi_panel_uninit,\r
197         .panel_if_ready         =sprdfb_mipi_panel_ready,\r
198         .panel_if_before_refresh        = NULL,\r
199         .panel_if_after_refresh = NULL,\r
200         .panel_if_suspend = sprdfb_mipi_panel_suspend,\r
201         .panel_if_resume = sprdfb_mipi_panel_resume,\r
202 };\r
203 \r