lcm_common.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  1. #if defined(MTK_LCM_DEVICE_TREE_SUPPORT)
  2. #include <linux/string.h>
  3. #include <linux/wait.h>
  4. #include <linux/of.h>
  5. #include "lcm_define.h"
  6. #include "lcm_drv.h"
  7. #include "lcm_common.h"
  8. #include "lcm_gpio.h"
  9. #include "lcm_i2c.h"
  10. #include "lcm_pmic.h"
  11. #include "lcm_util.h"
  12. /* #define LCM_DEBUG */
  13. /* --------------------------------------------------------------------------- */
  14. /* Local Variables */
  15. /* --------------------------------------------------------------------------- */
  16. static LCM_DTS _LCM_DTS;
  17. static LCM_UTIL_FUNCS lcm_util;
  18. /* --------------------------------------------------------------------------- */
  19. /* LCM Driver Implementations */
  20. /* --------------------------------------------------------------------------- */
  21. void lcm_common_parse_dts(const LCM_DTS *DTS, unsigned char force_update)
  22. {
  23. LCM_PARAMS *dts_params = &_LCM_DTS.params;
  24. LCM_DATA *dts_init = &(_LCM_DTS.init[0]);
  25. LCM_DATA *dts_compare_id = &(_LCM_DTS.compare_id[0]);
  26. LCM_DATA *dts_suspend = &(_LCM_DTS.suspend[0]);
  27. LCM_DATA *dts_backlight = &(_LCM_DTS.backlight[0]);
  28. if ((_LCM_DTS.parsing != 0) && (force_update == 0)) {
  29. pr_debug("[LCM][ERROR] %s/%d: DTS has been parsed or non-force update: %d, %d\n",
  30. __func__, __LINE__, _LCM_DTS.parsing, force_update);
  31. return;
  32. }
  33. #if defined(LCM_DEBUG)
  34. /* LCM DTS parameter set */
  35. memset(dts_params, 0, sizeof(LCM_PARAMS));
  36. dts_params->type = LCM_TYPE_DSI;
  37. dts_params->width = 720;
  38. dts_params->height = 1280;
  39. dts_params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
  40. dts_params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
  41. dts_params->dsi.mode = CMD_MODE;
  42. dts_params->dsi.switch_mode = SYNC_PULSE_VDO_MODE;
  43. dts_params->dsi.LANE_NUM = LCM_FOUR_LANE;
  44. dts_params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
  45. dts_params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
  46. dts_params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
  47. dts_params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
  48. dts_params->dsi.packet_size = 256;
  49. dts_params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888;
  50. dts_params->dsi.PLL_CLOCK = 200;
  51. dts_params->dsi.clk_lp_per_line_enable = 0;
  52. dts_params->dsi.esd_check_enable = 0;
  53. dts_params->dsi.customization_esd_check_enable = 0;
  54. dts_params->dsi.lcm_esd_check_table[0].cmd = 0x53;
  55. dts_params->dsi.lcm_esd_check_table[0].count = 0x01;
  56. dts_params->dsi.lcm_esd_check_table[0].para_list[0] = 0x24;
  57. #else
  58. memset(dts_params, 0, sizeof(LCM_PARAMS));
  59. memcpy(dts_params, &(DTS->params), sizeof(LCM_PARAMS));
  60. #endif
  61. #if defined(LCM_DEBUG)
  62. if (memcmp
  63. ((unsigned char *)dts_params, (unsigned char *)(&(DTS->params)),
  64. sizeof(LCM_PARAMS)) != 0x0) {
  65. pr_debug("[LCM][ERROR] %s/%d: DTS compare error\n", __func__, __LINE__);
  66. pr_debug("[LCM][ERROR] dts_params:\n");
  67. tmp = (unsigned char *)dts_params;
  68. tmp2 = (unsigned char *)(&(DTS->params));
  69. for (i = 0; i < sizeof(LCM_PARAMS); i += 8) {
  70. if (*(tmp + i) != *(tmp2 + i))
  71. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i), *(tmp2 + i), i);
  72. if (*(tmp + i + 1) != *(tmp2 + i + 1))
  73. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 1),
  74. *(tmp2 + i + 1), i + 1);
  75. if (*(tmp + i + 2) != *(tmp2 + i + 2))
  76. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 2),
  77. *(tmp2 + i + 2), i + 2);
  78. if (*(tmp + i + 3) != *(tmp2 + i + 3))
  79. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 3),
  80. *(tmp2 + i + 3), i + 3);
  81. if (*(tmp + i + 4) != *(tmp2 + i + 4))
  82. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 4),
  83. *(tmp2 + i + 4), i + 4);
  84. if (*(tmp + i + 5) != *(tmp2 + i + 5))
  85. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 5),
  86. *(tmp2 + i + 5), i + 5);
  87. if (*(tmp + i + 6) != *(tmp2 + i + 6))
  88. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 6),
  89. *(tmp2 + i + 6), i + 6);
  90. if (*(tmp + i + 7) != *(tmp2 + i + 7))
  91. pr_debug("data: 0x%x 0x%x, index: %d\n", *(tmp + i + 7),
  92. *(tmp2 + i + 7), i + 7);
  93. }
  94. pr_debug("[LCM][ERROR] DTS->params:\n");
  95. tmp = (unsigned char *)(&(DTS->params));
  96. for (i = 0; i < sizeof(LCM_PARAMS); i += 8) {
  97. pr_debug("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", *(tmp + i),
  98. *(tmp + i + 1), *(tmp + i + 2), *(tmp + i + 3), *(tmp + i + 4),
  99. *(tmp + i + 5), *(tmp + i + 6), *(tmp + i + 7));
  100. }
  101. return;
  102. }
  103. #endif
  104. #if defined(LCM_DEBUG)
  105. /* LCM DTS init data set */
  106. _LCM_DTS.init_size = 0;
  107. memset(dts_init, 0, sizeof(LCM_DATA) * 256);
  108. dts_init->func = LCM_FUNC_UTIL;
  109. dts_init->type = LCM_UTIL_RESET;
  110. dts_init->size = 1;
  111. dts_init->data_t1.data = LCM_UTIL_RESET_HIGH;
  112. dts_init = dts_init + 1;
  113. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  114. dts_init->func = LCM_FUNC_UTIL;
  115. dts_init->type = LCM_UTIL_RESET;
  116. dts_init->size = 1;
  117. dts_init->data_t1.data = LCM_UTIL_RESET_LOW;
  118. dts_init = dts_init + 1;
  119. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  120. dts_init->func = LCM_FUNC_UTIL;
  121. dts_init->type = LCM_UTIL_MDELAY;
  122. dts_init->size = 1;
  123. dts_init->data_t1.data = 10;
  124. dts_init = dts_init + 1;
  125. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  126. dts_init->func = LCM_FUNC_UTIL;
  127. dts_init->type = LCM_UTIL_RESET;
  128. dts_init->size = 1;
  129. dts_init->data_t1.data = LCM_UTIL_RESET_HIGH;
  130. dts_init = dts_init + 1;
  131. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  132. dts_init->func = LCM_FUNC_UTIL;
  133. dts_init->type = LCM_UTIL_MDELAY;
  134. dts_init->size = 1;
  135. dts_init->data_t1.data = 20;
  136. dts_init = dts_init + 1;
  137. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  138. dts_init->func = LCM_FUNC_CMD;
  139. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  140. dts_init->size = 2;
  141. dts_init->data_t3.cmd = 0x11;
  142. dts_init->data_t3.size = 0;
  143. dts_init = dts_init + 1;
  144. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  145. dts_init->func = LCM_FUNC_UTIL;
  146. dts_init->type = LCM_UTIL_MDELAY;
  147. dts_init->size = 1;
  148. dts_init->data_t1.data = 120;
  149. dts_init = dts_init + 1;
  150. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  151. dts_init->func = LCM_FUNC_CMD;
  152. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  153. dts_init->size = 5;
  154. dts_init->data_t3.cmd = 0xB9;
  155. dts_init->data_t3.size = 3;
  156. dts_init->data_t3.data[0] = 0xFF;
  157. dts_init->data_t3.data[1] = 0x83;
  158. dts_init->data_t3.data[2] = 0x92;
  159. dts_init = dts_init + 1;
  160. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  161. dts_init->func = LCM_FUNC_UTIL;
  162. dts_init->type = LCM_UTIL_MDELAY;
  163. dts_init->size = 1;
  164. dts_init->data_t1.data = 10;
  165. dts_init = dts_init + 1;
  166. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  167. dts_init->func = LCM_FUNC_CMD;
  168. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  169. dts_init->size = 4;
  170. dts_init->data_t3.cmd = 0xB0;
  171. dts_init->data_t3.size = 2;
  172. dts_init->data_t3.data[0] = 0x01;
  173. dts_init->data_t3.data[1] = 0x08;
  174. dts_init = dts_init + 1;
  175. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  176. dts_init->func = LCM_FUNC_CMD;
  177. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  178. dts_init->size = 19;
  179. dts_init->data_t3.cmd = 0xBA;
  180. dts_init->data_t3.size = 17;
  181. dts_init->data_t3.data[0] = 0x13;
  182. dts_init->data_t3.data[1] = 0x83;
  183. dts_init->data_t3.data[2] = 0x00;
  184. dts_init->data_t3.data[3] = 0xD6;
  185. dts_init->data_t3.data[4] = 0xC5;
  186. dts_init->data_t3.data[5] = 0x10;
  187. dts_init->data_t3.data[6] = 0x09;
  188. dts_init->data_t3.data[7] = 0xFF;
  189. dts_init->data_t3.data[8] = 0x0F;
  190. dts_init->data_t3.data[9] = 0x27;
  191. dts_init->data_t3.data[10] = 0x03;
  192. dts_init->data_t3.data[11] = 0x21;
  193. dts_init->data_t3.data[12] = 0x27;
  194. dts_init->data_t3.data[13] = 0x25;
  195. dts_init->data_t3.data[14] = 0x20;
  196. dts_init->data_t3.data[15] = 0x00;
  197. dts_init->data_t3.data[16] = 0x10;
  198. dts_init = dts_init + 1;
  199. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  200. dts_init->func = LCM_FUNC_CMD;
  201. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  202. dts_init->size = 15;
  203. dts_init->data_t3.cmd = 0xB1;
  204. dts_init->data_t3.size = 13;
  205. dts_init->data_t3.data[0] = 0x7C;
  206. dts_init->data_t3.data[1] = 0x00;
  207. dts_init->data_t3.data[2] = 0x43;
  208. dts_init->data_t3.data[3] = 0xBB;
  209. dts_init->data_t3.data[4] = 0x00;
  210. dts_init->data_t3.data[5] = 0x1A;
  211. dts_init->data_t3.data[6] = 0x1A;
  212. dts_init->data_t3.data[7] = 0x2F;
  213. dts_init->data_t3.data[8] = 0x36;
  214. dts_init->data_t3.data[9] = 0x3F;
  215. dts_init->data_t3.data[10] = 0x3F;
  216. dts_init->data_t3.data[11] = 0x42;
  217. dts_init->data_t3.data[12] = 0x7A;
  218. dts_init = dts_init + 1;
  219. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  220. dts_init->func = LCM_FUNC_CMD;
  221. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  222. dts_init->size = 14;
  223. dts_init->data_t3.cmd = 0xB2;
  224. dts_init->data_t3.size = 12;
  225. dts_init->data_t3.data[0] = 0x08;
  226. dts_init->data_t3.data[1] = 0xC8;
  227. dts_init->data_t3.data[2] = 0x06;
  228. dts_init->data_t3.data[3] = 0x18;
  229. dts_init->data_t3.data[4] = 0x04;
  230. dts_init->data_t3.data[5] = 0x84;
  231. dts_init->data_t3.data[6] = 0x00;
  232. dts_init->data_t3.data[7] = 0xFF;
  233. dts_init->data_t3.data[8] = 0x06;
  234. dts_init->data_t3.data[9] = 0x06;
  235. dts_init->data_t3.data[10] = 0x04;
  236. dts_init->data_t3.data[11] = 0x20;
  237. dts_init = dts_init + 1;
  238. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  239. dts_init->func = LCM_FUNC_CMD;
  240. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  241. dts_init->size = 25;
  242. dts_init->data_t3.cmd = 0xB4;
  243. dts_init->data_t3.size = 23;
  244. dts_init->data_t3.data[0] = 0x00;
  245. dts_init->data_t3.data[1] = 0x00;
  246. dts_init->data_t3.data[2] = 0x05;
  247. dts_init->data_t3.data[3] = 0x0A;
  248. dts_init->data_t3.data[4] = 0x8F;
  249. dts_init->data_t3.data[5] = 0x06;
  250. dts_init->data_t3.data[6] = 0x0A;
  251. dts_init->data_t3.data[7] = 0x95;
  252. dts_init->data_t3.data[8] = 0x01;
  253. dts_init->data_t3.data[9] = 0x07;
  254. dts_init->data_t3.data[10] = 0x06;
  255. dts_init->data_t3.data[11] = 0x0C;
  256. dts_init->data_t3.data[12] = 0x02;
  257. dts_init->data_t3.data[13] = 0x08;
  258. dts_init->data_t3.data[14] = 0x08;
  259. dts_init->data_t3.data[15] = 0x21;
  260. dts_init->data_t3.data[16] = 0x04;
  261. dts_init->data_t3.data[17] = 0x02;
  262. dts_init->data_t3.data[18] = 0x08;
  263. dts_init->data_t3.data[19] = 0x01;
  264. dts_init->data_t3.data[20] = 0x04;
  265. dts_init->data_t3.data[21] = 0x1A;
  266. dts_init->data_t3.data[22] = 0x95;
  267. dts_init = dts_init + 1;
  268. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  269. dts_init->func = LCM_FUNC_CMD;
  270. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  271. dts_init->size = 3;
  272. dts_init->data_t3.cmd = 0x35;
  273. dts_init->data_t3.size = 1;
  274. dts_init->data_t3.data[0] = 0x00;
  275. dts_init = dts_init + 1;
  276. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  277. dts_init->func = LCM_FUNC_CMD;
  278. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  279. dts_init->size = 6;
  280. dts_init->data_t3.cmd = 0xBF;
  281. dts_init->data_t3.size = 4;
  282. dts_init->data_t3.data[0] = 0x05;
  283. dts_init->data_t3.data[1] = 0x60;
  284. dts_init->data_t3.data[2] = 0x02;
  285. dts_init->data_t3.data[3] = 0x00;
  286. dts_init = dts_init + 1;
  287. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  288. dts_init->func = LCM_FUNC_CMD;
  289. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  290. dts_init->size = 3;
  291. dts_init->data_t3.cmd = 0xB6;
  292. dts_init->data_t3.size = 1;
  293. dts_init->data_t3.data[0] = 0x6A;
  294. dts_init = dts_init + 1;
  295. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  296. dts_init->func = LCM_FUNC_CMD;
  297. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  298. dts_init->size = 3;
  299. dts_init->data_t3.cmd = 0x36;
  300. dts_init->data_t3.size = 1;
  301. dts_init->data_t3.data[0] = 0x08;
  302. dts_init = dts_init + 1;
  303. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  304. dts_init->func = LCM_FUNC_CMD;
  305. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  306. dts_init->size = 4;
  307. dts_init->data_t3.cmd = 0xC0;
  308. dts_init->data_t3.size = 2;
  309. dts_init->data_t3.data[0] = 0x03;
  310. dts_init->data_t3.data[1] = 0x94;
  311. dts_init = dts_init + 1;
  312. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  313. dts_init->func = LCM_FUNC_CMD;
  314. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  315. dts_init->size = 3;
  316. dts_init->data_t3.cmd = 0xC2;
  317. dts_init->data_t3.size = 1;
  318. dts_init->data_t3.data[0] = 0x08;
  319. dts_init = dts_init + 1;
  320. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  321. dts_init->func = LCM_FUNC_CMD;
  322. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  323. dts_init->size = 6;
  324. dts_init->data_t3.cmd = 0xC6;
  325. dts_init->data_t3.size = 4;
  326. dts_init->data_t3.data[0] = 0x35;
  327. dts_init->data_t3.data[1] = 0x00;
  328. dts_init->data_t3.data[2] = 0x20;
  329. dts_init->data_t3.data[3] = 0x04;
  330. dts_init = dts_init + 1;
  331. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  332. dts_init->func = LCM_FUNC_CMD;
  333. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  334. dts_init->size = 3;
  335. dts_init->data_t3.cmd = 0xCC;
  336. dts_init->data_t3.size = 1;
  337. dts_init->data_t3.data[0] = 0x09;
  338. dts_init = dts_init + 1;
  339. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  340. dts_init->func = LCM_FUNC_CMD;
  341. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  342. dts_init->size = 3;
  343. dts_init->data_t3.cmd = 0xD4;
  344. dts_init->data_t3.size = 1;
  345. dts_init->data_t3.data[0] = 0x00;
  346. dts_init = dts_init + 1;
  347. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  348. dts_init->func = LCM_FUNC_CMD;
  349. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  350. dts_init->size = 25;
  351. dts_init->data_t3.cmd = 0xD5;
  352. dts_init->data_t3.size = 23;
  353. dts_init->data_t3.data[0] = 0x00;
  354. dts_init->data_t3.data[1] = 0x01;
  355. dts_init->data_t3.data[2] = 0x04;
  356. dts_init->data_t3.data[3] = 0x00;
  357. dts_init->data_t3.data[4] = 0x01;
  358. dts_init->data_t3.data[5] = 0x67;
  359. dts_init->data_t3.data[6] = 0x89;
  360. dts_init->data_t3.data[7] = 0xAB;
  361. dts_init->data_t3.data[8] = 0x45;
  362. dts_init->data_t3.data[9] = 0xCC;
  363. dts_init->data_t3.data[10] = 0xCC;
  364. dts_init->data_t3.data[11] = 0xCC;
  365. dts_init->data_t3.data[12] = 0x00;
  366. dts_init->data_t3.data[13] = 0x10;
  367. dts_init->data_t3.data[14] = 0x54;
  368. dts_init->data_t3.data[15] = 0xBA;
  369. dts_init->data_t3.data[16] = 0x98;
  370. dts_init->data_t3.data[17] = 0x76;
  371. dts_init->data_t3.data[18] = 0xCC;
  372. dts_init->data_t3.data[19] = 0xCC;
  373. dts_init->data_t3.data[20] = 0xCC;
  374. dts_init->data_t3.data[21] = 0x00;
  375. dts_init->data_t3.data[22] = 0x00;
  376. dts_init = dts_init + 1;
  377. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  378. dts_init->func = LCM_FUNC_CMD;
  379. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  380. dts_init->size = 25;
  381. dts_init->data_t3.cmd = 0xD8;
  382. dts_init->data_t3.size = 23;
  383. dts_init->data_t3.data[0] = 0x00;
  384. dts_init->data_t3.data[1] = 0x00;
  385. dts_init->data_t3.data[2] = 0x05;
  386. dts_init->data_t3.data[3] = 0x00;
  387. dts_init->data_t3.data[4] = 0x9A;
  388. dts_init->data_t3.data[5] = 0x00;
  389. dts_init->data_t3.data[6] = 0x02;
  390. dts_init->data_t3.data[7] = 0x95;
  391. dts_init->data_t3.data[8] = 0x01;
  392. dts_init->data_t3.data[9] = 0x07;
  393. dts_init->data_t3.data[10] = 0x06;
  394. dts_init->data_t3.data[11] = 0x00;
  395. dts_init->data_t3.data[12] = 0x08;
  396. dts_init->data_t3.data[13] = 0x08;
  397. dts_init->data_t3.data[14] = 0x00;
  398. dts_init->data_t3.data[15] = 0x1D;
  399. dts_init->data_t3.data[16] = 0x08;
  400. dts_init->data_t3.data[17] = 0x08;
  401. dts_init->data_t3.data[18] = 0x08;
  402. dts_init->data_t3.data[19] = 0x00;
  403. dts_init->data_t3.data[20] = 0x00;
  404. dts_init->data_t3.data[21] = 0x00;
  405. dts_init->data_t3.data[22] = 0x77;
  406. dts_init = dts_init + 1;
  407. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  408. dts_init->func = LCM_FUNC_CMD;
  409. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  410. dts_init->size = 36;
  411. dts_init->data_t3.cmd = 0xE0;
  412. dts_init->data_t3.size = 34;
  413. dts_init->data_t3.data[0] = 0x00;
  414. dts_init->data_t3.data[1] = 0x12;
  415. dts_init->data_t3.data[2] = 0x19;
  416. dts_init->data_t3.data[3] = 0x33;
  417. dts_init->data_t3.data[4] = 0x36;
  418. dts_init->data_t3.data[5] = 0x3F;
  419. dts_init->data_t3.data[6] = 0x28;
  420. dts_init->data_t3.data[7] = 0x47;
  421. dts_init->data_t3.data[8] = 0x06;
  422. dts_init->data_t3.data[9] = 0x0C;
  423. dts_init->data_t3.data[10] = 0x0E;
  424. dts_init->data_t3.data[11] = 0x12;
  425. dts_init->data_t3.data[12] = 0x14;
  426. dts_init->data_t3.data[13] = 0x12;
  427. dts_init->data_t3.data[14] = 0x14;
  428. dts_init->data_t3.data[15] = 0x12;
  429. dts_init->data_t3.data[16] = 0x1A;
  430. dts_init->data_t3.data[17] = 0x00;
  431. dts_init->data_t3.data[18] = 0x12;
  432. dts_init->data_t3.data[19] = 0x19;
  433. dts_init->data_t3.data[20] = 0x33;
  434. dts_init->data_t3.data[21] = 0x36;
  435. dts_init->data_t3.data[22] = 0x3F;
  436. dts_init->data_t3.data[23] = 0x28;
  437. dts_init->data_t3.data[24] = 0x47;
  438. dts_init->data_t3.data[25] = 0x06;
  439. dts_init->data_t3.data[26] = 0x0C;
  440. dts_init->data_t3.data[27] = 0x0E;
  441. dts_init->data_t3.data[28] = 0x12;
  442. dts_init->data_t3.data[29] = 0x14;
  443. dts_init->data_t3.data[30] = 0x12;
  444. dts_init->data_t3.data[31] = 0x14;
  445. dts_init->data_t3.data[32] = 0x12;
  446. dts_init->data_t3.data[33] = 0x1A;
  447. dts_init = dts_init + 1;
  448. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  449. dts_init->func = LCM_FUNC_CMD;
  450. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  451. dts_init->size = 36;
  452. dts_init->data_t3.cmd = 0xE1;
  453. dts_init->data_t3.size = 34;
  454. dts_init->data_t3.data[0] = 0x00;
  455. dts_init->data_t3.data[1] = 0x12;
  456. dts_init->data_t3.data[2] = 0x19;
  457. dts_init->data_t3.data[3] = 0x33;
  458. dts_init->data_t3.data[4] = 0x36;
  459. dts_init->data_t3.data[5] = 0x3F;
  460. dts_init->data_t3.data[6] = 0x28;
  461. dts_init->data_t3.data[7] = 0x47;
  462. dts_init->data_t3.data[8] = 0x06;
  463. dts_init->data_t3.data[9] = 0x0C;
  464. dts_init->data_t3.data[10] = 0x0E;
  465. dts_init->data_t3.data[11] = 0x12;
  466. dts_init->data_t3.data[12] = 0x14;
  467. dts_init->data_t3.data[13] = 0x12;
  468. dts_init->data_t3.data[14] = 0x14;
  469. dts_init->data_t3.data[15] = 0x12;
  470. dts_init->data_t3.data[16] = 0x1A;
  471. dts_init->data_t3.data[17] = 0x00;
  472. dts_init->data_t3.data[18] = 0x12;
  473. dts_init->data_t3.data[19] = 0x19;
  474. dts_init->data_t3.data[20] = 0x33;
  475. dts_init->data_t3.data[21] = 0x36;
  476. dts_init->data_t3.data[22] = 0x3F;
  477. dts_init->data_t3.data[23] = 0x28;
  478. dts_init->data_t3.data[24] = 0x47;
  479. dts_init->data_t3.data[25] = 0x06;
  480. dts_init->data_t3.data[26] = 0x0C;
  481. dts_init->data_t3.data[27] = 0x0E;
  482. dts_init->data_t3.data[28] = 0x12;
  483. dts_init->data_t3.data[29] = 0x14;
  484. dts_init->data_t3.data[30] = 0x12;
  485. dts_init->data_t3.data[31] = 0x14;
  486. dts_init->data_t3.data[32] = 0x12;
  487. dts_init->data_t3.data[33] = 0x1A;
  488. dts_init = dts_init + 1;
  489. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  490. dts_init->func = LCM_FUNC_CMD;
  491. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  492. dts_init->size = 36;
  493. dts_init->data_t3.cmd = 0xE2;
  494. dts_init->data_t3.size = 34;
  495. dts_init->data_t3.data[0] = 0x00;
  496. dts_init->data_t3.data[1] = 0x12;
  497. dts_init->data_t3.data[2] = 0x19;
  498. dts_init->data_t3.data[3] = 0x33;
  499. dts_init->data_t3.data[4] = 0x36;
  500. dts_init->data_t3.data[5] = 0x3F;
  501. dts_init->data_t3.data[6] = 0x28;
  502. dts_init->data_t3.data[7] = 0x47;
  503. dts_init->data_t3.data[8] = 0x06;
  504. dts_init->data_t3.data[9] = 0x0C;
  505. dts_init->data_t3.data[10] = 0x0E;
  506. dts_init->data_t3.data[11] = 0x12;
  507. dts_init->data_t3.data[12] = 0x14;
  508. dts_init->data_t3.data[13] = 0x12;
  509. dts_init->data_t3.data[14] = 0x14;
  510. dts_init->data_t3.data[15] = 0x12;
  511. dts_init->data_t3.data[16] = 0x1A;
  512. dts_init->data_t3.data[17] = 0x00;
  513. dts_init->data_t3.data[18] = 0x12;
  514. dts_init->data_t3.data[19] = 0x19;
  515. dts_init->data_t3.data[20] = 0x33;
  516. dts_init->data_t3.data[21] = 0x36;
  517. dts_init->data_t3.data[22] = 0x3F;
  518. dts_init->data_t3.data[23] = 0x28;
  519. dts_init->data_t3.data[24] = 0x47;
  520. dts_init->data_t3.data[25] = 0x06;
  521. dts_init->data_t3.data[26] = 0x0C;
  522. dts_init->data_t3.data[27] = 0x0E;
  523. dts_init->data_t3.data[28] = 0x12;
  524. dts_init->data_t3.data[29] = 0x14;
  525. dts_init->data_t3.data[30] = 0x12;
  526. dts_init->data_t3.data[31] = 0x14;
  527. dts_init->data_t3.data[32] = 0x12;
  528. dts_init->data_t3.data[33] = 0x1A;
  529. dts_init = dts_init + 1;
  530. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  531. dts_init->func = LCM_FUNC_CMD;
  532. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  533. dts_init->size = 3;
  534. dts_init->data_t3.cmd = 0x3A;
  535. dts_init->data_t3.size = 1;
  536. dts_init->data_t3.data[0] = 0x77;
  537. dts_init = dts_init + 1;
  538. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  539. dts_init->func = LCM_FUNC_CMD;
  540. dts_init->type = LCM_UTIL_WRITE_CMD_V2;
  541. dts_init->size = 2;
  542. dts_init->data_t3.cmd = 0x29;
  543. dts_init->data_t3.size = 0;
  544. dts_init = dts_init + 1;
  545. _LCM_DTS.init_size = _LCM_DTS.init_size + 1;
  546. #else
  547. memset(dts_init, 0, sizeof(LCM_DATA) * (DTS->init_size));
  548. memcpy(dts_init, &(DTS->init[0]), sizeof(LCM_DATA) * (DTS->init_size));
  549. _LCM_DTS.init_size = DTS->init_size;
  550. #endif
  551. #if defined(LCM_DEBUG)
  552. dts_init = &(_LCM_DTS.init[0]);
  553. if (memcmp((unsigned char *)dts_init, (unsigned char *)(&(DTS->init[0])), sizeof(LCM_DATA))
  554. != 0x0) {
  555. pr_debug("[LCM][ERROR] %s/%d: DTS compare error\n", __func__, __LINE__);
  556. pr_debug("[LCM][ERROR] dts_init:\n");
  557. tmp = (unsigned char *)dts_init;
  558. for (i = 0; i < _LCM_DTS.init_size; i++) {
  559. pr_debug("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", *(tmp), *(tmp + 1),
  560. *(tmp + 2), *(tmp + 3), *(tmp + 4), *(tmp + 5), *(tmp + 6),
  561. *(tmp + 7));
  562. tmp = tmp + sizeof(LCM_DATA);
  563. }
  564. pr_debug("[LCM][ERROR] DTS->init:\n");
  565. tmp = (unsigned char *)(&(DTS->init[0]));
  566. for (i = 0; i < DTS->init_size; i++) {
  567. pr_debug("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", *(tmp), *(tmp + 1),
  568. *(tmp + 2), *(tmp + 3), *(tmp + 4), *(tmp + 5), *(tmp + 6),
  569. *(tmp + 7));
  570. tmp = tmp + sizeof(LCM_DATA);
  571. }
  572. return;
  573. }
  574. #endif
  575. #if defined(LCM_DEBUG)
  576. /* LCM DTS compare_id data set */
  577. _LCM_DTS.compare_id_size = 0;
  578. memset(dts_compare_id, 0, sizeof(LCM_DATA) * 8);
  579. dts_compare_id->func = LCM_FUNC_CMD;
  580. dts_compare_id->type = LCM_UTIL_WRITE_CMD_V1;
  581. dts_compare_id->size = 5;
  582. dts_compare_id->data_t5.size = 1;
  583. dts_compare_id->data_t5.cmd[0] = 0x00;
  584. dts_compare_id->data_t5.cmd[1] = 0x37;
  585. dts_compare_id->data_t5.cmd[2] = 0x01;
  586. dts_compare_id->data_t5.cmd[3] = 0x00;
  587. dts_compare_id = dts_compare_id + 1;
  588. _LCM_DTS.compare_id_size = _LCM_DTS.compare_id_size + 1;
  589. dts_compare_id->func = LCM_FUNC_CMD;
  590. dts_compare_id->type = LCM_UTIL_READ_CMD_V2;
  591. dts_compare_id->size = 3;
  592. dts_compare_id->data_t4.cmd = 0xF4;
  593. dts_compare_id->data_t4.location = 1;
  594. dts_compare_id->data_t4.data = 0x92;
  595. dts_compare_id = dts_compare_id + 1;
  596. _LCM_DTS.compare_id_size = _LCM_DTS.compare_id_size + 1;
  597. #else
  598. memset(dts_compare_id, 0, sizeof(LCM_DATA) * (DTS->compare_id_size));
  599. memcpy(dts_compare_id, &(DTS->compare_id[0]), sizeof(LCM_DATA) * (DTS->compare_id_size));
  600. _LCM_DTS.compare_id_size = DTS->compare_id_size;
  601. #endif
  602. #if defined(LCM_DEBUG)
  603. /* LCM DTS suspend data set */
  604. _LCM_DTS.suspend_size = 0;
  605. memset(dts_suspend, 0, sizeof(LCM_DATA) * 8);
  606. dts_suspend->func = LCM_FUNC_CMD;
  607. dts_suspend->type = LCM_UTIL_WRITE_CMD_V2;
  608. dts_suspend->size = 2;
  609. dts_suspend->data_t3.cmd = 0x10;
  610. dts_suspend->data_t3.size = 0;
  611. dts_suspend = dts_suspend + 1;
  612. _LCM_DTS.suspend_size = _LCM_DTS.suspend_size + 1;
  613. dts_suspend->func = LCM_FUNC_UTIL;
  614. dts_suspend->type = LCM_UTIL_MDELAY;
  615. dts_suspend->size = 1;
  616. dts_suspend->data_t1.data = 120;
  617. dts_suspend = dts_suspend + 1;
  618. _LCM_DTS.suspend_size = _LCM_DTS.suspend_size + 1;
  619. #else
  620. memset(dts_suspend, 0, sizeof(LCM_DATA) * (DTS->suspend_size));
  621. memcpy(dts_suspend, &(DTS->suspend[0]), sizeof(LCM_DATA) * (DTS->suspend_size));
  622. _LCM_DTS.suspend_size = DTS->suspend_size;
  623. #endif
  624. #if defined(LCM_DEBUG)
  625. /* LCM DTS backlight data set */
  626. _LCM_DTS.backlight_size = 0;
  627. memset(dts_backlight, 0, sizeof(LCM_DATA) * 8);
  628. dts_backlight->func = LCM_FUNC_CMD;
  629. dts_backlight->type = LCM_UTIL_WRITE_CMD_V2;
  630. dts_backlight->size = 3;
  631. dts_backlight->data_t3.cmd = 0x51;
  632. dts_backlight->data_t3.size = 1;
  633. dts_backlight->data_t3.data[0] = 0xFF;
  634. dts_backlight = dts_backlight + 1;
  635. _LCM_DTS.backlight_size = _LCM_DTS.backlight_size + 1;
  636. #else
  637. memset(dts_backlight, 0, sizeof(LCM_DATA) * (DTS->backlight_size));
  638. memcpy(dts_backlight, &(DTS->backlight[0]), sizeof(LCM_DATA) * (DTS->backlight_size));
  639. _LCM_DTS.backlight_size = DTS->backlight_size;
  640. #endif
  641. _LCM_DTS.parsing = 1;
  642. }
  643. void lcm_common_set_util_funcs(const LCM_UTIL_FUNCS *util)
  644. {
  645. memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
  646. }
  647. void lcm_common_get_params(LCM_PARAMS *params)
  648. {
  649. if (params == NULL) {
  650. pr_debug("[LCM][ERROR] %s/%d: NULL parameter\n", __func__, __LINE__);
  651. return;
  652. }
  653. if (_LCM_DTS.parsing != 0) {
  654. memset(params, 0, sizeof(LCM_PARAMS));
  655. memcpy(params, &(_LCM_DTS.params), sizeof(LCM_PARAMS));
  656. } else {
  657. pr_debug("[LCM][ERROR] %s/%d: DTS is not parsed\n", __func__, __LINE__);
  658. return;
  659. }
  660. }
  661. void lcm_common_init(void)
  662. {
  663. if (_LCM_DTS.init_size > 256) {
  664. pr_debug("[LCM][ERROR] %s/%d: Init table overflow %d\n", __func__, __LINE__,
  665. _LCM_DTS.init_size);
  666. return;
  667. }
  668. if (_LCM_DTS.parsing != 0) {
  669. unsigned int i;
  670. LCM_DATA *init;
  671. for (i = 0; i < _LCM_DTS.init_size; i++) {
  672. init = &(_LCM_DTS.init[i]);
  673. switch (init->func) {
  674. case LCM_FUNC_GPIO:
  675. lcm_gpio_set_data(init->type, &init->data_t1);
  676. break;
  677. case LCM_FUNC_I2C:
  678. lcm_i2c_set_data(init->type, &init->data_t2);
  679. break;
  680. case LCM_FUNC_UTIL:
  681. lcm_util_set_data(&lcm_util, init->type, &init->data_t1);
  682. break;
  683. case LCM_FUNC_CMD:
  684. switch (init->type) {
  685. case LCM_UTIL_WRITE_CMD_V1:
  686. lcm_util_set_write_cmd_v1(&lcm_util, &init->data_t5, 1);
  687. break;
  688. case LCM_UTIL_WRITE_CMD_V2:
  689. lcm_util_set_write_cmd_v2(&lcm_util, &init->data_t3, 1);
  690. break;
  691. default:
  692. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  693. init->type);
  694. return;
  695. }
  696. break;
  697. default:
  698. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__, init->func);
  699. return;
  700. }
  701. }
  702. } else {
  703. pr_debug("[LCM][ERROR] %s/%d: DTS is not parsed\n", __func__, __LINE__);
  704. return;
  705. }
  706. }
  707. void lcm_common_suspend(void)
  708. {
  709. if (_LCM_DTS.suspend_size > 32) {
  710. pr_debug("[LCM][ERROR] %s/%d: Suspend table overflow %d\n", __func__, __LINE__,
  711. _LCM_DTS.suspend_size);
  712. return;
  713. }
  714. if (_LCM_DTS.parsing != 0) {
  715. unsigned int i;
  716. LCM_DATA *suspend;
  717. for (i = 0; i < _LCM_DTS.suspend_size; i++) {
  718. suspend = &(_LCM_DTS.suspend[i]);
  719. switch (suspend->func) {
  720. case LCM_FUNC_GPIO:
  721. lcm_gpio_set_data(suspend->type, &suspend->data_t1);
  722. break;
  723. case LCM_FUNC_I2C:
  724. lcm_i2c_set_data(suspend->type, &suspend->data_t2);
  725. break;
  726. case LCM_FUNC_UTIL:
  727. lcm_util_set_data(&lcm_util, suspend->type, &suspend->data_t1);
  728. break;
  729. case LCM_FUNC_CMD:
  730. switch (suspend->type) {
  731. case LCM_UTIL_WRITE_CMD_V1:
  732. lcm_util_set_write_cmd_v1(&lcm_util, &suspend->data_t5, 1);
  733. break;
  734. case LCM_UTIL_WRITE_CMD_V2:
  735. lcm_util_set_write_cmd_v2(&lcm_util, &suspend->data_t3, 1);
  736. break;
  737. default:
  738. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  739. suspend->type);
  740. return;
  741. }
  742. break;
  743. default:
  744. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  745. suspend->func);
  746. return;
  747. }
  748. }
  749. } else {
  750. pr_debug("[LCM][ERROR] %s/%d: DTS is not parsed\n", __func__, __LINE__);
  751. return;
  752. }
  753. }
  754. void lcm_common_resume(void)
  755. {
  756. lcm_common_init();
  757. }
  758. void lcm_common_update(unsigned int x, unsigned int y, unsigned int width, unsigned int height)
  759. {
  760. unsigned int x0 = x;
  761. unsigned int y0 = y;
  762. unsigned int x1 = x0 + width - 1;
  763. unsigned int y1 = y0 + height - 1;
  764. unsigned char x0_MSB = ((x0 >> 8) & 0xFF);
  765. unsigned char x0_LSB = (x0 & 0xFF);
  766. unsigned char x1_MSB = ((x1 >> 8) & 0xFF);
  767. unsigned char x1_LSB = (x1 & 0xFF);
  768. unsigned char y0_MSB = ((y0 >> 8) & 0xFF);
  769. unsigned char y0_LSB = (y0 & 0xFF);
  770. unsigned char y1_MSB = ((y1 >> 8) & 0xFF);
  771. unsigned char y1_LSB = (y1 & 0xFF);
  772. LCM_DATA update;
  773. LCM_DATA_T5 *data_t5 = &(update.data_t5);
  774. LCM_PARAMS *dts_params = &_LCM_DTS.params;
  775. if (_LCM_DTS.parsing != 0) {
  776. if (dts_params->dsi.mode == CMD_MODE) {
  777. data_t5->size = 7;
  778. data_t5->cmd[0] = 0x02;
  779. data_t5->cmd[1] = 0x39;
  780. data_t5->cmd[2] = 0x05;
  781. data_t5->cmd[3] = 0x00;
  782. data_t5->cmd[4] = 0x2a;
  783. data_t5->cmd[5] = x0_MSB;
  784. data_t5->cmd[6] = x0_LSB;
  785. data_t5->cmd[7] = x1_MSB;
  786. data_t5->cmd[8] = x1_LSB;
  787. data_t5->cmd[9] = 0x00;
  788. data_t5->cmd[10] = 0x00;
  789. data_t5->cmd[11] = 0x00;
  790. data_t5->cmd[12] = 0x02;
  791. data_t5->cmd[13] = 0x39;
  792. data_t5->cmd[14] = 0x05;
  793. data_t5->cmd[15] = 0x00;
  794. data_t5->cmd[16] = 0x2b;
  795. data_t5->cmd[17] = y0_MSB;
  796. data_t5->cmd[18] = y0_LSB;
  797. data_t5->cmd[19] = y1_MSB;
  798. data_t5->cmd[20] = y1_LSB;
  799. data_t5->cmd[21] = 0x00;
  800. data_t5->cmd[22] = 0x00;
  801. data_t5->cmd[23] = 0x00;
  802. data_t5->cmd[24] = 0x09;
  803. data_t5->cmd[25] = 0x39;
  804. data_t5->cmd[26] = 0x2c;
  805. data_t5->cmd[27] = 0x00;
  806. lcm_util_set_write_cmd_v1(&lcm_util, data_t5, 0);
  807. }
  808. }
  809. }
  810. void lcm_common_setbacklight(unsigned int level)
  811. {
  812. unsigned int default_level = 145;
  813. unsigned int mapped_level = 0;
  814. /* for LGE backlight IC mapping table */
  815. if (level > 255)
  816. level = 255;
  817. if (level > 0)
  818. mapped_level = default_level + (level) * (255 - default_level) / (255);
  819. else
  820. mapped_level = 0;
  821. if (_LCM_DTS.backlight_size > 32) {
  822. pr_debug("[LCM][ERROR] %s/%d: Backlight table overflow %d\n", __func__, __LINE__,
  823. _LCM_DTS.backlight_size);
  824. return;
  825. }
  826. if (_LCM_DTS.parsing != 0) {
  827. unsigned int i;
  828. LCM_DATA *backlight;
  829. LCM_DATA_T3 *backlight_data_t3;
  830. for (i = 0; i < _LCM_DTS.backlight_size; i++) {
  831. if (i == (_LCM_DTS.backlight_size - 1)) {
  832. backlight = &(_LCM_DTS.backlight[i]);
  833. backlight_data_t3 = &(backlight->data_t3);
  834. backlight_data_t3->data[i] = mapped_level;
  835. } else
  836. backlight = &(_LCM_DTS.backlight[i]);
  837. switch (backlight->func) {
  838. case LCM_FUNC_GPIO:
  839. lcm_gpio_set_data(backlight->type, &backlight->data_t1);
  840. break;
  841. case LCM_FUNC_I2C:
  842. lcm_i2c_set_data(backlight->type, &backlight->data_t2);
  843. break;
  844. case LCM_FUNC_UTIL:
  845. lcm_util_set_data(&lcm_util, backlight->type, &backlight->data_t1);
  846. break;
  847. case LCM_FUNC_CMD:
  848. switch (backlight->type) {
  849. case LCM_UTIL_WRITE_CMD_V1:
  850. lcm_util_set_write_cmd_v1(&lcm_util, &backlight->data_t5,
  851. 1);
  852. break;
  853. case LCM_UTIL_WRITE_CMD_V2:
  854. lcm_util_set_write_cmd_v2(&lcm_util, &backlight->data_t3,
  855. 1);
  856. break;
  857. default:
  858. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  859. (unsigned int)backlight->type);
  860. return;
  861. }
  862. break;
  863. default:
  864. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  865. (unsigned int)backlight->func);
  866. return;
  867. }
  868. }
  869. } else {
  870. pr_debug("[LCM][ERROR] %s/%d: DTS is not parsed\n", __func__, __LINE__);
  871. return;
  872. }
  873. }
  874. unsigned int lcm_common_compare_id(void)
  875. {
  876. unsigned int compare = 0;
  877. if (_LCM_DTS.compare_id_size > 32) {
  878. pr_debug("[LCM][ERROR] %s/%d: Init table overflow %d\n", __func__, __LINE__,
  879. _LCM_DTS.init_size);
  880. return 0;
  881. }
  882. if (_LCM_DTS.parsing != 0) {
  883. unsigned int i;
  884. LCM_DATA *compare_id;
  885. lcm_common_init();
  886. for (i = 0; i < _LCM_DTS.compare_id_size; i++) {
  887. compare_id = &(_LCM_DTS.compare_id[i]);
  888. switch (compare_id->func) {
  889. case LCM_FUNC_GPIO:
  890. lcm_gpio_set_data(compare_id->type, &compare_id->data_t1);
  891. break;
  892. case LCM_FUNC_I2C:
  893. lcm_i2c_set_data(compare_id->type, &compare_id->data_t2);
  894. break;
  895. case LCM_FUNC_UTIL:
  896. lcm_util_set_data(&lcm_util, compare_id->type,
  897. &compare_id->data_t1);
  898. break;
  899. case LCM_FUNC_CMD:
  900. switch (compare_id->type) {
  901. case LCM_UTIL_WRITE_CMD_V1:
  902. lcm_util_set_write_cmd_v1(&lcm_util, &compare_id->data_t5,
  903. 1);
  904. break;
  905. case LCM_UTIL_WRITE_CMD_V2:
  906. lcm_util_set_write_cmd_v2(&lcm_util, &compare_id->data_t3,
  907. 1);
  908. break;
  909. case LCM_UTIL_READ_CMD_V2:
  910. lcm_util_set_read_cmd_v2(&lcm_util, &compare_id->data_t4,
  911. &compare);
  912. break;
  913. default:
  914. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  915. compare_id->type);
  916. return 0;
  917. }
  918. break;
  919. default:
  920. pr_debug("[LCM][ERROR] %s/%d: %d\n", __func__, __LINE__,
  921. compare_id->func);
  922. return 0;
  923. }
  924. }
  925. } else {
  926. pr_debug("[LCM][ERROR] %s/%d: DTS is not parsed\n", __func__, __LINE__);
  927. return 0;
  928. }
  929. if (compare == 1)
  930. return 1;
  931. else
  932. return 0;
  933. }
  934. LCM_DRIVER lcm_common_drv = {
  935. .name = NULL,
  936. .set_util_funcs = lcm_common_set_util_funcs,
  937. .get_params = lcm_common_get_params,
  938. .init = lcm_common_init,
  939. .suspend = lcm_common_suspend,
  940. .resume = lcm_common_resume,
  941. .compare_id = lcm_common_compare_id,
  942. .set_backlight = lcm_common_setbacklight,
  943. .update = lcm_common_update,
  944. .parse_dts = lcm_common_parse_dts,
  945. };
  946. #endif