1
/* linux/arch/arm/mach-msm/board-htcrhod-panel.c
2
 * Based on board-trout-panel.c by: Brian Swetland <swetland@google.com>
3
 * Remodelled based on board-supersonic-panel.c by: Jay Tu <jay_tu@htc.com>
4
 */
5
6
#include <linux/kernel.h>
7
#include <linux/init.h>
8
#include <linux/platform_device.h>
9
#include <linux/delay.h>
10
#include <linux/leds.h>
11
#include <linux/clk.h>
12
#include <linux/err.h>
13
#include <linux/microp-klt.h>
14
15
#include <asm/io.h>
16
#include <asm/gpio.h>
17
#include <asm/mach-types.h>
18
19
#include <mach/msm_fb.h>
20
#include <mach/vreg.h>
21
#include <linux/microp-klt.h>
22
23
//#include "board-htctopaz.h"
24
#include "board-htcrhodium.h"
25
#include "proc_comm_wince.h"
26
#include "devices.h"
27
28
/* TAG JB 01/25/2011 */
29
#define PANEL_TYPE_AUO_ES1    0x1
30
#define PANEL_TYPE_HITACHI    0x5
31
#define PANEL_TYPE_SEID       0x7   // Named EID in Rhod400
32
#define PANEL_TYPE_SHARP_EVT  0xD
33
#define PANEL_TYPE_TEMP       0x12  // same powerup sequence than Hitachi
34
#define PANEL_TYPE_AUO_ES2    0x13
35
#define PANEL_TYPE_EID        0x14  // Named EID ES3 in Rhod400
36
#define PANEL_TYPE_SHARP_DVT  0x15
37
38
/* panel type, 1 = Auo_ES1 (AU Optronics), 7 = Seid (Sanyo), 0xD = Sharp EVT, 0x12 = Temp, 0x13 = Auo_ES2 (AU Optronics), 0x14 = Eid (Epson), 0x15 = Sharp DVT */
39
static int currentPanelType = 0;
40
module_param(currentPanelType, int, S_IRUGO | S_IWUSR | S_IWGRP);
41
42
struct mddi_table {
43
    uint16_t reg;
44
    uint16_t value;
45
    int      sleep;
46
};
47
48
static struct mddi_table mddi_PanelPowerOff_table[] = {	
49
    /* Common to all panels except Temp panel */
50
    {0x2800, 1, 0},
51
    {0x5300,0x28, 0},
52
    {0x5500,0, 0},
53
    {0x5300,8, 0},
54
    {0x5E03,0, 0},
55
    {0x5300,0, 0},
56
    {0x1000,1, 0},
57
};
58
59
static struct mddi_table mddi_Auo_ES1_table_part0[] = {	
60
    {0x2200, 3, 0},
61
    {0xF200,0xFC, 0},
62
    {0xF207, 4, 0},
63
    {0xB600,0x40, 1},
64
    {0xF000,0x18, 0},
65
    {0x6A02, 1, 0},
66
    {0xF007,0x11, 0},
67
    {0xC100,0x45, 0},
68
    {0xC200,0x31, 0},
69
    {0xC202,0x30, 0},
70
    {0xC000,0x90, 0},
71
    {0xC001, 0, 0},
72
    {0xC002,0x6B, 0},
73
    {0xC003, 0, 0},
74
    {0xC700,0x83, 0},
75
    {0xE000, 0, 0},
76
    {0xE001, 5, 0},
77
    {0xE002,0x15, 0},
78
    {0xE003,0x24, 0},
79
    {0xE004,0x1B, 0},
80
    {0xE005,0x2F, 0},
81
    {0xE006,0x60, 0},
82
    {0xE007,0x27, 0},
83
    {0xE008,0x20, 0},
84
    {0xE009,0x27, 0},
85
    {0xE00A,0x6F, 0},
86
    {0xE00B,0x15, 0},
87
    {0xE00C,0x39, 0},
88
    {0xE00D,0x4E, 0},
89
    {0xE00E,0x61, 0},
90
    {0xE00F,0x82, 0},
91
    {0xE010,0x2B, 0},
92
    {0xE011,0x32, 0},
93
    {0xE100, 0, 0},
94
    {0xE101, 7, 0},
95
    {0xE102,0x19, 0},
96
    {0xE103,0x2B, 0},
97
    {0xE104,0x1B, 0},
98
    {0xE105,0x2E, 0},
99
    {0xE106,0x60, 0},
100
    {0xE107,0x3E, 0},
101
    {0xE108,0x20, 0},
102
    {0xE109,0x27, 0},
103
    {0xE10A,0x8F, 0},
104
    {0xE10B,0x15, 0},
105
    {0xE10C,0x38, 0},
106
    {0xE10D,0x4D, 0},
107
    {0xE10E,0x90, 0},
108
    {0xE10F,0xB4, 0},
109
    {0xE110,0x63, 0},
110
    {0xE111,0x69, 0},
111
    {0xE200, 0, 0},
112
    {0xE201, 5, 0},
113
    {0xE202,0x15, 0},
114
    {0xE203,0x24, 0},
115
    {0xE204,0x1B, 0},
116
    {0xE205,0x2F, 0},
117
    {0xE206,0x60, 0},
118
    {0xE207,0x27, 0},
119
    {0xE208,0x20, 0},
120
    {0xE209,0x27, 0},
121
    {0xE20A,0x6F, 0},
122
    {0xE20B,0x15, 0},
123
    {0xE20C,0x39, 0},
124
    {0xE20D,0x4E, 0},
125
    {0xE20E,0x61, 0},
126
    {0xE20F,0x82, 0},
127
    {0xE210,0x2B, 0},
128
    {0xE211,0x32, 0},
129
    {0xE300, 0, 0},
130
    {0xE301, 7, 0},
131
    {0xE302,0x19, 0},
132
    {0xE303,0x2B, 0},
133
    {0xE304,0x1B, 0},
134
    {0xE305,0x2E, 0},
135
    {0xE306,0x60, 0},
136
    {0xE307,0x3E, 0},
137
    {0xE308,0x20, 0},
138
    {0xE309,0x27, 0},
139
    {0xE30A,0x8F, 0},
140
    {0xE30B,0x15, 0},
141
    {0xE30C,0x38, 0},
142
    {0xE30D,0x4D, 0},
143
    {0xE30E,0x90, 0},
144
    {0xE30F,0xB4, 0},
145
    {0xE310,0x63, 0},
146
    {0xE311,0x69, 0},
147
    {0xE400, 0, 0},
148
    {0xE401, 5, 0},
149
    {0xE402,0x15, 0},
150
    {0xE403,0x24, 0},
151
    {0xE404,0x1B, 0},
152
    {0xE405,0x2F, 0},
153
    {0xE406,0x60, 0},
154
    {0xE407,0x27, 0},
155
    {0xE408,0x20, 0},
156
    {0xE409,0x27, 0},
157
    {0xE40A,0x6F, 0},
158
    {0xE40B,0x15, 0},
159
    {0xE40C,0x39, 0},
160
    {0xE40D,0x4E, 0},
161
    {0xE40E,0x61, 0},
162
    {0xE40F,0x82, 0},
163
    {0xE410,0x2B, 0},
164
    {0xE411,0x32, 0},
165
    {0xE500, 0, 0},
166
    {0xE501, 7, 0},
167
    {0xE502,0x19, 0},
168
    {0xE503,0x2B, 0},
169
    {0xE504,0x1B, 0},
170
    {0xE505,0x2E, 0},
171
    {0xE506,0x60, 0},
172
    {0xE507,0x3E, 0},
173
    {0xE508,0x20, 0},
174
    {0xE509,0x27, 0},
175
    {0xE50A,0x8F, 0},
176
    {0xE50B,0x15, 0},
177
    {0xE50C,0x38, 0},
178
    {0xE50D,0x4D, 0},
179
    {0xE50E,0x90, 0},
180
    {0xE50F,0xB4, 0},
181
    {0xE510,0x63, 0},
182
    {0xE511,0x69, 0},
183
};
184
185
static struct mddi_table mddi_Auo_ES1_table_part1[] = {	
186
    {0x5100, 0, 0},
187
    {0x1100, 1, 0x64},
188
189
    {0x4E00,0, 0},
190
    {0x3A00,5, 0},
191
    {0x3500,2, 0},
192
    {0x4400,0, 0},
193
    {0x4401,0, 0},
194
    {0x5E00,0, 0}, 
195
    {0x6A01,0, 0},
196
    {0x6A02,1, 0},
197
    {0x5301,0x10, 0},
198
    {0x5500,2, 0},
199
    {0x6A17,1, 0},
200
    {0x6A18,0xFF, 0},
201
    {0x2900,1, 0},
202
    {0x5300,0x2C, 0},
203
    {0x5E03,1, 0},
204
};
205
206
static struct mddi_table mddi_Auo_ES2_table_part0[] = {	
207
    {0xC000, 0x86, 0},
208
    {0xC001, 0, 0},
209
    {0xC002, 0x86, 0},
210
    {0xC003, 0, 0},
211
    {0xB600, 0x30, 0},
212
    {0xB602, 0x30, 0},
213
    {0xC100, 0x40, 0},
214
    {0xC200, 0x21, 0},
215
    {0xC202, 2, 0},
216
    {0xE000, 0, 0},
217
    {0xE001, 0x14, 0},
218
    {0xE002, 0x29, 0},
219
    {0xE003, 0x3A, 0},
220
    {0xE004, 0x1D, 0},
221
    {0xE005, 0x30, 0},
222
    {0xE006, 0x61, 0},
223
    {0xE007, 0x3E, 0},
224
    {0xE008, 0x21, 0},
225
    {0xE009, 0x28, 0},
226
    {0xE00A, 0x85, 0},
227
    {0xE00B, 0x16, 0},
228
    {0xE00C, 0x3B, 0},
229
    {0xE00D, 0x4C, 0},
230
    {0xE00E, 0x78, 0},
231
    {0xE00F, 0x96, 0},
232
    {0xE010, 0x4A, 0},
233
    {0xE011, 0x4D, 0},
234
    {0xE100, 0, 0},
235
    {0xE101, 0x14, 0},
236
    {0xE102, 0x29, 0},
237
    {0xE103, 0x3A, 0},
238
    {0xE104, 0x1D, 0},
239
    {0xE105, 0x30, 0},
240
    {0xE106, 0x61, 0},
241
    {0xE107, 0x3E, 0},
242
    {0xE108, 0x21, 0},
243
    {0xE109, 0x28, 0},
244
    {0xE10A, 0x85, 0},
245
    {0xE10B, 0x16, 0},
246
    {0xE10C, 0x3B, 0},
247
    {0xE10D, 0x4C, 0},
248
    {0xE10E, 0x78, 0},
249
    {0xE10F, 0x96, 0},
250
    {0xE110, 0x4A, 0},
251
    {0xE111, 0x4D, 0},
252
    {0xE200, 0x60, 0},
253
    {0xE201, 0x62, 0},
254
    {0xE202, 0x68, 0},
255
    {0xE203, 0x6F, 0},
256
    {0xE204, 0x13, 0},
257
    {0xE205, 0x26, 0},
258
    {0xE206, 0x59, 0},
259
    {0xE207, 0x49, 0},
260
    {0xE208, 0x1E, 0},
261
    {0xE209, 0x26, 0},
262
    {0xE20A, 0x88, 0},
263
    {0xE20B, 0xF, 0},
264
    {0xE20C, 0x2A, 0},
265
    {0xE20D, 0x3D, 0},
266
    {0xE20E, 0x9C, 0},
267
    {0xE20F, 0xC2, 0},
268
    {0xE210, 0x4C, 0},
269
    {0xE211, 0x4D, 0},
270
    {0xE300, 0x60, 0},
271
    {0xE301, 0x62, 0},
272
    {0xE302, 0x68, 0},
273
    {0xE303, 0x6F, 0},
274
    {0xE304, 0x13, 0},
275
    {0xE305, 0x26, 0},
276
    {0xE306, 0x59, 0},
277
    {0xE307, 0x49, 0},
278
    {0xE308, 0x1E, 0},
279
    {0xE309, 0x26, 0},
280
    {0xE30A, 0x88, 0},
281
    {0xE30B, 0xF, 0},
282
    {0xE30C, 0x2A, 0},
283
    {0xE30D, 0x3D, 0},
284
    {0xE30E, 0x9C, 0},
285
    {0xE30F, 0xC2, 0},
286
    {0xE310, 0x4C, 0},
287
    {0xE311, 0x4D, 0},
288
    {0xE400, 0x7E, 0},
289
    {0xE401, 0x7F, 0},
290
    {0xE402, 0x80, 0},
291
    {0xE403, 0x8C, 0},
292
    {0xE404, 0x18, 0},
293
    {0xE405, 0x27, 0},
294
    {0xE406, 0x5A, 0},
295
    {0xE407, 0x56, 0},
296
    {0xE408, 0x1E, 0},
297
    {0xE409, 0x26, 0},
298
    {0xE40A, 0x8E, 0},
299
    {0xE40B, 0x16, 0},
300
    {0xE40C, 0x3B, 0},
301
    {0xE40D, 0x5B, 0},
302
    {0xE40E, 0x80, 0},
303
    {0xE40F, 0x84, 0},
304
    {0xE410, 6, 0},
305
    {0xE411, 0x4D, 0},
306
    {0xE500, 0x7E, 0},
307
    {0xE501, 0x7F, 0},
308
    {0xE502, 0x80, 0},
309
    {0xE503, 0x8C, 0},
310
    {0xE504, 0x18, 0},
311
    {0xE505, 0x27, 0},
312
    {0xE506, 0x5A, 0},
313
    {0xE507, 0x56, 0},
314
    {0xE508, 0x1E, 0},
315
    {0xE509, 0x26, 0},
316
    {0xE50A, 0x8E, 0},
317
    {0xE50B, 0x16, 0},
318
    {0xE50C, 0x3B, 0},
319
    {0xE50D, 0x5B, 0},
320
    {0xE50E, 0x80, 0},
321
    {0xE50F, 0x84, 0},
322
    {0xE510, 6, 0},
323
    {0xE511, 0x4D, 0},
324
    {0xF402, 0x14, 0},
325
    {0xF100, 0xC, 0},
326
};
327
328
static struct mddi_table mddi_Auo_ES2_table_part1[] = {	
329
    {0x5100, 0, 0},
330
    {0x1100, 1, 0x64},
331
332
    {0x4E00,0, 0},
333
    {0x3A00,5, 1},
334
    {0x3500,2, 0},
335
    {0x4400,0, 0},
336
    {0x4401,0, 0},
337
    {0x5E00,0, 0}, 
338
    {0x6A01,0, 0},
339
    {0x6A02,1, 0},
340
    {0x5301,0x10, 0},
341
    {0x5500,2, 0},
342
    {0x6A17,1, 0},
343
    {0x6A18,0xFF, 0},
344
    {0x2900,1, 0},
345
    {0x5300,0x2C, 0},
346
    {0x5E03,1, 0},
347
};
348
349
static struct mddi_table mddi_Eid_table[] = {	
350
    {0x5100, 0, 0},
351
    {0x1100, 1, 0x64},
352
353
    {0x4E00,0, 0},
354
    {0x180, 2, 0},
355
    {0x880, 0, 0},
356
    {0x2080, 0x33, 0},
357
    {0x2680, 0x78, 0},
358
    {0x2880, 0x3E, 0},
359
    {0x2980, 4, 0},
360
    {0x2C80, 0x22, 0},
361
    {0x2E80, 0, 0},
362
    {0xDE80, 2, 0},
363
    {0x3A00, 0x55, 0},
364
365
    {0x3500,0, 0},
366
    {0x4400,0, 0},
367
    {0x4401,0, 0},
368
    {0x5E00,0, 0}, 
369
    {0x6A01,0, 0},
370
    {0x6A02,1, 0},
371
    {0x5301,0x10, 0},
372
    {0x5500,2, 0},
373
    {0x6A17,1, 0},
374
    {0x6A18,0xFF, 0},
375
    {0x2900,1, 0},
376
    {0x5300,0x2C, 0},
377
    {0x5E03,1, 0},
378
};
379
380
static struct mddi_table mddi_Seid_table[] = {	
381
    {0x5100, 0, 0},
382
    {0x1100, 1, 0x64},
383
384
385
    {0x680, 0x35, 0},
386
    {0x2280, 0xC, 0},
387
    {0x2480, 0x2B, 0},
388
    {0x2580, 0x5B, 0},
389
    {0x2680, 0x78, 0},
390
    {0x2780, 0x5C, 0},
391
    {0x2880, 0x3E, 0},
392
    {0x2980, 4, 0},
393
    {0xD080, 0x1A, 0},
394
    {0xD180, 0x16, 0},
395
    {0xD280, 6, 0},
396
    {0xD380, 8, 0},
397
    {0xD480, 0x57, 0},
398
    {0xD580, 0x15, 0},
399
    {0xD680, 0x5C, 0},
400
    {0xD780, 2, 0},
401
    {0xD880, 0xFC, 0},
402
    {0xDC80, 6, 0},
403
    {0xDD80, 2, 0},
404
    {0xDE80, 2, 0},
405
    {0x4080, 0, 0},
406
    {0x4180, 0x13, 0},
407
    {0x4280, 0x2C, 0},
408
    {0x4380, 0x40, 0},
409
    {0x4480, 0x1C, 0},
410
    {0x4580, 0x30, 0},
411
    {0x4680, 0x60, 0},
412
    {0x4780, 0x54, 0},
413
    {0x4880, 0x20, 0},
414
    {0x4980, 0x27, 0},
415
    {0x4A80, 0xAC, 0},
416
    {0x4B80, 0x20, 0},
417
    {0x4C80, 0x4B, 0},
418
    {0x4D80, 0x63, 0},
419
    {0x4E80, 0xA0, 0},
420
    {0x4F80, 0xBC, 0},
421
    {0x5080, 0x5A, 0},
422
    {0x5180, 0x73, 0},
423
    {0x5280, 0, 0},
424
    {0x5880, 0, 0},
425
    {0x5980, 0x18, 0},
426
    {0x5A80, 0x36, 0},
427
    {0x5B80, 0x52, 0},
428
    {0x5C80, 0x1C, 0},
429
    {0x5D80, 0x35, 0},
430
    {0x5E80, 0x5F, 0},
431
    {0x5F80, 0x46, 0},
432
    {0x6080, 0x17, 0},
433
    {0x6180, 0x1E, 0},
434
    {0x6280, 0x9F, 0},
435
    {0x6380, 0x1E, 0},
436
    {0x6480, 0x4F, 0},
437
    {0x6580, 0x63, 0},
438
    {0x6680, 0xB2, 0},
439
    {0x6780, 0xC6, 0},
440
    {0x6880, 0x5F, 0},
441
    {0x6980, 0x72, 0},
442
    {0x6A80, 0, 0},
443
    {0x7080, 0, 0},
444
    {0x7180, 0x13, 0},
445
    {0x7280, 0x2C, 0},
446
    {0x7380, 0x40, 0},
447
    {0x7480, 0x1C, 0},
448
    {0x7580, 0x30, 0},
449
    {0x7680, 0x60, 0},
450
    {0x7780, 0x54, 0},
451
    {0x7880, 0x20, 0},
452
    {0x7980, 0x27, 0},
453
    {0x7A80, 0xAC, 0},
454
    {0x7B80, 0x20, 0},
455
    {0x7C80, 0x4B, 0},
456
    {0x7D80, 0x63, 0},
457
    {0x7E80, 0xA0, 0},
458
    {0x7F80, 0xBC, 0},
459
    {0x8080, 0x5A, 0},
460
    {0x8180, 0x73, 0},
461
    {0x8280, 0, 0},
462
    {0x8880, 0, 0},
463
    {0x8980, 0x18, 0},
464
    {0x8A80, 0x36, 0},
465
    {0x8B80, 0x52, 0},
466
    {0x8C80, 0x1C, 0},
467
    {0x8D80, 0x35, 0},
468
    {0x8E80, 0x5F, 0},
469
    {0x8F80, 0x46, 0},
470
    {0x9080, 0x17, 0},
471
    {0x9180, 0x1E, 0},
472
    {0x9280, 0x9F, 0},
473
    {0x9380, 0x1E, 0},
474
    {0x9480, 0x4F, 0},
475
    {0x9580, 0x63, 0},
476
    {0x9680, 0xB2, 0},
477
    {0x9780, 0xC6, 0},
478
    {0x9880, 0x5F, 0},
479
    {0x9980, 0x72, 0},
480
    {0x9A80, 0, 0},
481
    {0xA080, 0, 0},
482
    {0xA180, 0x10, 0},
483
    {0xA280, 0x28, 0},
484
    {0xA380, 0x3D, 0},
485
    {0xA480, 0x14, 0},
486
    {0xA580, 0x28, 0},
487
    {0xA680, 0x5B, 0},
488
    {0xA780, 0x47, 0},
489
    {0xA880, 0x21, 0},
490
    {0xA980, 0x29, 0},
491
    {0xAA80, 0xA2, 0},
492
    {0xAB80, 0x20, 0},
493
    {0xAC80, 0x4B, 0},
494
    {0xAD80, 0x62, 0},
495
    {0xAE80, 0xA2, 0},
496
    {0xAF80, 0xBC, 0},
497
    {0xB080, 0x5A, 0},
498
    {0xB180, 0x73, 0},
499
    {0xB280, 0, 0},
500
    {0xB880, 0, 0},
501
    {0xB980, 0x19, 0},
502
    {0xBA80, 0x37, 0},
503
    {0xBB80, 0x51, 0},
504
    {0xBC80, 0x1D, 0},
505
    {0xBD80, 0x33, 0},
506
    {0xBE80, 0x60, 0},
507
    {0xBF80, 0x50, 0},
508
    {0xC080, 0x17, 0},
509
    {0xC180, 0x1E, 0},
510
    {0xC280, 0xAC, 0},
511
    {0xC380, 0x24, 0},
512
    {0xC480, 0x58, 0},
513
    {0xC580, 0x6B, 0},
514
    {0xC680, 0xB5, 0},
515
    {0xC780, 0xCA, 0},
516
    {0xC880, 0x62, 0},
517
    {0xC980, 0x72, 0},
518
    {0xCA80, 0, 0},
519
520
    /* Common to all panels ? see sharp power on table */
521
    {0x4E00,0, 0},
522
    {0x3A00, 5, 0},
523
    {0x3500,0, 0},
524
    {0x4400,0, 0},
525
    {0x4401,0, 0},
526
    {0x5E00,0, 0}, 
527
    {0x6A01,0, 0},
528
    {0x6A02,1, 0},
529
    {0x5301,0x10, 0},
530
    {0x5500,2, 0},
531
    {0x6A17,1, 0},
532
    {0x6A18,0xFF, 0},
533
    {0x2900,1, 0},
534
    {0x5300,0x2C, 0},
535
    {0x5E03,1, 0},
536
};
537
538
static struct mddi_table mddi_Sharp_EVT_table[] = {	
539
    {0x5100, 0, 0},
540
541
    {0x2A00, 0, 0},
542
    {0x2A01, 0, 0},
543
    {0x2A02, 1, 0},
544
    {0x2A03,0xDF, 0},
545
    {0x2B00, 0, 0},
546
    {0x2B01, 0, 0},
547
    {0x2B02, 3, 0},
548
    {0x2B03,0x1F, 0},
549
    {0x2D00, 0, 0},
550
    {0x2D01, 0, 0},
551
    {0x2D02, 0, 0},
552
    {0x2D03, 0, 0},
553
    {0x3600, 0, 0},
554
    {0x3601, 1, 0},
555
    {0x180, 2, 0},
556
    {0x2080,0x43, 0},
557
    {0x2C80, 0, 0},
558
    {0x2A80, 0, 0},
559
560
    {0x2E80, 0, 0},
561
};
562
563
static struct mddi_table mddi_Sharp_DVT_table[] = {	
564
    {0x5100, 0, 0},
565
566
    {0x2A00, 0, 0},
567
    {0x2A01, 0, 0},
568
    {0x2A02, 1, 0},
569
    {0x2A03,0xDF, 0},
570
    {0x2B00, 0, 0},
571
    {0x2B01, 0, 0},
572
    {0x2B02, 3, 0},
573
    {0x2B03,0x1F, 0},
574
    {0x2D00, 0, 0},
575
    {0x2D01, 0, 0},
576
    {0x2D02, 0, 0},
577
    {0x2D03, 0, 0},
578
    {0x3600, 0, 0},
579
    {0x3601, 1, 0},
580
    {0x180, 2, 0,},
581
    {0x2080,0x43, 0},
582
    {0x2C80, 0, 0},
583
    {0x2A80, 0, 0},
584
    {0xF280,0x55, 0},
585
    {0xF281,0xAA, 0},
586
    {0xF282,0x66, 0},
587
    {0xF38E,0x25, 0},
588
};
589
590
static struct mddi_table mddi_Sharp_Common_table[] = {	
591
    {0x1100, 0, 0x64},
592
593
    {0x4080,0x42, 0},
594
    {0x4180,0x4F, 0},
595
    {0x4280,0x57, 0},
596
    {0x4380,0x61, 0},
597
    {0x4480,0x1F, 0},
598
    {0x4580,0x32, 0},
599
    {0x4680,0x63, 0},
600
    {0x4780,0x46, 0},
601
    {0x4880,0x28, 0},
602
    {0x4980,0x30, 0},
603
    {0x4A80,0x88, 0},
604
    {0x4B80,0x1D, 0},
605
    {0x4C80,0x45, 0},
606
    {0x4D80,0x50, 0},
607
    {0x4E80,0x6F, 0},
608
    {0x4F80,0x8D, 0},
609
    {0x5080,0x39, 0},
610
    {0x5180,0x5A, 0},
611
    {0x5880,0x1D, 0},
612
    {0x5980,0x3E, 0},
613
    {0x5A80,0x6B, 0},
614
    {0x5B80,0x88, 0},
615
    {0x5C80,0x2F, 0},
616
    {0x5D80,0x3D, 0},
617
    {0x5E80,0x62, 0},
618
    {0x5F80,0x74, 0},
619
    {0x6080,0xF, 0},
620
    {0x6180,0x17, 0},
621
    {0x6280,0xB8, 0},
622
    {0x6380,0x1D, 0},
623
    {0x6480,0x4E, 0},
624
    {0x6580,0x60, 0},
625
    {0x6680,0x9F, 0},
626
    {0x6780,0xA9, 0},
627
    {0x6880,0x31, 0},
628
    {0x6980,0x3E, 0},
629
    {0x7080,0x63, 0},
630
    {0x7180,0x6F, 0},
631
    {0x7280,0x76, 0},
632
    {0x7380,0x7F, 0},
633
    {0x7480,0x1F, 0},
634
    {0x7580,0x30, 0},
635
    {0x7680,0x65, 0},
636
    {0x7780,0x56, 0},
637
    {0x7880,0x26, 0},
638
    {0x7980,0x2F, 0},
639
    {0x7A80,0x91, 0},
640
    {0x7B80,0x1B, 0},
641
    {0x7C80,0x3F, 0},
642
    {0x7D80,0x51, 0},
643
    {0x7E80,0x7A, 0},
644
    {0x7F80,0x9C, 0},
645
    {0x8080,0x52, 0},
646
    {0x8180,0x5A, 0},
647
    {0x8880,0x1D, 0},
648
    {0x8980,0x25, 0},
649
    {0x8A80,0x5B, 0},
650
    {0x8B80,0x7E, 0},
651
    {0x8C80,0x2E, 0},
652
    {0x8D80,0x40, 0},
653
    {0x8E80,0x65, 0},
654
    {0x8F80,0x6A, 0},
655
    {0x9080,0x10, 0},
656
    {0x9180,0x18, 0},
657
    {0x9280,0xA7, 0},
658
    {0x9380,0x1D, 0},
659
    {0x9480,0x4E, 0},
660
    {0x9580,0x60, 0},
661
    {0x9680,0x81, 0},
662
    {0x9780,0x8A, 0},
663
    {0x9880,0x11, 0},
664
    {0x9980,0x1D, 0},
665
    {0xA080,0x22, 0},
666
    {0xA180,0x38, 0},
667
    {0xA280,0x50, 0},
668
    {0xA380,0x64, 0},
669
    {0xA480,0x27, 0},
670
    {0xA580,0x3D, 0},
671
    {0xA680,0x69, 0},
672
    {0xA780,0x5A, 0},
673
    {0xA880,0x28, 0},
674
    {0xA980,0x31, 0},
675
    {0xAA80,0x97, 0},
676
    {0xAB80,0x1B, 0},
677
    {0xAC80,0x41, 0},
678
    {0xAD80,0x50, 0},
679
    {0xAE80,0x7B, 0},
680
    {0xAF80,0x98, 0},
681
    {0xB080,0x3C, 0},
682
    {0xB180,0x5A, 0},
683
    {0xB880,0x1D, 0},
684
    {0xB980,0x3B, 0},
685
    {0xBA80,0x5F, 0},
686
    {0xBB80,0x7D, 0},
687
    {0xBC80,0x2F, 0},
688
    {0xBD80,0x3F, 0},
689
    {0xBE80,0x64, 0},
690
    {0xBF80,0x64, 0},
691
    {0xC080,0xE, 0},
692
    {0xC180,0x17, 0},
693
    {0xC280,0xA3, 0},
694
    {0xC380,0x17, 0},
695
    {0xC480,0x43, 0},
696
    {0xC580,0x58, 0},
697
    {0xC680,0x9C, 0},
698
    {0xC780,0xB0, 0},
699
    {0xC880,0x49, 0},
700
    {0xC980,0x5F, 0},        
701
702
    /* Common to all panels ? see seid power on table */
703
    {0x4E00,0, 0},
704
    {0x3A00, 5, 0},
705
    {0x3500,0, 0},
706
    {0x4400,0, 0},
707
    {0x4401,0, 0},
708
    {0x5E00,0, 0}, 
709
    {0x6A01,0, 0},
710
    {0x6A02,1, 0},
711
    {0x5301,0x10, 0},
712
    {0x5500,2, 0},
713
    {0x6A17,1, 0},
714
    {0x6A18,0xFF, 0},
715
    {0x2900,1, 0},
716
    {0x5300,0x2C, 0},
717
    {0x5E03,1, 0},
718
};
719
720
static struct mddi_table mddi_Temp_table_part0[] = {	
721
    {0x30, 0},
722
    {0x18,0x3BF},
723
    {0x20,0x3034},
724
    {0x24,0x4011},
725
    {0x28,0x32A},
726
    {0x2C, 1},
727
728
    {0x2C, 1, 2},
729
730
    {0x84,0x208},
731
    {0x88,0x37},
732
    {0x8C,0x2113},
733
    {0x90, 0},
734
    {0x2C, 2, 2},
735
736
    {0x2C, 3},
737
    {0x100,0x3402},
738
    {0x104,0x380},
739
    {0x140,0x3E},
740
    {0x144,0xEF},
741
    {0x148, 9},
742
    {0x14C, 4},
743
    {0x150, 0},
744
    {0x154,0x333},
745
    {0x158,0x31F},
746
    {0x15C, 8},
747
    {0x160, 4},
748
    {0x164, 0},
749
    {0x168,0xE3},
750
    {0x180,0x57},
751
    {0x184,0xDB},
752
    {0x188,0xE3},
753
    {0x18C, 0},
754
    {0x190, 0},
755
    {0x200,0xA6},
756
    {0x204, 0},
757
    {0x208,0x13F},
758
    {0x20C, 0},
759
    {0x210, 0},
760
    {0x214, 0},
761
    {0x218, 0},
762
    {0x21C,0x1DF},
763
    {0x220, 0},
764
    {0x224, 0},
765
    {0x400,0x8000},
766
    {0x404,0x1000},
767
    {0x480,0x4001},
768
    {0x484,0x62},
769
    {0x500, 0},
770
    {0x504,0x8000},
771
    {0x508, 0},
772
    {0x50C, 0},
773
    {0x510, 0},
774
    {0x514, 0},
775
    {0x518,0x1E},
776
    {0x51C,0xC7},
777
    {0x520,0x1DF},
778
    {0x524,0x31F},
779
    {0x528, 0},
780
    {0x52C, 0, 1},
781
782
    {0x580, 0},
783
    {0x584, 0},
784
    {0x588,0xD2C},
785
    {0x58C,0xFA0},
786
    {0x590,0x10CC},
787
    {0x594,0x34},
788
    {0x598,0x77},
789
    {0x59C,0x13F},
790
    {0x5A0,0xEF},
791
    {0x5A4, 0},
792
    {0x5A8, 0, 1},               
793
794
    {0x600, 0},
795
    {0x604,0x101},
796
    {0x608, 0},
797
    {0x60C,0x80},
798
    {0x610, 0},
799
    {0x648, 0},
800
    {0x680,0x8000},
801
    {0x684, 0},
802
    {0x688,0x1E},
803
    {0x68C,0xC7},
804
    {0x690,0x1DF},
805
    {0x694,0x31F},
806
    {0x698, 0},
807
    {0x69C, 0},
808
    {0x6A0, 0},
809
    {0x6A4, 0},
810
    {0x6A8, 0},
811
    {0x6AC,0x34},
812
    {0x6B0,0x77},
813
    {0x6B4,0x12B},
814
    {0x6B8,0x31},
815
    {0x6BC,0xF},
816
    {0x6C0,0xF0},
817
    {0x6C4, 0},
818
    {0x6C8,0x96},
819
    {0x700, 0},
820
    {0x704,0x20A},
821
    {0x708,0x400},
822
    {0x70C,0x400},
823
    {0x714,0xC00},
824
    {0x718,0xD2C},
825
    {0x71C,0xFA0},
826
    {0x720,0x10CC},
827
    {0x724,0x14},
828
    {0x728,0x3B},
829
    {0x72C,0x63},
830
    {0x730,0x63},
831
    {0x734, 0},
832
    {0x738, 0},
833
    {0x73C,0x32},
834
    {0x740,0x32},
835
    {0x744,0x95},
836
    {0x748,0x95},
837
    {0x800, 0},
838
    {0x804,0x20A},
839
    {0x808,0x400},
840
    {0x80C,0x400},
841
    {0x814,0xC00},
842
    {0x818,0xD2C},
843
    {0x81C,0xFA0},
844
    {0x820,0x10CC},
845
    {0x824,0x14},
846
    {0x828,0x3B},
847
    {0x82C,0x63},
848
    {0x830,0x63},
849
    {0x834,0x64},
850
    {0x838,0x64},
851
    {0x83C,0x64},
852
    {0x840,0x64},
853
    {0x844,0xC7},
854
    {0x848,0xC7},
855
    {0x900, 0},
856
    {0x904, 0},
857
    {0x908,0x13F},
858
    {0x90C,0xEF},
859
    {0x910, 0},
860
    {0x914,0x13F},
861
    {0x918, 0},
862
    {0x91C,0xEF},
863
864
    {0x4000, 0x600},
865
866
    {0xB00, 3},
867
    {0x300,0x3000},
868
    {0x304, 0},
869
    {0x308, 0},
870
    {0x30C,0x4FFF},
871
    {0x310,0x7FFF},
872
    {0x314,0xFF},
873
    {0x318,0x7FFF},
874
    {0x31C,0xFFFF},
875
    {0x320,0xFF},
876
    {0x324,0x6FFF},
877
    {0x328, 0},
878
    {0x32C, 0, 2},    
879
880
    {0x4000, 0x600, 1},
881
    {0x614, 0},
882
    {0x618, 0},
883
    {0x61C, 0},
884
    {0x620, 0},
885
    {0x624, 0},
886
    {0x628, 0},
887
    {0x62C, 0},
888
    {0x630, 0},
889
    {0x634, 0},
890
    {0x638, 0},
891
    {0x63C, 0},
892
    {0x640, 0},
893
    {0x644, 0},
894
    {0x324, 0x3800, 0x14},
895
};
896
897
static struct mddi_table mddi_Temp_table_part1[] = {	
898
    {0x324, 0x2800, 0x32},
899
    {0x504, 1, 0xA},
900
};
901
902
static struct mddi_table mddi_Temp_off_table[] = {	
903
    {0x324, 0x3800, 0x64},
904
};
905
906
/* Common MDDI client routines ----------------------------------------- */
907
908
/* This subroutine is the routines used by SPL to detect the panel type
909
 * It should not be called because SPL saves the panel type into SMI memory
910
 * @ addr = 0x81034. This routine gets called if the value in SMI is 0.
911
 * It might be used if one day, the WinMo SPL is thrown away.
912
 */
