GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / drivers / staging / msm / ebi2_tmd20.c
blob8b1c1c44d0db159b80fbbd0d72db033a5f179109
1 /* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
18 #include "msm_fb.h"
20 #include <linux/memory.h>
21 #include <linux/kernel.h>
22 #include <linux/sched.h>
23 #include <linux/time.h>
24 #include <linux/init.h>
25 #include <linux/interrupt.h>
26 #include "linux/proc_fs.h"
28 #include <linux/delay.h>
30 #include <mach/hardware.h>
31 #include <linux/io.h>
33 #include <asm/system.h>
34 #include <asm/mach-types.h>
36 /* #define TMD20QVGA_LCD_18BPP */
37 #define QVGA_WIDTH 240
38 #define QVGA_HEIGHT 320
40 #ifdef TMD20QVGA_LCD_18BPP
41 #define DISP_QVGA_18BPP(x) ((((x)<<2) & 0x3FC00)|(( (x)<<1)& 0x1FE))
42 #define DISP_REG(name) uint32 register_##name;
43 #define OUTPORT(x, y) outpdw(x, y)
44 #define INPORT(x) inpdw(x)
45 #else
46 #define DISP_QVGA_18BPP(x) (x)
47 #define DISP_REG(name) uint16 register_##name;
48 #define OUTPORT(x, y) outpw(x, y)
49 #define INPORT(x) intpw(x)
50 #endif
52 static void *DISP_CMD_PORT;
53 static void *DISP_DATA_PORT;
55 #define DISP_RNTI 0x10
57 #define DISP_CMD_OUT(cmd) OUTPORT(DISP_CMD_PORT, DISP_QVGA_18BPP(cmd))
58 #define DISP_DATA_OUT(data) OUTPORT(DISP_DATA_PORT, data)
59 #define DISP_DATA_IN() INPORT(DISP_DATA_PORT)
61 #if defined(TMD20QVGA_LCD_18BPP)
62 #define DISP_DATA_OUT_16TO18BPP(x) \
63 DISP_DATA_OUT((((x)&0xf800)<<2|((x)&0x80000)>>3) \
64 | (((x)&0x7e0)<<1) \
65 | (((x)&0x1F)<<1|((x)&0x10)>>4))
66 #else
67 #define DISP_DATA_OUT_16TO18BPP(x) \
68 DISP_DATA_OUT(x)
69 #endif
71 #define DISP_WRITE_OUT(addr, data) \
72 register_##addr = DISP_QVGA_18BPP(data); \
73 DISP_CMD_OUT(addr); \
74 DISP_DATA_OUT(register_##addr);
76 #define DISP_UPDATE_VALUE(addr, bitmask, data) \
77 DISP_WRITE_OUT(##addr, (register_##addr & ~(bitmask)) | (data));
79 #define DISP_VAL_IF(bitvalue, bitmask) \
80 ((bitvalue) ? (bitmask) : 0)
82 /* QVGA = 256 x 320 */
83 /* actual display is 240 x 320...offset by 0x10 */
84 #define DISP_ROW_COL_TO_ADDR(row, col) ((row) * 0x100 + col)
85 #define DISP_SET_RECT(ulhc_row, lrhc_row, ulhc_col, lrhc_col) \
86 { \
87 DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_1_ADDR, (ulhc_col) + tmd20qvga_panel_offset); \
88 DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_2_ADDR, (lrhc_col) + tmd20qvga_panel_offset); \
89 DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_1_ADDR, (ulhc_row)); \
90 DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_2_ADDR, (lrhc_row)); \
91 DISP_WRITE_OUT(DISP_RAM_ADDR_SET_1_ADDR, (ulhc_col) + tmd20qvga_panel_offset); \
92 DISP_WRITE_OUT(DISP_RAM_ADDR_SET_2_ADDR, (ulhc_row)); \
95 #define WAIT_MSEC(msec) mdelay(msec)
98 * TMD QVGA Address
100 /* Display Control */
101 #define DISP_START_OSCILLATION_ADDR 0x000
102 DISP_REG(DISP_START_OSCILLATION_ADDR)
103 #define DISP_DRIVER_OUTPUT_CTL_ADDR 0x001
104 DISP_REG(DISP_DRIVER_OUTPUT_CTL_ADDR)
105 #define DISP_LCD_DRIVING_SIG_ADDR 0x002
106 DISP_REG(DISP_LCD_DRIVING_SIG_ADDR)
107 #define DISP_ENTRY_MODE_ADDR 0x003
108 DISP_REG(DISP_ENTRY_MODE_ADDR)
109 #define DISP_DISPLAY_CTL_1_ADDR 0x007
110 DISP_REG(DISP_DISPLAY_CTL_1_ADDR)
111 #define DISP_DISPLAY_CTL_2_ADDR 0x008
112 DISP_REG(DISP_DISPLAY_CTL_2_ADDR)
114 /* DISPLAY MODE 0x009 partial display not supported */
115 #define DISP_POWER_SUPPLY_INTF_ADDR 0x00A
116 DISP_REG(DISP_POWER_SUPPLY_INTF_ADDR)
118 /* DISPLAY MODE 0x00B xZoom feature is not supported */
119 #define DISP_EXT_DISPLAY_CTL_1_ADDR 0x00C
120 DISP_REG(DISP_EXT_DISPLAY_CTL_1_ADDR)
122 #define DISP_FRAME_CYCLE_CTL_ADDR 0x00D
123 DISP_REG(DISP_FRAME_CYCLE_CTL_ADDR)
125 #define DISP_EXT_DISPLAY_CTL_2_ADDR 0x00E
126 DISP_REG(DISP_EXT_DISPLAY_CTL_2_ADDR)
128 #define DISP_EXT_DISPLAY_CTL_3_ADDR 0x00F
129 DISP_REG(DISP_EXT_DISPLAY_CTL_3_ADDR)
131 #define DISP_LTPS_CTL_1_ADDR 0x012
132 DISP_REG(DISP_LTPS_CTL_1_ADDR)
133 #define DISP_LTPS_CTL_2_ADDR 0x013
134 DISP_REG(DISP_LTPS_CTL_2_ADDR)
135 #define DISP_LTPS_CTL_3_ADDR 0x014
136 DISP_REG(DISP_LTPS_CTL_3_ADDR)
137 #define DISP_LTPS_CTL_4_ADDR 0x018
138 DISP_REG(DISP_LTPS_CTL_4_ADDR)
139 #define DISP_LTPS_CTL_5_ADDR 0x019
140 DISP_REG(DISP_LTPS_CTL_5_ADDR)
141 #define DISP_LTPS_CTL_6_ADDR 0x01A
142 DISP_REG(DISP_LTPS_CTL_6_ADDR)
143 #define DISP_AMP_SETTING_ADDR 0x01C
144 DISP_REG(DISP_AMP_SETTING_ADDR)
145 #define DISP_MODE_SETTING_ADDR 0x01D
146 DISP_REG(DISP_MODE_SETTING_ADDR)
147 #define DISP_POFF_LN_SETTING_ADDR 0x01E
148 DISP_REG(DISP_POFF_LN_SETTING_ADDR)
149 /* Power Contol */
150 #define DISP_POWER_CTL_1_ADDR 0x100
151 DISP_REG(DISP_POWER_CTL_1_ADDR)
152 #define DISP_POWER_CTL_2_ADDR 0x101
153 DISP_REG(DISP_POWER_CTL_2_ADDR)
154 #define DISP_POWER_CTL_3_ADDR 0x102
155 DISP_REG(DISP_POWER_CTL_3_ADDR)
156 #define DISP_POWER_CTL_4_ADDR 0x103
157 DISP_REG(DISP_POWER_CTL_4_ADDR)
158 #define DISP_POWER_CTL_5_ADDR 0x104
159 DISP_REG(DISP_POWER_CTL_5_ADDR)
160 #define DISP_POWER_CTL_6_ADDR 0x105
161 DISP_REG(DISP_POWER_CTL_6_ADDR)
162 #define DISP_POWER_CTL_7_ADDR 0x106
163 DISP_REG(DISP_POWER_CTL_7_ADDR)
164 /* RAM Access */
165 #define DISP_RAM_ADDR_SET_1_ADDR 0x200
166 DISP_REG(DISP_RAM_ADDR_SET_1_ADDR)
167 #define DISP_RAM_ADDR_SET_2_ADDR 0x201
168 DISP_REG(DISP_RAM_ADDR_SET_2_ADDR)
169 #define DISP_CMD_RAMRD DISP_CMD_RAMWR
170 #define DISP_CMD_RAMWR 0x202
171 DISP_REG(DISP_CMD_RAMWR)
172 #define DISP_RAM_DATA_MASK_1_ADDR 0x203
173 DISP_REG(DISP_RAM_DATA_MASK_1_ADDR)
174 #define DISP_RAM_DATA_MASK_2_ADDR 0x204
175 DISP_REG(DISP_RAM_DATA_MASK_2_ADDR)
176 /* Gamma Control, Contrast, Gray Scale Setting */
177 #define DISP_GAMMA_CONTROL_1_ADDR 0x300
178 DISP_REG(DISP_GAMMA_CONTROL_1_ADDR)
179 #define DISP_GAMMA_CONTROL_2_ADDR 0x301
180 DISP_REG(DISP_GAMMA_CONTROL_2_ADDR)
181 #define DISP_GAMMA_CONTROL_3_ADDR 0x302
182 DISP_REG(DISP_GAMMA_CONTROL_3_ADDR)
183 #define DISP_GAMMA_CONTROL_4_ADDR 0x303
184 DISP_REG(DISP_GAMMA_CONTROL_4_ADDR)
185 #define DISP_GAMMA_CONTROL_5_ADDR 0x304
186 DISP_REG(DISP_GAMMA_CONTROL_5_ADDR)
187 /* Coordinate Control */
188 #define DISP_VERT_SCROLL_CTL_1_ADDR 0x400
189 DISP_REG(DISP_VERT_SCROLL_CTL_1_ADDR)
190 #define DISP_VERT_SCROLL_CTL_2_ADDR 0x401
191 DISP_REG(DISP_VERT_SCROLL_CTL_2_ADDR)
192 #define DISP_SCREEN_1_DRV_POS_1_ADDR 0x402
193 DISP_REG(DISP_SCREEN_1_DRV_POS_1_ADDR)
194 #define DISP_SCREEN_1_DRV_POS_2_ADDR 0x403
195 DISP_REG(DISP_SCREEN_1_DRV_POS_2_ADDR)
196 #define DISP_SCREEN_2_DRV_POS_1_ADDR 0x404
197 DISP_REG(DISP_SCREEN_2_DRV_POS_1_ADDR)
198 #define DISP_SCREEN_2_DRV_POS_2_ADDR 0x405
199 DISP_REG(DISP_SCREEN_2_DRV_POS_2_ADDR)
200 #define DISP_HORZ_RAM_ADDR_POS_1_ADDR 0x406
201 DISP_REG(DISP_HORZ_RAM_ADDR_POS_1_ADDR)
202 #define DISP_HORZ_RAM_ADDR_POS_2_ADDR 0x407
203 DISP_REG(DISP_HORZ_RAM_ADDR_POS_2_ADDR)
204 #define DISP_VERT_RAM_ADDR_POS_1_ADDR 0x408
205 DISP_REG(DISP_VERT_RAM_ADDR_POS_1_ADDR)
206 #define DISP_VERT_RAM_ADDR_POS_2_ADDR 0x409
207 DISP_REG(DISP_VERT_RAM_ADDR_POS_2_ADDR)
208 #define DISP_TMD_700_ADDR 0x700 /* 0x700 */
209 DISP_REG(DISP_TMD_700_ADDR)
210 #define DISP_TMD_015_ADDR 0x015 /* 0x700 */
211 DISP_REG(DISP_TMD_015_ADDR)
212 #define DISP_TMD_305_ADDR 0x305 /* 0x700 */
213 DISP_REG(DISP_TMD_305_ADDR)
216 * TMD QVGA Bit Definations
219 #define DISP_BIT_IB15 0x8000
220 #define DISP_BIT_IB14 0x4000
221 #define DISP_BIT_IB13 0x2000
222 #define DISP_BIT_IB12 0x1000
223 #define DISP_BIT_IB11 0x0800
224 #define DISP_BIT_IB10 0x0400
225 #define DISP_BIT_IB09 0x0200
226 #define DISP_BIT_IB08 0x0100
227 #define DISP_BIT_IB07 0x0080
228 #define DISP_BIT_IB06 0x0040
229 #define DISP_BIT_IB05 0x0020
230 #define DISP_BIT_IB04 0x0010
231 #define DISP_BIT_IB03 0x0008
232 #define DISP_BIT_IB02 0x0004
233 #define DISP_BIT_IB01 0x0002
234 #define DISP_BIT_IB00 0x0001
236 * Display Control
237 * DISP_START_OSCILLATION_ADDR Start Oscillation
238 * DISP_DRIVER_OUTPUT_CTL_ADDR Driver Output Control
240 #define DISP_BITMASK_SS DISP_BIT_IB08
241 #define DISP_BITMASK_NL5 DISP_BIT_IB05
242 #define DISP_BITMASK_NL4 DISP_BIT_IB04
243 #define DISP_BITMASK_NL3 DISP_BIT_IB03
244 #define DISP_BITMASK_NL2 DISP_BIT_IB02
245 #define DISP_BITMASK_NL1 DISP_BIT_IB01
246 #define DISP_BITMASK_NL0 DISP_BIT_IB00
247 /* DISP_LCD_DRIVING_SIG_ADDR LCD Driving Signal Setting */
248 #define DISP_BITMASK_BC DISP_BIT_IB09
249 /* DISP_ENTRY_MODE_ADDR Entry Mode */
250 #define DISP_BITMASK_TRI DISP_BIT_IB15
251 #define DISP_BITMASK_DFM1 DISP_BIT_IB14
252 #define DISP_BITMASK_DFM0 DISP_BIT_IB13
253 #define DISP_BITMASK_BGR DISP_BIT_IB12
254 #define DISP_BITMASK_HWM0 DISP_BIT_IB08
255 #define DISP_BITMASK_ID1 DISP_BIT_IB05
256 #define DISP_BITMASK_ID0 DISP_BIT_IB04
257 #define DISP_BITMASK_AM DISP_BIT_IB03
258 /* DISP_DISPLAY_CTL_1_ADDR Display Control (1) */
259 #define DISP_BITMASK_COL1 DISP_BIT_IB15
260 #define DISP_BITMASK_COL0 DISP_BIT_IB14
261 #define DISP_BITMASK_VLE2 DISP_BIT_IB10
262 #define DISP_BITMASK_VLE1 DISP_BIT_IB09
263 #define DISP_BITMASK_SPT DISP_BIT_IB08
264 #define DISP_BITMASK_PT1 DISP_BIT_IB07
265 #define DISP_BITMASK_PT0 DISP_BIT_IB06
266 #define DISP_BITMASK_REV DISP_BIT_IB02
267 /* DISP_DISPLAY_CTL_2_ADDR Display Control (2) */
268 #define DISP_BITMASK_FP3 DISP_BIT_IB11
269 #define DISP_BITMASK_FP2 DISP_BIT_IB10
270 #define DISP_BITMASK_FP1 DISP_BIT_IB09
271 #define DISP_BITMASK_FP0 DISP_BIT_IB08
272 #define DISP_BITMASK_BP3 DISP_BIT_IB03
273 #define DISP_BITMASK_BP2 DISP_BIT_IB02
274 #define DISP_BITMASK_BP1 DISP_BIT_IB01
275 #define DISP_BITMASK_BP0 DISP_BIT_IB00
276 /* DISP_POWER_SUPPLY_INTF_ADDR Power Supply IC Interface Control */
277 #define DISP_BITMASK_CSE DISP_BIT_IB12
278 #define DISP_BITMASK_TE DISP_BIT_IB08
279 #define DISP_BITMASK_IX3 DISP_BIT_IB03
280 #define DISP_BITMASK_IX2 DISP_BIT_IB02
281 #define DISP_BITMASK_IX1 DISP_BIT_IB01
282 #define DISP_BITMASK_IX0 DISP_BIT_IB00
283 /* DISP_EXT_DISPLAY_CTL_1_ADDR External Display Interface Control (1) */
284 #define DISP_BITMASK_RM DISP_BIT_IB08
285 #define DISP_BITMASK_DM1 DISP_BIT_IB05
286 #define DISP_BITMASK_DM0 DISP_BIT_IB04
287 #define DISP_BITMASK_RIM1 DISP_BIT_IB01
288 #define DISP_BITMASK_RIM0 DISP_BIT_IB00
289 /* DISP_FRAME_CYCLE_CTL_ADDR Frame Frequency Adjustment Control */
290 #define DISP_BITMASK_DIVI1 DISP_BIT_IB09
291 #define DISP_BITMASK_DIVI0 DISP_BIT_IB08
292 #define DISP_BITMASK_RTNI4 DISP_BIT_IB04
293 #define DISP_BITMASK_RTNI3 DISP_BIT_IB03
294 #define DISP_BITMASK_RTNI2 DISP_BIT_IB02
295 #define DISP_BITMASK_RTNI1 DISP_BIT_IB01
296 #define DISP_BITMASK_RTNI0 DISP_BIT_IB00
297 /* DISP_EXT_DISPLAY_CTL_2_ADDR External Display Interface Control (2) */
298 #define DISP_BITMASK_DIVE1 DISP_BIT_IB09
299 #define DISP_BITMASK_DIVE0 DISP_BIT_IB08
300 #define DISP_BITMASK_RTNE7 DISP_BIT_IB07
301 #define DISP_BITMASK_RTNE6 DISP_BIT_IB06
302 #define DISP_BITMASK_RTNE5 DISP_BIT_IB05
303 #define DISP_BITMASK_RTNE4 DISP_BIT_IB04
304 #define DISP_BITMASK_RTNE3 DISP_BIT_IB03
305 #define DISP_BITMASK_RTNE2 DISP_BIT_IB02
306 #define DISP_BITMASK_RTNE1 DISP_BIT_IB01
307 #define DISP_BITMASK_RTNE0 DISP_BIT_IB00
308 /* DISP_EXT_DISPLAY_CTL_3_ADDR External Display Interface Control (3) */
309 #define DISP_BITMASK_VSPL DISP_BIT_IB04
310 #define DISP_BITMASK_HSPL DISP_BIT_IB03
311 #define DISP_BITMASK_VPL DISP_BIT_IB02
312 #define DISP_BITMASK_EPL DISP_BIT_IB01
313 #define DISP_BITMASK_DPL DISP_BIT_IB00
314 /* DISP_LTPS_CTL_1_ADDR LTPS Interface Control (1) */
315 #define DISP_BITMASK_CLWI3 DISP_BIT_IB11
316 #define DISP_BITMASK_CLWI2 DISP_BIT_IB10
317 #define DISP_BITMASK_CLWI1 DISP_BIT_IB09
318 #define DISP_BITMASK_CLWI0 DISP_BIT_IB08
319 #define DISP_BITMASK_CLTI1 DISP_BIT_IB01
320 #define DISP_BITMASK_CLTI0 DISP_BIT_IB00
321 /* DISP_LTPS_CTL_2_ADDR LTPS Interface Control (2) */
322 #define DISP_BITMASK_OEVBI1 DISP_BIT_IB09
323 #define DISP_BITMASK_OEVBI0 DISP_BIT_IB08
324 #define DISP_BITMASK_OEVFI1 DISP_BIT_IB01
325 #define DISP_BITMASK_OEVFI0 DISP_BIT_IB00
326 /* DISP_LTPS_CTL_3_ADDR LTPS Interface Control (3) */
327 #define DISP_BITMASK_SHI1 DISP_BIT_IB01
328 #define DISP_BITMASK_SHI0 DISP_BIT_IB00
329 /* DISP_LTPS_CTL_4_ADDR LTPS Interface Control (4) */
330 #define DISP_BITMASK_CLWE5 DISP_BIT_IB13
331 #define DISP_BITMASK_CLWE4 DISP_BIT_IB12
332 #define DISP_BITMASK_CLWE3 DISP_BIT_IB11
333 #define DISP_BITMASK_CLWE2 DISP_BIT_IB10
334 #define DISP_BITMASK_CLWE1 DISP_BIT_IB09
335 #define DISP_BITMASK_CLWE0 DISP_BIT_IB08
336 #define DISP_BITMASK_CLTE3 DISP_BIT_IB03
337 #define DISP_BITMASK_CLTE2 DISP_BIT_IB02
338 #define DISP_BITMASK_CLTE1 DISP_BIT_IB01
339 #define DISP_BITMASK_CLTE0 DISP_BIT_IB00
340 /* DISP_LTPS_CTL_5_ADDR LTPS Interface Control (5) */
341 #define DISP_BITMASK_OEVBE3 DISP_BIT_IB11
342 #define DISP_BITMASK_OEVBE2 DISP_BIT_IB10
343 #define DISP_BITMASK_OEVBE1 DISP_BIT_IB09
344 #define DISP_BITMASK_OEVBE0 DISP_BIT_IB08
345 #define DISP_BITMASK_OEVFE3 DISP_BIT_IB03
346 #define DISP_BITMASK_OEVFE2 DISP_BIT_IB02
347 #define DISP_BITMASK_OEVFE1 DISP_BIT_IB01
348 #define DISP_BITMASK_OEVFE0 DISP_BIT_IB00
349 /* DISP_LTPS_CTL_6_ADDR LTPS Interface Control (6) */
350 #define DISP_BITMASK_SHE3 DISP_BIT_IB03
351 #define DISP_BITMASK_SHE2 DISP_BIT_IB02
352 #define DISP_BITMASK_SHE1 DISP_BIT_IB01
353 #define DISP_BITMASK_SHE0 DISP_BIT_IB00
354 /* DISP_AMP_SETTING_ADDR Amplify Setting */
355 #define DISP_BITMASK_ABSW1 DISP_BIT_IB01
356 #define DISP_BITMASK_ABSW0 DISP_BIT_IB00
357 /* DISP_MODE_SETTING_ADDR Mode Setting */
358 #define DISP_BITMASK_DSTB DISP_BIT_IB02
359 #define DISP_BITMASK_STB DISP_BIT_IB00
360 /* DISP_POFF_LN_SETTING_ADDR Power Off Line Setting */
361 #define DISP_BITMASK_POFH3 DISP_BIT_IB03
362 #define DISP_BITMASK_POFH2 DISP_BIT_IB02
363 #define DISP_BITMASK_POFH1 DISP_BIT_IB01
364 #define DISP_BITMASK_POFH0 DISP_BIT_IB00
366 /* Power Contol */
367 /* DISP_POWER_CTL_1_ADDR Power Control (1) */
368 #define DISP_BITMASK_PO DISP_BIT_IB11
369 #define DISP_BITMASK_VCD DISP_BIT_IB09
370 #define DISP_BITMASK_VSC DISP_BIT_IB08
371 #define DISP_BITMASK_CON DISP_BIT_IB07
372 #define DISP_BITMASK_ASW1 DISP_BIT_IB06
373 #define DISP_BITMASK_ASW0 DISP_BIT_IB05
374 #define DISP_BITMASK_OEV DISP_BIT_IB04
375 #define DISP_BITMASK_OEVE DISP_BIT_IB03
376 #define DISP_BITMASK_FR DISP_BIT_IB02
377 #define DISP_BITMASK_D1 DISP_BIT_IB01
378 #define DISP_BITMASK_D0 DISP_BIT_IB00
379 /* DISP_POWER_CTL_2_ADDR Power Control (2) */
380 #define DISP_BITMASK_DC4 DISP_BIT_IB15
381 #define DISP_BITMASK_DC3 DISP_BIT_IB14
382 #define DISP_BITMASK_SAP2 DISP_BIT_IB13
383 #define DISP_BITMASK_SAP1 DISP_BIT_IB12
384 #define DISP_BITMASK_SAP0 DISP_BIT_IB11
385 #define DISP_BITMASK_BT2 DISP_BIT_IB10
386 #define DISP_BITMASK_BT1 DISP_BIT_IB09
387 #define DISP_BITMASK_BT0 DISP_BIT_IB08
388 #define DISP_BITMASK_DC2 DISP_BIT_IB07
389 #define DISP_BITMASK_DC1 DISP_BIT_IB06
390 #define DISP_BITMASK_DC0 DISP_BIT_IB05
391 #define DISP_BITMASK_AP2 DISP_BIT_IB04
392 #define DISP_BITMASK_AP1 DISP_BIT_IB03
393 #define DISP_BITMASK_AP0 DISP_BIT_IB02
394 /* DISP_POWER_CTL_3_ADDR Power Control (3) */
395 #define DISP_BITMASK_VGL4 DISP_BIT_IB10
396 #define DISP_BITMASK_VGL3 DISP_BIT_IB09
397 #define DISP_BITMASK_VGL2 DISP_BIT_IB08
398 #define DISP_BITMASK_VGL1 DISP_BIT_IB07
399 #define DISP_BITMASK_VGL0 DISP_BIT_IB06
400 #define DISP_BITMASK_VGH4 DISP_BIT_IB04
401 #define DISP_BITMASK_VGH3 DISP_BIT_IB03
402 #define DISP_BITMASK_VGH2 DISP_BIT_IB02
403 #define DISP_BITMASK_VGH1 DISP_BIT_IB01
404 #define DISP_BITMASK_VGH0 DISP_BIT_IB00
405 /* DISP_POWER_CTL_4_ADDR Power Control (4) */
406 #define DISP_BITMASK_VC2 DISP_BIT_IB02
407 #define DISP_BITMASK_VC1 DISP_BIT_IB01
408 #define DISP_BITMASK_VC0 DISP_BIT_IB00
409 /* DISP_POWER_CTL_5_ADDR Power Control (5) */
410 #define DISP_BITMASK_VRL3 DISP_BIT_IB11
411 #define DISP_BITMASK_VRL2 DISP_BIT_IB10
412 #define DISP_BITMASK_VRL1 DISP_BIT_IB09
413 #define DISP_BITMASK_VRL0 DISP_BIT_IB08
414 #define DISP_BITMASK_PON DISP_BIT_IB04
415 #define DISP_BITMASK_VRH3 DISP_BIT_IB03
416 #define DISP_BITMASK_VRH2 DISP_BIT_IB02
417 #define DISP_BITMASK_VRH1 DISP_BIT_IB01
418 #define DISP_BITMASK_VRH0 DISP_BIT_IB00
419 /* DISP_POWER_CTL_6_ADDR Power Control (6) */
420 #define DISP_BITMASK_VCOMG DISP_BIT_IB13
421 #define DISP_BITMASK_VDV4 DISP_BIT_IB12
422 #define DISP_BITMASK_VDV3 DISP_BIT_IB11
423 #define DISP_BITMASK_VDV2 DISP_BIT_IB10
424 #define DISP_BITMASK_VDV1 DISP_BIT_IB09
425 #define DISP_BITMASK_VDV0 DISP_BIT_IB08
426 #define DISP_BITMASK_VCM4 DISP_BIT_IB04
427 #define DISP_BITMASK_VCM3 DISP_BIT_IB03
428 #define DISP_BITMASK_VCM2 DISP_BIT_IB02
429 #define DISP_BITMASK_VCM1 DISP_BIT_IB01
430 #define DISP_BITMASK_VCM0 DISP_BIT_IB00
431 /* RAM Access */
432 /* DISP_RAM_ADDR_SET_1_ADDR RAM Address Set (1) */
433 #define DISP_BITMASK_AD7 DISP_BIT_IB07
434 #define DISP_BITMASK_AD6 DISP_BIT_IB06
435 #define DISP_BITMASK_AD5 DISP_BIT_IB05
436 #define DISP_BITMASK_AD4 DISP_BIT_IB04
437 #define DISP_BITMASK_AD3 DISP_BIT_IB03
438 #define DISP_BITMASK_AD2 DISP_BIT_IB02
439 #define DISP_BITMASK_AD1 DISP_BIT_IB01
440 #define DISP_BITMASK_AD0 DISP_BIT_IB00
441 /* DISP_RAM_ADDR_SET_2_ADDR RAM Address Set (2) */
442 #define DISP_BITMASK_AD16 DISP_BIT_IB08
443 #define DISP_BITMASK_AD15 DISP_BIT_IB07
444 #define DISP_BITMASK_AD14 DISP_BIT_IB06
445 #define DISP_BITMASK_AD13 DISP_BIT_IB05
446 #define DISP_BITMASK_AD12 DISP_BIT_IB04
447 #define DISP_BITMASK_AD11 DISP_BIT_IB03
448 #define DISP_BITMASK_AD10 DISP_BIT_IB02
449 #define DISP_BITMASK_AD9 DISP_BIT_IB01
450 #define DISP_BITMASK_AD8 DISP_BIT_IB00
452 * DISP_CMD_RAMWR RAM Data Read/Write
453 * Use Data Bit Configuration
455 /* DISP_RAM_DATA_MASK_1_ADDR RAM Write Data Mask (1) */
456 #define DISP_BITMASK_WM11 DISP_BIT_IB13
457 #define DISP_BITMASK_WM10 DISP_BIT_IB12
458 #define DISP_BITMASK_WM9 DISP_BIT_IB11
459 #define DISP_BITMASK_WM8 DISP_BIT_IB10
460 #define DISP_BITMASK_WM7 DISP_BIT_IB09
461 #define DISP_BITMASK_WM6 DISP_BIT_IB08
462 #define DISP_BITMASK_WM5 DISP_BIT_IB05
463 #define DISP_BITMASK_WM4 DISP_BIT_IB04
464 #define DISP_BITMASK_WM3 DISP_BIT_IB03
465 #define DISP_BITMASK_WM2 DISP_BIT_IB02
466 #define DISP_BITMASK_WM1 DISP_BIT_IB01
467 #define DISP_BITMASK_WM0 DISP_BIT_IB00
468 /* DISP_RAM_DATA_MASK_2_ADDR RAM Write Data Mask (2) */
469 #define DISP_BITMASK_WM17 DISP_BIT_IB05
470 #define DISP_BITMASK_WM16 DISP_BIT_IB04
471 #define DISP_BITMASK_WM15 DISP_BIT_IB03
472 #define DISP_BITMASK_WM14 DISP_BIT_IB02
473 #define DISP_BITMASK_WM13 DISP_BIT_IB01
474 #define DISP_BITMASK_WM12 DISP_BIT_IB00
475 /*Gamma Control */
476 /* DISP_GAMMA_CONTROL_1_ADDR Gamma Control (1) */
477 #define DISP_BITMASK_PKP12 DISP_BIT_IB10
478 #define DISP_BITMASK_PKP11 DISP_BIT_IB08
479 #define DISP_BITMASK_PKP10 DISP_BIT_IB09
480 #define DISP_BITMASK_PKP02 DISP_BIT_IB02
481 #define DISP_BITMASK_PKP01 DISP_BIT_IB01
482 #define DISP_BITMASK_PKP00 DISP_BIT_IB00
483 /* DISP_GAMMA_CONTROL_2_ADDR Gamma Control (2) */
484 #define DISP_BITMASK_PKP32 DISP_BIT_IB10
485 #define DISP_BITMASK_PKP31 DISP_BIT_IB09
486 #define DISP_BITMASK_PKP30 DISP_BIT_IB08
487 #define DISP_BITMASK_PKP22 DISP_BIT_IB02
488 #define DISP_BITMASK_PKP21 DISP_BIT_IB01
489 #define DISP_BITMASK_PKP20 DISP_BIT_IB00
490 /* DISP_GAMMA_CONTROL_3_ADDR Gamma Control (3) */
491 #define DISP_BITMASK_PKP52 DISP_BIT_IB10
492 #define DISP_BITMASK_PKP51 DISP_BIT_IB09
493 #define DISP_BITMASK_PKP50 DISP_BIT_IB08
494 #define DISP_BITMASK_PKP42 DISP_BIT_IB02
495 #define DISP_BITMASK_PKP41 DISP_BIT_IB01
496 #define DISP_BITMASK_PKP40 DISP_BIT_IB00
497 /* DISP_GAMMA_CONTROL_4_ADDR Gamma Control (4) */
498 #define DISP_BITMASK_PRP12 DISP_BIT_IB10
499 #define DISP_BITMASK_PRP11 DISP_BIT_IB08
500 #define DISP_BITMASK_PRP10 DISP_BIT_IB09
501 #define DISP_BITMASK_PRP02 DISP_BIT_IB02
502 #define DISP_BITMASK_PRP01 DISP_BIT_IB01
503 #define DISP_BITMASK_PRP00 DISP_BIT_IB00
504 /* DISP_GAMMA_CONTROL_5_ADDR Gamma Control (5) */
505 #define DISP_BITMASK_VRP14 DISP_BIT_IB12
506 #define DISP_BITMASK_VRP13 DISP_BIT_IB11
507 #define DISP_BITMASK_VRP12 DISP_BIT_IB10
508 #define DISP_BITMASK_VRP11 DISP_BIT_IB08
509 #define DISP_BITMASK_VRP10 DISP_BIT_IB09
510 #define DISP_BITMASK_VRP03 DISP_BIT_IB03
511 #define DISP_BITMASK_VRP02 DISP_BIT_IB02
512 #define DISP_BITMASK_VRP01 DISP_BIT_IB01
513 #define DISP_BITMASK_VRP00 DISP_BIT_IB00
514 /* DISP_GAMMA_CONTROL_6_ADDR Gamma Control (6) */
515 #define DISP_BITMASK_PKN12 DISP_BIT_IB10
516 #define DISP_BITMASK_PKN11 DISP_BIT_IB08
517 #define DISP_BITMASK_PKN10 DISP_BIT_IB09
518 #define DISP_BITMASK_PKN02 DISP_BIT_IB02
519 #define DISP_BITMASK_PKN01 DISP_BIT_IB01
520 #define DISP_BITMASK_PKN00 DISP_BIT_IB00
521 /* DISP_GAMMA_CONTROL_7_ADDR Gamma Control (7) */
522 #define DISP_BITMASK_PKN32 DISP_BIT_IB10
523 #define DISP_BITMASK_PKN31 DISP_BIT_IB08
524 #define DISP_BITMASK_PKN30 DISP_BIT_IB09
525 #define DISP_BITMASK_PKN22 DISP_BIT_IB02
526 #define DISP_BITMASK_PKN21 DISP_BIT_IB01
527 #define DISP_BITMASK_PKN20 DISP_BIT_IB00
528 /* DISP_GAMMA_CONTROL_8_ADDR Gamma Control (8) */
529 #define DISP_BITMASK_PKN52 DISP_BIT_IB10
530 #define DISP_BITMASK_PKN51 DISP_BIT_IB08
531 #define DISP_BITMASK_PKN50 DISP_BIT_IB09
532 #define DISP_BITMASK_PKN42 DISP_BIT_IB02
533 #define DISP_BITMASK_PKN41 DISP_BIT_IB01
534 #define DISP_BITMASK_PKN40 DISP_BIT_IB00
535 /* DISP_GAMMA_CONTROL_9_ADDR Gamma Control (9) */
536 #define DISP_BITMASK_PRN12 DISP_BIT_IB10
537 #define DISP_BITMASK_PRN11 DISP_BIT_IB08
538 #define DISP_BITMASK_PRN10 DISP_BIT_IB09
539 #define DISP_BITMASK_PRN02 DISP_BIT_IB02
540 #define DISP_BITMASK_PRN01 DISP_BIT_IB01
541 #define DISP_BITMASK_PRN00 DISP_BIT_IB00
542 /* DISP_GAMMA_CONTROL_10_ADDR Gamma Control (10) */
543 #define DISP_BITMASK_VRN14 DISP_BIT_IB12
544 #define DISP_BITMASK_VRN13 DISP_BIT_IB11
545 #define DISP_BITMASK_VRN12 DISP_BIT_IB10
546 #define DISP_BITMASK_VRN11 DISP_BIT_IB08
547 #define DISP_BITMASK_VRN10 DISP_BIT_IB09
548 #define DISP_BITMASK_VRN03 DISP_BIT_IB03
549 #define DISP_BITMASK_VRN02 DISP_BIT_IB02
550 #define DISP_BITMASK_VRN01 DISP_BIT_IB01
551 #define DISP_BITMASK_VRN00 DISP_BIT_IB00
552 /* Coordinate Control */
553 /* DISP_VERT_SCROLL_CTL_1_ADDR Vertical Scroll Control (1) */
554 #define DISP_BITMASK_VL18 DISP_BIT_IB08
555 #define DISP_BITMASK_VL17 DISP_BIT_IB07
556 #define DISP_BITMASK_VL16 DISP_BIT_IB06
557 #define DISP_BITMASK_VL15 DISP_BIT_IB05
558 #define DISP_BITMASK_VL14 DISP_BIT_IB04
559 #define DISP_BITMASK_VL13 DISP_BIT_IB03
560 #define DISP_BITMASK_VL12 DISP_BIT_IB02
561 #define DISP_BITMASK_VL11 DISP_BIT_IB01
562 #define DISP_BITMASK_VL10 DISP_BIT_IB00
563 /* DISP_VERT_SCROLL_CTL_2_ADDR Vertical Scroll Control (2) */
564 #define DISP_BITMASK_VL28 DISP_BIT_IB08
565 #define DISP_BITMASK_VL27 DISP_BIT_IB07
566 #define DISP_BITMASK_VL26 DISP_BIT_IB06
567 #define DISP_BITMASK_VL25 DISP_BIT_IB05
568 #define DISP_BITMASK_VL24 DISP_BIT_IB04
569 #define DISP_BITMASK_VL23 DISP_BIT_IB03
570 #define DISP_BITMASK_VL22 DISP_BIT_IB02
571 #define DISP_BITMASK_VL21 DISP_BIT_IB01
572 #define DISP_BITMASK_VL20 DISP_BIT_IB00
573 /* DISP_SCREEN_1_DRV_POS_1_ADDR First Screen Driving Position (1) */
574 #define DISP_BITMASK_SS18 DISP_BIT_IB08
575 #define DISP_BITMASK_SS17 DISP_BIT_IB07
576 #define DISP_BITMASK_SS16 DISP_BIT_IB06
577 #define DISP_BITMASK_SS15 DISP_BIT_IB05
578 #define DISP_BITMASK_SS14 DISP_BIT_IB04
579 #define DISP_BITMASK_SS13 DISP_BIT_IB03
580 #define DISP_BITMASK_SS12 DISP_BIT_IB02
581 #define DISP_BITMASK_SS11 DISP_BIT_IB01
582 #define DISP_BITMASK_SS10 DISP_BIT_IB00
583 /* DISP_SCREEN_1_DRV_POS_2_ADDR First Screen Driving Position (2) */
584 #define DISP_BITMASK_SE18 DISP_BIT_IB08
585 #define DISP_BITMASK_SE17 DISP_BIT_IB07
586 #define DISP_BITMASK_SE16 DISP_BIT_IB06
587 #define DISP_BITMASK_SE15 DISP_BIT_IB05
588 #define DISP_BITMASK_SE14 DISP_BIT_IB04
589 #define DISP_BITMASK_SE13 DISP_BIT_IB03
590 #define DISP_BITMASK_SE12 DISP_BIT_IB02
591 #define DISP_BITMASK_SE11 DISP_BIT_IB01
592 #define DISP_BITMASK_SE10 DISP_BIT_IB00
593 /* DISP_SCREEN_2_DRV_POS_1_ADDR Second Screen Driving Position (1) */
594 #define DISP_BITMASK_SS28 DISP_BIT_IB08
595 #define DISP_BITMASK_SS27 DISP_BIT_IB07
596 #define DISP_BITMASK_SS26 DISP_BIT_IB06
597 #define DISP_BITMASK_SS25 DISP_BIT_IB05
598 #define DISP_BITMASK_SS24 DISP_BIT_IB04
599 #define DISP_BITMASK_SS23 DISP_BIT_IB03
600 #define DISP_BITMASK_SS22 DISP_BIT_IB02
601 #define DISP_BITMASK_SS21 DISP_BIT_IB01
602 #define DISP_BITMASK_SS20 DISP_BIT_IB00
603 /* DISP_SCREEN_3_DRV_POS_2_ADDR Second Screen Driving Position (2) */
604 #define DISP_BITMASK_SE28 DISP_BIT_IB08
605 #define DISP_BITMASK_SE27 DISP_BIT_IB07
606 #define DISP_BITMASK_SE26 DISP_BIT_IB06
607 #define DISP_BITMASK_SE25 DISP_BIT_IB05
608 #define DISP_BITMASK_SE24 DISP_BIT_IB04
609 #define DISP_BITMASK_SE23 DISP_BIT_IB03
610 #define DISP_BITMASK_SE22 DISP_BIT_IB02
611 #define DISP_BITMASK_SE21 DISP_BIT_IB01
612 #define DISP_BITMASK_SE20 DISP_BIT_IB00
613 /* DISP_HORZ_RAM_ADDR_POS_1_ADDR Horizontal RAM Address Position (1) */
614 #define DISP_BITMASK_HSA7 DISP_BIT_IB07
615 #define DISP_BITMASK_HSA6 DISP_BIT_IB06
616 #define DISP_BITMASK_HSA5 DISP_BIT_IB05
617 #define DISP_BITMASK_HSA4 DISP_BIT_IB04
618 #define DISP_BITMASK_HSA3 DISP_BIT_IB03
619 #define DISP_BITMASK_HSA2 DISP_BIT_IB02
620 #define DISP_BITMASK_HSA1 DISP_BIT_IB01
621 #define DISP_BITMASK_HSA0 DISP_BIT_IB00
622 /* DISP_HORZ_RAM_ADDR_POS_2_ADDR Horizontal RAM Address Position (2) */
623 #define DISP_BITMASK_HEA7 DISP_BIT_IB07
624 #define DISP_BITMASK_HEA6 DISP_BIT_IB06
625 #define DISP_BITMASK_HEA5 DISP_BIT_IB05
626 #define DISP_BITMASK_HEA4 DISP_BIT_IB04
627 #define DISP_BITMASK_HEA3 DISP_BIT_IB03
628 #define DISP_BITMASK_HEA2 DISP_BIT_IB02
629 #define DISP_BITMASK_HEA1 DISP_BIT_IB01
630 #define DISP_BITMASK_HEA0 DISP_BIT_IB00
631 /* DISP_VERT_RAM_ADDR_POS_1_ADDR Vertical RAM Address Position (1) */
632 #define DISP_BITMASK_VSA8 DISP_BIT_IB08
633 #define DISP_BITMASK_VSA7 DISP_BIT_IB07
634 #define DISP_BITMASK_VSA6 DISP_BIT_IB06
635 #define DISP_BITMASK_VSA5 DISP_BIT_IB05
636 #define DISP_BITMASK_VSA4 DISP_BIT_IB04
637 #define DISP_BITMASK_VSA3 DISP_BIT_IB03
638 #define DISP_BITMASK_VSA2 DISP_BIT_IB02
639 #define DISP_BITMASK_VSA1 DISP_BIT_IB01
640 #define DISP_BITMASK_VSA0 DISP_BIT_IB00
641 /* DISP_VERT_RAM_ADDR_POS_2_ADDR Vertical RAM Address Position (2) */
642 #define DISP_BITMASK_VEA8 DISP_BIT_IB08
643 #define DISP_BITMASK_VEA7 DISP_BIT_IB07
644 #define DISP_BITMASK_VEA6 DISP_BIT_IB06
645 #define DISP_BITMASK_VEA5 DISP_BIT_IB05
646 #define DISP_BITMASK_VEA4 DISP_BIT_IB04
647 #define DISP_BITMASK_VEA3 DISP_BIT_IB03
648 #define DISP_BITMASK_VEA2 DISP_BIT_IB02
649 #define DISP_BITMASK_VEA1 DISP_BIT_IB01
650 #define DISP_BITMASK_VEA0 DISP_BIT_IB00
651 static word disp_area_start_row;
652 static word disp_area_end_row;
653 static boolean disp_initialized = FALSE;
654 /* For some reason the contrast set at init time is not good. Need to do
655 * it again
657 static boolean display_on = FALSE;
659 static uint32 tmd20qvga_lcd_rev;
660 uint16 tmd20qvga_panel_offset;
662 #ifdef DISP_DEVICE_8BPP
663 static word convert_8_to_16_tbl[256] = {
664 0x0000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000, 0xE000,
665 0x0100, 0x2100, 0x4100, 0x6100, 0x8100, 0xA100, 0xC100, 0xE100,
666 0x0200, 0x2200, 0x4200, 0x6200, 0x8200, 0xA200, 0xC200, 0xE200,
667 0x0300, 0x2300, 0x4300, 0x6300, 0x8300, 0xA300, 0xC300, 0xE300,
668 0x0400, 0x2400, 0x4400, 0x6400, 0x8400, 0xA400, 0xC400, 0xE400,
669 0x0500, 0x2500, 0x4500, 0x6500, 0x8500, 0xA500, 0xC500, 0xE500,
670 0x0600, 0x2600, 0x4600, 0x6600, 0x8600, 0xA600, 0xC600, 0xE600,
671 0x0700, 0x2700, 0x4700, 0x6700, 0x8700, 0xA700, 0xC700, 0xE700,
672 0x0008, 0x2008, 0x4008, 0x6008, 0x8008, 0xA008, 0xC008, 0xE008,
673 0x0108, 0x2108, 0x4108, 0x6108, 0x8108, 0xA108, 0xC108, 0xE108,
674 0x0208, 0x2208, 0x4208, 0x6208, 0x8208, 0xA208, 0xC208, 0xE208,
675 0x0308, 0x2308, 0x4308, 0x6308, 0x8308, 0xA308, 0xC308, 0xE308,
676 0x0408, 0x2408, 0x4408, 0x6408, 0x8408, 0xA408, 0xC408, 0xE408,
677 0x0508, 0x2508, 0x4508, 0x6508, 0x8508, 0xA508, 0xC508, 0xE508,
678 0x0608, 0x2608, 0x4608, 0x6608, 0x8608, 0xA608, 0xC608, 0xE608,
679 0x0708, 0x2708, 0x4708, 0x6708, 0x8708, 0xA708, 0xC708, 0xE708,
680 0x0010, 0x2010, 0x4010, 0x6010, 0x8010, 0xA010, 0xC010, 0xE010,
681 0x0110, 0x2110, 0x4110, 0x6110, 0x8110, 0xA110, 0xC110, 0xE110,
682 0x0210, 0x2210, 0x4210, 0x6210, 0x8210, 0xA210, 0xC210, 0xE210,
683 0x0310, 0x2310, 0x4310, 0x6310, 0x8310, 0xA310, 0xC310, 0xE310,
684 0x0410, 0x2410, 0x4410, 0x6410, 0x8410, 0xA410, 0xC410, 0xE410,
685 0x0510, 0x2510, 0x4510, 0x6510, 0x8510, 0xA510, 0xC510, 0xE510,
686 0x0610, 0x2610, 0x4610, 0x6610, 0x8610, 0xA610, 0xC610, 0xE610,
687 0x0710, 0x2710, 0x4710, 0x6710, 0x8710, 0xA710, 0xC710, 0xE710,
688 0x0018, 0x2018, 0x4018, 0x6018, 0x8018, 0xA018, 0xC018, 0xE018,
689 0x0118, 0x2118, 0x4118, 0x6118, 0x8118, 0xA118, 0xC118, 0xE118,
690 0x0218, 0x2218, 0x4218, 0x6218, 0x8218, 0xA218, 0xC218, 0xE218,
691 0x0318, 0x2318, 0x4318, 0x6318, 0x8318, 0xA318, 0xC318, 0xE318,
692 0x0418, 0x2418, 0x4418, 0x6418, 0x8418, 0xA418, 0xC418, 0xE418,
693 0x0518, 0x2518, 0x4518, 0x6518, 0x8518, 0xA518, 0xC518, 0xE518,
694 0x0618, 0x2618, 0x4618, 0x6618, 0x8618, 0xA618, 0xC618, 0xE618,
695 0x0718, 0x2718, 0x4718, 0x6718, 0x8718, 0xA718, 0xC718, 0xE718
697 #endif /* DISP_DEVICE_8BPP */
699 static void tmd20qvga_disp_set_rect(int x, int y, int xres, int yres);
700 static void tmd20qvga_disp_init(struct platform_device *pdev);
701 static void tmd20qvga_disp_set_contrast(void);
702 static void tmd20qvga_disp_set_display_area(word start_row, word end_row);
703 static int tmd20qvga_disp_off(struct platform_device *pdev);
704 static int tmd20qvga_disp_on(struct platform_device *pdev);
705 static void tmd20qvga_set_revId(int);
707 /* future use */
708 void tmd20qvga_disp_clear_screen_area(word start_row, word end_row,
709 word start_column, word end_column);
711 static void tmd20qvga_set_revId(int id)
714 tmd20qvga_lcd_rev = id;
716 if (tmd20qvga_lcd_rev == 1)
717 tmd20qvga_panel_offset = 0x10;
718 else
719 tmd20qvga_panel_offset = 0;
722 static void tmd20qvga_disp_init(struct platform_device *pdev)
724 struct msm_fb_data_type *mfd;
726 if (disp_initialized)
727 return;
729 mfd = platform_get_drvdata(pdev);
731 DISP_CMD_PORT = mfd->cmd_port;
732 DISP_DATA_PORT = mfd->data_port;
734 #ifdef TMD20QVGA_LCD_18BPP
735 tmd20qvga_set_revId(2);
736 #else
737 tmd20qvga_set_revId(1);
738 #endif
740 disp_initialized = TRUE;
741 tmd20qvga_disp_set_contrast();
742 tmd20qvga_disp_set_display_area(0, QVGA_HEIGHT - 1);
745 static void tmd20qvga_disp_set_rect(int x, int y, int xres, int yres)
747 if (!disp_initialized)
748 return;
750 DISP_SET_RECT(y, y + yres - 1, x, x + xres - 1);
752 DISP_CMD_OUT(DISP_CMD_RAMWR);
755 static void tmd20qvga_disp_set_display_area(word start_row, word end_row)
757 word start_driving = start_row;
758 word end_driving = end_row;
760 if (!disp_initialized)
761 return;
763 /* Range checking
765 if (end_driving >= QVGA_HEIGHT)
766 end_driving = QVGA_HEIGHT - 1;
767 if (start_driving > end_driving) {
768 /* Probably Backwards Switch */
769 start_driving = end_driving;
770 end_driving = start_row; /* Has not changed */
771 if (end_driving >= QVGA_HEIGHT)
772 end_driving = QVGA_HEIGHT - 1;
775 if ((start_driving == disp_area_start_row)
776 && (end_driving == disp_area_end_row))
777 return;
779 disp_area_start_row = start_driving;
780 disp_area_end_row = end_driving;
782 DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_1_ADDR,
783 DISP_VAL_IF(start_driving & 0x100,
784 DISP_BITMASK_SS18) |
785 DISP_VAL_IF(start_driving & 0x080,
786 DISP_BITMASK_SS17) |
787 DISP_VAL_IF(start_driving & 0x040,
788 DISP_BITMASK_SS16) |
789 DISP_VAL_IF(start_driving & 0x020,
790 DISP_BITMASK_SS15) |
791 DISP_VAL_IF(start_driving & 0x010,
792 DISP_BITMASK_SS14) |
793 DISP_VAL_IF(start_driving & 0x008,
794 DISP_BITMASK_SS13) |
795 DISP_VAL_IF(start_driving & 0x004,
796 DISP_BITMASK_SS12) |
797 DISP_VAL_IF(start_driving & 0x002,
798 DISP_BITMASK_SS11) |
799 DISP_VAL_IF(start_driving & 0x001, DISP_BITMASK_SS10));
801 DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_2_ADDR,
802 DISP_VAL_IF(end_driving & 0x100, DISP_BITMASK_SE18) |
803 DISP_VAL_IF(end_driving & 0x080, DISP_BITMASK_SE17) |
804 DISP_VAL_IF(end_driving & 0x040, DISP_BITMASK_SE16) |
805 DISP_VAL_IF(end_driving & 0x020, DISP_BITMASK_SE15) |
806 DISP_VAL_IF(end_driving & 0x010, DISP_BITMASK_SE14) |
807 DISP_VAL_IF(end_driving & 0x008, DISP_BITMASK_SE13) |
808 DISP_VAL_IF(end_driving & 0x004, DISP_BITMASK_SE12) |
809 DISP_VAL_IF(end_driving & 0x002, DISP_BITMASK_SE11) |
810 DISP_VAL_IF(end_driving & 0x001, DISP_BITMASK_SE10));
813 static int tmd20qvga_disp_off(struct platform_device *pdev)
815 if (!disp_initialized)
816 tmd20qvga_disp_init(pdev);
818 if (display_on) {
819 if (tmd20qvga_lcd_rev == 2) {
820 DISP_WRITE_OUT(DISP_POFF_LN_SETTING_ADDR, 0x000A);
821 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xFFEE);
822 WAIT_MSEC(40);
823 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xF812);
824 WAIT_MSEC(40);
825 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xE811);
826 WAIT_MSEC(40);
827 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xC011);
828 WAIT_MSEC(40);
829 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x4011);
830 WAIT_MSEC(20);
831 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0010);
833 } else {
834 DISP_WRITE_OUT(DISP_POFF_LN_SETTING_ADDR, 0x000F);
835 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BFE);
836 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
837 WAIT_MSEC(40);
838 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BED);
839 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
840 WAIT_MSEC(40);
841 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x00CD);
842 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
843 WAIT_MSEC(20);
844 DISP_WRITE_OUT(DISP_START_OSCILLATION_ADDR, 0x0);
847 DISP_WRITE_OUT(DISP_MODE_SETTING_ADDR, 0x0004);
848 DISP_WRITE_OUT(DISP_MODE_SETTING_ADDR, 0x0000);
850 display_on = FALSE;
853 return 0;
856 static int tmd20qvga_disp_on(struct platform_device *pdev)
858 if (!disp_initialized)
859 tmd20qvga_disp_init(pdev);
861 if (!display_on) {
862 /* Deep Stand-by -> Stand-by */
863 DISP_CMD_OUT(DISP_START_OSCILLATION_ADDR);
864 WAIT_MSEC(1);
865 DISP_CMD_OUT(DISP_START_OSCILLATION_ADDR);
866 WAIT_MSEC(1);
867 DISP_CMD_OUT(DISP_START_OSCILLATION_ADDR);
868 WAIT_MSEC(1);
870 /* OFF -> Deep Stan-By -> Stand-by */
871 /* let's change the state from "Stand-by" to "Sleep" */
872 DISP_WRITE_OUT(DISP_MODE_SETTING_ADDR, 0x0005);
873 WAIT_MSEC(1);
875 /* Sleep -> Displaying */
876 DISP_WRITE_OUT(DISP_START_OSCILLATION_ADDR, 0x0001);
877 DISP_WRITE_OUT(DISP_DRIVER_OUTPUT_CTL_ADDR, 0x0127);
878 DISP_WRITE_OUT(DISP_LCD_DRIVING_SIG_ADDR, 0x200);
879 /* fast write mode */
880 DISP_WRITE_OUT(DISP_ENTRY_MODE_ADDR, 0x0130);
881 if (tmd20qvga_lcd_rev == 2)
882 DISP_WRITE_OUT(DISP_TMD_700_ADDR, 0x0003);
883 /* back porch = 14 + front porch = 2 --> 16 lines */
884 if (tmd20qvga_lcd_rev == 2) {
885 #ifdef TMD20QVGA_LCD_18BPP
886 /* 256k color */
887 DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x0000);
888 #else
889 /* 65k color */
890 DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x4000);
891 #endif
892 DISP_WRITE_OUT(DISP_DISPLAY_CTL_2_ADDR, 0x0302);
893 } else {
894 #ifdef TMD20QVGA_LCD_18BPP
895 /* 256k color */
896 DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x0004);
897 #else
898 /* 65k color */
899 DISP_WRITE_OUT(DISP_DISPLAY_CTL_1_ADDR, 0x4004);
900 #endif
901 DISP_WRITE_OUT(DISP_DISPLAY_CTL_2_ADDR, 0x020E);
903 /* 16 bit one transfer */
904 if (tmd20qvga_lcd_rev == 2) {
905 DISP_WRITE_OUT(DISP_EXT_DISPLAY_CTL_1_ADDR, 0x0000);
906 DISP_WRITE_OUT(DISP_FRAME_CYCLE_CTL_ADDR, 0x0010);
907 DISP_WRITE_OUT(DISP_LTPS_CTL_1_ADDR, 0x0302);
908 DISP_WRITE_OUT(DISP_LTPS_CTL_2_ADDR, 0x0102);
909 DISP_WRITE_OUT(DISP_LTPS_CTL_3_ADDR, 0x0000);
910 DISP_WRITE_OUT(DISP_TMD_015_ADDR, 0x2000);
912 DISP_WRITE_OUT(DISP_AMP_SETTING_ADDR, 0x0000);
913 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0403);
914 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, 0x0304);
915 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, 0x0403);
916 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0303);
917 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0101);
918 DISP_WRITE_OUT(DISP_TMD_305_ADDR, 0);
920 DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_1_ADDR, 0x0000);
921 DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_2_ADDR, 0x013F);
923 DISP_WRITE_OUT(DISP_POWER_CTL_3_ADDR, 0x077D);
925 DISP_WRITE_OUT(DISP_POWER_CTL_4_ADDR, 0x0005);
926 DISP_WRITE_OUT(DISP_POWER_CTL_5_ADDR, 0x0000);
927 DISP_WRITE_OUT(DISP_POWER_CTL_6_ADDR, 0x0015);
928 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xC010);
929 WAIT_MSEC(1);
931 DISP_WRITE_OUT(DISP_POWER_CTL_2_ADDR, 0x0001);
932 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0xFFFE);
933 WAIT_MSEC(60);
934 } else {
935 DISP_WRITE_OUT(DISP_EXT_DISPLAY_CTL_1_ADDR, 0x0001);
936 DISP_WRITE_OUT(DISP_FRAME_CYCLE_CTL_ADDR, 0x0010);
937 DISP_WRITE_OUT(DISP_LTPS_CTL_1_ADDR, 0x0301);
938 DISP_WRITE_OUT(DISP_LTPS_CTL_2_ADDR, 0x0001);
939 DISP_WRITE_OUT(DISP_LTPS_CTL_3_ADDR, 0x0000);
940 DISP_WRITE_OUT(DISP_AMP_SETTING_ADDR, 0x0000);
941 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0507);
942 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, 0x0405);
943 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, 0x0607);
944 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0502);
945 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0301);
946 DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_1_ADDR, 0x0000);
947 DISP_WRITE_OUT(DISP_SCREEN_1_DRV_POS_2_ADDR, 0x013F);
948 DISP_WRITE_OUT(DISP_POWER_CTL_3_ADDR, 0x0795);
950 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0102);
951 WAIT_MSEC(1);
953 DISP_WRITE_OUT(DISP_POWER_CTL_4_ADDR, 0x0450);
954 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0103);
955 WAIT_MSEC(1);
957 DISP_WRITE_OUT(DISP_POWER_CTL_5_ADDR, 0x0008);
958 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0104);
959 WAIT_MSEC(1);
961 DISP_WRITE_OUT(DISP_POWER_CTL_6_ADDR, 0x0C00);
962 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0105);
963 WAIT_MSEC(1);
965 DISP_WRITE_OUT(DISP_POWER_CTL_7_ADDR, 0x0000);
966 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0106);
967 WAIT_MSEC(1);
969 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0801);
970 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
971 WAIT_MSEC(1);
973 DISP_WRITE_OUT(DISP_POWER_CTL_2_ADDR, 0x001F);
974 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0101);
975 WAIT_MSEC(60);
977 DISP_WRITE_OUT(DISP_POWER_CTL_2_ADDR, 0x009F);
978 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0101);
979 WAIT_MSEC(10);
981 DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_1_ADDR, 0x0010);
982 DISP_WRITE_OUT(DISP_HORZ_RAM_ADDR_POS_2_ADDR, 0x00FF);
983 DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_1_ADDR, 0x0000);
984 DISP_WRITE_OUT(DISP_VERT_RAM_ADDR_POS_2_ADDR, 0x013F);
985 /* RAM starts at address 0x10 */
986 DISP_WRITE_OUT(DISP_RAM_ADDR_SET_1_ADDR, 0x0010);
987 DISP_WRITE_OUT(DISP_RAM_ADDR_SET_2_ADDR, 0x0000);
989 /* lcd controller uses internal clock, not ext. vsync */
990 DISP_CMD_OUT(DISP_CMD_RAMWR);
992 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0881);
993 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
994 WAIT_MSEC(40);
996 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BE1);
997 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
998 WAIT_MSEC(40);
1000 DISP_WRITE_OUT(DISP_POWER_CTL_1_ADDR, 0x0BFF);
1001 DISP_WRITE_OUT(DISP_POWER_SUPPLY_INTF_ADDR, 0x0100);
1003 display_on = TRUE;
1006 return 0;
1009 static void tmd20qvga_disp_set_contrast(void)
1011 #if defined(TMD20QVGA_LCD_18BPP)
1013 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0403);
1014 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR, 0x0302);
1015 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR, 0x0403);
1016 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0303);
1017 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0F07);
1019 #else
1020 int newcontrast = 0x46;
1022 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_1_ADDR, 0x0403);
1024 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_2_ADDR,
1025 DISP_VAL_IF(newcontrast & 0x0001, DISP_BITMASK_PKP20) |
1026 DISP_VAL_IF(newcontrast & 0x0002, DISP_BITMASK_PKP21) |
1027 DISP_VAL_IF(newcontrast & 0x0004, DISP_BITMASK_PKP22) |
1028 DISP_VAL_IF(newcontrast & 0x0010, DISP_BITMASK_PKP30) |
1029 DISP_VAL_IF(newcontrast & 0x0020, DISP_BITMASK_PKP31) |
1030 DISP_VAL_IF(newcontrast & 0x0040, DISP_BITMASK_PKP32));
1032 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_3_ADDR,
1033 DISP_VAL_IF(newcontrast & 0x0010, DISP_BITMASK_PKP40) |
1034 DISP_VAL_IF(newcontrast & 0x0020, DISP_BITMASK_PKP41) |
1035 DISP_VAL_IF(newcontrast & 0x0040, DISP_BITMASK_PKP42) |
1036 DISP_VAL_IF(newcontrast & 0x0001, DISP_BITMASK_PKP50) |
1037 DISP_VAL_IF(newcontrast & 0x0002, DISP_BITMASK_PKP51) |
1038 DISP_VAL_IF(newcontrast & 0x0004, DISP_BITMASK_PKP52));
1040 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_4_ADDR, 0x0303);
1041 DISP_WRITE_OUT(DISP_GAMMA_CONTROL_5_ADDR, 0x0F07);
1043 #endif /* defined(TMD20QVGA_LCD_18BPP) */
1045 } /* End disp_set_contrast */
1047 void tmd20qvga_disp_clear_screen_area
1048 (word start_row, word end_row, word start_column, word end_column) {
1049 int32 i;
1051 /* Clear the display screen */
1052 DISP_SET_RECT(start_row, end_row, start_column, end_column);
1053 DISP_CMD_OUT(DISP_CMD_RAMWR);
1054 i = (end_row - start_row + 1) * (end_column - start_column + 1);
1055 for (; i > 0; i--)
1056 DISP_DATA_OUT_16TO18BPP(0x0);
1059 static int __init tmd20qvga_probe(struct platform_device *pdev)
1061 msm_fb_add_device(pdev);
1063 return 0;
1066 static struct platform_driver this_driver = {
1067 .probe = tmd20qvga_probe,
1068 .driver = {
1069 .name = "ebi2_tmd_qvga",
1073 static struct msm_fb_panel_data tmd20qvga_panel_data = {
1074 .on = tmd20qvga_disp_on,
1075 .off = tmd20qvga_disp_off,
1076 .set_rect = tmd20qvga_disp_set_rect,
1079 static struct platform_device this_device = {
1080 .name = "ebi2_tmd_qvga",
1081 .id = 0,
1082 .dev = {
1083 .platform_data = &tmd20qvga_panel_data,
1087 static int __init tmd20qvga_init(void)
1089 int ret;
1090 struct msm_panel_info *pinfo;
1092 ret = platform_driver_register(&this_driver);
1093 if (!ret) {
1094 pinfo = &tmd20qvga_panel_data.panel_info;
1095 pinfo->xres = 240;
1096 pinfo->yres = 320;
1097 pinfo->type = EBI2_PANEL;
1098 pinfo->pdest = DISPLAY_1;
1099 pinfo->wait_cycle = 0x808000;
1100 #ifdef TMD20QVGA_LCD_18BPP
1101 pinfo->bpp = 18;
1102 #else
1103 pinfo->bpp = 16;
1104 #endif
1105 pinfo->fb_num = 2;
1106 pinfo->lcd.vsync_enable = TRUE;
1107 pinfo->lcd.refx100 = 6000;
1108 pinfo->lcd.v_back_porch = 16;
1109 pinfo->lcd.v_front_porch = 4;
1110 pinfo->lcd.v_pulse_width = 0;
1111 pinfo->lcd.hw_vsync_mode = FALSE;
1112 pinfo->lcd.vsync_notifier_period = 0;
1114 ret = platform_device_register(&this_device);
1115 if (ret)
1116 platform_driver_unregister(&this_driver);
1119 return ret;
1122 module_init(tmd20qvga_init);