ebi2_l2f.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. /* Copyright (c) 2008-2010, The Linux Foundation. All rights reserved.
  2. *
  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.
  6. *
  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.
  11. *
  12. */
  13. #include "msm_fb.h"
  14. #include <linux/memory.h>
  15. #include <linux/kernel.h>
  16. #include <linux/sched.h>
  17. #include <linux/time.h>
  18. #include <linux/init.h>
  19. #include <linux/interrupt.h>
  20. #include "linux/proc_fs.h"
  21. #include <linux/delay.h>
  22. #include <mach/hardware.h>
  23. #include <linux/io.h>
  24. #include <asm/system.h>
  25. #include <asm/mach-types.h>
  26. /* The following are for MSM5100 on Gator
  27. */
  28. #ifdef FEATURE_PM1000
  29. #include "pm1000.h"
  30. #endif /* FEATURE_PM1000 */
  31. /* The following are for MSM6050 on Bambi
  32. */
  33. #ifdef FEATURE_PMIC_LCDKBD_LED_DRIVER
  34. #include "pm.h"
  35. #endif /* FEATURE_PMIC_LCDKBD_LED_DRIVER */
  36. #ifdef DISP_DEVICE_18BPP
  37. #undef DISP_DEVICE_18BPP
  38. #define DISP_DEVICE_16BPP
  39. #endif
  40. #define QCIF_WIDTH 176
  41. #define QCIF_HEIGHT 220
  42. static void *DISP_CMD_PORT;
  43. static void *DISP_DATA_PORT;
  44. #define DISP_CMD_DISON 0xaf
  45. #define DISP_CMD_DISOFF 0xae
  46. #define DISP_CMD_DISNOR 0xa6
  47. #define DISP_CMD_DISINV 0xa7
  48. #define DISP_CMD_DISCTL 0xca
  49. #define DISP_CMD_GCP64 0xcb
  50. #define DISP_CMD_GCP16 0xcc
  51. #define DISP_CMD_GSSET 0xcd
  52. #define DISP_GS_2 0x02
  53. #define DISP_GS_16 0x01
  54. #define DISP_GS_64 0x00
  55. #define DISP_CMD_SLPIN 0x95
  56. #define DISP_CMD_SLPOUT 0x94
  57. #define DISP_CMD_SD_PSET 0x75
  58. #define DISP_CMD_MD_PSET 0x76
  59. #define DISP_CMD_SD_CSET 0x15
  60. #define DISP_CMD_MD_CSET 0x16
  61. #define DISP_CMD_DATCTL 0xbc
  62. #define DISP_DATCTL_666 0x08
  63. #define DISP_DATCTL_565 0x28
  64. #define DISP_DATCTL_444 0x38
  65. #define DISP_CMD_RAMWR 0x5c
  66. #define DISP_CMD_RAMRD 0x5d
  67. #define DISP_CMD_PTLIN 0xa8
  68. #define DISP_CMD_PTLOUT 0xa9
  69. #define DISP_CMD_ASCSET 0xaa
  70. #define DISP_CMD_SCSTART 0xab
  71. #define DISP_CMD_VOLCTL 0xc6
  72. #define DISP_VOLCTL_TONE 0x80
  73. #define DISP_CMD_NOp 0x25
  74. #define DISP_CMD_OSSEL 0xd0
  75. #define DISP_CMD_3500KSET 0xd1
  76. #define DISP_CMD_3500KEND 0xd2
  77. #define DISP_CMD_14MSET 0xd3
  78. #define DISP_CMD_14MEND 0xd4
  79. #define DISP_CMD_OUT(cmd) outpw(DISP_CMD_PORT, cmd);
  80. #define DISP_DATA_OUT(data) outpw(DISP_DATA_PORT, data);
  81. #define DISP_DATA_IN() inpw(DISP_DATA_PORT);
  82. /* Epson device column number starts at 2
  83. */
  84. #define DISP_SET_RECT(ulhc_row, lrhc_row, ulhc_col, lrhc_col) \
  85. DISP_CMD_OUT(DISP_CMD_SD_PSET) \
  86. DISP_DATA_OUT((ulhc_row) & 0xFF) \
  87. DISP_DATA_OUT((ulhc_row) >> 8) \
  88. DISP_DATA_OUT((lrhc_row) & 0xFF) \
  89. DISP_DATA_OUT((lrhc_row) >> 8) \
  90. DISP_CMD_OUT(DISP_CMD_SD_CSET) \
  91. DISP_DATA_OUT(((ulhc_col)+2) & 0xFF) \
  92. DISP_DATA_OUT(((ulhc_col)+2) >> 8) \
  93. DISP_DATA_OUT(((lrhc_col)+2) & 0xFF) \
  94. DISP_DATA_OUT(((lrhc_col)+2) >> 8)
  95. #define DISP_MIN_CONTRAST 0
  96. #define DISP_MAX_CONTRAST 127
  97. #define DISP_DEFAULT_CONTRAST 80
  98. #define DISP_MIN_BACKLIGHT 0
  99. #define DISP_MAX_BACKLIGHT 15
  100. #define DISP_DEFAULT_BACKLIGHT 2
  101. #define WAIT_SEC(sec) mdelay((sec)/1000)
  102. static word disp_area_start_row;
  103. static word disp_area_end_row;
  104. static byte disp_contrast = DISP_DEFAULT_CONTRAST;
  105. static boolean disp_powered_up;
  106. static boolean disp_initialized = FALSE;
  107. /* For some reason the contrast set at init time is not good. Need to do
  108. * it again
  109. */
  110. static boolean display_on = FALSE;
  111. static void epsonQcif_disp_init(struct platform_device *pdev);
  112. static void epsonQcif_disp_set_contrast(word contrast);
  113. static void epsonQcif_disp_set_display_area(word start_row, word end_row);
  114. static int epsonQcif_disp_off(struct platform_device *pdev);
  115. static int epsonQcif_disp_on(struct platform_device *pdev);
  116. static void epsonQcif_disp_set_rect(int x, int y, int xres, int yres);
  117. volatile word databack;
  118. static void epsonQcif_disp_init(struct platform_device *pdev)
  119. {
  120. struct msm_fb_data_type *mfd;
  121. int i;
  122. if (disp_initialized)
  123. return;
  124. mfd = platform_get_drvdata(pdev);
  125. DISP_CMD_PORT = mfd->cmd_port;
  126. DISP_DATA_PORT = mfd->data_port;
  127. /* Sleep in */
  128. DISP_CMD_OUT(DISP_CMD_SLPIN);
  129. /* Display off */
  130. DISP_CMD_OUT(DISP_CMD_DISOFF);
  131. /* Display normal */
  132. DISP_CMD_OUT(DISP_CMD_DISNOR);
  133. /* Set data mode */
  134. DISP_CMD_OUT(DISP_CMD_DATCTL);
  135. DISP_DATA_OUT(DISP_DATCTL_565);
  136. /* Set display timing */
  137. DISP_CMD_OUT(DISP_CMD_DISCTL);
  138. DISP_DATA_OUT(0x1c); /* p1 */
  139. DISP_DATA_OUT(0x02); /* p1 */
  140. DISP_DATA_OUT(0x82); /* p2 */
  141. DISP_DATA_OUT(0x00); /* p3 */
  142. DISP_DATA_OUT(0x00); /* p4 */
  143. DISP_DATA_OUT(0xe0); /* p5 */
  144. DISP_DATA_OUT(0x00); /* p5 */
  145. DISP_DATA_OUT(0xdc); /* p6 */
  146. DISP_DATA_OUT(0x00); /* p6 */
  147. DISP_DATA_OUT(0x02); /* p7 */
  148. DISP_DATA_OUT(0x00); /* p8 */
  149. /* Set 64 gray scale level */
  150. DISP_CMD_OUT(DISP_CMD_GCP64);
  151. DISP_DATA_OUT(0x08); /* p01 */
  152. DISP_DATA_OUT(0x00);
  153. DISP_DATA_OUT(0x2a); /* p02 */
  154. DISP_DATA_OUT(0x00);
  155. DISP_DATA_OUT(0x4e); /* p03 */
  156. DISP_DATA_OUT(0x00);
  157. DISP_DATA_OUT(0x6b); /* p04 */
  158. DISP_DATA_OUT(0x00);
  159. DISP_DATA_OUT(0x88); /* p05 */
  160. DISP_DATA_OUT(0x00);
  161. DISP_DATA_OUT(0xa3); /* p06 */
  162. DISP_DATA_OUT(0x00);
  163. DISP_DATA_OUT(0xba); /* p07 */
  164. DISP_DATA_OUT(0x00);
  165. DISP_DATA_OUT(0xd1); /* p08 */
  166. DISP_DATA_OUT(0x00);
  167. DISP_DATA_OUT(0xe5); /* p09 */
  168. DISP_DATA_OUT(0x00);
  169. DISP_DATA_OUT(0xf3); /* p10 */
  170. DISP_DATA_OUT(0x00);
  171. DISP_DATA_OUT(0x03); /* p11 */
  172. DISP_DATA_OUT(0x01);
  173. DISP_DATA_OUT(0x13); /* p12 */
  174. DISP_DATA_OUT(0x01);
  175. DISP_DATA_OUT(0x22); /* p13 */
  176. DISP_DATA_OUT(0x01);
  177. DISP_DATA_OUT(0x2f); /* p14 */
  178. DISP_DATA_OUT(0x01);
  179. DISP_DATA_OUT(0x3b); /* p15 */
  180. DISP_DATA_OUT(0x01);
  181. DISP_DATA_OUT(0x46); /* p16 */
  182. DISP_DATA_OUT(0x01);
  183. DISP_DATA_OUT(0x51); /* p17 */
  184. DISP_DATA_OUT(0x01);
  185. DISP_DATA_OUT(0x5b); /* p18 */
  186. DISP_DATA_OUT(0x01);
  187. DISP_DATA_OUT(0x64); /* p19 */
  188. DISP_DATA_OUT(0x01);
  189. DISP_DATA_OUT(0x6c); /* p20 */
  190. DISP_DATA_OUT(0x01);
  191. DISP_DATA_OUT(0x74); /* p21 */
  192. DISP_DATA_OUT(0x01);
  193. DISP_DATA_OUT(0x7c); /* p22 */
  194. DISP_DATA_OUT(0x01);
  195. DISP_DATA_OUT(0x83); /* p23 */
  196. DISP_DATA_OUT(0x01);
  197. DISP_DATA_OUT(0x8a); /* p24 */
  198. DISP_DATA_OUT(0x01);
  199. DISP_DATA_OUT(0x91); /* p25 */
  200. DISP_DATA_OUT(0x01);
  201. DISP_DATA_OUT(0x98); /* p26 */
  202. DISP_DATA_OUT(0x01);
  203. DISP_DATA_OUT(0x9f); /* p27 */
  204. DISP_DATA_OUT(0x01);
  205. DISP_DATA_OUT(0xa6); /* p28 */
  206. DISP_DATA_OUT(0x01);
  207. DISP_DATA_OUT(0xac); /* p29 */
  208. DISP_DATA_OUT(0x01);
  209. DISP_DATA_OUT(0xb2); /* p30 */
  210. DISP_DATA_OUT(0x01);
  211. DISP_DATA_OUT(0xb7); /* p31 */
  212. DISP_DATA_OUT(0x01);
  213. DISP_DATA_OUT(0xbc); /* p32 */
  214. DISP_DATA_OUT(0x01);
  215. DISP_DATA_OUT(0xc1); /* p33 */
  216. DISP_DATA_OUT(0x01);
  217. DISP_DATA_OUT(0xc6); /* p34 */
  218. DISP_DATA_OUT(0x01);
  219. DISP_DATA_OUT(0xcb); /* p35 */
  220. DISP_DATA_OUT(0x01);
  221. DISP_DATA_OUT(0xd0); /* p36 */
  222. DISP_DATA_OUT(0x01);
  223. DISP_DATA_OUT(0xd4); /* p37 */
  224. DISP_DATA_OUT(0x01);
  225. DISP_DATA_OUT(0xd8); /* p38 */
  226. DISP_DATA_OUT(0x01);
  227. DISP_DATA_OUT(0xdc); /* p39 */
  228. DISP_DATA_OUT(0x01);
  229. DISP_DATA_OUT(0xe0); /* p40 */
  230. DISP_DATA_OUT(0x01);
  231. DISP_DATA_OUT(0xe4); /* p41 */
  232. DISP_DATA_OUT(0x01);
  233. DISP_DATA_OUT(0xe8); /* p42 */
  234. DISP_DATA_OUT(0x01);
  235. DISP_DATA_OUT(0xec); /* p43 */
  236. DISP_DATA_OUT(0x01);
  237. DISP_DATA_OUT(0xf0); /* p44 */
  238. DISP_DATA_OUT(0x01);
  239. DISP_DATA_OUT(0xf4); /* p45 */
  240. DISP_DATA_OUT(0x01);
  241. DISP_DATA_OUT(0xf8); /* p46 */
  242. DISP_DATA_OUT(0x01);
  243. DISP_DATA_OUT(0xfb); /* p47 */
  244. DISP_DATA_OUT(0x01);
  245. DISP_DATA_OUT(0xfe); /* p48 */
  246. DISP_DATA_OUT(0x01);
  247. DISP_DATA_OUT(0x01); /* p49 */
  248. DISP_DATA_OUT(0x02);
  249. DISP_DATA_OUT(0x03); /* p50 */
  250. DISP_DATA_OUT(0x02);
  251. DISP_DATA_OUT(0x05); /* p51 */
  252. DISP_DATA_OUT(0x02);
  253. DISP_DATA_OUT(0x07); /* p52 */
  254. DISP_DATA_OUT(0x02);
  255. DISP_DATA_OUT(0x09); /* p53 */
  256. DISP_DATA_OUT(0x02);
  257. DISP_DATA_OUT(0x0b); /* p54 */
  258. DISP_DATA_OUT(0x02);
  259. DISP_DATA_OUT(0x0d); /* p55 */
  260. DISP_DATA_OUT(0x02);
  261. DISP_DATA_OUT(0x0f); /* p56 */
  262. DISP_DATA_OUT(0x02);
  263. DISP_DATA_OUT(0x11); /* p57 */
  264. DISP_DATA_OUT(0x02);
  265. DISP_DATA_OUT(0x13); /* p58 */
  266. DISP_DATA_OUT(0x02);
  267. DISP_DATA_OUT(0x15); /* p59 */
  268. DISP_DATA_OUT(0x02);
  269. DISP_DATA_OUT(0x17); /* p60 */
  270. DISP_DATA_OUT(0x02);
  271. DISP_DATA_OUT(0x19); /* p61 */
  272. DISP_DATA_OUT(0x02);
  273. DISP_DATA_OUT(0x1b); /* p62 */
  274. DISP_DATA_OUT(0x02);
  275. DISP_DATA_OUT(0x1c); /* p63 */
  276. DISP_DATA_OUT(0x02);
  277. /* Set 16 gray scale level */
  278. DISP_CMD_OUT(DISP_CMD_GCP16);
  279. DISP_DATA_OUT(0x1a); /* p01 */
  280. DISP_DATA_OUT(0x32); /* p02 */
  281. DISP_DATA_OUT(0x42); /* p03 */
  282. DISP_DATA_OUT(0x4c); /* p04 */
  283. DISP_DATA_OUT(0x58); /* p05 */
  284. DISP_DATA_OUT(0x5f); /* p06 */
  285. DISP_DATA_OUT(0x66); /* p07 */
  286. DISP_DATA_OUT(0x6b); /* p08 */
  287. DISP_DATA_OUT(0x70); /* p09 */
  288. DISP_DATA_OUT(0x74); /* p10 */
  289. DISP_DATA_OUT(0x78); /* p11 */
  290. DISP_DATA_OUT(0x7b); /* p12 */
  291. DISP_DATA_OUT(0x7e); /* p13 */
  292. DISP_DATA_OUT(0x80); /* p14 */
  293. DISP_DATA_OUT(0x82); /* p15 */
  294. /* Set DSP column */
  295. DISP_CMD_OUT(DISP_CMD_MD_CSET);
  296. DISP_DATA_OUT(0xff);
  297. DISP_DATA_OUT(0x03);
  298. DISP_DATA_OUT(0xff);
  299. DISP_DATA_OUT(0x03);
  300. /* Set DSP page */
  301. DISP_CMD_OUT(DISP_CMD_MD_PSET);
  302. DISP_DATA_OUT(0xff);
  303. DISP_DATA_OUT(0x01);
  304. DISP_DATA_OUT(0xff);
  305. DISP_DATA_OUT(0x01);
  306. /* Set ARM column */
  307. DISP_CMD_OUT(DISP_CMD_SD_CSET);
  308. DISP_DATA_OUT(0x02);
  309. DISP_DATA_OUT(0x00);
  310. DISP_DATA_OUT((QCIF_WIDTH + 1) & 0xFF);
  311. DISP_DATA_OUT((QCIF_WIDTH + 1) >> 8);
  312. /* Set ARM page */
  313. DISP_CMD_OUT(DISP_CMD_SD_PSET);
  314. DISP_DATA_OUT(0x00);
  315. DISP_DATA_OUT(0x00);
  316. DISP_DATA_OUT((QCIF_HEIGHT - 1) & 0xFF);
  317. DISP_DATA_OUT((QCIF_HEIGHT - 1) >> 8);
  318. /* Set 64 gray scales */
  319. DISP_CMD_OUT(DISP_CMD_GSSET);
  320. DISP_DATA_OUT(DISP_GS_64);
  321. DISP_CMD_OUT(DISP_CMD_OSSEL);
  322. DISP_DATA_OUT(0);
  323. /* Sleep out */
  324. DISP_CMD_OUT(DISP_CMD_SLPOUT);
  325. WAIT_SEC(40000);
  326. /* Initialize power IC */
  327. DISP_CMD_OUT(DISP_CMD_VOLCTL);
  328. DISP_DATA_OUT(DISP_VOLCTL_TONE);
  329. WAIT_SEC(40000);
  330. /* Set electronic volume, d'xx */
  331. DISP_CMD_OUT(DISP_CMD_VOLCTL);
  332. DISP_DATA_OUT(DISP_DEFAULT_CONTRAST); /* value from 0 to 127 */
  333. /* Initialize display data */
  334. DISP_SET_RECT(0, (QCIF_HEIGHT - 1), 0, (QCIF_WIDTH - 1));
  335. DISP_CMD_OUT(DISP_CMD_RAMWR);
  336. for (i = 0; i < QCIF_HEIGHT * QCIF_WIDTH; i++)
  337. DISP_DATA_OUT(0xffff);
  338. DISP_CMD_OUT(DISP_CMD_RAMRD);
  339. databack = DISP_DATA_IN();
  340. databack = DISP_DATA_IN();
  341. databack = DISP_DATA_IN();
  342. databack = DISP_DATA_IN();
  343. WAIT_SEC(80000);
  344. DISP_CMD_OUT(DISP_CMD_DISON);
  345. disp_area_start_row = 0;
  346. disp_area_end_row = QCIF_HEIGHT - 1;
  347. disp_powered_up = TRUE;
  348. disp_initialized = TRUE;
  349. epsonQcif_disp_set_display_area(0, QCIF_HEIGHT - 1);
  350. display_on = TRUE;
  351. }
  352. static void epsonQcif_disp_set_rect(int x, int y, int xres, int yres)
  353. {
  354. if (!disp_initialized)
  355. return;
  356. DISP_SET_RECT(y, y + yres - 1, x, x + xres - 1);
  357. DISP_CMD_OUT(DISP_CMD_RAMWR);
  358. }
  359. static void epsonQcif_disp_set_display_area(word start_row, word end_row)
  360. {
  361. if (!disp_initialized)
  362. return;
  363. if ((start_row == disp_area_start_row)
  364. && (end_row == disp_area_end_row))
  365. return;
  366. disp_area_start_row = start_row;
  367. disp_area_end_row = end_row;
  368. /* Range checking
  369. */
  370. if (end_row >= QCIF_HEIGHT)
  371. end_row = QCIF_HEIGHT - 1;
  372. if (start_row > end_row)
  373. start_row = end_row;
  374. /* When display is not the full screen, gray scale is set to
  375. ** 2; otherwise it is set to 64.
  376. */
  377. if ((start_row == 0) && (end_row == (QCIF_HEIGHT - 1))) {
  378. /* The whole screen */
  379. DISP_CMD_OUT(DISP_CMD_PTLOUT);
  380. WAIT_SEC(10000);
  381. DISP_CMD_OUT(DISP_CMD_DISOFF);
  382. WAIT_SEC(100000);
  383. DISP_CMD_OUT(DISP_CMD_GSSET);
  384. DISP_DATA_OUT(DISP_GS_64);
  385. WAIT_SEC(100000);
  386. DISP_CMD_OUT(DISP_CMD_DISON);
  387. } else {
  388. /* partial screen */
  389. DISP_CMD_OUT(DISP_CMD_PTLIN);
  390. DISP_DATA_OUT(start_row);
  391. DISP_DATA_OUT(start_row >> 8);
  392. DISP_DATA_OUT(end_row);
  393. DISP_DATA_OUT(end_row >> 8);
  394. DISP_CMD_OUT(DISP_CMD_GSSET);
  395. DISP_DATA_OUT(DISP_GS_2);
  396. }
  397. }
  398. static int epsonQcif_disp_off(struct platform_device *pdev)
  399. {
  400. if (!disp_initialized)
  401. epsonQcif_disp_init(pdev);
  402. if (display_on) {
  403. DISP_CMD_OUT(DISP_CMD_DISOFF);
  404. DISP_CMD_OUT(DISP_CMD_SLPIN);
  405. display_on = FALSE;
  406. }
  407. return 0;
  408. }
  409. static int epsonQcif_disp_on(struct platform_device *pdev)
  410. {
  411. if (!disp_initialized)
  412. epsonQcif_disp_init(pdev);
  413. if (!display_on) {
  414. DISP_CMD_OUT(DISP_CMD_SLPOUT);
  415. WAIT_SEC(40000);
  416. DISP_CMD_OUT(DISP_CMD_DISON);
  417. epsonQcif_disp_set_contrast(disp_contrast);
  418. display_on = TRUE;
  419. }
  420. return 0;
  421. }
  422. static void epsonQcif_disp_set_contrast(word contrast)
  423. {
  424. if (!disp_initialized)
  425. return;
  426. /* Initialize power IC, d'24 */
  427. DISP_CMD_OUT(DISP_CMD_VOLCTL);
  428. DISP_DATA_OUT(DISP_VOLCTL_TONE);
  429. WAIT_SEC(40000);
  430. /* Set electronic volume, d'xx */
  431. DISP_CMD_OUT(DISP_CMD_VOLCTL);
  432. if (contrast > 127)
  433. contrast = 127;
  434. DISP_DATA_OUT(contrast); /* value from 0 to 127 */
  435. disp_contrast = (byte) contrast;
  436. } /* End disp_set_contrast */
  437. static void epsonQcif_disp_clear_screen_area(
  438. word start_row, word end_row, word start_column, word end_column) {
  439. int32 i;
  440. /* Clear the display screen */
  441. DISP_SET_RECT(start_row, end_row, start_column, end_column);
  442. DISP_CMD_OUT(DISP_CMD_RAMWR);
  443. i = (end_row - start_row + 1) * (end_column - start_column + 1);
  444. for (; i > 0; i--)
  445. DISP_DATA_OUT(0xffff);
  446. }
  447. static int __init epsonQcif_probe(struct platform_device *pdev)
  448. {
  449. msm_fb_add_device(pdev);
  450. return 0;
  451. }
  452. static struct platform_driver this_driver = {
  453. .probe = epsonQcif_probe,
  454. .driver = {
  455. .name = "ebi2_epson_qcif",
  456. },
  457. };
  458. static struct msm_fb_panel_data epsonQcif_panel_data = {
  459. .on = epsonQcif_disp_on,
  460. .off = epsonQcif_disp_off,
  461. .set_rect = epsonQcif_disp_set_rect,
  462. };
  463. static struct platform_device this_device = {
  464. .name = "ebi2_epson_qcif",
  465. .id = 0,
  466. .dev = {
  467. .platform_data = &epsonQcif_panel_data,
  468. }
  469. };
  470. static int __init epsonQcif_init(void)
  471. {
  472. int ret;
  473. struct msm_panel_info *pinfo;
  474. ret = platform_driver_register(&this_driver);
  475. if (!ret) {
  476. pinfo = &epsonQcif_panel_data.panel_info;
  477. pinfo->xres = QCIF_WIDTH;
  478. pinfo->yres = QCIF_HEIGHT;
  479. MSM_FB_SINGLE_MODE_PANEL(pinfo);
  480. pinfo->type = EBI2_PANEL;
  481. pinfo->pdest = DISPLAY_2;
  482. pinfo->wait_cycle = 0x808000;
  483. pinfo->bpp = 16;
  484. pinfo->fb_num = 2;
  485. pinfo->lcd.vsync_enable = FALSE;
  486. ret = platform_device_register(&this_device);
  487. if (ret)
  488. platform_driver_unregister(&this_driver);
  489. }
  490. return ret;
  491. }
  492. module_init(epsonQcif_init);