fbconfig_kdebug.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263
  1. #include <linux/string.h>
  2. #include <linux/time.h>
  3. #include <linux/uaccess.h>
  4. #include <linux/fb.h>
  5. #include <linux/vmalloc.h>
  6. #include <linux/sched.h>
  7. #include <linux/debugfs.h>
  8. #include <linux/wait.h>
  9. #include <linux/types.h>
  10. #include "disp_drv_platform.h"
  11. #include "m4u_priv.h"
  12. #include "mtkfb.h"
  13. #include "debug.h"
  14. #include "lcm_drv.h"
  15. #include "ddp_path.h"
  16. #include "fbconfig_kdebug.h"
  17. #include "primary_display.h"
  18. #include "ddp_ovl.h"
  19. #include "ddp_dsi.h"
  20. #include "ddp_irq.h"
  21. /* #include "disp_drv.h" */
  22. /* #include "lcd_drv.h" */
  23. /* **************************************************************************** */
  24. /* This part is for customization parameters of D-IC and DSI . */
  25. /* **************************************************************************** */
  26. bool fbconfig_start_LCM_config;
  27. #define FBCONFIG_MDELAY(n) (PM_lcm_utils_dsi0.mdelay((n)))
  28. #define SET_RESET_PIN(v) (PM_lcm_utils_dsi0.set_reset_pin((v)))
  29. #define dsi_set_cmdq(pdata, queue_size, force_update) PM_lcm_utils_dsi0.dsi_set_cmdq(pdata, queue_size, force_update)
  30. #define FBCONFIG_KEEP_NEW_SETTING 1
  31. #define FBCONFIG_DEBUG 0
  32. #define FBCONFIG_IOW(num, dtype) _IOW('X', num, dtype)
  33. #define FBCONFIG_IOR(num, dtype) _IOR('X', num, dtype)
  34. #define FBCONFIG_IOWR(num, dtype) _IOWR('X', num, dtype)
  35. #define FBCONFIG_IO(num) _IO('X', num)
  36. #define GET_DSI_ID FBCONFIG_IOW(43, unsigned int)
  37. #define SET_DSI_ID FBCONFIG_IOW(44, unsigned int)
  38. #define LCM_GET_ID FBCONFIG_IOR(45, unsigned int)
  39. #define LCM_GET_ESD FBCONFIG_IOWR(46, unsigned int)
  40. #define DRIVER_IC_CONFIG FBCONFIG_IOR(47, unsigned int)
  41. #define DRIVER_IC_CONFIG_DONE FBCONFIG_IO(0)
  42. #define DRIVER_IC_RESET FBCONFIG_IOR(48, unsigned int)
  43. #define MIPI_SET_CLK FBCONFIG_IOW(51, unsigned int)
  44. #define MIPI_SET_LANE FBCONFIG_IOW(52, unsigned int)
  45. #define MIPI_SET_TIMING FBCONFIG_IOW(53, unsigned int)
  46. #define MIPI_SET_VM FBCONFIG_IOW(54, unsigned int) /* mipi video mode timing setting */
  47. #define MIPI_SET_CC FBCONFIG_IOW(55, unsigned int) /* mipi non-continuous clock */
  48. #define MIPI_SET_SSC FBCONFIG_IOW(56, unsigned int) /* spread frequency */
  49. #define MIPI_SET_CLK_V2 FBCONFIG_IOW(57, unsigned int) /* For div1,div2,fbk_div case */
  50. #define TE_SET_ENABLE FBCONFIG_IOW(61, unsigned int)
  51. #define FB_LAYER_DUMP FBCONFIG_IOW(62, unsigned int)
  52. #define FB_LAYER_GET_INFO FBCONFIG_IOW(63, unsigned int)
  53. #define FB_LAYER_GET_EN FBCONFIG_IOW(64, unsigned int)
  54. #define LCM_GET_ESD_RET FBCONFIG_IOR(65, unsigned int)
  55. #define LCM_GET_DSI_CONTINU FBCONFIG_IOR(71, unsigned int)
  56. #define LCM_GET_DSI_CLK FBCONFIG_IOR(72, unsigned int)
  57. #define LCM_GET_DSI_TIMING FBCONFIG_IOR(73, unsigned int)
  58. #define LCM_GET_DSI_LANE_NUM FBCONFIG_IOR(74, unsigned int)
  59. #define LCM_GET_DSI_TE FBCONFIG_IOR(75, unsigned int)
  60. #define LCM_GET_DSI_SSC FBCONFIG_IOR(76, unsigned int)
  61. #define LCM_GET_DSI_CLK_V2 FBCONFIG_IOR(77, unsigned int)
  62. #define LCM_TEST_DSI_CLK FBCONFIG_IOR(78, unsigned int)
  63. #define FB_GET_MISC FBCONFIG_IOR(80, unsigned int)
  64. #define DP_COLOR_BITS_PER_PIXEL(color) ((0x0003FF00 & color) >> 8)
  65. struct dentry *ConfigPara_dbgfs = NULL;
  66. CONFIG_RECORD_LIST head_list;
  67. LCM_REG_READ reg_read;
  68. /* int esd_check_addr; */
  69. /* int esd_check_para_num; */
  70. /* int esd_check_type; */
  71. /* char * esd_check_buffer =NULL; */
  72. /* extern void fbconfig_disp_set_mipi_timing(MIPI_TIMING timing); */
  73. /* extern unsigned int fbconfig_get_layer_info(FBCONFIG_LAYER_INFO *layers); */
  74. /* extern unsigned int fbconfig_get_layer_vaddr(int layer_id,int * layer_size,int * enable); */
  75. /* unsigned int fbconfig_get_layer_height(int layer_id,int * layer_size,int * enable,int* height ,int * fmt); */
  76. typedef struct PM_TOOL_ST {
  77. DSI_INDEX dsi_id;
  78. LCM_REG_READ reg_read;
  79. LCM_PARAMS *pLcm_params;
  80. LCM_DRIVER *pLcm_drv;
  81. } PM_TOOL_T;
  82. static PM_TOOL_T pm_params = {
  83. .dsi_id = PM_DSI0,
  84. .pLcm_params = NULL,
  85. .pLcm_drv = NULL,
  86. };
  87. static void *pm_get_handle(void)
  88. {
  89. return (void *)&pm_params;
  90. }
  91. static DISP_MODULE_ENUM pm_get_dsi_handle(DSI_INDEX dsi_id)
  92. {
  93. if (dsi_id == PM_DSI0)
  94. return DISP_MODULE_DSI0;
  95. else if (dsi_id == PM_DSI1)
  96. return DISP_MODULE_DSI1;
  97. else if (dsi_id == PM_DSI_DUAL)
  98. return DISP_MODULE_DSIDUAL;
  99. else
  100. return DISP_MODULE_UNKNOWN;
  101. }
  102. int fbconfig_get_esd_check(DSI_INDEX dsi_id, uint32_t cmd, uint8_t *buffer, uint32_t num)
  103. {
  104. int array[4];
  105. int ret;
  106. /* set max return packet size */
  107. /* array[0] = 0x00013700; */
  108. array[0] = 0x3700 + (num << 16);
  109. dsi_set_cmdq(array, 1, 1);
  110. atomic_set(&ESDCheck_byCPU , 1);
  111. ret = DSI_dcs_read_lcm_reg_v2(pm_get_dsi_handle(dsi_id), NULL, cmd, buffer, num);
  112. atomic_set(&ESDCheck_byCPU , 0);
  113. if (ret == 0)
  114. return -1;
  115. return 0;
  116. }
  117. /* RECORD_CMD = 0, */
  118. /* RECORD_MS = 1, */
  119. /* RECORD_PIN_SET = 2, */
  120. void Panel_Master_DDIC_config(void)
  121. {
  122. struct list_head *p;
  123. CONFIG_RECORD_LIST *node;
  124. list_for_each_prev(p, &head_list.list) {
  125. node = list_entry(p, CONFIG_RECORD_LIST, list);
  126. switch (node->record.type) {
  127. case RECORD_CMD:
  128. dsi_set_cmdq(node->record.ins_array, node->record.ins_num, 1);
  129. break;
  130. case RECORD_MS:
  131. FBCONFIG_MDELAY(node->record.ins_array[0]);
  132. break;
  133. case RECORD_PIN_SET:
  134. SET_RESET_PIN(node->record.ins_array[0]);
  135. break;
  136. default:
  137. pr_debug("sxk=>No such Type!!!!!\n");
  138. }
  139. }
  140. }
  141. /*static void print_from_head_to_tail(void)
  142. {
  143. int i;
  144. struct list_head *p;
  145. CONFIG_RECORD_LIST *print;
  146. pr_debug("DDIC=====>:print_from_head_to_tail START\n");
  147. list_for_each_prev(p, &head_list.list) {
  148. print = list_entry(p, CONFIG_RECORD_LIST, list);
  149. pr_debug("type:%d num %d value:\r\n", print->record.type, print->record.ins_num);
  150. for (i = 0; i < print->record.ins_num; i++)
  151. pr_debug("0x%x\t", print->record.ins_array[i]);
  152. pr_debug("\r\n");
  153. }
  154. pr_debug("DDIC=====>:print_from_head_to_tail END\n");
  155. }*/
  156. static void free_list_memory(void)
  157. {
  158. struct list_head *p, *n;
  159. CONFIG_RECORD_LIST *print;
  160. list_for_each_safe(p, n, &head_list.list) {
  161. print = list_entry(p, CONFIG_RECORD_LIST, list);
  162. list_del(&print->list);
  163. kfree(print);
  164. }
  165. /* test here : head->next == head ?? */
  166. if (list_empty(&head_list.list))
  167. pr_debug("*****list is empty!!\n");
  168. else
  169. pr_debug("*****list is NOT empty!!\n");
  170. }
  171. static int fbconfig_open(struct inode *inode, struct file *file)
  172. {
  173. PM_TOOL_T *pm_params;
  174. file->private_data = inode->i_private;
  175. pm_params = (PM_TOOL_T *) pm_get_handle();
  176. PanelMaster_set_PM_enable(1);
  177. pm_params->pLcm_drv = DISP_GetLcmDrv();
  178. pm_params->pLcm_params = DISP_GetLcmPara();
  179. return 0;
  180. }
  181. static char fbconfig_buffer[2048];
  182. static ssize_t fbconfig_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos)
  183. {
  184. const int debug_bufmax = sizeof(fbconfig_buffer) - 1; /* 2047 */
  185. int n = 0;
  186. n += scnprintf(fbconfig_buffer + n, debug_bufmax - n, "sxkhome");
  187. fbconfig_buffer[n++] = 0;
  188. /* n = 5 ; */
  189. /* memcpy(fbconfig_buffer,"sxkhome",6); */
  190. return simple_read_from_buffer(ubuf, count, ppos, fbconfig_buffer, n);
  191. }
  192. static ssize_t fbconfig_write(struct file *file,
  193. const char __user *ubuf, size_t count, loff_t *ppos)
  194. {
  195. return 0;
  196. }
  197. static long fbconfig_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  198. {
  199. int ret = 0;
  200. void __user *argp = (void __user *)arg;
  201. PM_TOOL_T *pm = (PM_TOOL_T *) pm_get_handle();
  202. uint32_t dsi_id = pm->dsi_id;
  203. LCM_DSI_PARAMS *pParams = get_dsi_params_handle(dsi_id);
  204. #ifdef FBCONFIG_SHOULD_KICK_IDLEMGR
  205. primary_display_idlemgr_kick(__func__, 1);
  206. #endif
  207. switch (cmd) {
  208. case GET_DSI_ID:
  209. {
  210. put_user(dsi_id, (unsigned long *)argp);
  211. return 0;
  212. }
  213. case SET_DSI_ID:
  214. {
  215. if (arg > PM_DSI_DUAL)
  216. return -EINVAL;
  217. pm->dsi_id = arg;
  218. pr_debug("fbconfig=>SET_DSI_ID:%d\n", dsi_id);
  219. return 0;
  220. }
  221. case LCM_TEST_DSI_CLK:
  222. {
  223. LCM_TYPE_FB lcm_fb;
  224. LCM_PARAMS *pLcm_params = pm->pLcm_params;
  225. lcm_fb.clock = pLcm_params->dsi.PLL_CLOCK;
  226. lcm_fb.lcm_type = pLcm_params->dsi.mode;
  227. pr_debug("fbconfig=>LCM_TEST_DSI_CLK:%d\n", ret);
  228. return copy_to_user(argp, &lcm_fb, sizeof(lcm_fb)) ? -EFAULT : 0;
  229. }
  230. case LCM_GET_ID:
  231. {
  232. /* LCM_DRIVER*pLcm_drv=pm->pLcm_drv; */
  233. unsigned int lcm_id = 0;
  234. #if 0
  235. if (pLcm_drv != NULL)
  236. lcm_id = pLcm_drv->get_lcm_id();
  237. else
  238. pr_debug("fbconfig=>LCM_GET_ID:%x\n", lcm_id);
  239. #endif
  240. return copy_to_user(argp, &lcm_id, sizeof(lcm_id)) ? -EFAULT : 0;
  241. }
  242. case DRIVER_IC_CONFIG:
  243. {
  244. CONFIG_RECORD_LIST *record_tmp_list = kmalloc(sizeof(*record_tmp_list), GFP_KERNEL);
  245. if (copy_from_user(&record_tmp_list->record, (void __user *)arg, sizeof(CONFIG_RECORD))) {
  246. pr_debug("list_add: copy_from_user failed! line:%d\n", __LINE__);
  247. kfree(record_tmp_list);
  248. record_tmp_list = NULL;
  249. return -EFAULT;
  250. }
  251. list_add(&record_tmp_list->list, &head_list.list);
  252. return 0;
  253. }
  254. case DRIVER_IC_CONFIG_DONE:
  255. {
  256. /* print_from_head_to_tail(); */
  257. Panel_Master_dsi_config_entry("PM_DDIC_CONFIG", NULL);
  258. /*free the memory ..... */
  259. free_list_memory();
  260. return 0;
  261. }
  262. case MIPI_SET_CC:
  263. {
  264. uint32_t enable = 0;
  265. if (get_user(enable, (uint32_t __user *) argp)) {
  266. pr_debug("[MIPI_SET_CC]: copy_from_user failed! line:%d\n",
  267. __LINE__);
  268. return -EFAULT;
  269. }
  270. PanelMaster_set_CC(dsi_id, enable);
  271. return 0;
  272. }
  273. case LCM_GET_DSI_CONTINU:
  274. {
  275. uint32_t ret = PanelMaster_get_CC(dsi_id);
  276. /* need to improve ,0 now means nothing but one parameter.... */
  277. pr_debug("LCM_GET_DSI_CONTINU=>DSI: %d\n", ret);
  278. return put_user(ret, (unsigned long *)argp);
  279. }
  280. case MIPI_SET_CLK:
  281. {
  282. uint32_t clk = 0;
  283. if (get_user(clk, (uint32_t __user *) argp)) {
  284. pr_debug("[MIPI_SET_CLK]: copy_from_user failed! line:%d\n",
  285. __LINE__);
  286. return -EFAULT;
  287. }
  288. pr_debug("LCM_GET_DSI_CLK=>dsi:%d\n", clk);
  289. Panel_Master_dsi_config_entry("PM_CLK", &clk);
  290. return 0;
  291. }
  292. case LCM_GET_DSI_CLK:
  293. {
  294. uint32_t clk = pParams->PLL_CLOCK;
  295. pr_debug("LCM_GET_DSI_CLK=>dsi:%d\n", clk);
  296. return put_user(clk, (unsigned long *)argp);
  297. }
  298. case MIPI_SET_SSC:
  299. {
  300. DSI_RET dsi_ssc;
  301. if (copy_from_user(&dsi_ssc, (void __user *)argp, sizeof(dsi_ssc))) {
  302. pr_debug("[MIPI_SET_SSC]: copy_from_user failed! line:%d\n",
  303. __LINE__);
  304. return -EFAULT;
  305. }
  306. pr_debug("Pmaster:set mipi ssc line:%d\n", __LINE__);
  307. Panel_Master_dsi_config_entry("PM_SSC", &dsi_ssc);
  308. return 0;
  309. }
  310. case LCM_GET_DSI_SSC:
  311. {
  312. uint32_t ssc = pParams->ssc_range;
  313. if (pParams->ssc_disable)
  314. ssc = 0;
  315. return put_user(ssc, (unsigned long *)argp);
  316. }
  317. case LCM_GET_DSI_LANE_NUM:
  318. {
  319. uint32_t lane_num = pParams->LANE_NUM;
  320. pr_debug("Panel Master=>LCM_GET_DSI_Lane_num=>dsi:%d\r\n", lane_num);
  321. return put_user(lane_num, (unsigned long *)argp);
  322. }
  323. case LCM_GET_DSI_TE:
  324. {
  325. int ret;
  326. ret = PanelMaster_get_TE_status(dsi_id);
  327. pr_debug("fbconfig=>LCM_GET_DSI_TE:%d\n", ret);
  328. return put_user(ret, (unsigned long *)argp);
  329. }
  330. case LCM_GET_DSI_TIMING:
  331. {
  332. uint32_t ret;
  333. MIPI_TIMING timing;
  334. if (copy_from_user(&timing, (void __user *)argp, sizeof(timing))) {
  335. pr_debug("[MIPI_GET_TIMING]: copy_from_user failed! line:%d\n",
  336. __LINE__);
  337. return -EFAULT;
  338. }
  339. ret = PanelMaster_get_dsi_timing(dsi_id, timing.type);
  340. pr_debug("fbconfig=>LCM_GET_DSI_TIMING:%d\n", ret);
  341. timing.value = ret;
  342. return copy_to_user(argp, &timing, sizeof(timing)) ? -EFAULT : 0;
  343. }
  344. case MIPI_SET_TIMING:
  345. {
  346. MIPI_TIMING timing;
  347. if (primary_display_is_sleepd())
  348. return -EFAULT;
  349. if (copy_from_user(&timing, (void __user *)argp, sizeof(timing))) {
  350. pr_debug("[MIPI_SET_TIMING]: copy_from_user failed! line:%d\n",
  351. __LINE__);
  352. return -EFAULT;
  353. }
  354. PanelMaster_DSI_set_timing(dsi_id, timing);
  355. return 0;
  356. }
  357. case FB_LAYER_GET_EN:
  358. {
  359. pr_debug("[FB_LAYER_GET_EN] not support any more\n");
  360. return 0;
  361. }
  362. case FB_LAYER_GET_INFO:
  363. {
  364. pr_debug("[FB_LAYER_GET_INFO] not support any more\n");
  365. return 0;
  366. }
  367. case FB_LAYER_DUMP:
  368. {
  369. pr_debug("[FB_LAYER_DUMP] not support any more\n");
  370. return 0;
  371. }
  372. case LCM_GET_ESD:
  373. {
  374. ESD_PARA esd_para;
  375. uint8_t *buffer;
  376. if (copy_from_user(&esd_para, (void __user *)arg, sizeof(esd_para))) {
  377. pr_debug("[LCM_GET_ESD]: copy_from_user failed! line:%d\n",
  378. __LINE__);
  379. return -EFAULT;
  380. }
  381. buffer = kzalloc(esd_para.para_num + 6, GFP_KERNEL);
  382. if (!buffer)
  383. return -ENOMEM;
  384. ret =
  385. fbconfig_get_esd_check_test(dsi_id, esd_para.addr, buffer,
  386. esd_para.para_num);
  387. if (ret < 0) {
  388. kfree(buffer);
  389. return -EFAULT;
  390. }
  391. ret = copy_to_user(esd_para.esd_ret_buffer, buffer, esd_para.para_num);
  392. kfree(buffer);
  393. return ret;
  394. }
  395. case TE_SET_ENABLE:
  396. {
  397. uint32_t te_enable = 0;
  398. if (get_user(te_enable, (unsigned long *)argp))
  399. return -EFAULT;
  400. return 0;
  401. }
  402. case DRIVER_IC_RESET:
  403. {
  404. Panel_Master_dsi_config_entry("DRIVER_IC_RESET", NULL);
  405. return 0;
  406. }
  407. case FB_GET_MISC:
  408. {
  409. struct misc_property misc = { 0 };
  410. if (pm->pLcm_params->lcm_if == LCM_INTERFACE_DSI_DUAL)
  411. misc.dual_port = 1;
  412. misc.overall_layer_num = TOTAL_OVL_LAYER_NUM;
  413. ret = copy_to_user(argp, &misc, sizeof(misc));
  414. return 0;
  415. }
  416. default:
  417. return ret;
  418. }
  419. }
  420. static int fbconfig_release(struct inode *inode, struct file *file)
  421. {
  422. PanelMaster_set_PM_enable(0);
  423. return 0;
  424. }
  425. /* compat-ioctl */
  426. #ifdef CONFIG_COMPAT
  427. #define COMPAT_GET_DSI_ID FBCONFIG_IOW(43, compat_uint_t)
  428. #define COMPAT_SET_DSI_ID FBCONFIG_IOW(44, compat_uint_t)
  429. #define COMPAT_LCM_GET_ID FBCONFIG_IOR(45, compat_uint_t)
  430. #define COMPAT_LCM_GET_ESD FBCONFIG_IOWR(46, compat_uint_t)
  431. #define COMPAT_DRIVER_IC_CONFIG FBCONFIG_IOR(47, compat_uint_t)
  432. #define COMPAT_DRIVER_IC_CONFIG_DONE FBCONFIG_IO(0)
  433. #define COMPAT_DRIVER_IC_RESET FBCONFIG_IOR(48, compat_uint_t)
  434. #define COMPAT_MIPI_SET_CLK FBCONFIG_IOW(51, compat_uint_t)
  435. #define COMPAT_MIPI_SET_LANE FBCONFIG_IOW(52, compat_uint_t)
  436. #define COMPAT_MIPI_SET_TIMING FBCONFIG_IOW(53, compat_uint_t)
  437. #define COMPAT_MIPI_SET_VM FBCONFIG_IOW(54, compat_uint_t)
  438. #define COMPAT_MIPI_SET_CC FBCONFIG_IOW(55, compat_uint_t)
  439. #define COMPAT_MIPI_SET_SSC FBCONFIG_IOW(56, compat_uint_t)
  440. #define COMPAT_MIPI_SET_CLK_V2 FBCONFIG_IOW(57, compat_uint_t)
  441. #define COMPAT_TE_SET_ENABLE FBCONFIG_IOW(61, compat_uint_t)
  442. #define COMPAT_FB_LAYER_DUMP FBCONFIG_IOW(62, compat_uint_t)
  443. #define COMPAT_FB_LAYER_GET_INFO FBCONFIG_IOW(63, compat_uint_t)
  444. #define COMPAT_FB_LAYER_GET_EN FBCONFIG_IOW(64, compat_uint_t)
  445. #define COMPAT_LCM_GET_ESD_RET FBCONFIG_IOR(65, compat_uint_t)
  446. #define COMPAT_LCM_GET_DSI_CONTINU FBCONFIG_IOR(71, compat_uint_t)
  447. #define COMPAT_LCM_GET_DSI_CLK FBCONFIG_IOR(72, compat_uint_t)
  448. #define COMPAT_LCM_GET_DSI_TIMING FBCONFIG_IOR(73, compat_uint_t)
  449. #define COMPAT_LCM_GET_DSI_LANE_NUM FBCONFIG_IOR(74, compat_uint_t)
  450. #define COMPAT_LCM_GET_DSI_TE FBCONFIG_IOR(75, compat_uint_t)
  451. #define COMPAT_LCM_GET_DSI_SSC FBCONFIG_IOR(76, compat_uint_t)
  452. #define COMPAT_LCM_GET_DSI_CLK_V2 FBCONFIG_IOR(77, compat_uint_t)
  453. #define COMPAT_LCM_TEST_DSI_CLK FBCONFIG_IOR(78, compat_uint_t)
  454. #define COMPAT_FB_GET_MISC FBCONFIG_IOR(80, compat_uint_t)
  455. static int compat_get_lcm_type_fb(struct compat_lcm_type_fb __user *data32,
  456. struct LCM_TYPE_FB __user *data)
  457. {
  458. compat_int_t i;
  459. int err;
  460. err = get_user(i, &data32->clock);
  461. err |= put_user(i, &data->clock);
  462. err |= get_user(i, &data32->lcm_type);
  463. err |= put_user(i, &data->lcm_type);
  464. return err;
  465. }
  466. static int compat_put_lcm_type_fb(struct compat_lcm_type_fb __user *data32,
  467. struct LCM_TYPE_FB __user *data)
  468. {
  469. compat_int_t i;
  470. int err;
  471. err = get_user(i, &data->clock);
  472. err |= put_user(i, &data32->clock);
  473. err |= get_user(i, &data->lcm_type);
  474. err |= put_user(i, &data32->lcm_type);
  475. return err;
  476. }
  477. static int compat_get_config_record(struct compat_config_record *data32,
  478. struct CONFIG_RECORD *data)
  479. {
  480. compat_int_t i;
  481. int err;
  482. int n = 0;
  483. err = get_user(i, &data32->ins_num);
  484. err |= put_user(i, &data->ins_num);
  485. err |= get_user(i, &data32->type);
  486. err |= put_user(i, &data->type);
  487. for (n = 0; n < MAX_INSTRUCTION; ++n) {
  488. err |= get_user(i, &data32->ins_array[n]);
  489. err |= put_user(i, &data->ins_array[n]);
  490. }
  491. return err;
  492. }
  493. static int compat_put_config_record(struct compat_config_record *data32,
  494. struct CONFIG_RECORD *data)
  495. {
  496. compat_int_t i;
  497. int err;
  498. int n = 0;
  499. err = get_user(i, &data->ins_num);
  500. err |= put_user(i, &data32->ins_num);
  501. err |= get_user(i, &data->type);
  502. err |= put_user(i, &data32->type);
  503. for (n = 0; n < MAX_INSTRUCTION; ++n) {
  504. err |= get_user(i, &data->ins_array[n]);
  505. err |= put_user(i, &data32->ins_array[n]);
  506. }
  507. return err;
  508. }
  509. static int compat_get_dsi_ret(struct compat_dsi_ret *data32,
  510. struct DSI_RET *data)
  511. {
  512. compat_int_t i;
  513. int err = 0;
  514. int n = 0;
  515. for (n = 0; n < NUM_OF_DSI; ++n) {
  516. err |= get_user(i, &data32->dsi[n]);
  517. err |= put_user(i, &data->dsi[n]);
  518. }
  519. return err;
  520. }
  521. static int compat_put_dsi_ret(struct compat_dsi_ret *data32,
  522. struct DSI_RET *data)
  523. {
  524. compat_int_t i;
  525. int err = 0;
  526. int n = 0;
  527. for (n = 0; n < NUM_OF_DSI; ++n) {
  528. err |= get_user(i, &data->dsi[n]);
  529. err |= put_user(i, &data32->dsi[n]);
  530. }
  531. return err;
  532. }
  533. static int compat_get_mipi_timing(struct compat_mipi_timing *data32,
  534. struct MIPI_TIMING *data)
  535. {
  536. compat_int_t i;
  537. compat_uint_t d;
  538. int err;
  539. err = get_user(i, &data32->type);
  540. err |= put_user(i, &data->type);
  541. err |= get_user(d, &data32->value);
  542. err |= put_user(d, &data->value);
  543. return err;
  544. }
  545. static int compat_put_mipi_timing(struct compat_mipi_timing *data32,
  546. struct MIPI_TIMING *data)
  547. {
  548. compat_int_t i;
  549. compat_uint_t d;
  550. int err;
  551. err = get_user(i, &data->type);
  552. err |= put_user(i, &data32->type);
  553. err |= get_user(d, &data->value);
  554. err |= put_user(d, &data32->value);
  555. return err;
  556. }
  557. static int compat_get_pm_layer_en(struct compat_pm_layer_en *data32,
  558. struct PM_LAYER_EN *data)
  559. {
  560. compat_int_t i;
  561. int err = 0;
  562. int n = 0;
  563. for (n = 0; n < TOTAL_OVL_LAYER_NUM; ++n) {
  564. err |= get_user(i, &data32->layer_en[n]);
  565. err |= put_user(i, &data->layer_en[n]);
  566. }
  567. return err;
  568. }
  569. static int compat_put_pm_layer_en(struct compat_pm_layer_en *data32,
  570. struct PM_LAYER_EN *data)
  571. {
  572. compat_int_t i;
  573. int err = 0;
  574. int n = 0;
  575. for (n = 0; n < TOTAL_OVL_LAYER_NUM; ++n) {
  576. err |= get_user(i, &data->layer_en[n]);
  577. err |= put_user(i, &data32->layer_en[n]);
  578. }
  579. return err;
  580. }
  581. static int compat_get_pm_layer_info(struct compat_pm_layer_info *data32,
  582. struct PM_LAYER_INFO *data)
  583. {
  584. compat_int_t i;
  585. compat_uint_t d;
  586. int err;
  587. err = get_user(i, &data32->index);
  588. err |= put_user(i, &data->index);
  589. err |= get_user(i, &data32->height);
  590. err |= put_user(i, &data->height);
  591. err |= get_user(i, &data32->width);
  592. err |= put_user(i, &data->width);
  593. err |= get_user(i, &data32->fmt);
  594. err |= put_user(i, &data->fmt);
  595. err |= get_user(d, &data32->layer_size);
  596. err |= put_user(d, &data->layer_size);
  597. return err;
  598. }
  599. static int compat_put_pm_layer_info(struct compat_pm_layer_info *data32,
  600. struct PM_LAYER_INFO *data)
  601. {
  602. compat_int_t i;
  603. compat_uint_t d;
  604. int err;
  605. err = get_user(i, &data->index);
  606. err |= put_user(i, &data32->index);
  607. err |= get_user(i, &data->height);
  608. err |= put_user(i, &data32->height);
  609. err |= get_user(i, &data->width);
  610. err |= put_user(i, &data32->width);
  611. err |= get_user(i, &data->fmt);
  612. err |= put_user(i, &data32->fmt);
  613. err |= get_user(d, &data->layer_size);
  614. err |= put_user(d, &data32->layer_size);
  615. return err;
  616. }
  617. static int compat_get_esd_para(struct compat_esd_para *data32,
  618. struct ESD_PARA *data)
  619. {
  620. compat_int_t i;
  621. compat_uint_t d;
  622. int err;
  623. err = get_user(i, &data32->addr);
  624. err |= put_user(i, &data->addr);
  625. err |= get_user(i, &data32->type);
  626. err |= put_user(i, &data->type);
  627. err |= get_user(i, &data32->para_num);
  628. err |= put_user(i, &data->para_num);
  629. err |= get_user(d, &data32->esd_ret_buffer);
  630. err |= put_user((unsigned char *)(unsigned long)d, &data->esd_ret_buffer);
  631. return err;
  632. }
  633. static int compat_put_esd_para(struct compat_esd_para *data32,
  634. struct ESD_PARA *data)
  635. {
  636. compat_int_t i;
  637. compat_uint_t d;
  638. int err;
  639. err = get_user(i, &data->addr);
  640. err |= put_user(i, &data32->addr);
  641. err |= get_user(i, &data->type);
  642. err |= put_user(i, &data32->type);
  643. err |= get_user(i, &data->para_num);
  644. err |= put_user(i, &data32->para_num);
  645. err |= get_user(d, (compat_uint_t *)&data->esd_ret_buffer);
  646. err |= put_user(d, &data32->esd_ret_buffer);
  647. return err;
  648. }
  649. static long compat_fbconfig_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  650. {
  651. long ret = 0;
  652. if (!file->f_op || !file->f_op->unlocked_ioctl)
  653. return -ENOTTY;
  654. switch (cmd) {
  655. case COMPAT_GET_DSI_ID:
  656. {
  657. compat_uint_t __user *data32;
  658. unsigned int __user *data;
  659. int err;
  660. compat_uint_t d;
  661. data32 = compat_ptr(arg);
  662. data = compat_alloc_user_space(sizeof(*data));
  663. if (NULL == data)
  664. return -EFAULT;
  665. err = get_user(d, data32);
  666. err |= put_user(d, data);
  667. if (err)
  668. return err;
  669. ret = file->f_op->unlocked_ioctl(file, GET_DSI_ID, (unsigned long)data);
  670. err |= get_user(d, data);
  671. err |= put_user(d, data32);
  672. return ret ? ret : err;
  673. }
  674. case COMPAT_SET_DSI_ID:
  675. {
  676. compat_uint_t __user *data32;
  677. unsigned int __user *data;
  678. int err;
  679. compat_uint_t d;
  680. data32 = compat_ptr(arg);
  681. data = compat_alloc_user_space(sizeof(*data));
  682. if (NULL == data)
  683. return -EFAULT;
  684. err = get_user(d, data32);
  685. err |= put_user(d, data);
  686. if (err)
  687. return err;
  688. ret = file->f_op->unlocked_ioctl(file, SET_DSI_ID, (unsigned long)data);
  689. err |= get_user(d, data);
  690. err |= put_user(d, data32);
  691. return ret ? ret : err;
  692. }
  693. case COMPAT_LCM_TEST_DSI_CLK:
  694. {
  695. struct compat_lcm_type_fb __user *data32;
  696. struct LCM_TYPE_FB __user *data;
  697. int err;
  698. data32 = compat_ptr(arg);
  699. data = compat_alloc_user_space(sizeof(*data));
  700. if (NULL == data)
  701. return -EFAULT;
  702. err = compat_get_lcm_type_fb(data32, data);
  703. if (err)
  704. return err;
  705. ret = file->f_op->unlocked_ioctl(file, LCM_TEST_DSI_CLK, (unsigned long)data);
  706. err = compat_put_lcm_type_fb(data32, data);
  707. return ret ? ret : err;
  708. }
  709. case COMPAT_LCM_GET_ID:
  710. {
  711. compat_uint_t __user *data32;
  712. unsigned int __user *data;
  713. int err;
  714. compat_uint_t d;
  715. data32 = compat_ptr(arg);
  716. data = compat_alloc_user_space(sizeof(*data));
  717. if (NULL == data)
  718. return -EFAULT;
  719. err = get_user(d, data32);
  720. err |= put_user(d, data);
  721. if (err)
  722. return err;
  723. ret = file->f_op->unlocked_ioctl(file, LCM_GET_ID, (unsigned long)data);
  724. err |= get_user(d, data);
  725. err |= put_user(d, data32);
  726. return err ? err : 0;
  727. }
  728. case COMPAT_DRIVER_IC_CONFIG:
  729. {
  730. struct compat_config_record __user *data32;
  731. struct CONFIG_RECORD __user *data;
  732. int err;
  733. data32 = compat_ptr(arg);
  734. data = compat_alloc_user_space(sizeof(*data));
  735. if (NULL == data)
  736. return -EFAULT;
  737. err = compat_get_config_record(data32, data);
  738. if (err)
  739. return err;
  740. ret = file->f_op->unlocked_ioctl(file, DRIVER_IC_CONFIG, (unsigned long)data);
  741. err = compat_put_config_record(data32, data);
  742. return ret ? ret : err;
  743. }
  744. case COMPAT_DRIVER_IC_CONFIG_DONE:
  745. {
  746. compat_uint_t __user *data32;
  747. unsigned int __user *data;
  748. int err;
  749. compat_uint_t d;
  750. data32 = compat_ptr(arg);
  751. data = compat_alloc_user_space(sizeof(*data));
  752. if (NULL == data)
  753. return -EFAULT;
  754. err = get_user(d, data32);
  755. err |= put_user(d, data);
  756. if (err)
  757. return err;
  758. ret = file->f_op->unlocked_ioctl(file, DRIVER_IC_CONFIG_DONE, (unsigned long)data);
  759. err |= get_user(d, data);
  760. err |= put_user(d, data32);
  761. return ret ? ret : err;
  762. }
  763. case COMPAT_MIPI_SET_CC:
  764. {
  765. compat_uint_t __user *data32;
  766. unsigned int __user *data;
  767. int err;
  768. compat_uint_t d;
  769. data32 = compat_ptr(arg);
  770. data = compat_alloc_user_space(sizeof(*data));
  771. if (NULL == data)
  772. return -EFAULT;
  773. err = get_user(d, data32);
  774. err |= put_user(d, data);
  775. if (err)
  776. return err;
  777. ret = file->f_op->unlocked_ioctl(file, MIPI_SET_CC, (unsigned long)data);
  778. err |= get_user(d, data);
  779. err |= put_user(d, data32);
  780. return ret ? ret : err;
  781. }
  782. case COMPAT_LCM_GET_DSI_CONTINU:
  783. {
  784. compat_uint_t __user *data32;
  785. unsigned int __user *data;
  786. int err;
  787. compat_uint_t d;
  788. data32 = compat_ptr(arg);
  789. data = compat_alloc_user_space(sizeof(*data));
  790. if (NULL == data)
  791. return -EFAULT;
  792. err = get_user(d, data32);
  793. err |= put_user(d, data);
  794. if (err)
  795. return err;
  796. ret = file->f_op->unlocked_ioctl(file, LCM_GET_DSI_CONTINU, (unsigned long)data);
  797. err |= get_user(d, data);
  798. err |= put_user(d, data32);
  799. return ret ? ret : err;
  800. }
  801. case COMPAT_MIPI_SET_CLK:
  802. {
  803. compat_uint_t __user *data32;
  804. unsigned int __user *data;
  805. int err;
  806. compat_uint_t d;
  807. data32 = compat_ptr(arg);
  808. data = compat_alloc_user_space(sizeof(*data));
  809. if (NULL == data)
  810. return -EFAULT;
  811. err = get_user(d, data32);
  812. err |= put_user(d, data);
  813. if (err)
  814. return err;
  815. ret = file->f_op->unlocked_ioctl(file, MIPI_SET_CLK, (unsigned long)data);
  816. err |= get_user(d, data);
  817. err |= put_user(d, data32);
  818. return ret ? ret : err;
  819. }
  820. case COMPAT_LCM_GET_DSI_CLK:
  821. {
  822. compat_uint_t __user *data32;
  823. unsigned int __user *data;
  824. int err;
  825. compat_uint_t d;
  826. data32 = compat_ptr(arg);
  827. data = compat_alloc_user_space(sizeof(*data));
  828. if (NULL == data)
  829. return -EFAULT;
  830. err = get_user(d, data32);
  831. err |= put_user(d, data);
  832. if (err)
  833. return err;
  834. ret = file->f_op->unlocked_ioctl(file, LCM_GET_DSI_CLK, (unsigned long)data);
  835. err |= get_user(d, data);
  836. err |= put_user(d, data32);
  837. return ret ? ret : err;
  838. }
  839. case COMPAT_MIPI_SET_SSC:
  840. {
  841. struct compat_dsi_ret *data32;
  842. struct DSI_RET __user *data;
  843. int err;
  844. data32 = compat_ptr(arg);
  845. data = compat_alloc_user_space(sizeof(*data));
  846. if (NULL == data)
  847. return -EFAULT;
  848. err = compat_get_dsi_ret(data32, data);
  849. if (err)
  850. return err;
  851. ret = file->f_op->unlocked_ioctl(file, MIPI_SET_SSC, (unsigned long)data);
  852. err = compat_put_dsi_ret(data32, data);
  853. return ret ? ret : err;
  854. }
  855. case COMPAT_LCM_GET_DSI_SSC:
  856. {
  857. compat_uint_t __user *data32;
  858. unsigned int __user *data;
  859. int err;
  860. compat_uint_t d;
  861. data32 = compat_ptr(arg);
  862. data = compat_alloc_user_space(sizeof(*data));
  863. if (NULL == data)
  864. return -EFAULT;
  865. err = get_user(d, data32);
  866. err |= put_user(d, data);
  867. if (err)
  868. return err;
  869. ret = file->f_op->unlocked_ioctl(file, LCM_GET_DSI_SSC, (unsigned long)data);
  870. err |= get_user(d, data);
  871. err |= put_user(d, data32);
  872. return ret ? ret : err;
  873. }
  874. case COMPAT_LCM_GET_DSI_LANE_NUM:
  875. {
  876. compat_uint_t __user *data32;
  877. unsigned int __user *data;
  878. int err;
  879. compat_uint_t d;
  880. data32 = compat_ptr(arg);
  881. data = compat_alloc_user_space(sizeof(*data));
  882. if (NULL == data)
  883. return -EFAULT;
  884. err = get_user(d, data32);
  885. err |= put_user(d, data);
  886. if (err)
  887. return err;
  888. ret = file->f_op->unlocked_ioctl(file, LCM_GET_DSI_LANE_NUM, (unsigned long)data);
  889. err |= get_user(d, data);
  890. err |= put_user(d, data32);
  891. return ret ? ret : err;
  892. }
  893. case COMPAT_LCM_GET_DSI_TE:
  894. {
  895. compat_uint_t __user *data32;
  896. unsigned int __user *data;
  897. int err;
  898. compat_int_t i;
  899. data32 = compat_ptr(arg);
  900. data = compat_alloc_user_space(sizeof(*data));
  901. if (NULL == data)
  902. return -EFAULT;
  903. err = get_user(i, data32);
  904. err |= put_user(i, data);
  905. if (err)
  906. return err;
  907. ret = file->f_op->unlocked_ioctl(file, LCM_GET_DSI_TE, (unsigned long)data);
  908. err |= get_user(i, data);
  909. err |= put_user(i, data32);
  910. return ret ? ret : err;
  911. }
  912. case COMPAT_LCM_GET_DSI_TIMING:
  913. {
  914. struct compat_mipi_timing *data32;
  915. struct MIPI_TIMING __user *data;
  916. int err;
  917. data32 = compat_ptr(arg);
  918. data = compat_alloc_user_space(sizeof(*data));
  919. if (NULL == data)
  920. return -EFAULT;
  921. err = compat_get_mipi_timing(data32, data);
  922. if (err)
  923. return err;
  924. ret = file->f_op->unlocked_ioctl(file, LCM_GET_DSI_TIMING, (unsigned long)data);
  925. err = compat_put_mipi_timing(data32, data);
  926. return ret ? ret : err;
  927. }
  928. case COMPAT_MIPI_SET_TIMING:
  929. {
  930. struct compat_mipi_timing *data32;
  931. struct MIPI_TIMING __user *data;
  932. int err;
  933. data32 = compat_ptr(arg);
  934. data = compat_alloc_user_space(sizeof(*data));
  935. if (NULL == data)
  936. return -EFAULT;
  937. err = compat_get_mipi_timing(data32, data);
  938. if (err)
  939. return err;
  940. ret = file->f_op->unlocked_ioctl(file, MIPI_SET_TIMING, (unsigned long)data);
  941. err = compat_put_mipi_timing(data32, data);
  942. return ret ? ret : err;
  943. }
  944. case COMPAT_FB_LAYER_GET_EN:
  945. {
  946. struct compat_pm_layer_en *data32;
  947. struct PM_LAYER_EN __user *data;
  948. int err;
  949. data32 = compat_ptr(arg);
  950. data = compat_alloc_user_space(sizeof(*data));
  951. if (NULL == data)
  952. return -EFAULT;
  953. err = compat_get_pm_layer_en(data32, data);
  954. if (err)
  955. return err;
  956. ret = file->f_op->unlocked_ioctl(file, FB_LAYER_GET_EN, (unsigned long)data);
  957. err = compat_put_pm_layer_en(data32, data);
  958. return ret ? ret : err;
  959. }
  960. case COMPAT_FB_LAYER_GET_INFO:
  961. {
  962. struct compat_pm_layer_info *data32;
  963. struct PM_LAYER_INFO __user *data;
  964. int err;
  965. data32 = compat_ptr(arg);
  966. data = compat_alloc_user_space(sizeof(*data));
  967. if (NULL == data)
  968. return -EFAULT;
  969. err = compat_get_pm_layer_info(data32, data);
  970. if (err)
  971. return err;
  972. ret = file->f_op->unlocked_ioctl(file, FB_LAYER_GET_INFO, (unsigned long)data);
  973. err = compat_put_pm_layer_info(data32, data);
  974. return ret ? ret : err;
  975. }
  976. case COMPAT_FB_LAYER_DUMP:
  977. {
  978. ret = file->f_op->unlocked_ioctl(file, FB_LAYER_DUMP, (unsigned long)arg);
  979. return ret;
  980. }
  981. case COMPAT_LCM_GET_ESD:
  982. {
  983. struct compat_esd_para *data32;
  984. struct ESD_PARA __user *data;
  985. int err;
  986. data32 = compat_ptr(arg);
  987. data = compat_alloc_user_space(sizeof(*data));
  988. if (NULL == data)
  989. return -EFAULT;
  990. err = compat_get_esd_para(data32, data);
  991. if (err)
  992. return err;
  993. ret = file->f_op->unlocked_ioctl(file, LCM_GET_ESD, (unsigned long)data);
  994. err = compat_put_esd_para(data32, data);
  995. return ret ? ret : err;
  996. }
  997. case COMPAT_TE_SET_ENABLE:
  998. {
  999. compat_uint_t __user *data32;
  1000. unsigned int __user *data;
  1001. int err;
  1002. compat_uint_t d;
  1003. data32 = compat_ptr(arg);
  1004. data = compat_alloc_user_space(sizeof(*data));
  1005. if (NULL == data)
  1006. return -EFAULT;
  1007. err = get_user(d, data32);
  1008. err |= put_user(d, data);
  1009. if (err)
  1010. return err;
  1011. ret = file->f_op->unlocked_ioctl(file, TE_SET_ENABLE, (unsigned long)data);
  1012. err |= get_user(d, data);
  1013. err |= put_user(d, data32);
  1014. return ret ? ret : err;
  1015. }
  1016. case COMPAT_DRIVER_IC_RESET:
  1017. {
  1018. compat_uint_t __user *data32;
  1019. unsigned int __user *data;
  1020. int err;
  1021. compat_uint_t d;
  1022. data32 = compat_ptr(arg);
  1023. data = compat_alloc_user_space(sizeof(*data));
  1024. if (NULL == data)
  1025. return -EFAULT;
  1026. err = get_user(d, data32);
  1027. err |= put_user(d, data);
  1028. if (err)
  1029. return err;
  1030. ret = file->f_op->unlocked_ioctl(file, DRIVER_IC_RESET, (unsigned long)data);
  1031. err |= get_user(d, data);
  1032. err |= put_user(d, data32);
  1033. return ret ? ret : err;
  1034. }
  1035. case COMPAT_FB_GET_MISC:
  1036. {
  1037. compat_uint_t __user *data32;
  1038. unsigned int __user *data;
  1039. int err;
  1040. compat_uint_t d;
  1041. data32 = compat_ptr(arg);
  1042. data = compat_alloc_user_space(sizeof(*data));
  1043. if (NULL == data)
  1044. return -EFAULT;
  1045. err = get_user(d, data32);
  1046. err |= put_user(d, data);
  1047. if (err)
  1048. return err;
  1049. ret = file->f_op->unlocked_ioctl(file, FB_GET_MISC, (unsigned long)data);
  1050. err |= get_user(d, data);
  1051. err |= put_user(d, data32);
  1052. return ret ? ret : err;
  1053. }
  1054. default:
  1055. return ret;
  1056. }
  1057. }
  1058. #endif
  1059. /* end CONFIG_COMPAT */
  1060. static const struct file_operations fbconfig_fops = {
  1061. .read = fbconfig_read,
  1062. .write = fbconfig_write,
  1063. .open = fbconfig_open,
  1064. .unlocked_ioctl = fbconfig_ioctl,
  1065. #ifdef CONFIG_COMPAT
  1066. .compat_ioctl = compat_fbconfig_ioctl,
  1067. #endif
  1068. .release = fbconfig_release,
  1069. };
  1070. void PanelMaster_Init(void)
  1071. {
  1072. ConfigPara_dbgfs = debugfs_create_file("fbconfig",
  1073. S_IFREG | S_IRUGO, NULL, (void *)0, &fbconfig_fops);
  1074. INIT_LIST_HEAD(&head_list.list);
  1075. }
  1076. void PanelMaster_Deinit(void)
  1077. {
  1078. debugfs_remove(ConfigPara_dbgfs);
  1079. }