lcdc_toshiba_fwvga_pt.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. /* Copyright (c) 2011-2012, 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 <linux/delay.h>
  14. #include <linux/module.h>
  15. #include <mach/gpio.h>
  16. #include <mach/pmic.h>
  17. #include <mach/socinfo.h>
  18. #include "msm_fb.h"
  19. static int spi_cs0_N;
  20. static int spi_sclk;
  21. static int spi_mosi;
  22. static int spi_miso;
  23. struct toshiba_state_type {
  24. boolean disp_initialized;
  25. boolean display_on;
  26. boolean disp_powered_up;
  27. };
  28. static struct toshiba_state_type toshiba_state = { 0 };
  29. static struct msm_panel_common_pdata *lcdc_toshiba_pdata;
  30. static int toshiba_spi_write(char data1, char data2, int rs)
  31. {
  32. uint32 bitdata = 0, bnum = 24, bmask = 0x800000;
  33. gpio_set_value_cansleep(spi_cs0_N, 0); /* cs* low */
  34. udelay(1);
  35. if (rs)
  36. bitdata = (0x72 << 16);
  37. else
  38. bitdata = (0x70 << 16);
  39. bitdata |= ((data1 << 8) | data2);
  40. while (bnum) {
  41. gpio_set_value_cansleep(spi_sclk, 0); /* clk low */
  42. udelay(1);
  43. if (bitdata & bmask)
  44. gpio_set_value_cansleep(spi_mosi, 1);
  45. else
  46. gpio_set_value_cansleep(spi_mosi, 0);
  47. udelay(1);
  48. gpio_set_value_cansleep(spi_sclk, 1); /* clk high */
  49. udelay(1);
  50. bmask >>= 1;
  51. bnum--;
  52. }
  53. gpio_set_value_cansleep(spi_cs0_N, 1); /* cs* high */
  54. udelay(1);
  55. return 0;
  56. }
  57. static void spi_pin_assign(void)
  58. {
  59. /* Setting the Default GPIO's */
  60. spi_mosi = *(lcdc_toshiba_pdata->gpio_num);
  61. spi_miso = *(lcdc_toshiba_pdata->gpio_num + 1);
  62. spi_sclk = *(lcdc_toshiba_pdata->gpio_num + 2);
  63. spi_cs0_N = *(lcdc_toshiba_pdata->gpio_num + 3);
  64. }
  65. static void toshiba_disp_powerup(void)
  66. {
  67. if (!toshiba_state.disp_powered_up && !toshiba_state.display_on) {
  68. /* Reset the hardware first */
  69. /* Include DAC power up implementation here */
  70. toshiba_state.disp_powered_up = TRUE;
  71. }
  72. }
  73. static void toshiba_disp_on(void)
  74. {
  75. if (toshiba_state.disp_powered_up && !toshiba_state.display_on) {
  76. toshiba_spi_write(0x01, 0x00, 0);
  77. toshiba_spi_write(0x30, 0x00, 1);
  78. udelay(500);
  79. toshiba_spi_write(0x01, 0x01, 0);
  80. toshiba_spi_write(0x40, 0x10, 1);
  81. #ifdef TOSHIBA_FWVGA_FULL_INIT
  82. udelay(500);
  83. toshiba_spi_write(0x01, 0x06, 0);
  84. toshiba_spi_write(0x00, 0x00, 1);
  85. msleep(20);
  86. toshiba_spi_write(0x00, 0x01, 0);
  87. toshiba_spi_write(0x03, 0x10, 1);
  88. udelay(500);
  89. toshiba_spi_write(0x00, 0x02, 0);
  90. toshiba_spi_write(0x01, 0x00, 1);
  91. udelay(500);
  92. toshiba_spi_write(0x00, 0x03, 0);
  93. toshiba_spi_write(0x00, 0x00, 1);
  94. udelay(500);
  95. toshiba_spi_write(0x00, 0x07, 0);
  96. toshiba_spi_write(0x00, 0x00, 1);
  97. udelay(500);
  98. toshiba_spi_write(0x00, 0x08, 0);
  99. toshiba_spi_write(0x00, 0x04, 1);
  100. udelay(500);
  101. toshiba_spi_write(0x00, 0x09, 0);
  102. toshiba_spi_write(0x00, 0x0c, 1);
  103. #endif
  104. udelay(500);
  105. toshiba_spi_write(0x00, 0x0c, 0);
  106. toshiba_spi_write(0x40, 0x10, 1);
  107. udelay(500);
  108. toshiba_spi_write(0x00, 0x0e, 0);
  109. toshiba_spi_write(0x00, 0x00, 1);
  110. udelay(500);
  111. toshiba_spi_write(0x00, 0x20, 0);
  112. toshiba_spi_write(0x01, 0x3f, 1);
  113. udelay(500);
  114. toshiba_spi_write(0x00, 0x22, 0);
  115. toshiba_spi_write(0x76, 0x00, 1);
  116. udelay(500);
  117. toshiba_spi_write(0x00, 0x23, 0);
  118. toshiba_spi_write(0x1c, 0x0a, 1);
  119. udelay(500);
  120. toshiba_spi_write(0x00, 0x24, 0);
  121. toshiba_spi_write(0x1c, 0x2c, 1);
  122. udelay(500);
  123. toshiba_spi_write(0x00, 0x25, 0);
  124. toshiba_spi_write(0x1c, 0x4e, 1);
  125. udelay(500);
  126. toshiba_spi_write(0x00, 0x27, 0);
  127. toshiba_spi_write(0x00, 0x00, 1);
  128. udelay(500);
  129. toshiba_spi_write(0x00, 0x28, 0);
  130. toshiba_spi_write(0x76, 0x0c, 1);
  131. #ifdef TOSHIBA_FWVGA_FULL_INIT
  132. udelay(500);
  133. toshiba_spi_write(0x03, 0x00, 0);
  134. toshiba_spi_write(0x00, 0x00, 1);
  135. udelay(500);
  136. toshiba_spi_write(0x03, 0x01, 0);
  137. toshiba_spi_write(0x05, 0x02, 1);
  138. udelay(500);
  139. toshiba_spi_write(0x03, 0x02, 0);
  140. toshiba_spi_write(0x07, 0x05, 1);
  141. udelay(500);
  142. toshiba_spi_write(0x03, 0x03, 0);
  143. toshiba_spi_write(0x00, 0x00, 1);
  144. udelay(500);
  145. toshiba_spi_write(0x03, 0x04, 0);
  146. toshiba_spi_write(0x02, 0x00, 1);
  147. udelay(500);
  148. toshiba_spi_write(0x03, 0x05, 0);
  149. toshiba_spi_write(0x07, 0x07, 1);
  150. udelay(500);
  151. toshiba_spi_write(0x03, 0x06, 0);
  152. toshiba_spi_write(0x10, 0x10, 1);
  153. udelay(500);
  154. toshiba_spi_write(0x03, 0x07, 0);
  155. toshiba_spi_write(0x02, 0x02, 1);
  156. udelay(500);
  157. toshiba_spi_write(0x03, 0x08, 0);
  158. toshiba_spi_write(0x07, 0x04, 1);
  159. udelay(500);
  160. toshiba_spi_write(0x03, 0x09, 0);
  161. toshiba_spi_write(0x07, 0x07, 1);
  162. udelay(500);
  163. toshiba_spi_write(0x03, 0x0a, 0);
  164. toshiba_spi_write(0x00, 0x00, 1);
  165. udelay(500);
  166. toshiba_spi_write(0x03, 0x0b, 0);
  167. toshiba_spi_write(0x00, 0x00, 1);
  168. udelay(500);
  169. toshiba_spi_write(0x03, 0x0c, 0);
  170. toshiba_spi_write(0x07, 0x07, 1);
  171. udelay(500);
  172. toshiba_spi_write(0x03, 0x0d, 0);
  173. toshiba_spi_write(0x10, 0x10, 1);
  174. udelay(500);
  175. toshiba_spi_write(0x03, 0x10, 0);
  176. toshiba_spi_write(0x01, 0x04, 1);
  177. udelay(500);
  178. toshiba_spi_write(0x03, 0x11, 0);
  179. toshiba_spi_write(0x05, 0x03, 1);
  180. udelay(500);
  181. toshiba_spi_write(0x03, 0x12, 0);
  182. toshiba_spi_write(0x03, 0x04, 1);
  183. udelay(500);
  184. toshiba_spi_write(0x03, 0x15, 0);
  185. toshiba_spi_write(0x03, 0x04, 1);
  186. udelay(500);
  187. toshiba_spi_write(0x03, 0x16, 0);
  188. toshiba_spi_write(0x03, 0x1c, 1);
  189. udelay(500);
  190. toshiba_spi_write(0x03, 0x17, 0);
  191. toshiba_spi_write(0x02, 0x04, 1);
  192. udelay(500);
  193. toshiba_spi_write(0x03, 0x18, 0);
  194. toshiba_spi_write(0x04, 0x02, 1);
  195. udelay(500);
  196. toshiba_spi_write(0x03, 0x19, 0);
  197. toshiba_spi_write(0x03, 0x05, 1);
  198. udelay(500);
  199. toshiba_spi_write(0x03, 0x1c, 0);
  200. toshiba_spi_write(0x07, 0x07, 1);
  201. udelay(500);
  202. toshiba_spi_write(0x03, 0x1d, 0);
  203. toshiba_spi_write(0x02, 0x1f, 1);
  204. udelay(500);
  205. toshiba_spi_write(0x03, 0x20, 0);
  206. toshiba_spi_write(0x05, 0x07, 1);
  207. udelay(500);
  208. toshiba_spi_write(0x03, 0x21, 0);
  209. toshiba_spi_write(0x06, 0x04, 1);
  210. udelay(500);
  211. toshiba_spi_write(0x03, 0x22, 0);
  212. toshiba_spi_write(0x04, 0x05, 1);
  213. udelay(500);
  214. toshiba_spi_write(0x03, 0x27, 0);
  215. toshiba_spi_write(0x02, 0x03, 1);
  216. udelay(500);
  217. toshiba_spi_write(0x03, 0x28, 0);
  218. toshiba_spi_write(0x03, 0x00, 1);
  219. udelay(500);
  220. toshiba_spi_write(0x03, 0x29, 0);
  221. toshiba_spi_write(0x00, 0x02, 1);
  222. #endif
  223. udelay(500);
  224. toshiba_spi_write(0x01, 0x00, 0);
  225. toshiba_spi_write(0x36, 0x3c, 1);
  226. udelay(500);
  227. toshiba_spi_write(0x01, 0x01, 0);
  228. toshiba_spi_write(0x40, 0x03, 1);
  229. udelay(500);
  230. toshiba_spi_write(0x01, 0x02, 0);
  231. toshiba_spi_write(0x00, 0x01, 1);
  232. udelay(500);
  233. toshiba_spi_write(0x01, 0x03, 0);
  234. toshiba_spi_write(0x3c, 0x58, 1);
  235. udelay(500);
  236. toshiba_spi_write(0x01, 0x0c, 0);
  237. toshiba_spi_write(0x01, 0x35, 1);
  238. udelay(500);
  239. toshiba_spi_write(0x01, 0x06, 0);
  240. toshiba_spi_write(0x00, 0x02, 1);
  241. udelay(500);
  242. toshiba_spi_write(0x00, 0x29, 0);
  243. toshiba_spi_write(0x03, 0xbf, 1);
  244. udelay(500);
  245. toshiba_spi_write(0x01, 0x06, 0);
  246. toshiba_spi_write(0x00, 0x03, 1);
  247. msleep(32);
  248. toshiba_spi_write(0x01, 0x01, 0);
  249. toshiba_spi_write(0x40, 0x10, 1);
  250. msleep(80);
  251. toshiba_state.display_on = TRUE;
  252. }
  253. }
  254. static int lcdc_toshiba_panel_on(struct platform_device *pdev)
  255. {
  256. if (!toshiba_state.disp_initialized) {
  257. /* Configure reset GPIO that drives DAC */
  258. if (lcdc_toshiba_pdata->panel_config_gpio)
  259. lcdc_toshiba_pdata->panel_config_gpio(1);
  260. toshiba_disp_powerup();
  261. toshiba_disp_on();
  262. toshiba_state.disp_initialized = TRUE;
  263. }
  264. return 0;
  265. }
  266. static int lcdc_toshiba_panel_off(struct platform_device *pdev)
  267. {
  268. if (toshiba_state.disp_powered_up && toshiba_state.display_on) {
  269. toshiba_spi_write(0x01, 0x06, 1);
  270. toshiba_spi_write(0x00, 0x02, 1);
  271. msleep(80);
  272. toshiba_spi_write(0x01, 0x06, 1);
  273. toshiba_spi_write(0x00, 0x00, 1);
  274. toshiba_spi_write(0x00, 0x29, 1);
  275. toshiba_spi_write(0x00, 0x02, 1);
  276. toshiba_spi_write(0x01, 0x00, 1);
  277. toshiba_spi_write(0x30, 0x00, 1);
  278. if (lcdc_toshiba_pdata->panel_config_gpio)
  279. lcdc_toshiba_pdata->panel_config_gpio(0);
  280. toshiba_state.display_on = FALSE;
  281. toshiba_state.disp_initialized = FALSE;
  282. }
  283. return 0;
  284. }
  285. static void lcdc_toshiba_set_backlight(struct msm_fb_data_type *mfd)
  286. {
  287. int ret;
  288. int bl_level;
  289. bl_level = mfd->bl_level;
  290. if (lcdc_toshiba_pdata && lcdc_toshiba_pdata->pmic_backlight)
  291. ret = lcdc_toshiba_pdata->pmic_backlight(bl_level);
  292. else
  293. pr_err("%s(): Backlight level set failed", __func__);
  294. return;
  295. }
  296. static int __devinit toshiba_probe(struct platform_device *pdev)
  297. {
  298. if (pdev->id == 0) {
  299. lcdc_toshiba_pdata = pdev->dev.platform_data;
  300. spi_pin_assign();
  301. return 0;
  302. }
  303. msm_fb_add_device(pdev);
  304. return 0;
  305. }
  306. static struct platform_driver this_driver = {
  307. .probe = toshiba_probe,
  308. .driver = {
  309. .name = "lcdc_toshiba_fwvga_pt",
  310. },
  311. };
  312. static struct msm_fb_panel_data toshiba_panel_data = {
  313. .on = lcdc_toshiba_panel_on,
  314. .off = lcdc_toshiba_panel_off,
  315. .set_backlight = lcdc_toshiba_set_backlight,
  316. };
  317. static struct platform_device this_device = {
  318. .name = "lcdc_toshiba_fwvga_pt",
  319. .id = 1,
  320. .dev = {
  321. .platform_data = &toshiba_panel_data,
  322. }
  323. };
  324. static int __init lcdc_toshiba_panel_init(void)
  325. {
  326. int ret;
  327. struct msm_panel_info *pinfo;
  328. ret = msm_fb_detect_client("lcdc_toshiba_fwvga_pt");
  329. if (ret)
  330. return 0;
  331. ret = platform_driver_register(&this_driver);
  332. if (ret)
  333. return ret;
  334. pinfo = &toshiba_panel_data.panel_info;
  335. pinfo->xres = 480;
  336. pinfo->yres = 864;
  337. MSM_FB_SINGLE_MODE_PANEL(pinfo);
  338. pinfo->type = LCDC_PANEL;
  339. pinfo->pdest = DISPLAY_1;
  340. pinfo->wait_cycle = 0;
  341. pinfo->bpp = 18;
  342. pinfo->fb_num = 2;
  343. /* 30Mhz mdp_lcdc_pclk and mdp_lcdc_pad_pcl */
  344. pinfo->clk_rate = 30720000;
  345. pinfo->bl_max = 100;
  346. pinfo->bl_min = 1;
  347. if (cpu_is_msm7x25a() || cpu_is_msm7x25aa() || cpu_is_msm7x25ab()) {
  348. pinfo->yres = 320;
  349. pinfo->lcdc.h_back_porch = 10;
  350. pinfo->lcdc.h_front_porch = 21;
  351. pinfo->lcdc.h_pulse_width = 5;
  352. pinfo->lcdc.v_back_porch = 8;
  353. pinfo->lcdc.v_front_porch = 540;
  354. pinfo->lcdc.v_pulse_width = 42;
  355. pinfo->lcdc.border_clr = 0; /* blk */
  356. pinfo->lcdc.underflow_clr = 0xff; /* blue */
  357. pinfo->lcdc.hsync_skew = 0;
  358. } else {
  359. pinfo->lcdc.h_back_porch = 8;
  360. pinfo->lcdc.h_front_porch = 16;
  361. pinfo->lcdc.h_pulse_width = 8;
  362. pinfo->lcdc.v_back_porch = 2;
  363. pinfo->lcdc.v_front_porch = 2;
  364. pinfo->lcdc.v_pulse_width = 2;
  365. pinfo->lcdc.border_clr = 0; /* blk */
  366. pinfo->lcdc.underflow_clr = 0xff; /* blue */
  367. pinfo->lcdc.hsync_skew = 0;
  368. }
  369. ret = platform_device_register(&this_device);
  370. if (ret) {
  371. printk(KERN_ERR "%s not able to register the device\n",
  372. __func__);
  373. platform_driver_unregister(&this_driver);
  374. }
  375. return ret;
  376. }
  377. device_initcall(lcdc_toshiba_panel_init);