913
static void Get_Panel_ID_SPL(struct msm_mddi_client_data *client_data)
914
{
915
	if(currentPanelType == 0)
916
	{
917
   		client_data->auto_hibernate(client_data, 0);
918
/*
919
        printk("%s : readl(MSM_SHARED_RAM_BASE + 0xFC254) = %d\n", __func__,
920
                    readl(MSM_SHARED_RAM_BASE + 0xFC254));
921
*/
922
923
        switch ( readl(MSM_SHARED_RAM_BASE + 0xFC254) ) {
924
            case 0:
925
                if ( client_data->remote_read(client_data, 0x1380) != 0 ) {
926
                    currentPanelType = PANEL_TYPE_AUO_ES2;
927
                } else {
928
                    currentPanelType = PANEL_TYPE_AUO_ES1;
929
                }
930
            break;
931
            
932
            case 1:
933
                if ( client_data->remote_read(client_data, 0x1380) != 0 ) {
934
                    currentPanelType = PANEL_TYPE_EID;
935
                } else {
936
                    currentPanelType = PANEL_TYPE_SEID;
937
                }
938
            break;
939
            
940
            case 2:
941
                if ( client_data->remote_read(client_data, 0x2480) != 0x57 ) {
942
                    currentPanelType = PANEL_TYPE_SHARP_DVT;
943
                } else {
944
                    currentPanelType = PANEL_TYPE_SHARP_EVT;
945
                }
946
            break;
947
            
948
            case 3:
949
                /* On RHOD500, panel type TEMP is replaced by panel type HITACHI = 0x5
950
                 * But, as they used the same power sequences, don't need to make a test
951
                 * on the variant */
952
                currentPanelType = PANEL_TYPE_TEMP;
953
            break;
954
955
            default:
956
            break;
957
        }
958
		client_data->auto_hibernate(client_data, 1);
959
	}
960
961
	printk( KERN_INFO "%s - currentPanelType=0x%02x\r\n", __FUNCTION__, currentPanelType);
962
    /* TODO : Reenable this line if we need to save the panel type in the SMI as done by the
963
     * WinMo SPL.
964
     */
965
    //writel( MSM_INIT_BASE + 0x81034 , currentPanelType) ;
966
}
967
968
static void Get_Panel_ID(struct msm_mddi_client_data *client_data)
969
{
970
    int panelID = readl( MSM_INIT_BASE + 0x81034 ) ;
971
    printk("%s : Panel type (SMI) = %d\n", __func__, panelID);
972
    if ( panelID == 0 ) {
973
        printk("%s : panel needs to be detected\n", __func__);
974
        if ( client_data->remote_read != NULL ) {
975
            Get_Panel_ID_SPL(client_data);
976
        }
977
    } else {
978
        currentPanelType = panelID;
979
    }
980
}
981
982
static void htcrhod_process_mddi_table(struct msm_mddi_client_data *client_data,
983
				     struct mddi_table *table, size_t count)
