mdp_debugfs.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482
  1. /* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #include <linux/module.h>
  14. #include <linux/kernel.h>
  15. #include <linux/sched.h>
  16. #include <linux/time.h>
  17. #include <linux/init.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/hrtimer.h>
  21. #include <linux/clk.h>
  22. #include <linux/io.h>
  23. #include <linux/debugfs.h>
  24. #include <linux/semaphore.h>
  25. #include <linux/uaccess.h>
  26. #include <asm/system.h>
  27. #include <asm/mach-types.h>
  28. #include <mach/hardware.h>
  29. #include "mdp.h"
  30. #include "msm_fb.h"
  31. #ifdef CONFIG_FB_MSM_MDP40
  32. #include "mdp4.h"
  33. #endif
  34. #include "mddihosti.h"
  35. #include "tvenc.h"
  36. #ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL
  37. #include "hdmi_msm.h"
  38. #endif
  39. #define MDP_DEBUG_BUF 2048
  40. static uint32 mdp_offset;
  41. static uint32 mdp_count;
  42. static char debug_buf[MDP_DEBUG_BUF];
  43. /*
  44. * MDP4
  45. *
  46. */
  47. static int mdp_offset_open(struct inode *inode, struct file *file)
  48. {
  49. /* non-seekable */
  50. file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  51. return 0;
  52. }
  53. static int mdp_offset_release(struct inode *inode, struct file *file)
  54. {
  55. return 0;
  56. }
  57. static ssize_t mdp_offset_write(
  58. struct file *file,
  59. const char __user *buff,
  60. size_t count,
  61. loff_t *ppos)
  62. {
  63. uint32 off, cnt;
  64. if (count >= sizeof(debug_buf))
  65. return -EFAULT;
  66. if (copy_from_user(debug_buf, buff, count))
  67. return -EFAULT;
  68. debug_buf[count] = 0; /* end of string */
  69. sscanf(debug_buf, "%x %d", &off, &cnt);
  70. if (cnt <= 0)
  71. cnt = 1;
  72. mdp_offset = off;
  73. mdp_count = cnt;
  74. printk(KERN_INFO "%s: offset=%x cnt=%d\n", __func__,
  75. mdp_offset, mdp_count);
  76. return count;
  77. }
  78. static ssize_t mdp_offset_read(
  79. struct file *file,
  80. char __user *buff,
  81. size_t count,
  82. loff_t *ppos)
  83. {
  84. int len = 0;
  85. if (*ppos)
  86. return 0; /* the end */
  87. len = snprintf(debug_buf, sizeof(debug_buf), "0x%08x %d\n",
  88. mdp_offset, mdp_count);
  89. if (len < 0)
  90. return 0;
  91. if (copy_to_user(buff, debug_buf, len))
  92. return -EFAULT;
  93. *ppos += len; /* increase offset */
  94. return len;
  95. }
  96. static const struct file_operations mdp_off_fops = {
  97. .open = mdp_offset_open,
  98. .release = mdp_offset_release,
  99. .read = mdp_offset_read,
  100. .write = mdp_offset_write,
  101. };
  102. static int mdp_reg_open(struct inode *inode, struct file *file)
  103. {
  104. /* non-seekable */
  105. file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  106. return 0;
  107. }
  108. static int mdp_reg_release(struct inode *inode, struct file *file)
  109. {
  110. return 0;
  111. }
  112. static ssize_t mdp_reg_write(
  113. struct file *file,
  114. const char __user *buff,
  115. size_t count,
  116. loff_t *ppos)
  117. {
  118. uint32 off, data;
  119. int cnt;
  120. if (count >= sizeof(debug_buf))
  121. return -EFAULT;
  122. if (copy_from_user(debug_buf, buff, count))
  123. return -EFAULT;
  124. debug_buf[count] = 0; /* end of string */
  125. cnt = sscanf(debug_buf, "%x %x", &off, &data);
  126. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
  127. outpdw(MDP_BASE + off, data);
  128. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  129. printk(KERN_INFO "%s: addr=%x data=%x\n", __func__, off, data);
  130. return count;
  131. }
  132. static ssize_t mdp_reg_read(
  133. struct file *file,
  134. char __user *buff,
  135. size_t count,
  136. loff_t *ppos)
  137. {
  138. int len = 0;
  139. uint32 data;
  140. int i, j, off, dlen, num;
  141. char *bp, *cp;
  142. int tot = 0;
  143. if (*ppos)
  144. return 0; /* the end */
  145. j = 0;
  146. num = 0;
  147. bp = debug_buf;
  148. cp = MDP_BASE + mdp_offset;
  149. dlen = sizeof(debug_buf);
  150. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
  151. while (j++ < 8) {
  152. len = snprintf(bp, dlen, "0x%08x: ", (int)cp);
  153. tot += len;
  154. bp += len;
  155. dlen -= len;
  156. off = 0;
  157. i = 0;
  158. while (i++ < 4) {
  159. data = inpdw(cp + off);
  160. len = snprintf(bp, dlen, "%08x ", data);
  161. tot += len;
  162. bp += len;
  163. dlen -= len;
  164. off += 4;
  165. num++;
  166. if (num >= mdp_count)
  167. break;
  168. }
  169. *bp++ = '\n';
  170. --dlen;
  171. tot++;
  172. cp += off;
  173. if (num >= mdp_count)
  174. break;
  175. }
  176. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  177. *bp = 0;
  178. tot++;
  179. if (copy_to_user(buff, debug_buf, tot))
  180. return -EFAULT;
  181. *ppos += tot; /* increase offset */
  182. return tot;
  183. }
  184. static const struct file_operations mdp_reg_fops = {
  185. .open = mdp_reg_open,
  186. .release = mdp_reg_release,
  187. .read = mdp_reg_read,
  188. .write = mdp_reg_write,
  189. };
  190. #ifdef CONFIG_FB_MSM_MDP40
  191. static int mdp_stat_open(struct inode *inode, struct file *file)
  192. {
  193. /* non-seekable */
  194. file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  195. return 0;
  196. }
  197. static int mdp_stat_release(struct inode *inode, struct file *file)
  198. {
  199. return 0;
  200. }
  201. static ssize_t mdp_stat_write(
  202. struct file *file,
  203. const char __user *buff,
  204. size_t count,
  205. loff_t *ppos)
  206. {
  207. unsigned long flag;
  208. if (count > sizeof(debug_buf))
  209. return -EFAULT;
  210. spin_lock_irqsave(&mdp_spin_lock, flag);
  211. memset((char *)&mdp4_stat, 0 , sizeof(mdp4_stat)); /* reset */
  212. spin_unlock_irqrestore(&mdp_spin_lock, flag);
  213. return count;
  214. }
  215. static ssize_t mdp_stat_read(
  216. struct file *file,
  217. char __user *buff,
  218. size_t count,
  219. loff_t *ppos)
  220. {
  221. int len = 0;
  222. int tot = 0;
  223. int dlen;
  224. char *bp;
  225. if (*ppos)
  226. return 0; /* the end */
  227. bp = debug_buf;
  228. dlen = sizeof(debug_buf);
  229. len = snprintf(bp, dlen, "\nmdp:\n");
  230. bp += len;
  231. dlen -= len;
  232. len = snprintf(bp, dlen, "int_total: %08lu\t",
  233. mdp4_stat.intr_tot);
  234. bp += len;
  235. dlen -= len;
  236. len = snprintf(bp, dlen, "int_overlay0: %08lu\t",
  237. mdp4_stat.intr_overlay0);
  238. bp += len;
  239. dlen -= len;
  240. len = snprintf(bp, dlen, "int_overlay1: %08lu\n",
  241. mdp4_stat.intr_overlay1);
  242. bp += len;
  243. dlen -= len;
  244. len = snprintf(bp, dlen, "int_overlay1: %08lu\n",
  245. mdp4_stat.intr_overlay2);
  246. bp += len;
  247. dlen -= len;
  248. len = snprintf(bp, dlen, "int_dmap: %08lu\t",
  249. mdp4_stat.intr_dma_p);
  250. bp += len;
  251. dlen -= len;
  252. len = snprintf(bp, dlen, "int_dmas: %08lu\t",
  253. mdp4_stat.intr_dma_s);
  254. bp += len;
  255. dlen -= len;
  256. len = snprintf(bp, dlen, "int_dmae: %08lu\n",
  257. mdp4_stat.intr_dma_e);
  258. bp += len;
  259. dlen -= len;
  260. len = snprintf(bp, dlen, "primary: vsync: %08lu\t",
  261. mdp4_stat.intr_vsync_p);
  262. bp += len;
  263. dlen -= len;
  264. len = snprintf(bp, dlen, "underrun: %08lu\n",
  265. mdp4_stat.intr_underrun_p);
  266. bp += len;
  267. dlen -= len;
  268. len = snprintf(bp, dlen, "external: vsync: %08lu\t",
  269. mdp4_stat.intr_vsync_e);
  270. bp += len;
  271. dlen -= len;
  272. len = snprintf(bp, dlen, "underrun: %08lu\n",
  273. mdp4_stat.intr_underrun_e);
  274. bp += len;
  275. dlen -= len;
  276. len = snprintf(bp, dlen, "histogram: %08lu\t",
  277. mdp4_stat.intr_histogram);
  278. bp += len;
  279. dlen -= len;
  280. len = snprintf(bp, dlen, "read_ptr: %08lu\n\n",
  281. mdp4_stat.intr_rdptr);
  282. bp += len;
  283. dlen -= len;
  284. len = snprintf(bp, dlen, "dsi:\n");
  285. bp += len;
  286. dlen -= len;
  287. len = snprintf(bp, dlen, "int_total: %08lu\tmdp_start: %08lu\n",
  288. mdp4_stat.intr_dsi, mdp4_stat.dsi_mdp_start);
  289. bp += len;
  290. dlen -= len;
  291. len = snprintf(bp, dlen, "int_cmd: %08lu\t",
  292. mdp4_stat.intr_dsi_cmd);
  293. bp += len;
  294. dlen -= len;
  295. len = snprintf(bp, dlen, "int_mdp: %08lu\t",
  296. mdp4_stat.intr_dsi_mdp);
  297. bp += len;
  298. dlen -= len;
  299. len = snprintf(bp, dlen, "int_err: %08lu\n",
  300. mdp4_stat.intr_dsi_err);
  301. bp += len;
  302. dlen -= len;
  303. len = snprintf(bp, dlen, "clk_on : %08lu\t",
  304. mdp4_stat.dsi_clk_on);
  305. bp += len;
  306. dlen -= len;
  307. len = snprintf(bp, dlen, "clk_off: %08lu\n\n",
  308. mdp4_stat.dsi_clk_off);
  309. bp += len;
  310. dlen -= len;
  311. len = snprintf(bp, dlen, "kickoff:\n");
  312. bp += len;
  313. dlen -= len;
  314. len = snprintf(bp, dlen, "overlay0: %08lu\t",
  315. mdp4_stat.kickoff_ov0);
  316. bp += len;
  317. dlen -= len;
  318. len = snprintf(bp, dlen, "dmap: %08lu\t",
  319. mdp4_stat.kickoff_dmap);
  320. bp += len;
  321. dlen -= len;
  322. len = snprintf(bp, dlen, "dmas: %08lu\n",
  323. mdp4_stat.kickoff_dmas);
  324. bp += len;
  325. dlen -= len;
  326. len = snprintf(bp, dlen, "overlay1: %08lu\t",
  327. mdp4_stat.kickoff_ov1);
  328. bp += len;
  329. dlen -= len;
  330. len = snprintf(bp, dlen, "dmae: %08lu\n\n",
  331. mdp4_stat.kickoff_dmae);
  332. bp += len;
  333. dlen -= len;
  334. len = snprintf(bp, dlen, "overlay0_play:\n");
  335. bp += len;
  336. dlen -= len;
  337. len = snprintf(bp, dlen, "set: %08lu\t",
  338. mdp4_stat.overlay_set[0]);
  339. bp += len;
  340. dlen -= len;
  341. len = snprintf(bp, dlen, "unset: %08lu\t",
  342. mdp4_stat.overlay_unset[0]);
  343. bp += len;
  344. dlen -= len;
  345. len = snprintf(bp, dlen, "play: %08lu\t",
  346. mdp4_stat.overlay_play[0]);
  347. bp += len;
  348. dlen -= len;
  349. len = snprintf(bp, dlen, "commit: %08lu\n",
  350. mdp4_stat.overlay_commit[0]);
  351. bp += len;
  352. dlen -= len;
  353. len = snprintf(bp, dlen, "overlay1_play:\n");
  354. bp += len;
  355. dlen -= len;
  356. len = snprintf(bp, dlen, "set: %08lu\t",
  357. mdp4_stat.overlay_set[1]);
  358. bp += len;
  359. dlen -= len;
  360. len = snprintf(bp, dlen, "unset: %08lu\t",
  361. mdp4_stat.overlay_unset[1]);
  362. bp += len;
  363. dlen -= len;
  364. len = snprintf(bp, dlen, "play: %08lu\t",
  365. mdp4_stat.overlay_play[1]);
  366. bp += len;
  367. dlen -= len;
  368. len = snprintf(bp, dlen, "commit: %08lu\n\n",
  369. mdp4_stat.overlay_commit[1]);
  370. bp += len;
  371. dlen -= len;
  372. len = snprintf(bp, dlen, "frame_push:\n");
  373. bp += len;
  374. dlen -= len;
  375. len = snprintf(bp, dlen, "vg1 : %08lu\t", mdp4_stat.pipe[0]);
  376. bp += len;
  377. dlen -= len;
  378. len = snprintf(bp, dlen, "vg2 : %08lu\t", mdp4_stat.pipe[1]);
  379. bp += len;
  380. dlen -= len;
  381. len = snprintf(bp, dlen, "vg3 : %08lu\n", mdp4_stat.pipe[5]);
  382. bp += len;
  383. dlen -= len;
  384. len = snprintf(bp, dlen, "rgb1: %08lu\t", mdp4_stat.pipe[2]);
  385. bp += len;
  386. dlen -= len;
  387. len = snprintf(bp, dlen, "rgb2: %08lu\t", mdp4_stat.pipe[3]);
  388. bp += len;
  389. dlen -= len;
  390. len = snprintf(bp, dlen, "rgb3: %08lu\n\n", mdp4_stat.pipe[4]);
  391. bp += len;
  392. dlen -= len;
  393. len = snprintf(bp, dlen, "wait4vsync: ");
  394. bp += len;
  395. dlen -= len;
  396. len = snprintf(bp, dlen, "mixer0 : %08lu\t", mdp4_stat.wait4vsync0);
  397. bp += len;
  398. dlen -= len;
  399. len = snprintf(bp, dlen, "mixer1: %08lu\n\n", mdp4_stat.wait4vsync1);
  400. bp += len;
  401. dlen -= len;
  402. len = snprintf(bp, dlen, "iommu: ");
  403. bp += len;
  404. dlen -= len;
  405. len = snprintf(bp, dlen, "map : %08lu\t", mdp4_stat.iommu_map);
  406. bp += len;
  407. dlen -= len;
  408. len = snprintf(bp, dlen, "unmap: %08lu\t", mdp4_stat.iommu_unmap);
  409. bp += len;
  410. dlen -= len;
  411. len = snprintf(bp, dlen, "drop: %08lu\n\n", mdp4_stat.iommu_drop);
  412. bp += len;
  413. dlen -= len;
  414. len = snprintf(bp, dlen, "err_mixer : %08lu\t", mdp4_stat.err_mixer);
  415. bp += len;
  416. dlen -= len;
  417. len = snprintf(bp, dlen, "err_size : %08lu\n", mdp4_stat.err_size);
  418. bp += len;
  419. dlen -= len;
  420. len = snprintf(bp, dlen, "err_scale : %08lu\t", mdp4_stat.err_scale);
  421. bp += len;
  422. dlen -= len;
  423. len = snprintf(bp, dlen, "err_format: %08lu\n", mdp4_stat.err_format);
  424. bp += len;
  425. dlen -= len;
  426. len = snprintf(bp, dlen, "err_play : %08lu\t", mdp4_stat.err_play);
  427. bp += len;
  428. dlen -= len;
  429. len = snprintf(bp, dlen, "err_stage : %08lu\n", mdp4_stat.err_stage);
  430. bp += len;
  431. dlen -= len;
  432. len = snprintf(bp, dlen, "err_underflow: %08lu\n\n",
  433. mdp4_stat.err_underflow);
  434. bp += len;
  435. dlen -= len;
  436. len = snprintf(bp, dlen, "writeback:\n");
  437. bp += len;
  438. dlen -= len;
  439. len = snprintf(bp, dlen, "dsi_cmd: %08lu\t",
  440. mdp4_stat.blt_dsi_cmd);
  441. bp += len;
  442. dlen -= len;
  443. len = snprintf(bp, dlen, "dsi_video: %08lu\n",
  444. mdp4_stat.blt_dsi_video);
  445. bp += len;
  446. dlen -= len;
  447. len = snprintf(bp, dlen, "lcdc: %08lu\t",
  448. mdp4_stat.blt_lcdc);
  449. bp += len;
  450. dlen -= len;
  451. len = snprintf(bp, dlen, "dtv: %08lu\t",
  452. mdp4_stat.blt_dtv);
  453. bp += len;
  454. dlen -= len;
  455. len = snprintf(bp, dlen, "mddi: %08lu\n\n",
  456. mdp4_stat.blt_mddi);
  457. bp += len;
  458. dlen -= len;
  459. tot = (uint32)bp - (uint32)debug_buf;
  460. *bp = 0;
  461. tot++;
  462. if (tot < 0)
  463. return 0;
  464. if (copy_to_user(buff, debug_buf, tot))
  465. return -EFAULT;
  466. *ppos += tot; /* increase offset */
  467. return tot;
  468. }
  469. static const struct file_operations mdp_stat_fops = {
  470. .open = mdp_stat_open,
  471. .release = mdp_stat_release,
  472. .read = mdp_stat_read,
  473. .write = mdp_stat_write,
  474. };
  475. #endif
  476. /*
  477. * MDDI
  478. *
  479. */
  480. struct mddi_reg {
  481. char *name;
  482. int off;
  483. };
  484. static struct mddi_reg mddi_regs_list[] = {
  485. {"MDDI_CMD", MDDI_CMD}, /* 0x0000 */
  486. {"MDDI_VERSION", MDDI_VERSION}, /* 0x0004 */
  487. {"MDDI_PRI_PTR", MDDI_PRI_PTR}, /* 0x0008 */
  488. {"MDDI_BPS", MDDI_BPS}, /* 0x0010 */
  489. {"MDDI_SPM", MDDI_SPM}, /* 0x0014 */
  490. {"MDDI_INT", MDDI_INT}, /* 0x0018 */
  491. {"MDDI_INTEN", MDDI_INTEN}, /* 0x001c */
  492. {"MDDI_REV_PTR", MDDI_REV_PTR}, /* 0x0020 */
  493. {"MDDI_ REV_SIZE", MDDI_REV_SIZE},/* 0x0024 */
  494. {"MDDI_STAT", MDDI_STAT}, /* 0x0028 */
  495. {"MDDI_REV_RATE_DIV", MDDI_REV_RATE_DIV}, /* 0x002c */
  496. {"MDDI_REV_CRC_ERR", MDDI_REV_CRC_ERR}, /* 0x0030 */
  497. {"MDDI_TA1_LEN", MDDI_TA1_LEN}, /* 0x0034 */
  498. {"MDDI_TA2_LEN", MDDI_TA2_LEN}, /* 0x0038 */
  499. {"MDDI_TEST", MDDI_TEST}, /* 0x0040 */
  500. {"MDDI_REV_PKT_CNT", MDDI_REV_PKT_CNT}, /* 0x0044 */
  501. {"MDDI_DRIVE_HI", MDDI_DRIVE_HI},/* 0x0048 */
  502. {"MDDI_DRIVE_LO", MDDI_DRIVE_LO}, /* 0x004c */
  503. {"MDDI_DISP_WAKE", MDDI_DISP_WAKE},/* 0x0050 */
  504. {"MDDI_REV_ENCAP_SZ", MDDI_REV_ENCAP_SZ}, /* 0x0054 */
  505. {"MDDI_RTD_VAL", MDDI_RTD_VAL}, /* 0x0058 */
  506. {"MDDI_PAD_CTL", MDDI_PAD_CTL}, /* 0x0068 */
  507. {"MDDI_DRIVER_START_CNT", MDDI_DRIVER_START_CNT}, /* 0x006c */
  508. {"MDDI_CORE_VER", MDDI_CORE_VER}, /* 0x008c */
  509. {"MDDI_FIFO_ALLOC", MDDI_FIFO_ALLOC}, /* 0x0090 */
  510. {"MDDI_PAD_IO_CTL", MDDI_PAD_IO_CTL}, /* 0x00a0 */
  511. {"MDDI_PAD_CAL", MDDI_PAD_CAL}, /* 0x00a4 */
  512. {0, 0}
  513. };
  514. static int mddi_reg_open(struct inode *inode, struct file *file)
  515. {
  516. /* non-seekable */
  517. file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  518. return 0;
  519. }
  520. static int mddi_reg_release(struct inode *inode, struct file *file)
  521. {
  522. return 0;
  523. }
  524. static void mddi_reg_write(int ndx, uint32 off, uint32 data)
  525. {
  526. char *base;
  527. if (ndx)
  528. base = (char *)msm_emdh_base;
  529. else
  530. base = (char *)msm_pmdh_base;
  531. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
  532. writel(data, base + off);
  533. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  534. printk(KERN_INFO "%s: addr=%x data=%x\n",
  535. __func__, (int)(base+off), (int)data);
  536. }
  537. static int mddi_reg_read(int ndx)
  538. {
  539. struct mddi_reg *reg;
  540. unsigned char *base;
  541. int data;
  542. char *bp;
  543. int len = 0;
  544. int tot = 0;
  545. int dlen;
  546. if (ndx)
  547. base = msm_emdh_base;
  548. else
  549. base = msm_pmdh_base;
  550. reg = mddi_regs_list;
  551. bp = debug_buf;
  552. dlen = sizeof(debug_buf);
  553. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
  554. while (reg->name) {
  555. data = readl((u32)base + reg->off);
  556. len = snprintf(bp, dlen, "%s:0x%08x\t\t= 0x%08x\n",
  557. reg->name, reg->off, data);
  558. tot += len;
  559. bp += len;
  560. dlen -= len;
  561. reg++;
  562. }
  563. mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  564. *bp = 0;
  565. tot++;
  566. return tot;
  567. }
  568. static ssize_t pmdh_reg_write(
  569. struct file *file,
  570. const char __user *buff,
  571. size_t count,
  572. loff_t *ppos)
  573. {
  574. uint32 off, data;
  575. int cnt;
  576. if (count >= sizeof(debug_buf))
  577. return -EFAULT;
  578. if (copy_from_user(debug_buf, buff, count))
  579. return -EFAULT;
  580. debug_buf[count] = 0; /* end of string */
  581. cnt = sscanf(debug_buf, "%x %x", &off, &data);
  582. mddi_reg_write(0, off, data);
  583. return count;
  584. }
  585. static ssize_t pmdh_reg_read(
  586. struct file *file,
  587. char __user *buff,
  588. size_t count,
  589. loff_t *ppos)
  590. {
  591. int tot = 0;
  592. if (*ppos)
  593. return 0; /* the end */
  594. tot = mddi_reg_read(0); /* pmdh */
  595. if (tot < 0)
  596. return 0;
  597. if (copy_to_user(buff, debug_buf, tot))
  598. return -EFAULT;
  599. *ppos += tot; /* increase offset */
  600. return tot;
  601. }
  602. static const struct file_operations pmdh_fops = {
  603. .open = mddi_reg_open,
  604. .release = mddi_reg_release,
  605. .read = pmdh_reg_read,
  606. .write = pmdh_reg_write,
  607. };
  608. static ssize_t emdh_reg_write(
  609. struct file *file,
  610. const char __user *buff,
  611. size_t count,
  612. loff_t *ppos)
  613. {
  614. uint32 off, data;
  615. int cnt;
  616. if (count >= sizeof(debug_buf))
  617. return -EFAULT;
  618. if (copy_from_user(debug_buf, buff, count))
  619. return -EFAULT;
  620. debug_buf[count] = 0; /* end of string */
  621. cnt = sscanf(debug_buf, "%x %x", &off, &data);
  622. mddi_reg_write(1, off, data);
  623. return count;
  624. }
  625. static ssize_t emdh_reg_read(
  626. struct file *file,
  627. char __user *buff,
  628. size_t count,
  629. loff_t *ppos)
  630. {
  631. int tot = 0;
  632. if (*ppos)
  633. return 0; /* the end */
  634. tot = mddi_reg_read(1); /* emdh */
  635. if (tot < 0)
  636. return 0;
  637. if (copy_to_user(buff, debug_buf, tot))
  638. return -EFAULT;
  639. *ppos += tot; /* increase offset */
  640. return tot;
  641. }
  642. static const struct file_operations emdh_fops = {
  643. .open = mddi_reg_open,
  644. .release = mddi_reg_release,
  645. .read = emdh_reg_read,
  646. .write = emdh_reg_write,
  647. };
  648. uint32 dbg_offset;
  649. uint32 dbg_count;
  650. char *dbg_base;
  651. static int dbg_open(struct inode *inode, struct file *file)
  652. {
  653. /* non-seekable */
  654. file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  655. return 0;
  656. }
  657. static int dbg_release(struct inode *inode, struct file *file)
  658. {
  659. return 0;
  660. }
  661. static ssize_t dbg_base_write(
  662. struct file *file,
  663. const char __user *buff,
  664. size_t count,
  665. loff_t *ppos)
  666. {
  667. return count;
  668. }
  669. static ssize_t dbg_base_read(
  670. struct file *file,
  671. char __user *buff,
  672. size_t count,
  673. loff_t *ppos)
  674. {
  675. int len = 0;
  676. int tot = 0;
  677. int dlen;
  678. char *bp;
  679. if (*ppos)
  680. return 0; /* the end */
  681. bp = debug_buf;
  682. dlen = sizeof(debug_buf);
  683. len = snprintf(bp, dlen, "mdp_base : %08x\n",
  684. (int)msm_mdp_base);
  685. bp += len;
  686. dlen -= len;
  687. len = snprintf(bp, dlen, "mddi_base : %08x\n",
  688. (int)msm_pmdh_base);
  689. bp += len;
  690. dlen -= len;
  691. len = snprintf(bp, dlen, "emdh_base : %08x\n",
  692. (int)msm_emdh_base);
  693. bp += len;
  694. dlen -= len;
  695. #ifdef CONFIG_FB_MSM_TVOUT
  696. len = snprintf(bp, dlen, "tvenv_base: %08x\n",
  697. (int)tvenc_base);
  698. bp += len;
  699. dlen -= len;
  700. #endif
  701. #ifdef CONFIG_FB_MSM_MIPI_DSI
  702. len = snprintf(bp, dlen, "mipi_dsi_base: %08x\n",
  703. (int)mipi_dsi_base);
  704. bp += len;
  705. dlen -= len;
  706. #endif
  707. tot = (uint32)bp - (uint32)debug_buf;
  708. *bp = 0;
  709. tot++;
  710. if (tot < 0)
  711. return 0;
  712. if (copy_to_user(buff, debug_buf, tot))
  713. return -EFAULT;
  714. *ppos += tot; /* increase offset */
  715. return tot;
  716. }
  717. static const struct file_operations dbg_base_fops = {
  718. .open = dbg_open,
  719. .release = dbg_release,
  720. .read = dbg_base_read,
  721. .write = dbg_base_write,
  722. };
  723. static ssize_t dbg_offset_write(
  724. struct file *file,
  725. const char __user *buff,
  726. size_t count,
  727. loff_t *ppos)
  728. {
  729. uint32 off, cnt, num, base;
  730. if (count >= sizeof(debug_buf))
  731. return -EFAULT;
  732. if (copy_from_user(debug_buf, buff, count))
  733. return -EFAULT;
  734. debug_buf[count] = 0; /* end of string */
  735. cnt = sscanf(debug_buf, "%x %d %x", &off, &num, &base);
  736. if (cnt < 0)
  737. cnt = 0;
  738. if (cnt >= 1)
  739. dbg_offset = off;
  740. if (cnt >= 2)
  741. dbg_count = num;
  742. if (cnt >= 3)
  743. dbg_base = (char *)base;
  744. printk(KERN_INFO "%s: offset=%x cnt=%d base=%x\n", __func__,
  745. dbg_offset, dbg_count, (int)dbg_base);
  746. return count;
  747. }
  748. static ssize_t dbg_offset_read(
  749. struct file *file,
  750. char __user *buff,
  751. size_t count,
  752. loff_t *ppos)
  753. {
  754. int len = 0;
  755. if (*ppos)
  756. return 0; /* the end */
  757. len = snprintf(debug_buf, sizeof(debug_buf), "0x%08x %d 0x%08x\n",
  758. dbg_offset, dbg_count, (int)dbg_base);
  759. if (len < 0)
  760. return 0;
  761. if (copy_to_user(buff, debug_buf, len))
  762. return -EFAULT;
  763. *ppos += len; /* increase offset */
  764. return len;
  765. }
  766. static const struct file_operations dbg_off_fops = {
  767. .open = dbg_open,
  768. .release = dbg_release,
  769. .read = dbg_offset_read,
  770. .write = dbg_offset_write,
  771. };
  772. static ssize_t dbg_reg_write(
  773. struct file *file,
  774. const char __user *buff,
  775. size_t count,
  776. loff_t *ppos)
  777. {
  778. uint32 off, data;
  779. int cnt;
  780. if (count >= sizeof(debug_buf))
  781. return -EFAULT;
  782. if (copy_from_user(debug_buf, buff, count))
  783. return -EFAULT;
  784. debug_buf[count] = 0; /* end of string */
  785. cnt = sscanf(debug_buf, "%x %x", &off, &data);
  786. writel(data, dbg_base + off);
  787. printk(KERN_INFO "%s: addr=%x data=%x\n",
  788. __func__, (int)(dbg_base+off), (int)data);
  789. return count;
  790. }
  791. static ssize_t dbg_reg_read(
  792. struct file *file,
  793. char __user *buff,
  794. size_t count,
  795. loff_t *ppos)
  796. {
  797. int len = 0;
  798. uint32 data;
  799. int i, j, off, dlen, num;
  800. char *bp, *cp;
  801. int tot = 0;
  802. if (*ppos)
  803. return 0; /* the end */
  804. if (dbg_base == 0)
  805. return 0; /* nothing to read */
  806. j = 0;
  807. num = 0;
  808. bp = debug_buf;
  809. cp = (char *)(dbg_base + dbg_offset);
  810. dlen = sizeof(debug_buf);
  811. while (j++ < 16) {
  812. len = snprintf(bp, dlen, "0x%08x: ", (int)cp);
  813. tot += len;
  814. bp += len;
  815. dlen -= len;
  816. off = 0;
  817. i = 0;
  818. while (i++ < 4) {
  819. data = readl(cp + off);
  820. len = snprintf(bp, dlen, "%08x ", data);
  821. tot += len;
  822. bp += len;
  823. dlen -= len;
  824. off += 4;
  825. num++;
  826. if (num >= dbg_count)
  827. break;
  828. }
  829. data = readl((u32)cp + off);
  830. *bp++ = '\n';
  831. --dlen;
  832. tot++;
  833. cp += off;
  834. if (num >= dbg_count)
  835. break;
  836. }
  837. *bp = 0;
  838. tot++;
  839. if (copy_to_user(buff, debug_buf, tot))
  840. return -EFAULT;
  841. *ppos += tot; /* increase offset */
  842. return tot;
  843. }
  844. static const struct file_operations dbg_reg_fops = {
  845. .open = dbg_open,
  846. .release = dbg_release,
  847. .read = dbg_reg_read,
  848. .write = dbg_reg_write,
  849. };
  850. u32 dbg_force_ov0_blt;
  851. u32 dbg_force_ov1_blt;
  852. static ssize_t dbg_force_ov0_blt_read(
  853. struct file *file,
  854. char __user *buff,
  855. size_t count,
  856. loff_t *ppos) {
  857. int len;
  858. if (*ppos)
  859. return 0;
  860. len = snprintf(debug_buf, sizeof(debug_buf),
  861. "%d\n", dbg_force_ov0_blt);
  862. if (len < 0)
  863. return 0;
  864. if (copy_to_user(buff, debug_buf, len))
  865. return -EFAULT;
  866. *ppos += len;
  867. return len;
  868. }
  869. static ssize_t dbg_force_ov0_blt_write(
  870. struct file *file,
  871. const char __user *buff,
  872. size_t count,
  873. loff_t *ppos)
  874. {
  875. u32 cnt;
  876. if (count >= sizeof(debug_buf))
  877. return -EFAULT;
  878. if (copy_from_user(debug_buf, buff, count))
  879. return -EFAULT;
  880. debug_buf[count] = 0; /* end of string */
  881. cnt = sscanf(debug_buf, "%x", &dbg_force_ov0_blt);
  882. pr_info("%s: dbg_force_ov0_blt = %x\n",
  883. __func__, dbg_force_ov0_blt);
  884. if ((dbg_force_ov0_blt & 0x0f) > 2)
  885. pr_err("%s: invalid dbg_force_ov0_blt = %d\n",
  886. __func__, dbg_force_ov0_blt);
  887. if ((dbg_force_ov0_blt >> 4) > 2)
  888. pr_err("%s: invalid dbg_force_ov0_blt = %d\n",
  889. __func__, dbg_force_ov0_blt);
  890. return count;
  891. }
  892. static const struct file_operations dbg_force_ov0_blt_fops = {
  893. .open = dbg_open,
  894. .release = dbg_release,
  895. .read = dbg_force_ov0_blt_read,
  896. .write = dbg_force_ov0_blt_write,
  897. };
  898. static ssize_t dbg_force_ov1_blt_read(
  899. struct file *file,
  900. char __user *buff,
  901. size_t count,
  902. loff_t *ppos) {
  903. int len;
  904. if (*ppos)
  905. return 0;
  906. len = snprintf(debug_buf, sizeof(debug_buf),
  907. "%x\n", dbg_force_ov1_blt);
  908. if (len < 0)
  909. return 0;
  910. if (copy_to_user(buff, debug_buf, len))
  911. return -EFAULT;
  912. *ppos += len;
  913. return len;
  914. }
  915. static ssize_t dbg_force_ov1_blt_write(
  916. struct file *file,
  917. const char __user *buff,
  918. size_t count,
  919. loff_t *ppos)
  920. {
  921. u32 cnt;
  922. if (count >= sizeof(debug_buf))
  923. return -EFAULT;
  924. if (copy_from_user(debug_buf, buff, count))
  925. return -EFAULT;
  926. debug_buf[count] = 0; /* end of string */
  927. cnt = sscanf(debug_buf, "%x", &dbg_force_ov1_blt);
  928. pr_info("%s: dbg_force_ov1_blt = %x\n",
  929. __func__, dbg_force_ov1_blt);
  930. if ((dbg_force_ov1_blt & 0x0f) > 2)
  931. pr_err("%s: invalid dbg_force_ov1_blt = %x\n",
  932. __func__, dbg_force_ov1_blt);
  933. if ((dbg_force_ov1_blt >> 4) > 2)
  934. pr_err("%s: invalid dbg_force_ov1_blt = %d\n",
  935. __func__, dbg_force_ov1_blt);
  936. return count;
  937. }
  938. static const struct file_operations dbg_force_ov1_blt_fops = {
  939. .open = dbg_open,
  940. .release = dbg_release,
  941. .read = dbg_force_ov1_blt_read,
  942. .write = dbg_force_ov1_blt_write,
  943. };
  944. #ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL
  945. static uint32 hdmi_offset;
  946. static uint32 hdmi_count;
  947. static int hdmi_open(struct inode *inode, struct file *file)
  948. {
  949. /* non-seekable */
  950. file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  951. return 0;
  952. }
  953. static int hdmi_release(struct inode *inode, struct file *file)
  954. {
  955. return 0;
  956. }
  957. static ssize_t hdmi_offset_write(
  958. struct file *file,
  959. const char __user *buff,
  960. size_t count,
  961. loff_t *ppos)
  962. {
  963. uint32 off, cnt, num;
  964. if (count >= sizeof(debug_buf))
  965. return -EFAULT;
  966. if (copy_from_user(debug_buf, buff, count))
  967. return -EFAULT;
  968. debug_buf[count] = 0; /* end of string */
  969. cnt = sscanf(debug_buf, "%x %d", &off, &num);
  970. if (cnt < 0)
  971. cnt = 0;
  972. if (cnt >= 1)
  973. hdmi_offset = off;
  974. if (cnt >= 2)
  975. hdmi_count = num;
  976. printk(KERN_INFO "%s: offset=%x cnt=%d\n", __func__,
  977. hdmi_offset, hdmi_count);
  978. return count;
  979. }
  980. static ssize_t hdmi_offset_read(
  981. struct file *file,
  982. char __user *buff,
  983. size_t count,
  984. loff_t *ppos)
  985. {
  986. int len = 0;
  987. if (*ppos)
  988. return 0; /* the end */
  989. len = snprintf(debug_buf, sizeof(debug_buf), "0x%08x %d\n",
  990. hdmi_offset, hdmi_count);
  991. if (len < 0)
  992. return 0;
  993. if (copy_to_user(buff, debug_buf, len))
  994. return -EFAULT;
  995. *ppos += len; /* increase offset */
  996. return len;
  997. }
  998. static const struct file_operations hdmi_off_fops = {
  999. .open = hdmi_open,
  1000. .release = hdmi_release,
  1001. .read = hdmi_offset_read,
  1002. .write = hdmi_offset_write,
  1003. };
  1004. static ssize_t hdmi_reg_write(
  1005. struct file *file,
  1006. const char __user *buff,
  1007. size_t count,
  1008. loff_t *ppos)
  1009. {
  1010. uint32 off, data, base;
  1011. int cnt;
  1012. if (count >= sizeof(debug_buf))
  1013. return -EFAULT;
  1014. if (copy_from_user(debug_buf, buff, count))
  1015. return -EFAULT;
  1016. base = hdmi_msm_get_io_base();
  1017. if (base == 0)
  1018. return -EFAULT;
  1019. debug_buf[count] = 0; /* end of string */
  1020. cnt = sscanf(debug_buf, "%x %x", &off, &data);
  1021. writel(data, base + off);
  1022. printk(KERN_INFO "%s: addr=%x data=%x\n",
  1023. __func__, (int)(base+off), (int)data);
  1024. return count;
  1025. }
  1026. static ssize_t hdmi_reg_read(
  1027. struct file *file,
  1028. char __user *buff,
  1029. size_t count,
  1030. loff_t *ppos)
  1031. {
  1032. int len = 0;
  1033. uint32 data;
  1034. int i, j, off, dlen, num;
  1035. char *bp, *cp;
  1036. int tot = 0;
  1037. if (*ppos)
  1038. return 0; /* the end */
  1039. if (hdmi_msm_get_io_base() == 0)
  1040. return 0; /* nothing to read */
  1041. j = 0;
  1042. num = 0;
  1043. bp = debug_buf;
  1044. cp = (char *)(hdmi_msm_get_io_base() + hdmi_offset);
  1045. dlen = sizeof(debug_buf);
  1046. while (j++ < 16) {
  1047. len = snprintf(bp, dlen, "0x%08x: ", (int)cp);
  1048. tot += len;
  1049. bp += len;
  1050. dlen -= len;
  1051. off = 0;
  1052. i = 0;
  1053. while (i++ < 4) {
  1054. data = readl(cp + off);
  1055. len = snprintf(bp, dlen, "%08x ", data);
  1056. tot += len;
  1057. bp += len;
  1058. dlen -= len;
  1059. off += 4;
  1060. num++;
  1061. if (num >= hdmi_count)
  1062. break;
  1063. }
  1064. data = readl((u32)cp + off);
  1065. *bp++ = '\n';
  1066. --dlen;
  1067. tot++;
  1068. cp += off;
  1069. if (num >= hdmi_count)
  1070. break;
  1071. }
  1072. *bp = 0;
  1073. tot++;
  1074. if (copy_to_user(buff, debug_buf, tot))
  1075. return -EFAULT;
  1076. *ppos += tot; /* increase offset */
  1077. return tot;
  1078. }
  1079. static const struct file_operations hdmi_reg_fops = {
  1080. .open = hdmi_open,
  1081. .release = hdmi_release,
  1082. .read = hdmi_reg_read,
  1083. .write = hdmi_reg_write,
  1084. };
  1085. #endif
  1086. /*
  1087. * debugfs
  1088. *
  1089. */
  1090. int mdp_debugfs_init(void)
  1091. {
  1092. struct dentry *dent = debugfs_create_dir("mdp", NULL);
  1093. if (IS_ERR(dent)) {
  1094. printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n",
  1095. __FILE__, __LINE__, PTR_ERR(dent));
  1096. return -1;
  1097. }
  1098. if (debugfs_create_file("off", 0644, dent, 0, &mdp_off_fops)
  1099. == NULL) {
  1100. printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n",
  1101. __FILE__, __LINE__);
  1102. return -1;
  1103. }
  1104. if (debugfs_create_file("reg", 0644, dent, 0, &mdp_reg_fops)
  1105. == NULL) {
  1106. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  1107. __FILE__, __LINE__);
  1108. return -1;
  1109. }
  1110. #ifdef CONFIG_FB_MSM_MDP40
  1111. if (debugfs_create_file("stat", 0644, dent, 0, &mdp_stat_fops)
  1112. == NULL) {
  1113. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  1114. __FILE__, __LINE__);
  1115. return -1;
  1116. }
  1117. #endif
  1118. if (debugfs_create_file("force_ov0_blt", 0644, dent, 0,
  1119. &dbg_force_ov0_blt_fops)
  1120. == NULL) {
  1121. pr_err("%s(%d): debugfs_create_file: debug fail\n",
  1122. __FILE__, __LINE__);
  1123. return -EFAULT;
  1124. }
  1125. if (debugfs_create_file("force_ov1_blt", 0644, dent, 0,
  1126. &dbg_force_ov1_blt_fops)
  1127. == NULL) {
  1128. pr_err("%s(%d): debugfs_create_file: debug fail\n",
  1129. __FILE__, __LINE__);
  1130. return -EFAULT;
  1131. }
  1132. dent = debugfs_create_dir("mddi", NULL);
  1133. if (IS_ERR(dent)) {
  1134. printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n",
  1135. __FILE__, __LINE__, PTR_ERR(dent));
  1136. return -1;
  1137. }
  1138. if (debugfs_create_file("reg", 0644, dent, 0, &pmdh_fops)
  1139. == NULL) {
  1140. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  1141. __FILE__, __LINE__);
  1142. return -1;
  1143. }
  1144. dent = debugfs_create_dir("emdh", NULL);
  1145. if (IS_ERR(dent)) {
  1146. printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n",
  1147. __FILE__, __LINE__, PTR_ERR(dent));
  1148. return -1;
  1149. }
  1150. if (debugfs_create_file("reg", 0644, dent, 0, &emdh_fops)
  1151. == NULL) {
  1152. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  1153. __FILE__, __LINE__);
  1154. return -1;
  1155. }
  1156. dent = debugfs_create_dir("mdp-dbg", NULL);
  1157. if (IS_ERR(dent)) {
  1158. printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n",
  1159. __FILE__, __LINE__, PTR_ERR(dent));
  1160. return -1;
  1161. }
  1162. if (debugfs_create_file("base", 0644, dent, 0, &dbg_base_fops)
  1163. == NULL) {
  1164. printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n",
  1165. __FILE__, __LINE__);
  1166. return -1;
  1167. }
  1168. if (debugfs_create_file("off", 0644, dent, 0, &dbg_off_fops)
  1169. == NULL) {
  1170. printk(KERN_ERR "%s(%d): debugfs_create_file: index fail\n",
  1171. __FILE__, __LINE__);
  1172. return -1;
  1173. }
  1174. if (debugfs_create_file("reg", 0644, dent, 0, &dbg_reg_fops)
  1175. == NULL) {
  1176. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  1177. __FILE__, __LINE__);
  1178. return -1;
  1179. }
  1180. #ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL
  1181. dent = debugfs_create_dir("hdmi", NULL);
  1182. if (IS_ERR(dent)) {
  1183. printk(KERN_ERR "%s(%d): debugfs_create_dir fail, error %ld\n",
  1184. __FILE__, __LINE__, PTR_ERR(dent));
  1185. return PTR_ERR(dent);
  1186. }
  1187. if (debugfs_create_file("off", 0644, dent, 0, &hdmi_off_fops)
  1188. == NULL) {
  1189. printk(KERN_ERR "%s(%d): debugfs_create_file: 'off' fail\n",
  1190. __FILE__, __LINE__);
  1191. return -ENOENT;
  1192. }
  1193. if (debugfs_create_file("reg", 0644, dent, 0, &hdmi_reg_fops)
  1194. == NULL) {
  1195. printk(KERN_ERR "%s(%d): debugfs_create_file: 'reg' fail\n",
  1196. __FILE__, __LINE__);
  1197. return -ENOENT;
  1198. }
  1199. #endif
  1200. return 0;
  1201. }