2 * Copyright (C) 2010,Imagis Technology Co. Ltd. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <linux/i2c.h>
17 #include <linux/delay.h>
18 #include <linux/slab.h>
19 #include <linux/firmware.h>
20 #include <linux/stat.h>
21 #include <asm/unaligned.h>
22 #include <linux/uaccess.h>
23 #include <linux/fcntl.h>
24 #include <linux/file.h>
26 #include <linux/err.h>
28 #include <linux/i2c/ist30xxc.h>
29 #include "ist30xxc_update.h"
30 #include "ist30xxc_tracking.h"
32 #if IST30XX_INTERNAL_BIN
33 #if defined(CONFIG_SEC_NOVEL_PROJECT)
34 #include "ist3026c_novel_fw_BOE.h"
35 #include "ist3026c_novel_fw_CNI.h"
37 static unsigned char ist30xxc_fw[] = {0};
39 #endif // IST30XX_INTERNAL_BIN
41 #define TAGS_PARSE_OK (0)
44 int ist30xx_isp_read_burst(struct i2c_client *client, u32 addr,
49 u16 max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN;
52 for (i = 0; i < len; i += max_len) {
53 if (remain_len < max_len) max_len = remain_len;
54 ret = ist30xx_read_buf(client, addr, buf32, max_len);
56 tsp_err("Burst fail, addr: %x\n", __func__, addr);
61 remain_len -= max_len;
67 int ist30xx_isp_write_burst(struct i2c_client *client, u32 addr,
72 u16 max_len = I2C_MAX_WRITE_SIZE / IST30XX_DATA_LEN;
75 for (i = 0; i < len; i += max_len) {
76 if (remain_len < max_len) max_len = remain_len;
77 ret = ist30xx_write_buf(client, addr, buf32, max_len);
79 tsp_err("Burst fail, addr: %x\n", addr);
84 remain_len -= max_len;
90 #define IST30XX_ISP_READ_TOTAL_S (0x01)
91 #define IST30XX_ISP_READ_TOTAL_B (0x11)
92 #define IST30XX_ISP_READ_MAIN_S (0x02)
93 #define IST30XX_ISP_READ_MAIN_B (0x12)
94 #define IST30XX_ISP_READ_INFO_S (0x03)
95 #define IST30XX_ISP_READ_INFO_B (0x13)
96 #define IST30XX_ISP_PROG_TOTAL_S (0x04)
97 #define IST30XX_ISP_PROG_TOTAL_B (0x14)
98 #define IST30XX_ISP_PROG_MAIN_S (0x05)
99 #define IST30XX_ISP_PROG_MAIN_B (0x15)
100 #define IST30XX_ISP_PROG_INFO_S (0x06)
101 #define IST30XX_ISP_PROG_INFO_B (0x16)
102 #define IST30XX_ISP_ERASE_BLOCK (0x07)
103 #define IST30XX_ISP_ERASE_SECTOR (0x08)
104 #define IST30XX_ISP_ERASE_PAGE (0x09)
105 #define IST30XX_ISP_ERASE_INFO (0x0A)
106 #define IST30XX_ISP_READ_TOTAL_CRC (0x1B)
107 #define IST30XX_ISP_READ_MAIN_CRC (0x1C)
108 #define IST30XX_ISP_READ_INFO_CRC (0x1D)
109 int ist30xxc_isp_enable(struct i2c_client *client, bool enable)
114 ret = ist30xx_write_cmd(client, IST30XX_FLASH_ISPEN, 0xDE01);
118 #if (IMAGIS_TSP_IC < IMAGIS_IST3038C)
119 ret = ist30xx_write_cmd(client, IST30XX_FLASH_MODE, 0x4100);
123 ret = ist30xx_write_cmd(client, IST30XX_FLASH_TEST_MODE1, 0x38);
128 ret = ist30xx_write_cmd(client, IST30XX_FLASH_ISPEN, 0x2);
138 int ist30xxc_isp_mode(struct i2c_client *client, int mode)
144 case IST30XX_ISP_READ_TOTAL_S:
147 case IST30XX_ISP_READ_TOTAL_B:
148 case IST30XX_ISP_READ_TOTAL_CRC:
151 case IST30XX_ISP_READ_MAIN_S:
154 case IST30XX_ISP_READ_MAIN_B:
155 case IST30XX_ISP_READ_MAIN_CRC:
158 case IST30XX_ISP_READ_INFO_S:
161 case IST30XX_ISP_READ_INFO_B:
162 case IST30XX_ISP_READ_INFO_CRC:
165 case IST30XX_ISP_PROG_TOTAL_S:
168 case IST30XX_ISP_PROG_TOTAL_B:
171 case IST30XX_ISP_PROG_MAIN_S:
174 case IST30XX_ISP_PROG_MAIN_B:
177 case IST30XX_ISP_PROG_INFO_S:
180 case IST30XX_ISP_PROG_INFO_B:
183 case IST30XX_ISP_ERASE_BLOCK:
186 case IST30XX_ISP_ERASE_SECTOR:
189 case IST30XX_ISP_ERASE_PAGE:
192 case IST30XX_ISP_ERASE_INFO:
196 tsp_err("ISP fail, unknown mode\n");
200 #if (IMAGIS_TSP_IC > IMAGIS_IST3032C)
204 ret = ist30xx_write_cmd(client, IST30XX_FLASH_MODE, val);
206 tsp_err("ISP fail, IST30XX_FLASH_MODE\n");
213 int ist30xxc_isp_erase(struct i2c_client *client, int mode, u32 index)
217 tsp_info("%s\n", __func__);
219 ret = ist30xxc_isp_mode(client, mode);
223 ret = ist30xx_write_cmd(client, IST30XX_FLASH_DIN, index);
225 tsp_err("ISP fail, IST30XX_FLASH_DIN\n");
229 msleep(50); // Flash erase time : Mininum 40msec
235 int ist30xxc_isp_program(struct i2c_client *client, u32 addr, int mode,
236 const u32 *buf32, int len)
240 tsp_info("%s\n", __func__);
242 ret = ist30xxc_isp_mode(client, mode);
246 ret = ist30xx_write_cmd(client, IST30XX_FLASH_ADDR, addr);
248 tsp_err("ISP fail, IST30XX_FLASH_ADDR\n");
253 ret = ist30xx_isp_write_burst(client,
254 IST30XX_FLASH_DIN, (u32 *)buf32, len);
256 ret = ist30xx_write_buf(client, IST30XX_FLASH_DIN, (u32 *)buf32, len);
259 tsp_err("ISP fail, IST30XX_FLASH_DIN\n");
266 int ist30xxc_isp_read(struct i2c_client *client, u32 addr, int mode,
271 /* IST30xxB ISP read mode */
272 ret = ist30xxc_isp_mode(client, mode);
276 ret = ist30xx_write_cmd(client, IST30XX_FLASH_ADDR, addr);
278 tsp_err("ISP fail, IST30XX_FLASH_ADDR\n");
283 ret = ist30xx_isp_read_burst(client, IST30XX_FLASH_DOUT, buf32, len);
285 ret = ist30xx_read_buf(client, IST30XX_FLASH_DOUT, buf32, len);
288 tsp_err("ISP fail, IST30XX_FLASH_DOUT\n");
295 int ist30xxc_cmd_read_chksum(struct i2c_client *client, int mode,
296 u32 start_addr, u32 end_addr, u32 *chksum)
299 u32 val = (1 << 28) | (1 << 25) | (1 << 24) | (1 << 20) | (1 << 16);
301 val |= (end_addr / IST30XX_ADDR_LEN) - 1;
303 ret = ist30xxc_isp_mode(client, mode);
307 ret = ist30xx_write_cmd(client, IST30XX_FLASH_ADDR, start_addr);
309 tsp_err("ISP fail, IST30XX_FLASH_ADDR (%x)\n", val);
313 ret = ist30xx_write_cmd(client, IST30XX_FLASH_AUTO_READ, val);
315 tsp_err("ISP fail, IST30XX_FLASH_AUTO_READ (%x)\n", val);
321 ret = ist30xx_read_reg(client, IST30XX_FLASH_CRC, chksum);
323 tsp_err("ISP fail, IST30XX_FLASH_CRC (%x)\n", chksum);
330 int ist30xxc_read_chksum(struct ist30xx_data *data, u32 *chksum)
333 u32 start_addr, end_addr;
335 start_addr = data->tags.fw_addr;
336 end_addr = data->tags.sensor_addr + data->tags.sensor_size;
337 ret = ist30xxc_cmd_read_chksum(data->client,
338 IST30XX_ISP_READ_TOTAL_CRC, start_addr, end_addr, chksum);
342 tsp_info("chksum: %x(%x~%x)\n", *chksum, start_addr, end_addr);
347 int ist30xxc_read_chksum_all(struct i2c_client *client, u32 *chksum)
350 u32 start_addr, end_addr;
352 start_addr = IST30XX_FLASH_BASE_ADDR;
353 end_addr = IST30XX_FLASH_BASE_ADDR + IST30XX_FLASH_TOTAL_SIZE;
354 ret = ist30xxc_cmd_read_chksum(client,
355 IST30XX_ISP_READ_TOTAL_CRC, start_addr, end_addr, chksum);
359 tsp_info("chksum: %x(%x~%x)\n", *chksum, start_addr, end_addr);
364 int ist30xxc_isp_info_read(struct ist30xx_data *data, u32 addr, u32 *buf32, u32 len)
367 int retry = IST30XX_MAX_RETRY_CNT;
371 goto isp_info_read_end;
373 ist30xx_reset(data, true);
375 /* IST30xxB ISP enable */
376 ret = ist30xxc_isp_enable(data->client, true);
378 goto isp_info_read_retry;
380 ret = ist30xxc_isp_read(data->client, addr, IST30XX_ISP_READ_INFO_B,
383 goto isp_info_read_retry;
386 /* IST30xxC ISP disable */
387 ist30xxc_isp_enable(data->client, false);
388 ist30xx_reset(data, false);
392 int ist30xxc_isp_fw_read(struct ist30xx_data *data, u32 *buf32)
397 u32 addr = IST30XX_FLASH_BASE_ADDR;
399 ist30xx_reset(data, true);
401 /* IST30xxB ISP enable */
402 ret = ist30xxc_isp_enable(data->client, true);
407 for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE; i += I2C_MAX_READ_SIZE) {
408 len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN;
409 if ((IST30XX_FLASH_TOTAL_SIZE - i) < I2C_MAX_READ_SIZE)
410 len = (IST30XX_FLASH_TOTAL_SIZE - i) / IST30XX_DATA_LEN;
412 ret = ist30xxc_isp_read(data->client, addr, IST30XX_ISP_READ_TOTAL_B,
415 goto isp_fw_read_end;
421 for (i = 0; i < IST30XX_FLASH_MAIN_SIZE; i += IST30XX_DATA_LEN) {
422 ret = ist30xxc_isp_read(data->client, addr, IST30XX_ISP_READ_TOTAL_S,
425 goto isp_fw_read_end;
432 /* IST30xxC ISP disable */
433 ist30xxc_isp_enable(data->client, false);
434 ist30xx_reset(data, false);
438 int ist30xxc_isp_fw_update(struct ist30xx_data *data, const u8 *buf)
440 #if !(I2C_BURST_MODE)
444 u32 addr = IST30XX_FLASH_BASE_ADDR;
446 tsp_info("%s\n", __func__);
448 ist30xx_reset(data, true);
450 /* IST30xxC ISP enable */
451 ret = ist30xxc_isp_enable(data->client, true);
453 goto isp_fw_update_end;
455 /* IST30xxC ISP erase */
456 ret = ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_BLOCK, 0);
458 goto isp_fw_update_end;
460 #if (IST30XX_FLASH_INFO_SIZE > 0)
461 ret = ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_INFO, 0);
463 goto isp_fw_update_end;
466 ist30xx_reset(data, true);
468 /* IST30xxC ISP enable */
469 ret = ist30xxc_isp_enable(data->client, true);
471 goto isp_fw_update_end;
474 /* IST30xxC ISP write burst */
476 for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE / IST30XX_FLASH_PAGE_SIZE; i++) {
477 ret = ist30xxc_isp_program(data->client, addr,
478 IST30XX_ISP_PROG_TOTAL_B, (u32 *)buf,
479 IST30XX_FLASH_PAGE_SIZE / IST30XX_DATA_LEN);
481 goto isp_fw_update_end;
483 addr += IST30XX_FLASH_PAGE_SIZE / IST30XX_DATA_LEN;
484 buf += IST30XX_FLASH_PAGE_SIZE;
487 ret = ist30xxc_isp_program(data->client, addr, IST30XX_ISP_PROG_TOTAL_B,
488 (u32 *)buf, IST30XX_FLASH_TOTAL_SIZE / IST30XX_DATA_LEN);
490 goto isp_fw_update_end;
493 /* IST30xxC ISP write single */
494 for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE; i += IST30XX_DATA_LEN) {
495 ret = ist30xxc_isp_program(data->client, addr,
496 IST30XX_ISP_PROG_TOTAL_S, (u32 *)buf, 1);
498 goto isp_fw_update_end;
501 buf += IST30XX_DATA_LEN;
506 /* IST30xxC ISP disable */
507 ist30xxc_isp_enable(data->client, false);
508 ist30xx_reset(data, false);
512 u32 ist30xx_parse_ver(struct ist30xx_data *data, int flag, const u8 *buf)
515 u32 *buf32 = (u32 *)buf;
517 if (flag == FLAG_MAIN)
518 ver = (u32)buf32[(data->tags.flag_addr + 0x1FC) >> 2];
519 else if (flag == FLAG_TEST)
520 ver = (u32)buf32[(data->tags.flag_addr + 0x1F4) >> 2];
521 else if (flag == FLAG_FW)
522 ver = (u32)(buf32[(data->tags.cfg_addr + 0x4) >> 2] & 0xFFFF);
523 else if (flag == FLAG_CORE)
524 ver = (u32)buf32[(data->tags.flag_addr + 0x1F0) >> 2];
526 tsp_warn("Parsing ver's flag is not corrent!\n");
531 int calib_ms_delay = CALIB_WAIT_TIME;
532 int ist30xx_calib_wait(struct ist30xx_data *data)
534 int cnt = calib_ms_delay;
536 data->status.calib_msg = 0;
540 if (data->status.calib_msg) {
541 tsp_info("Calibration status : %d, Max raw gap : %d - (%08x)\n",
542 CALIB_TO_STATUS(data->status.calib_msg),
543 CALIB_TO_GAP(data->status.calib_msg),
544 data->status.calib_msg);
545 if (CALIB_TO_STATUS(data->status.calib_msg) == 0)
546 return 0; // Calibrate success
551 tsp_warn("Calibration time out\n");
556 int ist30xx_calibrate(struct ist30xx_data *data, int wait_cnt)
560 tsp_info("*** Calibrate %ds ***\n", calib_ms_delay / 10);
562 data->status.update = 1;
563 ist30xx_disable_irq(data);
565 ret = ist30xx_cmd_calibrate(data->client);
569 ist30xx_enable_irq(data);
570 ret = ist30xx_calib_wait(data);
574 ist30xx_disable_irq(data);
579 ist30xx_reset(data, false);
582 ist30xx_disable_irq(data);
583 ist30xx_reset(data, false);
584 data->status.update = 2;
585 ist30xx_enable_irq(data);
591 int ist30xx_parse_tags(struct ist30xx_data *data, const u8 *buf, const u32 size)
594 struct ist30xx_tags *tags;
596 tags = (struct ist30xx_tags *)(&buf[size - sizeof(struct ist30xx_tags)]);
598 if (!strncmp(tags->magic1, IST30XX_TAG_MAGIC, sizeof(tags->magic1))
599 && !strncmp(tags->magic2, IST30XX_TAG_MAGIC, sizeof(tags->magic2))
603 data->tags.fw_addr -= data->tags.rom_base;
604 data->tags.cfg_addr -= data->tags.rom_base;
605 data->tags.sensor_addr -= data->tags.rom_base;
606 data->tags.cp_addr -= data->tags.rom_base;
607 data->tags.flag_addr -= data->tags.rom_base;
609 data->fw.index = data->tags.fw_addr;
610 data->fw.size = tags->flag_addr - tags->fw_addr +
612 data->fw.chksum = tags->chksum;
614 tsp_verb("Tagts magic1: %s, magic2: %s\n",
615 data->tags.magic1, data->tags.magic2);
616 tsp_verb(" rom: %x\n", data->tags.rom_base);
617 tsp_verb(" ram: %x\n", data->tags.ram_base);
618 tsp_verb(" fw: %x(%x)\n", data->tags.fw_addr, data->tags.fw_size);
619 tsp_verb(" cfg: %x(%x)\n", data->tags.cfg_addr, data->tags.cfg_size);
620 tsp_verb(" sensor: %x(%x)\n",
621 data->tags.sensor_addr, data->tags.sensor_size);
622 tsp_verb(" cp: %x(%x)\n", data->tags.cp_addr, data->tags.cp_size);
623 tsp_verb(" flag: %x(%x)\n", data->tags.flag_addr, data->tags.flag_size);
624 tsp_verb(" zvalue: %x\n", data->tags.zvalue_base);
625 tsp_verb(" algo: %x\n", data->tags.algo_base);
626 tsp_verb(" raw: %x\n", data->tags.raw_base);
627 tsp_verb(" filter: %x\n", data->tags.filter_base);
628 tsp_verb(" chksum: %x\n", data->tags.chksum);
629 tsp_verb(" chksum_all: %x\n", data->tags.chksum_all);
630 tsp_verb(" build time: %04d/%02d/%02d (%02d:%02d:%02d)\n",
631 data->tags.year, data->tags.month, data->tags.day,
632 data->tags.hour, data->tags.min, data->tags.sec);
640 int ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf,
645 ret = ist30xx_parse_tags(data, buf, size);
646 if (unlikely(ret != TAGS_PARSE_OK))
647 tsp_warn("Cannot find tags of F/W, make a tags by 'tagts.exe'\n");
652 #define TSP_INFO_SWAP_XY (1 << 0)
653 #define TSP_INFO_FLIP_X (1 << 1)
654 #define TSP_INFO_FLIP_Y (1 << 2)
655 u32 ist30xx_info_cal_crc(u32 *buf)
660 for (i = 0; i < IST30XX_MAX_CMD_SIZE - 1; i++) {
667 int ist30xx_tsp_update_info(struct ist30xx_data *data)
671 u32 info[IST30XX_MAX_CMD_SIZE];
672 u32 tsp_lcd, tsp_swap, tsp_scr, tsp_gtx, tsp_ch;
673 u32 tkey_info0, tkey_info1, tkey_info2;
674 u32 finger_info, baseline, threshold;
675 TSP_INFO *tsp = &data->tsp_info;
677 TKEY_INFO *tkey = &data->tkey_info;
680 ret = ist30xx_cmd_hold(data, 1);
684 ret = ist30xx_burst_read(data->client,
685 IST30XX_DA_ADDR(eHCOM_GET_CHIP_ID), &info[0],
686 IST30XX_MAX_CMD_SIZE, true);
690 ret = ist30xx_cmd_hold(data, 0);
692 ist30xx_reset(data, false);
696 ret = ist30xx_read_cmd(data, IST30XX_REG_CHIPID, &data->chip_id);
700 if ((info[IST30XX_CMD_VALUE(eHCOM_GET_CHIP_ID)] != data->chip_id) ||
701 (info[IST30XX_CMD_VALUE(eHCOM_GET_CHIP_ID)] == 0) ||
702 (info[IST30XX_CMD_VALUE(eHCOM_GET_CHIP_ID)] == 0xFFFF))
705 chksum = ist30xx_info_cal_crc((u32*)info);
706 if (chksum != info[IST30XX_MAX_CMD_SIZE - 1]) {
707 tsp_err("info checksum : %08X, %08X\n",
708 chksum, info[IST30XX_MAX_CMD_SIZE - 1]);
711 tsp_info("info read success\n");
713 tsp_lcd = info[IST30XX_CMD_VALUE(eHCOM_GET_LCD_INFO)];
714 tsp_ch = info[IST30XX_CMD_VALUE(eHCOM_GET_TSP_INFO)];
715 tkey_info0 = info[IST30XX_CMD_VALUE(eHCOM_GET_KEY_INFO_0)];
716 tkey_info1 = info[IST30XX_CMD_VALUE(eHCOM_GET_KEY_INFO_1)];
717 tkey_info2 = info[IST30XX_CMD_VALUE(eHCOM_GET_KEY_INFO_2)];
718 tsp_scr = info[IST30XX_CMD_VALUE(eHCOM_GET_SCR_INFO)];
719 tsp_gtx = info[IST30XX_CMD_VALUE(eHCOM_GET_GTX_INFO)];
720 tsp_swap = info[IST30XX_CMD_VALUE(eHCOM_GET_SWAP_INFO)];
721 finger_info = info[IST30XX_CMD_VALUE(eHCOM_GET_FINGER_INFO)];
722 baseline = info[IST30XX_CMD_VALUE(eHCOM_GET_BASELINE)];
723 threshold = info[IST30XX_CMD_VALUE(eHCOM_GET_TOUCH_TH)];
725 tsp->ch_num.rx = (tsp_ch >> 16) & 0xFFFF;
726 tsp->ch_num.tx = tsp_ch & 0xFFFF;
728 tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx;
730 tsp->gtx.num = (tsp_gtx >> 24) & 0xFF;
731 tsp->gtx.ch_num[0] = (tsp_gtx >> 16) & 0xFF;
732 tsp->gtx.ch_num[1] = (tsp_gtx >> 8) & 0xFF;
733 tsp->gtx.ch_num[2] = 0xFF;
734 tsp->gtx.ch_num[3] = 0xFF;
736 tsp->finger_num = finger_info;
737 tsp->dir.swap_xy = (tsp_swap & TSP_INFO_SWAP_XY ? true : false);
738 tsp->dir.flip_x = (tsp_swap & TSP_INFO_FLIP_X ? true : false);
739 tsp->dir.flip_y = (tsp_swap & TSP_INFO_FLIP_Y ? true : false);
741 tsp->baseline = baseline & 0xFFFF;
743 tsp->screen.rx = (tsp_scr >> 16) & 0xFFFF;
744 tsp->screen.tx = tsp_scr & 0xFFFF;
746 if (tsp->dir.swap_xy) {
747 tsp->width = tsp_lcd & 0xFFFF;
748 tsp->height = (tsp_lcd >> 16) & 0xFFFF;
750 tsp->width = (tsp_lcd >> 16) & 0xFFFF;
751 tsp->height = tsp_lcd & 0xFFFF;
755 tkey->enable = (((tkey_info0 >> 24) & 0xFF) ? true : false);
756 tkey->key_num = (tkey_info0 >> 16) & 0xFF;
757 tkey->ch_num[0].tx = tkey_info0 & 0xFF;
758 tkey->ch_num[0].rx = (tkey_info0 >> 8) & 0xFF;
759 tkey->ch_num[1].tx = (tkey_info1 >> 16) & 0xFF;
760 tkey->ch_num[1].rx = (tkey_info1 >> 24) & 0xFF;
761 tkey->ch_num[2].tx = tkey_info1 & 0xFF;
762 tkey->ch_num[2].rx = (tkey_info1 >> 8) & 0xFF;
763 tkey->ch_num[3].tx = (tkey_info2 >> 16) & 0xFF;
764 tkey->ch_num[3].rx = (tkey_info2 >> 24) & 0xFF;
765 tkey->ch_num[4].tx = tkey_info2 & 0xFF;
766 tkey->ch_num[4].rx = (tkey_info2 >> 8) & 0xFF;
768 tkey->baseline = (baseline >> 16) & 0xFFFF;
774 int ist30xx_get_tsp_info(struct ist30xx_data *data)
778 #if IST30XX_INTERNAL_BIN
779 TSP_INFO *tsp = &data->tsp_info;
780 const struct firmware *firmware = NULL;
781 struct ist30xx_fw *fw = &data->fw;
783 TKEY_INFO *tkey = &data->tkey_info;
789 ret = ist30xx_tsp_update_info(data);
791 tsp_info("tsp update info success!\n");
796 #if IST30XX_INTERNAL_BIN
797 if (data->dt_data->fw_bin) {
798 ret = request_firmware(&firmware, data->dt_data->fw_path, &data->client->dev);
800 tsp_err("%s: do not request firmware: %d\n", __func__, ret);
804 fw->buf = (u8 *)firmware->data;
805 fw->buf_size = firmware->size;
808 cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr];
810 tsp->ch_num.rx = (u8)cfg_buf[0x0C];
811 tsp->ch_num.tx = (u8)cfg_buf[0x0D];
812 tsp->screen.rx = (u8)cfg_buf[0x0E];
813 tsp->screen.tx = (u8)cfg_buf[0x0F];
814 tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx;
816 tsp->gtx.num = (u8)cfg_buf[0x10];
817 tsp->gtx.ch_num[0] = (u8)cfg_buf[0x11];
818 tsp->gtx.ch_num[1] = (u8)cfg_buf[0x12];
819 tsp->gtx.ch_num[2] = (u8)cfg_buf[0x13];
820 tsp->gtx.ch_num[3] = (u8)cfg_buf[0x14];
822 tsp->finger_num = (u8)cfg_buf[0x2C];
823 tsp->dir.swap_xy = (bool)(cfg_buf[0x2D] & TSP_INFO_SWAP_XY ? true : false);
824 tsp->dir.flip_x = (bool)(cfg_buf[0x2D] & TSP_INFO_FLIP_X ? true : false);
825 tsp->dir.flip_y = (bool)(cfg_buf[0x2D] & TSP_INFO_FLIP_Y ? true : false);
827 tsp->baseline = (u16)((cfg_buf[0x45] << 8) | cfg_buf[0x44]);
829 if (tsp->dir.swap_xy) {
830 tsp->width = (u16)((cfg_buf[0x27] << 8) | cfg_buf[0x26]);
831 tsp->height = (u16)((cfg_buf[0x25] << 8) | cfg_buf[0x24]);
833 tsp->width = (u16)((cfg_buf[0x25] << 8) | cfg_buf[0x24]);
834 tsp->height = (u16)((cfg_buf[0x27] << 8) | cfg_buf[0x26]);
838 tkey->enable = (bool)(cfg_buf[0x15] & 1);
839 tkey->key_num = (u8)cfg_buf[0x16];
841 tkey->ch_num[0].tx = (u8)cfg_buf[0x1A];
842 tkey->ch_num[1].tx = (u8)cfg_buf[0x1B];
843 tkey->ch_num[2].tx = (u8)cfg_buf[0x1C];
844 tkey->ch_num[3].tx = (u8)cfg_buf[0x1D];
845 tkey->ch_num[4].tx = (u8)cfg_buf[0x1E];
847 tkey->ch_num[0].rx = (u8)cfg_buf[0x1F];
848 tkey->ch_num[1].rx = (u8)cfg_buf[0x20];
849 tkey->ch_num[2].rx = (u8)cfg_buf[0x21];
850 tkey->ch_num[3].rx = (u8)cfg_buf[0x22];
851 tkey->ch_num[4].rx = (u8)cfg_buf[0x23];
853 tkey->baseline = (u16)((cfg_buf[0x19] << 8) | cfg_buf[0x18]);
855 if (data->dt_data->fw_bin && firmware) {
856 release_firmware(firmware);
864 void ist30xx_print_info(struct ist30xx_data *data)
866 TSP_INFO *tsp = &data->tsp_info;
867 TKEY_INFO *tkey = &data->tkey_info;
869 tsp_info("*** TSP/TKEY info ***\n");
870 tsp_info("TSP info: \n");
871 tsp_info(" finger num: %d\n", tsp->finger_num);
872 tsp_info(" dir swap: %d, flip x: %d, y: %d\n",
873 tsp->dir.swap_xy, tsp->dir.flip_x, tsp->dir.flip_y);
874 tsp_info(" baseline: %d\n", tsp->baseline);
875 tsp_info(" ch_num tx: %d, rx: %d\n", tsp->ch_num.tx, tsp->ch_num.rx);
876 tsp_info(" screen tx: %d, rx: %d\n", tsp->screen.tx, tsp->screen.rx);
877 tsp_info(" width: %d, height: %d\n", tsp->width, tsp->height);
878 tsp_info(" gtx num: %d, ch [1]: %d, [2]: %d, [3]: %d, [4]: %d\n",
879 tsp->gtx.num, tsp->gtx.ch_num[0], tsp->gtx.ch_num[1],
880 tsp->gtx.ch_num[2], tsp->gtx.ch_num[3]);
881 tsp_info(" node len: %d\n", tsp->node.len);
882 tsp_info("TKEY info: \n");
883 tsp_info(" enable: %d, key num: %d\n", tkey->enable, tkey->key_num);
884 tsp_info(" ch [0]: %d,%d [1]: %d,%d [2]: %d,%d [3]: %d,%d [4]: %d,%d\n",
885 tkey->ch_num[0].tx, tkey->ch_num[0].rx, tkey->ch_num[1].tx,
886 tkey->ch_num[1].rx, tkey->ch_num[2].tx, tkey->ch_num[2].rx,
887 tkey->ch_num[3].tx, tkey->ch_num[3].rx, tkey->ch_num[4].tx,
889 tsp_info(" baseline : %d\n", tkey->baseline);
892 #define update_next_step(ret) { if (unlikely(ret)) goto end; }
893 int ist30xx_fw_update(struct ist30xx_data *data, const u8 *buf, int size)
897 struct ist30xx_fw *fw = &data->fw;
899 tsp_info("*** Firmware update ***\n");
900 tsp_info(" main: %x, fw: %x, test: %x, core: %x(addr: 0x%x ~ 0x%x)\n",
901 fw->bin.main_ver, fw->bin.fw_ver, fw->bin.test_ver, fw->bin.core_ver,
902 fw->index, (fw->index + fw->size));
904 data->status.update = 1;
905 data->status.update_result = 0;
907 ist30xx_disable_irq(data);
909 ret = ist30xxc_isp_fw_update(data, buf);
910 update_next_step(ret);
912 ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum);
913 if (unlikely((ret) || (chksum != fw->chksum))) {
915 ist30xx_reset(data, false);
920 ret = ist30xx_get_ver_info(data);
921 update_next_step(ret);
925 data->status.update_result = 1;
926 tsp_warn("Firmware update Fail!, ret=%d\n", ret);
927 } else if (unlikely(chksum != fw->chksum)) {
928 data->status.update_result = 1;
929 tsp_warn("Error CheckSum: %x(%x)\n", chksum, fw->chksum);
933 ist30xx_enable_irq(data);
935 data->status.update = 2;
940 int ist30xx_fw_recovery(struct ist30xx_data *data)
943 u8 *fw = data->fw.buf;
944 int fw_size = data->fw.buf_size;
946 ret = ist30xx_get_update_info(data, fw, fw_size);
948 data->status.update_result = 1;
952 data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw);
953 data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw);
954 data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw);
955 data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw);
957 mutex_lock(&ist30xx_mutex);
958 ret = ist30xx_fw_update(data, fw, fw_size);
960 ist30xx_calibrate(data, 1);
961 mutex_unlock(&ist30xx_mutex);
968 #if IST30XX_INTERNAL_BIN
969 int ist30xx_check_fw(struct ist30xx_data *data, const u8 *buf)
974 ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum);
976 ist30xx_reset(data, false);
980 if (unlikely(chksum != data->fw.chksum)) {
981 tsp_warn("Checksum compare error, (IC: %08x, Bin: %08x)\n",
982 chksum, data->fw.chksum);
989 bool ist30xx_check_valid_vendor(u32 tsp_vendor)
991 #if (IMAGIS_TSP_IC < IMAGIS_IST3038C)
992 switch (tsp_vendor) {
996 case TSP_TYPE_MELFAS:
998 case TSP_TYPE_SYNOPEX:
1000 case TSP_TYPE_TOVIS:
1002 case TSP_TYPE_BOE_SLOC:
1003 case TSP_TYPE_CNI_GF1:
1004 case TSP_TYPE_OTHERS:
1010 if (tsp_vendor < TSP_TYPE_NO)
1017 #if (IMAGIS_TSP_IC < IMAGIS_IST3038C)
1018 #if IST30XX_MULTIPLE_TSP
1019 void ist30xx_set_tsp_fw(struct ist30xx_data *data)
1022 struct ist30xx_fw *fw = &data->fw;
1024 switch (data->tsp_type) {
1025 case TSP_TYPE_BOE_SLOC:
1027 fw->buf = (u8 *)ist30xxc_fw;
1028 fw->buf_size = sizeof(ist30xxc_fw);
1030 case TSP_TYPE_CNI_GF1:
1032 fw->buf = (u8 *)ist30xxc_fw2;
1033 fw->buf_size = sizeof(ist30xxc_fw2);
1036 case TSP_TYPE_UNKNOWN:
1039 tsp_warn("Unknown TSP vendor(0x%x)\n", data->tsp_type);
1042 tsp_info("TSP vendor : %s(%x)\n", str, data->tsp_type);
1044 #endif // IST30XX_MULTIPLE_TSP
1045 #endif // (IMAGIS_TSP_IC < IMAGIS_IST3038C)
1046 #define MAIN_VER_MASK 0xFF000000
1047 int ist30xx_check_auto_update(struct ist30xx_data *data)
1050 int retry = IST30XX_MAX_RETRY_CNT;
1051 u32 tsp_type = TSP_TYPE_UNKNOWN;
1052 bool tsp_check = false;
1054 struct ist30xx_fw *fw = &data->fw;
1057 ret = ist30xx_read_cmd(data, eHCOM_GET_TSP_VENDOR, &tsp_type);
1058 if (likely(ret == 0)) {
1059 if (likely(ist30xx_check_valid_vendor(tsp_type) == true))
1064 ist30xx_reset(data, false);
1066 #if (IMAGIS_TSP_IC < IMAGIS_IST3038C)
1067 tsp_info("TSP vendor: %x\n", tsp_type);
1070 if (unlikely(!tsp_check))
1073 ist30xx_get_ver_info(data);
1075 /* Temp Code : Force firmware update for wrong firmware written case */
1076 #if defined(CONFIG_SEC_NOVEL_PROJECT)
1077 if (data->chip_id != IST30XX_CHIP_ID) {
1078 tsp_info("The wrong firmware(IC : %x). Force firmware update.\n", data->chip_id);
1083 if (data->dt_data->extra_string)
1084 tsp_info("%s: %s, cur:%d, bin:%d\n",
1085 __func__, data->dt_data->extra_string,
1086 fw->cur.fw_ver, fw->bin.fw_ver);
1088 if (likely((fw->cur.fw_ver > 0) && (fw->cur.fw_ver < 0xFFFFFFFF))) {
1089 if (unlikely(((fw->cur.main_ver & MAIN_VER_MASK) == MAIN_VER_MASK) ||
1090 ((fw->cur.main_ver & MAIN_VER_MASK) == 0)))
1093 tsp_info("Version compare IC: %x(%x), BIN: %x(%x)\n", fw->cur.fw_ver,
1094 fw->cur.main_ver, fw->bin.fw_ver, fw->bin.main_ver);
1096 /* If FW version is same, check FW checksum */
1097 if (likely((fw->cur.main_ver == fw->bin.main_ver) &&
1098 (fw->cur.fw_ver == fw->bin.fw_ver) &&
1099 (fw->cur.test_ver == 0))) {
1100 ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum);
1101 if (unlikely((ret) || (chksum != fw->chksum))) {
1102 tsp_warn("Checksum error, IC: %x, Bin: %x (ret: %d)\n",
1103 chksum, fw->chksum, ret);
1109 * fw->cur.main_ver : Main version in TSP IC
1110 * fw->cur.fw_ver : FW version if TSP IC
1111 * fw->bin.main_ver : Main version in FW Binary
1112 * fw->bin.fw_ver : FW version in FW Binary
1114 /* If the ver of binary is higher than ver of IC, FW update operate. */
1116 if (likely((fw->cur.main_ver >= fw->bin.main_ver) && (fw->cur.fw_ver >= fw->bin.fw_ver)))
1124 int ist30xx_auto_bin_update(struct ist30xx_data *data)
1127 int retry = IST30XX_MAX_RETRY_CNT;
1128 const struct firmware *firmware = NULL;
1129 struct ist30xx_fw *fw = &data->fw;
1131 if (data->dt_data->fw_bin) {
1132 ret = request_firmware(&firmware, data->dt_data->fw_path, &data->client->dev);
1134 tsp_err("%s: do not request firmware: %d\n", __func__, ret);
1138 fw->buf = (u8 *)firmware->data;
1139 fw->buf_size = firmware->size;
1141 fw->buf = (u8 *)ist30xxc_fw;
1142 fw->buf_size = sizeof(ist30xxc_fw);
1145 #if (IMAGIS_TSP_IC < IMAGIS_IST3038C)
1146 #if IST30XX_MULTIPLE_TSP
1147 ist30xx_set_tsp_fw(data);
1151 ret = ist30xx_get_update_info(data, fw->buf, fw->buf_size);
1152 if (unlikely(ret)) {
1153 tsp_err("%s: failed get update info, %d\n", __func__, ret);
1156 fw->bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw->buf);
1157 fw->bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw->buf);
1158 fw->bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw->buf);
1159 fw->bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw->buf);
1161 tsp_info("IC: %x, Binary ver main: %x, fw: %x, test: %x, core: %x\n",
1162 data->chip_id, fw->bin.main_ver, fw->bin.fw_ver, fw->bin.test_ver,
1165 mutex_lock(&ist30xx_mutex);
1166 ret = ist30xx_check_auto_update(data);
1167 mutex_unlock(&ist30xx_mutex);
1169 if (data->dt_data->bringup) {
1170 tsp_info("%s: bring up! do not update firmware.\n", __func__);
1175 if (likely(ret >= 0))
1178 update_bin: // TSP is not ready / FW update
1179 tsp_info("Update version. fw(main, test, core): %x(%x, %x, %x) -> %x(%x, %x, %x)\n",
1180 fw->cur.fw_ver, fw->cur.main_ver, fw->cur.test_ver, fw->cur.core_ver,
1181 fw->bin.fw_ver, fw->bin.main_ver, fw->bin.test_ver, fw->bin.core_ver);
1183 mutex_lock(&ist30xx_mutex);
1185 ret = ist30xx_fw_update(data, fw->buf, fw->buf_size);
1189 mutex_unlock(&ist30xx_mutex);
1194 if (unlikely(retry > 0 && ist30xx_check_fw(data, fw->buf)))
1197 mutex_lock(&ist30xx_mutex);
1198 ist30xx_calibrate(data, IST30XX_MAX_RETRY_CNT);
1199 mutex_unlock(&ist30xx_mutex);
1202 ist30xx_write_cmd(data->client,
1203 IST30XX_HIB_CMD, (eHCOM_FW_HOLD << 16) | (1 & 0xFFFF));
1204 tsp_info("%s: set FW_HOLD\n", __func__);
1206 if (data->dt_data->fw_bin && firmware) {
1207 release_firmware(firmware);
1213 #endif // IST30XX_INTERNAL_BIN
1215 #define MAX_FILE_PATH 255
1216 /* sysfs: /sys/class/touch/firmware/firmware */
1217 ssize_t ist30xx_fw_store(struct device *dev, struct device_attribute *attr,
1218 const char *buf, size_t size)
1224 mm_segment_t old_fs = { 0 };
1225 struct file *fp = NULL;
1226 long fsize = 0, nread = 0;
1227 char fw_path[MAX_FILE_PATH];
1228 const struct firmware *request_fw = NULL;
1231 struct ist30xx_data *data = dev_get_drvdata(dev);
1233 sscanf(buf, "%d %d", &mode, &calib);
1236 case MASK_UPDATE_INTERNAL:
1237 #if IST30XX_INTERNAL_BIN
1239 fw_size = data->fw.buf_size;
1241 data->status.update_result = 1;
1242 tsp_warn("Not support internal bin!!\n");
1247 case MASK_UPDATE_FW:
1248 ret = request_firmware(&request_fw, IST30XX_FW_NAME,
1249 &data->client->dev);
1251 data->status.update_result = 1;
1252 tsp_warn("File not found, %s\n", IST30XX_FW_NAME);
1256 fw = (u8 *)request_fw->data;
1257 fw_size = (u32)request_fw->size;
1258 tsp_info("firmware is loaded!!\n");
1261 case MASK_UPDATE_SDCARD:
1265 snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s",
1267 fp = filp_open(fw_path, O_RDONLY, 0);
1269 data->status.update_result = 1;
1270 tsp_info("file %s open error:%d\n", fw_path, (s32)fp);
1274 fsize = fp->f_path.dentry->d_inode->i_size;
1276 buff = kzalloc((size_t)fsize, GFP_KERNEL);
1278 data->status.update_result = 1;
1279 tsp_info("fail to alloc buffer\n");
1283 nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos);
1284 if (nread != fsize) {
1285 data->status.update_result = 1;
1286 tsp_info("mismatch fw size\n");
1291 fw_size = (u32)fsize;
1293 filp_close(fp, current->files);
1294 tsp_info("firmware is loaded!!\n");
1297 case MASK_UPDATE_ERASE:
1298 tsp_info("EEPROM all erase!!\n");
1300 mutex_lock(&ist30xx_mutex);
1301 ist30xx_disable_irq(data);
1302 ist30xx_reset(data, true);
1303 ist30xxc_isp_enable(data->client, true);
1304 ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_BLOCK, 0);
1305 #if (IST30XX_FLASH_INFO_SIZE > 0)
1306 ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_INFO, 0);
1308 ist30xxc_isp_enable(data->client, false);
1309 ist30xx_reset(data, false);
1310 ist30xx_start(data);
1311 ist30xx_enable_irq(data);
1312 mutex_unlock(&ist30xx_mutex);
1318 ret = ist30xx_get_update_info(data, fw, fw_size);
1320 data->status.update_result = 1;
1324 data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw);
1325 data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw);
1326 data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw);
1327 data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw);
1329 mutex_lock(&ist30xx_mutex);
1330 ret = ist30xx_fw_update(data, fw, fw_size);
1333 ist30xx_calibrate(data, 1);
1335 mutex_unlock(&ist30xx_mutex);
1337 ist30xx_start(data);
1340 if (request_fw != NULL)
1341 release_firmware(request_fw);
1347 filp_close(fp, NULL);
1355 /* sysfs: /sys/class/touch/firmware/fw_sdcard */
1356 ssize_t ist30xx_fw_sdcard_show(struct device *dev,
1357 struct device_attribute *attr, char *buf)
1363 mm_segment_t old_fs = { 0 };
1364 struct file *fp = NULL;
1365 long fsize = 0, nread = 0;
1366 char fw_path[MAX_FILE_PATH];
1367 struct ist30xx_data *data = dev_get_drvdata(dev);
1372 snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s",
1374 fp = filp_open(fw_path, O_RDONLY, 0);
1376 data->status.update_result = 1;
1377 tsp_info("file %s open error:%d\n", fw_path, (s32)fp);
1381 fsize = fp->f_path.dentry->d_inode->i_size;
1383 buff = kzalloc((size_t)fsize, GFP_KERNEL);
1385 data->status.update_result = 1;
1386 tsp_info("fail to alloc buffer\n");
1390 nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos);
1391 if (nread != fsize) {
1392 data->status.update_result = 1;
1393 tsp_info("mismatch fw size\n");
1398 fw_size = (u32)fsize;
1400 filp_close(fp, current->files);
1401 tsp_info("firmware is loaded!!\n");
1403 ret = ist30xx_get_update_info(data, fw, fw_size);
1405 data->status.update_result = 1;
1409 data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw);
1410 data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw);
1411 data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw);
1412 data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw);
1414 mutex_lock(&ist30xx_mutex);
1415 ist30xx_fw_update(data, fw, fw_size);
1416 mutex_unlock(&ist30xx_mutex);
1418 ist30xx_start(data);
1425 filp_close(fp, NULL);
1432 /* sysfs: /sys/class/touch/firmware/firmware */
1433 ssize_t ist30xx_fw_status_show(struct device *dev,
1434 struct device_attribute *attr, char *buf)
1437 struct ist30xx_data *data = dev_get_drvdata(dev);
1439 switch (data->status.update) {
1441 count = sprintf(buf, "Downloading\n");
1444 if (data->status.update_result) {
1445 count = sprintf(buf, "Update fail\n");
1447 count = sprintf(buf, "Update success, ver %x(%x, %x, %x)-> %x(%x, %x, %x), "
1448 "status : %d, gap : %d\n",
1449 data->fw.prev.fw_ver, data->fw.prev.main_ver,
1450 data->fw.prev.test_ver, data->fw.prev.core_ver,
1451 data->fw.cur.fw_ver, data->fw.cur.main_ver,
1452 data->fw.cur.test_ver, data->fw.cur.core_ver,
1453 CALIB_TO_STATUS(data->status.calib_msg),
1454 CALIB_TO_GAP(data->status.calib_msg));
1458 if (data->status.update_result)
1459 count = sprintf(buf, "Update fail\n");
1461 count = sprintf(buf, "Pass\n");
1468 /* sysfs: /sys/class/touch/firmware/fw_read */
1469 u32 buf32_flash[IST30XX_FLASH_TOTAL_SIZE / IST30XX_DATA_LEN];
1470 ssize_t ist30xx_fw_read_show(struct device *dev, struct device_attribute *attr,
1474 mm_segment_t old_fs = { 0 };
1475 struct file *fp = NULL;
1476 char fw_path[MAX_FILE_PATH];
1477 u8 *buf8 = (u8 *)buf32_flash;
1478 struct ist30xx_data *data = dev_get_drvdata(dev);
1480 mutex_lock(&ist30xx_mutex);
1481 ist30xx_disable_irq(data);
1483 ist30xxc_isp_fw_read(data, buf32_flash);
1484 for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE; i += 16) {
1485 tsp_debug("%07x: %02x%02x %02x%02x %02x%02x %02x%02x "
1486 "%02x%02x %02x%02x %02x%02x %02x%02x\n", i,
1487 buf8[i], buf8[i + 1], buf8[i + 2], buf8[i + 3],
1488 buf8[i + 4], buf8[i + 5], buf8[i + 6], buf8[i + 7],
1489 buf8[i + 8], buf8[i + 9], buf8[i + 10], buf8[i + 11],
1490 buf8[i + 12], buf8[i + 13], buf8[i + 14], buf8[i + 15]);
1496 snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s", IST30XX_BIN_NAME);
1497 fp = filp_open(fw_path, O_CREAT|O_WRONLY|O_TRUNC, 0);
1499 tsp_info("file %s open error:%d\n", fw_path, (s32)fp);
1503 fp->f_op->write(fp, buf8, IST30XX_FLASH_TOTAL_SIZE, &fp->f_pos);
1506 filp_close(fp, NULL);
1510 ist30xx_enable_irq(data);
1511 mutex_unlock(&ist30xx_mutex);
1513 ist30xx_start(data);
1518 /* sysfs: /sys/class/touch/firmware/version */
1519 ssize_t ist30xx_fw_version_show(struct device *dev,
1520 struct device_attribute *attr, char *buf)
1523 struct ist30xx_data *data = dev_get_drvdata(dev);
1525 count = sprintf(buf, "ID: %x, main: %x, fw: %x, test: %x, core: %x\n",
1526 data->chip_id, data->fw.cur.main_ver, data->fw.cur.fw_ver,
1527 data->fw.cur.test_ver, data->fw.cur.core_ver);
1529 #if IST30XX_INTERNAL_BIN
1531 const struct firmware *firmware = NULL;
1532 struct ist30xx_fw *fw = &data->fw;
1535 if (data->dt_data->fw_bin) {
1536 ret = request_firmware(&firmware, data->dt_data->fw_path, &data->client->dev);
1538 tsp_err("%s: do not request firmware: %d\n", __func__, ret);
1542 fw->buf = (u8 *)firmware->data;
1543 fw->buf_size = firmware->size;
1546 ret = ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size);
1548 count += sprintf(buf + count,
1549 "Header - main: %x, fw: %x, test: %x, core: %x\n",
1550 ist30xx_parse_ver(data, FLAG_MAIN, data->fw.buf),
1551 ist30xx_parse_ver(data, FLAG_FW, data->fw.buf),
1552 ist30xx_parse_ver(data, FLAG_TEST, data->fw.buf),
1553 ist30xx_parse_ver(data, FLAG_CORE, data->fw.buf));
1555 if (data->dt_data->fw_bin && firmware) {
1556 release_firmware(firmware);
1567 static DEVICE_ATTR(fw_read, S_IRUGO, ist30xx_fw_read_show, NULL);
1568 static DEVICE_ATTR(firmware, S_IRUGO, ist30xx_fw_status_show,
1570 static DEVICE_ATTR(fw_sdcard, S_IRUGO, ist30xx_fw_sdcard_show, NULL);
1571 static DEVICE_ATTR(version, S_IRUGO, ist30xx_fw_version_show, NULL);
1573 struct class *ist30xx_class;
1574 struct device *ist30xx_fw_dev;
1576 static struct attribute *fw_attributes[] = {
1577 &dev_attr_fw_read.attr,
1578 &dev_attr_firmware.attr,
1579 &dev_attr_fw_sdcard.attr,
1580 &dev_attr_version.attr,
1584 static struct attribute_group fw_attr_group = {
1585 .attrs = fw_attributes,
1588 int ist30xx_init_update_sysfs(struct ist30xx_data *data)
1590 /* /sys/class/touch */
1591 ist30xx_class = class_create(THIS_MODULE, "touch");
1593 /* /sys/class/touch/firmware */
1594 ist30xx_fw_dev = device_create(ist30xx_class, NULL, 0, data, "firmware");
1596 /* /sys/class/touch/firmware/... */
1597 if (unlikely(sysfs_create_group(&ist30xx_fw_dev->kobj, &fw_attr_group)))
1598 tsp_err("Failed to create sysfs group(%s)!\n", "firmware");
1600 data->status.update = 0;
1601 data->status.calib = 0;
1602 data->status.update_result = 0;