mipi_NT35510.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. /* Copyright (c) 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 "msm_fb.h"
  14. #include "mipi_dsi.h"
  15. #include "mipi_NT35510.h"
  16. static struct msm_panel_common_pdata *mipi_nt35510_pdata;
  17. static struct dsi_buf nt35510_tx_buf;
  18. static struct dsi_buf nt35510_rx_buf;
  19. static int mipi_nt35510_bl_ctrl;
  20. #define NT35510_SLEEP_OFF_DELAY 150
  21. #define NT35510_DISPLAY_ON_DELAY 150
  22. /* common setting */
  23. static char exit_sleep[2] = {0x11, 0x00};
  24. static char display_on[2] = {0x29, 0x00};
  25. static char display_off[2] = {0x28, 0x00};
  26. static char enter_sleep[2] = {0x10, 0x00};
  27. static char write_ram[2] = {0x2c, 0x00}; /* write ram */
  28. static struct dsi_cmd_desc nt35510_display_off_cmds[] = {
  29. {DTYPE_DCS_WRITE, 1, 0, 0, 50, sizeof(display_off), display_off},
  30. {DTYPE_DCS_WRITE, 1, 0, 0, 50, sizeof(enter_sleep), enter_sleep}
  31. };
  32. static char cmd0[6] = {
  33. 0xF0, 0x55, 0xAA, 0x52,
  34. 0x08, 0x01,
  35. };
  36. static char cmd1[4] = {
  37. 0xBC, 0x00, 0xA0, 0x00,
  38. };
  39. static char cmd2[4] = {
  40. 0xBD, 0x00, 0xA0, 0x00,
  41. };
  42. static char cmd3[3] = {
  43. 0xBE, 0x00, 0x79,
  44. };
  45. static char cmd4[53] = {
  46. 0xD1, 0x00, 0x00, 0x00,
  47. 0x14, 0x00, 0x32, 0x00,
  48. 0x4F, 0x00, 0x65, 0x00,
  49. 0x8B, 0x00, 0xA8, 0x00,
  50. 0xD5, 0x00, 0xF7, 0x01,
  51. 0x2B, 0x01, 0x54, 0x01,
  52. 0x8E, 0x01, 0xBB, 0x01,
  53. 0xBC, 0x01, 0xE3, 0x02,
  54. 0x08, 0x02, 0x1C, 0x02,
  55. 0x39, 0x02, 0x4F, 0x02,
  56. 0x76, 0x02, 0xA3, 0x02,
  57. 0xE3, 0x03, 0x12, 0x03,
  58. 0x4C, 0x03, 0x66, 0x03,
  59. 0x9A,
  60. };
  61. static char cmd5[53] = {
  62. 0xD2, 0x00, 0x00, 0x00,
  63. 0x14, 0x00, 0x32, 0x00,
  64. 0x4F, 0x00, 0x65, 0x00,
  65. 0x8B, 0x00, 0xA8, 0x00,
  66. 0xD5, 0x00, 0xF7, 0x01,
  67. 0x2B, 0x01, 0x54, 0x01,
  68. 0x8E, 0x01, 0xBB, 0x01,
  69. 0xBC, 0x01, 0xE3, 0x02,
  70. 0x08, 0x02, 0x1C, 0x02,
  71. 0x39, 0x02, 0x4F, 0x02,
  72. 0x76, 0x02, 0xA3, 0x02,
  73. 0xE3, 0x03, 0x12, 0x03,
  74. 0x4C, 0x03, 0x66, 0x03,
  75. 0x9A,
  76. };
  77. static char cmd6[53] = {
  78. 0xD3, 0x00, 0x00, 0x00,
  79. 0x14, 0x00, 0x32, 0x00,
  80. 0x4F, 0x00, 0x65, 0x00,
  81. 0x8B, 0x00, 0xA8, 0x00,
  82. 0xD5, 0x00, 0xF7, 0x01,
  83. 0x2B, 0x01, 0x54, 0x01,
  84. 0x8E, 0x01, 0xBB, 0x01,
  85. 0xBC, 0x01, 0xE3, 0x02,
  86. 0x08, 0x02, 0x1C, 0x02,
  87. 0x39, 0x02, 0x4F, 0x02,
  88. 0x76, 0x02, 0xA3, 0x02,
  89. 0xE3, 0x03, 0x12, 0x03,
  90. 0x4C, 0x03, 0x66, 0x03,
  91. 0x9A,
  92. };
  93. static char cmd7[53] = {
  94. 0xD4, 0x00, 0x00, 0x00,
  95. 0x14, 0x00, 0x32, 0x00,
  96. 0x4F, 0x00, 0x65, 0x00,
  97. 0x8B, 0x00, 0xA8, 0x00,
  98. 0xD5, 0x00, 0xF7, 0x01,
  99. 0x2B, 0x01, 0x54, 0x01,
  100. 0x8E, 0x01, 0xBB, 0x01,
  101. 0xBC, 0x01, 0xE3, 0x02,
  102. 0x08, 0x02, 0x1C, 0x02,
  103. 0x39, 0x02, 0x4F, 0x02,
  104. 0x76, 0x02, 0xA3, 0x02,
  105. 0xE3, 0x03, 0x12, 0x03,
  106. 0x4C, 0x03, 0x66, 0x03,
  107. 0x9A,
  108. };
  109. static char cmd8[53] = {
  110. 0xD5, 0x00, 0x00, 0x00,
  111. 0x14, 0x00, 0x32, 0x00,
  112. 0x4F, 0x00, 0x65, 0x00,
  113. 0x8B, 0x00, 0xA8, 0x00,
  114. 0xD5, 0x00, 0xF7, 0x01,
  115. 0x2B, 0x01, 0x54, 0x01,
  116. 0x8E, 0x01, 0xBB, 0x01,
  117. 0xBC, 0x01, 0xE3, 0x02,
  118. 0x08, 0x02, 0x1C, 0x02,
  119. 0x39, 0x02, 0x4F, 0x02,
  120. 0x76, 0x02, 0xA3, 0x02,
  121. 0xE3, 0x03, 0x12, 0x03,
  122. 0x4C, 0x03, 0x66, 0x03,
  123. 0x9A,
  124. };
  125. static char cmd9[53] = {
  126. 0xD6, 0x00, 0x00, 0x00,
  127. 0x14, 0x00, 0x32, 0x00,
  128. 0x4F, 0x00, 0x65, 0x00,
  129. 0x8B, 0x00, 0xA8, 0x00,
  130. 0xD5, 0x00, 0xF7, 0x01,
  131. 0x2B, 0x01, 0x54, 0x01,
  132. 0x8E, 0x01, 0xBB, 0x01,
  133. 0xBC, 0x01, 0xE3, 0x02,
  134. 0x08, 0x02, 0x1C, 0x02,
  135. 0x39, 0x02, 0x4F, 0x02,
  136. 0x76, 0x02, 0xA3, 0x02,
  137. 0xE3, 0x03, 0x12, 0x03,
  138. 0x4C, 0x03, 0x66, 0x03,
  139. 0x9A,
  140. };
  141. static char cmd10[4] = {
  142. 0xB0, 0x0A, 0x0A, 0x0A,
  143. };
  144. static char cmd11[4] = {
  145. 0xB1, 0x0A, 0x0A, 0x0A,
  146. };
  147. static char cmd12[4] = {
  148. 0xBA, 0x24, 0x24, 0x24,
  149. };
  150. static char cmd13[4] = {
  151. 0xB9, 0x24, 0x24, 0x24,
  152. };
  153. static char cmd14[4] = {
  154. 0xB8, 0x24, 0x24, 0x24,
  155. };
  156. static char cmd15[6] = {
  157. 0xF0, 0x55, 0xAA, 0x52,
  158. 0x08, 0x00,
  159. };
  160. static char cmd16[2] = {
  161. 0xB3, 0x00,
  162. };
  163. static char cmd17[2] = {
  164. 0xB4, 0x10,
  165. };
  166. static char cmd18[2] = {
  167. 0xB6, 0x02,
  168. };
  169. static char cmd19[3] = {
  170. 0xB1, 0xEC, 0x00,
  171. };
  172. static char cmd19_rotate[3] = {
  173. 0xB1, 0xEC, 0x06,
  174. };
  175. static char cmd20[4] = {
  176. 0xBC, 0x05, 0x05, 0x05,
  177. };
  178. static char cmd21[3] = {
  179. 0xB7, 0x20, 0x20,
  180. };
  181. static char cmd22[5] = {
  182. 0xB8, 0x01, 0x03, 0x03,
  183. 0x03,
  184. };
  185. static char cmd23[19] = {
  186. 0xC8, 0x01, 0x00, 0x78,
  187. 0x50, 0x78, 0x50, 0x78,
  188. 0x50, 0x78, 0x50, 0xC8,
  189. 0x3C, 0x3C, 0xC8, 0xC8,
  190. 0x3C, 0x3C, 0xC8,
  191. };
  192. static char cmd24[6] = {
  193. 0xBD, 0x01, 0x84, 0x07,
  194. 0x31, 0x00,
  195. };
  196. static char cmd25[6] = {
  197. 0xBE, 0x01, 0x84, 0x07,
  198. 0x31, 0x00,
  199. };
  200. static char cmd26[6] = {
  201. 0xBF, 0x01, 0x84, 0x07,
  202. 0x31, 0x00,
  203. };
  204. static char cmd27[2] = {
  205. 0x35, 0x00,
  206. };
  207. static char config_MADCTL[2] = {0x36, 0x00};
  208. static struct dsi_cmd_desc nt35510_cmd_display_on_cmds[] = {
  209. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd0), cmd0},
  210. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd1), cmd1},
  211. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd2), cmd2},
  212. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd3), cmd3},
  213. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd4), cmd4},
  214. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd5), cmd5},
  215. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd6), cmd6},
  216. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd7), cmd7},
  217. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd8), cmd8},
  218. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd9), cmd9},
  219. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd10), cmd10},
  220. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd11), cmd11},
  221. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd12), cmd12},
  222. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd13), cmd13},
  223. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd14), cmd14},
  224. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd15), cmd15},
  225. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd16), cmd16},
  226. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd17), cmd17},
  227. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd18), cmd18},
  228. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd19), cmd19},
  229. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd20), cmd20},
  230. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd21), cmd21},
  231. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd22), cmd22},
  232. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd23), cmd23},
  233. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd24), cmd24},
  234. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd25), cmd25},
  235. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd26), cmd26},
  236. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(cmd27), cmd27},
  237. {DTYPE_DCS_WRITE, 1, 0, 0, 0, sizeof(exit_sleep), exit_sleep},
  238. {DTYPE_DCS_WRITE, 1, 0, 0, 0, sizeof(display_on), display_on},
  239. {DTYPE_DCS_WRITE1, 1, 0, 0, 0,
  240. sizeof(config_MADCTL), config_MADCTL},
  241. {DTYPE_DCS_WRITE, 1, 0, 0, 0, sizeof(write_ram), write_ram},
  242. };
  243. static struct dsi_cmd_desc nt35510_cmd_display_on_cmds_rotate[] = {
  244. {DTYPE_DCS_LWRITE, 1, 0, 0, 0,
  245. sizeof(cmd19_rotate), cmd19_rotate},
  246. };
  247. static char video0[6] = {
  248. 0xF0, 0x55, 0xAA, 0x52,
  249. 0x08, 0x01,
  250. };
  251. static char video1[4] = {
  252. 0xBC, 0x00, 0xA0, 0x00,
  253. };
  254. static char video2[4] = {
  255. 0xBD, 0x00, 0xA0, 0x00,
  256. };
  257. static char video3[3] = {
  258. 0xBE, 0x00, 0x79,
  259. };
  260. static char video4[53] = {
  261. 0xD1, 0x00, 0x00, 0x00,
  262. 0x14, 0x00, 0x32, 0x00,
  263. 0x4F, 0x00, 0x65, 0x00,
  264. 0x8B, 0x00, 0xA8, 0x00,
  265. 0xD5, 0x00, 0xF7, 0x01,
  266. 0x2B, 0x01, 0x54, 0x01,
  267. 0x8E, 0x01, 0xBB, 0x01,
  268. 0xBC, 0x01, 0xE3, 0x02,
  269. 0x08, 0x02, 0x1C, 0x02,
  270. 0x39, 0x02, 0x4F, 0x02,
  271. 0x76, 0x02, 0xA3, 0x02,
  272. 0xE3, 0x03, 0x12, 0x03,
  273. 0x4C, 0x03, 0x66, 0x03,
  274. 0x9A,
  275. };
  276. static char video5[53] = {
  277. 0xD2, 0x00, 0x00, 0x00,
  278. 0x14, 0x00, 0x32, 0x00,
  279. 0x4F, 0x00, 0x65, 0x00,
  280. 0x8B, 0x00, 0xA8, 0x00,
  281. 0xD5, 0x00, 0xF7, 0x01,
  282. 0x2B, 0x01, 0x54, 0x01,
  283. 0x8E, 0x01, 0xBB, 0x01,
  284. 0xBC, 0x01, 0xE3, 0x02,
  285. 0x08, 0x02, 0x1C, 0x02,
  286. 0x39, 0x02, 0x4F, 0x02,
  287. 0x76, 0x02, 0xA3, 0x02,
  288. 0xE3, 0x03, 0x12, 0x03,
  289. 0x4C, 0x03, 0x66, 0x03,
  290. 0x9A,
  291. };
  292. static char video6[53] = {
  293. 0xD3, 0x00, 0x00, 0x00,
  294. 0x14, 0x00, 0x32, 0x00,
  295. 0x4F, 0x00, 0x65, 0x00,
  296. 0x8B, 0x00, 0xA8, 0x00,
  297. 0xD5, 0x00, 0xF7, 0x01,
  298. 0x2B, 0x01, 0x54, 0x01,
  299. 0x8E, 0x01, 0xBB, 0x01,
  300. 0xBC, 0x01, 0xE3, 0x02,
  301. 0x08, 0x02, 0x1C, 0x02,
  302. 0x39, 0x02, 0x4F, 0x02,
  303. 0x76, 0x02, 0xA3, 0x02,
  304. 0xE3, 0x03, 0x12, 0x03,
  305. 0x4C, 0x03, 0x66, 0x03,
  306. 0x9A,
  307. };
  308. static char video7[53] = {
  309. 0xD4, 0x00, 0x00, 0x00,
  310. 0x14, 0x00, 0x32, 0x00,
  311. 0x4F, 0x00, 0x65, 0x00,
  312. 0x8B, 0x00, 0xA8, 0x00,
  313. 0xD5, 0x00, 0xF7, 0x01,
  314. 0x2B, 0x01, 0x54, 0x01,
  315. 0x8E, 0x01, 0xBB, 0x01,
  316. 0xBC, 0x01, 0xE3, 0x02,
  317. 0x08, 0x02, 0x1C, 0x02,
  318. 0x39, 0x02, 0x4F, 0x02,
  319. 0x76, 0x02, 0xA3, 0x02,
  320. 0xE3, 0x03, 0x12, 0x03,
  321. 0x4C, 0x03, 0x66, 0x03,
  322. 0x9A,
  323. };
  324. static char video8[53] = {
  325. 0xD5, 0x00, 0x00, 0x00,
  326. 0x14, 0x00, 0x32, 0x00,
  327. 0x4F, 0x00, 0x65, 0x00,
  328. 0x8B, 0x00, 0xA8, 0x00,
  329. 0xD5, 0x00, 0xF7, 0x01,
  330. 0x2B, 0x01, 0x54, 0x01,
  331. 0x8E, 0x01, 0xBB, 0x01,
  332. 0xBC, 0x01, 0xE3, 0x02,
  333. 0x08, 0x02, 0x1C, 0x02,
  334. 0x39, 0x02, 0x4F, 0x02,
  335. 0x76, 0x02, 0xA3, 0x02,
  336. 0xE3, 0x03, 0x12, 0x03,
  337. 0x4C, 0x03, 0x66, 0x03,
  338. 0x9A,
  339. };
  340. static char video9[53] = {
  341. 0xD6, 0x00, 0x00, 0x00,
  342. 0x14, 0x00, 0x32, 0x00,
  343. 0x4F, 0x00, 0x65, 0x00,
  344. 0x8B, 0x00, 0xA8, 0x00,
  345. 0xD5, 0x00, 0xF7, 0x01,
  346. 0x2B, 0x01, 0x54, 0x01,
  347. 0x8E, 0x01, 0xBB, 0x01,
  348. 0xBC, 0x01, 0xE3, 0x02,
  349. 0x08, 0x02, 0x1C, 0x02,
  350. 0x39, 0x02, 0x4F, 0x02,
  351. 0x76, 0x02, 0xA3, 0x02,
  352. 0xE3, 0x03, 0x12, 0x03,
  353. 0x4C, 0x03, 0x66, 0x03,
  354. 0x9A,
  355. };
  356. static char video10[4] = {
  357. 0xB0, 0x0A, 0x0A, 0x0A,
  358. };
  359. static char video11[4] = {
  360. 0xB1, 0x0A, 0x0A, 0x0A,
  361. };
  362. static char video12[4] = {
  363. 0xBA, 0x24, 0x24, 0x24,
  364. };
  365. static char video13[4] = {
  366. 0xB9, 0x24, 0x24, 0x24,
  367. };
  368. static char video14[4] = {
  369. 0xB8, 0x24, 0x24, 0x24,
  370. };
  371. static char video15[6] = {
  372. 0xF0, 0x55, 0xAA, 0x52,
  373. 0x08, 0x00,
  374. };
  375. static char video16[2] = {
  376. 0xB3, 0x00,
  377. };
  378. static char video17[2] = {
  379. 0xB4, 0x10,
  380. };
  381. static char video18[2] = {
  382. 0xB6, 0x02,
  383. };
  384. static char video19[3] = {
  385. 0xB1, 0xFC, 0x00,
  386. };
  387. static char video20[4] = {
  388. 0xBC, 0x05, 0x05, 0x05,
  389. };
  390. static char video21[3] = {
  391. 0xB7, 0x20, 0x20,
  392. };
  393. static char video22[5] = {
  394. 0xB8, 0x01, 0x03, 0x03,
  395. 0x03,
  396. };
  397. static char video23[19] = {
  398. 0xC8, 0x01, 0x00, 0x78,
  399. 0x50, 0x78, 0x50, 0x78,
  400. 0x50, 0x78, 0x50, 0xC8,
  401. 0x3C, 0x3C, 0xC8, 0xC8,
  402. 0x3C, 0x3C, 0xC8,
  403. };
  404. static char video24[6] = {
  405. 0xBD, 0x01, 0x84, 0x07,
  406. 0x31, 0x00,
  407. };
  408. static char video25[6] = {
  409. 0xBE, 0x01, 0x84, 0x07,
  410. 0x31, 0x00,
  411. };
  412. static char video26[6] = {
  413. 0xBF, 0x01, 0x84, 0x07,
  414. 0x31, 0x00,
  415. };
  416. static char video27[2] = {
  417. 0x35, 0x00,
  418. };
  419. static char config_video_MADCTL[2] = {0x36, 0xC0};
  420. static struct dsi_cmd_desc nt35510_video_display_on_cmds[] = {
  421. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video0), video0},
  422. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video1), video1},
  423. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video2), video2},
  424. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video3), video3},
  425. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video4), video4},
  426. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video5), video5},
  427. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video6), video6},
  428. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video7), video7},
  429. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video8), video8},
  430. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video9), video9},
  431. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video10), video10},
  432. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video11), video11},
  433. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video12), video12},
  434. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video13), video13},
  435. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video14), video14},
  436. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video15), video15},
  437. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video16), video16},
  438. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video17), video17},
  439. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video18), video18},
  440. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video19), video19},
  441. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video20), video20},
  442. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video21), video21},
  443. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video22), video22},
  444. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video23), video23},
  445. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video24), video24},
  446. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video25), video25},
  447. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video26), video26},
  448. {DTYPE_GEN_LWRITE, 1, 0, 0, 0, sizeof(video27), video27},
  449. {DTYPE_DCS_WRITE, 1, 0, 0, NT35510_SLEEP_OFF_DELAY, sizeof(exit_sleep),
  450. exit_sleep},
  451. {DTYPE_DCS_WRITE, 1, 0, 0, NT35510_DISPLAY_ON_DELAY, sizeof(display_on),
  452. display_on},
  453. };
  454. static struct dsi_cmd_desc nt35510_video_display_on_cmds_rotate[] = {
  455. {DTYPE_DCS_WRITE1, 1, 0, 0, 0,
  456. sizeof(config_video_MADCTL), config_video_MADCTL},
  457. };
  458. static int mipi_nt35510_lcd_on(struct platform_device *pdev)
  459. {
  460. struct msm_fb_data_type *mfd;
  461. struct mipi_panel_info *mipi;
  462. static int rotate;
  463. struct dcs_cmd_req cmdreq;
  464. mfd = platform_get_drvdata(pdev);
  465. if (!mfd)
  466. return -ENODEV;
  467. if (mfd->key != MFD_KEY)
  468. return -EINVAL;
  469. mipi = &mfd->panel_info.mipi;
  470. if (!mfd->cont_splash_done) {
  471. mfd->cont_splash_done = 1;
  472. return 0;
  473. }
  474. if (mipi_nt35510_pdata && mipi_nt35510_pdata->rotate_panel)
  475. rotate = mipi_nt35510_pdata->rotate_panel();
  476. memset(&cmdreq, 0, sizeof(cmdreq));
  477. if (mipi->mode == DSI_VIDEO_MODE) {
  478. cmdreq.cmds = nt35510_video_display_on_cmds;
  479. cmdreq.cmds_cnt = ARRAY_SIZE(nt35510_video_display_on_cmds);
  480. cmdreq.flags = CMD_REQ_COMMIT;
  481. cmdreq.rlen = 0;
  482. cmdreq.cb = NULL;
  483. mipi_dsi_cmdlist_put(&cmdreq);
  484. if (rotate) {
  485. cmdreq.cmds = nt35510_video_display_on_cmds_rotate;
  486. cmdreq.cmds_cnt =
  487. ARRAY_SIZE(nt35510_video_display_on_cmds_rotate);
  488. cmdreq.flags = CMD_REQ_COMMIT;
  489. cmdreq.rlen = 0;
  490. cmdreq.cb = NULL;
  491. mipi_dsi_cmdlist_put(&cmdreq);
  492. }
  493. } else if (mipi->mode == DSI_CMD_MODE) {
  494. cmdreq.cmds = nt35510_cmd_display_on_cmds;
  495. cmdreq.cmds_cnt =
  496. ARRAY_SIZE(nt35510_cmd_display_on_cmds);
  497. cmdreq.flags = CMD_REQ_COMMIT;
  498. cmdreq.rlen = 0;
  499. cmdreq.cb = NULL;
  500. mipi_dsi_cmdlist_put(&cmdreq);
  501. if (rotate) {
  502. cmdreq.cmds = nt35510_cmd_display_on_cmds_rotate;
  503. cmdreq.cmds_cnt =
  504. ARRAY_SIZE(nt35510_cmd_display_on_cmds_rotate);
  505. cmdreq.flags = CMD_REQ_COMMIT;
  506. cmdreq.rlen = 0;
  507. cmdreq.cb = NULL;
  508. mipi_dsi_cmdlist_put(&cmdreq);
  509. }
  510. }
  511. return 0;
  512. }
  513. static int mipi_nt35510_lcd_off(struct platform_device *pdev)
  514. {
  515. struct msm_fb_data_type *mfd;
  516. struct dcs_cmd_req cmdreq;
  517. pr_debug("mipi_nt35510_lcd_off E\n");
  518. mfd = platform_get_drvdata(pdev);
  519. if (!mfd)
  520. return -ENODEV;
  521. if (mfd->key != MFD_KEY)
  522. return -EINVAL;
  523. memset(&cmdreq, 0, sizeof(cmdreq));
  524. cmdreq.cmds = nt35510_display_off_cmds;
  525. cmdreq.cmds_cnt = ARRAY_SIZE(nt35510_display_off_cmds);
  526. cmdreq.flags = CMD_REQ_COMMIT;
  527. cmdreq.rlen = 0;
  528. cmdreq.cb = NULL;
  529. mipi_dsi_cmdlist_put(&cmdreq);
  530. pr_debug("mipi_nt35510_lcd_off X\n");
  531. return 0;
  532. }
  533. static ssize_t mipi_nt35510_wta_bl_ctrl(struct device *dev,
  534. struct device_attribute *attr, const char *buf, size_t count)
  535. {
  536. ssize_t ret = strnlen(buf, PAGE_SIZE);
  537. int err;
  538. err = kstrtoint(buf, 0, &mipi_nt35510_bl_ctrl);
  539. if (err)
  540. return ret;
  541. pr_info("%s: bl ctrl set to %d\n", __func__, mipi_nt35510_bl_ctrl);
  542. return ret;
  543. }
  544. static DEVICE_ATTR(bl_ctrl, S_IWUSR, NULL, mipi_nt35510_wta_bl_ctrl);
  545. static struct attribute *mipi_nt35510_fs_attrs[] = {
  546. &dev_attr_bl_ctrl.attr,
  547. NULL,
  548. };
  549. static struct attribute_group mipi_nt35510_fs_attr_group = {
  550. .attrs = mipi_nt35510_fs_attrs,
  551. };
  552. static int mipi_nt35510_create_sysfs(struct platform_device *pdev)
  553. {
  554. int rc;
  555. struct msm_fb_data_type *mfd = platform_get_drvdata(pdev);
  556. if (!mfd) {
  557. pr_err("%s: mfd not found\n", __func__);
  558. return -ENODEV;
  559. }
  560. if (!mfd->fbi) {
  561. pr_err("%s: mfd->fbi not found\n", __func__);
  562. return -ENODEV;
  563. }
  564. if (!mfd->fbi->dev) {
  565. pr_err("%s: mfd->fbi->dev not found\n", __func__);
  566. return -ENODEV;
  567. }
  568. rc = sysfs_create_group(&mfd->fbi->dev->kobj,
  569. &mipi_nt35510_fs_attr_group);
  570. if (rc) {
  571. pr_err("%s: sysfs group creation failed, rc=%d\n",
  572. __func__, rc);
  573. return rc;
  574. }
  575. return 0;
  576. }
  577. static int __devinit mipi_nt35510_lcd_probe(struct platform_device *pdev)
  578. {
  579. struct platform_device *pthisdev = NULL;
  580. struct msm_fb_panel_data *pdata;
  581. pr_debug("%s\n", __func__);
  582. if (pdev->id == 0) {
  583. mipi_nt35510_pdata = pdev->dev.platform_data;
  584. if (mipi_nt35510_pdata->bl_lock)
  585. spin_lock_init(&mipi_nt35510_pdata->bl_spinlock);
  586. return 0;
  587. }
  588. pdata = pdev->dev.platform_data;
  589. if (mipi_nt35510_pdata && mipi_nt35510_pdata->rotate_panel()
  590. && pdata->panel_info.type == MIPI_CMD_PANEL)
  591. pdata->panel_info.lcd.refx100 = 6200;
  592. pthisdev = msm_fb_add_device(pdev);
  593. mipi_nt35510_create_sysfs(pthisdev);
  594. return 0;
  595. }
  596. static struct platform_driver this_driver = {
  597. .probe = mipi_nt35510_lcd_probe,
  598. .driver = {
  599. .name = "mipi_NT35510",
  600. },
  601. };
  602. static int old_bl_level;
  603. static void mipi_nt35510_set_backlight(struct msm_fb_data_type *mfd)
  604. {
  605. int bl_level;
  606. unsigned long flags;
  607. bl_level = mfd->bl_level;
  608. if (mipi_nt35510_pdata->bl_lock) {
  609. if (!mipi_nt35510_bl_ctrl) {
  610. /* Level received is of range 1 to bl_max,
  611. We need to convert the levels to 1
  612. to 31 */
  613. bl_level = (2 * bl_level * 31 + mfd->panel_info.bl_max)
  614. /(2 * mfd->panel_info.bl_max);
  615. if (bl_level == old_bl_level)
  616. return;
  617. if (bl_level == 0)
  618. mipi_nt35510_pdata->backlight(0, 1);
  619. if (old_bl_level == 0)
  620. mipi_nt35510_pdata->backlight(50, 1);
  621. spin_lock_irqsave(&mipi_nt35510_pdata->bl_spinlock,
  622. flags);
  623. mipi_nt35510_pdata->backlight(bl_level, 0);
  624. spin_unlock_irqrestore(&mipi_nt35510_pdata->bl_spinlock,
  625. flags);
  626. old_bl_level = bl_level;
  627. } else {
  628. mipi_nt35510_pdata->backlight(bl_level, 1);
  629. }
  630. } else {
  631. mipi_nt35510_pdata->backlight(bl_level, mipi_nt35510_bl_ctrl);
  632. }
  633. }
  634. static struct msm_fb_panel_data nt35510_panel_data = {
  635. .on = mipi_nt35510_lcd_on,
  636. .off = mipi_nt35510_lcd_off,
  637. .set_backlight = mipi_nt35510_set_backlight,
  638. };
  639. static int ch_used[3];
  640. static int mipi_nt35510_lcd_init(void)
  641. {
  642. mipi_dsi_buf_alloc(&nt35510_tx_buf, DSI_BUF_SIZE);
  643. mipi_dsi_buf_alloc(&nt35510_rx_buf, DSI_BUF_SIZE);
  644. return platform_driver_register(&this_driver);
  645. }
  646. int mipi_nt35510_device_register(struct msm_panel_info *pinfo,
  647. u32 channel, u32 panel)
  648. {
  649. struct platform_device *pdev = NULL;
  650. int ret;
  651. if ((channel >= 3) || ch_used[channel])
  652. return -ENODEV;
  653. ch_used[channel] = TRUE;
  654. ret = mipi_nt35510_lcd_init();
  655. if (ret) {
  656. pr_err("mipi_nt35510_lcd_init() failed with ret %u\n", ret);
  657. return ret;
  658. }
  659. pdev = platform_device_alloc("mipi_NT35510", (panel << 8)|channel);
  660. if (!pdev)
  661. return -ENOMEM;
  662. nt35510_panel_data.panel_info = *pinfo;
  663. ret = platform_device_add_data(pdev, &nt35510_panel_data,
  664. sizeof(nt35510_panel_data));
  665. if (ret) {
  666. pr_debug("%s: platform_device_add_data failed!\n", __func__);
  667. goto err_device_put;
  668. }
  669. ret = platform_device_add(pdev);
  670. if (ret) {
  671. pr_debug("%s: platform_device_register failed!\n", __func__);
  672. goto err_device_put;
  673. }
  674. return 0;
  675. err_device_put:
  676. platform_device_put(pdev);
  677. return ret;
  678. }