984
{
985
    int i;
986
    for(i = 0; i < count; i++) {
987
        uint32_t reg   = cpu_to_le32(table[i].reg);
988
        uint32_t value = cpu_to_le32(table[i].value);
989
        uint32_t sleep = table[i].sleep;
990
991
        client_data->remote_write(client_data, value, reg);
992
        if ( sleep ) {
993
            msleep(sleep);
994
        }
995
    }
996
}
997
998
/* Panel dependent initialization -------------------------------------- */
999
static int htcrhod_mddi_auo_es1_panel_init(
1000
	struct msm_mddi_bridge_platform_data *bridge_data,
1001
	struct msm_mddi_client_data *client_data)
1002
{
1003
	client_data->auto_hibernate(client_data, 0);
1004
    //sub_100273A8(0);          // TODO
1005
	htcrhod_process_mddi_table(client_data, mddi_Auo_ES1_table_part0,
1006
                                       ARRAY_SIZE(mddi_Auo_ES1_table_part0));
1007
    //sub_100273A8(1);          // TODO
1008
	htcrhod_process_mddi_table(client_data, mddi_Auo_ES1_table_part1,
1009
                                       ARRAY_SIZE(mddi_Auo_ES1_table_part1));
1010
	client_data->auto_hibernate(client_data, 1);
1011
	return 0;
1012
}
1013
1014
static int htcrhod_mddi_auo_es2_panel_init(
1015
	struct msm_mddi_bridge_platform_data *bridge_data,
1016
	struct msm_mddi_client_data *client_data)
