jd936x_wxga_dsi_vdo.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /*
  2. * Copyright (c) 2019 MediaTek Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining
  5. * a copy of this software and associated documentation files
  6. * (the "Software"), to deal in the Software without restriction,
  7. * including without limitation the rights to use, copy, modify, merge,
  8. * publish, distribute, sublicense, and/or sell copies of the Software,
  9. * and to permit persons to whom the Software is furnished to do so,
  10. * subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be
  13. * included in all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  18. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  19. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  20. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  21. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #ifdef BUILD_LK
  24. #include <string.h>
  25. #include <platform/mt_gpio.h>
  26. #include <platform/mt_pmic.h>
  27. #include <platform/sync_write.h>
  28. #else
  29. #include <linux/string.h>
  30. #include <linux/wait.h>
  31. #include <linux/platform_device.h>
  32. #include <linux/gpio.h>
  33. #include <linux/pinctrl/consumer.h>
  34. #include <linux/of_gpio.h>
  35. #include <asm-generic/gpio.h>
  36. #include <linux/kernel.h>
  37. #include <linux/mm.h>
  38. #include <linux/mm_types.h>
  39. #include <linux/module.h>
  40. #include <linux/types.h>
  41. #include <linux/slab.h>
  42. #include <linux/vmalloc.h>
  43. #ifdef CONFIG_OF
  44. #include <linux/of.h>
  45. #include <linux/of_irq.h>
  46. #include <linux/of_address.h>
  47. #include <linux/of_device.h>
  48. #endif
  49. #endif
  50. #include "lcm_drv.h"
  51. #ifdef GPIO_LCM_RST
  52. #define GPIO_LCD_RST GPIO_LCM_RST
  53. #else
  54. #define GPIO_LCD_RST (0xFFFFFFFF)
  55. #endif
  56. #ifdef GPIO_LCD_ENP
  57. #define GPIO_LCD_PWR_ENP GPIO_LCD_ENP
  58. #else
  59. #define GPIO_LCD_PWR_ENP (0xFFFFFFFF)
  60. #endif
  61. #ifdef GPIO_LCD_ENN
  62. #define GPIO_LCD_PWR_ENN GPIO_LCD_ENN
  63. #else
  64. #define GPIO_LCD_PWR_ENN (0xFFFFFFFF)
  65. #endif
  66. /* --------------------------------------------------------------- */
  67. /* Local Constants */
  68. /* --------------------------------------------------------------- */
  69. #define FRAME_WIDTH (800)
  70. #define FRAME_HEIGHT (1280)
  71. #define REGFLAG_DELAY 0xFE
  72. #define REGFLAG_END_OF_TABLE 0x00
  73. /* --------------------------------------------------------------- */
  74. /* Local Variables */
  75. /* --------------------------------------------------------------- */
  76. extern void mdelay(unsigned long msec);
  77. static LCM_UTIL_FUNCS lcm_util = {
  78. .set_reset_pin = NULL,
  79. .udelay = NULL,
  80. .mdelay = NULL,
  81. };
  82. #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
  83. #define UDELAY(n) (lcm_util.udelay(n))
  84. #define MDELAY(n) (lcm_util.mdelay(n))
  85. /* --------------------------------------------------------------- */
  86. /* Local Functions */
  87. /* --------------------------------------------------------------- */
  88. #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) \
  89. (lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update))
  90. #define dsi_set_cmdq(pdata, queue_size, force_update) \
  91. (lcm_util.dsi_set_cmdq(pdata, queue_size, force_update))
  92. #define wrtie_cmd(cmd) \
  93. (lcm_util.dsi_write_cmd(cmd))
  94. #define write_regs(addr, pdata, byte_nums) \
  95. (lcm_util.dsi_write_regs(addr, pdata, byte_nums))
  96. #define read_reg \
  97. (lcm_util.dsi_read_reg())
  98. #define read_reg_v2(cmd, buffer, buffer_size) \
  99. (lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size))
  100. static void lcm_set_gpio_output(unsigned int GPIO, unsigned int output)
  101. {
  102. if (GPIO == 0xFFFFFFFF) {
  103. printf("[LK/LCM] GPIO not defined\n");
  104. return;
  105. }
  106. mt_set_gpio_mode(GPIO, GPIO_MODE_00);
  107. mt_set_gpio_dir(GPIO, GPIO_DIR_OUT);
  108. mt_set_gpio_out(GPIO, (output > 0) ? GPIO_OUT_ONE : GPIO_OUT_ZERO);
  109. }
  110. static void init_karnak_fiti_kd_lcm(void)
  111. {
  112. unsigned int data_array[64];
  113. data_array[0] = 0x00E01500;
  114. dsi_set_cmdq(data_array, 1, 1);
  115. data_array[0] = 0x93E11500;
  116. dsi_set_cmdq(data_array, 1, 1);
  117. data_array[0] = 0x65E21500;
  118. dsi_set_cmdq(data_array, 1, 1);
  119. data_array[0] = 0xF8E31500;
  120. dsi_set_cmdq(data_array, 1, 1);
  121. data_array[0] = 0x03801500;
  122. dsi_set_cmdq(data_array, 1, 1);
  123. data_array[0] = 0x01E01500;
  124. dsi_set_cmdq(data_array, 1, 1);
  125. data_array[0] = 0x00001500;
  126. dsi_set_cmdq(data_array, 1, 1);
  127. data_array[0] = 0x6E011500;
  128. dsi_set_cmdq(data_array, 1, 1);
  129. data_array[0] = 0x00031500;
  130. dsi_set_cmdq(data_array, 1, 1);
  131. data_array[0] = 0x82041500;
  132. dsi_set_cmdq(data_array, 1, 1);
  133. data_array[0] = 0x00171500;
  134. dsi_set_cmdq(data_array, 1, 1);
  135. data_array[0] = 0xD7181500;
  136. dsi_set_cmdq(data_array, 1, 1);
  137. data_array[0] = 0x01191500;
  138. dsi_set_cmdq(data_array, 1, 1);
  139. data_array[0] = 0x001A1500;
  140. dsi_set_cmdq(data_array, 1, 1);
  141. data_array[0] = 0xD71B1500;
  142. dsi_set_cmdq(data_array, 1, 1);
  143. data_array[0] = 0x011C1500;
  144. dsi_set_cmdq(data_array, 1, 1);
  145. data_array[0] = 0x791F1500;
  146. dsi_set_cmdq(data_array, 1, 1);
  147. data_array[0] = 0x2D201500;
  148. dsi_set_cmdq(data_array, 1, 1);
  149. data_array[0] = 0x2D211500;
  150. dsi_set_cmdq(data_array, 1, 1);
  151. data_array[0] = 0x0F221500;
  152. dsi_set_cmdq(data_array, 1, 1);
  153. data_array[0] = 0x09371500;
  154. dsi_set_cmdq(data_array, 1, 1);
  155. data_array[0] = 0x04381500;
  156. dsi_set_cmdq(data_array, 1, 1);
  157. data_array[0] = 0x00391500;
  158. dsi_set_cmdq(data_array, 1, 1);
  159. data_array[0] = 0x013A1500;
  160. dsi_set_cmdq(data_array, 1, 1);
  161. data_array[0] = 0x703C1500;
  162. dsi_set_cmdq(data_array, 1, 1);
  163. data_array[0] = 0xFF3D1500;
  164. dsi_set_cmdq(data_array, 1, 1);
  165. data_array[0] = 0xFF3E1500;
  166. dsi_set_cmdq(data_array, 1, 1);
  167. data_array[0] = 0x7F3F1500;
  168. dsi_set_cmdq(data_array, 1, 1);
  169. data_array[0] = 0x06401500;
  170. dsi_set_cmdq(data_array, 1, 1);
  171. data_array[0] = 0xA0411500;
  172. dsi_set_cmdq(data_array, 1, 1);
  173. data_array[0] = 0x1E431500;
  174. dsi_set_cmdq(data_array, 1, 1);
  175. data_array[0] = 0x0D441500;
  176. dsi_set_cmdq(data_array, 1, 1);
  177. data_array[0] = 0x28451500;
  178. dsi_set_cmdq(data_array, 1, 1);
  179. data_array[0] = 0x044B1500;
  180. dsi_set_cmdq(data_array, 1, 1);
  181. data_array[0] = 0x0F551500;
  182. dsi_set_cmdq(data_array, 1, 1);
  183. data_array[0] = 0x01561500;
  184. dsi_set_cmdq(data_array, 1, 1);
  185. data_array[0] = 0xA8571500;
  186. dsi_set_cmdq(data_array, 1, 1);
  187. data_array[0] = 0x0A581500;
  188. dsi_set_cmdq(data_array, 1, 1);
  189. data_array[0] = 0x2A591500;
  190. dsi_set_cmdq(data_array, 1, 1);
  191. data_array[0] = 0x375A1500;
  192. dsi_set_cmdq(data_array, 1, 1);
  193. data_array[0] = 0x195B1500;
  194. dsi_set_cmdq(data_array, 1, 1);
  195. data_array[0] = 0x785D1500;
  196. dsi_set_cmdq(data_array, 1, 1);
  197. data_array[0] = 0x5B5E1500;
  198. dsi_set_cmdq(data_array, 1, 1);
  199. data_array[0] = 0x4A5F1500;
  200. dsi_set_cmdq(data_array, 1, 1);
  201. data_array[0] = 0x3D601500;
  202. dsi_set_cmdq(data_array, 1, 1);
  203. data_array[0] = 0x39611500;
  204. dsi_set_cmdq(data_array, 1, 1);
  205. data_array[0] = 0x29621500;
  206. dsi_set_cmdq(data_array, 1, 1);
  207. data_array[0] = 0x2E631500;
  208. dsi_set_cmdq(data_array, 1, 1);
  209. data_array[0] = 0x17641500;
  210. dsi_set_cmdq(data_array, 1, 1);
  211. data_array[0] = 0x2F651500;
  212. dsi_set_cmdq(data_array, 1, 1);
  213. data_array[0] = 0x2D661500;
  214. dsi_set_cmdq(data_array, 1, 1);
  215. data_array[0] = 0x2C671500;
  216. dsi_set_cmdq(data_array, 1, 1);
  217. data_array[0] = 0x45681500;
  218. dsi_set_cmdq(data_array, 1, 1);
  219. data_array[0] = 0x32691500;
  220. dsi_set_cmdq(data_array, 1, 1);
  221. data_array[0] = 0x406A1500;
  222. dsi_set_cmdq(data_array, 1, 1);
  223. data_array[0] = 0x396B1500;
  224. dsi_set_cmdq(data_array, 1, 1);
  225. data_array[0] = 0x2C6C1500;
  226. dsi_set_cmdq(data_array, 1, 1);
  227. data_array[0] = 0x226D1500;
  228. dsi_set_cmdq(data_array, 1, 1);
  229. data_array[0] = 0x0E6E1500;
  230. dsi_set_cmdq(data_array, 1, 1);
  231. data_array[0] = 0x026F1500;
  232. dsi_set_cmdq(data_array, 1, 1);
  233. data_array[0] = 0x78701500;
  234. dsi_set_cmdq(data_array, 1, 1);
  235. data_array[0] = 0x5B711500;
  236. dsi_set_cmdq(data_array, 1, 1);
  237. data_array[0] = 0x4A721500;
  238. dsi_set_cmdq(data_array, 1, 1);
  239. data_array[0] = 0x3D731500;
  240. dsi_set_cmdq(data_array, 1, 1);
  241. data_array[0] = 0x39741500;
  242. dsi_set_cmdq(data_array, 1, 1);
  243. data_array[0] = 0x29751500;
  244. dsi_set_cmdq(data_array, 1, 1);
  245. data_array[0] = 0x2E761500;
  246. dsi_set_cmdq(data_array, 1, 1);
  247. data_array[0] = 0x17771500;
  248. dsi_set_cmdq(data_array, 1, 1);
  249. data_array[0] = 0x2F781500;
  250. dsi_set_cmdq(data_array, 1, 1);
  251. data_array[0] = 0x2D791500;
  252. dsi_set_cmdq(data_array, 1, 1);
  253. data_array[0] = 0x2C7A1500;
  254. dsi_set_cmdq(data_array, 1, 1);
  255. data_array[0] = 0x457B1500;
  256. dsi_set_cmdq(data_array, 1, 1);
  257. data_array[0] = 0x327C1500;
  258. dsi_set_cmdq(data_array, 1, 1);
  259. data_array[0] = 0x407D1500;
  260. dsi_set_cmdq(data_array, 1, 1);
  261. data_array[0] = 0x397E1500;
  262. dsi_set_cmdq(data_array, 1, 1);
  263. data_array[0] = 0x2C7F1500;
  264. dsi_set_cmdq(data_array, 1, 1);
  265. data_array[0] = 0x22801500;
  266. dsi_set_cmdq(data_array, 1, 1);
  267. data_array[0] = 0x0E811500;
  268. dsi_set_cmdq(data_array, 1, 1);
  269. data_array[0] = 0x02821500;
  270. dsi_set_cmdq(data_array, 1, 1);
  271. data_array[0] = 0x02E01500;
  272. dsi_set_cmdq(data_array, 1, 1);
  273. data_array[0] = 0x40001500;
  274. dsi_set_cmdq(data_array, 1, 1);
  275. data_array[0] = 0x44011500;
  276. dsi_set_cmdq(data_array, 1, 1);
  277. data_array[0] = 0x46021500;
  278. dsi_set_cmdq(data_array, 1, 1);
  279. data_array[0] = 0x48031500;
  280. dsi_set_cmdq(data_array, 1, 1);
  281. data_array[0] = 0x4A041500;
  282. dsi_set_cmdq(data_array, 1, 1);
  283. data_array[0] = 0x4C051500;
  284. dsi_set_cmdq(data_array, 1, 1);
  285. data_array[0] = 0x4E061500;
  286. dsi_set_cmdq(data_array, 1, 1);
  287. data_array[0] = 0x57071500;
  288. dsi_set_cmdq(data_array, 1, 1);
  289. data_array[0] = 0x77081500;
  290. dsi_set_cmdq(data_array, 1, 1);
  291. data_array[0] = 0x55091500;
  292. dsi_set_cmdq(data_array, 1, 1);
  293. data_array[0] = 0x500A1500;
  294. dsi_set_cmdq(data_array, 1, 1);
  295. data_array[0] = 0x550B1500;
  296. dsi_set_cmdq(data_array, 1, 1);
  297. data_array[0] = 0x550C1500;
  298. dsi_set_cmdq(data_array, 1, 1);
  299. data_array[0] = 0x550D1500;
  300. dsi_set_cmdq(data_array, 1, 1);
  301. data_array[0] = 0x550E1500;
  302. dsi_set_cmdq(data_array, 1, 1);
  303. data_array[0] = 0x550F1500;
  304. dsi_set_cmdq(data_array, 1, 1);
  305. data_array[0] = 0x55101500;
  306. dsi_set_cmdq(data_array, 1, 1);
  307. data_array[0] = 0x55111500;
  308. dsi_set_cmdq(data_array, 1, 1);
  309. data_array[0] = 0x55121500;
  310. dsi_set_cmdq(data_array, 1, 1);
  311. data_array[0] = 0x52131500;
  312. dsi_set_cmdq(data_array, 1, 1);
  313. data_array[0] = 0x55141500;
  314. dsi_set_cmdq(data_array, 1, 1);
  315. data_array[0] = 0x55151500;
  316. dsi_set_cmdq(data_array, 1, 1);
  317. data_array[0] = 0x41161500;
  318. dsi_set_cmdq(data_array, 1, 1);
  319. data_array[0] = 0x45171500;
  320. dsi_set_cmdq(data_array, 1, 1);
  321. data_array[0] = 0x47181500;
  322. dsi_set_cmdq(data_array, 1, 1);
  323. data_array[0] = 0x49191500;
  324. dsi_set_cmdq(data_array, 1, 1);
  325. data_array[0] = 0x4B1A1500;
  326. dsi_set_cmdq(data_array, 1, 1);
  327. data_array[0] = 0x4D1B1500;
  328. dsi_set_cmdq(data_array, 1, 1);
  329. data_array[0] = 0x4F1C1500;
  330. dsi_set_cmdq(data_array, 1, 1);
  331. data_array[0] = 0x571D1500;
  332. dsi_set_cmdq(data_array, 1, 1);
  333. data_array[0] = 0x771E1500;
  334. dsi_set_cmdq(data_array, 1, 1);
  335. data_array[0] = 0x551F1500;
  336. dsi_set_cmdq(data_array, 1, 1);
  337. data_array[0] = 0x51201500;
  338. dsi_set_cmdq(data_array, 1, 1);
  339. data_array[0] = 0x55211500;
  340. dsi_set_cmdq(data_array, 1, 1);
  341. data_array[0] = 0x55221500;
  342. dsi_set_cmdq(data_array, 1, 1);
  343. data_array[0] = 0x55231500;
  344. dsi_set_cmdq(data_array, 1, 1);
  345. data_array[0] = 0x55241500;
  346. dsi_set_cmdq(data_array, 1, 1);
  347. data_array[0] = 0x55251500;
  348. dsi_set_cmdq(data_array, 1, 1);
  349. data_array[0] = 0x55261500;
  350. dsi_set_cmdq(data_array, 1, 1);
  351. data_array[0] = 0x55271500;
  352. dsi_set_cmdq(data_array, 1, 1);
  353. data_array[0] = 0x55281500;
  354. dsi_set_cmdq(data_array, 1, 1);
  355. data_array[0] = 0x53291500;
  356. dsi_set_cmdq(data_array, 1, 1);
  357. data_array[0] = 0x552A1500;
  358. dsi_set_cmdq(data_array, 1, 1);
  359. data_array[0] = 0x552B1500;
  360. dsi_set_cmdq(data_array, 1, 1);
  361. data_array[0] = 0x112C1500;
  362. dsi_set_cmdq(data_array, 1, 1);
  363. data_array[0] = 0x0F2D1500;
  364. dsi_set_cmdq(data_array, 1, 1);
  365. data_array[0] = 0x0D2E1500;
  366. dsi_set_cmdq(data_array, 1, 1);
  367. data_array[0] = 0x0B2F1500;
  368. dsi_set_cmdq(data_array, 1, 1);
  369. data_array[0] = 0x09301500;
  370. dsi_set_cmdq(data_array, 1, 1);
  371. data_array[0] = 0x07311500;
  372. dsi_set_cmdq(data_array, 1, 1);
  373. data_array[0] = 0x05321500;
  374. dsi_set_cmdq(data_array, 1, 1);
  375. data_array[0] = 0x17331500;
  376. dsi_set_cmdq(data_array, 1, 1);
  377. data_array[0] = 0x17341500;
  378. dsi_set_cmdq(data_array, 1, 1);
  379. data_array[0] = 0x15351500;
  380. dsi_set_cmdq(data_array, 1, 1);
  381. data_array[0] = 0x01361500;
  382. dsi_set_cmdq(data_array, 1, 1);
  383. data_array[0] = 0x15371500;
  384. dsi_set_cmdq(data_array, 1, 1);
  385. data_array[0] = 0x15381500;
  386. dsi_set_cmdq(data_array, 1, 1);
  387. data_array[0] = 0x15391500;
  388. dsi_set_cmdq(data_array, 1, 1);
  389. data_array[0] = 0x153A1500;
  390. dsi_set_cmdq(data_array, 1, 1);
  391. data_array[0] = 0x153B1500;
  392. dsi_set_cmdq(data_array, 1, 1);
  393. data_array[0] = 0x153C1500;
  394. dsi_set_cmdq(data_array, 1, 1);
  395. data_array[0] = 0x153D1500;
  396. dsi_set_cmdq(data_array, 1, 1);
  397. data_array[0] = 0x153E1500;
  398. dsi_set_cmdq(data_array, 1, 1);
  399. data_array[0] = 0x133F1500;
  400. dsi_set_cmdq(data_array, 1, 1);
  401. data_array[0] = 0x15401500;
  402. dsi_set_cmdq(data_array, 1, 1);
  403. data_array[0] = 0x15411500;
  404. dsi_set_cmdq(data_array, 1, 1);
  405. data_array[0] = 0x10421500;
  406. dsi_set_cmdq(data_array, 1, 1);
  407. data_array[0] = 0x0E431500;
  408. dsi_set_cmdq(data_array, 1, 1);
  409. data_array[0] = 0x0C441500;
  410. dsi_set_cmdq(data_array, 1, 1);
  411. data_array[0] = 0x0A451500;
  412. dsi_set_cmdq(data_array, 1, 1);
  413. data_array[0] = 0x08461500;
  414. dsi_set_cmdq(data_array, 1, 1);
  415. data_array[0] = 0x06471500;
  416. dsi_set_cmdq(data_array, 1, 1);
  417. data_array[0] = 0x04481500;
  418. dsi_set_cmdq(data_array, 1, 1);
  419. data_array[0] = 0x17491500;
  420. dsi_set_cmdq(data_array, 1, 1);
  421. data_array[0] = 0x174A1500;
  422. dsi_set_cmdq(data_array, 1, 1);
  423. data_array[0] = 0x154B1500;
  424. dsi_set_cmdq(data_array, 1, 1);
  425. data_array[0] = 0x004C1500;
  426. dsi_set_cmdq(data_array, 1, 1);
  427. data_array[0] = 0x154D1500;
  428. dsi_set_cmdq(data_array, 1, 1);
  429. data_array[0] = 0x154E1500;
  430. dsi_set_cmdq(data_array, 1, 1);
  431. data_array[0] = 0x154F1500;
  432. dsi_set_cmdq(data_array, 1, 1);
  433. data_array[0] = 0x15501500;
  434. dsi_set_cmdq(data_array, 1, 1);
  435. data_array[0] = 0x15511500;
  436. dsi_set_cmdq(data_array, 1, 1);
  437. data_array[0] = 0x15521500;
  438. dsi_set_cmdq(data_array, 1, 1);
  439. data_array[0] = 0x15531500;
  440. dsi_set_cmdq(data_array, 1, 1);
  441. data_array[0] = 0x15541500;
  442. dsi_set_cmdq(data_array, 1, 1);
  443. data_array[0] = 0x12551500;
  444. dsi_set_cmdq(data_array, 1, 1);
  445. data_array[0] = 0x15561500;
  446. dsi_set_cmdq(data_array, 1, 1);
  447. data_array[0] = 0x15571500;
  448. dsi_set_cmdq(data_array, 1, 1);
  449. data_array[0] = 0x40581500;
  450. dsi_set_cmdq(data_array, 1, 1);
  451. data_array[0] = 0x00591500;
  452. dsi_set_cmdq(data_array, 1, 1);
  453. data_array[0] = 0x005A1500;
  454. dsi_set_cmdq(data_array, 1, 1);
  455. data_array[0] = 0x105B1500;
  456. dsi_set_cmdq(data_array, 1, 1);
  457. data_array[0] = 0x065C1500;
  458. dsi_set_cmdq(data_array, 1, 1);
  459. data_array[0] = 0x405D1500;
  460. dsi_set_cmdq(data_array, 1, 1);
  461. data_array[0] = 0x005E1500;
  462. dsi_set_cmdq(data_array, 1, 1);
  463. data_array[0] = 0x005F1500;
  464. dsi_set_cmdq(data_array, 1, 1);
  465. data_array[0] = 0x40601500;
  466. dsi_set_cmdq(data_array, 1, 1);
  467. data_array[0] = 0x03611500;
  468. dsi_set_cmdq(data_array, 1, 1);
  469. data_array[0] = 0x04621500;
  470. dsi_set_cmdq(data_array, 1, 1);
  471. data_array[0] = 0x60631500;
  472. dsi_set_cmdq(data_array, 1, 1);
  473. data_array[0] = 0x60641500;
  474. dsi_set_cmdq(data_array, 1, 1);
  475. data_array[0] = 0x75651500;
  476. dsi_set_cmdq(data_array, 1, 1);
  477. data_array[0] = 0x0C661500;
  478. dsi_set_cmdq(data_array, 1, 1);
  479. data_array[0] = 0xB4671500;
  480. dsi_set_cmdq(data_array, 1, 1);
  481. data_array[0] = 0x08681500;
  482. dsi_set_cmdq(data_array, 1, 1);
  483. data_array[0] = 0x60691500;
  484. dsi_set_cmdq(data_array, 1, 1);
  485. data_array[0] = 0x606A1500;
  486. dsi_set_cmdq(data_array, 1, 1);
  487. data_array[0] = 0x106B1500;
  488. dsi_set_cmdq(data_array, 1, 1);
  489. data_array[0] = 0x006C1500;
  490. dsi_set_cmdq(data_array, 1, 1);
  491. data_array[0] = 0x046D1500;
  492. dsi_set_cmdq(data_array, 1, 1);
  493. data_array[0] = 0x006E1500;
  494. dsi_set_cmdq(data_array, 1, 1);
  495. data_array[0] = 0x886F1500;
  496. dsi_set_cmdq(data_array, 1, 1);
  497. data_array[0] = 0x00701500;
  498. dsi_set_cmdq(data_array, 1, 1);
  499. data_array[0] = 0x00711500;
  500. dsi_set_cmdq(data_array, 1, 1);
  501. data_array[0] = 0x06721500;
  502. dsi_set_cmdq(data_array, 1, 1);
  503. data_array[0] = 0x7B731500;
  504. dsi_set_cmdq(data_array, 1, 1);
  505. data_array[0] = 0x00741500;
  506. dsi_set_cmdq(data_array, 1, 1);
  507. data_array[0] = 0xBC751500;
  508. dsi_set_cmdq(data_array, 1, 1);
  509. data_array[0] = 0x00761500;
  510. dsi_set_cmdq(data_array, 1, 1);
  511. data_array[0] = 0x0D771500;
  512. dsi_set_cmdq(data_array, 1, 1);
  513. data_array[0] = 0x2C781500;
  514. dsi_set_cmdq(data_array, 1, 1);
  515. data_array[0] = 0x00791500;
  516. dsi_set_cmdq(data_array, 1, 1);
  517. data_array[0] = 0x007A1500;
  518. dsi_set_cmdq(data_array, 1, 1);
  519. data_array[0] = 0x007B1500;
  520. dsi_set_cmdq(data_array, 1, 1);
  521. data_array[0] = 0x007C1500;
  522. dsi_set_cmdq(data_array, 1, 1);
  523. data_array[0] = 0x037D1500;
  524. dsi_set_cmdq(data_array, 1, 1);
  525. data_array[0] = 0x7B7E1500;
  526. dsi_set_cmdq(data_array, 1, 1);
  527. data_array[0] = 0x04E01500;
  528. dsi_set_cmdq(data_array, 1, 1);
  529. data_array[0] = 0x003F1500;
  530. dsi_set_cmdq(data_array, 1, 1);
  531. data_array[0] = 0xFF411500;
  532. dsi_set_cmdq(data_array, 1, 1);
  533. data_array[0] = 0x032D1500;
  534. dsi_set_cmdq(data_array, 1, 1);
  535. data_array[0] = 0x10091500;
  536. dsi_set_cmdq(data_array, 1, 1);
  537. data_array[0] = 0x480E1500;
  538. dsi_set_cmdq(data_array, 1, 1);
  539. data_array[0] = 0x48271500;
  540. dsi_set_cmdq(data_array, 1, 1);
  541. data_array[0] = 0x2B2B1500;
  542. dsi_set_cmdq(data_array, 1, 1);
  543. data_array[0] = 0x442E1500;
  544. dsi_set_cmdq(data_array, 1, 1);
  545. data_array[0] = 0x05E01500;
  546. dsi_set_cmdq(data_array, 1, 1);
  547. data_array[0] = 0x72121500;
  548. dsi_set_cmdq(data_array, 1, 1);
  549. /* Page3 */
  550. data_array[0] = 0x03E01500;
  551. dsi_set_cmdq(data_array, 1, 1);
  552. data_array[0] = 0x059B1500;
  553. dsi_set_cmdq(data_array, 1, 1);
  554. data_array[0] = 0x20AF1500;
  555. dsi_set_cmdq(data_array, 1, 1);
  556. /*Page0 enable CABC*/
  557. data_array[0] = 0x00E01500;
  558. dsi_set_cmdq(data_array, 1, 1);
  559. data_array[0] = 0x2C531500;
  560. dsi_set_cmdq(data_array, 1, 1);
  561. data_array[0] = 0x00E01500;
  562. dsi_set_cmdq(data_array, 1, 1);
  563. data_array[0] = 0x02E61500;
  564. dsi_set_cmdq(data_array, 1, 1);
  565. data_array[0] = 0x02E71500;
  566. dsi_set_cmdq(data_array, 1, 1);
  567. data_array[0] = 0x00111500;
  568. dsi_set_cmdq(data_array, 1, 1);
  569. MDELAY(120);
  570. data_array[0] = 0x00291500;
  571. dsi_set_cmdq(data_array, 1, 1);
  572. MDELAY(5);
  573. data_array[0] = 0x00351500;
  574. dsi_set_cmdq(data_array, 1, 1);
  575. data_array[0] = 0x04EC1500;
  576. dsi_set_cmdq(data_array, 1, 1);
  577. data_array[0] = 0x03E01500;
  578. dsi_set_cmdq(data_array, 1, 1);
  579. data_array[0] = 0x81A91500;
  580. dsi_set_cmdq(data_array, 1, 1);
  581. data_array[0] = 0x4FAC1500;
  582. dsi_set_cmdq(data_array, 1, 1);
  583. data_array[0] = 0x33A01500;
  584. dsi_set_cmdq(data_array, 1, 1);
  585. data_array[0] = 0x00E01500;
  586. dsi_set_cmdq(data_array, 1, 1);
  587. }
  588. /* --------------------------------------------------------------- */
  589. /* LCM Driver Implementations */
  590. /* --------------------------------------------------------------- */
  591. static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
  592. {
  593. memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
  594. }
  595. static void lcm_get_fiti_kd_params(LCM_PARAMS *params)
  596. {
  597. memset(params, 0, sizeof(LCM_PARAMS));
  598. params->type = LCM_TYPE_DSI;
  599. params->width = FRAME_WIDTH;
  600. params->height = FRAME_HEIGHT;
  601. params->dsi.mode = SYNC_EVENT_VDO_MODE;
  602. params->dsi.LANE_NUM = LCM_FOUR_LANE;
  603. params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
  604. params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
  605. params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
  606. params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
  607. params->dsi.packet_size = 256;
  608. params->dsi.intermediat_buffer_num = 0;
  609. params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888;
  610. params->dsi.vertical_sync_active = 4;
  611. params->dsi.vertical_backporch = 10;
  612. params->dsi.vertical_frontporch = 30;
  613. params->dsi.vertical_active_line = FRAME_HEIGHT;
  614. params->dsi.horizontal_sync_active = 20;
  615. params->dsi.horizontal_backporch = 43;
  616. params->dsi.horizontal_frontporch = 43;
  617. params->dsi.horizontal_active_pixel = FRAME_WIDTH;
  618. params->dsi.PLL_CLOCK = 234;
  619. params->dsi.clk_lp_per_line_enable = 1;
  620. params->dsi.ssc_disable = 1;
  621. params->dsi.cont_clock= 0;
  622. params->dsi.DA_HS_EXIT = 1;
  623. params->dsi.CLK_ZERO = 16;
  624. params->dsi.HS_ZERO = 9;
  625. params->dsi.HS_TRAIL = 5;
  626. params->dsi.CLK_TRAIL = 5;
  627. params->dsi.CLK_HS_POST = 8;
  628. params->dsi.CLK_HS_EXIT = 6;
  629. params->dsi.TA_GO = 8;
  630. params->dsi.TA_GET = 10;
  631. params->physical_width = 108;
  632. params->physical_height = 172;
  633. }
  634. static void lcm_init_power(void)
  635. {
  636. printf("[LK/LCM] %s enter\n", __func__);
  637. pmic_vsim1_enable(true, 1800);
  638. lcm_set_gpio_output(GPIO_LCD_PWR_ENP, GPIO_OUT_ONE);
  639. MDELAY(1);
  640. lcm_set_gpio_output(GPIO_LCD_PWR_ENN, GPIO_OUT_ONE);
  641. MDELAY(10);
  642. lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
  643. MDELAY(10);
  644. lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ZERO);
  645. MDELAY(2);
  646. lcm_set_gpio_output(GPIO_LCD_RST, GPIO_OUT_ONE);
  647. MDELAY(5);
  648. }
  649. static void lcm_init(void)
  650. {
  651. printf("[LK/LCM]xxxxxxx %s enter\n", __func__);
  652. init_karnak_fiti_kd_lcm(); /*FITI KD panel*/
  653. }
  654. LCM_DRIVER jd9366_wxga_dsi_vdo_fiti_kd_lcm_drv = {
  655. .name = "jd9366_wxga_dsi_vdo_fiti_kd",
  656. .set_util_funcs = lcm_set_util_funcs,
  657. .get_params = lcm_get_fiti_kd_params,
  658. .init_power = lcm_init_power,
  659. .init = lcm_init,
  660. };