panel-ilitek-ili9881c.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2017-2018, Bootlin
  4. */
  5. #include <linux/delay.h>
  6. #include <linux/device.h>
  7. #include <linux/err.h>
  8. #include <linux/errno.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/regulator/consumer.h>
  14. #include <drm/drm_mipi_dsi.h>
  15. #include <drm/drm_modes.h>
  16. #include <drm/drm_panel.h>
  17. #include <video/mipi_display.h>
  18. enum ili9881c_op {
  19. ILI9881C_SWITCH_PAGE,
  20. ILI9881C_COMMAND,
  21. };
  22. struct ili9881c_instr {
  23. enum ili9881c_op op;
  24. union arg {
  25. struct cmd {
  26. u8 cmd;
  27. u8 data;
  28. } cmd;
  29. u8 page;
  30. } arg;
  31. };
  32. struct ili9881c_desc {
  33. const struct ili9881c_instr *init;
  34. const size_t init_length;
  35. const struct drm_display_mode *mode;
  36. const unsigned long mode_flags;
  37. };
  38. struct ili9881c {
  39. struct drm_panel panel;
  40. struct mipi_dsi_device *dsi;
  41. const struct ili9881c_desc *desc;
  42. struct regulator *power;
  43. struct gpio_desc *reset;
  44. enum drm_panel_orientation orientation;
  45. };
  46. #define ILI9881C_SWITCH_PAGE_INSTR(_page) \
  47. { \
  48. .op = ILI9881C_SWITCH_PAGE, \
  49. .arg = { \
  50. .page = (_page), \
  51. }, \
  52. }
  53. #define ILI9881C_COMMAND_INSTR(_cmd, _data) \
  54. { \
  55. .op = ILI9881C_COMMAND, \
  56. .arg = { \
  57. .cmd = { \
  58. .cmd = (_cmd), \
  59. .data = (_data), \
  60. }, \
  61. }, \
  62. }
  63. static const struct ili9881c_instr lhr050h41_init[] = {
  64. ILI9881C_SWITCH_PAGE_INSTR(3),
  65. ILI9881C_COMMAND_INSTR(0x01, 0x00),
  66. ILI9881C_COMMAND_INSTR(0x02, 0x00),
  67. ILI9881C_COMMAND_INSTR(0x03, 0x73),
  68. ILI9881C_COMMAND_INSTR(0x04, 0x03),
  69. ILI9881C_COMMAND_INSTR(0x05, 0x00),
  70. ILI9881C_COMMAND_INSTR(0x06, 0x06),
  71. ILI9881C_COMMAND_INSTR(0x07, 0x06),
  72. ILI9881C_COMMAND_INSTR(0x08, 0x00),
  73. ILI9881C_COMMAND_INSTR(0x09, 0x18),
  74. ILI9881C_COMMAND_INSTR(0x0a, 0x04),
  75. ILI9881C_COMMAND_INSTR(0x0b, 0x00),
  76. ILI9881C_COMMAND_INSTR(0x0c, 0x02),
  77. ILI9881C_COMMAND_INSTR(0x0d, 0x03),
  78. ILI9881C_COMMAND_INSTR(0x0e, 0x00),
  79. ILI9881C_COMMAND_INSTR(0x0f, 0x25),
  80. ILI9881C_COMMAND_INSTR(0x10, 0x25),
  81. ILI9881C_COMMAND_INSTR(0x11, 0x00),
  82. ILI9881C_COMMAND_INSTR(0x12, 0x00),
  83. ILI9881C_COMMAND_INSTR(0x13, 0x00),
  84. ILI9881C_COMMAND_INSTR(0x14, 0x00),
  85. ILI9881C_COMMAND_INSTR(0x15, 0x00),
  86. ILI9881C_COMMAND_INSTR(0x16, 0x0C),
  87. ILI9881C_COMMAND_INSTR(0x17, 0x00),
  88. ILI9881C_COMMAND_INSTR(0x18, 0x00),
  89. ILI9881C_COMMAND_INSTR(0x19, 0x00),
  90. ILI9881C_COMMAND_INSTR(0x1a, 0x00),
  91. ILI9881C_COMMAND_INSTR(0x1b, 0x00),
  92. ILI9881C_COMMAND_INSTR(0x1c, 0x00),
  93. ILI9881C_COMMAND_INSTR(0x1d, 0x00),
  94. ILI9881C_COMMAND_INSTR(0x1e, 0xC0),
  95. ILI9881C_COMMAND_INSTR(0x1f, 0x80),
  96. ILI9881C_COMMAND_INSTR(0x20, 0x04),
  97. ILI9881C_COMMAND_INSTR(0x21, 0x01),
  98. ILI9881C_COMMAND_INSTR(0x22, 0x00),
  99. ILI9881C_COMMAND_INSTR(0x23, 0x00),
  100. ILI9881C_COMMAND_INSTR(0x24, 0x00),
  101. ILI9881C_COMMAND_INSTR(0x25, 0x00),
  102. ILI9881C_COMMAND_INSTR(0x26, 0x00),
  103. ILI9881C_COMMAND_INSTR(0x27, 0x00),
  104. ILI9881C_COMMAND_INSTR(0x28, 0x33),
  105. ILI9881C_COMMAND_INSTR(0x29, 0x03),
  106. ILI9881C_COMMAND_INSTR(0x2a, 0x00),
  107. ILI9881C_COMMAND_INSTR(0x2b, 0x00),
  108. ILI9881C_COMMAND_INSTR(0x2c, 0x00),
  109. ILI9881C_COMMAND_INSTR(0x2d, 0x00),
  110. ILI9881C_COMMAND_INSTR(0x2e, 0x00),
  111. ILI9881C_COMMAND_INSTR(0x2f, 0x00),
  112. ILI9881C_COMMAND_INSTR(0x30, 0x00),
  113. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  114. ILI9881C_COMMAND_INSTR(0x32, 0x00),
  115. ILI9881C_COMMAND_INSTR(0x33, 0x00),
  116. ILI9881C_COMMAND_INSTR(0x34, 0x04),
  117. ILI9881C_COMMAND_INSTR(0x35, 0x00),
  118. ILI9881C_COMMAND_INSTR(0x36, 0x00),
  119. ILI9881C_COMMAND_INSTR(0x37, 0x00),
  120. ILI9881C_COMMAND_INSTR(0x38, 0x3C),
  121. ILI9881C_COMMAND_INSTR(0x39, 0x00),
  122. ILI9881C_COMMAND_INSTR(0x3a, 0x00),
  123. ILI9881C_COMMAND_INSTR(0x3b, 0x00),
  124. ILI9881C_COMMAND_INSTR(0x3c, 0x00),
  125. ILI9881C_COMMAND_INSTR(0x3d, 0x00),
  126. ILI9881C_COMMAND_INSTR(0x3e, 0x00),
  127. ILI9881C_COMMAND_INSTR(0x3f, 0x00),
  128. ILI9881C_COMMAND_INSTR(0x40, 0x00),
  129. ILI9881C_COMMAND_INSTR(0x41, 0x00),
  130. ILI9881C_COMMAND_INSTR(0x42, 0x00),
  131. ILI9881C_COMMAND_INSTR(0x43, 0x00),
  132. ILI9881C_COMMAND_INSTR(0x44, 0x00),
  133. ILI9881C_COMMAND_INSTR(0x50, 0x01),
  134. ILI9881C_COMMAND_INSTR(0x51, 0x23),
  135. ILI9881C_COMMAND_INSTR(0x52, 0x45),
  136. ILI9881C_COMMAND_INSTR(0x53, 0x67),
  137. ILI9881C_COMMAND_INSTR(0x54, 0x89),
  138. ILI9881C_COMMAND_INSTR(0x55, 0xab),
  139. ILI9881C_COMMAND_INSTR(0x56, 0x01),
  140. ILI9881C_COMMAND_INSTR(0x57, 0x23),
  141. ILI9881C_COMMAND_INSTR(0x58, 0x45),
  142. ILI9881C_COMMAND_INSTR(0x59, 0x67),
  143. ILI9881C_COMMAND_INSTR(0x5a, 0x89),
  144. ILI9881C_COMMAND_INSTR(0x5b, 0xab),
  145. ILI9881C_COMMAND_INSTR(0x5c, 0xcd),
  146. ILI9881C_COMMAND_INSTR(0x5d, 0xef),
  147. ILI9881C_COMMAND_INSTR(0x5e, 0x11),
  148. ILI9881C_COMMAND_INSTR(0x5f, 0x02),
  149. ILI9881C_COMMAND_INSTR(0x60, 0x02),
  150. ILI9881C_COMMAND_INSTR(0x61, 0x02),
  151. ILI9881C_COMMAND_INSTR(0x62, 0x02),
  152. ILI9881C_COMMAND_INSTR(0x63, 0x02),
  153. ILI9881C_COMMAND_INSTR(0x64, 0x02),
  154. ILI9881C_COMMAND_INSTR(0x65, 0x02),
  155. ILI9881C_COMMAND_INSTR(0x66, 0x02),
  156. ILI9881C_COMMAND_INSTR(0x67, 0x02),
  157. ILI9881C_COMMAND_INSTR(0x68, 0x02),
  158. ILI9881C_COMMAND_INSTR(0x69, 0x02),
  159. ILI9881C_COMMAND_INSTR(0x6a, 0x0C),
  160. ILI9881C_COMMAND_INSTR(0x6b, 0x02),
  161. ILI9881C_COMMAND_INSTR(0x6c, 0x0F),
  162. ILI9881C_COMMAND_INSTR(0x6d, 0x0E),
  163. ILI9881C_COMMAND_INSTR(0x6e, 0x0D),
  164. ILI9881C_COMMAND_INSTR(0x6f, 0x06),
  165. ILI9881C_COMMAND_INSTR(0x70, 0x07),
  166. ILI9881C_COMMAND_INSTR(0x71, 0x02),
  167. ILI9881C_COMMAND_INSTR(0x72, 0x02),
  168. ILI9881C_COMMAND_INSTR(0x73, 0x02),
  169. ILI9881C_COMMAND_INSTR(0x74, 0x02),
  170. ILI9881C_COMMAND_INSTR(0x75, 0x02),
  171. ILI9881C_COMMAND_INSTR(0x76, 0x02),
  172. ILI9881C_COMMAND_INSTR(0x77, 0x02),
  173. ILI9881C_COMMAND_INSTR(0x78, 0x02),
  174. ILI9881C_COMMAND_INSTR(0x79, 0x02),
  175. ILI9881C_COMMAND_INSTR(0x7a, 0x02),
  176. ILI9881C_COMMAND_INSTR(0x7b, 0x02),
  177. ILI9881C_COMMAND_INSTR(0x7c, 0x02),
  178. ILI9881C_COMMAND_INSTR(0x7d, 0x02),
  179. ILI9881C_COMMAND_INSTR(0x7e, 0x02),
  180. ILI9881C_COMMAND_INSTR(0x7f, 0x02),
  181. ILI9881C_COMMAND_INSTR(0x80, 0x0C),
  182. ILI9881C_COMMAND_INSTR(0x81, 0x02),
  183. ILI9881C_COMMAND_INSTR(0x82, 0x0F),
  184. ILI9881C_COMMAND_INSTR(0x83, 0x0E),
  185. ILI9881C_COMMAND_INSTR(0x84, 0x0D),
  186. ILI9881C_COMMAND_INSTR(0x85, 0x06),
  187. ILI9881C_COMMAND_INSTR(0x86, 0x07),
  188. ILI9881C_COMMAND_INSTR(0x87, 0x02),
  189. ILI9881C_COMMAND_INSTR(0x88, 0x02),
  190. ILI9881C_COMMAND_INSTR(0x89, 0x02),
  191. ILI9881C_COMMAND_INSTR(0x8A, 0x02),
  192. ILI9881C_SWITCH_PAGE_INSTR(4),
  193. ILI9881C_COMMAND_INSTR(0x6C, 0x15),
  194. ILI9881C_COMMAND_INSTR(0x6E, 0x22),
  195. ILI9881C_COMMAND_INSTR(0x6F, 0x33),
  196. ILI9881C_COMMAND_INSTR(0x3A, 0xA4),
  197. ILI9881C_COMMAND_INSTR(0x8D, 0x0D),
  198. ILI9881C_COMMAND_INSTR(0x87, 0xBA),
  199. ILI9881C_COMMAND_INSTR(0x26, 0x76),
  200. ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
  201. ILI9881C_SWITCH_PAGE_INSTR(1),
  202. ILI9881C_COMMAND_INSTR(0x22, 0x0A),
  203. ILI9881C_COMMAND_INSTR(0x53, 0xDC),
  204. ILI9881C_COMMAND_INSTR(0x55, 0xA7),
  205. ILI9881C_COMMAND_INSTR(0x50, 0x78),
  206. ILI9881C_COMMAND_INSTR(0x51, 0x78),
  207. ILI9881C_COMMAND_INSTR(0x31, 0x02),
  208. ILI9881C_COMMAND_INSTR(0x60, 0x14),
  209. ILI9881C_COMMAND_INSTR(0xA0, 0x2A),
  210. ILI9881C_COMMAND_INSTR(0xA1, 0x39),
  211. ILI9881C_COMMAND_INSTR(0xA2, 0x46),
  212. ILI9881C_COMMAND_INSTR(0xA3, 0x0e),
  213. ILI9881C_COMMAND_INSTR(0xA4, 0x12),
  214. ILI9881C_COMMAND_INSTR(0xA5, 0x25),
  215. ILI9881C_COMMAND_INSTR(0xA6, 0x19),
  216. ILI9881C_COMMAND_INSTR(0xA7, 0x1d),
  217. ILI9881C_COMMAND_INSTR(0xA8, 0xa6),
  218. ILI9881C_COMMAND_INSTR(0xA9, 0x1C),
  219. ILI9881C_COMMAND_INSTR(0xAA, 0x29),
  220. ILI9881C_COMMAND_INSTR(0xAB, 0x85),
  221. ILI9881C_COMMAND_INSTR(0xAC, 0x1C),
  222. ILI9881C_COMMAND_INSTR(0xAD, 0x1B),
  223. ILI9881C_COMMAND_INSTR(0xAE, 0x51),
  224. ILI9881C_COMMAND_INSTR(0xAF, 0x22),
  225. ILI9881C_COMMAND_INSTR(0xB0, 0x2d),
  226. ILI9881C_COMMAND_INSTR(0xB1, 0x4f),
  227. ILI9881C_COMMAND_INSTR(0xB2, 0x59),
  228. ILI9881C_COMMAND_INSTR(0xB3, 0x3F),
  229. ILI9881C_COMMAND_INSTR(0xC0, 0x2A),
  230. ILI9881C_COMMAND_INSTR(0xC1, 0x3a),
  231. ILI9881C_COMMAND_INSTR(0xC2, 0x45),
  232. ILI9881C_COMMAND_INSTR(0xC3, 0x0e),
  233. ILI9881C_COMMAND_INSTR(0xC4, 0x11),
  234. ILI9881C_COMMAND_INSTR(0xC5, 0x24),
  235. ILI9881C_COMMAND_INSTR(0xC6, 0x1a),
  236. ILI9881C_COMMAND_INSTR(0xC7, 0x1c),
  237. ILI9881C_COMMAND_INSTR(0xC8, 0xaa),
  238. ILI9881C_COMMAND_INSTR(0xC9, 0x1C),
  239. ILI9881C_COMMAND_INSTR(0xCA, 0x29),
  240. ILI9881C_COMMAND_INSTR(0xCB, 0x96),
  241. ILI9881C_COMMAND_INSTR(0xCC, 0x1C),
  242. ILI9881C_COMMAND_INSTR(0xCD, 0x1B),
  243. ILI9881C_COMMAND_INSTR(0xCE, 0x51),
  244. ILI9881C_COMMAND_INSTR(0xCF, 0x22),
  245. ILI9881C_COMMAND_INSTR(0xD0, 0x2b),
  246. ILI9881C_COMMAND_INSTR(0xD1, 0x4b),
  247. ILI9881C_COMMAND_INSTR(0xD2, 0x59),
  248. ILI9881C_COMMAND_INSTR(0xD3, 0x3F),
  249. };
  250. static const struct ili9881c_instr k101_im2byl02_init[] = {
  251. ILI9881C_SWITCH_PAGE_INSTR(3),
  252. ILI9881C_COMMAND_INSTR(0x01, 0x00),
  253. ILI9881C_COMMAND_INSTR(0x02, 0x00),
  254. ILI9881C_COMMAND_INSTR(0x03, 0x73),
  255. ILI9881C_COMMAND_INSTR(0x04, 0x00),
  256. ILI9881C_COMMAND_INSTR(0x05, 0x00),
  257. ILI9881C_COMMAND_INSTR(0x06, 0x08),
  258. ILI9881C_COMMAND_INSTR(0x07, 0x00),
  259. ILI9881C_COMMAND_INSTR(0x08, 0x00),
  260. ILI9881C_COMMAND_INSTR(0x09, 0x00),
  261. ILI9881C_COMMAND_INSTR(0x0A, 0x01),
  262. ILI9881C_COMMAND_INSTR(0x0B, 0x01),
  263. ILI9881C_COMMAND_INSTR(0x0C, 0x00),
  264. ILI9881C_COMMAND_INSTR(0x0D, 0x01),
  265. ILI9881C_COMMAND_INSTR(0x0E, 0x01),
  266. ILI9881C_COMMAND_INSTR(0x0F, 0x00),
  267. ILI9881C_COMMAND_INSTR(0x10, 0x00),
  268. ILI9881C_COMMAND_INSTR(0x11, 0x00),
  269. ILI9881C_COMMAND_INSTR(0x12, 0x00),
  270. ILI9881C_COMMAND_INSTR(0x13, 0x00),
  271. ILI9881C_COMMAND_INSTR(0x14, 0x00),
  272. ILI9881C_COMMAND_INSTR(0x15, 0x00),
  273. ILI9881C_COMMAND_INSTR(0x16, 0x00),
  274. ILI9881C_COMMAND_INSTR(0x17, 0x00),
  275. ILI9881C_COMMAND_INSTR(0x18, 0x00),
  276. ILI9881C_COMMAND_INSTR(0x19, 0x00),
  277. ILI9881C_COMMAND_INSTR(0x1A, 0x00),
  278. ILI9881C_COMMAND_INSTR(0x1B, 0x00),
  279. ILI9881C_COMMAND_INSTR(0x1C, 0x00),
  280. ILI9881C_COMMAND_INSTR(0x1D, 0x00),
  281. ILI9881C_COMMAND_INSTR(0x1E, 0x40),
  282. ILI9881C_COMMAND_INSTR(0x1F, 0xC0),
  283. ILI9881C_COMMAND_INSTR(0x20, 0x06),
  284. ILI9881C_COMMAND_INSTR(0x21, 0x01),
  285. ILI9881C_COMMAND_INSTR(0x22, 0x06),
  286. ILI9881C_COMMAND_INSTR(0x23, 0x01),
  287. ILI9881C_COMMAND_INSTR(0x24, 0x88),
  288. ILI9881C_COMMAND_INSTR(0x25, 0x88),
  289. ILI9881C_COMMAND_INSTR(0x26, 0x00),
  290. ILI9881C_COMMAND_INSTR(0x27, 0x00),
  291. ILI9881C_COMMAND_INSTR(0x28, 0x3B),
  292. ILI9881C_COMMAND_INSTR(0x29, 0x03),
  293. ILI9881C_COMMAND_INSTR(0x2A, 0x00),
  294. ILI9881C_COMMAND_INSTR(0x2B, 0x00),
  295. ILI9881C_COMMAND_INSTR(0x2C, 0x00),
  296. ILI9881C_COMMAND_INSTR(0x2D, 0x00),
  297. ILI9881C_COMMAND_INSTR(0x2E, 0x00),
  298. ILI9881C_COMMAND_INSTR(0x2F, 0x00),
  299. ILI9881C_COMMAND_INSTR(0x30, 0x00),
  300. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  301. ILI9881C_COMMAND_INSTR(0x32, 0x00),
  302. ILI9881C_COMMAND_INSTR(0x33, 0x00),
  303. ILI9881C_COMMAND_INSTR(0x34, 0x00), /* GPWR1/2 non overlap time 2.62us */
  304. ILI9881C_COMMAND_INSTR(0x35, 0x00),
  305. ILI9881C_COMMAND_INSTR(0x36, 0x00),
  306. ILI9881C_COMMAND_INSTR(0x37, 0x00),
  307. ILI9881C_COMMAND_INSTR(0x38, 0x00),
  308. ILI9881C_COMMAND_INSTR(0x39, 0x00),
  309. ILI9881C_COMMAND_INSTR(0x3A, 0x00),
  310. ILI9881C_COMMAND_INSTR(0x3B, 0x00),
  311. ILI9881C_COMMAND_INSTR(0x3C, 0x00),
  312. ILI9881C_COMMAND_INSTR(0x3D, 0x00),
  313. ILI9881C_COMMAND_INSTR(0x3E, 0x00),
  314. ILI9881C_COMMAND_INSTR(0x3F, 0x00),
  315. ILI9881C_COMMAND_INSTR(0x40, 0x00),
  316. ILI9881C_COMMAND_INSTR(0x41, 0x00),
  317. ILI9881C_COMMAND_INSTR(0x42, 0x00),
  318. ILI9881C_COMMAND_INSTR(0x43, 0x00),
  319. ILI9881C_COMMAND_INSTR(0x44, 0x00),
  320. ILI9881C_COMMAND_INSTR(0x50, 0x01),
  321. ILI9881C_COMMAND_INSTR(0x51, 0x23),
  322. ILI9881C_COMMAND_INSTR(0x52, 0x45),
  323. ILI9881C_COMMAND_INSTR(0x53, 0x67),
  324. ILI9881C_COMMAND_INSTR(0x54, 0x89),
  325. ILI9881C_COMMAND_INSTR(0x55, 0xAB),
  326. ILI9881C_COMMAND_INSTR(0x56, 0x01),
  327. ILI9881C_COMMAND_INSTR(0x57, 0x23),
  328. ILI9881C_COMMAND_INSTR(0x58, 0x45),
  329. ILI9881C_COMMAND_INSTR(0x59, 0x67),
  330. ILI9881C_COMMAND_INSTR(0x5A, 0x89),
  331. ILI9881C_COMMAND_INSTR(0x5B, 0xAB),
  332. ILI9881C_COMMAND_INSTR(0x5C, 0xCD),
  333. ILI9881C_COMMAND_INSTR(0x5D, 0xEF),
  334. ILI9881C_COMMAND_INSTR(0x5E, 0x00),
  335. ILI9881C_COMMAND_INSTR(0x5F, 0x01),
  336. ILI9881C_COMMAND_INSTR(0x60, 0x01),
  337. ILI9881C_COMMAND_INSTR(0x61, 0x06),
  338. ILI9881C_COMMAND_INSTR(0x62, 0x06),
  339. ILI9881C_COMMAND_INSTR(0x63, 0x07),
  340. ILI9881C_COMMAND_INSTR(0x64, 0x07),
  341. ILI9881C_COMMAND_INSTR(0x65, 0x00),
  342. ILI9881C_COMMAND_INSTR(0x66, 0x00),
  343. ILI9881C_COMMAND_INSTR(0x67, 0x02),
  344. ILI9881C_COMMAND_INSTR(0x68, 0x02),
  345. ILI9881C_COMMAND_INSTR(0x69, 0x05),
  346. ILI9881C_COMMAND_INSTR(0x6A, 0x05),
  347. ILI9881C_COMMAND_INSTR(0x6B, 0x02),
  348. ILI9881C_COMMAND_INSTR(0x6C, 0x0D),
  349. ILI9881C_COMMAND_INSTR(0x6D, 0x0D),
  350. ILI9881C_COMMAND_INSTR(0x6E, 0x0C),
  351. ILI9881C_COMMAND_INSTR(0x6F, 0x0C),
  352. ILI9881C_COMMAND_INSTR(0x70, 0x0F),
  353. ILI9881C_COMMAND_INSTR(0x71, 0x0F),
  354. ILI9881C_COMMAND_INSTR(0x72, 0x0E),
  355. ILI9881C_COMMAND_INSTR(0x73, 0x0E),
  356. ILI9881C_COMMAND_INSTR(0x74, 0x02),
  357. ILI9881C_COMMAND_INSTR(0x75, 0x01),
  358. ILI9881C_COMMAND_INSTR(0x76, 0x01),
  359. ILI9881C_COMMAND_INSTR(0x77, 0x06),
  360. ILI9881C_COMMAND_INSTR(0x78, 0x06),
  361. ILI9881C_COMMAND_INSTR(0x79, 0x07),
  362. ILI9881C_COMMAND_INSTR(0x7A, 0x07),
  363. ILI9881C_COMMAND_INSTR(0x7B, 0x00),
  364. ILI9881C_COMMAND_INSTR(0x7C, 0x00),
  365. ILI9881C_COMMAND_INSTR(0x7D, 0x02),
  366. ILI9881C_COMMAND_INSTR(0x7E, 0x02),
  367. ILI9881C_COMMAND_INSTR(0x7F, 0x05),
  368. ILI9881C_COMMAND_INSTR(0x80, 0x05),
  369. ILI9881C_COMMAND_INSTR(0x81, 0x02),
  370. ILI9881C_COMMAND_INSTR(0x82, 0x0D),
  371. ILI9881C_COMMAND_INSTR(0x83, 0x0D),
  372. ILI9881C_COMMAND_INSTR(0x84, 0x0C),
  373. ILI9881C_COMMAND_INSTR(0x85, 0x0C),
  374. ILI9881C_COMMAND_INSTR(0x86, 0x0F),
  375. ILI9881C_COMMAND_INSTR(0x87, 0x0F),
  376. ILI9881C_COMMAND_INSTR(0x88, 0x0E),
  377. ILI9881C_COMMAND_INSTR(0x89, 0x0E),
  378. ILI9881C_COMMAND_INSTR(0x8A, 0x02),
  379. ILI9881C_SWITCH_PAGE_INSTR(4),
  380. ILI9881C_COMMAND_INSTR(0x3B, 0xC0), /* ILI4003D sel */
  381. ILI9881C_COMMAND_INSTR(0x6C, 0x15), /* Set VCORE voltage = 1.5V */
  382. ILI9881C_COMMAND_INSTR(0x6E, 0x2A), /* di_pwr_reg=0 for power mode 2A, VGH clamp 18V */
  383. ILI9881C_COMMAND_INSTR(0x6F, 0x33), /* pumping ratio VGH=5x VGL=-3x */
  384. ILI9881C_COMMAND_INSTR(0x8D, 0x1B), /* VGL clamp -10V */
  385. ILI9881C_COMMAND_INSTR(0x87, 0xBA), /* ESD */
  386. ILI9881C_COMMAND_INSTR(0x3A, 0x24), /* POWER SAVING */
  387. ILI9881C_COMMAND_INSTR(0x26, 0x76),
  388. ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
  389. ILI9881C_SWITCH_PAGE_INSTR(1),
  390. ILI9881C_COMMAND_INSTR(0x22, 0x0A), /* BGR, SS */
  391. ILI9881C_COMMAND_INSTR(0x31, 0x00), /* Zigzag type3 inversion */
  392. ILI9881C_COMMAND_INSTR(0x40, 0x53), /* ILI4003D sel */
  393. ILI9881C_COMMAND_INSTR(0x43, 0x66),
  394. ILI9881C_COMMAND_INSTR(0x53, 0x4C),
  395. ILI9881C_COMMAND_INSTR(0x50, 0x87),
  396. ILI9881C_COMMAND_INSTR(0x51, 0x82),
  397. ILI9881C_COMMAND_INSTR(0x60, 0x15),
  398. ILI9881C_COMMAND_INSTR(0x61, 0x01),
  399. ILI9881C_COMMAND_INSTR(0x62, 0x0C),
  400. ILI9881C_COMMAND_INSTR(0x63, 0x00),
  401. ILI9881C_COMMAND_INSTR(0xA0, 0x00),
  402. ILI9881C_COMMAND_INSTR(0xA1, 0x13), /* VP251 */
  403. ILI9881C_COMMAND_INSTR(0xA2, 0x23), /* VP247 */
  404. ILI9881C_COMMAND_INSTR(0xA3, 0x14), /* VP243 */
  405. ILI9881C_COMMAND_INSTR(0xA4, 0x16), /* VP239 */
  406. ILI9881C_COMMAND_INSTR(0xA5, 0x29), /* VP231 */
  407. ILI9881C_COMMAND_INSTR(0xA6, 0x1E), /* VP219 */
  408. ILI9881C_COMMAND_INSTR(0xA7, 0x1D), /* VP203 */
  409. ILI9881C_COMMAND_INSTR(0xA8, 0x86), /* VP175 */
  410. ILI9881C_COMMAND_INSTR(0xA9, 0x1E), /* VP144 */
  411. ILI9881C_COMMAND_INSTR(0xAA, 0x29), /* VP111 */
  412. ILI9881C_COMMAND_INSTR(0xAB, 0x74), /* VP80 */
  413. ILI9881C_COMMAND_INSTR(0xAC, 0x19), /* VP52 */
  414. ILI9881C_COMMAND_INSTR(0xAD, 0x17), /* VP36 */
  415. ILI9881C_COMMAND_INSTR(0xAE, 0x4B), /* VP24 */
  416. ILI9881C_COMMAND_INSTR(0xAF, 0x20), /* VP16 */
  417. ILI9881C_COMMAND_INSTR(0xB0, 0x26), /* VP12 */
  418. ILI9881C_COMMAND_INSTR(0xB1, 0x4C), /* VP8 */
  419. ILI9881C_COMMAND_INSTR(0xB2, 0x5D), /* VP4 */
  420. ILI9881C_COMMAND_INSTR(0xB3, 0x3F), /* VP0 */
  421. ILI9881C_COMMAND_INSTR(0xC0, 0x00), /* VN255 GAMMA N */
  422. ILI9881C_COMMAND_INSTR(0xC1, 0x13), /* VN251 */
  423. ILI9881C_COMMAND_INSTR(0xC2, 0x23), /* VN247 */
  424. ILI9881C_COMMAND_INSTR(0xC3, 0x14), /* VN243 */
  425. ILI9881C_COMMAND_INSTR(0xC4, 0x16), /* VN239 */
  426. ILI9881C_COMMAND_INSTR(0xC5, 0x29), /* VN231 */
  427. ILI9881C_COMMAND_INSTR(0xC6, 0x1E), /* VN219 */
  428. ILI9881C_COMMAND_INSTR(0xC7, 0x1D), /* VN203 */
  429. ILI9881C_COMMAND_INSTR(0xC8, 0x86), /* VN175 */
  430. ILI9881C_COMMAND_INSTR(0xC9, 0x1E), /* VN144 */
  431. ILI9881C_COMMAND_INSTR(0xCA, 0x29), /* VN111 */
  432. ILI9881C_COMMAND_INSTR(0xCB, 0x74), /* VN80 */
  433. ILI9881C_COMMAND_INSTR(0xCC, 0x19), /* VN52 */
  434. ILI9881C_COMMAND_INSTR(0xCD, 0x17), /* VN36 */
  435. ILI9881C_COMMAND_INSTR(0xCE, 0x4B), /* VN24 */
  436. ILI9881C_COMMAND_INSTR(0xCF, 0x20), /* VN16 */
  437. ILI9881C_COMMAND_INSTR(0xD0, 0x26), /* VN12 */
  438. ILI9881C_COMMAND_INSTR(0xD1, 0x4C), /* VN8 */
  439. ILI9881C_COMMAND_INSTR(0xD2, 0x5D), /* VN4 */
  440. ILI9881C_COMMAND_INSTR(0xD3, 0x3F), /* VN0 */
  441. };
  442. static const struct ili9881c_instr kd050hdfia020_init[] = {
  443. ILI9881C_SWITCH_PAGE_INSTR(3),
  444. ILI9881C_COMMAND_INSTR(0x01, 0x00),
  445. ILI9881C_COMMAND_INSTR(0x02, 0x00),
  446. ILI9881C_COMMAND_INSTR(0x03, 0x72),
  447. ILI9881C_COMMAND_INSTR(0x04, 0x00),
  448. ILI9881C_COMMAND_INSTR(0x05, 0x00),
  449. ILI9881C_COMMAND_INSTR(0x06, 0x09),
  450. ILI9881C_COMMAND_INSTR(0x07, 0x00),
  451. ILI9881C_COMMAND_INSTR(0x08, 0x00),
  452. ILI9881C_COMMAND_INSTR(0x09, 0x01),
  453. ILI9881C_COMMAND_INSTR(0x0a, 0x00),
  454. ILI9881C_COMMAND_INSTR(0x0b, 0x00),
  455. ILI9881C_COMMAND_INSTR(0x0c, 0x01),
  456. ILI9881C_COMMAND_INSTR(0x0d, 0x00),
  457. ILI9881C_COMMAND_INSTR(0x0e, 0x00),
  458. ILI9881C_COMMAND_INSTR(0x0f, 0x00),
  459. ILI9881C_COMMAND_INSTR(0x10, 0x00),
  460. ILI9881C_COMMAND_INSTR(0x11, 0x00),
  461. ILI9881C_COMMAND_INSTR(0x12, 0x00),
  462. ILI9881C_COMMAND_INSTR(0x13, 0x00),
  463. ILI9881C_COMMAND_INSTR(0x14, 0x00),
  464. ILI9881C_COMMAND_INSTR(0x15, 0x00),
  465. ILI9881C_COMMAND_INSTR(0x16, 0x00),
  466. ILI9881C_COMMAND_INSTR(0x17, 0x00),
  467. ILI9881C_COMMAND_INSTR(0x18, 0x00),
  468. ILI9881C_COMMAND_INSTR(0x19, 0x00),
  469. ILI9881C_COMMAND_INSTR(0x1a, 0x00),
  470. ILI9881C_COMMAND_INSTR(0x1b, 0x00),
  471. ILI9881C_COMMAND_INSTR(0x1c, 0x00),
  472. ILI9881C_COMMAND_INSTR(0x1d, 0x00),
  473. ILI9881C_COMMAND_INSTR(0x1e, 0x40),
  474. ILI9881C_COMMAND_INSTR(0x1f, 0x80),
  475. ILI9881C_COMMAND_INSTR(0x20, 0x05),
  476. ILI9881C_COMMAND_INSTR(0x20, 0x05),
  477. ILI9881C_COMMAND_INSTR(0x21, 0x02),
  478. ILI9881C_COMMAND_INSTR(0x22, 0x00),
  479. ILI9881C_COMMAND_INSTR(0x23, 0x00),
  480. ILI9881C_COMMAND_INSTR(0x24, 0x00),
  481. ILI9881C_COMMAND_INSTR(0x25, 0x00),
  482. ILI9881C_COMMAND_INSTR(0x26, 0x00),
  483. ILI9881C_COMMAND_INSTR(0x27, 0x00),
  484. ILI9881C_COMMAND_INSTR(0x28, 0x33),
  485. ILI9881C_COMMAND_INSTR(0x29, 0x02),
  486. ILI9881C_COMMAND_INSTR(0x2a, 0x00),
  487. ILI9881C_COMMAND_INSTR(0x2b, 0x00),
  488. ILI9881C_COMMAND_INSTR(0x2c, 0x00),
  489. ILI9881C_COMMAND_INSTR(0x2d, 0x00),
  490. ILI9881C_COMMAND_INSTR(0x2e, 0x00),
  491. ILI9881C_COMMAND_INSTR(0x2f, 0x00),
  492. ILI9881C_COMMAND_INSTR(0x30, 0x00),
  493. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  494. ILI9881C_COMMAND_INSTR(0x32, 0x00),
  495. ILI9881C_COMMAND_INSTR(0x32, 0x00),
  496. ILI9881C_COMMAND_INSTR(0x33, 0x00),
  497. ILI9881C_COMMAND_INSTR(0x34, 0x04),
  498. ILI9881C_COMMAND_INSTR(0x35, 0x00),
  499. ILI9881C_COMMAND_INSTR(0x36, 0x00),
  500. ILI9881C_COMMAND_INSTR(0x37, 0x00),
  501. ILI9881C_COMMAND_INSTR(0x38, 0x3C),
  502. ILI9881C_COMMAND_INSTR(0x39, 0x00),
  503. ILI9881C_COMMAND_INSTR(0x3a, 0x40),
  504. ILI9881C_COMMAND_INSTR(0x3b, 0x40),
  505. ILI9881C_COMMAND_INSTR(0x3c, 0x00),
  506. ILI9881C_COMMAND_INSTR(0x3d, 0x00),
  507. ILI9881C_COMMAND_INSTR(0x3e, 0x00),
  508. ILI9881C_COMMAND_INSTR(0x3f, 0x00),
  509. ILI9881C_COMMAND_INSTR(0x40, 0x00),
  510. ILI9881C_COMMAND_INSTR(0x41, 0x00),
  511. ILI9881C_COMMAND_INSTR(0x42, 0x00),
  512. ILI9881C_COMMAND_INSTR(0x43, 0x00),
  513. ILI9881C_COMMAND_INSTR(0x44, 0x00),
  514. ILI9881C_COMMAND_INSTR(0x50, 0x01),
  515. ILI9881C_COMMAND_INSTR(0x51, 0x23),
  516. ILI9881C_COMMAND_INSTR(0x52, 0x45),
  517. ILI9881C_COMMAND_INSTR(0x53, 0x67),
  518. ILI9881C_COMMAND_INSTR(0x54, 0x89),
  519. ILI9881C_COMMAND_INSTR(0x55, 0xab),
  520. ILI9881C_COMMAND_INSTR(0x56, 0x01),
  521. ILI9881C_COMMAND_INSTR(0x57, 0x23),
  522. ILI9881C_COMMAND_INSTR(0x58, 0x45),
  523. ILI9881C_COMMAND_INSTR(0x59, 0x67),
  524. ILI9881C_COMMAND_INSTR(0x5a, 0x89),
  525. ILI9881C_COMMAND_INSTR(0x5b, 0xab),
  526. ILI9881C_COMMAND_INSTR(0x5c, 0xcd),
  527. ILI9881C_COMMAND_INSTR(0x5d, 0xef),
  528. ILI9881C_COMMAND_INSTR(0x5e, 0x11),
  529. ILI9881C_COMMAND_INSTR(0x5f, 0x01),
  530. ILI9881C_COMMAND_INSTR(0x60, 0x00),
  531. ILI9881C_COMMAND_INSTR(0x61, 0x15),
  532. ILI9881C_COMMAND_INSTR(0x62, 0x14),
  533. ILI9881C_COMMAND_INSTR(0x63, 0x0E),
  534. ILI9881C_COMMAND_INSTR(0x64, 0x0F),
  535. ILI9881C_COMMAND_INSTR(0x65, 0x0C),
  536. ILI9881C_COMMAND_INSTR(0x66, 0x0D),
  537. ILI9881C_COMMAND_INSTR(0x67, 0x06),
  538. ILI9881C_COMMAND_INSTR(0x68, 0x02),
  539. ILI9881C_COMMAND_INSTR(0x69, 0x07),
  540. ILI9881C_COMMAND_INSTR(0x6a, 0x02),
  541. ILI9881C_COMMAND_INSTR(0x6b, 0x02),
  542. ILI9881C_COMMAND_INSTR(0x6c, 0x02),
  543. ILI9881C_COMMAND_INSTR(0x6d, 0x02),
  544. ILI9881C_COMMAND_INSTR(0x6e, 0x02),
  545. ILI9881C_COMMAND_INSTR(0x6f, 0x02),
  546. ILI9881C_COMMAND_INSTR(0x70, 0x02),
  547. ILI9881C_COMMAND_INSTR(0x71, 0x02),
  548. ILI9881C_COMMAND_INSTR(0x72, 0x02),
  549. ILI9881C_COMMAND_INSTR(0x73, 0x02),
  550. ILI9881C_COMMAND_INSTR(0x74, 0x02),
  551. ILI9881C_COMMAND_INSTR(0x75, 0x01),
  552. ILI9881C_COMMAND_INSTR(0x76, 0x00),
  553. ILI9881C_COMMAND_INSTR(0x77, 0x14),
  554. ILI9881C_COMMAND_INSTR(0x78, 0x15),
  555. ILI9881C_COMMAND_INSTR(0x79, 0x0E),
  556. ILI9881C_COMMAND_INSTR(0x7a, 0x0F),
  557. ILI9881C_COMMAND_INSTR(0x7b, 0x0C),
  558. ILI9881C_COMMAND_INSTR(0x7c, 0x0D),
  559. ILI9881C_COMMAND_INSTR(0x7d, 0x06),
  560. ILI9881C_COMMAND_INSTR(0x7e, 0x02),
  561. ILI9881C_COMMAND_INSTR(0x7f, 0x07),
  562. ILI9881C_COMMAND_INSTR(0x80, 0x02),
  563. ILI9881C_COMMAND_INSTR(0x81, 0x02),
  564. ILI9881C_COMMAND_INSTR(0x83, 0x02),
  565. ILI9881C_COMMAND_INSTR(0x84, 0x02),
  566. ILI9881C_COMMAND_INSTR(0x85, 0x02),
  567. ILI9881C_COMMAND_INSTR(0x86, 0x02),
  568. ILI9881C_COMMAND_INSTR(0x87, 0x02),
  569. ILI9881C_COMMAND_INSTR(0x88, 0x02),
  570. ILI9881C_COMMAND_INSTR(0x89, 0x02),
  571. ILI9881C_COMMAND_INSTR(0x8A, 0x02),
  572. ILI9881C_SWITCH_PAGE_INSTR(0x4),
  573. ILI9881C_COMMAND_INSTR(0x6C, 0x15),
  574. ILI9881C_COMMAND_INSTR(0x6E, 0x2A),
  575. ILI9881C_COMMAND_INSTR(0x6F, 0x33),
  576. ILI9881C_COMMAND_INSTR(0x3A, 0x94),
  577. ILI9881C_COMMAND_INSTR(0x8D, 0x15),
  578. ILI9881C_COMMAND_INSTR(0x87, 0xBA),
  579. ILI9881C_COMMAND_INSTR(0x26, 0x76),
  580. ILI9881C_COMMAND_INSTR(0xB2, 0xD1),
  581. ILI9881C_COMMAND_INSTR(0xB5, 0x06),
  582. ILI9881C_SWITCH_PAGE_INSTR(0x1),
  583. ILI9881C_COMMAND_INSTR(0x22, 0x0A),
  584. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  585. ILI9881C_COMMAND_INSTR(0x53, 0x90),
  586. ILI9881C_COMMAND_INSTR(0x55, 0xA2),
  587. ILI9881C_COMMAND_INSTR(0x50, 0xB7),
  588. ILI9881C_COMMAND_INSTR(0x51, 0xB7),
  589. ILI9881C_COMMAND_INSTR(0x60, 0x22),
  590. ILI9881C_COMMAND_INSTR(0x61, 0x00),
  591. ILI9881C_COMMAND_INSTR(0x62, 0x19),
  592. ILI9881C_COMMAND_INSTR(0x63, 0x10),
  593. ILI9881C_COMMAND_INSTR(0xA0, 0x08),
  594. ILI9881C_COMMAND_INSTR(0xA1, 0x1A),
  595. ILI9881C_COMMAND_INSTR(0xA2, 0x27),
  596. ILI9881C_COMMAND_INSTR(0xA3, 0x15),
  597. ILI9881C_COMMAND_INSTR(0xA4, 0x17),
  598. ILI9881C_COMMAND_INSTR(0xA5, 0x2A),
  599. ILI9881C_COMMAND_INSTR(0xA6, 0x1E),
  600. ILI9881C_COMMAND_INSTR(0xA7, 0x1F),
  601. ILI9881C_COMMAND_INSTR(0xA8, 0x8B),
  602. ILI9881C_COMMAND_INSTR(0xA9, 0x1B),
  603. ILI9881C_COMMAND_INSTR(0xAA, 0x27),
  604. ILI9881C_COMMAND_INSTR(0xAB, 0x78),
  605. ILI9881C_COMMAND_INSTR(0xAC, 0x18),
  606. ILI9881C_COMMAND_INSTR(0xAD, 0x18),
  607. ILI9881C_COMMAND_INSTR(0xAE, 0x4C),
  608. ILI9881C_COMMAND_INSTR(0xAF, 0x21),
  609. ILI9881C_COMMAND_INSTR(0xB0, 0x27),
  610. ILI9881C_COMMAND_INSTR(0xB1, 0x54),
  611. ILI9881C_COMMAND_INSTR(0xB2, 0x67),
  612. ILI9881C_COMMAND_INSTR(0xB3, 0x39),
  613. ILI9881C_COMMAND_INSTR(0xC0, 0x08),
  614. ILI9881C_COMMAND_INSTR(0xC1, 0x1A),
  615. ILI9881C_COMMAND_INSTR(0xC2, 0x27),
  616. ILI9881C_COMMAND_INSTR(0xC3, 0x15),
  617. ILI9881C_COMMAND_INSTR(0xC4, 0x17),
  618. ILI9881C_COMMAND_INSTR(0xC5, 0x2A),
  619. ILI9881C_COMMAND_INSTR(0xC6, 0x1E),
  620. ILI9881C_COMMAND_INSTR(0xC7, 0x1F),
  621. ILI9881C_COMMAND_INSTR(0xC8, 0x8B),
  622. ILI9881C_COMMAND_INSTR(0xC9, 0x1B),
  623. ILI9881C_COMMAND_INSTR(0xCA, 0x27),
  624. ILI9881C_COMMAND_INSTR(0xCB, 0x78),
  625. ILI9881C_COMMAND_INSTR(0xCC, 0x18),
  626. ILI9881C_COMMAND_INSTR(0xCD, 0x18),
  627. ILI9881C_COMMAND_INSTR(0xCE, 0x4C),
  628. ILI9881C_COMMAND_INSTR(0xCF, 0x21),
  629. ILI9881C_COMMAND_INSTR(0xD0, 0x27),
  630. ILI9881C_COMMAND_INSTR(0xD1, 0x54),
  631. ILI9881C_COMMAND_INSTR(0xD2, 0x67),
  632. ILI9881C_COMMAND_INSTR(0xD3, 0x39),
  633. ILI9881C_SWITCH_PAGE_INSTR(0),
  634. ILI9881C_COMMAND_INSTR(0x35, 0x00),
  635. ILI9881C_COMMAND_INSTR(0x3A, 0x7),
  636. };
  637. static const struct ili9881c_instr tl050hdv35_init[] = {
  638. ILI9881C_SWITCH_PAGE_INSTR(3),
  639. ILI9881C_COMMAND_INSTR(0x01, 0x00),
  640. ILI9881C_COMMAND_INSTR(0x02, 0x00),
  641. ILI9881C_COMMAND_INSTR(0x03, 0x73),
  642. ILI9881C_COMMAND_INSTR(0x04, 0x00),
  643. ILI9881C_COMMAND_INSTR(0x05, 0x00),
  644. ILI9881C_COMMAND_INSTR(0x06, 0x0a),
  645. ILI9881C_COMMAND_INSTR(0x07, 0x00),
  646. ILI9881C_COMMAND_INSTR(0x08, 0x00),
  647. ILI9881C_COMMAND_INSTR(0x09, 0x01),
  648. ILI9881C_COMMAND_INSTR(0x0a, 0x00),
  649. ILI9881C_COMMAND_INSTR(0x0b, 0x00),
  650. ILI9881C_COMMAND_INSTR(0x0c, 0x01),
  651. ILI9881C_COMMAND_INSTR(0x0d, 0x00),
  652. ILI9881C_COMMAND_INSTR(0x0e, 0x00),
  653. ILI9881C_COMMAND_INSTR(0x0f, 0x1d),
  654. ILI9881C_COMMAND_INSTR(0x10, 0x1d),
  655. ILI9881C_COMMAND_INSTR(0x15, 0x00),
  656. ILI9881C_COMMAND_INSTR(0x16, 0x00),
  657. ILI9881C_COMMAND_INSTR(0x17, 0x00),
  658. ILI9881C_COMMAND_INSTR(0x18, 0x00),
  659. ILI9881C_COMMAND_INSTR(0x19, 0x00),
  660. ILI9881C_COMMAND_INSTR(0x1a, 0x00),
  661. ILI9881C_COMMAND_INSTR(0x1b, 0x00),
  662. ILI9881C_COMMAND_INSTR(0x1c, 0x00),
  663. ILI9881C_COMMAND_INSTR(0x1d, 0x00),
  664. ILI9881C_COMMAND_INSTR(0x1e, 0x40),
  665. ILI9881C_COMMAND_INSTR(0x1f, 0x80),
  666. ILI9881C_COMMAND_INSTR(0x20, 0x06),
  667. ILI9881C_COMMAND_INSTR(0x21, 0x02),
  668. ILI9881C_COMMAND_INSTR(0x28, 0x33),
  669. ILI9881C_COMMAND_INSTR(0x29, 0x03),
  670. ILI9881C_COMMAND_INSTR(0x2a, 0x00),
  671. ILI9881C_COMMAND_INSTR(0x2b, 0x00),
  672. ILI9881C_COMMAND_INSTR(0x2c, 0x00),
  673. ILI9881C_COMMAND_INSTR(0x2d, 0x00),
  674. ILI9881C_COMMAND_INSTR(0x2e, 0x00),
  675. ILI9881C_COMMAND_INSTR(0x2f, 0x00),
  676. ILI9881C_COMMAND_INSTR(0x35, 0x00),
  677. ILI9881C_COMMAND_INSTR(0x36, 0x00),
  678. ILI9881C_COMMAND_INSTR(0x37, 0x00),
  679. ILI9881C_COMMAND_INSTR(0x38, 0x3C),
  680. ILI9881C_COMMAND_INSTR(0x39, 0x00),
  681. ILI9881C_COMMAND_INSTR(0x3a, 0x40),
  682. ILI9881C_COMMAND_INSTR(0x3b, 0x40),
  683. ILI9881C_COMMAND_INSTR(0x3c, 0x00),
  684. ILI9881C_COMMAND_INSTR(0x3d, 0x00),
  685. ILI9881C_COMMAND_INSTR(0x3e, 0x00),
  686. ILI9881C_COMMAND_INSTR(0x3f, 0x00),
  687. ILI9881C_COMMAND_INSTR(0x40, 0x00),
  688. ILI9881C_COMMAND_INSTR(0x41, 0x00),
  689. ILI9881C_COMMAND_INSTR(0x42, 0x00),
  690. ILI9881C_COMMAND_INSTR(0x43, 0x00),
  691. ILI9881C_COMMAND_INSTR(0x44, 0x00),
  692. ILI9881C_COMMAND_INSTR(0x55, 0xab),
  693. ILI9881C_COMMAND_INSTR(0x5a, 0x89),
  694. ILI9881C_COMMAND_INSTR(0x5b, 0xab),
  695. ILI9881C_COMMAND_INSTR(0x5c, 0xcd),
  696. ILI9881C_COMMAND_INSTR(0x5d, 0xef),
  697. ILI9881C_COMMAND_INSTR(0x5e, 0x11),
  698. ILI9881C_COMMAND_INSTR(0x5f, 0x01),
  699. ILI9881C_COMMAND_INSTR(0x60, 0x00),
  700. ILI9881C_COMMAND_INSTR(0x61, 0x15),
  701. ILI9881C_COMMAND_INSTR(0x62, 0x14),
  702. ILI9881C_COMMAND_INSTR(0x63, 0x0e),
  703. ILI9881C_COMMAND_INSTR(0x64, 0x0f),
  704. ILI9881C_COMMAND_INSTR(0x65, 0x0c),
  705. ILI9881C_COMMAND_INSTR(0x66, 0x0d),
  706. ILI9881C_COMMAND_INSTR(0x67, 0x06),
  707. ILI9881C_COMMAND_INSTR(0x68, 0x02),
  708. ILI9881C_COMMAND_INSTR(0x69, 0x07),
  709. ILI9881C_COMMAND_INSTR(0x6a, 0x02),
  710. ILI9881C_COMMAND_INSTR(0x6b, 0x02),
  711. ILI9881C_COMMAND_INSTR(0x6c, 0x02),
  712. ILI9881C_COMMAND_INSTR(0x6d, 0x02),
  713. ILI9881C_COMMAND_INSTR(0x6e, 0x02),
  714. ILI9881C_COMMAND_INSTR(0x6f, 0x02),
  715. ILI9881C_COMMAND_INSTR(0x70, 0x02),
  716. ILI9881C_COMMAND_INSTR(0x71, 0x02),
  717. ILI9881C_COMMAND_INSTR(0x72, 0x02),
  718. ILI9881C_COMMAND_INSTR(0x73, 0x02),
  719. ILI9881C_COMMAND_INSTR(0x74, 0x02),
  720. ILI9881C_COMMAND_INSTR(0x75, 0x01),
  721. ILI9881C_COMMAND_INSTR(0x76, 0x00),
  722. ILI9881C_COMMAND_INSTR(0x77, 0x14),
  723. ILI9881C_COMMAND_INSTR(0x78, 0x15),
  724. ILI9881C_COMMAND_INSTR(0x79, 0x0e),
  725. ILI9881C_COMMAND_INSTR(0x7a, 0x0f),
  726. ILI9881C_COMMAND_INSTR(0x7b, 0x0c),
  727. ILI9881C_COMMAND_INSTR(0x7c, 0x0d),
  728. ILI9881C_COMMAND_INSTR(0x7d, 0x06),
  729. ILI9881C_COMMAND_INSTR(0x7e, 0x02),
  730. ILI9881C_COMMAND_INSTR(0x7f, 0x07),
  731. ILI9881C_COMMAND_INSTR(0x88, 0x02),
  732. ILI9881C_COMMAND_INSTR(0x89, 0x02),
  733. ILI9881C_COMMAND_INSTR(0x8A, 0x02),
  734. ILI9881C_SWITCH_PAGE_INSTR(4),
  735. ILI9881C_COMMAND_INSTR(0x38, 0x01),
  736. ILI9881C_COMMAND_INSTR(0x39, 0x00),
  737. ILI9881C_COMMAND_INSTR(0x6c, 0x15),
  738. ILI9881C_COMMAND_INSTR(0x6e, 0x2b),
  739. ILI9881C_COMMAND_INSTR(0x6f, 0x33),
  740. ILI9881C_COMMAND_INSTR(0x8d, 0x18),
  741. ILI9881C_COMMAND_INSTR(0x87, 0xba),
  742. ILI9881C_COMMAND_INSTR(0x26, 0x76),
  743. ILI9881C_COMMAND_INSTR(0xb2, 0xd1),
  744. ILI9881C_COMMAND_INSTR(0xb5, 0x06),
  745. ILI9881C_COMMAND_INSTR(0x3a, 0x24),
  746. ILI9881C_COMMAND_INSTR(0x35, 0x1f),
  747. ILI9881C_COMMAND_INSTR(0x33, 0x14),
  748. ILI9881C_COMMAND_INSTR(0x3b, 0x98),
  749. ILI9881C_SWITCH_PAGE_INSTR(1),
  750. ILI9881C_COMMAND_INSTR(0x22, 0x0a),
  751. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  752. ILI9881C_COMMAND_INSTR(0x40, 0x33),
  753. ILI9881C_COMMAND_INSTR(0x53, 0xa2),
  754. ILI9881C_COMMAND_INSTR(0x55, 0x92),
  755. ILI9881C_COMMAND_INSTR(0x50, 0x96),
  756. ILI9881C_COMMAND_INSTR(0x51, 0x96),
  757. ILI9881C_COMMAND_INSTR(0x60, 0x22),
  758. ILI9881C_COMMAND_INSTR(0x61, 0x00),
  759. ILI9881C_COMMAND_INSTR(0x62, 0x19),
  760. ILI9881C_COMMAND_INSTR(0x63, 0x00),
  761. ILI9881C_COMMAND_INSTR(0xa0, 0x08),
  762. ILI9881C_COMMAND_INSTR(0xa1, 0x11),
  763. ILI9881C_COMMAND_INSTR(0xa2, 0x19),
  764. ILI9881C_COMMAND_INSTR(0xa3, 0x0d),
  765. ILI9881C_COMMAND_INSTR(0xa4, 0x0d),
  766. ILI9881C_COMMAND_INSTR(0xa5, 0x1e),
  767. ILI9881C_COMMAND_INSTR(0xa6, 0x14),
  768. ILI9881C_COMMAND_INSTR(0xa7, 0x17),
  769. ILI9881C_COMMAND_INSTR(0xa8, 0x4f),
  770. ILI9881C_COMMAND_INSTR(0xa9, 0x1a),
  771. ILI9881C_COMMAND_INSTR(0xaa, 0x27),
  772. ILI9881C_COMMAND_INSTR(0xab, 0x49),
  773. ILI9881C_COMMAND_INSTR(0xac, 0x1a),
  774. ILI9881C_COMMAND_INSTR(0xad, 0x18),
  775. ILI9881C_COMMAND_INSTR(0xae, 0x4c),
  776. ILI9881C_COMMAND_INSTR(0xaf, 0x22),
  777. ILI9881C_COMMAND_INSTR(0xb0, 0x27),
  778. ILI9881C_COMMAND_INSTR(0xb1, 0x4b),
  779. ILI9881C_COMMAND_INSTR(0xb2, 0x60),
  780. ILI9881C_COMMAND_INSTR(0xb3, 0x39),
  781. ILI9881C_COMMAND_INSTR(0xc0, 0x08),
  782. ILI9881C_COMMAND_INSTR(0xc1, 0x11),
  783. ILI9881C_COMMAND_INSTR(0xc2, 0x19),
  784. ILI9881C_COMMAND_INSTR(0xc3, 0x0d),
  785. ILI9881C_COMMAND_INSTR(0xc4, 0x0d),
  786. ILI9881C_COMMAND_INSTR(0xc5, 0x1e),
  787. ILI9881C_COMMAND_INSTR(0xc6, 0x14),
  788. ILI9881C_COMMAND_INSTR(0xc7, 0x17),
  789. ILI9881C_COMMAND_INSTR(0xc8, 0x4f),
  790. ILI9881C_COMMAND_INSTR(0xc9, 0x1a),
  791. ILI9881C_COMMAND_INSTR(0xca, 0x27),
  792. ILI9881C_COMMAND_INSTR(0xcb, 0x49),
  793. ILI9881C_COMMAND_INSTR(0xcc, 0x1a),
  794. ILI9881C_COMMAND_INSTR(0xcd, 0x18),
  795. ILI9881C_COMMAND_INSTR(0xce, 0x4c),
  796. ILI9881C_COMMAND_INSTR(0xcf, 0x33),
  797. ILI9881C_COMMAND_INSTR(0xd0, 0x27),
  798. ILI9881C_COMMAND_INSTR(0xd1, 0x4b),
  799. ILI9881C_COMMAND_INSTR(0xd2, 0x60),
  800. ILI9881C_COMMAND_INSTR(0xd3, 0x39),
  801. ILI9881C_SWITCH_PAGE_INSTR(0),
  802. ILI9881C_COMMAND_INSTR(0x36, 0x03),
  803. };
  804. static const struct ili9881c_instr w552946ab_init[] = {
  805. ILI9881C_SWITCH_PAGE_INSTR(3),
  806. ILI9881C_COMMAND_INSTR(0x01, 0x00),
  807. ILI9881C_COMMAND_INSTR(0x02, 0x00),
  808. ILI9881C_COMMAND_INSTR(0x03, 0x53),
  809. ILI9881C_COMMAND_INSTR(0x04, 0x53),
  810. ILI9881C_COMMAND_INSTR(0x05, 0x13),
  811. ILI9881C_COMMAND_INSTR(0x06, 0x04),
  812. ILI9881C_COMMAND_INSTR(0x07, 0x02),
  813. ILI9881C_COMMAND_INSTR(0x08, 0x02),
  814. ILI9881C_COMMAND_INSTR(0x09, 0x00),
  815. ILI9881C_COMMAND_INSTR(0x0A, 0x00),
  816. ILI9881C_COMMAND_INSTR(0x0B, 0x00),
  817. ILI9881C_COMMAND_INSTR(0x0C, 0x00),
  818. ILI9881C_COMMAND_INSTR(0x0D, 0x00),
  819. ILI9881C_COMMAND_INSTR(0x0E, 0x00),
  820. ILI9881C_COMMAND_INSTR(0x0F, 0x00),
  821. ILI9881C_COMMAND_INSTR(0x10, 0x00),
  822. ILI9881C_COMMAND_INSTR(0x11, 0x00),
  823. ILI9881C_COMMAND_INSTR(0x12, 0x00),
  824. ILI9881C_COMMAND_INSTR(0x13, 0x00),
  825. ILI9881C_COMMAND_INSTR(0x14, 0x00),
  826. ILI9881C_COMMAND_INSTR(0x15, 0x08),
  827. ILI9881C_COMMAND_INSTR(0x16, 0x10),
  828. ILI9881C_COMMAND_INSTR(0x17, 0x00),
  829. ILI9881C_COMMAND_INSTR(0x18, 0x08),
  830. ILI9881C_COMMAND_INSTR(0x19, 0x00),
  831. ILI9881C_COMMAND_INSTR(0x1A, 0x00),
  832. ILI9881C_COMMAND_INSTR(0x1B, 0x00),
  833. ILI9881C_COMMAND_INSTR(0x1C, 0x00),
  834. ILI9881C_COMMAND_INSTR(0x1D, 0x00),
  835. ILI9881C_COMMAND_INSTR(0x1E, 0xC0),
  836. ILI9881C_COMMAND_INSTR(0x1F, 0x80),
  837. ILI9881C_COMMAND_INSTR(0x20, 0x02),
  838. ILI9881C_COMMAND_INSTR(0x21, 0x09),
  839. ILI9881C_COMMAND_INSTR(0x22, 0x00),
  840. ILI9881C_COMMAND_INSTR(0x23, 0x00),
  841. ILI9881C_COMMAND_INSTR(0x24, 0x00),
  842. ILI9881C_COMMAND_INSTR(0x25, 0x00),
  843. ILI9881C_COMMAND_INSTR(0x26, 0x00),
  844. ILI9881C_COMMAND_INSTR(0x27, 0x00),
  845. ILI9881C_COMMAND_INSTR(0x28, 0x55),
  846. ILI9881C_COMMAND_INSTR(0x29, 0x03),
  847. ILI9881C_COMMAND_INSTR(0x2A, 0x00),
  848. ILI9881C_COMMAND_INSTR(0x2B, 0x00),
  849. ILI9881C_COMMAND_INSTR(0x2C, 0x00),
  850. ILI9881C_COMMAND_INSTR(0x2D, 0x00),
  851. ILI9881C_COMMAND_INSTR(0x2E, 0x00),
  852. ILI9881C_COMMAND_INSTR(0x2F, 0x00),
  853. ILI9881C_COMMAND_INSTR(0x30, 0x00),
  854. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  855. ILI9881C_COMMAND_INSTR(0x32, 0x00),
  856. ILI9881C_COMMAND_INSTR(0x33, 0x00),
  857. ILI9881C_COMMAND_INSTR(0x34, 0x04),
  858. ILI9881C_COMMAND_INSTR(0x35, 0x05),
  859. ILI9881C_COMMAND_INSTR(0x36, 0x05),
  860. ILI9881C_COMMAND_INSTR(0x37, 0x00),
  861. ILI9881C_COMMAND_INSTR(0x38, 0x3C),
  862. ILI9881C_COMMAND_INSTR(0x39, 0x35),
  863. ILI9881C_COMMAND_INSTR(0x3A, 0x00),
  864. ILI9881C_COMMAND_INSTR(0x3B, 0x40),
  865. ILI9881C_COMMAND_INSTR(0x3C, 0x00),
  866. ILI9881C_COMMAND_INSTR(0x3D, 0x00),
  867. ILI9881C_COMMAND_INSTR(0x3E, 0x00),
  868. ILI9881C_COMMAND_INSTR(0x3F, 0x00),
  869. ILI9881C_COMMAND_INSTR(0x40, 0x00),
  870. ILI9881C_COMMAND_INSTR(0x41, 0x88),
  871. ILI9881C_COMMAND_INSTR(0x42, 0x00),
  872. ILI9881C_COMMAND_INSTR(0x43, 0x00),
  873. ILI9881C_COMMAND_INSTR(0x44, 0x1F),
  874. ILI9881C_COMMAND_INSTR(0x50, 0x01),
  875. ILI9881C_COMMAND_INSTR(0x51, 0x23),
  876. ILI9881C_COMMAND_INSTR(0x52, 0x45),
  877. ILI9881C_COMMAND_INSTR(0x53, 0x67),
  878. ILI9881C_COMMAND_INSTR(0x54, 0x89),
  879. ILI9881C_COMMAND_INSTR(0x55, 0xaB),
  880. ILI9881C_COMMAND_INSTR(0x56, 0x01),
  881. ILI9881C_COMMAND_INSTR(0x57, 0x23),
  882. ILI9881C_COMMAND_INSTR(0x58, 0x45),
  883. ILI9881C_COMMAND_INSTR(0x59, 0x67),
  884. ILI9881C_COMMAND_INSTR(0x5A, 0x89),
  885. ILI9881C_COMMAND_INSTR(0x5B, 0xAB),
  886. ILI9881C_COMMAND_INSTR(0x5C, 0xCD),
  887. ILI9881C_COMMAND_INSTR(0x5D, 0xEF),
  888. ILI9881C_COMMAND_INSTR(0x5E, 0x03),
  889. ILI9881C_COMMAND_INSTR(0x5F, 0x14),
  890. ILI9881C_COMMAND_INSTR(0x60, 0x15),
  891. ILI9881C_COMMAND_INSTR(0x61, 0x0C),
  892. ILI9881C_COMMAND_INSTR(0x62, 0x0D),
  893. ILI9881C_COMMAND_INSTR(0x63, 0x0E),
  894. ILI9881C_COMMAND_INSTR(0x64, 0x0F),
  895. ILI9881C_COMMAND_INSTR(0x65, 0x10),
  896. ILI9881C_COMMAND_INSTR(0x66, 0x11),
  897. ILI9881C_COMMAND_INSTR(0x67, 0x08),
  898. ILI9881C_COMMAND_INSTR(0x68, 0x02),
  899. ILI9881C_COMMAND_INSTR(0x69, 0x0A),
  900. ILI9881C_COMMAND_INSTR(0x6A, 0x02),
  901. ILI9881C_COMMAND_INSTR(0x6B, 0x02),
  902. ILI9881C_COMMAND_INSTR(0x6C, 0x02),
  903. ILI9881C_COMMAND_INSTR(0x6D, 0x02),
  904. ILI9881C_COMMAND_INSTR(0x6E, 0x02),
  905. ILI9881C_COMMAND_INSTR(0x6F, 0x02),
  906. ILI9881C_COMMAND_INSTR(0x70, 0x02),
  907. ILI9881C_COMMAND_INSTR(0x71, 0x02),
  908. ILI9881C_COMMAND_INSTR(0x72, 0x06),
  909. ILI9881C_COMMAND_INSTR(0x73, 0x02),
  910. ILI9881C_COMMAND_INSTR(0x74, 0x02),
  911. ILI9881C_COMMAND_INSTR(0x75, 0x14),
  912. ILI9881C_COMMAND_INSTR(0x76, 0x15),
  913. ILI9881C_COMMAND_INSTR(0x77, 0x0F),
  914. ILI9881C_COMMAND_INSTR(0x78, 0x0E),
  915. ILI9881C_COMMAND_INSTR(0x79, 0x0D),
  916. ILI9881C_COMMAND_INSTR(0x7A, 0x0C),
  917. ILI9881C_COMMAND_INSTR(0x7B, 0x11),
  918. ILI9881C_COMMAND_INSTR(0x7C, 0x10),
  919. ILI9881C_COMMAND_INSTR(0x7D, 0x06),
  920. ILI9881C_COMMAND_INSTR(0x7E, 0x02),
  921. ILI9881C_COMMAND_INSTR(0x7F, 0x0A),
  922. ILI9881C_COMMAND_INSTR(0x80, 0x02),
  923. ILI9881C_COMMAND_INSTR(0x81, 0x02),
  924. ILI9881C_COMMAND_INSTR(0x82, 0x02),
  925. ILI9881C_COMMAND_INSTR(0x83, 0x02),
  926. ILI9881C_COMMAND_INSTR(0x84, 0x02),
  927. ILI9881C_COMMAND_INSTR(0x85, 0x02),
  928. ILI9881C_COMMAND_INSTR(0x86, 0x02),
  929. ILI9881C_COMMAND_INSTR(0x87, 0x02),
  930. ILI9881C_COMMAND_INSTR(0x88, 0x08),
  931. ILI9881C_COMMAND_INSTR(0x89, 0x02),
  932. ILI9881C_COMMAND_INSTR(0x8A, 0x02),
  933. ILI9881C_SWITCH_PAGE_INSTR(4),
  934. ILI9881C_COMMAND_INSTR(0x00, 0x80),
  935. ILI9881C_COMMAND_INSTR(0x70, 0x00),
  936. ILI9881C_COMMAND_INSTR(0x71, 0x00),
  937. ILI9881C_COMMAND_INSTR(0x66, 0xFE),
  938. ILI9881C_COMMAND_INSTR(0x82, 0x15),
  939. ILI9881C_COMMAND_INSTR(0x84, 0x15),
  940. ILI9881C_COMMAND_INSTR(0x85, 0x15),
  941. ILI9881C_COMMAND_INSTR(0x3a, 0x24),
  942. ILI9881C_COMMAND_INSTR(0x32, 0xAC),
  943. ILI9881C_COMMAND_INSTR(0x8C, 0x80),
  944. ILI9881C_COMMAND_INSTR(0x3C, 0xF5),
  945. ILI9881C_COMMAND_INSTR(0x88, 0x33),
  946. ILI9881C_SWITCH_PAGE_INSTR(1),
  947. ILI9881C_COMMAND_INSTR(0x22, 0x0A),
  948. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  949. ILI9881C_COMMAND_INSTR(0x53, 0x78),
  950. ILI9881C_COMMAND_INSTR(0x50, 0x5B),
  951. ILI9881C_COMMAND_INSTR(0x51, 0x5B),
  952. ILI9881C_COMMAND_INSTR(0x60, 0x20),
  953. ILI9881C_COMMAND_INSTR(0x61, 0x00),
  954. ILI9881C_COMMAND_INSTR(0x62, 0x0D),
  955. ILI9881C_COMMAND_INSTR(0x63, 0x00),
  956. ILI9881C_COMMAND_INSTR(0xA0, 0x00),
  957. ILI9881C_COMMAND_INSTR(0xA1, 0x10),
  958. ILI9881C_COMMAND_INSTR(0xA2, 0x1C),
  959. ILI9881C_COMMAND_INSTR(0xA3, 0x13),
  960. ILI9881C_COMMAND_INSTR(0xA4, 0x15),
  961. ILI9881C_COMMAND_INSTR(0xA5, 0x26),
  962. ILI9881C_COMMAND_INSTR(0xA6, 0x1A),
  963. ILI9881C_COMMAND_INSTR(0xA7, 0x1D),
  964. ILI9881C_COMMAND_INSTR(0xA8, 0x67),
  965. ILI9881C_COMMAND_INSTR(0xA9, 0x1C),
  966. ILI9881C_COMMAND_INSTR(0xAA, 0x29),
  967. ILI9881C_COMMAND_INSTR(0xAB, 0x5B),
  968. ILI9881C_COMMAND_INSTR(0xAC, 0x26),
  969. ILI9881C_COMMAND_INSTR(0xAD, 0x28),
  970. ILI9881C_COMMAND_INSTR(0xAE, 0x5C),
  971. ILI9881C_COMMAND_INSTR(0xAF, 0x30),
  972. ILI9881C_COMMAND_INSTR(0xB0, 0x31),
  973. ILI9881C_COMMAND_INSTR(0xB1, 0x2E),
  974. ILI9881C_COMMAND_INSTR(0xB2, 0x32),
  975. ILI9881C_COMMAND_INSTR(0xB3, 0x00),
  976. ILI9881C_COMMAND_INSTR(0xC0, 0x00),
  977. ILI9881C_COMMAND_INSTR(0xC1, 0x10),
  978. ILI9881C_COMMAND_INSTR(0xC2, 0x1C),
  979. ILI9881C_COMMAND_INSTR(0xC3, 0x13),
  980. ILI9881C_COMMAND_INSTR(0xC4, 0x15),
  981. ILI9881C_COMMAND_INSTR(0xC5, 0x26),
  982. ILI9881C_COMMAND_INSTR(0xC6, 0x1A),
  983. ILI9881C_COMMAND_INSTR(0xC7, 0x1D),
  984. ILI9881C_COMMAND_INSTR(0xC8, 0x67),
  985. ILI9881C_COMMAND_INSTR(0xC9, 0x1C),
  986. ILI9881C_COMMAND_INSTR(0xCA, 0x29),
  987. ILI9881C_COMMAND_INSTR(0xCB, 0x5B),
  988. ILI9881C_COMMAND_INSTR(0xCC, 0x26),
  989. ILI9881C_COMMAND_INSTR(0xCD, 0x28),
  990. ILI9881C_COMMAND_INSTR(0xCE, 0x5C),
  991. ILI9881C_COMMAND_INSTR(0xCF, 0x30),
  992. ILI9881C_COMMAND_INSTR(0xD0, 0x31),
  993. ILI9881C_COMMAND_INSTR(0xD1, 0x2E),
  994. ILI9881C_COMMAND_INSTR(0xD2, 0x32),
  995. ILI9881C_COMMAND_INSTR(0xD3, 0x00),
  996. ILI9881C_SWITCH_PAGE_INSTR(0),
  997. };
  998. static const struct ili9881c_instr am8001280g_init[] = {
  999. ILI9881C_SWITCH_PAGE_INSTR(3),
  1000. ILI9881C_COMMAND_INSTR(0x01, 0x00),
  1001. ILI9881C_COMMAND_INSTR(0x02, 0x00),
  1002. ILI9881C_COMMAND_INSTR(0x03, 0x73),
  1003. ILI9881C_COMMAND_INSTR(0x04, 0xD3),
  1004. ILI9881C_COMMAND_INSTR(0x05, 0x00),
  1005. ILI9881C_COMMAND_INSTR(0x06, 0x0A),
  1006. ILI9881C_COMMAND_INSTR(0x07, 0x0E),
  1007. ILI9881C_COMMAND_INSTR(0x08, 0x00),
  1008. ILI9881C_COMMAND_INSTR(0x09, 0x01),
  1009. ILI9881C_COMMAND_INSTR(0x0a, 0x01),
  1010. ILI9881C_COMMAND_INSTR(0x0b, 0x01),
  1011. ILI9881C_COMMAND_INSTR(0x0c, 0x01),
  1012. ILI9881C_COMMAND_INSTR(0x0d, 0x01),
  1013. ILI9881C_COMMAND_INSTR(0x0e, 0x01),
  1014. ILI9881C_COMMAND_INSTR(0x0f, 0x01),
  1015. ILI9881C_COMMAND_INSTR(0x10, 0x01),
  1016. ILI9881C_COMMAND_INSTR(0x11, 0x00),
  1017. ILI9881C_COMMAND_INSTR(0x12, 0x00),
  1018. ILI9881C_COMMAND_INSTR(0x13, 0x00),
  1019. ILI9881C_COMMAND_INSTR(0x14, 0x00),
  1020. ILI9881C_COMMAND_INSTR(0x15, 0x00),
  1021. ILI9881C_COMMAND_INSTR(0x16, 0x00),
  1022. ILI9881C_COMMAND_INSTR(0x17, 0x00),
  1023. ILI9881C_COMMAND_INSTR(0x18, 0x00),
  1024. ILI9881C_COMMAND_INSTR(0x19, 0x00),
  1025. ILI9881C_COMMAND_INSTR(0x1a, 0x00),
  1026. ILI9881C_COMMAND_INSTR(0x1b, 0x00),
  1027. ILI9881C_COMMAND_INSTR(0x1c, 0x00),
  1028. ILI9881C_COMMAND_INSTR(0x1d, 0x00),
  1029. ILI9881C_COMMAND_INSTR(0x1e, 0x40),
  1030. ILI9881C_COMMAND_INSTR(0x1f, 0x80),
  1031. ILI9881C_COMMAND_INSTR(0x20, 0x06),
  1032. ILI9881C_COMMAND_INSTR(0x21, 0x01),
  1033. ILI9881C_COMMAND_INSTR(0x22, 0x00),
  1034. ILI9881C_COMMAND_INSTR(0x23, 0x00),
  1035. ILI9881C_COMMAND_INSTR(0x24, 0x00),
  1036. ILI9881C_COMMAND_INSTR(0x25, 0x00),
  1037. ILI9881C_COMMAND_INSTR(0x26, 0x00),
  1038. ILI9881C_COMMAND_INSTR(0x27, 0x00),
  1039. ILI9881C_COMMAND_INSTR(0x28, 0x33),
  1040. ILI9881C_COMMAND_INSTR(0x29, 0x03),
  1041. ILI9881C_COMMAND_INSTR(0x2a, 0x00),
  1042. ILI9881C_COMMAND_INSTR(0x2b, 0x00),
  1043. ILI9881C_COMMAND_INSTR(0x2c, 0x00),
  1044. ILI9881C_COMMAND_INSTR(0x2d, 0x00),
  1045. ILI9881C_COMMAND_INSTR(0x2e, 0x00),
  1046. ILI9881C_COMMAND_INSTR(0x2f, 0x00),
  1047. ILI9881C_COMMAND_INSTR(0x30, 0x00),
  1048. ILI9881C_COMMAND_INSTR(0x31, 0x00),
  1049. ILI9881C_COMMAND_INSTR(0x32, 0x00),
  1050. ILI9881C_COMMAND_INSTR(0x33, 0x00),
  1051. ILI9881C_COMMAND_INSTR(0x34, 0x03),
  1052. ILI9881C_COMMAND_INSTR(0x35, 0x00),
  1053. ILI9881C_COMMAND_INSTR(0x36, 0x03),
  1054. ILI9881C_COMMAND_INSTR(0x37, 0x00),
  1055. ILI9881C_COMMAND_INSTR(0x38, 0x00),
  1056. ILI9881C_COMMAND_INSTR(0x39, 0x00),
  1057. ILI9881C_COMMAND_INSTR(0x3a, 0x40),
  1058. ILI9881C_COMMAND_INSTR(0x3b, 0x40),
  1059. ILI9881C_COMMAND_INSTR(0x3c, 0x00),
  1060. ILI9881C_COMMAND_INSTR(0x3d, 0x00),
  1061. ILI9881C_COMMAND_INSTR(0x3e, 0x00),
  1062. ILI9881C_COMMAND_INSTR(0x3f, 0x00),
  1063. ILI9881C_COMMAND_INSTR(0x40, 0x00),
  1064. ILI9881C_COMMAND_INSTR(0x41, 0x00),
  1065. ILI9881C_COMMAND_INSTR(0x42, 0x00),
  1066. ILI9881C_COMMAND_INSTR(0x43, 0x00),
  1067. ILI9881C_COMMAND_INSTR(0x44, 0x00),
  1068. ILI9881C_COMMAND_INSTR(0x50, 0x01),
  1069. ILI9881C_COMMAND_INSTR(0x51, 0x23),
  1070. ILI9881C_COMMAND_INSTR(0x52, 0x45),
  1071. ILI9881C_COMMAND_INSTR(0x53, 0x67),
  1072. ILI9881C_COMMAND_INSTR(0x54, 0x89),
  1073. ILI9881C_COMMAND_INSTR(0x55, 0xab),
  1074. ILI9881C_COMMAND_INSTR(0x56, 0x01),
  1075. ILI9881C_COMMAND_INSTR(0x57, 0x23),
  1076. ILI9881C_COMMAND_INSTR(0x58, 0x45),
  1077. ILI9881C_COMMAND_INSTR(0x59, 0x67),
  1078. ILI9881C_COMMAND_INSTR(0x5a, 0x89),
  1079. ILI9881C_COMMAND_INSTR(0x5b, 0xab),
  1080. ILI9881C_COMMAND_INSTR(0x5c, 0xcd),
  1081. ILI9881C_COMMAND_INSTR(0x5d, 0xef),
  1082. ILI9881C_COMMAND_INSTR(0x5e, 0x11),
  1083. ILI9881C_COMMAND_INSTR(0x5f, 0x02),
  1084. ILI9881C_COMMAND_INSTR(0x60, 0x00),
  1085. ILI9881C_COMMAND_INSTR(0x61, 0x01),
  1086. ILI9881C_COMMAND_INSTR(0x62, 0x0D),
  1087. ILI9881C_COMMAND_INSTR(0x63, 0x0C),
  1088. ILI9881C_COMMAND_INSTR(0x64, 0x0F),
  1089. ILI9881C_COMMAND_INSTR(0x65, 0x0E),
  1090. ILI9881C_COMMAND_INSTR(0x66, 0x06),
  1091. ILI9881C_COMMAND_INSTR(0x67, 0x07),
  1092. ILI9881C_COMMAND_INSTR(0x68, 0x02),
  1093. ILI9881C_COMMAND_INSTR(0x69, 0x02),
  1094. ILI9881C_COMMAND_INSTR(0x6a, 0x08),
  1095. ILI9881C_COMMAND_INSTR(0x6b, 0x02),
  1096. ILI9881C_COMMAND_INSTR(0x6c, 0x02),
  1097. ILI9881C_COMMAND_INSTR(0x6d, 0x02),
  1098. ILI9881C_COMMAND_INSTR(0x6e, 0x02),
  1099. ILI9881C_COMMAND_INSTR(0x6f, 0x02),
  1100. ILI9881C_COMMAND_INSTR(0x70, 0x02),
  1101. ILI9881C_COMMAND_INSTR(0x71, 0x02),
  1102. ILI9881C_COMMAND_INSTR(0x72, 0x02),
  1103. ILI9881C_COMMAND_INSTR(0x73, 0x02),
  1104. ILI9881C_COMMAND_INSTR(0x74, 0x02),
  1105. ILI9881C_COMMAND_INSTR(0x75, 0x02),
  1106. ILI9881C_COMMAND_INSTR(0x76, 0x00),
  1107. ILI9881C_COMMAND_INSTR(0x77, 0x01),
  1108. ILI9881C_COMMAND_INSTR(0x78, 0x0D),
  1109. ILI9881C_COMMAND_INSTR(0x79, 0x0C),
  1110. ILI9881C_COMMAND_INSTR(0x7a, 0x0F),
  1111. ILI9881C_COMMAND_INSTR(0x7b, 0x0E),
  1112. ILI9881C_COMMAND_INSTR(0x7c, 0x06),
  1113. ILI9881C_COMMAND_INSTR(0x7d, 0x07),
  1114. ILI9881C_COMMAND_INSTR(0x7e, 0x02),
  1115. ILI9881C_COMMAND_INSTR(0x7f, 0x02),
  1116. ILI9881C_COMMAND_INSTR(0x80, 0x08),
  1117. ILI9881C_COMMAND_INSTR(0x81, 0x02),
  1118. ILI9881C_COMMAND_INSTR(0x82, 0x02),
  1119. ILI9881C_COMMAND_INSTR(0x83, 0x02),
  1120. ILI9881C_COMMAND_INSTR(0x84, 0x02),
  1121. ILI9881C_COMMAND_INSTR(0x85, 0x02),
  1122. ILI9881C_COMMAND_INSTR(0x86, 0x02),
  1123. ILI9881C_COMMAND_INSTR(0x87, 0x02),
  1124. ILI9881C_COMMAND_INSTR(0x88, 0x02),
  1125. ILI9881C_COMMAND_INSTR(0x89, 0x02),
  1126. ILI9881C_COMMAND_INSTR(0x8A, 0x02),
  1127. ILI9881C_SWITCH_PAGE_INSTR(4),
  1128. ILI9881C_COMMAND_INSTR(0x6c, 0x15),
  1129. ILI9881C_COMMAND_INSTR(0x6e, 0x30),
  1130. ILI9881C_COMMAND_INSTR(0x6f, 0x33),
  1131. ILI9881C_COMMAND_INSTR(0x8d, 0x15),
  1132. ILI9881C_COMMAND_INSTR(0x3a, 0xa4),
  1133. ILI9881C_COMMAND_INSTR(0x87, 0xba),
  1134. ILI9881C_COMMAND_INSTR(0x26, 0x76),
  1135. ILI9881C_COMMAND_INSTR(0xb2, 0xd1),
  1136. ILI9881C_SWITCH_PAGE_INSTR(1),
  1137. ILI9881C_COMMAND_INSTR(0x22, 0x0A),
  1138. ILI9881C_COMMAND_INSTR(0x31, 0x0B),
  1139. ILI9881C_COMMAND_INSTR(0x50, 0xa5),
  1140. ILI9881C_COMMAND_INSTR(0x51, 0xa0),
  1141. ILI9881C_COMMAND_INSTR(0x53, 0x70),
  1142. ILI9881C_COMMAND_INSTR(0x55, 0x7A),
  1143. ILI9881C_COMMAND_INSTR(0x60, 0x14),
  1144. ILI9881C_COMMAND_INSTR(0xA0, 0x00),
  1145. ILI9881C_COMMAND_INSTR(0xA1, 0x53),
  1146. ILI9881C_COMMAND_INSTR(0xA2, 0x50),
  1147. ILI9881C_COMMAND_INSTR(0xA3, 0x20),
  1148. ILI9881C_COMMAND_INSTR(0xA4, 0x27),
  1149. ILI9881C_COMMAND_INSTR(0xA5, 0x33),
  1150. ILI9881C_COMMAND_INSTR(0xA6, 0x25),
  1151. ILI9881C_COMMAND_INSTR(0xA7, 0x25),
  1152. ILI9881C_COMMAND_INSTR(0xA8, 0xD4),
  1153. ILI9881C_COMMAND_INSTR(0xA9, 0x1A),
  1154. ILI9881C_COMMAND_INSTR(0xAA, 0x2B),
  1155. ILI9881C_COMMAND_INSTR(0xAB, 0xB5),
  1156. ILI9881C_COMMAND_INSTR(0xAC, 0x19),
  1157. ILI9881C_COMMAND_INSTR(0xAD, 0x18),
  1158. ILI9881C_COMMAND_INSTR(0xAE, 0x53),
  1159. ILI9881C_COMMAND_INSTR(0xAF, 0x1A),
  1160. ILI9881C_COMMAND_INSTR(0xB0, 0x25),
  1161. ILI9881C_COMMAND_INSTR(0xB1, 0x62),
  1162. ILI9881C_COMMAND_INSTR(0xB2, 0x6A),
  1163. ILI9881C_COMMAND_INSTR(0xB3, 0x31),
  1164. ILI9881C_COMMAND_INSTR(0xC0, 0x00),
  1165. ILI9881C_COMMAND_INSTR(0xC1, 0x53),
  1166. ILI9881C_COMMAND_INSTR(0xC2, 0x50),
  1167. ILI9881C_COMMAND_INSTR(0xC3, 0x20),
  1168. ILI9881C_COMMAND_INSTR(0xC4, 0x27),
  1169. ILI9881C_COMMAND_INSTR(0xC5, 0x33),
  1170. ILI9881C_COMMAND_INSTR(0xC6, 0x25),
  1171. ILI9881C_COMMAND_INSTR(0xC7, 0x25),
  1172. ILI9881C_COMMAND_INSTR(0xC8, 0xD4),
  1173. ILI9881C_COMMAND_INSTR(0xC9, 0x1A),
  1174. ILI9881C_COMMAND_INSTR(0xCA, 0x2B),
  1175. ILI9881C_COMMAND_INSTR(0xCB, 0xB5),
  1176. ILI9881C_COMMAND_INSTR(0xCC, 0x19),
  1177. ILI9881C_COMMAND_INSTR(0xCD, 0x18),
  1178. ILI9881C_COMMAND_INSTR(0xCE, 0x53),
  1179. ILI9881C_COMMAND_INSTR(0xCF, 0x1A),
  1180. ILI9881C_COMMAND_INSTR(0xD0, 0x25),
  1181. ILI9881C_COMMAND_INSTR(0xD1, 0x62),
  1182. ILI9881C_COMMAND_INSTR(0xD2, 0x6A),
  1183. ILI9881C_COMMAND_INSTR(0xD3, 0x31),
  1184. ILI9881C_SWITCH_PAGE_INSTR(0),
  1185. ILI9881C_COMMAND_INSTR(MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x2c),
  1186. ILI9881C_COMMAND_INSTR(MIPI_DCS_WRITE_POWER_SAVE, 0x00),
  1187. };
  1188. static inline struct ili9881c *panel_to_ili9881c(struct drm_panel *panel)
  1189. {
  1190. return container_of(panel, struct ili9881c, panel);
  1191. }
  1192. /*
  1193. * The panel seems to accept some private DCS commands that map
  1194. * directly to registers.
  1195. *
  1196. * It is organised by page, with each page having its own set of
  1197. * registers, and the first page looks like it's holding the standard
  1198. * DCS commands.
  1199. *
  1200. * So before any attempt at sending a command or data, we have to be
  1201. * sure if we're in the right page or not.
  1202. */
  1203. static int ili9881c_switch_page(struct ili9881c *ctx, u8 page)
  1204. {
  1205. u8 buf[4] = { 0xff, 0x98, 0x81, page };
  1206. int ret;
  1207. ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf));
  1208. if (ret < 0)
  1209. return ret;
  1210. return 0;
  1211. }
  1212. static int ili9881c_send_cmd_data(struct ili9881c *ctx, u8 cmd, u8 data)
  1213. {
  1214. u8 buf[2] = { cmd, data };
  1215. int ret;
  1216. ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf));
  1217. if (ret < 0)
  1218. return ret;
  1219. return 0;
  1220. }
  1221. static int ili9881c_prepare(struct drm_panel *panel)
  1222. {
  1223. struct ili9881c *ctx = panel_to_ili9881c(panel);
  1224. unsigned int i;
  1225. int ret;
  1226. /* Power the panel */
  1227. ret = regulator_enable(ctx->power);
  1228. if (ret)
  1229. return ret;
  1230. msleep(5);
  1231. /* And reset it */
  1232. gpiod_set_value_cansleep(ctx->reset, 1);
  1233. msleep(20);
  1234. gpiod_set_value_cansleep(ctx->reset, 0);
  1235. msleep(20);
  1236. for (i = 0; i < ctx->desc->init_length; i++) {
  1237. const struct ili9881c_instr *instr = &ctx->desc->init[i];
  1238. if (instr->op == ILI9881C_SWITCH_PAGE)
  1239. ret = ili9881c_switch_page(ctx, instr->arg.page);
  1240. else if (instr->op == ILI9881C_COMMAND)
  1241. ret = ili9881c_send_cmd_data(ctx, instr->arg.cmd.cmd,
  1242. instr->arg.cmd.data);
  1243. if (ret)
  1244. return ret;
  1245. }
  1246. ret = ili9881c_switch_page(ctx, 0);
  1247. if (ret)
  1248. return ret;
  1249. ret = mipi_dsi_dcs_set_tear_on(ctx->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
  1250. if (ret)
  1251. return ret;
  1252. ret = mipi_dsi_dcs_exit_sleep_mode(ctx->dsi);
  1253. if (ret)
  1254. return ret;
  1255. return 0;
  1256. }
  1257. static int ili9881c_enable(struct drm_panel *panel)
  1258. {
  1259. struct ili9881c *ctx = panel_to_ili9881c(panel);
  1260. msleep(120);
  1261. mipi_dsi_dcs_set_display_on(ctx->dsi);
  1262. return 0;
  1263. }
  1264. static int ili9881c_disable(struct drm_panel *panel)
  1265. {
  1266. struct ili9881c *ctx = panel_to_ili9881c(panel);
  1267. return mipi_dsi_dcs_set_display_off(ctx->dsi);
  1268. }
  1269. static int ili9881c_unprepare(struct drm_panel *panel)
  1270. {
  1271. struct ili9881c *ctx = panel_to_ili9881c(panel);
  1272. mipi_dsi_dcs_enter_sleep_mode(ctx->dsi);
  1273. regulator_disable(ctx->power);
  1274. gpiod_set_value_cansleep(ctx->reset, 1);
  1275. return 0;
  1276. }
  1277. static const struct drm_display_mode lhr050h41_default_mode = {
  1278. .clock = 62000,
  1279. .hdisplay = 720,
  1280. .hsync_start = 720 + 10,
  1281. .hsync_end = 720 + 10 + 20,
  1282. .htotal = 720 + 10 + 20 + 30,
  1283. .vdisplay = 1280,
  1284. .vsync_start = 1280 + 10,
  1285. .vsync_end = 1280 + 10 + 10,
  1286. .vtotal = 1280 + 10 + 10 + 20,
  1287. .width_mm = 62,
  1288. .height_mm = 110,
  1289. };
  1290. static const struct drm_display_mode k101_im2byl02_default_mode = {
  1291. .clock = 69700,
  1292. .hdisplay = 800,
  1293. .hsync_start = 800 + 52,
  1294. .hsync_end = 800 + 52 + 8,
  1295. .htotal = 800 + 52 + 8 + 48,
  1296. .vdisplay = 1280,
  1297. .vsync_start = 1280 + 16,
  1298. .vsync_end = 1280 + 16 + 6,
  1299. .vtotal = 1280 + 16 + 6 + 15,
  1300. .width_mm = 135,
  1301. .height_mm = 217,
  1302. };
  1303. static const struct drm_display_mode kd050hdfia020_default_mode = {
  1304. .clock = 62000,
  1305. .hdisplay = 720,
  1306. .hsync_start = 720 + 10,
  1307. .hsync_end = 720 + 10 + 20,
  1308. .htotal = 720 + 10 + 20 + 30,
  1309. .vdisplay = 1280,
  1310. .vsync_start = 1280 + 10,
  1311. .vsync_end = 1280 + 10 + 10,
  1312. .vtotal = 1280 + 10 + 10 + 20,
  1313. .width_mm = 62,
  1314. .height_mm = 110,
  1315. };
  1316. static const struct drm_display_mode tl050hdv35_default_mode = {
  1317. .clock = 59400,
  1318. .hdisplay = 720,
  1319. .hsync_start = 720 + 18,
  1320. .hsync_end = 720 + 18 + 3,
  1321. .htotal = 720 + 18 + 3 + 20,
  1322. .vdisplay = 1280,
  1323. .vsync_start = 1280 + 26,
  1324. .vsync_end = 1280 + 26 + 6,
  1325. .vtotal = 1280 + 26 + 6 + 28,
  1326. .width_mm = 62,
  1327. .height_mm = 110,
  1328. };
  1329. static const struct drm_display_mode w552946aba_default_mode = {
  1330. .clock = 64000,
  1331. .hdisplay = 720,
  1332. .hsync_start = 720 + 40,
  1333. .hsync_end = 720 + 40 + 10,
  1334. .htotal = 720 + 40 + 10 + 40,
  1335. .vdisplay = 1280,
  1336. .vsync_start = 1280 + 22,
  1337. .vsync_end = 1280 + 22 + 4,
  1338. .vtotal = 1280 + 22 + 4 + 11,
  1339. .width_mm = 68,
  1340. .height_mm = 121,
  1341. };
  1342. static const struct drm_display_mode am8001280g_default_mode = {
  1343. .clock = 67911,
  1344. .hdisplay = 800,
  1345. .hsync_start = 800 + 20,
  1346. .hsync_end = 800 + 20 + 32,
  1347. .htotal = 800 + 20 + 32 + 20,
  1348. .vdisplay = 1280,
  1349. .vsync_start = 1280 + 6,
  1350. .vsync_end = 1280 + 6 + 8,
  1351. .vtotal = 1280 + 6 + 8 + 4,
  1352. .width_mm = 94,
  1353. .height_mm = 151,
  1354. };
  1355. static int ili9881c_get_modes(struct drm_panel *panel,
  1356. struct drm_connector *connector)
  1357. {
  1358. struct ili9881c *ctx = panel_to_ili9881c(panel);
  1359. struct drm_display_mode *mode;
  1360. mode = drm_mode_duplicate(connector->dev, ctx->desc->mode);
  1361. if (!mode) {
  1362. dev_err(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n",
  1363. ctx->desc->mode->hdisplay,
  1364. ctx->desc->mode->vdisplay,
  1365. drm_mode_vrefresh(ctx->desc->mode));
  1366. return -ENOMEM;
  1367. }
  1368. drm_mode_set_name(mode);
  1369. mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
  1370. drm_mode_probed_add(connector, mode);
  1371. connector->display_info.width_mm = mode->width_mm;
  1372. connector->display_info.height_mm = mode->height_mm;
  1373. /*
  1374. * TODO: Remove once all drm drivers call
  1375. * drm_connector_set_orientation_from_panel()
  1376. */
  1377. drm_connector_set_panel_orientation(connector, ctx->orientation);
  1378. return 1;
  1379. }
  1380. static enum drm_panel_orientation ili9881c_get_orientation(struct drm_panel *panel)
  1381. {
  1382. struct ili9881c *ctx = panel_to_ili9881c(panel);
  1383. return ctx->orientation;
  1384. }
  1385. static const struct drm_panel_funcs ili9881c_funcs = {
  1386. .prepare = ili9881c_prepare,
  1387. .unprepare = ili9881c_unprepare,
  1388. .enable = ili9881c_enable,
  1389. .disable = ili9881c_disable,
  1390. .get_modes = ili9881c_get_modes,
  1391. .get_orientation = ili9881c_get_orientation,
  1392. };
  1393. static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
  1394. {
  1395. struct ili9881c *ctx;
  1396. int ret;
  1397. ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL);
  1398. if (!ctx)
  1399. return -ENOMEM;
  1400. mipi_dsi_set_drvdata(dsi, ctx);
  1401. ctx->dsi = dsi;
  1402. ctx->desc = of_device_get_match_data(&dsi->dev);
  1403. drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs,
  1404. DRM_MODE_CONNECTOR_DSI);
  1405. ctx->power = devm_regulator_get(&dsi->dev, "power");
  1406. if (IS_ERR(ctx->power))
  1407. return dev_err_probe(&dsi->dev, PTR_ERR(ctx->power),
  1408. "Couldn't get our power regulator\n");
  1409. ctx->reset = devm_gpiod_get_optional(&dsi->dev, "reset", GPIOD_OUT_LOW);
  1410. if (IS_ERR(ctx->reset))
  1411. return dev_err_probe(&dsi->dev, PTR_ERR(ctx->reset),
  1412. "Couldn't get our reset GPIO\n");
  1413. ret = of_drm_get_panel_orientation(dsi->dev.of_node, &ctx->orientation);
  1414. if (ret) {
  1415. dev_err(&dsi->dev, "%pOF: failed to get orientation: %d\n",
  1416. dsi->dev.of_node, ret);
  1417. return ret;
  1418. }
  1419. ctx->panel.prepare_prev_first = true;
  1420. ret = drm_panel_of_backlight(&ctx->panel);
  1421. if (ret)
  1422. return ret;
  1423. drm_panel_add(&ctx->panel);
  1424. dsi->mode_flags = ctx->desc->mode_flags;
  1425. dsi->format = MIPI_DSI_FMT_RGB888;
  1426. dsi->lanes = 4;
  1427. return mipi_dsi_attach(dsi);
  1428. }
  1429. static void ili9881c_dsi_remove(struct mipi_dsi_device *dsi)
  1430. {
  1431. struct ili9881c *ctx = mipi_dsi_get_drvdata(dsi);
  1432. mipi_dsi_detach(dsi);
  1433. drm_panel_remove(&ctx->panel);
  1434. }
  1435. static const struct ili9881c_desc lhr050h41_desc = {
  1436. .init = lhr050h41_init,
  1437. .init_length = ARRAY_SIZE(lhr050h41_init),
  1438. .mode = &lhr050h41_default_mode,
  1439. .mode_flags = MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
  1440. };
  1441. static const struct ili9881c_desc k101_im2byl02_desc = {
  1442. .init = k101_im2byl02_init,
  1443. .init_length = ARRAY_SIZE(k101_im2byl02_init),
  1444. .mode = &k101_im2byl02_default_mode,
  1445. .mode_flags = MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
  1446. };
  1447. static const struct ili9881c_desc kd050hdfia020_desc = {
  1448. .init = kd050hdfia020_init,
  1449. .init_length = ARRAY_SIZE(kd050hdfia020_init),
  1450. .mode = &kd050hdfia020_default_mode,
  1451. .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  1452. MIPI_DSI_MODE_LPM,
  1453. };
  1454. static const struct ili9881c_desc tl050hdv35_desc = {
  1455. .init = tl050hdv35_init,
  1456. .init_length = ARRAY_SIZE(tl050hdv35_init),
  1457. .mode = &tl050hdv35_default_mode,
  1458. .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  1459. MIPI_DSI_MODE_LPM,
  1460. };
  1461. static const struct ili9881c_desc w552946aba_desc = {
  1462. .init = w552946ab_init,
  1463. .init_length = ARRAY_SIZE(w552946ab_init),
  1464. .mode = &w552946aba_default_mode,
  1465. .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
  1466. MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET,
  1467. };
  1468. static const struct ili9881c_desc am8001280g_desc = {
  1469. .init = am8001280g_init,
  1470. .init_length = ARRAY_SIZE(am8001280g_init),
  1471. .mode = &am8001280g_default_mode,
  1472. .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  1473. MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
  1474. };
  1475. static const struct of_device_id ili9881c_of_match[] = {
  1476. { .compatible = "bananapi,lhr050h41", .data = &lhr050h41_desc },
  1477. { .compatible = "feixin,k101-im2byl02", .data = &k101_im2byl02_desc },
  1478. { .compatible = "startek,kd050hdfia020", .data = &kd050hdfia020_desc },
  1479. { .compatible = "tdo,tl050hdv35", .data = &tl050hdv35_desc },
  1480. { .compatible = "wanchanglong,w552946aba", .data = &w552946aba_desc },
  1481. { .compatible = "ampire,am8001280g", .data = &am8001280g_desc },
  1482. { }
  1483. };
  1484. MODULE_DEVICE_TABLE(of, ili9881c_of_match);
  1485. static struct mipi_dsi_driver ili9881c_dsi_driver = {
  1486. .probe = ili9881c_dsi_probe,
  1487. .remove = ili9881c_dsi_remove,
  1488. .driver = {
  1489. .name = "ili9881c-dsi",
  1490. .of_match_table = ili9881c_of_match,
  1491. },
  1492. };
  1493. module_mipi_dsi_driver(ili9881c_dsi_driver);
  1494. MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
  1495. MODULE_DESCRIPTION("Ilitek ILI9881C Controller Driver");
  1496. MODULE_LICENSE("GPL v2");