1017
{
1018
	client_data->auto_hibernate(client_data, 0);
1019
    //sub_100273A8(0);          // TODO
1020
	htcrhod_process_mddi_table(client_data, mddi_Auo_ES2_table_part0,
1021
                                       ARRAY_SIZE(mddi_Auo_ES2_table_part0));
1022
    //sub_100273A8(1);          // TODO
1023
	htcrhod_process_mddi_table(client_data, mddi_Auo_ES2_table_part1,
1024
                                       ARRAY_SIZE(mddi_Auo_ES2_table_part1));
1025
	client_data->auto_hibernate(client_data, 1);
1026
	return 0;
1027
}
1028
1029
static int htcrhod_mddi_sharp_evt_panel_init(
1030
	struct msm_mddi_bridge_platform_data *bridge_data,
1031
	struct msm_mddi_client_data *client_data)
1032
{
1033
	client_data->auto_hibernate(client_data, 0);
1034
	htcrhod_process_mddi_table(client_data, mddi_Sharp_EVT_table,
1035
                                       ARRAY_SIZE(mddi_Sharp_EVT_table));
1036
	htcrhod_process_mddi_table(client_data, mddi_Sharp_Common_table,
1037
                                       ARRAY_SIZE(mddi_Sharp_Common_table));
1038
	client_data->auto_hibernate(client_data, 1);
1039
	return 0;
1040
}
1041
1042
static int htcrhod_mddi_sharp_dvt_panel_init(
1043
	struct msm_mddi_bridge_platform_data *bridge_data,
1044
	struct msm_mddi_client_data *client_data)
