cabc_tuning.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. /* Copyright (c) 2009-2011, Code Aurora Forum. 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. * You should have received a copy of the GNU General Public License
  13. * along with this program; if not, write to the Free Software
  14. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  15. * 02110-1301, USA.
  16. *
  17. */
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/errno.h>
  21. #include <linux/clk.h>
  22. #include <linux/mutex.h>
  23. #include <linux/poll.h>
  24. #include <linux/wait.h>
  25. #include <linux/fs.h>
  26. #include <linux/irq.h>
  27. #include <linux/mm.h>
  28. #include <linux/fb.h>
  29. #include <linux/ctype.h>
  30. #include <linux/miscdevice.h>
  31. #include <linux/dma-mapping.h>
  32. #include <linux/delay.h>
  33. #include <linux/device.h>
  34. #include <linux/fb.h>
  35. #include <linux/msm_mdp.h>
  36. #include <linux/ioctl.h>
  37. #include <linux/lcd.h>
  38. #include "mdss_dsi.h"
  39. #include "cabc_tuning.h"
  40. #include "cabc_tuning_data_mondrian.h"
  41. static char cabc_tune_data1[CABC_TUNE_FIRST_SIZE] = {0,};
  42. static char cabc_tune_data2[CABC_TUNE_SECOND_SIZE] = {0,};
  43. static char cabc_tune_data3[CABC_TUNE_THIRD_SIZE] = {0,};
  44. static char cabc_tune_data4[CABC_TUNE_FOURTH_SIZE] = {0,};
  45. static char cabc_select_data[CABC_TUNE_SELECT_SIZE] = {0,};
  46. static char tuning_file[128];
  47. static char cabc_tuning[200];
  48. static struct class *cabc_class;
  49. static struct device *tune_cabc_dev;
  50. static struct class *mdnie_class; /* Using for CABC Key String */
  51. static struct device *tune_mdnie_dev; /* Using for CABC Key String */
  52. static struct mdss_dsi_ctrl_pdata *cabc_master_dsi_ctrl;
  53. static struct mdss_dsi_ctrl_pdata *cabc_slave_dsi_ctrl;
  54. static struct dsi_cmd_desc cabc_tune_cmd[] = {
  55. {{DTYPE_GEN_LWRITE, 1, 0, 0, 0,
  56. sizeof(cabc_tune_data1)}, cabc_tune_data1},
  57. {{DTYPE_GEN_LWRITE, 1, 0, 0, 0,
  58. sizeof(cabc_tune_data2)}, cabc_tune_data2},
  59. {{DTYPE_GEN_LWRITE, 1, 0, 0, 0,
  60. sizeof(cabc_tune_data3)}, cabc_tune_data3},
  61. {{DTYPE_GEN_LWRITE, 1, 0, 0, 0,
  62. sizeof(cabc_tune_data4)}, cabc_tune_data4},
  63. {{DTYPE_DCS_WRITE1, 1, 0, 0, 0,
  64. sizeof(cabc_select_data)}, cabc_select_data},
  65. };
  66. static struct cabc_tun_type cabc_tun_state = {
  67. .cabc_enable = 0,
  68. .luxvalue = CABC_LUX_2,
  69. .auto_br = CABC_AUTO_BR_OFF,
  70. .mode = CABC_MODE_UI,
  71. .negative = CABC_NEGATIVE_OFF,
  72. };
  73. static void mdss_dsi_panel_cmds_send(struct mdss_dsi_ctrl_pdata *ctrl,
  74. struct dsi_panel_cmds *pcmds)
  75. {
  76. struct dcs_cmd_req cmdreq;
  77. memset(&cmdreq, 0, sizeof(cmdreq));
  78. cmdreq.cmds = pcmds->cmds;
  79. cmdreq.cmds_cnt = pcmds->cmd_cnt;
  80. cmdreq.flags = CMD_REQ_COMMIT;
  81. cmdreq.rlen = 0;
  82. cmdreq.cb = NULL;
  83. mdss_dsi_cmdlist_put(ctrl, &cmdreq);
  84. }
  85. static void mdss_dsi_cmds_send(struct mdss_dsi_ctrl_pdata *ctrl,
  86. struct dsi_cmd_desc *cmds, int cnt,int flag)
  87. {
  88. struct dcs_cmd_req cmdreq;
  89. memset(&cmdreq, 0, sizeof(cmdreq));
  90. if (flag & CMD_REQ_SINGLE_TX) {
  91. cmdreq.flags = CMD_REQ_SINGLE_TX | CMD_CLK_CTRL | CMD_REQ_COMMIT;
  92. }else
  93. cmdreq.flags = CMD_REQ_COMMIT | CMD_CLK_CTRL;
  94. cmdreq.cmds = cmds;
  95. cmdreq.cmds_cnt = cnt;
  96. cmdreq.rlen = 0;
  97. cmdreq.cb = NULL;
  98. mdss_dsi_cmdlist_put(ctrl, &cmdreq);
  99. }
  100. //#define CABC_TUN_DATA_DEBUG
  101. #ifdef CABC_TUN_DATA_DEBUG
  102. static void print_tun_data(void)
  103. {
  104. int i;
  105. DPRINT("\n");
  106. DPRINT("---- size1 : %d", PAYLOAD1.dchdr.dlen);
  107. for (i = 0; i < CABC_TUNE_FIRST_SIZE ; i++)
  108. DPRINT("0x%x ", PAYLOAD1.payload[i]);
  109. DPRINT("\n");
  110. DPRINT("---- size2 : %d", PAYLOAD2.dchdr.dlen);
  111. for (i = 0; i < CABC_TUNE_SECOND_SIZE ; i++)
  112. DPRINT("0x%x ", PAYLOAD2.payload[i]);
  113. DPRINT("\n");
  114. DPRINT("---- size3 : %d", PAYLOAD3.dchdr.dlen);
  115. for (i = 0; i < CABC_TUNE_THIRD_SIZE ; i++)
  116. DPRINT("0x%x ", PAYLOAD3.payload[i]);
  117. DPRINT("\n");
  118. DPRINT("---- size4 : %d", PAYLOAD4.dchdr.dlen);
  119. for (i = 0; i < CABC_TUNE_FOURTH_SIZE ; i++)
  120. DPRINT("0x%x ", PAYLOAD4.payload[i]);
  121. DPRINT("\n");
  122. DPRINT("---- size5 : %d", SELECT.dchdr.dlen);
  123. for (i = 0; i < CABC_TUNE_SELECT_SIZE ; i++)
  124. DPRINT("0x%x ", SELECT.payload[i]);
  125. DPRINT("\n");
  126. }
  127. #endif
  128. static void free_tun_cmd(void)
  129. {
  130. memset(cabc_tune_data1, 0, CABC_TUNE_FIRST_SIZE);
  131. memset(cabc_tune_data2, 0, CABC_TUNE_SECOND_SIZE);
  132. memset(cabc_tune_data3, 0, CABC_TUNE_THIRD_SIZE);
  133. memset(cabc_select_data, 0, CABC_TUNE_SELECT_SIZE);
  134. }
  135. void sending_tuning_cmd(void)
  136. {
  137. mutex_lock(&cabc_tun_state.cabc_mutex);
  138. #ifdef CABC_TUN_DATA_DEBUG
  139. print_tun_data();
  140. #else
  141. DPRINT("Send CABC tuning cmd!!\n");
  142. #endif
  143. mdss_dsi_cmds_send(cabc_slave_dsi_ctrl, cabc_tune_cmd,
  144. ARRAY_SIZE(cabc_tune_cmd),0);
  145. mdss_dsi_cmds_send(cabc_master_dsi_ctrl, cabc_tune_cmd,
  146. ARRAY_SIZE(cabc_tune_cmd),0);
  147. mutex_unlock(&cabc_tun_state.cabc_mutex);
  148. }
  149. void CABC_Set_Mode(void)
  150. {
  151. if (!cabc_tun_state.cabc_enable) {
  152. DPRINT("[ERROR] CABC engine is OFF.\n");
  153. return;
  154. }
  155. if (!get_panel_power_state()) {
  156. pr_info("%s : get_panel_power_state off", __func__);
  157. return;
  158. }
  159. DPRINT("CABC_Set_Mode start , mode(%d), negative(%d), lux(%d)\n",
  160. cabc_tun_state.mode, cabc_tun_state.negative,
  161. cabc_tun_state.luxvalue);
  162. switch (cabc_tun_state.mode) {
  163. case CABC_MODE_UI:
  164. DPRINT(" = UI MODE =\n");
  165. INPUT_PAYLOAD1(CABC_NORMAL_1);
  166. INPUT_PAYLOAD2(CABC_NORMAL_2);
  167. INPUT_PAYLOAD3(CABC_NORMAL_3);
  168. break;
  169. case CABC_MODE_VIDEO:
  170. DPRINT(" = VIDEO MODE =\n");
  171. INPUT_PAYLOAD1(CABC_NORMAL_1);
  172. INPUT_PAYLOAD2(CABC_NORMAL_2);
  173. INPUT_PAYLOAD3(CABC_NORMAL_3);
  174. break;
  175. default:
  176. DPRINT("[%s] no option for mode (%d)\n", __func__,
  177. cabc_tun_state.mode);
  178. return;
  179. }
  180. switch (cabc_tun_state.negative) {
  181. case CABC_NEGATIVE_OFF:
  182. DPRINT(" = Negative Disabled =\n");
  183. INPUT_PAYLOAD4(CABC_NORMAL_4);
  184. break;
  185. case CABC_NEGATIVE_ON:
  186. DPRINT(" = Negative Enabled =\n");
  187. INPUT_PAYLOAD4(CABC_NEGATIVE_4);
  188. break;
  189. default:
  190. DPRINT("[%s] no option for Negative (%d)\n", __func__,
  191. cabc_tun_state.negative);
  192. return;
  193. }
  194. if(cabc_tun_state.auto_br) {
  195. DPRINT(" = Auto Br Enabled =\n");
  196. switch (cabc_tun_state.luxvalue) {
  197. case CABC_LUX_0:
  198. DPRINT(" = LUX 0 ~ 150 =\n");
  199. INPUT_SELECT(CABC_SELECT_2);
  200. break;
  201. case CABC_LUX_1:
  202. DPRINT(" = LUX 150 ~ 5000 =\n");
  203. if(cabc_tun_state.mode == CABC_MODE_VIDEO)
  204. INPUT_SELECT(CABC_SELECT_2);
  205. else
  206. INPUT_SELECT(CABC_SELECT_1);
  207. break;
  208. case CABC_LUX_2:
  209. DPRINT(" = LUX 5000 ~ =\n");
  210. INPUT_SELECT(CABC_SELECT_0);
  211. break;
  212. default:
  213. DPRINT("[%s] no option (%d)\n", __func__,
  214. cabc_tun_state.mode);
  215. INPUT_SELECT(CABC_SELECT_0);
  216. return;
  217. }
  218. } else {
  219. DPRINT(" = Auto Br Disabled =\n");
  220. INPUT_SELECT(CABC_SELECT_0);
  221. }
  222. sending_tuning_cmd();
  223. free_tun_cmd();
  224. DPRINT("CABC_Set_Mode end , mode(%d), negative(%d), lux(%d)\n",
  225. cabc_tun_state.mode, cabc_tun_state.negative,
  226. cabc_tun_state.luxvalue);
  227. }
  228. static ssize_t show_auto_br(struct device *dev,
  229. struct device_attribute *dev_attr, char *buf)
  230. {
  231. return sprintf(buf, "%d\n", cabc_tun_state.auto_br);
  232. }
  233. static ssize_t store_auto_br(struct device *dev,
  234. struct device_attribute *dev_attr,
  235. const char *buf, size_t count)
  236. {
  237. int ret;
  238. unsigned int value;
  239. ret = kstrtouint(buf, 10, &value);
  240. if (ret)
  241. return ret;
  242. if (value >= CABC_AUTO_BR_MAX) {
  243. pr_err("Undefied CABC auto br value : %d\n", value);
  244. return count;
  245. }
  246. if (value != cabc_tun_state.auto_br) {
  247. cabc_tun_state.auto_br = value;
  248. CABC_Set_Mode();
  249. }
  250. return count;
  251. }
  252. static DEVICE_ATTR(auto_br, 0664, show_auto_br, store_auto_br);
  253. static unsigned int lux_to_value(unsigned int input_lux)
  254. {
  255. if(input_lux <= 150)
  256. return 0;
  257. else if (input_lux <= 5000)
  258. return 1;
  259. else
  260. return 2;
  261. }
  262. void update_lux(unsigned int input_lux)
  263. {
  264. unsigned int value;
  265. value = lux_to_value(input_lux);
  266. pr_info("%s : Input Lux=%d Lux Value=%d\n", __func__, input_lux, value);
  267. if (value >= CABC_LUX_MAX) {
  268. pr_err("Undefied CABC lux value : %d\n\n", value);
  269. return;
  270. }
  271. if (value != cabc_tun_state.luxvalue) {
  272. cabc_tun_state.luxvalue = value;
  273. CABC_Set_Mode();
  274. }
  275. }
  276. static ssize_t show_mode(struct device *dev,
  277. struct device_attribute *dev_attr, char *buf)
  278. {
  279. return 0;
  280. }
  281. static ssize_t store_mode(struct device *dev,
  282. struct device_attribute *dev_attr,
  283. const char *buf, size_t count)
  284. {
  285. int ret;
  286. unsigned int value;
  287. ret = kstrtouint(buf, 10, &value);
  288. if (ret)
  289. return ret;
  290. if (value >= CABC_MODE_MAX) {
  291. pr_err("Undefied CABC MODE value : %d\n\n", value);
  292. return count;
  293. }
  294. if (value != cabc_tun_state.mode) {
  295. cabc_tun_state.mode = value;
  296. CABC_Set_Mode();
  297. }
  298. return count;
  299. }
  300. static DEVICE_ATTR(mode, 0664, show_mode, store_mode);
  301. static ssize_t store_lux(struct device *dev,
  302. struct device_attribute *dev_attr,
  303. const char *buf, size_t count)
  304. {
  305. return count;
  306. }
  307. static DEVICE_ATTR(lux, 0664, NULL, store_lux);
  308. static ssize_t accessibility_show(struct device *dev,
  309. struct device_attribute *attr,
  310. char *buf)
  311. {
  312. DPRINT("%s %s\n", __func__, cabc_tun_state.negative ?
  313. "NEGATIVE" : "ACCESSIBILITY_OFF");
  314. return snprintf(buf, 256, "%s %s\n", __func__, cabc_tun_state.negative ?
  315. "NEGATIVE" : "ACCESSIBILITY_OFF");
  316. }
  317. static ssize_t accessibility_store(struct device *dev,
  318. struct device_attribute *attr,
  319. const char *buf, size_t size)
  320. {
  321. int cmd_value;
  322. sscanf(buf, "%d", &cmd_value);
  323. switch (cmd_value) {
  324. case ACCESSIBILITY_OFF :
  325. cabc_tun_state.negative = CABC_NEGATIVE_OFF;
  326. break;
  327. case NEGATIVE :
  328. cabc_tun_state.negative = CABC_NEGATIVE_ON;
  329. break;
  330. default :
  331. pr_info("%s Undefined Command (%d)", __func__, cmd_value);
  332. return size;
  333. }
  334. pr_info("%s cmd_value : %d size : %d", __func__, cmd_value, size);
  335. CABC_Set_Mode();
  336. return size;
  337. }
  338. static DEVICE_ATTR(accessibility, 0664, accessibility_show,
  339. accessibility_store);
  340. /* Using for CABC Key String */
  341. static ssize_t show_cabc(struct device *dev,
  342. struct device_attribute *dev_attr, char *buf)
  343. {
  344. return 0;
  345. }
  346. /* Using for CABC Key String */
  347. static ssize_t store_cabc(struct device *dev,
  348. struct device_attribute *dev_attr,
  349. const char *buf, size_t count)
  350. {
  351. int ret;
  352. unsigned int value;
  353. ret = kstrtouint(buf, 10, &value);
  354. if (ret)
  355. return ret;
  356. if (!get_panel_power_state()) {
  357. pr_info("%s : Panel is off state", __func__);
  358. return count;
  359. }
  360. if (value == CABC_OFF) {
  361. cabc_tun_state.auto_br = CABC_AUTO_BR_OFF;
  362. } else if (value == CABC_ON) {
  363. cabc_tun_state.auto_br = CABC_AUTO_BR_ON;
  364. cabc_tun_state.luxvalue = CABC_LUX_1;
  365. } else {
  366. pr_err("Undefied CABC On/Off value : %d\n\n", value);
  367. return count;
  368. }
  369. CABC_Set_Mode();
  370. return count;
  371. }
  372. static DEVICE_ATTR(cabc, 0664, show_cabc, store_cabc);
  373. static char char_to_dec(char data1, char data2)
  374. {
  375. char dec;
  376. dec = 0;
  377. if (data1 >= 'a') {
  378. data1 -= 'a';
  379. data1 += 10;
  380. } else if (data1 >= 'A') {
  381. data1 -= 'A';
  382. data1 += 10;
  383. } else
  384. data1 -= '0';
  385. dec = data1 << 4;
  386. if (data2 >= 'a') {
  387. data2 -= 'a';
  388. data2 += 10;
  389. } else if (data2 >= 'A') {
  390. data2 -= 'A';
  391. data2 += 10;
  392. } else
  393. data2 -= '0';
  394. dec |= data2;
  395. return dec;
  396. }
  397. static void sending_tune_cmd(char *src, int len)
  398. {
  399. int data_pos;
  400. int cmd_step = 0;
  401. int cmd_pos = 0;
  402. if (!get_panel_power_state()) {
  403. pr_info("%s : Panel is off state", __func__);
  404. return;
  405. }
  406. pr_info(" %s : len = %d\n", __func__, len);
  407. for (data_pos = 0; data_pos < len;) {
  408. if (*(src + data_pos) == '0') {
  409. if (*(src + data_pos + 1) == 'x') {
  410. if (!cmd_step) {
  411. cabc_tuning[cmd_pos] =
  412. char_to_dec(*(src + data_pos + 2),
  413. *(src + data_pos + 3));
  414. }
  415. data_pos += 3;
  416. cmd_pos++;
  417. } else
  418. data_pos++;
  419. } else {
  420. data_pos++;
  421. }
  422. }
  423. pr_info(" =================== START ==================\n");
  424. for (data_pos = 0; data_pos <cmd_pos; data_pos++)
  425. printk(KERN_INFO "0x%x ", cabc_tuning[data_pos]);
  426. pr_info(" =================== END ==================\n");
  427. }
  428. static void load_tuning_file(char *filename)
  429. {
  430. struct file *filp;
  431. char *dp;
  432. long l;
  433. loff_t pos;
  434. int ret;
  435. mm_segment_t fs;
  436. pr_info("%s called loading file name : [%s]\n", __func__,
  437. filename);
  438. fs = get_fs();
  439. set_fs(get_ds());
  440. filp = filp_open(filename, O_RDONLY, 0);
  441. if (IS_ERR(filp)) {
  442. printk(KERN_ERR "%s File open failed\n", __func__);
  443. goto err;
  444. }
  445. l = filp->f_path.dentry->d_inode->i_size;
  446. pr_info("%s Loading File Size : %ld(bytes)", __func__, l);
  447. dp = kmalloc(l + 10, GFP_KERNEL);
  448. if (dp == NULL) {
  449. pr_info("Can't not alloc memory for tuning file load\n");
  450. filp_close(filp, current->files);
  451. goto err;
  452. }
  453. pos = 0;
  454. memset(dp, 0, l);
  455. pr_info("%s before vfs_read()\n", __func__);
  456. ret = vfs_read(filp, (char __user *)dp, l, &pos);
  457. pr_info("%s after vfs_read()\n", __func__);
  458. if (ret != l) {
  459. pr_info("vfs_read() filed ret : %d\n", ret);
  460. kfree(dp);
  461. filp_close(filp, current->files);
  462. goto err;
  463. }
  464. filp_close(filp, current->files);
  465. set_fs(fs);
  466. sending_tune_cmd(dp, l);
  467. kfree(dp);
  468. return;
  469. err:
  470. set_fs(fs);
  471. }
  472. static ssize_t ce_tuning_show(struct device *dev,
  473. struct device_attribute *attr, char *buf) {
  474. int ret = 0;
  475. ret = snprintf(buf, 128, "tuning name : %s\n", tuning_file);
  476. return ret;
  477. }
  478. static ssize_t ce_tuning_store(struct device *dev,
  479. struct device_attribute *attr, const char *buf, size_t size) {
  480. char *pt;
  481. int a;
  482. if (!get_panel_power_state()) {
  483. pr_info("%s : Panel is off state", __func__);
  484. return size;
  485. }
  486. if (sysfs_streq(buf, "1")) {
  487. pr_info(" %s : ce enable\n", __func__);
  488. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->ce_on_cmds);
  489. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->ce_on_cmds);
  490. return size;
  491. } else if (sysfs_streq(buf, "0")) {
  492. pr_info(" %s : ce disable\n", __func__);
  493. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->ce_off_cmds);
  494. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->ce_off_cmds);
  495. return size;
  496. }
  497. /* echo "tuning file" */
  498. memset(tuning_file, 0, sizeof(tuning_file));
  499. snprintf(tuning_file, MAX_FILE_NAME, "%s%s", TUNING_FILE_PATH, buf);
  500. pt = tuning_file;
  501. while (*pt) {
  502. if (*pt == '\r' || *pt == '\n') {
  503. *pt = 0;
  504. break;
  505. }
  506. pt++;
  507. }
  508. pr_info("%s:%s\n", __func__, tuning_file);
  509. load_tuning_file(tuning_file);
  510. for (a = 0; a < 33; a++) {
  511. printk(KERN_INFO "0x%x = 0x%x ",
  512. cabc_master_dsi_ctrl->ce_on_cmds.cmds[0].payload[a], cabc_tuning[a]);
  513. cabc_master_dsi_ctrl->ce_on_cmds.cmds[0].payload[a] = cabc_tuning[a];
  514. }
  515. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->ce_on_cmds);
  516. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->ce_on_cmds);
  517. return size;
  518. }
  519. static DEVICE_ATTR(cetuning, 0664, ce_tuning_show, ce_tuning_store);
  520. static ssize_t cabc_tuning_show(struct device *dev,
  521. struct device_attribute *attr, char *buf) {
  522. int ret = 0;
  523. ret = snprintf(buf, 128, "tuning name : %s\n", tuning_file);
  524. return ret;
  525. }
  526. static ssize_t cabc_tuning_store(struct device *dev,
  527. struct device_attribute *attr, const char *buf, size_t size) {
  528. char *pt;
  529. int a, b;
  530. if (!get_panel_power_state()) {
  531. pr_info("%s : Panel is off state", __func__);
  532. return size;
  533. }
  534. if (sysfs_streq(buf, "1")) {
  535. cabc_master_dsi_ctrl->cabc_on_cmds.cmds[0].payload[1] = 0x01;
  536. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->cabc_on_cmds);
  537. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->cabc_on_cmds);
  538. return size;
  539. } else if (sysfs_streq(buf, "80")) {
  540. cabc_master_dsi_ctrl->cabc_on_cmds.cmds[0].payload[1] = 0x50;
  541. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->cabc_on_cmds);
  542. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->cabc_on_cmds);
  543. return size;
  544. } else if (sysfs_streq(buf, "81")) {
  545. cabc_master_dsi_ctrl->cabc_on_cmds.cmds[0].payload[1] = 0x51;
  546. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->cabc_on_cmds);
  547. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->cabc_on_cmds);
  548. return size;
  549. } else if (sysfs_streq(buf, "5")) {
  550. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->cabc_off_cmds);
  551. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->cabc_off_cmds);
  552. return size;
  553. }
  554. /* echo "tuning file" */
  555. memset(tuning_file, 0, sizeof(tuning_file));
  556. snprintf(tuning_file, MAX_FILE_NAME, "%s%s", TUNING_FILE_PATH, buf);
  557. pt = tuning_file;
  558. while (*pt) {
  559. if (*pt == '\r' || *pt == '\n') {
  560. *pt = 0;
  561. break;
  562. }
  563. pt++;
  564. }
  565. pr_info("%s:%s\n", __func__, tuning_file);
  566. load_tuning_file(tuning_file);
  567. for (b = 0; b < 3; b++) {
  568. for (a = 0; a < 7; a++) {
  569. printk(KERN_INFO "0x%x = 0x%x ", cabc_master_dsi_ctrl->cabc_tune_cmds.cmds[b].payload[a],
  570. cabc_tuning[a + (b*7)]);
  571. cabc_master_dsi_ctrl->cabc_tune_cmds.cmds[b].payload[a] = cabc_tuning[a + (b*7)];
  572. }
  573. }
  574. for (a = 0; a < 22; a++) {
  575. printk(KERN_INFO "0x%x = 0x%x ", cabc_master_dsi_ctrl->cabc_tune_cmds.cmds[3].payload[a],
  576. cabc_tuning[21 + a]);
  577. cabc_master_dsi_ctrl->cabc_tune_cmds.cmds[3].payload[a] = cabc_tuning[21 + a];
  578. }
  579. for (b = 0; b < 3; b++) {
  580. for (a = 0; a < 4; a++) {
  581. cabc_master_dsi_ctrl->cabc_tune_cmds.cmds[b+4].payload[a] = cabc_tuning[39 + a + (b*4)];
  582. printk(KERN_INFO "0x%x = 0x%x ", cabc_master_dsi_ctrl->cabc_tune_cmds.cmds[b+4].payload[a],
  583. cabc_tuning[39 + a + (b*4)]);
  584. }
  585. }
  586. mdss_dsi_panel_cmds_send(cabc_slave_dsi_ctrl, &cabc_slave_dsi_ctrl->cabc_tune_cmds);
  587. mdss_dsi_panel_cmds_send(cabc_master_dsi_ctrl, &cabc_master_dsi_ctrl->cabc_tune_cmds);
  588. return size;
  589. }
  590. static DEVICE_ATTR(cabctuning, 0664, cabc_tuning_show, cabc_tuning_store);
  591. void cabc_tuning_init(struct mdss_dsi_ctrl_pdata *dsi_pdata)
  592. {
  593. pr_info("%s : dsi dest = %d\n", __func__,
  594. dsi_pdata->panel_data.panel_info.pdest);
  595. if(dsi_pdata->panel_data.panel_info.pdest == MASTER_DSI_PDEST) {
  596. pr_debug("%s : Master DSI Ctrl Copy \n", __func__);
  597. cabc_master_dsi_ctrl = dsi_pdata;
  598. } else {
  599. pr_debug("%s : Slave DSI Ctrl Copy \n", __func__);
  600. cabc_slave_dsi_ctrl = dsi_pdata;
  601. }
  602. if (!cabc_tun_state.cabc_enable) {
  603. pr_info("%s : First Init \n", __func__);
  604. mutex_init(&cabc_tun_state.cabc_mutex);
  605. cabc_class = class_create(THIS_MODULE, "tcon");
  606. if (IS_ERR(cabc_class))
  607. pr_err("Failed to create class(cabc)!\n");
  608. /* Using for CABC Key String */
  609. mdnie_class = class_create(THIS_MODULE, "mdnie");
  610. if (IS_ERR(mdnie_class))
  611. pr_err("Failed to create class(mdnie)!\n");
  612. tune_cabc_dev = device_create(cabc_class, NULL, 0, NULL,
  613. "tcon");
  614. if (IS_ERR(tune_cabc_dev))
  615. pr_err("Failed to create device(cabc)!\n");
  616. /* Using for CABC Key String */
  617. tune_mdnie_dev = device_create(mdnie_class, NULL, 0, NULL,
  618. "mdnie");
  619. if (IS_ERR(tune_mdnie_dev))
  620. pr_err("Failed to create device(mdnie)!\n");
  621. if (device_create_file
  622. (tune_cabc_dev, &dev_attr_auto_br) < 0)
  623. pr_err("Failed to create device file(%s)!\n",
  624. dev_attr_auto_br.attr.name);
  625. if (device_create_file
  626. (tune_cabc_dev, &dev_attr_lux) < 0)
  627. pr_err("Failed to create device file(%s)!\n",
  628. dev_attr_lux.attr.name);
  629. if (device_create_file
  630. (tune_cabc_dev, &dev_attr_mode) < 0)
  631. pr_err("Failed to create device file(%s)!\n",
  632. dev_attr_mode.attr.name);
  633. if (device_create_file
  634. (tune_cabc_dev,
  635. &dev_attr_cetuning) < 0)
  636. pr_err("Failed to create device file(%s)!\n",
  637. dev_attr_cetuning.attr.name);
  638. if (device_create_file
  639. (tune_cabc_dev, &dev_attr_cabctuning) < 0)
  640. pr_err("Failed to create device file(%s)!\n",
  641. dev_attr_cabctuning.attr.name);
  642. /* Using for CABC Key String */
  643. if (device_create_file
  644. (tune_mdnie_dev, &dev_attr_cabc) < 0)
  645. pr_err("Failed to create device file(%s)!\n",
  646. dev_attr_cabc.attr.name);
  647. if (device_create_file
  648. (tune_mdnie_dev, &dev_attr_accessibility) < 0)
  649. pr_err("Failed to create device file(%s)!\n",
  650. dev_attr_cabc.attr.name);
  651. cabc_tun_state.cabc_enable=1;
  652. }
  653. }