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