1045
{
1046
	client_data->auto_hibernate(client_data, 0);
1047
	htcrhod_process_mddi_table(client_data, mddi_Sharp_DVT_table,
1048
                                       ARRAY_SIZE(mddi_Sharp_DVT_table));
1049
	htcrhod_process_mddi_table(client_data, mddi_Sharp_Common_table,
1050
                                       ARRAY_SIZE(mddi_Sharp_Common_table));
1051
	client_data->auto_hibernate(client_data, 1);
1052
	return 0;
1053
}
1054
1055
static int htcrhod_mddi_epson_panel_init(
1056
	struct msm_mddi_bridge_platform_data *bridge_data,
1057
	struct msm_mddi_client_data *client_data)
1058
{
1059
	client_data->auto_hibernate(client_data, 0);
1060
	htcrhod_process_mddi_table(client_data, mddi_Eid_table,
1061
                                       ARRAY_SIZE(mddi_Eid_table));
1062
	client_data->auto_hibernate(client_data, 1);
1063
	return 0;
1064
}
1065
1066
static int htcrhod_mddi_sanyo_panel_init(
1067
	struct msm_mddi_bridge_platform_data *bridge_data,
1068
	struct msm_mddi_client_data *client_data)
1069
{
1070
	client_data->auto_hibernate(client_data, 0);
1071
	htcrhod_process_mddi_table(client_data, mddi_Seid_table,
1072
                                       ARRAY_SIZE(mddi_Seid_table));
1073
	client_data->auto_hibernate(client_data, 1);
1074
	return 0;
1075
}
1076
1077
static int htcrhod_mddi_temp_panel_init(
1078
	struct msm_mddi_bridge_platform_data *bridge_data,
1079
	struct msm_mddi_client_data *client_data)
