dev_disp.c 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334
  1. #include <aw_list.h>
  2. #include <rtthread.h>
  3. #include <init.h>
  4. #include <hal_reset.h>
  5. // #include <melis/standby/standby.h>
  6. #include "de/include.h"
  7. #include "dev_disp.h"
  8. struct disp_drv_info g_disp_drv;
  9. #define DISP_MEM_NUM 10
  10. /* alloc based on 4K byte */
  11. #define MY_BYTE_ALIGN(x) (((x + (4*1024-1)) >> 12) << 12)
  12. static unsigned int g_disp = 0, g_enhance_mode = 0, g_cvbs_enhance_mode;
  13. static bool g_pm_runtime_enable;
  14. struct disp_layer_config lyr_cfg[16];
  15. struct disp_layer_config2 lyr_cfg2[16];
  16. struct disp_layer_config2 lyr_cfg2_1[16];
  17. #define FDT_DISP_PATH "disp"
  18. hal_workqueue *g_disp_work_queue;
  19. static u32 suspend_output_type[4] = {0};
  20. static u32 DISP_print = 0xffff; /* print cmd which eq DISP_print */
  21. static u32 power_status_init;
  22. /*
  23. * 0:normal;
  24. * suspend_status&1 != 0:in early_suspend;
  25. * suspend_status&2 != 0:in suspend;
  26. */
  27. static u32 suspend_status;
  28. /* pm device */
  29. struct dev_pm *pm;
  30. #if 0
  31. static int _csc_enhance_setting[3][4] = {
  32. {50, 50, 50, 50},
  33. /* normal */
  34. {50, 50, 50, 50},
  35. /* vivid */
  36. {50, 40, 50, 50},
  37. /* soft */
  38. };
  39. #else
  40. extern int _csc_enhance_setting[3][4];
  41. #endif
  42. int disp_enhance_mode_show(u32 disp, char *buf)
  43. {
  44. sprintf(buf, "%u\n", g_enhance_mode);
  45. return g_enhance_mode;
  46. }
  47. int disp_enhance_mode_store(u32 disp, u32 value)
  48. {
  49. /*
  50. * mode: 0: standard; 1: vivid; 2: soft; 3: demo vivid
  51. */
  52. if (value > 3)
  53. pr_warn("Invalid value, 0~3 is expected!\n");
  54. else {
  55. int num_screens = 2;
  56. struct disp_manager *mgr = NULL;
  57. struct disp_enhance *enhance = NULL;
  58. g_enhance_mode = value;
  59. num_screens = bsp_disp_feat_get_num_screens();
  60. if (disp < num_screens)
  61. mgr = g_disp_drv.mgr[disp];
  62. if (mgr) {
  63. enhance = mgr->enhance;
  64. if (enhance && enhance->set_mode)
  65. #if defined(CONFIG_ARCH_SUN8IW15) || defined(CONFIG_ARCH_SUN50IW1)
  66. enhance->set_mode(enhance,
  67. (g_enhance_mode == 2) ?
  68. 1 : g_enhance_mode);
  69. if (g_enhance_mode == 2)
  70. g_enhance_mode = 3;
  71. #else
  72. enhance->set_mode(enhance,
  73. (g_enhance_mode == 3) ?
  74. 1 : g_enhance_mode);
  75. #endif
  76. if (enhance && enhance->demo_enable
  77. && enhance->demo_disable) {
  78. if (g_enhance_mode == 3)
  79. enhance->demo_enable(enhance);
  80. else
  81. enhance->demo_disable(enhance);
  82. }
  83. }
  84. }
  85. return 0;
  86. }
  87. int disp_enhance_bright_show(u32 disp, char *buf)
  88. {
  89. int num_screens = 2;
  90. struct disp_manager *mgr = NULL;
  91. struct disp_enhance *enhance = NULL;
  92. int value = 0;
  93. int real_mode = (g_enhance_mode == 3) ? 1 : g_enhance_mode;
  94. num_screens = bsp_disp_feat_get_num_screens();
  95. if (disp < num_screens)
  96. mgr = g_disp_drv.mgr[disp];
  97. if (mgr) {
  98. enhance = mgr->enhance;
  99. if (enhance && enhance->get_bright)
  100. value = enhance->get_bright(enhance);
  101. }
  102. sprintf(buf, "%d %d\n", _csc_enhance_setting[real_mode][0], value);
  103. return value;
  104. }
  105. int disp_enhance_bright_store(u32 disp, u32 value)
  106. {
  107. int err;
  108. int num_screens = 2;
  109. struct disp_manager *mgr = NULL;
  110. struct disp_enhance *enhance = NULL;
  111. int real_mode = (g_enhance_mode == 3) ? 1 : g_enhance_mode;
  112. num_screens = bsp_disp_feat_get_num_screens();
  113. if (disp < num_screens)
  114. mgr = g_disp_drv.mgr[disp];
  115. if (mgr) {
  116. enhance = mgr->enhance;
  117. if (enhance && enhance->set_bright) {
  118. _csc_enhance_setting[real_mode][0] = value;
  119. enhance->set_bright(enhance, value);
  120. }
  121. if (enhance && enhance->set_mode) {
  122. enhance->set_mode(enhance, real_mode ? 0 : 1);
  123. enhance->set_mode(enhance, real_mode);
  124. }
  125. }
  126. return 0;
  127. }
  128. int disp_enhance_saturation_show(u32 disp, char *buf)
  129. {
  130. int num_screens = 2;
  131. struct disp_manager *mgr = NULL;
  132. struct disp_enhance *enhance = NULL;
  133. int value = 0;
  134. int real_mode = (g_enhance_mode == 3) ? 1 : g_enhance_mode;
  135. num_screens = bsp_disp_feat_get_num_screens();
  136. if (disp < num_screens)
  137. mgr = g_disp_drv.mgr[disp];
  138. if (mgr) {
  139. enhance = mgr->enhance;
  140. if (enhance && enhance->get_saturation)
  141. value = enhance->get_saturation(enhance);
  142. }
  143. sprintf(buf, "%d %d\n", value, _csc_enhance_setting[real_mode][2]);
  144. return value;
  145. }
  146. int disp_enhance_saturation_store(u32 disp, u32 value)
  147. {
  148. int err;
  149. int num_screens = 2;
  150. struct disp_manager *mgr = NULL;
  151. struct disp_enhance *enhance = NULL;
  152. int real_mode = (g_enhance_mode == 3) ? 1 : g_enhance_mode;
  153. num_screens = bsp_disp_feat_get_num_screens();
  154. if (disp < num_screens)
  155. mgr = g_disp_drv.mgr[disp];
  156. if (mgr) {
  157. enhance = mgr->enhance;
  158. if (enhance && enhance->set_saturation) {
  159. _csc_enhance_setting[real_mode][2] = value;
  160. enhance->set_saturation(enhance, value);
  161. }
  162. if (enhance && enhance->set_mode) {
  163. enhance->set_mode(enhance, real_mode ? 0 : 1);
  164. enhance->set_mode(enhance, real_mode);
  165. }
  166. }
  167. return 0;
  168. }
  169. int disp_enhance_contrast_show(u32 disp, char *buf)
  170. {
  171. int num_screens = 2;
  172. struct disp_manager *mgr = NULL;
  173. struct disp_enhance *enhance = NULL;
  174. int value = 0;
  175. int real_mode = (g_enhance_mode == 3) ? 1 : g_enhance_mode;
  176. num_screens = bsp_disp_feat_get_num_screens();
  177. if (disp < num_screens)
  178. mgr = g_disp_drv.mgr[disp];
  179. if (mgr) {
  180. enhance = mgr->enhance;
  181. if (enhance && enhance->get_contrast)
  182. value = enhance->get_contrast(enhance);
  183. }
  184. sprintf(buf, "%d %d\n", value, _csc_enhance_setting[real_mode][1]);
  185. return value;
  186. }
  187. int disp_enhance_contrast_store(u32 disp, u32 value)
  188. {
  189. int err;
  190. int num_screens = 2;
  191. struct disp_manager *mgr = NULL;
  192. struct disp_enhance *enhance = NULL;
  193. int real_mode = (g_enhance_mode == 3) ? 1 : g_enhance_mode;
  194. num_screens = bsp_disp_feat_get_num_screens();
  195. if (disp < num_screens)
  196. mgr = g_disp_drv.mgr[disp];
  197. if (mgr) {
  198. enhance = mgr->enhance;
  199. if (enhance && enhance->set_contrast) {
  200. _csc_enhance_setting[real_mode][1] = value;
  201. enhance->set_contrast(enhance, value);
  202. }
  203. if (enhance && enhance->set_mode) {
  204. enhance->set_mode(enhance, real_mode ? 0 : 1);
  205. enhance->set_mode(enhance, real_mode);
  206. }
  207. }
  208. return 0;
  209. }
  210. int disp_enhance_edge_show(u32 disp, char *buf)
  211. {
  212. int num_screens = 2;
  213. struct disp_manager *mgr = NULL;
  214. struct disp_enhance *enhance = NULL;
  215. int value = 0;
  216. num_screens = bsp_disp_feat_get_num_screens();
  217. if (disp < num_screens)
  218. mgr = g_disp_drv.mgr[disp];
  219. if (mgr) {
  220. enhance = mgr->enhance;
  221. if (enhance && enhance->get_edge)
  222. value = enhance->get_edge(enhance);
  223. }
  224. sprintf(buf, "%d\n", value);
  225. return value;
  226. }
  227. int disp_enhance_edge_store(u32 disp, u32 value)
  228. {
  229. int err;
  230. int num_screens = 2;
  231. struct disp_manager *mgr = NULL;
  232. struct disp_enhance *enhance = NULL;
  233. num_screens = bsp_disp_feat_get_num_screens();
  234. if (disp < num_screens)
  235. mgr = g_disp_drv.mgr[disp];
  236. if (mgr) {
  237. enhance = mgr->enhance;
  238. if (enhance && enhance->set_edge)
  239. enhance->set_edge(enhance, value);
  240. }
  241. return 0;
  242. }
  243. int disp_enhance_detail_show(u32 disp, char *buf)
  244. {
  245. int num_screens = 2;
  246. struct disp_manager *mgr = NULL;
  247. struct disp_enhance *enhance = NULL;
  248. int value = 0;
  249. num_screens = bsp_disp_feat_get_num_screens();
  250. if (disp < num_screens)
  251. mgr = g_disp_drv.mgr[disp];
  252. if (mgr) {
  253. enhance = mgr->enhance;
  254. if (enhance && enhance->get_detail)
  255. value = enhance->get_detail(enhance);
  256. }
  257. sprintf(buf, "%d\n", value);
  258. return value;
  259. }
  260. int disp_enhance_detail_store(u32 disp, u32 value)
  261. {
  262. int err;
  263. int num_screens = 2;
  264. struct disp_manager *mgr = NULL;
  265. struct disp_enhance *enhance = NULL;
  266. num_screens = bsp_disp_feat_get_num_screens();
  267. if (disp < num_screens)
  268. mgr = g_disp_drv.mgr[disp];
  269. if (mgr) {
  270. enhance = mgr->enhance;
  271. if (enhance && enhance->set_detail)
  272. enhance->set_detail(enhance, value);
  273. }
  274. return 0;
  275. }
  276. int disp_enhance_denoise_show(u32 disp, char *buf)
  277. {
  278. int num_screens = 2;
  279. struct disp_manager *mgr = NULL;
  280. struct disp_enhance *enhance = NULL;
  281. int value = 0;
  282. num_screens = bsp_disp_feat_get_num_screens();
  283. if (disp < num_screens)
  284. mgr = g_disp_drv.mgr[disp];
  285. if (mgr) {
  286. enhance = mgr->enhance;
  287. if (enhance && enhance->get_denoise)
  288. value = enhance->get_denoise(enhance);
  289. }
  290. sprintf(buf, "%d\n", value);
  291. return value;
  292. }
  293. int disp_enhance_denoise_store(u32 disp, u32 value)
  294. {
  295. int err;
  296. int num_screens = 2;
  297. struct disp_manager *mgr = NULL;
  298. struct disp_enhance *enhance = NULL;
  299. num_screens = bsp_disp_feat_get_num_screens();
  300. if (disp < num_screens)
  301. mgr = g_disp_drv.mgr[disp];
  302. if (mgr) {
  303. enhance = mgr->enhance;
  304. if (enhance && enhance->set_denoise)
  305. enhance->set_denoise(enhance, value);
  306. }
  307. return 0;
  308. }
  309. int disp_color_temperature_show(u32 disp, char *buf)
  310. {
  311. int num_screens = 2;
  312. struct disp_manager *mgr = NULL;
  313. struct disp_device *dispdev = NULL;
  314. int value = 0;
  315. num_screens = bsp_disp_feat_get_num_screens();
  316. if (disp < num_screens)
  317. mgr = g_disp_drv.mgr[disp];
  318. if (mgr && mgr->device) {
  319. dispdev = mgr->device;
  320. if (dispdev->get_color_temperature)
  321. value = dispdev->get_color_temperature(dispdev);
  322. }
  323. sprintf(buf, "%d\n", value);
  324. return value;
  325. }
  326. int disp_color_temperature_store(u32 disp, s32 value)
  327. {
  328. int err;
  329. int num_screens = 2;
  330. struct disp_manager *mgr = NULL;
  331. struct disp_device *dispdev = NULL;
  332. if ((value > 256) || (value < -256)) {
  333. pr_warn("value shoud in range [-256,256]\n");
  334. value = (value > 256) ? 256 : value;
  335. value = (value < -256) ? -256 : value;
  336. }
  337. num_screens = bsp_disp_feat_get_num_screens();
  338. if (g_disp < num_screens)
  339. mgr = g_disp_drv.mgr[g_disp];
  340. if (mgr && mgr->device) {
  341. dispdev = mgr->device;
  342. if (dispdev->set_color_temperature)
  343. value = dispdev->set_color_temperature(dispdev, value);
  344. }
  345. return 0;
  346. }
  347. int sunxi_disp_get_source_ops(struct sunxi_disp_source_ops *src_ops)
  348. {
  349. memset((void *)src_ops, 0, sizeof(struct sunxi_disp_source_ops));
  350. src_ops->sunxi_lcd_set_panel_funs = bsp_disp_lcd_set_panel_funs;
  351. src_ops->sunxi_lcd_delay_ms = disp_delay_ms;
  352. src_ops->sunxi_lcd_delay_us = disp_delay_us;
  353. src_ops->sunxi_lcd_backlight_enable = bsp_disp_lcd_backlight_enable;
  354. src_ops->sunxi_lcd_backlight_disable = bsp_disp_lcd_backlight_disable;
  355. src_ops->sunxi_lcd_pwm_enable = bsp_disp_lcd_pwm_enable;
  356. src_ops->sunxi_lcd_pwm_disable = bsp_disp_lcd_pwm_disable;
  357. src_ops->sunxi_lcd_power_enable = bsp_disp_lcd_power_enable;
  358. src_ops->sunxi_lcd_power_disable = bsp_disp_lcd_power_disable;
  359. src_ops->sunxi_lcd_tcon_enable = bsp_disp_lcd_tcon_enable;
  360. src_ops->sunxi_lcd_tcon_disable = bsp_disp_lcd_tcon_disable;
  361. src_ops->sunxi_lcd_pin_cfg = bsp_disp_lcd_pin_cfg;
  362. src_ops->sunxi_lcd_gpio_set_value = bsp_disp_lcd_gpio_set_value;
  363. src_ops->sunxi_lcd_gpio_set_direction = bsp_disp_lcd_gpio_set_direction;
  364. #ifdef SUPPORT_DSI
  365. src_ops->sunxi_lcd_dsi_dcs_write = bsp_disp_lcd_dsi_dcs_wr;
  366. src_ops->sunxi_lcd_dsi_gen_write = bsp_disp_lcd_dsi_gen_wr;
  367. src_ops->sunxi_lcd_dsi_clk_enable = bsp_disp_lcd_dsi_clk_enable;
  368. src_ops->sunxi_lcd_dsi_mode_switch = bsp_disp_lcd_dsi_mode_switch;
  369. src_ops->sunxi_lcd_dsi_gen_short_read = bsp_disp_lcd_dsi_gen_short_read;
  370. src_ops->sunxi_lcd_dsi_dcs_read = bsp_disp_lcd_dsi_dcs_read;
  371. src_ops->sunxi_lcd_dsi_set_max_ret_size = bsp_disp_lcd_set_max_ret_size;
  372. #endif
  373. src_ops->sunxi_lcd_cpu_write = tcon0_cpu_wr_16b;
  374. src_ops->sunxi_lcd_cpu_write_data = tcon0_cpu_wr_16b_data;
  375. src_ops->sunxi_lcd_cpu_write_index = tcon0_cpu_wr_16b_index;
  376. src_ops->sunxi_lcd_cpu_set_auto_mode = tcon0_cpu_set_auto_mode;
  377. return 0;
  378. }
  379. static s32 parser_disp_init_para(struct disp_init_para *init_para)
  380. {
  381. s32 value;
  382. s32 i;
  383. memset(init_para, 0, sizeof(struct disp_init_para));
  384. if (disp_sys_script_get_item("disp","disp_init_enable", &value, 1) != 1) {
  385. DE_WRN("of_property_read disp_init.disp_init_enable fail\n");
  386. return -1;
  387. }
  388. init_para->b_init = value;
  389. if (disp_sys_script_get_item("disp","disp_mode", &value, 1) != 1) {
  390. DE_WRN("of_property_read disp_init.disp_mode fail\n");
  391. return -1;
  392. }
  393. init_para->disp_mode = value;
  394. /* screen0 */
  395. if (disp_sys_script_get_item("disp", "screen0_output_type", &value, 1) != 1) {
  396. DE_WRN("of_property_read disp_init.screen0_output_type fail\n");
  397. return -1;
  398. }
  399. if (value == 0) {
  400. init_para->output_type[0] = DISP_OUTPUT_TYPE_NONE;
  401. } else if (value == 1) {
  402. init_para->output_type[0] = DISP_OUTPUT_TYPE_LCD;
  403. } else if (value == 2) {
  404. init_para->output_type[0] = DISP_OUTPUT_TYPE_TV;
  405. } else if (value == 3) {
  406. init_para->output_type[0] = DISP_OUTPUT_TYPE_HDMI;
  407. } else if (value == 4) {
  408. init_para->output_type[0] = DISP_OUTPUT_TYPE_VGA;
  409. } else if (value == 5) {
  410. init_para->output_type[0] = DISP_OUTPUT_TYPE_VDPO;
  411. } else if (value == 6) {
  412. init_para->output_type[0] = DISP_OUTPUT_TYPE_EDP;
  413. } else {
  414. DE_WRN("invalid screen0_output_type %d\n",
  415. init_para->output_type[0]);
  416. return -1;
  417. }
  418. if (disp_sys_script_get_item("disp", "screen0_output_mode", &value, 1) != 1) {
  419. DE_WRN("of_property_read disp_init.screen0_output_mode fail\n");
  420. return -1;
  421. }
  422. if (init_para->output_type[0] != DISP_OUTPUT_TYPE_NONE &&
  423. init_para->output_type[0] != DISP_OUTPUT_TYPE_LCD)
  424. init_para->output_mode[0] = value;
  425. if (disp_sys_script_get_item("disp", "screen0_output_format", &value, 1) != 1) {
  426. DE_INF("of_property_read screen0_output_format fail\n");
  427. } else {
  428. init_para->output_format[0] = value;
  429. init_para->using_device_config[0] = true;
  430. }
  431. if (disp_sys_script_get_item("disp", "screen0_output_bits", &value, 1) != 1) {
  432. DE_INF("of_property_read screen0_output_bits fail\n");
  433. } else {
  434. init_para->output_bits[0] = value;
  435. init_para->using_device_config[0] = true;
  436. }
  437. if (disp_sys_script_get_item("disp", "screen0_output_eotf", &value, 1) != 1) {
  438. DE_INF("of_property_read screen0_output_eotf fail\n");
  439. } else {
  440. init_para->output_eotf[0] = value;
  441. init_para->using_device_config[0] = true;
  442. }
  443. if (disp_sys_script_get_item("disp", "screen0_output_cs", &value, 1) != 1) {
  444. DE_INF("of_property_read screen0_output_cs fail\n");
  445. } else {
  446. init_para->output_cs[0] = value;
  447. init_para->using_device_config[0] = true;
  448. }
  449. if (disp_sys_script_get_item("disp", "screen0_output_dvi_hdmi", &value, 1) != 1) {
  450. DE_INF("of_property_read screen0_output_dvi_hdmi fail\n");
  451. } else {
  452. init_para->output_dvi_hdmi[0] = value;
  453. init_para->using_device_config[0] = true;
  454. }
  455. if (disp_sys_script_get_item("disp", "screen0_output_range", &value, 1) != 1) {
  456. DE_INF("of_property_read screen0_output_range fail\n");
  457. } else {
  458. init_para->output_range[0] = value;
  459. init_para->using_device_config[0] = true;
  460. }
  461. if (disp_sys_script_get_item("disp", "screen0_output_scan", &value, 1) != 1) {
  462. DE_INF("of_property_read screen0_output_scan fail\n");
  463. } else {
  464. init_para->output_scan[0] = value;
  465. init_para->using_device_config[0] = true;
  466. }
  467. if (disp_sys_script_get_item("disp", "screen0_output_aspect_ratio", &value, 1) != 1) {
  468. DE_INF("of_property_read screen0_output_aspect_ratio fail\n");
  469. } else {
  470. init_para->output_aspect_ratio[0] = value;
  471. init_para->using_device_config[0] = true;
  472. }
  473. #if DISP_SCREEN_NUM > 1
  474. /* screen1 */
  475. if (disp_sys_script_get_item("disp", "screen1_output_type", &value, 1) != 1) {
  476. DE_WRN("of_property_read screen1_output_type fail\n");
  477. return -1;
  478. }
  479. if (value == 0) {
  480. init_para->output_type[1] = DISP_OUTPUT_TYPE_NONE;
  481. } else if (value == 1) {
  482. init_para->output_type[1] = DISP_OUTPUT_TYPE_LCD;
  483. } else if (value == 2) {
  484. init_para->output_type[1] = DISP_OUTPUT_TYPE_TV;
  485. } else if (value == 3) {
  486. init_para->output_type[1] = DISP_OUTPUT_TYPE_HDMI;
  487. } else if (value == 4) {
  488. init_para->output_type[1] = DISP_OUTPUT_TYPE_VGA;
  489. } else if (value == 5) {
  490. init_para->output_type[1] = DISP_OUTPUT_TYPE_VDPO;
  491. } else if (value == 6) {
  492. init_para->output_type[1] = DISP_OUTPUT_TYPE_EDP;
  493. } else {
  494. DE_WRN("invalid screen1_output_type %d\n",
  495. init_para->output_type[1]);
  496. return -1;
  497. }
  498. if (disp_sys_script_get_item("disp", "screen1_output_mode", &value, 1) != 1)
  499. DE_INF
  500. ("of_property_read screen1_output_mode fail\n");
  501. if (init_para->output_type[1] != DISP_OUTPUT_TYPE_NONE &&
  502. init_para->output_type[1] != DISP_OUTPUT_TYPE_LCD)
  503. init_para->output_mode[1] = value;
  504. if (disp_sys_script_get_item("disp", "screen1_output_format", &value, 1) != 1) {
  505. DE_INF("of_property_read screen1_output_format fail\n");
  506. } else {
  507. init_para->output_format[1] = value;
  508. init_para->using_device_config[1] = true;
  509. }
  510. if (disp_sys_script_get_item("disp", "screen1_output_bits",
  511. &value, 1) != 1) {
  512. DE_INF("of_property_read screen1_output_bits fail\n");
  513. } else {
  514. init_para->output_bits[1] = value;
  515. init_para->using_device_config[1] = true;
  516. }
  517. if (disp_sys_script_get_item("disp", "screen1_output_eotf",
  518. &value, 1) != 1) {
  519. DE_INF("of_property_read screen1_output_eotf fail\n");
  520. } else {
  521. init_para->output_eotf[1] = value;
  522. init_para->using_device_config[1] = true;
  523. }
  524. if (disp_sys_script_get_item("disp", "screen1_output_cs",
  525. &value, 1) != 1) {
  526. DE_INF("of_property_read screen1_output_cs fail\n");
  527. } else {
  528. init_para->output_cs[1] = value;
  529. init_para->using_device_config[1] = true;
  530. }
  531. if (disp_sys_script_get_item("disp", "screen1_output_dvi_hdmi",
  532. &value, 1) != 1) {
  533. DE_INF(
  534. "of_property_read screen1_output_dvi_hdmi fail\n");
  535. } else {
  536. init_para->output_dvi_hdmi[1] = value;
  537. init_para->using_device_config[1] = true;
  538. }
  539. if (disp_sys_script_get_item("disp", "screen1_output_range",
  540. &value, 1) != 1) {
  541. DE_INF("of_property_read screen1_output_range fail\n");
  542. } else {
  543. init_para->output_range[1] = value;
  544. init_para->using_device_config[1] = true;
  545. }
  546. if (disp_sys_script_get_item("disp", "screen1_output_scan",
  547. &value, 1) != 1) {
  548. DE_INF("of_property_read screen1_output_scan fail\n");
  549. } else {
  550. init_para->output_scan[1] = value;
  551. init_para->using_device_config[1] = true;
  552. }
  553. if (disp_sys_script_get_item("disp",
  554. "screen1_output_aspect_ratio",
  555. &value, 1) != 1) {
  556. DE_INF("read screen1_output_aspect_ratio fail\n");
  557. } else {
  558. init_para->output_aspect_ratio[1] = value;
  559. init_para->using_device_config[1] = true;
  560. }
  561. #endif
  562. /* fb0 */
  563. init_para->buffer_num[0] = 2;
  564. if (disp_sys_script_get_item("disp", "fb0_buffer_num", &value, 1) != 1)
  565. init_para->buffer_num[0] = 2;
  566. else
  567. init_para->buffer_num[0] = value;
  568. if (disp_sys_script_get_item("disp", "fb0_format", &value, 1) != 1) {
  569. DE_INF("of_property_read disp_init.fb0_format fail\n");
  570. init_para->format[0] = 0;
  571. } else
  572. init_para->format[0] = value;
  573. if (disp_sys_script_get_item("disp", "fb0_width", &value, 1) != 1) {
  574. DE_INF("of_property_read fb0_width fail\n");
  575. init_para->fb_width[0] = 0;
  576. } else
  577. init_para->fb_width[0] = value;
  578. if (disp_sys_script_get_item("disp", "fb0_height", &value, 1) != 1) {
  579. DE_INF("of_property_read fb0_height fail\n");
  580. init_para->fb_height[0] = 0;
  581. } else
  582. init_para->fb_height[0] = value;
  583. /* fb1 */
  584. #if DISP_SCREEN_NUM > 1
  585. init_para->buffer_num[1] = 2;
  586. if (disp_sys_script_get_item("disp", "fb1_buffer_num", &value,
  587. 1) != 1)
  588. init_para->buffer_num[1] = value;
  589. if (disp_sys_script_get_item("disp", "fb1_format", &value, 1) !=
  590. 1)
  591. init_para->format[1] = value;
  592. if (disp_sys_script_get_item("disp", "fb1_width", &value, 1) !=
  593. 1)
  594. init_para->fb_width[1] = value;
  595. if (disp_sys_script_get_item("disp", "fb_height", &value, 1) != 1)
  596. init_para->fb_height[1] = value;
  597. #endif
  598. DE_INF("====display init para begin====\n");
  599. DE_INF("b_init:%d\n", init_para->b_init);
  600. DE_INF("disp_mode:%d\n\n", init_para->disp_mode);
  601. for (i = 0; i < DISP_SCREEN_NUM; i++) {
  602. DE_INF("output_type[%d]:%d\n", i, init_para->output_type[i]);
  603. DE_INF("output_mode[%d]:%d\n", i, init_para->output_mode[i]);
  604. }
  605. for (i = 0; i < DISP_SCREEN_NUM; i++) {
  606. DE_INF("buffer_num[%d]:%d\n", i, init_para->buffer_num[i]);
  607. DE_INF("format[%d]:%d\n", i, init_para->format[i]);
  608. DE_INF("fb_width[%d]:%d\n", i, init_para->fb_width[i]);
  609. DE_INF("fb_height[%d]:%d\n", i, init_para->fb_height[i]);
  610. }
  611. DE_INF("====display init para end====\n");
  612. return 0;
  613. }
  614. static void start_work(hal_work *work, void* work_data)
  615. {
  616. int num_screens;
  617. int screen_id;
  618. int count = 0;
  619. num_screens = bsp_disp_feat_get_num_screens();
  620. while ((g_disp_drv.inited == 0) && (count < 5)) {
  621. count++;
  622. disp_delay_ms(20);
  623. }
  624. if (count >= 5)
  625. DE_WRN("%s, timeout\n", __func__);
  626. if (g_disp_drv.para.boot_info.sync == 0) {
  627. for (screen_id = 0; screen_id < num_screens; screen_id++) {
  628. int disp_mode = g_disp_drv.disp_init.disp_mode;
  629. int output_type =
  630. g_disp_drv.disp_init.output_type[screen_id%DE_NUM];
  631. int output_mode =
  632. g_disp_drv.disp_init.output_mode[screen_id%DE_NUM];
  633. int lcd_registered =
  634. bsp_disp_get_lcd_registered(screen_id);
  635. int hdmi_registered = bsp_disp_get_hdmi_registered();
  636. DE_INF(
  637. "sel=%d, output_type=%d, lcd_reg=%d,hdmi_reg=%d\n",
  638. screen_id, output_type, lcd_registered,
  639. hdmi_registered);
  640. if (((disp_mode == DISP_INIT_MODE_SCREEN0)
  641. && (screen_id == 0))
  642. || ((disp_mode == DISP_INIT_MODE_SCREEN1)
  643. && (screen_id == 1))) {
  644. if (output_type == DISP_OUTPUT_TYPE_LCD) {
  645. if (lcd_registered &&
  646. bsp_disp_get_output_type(screen_id)
  647. != DISP_OUTPUT_TYPE_LCD) {
  648. bsp_disp_device_switch(screen_id, output_type, output_mode);
  649. suspend_output_type[screen_id] =
  650. output_type;
  651. }
  652. } else if (output_type
  653. == DISP_OUTPUT_TYPE_HDMI) {
  654. if (hdmi_registered &&
  655. bsp_disp_get_output_type(screen_id)
  656. != DISP_OUTPUT_TYPE_HDMI) {
  657. disp_delay_ms(600);
  658. bsp_disp_device_switch(screen_id, output_type, output_mode);
  659. suspend_output_type[screen_id] =
  660. output_type;
  661. }
  662. } else {
  663. bsp_disp_device_switch(screen_id,
  664. output_type,
  665. output_mode);
  666. suspend_output_type[screen_id] =
  667. output_type;
  668. }
  669. }
  670. }
  671. } else {
  672. if ((g_disp_drv.para.boot_info.type == DISP_OUTPUT_TYPE_HDMI)
  673. && !bsp_disp_get_hdmi_registered())
  674. return;
  675. if (bsp_disp_get_output_type(g_disp_drv.para.boot_info.disp) !=
  676. g_disp_drv.para.boot_info.type) {
  677. bsp_disp_sync_with_hw(&g_disp_drv.para);
  678. suspend_output_type[g_disp_drv.para.boot_info.disp] =
  679. g_disp_drv.para.boot_info.type;
  680. }
  681. }
  682. }
  683. static s32 start_process(void)
  684. {
  685. hal_workqueue_dowork(g_disp_work_queue, &g_disp_drv.start_work);
  686. return 0;
  687. }
  688. rt_weak s32 lcd_vsync_event_process(u32 sel)
  689. {
  690. return 0;
  691. }
  692. static rt_err_t disp_init(void)
  693. {
  694. struct disp_bsp_init_para *para;
  695. int i, disp, num_screens;
  696. unsigned int value, value1, value2, output_type, output_mode;
  697. unsigned int output_format, output_bits, output_eotf, output_cs;
  698. rt_err_t ret = -1;
  699. DE_INF("%s start\n", __func__);
  700. g_disp_work_queue = hal_workqueue_create("disp2", 8192, 15);
  701. if (!g_disp_work_queue) {
  702. DE_WRN("Create disp work queue fail!\n");
  703. goto OUT;
  704. }
  705. parser_disp_init_para(&g_disp_drv.disp_init);
  706. hal_work_init(&g_disp_drv.start_work, start_work, NULL);
  707. ret = disp_sys_mutex_init(&g_disp_drv.mlock);
  708. para = &g_disp_drv.para;
  709. for (i = 0; i < DISP_MOD_NUM; i++) {
  710. para->reg_base[i] = g_disp_drv.reg_base[i];
  711. para->irq_no[i] = g_disp_drv.irq_no[i];
  712. DE_INF("mod %d, base=0x%lx, irq=%d\n", i,
  713. para->reg_base[i], para->irq_no[i]);
  714. }
  715. for (i = 0; i < DE_NUM; i++) {
  716. para->clk_de[i] = g_disp_drv.clk_de[i];
  717. para->clk_bus_de[i] = g_disp_drv.clk_bus_de[i];
  718. }
  719. for (i = 0; i < DISP_DEVICE_NUM; i++) {
  720. para->clk_bus_dpss_top[i] = g_disp_drv.clk_bus_dpss_top[i];
  721. para->clk_tcon_lcd[i] = g_disp_drv.clk_tcon_lcd[i];
  722. para->clk_bus_tcon_lcd[i] = g_disp_drv.clk_bus_tcon_lcd[i];
  723. }
  724. #if defined(SUPPORT_DSI)
  725. for (i = 0; i < CLK_DSI_NUM; i++) {
  726. para->clk_mipi_dsi[i] = g_disp_drv.clk_mipi_dsi[i];
  727. para->clk_bus_mipi_dsi[i] = g_disp_drv.clk_bus_mipi_dsi[i];
  728. }
  729. #endif
  730. para->boot_info.dvi_hdmi =
  731. g_disp_drv.disp_init.output_dvi_hdmi[para->boot_info.disp];
  732. para->boot_info.range =
  733. g_disp_drv.disp_init.output_range[para->boot_info.disp];
  734. para->boot_info.scan =
  735. g_disp_drv.disp_init.output_scan[para->boot_info.disp];
  736. para->boot_info.aspect_ratio =
  737. g_disp_drv.disp_init.output_aspect_ratio[para->boot_info.disp];
  738. para->boot_info.sync = 0;
  739. para->start_process = start_process;
  740. para->vsync_event = lcd_vsync_event_process;
  741. bsp_disp_init(para);
  742. num_screens = bsp_disp_feat_get_num_screens();
  743. for (disp = 0; disp < num_screens; disp++)
  744. g_disp_drv.mgr[disp] = disp_get_layer_manager(disp);
  745. #if defined(SUPPORT_EINK)
  746. g_disp_drv.eink_manager[0] = disp_get_eink_manager(0);
  747. #endif
  748. lcd_init();
  749. g_disp_drv.inited = true;
  750. start_process();
  751. DE_INF("%s finish\n", __func__);
  752. OUT:
  753. return ret;
  754. }
  755. static int disp_clk_get_wrap(struct disp_drv_info *disp_drv)
  756. {
  757. int i;
  758. char id[32];
  759. /* get clocks for de */
  760. for (i = 0; i < DE_NUM; i++) {
  761. sprintf(id, "clk_de%d", i);
  762. disp_drv->clk_de[i] = disp_getprop_clk(id);
  763. if (disp_drv->clk_de[i] == (hal_clk_id_t)-1) {
  764. DE_WRN("failed to get clk for %s\n", id);
  765. }
  766. sprintf(id, "clk_bus_de%d", i);
  767. disp_drv->clk_bus_de[i] = disp_getprop_clk(id);
  768. if (disp_drv->clk_bus_de[i] == (hal_clk_id_t)-1) {
  769. DE_WRN("failed to get clk for %s\n", id);
  770. }
  771. }
  772. for (i = 0; i < DISP_DEVICE_NUM; i++) {
  773. /* get clocks for dpss */
  774. sprintf(id, "clk_bus_dpss_top%d", i);
  775. disp_drv->clk_bus_dpss_top[i] = disp_getprop_clk(id);
  776. if (disp_drv->clk_bus_dpss_top[i] == (hal_clk_id_t)-1) {
  777. DE_WRN("failed to get clk for %s\n", id);
  778. }
  779. /* get clocks for tcon */
  780. sprintf(id, "clk_tcon%d", i);
  781. disp_drv->clk_tcon_lcd[i] = disp_getprop_clk(id);
  782. if (disp_drv->clk_tcon_lcd[i] == (hal_clk_id_t)-1) {
  783. DE_WRN("failed to get clk for %s\n", id);
  784. }
  785. sprintf(id, "clk_bus_tcon%d", i);
  786. disp_drv->clk_bus_tcon_lcd[i] = disp_getprop_clk(id);
  787. if (disp_drv->clk_bus_tcon_lcd[i] == (hal_clk_id_t)-1) {
  788. DE_WRN("failed to get clk for %s\n", id);
  789. }
  790. }
  791. #if defined(SUPPORT_DSI)
  792. for (i = 0; i < CLK_DSI_NUM; i++) {
  793. sprintf(id, "clk_mipi_dsi%d", i);
  794. disp_drv->clk_mipi_dsi[i] = disp_getprop_clk(id);
  795. if (disp_drv->clk_mipi_dsi[i] == (hal_clk_id_t)-1) {
  796. DE_WRN("failed to get clk for %s\n", id);
  797. }
  798. sprintf(id, "clk_bus_mipi_dsi%d", i);
  799. disp_drv->clk_bus_mipi_dsi[i] = disp_getprop_clk(id);
  800. if (disp_drv->clk_bus_mipi_dsi[i] == (hal_clk_id_t)-1) {
  801. DE_WRN("failed to get clk for %s\n", id);
  802. }
  803. }
  804. #endif
  805. #if defined(SUPPORT_LVDS)
  806. for (i = 0; i < DEVICE_LVDS_NUM; i++) {
  807. sprintf(id, "rst_bus_lvds%d", i);
  808. disp_drv->para.rst_bus_lvds = disp_get_rst_by_name(id);
  809. if (disp_drv->para.rst_bus_lvds == NULL) {
  810. DE_WRN("failed to get rst for %s\n", id);
  811. }
  812. }
  813. #endif
  814. /*FIXME*/
  815. /*need to get rst bus for lvds*/
  816. return 0;
  817. }
  818. int disp_suspend(void *para)
  819. {
  820. u32 screen_id = 0;
  821. int num_screens;
  822. struct disp_manager *mgr = NULL;
  823. struct disp_device *dispdev_suspend = NULL;
  824. struct list_head *disp_list = NULL;
  825. struct disp_device *dispdev = NULL;
  826. num_screens = bsp_disp_feat_get_num_screens();
  827. if (g_pm_runtime_enable) {
  828. for (screen_id = 0; screen_id < num_screens;
  829. screen_id++) {
  830. mgr = g_disp_drv.mgr[screen_id];
  831. if (!mgr || !mgr->device)
  832. continue;
  833. dispdev = mgr->device;
  834. if (suspend_output_type[screen_id] ==
  835. DISP_OUTPUT_TYPE_LCD)
  836. hal_workqueue_dowork(g_disp_work_queue,
  837. &g_disp_drv.start_work);
  838. if (suspend_output_type[screen_id] !=
  839. DISP_OUTPUT_TYPE_NONE) {
  840. if (dispdev->is_enabled(dispdev))
  841. dispdev->disable(dispdev);
  842. }
  843. }
  844. } else {
  845. for (screen_id = 0; screen_id < num_screens;
  846. screen_id++) {
  847. mgr = g_disp_drv.mgr[screen_id];
  848. if (!mgr || !mgr->device)
  849. continue;
  850. dispdev = mgr->device;
  851. if (suspend_output_type[screen_id] !=
  852. DISP_OUTPUT_TYPE_NONE) {
  853. if (dispdev->is_enabled(dispdev))
  854. dispdev->disable(dispdev);
  855. }
  856. }
  857. }
  858. /*suspend for all display device */
  859. disp_list = disp_device_get_list_head();
  860. list_for_each_entry(dispdev_suspend, disp_list, list) {
  861. if (dispdev_suspend->suspend)
  862. dispdev_suspend->suspend(dispdev_suspend);
  863. }
  864. /* FIXME: hdmi suspend */
  865. suspend_status |= DISPLAY_DEEP_SLEEP;
  866. DE_INF("%s finish\n", __func__);
  867. return 0;
  868. }
  869. int disp_resume(void *para)
  870. {
  871. u32 screen_id = 0;
  872. int num_screens = bsp_disp_feat_get_num_screens();
  873. struct disp_manager *mgr = NULL;
  874. struct disp_device_config config;
  875. struct disp_device *dispdev = NULL;
  876. struct list_head *disp_list = NULL;
  877. memset(&config, 0, sizeof(struct disp_device_config));
  878. /* resume for all display device */
  879. disp_list = disp_device_get_list_head();
  880. list_for_each_entry(dispdev, disp_list, list) {
  881. if (dispdev->resume)
  882. dispdev->resume(dispdev);
  883. }
  884. for (screen_id = 0; screen_id < num_screens; screen_id++) {
  885. mgr = g_disp_drv.mgr[screen_id];
  886. if (!mgr || !mgr->device)
  887. continue;
  888. if (suspend_output_type[screen_id] != DISP_OUTPUT_TYPE_NONE) {
  889. if (mgr->device->set_static_config &&
  890. mgr->device->get_static_config) {
  891. mgr->device->get_static_config(mgr->device,
  892. &config);
  893. mgr->device->set_static_config(mgr->device,
  894. &config);
  895. }
  896. mgr->device->enable(mgr->device);
  897. }
  898. }
  899. suspend_status &= (~DISPLAY_DEEP_SLEEP);
  900. DE_INF("%s finish\n", __func__);
  901. return 0;
  902. }
  903. int disp_probe(void)
  904. {
  905. int i;
  906. rt_err_t ret;
  907. int counter = 0;
  908. pm = NULL;
  909. DE_INF("[DISP]disp_probe\n");
  910. memset(&g_disp_drv, 0, sizeof(struct disp_drv_info));
  911. /* iomap */
  912. /* de - [device(tcon-top)] - lcd0/1/2.. - dsi */
  913. counter = 0;
  914. g_disp_drv.reg_base[DISP_MOD_DE] = disp_getprop_regbase(FDT_DISP_PATH, counter);
  915. if (!g_disp_drv.reg_base[DISP_MOD_DE]) {
  916. DE_WRN("unable to map de registers\n");
  917. ret = -1;
  918. goto exit;
  919. }
  920. ++counter;
  921. #if defined(CONFIG_INDEPENDENT_DE)
  922. g_disp_drv.reg_base[DISP_MOD_DE1] = disp_getprop_regbase(FDT_DISP_PATH, counter);
  923. if (!g_disp_drv.reg_base[DISP_MOD_DE1]) {
  924. DE_WRN("unable to map de registers\n");
  925. ret = -1;
  926. goto exit;
  927. }
  928. ++counter;
  929. #endif
  930. #if defined(HAVE_DEVICE_COMMON_MODULE)
  931. g_disp_drv.reg_base[DISP_MOD_DEVICE] = disp_getprop_regbase(FDT_DISP_PATH, counter);
  932. if (!g_disp_drv.reg_base[DISP_MOD_DEVICE]) {
  933. DE_WRN("unable to map device common module registers\n");
  934. ret = -1;
  935. goto exit;
  936. }
  937. ++counter;
  938. #if defined(CONFIG_INDEPENDENT_DE)
  939. g_disp_drv.reg_base[DISP_MOD_DEVICE1] = disp_getprop_regbase(FDT_DISP_PATH, counter);
  940. if (!g_disp_drv.reg_base[DISP_MOD_DEVICE1]) {
  941. DE_WRN("unable to map device common module registers\n");
  942. ret = -1;
  943. goto exit;
  944. }
  945. ++counter;
  946. #endif
  947. #endif
  948. for (i=0; i<DISP_DEVICE_NUM; i++) {
  949. g_disp_drv.reg_base[DISP_MOD_LCD0 + i] = disp_getprop_regbase(FDT_DISP_PATH, counter);
  950. if (!g_disp_drv.reg_base[DISP_MOD_LCD0 + i]) {
  951. DE_WRN("unable to map timing controller %d registers\n", i);
  952. ret = -1;
  953. goto exit;
  954. }
  955. ++counter;
  956. }
  957. #if defined(SUPPORT_DSI)
  958. for (i = 0; i < DEVICE_DSI_NUM; ++i) {
  959. g_disp_drv.reg_base[DISP_MOD_DSI0 + i] =
  960. disp_getprop_regbase(FDT_DISP_PATH, counter);
  961. if (!g_disp_drv.reg_base[DISP_MOD_DSI0 + i]) {
  962. DE_WRN("unable to map dsi%d registers\n", i);
  963. ret = -1;
  964. goto exit;
  965. }
  966. ++counter;
  967. }
  968. #endif
  969. #if defined(SUPPORT_EINK)
  970. g_disp_drv.reg_base[DISP_MOD_EINK] = disp_getprop_regbase(FDT_DISP_PATH, counter);
  971. if (!g_disp_drv.reg_base[DISP_MOD_EINK]) {
  972. DE_WRN("unable to map eink registers\n");
  973. ret = -1;
  974. goto exit;
  975. }
  976. ++counter;
  977. #endif
  978. /* parse and map irq */
  979. /* lcd0/1/2.. - dsi */
  980. counter = 0;
  981. #ifdef DE_VERSION_V33X
  982. g_disp_drv.irq_no[DISP_MOD_DE] =
  983. disp_getprop_irq(FDT_DISP_PATH, counter);
  984. if (!g_disp_drv.irq_no[DISP_MOD_DE]) {
  985. DE_WRN("irq_of_parse_and_map de irq fail\n");
  986. }
  987. ++counter;
  988. #endif
  989. for (i=0; i<DISP_DEVICE_NUM; i++) {
  990. g_disp_drv.irq_no[DISP_MOD_LCD0 + i] = disp_getprop_irq(FDT_DISP_PATH, counter);
  991. if (!g_disp_drv.irq_no[DISP_MOD_LCD0 + i]) {
  992. DE_WRN("irq_of_parse_and_map irq %d fail for lcd%d\n", counter, i);
  993. }
  994. ++counter;
  995. }
  996. #if defined(SUPPORT_DSI)
  997. for (i = 0; i < DEVICE_DSI_NUM; ++i) {
  998. g_disp_drv.irq_no[DISP_MOD_DSI0 + i] =
  999. disp_getprop_irq(FDT_DISP_PATH, counter);
  1000. if (!g_disp_drv.irq_no[DISP_MOD_DSI0 + i])
  1001. DE_WRN("irq_of_parse_and_map irq %d fail for dsi\n", i);
  1002. ++counter;
  1003. }
  1004. #endif
  1005. #if defined(SUPPORT_EINK)
  1006. g_disp_drv.irq_no[DISP_MOD_DE] = disp_getprop_irq(FDT_DISP_PATH, counter);
  1007. if (!g_disp_drv.irq_no[DISP_MOD_DE]) {
  1008. DE_WRN("irq_of_parse_and_map de irq %d fail for dsi\n", counter);
  1009. }
  1010. ++counter;
  1011. g_disp_drv.irq_no[DISP_MOD_EINK] = disp_getprop_irq(FDT_DISP_PATH, counter);
  1012. if (!g_disp_drv.irq_no[DISP_MOD_EINK]) {
  1013. DE_WRN("irq_of_parse_and_map irq %d fail for eink\n", counter);
  1014. }
  1015. ++counter;
  1016. #endif
  1017. /* get clk */
  1018. ret = disp_clk_get_wrap(&g_disp_drv);
  1019. if (ret)
  1020. return ret;
  1021. ret = disp_init();
  1022. #ifdef CONFIG_STANDBY
  1023. pm = register_pm_dev_notify(disp_suspend, disp_resume, NULL);
  1024. #endif
  1025. exit:
  1026. return ret;
  1027. }
  1028. static int disp_blank(bool blank)
  1029. {
  1030. u32 screen_id = 0;
  1031. int num_screens;
  1032. struct disp_manager *mgr = NULL;
  1033. num_screens = bsp_disp_feat_get_num_screens();
  1034. for (screen_id = 0; screen_id < num_screens; screen_id++) {
  1035. mgr = g_disp_drv.mgr[screen_id];
  1036. /* Currently remove !mgr->device condition,
  1037. * avoiding problem in the following case:
  1038. *
  1039. * attach manager and device -> disp blank --> blank success
  1040. * deattach manager and device -> disp unblank --> fail
  1041. * (cause don't satisfy !mgr->device condition)
  1042. * attach manager and device --> problem arises
  1043. * (manager will be always on unblank state)
  1044. *
  1045. * The scenario is: hdmi plug in -> enter standy
  1046. * -> hdmi plug out -> exit standby -> hdmi plug in
  1047. * -> display blank on hdmi screen
  1048. */
  1049. if (!mgr)
  1050. continue;
  1051. if (mgr->blank)
  1052. mgr->blank(mgr, blank);
  1053. }
  1054. return 0;
  1055. }
  1056. ssize_t disp_sys_show(void)
  1057. {
  1058. struct disp_manager *mgr = NULL;
  1059. struct disp_device *dispdev = NULL;
  1060. int num_screens, screen_id;
  1061. int num_layers, layer_id;
  1062. int num_chans, chan_id;
  1063. num_screens = bsp_disp_feat_get_num_screens();
  1064. for (screen_id = 0; screen_id < num_screens; screen_id++) {
  1065. u32 width = 0, height = 0;
  1066. int fps = 0;
  1067. struct disp_health_info info;
  1068. mgr = disp_get_layer_manager(screen_id);
  1069. if (mgr == NULL)
  1070. continue;
  1071. dispdev = mgr->device;
  1072. if (dispdev == NULL)
  1073. continue;
  1074. dispdev->get_resolution(dispdev, &width, &height);
  1075. fps = bsp_disp_get_fps(screen_id);
  1076. bsp_disp_get_health_info(screen_id, &info);
  1077. if (!dispdev->is_enabled(dispdev))
  1078. continue;
  1079. DISP_PRINT("screen %d:\n", screen_id);
  1080. DISP_PRINT("de_rate %8ld hz, ref_fps:%8d\n", (long)mgr->get_clk_rate(mgr),
  1081. (int)dispdev->get_fps(dispdev));
  1082. mgr->dump(mgr);
  1083. /* output */
  1084. if (dispdev->type == DISP_OUTPUT_TYPE_LCD) {
  1085. DISP_PRINT("\tlcd output\tbacklight(%3d)\tfps:%d.%d",
  1086. (int)dispdev->get_bright(dispdev), fps / 10,
  1087. fps % 10);
  1088. } else if (dispdev->type == DISP_OUTPUT_TYPE_HDMI) {
  1089. int mode = dispdev->get_mode(dispdev);
  1090. DISP_PRINT("\thdmi output mode(%d)\tfps:%d.%d", mode,
  1091. fps / 10, fps % 10);
  1092. } else if (dispdev->type == DISP_OUTPUT_TYPE_TV) {
  1093. int mode = dispdev->get_mode(dispdev);
  1094. DISP_PRINT("\ttv output mode(%d)\tfps:%d.%d", mode,
  1095. fps / 10, fps % 10);
  1096. } else if (dispdev->type == DISP_OUTPUT_TYPE_VGA) {
  1097. int mode = dispdev->get_mode(dispdev);
  1098. DISP_PRINT("\tvga output mode(%d)\tfps:%d.%d", mode,
  1099. fps / 10, fps % 10);
  1100. } else if (dispdev->type == DISP_OUTPUT_TYPE_VDPO) {
  1101. int mode = dispdev->get_mode(dispdev);
  1102. DISP_PRINT("\tvdpo output mode(%d)\tfps:%d.%d", mode,
  1103. fps / 10, fps % 10);
  1104. } else if (dispdev->type == DISP_OUTPUT_TYPE_EDP) {
  1105. DISP_PRINT("\tEDP output(%s) \tfps:%d.%d",
  1106. (dispdev->is_enabled(dispdev) == 1) ? "enable"
  1107. : "disable",
  1108. fps / 10, fps % 10);
  1109. }
  1110. if (dispdev->type != DISP_OUTPUT_TYPE_NONE) {
  1111. DISP_PRINT("\t%4ux%4u\n", (unsigned)width, (unsigned)height);
  1112. DISP_PRINT("\terr:%u\tskip:%u\tirq:%llu\tvsync:%u\tvsync_"
  1113. "skip:%u\t\n",
  1114. info.error_cnt, info.skip_cnt, info.irq_cnt,
  1115. info.vsync_cnt, info.vsync_skip_cnt);
  1116. }
  1117. num_chans = bsp_disp_feat_get_num_channels(screen_id);
  1118. /* layer info */
  1119. for (chan_id = 0; chan_id < num_chans; chan_id++) {
  1120. num_layers = bsp_disp_feat_get_num_layers_by_chn(
  1121. screen_id, chan_id);
  1122. for (layer_id = 0; layer_id < num_layers; layer_id++) {
  1123. struct disp_layer *lyr = NULL;
  1124. struct disp_layer_config config;
  1125. lyr = disp_get_layer(screen_id, chan_id,
  1126. layer_id);
  1127. config.channel = chan_id;
  1128. config.layer_id = layer_id;
  1129. mgr->get_layer_config(mgr, &config, 1);
  1130. if (lyr && (true == config.enable) && lyr->dump)
  1131. lyr->dump(lyr);
  1132. }
  1133. }
  1134. }
  1135. return 0;
  1136. }
  1137. /**
  1138. * @name :disp_draw_colorbar
  1139. * @brief :draw colorbar using DE's LAYER MODE
  1140. * @param[IN] :disp:screen index
  1141. * @return :0 if success
  1142. */
  1143. static int disp_draw_colorbar(u32 disp)
  1144. {
  1145. struct disp_manager *mgr = NULL;
  1146. struct disp_layer_config config[4];
  1147. unsigned int i = 0;
  1148. u32 width = 0, height = 0, num_screens;
  1149. int ret = -1;
  1150. num_screens = bsp_disp_feat_get_num_screens();
  1151. if (disp < num_screens)
  1152. mgr = g_disp_drv.mgr[disp];
  1153. else
  1154. return ret;
  1155. if (mgr && mgr->device && mgr->device->get_resolution)
  1156. mgr->device->get_resolution(mgr->device, &width, &height);
  1157. else
  1158. return ret;
  1159. memset(config, 0, 4 * sizeof(struct disp_layer_config));
  1160. for (i = 0; i < 4; ++i) {
  1161. config[i].channel = 0;
  1162. config[i].layer_id = i;
  1163. config[i].enable = 1;
  1164. config[i].info.zorder = 16;
  1165. config[i].info.mode = LAYER_MODE_COLOR;
  1166. config[i].info.fb.format = DISP_FORMAT_ARGB_8888;
  1167. config[i].info.screen_win.width = width / 4;
  1168. config[i].info.screen_win.height = height;
  1169. config[i].info.screen_win.x = (width / 4) * i;
  1170. config[i].info.screen_win.y = 0;
  1171. config[i].info.fb.crop.x =
  1172. ((long long)(config[i].info.screen_win.x) << 32);
  1173. config[i].info.fb.crop.y =
  1174. ((long long)(config[i].info.screen_win.y) << 32);
  1175. config[i].info.fb.crop.width =
  1176. ((long long)(config[i].info.screen_win.width) << 32);
  1177. config[i].info.fb.crop.height =
  1178. ((long long)(config[i].info.screen_win.height) << 32);
  1179. }
  1180. config[0].info.color = 0xffff0000; /*red*/
  1181. config[1].info.color = 0xff00ff00; /*green*/
  1182. config[2].info.color = 0xff0000ff; /*blue*/
  1183. config[3].info.color = 0xffffff00; /*yellow*/
  1184. if (mgr->set_layer_config)
  1185. ret = mgr->set_layer_config(mgr, config, 4);
  1186. return ret;
  1187. }
  1188. ssize_t disp_colorbar_store(u32 disp, u32 val)
  1189. {
  1190. int err;
  1191. unsigned int num_screens;
  1192. struct disp_manager *mgr = NULL;
  1193. num_screens = bsp_disp_feat_get_num_screens();
  1194. if (disp < num_screens)
  1195. mgr = g_disp_drv.mgr[disp];
  1196. if (!mgr) {
  1197. DE_WRN("Null mgr!\n");
  1198. return -1;
  1199. }
  1200. /*val:*/
  1201. /*0:DE-->tcon-->other interface*/
  1202. /*1-7:tcon or edp or other device's builtin patten*/
  1203. /*for tcon:*/
  1204. /*1:color bar*/
  1205. /*2:grayscale check*/
  1206. /*3:black and white check*/
  1207. /*4:all 0*/
  1208. /*5:all 1*/
  1209. /*6:reserve*/
  1210. /*7:Gridding*/
  1211. /*for edp:*/
  1212. /*1:colorbar*/
  1213. /*2:mosaic*/
  1214. if (val == 8) {
  1215. disp_draw_colorbar(disp);
  1216. if (mgr && mgr->device && mgr->device->show_builtin_patten)
  1217. mgr->device->show_builtin_patten(mgr->device, 0);
  1218. } else {
  1219. if (mgr && mgr->device && mgr->device->show_builtin_patten)
  1220. mgr->device->show_builtin_patten(mgr->device, val);
  1221. }
  1222. return 0;
  1223. }
  1224. ssize_t disp_capture_dump(u32 disp, const char *image_name)
  1225. {
  1226. FILE *pfile;
  1227. void *buf_addr_vir = NULL;
  1228. unsigned long phy_addr = 0;
  1229. struct disp_capture_info cptr_info;
  1230. u32 size = 0, width = 0, height = 0, num_screens = 0;
  1231. struct disp_manager *mgr = NULL;
  1232. int ret = -1, cs = DISP_CSC_TYPE_RGB;
  1233. struct bmp_header bmp_header;
  1234. size_t write_size = 0;
  1235. num_screens = bsp_disp_feat_get_num_screens();
  1236. DE_WRN("Capturing screen%d to %s\n", disp, image_name);
  1237. if (disp < num_screens)
  1238. mgr = g_disp_drv.mgr[disp];
  1239. if (!mgr || !mgr->device || !mgr->cptr)
  1240. goto OUT;
  1241. memset(&cptr_info, 0, sizeof(struct disp_capture_info));
  1242. pfile = fopen(image_name, "w+");
  1243. if (!pfile) {
  1244. DE_WRN("%s, open %s err\n", __func__, image_name);
  1245. goto OUT;
  1246. }
  1247. if (mgr->device->get_resolution)
  1248. ret = mgr->device->get_resolution(mgr->device, &width, &height);
  1249. if (ret) {
  1250. DE_WRN("Get resolution fail!\n");
  1251. goto FILE_CLOSE;
  1252. }
  1253. cptr_info.out_frame.size[0].width = width;
  1254. cptr_info.out_frame.size[0].height = height;
  1255. cptr_info.window.width = width;
  1256. cptr_info.window.height = height;
  1257. cptr_info.out_frame.crop.width = width;
  1258. cptr_info.out_frame.crop.height = height;
  1259. if (strstr(image_name, ".bmp"))
  1260. cptr_info.out_frame.format = DISP_FORMAT_ARGB_8888;
  1261. else if (strstr(image_name, ".yuv420_p"))
  1262. cptr_info.out_frame.format = DISP_FORMAT_YUV420_P;
  1263. else if (strstr(image_name, ".yuv420_sp_uvuv"))
  1264. cptr_info.out_frame.format = DISP_FORMAT_YUV420_SP_UVUV;
  1265. else if (strstr(image_name, ".yuv420_sp_vuvu"))
  1266. cptr_info.out_frame.format = DISP_FORMAT_YUV420_SP_VUVU;
  1267. else if (strstr(image_name, ".argb8888"))
  1268. cptr_info.out_frame.format = DISP_FORMAT_ARGB_8888;
  1269. else if (strstr(image_name, ".abgr8888"))
  1270. cptr_info.out_frame.format = DISP_FORMAT_ABGR_8888;
  1271. else if (strstr(image_name, ".rgb888"))
  1272. cptr_info.out_frame.format = DISP_FORMAT_RGB_888;
  1273. else if (strstr(image_name, ".bgr888"))
  1274. cptr_info.out_frame.format = DISP_FORMAT_BGR_888;
  1275. else if (strstr(image_name, ".rgba8888"))
  1276. cptr_info.out_frame.format = DISP_FORMAT_RGBA_8888;
  1277. else if (strstr(image_name, ".bgra8888"))
  1278. cptr_info.out_frame.format = DISP_FORMAT_BGRA_8888;
  1279. else {
  1280. if (mgr->device->get_input_csc)
  1281. cs = mgr->device->get_input_csc(mgr->device);
  1282. if (cs == DISP_CSC_TYPE_RGB)
  1283. cptr_info.out_frame.format = DISP_FORMAT_ARGB_8888;
  1284. else
  1285. cptr_info.out_frame.format = DISP_FORMAT_YUV420_P;
  1286. }
  1287. size = width * height * 4;
  1288. buf_addr_vir = disp_dma_malloc(size, (void *)&phy_addr);
  1289. if (!phy_addr || !buf_addr_vir) {
  1290. DE_WRN("%s, disp_dma_malloc phy_addr err\n", __func__);
  1291. goto FILE_CLOSE;
  1292. }
  1293. cptr_info.out_frame.addr[0] = (unsigned long)phy_addr;
  1294. cptr_info.out_frame.addr[1] =
  1295. cptr_info.out_frame.addr[0] + width * height;
  1296. cptr_info.out_frame.addr[2] =
  1297. cptr_info.out_frame.addr[1] + width * height / 4;
  1298. ret = mgr->cptr->start(mgr->cptr);
  1299. if (ret) {
  1300. DE_WRN("Capture start fail!\n");
  1301. mgr->cptr->stop(mgr->cptr);
  1302. goto FREE_DMA;
  1303. }
  1304. ret = mgr->cptr->commmit(mgr->cptr, &cptr_info);
  1305. if (ret) {
  1306. DE_WRN("Capture commit fail!\n");
  1307. mgr->cptr->stop(mgr->cptr);
  1308. goto FREE_DMA;
  1309. }
  1310. disp_delay_ms(1000);
  1311. ret = mgr->cptr->stop(mgr->cptr);
  1312. if (ret) {
  1313. DE_WRN("Capture stop fail!\n");
  1314. goto FREE_DMA;
  1315. }
  1316. if (strstr(image_name, ".bmp")) {
  1317. memset(&bmp_header, 0, sizeof(struct bmp_header));
  1318. bmp_header.signature[0] = 'B';
  1319. bmp_header.signature[1] = 'M';
  1320. bmp_header.data_offset = sizeof(struct bmp_header);
  1321. bmp_header.file_size = bmp_header.data_offset + size;
  1322. bmp_header.size = sizeof(struct bmp_header) - 14;
  1323. bmp_header.width = width;
  1324. bmp_header.height = -height;
  1325. bmp_header.planes = 1;
  1326. bmp_header.bit_count = 32;
  1327. bmp_header.image_size = size;
  1328. write_size = fwrite(&bmp_header,
  1329. sizeof(struct bmp_header), 1, pfile);
  1330. if (write_size != 1) {
  1331. DE_WRN("fwrite fail!\n");
  1332. goto FREE_DMA;
  1333. }
  1334. }
  1335. write_size = fwrite(buf_addr_vir, size, 1, pfile);
  1336. if (write_size != 1) {
  1337. DE_WRN("fwrite fail!\n");
  1338. goto FREE_DMA;
  1339. }
  1340. DE_WRN("Capture dump done!!!\n");
  1341. FREE_DMA:
  1342. disp_dma_free((void *)buf_addr_vir, (void *)phy_addr, size);
  1343. FILE_CLOSE:
  1344. fclose(pfile);
  1345. OUT:
  1346. return 0;
  1347. }
  1348. int disp_ioctl(int cmd, void *arg)
  1349. {
  1350. unsigned long *ubuffer = arg;
  1351. s32 ret = 0;
  1352. int num_screens = 2;
  1353. struct disp_manager *mgr = NULL;
  1354. struct disp_device *dispdev = NULL;
  1355. struct disp_enhance *enhance = NULL;
  1356. struct disp_smbl *smbl = NULL;
  1357. struct disp_capture *cptr = NULL;
  1358. #if defined(SUPPORT_EINK)
  1359. struct disp_eink_manager *eink_manager = NULL;
  1360. #endif
  1361. char enhance_buf[20] = {0};
  1362. num_screens = bsp_disp_feat_get_num_screens();
  1363. if (ubuffer[0] < num_screens)
  1364. mgr = g_disp_drv.mgr[ubuffer[0]];
  1365. if (mgr) {
  1366. dispdev = mgr->device;
  1367. enhance = mgr->enhance;
  1368. smbl = mgr->smbl;
  1369. cptr = mgr->cptr;
  1370. }
  1371. #if defined(SUPPORT_EINK)
  1372. eink_manager = g_disp_drv.eink_manager[0];
  1373. if (!eink_manager)
  1374. DE_WRN("eink_manager is NULL!\n");
  1375. #endif
  1376. if (cmd < DISP_FB_REQUEST) {
  1377. if (ubuffer[0] >= num_screens) {
  1378. DE_WRN
  1379. ("para err, cmd = 0x%x,screen id = %d\n",
  1380. cmd, (int)ubuffer[0]);
  1381. return -1;
  1382. }
  1383. }
  1384. if (cmd == DISP_print)
  1385. DE_WRN("cmd:0x%x,%ld,%ld\n", cmd, ubuffer[0], ubuffer[1]);
  1386. switch (cmd) {
  1387. /* ----disp global---- */
  1388. case DISP_SET_BKCOLOR:
  1389. {
  1390. struct disp_color para;
  1391. memcpy(&para, (void *)ubuffer[1], sizeof(struct disp_color));
  1392. if (mgr && (mgr->set_back_color != NULL))
  1393. ret = mgr->set_back_color(mgr, &para);
  1394. break;
  1395. }
  1396. case DISP_GET_OUTPUT_TYPE:
  1397. {
  1398. if (suspend_status != DISPLAY_NORMAL)
  1399. ret = suspend_output_type[ubuffer[0]];
  1400. else
  1401. ret = bsp_disp_get_output_type(ubuffer[0]);
  1402. break;
  1403. }
  1404. case DISP_GET_SCN_WIDTH:
  1405. {
  1406. u32 width = 0, height = 0;
  1407. if (mgr && mgr->device && mgr->device->get_resolution)
  1408. mgr->device->get_resolution(mgr->device, &width,
  1409. &height);
  1410. ret = width;
  1411. break;
  1412. }
  1413. case DISP_GET_SCN_HEIGHT:
  1414. {
  1415. u32 width = 0, height = 0;
  1416. if (mgr && mgr->device && mgr->device->get_resolution)
  1417. mgr->device->get_resolution(mgr->device, &width,
  1418. &height);
  1419. ret = height;
  1420. break;
  1421. }
  1422. case DISP_VSYNC_EVENT_EN:
  1423. {
  1424. ret =
  1425. bsp_disp_vsync_event_enable(ubuffer[0], ubuffer[1]);
  1426. break;
  1427. }
  1428. case DISP_SHADOW_PROTECT:
  1429. {
  1430. ret = bsp_disp_shadow_protect(ubuffer[0], ubuffer[1]);
  1431. break;
  1432. }
  1433. case DISP_BLANK:
  1434. {
  1435. /* only response main device' blank request */
  1436. if (!g_pm_runtime_enable)
  1437. break;
  1438. if (ubuffer[0] != 0)
  1439. break;
  1440. if (ubuffer[1]) {
  1441. #ifdef CONFIG_ARCH_SUN50IW6
  1442. bsp_disp_hdmi_cec_standby_request();
  1443. #endif
  1444. suspend_status |= DISPLAY_BLANK;
  1445. disp_blank(true);
  1446. } else {
  1447. if (power_status_init) {
  1448. /* avoid first unblank */
  1449. power_status_init = 0;
  1450. break;
  1451. }
  1452. disp_blank(false);
  1453. suspend_status &= ~DISPLAY_BLANK;
  1454. }
  1455. break;
  1456. }
  1457. case DISP_DEVICE_SWITCH:
  1458. {
  1459. /* if the display device has already enter blank status,
  1460. * DISP_DEVICE_SWITCH request will not be responsed.
  1461. */
  1462. if (!(suspend_status & DISPLAY_BLANK))
  1463. ret =
  1464. bsp_disp_device_switch(ubuffer[0],
  1465. (enum disp_output_type)ubuffer[1],
  1466. (enum disp_output_type)ubuffer[2]);
  1467. suspend_output_type[ubuffer[0]] = ubuffer[1];
  1468. #if defined(SUPPORT_TV) && defined(CONFIG_ARCH_SUN50IW2P1)
  1469. bsp_disp_tv_set_hpd(1);
  1470. #endif
  1471. break;
  1472. }
  1473. case DISP_DEVICE_SET_CONFIG:
  1474. {
  1475. struct disp_device_config config;
  1476. memcpy(&config, (void *)ubuffer[1], sizeof(struct disp_device_config));
  1477. suspend_output_type[ubuffer[0]] = config.type;
  1478. ret = bsp_disp_device_set_config(ubuffer[0], &config);
  1479. break;
  1480. }
  1481. case DISP_DEVICE_GET_CONFIG:
  1482. {
  1483. struct disp_device_config config;
  1484. if (mgr && dispdev)
  1485. dispdev->get_static_config(dispdev, &config);
  1486. else
  1487. ret = -1;
  1488. if (ret == 0) {
  1489. memcpy((void *)ubuffer[1], &config,
  1490. sizeof(struct disp_device_config));
  1491. }
  1492. break;
  1493. }
  1494. #if defined(SUPPORT_EINK)
  1495. case DISP_EINK_UPDATE:
  1496. {
  1497. s32 i = 0;
  1498. struct area_info area;
  1499. if (!eink_manager) {
  1500. pr_err("there is no eink manager!\n");
  1501. break;
  1502. }
  1503. memset(lyr_cfg, 0,
  1504. 16 * sizeof(struct disp_layer_config));
  1505. memcpy(lyr_cfg, (void *)ubuffer[3],
  1506. sizeof(struct disp_layer_config) * ubuffer[1]);
  1507. memset(&area, 0, sizeof(struct area_info));
  1508. memcpy(&area, (void *)ubuffer[0],
  1509. sizeof(struct area_info));
  1510. for (i = 0; i < ubuffer[1]; i++)
  1511. __disp_config_transfer2inner(&eink_para[i],
  1512. &lyr_cfg[i]);
  1513. ret = bsp_disp_eink_update(eink_manager,
  1514. (struct disp_layer_config_inner *)&eink_para[0],
  1515. (unsigned int)ubuffer[1],
  1516. (enum eink_update_mode)ubuffer[2], &area);
  1517. break;
  1518. }
  1519. case DISP_EINK_UPDATE2:
  1520. {
  1521. s32 i = 0;
  1522. struct area_info area;
  1523. if (!eink_manager) {
  1524. pr_err("there is no eink manager!\n");
  1525. break;
  1526. }
  1527. memset(lyr_cfg2, 0,
  1528. 16 * sizeof(struct disp_layer_config2));
  1529. memcpy(lyr_cfg2, (void *)ubuffer[3],
  1530. sizeof(struct disp_layer_config2) * ubuffer[1]);
  1531. memset(&area, 0, sizeof(struct area_info));
  1532. memcpy(&area, (void *)ubuffer[1],
  1533. sizeof(struct area_info));
  1534. for (i = 0; i < ubuffer[1]; i++)
  1535. __disp_config2_transfer2inner(&eink_para[i],
  1536. &lyr_cfg2[i]);
  1537. ret = bsp_disp_eink_update(eink_manager,
  1538. (struct disp_layer_config_inner *)&eink_para[0],
  1539. (unsigned int)ubuffer[1],
  1540. (enum eink_update_mode)ubuffer[2], &area);
  1541. break;
  1542. }
  1543. case DISP_EINK_SET_TEMP:
  1544. {
  1545. ret =
  1546. bsp_disp_eink_set_temperature(eink_manager,
  1547. ubuffer[0]);
  1548. break;
  1549. }
  1550. case DISP_EINK_GET_TEMP:
  1551. {
  1552. ret = bsp_disp_eink_get_temperature(eink_manager);
  1553. break;
  1554. }
  1555. case DISP_EINK_OVERLAP_SKIP:
  1556. {
  1557. ret = bsp_disp_eink_op_skip(eink_manager, ubuffer[0]);
  1558. break;
  1559. }
  1560. #endif
  1561. case DISP_GET_OUTPUT:
  1562. {
  1563. struct disp_output para;
  1564. memset(&para, 0, sizeof(struct disp_output));
  1565. if (mgr && mgr->device) {
  1566. para.type =
  1567. bsp_disp_get_output_type(ubuffer[0]);
  1568. if (mgr->device->get_mode)
  1569. para.mode =
  1570. mgr->device->get_mode(mgr->device);
  1571. }
  1572. memcpy((void *)ubuffer[1], &para, sizeof(struct disp_output));
  1573. break;
  1574. }
  1575. case DISP_SET_COLOR_RANGE:
  1576. {
  1577. if (mgr && mgr->set_output_color_range)
  1578. ret =
  1579. mgr->set_output_color_range(mgr,
  1580. ubuffer[1]);
  1581. break;
  1582. }
  1583. case DISP_GET_COLOR_RANGE:
  1584. {
  1585. if (mgr && mgr->get_output_color_range)
  1586. ret = mgr->get_output_color_range(mgr);
  1587. break;
  1588. }
  1589. /* ----layer---- */
  1590. case DISP_LAYER_SET_CONFIG:
  1591. {
  1592. unsigned int i = 0;
  1593. const unsigned int lyr_cfg_size = ARRAY_SIZE(lyr_cfg);
  1594. disp_sys_mutex_lock(&g_disp_drv.mlock);
  1595. if (ubuffer[2] > lyr_cfg_size) {
  1596. DE_WRN("Total layer number is %d\n", lyr_cfg_size);
  1597. disp_sys_mutex_unlock(&g_disp_drv.mlock);
  1598. return -1;
  1599. }
  1600. memcpy(lyr_cfg, (void *)ubuffer[1],
  1601. sizeof(struct disp_layer_config) * ubuffer[2]);
  1602. for (i = 0; (i < lyr_cfg_size) && (i < ubuffer[2]); ++i) {
  1603. if (lyr_cfg[i].enable == 0) {
  1604. memset(&(lyr_cfg[i].info), 0,
  1605. sizeof(lyr_cfg[i].info));
  1606. }
  1607. }
  1608. #if !defined(CONFIG_EINK_PANEL_USED)
  1609. if (mgr && mgr->set_layer_config)
  1610. ret = mgr->set_layer_config(mgr, lyr_cfg, ubuffer[2]);
  1611. #endif
  1612. disp_sys_mutex_unlock(&g_disp_drv.mlock);
  1613. break;
  1614. }
  1615. case DISP_LAYER_GET_CONFIG:
  1616. {
  1617. memcpy(lyr_cfg, (void *)ubuffer[1],
  1618. sizeof(struct disp_layer_config) * ubuffer[2]);
  1619. if (mgr && mgr->get_layer_config)
  1620. ret = mgr->get_layer_config(mgr, lyr_cfg, ubuffer[2]);
  1621. memcpy((void *)ubuffer[1], lyr_cfg,
  1622. sizeof(struct disp_layer_config) * ubuffer[2]);
  1623. break;
  1624. }
  1625. case DISP_LAYER_SET_CONFIG2:
  1626. {
  1627. struct disp_layer_config2 *pLyr_cfg2;
  1628. unsigned int i = 0;
  1629. const unsigned int lyr_cfg_size =
  1630. ARRAY_SIZE(lyr_cfg2);
  1631. /* adapt to multi thread call in case of disp 0 & 1 work together*/
  1632. if (ubuffer[0] == 0)
  1633. pLyr_cfg2 = lyr_cfg2;
  1634. else
  1635. pLyr_cfg2 = lyr_cfg2_1;
  1636. memcpy(pLyr_cfg2, (void *)ubuffer[1],
  1637. sizeof(struct disp_layer_config2) * ubuffer[2]);
  1638. for (i = 0; (i < lyr_cfg_size) && (i < ubuffer[2]); ++i) {
  1639. if (pLyr_cfg2[i].enable == 0) {
  1640. memset(&(pLyr_cfg2[i].info), 0,
  1641. sizeof(pLyr_cfg2[i].info));
  1642. }
  1643. }
  1644. #if !defined(CONFIG_EINK_PANEL_USED)
  1645. if (mgr && mgr->set_layer_config2)
  1646. ret = mgr->set_layer_config2(mgr, pLyr_cfg2, ubuffer[2]);
  1647. #endif
  1648. break;
  1649. }
  1650. case DISP_LAYER_GET_CONFIG2:
  1651. {
  1652. memcpy(lyr_cfg2, (void *)ubuffer[1],
  1653. sizeof(struct disp_layer_config2) * ubuffer[2]);
  1654. if (mgr && mgr->get_layer_config2)
  1655. ret = mgr->get_layer_config2(mgr, lyr_cfg2, ubuffer[2]);
  1656. memcpy((void *)ubuffer[1], lyr_cfg2,
  1657. sizeof(struct disp_layer_config2) * ubuffer[2]);
  1658. break;
  1659. }
  1660. /* ---- lcd --- */
  1661. case DISP_LCD_SET_BRIGHTNESS:
  1662. {
  1663. if (dispdev && dispdev->set_bright)
  1664. ret = dispdev->set_bright(dispdev, ubuffer[1]);
  1665. break;
  1666. }
  1667. case DISP_LCD_GET_BRIGHTNESS:
  1668. {
  1669. if (dispdev && dispdev->get_bright)
  1670. ret = dispdev->get_bright(dispdev);
  1671. break;
  1672. }
  1673. case DISP_TV_SET_GAMMA_TABLE:
  1674. {
  1675. if (dispdev && (DISP_OUTPUT_TYPE_TV == dispdev->type)) {
  1676. u32 *gamma_tbl = disp_sys_malloc(LCD_GAMMA_TABLE_SIZE);
  1677. u32 size = ubuffer[2];
  1678. if (gamma_tbl == NULL) {
  1679. DE_WRN("kmalloc fail\n");
  1680. ret = -1;
  1681. break;
  1682. }
  1683. size = (size > LCD_GAMMA_TABLE_SIZE) ?
  1684. LCD_GAMMA_TABLE_SIZE : size;
  1685. memcpy(gamma_tbl, (void *)ubuffer[1], size);
  1686. if (dispdev->set_gamma_tbl)
  1687. ret = dispdev->set_gamma_tbl(dispdev, gamma_tbl,
  1688. size);
  1689. disp_sys_free(gamma_tbl);
  1690. }
  1691. break;
  1692. }
  1693. case DISP_LCD_GAMMA_CORRECTION_ENABLE:
  1694. {
  1695. if (dispdev &&
  1696. (dispdev->type == DISP_OUTPUT_TYPE_LCD)) {
  1697. ret = dispdev->enable_gamma(dispdev);
  1698. }
  1699. break;
  1700. }
  1701. case DISP_LCD_GAMMA_CORRECTION_DISABLE:
  1702. {
  1703. if (dispdev && (dispdev->type == DISP_OUTPUT_TYPE_LCD))
  1704. ret = dispdev->disable_gamma(dispdev);
  1705. break;
  1706. }
  1707. case DISP_LCD_SET_GAMMA_TABLE:
  1708. {
  1709. if (dispdev && (dispdev->type == DISP_OUTPUT_TYPE_LCD)) {
  1710. u32 *gamma_tbl = disp_sys_malloc(LCD_GAMMA_TABLE_SIZE);
  1711. u32 size = ubuffer[2];
  1712. if (gamma_tbl == NULL) {
  1713. DE_WRN("kmalloc fail\n");
  1714. ret = -1;
  1715. break;
  1716. }
  1717. size = (size > LCD_GAMMA_TABLE_SIZE) ?
  1718. LCD_GAMMA_TABLE_SIZE : size;
  1719. memcpy(gamma_tbl, (void *)ubuffer[1], size);
  1720. ret = dispdev->set_gamma_tbl(dispdev, gamma_tbl, size);
  1721. disp_sys_free(gamma_tbl);
  1722. }
  1723. break;
  1724. }
  1725. /* ---- hdmi --- */
  1726. case DISP_HDMI_SUPPORT_MODE:
  1727. {
  1728. ret =
  1729. bsp_disp_hdmi_check_support_mode(ubuffer[0],
  1730. ubuffer[1]);
  1731. break;
  1732. }
  1733. case DISP_SET_TV_HPD:
  1734. {
  1735. ret = bsp_disp_tv_set_hpd(ubuffer[0]);
  1736. break;
  1737. }
  1738. #ifdef CONFIG_ARCH_SUN50IW6
  1739. case DISP_CEC_ONE_TOUCH_PLAY:
  1740. {
  1741. ret = bsp_disp_hdmi_cec_send_one_touch_play();
  1742. break;
  1743. }
  1744. #endif
  1745. /* ----enhance---- */
  1746. case DISP_ENHANCE_ENABLE:
  1747. {
  1748. if (enhance && enhance->enable)
  1749. ret = enhance->enable(enhance);
  1750. break;
  1751. }
  1752. case DISP_ENHANCE_DISABLE:
  1753. {
  1754. if (enhance && enhance->disable)
  1755. ret = enhance->disable(enhance);
  1756. break;
  1757. }
  1758. case DISP_ENHANCE_DEMO_ENABLE:
  1759. {
  1760. if (enhance && enhance->demo_enable)
  1761. ret = enhance->demo_enable(enhance);
  1762. break;
  1763. }
  1764. case DISP_ENHANCE_DEMO_DISABLE:
  1765. {
  1766. if (enhance && enhance->demo_disable)
  1767. ret = enhance->demo_disable(enhance);
  1768. break;
  1769. }
  1770. case DISP_ENHANCE_SET_MODE:
  1771. {
  1772. if (enhance && enhance->set_mode)
  1773. ret = enhance->set_mode(enhance, ubuffer[1]);
  1774. break;
  1775. }
  1776. case DISP_ENHANCE_GET_MODE:
  1777. {
  1778. if (enhance && enhance->get_mode)
  1779. ret = enhance->get_mode(enhance);
  1780. break;
  1781. }
  1782. case DISP_ENHANCE_SET_BRIGHT:
  1783. {
  1784. ret = disp_enhance_bright_store(ubuffer[0], ubuffer[1]);
  1785. break;
  1786. }
  1787. case DISP_ENHANCE_GET_BRIGHT:
  1788. {
  1789. ret = disp_enhance_bright_show(ubuffer[0], enhance_buf);
  1790. break;
  1791. }
  1792. case DISP_ENHANCE_SET_CONTRAST:
  1793. {
  1794. ret = disp_enhance_contrast_store(ubuffer[0], ubuffer[1]);
  1795. break;
  1796. }
  1797. case DISP_ENHANCE_GET_CONTRAST:
  1798. {
  1799. ret = disp_enhance_contrast_show(ubuffer[0], enhance_buf);
  1800. break;
  1801. }
  1802. case DISP_ENHANCE_SET_SATURATION:
  1803. {
  1804. ret = disp_enhance_saturation_store(ubuffer[0], ubuffer[1]);
  1805. break;
  1806. }
  1807. case DISP_ENHANCE_GET_SATURATION:
  1808. {
  1809. ret = disp_enhance_saturation_show(ubuffer[0], enhance_buf);
  1810. break;
  1811. }
  1812. /* ---smart backlight -- */
  1813. case DISP_SMBL_ENABLE:
  1814. {
  1815. if (smbl && smbl->enable)
  1816. ret = smbl->enable(smbl);
  1817. break;
  1818. }
  1819. case DISP_SMBL_DISABLE:
  1820. {
  1821. if (smbl && smbl->disable)
  1822. ret = smbl->disable(smbl);
  1823. break;
  1824. }
  1825. case DISP_SMBL_SET_WINDOW:
  1826. {
  1827. struct disp_rect rect;
  1828. memcpy(&rect, (void *)ubuffer[1], sizeof(struct disp_rect));
  1829. if (smbl && smbl->set_window)
  1830. ret = smbl->set_window(smbl, &rect);
  1831. break;
  1832. }
  1833. /* ---capture -- */
  1834. case DISP_CAPTURE_START:
  1835. {
  1836. if (cptr && cptr->start)
  1837. ret = cptr->start(cptr);
  1838. break;
  1839. }
  1840. case DISP_CAPTURE_STOP:
  1841. {
  1842. if (cptr && cptr->stop)
  1843. ret = cptr->stop(cptr);
  1844. break;
  1845. }
  1846. case DISP_CAPTURE_COMMIT:
  1847. {
  1848. struct disp_capture_info info;
  1849. memcpy(&info, (void *)ubuffer[1],
  1850. sizeof(struct disp_capture_info));
  1851. if (cptr && cptr->commmit)
  1852. ret = cptr->commmit(cptr, &info);
  1853. break;
  1854. }
  1855. /* ----for test---- */
  1856. #if defined(SUPPORT_VDPO)
  1857. case DISP_VDPO_SET_CONFIG:
  1858. {
  1859. struct disp_vdpo_config vdpo_para;
  1860. memcpy(&vdpo_para, (void *)ubuffer[1],
  1861. sizeof(struct disp_vdpo_config) * ubuffer[2]);
  1862. if (mgr && mgr->device)
  1863. disp_vdpo_set_config(mgr->device, &vdpo_para);
  1864. break;
  1865. }
  1866. #endif /*endif SUPPORT_VDPO*/
  1867. #if defined(CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT)
  1868. case DISP_ROTATION_SW_SET_ROT:
  1869. {
  1870. int num_screens = bsp_disp_feat_get_num_screens();
  1871. u32 degree, chn, lyr_id;
  1872. disp_sys_mutex_lock(&g_disp_drv.mlock);
  1873. if (mgr == NULL) {
  1874. DE_WRN("mgr is null\n");
  1875. }
  1876. if (mgr->rot_sw == NULL) {
  1877. DE_WRN("mgr->rot_sw is null\n");
  1878. }
  1879. if (!mgr || !mgr->rot_sw || num_screens <= ubuffer[0]) {
  1880. ret = -1;
  1881. disp_sys_mutex_unlock(&g_disp_drv.mlock);
  1882. break;
  1883. }
  1884. degree = ubuffer[3];
  1885. switch (degree) {
  1886. case ROTATION_SW_0:
  1887. case ROTATION_SW_90:
  1888. case ROTATION_SW_180:
  1889. case ROTATION_SW_270:
  1890. chn = ubuffer[1];
  1891. lyr_id = ubuffer[2];
  1892. ret = mgr->rot_sw->set_layer_degree(mgr->rot_sw, chn, lyr_id, degree);
  1893. break;
  1894. default:
  1895. ret = -1;
  1896. }
  1897. disp_sys_mutex_unlock(&g_disp_drv.mlock);
  1898. break;
  1899. }
  1900. case DISP_ROTATION_SW_GET_ROT:
  1901. {
  1902. int num_screens = bsp_disp_feat_get_num_screens();
  1903. u32 chn, lyr_id;
  1904. disp_sys_mutex_lock(&g_disp_drv.mlock);
  1905. if (mgr && mgr->rot_sw && num_screens > ubuffer[0]) {
  1906. chn = ubuffer[1];
  1907. lyr_id = ubuffer[2];
  1908. ret = mgr->rot_sw->get_layer_degree(mgr->rot_sw, chn, lyr_id);
  1909. } else {
  1910. ret = -1;
  1911. }
  1912. disp_sys_mutex_unlock(&g_disp_drv.mlock);
  1913. break;
  1914. }
  1915. #endif
  1916. case DISP_LCD_CHECK_OPEN_FINISH:
  1917. {
  1918. if (mgr && mgr->device) {
  1919. if (mgr->device->is_enabled)
  1920. return mgr->device->is_enabled(mgr->device);
  1921. else
  1922. return -1;
  1923. } else
  1924. return -1;
  1925. }
  1926. case DISP_LCD_BACKLIGHT_ENABLE:
  1927. {
  1928. if (mgr && mgr->device) {
  1929. if (mgr->device->pwm_enable)
  1930. mgr->device->pwm_enable(mgr->device);
  1931. if (mgr->device->backlight_enable)
  1932. mgr->device->backlight_enable(mgr->device);
  1933. return 0;
  1934. }
  1935. return -1;
  1936. break;
  1937. }
  1938. case DISP_LCD_BACKLIGHT_DISABLE:
  1939. {
  1940. if (mgr && mgr->device) {
  1941. if (mgr->device->pwm_disable)
  1942. mgr->device->pwm_disable(mgr->device);
  1943. if (mgr->device->backlight_disable)
  1944. mgr->device->backlight_disable(mgr->device);
  1945. return 0;
  1946. }
  1947. return -1;
  1948. break;
  1949. }
  1950. default:
  1951. DE_WRN("Unknown cmd 0x%x\n", cmd);
  1952. break;
  1953. }
  1954. return ret;
  1955. }
  1956. int disp_release(void)
  1957. {
  1958. #if 0
  1959. int num_screens = 0, i = 0, j = 0;
  1960. struct disp_manager *mgr = NULL;
  1961. memset(lyr_cfg, 0, 16*sizeof(struct disp_layer_config));
  1962. for (i = 0; i < 4; ++i) {
  1963. for (j = 0; j < 4; ++j) {
  1964. lyr_cfg[i + j].enable = false;
  1965. lyr_cfg[i + j].channel = i;
  1966. lyr_cfg[i + j].layer_id = j;
  1967. }
  1968. }
  1969. num_screens = bsp_disp_feat_get_num_screens();
  1970. for (i = 0; i < num_screens; ++i) {
  1971. mgr = g_disp_drv.mgr[i];
  1972. if (mgr && mgr->device) {
  1973. if (mgr->device->disable && mgr->device->is_enabled) {
  1974. if (mgr->device->is_enabled(mgr->device)) {
  1975. mgr->set_layer_config(mgr, lyr_cfg, 16);
  1976. disp_delay_ms(20);
  1977. mgr->device->disable(mgr->device);
  1978. }
  1979. }
  1980. }
  1981. }
  1982. #endif
  1983. return 0;
  1984. }
  1985. int disp_open(void)
  1986. {
  1987. return 0;
  1988. }