ddp_dsi.c 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #define LOG_TAG "DSI"
  32. #include <platform/ddp_info.h>
  33. #include <platform/mt_typedefs.h>
  34. #include <platform/sync_write.h>
  35. #include <platform/disp_drv_platform.h>
  36. #include <platform/disp_drv_log.h>
  37. #include <platform/ddp_manager.h>
  38. #include <platform/ddp_reg.h>
  39. #include <platform/ddp_dsi.h>
  40. //#include <platform/ddp_dump.h>
  41. //#include <platform/ddp_path.h>
  42. #include <debug.h>
  43. #include <string.h>
  44. #include <platform/mt_gpt.h>
  45. #define ENABLE_DSI_INTERRUPT 0
  46. #define DSI_MODULE_BEGIN(x) (0)
  47. #define DSI_MODULE_END(x) (0)
  48. #define DSI_MODULE_to_ID(x) (0)
  49. #define DIFF_CLK_LANE_LP 0x10
  50. static int dsi_reg_op_debug = 0;
  51. static int mipi_reg_op_debug = 1;
  52. static int s_isDsiPowerOn = 0;
  53. #define DSI_OUTREG32(cmdq, addr, val) \
  54. {\
  55. if(dsi_reg_op_debug) \
  56. DISPMSG("[dsi/reg]0x%8p=0x%8x \n", addr, val);\
  57. if(cmdq) \
  58. {}\
  59. else \
  60. mt_reg_sync_writel(val, addr);}
  61. #define BIT_TO_VALUE(TYPE,bit) \
  62. do { TYPE r;\
  63. *(unsigned int*)(&r) = ((unsigned int)0x00000000); \
  64. r.bit = ~(r.bit);\
  65. r;\
  66. } while (0);\
  67. #define DSI_MASKREG32(cmdq, REG, MASK, VALUE) \
  68. {\
  69. if(cmdq) \
  70. {}\
  71. else\
  72. DSI_OUTREG32(cmdq, (void *)(REG), (INREG32(REG)&~(MASK))|(VALUE));\
  73. }
  74. #define DSI_OUTREGBIT(cmdq, TYPE,REG,bit,value) \
  75. {\
  76. if(cmdq)\
  77. {do {\
  78. } while (0);}\
  79. else\
  80. {\
  81. do { \
  82. TYPE r = *((TYPE*)&INREG32(&REG)); \
  83. r.bit = value; \
  84. DSI_OUTREG32(cmdq, &REG, AS_UINT32(&r)); \
  85. } while (0);\
  86. }}
  87. #ifdef MACH_FPGA
  88. #define MIPITX_INREG32(addr) \
  89. ({ \
  90. unsigned int val = 0; \
  91. if(0) val = INREG32(addr); \
  92. if(mipi_reg_op_debug) \
  93. { \
  94. DISPMSG("[mipitx/inreg]0x%08p=0x%08x\n", addr, val); \
  95. } \
  96. val; \
  97. })
  98. #define MIPITX_OUTREG32(addr, val) \
  99. {\
  100. if(mipi_reg_op_debug) \
  101. { DISPMSG("[mipitx/reg]0x%08p=0x%08x\n", addr, val);}\
  102. if(0)mt_reg_sync_writel(val, addr);}
  103. #define MIPITX_OUTREGBIT(TYPE,REG,bit,value) \
  104. {\
  105. do { \
  106. TYPE r;\
  107. if(0) r = *((TYPE*)&INREG32(&REG)); \
  108. *(unsigned int*)(&r) = ((unsigned int)0x00000000); \
  109. r.bit = value; \
  110. MIPITX_OUTREG32(&REG, AS_UINT32(&r)); \
  111. } while (0);\
  112. }
  113. #define MIPITX_MASKREG32(x, y, z) MIPITX_OUTREG32(x, (MIPITX_INREG32(x)&~(y))|(z))
  114. #else
  115. #define MIPITX_INREG32(addr) \
  116. ({ \
  117. unsigned int val = 0; \
  118. val = INREG32(addr); \
  119. if(mipi_reg_op_debug) \
  120. { \
  121. DISPMSG("[mipitx/inreg]0x%8p=0x%8x\n", addr, val); \
  122. } \
  123. val; \
  124. })
  125. #define MIPITX_OUTREG32(addr, val) \
  126. {\
  127. if(mipi_reg_op_debug) \
  128. { \
  129. DISPMSG("[mipitx/reg]0x%8p=0x%8x\n", addr, val);\
  130. }\
  131. mt_reg_sync_writel(val, addr);\
  132. }
  133. #define MIPITX_OUTREGBIT(TYPE,REG,bit,value) \
  134. {\
  135. do { \
  136. TYPE r;\
  137. r = *((TYPE*)&INREG32(&REG)); \
  138. r.bit = value; \
  139. MIPITX_OUTREG32(&REG, AS_UINT32(&r)); \
  140. } while (0);\
  141. }
  142. #define MIPITX_MASKREG32(x, y, z) MIPITX_OUTREG32(x, (MIPITX_INREG32(x)&~(y))|(z))
  143. #endif
  144. #define DSI_POLLREG32(cmdq, addr,mask,value) \
  145. do{\
  146. {}\
  147. }while(0);
  148. #define DSI_INREG32(type,addr) \
  149. ({ \
  150. unsigned int var = 0; \
  151. union p_regs \
  152. { \
  153. type p_reg; \
  154. unsigned int * p_uint; \
  155. }p_temp1; \
  156. p_temp1.p_reg = (type)(addr); \
  157. var = INREG32(p_temp1.p_uint); \
  158. var; \
  159. })
  160. #define DSI_READREG32(type, dst, src) \
  161. { \
  162. union p_regs \
  163. { \
  164. type p_reg; \
  165. unsigned int * p_uint; \
  166. }p_temp1,p_temp2; \
  167. p_temp1.p_reg = (type)(dst); \
  168. p_temp2.p_reg = (type)(src); \
  169. OUTREG32(p_temp1.p_uint,INREG32(p_temp2.p_uint));}
  170. typedef struct {
  171. void* handle;
  172. bool enable;
  173. DSI_REGS regBackup;
  174. unsigned int cmdq_size;
  175. LCM_DSI_PARAMS dsi_params;
  176. } t_dsi_context;
  177. t_dsi_context _dsi_context[DSI_INTERFACE_NUM];
  178. static PDSI_REGS const DSI_REG[2] = {(PDSI_REGS)(DSI0_BASE), (PDSI_REGS)(0)};
  179. static PDSI_PHY_REGS const DSI_PHY_REG[2] = {(PDSI_PHY_REGS)(MIPI_TX0_BASE), (PDSI_PHY_REGS)(0)};
  180. static PDSI_CMDQ_REGS const DSI_CMDQ_REG[2] = {(PDSI_CMDQ_REGS)(DSI0_BASE+0x200), (PDSI_CMDQ_REGS)(0+0x200)};
  181. static PDSI_VM_CMDQ_REGS const DSI_VM_CMD_REG[2] = {(PDSI_VM_CMDQ_REGS)(DSI0_BASE + 0x134),(PDSI_VM_CMDQ_REGS)(0 + 0x134)};
  182. static LCM_UTIL_FUNCS lcm_utils_dsi0;
  183. static const LCM_UTIL_FUNCS lcm_utils_dsi1;
  184. static const LCM_UTIL_FUNCS lcm_utils_dsidual;
  185. extern void DSI_PHY_clk_setting(DISP_MODULE_ENUM module, void* cmdq, LCM_DSI_PARAMS *dsi_params);
  186. static void _DSI_INTERNAL_IRQ_Handler(DISP_MODULE_ENUM module, unsigned int param)
  187. {}
  188. static DSI_STATUS DSI_Reset(DISP_MODULE_ENUM module, void* cmdq)
  189. {
  190. int i = 0;
  191. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  192. DSI_OUTREGBIT(cmdq, DSI_COM_CTRL_REG,DSI_REG[i]->DSI_COM_CTRL,DSI_RESET,1);
  193. DSI_OUTREGBIT(cmdq, DSI_COM_CTRL_REG,DSI_REG[i]->DSI_COM_CTRL,DSI_RESET,0);
  194. }
  195. return DSI_STATUS_OK;
  196. }
  197. static int _dsi_is_video_mode(DISP_MODULE_ENUM module)
  198. {
  199. int i = DSI_MODULE_BEGIN(module);
  200. if (DSI_REG[i]->DSI_MODE_CTRL.MODE == CMD_MODE)
  201. return 0;
  202. else
  203. return 1;
  204. }
  205. static DSI_STATUS DSI_SetMode(DISP_MODULE_ENUM module, void* cmdq, unsigned int mode)
  206. {
  207. int i = 0;
  208. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  209. DSI_OUTREGBIT(cmdq, DSI_MODE_CTRL_REG,DSI_REG[i]->DSI_MODE_CTRL,MODE,mode);
  210. }
  211. return DSI_STATUS_OK;
  212. }
  213. static void DSI_WaitForNotBusy(DISP_MODULE_ENUM module, void* cmdq)
  214. {
  215. //DISPFUNC();
  216. int i = 0;
  217. unsigned int tmp = 0;
  218. if (cmdq) {
  219. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  220. DSI_POLLREG32(cmdq, &DSI_REG[i]->DSI_INTSTA, 0x80000000, 0x0);
  221. }
  222. return;
  223. }
  224. /*...dsi video is always in busy state...*/
  225. if (_dsi_is_video_mode(module)) {
  226. return ;
  227. }
  228. i = DSI_MODULE_BEGIN(module);
  229. while (1) {
  230. tmp = INREG32(&DSI_REG[i]->DSI_INTSTA);
  231. if (!(tmp &0x80000000)) break;
  232. }
  233. }
  234. void DSI_lane0_ULP_mode(DISP_MODULE_ENUM module, void* cmdq, bool enter)
  235. {
  236. int i = 0;
  237. ASSERT(cmdq == NULL);
  238. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  239. if (enter) {
  240. DSI_OUTREGBIT(cmdq, DSI_PHY_LD0CON_REG, DSI_REG[i]->DSI_PHY_LD0CON, L0_RM_TRIG_EN, 0);
  241. mdelay(1);
  242. DSI_OUTREGBIT(cmdq, DSI_PHY_LD0CON_REG, DSI_REG[i]->DSI_PHY_LD0CON, L0_ULPM_EN, 0);
  243. DSI_OUTREGBIT(cmdq, DSI_PHY_LD0CON_REG, DSI_REG[i]->DSI_PHY_LD0CON, L0_ULPM_EN, 1);
  244. } else {
  245. DSI_OUTREGBIT(cmdq, DSI_PHY_LD0CON_REG, DSI_REG[i]->DSI_PHY_LD0CON, L0_ULPM_EN, 0);
  246. mdelay(1);
  247. DSI_OUTREGBIT(cmdq, DSI_PHY_LD0CON_REG, DSI_REG[i]->DSI_PHY_LD0CON, L0_WAKEUP_EN, 1);
  248. mdelay(1);
  249. DSI_OUTREGBIT(cmdq, DSI_PHY_LD0CON_REG, DSI_REG[i]->DSI_PHY_LD0CON, L0_WAKEUP_EN, 0);
  250. mdelay(1);
  251. }
  252. }
  253. }
  254. void DSI_clk_ULP_mode(DISP_MODULE_ENUM module, void* cmdq, bool enter)
  255. {
  256. int i = 0;
  257. ASSERT(cmdq == NULL);
  258. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  259. if (enter) {
  260. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_ULPM_EN, 0);
  261. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_ULPM_EN, 1);
  262. mdelay(1);
  263. } else {
  264. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_ULPM_EN, 0);
  265. mdelay(1);
  266. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_WAKEUP_EN, 1);
  267. mdelay(1);
  268. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_WAKEUP_EN, 0);
  269. mdelay(1);
  270. }
  271. }
  272. }
  273. bool DSI_clk_HS_state(DISP_MODULE_ENUM module, void* cmdq)
  274. {
  275. int i = DSI_MODULE_BEGIN(module);
  276. DSI_PHY_LCCON_REG tmpreg;
  277. DSI_READREG32(PDSI_PHY_LCCON_REG, &tmpreg, &DSI_REG[i]->DSI_PHY_LCCON);
  278. return tmpreg.LC_HS_TX_EN ? TRUE : FALSE;
  279. }
  280. void DSI_clk_HS_mode(DISP_MODULE_ENUM module, void* cmdq, bool enter)
  281. {
  282. int i = 0;
  283. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  284. if (enter) { // && !DSI_clk_HS_state(i, cmdq))
  285. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_HS_TX_EN, 1);
  286. } else if (!enter) { // && DSI_clk_HS_state(i, cmdq))
  287. DSI_OUTREGBIT(cmdq, DSI_PHY_LCCON_REG, DSI_REG[i]->DSI_PHY_LCCON, LC_HS_TX_EN, 0);
  288. }
  289. }
  290. return;
  291. }
  292. const char* _dsi_cmd_mode_parse_state(unsigned int state)
  293. {
  294. switch (state) {
  295. case 0x0001:
  296. return "idle";
  297. case 0x0002:
  298. return "Reading command queue for header";
  299. case 0x0004:
  300. return "Sending type-0 command";
  301. case 0x0008:
  302. return "Waiting frame data from RDMA for type-1 command";
  303. case 0x0010:
  304. return "Sending type-1 command";
  305. case 0x0020:
  306. return "Sending type-2 command";
  307. case 0x0040:
  308. return "Reading command queue for data";
  309. case 0x0080:
  310. return "Sending type-3 command";
  311. case 0x0100:
  312. return "Sending BTA";
  313. case 0x0200:
  314. return "Waiting RX-read data ";
  315. case 0x0400:
  316. return "Waiting SW RACK for RX-read data";
  317. case 0x0800:
  318. return "Waiting TE";
  319. case 0x1000:
  320. return "Get TE ";
  321. case 0x2000:
  322. return "Waiting external TE";
  323. case 0x4000:
  324. return "Waiting SW RACK for TE";
  325. default:
  326. return "unknown";
  327. }
  328. }
  329. const char* _dsi_vdo_mode_parse_state(unsigned int state)
  330. {
  331. switch (state) {
  332. case 0x0001:
  333. return "Video mode idle";
  334. case 0x0002:
  335. return "Sync start packet";
  336. case 0x0004:
  337. return "Hsync active";
  338. case 0x0008:
  339. return "Sync end packet";
  340. case 0x0010:
  341. return "Hsync back porch";
  342. case 0x0020:
  343. return "Video data period";
  344. case 0x0040:
  345. return "Hsync front porch";
  346. case 0x0080:
  347. return "BLLP";
  348. case 0x0100:
  349. return "--";
  350. case 0x0200:
  351. return "Mix mode using command mode transmission";
  352. case 0x0400:
  353. return "Command transmission in BLLP";
  354. default:
  355. return "unknown";
  356. }
  357. }
  358. DSI_STATUS DSI_DumpRegisters(DISP_MODULE_ENUM module, void* cmdq, int level)
  359. {
  360. UINT32 i;
  361. if (level >= 0) {
  362. if (module == DISP_MODULE_DSI0/* || module == DISP_MODULE_DSIDUAL*/) {
  363. unsigned int DSI_DBG6_Status = (INREG32(DSI0_BASE+0x160))&0xffff;
  364. unsigned int DSI_DBG7_Status = (INREG32(DSI0_BASE+0x164))&0xff;
  365. dprintf(0,"DSI0 state:%s\n", _dsi_cmd_mode_parse_state(DSI_DBG6_Status));
  366. dprintf(0,"DSI0 vdo state:%s\n", _dsi_vdo_mode_parse_state(DSI_DBG7_Status));
  367. dprintf(0,"DSI Mode: lane num: transfer count: status: ");
  368. }
  369. }
  370. if (level >= 1) {
  371. if (module == DISP_MODULE_DSI0/* || module == DISP_MODULE_DSIDUAL*/) {
  372. unsigned int DSI_DBG6_Status = (INREG32(DSI0_BASE+0x160))&0xffff;
  373. dprintf(0,"---------- Start dump DSI0 registers ----------\n");
  374. for (i = 0; i < sizeof(DSI_REGS); i += 16) {
  375. dprintf(0,"DSI+%04x : 0x%08x 0x%08x 0x%08x 0x%08x\n", i, INREG32(DSI0_BASE + i), INREG32(DSI0_BASE + i + 0x4), INREG32(DSI0_BASE + i + 0x8), INREG32(DSI0_BASE + i + 0xc));
  376. }
  377. for (i = 0; i < sizeof(DSI_CMDQ_REGS); i += 16) {
  378. dprintf(0,"DSI_CMD+%04x : 0x%08x 0x%08x 0x%08x 0x%08x\n", i, INREG32((DSI0_BASE+0x200+i)), INREG32((DSI0_BASE+0x200+i+0x4)), INREG32((DSI0_BASE+0x200+i+0x8)), INREG32((DSI0_BASE+0x200+i+0xc)));
  379. }
  380. #ifndef MACH_FPGA
  381. for (i = 0; i < sizeof(DSI_PHY_REGS); i += 16) {
  382. dprintf(0,"DSI_PHY+%04x : 0x%08x 0x%08x 0x%08x 0x%08x\n", i, INREG32((MIPI_TX0_BASE+i)), INREG32((MIPI_TX0_BASE+i+0x4)), INREG32((MIPI_TX0_BASE+i+0x8)), INREG32((MIPI_TX0_BASE+i+0xc)));
  383. }
  384. #endif
  385. }
  386. }
  387. return DSI_STATUS_OK;
  388. }
  389. DSI_STATUS DSI_SleepOut(DISP_MODULE_ENUM module, void* cmdq)
  390. {
  391. int i = 0;
  392. // wake_up_prd *1024*cycle time > 1ms
  393. //int wake_up_prd = (_dsi_context[i].dsi_params.PLL_CLOCK*2*1000)/(1024*8)+0x1;
  394. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  395. DSI_OUTREGBIT(cmdq, DSI_MODE_CTRL_REG,DSI_REG[i]->DSI_MODE_CTRL,SLEEP_MODE,1);
  396. DSI_OUTREGBIT(cmdq, DSI_TIME_CON0_REG,DSI_REG[i]->DSI_TIME_CON0,UPLS_WAKEUP_PRD,0x22E09); // cycle to 1ms for 520MHz
  397. }
  398. return DSI_STATUS_OK;
  399. }
  400. DSI_STATUS DSI_Wakeup(DISP_MODULE_ENUM module, void* cmdq)
  401. {
  402. int i = 0;
  403. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  404. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[i]->DSI_START,SLEEPOUT_START,0);
  405. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[i]->DSI_START,SLEEPOUT_START,1);
  406. mdelay(1);
  407. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[i]->DSI_START,SLEEPOUT_START,0);
  408. DSI_OUTREGBIT(cmdq, DSI_MODE_CTRL_REG,DSI_REG[i]->DSI_MODE_CTRL,SLEEP_MODE,0);
  409. }
  410. return DSI_STATUS_OK;
  411. }
  412. DSI_STATUS DSI_BackupRegisters(DISP_MODULE_ENUM module, void* cmdq)
  413. {
  414. int i = 0;
  415. DSI_REGS *regs = NULL;
  416. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  417. regs = &(_dsi_context[i].regBackup);
  418. DSI_OUTREG32(cmdq,&regs->DSI_INTEN, AS_UINT32(&DSI_REG[i]->DSI_INTEN));
  419. DSI_OUTREG32(cmdq,&regs->DSI_MODE_CTRL, AS_UINT32(&DSI_REG[i]->DSI_MODE_CTRL));
  420. DSI_OUTREG32(cmdq,&regs->DSI_TXRX_CTRL, AS_UINT32(&DSI_REG[i]->DSI_TXRX_CTRL));
  421. DSI_OUTREG32(cmdq,&regs->DSI_PSCTRL, AS_UINT32(&DSI_REG[i]->DSI_PSCTRL));
  422. DSI_OUTREG32(cmdq,&regs->DSI_VSA_NL, AS_UINT32(&DSI_REG[i]->DSI_VSA_NL));
  423. DSI_OUTREG32(cmdq,&regs->DSI_VBP_NL, AS_UINT32(&DSI_REG[i]->DSI_VBP_NL));
  424. DSI_OUTREG32(cmdq,&regs->DSI_VFP_NL, AS_UINT32(&DSI_REG[i]->DSI_VFP_NL));
  425. DSI_OUTREG32(cmdq,&regs->DSI_VACT_NL, AS_UINT32(&DSI_REG[i]->DSI_VACT_NL));
  426. DSI_OUTREG32(cmdq,&regs->DSI_HSA_WC, AS_UINT32(&DSI_REG[i]->DSI_HSA_WC));
  427. DSI_OUTREG32(cmdq,&regs->DSI_HBP_WC, AS_UINT32(&DSI_REG[i]->DSI_HBP_WC));
  428. DSI_OUTREG32(cmdq,&regs->DSI_HFP_WC, AS_UINT32(&DSI_REG[i]->DSI_HFP_WC));
  429. DSI_OUTREG32(cmdq,&regs->DSI_BLLP_WC, AS_UINT32(&DSI_REG[i]->DSI_BLLP_WC));
  430. DSI_OUTREG32(cmdq,&regs->DSI_HSTX_CKL_WC, AS_UINT32(&DSI_REG[i]->DSI_HSTX_CKL_WC));
  431. DSI_OUTREG32(cmdq,&regs->DSI_MEM_CONTI, AS_UINT32(&DSI_REG[i]->DSI_MEM_CONTI));
  432. DSI_OUTREG32(cmdq,&regs->DSI_PHY_TIMECON0, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON0));
  433. DSI_OUTREG32(cmdq,&regs->DSI_PHY_TIMECON1, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON1));
  434. DSI_OUTREG32(cmdq,&regs->DSI_PHY_TIMECON2, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON2));
  435. DSI_OUTREG32(cmdq,&regs->DSI_PHY_TIMECON3, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON3));
  436. }
  437. return DSI_STATUS_OK;
  438. }
  439. DSI_STATUS DSI_RestoreRegisters(DISP_MODULE_ENUM module, void* cmdq)
  440. {
  441. int i = 0;
  442. DSI_REGS *regs = NULL;
  443. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  444. regs = &(_dsi_context[i].regBackup);
  445. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_INTEN, AS_UINT32(&regs->DSI_INTEN));
  446. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_MODE_CTRL, AS_UINT32(&regs->DSI_MODE_CTRL));
  447. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_TXRX_CTRL, AS_UINT32(&regs->DSI_TXRX_CTRL));
  448. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_PSCTRL, AS_UINT32(&regs->DSI_PSCTRL));
  449. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_VSA_NL, AS_UINT32(&regs->DSI_VSA_NL));
  450. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_VBP_NL, AS_UINT32(&regs->DSI_VBP_NL));
  451. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_VFP_NL, AS_UINT32(&regs->DSI_VFP_NL));
  452. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_VACT_NL, AS_UINT32(&regs->DSI_VACT_NL));
  453. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HSA_WC, AS_UINT32(&regs->DSI_HSA_WC));
  454. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HBP_WC, AS_UINT32(&regs->DSI_HBP_WC));
  455. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HFP_WC, AS_UINT32(&regs->DSI_HFP_WC));
  456. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_BLLP_WC, AS_UINT32(&regs->DSI_BLLP_WC));
  457. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HSTX_CKL_WC, AS_UINT32(&regs->DSI_HSTX_CKL_WC));
  458. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_MEM_CONTI, AS_UINT32(&regs->DSI_MEM_CONTI));
  459. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_PHY_TIMECON0, AS_UINT32(&regs->DSI_PHY_TIMECON0));
  460. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_PHY_TIMECON1, AS_UINT32(&regs->DSI_PHY_TIMECON1));
  461. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_PHY_TIMECON2, AS_UINT32(&regs->DSI_PHY_TIMECON2));
  462. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_PHY_TIMECON3, AS_UINT32(&regs->DSI_PHY_TIMECON3));
  463. }
  464. return DSI_STATUS_OK;
  465. }
  466. void DSI_PHY_clk_switch(DISP_MODULE_ENUM module, void* cmdq, int on)
  467. {
  468. #ifndef MACH_FPGA
  469. int i = 0;
  470. ASSERT(cmdq == NULL);
  471. if (on) {
  472. DSI_PHY_clk_setting(module, cmdq, &(_dsi_context[i].dsi_params));
  473. } else {
  474. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  475. // pre_oe/oe = 1
  476. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNTC_LPTX_PRE_OE,1);
  477. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNTC_LPTX_OE,1);
  478. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNTC_HSTX_PRE_OE,1);
  479. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNTC_HSTX_OE,1);
  480. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT0_LPTX_PRE_OE,1);
  481. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT0_LPTX_OE,1);
  482. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT1_LPTX_PRE_OE,1);
  483. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT1_LPTX_OE,1);
  484. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT2_LPTX_PRE_OE,1);
  485. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT2_LPTX_OE,1);
  486. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT2_HSTX_PRE_OE,1);
  487. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_CON0,SW_LNT2_HSTX_OE,1);
  488. // switch to mipi tx sw mode
  489. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_EN,SW_CTRL_EN,1);
  490. // disable mipi clock
  491. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0,RG_DSI0_MPPLL_PLL_EN,0);
  492. mdelay(1);
  493. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_TOP_REG, DSI_PHY_REG[i]->MIPITX_DSI_PLL_TOP, RG_MPPLL_PRESERVE, 0);
  494. MIPITX_OUTREGBIT( MIPITX_DSI_TOP_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_TOP_CON,RG_DSI_PAD_TIE_LOW_EN, 1);
  495. MIPITX_OUTREGBIT(MIPITX_DSI_CLOCK_LANE_REG,DSI_PHY_REG[i]->MIPITX_DSI_CLOCK_LANE,RG_DSI_LNTC_LDOOUT_EN,0);
  496. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE0_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE0,RG_DSI_LNT0_LDOOUT_EN,0);
  497. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE1_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE1,RG_DSI_LNT1_LDOOUT_EN,0);
  498. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE2_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE2,RG_DSI_LNT2_LDOOUT_EN,0);
  499. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE3_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE3,RG_DSI_LNT3_LDOOUT_EN,0);
  500. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_PWR_REG, DSI_PHY_REG[i]->MIPITX_DSI_PLL_PWR, DA_DSI_MPPLL_SDM_ISO_EN, 1);
  501. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_PWR_REG, DSI_PHY_REG[i]->MIPITX_DSI_PLL_PWR, DA_DSI_MPPLL_SDM_PWR_ON, 0);
  502. MIPITX_OUTREGBIT( MIPITX_DSI_TOP_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_TOP_CON,RG_DSI_LNT_HS_BIAS_EN, 0);
  503. MIPITX_OUTREGBIT( MIPITX_DSI_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_CON,RG_DSI_CKG_LDOOUT_EN,0);
  504. MIPITX_OUTREGBIT( MIPITX_DSI_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_CON,RG_DSI_LDOCORE_EN,0);
  505. MIPITX_OUTREGBIT( MIPITX_DSI_BG_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_BG_CON,RG_DSI_BG_CKEN,0);
  506. MIPITX_OUTREGBIT( MIPITX_DSI_BG_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_BG_CON,RG_DSI_BG_CORE_EN,0);
  507. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0, RG_DSI0_MPPLL_PREDIV,0);
  508. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0, RG_DSI0_MPPLL_TXDIV0,0);
  509. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0, RG_DSI0_MPPLL_TXDIV1,0);
  510. MIPITX_OUTREGBIT( MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0, RG_DSI0_MPPLL_POSDIV,0);
  511. MIPITX_OUTREG32(&DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON1, 0x00000000);
  512. MIPITX_OUTREG32(&DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON2, 0x50000000);
  513. MIPITX_OUTREGBIT( MIPITX_DSI_SW_CTRL_REG,DSI_PHY_REG[i]->MIPITX_DSI_SW_CTRL_EN,SW_CTRL_EN,0);
  514. mdelay(1);
  515. }
  516. }
  517. #endif
  518. }
  519. DSI_STATUS DSI_BIST_Pattern_Test(DISP_MODULE_ENUM module, void* cmdq, bool enable, unsigned int color)
  520. {
  521. int i = 0;
  522. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  523. if (enable) {
  524. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_BIST_PATTERN, color);
  525. //DSI_OUTREG32(&DSI_REG->DSI_BIST_CON, AS_UINT32(&temp_reg));
  526. //DSI_OUTREGBIT(DSI_BIST_CON_REG, DSI_REG->DSI_BIST_CON, SELF_PAT_MODE, 1);
  527. DSI_OUTREGBIT(cmdq, DSI_BIST_CON_REG, DSI_REG[i]->DSI_BIST_CON, SELF_PAT_MODE, 1);
  528. //DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_BIST_CON, 0x00200f43);
  529. //DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_BIST_CON, 0x00000040);
  530. dprintf(0,"DSI_BIST_Pattern_Test SELF_PAT_MODE\n");
  531. } else {
  532. DSI_OUTREGBIT(cmdq, DSI_BIST_CON_REG, DSI_REG[i]->DSI_BIST_CON, SELF_PAT_MODE, 0);
  533. }
  534. if (!_dsi_is_video_mode(module)) {
  535. DSI_T0_INS t0;
  536. t0.CONFG = 0x09;
  537. t0.Data_ID = 0x39;
  538. t0.Data0 = 0x2c;
  539. t0.Data1 = 0;
  540. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[i]->data[0], AS_UINT32(&t0));
  541. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_CMDQ_SIZE, 1);
  542. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[i]->DSI_START,DSI_START,0);
  543. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[i]->DSI_START,DSI_START,1);
  544. dprintf(0,"DSI_BIST_Pattern_Test CMD\n");
  545. }
  546. }
  547. return DSI_STATUS_OK;
  548. }
  549. void DSI_Config_VDO_Timing(DISP_MODULE_ENUM module, void* cmdq, LCM_DSI_PARAMS *dsi_params)
  550. {
  551. int i = 0;
  552. unsigned int line_byte = 0;
  553. unsigned int horizontal_sync_active_byte = 0;
  554. unsigned int horizontal_backporch_byte = 0;
  555. unsigned int horizontal_frontporch_byte = 0;
  556. unsigned int horizontal_bllp_byte = 0;
  557. unsigned int dsiTmpBufBpp = 0;
  558. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  559. if (dsi_params->data_format.format == LCM_DSI_FORMAT_RGB565) {
  560. dsiTmpBufBpp = 2;
  561. } else {
  562. dsiTmpBufBpp = 3;
  563. }
  564. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_VSA_NL, dsi_params->vertical_sync_active);
  565. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_VBP_NL, dsi_params->vertical_backporch);
  566. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_VFP_NL, dsi_params->vertical_frontporch);
  567. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_VACT_NL, dsi_params->vertical_active_line);
  568. line_byte = (dsi_params->horizontal_sync_active + dsi_params->horizontal_backporch + dsi_params->horizontal_frontporch + dsi_params->horizontal_active_pixel) * dsiTmpBufBpp;
  569. if (dsi_params->mode == SYNC_EVENT_VDO_MODE || dsi_params->mode == BURST_VDO_MODE || dsi_params->switch_mode == SYNC_EVENT_VDO_MODE || dsi_params->switch_mode == BURST_VDO_MODE) {
  570. ASSERT((dsi_params->horizontal_backporch + dsi_params->horizontal_sync_active) * dsiTmpBufBpp> 9);
  571. horizontal_backporch_byte = ((dsi_params->horizontal_backporch + dsi_params->horizontal_sync_active)* dsiTmpBufBpp - 10);
  572. } else {
  573. ASSERT(dsi_params->horizontal_sync_active * dsiTmpBufBpp > 9);
  574. horizontal_sync_active_byte = (dsi_params->horizontal_sync_active * dsiTmpBufBpp - 10);
  575. ASSERT(dsi_params->horizontal_backporch * dsiTmpBufBpp > 9);
  576. horizontal_backporch_byte = (dsi_params->horizontal_backporch * dsiTmpBufBpp - 10);
  577. }
  578. ASSERT(dsi_params->horizontal_frontporch * dsiTmpBufBpp > 11);
  579. horizontal_frontporch_byte = (dsi_params->horizontal_frontporch * dsiTmpBufBpp - 12);
  580. horizontal_bllp_byte = (dsi_params->horizontal_bllp * dsiTmpBufBpp);
  581. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_HSA_WC, ALIGN_TO((horizontal_sync_active_byte), 4));
  582. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_HBP_WC, ALIGN_TO((horizontal_backporch_byte), 4));
  583. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_HFP_WC, ALIGN_TO((horizontal_frontporch_byte), 4));
  584. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_BLLP_WC, ALIGN_TO((horizontal_bllp_byte), 4));
  585. }
  586. }
  587. void DSI_PHY_CLK_LP_PerLine_config(DISP_MODULE_ENUM module, cmdqRecHandle cmdq, LCM_DSI_PARAMS *dsi_params)
  588. {
  589. int i;
  590. DSI_PHY_TIMCON0_REG timcon0 = {0}; // LPX
  591. DSI_PHY_TIMCON2_REG timcon2 = {0}; // CLK_HS_TRAIL, CLK_HS_ZERO
  592. DSI_PHY_TIMCON3_REG timcon3 = {0}; // CLK_HS_EXIT, CLK_HS_POST, CLK_HS_PREP
  593. DSI_HSA_WC_REG hsa = {0};
  594. DSI_HBP_WC_REG hbp = {0};
  595. DSI_HFP_WC_REG hfp = {0}, new_hfp = {0};
  596. DSI_BLLP_WC_REG bllp = {0};
  597. DSI_PSCTRL_REG ps = {0};
  598. UINT32 hstx_ckl_wc = 0;
  599. UINT32 new_hstx_ckl_wc = 0;
  600. UINT32 v_a,v_b,v_c,lane_num ;
  601. LCM_DSI_MODE_CON dsi_mode;
  602. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  603. lane_num = dsi_params->LANE_NUM;
  604. dsi_mode = dsi_params->mode;
  605. if (dsi_mode == CMD_MODE) {
  606. continue;
  607. }
  608. // vdo mode
  609. DSI_OUTREG32(cmdq,&hsa, AS_UINT32(&DSI_REG[i]->DSI_HSA_WC));
  610. DSI_OUTREG32(cmdq,&hbp, AS_UINT32(&DSI_REG[i]->DSI_HBP_WC));
  611. DSI_OUTREG32(cmdq,&hfp, AS_UINT32(&DSI_REG[i]->DSI_HFP_WC));
  612. DSI_OUTREG32(cmdq,&bllp, AS_UINT32(&DSI_REG[i]->DSI_BLLP_WC));
  613. DSI_OUTREG32(cmdq,&ps, AS_UINT32(&DSI_REG[i]->DSI_PSCTRL));
  614. DSI_OUTREG32(cmdq,&hstx_ckl_wc, AS_UINT32(&DSI_REG[i]->DSI_HSTX_CKL_WC));
  615. DSI_OUTREG32(cmdq,&timcon0, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON0));
  616. DSI_OUTREG32(cmdq,&timcon2, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON2));
  617. DSI_OUTREG32(cmdq,&timcon3, AS_UINT32(&DSI_REG[i]->DSI_PHY_TIMECON3));
  618. // 1. sync_pulse_mode
  619. // Total WC(A) = HSA_WC + HBP_WC + HFP_WC + PS_WC + 32
  620. // CLK init WC(B) = (CLK_HS_EXIT + LPX + CLK_HS_PREP + CLK_HS_ZERO)*lane_num
  621. // CLK end WC(C) = (CLK_HS_POST + CLK_HS_TRAIL)*lane_num
  622. // HSTX_CKLP_WC = A - B
  623. // Limitation: B + C < HFP_WC
  624. if (dsi_mode == SYNC_PULSE_VDO_MODE ) {
  625. v_a = hsa.HSA_WC + hbp.HBP_WC + hfp.HFP_WC + ps.DSI_PS_WC +32;
  626. v_b = (timcon3.CLK_HS_EXIT + timcon0.LPX + timcon3.CLK_HS_PRPR + timcon2.CLK_ZERO)*lane_num;
  627. v_c = (timcon3.CLK_HS_POST + timcon2.CLK_TRAIL)* lane_num;
  628. DISPCHECK("===>v_a-v_b=0x%x,HSTX_CKLP_WC=0x%x\n",(v_a - v_b),hstx_ckl_wc);
  629. DISPCHECK("===>v_b+v_c=0x%x,HFP_WC=0x%x\n",(v_b+v_c),AS_UINT32(&hfp));
  630. DISPCHECK("===>Will Reconfig in order to fulfill LP clock lane per line\n");
  631. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HFP_WC,(v_b+v_c+DIFF_CLK_LANE_LP));//B+C < HFP ,here diff is 0x10;
  632. DSI_OUTREG32(cmdq,&new_hfp, AS_UINT32(&DSI_REG[i]->DSI_HFP_WC));
  633. v_a = hsa.HSA_WC + hbp.HBP_WC + new_hfp.HFP_WC + ps.DSI_PS_WC +32;
  634. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HSTX_CKL_WC, (v_a - v_b));
  635. DSI_OUTREG32(cmdq,&new_hstx_ckl_wc, AS_UINT32(&DSI_REG[i]->DSI_HSTX_CKL_WC));
  636. DISPCHECK("===>new HSTX_CKL_WC=0x%x, HFP_WC=0x%x\n",new_hstx_ckl_wc,new_hfp.HFP_WC);
  637. }
  638. // 2. sync_event_mode
  639. // Total WC(A) = HBP_WC + HFP_WC + PS_WC + 26
  640. // CLK init WC(B) = (CLK_HS_EXIT + LPX + CLK_HS_PREP + CLK_HS_ZERO)*lane_num
  641. // CLK end WC(C) = (CLK_HS_POST + CLK_HS_TRAIL)*lane_num
  642. // HSTX_CKLP_WC = A - B
  643. // Limitation: B + C < HFP_WC
  644. else if (dsi_mode == SYNC_EVENT_VDO_MODE) {
  645. v_a = hbp.HBP_WC + hfp.HFP_WC + ps.DSI_PS_WC +26;
  646. v_b = (timcon3.CLK_HS_EXIT + timcon0.LPX + timcon3.CLK_HS_PRPR + timcon2.CLK_ZERO)*lane_num;
  647. v_c = (timcon3.CLK_HS_POST + timcon2.CLK_TRAIL)* lane_num;
  648. DISPCHECK("===>v_a-v_b=0x%x,HSTX_CKLP_WC=0x%x\n",(v_a - v_b),hstx_ckl_wc);
  649. DISPCHECK("===>v_b+v_c=0x%x,HFP_WC=0x%x\n",(v_b+v_c),AS_UINT32(&hfp));
  650. DISPCHECK("===>Will Reconfig in order to fulfill LP clock lane per line\n");
  651. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HFP_WC,(v_b+v_c+DIFF_CLK_LANE_LP));//B+C < HFP ,here diff is 0x10;
  652. DSI_OUTREG32(cmdq,&new_hfp, AS_UINT32(&DSI_REG[i]->DSI_HFP_WC));
  653. v_a = hbp.HBP_WC + new_hfp.HFP_WC + ps.DSI_PS_WC +26;
  654. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HSTX_CKL_WC, (v_a - v_b));
  655. DSI_OUTREG32(cmdq,&new_hstx_ckl_wc, AS_UINT32(&DSI_REG[i]->DSI_HSTX_CKL_WC));
  656. DISPCHECK("===>new HSTX_CKL_WC=0x%x, HFP_WC=0x%x\n",new_hstx_ckl_wc,new_hfp.HFP_WC);
  657. }
  658. // 3. burst_mode
  659. // Total WC(A) = HBP_WC + HFP_WC + PS_WC + BLLP_WC + 32
  660. // CLK init WC(B) = (CLK_HS_EXIT + LPX + CLK_HS_PREP + CLK_HS_ZERO)*lane_num
  661. // CLK end WC(C) = (CLK_HS_POST + CLK_HS_TRAIL)*lane_num
  662. // HSTX_CKLP_WC = A - B
  663. // Limitation: B + C < HFP_WC
  664. else if (dsi_mode == BURST_VDO_MODE) {
  665. v_a = hbp.HBP_WC + hfp.HFP_WC + ps.DSI_PS_WC +bllp.BLLP_WC+32;
  666. v_b = (timcon3.CLK_HS_EXIT + timcon0.LPX + timcon3.CLK_HS_PRPR + timcon2.CLK_ZERO)*lane_num;
  667. v_c = (timcon3.CLK_HS_POST + timcon2.CLK_TRAIL)* lane_num;
  668. DISPCHECK("===>v_a-v_b=0x%x,HSTX_CKLP_WC=0x%x\n",(v_a - v_b),hstx_ckl_wc);
  669. DISPCHECK("===>v_b+v_c=0x%x,HFP_WC=0x%x\n",(v_b+v_c),AS_UINT32(&hfp));
  670. DISPCHECK("===>Will Reconfig in order to fulfill LP clock lane per line\n");
  671. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HFP_WC,(v_b+v_c+DIFF_CLK_LANE_LP));//B+C < HFP ,here diff is 0x10;
  672. DSI_OUTREG32(cmdq,&new_hfp, AS_UINT32(&DSI_REG[i]->DSI_HFP_WC));
  673. v_a = hbp.HBP_WC + new_hfp.HFP_WC + ps.DSI_PS_WC +bllp.BLLP_WC+32;
  674. DSI_OUTREG32(cmdq,&DSI_REG[i]->DSI_HSTX_CKL_WC, (v_a - v_b));
  675. DSI_OUTREG32(cmdq,&new_hstx_ckl_wc, AS_UINT32(&DSI_REG[i]->DSI_HSTX_CKL_WC));
  676. DISPCHECK("===>new HSTX_CKL_WC=0x%x, HFP_WC=0x%x\n",new_hstx_ckl_wc,new_hfp.HFP_WC);
  677. }
  678. }
  679. }
  680. int _dsi_ps_type_to_bpp(LCM_PS_TYPE ps)
  681. {
  682. switch (ps) {
  683. case LCM_PACKED_PS_16BIT_RGB565:
  684. return 2;
  685. case LCM_LOOSELY_PS_18BIT_RGB666:
  686. return 3;
  687. case LCM_PACKED_PS_24BIT_RGB888:
  688. return 3;
  689. case LCM_PACKED_PS_18BIT_RGB666:
  690. return 3;
  691. default:
  692. DISPERR("[_dsi_ps_type_to_bpp] ps is not match !!!\n");
  693. return 3;
  694. }
  695. }
  696. DSI_STATUS DSI_PS_Control(DISP_MODULE_ENUM module, void* cmdq, LCM_DSI_PARAMS *dsi_params, int w, int h)
  697. {
  698. int i = 0;
  699. unsigned int ps_sel_bitvalue = 0;
  700. ASSERT(dsi_params->PS <= PACKED_PS_18BIT_RGB666);
  701. if (dsi_params->PS > LOOSELY_PS_18BIT_RGB666) {
  702. ps_sel_bitvalue = (5 - dsi_params->PS);
  703. } else {
  704. ps_sel_bitvalue = dsi_params->PS;
  705. }
  706. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  707. DSI_OUTREGBIT(cmdq, DSI_VACT_NL_REG, DSI_REG[i]->DSI_VACT_NL, VACT_NL, h);
  708. if (dsi_params->ufoe_enable && dsi_params->ufoe_params.lr_mode_en != 1) {
  709. if (dsi_params->ufoe_params.compress_ratio == 3) { //1/3
  710. unsigned int ufoe_internal_width = w + w%4;
  711. if (ufoe_internal_width % 3 == 0) {
  712. DSI_OUTREGBIT(cmdq, DSI_PSCTRL_REG, DSI_REG[i]->DSI_PSCTRL, DSI_PS_WC, (ufoe_internal_width/3) * _dsi_ps_type_to_bpp(dsi_params->PS));
  713. } else {
  714. unsigned int temp_w = ufoe_internal_width /3 +1;
  715. temp_w = ((temp_w%2)==1)?(temp_w+1):temp_w;
  716. DSI_OUTREGBIT(cmdq, DSI_PSCTRL_REG, DSI_REG[i]->DSI_PSCTRL, DSI_PS_WC, temp_w * _dsi_ps_type_to_bpp(dsi_params->PS));
  717. }
  718. } else //1/2
  719. DSI_OUTREGBIT(cmdq, DSI_PSCTRL_REG, DSI_REG[i]->DSI_PSCTRL, DSI_PS_WC, ( w+w%4)/2 * _dsi_ps_type_to_bpp(dsi_params->PS));
  720. } else {
  721. DSI_OUTREGBIT(cmdq, DSI_PSCTRL_REG, DSI_REG[i]->DSI_PSCTRL, DSI_PS_WC, w * _dsi_ps_type_to_bpp(dsi_params->PS));
  722. }
  723. DSI_OUTREGBIT(cmdq, DSI_PSCTRL_REG, DSI_REG[i]->DSI_PSCTRL, DSI_PS_SEL, ps_sel_bitvalue);
  724. }
  725. return DSI_STATUS_OK;
  726. }
  727. DSI_STATUS DSI_TXRX_Control(DISP_MODULE_ENUM module, void* cmdq, LCM_DSI_PARAMS *dsi_params)
  728. {
  729. int i = 0;
  730. unsigned int lane_num_bitvalue = 0;
  731. int lane_num = dsi_params->LANE_NUM;
  732. int vc_num = 0;
  733. bool null_packet_en = FALSE;
  734. bool dis_eotp_en = FALSE;
  735. bool hstx_cklp_en = dsi_params->cont_clock?FALSE:TRUE;
  736. int max_return_size = 0;
  737. switch (lane_num) {
  738. case LCM_ONE_LANE:
  739. lane_num_bitvalue = 0x1;
  740. break;
  741. case LCM_TWO_LANE:
  742. lane_num_bitvalue = 0x3;
  743. break;
  744. case LCM_THREE_LANE:
  745. lane_num_bitvalue = 0x7;
  746. break;
  747. case LCM_FOUR_LANE:
  748. lane_num_bitvalue = 0xF;
  749. break;
  750. }
  751. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  752. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,VC_NUM, vc_num);
  753. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,DIS_EOT, dis_eotp_en);
  754. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,BLLP_EN, null_packet_en);
  755. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,MAX_RTN_SIZE, max_return_size);
  756. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,HSTX_CKLP_EN, hstx_cklp_en);
  757. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,LANE_NUM, lane_num_bitvalue);
  758. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_MEM_CONTI, DSI_WMEM_CONTI);
  759. if (CMD_MODE == dsi_params->mode || (CMD_MODE!= dsi_params->mode && dsi_params->eint_disable)) {
  760. // defalut 0, set ext te edge if necessary
  761. if (dsi_params->ext_te_edge == LCM_POLARITY_FALLING) {
  762. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG, DSI_REG[i]->DSI_TXRX_CTRL, EXT_TE_EDGE, 1);
  763. DISPCHECK("DSI VDO Mode TEINT On\n");
  764. }
  765. DSI_OUTREGBIT(cmdq, DSI_TXRX_CTRL_REG,DSI_REG[i]->DSI_TXRX_CTRL,EXT_TE_EN,1);
  766. }
  767. }
  768. return DSI_STATUS_OK;
  769. }
  770. void DSI_PHY_clk_setting(DISP_MODULE_ENUM module, void* cmdq, LCM_DSI_PARAMS *dsi_params)
  771. {
  772. DISPFUNC();
  773. #ifdef MACH_FPGA
  774. #if 0
  775. MIPITX_OUTREG32(0x10215044, 0x88492483);
  776. MIPITX_OUTREG32(0x10215040, 0x00000002);
  777. mdelay(10);
  778. MIPITX_OUTREG32(0x10215000, 0x00000403);
  779. MIPITX_OUTREG32(0x10215068, 0x00000003);
  780. MIPITX_OUTREG32(0x10215068, 0x00000001);
  781. mdelay(10);
  782. MIPITX_OUTREG32(0x10215050, 0x00000000);
  783. mdelay(10);
  784. MIPITX_OUTREG32(0x10215054, 0x00000003);
  785. MIPITX_OUTREG32(0x10215058, 0x60000000);
  786. MIPITX_OUTREG32(0x1021505c, 0x00000000);
  787. MIPITX_OUTREG32(0x10215004, 0x00000803);
  788. MIPITX_OUTREG32(0x10215008, 0x00000801);
  789. MIPITX_OUTREG32(0x1021500c, 0x00000801);
  790. MIPITX_OUTREG32(0x10215010, 0x00000801);
  791. MIPITX_OUTREG32(0x10215014, 0x00000801);
  792. MIPITX_OUTREG32(0x10215050, 0x00000001);
  793. mdelay(10);
  794. MIPITX_OUTREG32(0x10215064, 0x00000020);
  795. return 0;
  796. // mipitx1
  797. MIPITX_OUTREG32(0x10216044, 0x88492483);
  798. MIPITX_OUTREG32(0x10216040, 0x00000002);
  799. mdelay(10);
  800. MIPITX_OUTREG32(0x10216000, 0x00000403);
  801. MIPITX_OUTREG32(0x10216068, 0x00000003);
  802. MIPITX_OUTREG32(0x10216068, 0x00000001);
  803. mdelay(10);
  804. MIPITX_OUTREG32(0x10216050, 0x00000000);
  805. mdelay(10);
  806. MIPITX_OUTREG32(0x10216054, 0x00000003);
  807. MIPITX_OUTREG32(0x10216058, 0x40000000);
  808. MIPITX_OUTREG32(0x1021605c, 0x00000000);
  809. MIPITX_OUTREG32(0x10216004, 0x00000803);
  810. MIPITX_OUTREG32(0x10216008, 0x00000801);
  811. MIPITX_OUTREG32(0x1021600c, 0x00000801);
  812. MIPITX_OUTREG32(0x10216010, 0x00000801);
  813. MIPITX_OUTREG32(0x10216014, 0x00000801);
  814. MIPITX_OUTREG32(0x10216050, 0x00000001);
  815. mdelay(10);
  816. MIPITX_OUTREG32(0x10216064, 0x00000020);
  817. return 0;
  818. #endif
  819. #else
  820. int i = 0;
  821. unsigned int data_Rate = dsi_params->PLL_CLOCK*2;
  822. unsigned int txdiv = 0;
  823. unsigned int txdiv0 = 0;
  824. unsigned int txdiv1 = 0;
  825. unsigned int pcw = 0;
  826. // unsigned int fmod = 30;//Fmod = 30KHz by default
  827. unsigned int delta1 = 5;//Delta1 is SSC range, default is 0%~-5%
  828. unsigned int pdelta1= 0;
  829. //u32 m_hw_res3 = 0;
  830. //u32 temp1 =0;
  831. //u32 temp2 = 0;
  832. //u32 temp3 = 0;
  833. //u32 temp4 = 0;
  834. //u32 temp5 = 0;
  835. u32 lnt = 0;
  836. // temp1~5 is used for impedence calibration, not enable now
  837. #if 0
  838. m_hw_res3 = INREG32(0xF0206180);
  839. temp1 = (m_hw_res3 >> 28) & 0xF;
  840. temp2 = (m_hw_res3 >> 24) & 0xF;
  841. temp3 = (m_hw_res3 >> 20) & 0xF;
  842. temp4 = (m_hw_res3 >> 16) & 0xF;
  843. temp5 = (m_hw_res3 >> 12) & 0xF;
  844. #endif
  845. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  846. // step 0
  847. lnt = MIPITX_INREG32((void *)0x10206190);
  848. if (lnt == 0) {
  849. DISPINFO("efuse value = 0!\n");
  850. lnt = 0x8;
  851. MIPITX_OUTREGBIT(MIPITX_DSI_CLOCK_LANE_REG,DSI_PHY_REG[i]->MIPITX_DSI_CLOCK_LANE,RG_DSI_LNTC_RT_CODE,(lnt & 0xf));
  852. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE3_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE3,RG_DSI_LNT3_RT_CODE,(lnt & 0xf));
  853. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE2_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE2,RG_DSI_LNT2_RT_CODE,(lnt & 0xf));
  854. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE1_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE1,RG_DSI_LNT1_RT_CODE,(lnt & 0xf));
  855. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE0_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE0,RG_DSI_LNT0_RT_CODE,(lnt & 0xf));
  856. } else {
  857. MIPITX_OUTREGBIT(MIPITX_DSI_CLOCK_LANE_REG,DSI_PHY_REG[i]->MIPITX_DSI_CLOCK_LANE,RG_DSI_LNTC_RT_CODE,((lnt >> 16) & 0xf));
  858. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE3_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE3,RG_DSI_LNT3_RT_CODE,((lnt >> 8) & 0xf));
  859. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE2_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE2,RG_DSI_LNT2_RT_CODE,((lnt >> 12) & 0xf));
  860. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE1_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE1,RG_DSI_LNT1_RT_CODE,((lnt >> 20) & 0xf));
  861. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE0_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE0,RG_DSI_LNT0_RT_CODE,((lnt >> 24) & 0xf));
  862. }
  863. DISPINFO("PLL config: LNT=0x%x,clk=0x%x,lan3=0x%x,lan2=0x%x,lan1=0x%x,lan0=0x%x\n",
  864. lnt,INREG32(&DSI_PHY_REG[i]->MIPITX_DSI_CLOCK_LANE),
  865. INREG32(&DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE3), INREG32(&DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE2),
  866. INREG32(&DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE1), INREG32(&DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE0));
  867. // step 1
  868. //MIPITX_MASKREG32(APMIXED_BASE+0x00, (0x1<<6), 1);
  869. // step 2
  870. MIPITX_OUTREGBIT(MIPITX_DSI_BG_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_BG_CON,RG_DSI_BG_CORE_EN,1);
  871. MIPITX_OUTREGBIT(MIPITX_DSI_BG_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_BG_CON,RG_DSI_BG_CKEN,1);
  872. // step 3
  873. udelay(30);
  874. // step 4
  875. MIPITX_OUTREGBIT(MIPITX_DSI_TOP_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_TOP_CON,RG_DSI_LNT_HS_BIAS_EN,1);
  876. // step 5
  877. MIPITX_OUTREGBIT(MIPITX_DSI_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_CON,RG_DSI_CKG_LDOOUT_EN,1);
  878. MIPITX_OUTREGBIT(MIPITX_DSI_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_CON,RG_DSI_LDOCORE_EN,1);
  879. // step 6
  880. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_PWR_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_PWR,DA_DSI_MPPLL_SDM_PWR_ON,1);
  881. // step 7
  882. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_PWR_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_PWR,DA_DSI_MPPLL_SDM_ISO_EN,0);
  883. if (0!=data_Rate) {
  884. if (data_Rate > 1250) {
  885. DISPCHECK("mipitx Data Rate exceed limitation(%d)\n", data_Rate);
  886. ASSERT(0);
  887. } else if (data_Rate >= 500) {
  888. txdiv = 1;
  889. txdiv0 = 0;
  890. txdiv1 = 0;
  891. } else if (data_Rate >= 250) {
  892. txdiv = 2;
  893. txdiv0 = 1;
  894. txdiv1 = 0;
  895. } else if (data_Rate >= 125) {
  896. txdiv = 4;
  897. txdiv0 = 2;
  898. txdiv1 = 0;
  899. } else if (data_Rate > 62) {
  900. txdiv = 8;
  901. txdiv0 = 2;
  902. txdiv1 = 1;
  903. } else if (data_Rate >= 50) {
  904. txdiv = 16;
  905. txdiv0 = 2;
  906. txdiv1 = 2;
  907. } else {
  908. DISPCHECK("dataRate is too low(%d)\n", data_Rate);
  909. ASSERT(0);
  910. }
  911. // step 8
  912. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0,RG_DSI0_MPPLL_TXDIV0, txdiv0);
  913. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0,RG_DSI0_MPPLL_TXDIV1, txdiv1);
  914. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0,RG_DSI0_MPPLL_PREDIV, 0);
  915. // step 9
  916. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_FRA_EN,1);
  917. // step 10
  918. // PLL PCW config
  919. /*
  920. PCW bit 24~30 = floor(pcw)
  921. PCW bit 16~23 = (pcw - floor(pcw))*256
  922. PCW bit 8~15 = (pcw*256 - floor(pcw)*256)*256
  923. PCW bit 8~15 = (pcw*256*256 - floor(pcw)*256*256)*256
  924. */
  925. // pcw = data_Rate*4*txdiv/(26*2);//Post DIV =4, so need data_Rate*4
  926. pcw = data_Rate*txdiv/13;
  927. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON2_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON2,RG_DSI0_MPPLL_SDM_PCW_H,(pcw & 0x7F));
  928. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON2_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON2,RG_DSI0_MPPLL_SDM_PCW_16_23,((256*(data_Rate*txdiv%13)/13) & 0xFF));
  929. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON2_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON2,RG_DSI0_MPPLL_SDM_PCW_8_15,((256*(256*(data_Rate*txdiv%13)%13)/13) & 0xFF));
  930. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON2_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON2,RG_DSI0_MPPLL_SDM_PCW_0_7,((256*(256*(256*(data_Rate*txdiv%13)%13)%13)/13) & 0xFF));
  931. if (1 != dsi_params->ssc_disable) {
  932. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_SSC_PH_INIT,1);
  933. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_SSC_PRD,0x1B1);//PRD=ROUND(pmod) = 433;
  934. if (0 != dsi_params->ssc_range) {
  935. delta1 = dsi_params->ssc_range;
  936. }
  937. ASSERT(delta1<=8);
  938. pdelta1 = (delta1*data_Rate*txdiv*262144+281664)/563329;
  939. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON3_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON3,RG_DSI0_MPPLL_SDM_SSC_DELTA,pdelta1);
  940. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON3_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON3,RG_DSI0_MPPLL_SDM_SSC_DELTA1,pdelta1);
  941. //DSI_OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_FRA_EN,1);
  942. DISPMSG("[dsi_drv.c] PLL config:data_rate=%d,txdiv=%d,pcw=%d,delta1=%d,pdelta1=0x%x\n",data_Rate,txdiv,DSI_INREG32(PMIPITX_DSI_PLL_CON2_REG,&DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON2),delta1,pdelta1);
  943. }
  944. } else {
  945. DISPERR("[dsi_dsi.c] PLL clock should not be 0!!!\n");
  946. ASSERT(0);
  947. }
  948. if ((0 != data_Rate) && (1 != dsi_params->ssc_disable)) {
  949. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_SSC_EN,1);
  950. } else {
  951. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON1_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON1,RG_DSI0_MPPLL_SDM_SSC_EN,0);
  952. }
  953. // step 11
  954. MIPITX_OUTREGBIT(MIPITX_DSI_CLOCK_LANE_REG,DSI_PHY_REG[i]->MIPITX_DSI_CLOCK_LANE,RG_DSI_LNTC_LDOOUT_EN,1);
  955. // step 12
  956. if (dsi_params->LANE_NUM > 0) {
  957. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE0_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE0,RG_DSI_LNT0_LDOOUT_EN,1);
  958. }
  959. // step 13
  960. if (dsi_params->LANE_NUM > 1) {
  961. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE1_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE1,RG_DSI_LNT1_LDOOUT_EN,1);
  962. }
  963. // step 14
  964. if (dsi_params->LANE_NUM > 2) {
  965. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE2_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE2,RG_DSI_LNT2_LDOOUT_EN,1);
  966. }
  967. // step 15
  968. if (dsi_params->LANE_NUM > 3) {
  969. MIPITX_OUTREGBIT(MIPITX_DSI_DATA_LANE3_REG,DSI_PHY_REG[i]->MIPITX_DSI_DATA_LANE3,RG_DSI_LNT3_LDOOUT_EN,1);
  970. }
  971. // step 16
  972. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CON0_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CON0,RG_DSI0_MPPLL_PLL_EN,1);
  973. // step 17
  974. udelay(20);
  975. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CHG_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CHG, RG_DSI0_MPPLL_SDM_PCW_CHG,0);
  976. MIPITX_OUTREGBIT(MIPITX_DSI_PLL_CHG_REG,DSI_PHY_REG[i]->MIPITX_DSI_PLL_CHG, RG_DSI0_MPPLL_SDM_PCW_CHG,1);
  977. // step 18
  978. MIPITX_OUTREGBIT(MIPITX_DSI_TOP_CON_REG,DSI_PHY_REG[i]->MIPITX_DSI_TOP_CON,RG_DSI_PAD_TIE_LOW_EN, 0);
  979. // DONT_KNOW_WHY, for dsi 8 lane, it seems that if we wait more here, the 2 dsi port's data will be always right. othersie will have random color wrong issue
  980. udelay(200);
  981. }
  982. #endif
  983. }
  984. void DSI_PHY_TIMCONFIG(DISP_MODULE_ENUM module, void* cmdq, LCM_DSI_PARAMS *dsi_params)
  985. {
  986. int i = 0;
  987. #ifdef MACH_FPGA
  988. return 0;
  989. #endif
  990. DSI_PHY_TIMCON0_REG timcon0;
  991. DSI_PHY_TIMCON1_REG timcon1;
  992. DSI_PHY_TIMCON2_REG timcon2;
  993. DSI_PHY_TIMCON3_REG timcon3;
  994. //unsigned int div1 = 0;
  995. //unsigned int div2 = 0;
  996. //unsigned int pre_div = 0;
  997. //unsigned int post_div = 0;
  998. //unsigned int fbk_sel = 0;
  999. //unsigned int fbk_div = 0;
  1000. unsigned int lane_no = dsi_params->LANE_NUM;
  1001. // unsigned int div2_real;
  1002. unsigned int cycle_time;
  1003. unsigned int ui;
  1004. unsigned int hs_trail_m, hs_trail_n;
  1005. if (0 != dsi_params->PLL_CLOCK) {
  1006. ui= 1000/(dsi_params->PLL_CLOCK*2)+0x01;
  1007. cycle_time=8000/(dsi_params->PLL_CLOCK*2)+0x01;
  1008. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "[DISP] - kernel - DSI_PHY_TIMCONFIG, Cycle Time = %d(ns), Unit Interval = %d(ns). , lane# = %d \n", cycle_time, ui, lane_no);
  1009. } else {
  1010. DISPERR("[dsi_dsi.c] PLL clock should not be 0!!!\n");
  1011. ASSERT(0);
  1012. }
  1013. // div2_real=div2 ? div2*0x02 : 0x1;
  1014. //cycle_time = (1000 * div2 * div1 * pre_div * post_div)/ (fbk_sel * (fbk_div+0x01) * 26) + 1;
  1015. //ui = (1000 * div2 * div1 * pre_div * post_div)/ (fbk_sel * (fbk_div+0x01) * 26 * 2) + 1;
  1016. #define NS_TO_CYCLE(n, c) ((n) / (c))
  1017. hs_trail_m=1;
  1018. hs_trail_n= (dsi_params->HS_TRAIL == 0) ? NS_TO_CYCLE(((hs_trail_m * 0x4 * ui) + 0x50), cycle_time) : dsi_params->HS_TRAIL;
  1019. // +3 is recommended from designer becauase of HW latency
  1020. timcon0.HS_TRAIL = (hs_trail_m > hs_trail_n) ? hs_trail_m : hs_trail_n;
  1021. timcon0.HS_PRPR = (dsi_params->HS_PRPR == 0) ? NS_TO_CYCLE((0x40 + 0x5 * ui), cycle_time) : dsi_params->HS_PRPR;
  1022. // HS_PRPR can't be 1.
  1023. if (timcon0.HS_PRPR < 1)
  1024. timcon0.HS_PRPR = 1;
  1025. timcon0.HS_ZERO = (dsi_params->HS_ZERO == 0) ? NS_TO_CYCLE((0xC8 + 0x0a * ui), cycle_time) : dsi_params->HS_ZERO;
  1026. if (timcon0.HS_ZERO > timcon0.HS_PRPR)
  1027. timcon0.HS_ZERO -= timcon0.HS_PRPR;
  1028. timcon0.LPX = (dsi_params->LPX == 0) ? NS_TO_CYCLE(0x50, cycle_time) : dsi_params->LPX;
  1029. if (timcon0.LPX < 1)
  1030. timcon0.LPX = 1;
  1031. // timcon1.TA_SACK = (dsi_params->TA_SACK == 0) ? 1 : dsi_params->TA_SACK;
  1032. timcon1.TA_GET = (dsi_params->TA_GET == 0) ? (0x5 * timcon0.LPX) : dsi_params->TA_GET;
  1033. timcon1.TA_SURE = (dsi_params->TA_SURE == 0) ? (0x3 * timcon0.LPX / 0x2) : dsi_params->TA_SURE;
  1034. timcon1.TA_GO = (dsi_params->TA_GO == 0) ? (0x4 * timcon0.LPX) : dsi_params->TA_GO;
  1035. // --------------------------------------------------------------
  1036. // NT35510 need fine tune timing
  1037. // Data_hs_exit = 60 ns + 128UI
  1038. // Clk_post = 60 ns + 128 UI.
  1039. // --------------------------------------------------------------
  1040. timcon1.DA_HS_EXIT = (dsi_params->DA_HS_EXIT == 0) ? (0x2 * timcon0.LPX) : dsi_params->DA_HS_EXIT;
  1041. timcon2.CLK_TRAIL = ((dsi_params->CLK_TRAIL == 0) ? NS_TO_CYCLE(0x60, cycle_time) : dsi_params->CLK_TRAIL) + 0x01;
  1042. // CLK_TRAIL can't be 1.
  1043. if (timcon2.CLK_TRAIL < 2)
  1044. timcon2.CLK_TRAIL = 2;
  1045. // timcon2.LPX_WAIT = (dsi_params->LPX_WAIT == 0) ? 1 : dsi_params->LPX_WAIT;
  1046. timcon2.CONT_DET = dsi_params->CONT_DET;
  1047. timcon2.CLK_ZERO = (dsi_params->CLK_ZERO == 0) ? NS_TO_CYCLE(0x190, cycle_time) : dsi_params->CLK_ZERO;
  1048. timcon3.CLK_HS_PRPR = (dsi_params->CLK_HS_PRPR == 0) ? NS_TO_CYCLE(0x40, cycle_time) : dsi_params->CLK_HS_PRPR;
  1049. if (timcon3.CLK_HS_PRPR < 1)
  1050. timcon3.CLK_HS_PRPR = 1;
  1051. timcon3.CLK_HS_EXIT= (dsi_params->CLK_HS_EXIT == 0) ? (0x2 * timcon0.LPX) : dsi_params->CLK_HS_EXIT;
  1052. timcon3.CLK_HS_POST= (dsi_params->CLK_HS_POST == 0) ? NS_TO_CYCLE((0x60 + 0x34 * ui), cycle_time) : dsi_params->CLK_HS_POST;
  1053. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "[DISP] - kernel - DSI_PHY_TIMCONFIG, HS_TRAIL = %d, HS_ZERO = %d, HS_PRPR = %d, LPX = %d, TA_GET = %d, TA_SURE = %d, TA_GO = %d, CLK_TRAIL = %d, CLK_ZERO = %d, CLK_HS_PRPR = %d \n", \
  1054. timcon0.HS_TRAIL, timcon0.HS_ZERO, timcon0.HS_PRPR, timcon0.LPX, timcon1.TA_GET, timcon1.TA_SURE, timcon1.TA_GO, timcon2.CLK_TRAIL, timcon2.CLK_ZERO, timcon3.CLK_HS_PRPR);
  1055. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "CLK_HS_POST=%d,CLK_HS_EXIT=%d,CLK_TRAIL=%d\n",timcon3.CLK_HS_POST,timcon3.CLK_HS_EXIT,timcon2.CLK_TRAIL);
  1056. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1057. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON0_REG, DSI_REG[i]->DSI_PHY_TIMECON0,LPX,timcon0.LPX);
  1058. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON0_REG, DSI_REG[i]->DSI_PHY_TIMECON0,HS_PRPR,timcon0.HS_PRPR);
  1059. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON0_REG, DSI_REG[i]->DSI_PHY_TIMECON0,HS_ZERO,timcon0.HS_ZERO);
  1060. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON0_REG, DSI_REG[i]->DSI_PHY_TIMECON0,HS_TRAIL,timcon0.HS_TRAIL);
  1061. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON1_REG, DSI_REG[i]->DSI_PHY_TIMECON1,TA_GO,timcon1.TA_GO);
  1062. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON1_REG, DSI_REG[i]->DSI_PHY_TIMECON1,TA_SURE,timcon1.TA_SURE);
  1063. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON1_REG, DSI_REG[i]->DSI_PHY_TIMECON1,TA_GET,timcon1.TA_GET);
  1064. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON1_REG, DSI_REG[i]->DSI_PHY_TIMECON1,DA_HS_EXIT,timcon1.DA_HS_EXIT);
  1065. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON2_REG, DSI_REG[i]->DSI_PHY_TIMECON2,CONT_DET,timcon2.CONT_DET);
  1066. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON2_REG, DSI_REG[i]->DSI_PHY_TIMECON2,CLK_ZERO,timcon2.CLK_ZERO);
  1067. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON2_REG, DSI_REG[i]->DSI_PHY_TIMECON2,CLK_TRAIL,timcon2.CLK_TRAIL);
  1068. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON3_REG, DSI_REG[i]->DSI_PHY_TIMECON3,CLK_HS_PRPR,timcon3.CLK_HS_PRPR);
  1069. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON3_REG, DSI_REG[i]->DSI_PHY_TIMECON3,CLK_HS_POST,timcon3.CLK_HS_POST);
  1070. DSI_OUTREGBIT(cmdq, DSI_PHY_TIMCON3_REG, DSI_REG[i]->DSI_PHY_TIMECON3,CLK_HS_EXIT,timcon3.CLK_HS_EXIT);
  1071. dprintf(INFO,"%s, 0x%08x,0x%08x,0x%08x,0x%08x\n", __func__, INREG32(DSI0_BASE+0x110),INREG32(DSI0_BASE+0x114),INREG32(DSI0_BASE+0x118),INREG32(DSI0_BASE+0x11c));
  1072. }
  1073. }
  1074. DSI_STATUS DSI_Start(DISP_MODULE_ENUM module, void* cmdq)
  1075. {
  1076. if (module == DISP_MODULE_DSI0) {
  1077. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[0]->DSI_START,DSI_START,0);
  1078. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[0]->DSI_START,DSI_START,1);
  1079. }
  1080. return DSI_STATUS_OK;
  1081. }
  1082. DSI_STATUS DSI_EnableVM_CMD(DISP_MODULE_ENUM module, void* cmdq)
  1083. {
  1084. int cnt = 1000;
  1085. if (module == DISP_MODULE_DSI0) {
  1086. if (DSI_REG[0]->DSI_INTEN.VM_CMD_DONE == 0)
  1087. DSI_OUTREGBIT(cmdq, DSI_INT_ENABLE_REG,DSI_REG[0]->DSI_INTEN,VM_CMD_DONE,1);
  1088. DSI_OUTREGBIT(cmdq, DSI_INT_STATUS_REG,DSI_REG[0]->DSI_INTSTA,VM_CMD_DONE,0);
  1089. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[0]->DSI_START,VM_CMD_START,0);
  1090. DSI_OUTREGBIT(cmdq, DSI_START_REG,DSI_REG[0]->DSI_START,VM_CMD_START,1);
  1091. while (DSI_REG[0]->DSI_INTSTA.VM_CMD_DONE == 1 && cnt > 0) {
  1092. cnt--;
  1093. udelay(100);
  1094. }
  1095. }
  1096. return DSI_STATUS_OK;
  1097. }
  1098. /// return value: the data length we got
  1099. UINT32 DSI_dcs_read_lcm_reg_v2(DISP_MODULE_ENUM module, void* cmdq, UINT8 cmd, UINT8 *buffer, UINT8 buffer_size)
  1100. {
  1101. int d = 0;
  1102. UINT32 max_try_count = 5;
  1103. UINT32 recv_data_cnt; // reture value
  1104. unsigned int read_timeout_ms; // used for polling rd_rdy
  1105. unsigned char packet_type;
  1106. DSI_RX_DATA_REG read_data0;
  1107. DSI_RX_DATA_REG read_data1;
  1108. DSI_RX_DATA_REG read_data2;
  1109. DSI_RX_DATA_REG read_data3;
  1110. DSI_T0_INS t0;
  1111. DSI_T0_INS t1;
  1112. DISPFUNC();
  1113. #if ENABLE_DSI_INTERRUPT
  1114. static const long WAIT_TIMEOUT = 2 * HZ; // 2 sec
  1115. long ret;
  1116. #endif
  1117. for (d = DSI_MODULE_BEGIN(module); d <= DSI_MODULE_END(module); d++) {
  1118. if (DSI_REG[d]->DSI_MODE_CTRL.MODE) {
  1119. // only support cmd mode read
  1120. DISPMSG("DSI Read Fail: DSI Mode is %d \n", DSI_REG[d]->DSI_MODE_CTRL.MODE);
  1121. return 0;
  1122. }
  1123. if (buffer == NULL || buffer_size == 0) {
  1124. // illegal parameters
  1125. DISPMSG("DSI Read Fail: buffer=0x%p and buffer_size=%d \n", buffer, buffer_size);
  1126. return 0;
  1127. }
  1128. do {
  1129. if (max_try_count == 0) {
  1130. DISPMSG("DSI Read Fail: try 5 times \n");
  1131. return 0;
  1132. }
  1133. max_try_count--;
  1134. recv_data_cnt = 0;
  1135. read_timeout_ms = 20;
  1136. // 1. wait dsi not busy => can't read if dsi busy
  1137. DSI_WaitForNotBusy(module, cmdq);
  1138. // 2. Check rd_rdy & cmd_done irq
  1139. if (DSI_REG[d]->DSI_INTEN.RD_RDY == 0) {
  1140. DSI_OUTREGBIT(cmdq, DSI_INT_ENABLE_REG,DSI_REG[d]->DSI_INTEN,RD_RDY,1);
  1141. }
  1142. if (DSI_REG[d]->DSI_INTEN.CMD_DONE == 0) {
  1143. DSI_OUTREGBIT(cmdq, DSI_INT_ENABLE_REG,DSI_REG[d]->DSI_INTEN,CMD_DONE,1);
  1144. }
  1145. if (DSI_REG[d]->DSI_INTSTA.RD_RDY != 0 || DSI_REG[d]->DSI_INTSTA.CMD_DONE != 0) {
  1146. //dump cmdq & rxdata
  1147. {
  1148. unsigned int i;
  1149. DISPMSG("Last DSI Read Why not clear irq???\n");
  1150. DISPMSG("DSI_CMDQ_SIZE : %d \n", DSI_REG[d]->DSI_CMDQ_SIZE.CMDQ_SIZE);
  1151. for (i=0; i<DSI_REG[d]->DSI_CMDQ_SIZE.CMDQ_SIZE; i++) {
  1152. DISPMSG("DSI_CMDQ_DATA%d : 0x%08x \n",i, AS_UINT32(&DSI_CMDQ_REG[d]->data[i]));
  1153. }
  1154. DISPMSG("DSI_RX_DATA0 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA0));
  1155. DISPMSG("DSI_RX_DATA1 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA1));
  1156. DISPMSG("DSI_RX_DATA2 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA2));
  1157. DISPMSG("DSI_RX_DATA3 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA3));
  1158. }
  1159. //clear irq
  1160. DSI_OUTREGBIT(cmdq, DSI_INT_STATUS_REG,DSI_REG[d]->DSI_INTSTA,RD_RDY,0);
  1161. DSI_OUTREGBIT(cmdq, DSI_INT_STATUS_REG,DSI_REG[d]->DSI_INTSTA,CMD_DONE,0);
  1162. }
  1163. // 3. send cmd
  1164. t0.CONFG = 0x04; ///BTA
  1165. t0.Data0 = cmd;
  1166. t0.Data_ID = (cmd < 0xB0) ? DSI_DCS_READ_PACKET_ID : DSI_GERNERIC_READ_LONG_PACKET_ID;
  1167. t0.Data1 = 0;
  1168. // set max return size
  1169. t1.CONFG = 0x00;
  1170. t1.Data_ID = 0x37;
  1171. t1.Data0 = buffer_size<=10 ? buffer_size:10;
  1172. t1.Data1 = 0;
  1173. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[0], AS_UINT32(&t1));
  1174. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[1], AS_UINT32(&t0));
  1175. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 2);
  1176. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_START, 0);
  1177. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_START, 1);
  1178. /// the following code is to
  1179. /// 1: wait read ready
  1180. /// 2: ack read ready
  1181. /// 3: wait for CMDQ_DONE
  1182. /// 4: read data
  1183. #if ENABLE_DSI_INTERRUPT
  1184. ret = wait_event_interruptible_timeout(_dsi_dcs_read_wait_queue, !_IsEngineBusy(), WAIT_TIMEOUT);
  1185. if (0 == ret) {
  1186. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " Wait for DSI engine read ready timeout!!!\n");
  1187. DSI_DumpRegisters(module, NULL, 2);
  1188. DSI_OUTREGBIT(cmdq, DSI_RACK_REG,DSI_REG[d]->DSI_RACK,DSI_RACK,1);
  1189. DSI_Reset();
  1190. return 0;
  1191. }
  1192. #else
  1193. // wait read ready
  1194. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " Start polling DSI read ready!!!\n");
  1195. while (DSI_REG[d]->DSI_INTSTA.RD_RDY == 0) {
  1196. ///keep polling
  1197. mdelay(1);
  1198. read_timeout_ms --;
  1199. if (read_timeout_ms == 0) {
  1200. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " DSI Read Fail: Polling DSI read ready timeout!!!\n");
  1201. DSI_DumpRegisters(module, cmdq, 2);
  1202. ///do necessary reset here
  1203. DSI_OUTREGBIT(cmdq, DSI_RACK_REG,DSI_REG[d]->DSI_RACK,DSI_RACK,1);
  1204. DSI_Reset(module, cmdq);
  1205. return 0;
  1206. }
  1207. }
  1208. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " End polling DSI read ready!!!\n");
  1209. // ack read ready
  1210. DSI_OUTREGBIT(cmdq, DSI_RACK_REG,DSI_REG[d]->DSI_RACK,DSI_RACK,1);
  1211. // clear read ready irq
  1212. DSI_OUTREGBIT(cmdq, DSI_INT_STATUS_REG,DSI_REG[d]->DSI_INTSTA,RD_RDY,0);
  1213. // wait dsi cmd done
  1214. read_timeout_ms = 20;
  1215. while (DSI_REG[d]->DSI_INTSTA.CMD_DONE == 0) {
  1216. ///keep polling
  1217. mdelay(1);
  1218. read_timeout_ms --;
  1219. if (read_timeout_ms == 0) {
  1220. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " DSI Read Fail: Polling DSI cmd done timeout!!!\n");
  1221. DSI_DumpRegisters(module, cmdq, 2);
  1222. ///do necessary reset here
  1223. DSI_OUTREGBIT(cmdq, DSI_RACK_REG,DSI_REG[d]->DSI_RACK,DSI_RACK,1);
  1224. DSI_Reset(module, cmdq);
  1225. return 0;
  1226. }
  1227. }
  1228. // clear cmd done irq
  1229. DSI_OUTREGBIT(cmdq, DSI_INT_STATUS_REG,DSI_REG[d]->DSI_INTSTA,CMD_DONE,0);
  1230. #endif
  1231. DSI_OUTREG32(cmdq, &read_data0, AS_UINT32(&DSI_REG[d]->DSI_RX_DATA0));
  1232. DSI_OUTREG32(cmdq, &read_data1, AS_UINT32(&DSI_REG[d]->DSI_RX_DATA1));
  1233. DSI_OUTREG32(cmdq, &read_data2, AS_UINT32(&DSI_REG[d]->DSI_RX_DATA2));
  1234. DSI_OUTREG32(cmdq, &read_data3, AS_UINT32(&DSI_REG[d]->DSI_RX_DATA3));
  1235. {
  1236. unsigned int i;
  1237. DISPMSG("DSI%d read times i = %d --------------------\n",d,5-max_try_count);
  1238. DISPMSG("DSI_CMDQ_SIZE : %d \n", DSI_REG[d]->DSI_CMDQ_SIZE.CMDQ_SIZE);
  1239. for (i=0; i<DSI_REG[d]->DSI_CMDQ_SIZE.CMDQ_SIZE; i++) {
  1240. DISPMSG("DSI_CMDQ_DATA%d : 0x%08x \n",i, AS_UINT32(&DSI_CMDQ_REG[d]->data[i]));
  1241. }
  1242. DISPMSG("DSI_RX_DATA0 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA0));
  1243. DISPMSG("DSI_RX_DATA1 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA1));
  1244. DISPMSG("DSI_RX_DATA2 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA2));
  1245. DISPMSG("DSI_RX_DATA3 : 0x%08x \n", AS_UINT32(&DSI_REG[d]->DSI_RX_DATA3));
  1246. }
  1247. packet_type = read_data0.byte0;
  1248. DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " DSI read packet_type is 0x%x \n",packet_type);
  1249. // 0x02: acknowledge & error report
  1250. // 0x11: generic short read response(1 byte return)
  1251. // 0x12: generic short read response(2 byte return)
  1252. // 0x1a: generic long read response
  1253. // 0x1c: dcs long read response
  1254. // 0x21: dcs short read response(1 byte return)
  1255. // 0x22: dcs short read response(2 byte return)
  1256. if (packet_type == 0x1A || packet_type == 0x1C) { // long read response
  1257. recv_data_cnt = read_data0.byte1 + read_data0.byte2 * 16;
  1258. if (recv_data_cnt > 10) {
  1259. DISP_LOG_PRINT(ANDROID_LOG_WARN, "DSI", " DSI read long packet data exceeds 4 bytes return size: %d \n",recv_data_cnt);
  1260. recv_data_cnt = 10;
  1261. }
  1262. if (recv_data_cnt > buffer_size) {
  1263. DISP_LOG_PRINT(ANDROID_LOG_WARN, "DSI", " DSI read long packet data exceeds buffer size return size %d \n", recv_data_cnt);
  1264. recv_data_cnt = buffer_size;
  1265. }
  1266. DISP_LOG_PRINT(ANDROID_LOG_WARN, "DSI", " DSI read long packet size: %d\n", recv_data_cnt);
  1267. if (recv_data_cnt<=4) {
  1268. memcpy((void*)buffer, (void*)&read_data1, recv_data_cnt);
  1269. } else if (recv_data_cnt<=8) {
  1270. memcpy((void*)buffer, (void*)&read_data1, 4);
  1271. memcpy((void*)buffer+4, (void*)&read_data2, recv_data_cnt-4);
  1272. } else {
  1273. memcpy((void*)buffer, (void*)&read_data1, 4);
  1274. memcpy((void*)buffer+4, (void*)&read_data2, 4);
  1275. memcpy((void*)buffer+8, (void*)&read_data2, recv_data_cnt-8);
  1276. }
  1277. } else if (packet_type == 0x11 || packet_type == 0x12 || packet_type == 0x21 || packet_type == 0x22) { // short read response
  1278. if (packet_type == 0x11 || packet_type == 0x21) {
  1279. recv_data_cnt = 1;
  1280. } else {
  1281. recv_data_cnt = 2;
  1282. }
  1283. if (recv_data_cnt > buffer_size) {
  1284. DISP_LOG_PRINT(ANDROID_LOG_WARN, "DSI", " DSI read short packet data exceeds buffer size: %d\n", buffer_size);
  1285. recv_data_cnt = buffer_size;
  1286. memcpy((void*)buffer,(void*)&read_data0.byte1, recv_data_cnt);
  1287. } else {
  1288. memcpy((void*)buffer,(void*)&read_data0.byte1, recv_data_cnt);
  1289. }
  1290. } else if (packet_type == 0x02) {
  1291. DISPMSG("read return type is 0x02, re-read\n");
  1292. } else {
  1293. DISPMSG("read return type is non-recognite, type = 0x%x\n",packet_type);
  1294. return 0;
  1295. }
  1296. } while (packet_type == 0x02);
  1297. /// here: we may receive a ACK packet which packet type is 0x02 (incdicates some error happened)
  1298. /// therefore we try re-read again until no ACK packet
  1299. /// But: if it is a good way to keep re-trying ???
  1300. }
  1301. return recv_data_cnt;
  1302. }
  1303. void DSI_set_cmdq_V2(DISP_MODULE_ENUM module, void* cmdq, unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update)
  1304. {
  1305. UINT32 i = 0;
  1306. int d = 0;
  1307. UINT32 goto_addr, mask_para, set_para;
  1308. DSI_T0_INS t0;
  1309. DSI_T2_INS t2;
  1310. t2.pdata = NULL;
  1311. //DISPFUNC();
  1312. for (d = DSI_MODULE_BEGIN(module); d <= DSI_MODULE_END(module); d++) {
  1313. if (0 != DSI_REG[d]->DSI_MODE_CTRL.MODE) {
  1314. //not in cmd mode
  1315. DSI_VM_CMD_CON_REG vm_cmdq;
  1316. memset(&vm_cmdq,0,sizeof(DSI_VM_CMD_CON_REG));
  1317. DSI_READREG32(PDSI_VM_CMD_CON_REG, &vm_cmdq,&DSI_REG[d]->DSI_VM_CMD_CON);
  1318. if (cmd < 0xB0) {
  1319. if (count > 1) {
  1320. vm_cmdq.LONG_PKT = 1;
  1321. vm_cmdq.CM_DATA_ID = DSI_DCS_LONG_PACKET_ID;
  1322. vm_cmdq.CM_DATA_0 = count+1;
  1323. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1324. goto_addr = (UINT32)(&DSI_VM_CMD_REG[d]->data[0].byte0);
  1325. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1326. set_para = (cmd<<((goto_addr&0x3)*8));
  1327. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1328. for (i=0; i<count; i++) {
  1329. goto_addr = (UINT32)(&DSI_VM_CMD_REG[d]->data[0].byte1) + i;
  1330. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1331. set_para = (para_list[i]<<((goto_addr&0x3)*8));
  1332. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1333. }
  1334. } else {
  1335. vm_cmdq.LONG_PKT = 0;
  1336. vm_cmdq.CM_DATA_0 = cmd;
  1337. if (count) {
  1338. vm_cmdq.CM_DATA_ID = DSI_DCS_SHORT_PACKET_ID_1;
  1339. vm_cmdq.CM_DATA_1 = para_list[0];
  1340. } else {
  1341. vm_cmdq.CM_DATA_ID = DSI_DCS_SHORT_PACKET_ID_0;
  1342. vm_cmdq.CM_DATA_1 = 0;
  1343. }
  1344. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1345. }
  1346. } else {
  1347. if (count > 1) {
  1348. vm_cmdq.LONG_PKT = 1;
  1349. vm_cmdq.CM_DATA_ID = DSI_GERNERIC_LONG_PACKET_ID;
  1350. vm_cmdq.CM_DATA_0 = count+1;
  1351. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1352. goto_addr = (UINT32)(&DSI_VM_CMD_REG[d]->data[0].byte0);
  1353. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1354. set_para = (cmd<<((goto_addr&0x3)*8));
  1355. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1356. for (i=0; i<count; i++) {
  1357. goto_addr = (UINT32)(&DSI_VM_CMD_REG[d]->data[0].byte1) + i;
  1358. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1359. set_para = (para_list[i]<<((goto_addr&0x3)*8));
  1360. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1361. }
  1362. } else {
  1363. vm_cmdq.LONG_PKT = 0;
  1364. vm_cmdq.CM_DATA_0 = cmd;
  1365. if (count) {
  1366. vm_cmdq.CM_DATA_ID = DSI_GERNERIC_SHORT_PACKET_ID_2;
  1367. vm_cmdq.CM_DATA_1 = para_list[0];
  1368. } else {
  1369. vm_cmdq.CM_DATA_ID = DSI_GERNERIC_SHORT_PACKET_ID_1;
  1370. vm_cmdq.CM_DATA_1 = 0;
  1371. }
  1372. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1373. }
  1374. }
  1375. //start DSI VM CMDQ
  1376. if (force_update) {
  1377. DSI_EnableVM_CMD(module, cmdq);
  1378. }
  1379. } else {
  1380. #ifdef ENABLE_DSI_ERROR_REPORT
  1381. if ((para_list[0] & 1)) {
  1382. memset(_dsi_cmd_queue, 0, sizeof(_dsi_cmd_queue));
  1383. memcpy(_dsi_cmd_queue, para_list, count);
  1384. _dsi_cmd_queue[(count+3)/4*4] = 0x4;
  1385. count = (count+3)/4*4 + 4;
  1386. para_list = (unsigned char*) _dsi_cmd_queue;
  1387. } else {
  1388. para_list[0] |= 4;
  1389. }
  1390. #endif
  1391. DSI_WaitForNotBusy(module, cmdq);
  1392. if (cmd < 0xB0) {
  1393. if (count > 1) {
  1394. t2.CONFG = 2;
  1395. t2.Data_ID = DSI_DCS_LONG_PACKET_ID;
  1396. t2.WC16 = count+1;
  1397. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[0], AS_UINT32(&t2));
  1398. goto_addr = (UINT32)(&DSI_CMDQ_REG[d]->data[1].byte0);
  1399. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1400. set_para = (cmd<<((goto_addr&0x3)*8));
  1401. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1402. for (i=0; i<count; i++) {
  1403. goto_addr = (UINT32)(&DSI_CMDQ_REG[d]->data[1].byte1) + i;
  1404. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1405. set_para = (para_list[i]<<((goto_addr&0x3)*8));
  1406. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1407. }
  1408. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 2+(count)/4);
  1409. } else {
  1410. t0.CONFG = 0;
  1411. t0.Data0 = cmd;
  1412. if (count) {
  1413. t0.Data_ID = DSI_DCS_SHORT_PACKET_ID_1;
  1414. t0.Data1 = para_list[0];
  1415. } else {
  1416. t0.Data_ID = DSI_DCS_SHORT_PACKET_ID_0;
  1417. t0.Data1 = 0;
  1418. }
  1419. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[0], AS_UINT32(&t0));
  1420. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 1);
  1421. }
  1422. } else {
  1423. if (count > 1) {
  1424. t2.CONFG = 2;
  1425. t2.Data_ID = DSI_GERNERIC_LONG_PACKET_ID;
  1426. t2.WC16 = count+1;
  1427. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[0], AS_UINT32(&t2));
  1428. goto_addr = (UINT32)(&DSI_CMDQ_REG[d]->data[1].byte0);
  1429. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1430. set_para = (cmd<<((goto_addr&0x3)*8));
  1431. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1432. for (i=0; i<count; i++) {
  1433. goto_addr = (UINT32)(&DSI_CMDQ_REG[d]->data[1].byte1) + i;
  1434. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1435. set_para = (para_list[i]<<((goto_addr&0x3)*8));
  1436. DSI_MASKREG32(cmdq, goto_addr&(~0x3), mask_para, set_para);
  1437. }
  1438. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 2+(count)/4);
  1439. } else {
  1440. t0.CONFG = 0;
  1441. t0.Data0 = cmd;
  1442. if (count) {
  1443. t0.Data_ID = DSI_GERNERIC_SHORT_PACKET_ID_2;
  1444. t0.Data1 = para_list[0];
  1445. } else {
  1446. t0.Data_ID = DSI_GERNERIC_SHORT_PACKET_ID_1;
  1447. t0.Data1 = 0;
  1448. }
  1449. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[0], AS_UINT32(&t0));
  1450. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 1);
  1451. }
  1452. }
  1453. if (force_update) {
  1454. DSI_Start(module, cmdq);
  1455. DSI_WaitForNotBusy(module, cmdq);
  1456. }
  1457. }
  1458. }
  1459. }
  1460. void DSI_set_cmdq_V3(DISP_MODULE_ENUM module, void* cmdq, LCM_setting_table_V3 *para_tbl, unsigned int size, unsigned char force_update)
  1461. {
  1462. UINT32 i;
  1463. //UINT32 layer, layer_state, lane_num;
  1464. unsigned long goto_addr, mask_para, set_para;
  1465. //UINT32 fbPhysAddr, fbVirAddr;
  1466. DSI_T0_INS t0;
  1467. //DSI_T1_INS t1;
  1468. DSI_T2_INS t2;
  1469. UINT32 index = 0;
  1470. unsigned char data_id, cmd, count;
  1471. unsigned char *para_list;
  1472. UINT32 d;
  1473. memset(&t2, 0, sizeof(t2));
  1474. for (d = DSI_MODULE_BEGIN(module); d <= DSI_MODULE_END(module); d++) {
  1475. do {
  1476. data_id = para_tbl[index].id;
  1477. cmd = para_tbl[index].cmd;
  1478. count = para_tbl[index].count;
  1479. para_list = para_tbl[index].para_list;
  1480. if (data_id == REGFLAG_ESCAPE_ID && cmd == REGFLAG_DELAY_MS_V3) {
  1481. udelay(1000*count);
  1482. dprintf(INFO, "DISP/DSI " "DSI_set_cmdq_V3[%d]. Delay %d (ms) \n", index, count);
  1483. continue;
  1484. }
  1485. if (0 != DSI_REG[d]->DSI_MODE_CTRL.MODE) {
  1486. //not in cmd mode
  1487. DSI_VM_CMD_CON_REG vm_cmdq;
  1488. OUTREG32(&vm_cmdq, AS_UINT32(&DSI_REG[d]->DSI_VM_CMD_CON));
  1489. dprintf(INFO, "set cmdq in VDO mode\n");
  1490. if (count > 1) {
  1491. vm_cmdq.LONG_PKT = 1;
  1492. vm_cmdq.CM_DATA_ID = data_id;
  1493. vm_cmdq.CM_DATA_0 = count+1;
  1494. OUTREG32(&DSI_REG[d]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1495. goto_addr = (unsigned long)(&DSI_VM_CMD_REG[d]->data[0].byte0);
  1496. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1497. set_para = (cmd<<((goto_addr&0x3)*8));
  1498. MASKREG32(goto_addr&(~0x3), mask_para, set_para);
  1499. for (i=0; i<count; i++) {
  1500. goto_addr = (unsigned long)(&DSI_VM_CMD_REG[d]->data[0].byte1) + i;
  1501. mask_para = (0xFF<<((goto_addr&0x3)*8));
  1502. set_para = (para_list[i]<<((goto_addr&0x3)*8));
  1503. MASKREG32(goto_addr&(~0x3), mask_para, set_para);
  1504. }
  1505. } else {
  1506. vm_cmdq.LONG_PKT = 0;
  1507. vm_cmdq.CM_DATA_0 = cmd;
  1508. if (count) {
  1509. vm_cmdq.CM_DATA_ID = data_id;
  1510. vm_cmdq.CM_DATA_1 = para_list[0];
  1511. } else {
  1512. vm_cmdq.CM_DATA_ID = data_id;
  1513. vm_cmdq.CM_DATA_1 = 0;
  1514. }
  1515. OUTREG32(&DSI_REG[d]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1516. }
  1517. if (force_update) {
  1518. DSI_EnableVM_CMD(module, cmdq);
  1519. }
  1520. } else {
  1521. DSI_WaitForNotBusy(module, cmdq);
  1522. OUTREG32(&DSI_CMDQ_REG[d]->data[0], 0);
  1523. if (count > 1) {
  1524. t2.CONFG = 2;
  1525. t2.Data_ID = data_id;
  1526. t2.WC16 = count+1;
  1527. DSI_OUTREG32(cmdq,&DSI_CMDQ_REG[d]->data[0].byte0, AS_UINT32(&t2));
  1528. goto_addr = (unsigned long)(&DSI_CMDQ_REG[d]->data[1].byte0);
  1529. mask_para = (0xFFu<<((goto_addr&0x3u)*8));
  1530. set_para = (cmd<<((goto_addr&0x3u)*8));
  1531. DSI_MASKREG32(cmdq, goto_addr&(~((unsigned long)0x3u)), ((unsigned int)mask_para), ((unsigned int)set_para));
  1532. for (i=0; i<count; i++) {
  1533. goto_addr = (unsigned long)(&DSI_CMDQ_REG[d]->data[1].byte1) + i;
  1534. mask_para = (0xFFu<<((goto_addr&0x3u)*8));
  1535. set_para = (para_list[i]<<((goto_addr&0x3u)*8));
  1536. DSI_MASKREG32(cmdq, goto_addr&(~((unsigned long)0x3u)), ((unsigned int)mask_para), ((unsigned int)set_para));
  1537. }
  1538. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 2+(count)/4);
  1539. } else {
  1540. t0.CONFG = 0;
  1541. t0.Data0 = cmd;
  1542. if (count) {
  1543. t0.Data_ID = data_id;
  1544. t0.Data1 = para_list[0];
  1545. } else {
  1546. t0.Data_ID = data_id;
  1547. t0.Data1 = 0;
  1548. }
  1549. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[d]->data[0], AS_UINT32(&t0));
  1550. DSI_OUTREG32(cmdq, &DSI_REG[d]->DSI_CMDQ_SIZE, 1);
  1551. }
  1552. if (force_update) {
  1553. DSI_Start(module, cmdq);
  1554. DSI_WaitForNotBusy(module, cmdq);
  1555. }
  1556. }
  1557. } while (++index < size);
  1558. }
  1559. }
  1560. void DSI_set_cmdq(DISP_MODULE_ENUM module, void* cmdq, unsigned int *pdata, unsigned int queue_size, unsigned char force_update)
  1561. {
  1562. DISPFUNC();
  1563. unsigned int j = 0;
  1564. unsigned int i = 0;
  1565. char *module_name = ddp_get_module_name(module);
  1566. DISPCHECK("DSI_set_cmdq, module=%s, cmdq=0x%8p\n", module_name, cmdq);
  1567. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1568. if (0 != DSI_REG[i]->DSI_MODE_CTRL.MODE) {
  1569. #if 0
  1570. //not in cmd mode
  1571. DSI_VM_CMD_CON_REG vm_cmdq;
  1572. OUTREG32(&vm_cmdq, AS_UINT32(&DSI_REG[i]->DSI_VM_CMD_CON));
  1573. dprintf(INFO,"set cmdq in VDO mode\n");
  1574. if (queue_size > 1) {
  1575. //long packet
  1576. vm_cmdq.LONG_PKT = 1;
  1577. vm_cmdq.CM_DATA_ID = ((pdata[0] >> 8) & 0xFF);
  1578. vm_cmdq.CM_DATA_0 = ((pdata[0] >> 16) & 0xFF);
  1579. vm_cmdq.CM_DATA_1 = 0;
  1580. OUTREG32(&DSI_REG[i]->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1581. for (j=0; j<queue_size-1; j++) {
  1582. OUTREG32(&DSI_VM_CMD_REG->data[j], AS_UINT32((pdata+j+1)));
  1583. }
  1584. } else {
  1585. vm_cmdq.LONG_PKT = 0;
  1586. vm_cmdq.CM_DATA_ID = ((pdata[0] >> 8) & 0xFF);
  1587. vm_cmdq.CM_DATA_0 = ((pdata[0] >> 16) & 0xFF);
  1588. vm_cmdq.CM_DATA_1 = ((pdata[0] >> 24) & 0xFF);
  1589. OUTREG32(&DSI_REG->DSI_VM_CMD_CON, AS_UINT32(&vm_cmdq));
  1590. }
  1591. //start DSI VM CMDQ
  1592. if (force_update) {
  1593. MMProfileLogEx(MTKFB_MMP_Events.DSICmd, MMProfileFlagStart, *(unsigned int*)(&DSI_VM_CMD_REG->data[0]), *(unsigned int*)(&DSI_VM_CMD_REG->data[1]));
  1594. DSI_EnableVM_CMD();
  1595. //must wait VM CMD done?
  1596. MMProfileLogEx(MTKFB_MMP_Events.DSICmd, MMProfileFlagEnd, *(unsigned int*)(&DSI_VM_CMD_REG->data[2]), *(unsigned int*)(&DSI_VM_CMD_REG->data[3]));
  1597. }
  1598. #endif
  1599. } else {
  1600. ASSERT(queue_size<=32);
  1601. DSI_WaitForNotBusy(module, cmdq);
  1602. #ifdef ENABLE_DSI_ERROR_REPORT
  1603. if ((pdata[0] & 1)) {
  1604. memcpy(_dsi_cmd_queue, pdata, queue_size*4);
  1605. _dsi_cmd_queue[queue_size++] = 0x4;
  1606. pdata = (unsigned int*) _dsi_cmd_queue;
  1607. } else {
  1608. pdata[0] |= 4;
  1609. }
  1610. #endif
  1611. for (j=0; j<queue_size; j++) {
  1612. DSI_OUTREG32(cmdq, &DSI_CMDQ_REG[i]->data[j], AS_UINT32((pdata+j)));
  1613. }
  1614. DSI_OUTREG32(cmdq, &DSI_REG[i]->DSI_CMDQ_SIZE, queue_size);
  1615. for (i = 0; i < queue_size; i++)
  1616. dprintf(INFO,"[DISP] - kernel - DSI_set_cmdq. DSI_CMDQ+%04x : 0x%08x\n", i*4, INREG32(DSI0_BASE + 0x200 + i*4));
  1617. if (force_update) {
  1618. DSI_Start(module, cmdq);
  1619. DSI_WaitForNotBusy(module, cmdq);
  1620. }
  1621. }
  1622. }
  1623. }
  1624. void _copy_dsi_params(LCM_DSI_PARAMS *src, LCM_DSI_PARAMS *dst)
  1625. {
  1626. memcpy((LCM_DSI_PARAMS*)dst, (LCM_DSI_PARAMS*)src, sizeof(LCM_DSI_PARAMS));
  1627. }
  1628. int ddp_dsi_init(DISP_MODULE_ENUM module, void* cmdq)
  1629. {
  1630. int i = 0;
  1631. DISPFUNC();
  1632. //DSI_OUTREG32(cmdq, 0x10000048, 0x80000000);
  1633. ddp_enable_module_clock(module);
  1634. memset(&_dsi_context, 0, sizeof(_dsi_context));
  1635. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1636. DISPCHECK("dsi%d init finished\n", i);
  1637. }
  1638. return DSI_STATUS_OK;
  1639. }
  1640. int ddp_dsi_deinit(DISP_MODULE_ENUM module, void *cmdq)
  1641. {
  1642. int i = 0;
  1643. memset(&_dsi_context, 0, sizeof(_dsi_context));
  1644. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1645. DISPCHECK("dsi%d init finished\n", i);
  1646. }
  1647. DSI_SetMode(module, NULL, CMD_MODE);
  1648. DSI_clk_HS_mode(module, NULL, FALSE);
  1649. ddp_disable_module_clock(module);
  1650. DSI_PHY_clk_switch(module, NULL, false);
  1651. return 0;
  1652. }
  1653. void _dump_dsi_params(LCM_DSI_PARAMS* dsi_config)
  1654. {
  1655. if (dsi_config) {
  1656. switch (dsi_config->mode) {
  1657. case CMD_MODE:
  1658. DISPCHECK("[DDPDSI] DSI Mode: CMD_MODE\n");
  1659. break;
  1660. case SYNC_PULSE_VDO_MODE:
  1661. DISPCHECK("[DDPDSI] DSI Mode: SYNC_PULSE_VDO_MODE\n");
  1662. break;
  1663. case SYNC_EVENT_VDO_MODE:
  1664. DISPCHECK("[DDPDSI] DSI Mode: SYNC_EVENT_VDO_MODE\n");
  1665. break;
  1666. case BURST_VDO_MODE:
  1667. DISPCHECK("[DDPDSI] DSI Mode: BURST_VDO_MODE\n");
  1668. break;
  1669. default:
  1670. DISPCHECK("[DDPDSI] DSI Mode: Unknown\n");
  1671. break;
  1672. }
  1673. DISPCHECK("[DDPDSI] LANE_NUM: %d, FORMAT: %d\n",dsi_config->LANE_NUM,dsi_config->data_format.format);
  1674. DISPCHECK("[DDPDSI] vact: %d, vbp: %d, vfp: %d, vact_line: %d, hact: %d, hbp: %d, hfp: %d, hblankpixel: %d \n",dsi_config->vertical_sync_active, dsi_config->vertical_backporch,dsi_config->vertical_frontporch,dsi_config->vertical_active_line,dsi_config->horizontal_sync_active,dsi_config->horizontal_backporch,dsi_config->horizontal_frontporch,dsi_config->horizontal_blanking_pixel);
  1675. DISPCHECK("[DDPDSI] pll_select: %d, pll_div1: %d, pll_div2: %d, fbk_div: %d,fbk_sel: %d, rg_bir: %d\n",dsi_config->pll_select,dsi_config->pll_div1,dsi_config->pll_div2,dsi_config->fbk_div,dsi_config->fbk_sel,dsi_config->rg_bir);
  1676. DISPCHECK("[DDPDSI] rg_bic: %d, rg_bp: %d, PLL_CLOCK: %d, dsi_clock: %d, ssc_range: %d, ssc_disable: %d, compatibility_for_nvk: %d, cont_clock: %d\n", dsi_config->rg_bic, dsi_config->rg_bp,dsi_config->PLL_CLOCK,dsi_config->dsi_clock,dsi_config->ssc_range,dsi_config->ssc_disable,dsi_config->compatibility_for_nvk,dsi_config->cont_clock);
  1677. DISPCHECK("[DDPDSI] lcm_ext_te_enable: %d, noncont_clock: %d, noncont_clock_period: %d\n", dsi_config->lcm_ext_te_enable,dsi_config->noncont_clock,dsi_config->noncont_clock_period);
  1678. }
  1679. return;
  1680. }
  1681. void DSI_Set_LFR(DISP_MODULE_ENUM module, cmdqRecHandle cmdq,unsigned int mode,
  1682. unsigned int type,unsigned int enable,unsigned int skip_num)
  1683. {
  1684. //LFR_MODE 0 disable,1 static mode ,2 dynamic mode 3,both
  1685. unsigned int i=0;
  1686. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1687. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_MODE,mode);
  1688. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_TYPE,type);
  1689. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_EN,enable);
  1690. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_UPDATE,1);
  1691. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_VSE_DIS,0);
  1692. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_SKIP_NUM,skip_num);
  1693. }
  1694. }
  1695. void DSI_LFR_UPDATE(DISP_MODULE_ENUM module,cmdqRecHandle cmdq)
  1696. {
  1697. unsigned int i=0;
  1698. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1699. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_UPDATE,0);
  1700. DSI_OUTREGBIT(cmdq,DSI_LFR_CON_REG,DSI_REG[i]->DSI_LFR_CON,LFR_UPDATE,1);
  1701. }
  1702. }
  1703. void DSI_Set_VM_CMD(DISP_MODULE_ENUM module, cmdqRecHandle cmdq)
  1704. {
  1705. if (module == DISP_MODULE_DSI0) {
  1706. DSI_OUTREGBIT(cmdq,DSI_VM_CMD_CON_REG,DSI_REG[0]->DSI_VM_CMD_CON,TS_VFP_EN,1);
  1707. DSI_OUTREGBIT(cmdq,DSI_VM_CMD_CON_REG,DSI_REG[0]->DSI_VM_CMD_CON,VM_CMD_EN,1);
  1708. }
  1709. return;
  1710. }
  1711. int ddp_dsi_config(DISP_MODULE_ENUM module, disp_ddp_path_config *config, void *cmdq_handle)
  1712. {
  1713. int i = 0;
  1714. DISPFUNC();
  1715. if (!config->dst_dirty)
  1716. return 0;
  1717. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1718. _copy_dsi_params(&(config->dsi_config), &(_dsi_context[i].dsi_params));
  1719. _dump_dsi_params(&(_dsi_context[i].dsi_params));
  1720. }
  1721. DSI_PHY_clk_setting(module, NULL, &(config->dsi_config));
  1722. DSI_TXRX_Control(module, NULL, &(config->dsi_config));
  1723. DSI_PS_Control(module, NULL, &(config->dsi_config), config->dst_w, config->dst_h);
  1724. DSI_PHY_TIMCONFIG(module, NULL, &(config->dsi_config));
  1725. if (config->dsi_config.mode != CMD_MODE ||( (config->dsi_config.switch_mode_enable == 1) && (config->dsi_config.switch_mode != CMD_MODE))) {
  1726. DSI_Config_VDO_Timing(module, NULL, &(config->dsi_config));
  1727. DSI_Set_VM_CMD(module, cmdq_handle);
  1728. if (config->dsi_config.mode != CMD_MODE && config->dsi_config.lfr_enable) {
  1729. unsigned int mode=config->dsi_config.lfr_mode;
  1730. unsigned int type=config->dsi_config.lfr_type;
  1731. unsigned int skip_num = config->dsi_config.lfr_skip_num;
  1732. unsigned int enable = config->dsi_config.lfr_enable;
  1733. dprintf(0,"lfr en %d mode= %d type=%d,skip_num %d\n",enable,mode,type,skip_num);
  1734. DSI_Set_LFR(module, cmdq_handle,mode,type,enable,skip_num);
  1735. }
  1736. }
  1737. // Enable clk low power per Line ;
  1738. if (config->dsi_config.clk_lp_per_line_enable) {
  1739. DSI_PHY_CLK_LP_PerLine_config(module, NULL, &(config->dsi_config));
  1740. }
  1741. DSI_BackupRegisters(module,cmdq_handle);
  1742. //DSI_BIST_Pattern_Test(FALSE, 0x00ffff00);
  1743. return 0;
  1744. }
  1745. int ddp_dsi_stop(DISP_MODULE_ENUM module, void *cmdq_handle)
  1746. {
  1747. //ths caller should call wait_event_or_idle for frame stop event then.
  1748. if (_dsi_is_video_mode(module)) {
  1749. DSI_SetMode(module, cmdq_handle, CMD_MODE);
  1750. }
  1751. return 0;
  1752. }
  1753. int ddp_dsi_reset(DISP_MODULE_ENUM module, void *cmdq_handle)
  1754. {
  1755. DSI_Reset(module, cmdq_handle);
  1756. return 0;
  1757. }
  1758. int ddp_dsi_power_on(DISP_MODULE_ENUM module, void *cmdq_handle)
  1759. {
  1760. int i = 0;
  1761. int ret = 0;
  1762. if (!s_isDsiPowerOn) {
  1763. if (module == DISP_MODULE_DSI0 || module == DISP_MODULE_DSI1) {
  1764. ddp_enable_module_clock(module);
  1765. if (ret > 0) {
  1766. DISP_LOG_PRINT(ANDROID_LOG_WARN, "DSI", "DSI0 power manager API return FALSE\n");
  1767. }
  1768. }
  1769. s_isDsiPowerOn = TRUE;
  1770. }
  1771. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1772. if (_dsi_context[i].dsi_params.mode == CMD_MODE) {
  1773. DSI_PHY_clk_switch(module, NULL, true);
  1774. // restore dsi register
  1775. DSI_RestoreRegisters(module, NULL);
  1776. // enable sleep-out mode
  1777. DSI_SleepOut(module, NULL);
  1778. // enter wakeup
  1779. DSI_Wakeup(module, NULL);
  1780. DSI_Reset(module, NULL);
  1781. } else {
  1782. // initialize clock setting
  1783. DSI_PHY_clk_switch(module, NULL, true);
  1784. // restore dsi register
  1785. DSI_RestoreRegisters(module, NULL);
  1786. // enable sleep-out mode
  1787. DSI_SleepOut(module, NULL);
  1788. // enter wakeup
  1789. DSI_Wakeup(module, NULL);
  1790. DSI_clk_HS_mode(module, NULL, false);
  1791. DSI_Reset(module, NULL);
  1792. }
  1793. }
  1794. return DSI_STATUS_OK;
  1795. }
  1796. int ddp_dsi_power_off(DISP_MODULE_ENUM module, void *cmdq_handle)
  1797. {
  1798. int i = 0;
  1799. int ret = 0;
  1800. if (!s_isDsiPowerOn) {
  1801. if (module == DISP_MODULE_DSI0 || module == DISP_MODULE_DSI1) {
  1802. ddp_disable_module_clock(module);
  1803. if (ret > 0) {
  1804. DISP_LOG_PRINT(ANDROID_LOG_WARN, "DSI0", "DSI0 power manager API return FALSE\n");
  1805. }
  1806. }
  1807. s_isDsiPowerOn = TRUE;
  1808. }
  1809. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1810. if (_dsi_context[i].dsi_params.mode == CMD_MODE) {
  1811. // no need this, we will make dsi is in idle when ddp_dsi_stop() returns
  1812. //DSI_CHECK_RET(DSI_WaitForNotBusy(module, NULL));
  1813. DSI_CHECK_RET(DSI_BackupRegisters(module, NULL));
  1814. // disable HS mode
  1815. DSI_clk_HS_mode(module, NULL, false);
  1816. // enter ULPS mode
  1817. DSI_lane0_ULP_mode(module, NULL,1);
  1818. DSI_clk_ULP_mode(module, NULL, 1);
  1819. // disable mipi pll
  1820. DSI_PHY_clk_switch(module, NULL, false);
  1821. } else {
  1822. // backup dsi register
  1823. // no need this, we will make dsi is in idle when ddp_dsi_stop() returns
  1824. //DSI_CHECK_RET(DSI_WaitForNotBusy());
  1825. DSI_BackupRegisters(module, NULL);
  1826. // disable HS mode
  1827. DSI_clk_HS_mode(module, NULL, false);
  1828. // enter ULPS mode
  1829. DSI_lane0_ULP_mode(module, NULL,1);
  1830. DSI_clk_ULP_mode(module, NULL,1);
  1831. // disable mipi pll
  1832. DSI_PHY_clk_switch(module, NULL, false);
  1833. }
  1834. }
  1835. return DSI_STATUS_OK;
  1836. }
  1837. int ddp_dsi_is_busy(DISP_MODULE_ENUM module)
  1838. {
  1839. int i = 0;
  1840. int busy = 0;
  1841. DSI_INT_STATUS_REG status;
  1842. DISPFUNC();
  1843. for (i = DSI_MODULE_BEGIN(module); i <= DSI_MODULE_END(module); i++) {
  1844. status = DSI_REG[i]->DSI_INTSTA;
  1845. if (status.BUSY)
  1846. busy ++;
  1847. }
  1848. return busy;
  1849. }
  1850. int ddp_dsi_is_idle(DISP_MODULE_ENUM module)
  1851. {
  1852. return !ddp_dsi_is_busy(module);
  1853. }
  1854. int ddp_dsi_dump(DISP_MODULE_ENUM module, int level)
  1855. {
  1856. return DSI_DumpRegisters(module, NULL, level);
  1857. }
  1858. int ddp_dsi_start(DISP_MODULE_ENUM module, void* cmdq)
  1859. {
  1860. int i = 0;
  1861. if (module==DISP_MODULE_DSI0) {
  1862. DISPFUNC();
  1863. DSI_SetMode(module, cmdq, _dsi_context[i].dsi_params.mode);
  1864. DSI_clk_HS_mode(module, cmdq, TRUE);
  1865. }
  1866. return 0;
  1867. }
  1868. int ddp_dsi_trigger(DISP_MODULE_ENUM module, void* cmdq)
  1869. {
  1870. #if 0
  1871. //dsi pattern
  1872. static int j = 0;
  1873. DSI_OUTREG32(NULL,0x14012178,0x00000000 | (0xFF << (j*8)));
  1874. DSI_OUTREG32(NULL,0x1401217C,0x00000040);
  1875. j++;
  1876. #endif
  1877. DSI_Start(module, cmdq);
  1878. return 0;
  1879. }
  1880. static void lcm_set_reset_pin(UINT32 value)
  1881. {
  1882. OUTREG32(MMSYS_CONFIG_BASE+0x150, value);
  1883. }
  1884. static void lcm_udelay(UINT32 us)
  1885. {
  1886. udelay(us);
  1887. }
  1888. static void lcm_mdelay(UINT32 ms)
  1889. {
  1890. mdelay(ms);
  1891. }
  1892. void DSI_set_cmdq_V2_Wrapper_DSI0(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update)
  1893. {
  1894. DSI_set_cmdq_V2(DISP_MODULE_DSI0, NULL, cmd, count, para_list, force_update);
  1895. }
  1896. void DSI_set_cmdq_V2_Wrapper_DSI1(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update)
  1897. {
  1898. DSI_set_cmdq_V2(DISP_MODULE_DSI1, NULL, cmd, count, para_list, force_update);
  1899. }
  1900. void DSI_set_cmdq_V2_Wrapper_DSIDual(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update)
  1901. {
  1902. DSI_set_cmdq_V2(DISP_MODULE_DSIDUAL, NULL, cmd, count, para_list, force_update);
  1903. }
  1904. void DSI_set_cmdq_V3_Wrapper_DSI0(LCM_setting_table_V3 *para_tbl, unsigned int size, unsigned char force_update)
  1905. {
  1906. DSI_set_cmdq_V3(DISP_MODULE_DSI0, NULL, para_tbl, size, force_update);
  1907. }
  1908. void DSI_set_cmdq_V3_Wrapper_DSI1(LCM_setting_table_V3 *para_tbl, unsigned int size, unsigned char force_update)
  1909. {
  1910. DSI_set_cmdq_V3(DISP_MODULE_DSI1, NULL, para_tbl, size, force_update);
  1911. }
  1912. void DSI_set_cmdq_V3_Wrapper_DSIDual(LCM_setting_table_V3 *para_tbl, unsigned int size, unsigned char force_update)
  1913. {
  1914. DSI_set_cmdq_V3(DISP_MODULE_DSIDUAL, NULL, para_tbl, size, force_update);
  1915. }
  1916. void DSI_set_cmdq_wrapper_DSI0(unsigned int *pdata, unsigned int queue_size, unsigned char force_update)
  1917. {
  1918. DSI_set_cmdq(DISP_MODULE_DSI0, NULL, pdata, queue_size, force_update);
  1919. }
  1920. void DSI_set_cmdq_wrapper_DSI1(unsigned int *pdata, unsigned int queue_size, unsigned char force_update)
  1921. {
  1922. DSI_set_cmdq(DISP_MODULE_DSI1, NULL, pdata, queue_size, force_update);
  1923. }
  1924. void DSI_set_cmdq_wrapper_DSIDual(unsigned int *pdata, unsigned int queue_size, unsigned char force_update)
  1925. {
  1926. DSI_set_cmdq(DISP_MODULE_DSIDUAL, NULL, pdata, queue_size, force_update);
  1927. }
  1928. unsigned int DSI_dcs_read_lcm_reg_v2_wrapper_DSI0(UINT8 cmd, UINT8 *buffer, UINT8 buffer_size)
  1929. {
  1930. return DSI_dcs_read_lcm_reg_v2(DISP_MODULE_DSI0, NULL, cmd, buffer, buffer_size);
  1931. }
  1932. unsigned int DSI_dcs_read_lcm_reg_v2_wrapper_DSI1(UINT8 cmd, UINT8 *buffer, UINT8 buffer_size)
  1933. {
  1934. return DSI_dcs_read_lcm_reg_v2(DISP_MODULE_DSI1, NULL, cmd, buffer, buffer_size);
  1935. }
  1936. unsigned int DSI_dcs_read_lcm_reg_v2_wrapper_DSIDUAL(UINT8 cmd, UINT8 *buffer, UINT8 buffer_size)
  1937. {
  1938. return DSI_dcs_read_lcm_reg_v2(DISP_MODULE_DSIDUAL, NULL, cmd, buffer, buffer_size);
  1939. }
  1940. int ddp_dsi_set_lcm_utils(DISP_MODULE_ENUM module, LCM_DRIVER *lcm_drv)
  1941. {
  1942. LCM_UTIL_FUNCS *utils = NULL;
  1943. if (lcm_drv == NULL) {
  1944. DISPERR("lcm_drv is null\n");
  1945. return -1;
  1946. }
  1947. if (module == DISP_MODULE_DSI0) {
  1948. utils = &lcm_utils_dsi0;
  1949. } else {
  1950. DISPERR("wrong module: %d\n", module);
  1951. return -1;
  1952. }
  1953. utils->set_reset_pin = lcm_set_reset_pin;
  1954. utils->udelay = lcm_udelay;
  1955. utils->mdelay = lcm_mdelay;
  1956. if (module == DISP_MODULE_DSI0) {
  1957. utils->dsi_set_cmdq = DSI_set_cmdq_wrapper_DSI0;
  1958. utils->dsi_set_cmdq_V2 = DSI_set_cmdq_V2_Wrapper_DSI0;
  1959. utils->dsi_set_cmdq_V3 = DSI_set_cmdq_V3_Wrapper_DSI0;
  1960. utils->dsi_dcs_read_lcm_reg_v2 = DSI_dcs_read_lcm_reg_v2_wrapper_DSI0;
  1961. }
  1962. #ifndef MACH_FPGA
  1963. utils->set_gpio_out = mt_set_gpio_out;
  1964. utils->set_gpio_mode= mt_set_gpio_mode;
  1965. utils->set_gpio_dir = mt_set_gpio_dir;
  1966. utils->set_gpio_pull_enable = (int (*)(unsigned int,unsigned char))mt_set_gpio_pull_enable;
  1967. #endif
  1968. lcm_drv->set_util_funcs(utils);
  1969. return 0;
  1970. }
  1971. static int ddp_dsi_polling_irq(DISP_MODULE_ENUM module, int bit, int timeout)
  1972. {
  1973. unsigned int cnt = 0;
  1974. unsigned int irq_reg_base = 0;
  1975. unsigned int reg_val=0;
  1976. if (module == DISP_MODULE_DSI0/* || module == DISP_MODULE_DSIDUAL*/)
  1977. irq_reg_base = DISP_REG_DSI_INSTA;
  1978. //DISPCHECK("dsi polling irq, module=%d, bit=0x%08x, timeout=%d, irq_regbase=0x%08x\n", module, bit, timeout, irq_reg_base);
  1979. if ( timeout <= 0) {
  1980. while ((DISP_REG_GET(irq_reg_base) & bit)==0);
  1981. cnt = 1;
  1982. } else {
  1983. // time need to update
  1984. cnt = timeout*1000/100;
  1985. while (cnt > 0) {
  1986. cnt--;
  1987. reg_val = DISP_REG_GET(irq_reg_base);
  1988. //DISPMSG("reg_val=0x%08x\n", reg_val);
  1989. if (reg_val & bit) {
  1990. DSI_OUTREG32(NULL, (void *)irq_reg_base, ~reg_val);
  1991. break;
  1992. }
  1993. udelay(100);
  1994. }
  1995. }
  1996. DISPMSG("DSI polling interrupt ret =%d \n", cnt);
  1997. if (cnt == 0)
  1998. DSI_DumpRegisters(module, NULL, 2);
  1999. return cnt;
  2000. }
  2001. DDP_MODULE_DRIVER ddp_driver_dsi0 = {
  2002. .module = DISP_MODULE_DSI0,
  2003. .init = ddp_dsi_init,
  2004. .deinit = ddp_dsi_deinit,
  2005. .config = ddp_dsi_config,
  2006. .trigger = ddp_dsi_trigger,
  2007. .start = ddp_dsi_start,
  2008. .stop = ddp_dsi_stop,
  2009. .reset = ddp_dsi_reset,
  2010. .power_on = ddp_dsi_power_on,
  2011. .power_off = ddp_dsi_power_off,
  2012. .is_idle = ddp_dsi_is_idle,
  2013. .is_busy = ddp_dsi_is_busy,
  2014. .dump_info = ddp_dsi_dump,
  2015. .set_lcm_utils = ddp_dsi_set_lcm_utils,
  2016. .polling_irq = ddp_dsi_polling_irq
  2017. };