1080
{
1081
	client_data->auto_hibernate(client_data, 0);
1082
	htcrhod_process_mddi_table(client_data, mddi_Temp_table_part0,
1083
                                       ARRAY_SIZE(mddi_Temp_table_part0));
1084
//    sub_10025210();         // TODO
1085
	htcrhod_process_mddi_table(client_data, mddi_Temp_table_part1,
1086
                                       ARRAY_SIZE(mddi_Temp_table_part1));
1087
	client_data->auto_hibernate(client_data, 1);
1088
	return 0;
1089
}
1090
1091
static int htcrhod_mddi_temp_panel_uninit(
1092
	struct msm_mddi_bridge_platform_data *bridge_data,
1093
	struct msm_mddi_client_data *client_data)
1094
{
1095
	client_data->auto_hibernate(client_data, 0);
1096
    //msleep(0x3C);
1097
	htcrhod_process_mddi_table(client_data, mddi_Temp_off_table,
1098
                                       ARRAY_SIZE(mddi_Temp_off_table));
1099
	client_data->auto_hibernate(client_data, 1);
1100
	return 0;
1101
}
1102
1103
1104
/* Common MDDI client initialization and panel init call --------------- */
1105
static int htcrhod_mddi_client_init(
1106
	struct msm_mddi_bridge_platform_data *bridge_data,
1107
	struct msm_mddi_client_data *client_data)
