ddp_path.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  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 "ddp_path"
  32. #include "platform/mt_irq.h"
  33. #include "platform/mt_irq.h"
  34. #include "platform/disp_drv_platform.h"
  35. #include "platform/ddp_reg.h"
  36. #include "platform/ddp_path.h"
  37. #include "platform/ddp_info.h"
  38. #include "platform/ddp_log.h"
  39. typedef struct module_map_s {
  40. DISP_MODULE_ENUM module;
  41. int bit;
  42. } module_map_t;
  43. typedef struct {
  44. int m;
  45. int v;
  46. } m_to_b;
  47. typedef struct mout_s {
  48. int id;
  49. m_to_b out_id_bit_map[5];
  50. volatile unsigned int* reg;
  51. unsigned int reg_val;
  52. } mout_t;
  53. typedef struct selection_s {
  54. int id;
  55. int id_bit_map[5];
  56. volatile unsigned int* reg;
  57. unsigned int reg_val;
  58. } sel_t;
  59. #define DDP_ENING_NUM 12
  60. #define DDP_MOUT_NUM 4
  61. #define DDP_SEL_OUT_NUM 4
  62. #define DDP_SEL_IN_NUM 6
  63. #define DDP_MUTEX_MAX 5
  64. int module_list_scenario[DDP_SCENARIO_MAX][DDP_ENING_NUM] = {
  65. /*PRIMARY_DISP*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_RDMA0, DISP_MODULE_PWM0, DISP_MODULE_DSI0, -1, -1, -1},
  66. /*PRIMARY_RDMA0_COLOR0_DISP*/ {DISP_MODULE_RDMA0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER,DISP_MODULE_UFOE, DISP_MODULE_PWM0, DISP_MODULE_DSI0, -1, -1, -1},
  67. /*PRIMARY_RDMA0_DISP*/ {DISP_MODULE_RDMA0, DISP_MODULE_DSI0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  68. /*PRIMARY_BYPASS_RDMA*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_UFOE, DISP_MODULE_PWM0, DISP_MODULE_DSI0, -1, -1, -1},
  69. /*PRIMARY_OVL_MEMOUT*/ {DISP_MODULE_OVL0, DISP_MODULE_WDMA0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
  70. /*PRIMARY_DITHER_MEMOUT*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_WDMA0, -1, -1, -1, -1, -1},
  71. /*PRIMARY_UFOE_MEMOUT*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR,DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_RDMA0, DISP_MODULE_UFOE, DISP_MODULE_WDMA0,-1, -1, -1},
  72. /*SUB_DISP*/ {DISP_MODULE_OVL1, DISP_MODULE_RDMA1, DISP_MODULE_DPI, -1,-1,-1,-1,-1,-1,-1,-1},
  73. /*SUB_RDMA1_DISP*/ {DISP_MODULE_RDMA1, DISP_MODULE_DPI, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
  74. /*SUB_OVL_MEMOUT*/ {DISP_MODULE_OVL1, DISP_MODULE_WDMA1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  75. /*PRIMARY_ALL*/ {DISP_MODULE_OVL0, DISP_MODULE_WDMA0, DISP_MODULE_COLOR0,DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER,DISP_MODULE_RDMA0,DISP_MODULE_PWM0, DISP_MODULE_DSI0, -1, -1},
  76. /*SUB_ALL*/ {DISP_MODULE_OVL1, DISP_MODULE_WDMA1, DISP_MODULE_RDMA1, DISP_MODULE_DPI, -1,-1, -1,-1,-1,-1, -1,-1},
  77. /*MULTIPLE_OVL*/ {DISP_MODULE_OVL1, DISP_MODULE_OVL0, DISP_MODULE_WDMA0, -1, -1, -1, -1, -1, -1,-1,-1,-1},
  78. };
  79. // 1st para is mout's input, 2nd para is mout's output
  80. static mout_t mout_map[DDP_MOUT_NUM] = {
  81. // OVL_MOUT
  82. {DISP_MODULE_OVL0, {{DISP_MODULE_COLOR0,1<<0}, {DISP_MODULE_WDMA0,1<<1}, {-1,0}}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_OVL0_MOUT_EN, 0},
  83. {DISP_MODULE_OVL1, {{DISP_MODULE_RDMA1,1<<0}, {DISP_MODULE_WDMA1,1<<1}, {DISP_MODULE_OVL0,1<<2},{-1,0}}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_OVL1_MOUT_EN, 0},
  84. // DITHER0_MOUT
  85. {DISP_MODULE_DITHER, {{DISP_MODULE_RDMA0,1<<0}, {DISP_MODULE_UFOE,1<<1},{DISP_MODULE_WDMA0,1<<2}, {-1,0}}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_DITHER_MOUT_EN, 0},
  86. // UFOE_MOUT
  87. {DISP_MODULE_UFOE, {{DISP_MODULE_DSI0,1<<0}, {DISP_MODULE_DPI,1<<1}, {DISP_MODULE_WDMA0,1<<2}, {-1,0}}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_UFOE_MOUT_EN, 0},
  88. };
  89. static sel_t sel_out_map[DDP_SEL_OUT_NUM] = {
  90. // OVL0_SOUT
  91. {DISP_MODULE_OVL0, {DISP_MODULE_COLOR0, DISP_MODULE_OVL1_2L, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_OVL0_SOUT_SEL_IN, 0},
  92. // OVL1_SOUT
  93. {DISP_MODULE_OVL1_2L, {DISP_MODULE_OVL1, DISP_MODULE_COLOR0, -1}, (volatile unsigned int*)DISP_REG_CONFIG_DISP_OVL1_SOUT_SEL_IN, 0},
  94. // RDMA_SOUT
  95. {DISP_MODULE_RDMA0, {DISP_MODULE_UFOE, DISP_MODULE_COLOR0,DISP_MODULE_DSI0,DISP_MODULE_DPI, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_RDMA0_SOUT_SEL_IN, 0},
  96. {DISP_MODULE_RDMA1, {DISP_MODULE_DSI0, DISP_MODULE_DPI, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_RDMA1_SOUT_SEL_IN, 0},
  97. };
  98. // 1st para is sout's output, 2nd para is sout's input
  99. static sel_t sel_in_map[DDP_SEL_IN_NUM] = {
  100. // OVL0_SEL
  101. {DISP_MODULE_OVL0, {DISP_MODULE_COLOR0, DISP_MODULE_OVL1, DISP_MODULE_OVL1_2L, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_OVL0_SEL_IN, 0},
  102. // COLOR_SEL
  103. {DISP_MODULE_COLOR0, {DISP_MODULE_RDMA0, DISP_MODULE_OVL0, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_COLOR0_SEL_IN, 0},
  104. //UFOE_SEL
  105. {DISP_MODULE_UFOE, {DISP_MODULE_RDMA0, DISP_MODULE_DITHER, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_UFOE_SEL_IN, 0},
  106. //DSI0_SEL
  107. {DISP_MODULE_DSI0, {DISP_MODULE_UFOE, DISP_MODULE_RDMA0,DISP_MODULE_RDMA1, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DSI0_SEL_IN, 0},
  108. //DPI0_SEL
  109. {DISP_MODULE_DPI, {DISP_MODULE_UFOE, DISP_MODULE_RDMA0,DISP_MODULE_RDMA1, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DPI0_SEL_IN, 0},
  110. // WDMA_SEL
  111. {DISP_MODULE_WDMA0, {DISP_MODULE_OVL0,DISP_MODULE_DITHER, DISP_MODULE_UFOE,DISP_MODULE_OVL1, -1}, (volatile unsigned int *)DISP_REG_CONFIG_DISP_WDMA0_SEL_IN, 0},
  112. };
  113. //module bit in mutex
  114. static module_map_t module_mutex_map[DISP_MODULE_NUM] = {
  115. {DISP_MODULE_OVL0 , 7},
  116. {DISP_MODULE_OVL1 , 8},
  117. {DISP_MODULE_RDMA0 , 9},
  118. {DISP_MODULE_RDMA1 , 10},
  119. {DISP_MODULE_WDMA0 , 11},
  120. {DISP_MODULE_COLOR0 , 12},
  121. {DISP_MODULE_CCORR , 13},
  122. {DISP_MODULE_AAL , 14},
  123. {DISP_MODULE_GAMMA , 15},
  124. {DISP_MODULE_DITHER , 16},
  125. {DISP_MODULE_UFOE , -1},
  126. {DISP_MODULE_PWM0 , 18},
  127. {DISP_MODULE_WDMA1 , 17},
  128. {DISP_MODULE_DSI0 , -1},
  129. {DISP_MODULE_DPI , -1},
  130. {DISP_MODULE_SMI , -1},
  131. {DISP_MODULE_CONFIG , -1},
  132. {DISP_MODULE_CMDQ , -1},
  133. {DISP_MODULE_MUTEX , -1},
  134. {DISP_MODULE_COLOR1 , -1},
  135. {DISP_MODULE_RDMA2 , -1},
  136. {DISP_MODULE_PWM1 , -1},
  137. {DISP_MODULE_OD , -1},
  138. {DISP_MODULE_MERGE , -1},
  139. {DISP_MODULE_SPLIT0 , -1},
  140. {DISP_MODULE_SPLIT1 , -1},
  141. {DISP_MODULE_DSI1 , -1},
  142. {DISP_MODULE_DSIDUAL , -1},
  143. {DISP_MODULE_SMI_LARB0, -1},
  144. {DISP_MODULE_SMI_COMMON,-1},
  145. {DISP_MODULE_OVL0_2L , 19},
  146. {DISP_MODULE_OVL1_2L, 20},
  147. {DISP_MODULE_UNKNOWN, -1},
  148. };
  149. //module can be connect if 1
  150. static module_map_t module_can_connect[DISP_MODULE_NUM] = {
  151. {DISP_MODULE_OVL0 , 1},
  152. {DISP_MODULE_OVL1 , 1},
  153. {DISP_MODULE_RDMA0 , 1},
  154. {DISP_MODULE_RDMA1 , 1},
  155. {DISP_MODULE_WDMA0 , 1},
  156. {DISP_MODULE_COLOR0, 1},
  157. {DISP_MODULE_CCORR , 1},
  158. {DISP_MODULE_AAL , 1},
  159. {DISP_MODULE_GAMMA , 1},
  160. {DISP_MODULE_DITHER, 1},
  161. {DISP_MODULE_UFOE , 1},
  162. {DISP_MODULE_PWM0 , 0},
  163. {DISP_MODULE_WDMA1 , 1},
  164. {DISP_MODULE_DSI0 , 1},
  165. {DISP_MODULE_DPI , 1},
  166. {DISP_MODULE_SMI, 0},
  167. {DISP_MODULE_CONFIG, 0},
  168. {DISP_MODULE_CMDQ, 0},
  169. {DISP_MODULE_MUTEX, 0},
  170. {DISP_MODULE_COLOR1, 0},
  171. {DISP_MODULE_RDMA2, 0},
  172. {DISP_MODULE_PWM1, 0},
  173. {DISP_MODULE_OD, 0},
  174. {DISP_MODULE_MERGE, 0},
  175. {DISP_MODULE_SPLIT0, 0},
  176. {DISP_MODULE_SPLIT1, 0},
  177. {DISP_MODULE_DSI1, 0},
  178. {DISP_MODULE_DSIDUAL, 0},
  179. {DISP_MODULE_SMI_LARB0 , 0},
  180. {DISP_MODULE_SMI_COMMON, 0},
  181. {DISP_MODULE_OVL0_2L , 0},
  182. {DISP_MODULE_OVL1_2L, 0},
  183. {DISP_MODULE_UNKNOWN, 0},
  184. };
  185. char* ddp_get_scenario_name(DDP_SCENARIO_ENUM scenario)
  186. {
  187. switch (scenario) {
  188. case DDP_SCENARIO_PRIMARY_DISP :
  189. return "primary_disp";
  190. case DDP_SCENARIO_PRIMARY_RDMA0_COLOR0_DISP :
  191. return "primary_rdma0_color_disp";
  192. case DDP_SCENARIO_PRIMARY_RDMA0_DISP :
  193. return "primary_rdma0_disp";
  194. case DDP_SCENARIO_PRIMARY_BYPASS_RDMA :
  195. return "primary_bypass_rdma";
  196. case DDP_SCENARIO_PRIMARY_OVL_MEMOUT :
  197. return "primary_ovl_memout";
  198. case DDP_SCENARIO_PRIMARY_DITHER_MEMOUT :
  199. return "primary_dither_memout";
  200. case DDP_SCENARIO_PRIMARY_UFOE_MEMOUT :
  201. return "primary_ufoe_memout";
  202. case DDP_SCENARIO_SUB_DISP :
  203. return "sub_disp";
  204. case DDP_SCENARIO_SUB_RDMA1_DISP :
  205. return "sub_rdma1_disp";
  206. case DDP_SCENARIO_SUB_OVL_MEMOUT :
  207. return "sub_ovl_memout";
  208. case DDP_SCENARIO_DISPLAY_INTERFACE :
  209. return "display_interface";
  210. case DDP_SCENARIO_PRIMARY_ALL :
  211. return "primary_all";
  212. case DDP_SCENARIO_SUB_ALL :
  213. return "sub_all";
  214. default:
  215. DDPMSG("invalid scenario id=%d\n", scenario);
  216. return "unknown";
  217. }
  218. }
  219. int ddp_is_scenario_on_primary(DDP_SCENARIO_ENUM scenario)
  220. {
  221. int on_primary = 0;
  222. switch (scenario) {
  223. case DDP_SCENARIO_PRIMARY_DISP:
  224. case DDP_SCENARIO_PRIMARY_RDMA0_COLOR0_DISP:
  225. case DDP_SCENARIO_PRIMARY_RDMA0_DISP:
  226. case DDP_SCENARIO_PRIMARY_BYPASS_RDMA:
  227. case DDP_SCENARIO_PRIMARY_OVL_MEMOUT:
  228. case DDP_SCENARIO_PRIMARY_DITHER_MEMOUT:
  229. case DDP_SCENARIO_PRIMARY_UFOE_MEMOUT:
  230. case DDP_SCENARIO_PRIMARY_ALL:
  231. on_primary = 1;
  232. break;
  233. case DDP_SCENARIO_SUB_DISP:
  234. case DDP_SCENARIO_SUB_RDMA1_DISP:
  235. case DDP_SCENARIO_SUB_OVL_MEMOUT:
  236. case DDP_SCENARIO_SUB_ALL:
  237. on_primary = 0;
  238. break;
  239. default:
  240. DDPMSG("invalid scenario id=%d\n", scenario);
  241. }
  242. return on_primary;
  243. }
  244. char* ddp_get_mutex_sof_name(MUTEX_SOF mode)
  245. {
  246. switch (mode) {
  247. case SOF_SINGLE :
  248. return "single";
  249. case SOF_DSI0 :
  250. return "dsi0";
  251. case SOF_DSI1 :
  252. return "dsi1";
  253. case SOF_DPI0 :
  254. return "dpi0";
  255. default:
  256. DDPMSG("invalid sof =%d\n", mode);
  257. return "unknown";
  258. }
  259. }
  260. char* ddp_get_mode_name(DDP_MODE ddp_mode)
  261. {
  262. switch (ddp_mode) {
  263. case DDP_VIDEO_MODE :
  264. return "vido_mode";
  265. case DDP_CMD_MODE :
  266. return "cmd_mode";
  267. default:
  268. DDPMSG("invalid ddp mode =%d\n", ddp_mode);
  269. return "unknown";
  270. }
  271. }
  272. static int ddp_get_module_num_l(int* module_list)
  273. {
  274. unsigned int num = 0;
  275. while (*(module_list+num)!=-1) {
  276. num++;
  277. if (num==DDP_ENING_NUM)
  278. break;
  279. }
  280. return num;
  281. }
  282. // config mout/msel to creat a compelte path
  283. static void ddp_connect_path_l(int *module_list, void * handle)
  284. {
  285. unsigned int i, j, k;
  286. unsigned int step=0;
  287. unsigned int mout=0;
  288. unsigned int reg_mout = 0;
  289. unsigned int mout_idx = 0;
  290. unsigned int module_num = ddp_get_module_num_l(module_list);
  291. DDPDBG("connect_path: %s to %s\n",ddp_get_module_name(module_list[0]),
  292. ddp_get_module_name(module_list[module_num-1]));
  293. // connect mout
  294. for (i = 0 ; i < module_num - 1 ; i++) {
  295. for (j = 0 ; j < DDP_MOUT_NUM ; j++) {
  296. if (module_list[i] == mout_map[j].id) {
  297. //find next module which can be connected
  298. step = i+1;
  299. while (module_can_connect[module_list[step]].bit==0 && step<module_num) {
  300. step++;
  301. }
  302. ASSERT(step<module_num);
  303. mout = mout_map[j].reg_val;
  304. for (k = 0 ; k < 5 ; k++) {
  305. if (mout_map[j].out_id_bit_map[k].m == -1)
  306. break;
  307. if (mout_map[j].out_id_bit_map[k].m == module_list[step]) {
  308. mout |= mout_map[j].out_id_bit_map[k].v;
  309. reg_mout |= mout;
  310. mout_idx = j;
  311. DDPDBG("connect mout %s to %s value 0x%x\n", ddp_get_module_name(module_list[i]),
  312. ddp_get_module_name(module_list[step]),reg_mout);
  313. break;
  314. }
  315. }
  316. mout_map[j].reg_val = mout;
  317. mout = 0;
  318. }
  319. }
  320. if (reg_mout) {
  321. DISP_REG_SET(handle,mout_map[mout_idx].reg, reg_mout);
  322. reg_mout = 0;
  323. mout_idx = 0;
  324. }
  325. }
  326. // connect out select
  327. for (i = 0 ; i < module_num - 1 ; i++) {
  328. for (j = 0 ; j < DDP_SEL_OUT_NUM ; j++) {
  329. if (module_list[i] == sel_out_map[j].id) {
  330. step = i+1;
  331. //find next module which can be connected
  332. while (module_can_connect[module_list[step]].bit==0 && step<module_num) {
  333. step++;
  334. }
  335. ASSERT(step<module_num);
  336. for (k = 0 ; k < 4 ; k++) {
  337. if (sel_out_map[j].id_bit_map[k] == -1)
  338. break;
  339. if (sel_out_map[j].id_bit_map[k] == module_list[step]) {
  340. DDPDBG("connect out_s %s to %s, bits=0x%x\n", ddp_get_module_name(module_list[i]),
  341. ddp_get_module_name(module_list[step]), k);
  342. DISP_REG_SET(handle,sel_out_map[j].reg, (kal_uint16)k);
  343. break;
  344. }
  345. }
  346. }
  347. }
  348. }
  349. // connect input select
  350. for (i = 1 ; i < module_num ; i++) {
  351. for (j = 0 ; j < DDP_SEL_IN_NUM ; j++) {
  352. if (module_list[i] == sel_in_map[j].id) {
  353. step = i-1;
  354. //find next module which can be connected
  355. while (module_can_connect[module_list[step]].bit==0 && step>0) {
  356. step--;
  357. }
  358. ASSERT(step>=0);
  359. for (k = 0 ; k < 4 ; k++) {
  360. if (sel_in_map[j].id_bit_map[k] == -1)
  361. break;
  362. if (sel_in_map[j].id_bit_map[k] == module_list[step]) {
  363. DDPDBG("connect in_s %s to %s, bits=0x%x\n", ddp_get_module_name(module_list[step]),
  364. ddp_get_module_name(module_list[i]), k);
  365. DISP_REG_SET(handle,sel_in_map[j].reg, (kal_uint16)k);
  366. break;
  367. }
  368. }
  369. }
  370. }
  371. }
  372. }
  373. static void ddp_check_path_l(int *module_list)
  374. {
  375. unsigned int i, j, k;
  376. unsigned int step = 0;
  377. int valid =0;
  378. unsigned int mout;
  379. unsigned int path_error = 0;
  380. unsigned int module_num = ddp_get_module_num_l(module_list);
  381. DDPDBG("check_path: %s to %s\n",ddp_get_module_name(module_list[0])
  382. ,ddp_get_module_name(module_list[module_num-1]));
  383. // check mout
  384. for (i = 0 ; i < module_num - 1 ; i++) {
  385. for (j = 0 ; j < DDP_MOUT_NUM ; j++) {
  386. if (module_list[i] == mout_map[j].id) {
  387. mout = 0;
  388. //find next module which can be connected
  389. step = i+1;
  390. while (module_can_connect[module_list[step]].bit==0 && step<module_num) {
  391. step++;
  392. }
  393. ASSERT(step<module_num);
  394. for (k = 0 ; k < 5 ; k++) {
  395. if (mout_map[j].out_id_bit_map[k].m == -1)
  396. break;
  397. if (mout_map[j].out_id_bit_map[k].m == module_list[step]) {
  398. mout |= mout_map[j].out_id_bit_map[k].v;
  399. valid =1;
  400. break;
  401. }
  402. }
  403. if (valid) {
  404. valid =0;
  405. if ((DISP_REG_GET(mout_map[j].reg) & mout)==0) {
  406. path_error += 1;
  407. DDPERR("%s mout, expect=0x%x, real=0x%x \n",
  408. ddp_get_module_name(module_list[i]),
  409. mout,
  410. DISP_REG_GET(mout_map[j].reg));
  411. } else if (DISP_REG_GET(mout_map[j].reg) != mout) {
  412. DDPMSG("warning: %s mout expect=0x%x, real=0x%x \n",
  413. ddp_get_module_name(module_list[i]),
  414. mout,
  415. DISP_REG_GET(mout_map[j].reg));
  416. }
  417. }
  418. break;
  419. }
  420. }
  421. }
  422. // check out select
  423. for (i = 0 ; i < module_num - 1 ; i++) {
  424. for (j = 0 ; j < DDP_SEL_OUT_NUM ; j++) {
  425. if (module_list[i] == sel_out_map[j].id) {
  426. //find next module which can be connected
  427. step = i+1;
  428. while (module_can_connect[module_list[step]].bit==0 && step<module_num) {
  429. step++;
  430. }
  431. ASSERT(step<module_num);
  432. for (k = 0 ; k < 4 ; k++) {
  433. if (sel_out_map[j].id_bit_map[k] == -1)
  434. break;
  435. if (sel_out_map[j].id_bit_map[k] == module_list[step]) {
  436. if (DISP_REG_GET(sel_out_map[j].reg) != k) {
  437. path_error += 1;
  438. DDPERR("out_s %s not connect to %s, expect=0x%x, real=0x%x \n",
  439. ddp_get_module_name(module_list[i]),ddp_get_module_name(module_list[step]),
  440. k,
  441. DISP_REG_GET(sel_out_map[j].reg));
  442. }
  443. break;
  444. }
  445. }
  446. }
  447. }
  448. }
  449. // check input select
  450. for (i = 1 ; i < module_num ; i++) {
  451. for (j = 0 ; j < DDP_SEL_IN_NUM ; j++) {
  452. if (module_list[i] == sel_in_map[j].id) {
  453. //find next module which can be connected
  454. step = i-1;
  455. while (module_can_connect[module_list[step]].bit==0 && step>0) {
  456. step--;
  457. }
  458. ASSERT(step>=0);
  459. for (k = 0 ; k < 4 ; k++) {
  460. if (sel_in_map[j].id_bit_map[k] == -1)
  461. break;
  462. if (sel_in_map[j].id_bit_map[k] == module_list[step]) {
  463. if (DISP_REG_GET(sel_in_map[j].reg) != k) {
  464. path_error += 1;
  465. DDPERR("in_s %s not connect to %s, expect=0x%x, real=0x%x \n",
  466. ddp_get_module_name(module_list[step]),ddp_get_module_name(module_list[i]),
  467. k,
  468. DISP_REG_GET(sel_in_map[j].reg));
  469. }
  470. break;
  471. }
  472. }
  473. }
  474. }
  475. }
  476. if (path_error == 0) {
  477. DDPMSG("path: %s to %s is connected\n",ddp_get_module_name(module_list[0]),
  478. ddp_get_module_name(module_list[module_num - 1]));
  479. } else {
  480. DDPERR("path: %s to %s not connected!!!\n",ddp_get_module_name(module_list[0]),
  481. ddp_get_module_name(module_list[module_num - 1]));
  482. }
  483. }
  484. static void ddp_disconnect_path_l(int *module_list,void * handle)
  485. {
  486. unsigned int i, j, k;
  487. unsigned int step = 0;
  488. unsigned int mout = 0;
  489. unsigned int reg_mout = 0;
  490. unsigned int mout_idx = 0;
  491. unsigned int module_num = ddp_get_module_num_l(module_list);
  492. DDPDBG("disconnect_path: %s to %s\n",ddp_get_module_name(module_list[0]),
  493. ddp_get_module_name(module_list[module_num-1]));
  494. for (i = 0 ; i < module_num - 1 ; i++) {
  495. for (j = 0 ; j < DDP_MOUT_NUM ; j++) {
  496. if (module_list[i] == mout_map[j].id) {
  497. //find next module which can be connected
  498. step = i+1;
  499. while (module_can_connect[module_list[step]].bit==0 && step<module_num) {
  500. step++;
  501. }
  502. ASSERT(step<module_num);
  503. for (k = 0 ; k < 5 ; k++) {
  504. if (mout_map[j].out_id_bit_map[k].m == -1)
  505. break;
  506. if (mout_map[j].out_id_bit_map[k].m == module_list[step]) {
  507. mout |= mout_map[j].out_id_bit_map[k].v;
  508. reg_mout |= mout;
  509. mout_idx = j;
  510. DDPDBG("disconnect mout %s to %s \n", ddp_get_module_name(module_list[i]),
  511. ddp_get_module_name(module_list[step]));
  512. break;
  513. }
  514. }
  515. //update mout_value
  516. mout_map[j].reg_val &= ~mout;
  517. mout = 0;
  518. }
  519. }
  520. if (reg_mout) {
  521. DISP_REG_SET(handle,mout_map[mout_idx].reg, mout_map[mout_idx].reg_val);
  522. reg_mout = 0;
  523. mout_idx = 0;
  524. }
  525. }
  526. }
  527. static MUTEX_SOF ddp_get_mutex_sof(DISP_MODULE_ENUM dest_module, DDP_MODE ddp_mode)
  528. {
  529. MUTEX_SOF mode = SOF_SINGLE;
  530. switch (dest_module) {
  531. case DISP_MODULE_DSI0: {
  532. mode = (ddp_mode==DDP_VIDEO_MODE ? SOF_DSI0 : SOF_SINGLE);
  533. break;
  534. }
  535. case DISP_MODULE_DSI1: {
  536. mode = (ddp_mode==DDP_VIDEO_MODE ? SOF_DSI1 : SOF_SINGLE);
  537. break;
  538. }
  539. case DISP_MODULE_DSIDUAL: {
  540. mode = (ddp_mode==DDP_VIDEO_MODE ? SOF_DSI0 : SOF_SINGLE);
  541. break;
  542. }
  543. case DISP_MODULE_DPI: {
  544. mode = SOF_DPI0;
  545. break;
  546. }
  547. case DISP_MODULE_WDMA0:
  548. case DISP_MODULE_WDMA1:
  549. mode = SOF_SINGLE;
  550. break;
  551. default:
  552. DDPERR("get mutex sof, invalid param dst module = %s(%d), dis mode %s\n",
  553. ddp_get_module_name(dest_module), dest_module,ddp_get_mode_name(ddp_mode));
  554. }
  555. DDPDBG("mutex sof: %s dst module %s:%s\n",
  556. ddp_get_mutex_sof_name(mode), ddp_get_module_name(dest_module),ddp_get_mode_name(ddp_mode));
  557. return mode;
  558. }
  559. // id: mutex ID, 0~5
  560. static int ddp_mutex_set_l(int mutex_id, int* module_list, DDP_MODE ddp_mode, void * handle)
  561. {
  562. int i=0;
  563. kal_uint32 value = 0;
  564. int module_num = ddp_get_module_num_l(module_list);
  565. MUTEX_SOF mode = ddp_get_mutex_sof(module_list[module_num-1],ddp_mode);
  566. if (mutex_id < DISP_MUTEX_DDP_FIRST || mutex_id > DISP_MUTEX_DDP_LAST) {
  567. DDPERR("exceed mutex max (0 ~ %d)\n",DISP_MUTEX_DDP_LAST);
  568. return -1;
  569. }
  570. for (i = 0 ; i < module_num ; i++) {
  571. if (module_mutex_map[module_list[i]].bit != -1) {
  572. DDPDBG("module %s added to mutex %d\n",ddp_get_module_name(module_list[i]),mutex_id);
  573. value |= (1 << module_mutex_map[module_list[i]].bit);
  574. }
  575. }
  576. DISP_REG_SET(handle,DISP_REG_CONFIG_MUTEX_MOD(mutex_id),value);
  577. DISP_REG_SET(handle,DISP_REG_CONFIG_MUTEX_SOF(mutex_id),mode<<6|mode);
  578. DDPMSG("mutex %d value=0x%x, sof=%s\n",mutex_id, value, ddp_get_mutex_sof_name(mode));
  579. return 0;
  580. }
  581. static void ddp_check_mutex_l(int mutex_id, int* module_list, DDP_MODE ddp_mode)
  582. {
  583. int i=0;
  584. kal_uint32 real_value = 0;
  585. kal_uint32 expect_value = 0;
  586. kal_uint32 real_sof = 0;
  587. MUTEX_SOF expect_sof = SOF_SINGLE;
  588. int module_num = ddp_get_module_num_l(module_list);
  589. if (mutex_id < DISP_MUTEX_DDP_FIRST || mutex_id > DISP_MUTEX_DDP_LAST) {
  590. DDPERR("check mutex fail:exceed mutex max (0 ~ %d)\n",DISP_MUTEX_DDP_LAST);
  591. return;
  592. }
  593. real_value = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD(mutex_id));
  594. for (i = 0 ; i < module_num ; i++) {
  595. if (module_mutex_map[module_list[i]].bit != -1)
  596. expect_value |= (1 << module_mutex_map[module_list[i]].bit);
  597. }
  598. if ( expect_value != real_value ) {
  599. DDPERR("mutex %d module error expect 0x%x, real 0x%x\n",mutex_id,expect_value,real_value);
  600. }
  601. real_sof = (DISP_REG_GET(DISP_REG_CONFIG_MUTEX_SOF(mutex_id)) & 0x3);
  602. expect_sof = ddp_get_mutex_sof(module_list[module_num-1],ddp_mode);
  603. if ((kal_uint32)expect_sof != real_sof) {
  604. DDPERR("mutex %d sof error expect %s, real %s\n", mutex_id,
  605. ddp_get_mutex_sof_name(expect_sof),
  606. ddp_get_mutex_sof_name((MUTEX_SOF)real_sof));
  607. }
  608. }
  609. static int ddp_mutex_enable_l(int mutex_idx,void * handle)
  610. {
  611. DDPDBG("mutex %d enable\n", mutex_idx);
  612. DISP_REG_SET(handle,DISP_REG_CONFIG_MUTEX_EN(mutex_idx),1);
  613. return 0;
  614. }
  615. int ddp_get_module_num(DDP_SCENARIO_ENUM scenario)
  616. {
  617. return ddp_get_module_num_l(module_list_scenario[scenario]);
  618. }
  619. static void ddp_print_scenario(DDP_SCENARIO_ENUM scenario)
  620. {
  621. int i =0;
  622. char path[512]= {'\0'};
  623. unsigned int left_len = sizeof(path);
  624. unsigned int scenario_len = 0;
  625. int num = ddp_get_module_num(scenario);
  626. for (i=0; i< num; i++) {
  627. scenario_len = strlen(ddp_get_mode_name(module_list_scenario[scenario][i]));
  628. if (scenario_len < left_len){
  629. strncat(path,ddp_get_module_name(module_list_scenario[scenario][i]),
  630. left_len);
  631. left_len -= scenario_len;
  632. } else {
  633. DDPERR("%s path string array size is not enough\n", path);
  634. break;
  635. }
  636. }
  637. DDPMSG("scenario %s have modules: %s\n",ddp_get_scenario_name(scenario),path);
  638. }
  639. static int ddp_find_module_index(DDP_SCENARIO_ENUM ddp_scenario, DISP_MODULE_ENUM module)
  640. {
  641. int i=0;
  642. for (i=0; i< DDP_ENING_NUM-1; i++) {
  643. if (module_list_scenario[ddp_scenario][i] == module) {
  644. return i;
  645. }
  646. }
  647. DDPDBG("find module: can not find module %s on scenario %s\n",ddp_get_module_name(module),
  648. ddp_get_scenario_name(ddp_scenario));
  649. return -1;
  650. }
  651. // set display interface when kernel init
  652. int ddp_set_dst_module(DDP_SCENARIO_ENUM scenario, DISP_MODULE_ENUM dst_module)
  653. {
  654. int i = 0;
  655. DDPMSG("ddp_set_dst_module, scenario=%s, dst_module=%s \n",
  656. ddp_get_scenario_name(scenario), ddp_get_module_name(dst_module));
  657. if (ddp_find_module_index(scenario,dst_module) > 0) {
  658. DDPDBG("%s is already on path\n",ddp_get_module_name(dst_module));
  659. return 0;
  660. }
  661. i = ddp_get_module_num_l(module_list_scenario[scenario])-1;
  662. if (dst_module == DISP_MODULE_DSIDUAL) {
  663. module_list_scenario[scenario][i++] = DISP_MODULE_SPLIT1;
  664. ASSERT(i<DDP_ENING_NUM);
  665. } else {
  666. if (ddp_get_dst_module(scenario)==DISP_MODULE_DSIDUAL) {
  667. module_list_scenario[scenario][i--] = -1;
  668. }
  669. }
  670. module_list_scenario[scenario][i] = dst_module;
  671. if (scenario == DDP_SCENARIO_PRIMARY_ALL) { //primary display
  672. ddp_set_dst_module(DDP_SCENARIO_PRIMARY_DISP,dst_module);
  673. ddp_set_dst_module(DDP_SCENARIO_PRIMARY_OVL_MEMOUT,dst_module);
  674. } else if (scenario==DDP_SCENARIO_SUB_ALL) { //sub display
  675. ddp_set_dst_module(DDP_SCENARIO_SUB_DISP,dst_module);
  676. ddp_set_dst_module(DDP_SCENARIO_SUB_OVL_MEMOUT,dst_module);
  677. }
  678. ddp_print_scenario(scenario);
  679. return 0;
  680. }
  681. DISP_MODULE_ENUM ddp_get_dst_module(DDP_SCENARIO_ENUM ddp_scenario)
  682. {
  683. DDPMSG("ddp_get_dst_module, scneario=%s, dst_module=%s \n",
  684. ddp_get_scenario_name(ddp_scenario),
  685. ddp_get_module_name(module_list_scenario[ddp_scenario][ddp_get_module_num_l(module_list_scenario[ddp_scenario])-1]));
  686. return module_list_scenario[ddp_scenario][ddp_get_module_num_l(module_list_scenario[ddp_scenario])-1];
  687. }
  688. int * ddp_get_scenario_list(DDP_SCENARIO_ENUM ddp_scenario)
  689. {
  690. return module_list_scenario[ddp_scenario];
  691. }
  692. int ddp_insert_module(DDP_SCENARIO_ENUM ddp_scenario, DISP_MODULE_ENUM place, DISP_MODULE_ENUM module)
  693. {
  694. int i = DDP_ENING_NUM-1;
  695. int idx = ddp_find_module_index(ddp_scenario,place);
  696. if ( idx < 0) {
  697. return -1;
  698. }
  699. //should not over load
  700. ASSERT(module_list_scenario[ddp_scenario][i] == -1);
  701. for (i=DDP_ENING_NUM-2; i>=idx; i--) {
  702. module_list_scenario[ddp_scenario][i+1] = module_list_scenario[ddp_scenario][i];
  703. }
  704. module_list_scenario[ddp_scenario][i] = module;
  705. {
  706. int * modules = ddp_get_scenario_list(ddp_scenario);
  707. int module_num = ddp_get_module_num(ddp_scenario);
  708. DDPMSG("after insert module, module list is: \n");
  709. for (i=0; i<module_num; i++) {
  710. DDPMSG("%s-", ddp_get_module_name(modules[i]));
  711. }
  712. }
  713. return 0;
  714. }
  715. int ddp_remove_module(DDP_SCENARIO_ENUM ddp_scenario, DISP_MODULE_ENUM module)
  716. {
  717. int i = 0;
  718. int idx = ddp_find_module_index(ddp_scenario,module);
  719. if ( idx < 0) {
  720. return -1;
  721. }
  722. //should not over load
  723. ASSERT(module_list_scenario[ddp_scenario][i] == -1);
  724. for (i=idx; i<DDP_ENING_NUM-1; i++) {
  725. module_list_scenario[ddp_scenario][i] = module_list_scenario[ddp_scenario][i+1];
  726. }
  727. module_list_scenario[ddp_scenario][i] = -1;
  728. return 0;
  729. }
  730. void ddp_connect_path(DDP_SCENARIO_ENUM scenario, void * handle)
  731. {
  732. DDPDBG("path connect on scenario %s\n", ddp_get_scenario_name(scenario));
  733. if (scenario == DDP_SCENARIO_PRIMARY_ALL) {
  734. ddp_connect_path_l(module_list_scenario[DDP_SCENARIO_PRIMARY_DISP], handle);
  735. ddp_connect_path_l(module_list_scenario[DDP_SCENARIO_PRIMARY_OVL_MEMOUT],handle);
  736. } else if (scenario == DDP_SCENARIO_SUB_ALL) {
  737. ddp_connect_path_l(module_list_scenario[DDP_SCENARIO_SUB_DISP], handle);
  738. ddp_connect_path_l(module_list_scenario[DDP_SCENARIO_SUB_OVL_MEMOUT], handle);
  739. } else {
  740. ddp_connect_path_l(module_list_scenario[scenario], handle);
  741. }
  742. return ;
  743. }
  744. void ddp_disconnect_path(DDP_SCENARIO_ENUM scenario,void * handle)
  745. {
  746. DDPDBG("path disconnect on scenario %s\n", ddp_get_scenario_name(scenario));
  747. if (scenario == DDP_SCENARIO_PRIMARY_ALL) {
  748. ddp_disconnect_path_l(module_list_scenario[DDP_SCENARIO_PRIMARY_DISP], handle);
  749. ddp_disconnect_path_l(module_list_scenario[DDP_SCENARIO_PRIMARY_OVL_MEMOUT], handle);
  750. } else if (scenario == DDP_SCENARIO_SUB_ALL) {
  751. ddp_disconnect_path_l(module_list_scenario[DDP_SCENARIO_SUB_DISP], handle);
  752. ddp_disconnect_path_l(module_list_scenario[DDP_SCENARIO_SUB_OVL_MEMOUT], handle);
  753. } else {
  754. ddp_disconnect_path_l(module_list_scenario[scenario], handle);
  755. }
  756. return ;
  757. }
  758. void ddp_check_path(DDP_SCENARIO_ENUM scenario)
  759. {
  760. DDPDBG("path check path on scenario %s\n", ddp_get_scenario_name(scenario));
  761. if (scenario == DDP_SCENARIO_PRIMARY_ALL) {
  762. ddp_check_path_l(module_list_scenario[DDP_SCENARIO_PRIMARY_DISP]);
  763. ddp_check_path_l(module_list_scenario[DDP_SCENARIO_PRIMARY_OVL_MEMOUT]);
  764. } else if (scenario == DDP_SCENARIO_SUB_ALL) {
  765. ddp_check_path_l(module_list_scenario[DDP_SCENARIO_SUB_DISP]);
  766. ddp_check_path_l(module_list_scenario[DDP_SCENARIO_SUB_OVL_MEMOUT]);
  767. } else {
  768. ddp_check_path_l(module_list_scenario[scenario]);
  769. }
  770. return ;
  771. }
  772. void ddp_check_mutex(int mutex_id, DDP_SCENARIO_ENUM scenario, DDP_MODE mode)
  773. {
  774. DDPDBG("check mutex %d on scenario %s\n",mutex_id,
  775. ddp_get_scenario_name(scenario));
  776. ddp_check_mutex_l(mutex_id,module_list_scenario[scenario],mode);
  777. return ;
  778. }
  779. int ddp_mutex_set(int mutex_id,DDP_SCENARIO_ENUM scenario,DDP_MODE mode, void * handle)
  780. {
  781. return ddp_mutex_set_l(mutex_id, module_list_scenario[scenario],mode, handle);
  782. }
  783. int ddp_mutex_clear(int mutex_id, void * handle)
  784. {
  785. DDPDBG("mutex %d clear\n", mutex_id);
  786. DISP_REG_SET(handle,DISP_REG_CONFIG_MUTEX_MOD(mutex_id),0);
  787. DISP_REG_SET(handle,DISP_REG_CONFIG_MUTEX_SOF(mutex_id),0);
  788. return 0;
  789. }
  790. int ddp_mutex_enable(int mutex_id,DDP_SCENARIO_ENUM scenario,void * handle)
  791. {
  792. return ddp_mutex_enable_l(mutex_id, handle);
  793. }
  794. int ddp_mutex_disenable(int mutex_id,DDP_SCENARIO_ENUM scenario,void * handle)
  795. {
  796. DDPDBG("mutex %d disable\n", mutex_id);
  797. DISP_REG_SET(handle,DISP_REG_CONFIG_MUTEX_EN(mutex_id),0);
  798. return 0;
  799. }
  800. int ddp_check_engine_status(int mutexID)
  801. {
  802. // check engines' clock bit & enable bit & status bit before unlock mutex
  803. // should not needed, in comdq do?
  804. int result = 0;
  805. return result;
  806. }
  807. int ddp_path_top_clock_on(void)
  808. {
  809. DDPMSG("ddp path top clock on\n");
  810. DISP_REG_SET(NULL,DISP_REG_CONFIG_MMSYS_DUMMY0,0xFFFFFFFF);
  811. ddp_enable_module_clock(DISP_MODULE_SMI);
  812. ddp_enable_module_clock(DISP_MODULE_MUTEX);
  813. DDPMSG("ddp CG:%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  814. return 0;
  815. }
  816. int ddp_path_top_clock_off(void)
  817. {
  818. DDPMSG("ddp path top clock off\n");
  819. ddp_disable_module_clock(DISP_MODULE_MUTEX);
  820. ddp_disable_module_clock(DISP_MODULE_SMI);
  821. return 0;
  822. }
  823. int ddp_path_m4u_off(void)
  824. {
  825. DDPMSG("ddp path m4u off\n");
  826. #ifdef MTKFB_NO_M4U
  827. DISP_REG_SET(0,DISP_REG_SMI_LARB_MMU_EN,0xfffffff8);//m4u disable
  828. #endif
  829. return 0;
  830. }