1108
{
1109
//	int i;
1110
//	unsigned reg, val;
1111
    printk("%s\n", __func__);
1112
1113
	return 0;
1114
}
1115
1116
static int htcrhod_mddi_client_uninit(
1117
	struct msm_mddi_bridge_platform_data *bridge_data,
1118
	struct msm_mddi_client_data *client_data)
1119
{
1120
//	int i;
1121
//	unsigned reg, val;
1122
    printk("%s\n", __func__);
1123
1124
	return 0;
1125
}
1126
1127
static int htcrhod_mddi_panel_blank(
1128
	struct msm_mddi_bridge_platform_data *bridge_data,
1129
	struct msm_mddi_client_data *client_data)
1130
{
1131
    printk("%s\n", __func__);
1132
1133
#if 1
1134
    if ( client_data->remote_write == NULL ) {
1135
        printk("%s : mddi client not yet initialized \n", __func__);
1136
        return 0;
1137
    }
1138
1139
    if ( currentPanelType == 0 ) {
1140
1141
    } else if ( currentPanelType == PANEL_TYPE_TEMP ) {
1142
        htcrhod_mddi_temp_panel_uninit(bridge_data,client_data);
1143
    } else {
1144
	    client_data->auto_hibernate(client_data, 0);
1145
	    htcrhod_process_mddi_table(client_data, mddi_PanelPowerOff_table,
1146
                                           ARRAY_SIZE(mddi_PanelPowerOff_table));
1147
	    client_data->auto_hibernate(client_data, 1);
1148
    }
1149
#endif
1150
	micropklt_panel_suspend();
1151
	//gpio_set_value(RHODIUM_LCD_PWR1, 0);
1152
	return 0;
1153
}
1154
1155
static int htcrhod_mddi_panel_unblank(
1156
	struct msm_mddi_bridge_platform_data *bridge_data,
1157
	struct msm_mddi_client_data *client_data)
1158
{
1159
    printk("%s\n", __func__);
1160
1161
#if 1
1162
    if ( client_data->remote_write == NULL ) {
1163
        printk("%s : mddi client not yet initialized \n", __func__);
1164
        return 0;
1165
    }
1166
1167
	client_data->auto_hibernate(client_data, 0);
1168
1169
	switch(currentPanelType) {
1170
		case PANEL_TYPE_AUO_ES1:
1171
			printk("init auo es1 panel\n");
1172
			htcrhod_mddi_auo_es1_panel_init(bridge_data,client_data);
1173
		break;
1174
1175
		case PANEL_TYPE_AUO_ES2:
1176
			printk("init auo es2 panel\n");
1177
			htcrhod_mddi_auo_es2_panel_init(bridge_data,client_data);
1178
		break;
1179
1180
		case PANEL_TYPE_SHARP_EVT:
1181
			printk("init sharp evt panel\n");
1182
			htcrhod_mddi_sharp_evt_panel_init(bridge_data,client_data);
1183
		break;
1184
1185
		case PANEL_TYPE_SHARP_DVT:
1186
			printk("init sharp dvt panel\n");
1187
			htcrhod_mddi_sharp_dvt_panel_init(bridge_data,client_data);
1188
		break;
1189
1190
		case PANEL_TYPE_EID:
1191
			printk("init epson panel\n");
1192
			htcrhod_mddi_epson_panel_init(bridge_data,client_data);
1193
		break;
1194
1195
		case PANEL_TYPE_SEID:
1196
			printk("init sanyo panel\n");
1197
			htcrhod_mddi_sanyo_panel_init(bridge_data,client_data);
1198
		break;
1199
1200
		case PANEL_TYPE_TEMP:
1201
			printk("init temp panel\n");
1202
			htcrhod_mddi_temp_panel_init(bridge_data,client_data);
1203
		break;
1204
1205
		default:
1206
		break;
1207
	}
1208
	client_data->auto_hibernate(client_data, 1);
1209
#endif
1210
1211
	//gpio_set_value(RHODIUM_LCD_PWR1, 1);
1212
	micropklt_panel_resume();
1213
    //client_data->remote_write(client_data, 0x00, 0x2900); // display on
1214
    /* Already present in the init tables */
1215
    //client_data->remote_write(client_data, 0x2c, 0x5300); // toggle autobl bit
1216
	return 0;
1217
}
1218
1219
static void htcrhod_mddi_power_client(
1220
	struct msm_mddi_client_data *client_data,
1221
	int on)
1222
{
1223
	struct msm_dex_command dex;
1224
1225
    printk("%s(%d)\n", __func__, on);
1226
1227
	/* don't power up/down if we don't know the panel type */
1228
	if(currentPanelType == 0) {
1229
		/* don't power up/down if we don't know the panel type
1230
         * In fact, this avoid the screen to be resetted at first
1231
         * power on call during early boot.
1232
         */
1233
        Get_Panel_ID(client_data);
1234
        return;
1235
	}
1236
1237
#if 1
1238
    if(on) {
1239
        dex.cmd=PCOM_PMIC_REG_ON;
1240
        dex.has_data=1;
1241
        dex.data=0x800;
1242
        msm_proc_comm_wince(&dex,0);
1243
1244
        dex.data=0x2000;
1245
        msm_proc_comm_wince(&dex,0);
1246
1247
        mdelay(20);
1248
1249
        gpio_set_value(RHODIUM_LCD_PWR3, 1);   
1250
        mdelay(10);
1251
        gpio_set_value(RHODIUM_LCD_PWR3, 0);   
1252
        mdelay(1);
1253
        gpio_set_value(RHODIUM_LCD_PWR3, 1);   
1254
        mdelay(25);
1255
    } else {
1256
        mdelay(104);
1257
        gpio_set_value(RHODIUM_LCD_PWR3, 0);   
1258
        mdelay(25);
1259
1260
        dex.cmd=PCOM_PMIC_REG_OFF;
1261
        dex.has_data=1;
1262
        dex.data=0x2000;
1263
        msm_proc_comm_wince(&dex,0);
1264
1265
        dex.data=0x800;
1266
        msm_proc_comm_wince(&dex,0);
1267
1268
        mdelay(3);
1269
    }
1270
#endif
1271
}
1272
1273
extern struct resource resources_msm_fb[];
1274
1275
static struct msm_mddi_bridge_platform_data novatec_client_data = {
1276
	.init = htcrhod_mddi_client_init,
1277
	.uninit = htcrhod_mddi_client_uninit,
1278
	.blank = htcrhod_mddi_panel_blank,
1279
	.unblank = htcrhod_mddi_panel_unblank,
1280
	.fb_data = {
1281
		.xres = 480,
1282
		.yres = 800,
1283
		.output_format = 0,
1284
	},
1285
};
1286
1287
static struct msm_mddi_platform_data mddi_pdata = {
1288
	.vsync_irq = MSM_GPIO_TO_INT(RHOD_LCD_VSYNC),
1289
	.power_client = htcrhod_mddi_power_client,
1290
	.fb_resource = resources_msm_fb,
1291
	.num_clients = 2,
1292
	.client_platform_data = {
1293
		{
1294
			// rhod+topa
1295
			.product_id = (0xb9f6 << 16 | 0x5580),
1296
			.name = "mddi_c_b9f6_5582",
1297
			.id = 0,
1298
			.client_data = &novatec_client_data,
1299
			.clk_rate = 0,
1300
		},
1301
		{
1302
			// rhod+topa
1303
			.product_id = (0xb9f6 << 16 | 0x5582),
1304
			.name = "mddi_c_b9f6_5582",
1305
			.id = 0,
1306
			.client_data = &novatec_client_data,
1307
			.clk_rate = 0,
1308
		}
1309
	},
1310
};
1311
1312
int __init htcrhod_init_panel(void)
1313
{
1314
	int rc;
1315
1316
	if(!machine_is_htcrhodium()) {
1317
		printk(KERN_INFO "%s: panel does not apply to this device, aborted\n", __func__);
1318
		return 0;
1319
	}
1320
1321
	printk(KERN_INFO "%s: Initializing panel\n", __func__);
1322
1323
	rc = gpio_request(RHOD_LCD_VSYNC, "vsync");
1324
	if (rc)
1325
		return rc;
1326
	rc = gpio_direction_input(RHOD_LCD_VSYNC);
1327
	if (rc)
1328
		return rc;
1329
1330
	rc = platform_device_register(&msm_device_mdp);
1331
	if (rc)
1332
		return rc;
1333
	msm_device_mddi0.dev.platform_data = &mddi_pdata;
1334
	return platform_device_register(&msm_device_mddi0);
1335
}
1336
1337
device_initcall(htcrhod_init_panel);