goodix_brl_fwupdate.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362
  1. /*
  2. * Goodix Touchscreen Driver
  3. * Copyright (C) 2020 - 2021 Goodix, Inc.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be a reference
  11. * to you, when you are integrating the GOODiX's CTP IC into your system,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. */
  17. #include "goodix_ts_core.h"
  18. #define BUS_TYPE_SPI 1
  19. #define BUS_TYPE_I2C 0
  20. #define GOODIX_BUS_RETRY_TIMES 3
  21. #define FW_HEADER_SIZE_BRA 256
  22. #define FW_HEADER_SIZE 512
  23. #define FW_SUBSYS_INFO_SIZE 10
  24. #define FW_SUBSYS_INFO_OFFSET_BRA 36
  25. #define FW_SUBSYS_INFO_OFFSET 42
  26. #define FW_SUBSYS_MAX_NUM 47
  27. #define ISP_MAX_BUFFERSIZE 4096
  28. #define FW_PID_LEN 8
  29. #define FW_VID_LEN 4
  30. #define FLASH_CMD_LEN 11
  31. #define FW_FILE_CHECKSUM_OFFSET 8
  32. #define CONFIG_DATA_TYPE 4
  33. #define ISP_RAM_ADDR_BRA 0x18400
  34. #define ISP_RAM_ADDR_BRB 0x57000
  35. #define ISP_RAM_ADDR_BRD 0x23800
  36. #define HW_REG_CPU_RUN_FROM 0x10000
  37. #define FLASH_CMD_REG_BRA 0x10400
  38. #define FLASH_CMD_REG_BRB 0x13400
  39. #define FLASH_CMD_REG_BRD 0x12400
  40. #define HW_REG_ISP_BUFFER_BRA 0x10410
  41. #define HW_REG_ISP_BUFFER_BRB 0x13410
  42. #define HW_REG_ISP_BUFFER_BRD 0x12410
  43. #define CONFIG_DATA_ADDR_BRA 0x3E000
  44. #define CONFIG_DATA_ADDR_BRB 0x40000
  45. #define CONFIG_DATA_ADDR_BRD 0x3E000
  46. #define GOODIX_CFG_ID_ADDR_BRA 0x1006E
  47. #define GOODIX_CFG_ID_ADDR_BRB 0x10076
  48. #define GOODIX_CFG_ID_ADDR_BRD 0x10076
  49. #define HOLD_CPU_REG_W 0x0002
  50. #define HOLD_CPU_REG_R 0x2000
  51. #define MISCTL_REG_BRA 0xD807
  52. #define MISCTL_REG_BRB 0xD80B
  53. #define MISCTL_REG_BRD 0xD804
  54. #define ENABLE_MISCTL_BRA 0x08
  55. #define ENABLE_MISCTL_BRB 0x40
  56. #define ENABLE_MISCTL_BRD 0x20700000
  57. #define ESD_KEY_REG 0xCC58
  58. #define WATCH_DOG_REG_BRA 0xCC54
  59. #define WATCH_DOG_REG_BRB 0xD054
  60. #define WATCH_DOG_REG_BRD 0xD040
  61. #define FLASH_CMD_TYPE_READ 0xAA
  62. #define FLASH_CMD_TYPE_WRITE 0xBB
  63. #define FLASH_CMD_ACK_CHK_PASS 0xEE
  64. #define FLASH_CMD_ACK_CHK_ERROR 0x33
  65. #define FLASH_CMD_ACK_IDLE 0x11
  66. #define FLASH_CMD_W_STATUS_CHK_PASS 0x22
  67. #define FLASH_CMD_W_STATUS_CHK_FAIL 0x33
  68. #define FLASH_CMD_W_STATUS_ADDR_ERR 0x44
  69. #define FLASH_CMD_W_STATUS_WRITE_ERR 0x55
  70. #define FLASH_CMD_W_STATUS_WRITE_OK 0xEE
  71. #define CHIP_TYPE_BRA 0x96
  72. #define CHIP_TYPE_BRB 0x97
  73. #define CHIP_TYPE_BRD 0x98
  74. struct update_info_t {
  75. int header_size;
  76. int subsys_info_offset;
  77. u32 isp_ram_reg;
  78. u32 flash_cmd_reg;
  79. u32 isp_buffer_reg;
  80. u32 config_data_reg;
  81. u32 misctl_reg;
  82. u32 watch_dog_reg;
  83. u32 config_id_reg;
  84. u32 enable_misctl_val;
  85. };
  86. /* berlinA update into */
  87. struct update_info_t update_bra = {
  88. FW_HEADER_SIZE_BRA,
  89. FW_SUBSYS_INFO_OFFSET_BRA,
  90. ISP_RAM_ADDR_BRA,
  91. FLASH_CMD_REG_BRA,
  92. HW_REG_ISP_BUFFER_BRA,
  93. CONFIG_DATA_ADDR_BRA,
  94. MISCTL_REG_BRA,
  95. WATCH_DOG_REG_BRA,
  96. GOODIX_CFG_ID_ADDR_BRA,
  97. ENABLE_MISCTL_BRA,
  98. };
  99. /* berlinB update info */
  100. struct update_info_t update_brb = {
  101. FW_HEADER_SIZE,
  102. FW_SUBSYS_INFO_OFFSET,
  103. ISP_RAM_ADDR_BRB,
  104. FLASH_CMD_REG_BRB,
  105. HW_REG_ISP_BUFFER_BRB,
  106. CONFIG_DATA_ADDR_BRB,
  107. MISCTL_REG_BRB,
  108. WATCH_DOG_REG_BRB,
  109. GOODIX_CFG_ID_ADDR_BRB,
  110. ENABLE_MISCTL_BRB,
  111. };
  112. /* berlinD update info */
  113. struct update_info_t update_brd = {
  114. FW_HEADER_SIZE,
  115. FW_SUBSYS_INFO_OFFSET,
  116. ISP_RAM_ADDR_BRD,
  117. FLASH_CMD_REG_BRD,
  118. HW_REG_ISP_BUFFER_BRD,
  119. CONFIG_DATA_ADDR_BRD,
  120. MISCTL_REG_BRD,
  121. WATCH_DOG_REG_BRD,
  122. GOODIX_CFG_ID_ADDR_BRD,
  123. ENABLE_MISCTL_BRD,
  124. };
  125. /**
  126. * fw_subsys_info - subsytem firmware information
  127. * @type: sybsystem type
  128. * @size: firmware size
  129. * @flash_addr: flash address
  130. * @data: firmware data
  131. */
  132. struct fw_subsys_info {
  133. u8 type;
  134. u32 size;
  135. u32 flash_addr;
  136. const u8 *data;
  137. };
  138. /**
  139. * firmware_summary
  140. * @size: fw total length
  141. * @checksum: checksum of fw
  142. * @hw_pid: mask pid string
  143. * @hw_pid: mask vid code
  144. * @fw_pid: fw pid string
  145. * @fw_vid: fw vid code
  146. * @subsys_num: number of fw subsystem
  147. * @chip_type: chip type
  148. * @protocol_ver: firmware packing
  149. * protocol version
  150. * @bus_type: 0 represent I2C, 1 for SPI
  151. * @subsys: sybsystem info
  152. */
  153. #pragma pack(1)
  154. struct firmware_summary {
  155. u32 size;
  156. u32 checksum;
  157. u8 hw_pid[6];
  158. u8 hw_vid[3];
  159. u8 fw_pid[FW_PID_LEN];
  160. u8 fw_vid[FW_VID_LEN];
  161. u8 subsys_num;
  162. u8 chip_type;
  163. u8 protocol_ver;
  164. u8 bus_type;
  165. u8 flash_protect;
  166. // u8 reserved[8];
  167. struct fw_subsys_info subsys[FW_SUBSYS_MAX_NUM];
  168. };
  169. #pragma pack()
  170. /**
  171. * firmware_data - firmware data structure
  172. * @fw_summary: firmware information
  173. * @firmware: firmware data structure
  174. */
  175. struct firmware_data {
  176. struct firmware_summary fw_summary;
  177. const struct firmware *firmware;
  178. struct firmware *fw_sysfs;
  179. };
  180. struct config_data {
  181. u8 *data;
  182. int size;
  183. };
  184. #pragma pack(1)
  185. struct goodix_flash_cmd {
  186. union {
  187. struct {
  188. u8 status;
  189. u8 ack;
  190. u8 len;
  191. u8 cmd;
  192. u8 fw_type;
  193. u16 fw_len;
  194. u32 fw_addr;
  195. //u16 checksum;
  196. };
  197. u8 buf[16];
  198. };
  199. };
  200. #pragma pack()
  201. enum update_status {
  202. UPSTA_NOTWORK = 0,
  203. UPSTA_PREPARING,
  204. UPSTA_UPDATING,
  205. UPSTA_SUCCESS,
  206. UPSTA_FAILED
  207. };
  208. enum compare_status {
  209. COMPARE_EQUAL = 0,
  210. COMPARE_NOCODE,
  211. COMPARE_PIDMISMATCH,
  212. COMPARE_FW_NOTEQUAL,
  213. COMPARE_CFG_NOTEQUAL,
  214. };
  215. /**
  216. * fw_update_ctrl - structure used to control the
  217. * firmware update process
  218. * @initialized: struct init state
  219. * @mode: indicate weather reflash config or not, fw data source,
  220. * and run on block mode or not.
  221. * @status: update status
  222. * @progress: indicate the progress of update
  223. * @fw_data: firmware data
  224. * @fw_name: firmware name
  225. * @attr_fwimage: sysfs bin attrs, for storing fw image
  226. * @fw_data_src: firmware data source form sysfs, request or head file
  227. * @kobj: pointer to the sysfs kobject
  228. */
  229. struct fw_update_ctrl {
  230. struct mutex mutex;
  231. int initialized;
  232. char fw_name[GOODIX_MAX_STR_LABLE_LEN];
  233. int mode;
  234. enum update_status status;
  235. int spend_time;
  236. struct firmware_data fw_data;
  237. struct goodix_ic_config *ic_config;
  238. struct goodix_ts_core *core_data;
  239. struct update_info_t *update_info;
  240. struct bin_attribute attr_fwimage;
  241. struct kobject *kobj;
  242. };
  243. static struct fw_update_ctrl goodix_fw_update_ctrl;
  244. static int goodix_fw_update_reset(int delay)
  245. {
  246. struct goodix_ts_hw_ops *hw_ops;
  247. hw_ops = goodix_fw_update_ctrl.core_data->hw_ops;
  248. return hw_ops->reset(goodix_fw_update_ctrl.core_data, delay);
  249. }
  250. static int get_fw_version_info(struct goodix_fw_version *fw_version)
  251. {
  252. struct goodix_ts_hw_ops *hw_ops =
  253. goodix_fw_update_ctrl.core_data->hw_ops;
  254. return hw_ops->read_version(goodix_fw_update_ctrl.core_data,
  255. fw_version);
  256. }
  257. static int goodix_reg_write(unsigned int addr,
  258. unsigned char *data, unsigned int len)
  259. {
  260. struct goodix_ts_hw_ops *hw_ops =
  261. goodix_fw_update_ctrl.core_data->hw_ops;
  262. return hw_ops->write(goodix_fw_update_ctrl.core_data,
  263. addr, data, len);
  264. }
  265. static int goodix_reg_read(unsigned int addr,
  266. unsigned char *data, unsigned int len)
  267. {
  268. struct goodix_ts_hw_ops *hw_ops =
  269. goodix_fw_update_ctrl.core_data->hw_ops;
  270. return hw_ops->read(goodix_fw_update_ctrl.core_data,
  271. addr, data, len);
  272. }
  273. /**
  274. * goodix_parse_firmware - parse firmware header information
  275. * and subsystem information from firmware data buffer
  276. *
  277. * @fw_data: firmware struct, contains firmware header info
  278. * and firmware data.
  279. * return: 0 - OK, < 0 - error
  280. */
  281. /* sizeof(length) + sizeof(checksum) */
  282. static int goodix_parse_firmware(struct firmware_data *fw_data)
  283. {
  284. const struct firmware *firmware;
  285. struct firmware_summary *fw_summary;
  286. unsigned int i, fw_offset, info_offset;
  287. u32 checksum;
  288. int ic_type =
  289. goodix_fw_update_ctrl.core_data->bus->ic_type;
  290. int subsys_info_offset =
  291. goodix_fw_update_ctrl.update_info->subsys_info_offset;
  292. int header_size =
  293. goodix_fw_update_ctrl.update_info->header_size;
  294. int r = 0;
  295. fw_summary = &fw_data->fw_summary;
  296. /* copy firmware head info */
  297. if (goodix_fw_update_ctrl.mode & UPDATE_MODE_SRC_SYSFS)
  298. firmware = fw_data->fw_sysfs;
  299. else
  300. firmware = fw_data->firmware;
  301. if (firmware->size < subsys_info_offset) {
  302. ts_err("Invalid firmware size:%zu", firmware->size);
  303. r = -EINVAL;
  304. goto err_size;
  305. }
  306. memcpy(fw_summary, firmware->data, sizeof(*fw_summary));
  307. /* check firmware size */
  308. fw_summary->size = le32_to_cpu(fw_summary->size);
  309. if (firmware->size != fw_summary->size + FW_FILE_CHECKSUM_OFFSET) {
  310. ts_err("Bad firmware, size not match, %zu != %d",
  311. firmware->size,
  312. fw_summary->size + FW_FILE_CHECKSUM_OFFSET);
  313. r = -EINVAL;
  314. goto err_size;
  315. }
  316. for (i = FW_FILE_CHECKSUM_OFFSET, checksum = 0;
  317. i < firmware->size; i += 2)
  318. checksum += firmware->data[i] + (firmware->data[i+1] << 8);
  319. /* byte order change, and check */
  320. fw_summary->checksum = le32_to_cpu(fw_summary->checksum);
  321. if (checksum != fw_summary->checksum) {
  322. ts_err("Bad firmware, cheksum error");
  323. r = -EINVAL;
  324. goto err_size;
  325. }
  326. if (fw_summary->subsys_num > FW_SUBSYS_MAX_NUM) {
  327. ts_err("Bad firmware, invalid subsys num: %d",
  328. fw_summary->subsys_num);
  329. r = -EINVAL;
  330. goto err_size;
  331. }
  332. /* parse subsystem info */
  333. fw_offset = header_size;
  334. for (i = 0; i < fw_summary->subsys_num; i++) {
  335. info_offset = subsys_info_offset +
  336. i * FW_SUBSYS_INFO_SIZE;
  337. fw_summary->subsys[i].type = firmware->data[info_offset];
  338. fw_summary->subsys[i].size =
  339. le32_to_cpup((__le32 *)&firmware->data[info_offset + 1]);
  340. fw_summary->subsys[i].flash_addr =
  341. le32_to_cpup((__le32 *)&firmware->data[info_offset + 5]);
  342. if (fw_offset > firmware->size) {
  343. ts_err("Sybsys offset exceed Firmware size");
  344. goto err_size;
  345. }
  346. fw_summary->subsys[i].data = firmware->data + fw_offset;
  347. fw_offset += fw_summary->subsys[i].size;
  348. }
  349. ts_info("Firmware package protocol: V%u", fw_summary->protocol_ver);
  350. ts_info("Firmware PID:GT%s", fw_summary->fw_pid);
  351. ts_info("Firmware VID:%*ph", 4, fw_summary->fw_vid);
  352. ts_info("Firmware chip type:0x%02X", fw_summary->chip_type);
  353. ts_info("Firmware bus type:%s",
  354. (fw_summary->bus_type & BUS_TYPE_SPI) ? "SPI" : "I2C");
  355. ts_info("Firmware size:%u", fw_summary->size);
  356. ts_info("Firmware subsystem num:%u", fw_summary->subsys_num);
  357. for (i = 0; i < fw_summary->subsys_num; i++) {
  358. ts_debug("------------------------------------------");
  359. ts_debug("Index:%d", i);
  360. ts_debug("Subsystem type:%02X", fw_summary->subsys[i].type);
  361. ts_debug("Subsystem size:%u", fw_summary->subsys[i].size);
  362. ts_debug("Subsystem flash_addr:%08X",
  363. fw_summary->subsys[i].flash_addr);
  364. ts_debug("Subsystem Ptr:%p", fw_summary->subsys[i].data);
  365. }
  366. if (fw_summary->chip_type == CHIP_TYPE_BRA &&
  367. ic_type != IC_TYPE_BERLIN_A) {
  368. ts_err("ic type mismatch!");
  369. r = -EINVAL;
  370. } else if (fw_summary->chip_type == CHIP_TYPE_BRB &&
  371. ic_type != IC_TYPE_BERLIN_B) {
  372. ts_err("ic type mismatch!");
  373. r = -EINVAL;
  374. } else if (fw_summary->chip_type == CHIP_TYPE_BRD &&
  375. ic_type != IC_TYPE_BERLIN_D) {
  376. ts_err("ic type mismatch!");
  377. r = -EINVAL;
  378. }
  379. err_size:
  380. return r;
  381. }
  382. /**
  383. * goodix_fw_version_compare - compare the active version with
  384. * firmware file version.
  385. * @fwu_ctrl: firmware information to be compared
  386. * return: 0 equal, < 0 unequal
  387. */
  388. #define GOODIX_NOCODE "NOCODE"
  389. static int goodix_fw_version_compare(struct fw_update_ctrl *fwu_ctrl)
  390. {
  391. int ret = 0;
  392. struct goodix_fw_version fw_version;
  393. struct firmware_summary *fw_summary = &fwu_ctrl->fw_data.fw_summary;
  394. u32 config_id_reg = goodix_fw_update_ctrl.update_info->config_id_reg;
  395. u32 file_cfg_id;
  396. u32 ic_cfg_id;
  397. /* compare fw_version */
  398. ret = get_fw_version_info(&fw_version);
  399. if (ret)
  400. return -EINVAL;
  401. if (!memcmp(fw_version.rom_pid, GOODIX_NOCODE, 6) ||
  402. !memcmp(fw_version.patch_pid, GOODIX_NOCODE, 6)) {
  403. ts_info("there is no code in the chip");
  404. return COMPARE_NOCODE;
  405. }
  406. if (memcmp(fw_version.patch_pid, fw_summary->fw_pid, FW_PID_LEN)) {
  407. ts_err("Product ID mismatch:%s != %s",
  408. fw_version.patch_pid, fw_summary->fw_pid);
  409. return COMPARE_PIDMISMATCH;
  410. }
  411. ret = memcmp(fw_version.patch_vid, fw_summary->fw_vid, FW_VID_LEN);
  412. if (ret) {
  413. ts_info("active firmware version:%*ph", FW_VID_LEN,
  414. fw_version.patch_vid);
  415. ts_info("firmware file version: %*ph", FW_VID_LEN,
  416. fw_summary->fw_vid);
  417. return COMPARE_FW_NOTEQUAL;
  418. }
  419. ts_info("fw_version equal");
  420. /* compare config id */
  421. if (fwu_ctrl->ic_config && fwu_ctrl->ic_config->len > 0) {
  422. file_cfg_id =
  423. goodix_get_file_config_id(fwu_ctrl->ic_config->data);
  424. goodix_reg_read(config_id_reg,
  425. (u8 *)&ic_cfg_id, sizeof(ic_cfg_id));
  426. if (ic_cfg_id != file_cfg_id) {
  427. ts_info("ic_cfg_id:0x%x != file_cfg_id:0x%x",
  428. ic_cfg_id, file_cfg_id);
  429. return COMPARE_CFG_NOTEQUAL;
  430. }
  431. ts_info("config_id equal");
  432. }
  433. return COMPARE_EQUAL;
  434. }
  435. /**
  436. * goodix_reg_write_confirm - write register and confirm the value
  437. * in the register.
  438. * @dev: pointer to touch device
  439. * @addr: register address
  440. * @data: pointer to data buffer
  441. * @len: data length
  442. * return: 0 write success and confirm ok
  443. * < 0 failed
  444. */
  445. static int goodix_reg_write_confirm(unsigned int addr,
  446. unsigned char *data, unsigned int len)
  447. {
  448. u8 *cfm = NULL;
  449. u8 cfm_buf[32];
  450. int r, i;
  451. if (len > sizeof(cfm_buf)) {
  452. cfm = kzalloc(len, GFP_KERNEL);
  453. if (!cfm)
  454. return -ENOMEM;
  455. } else {
  456. cfm = &cfm_buf[0];
  457. }
  458. for (i = 0; i < GOODIX_BUS_RETRY_TIMES; i++) {
  459. r = goodix_reg_write(addr, data, len);
  460. if (r < 0)
  461. goto exit;
  462. r = goodix_reg_read(addr, cfm, len);
  463. if (r < 0)
  464. goto exit;
  465. if (memcmp(data, cfm, len)) {
  466. r = -EINVAL;
  467. continue;
  468. } else {
  469. r = 0;
  470. break;
  471. }
  472. }
  473. exit:
  474. if (cfm != &cfm_buf[0])
  475. kfree(cfm);
  476. return r;
  477. }
  478. /**
  479. * goodix_load_isp - load ISP program to device ram
  480. * @dev: pointer to touch device
  481. * @fw_data: firmware data
  482. * return 0 ok, <0 error
  483. */
  484. static int goodix_load_isp(struct firmware_data *fw_data)
  485. {
  486. struct goodix_fw_version isp_fw_version;
  487. struct fw_subsys_info *fw_isp;
  488. u32 isp_ram_reg = goodix_fw_update_ctrl.update_info->isp_ram_reg;
  489. u8 reg_val[8] = {0x00};
  490. int r;
  491. memset(&isp_fw_version, 0, sizeof(isp_fw_version));
  492. fw_isp = &fw_data->fw_summary.subsys[0];
  493. ts_info("Loading ISP start");
  494. r = goodix_reg_write_confirm(isp_ram_reg,
  495. (u8 *)fw_isp->data, fw_isp->size);
  496. if (r < 0) {
  497. ts_err("Loading ISP error");
  498. return r;
  499. }
  500. ts_info("Success send ISP data");
  501. /* SET BOOT OPTION TO 0X55 */
  502. memset(reg_val, 0x55, 8);
  503. r = goodix_reg_write_confirm(HW_REG_CPU_RUN_FROM, reg_val, 8);
  504. if (r < 0) {
  505. ts_err("Failed set REG_CPU_RUN_FROM flag");
  506. return r;
  507. }
  508. ts_info("Success write [8]0x55 to 0x%x", HW_REG_CPU_RUN_FROM);
  509. if (goodix_fw_update_reset(100))
  510. ts_err("reset abnormal");
  511. /*check isp state */
  512. if (get_fw_version_info(&isp_fw_version)) {
  513. ts_err("failed read isp version");
  514. return -2;
  515. }
  516. if (memcmp(&isp_fw_version.patch_pid[3], "ISP", 3)) {
  517. ts_err("patch id error %c%c%c != %s",
  518. isp_fw_version.patch_pid[3], isp_fw_version.patch_pid[4],
  519. isp_fw_version.patch_pid[5], "ISP");
  520. return -3;
  521. }
  522. ts_info("ISP running successfully");
  523. return 0;
  524. }
  525. /**
  526. * goodix_update_prepare - update prepare, loading ISP program
  527. * and make sure the ISP is running.
  528. * @fwu_ctrl: pointer to fimrware control structure
  529. * return: 0 ok, <0 error
  530. */
  531. static int goodix_update_prepare(struct fw_update_ctrl *fwu_ctrl)
  532. {
  533. u32 misctl_reg = fwu_ctrl->update_info->misctl_reg;
  534. u32 watch_dog_reg = fwu_ctrl->update_info->watch_dog_reg;
  535. u32 enable_misctl_val = fwu_ctrl->update_info->enable_misctl_val;
  536. u8 reg_val[4] = {0};
  537. u8 temp_buf[64] = {0};
  538. int retry = 20;
  539. int r;
  540. /*reset IC*/
  541. ts_info("firmware update, reset");
  542. if (goodix_fw_update_reset(5))
  543. ts_err("reset abnormal");
  544. retry = 100;
  545. /* Hold cpu*/
  546. do {
  547. reg_val[0] = 0x01;
  548. reg_val[1] = 0x00;
  549. r = goodix_reg_write(HOLD_CPU_REG_W, reg_val, 2);
  550. r |= goodix_reg_read(HOLD_CPU_REG_R, &temp_buf[0], 4);
  551. r |= goodix_reg_read(HOLD_CPU_REG_R, &temp_buf[4], 4);
  552. r |= goodix_reg_read(HOLD_CPU_REG_R, &temp_buf[8], 4);
  553. if (!r && !memcmp(&temp_buf[0], &temp_buf[4], 4) &&
  554. !memcmp(&temp_buf[4], &temp_buf[8], 4) &&
  555. !memcmp(&temp_buf[0], &temp_buf[8], 4)) {
  556. break;
  557. }
  558. usleep_range(1000, 1100);
  559. ts_info("retry hold cpu %d", retry);
  560. ts_debug("data:%*ph", 12, temp_buf);
  561. } while (--retry);
  562. if (!retry) {
  563. ts_err("Failed to hold CPU, return =%d", r);
  564. return -1;
  565. }
  566. ts_info("Success hold CPU");
  567. /* enable misctl clock */
  568. if (fwu_ctrl->core_data->bus->ic_type == IC_TYPE_BERLIN_D)
  569. goodix_reg_write(misctl_reg, (u8 *)&enable_misctl_val, 4);
  570. else
  571. goodix_reg_write(misctl_reg, (u8 *)&enable_misctl_val, 1);
  572. ts_info("enbale misctl clock");
  573. if (fwu_ctrl->core_data->bus->ic_type == IC_TYPE_BERLIN_A) {
  574. /* open ESD_KEY */
  575. retry = 20;
  576. do {
  577. reg_val[0] = 0x95;
  578. r = goodix_reg_write(ESD_KEY_REG, reg_val, 1);
  579. r |= goodix_reg_read(ESD_KEY_REG, temp_buf, 1);
  580. if (!r && temp_buf[0] == 0x01)
  581. break;
  582. usleep_range(1000, 1100);
  583. ts_info("retry %d enable esd key, 0x%x",
  584. retry, temp_buf[0]);
  585. } while (--retry);
  586. if (!retry) {
  587. ts_err("Failed to enable esd key, return =%d", r);
  588. return -2;
  589. }
  590. ts_info("success enable esd key");
  591. }
  592. /* disable watch dog */
  593. reg_val[0] = 0x00;
  594. r = goodix_reg_write(watch_dog_reg, reg_val, 1);
  595. ts_info("disable watch dog");
  596. /* load ISP code and run form isp */
  597. r = goodix_load_isp(&fwu_ctrl->fw_data);
  598. if (r < 0)
  599. ts_err("Failed load and run isp");
  600. return r;
  601. }
  602. /* goodix_send_flash_cmd: send command to read or write flash data
  603. * @flash_cmd: command need to send.
  604. */
  605. static int goodix_send_flash_cmd(struct goodix_flash_cmd *flash_cmd)
  606. {
  607. int i, ret, retry;
  608. struct goodix_flash_cmd tmp_cmd;
  609. u32 flash_cmd_reg = goodix_fw_update_ctrl.update_info->flash_cmd_reg;
  610. ts_info("try send flash cmd:%*ph", (int)sizeof(flash_cmd->buf),
  611. flash_cmd->buf);
  612. memset(tmp_cmd.buf, 0, sizeof(tmp_cmd));
  613. ret = goodix_reg_write(flash_cmd_reg,
  614. flash_cmd->buf, sizeof(flash_cmd->buf));
  615. if (ret) {
  616. ts_err("failed send flash cmd %d", ret);
  617. return ret;
  618. }
  619. retry = 5;
  620. for (i = 0; i < retry; i++) {
  621. ret = goodix_reg_read(flash_cmd_reg,
  622. tmp_cmd.buf, sizeof(tmp_cmd.buf));
  623. if (!ret && tmp_cmd.ack == FLASH_CMD_ACK_CHK_PASS)
  624. break;
  625. usleep_range(5000, 5100);
  626. ts_info("flash cmd ack error retry %d, ack 0x%x, ret %d",
  627. i, tmp_cmd.ack, ret);
  628. }
  629. if (tmp_cmd.ack != FLASH_CMD_ACK_CHK_PASS) {
  630. ts_err("flash cmd ack error, ack 0x%x, ret %d",
  631. tmp_cmd.ack, ret);
  632. ts_err("data:%*ph", (int)sizeof(tmp_cmd.buf), tmp_cmd.buf);
  633. return -EINVAL;
  634. }
  635. ts_info("flash cmd ack check pass");
  636. msleep(50);
  637. retry = 20;
  638. for (i = 0; i < retry; i++) {
  639. ret = goodix_reg_read(flash_cmd_reg,
  640. tmp_cmd.buf, sizeof(tmp_cmd.buf));
  641. if (!ret && tmp_cmd.ack == FLASH_CMD_ACK_CHK_PASS &&
  642. tmp_cmd.status == FLASH_CMD_W_STATUS_WRITE_OK) {
  643. ts_info("flash status check pass");
  644. return 0;
  645. }
  646. ts_info("flash cmd status not ready, retry %d, ack 0x%x, status 0x%x, ret %d",
  647. i, tmp_cmd.ack, tmp_cmd.status, ret);
  648. usleep_range(10000, 11000);
  649. }
  650. ts_err("flash cmd status error %d, ack 0x%x, status 0x%x, ret %d",
  651. i, tmp_cmd.ack, tmp_cmd.status, ret);
  652. if (ret) {
  653. ts_info("reason: bus or paltform error");
  654. return -EINVAL;
  655. }
  656. switch (tmp_cmd.status) {
  657. case FLASH_CMD_W_STATUS_CHK_PASS:
  658. ts_err("data check pass, but failed get follow-up results");
  659. return -EFAULT;
  660. case FLASH_CMD_W_STATUS_CHK_FAIL:
  661. ts_err("data check failed, please retry");
  662. return -EAGAIN;
  663. case FLASH_CMD_W_STATUS_ADDR_ERR:
  664. ts_err("flash target addr error, please check");
  665. return -EFAULT;
  666. case FLASH_CMD_W_STATUS_WRITE_ERR:
  667. ts_err("flash data write err, please retry");
  668. return -EAGAIN;
  669. default:
  670. ts_err("unknown status");
  671. return -EFAULT;
  672. }
  673. }
  674. static int goodix_flash_package(u8 subsys_type, u8 *pkg,
  675. u32 flash_addr, u16 pkg_len)
  676. {
  677. int ret, retry;
  678. struct goodix_flash_cmd flash_cmd;
  679. u32 isp_buffer_reg = goodix_fw_update_ctrl.update_info->isp_buffer_reg;
  680. retry = 2;
  681. do {
  682. ret = goodix_reg_write(isp_buffer_reg, pkg, pkg_len);
  683. if (ret < 0) {
  684. ts_err("Failed to write firmware packet");
  685. return ret;
  686. }
  687. flash_cmd.status = 0;
  688. flash_cmd.ack = 0;
  689. flash_cmd.len = FLASH_CMD_LEN;
  690. flash_cmd.cmd = FLASH_CMD_TYPE_WRITE;
  691. flash_cmd.fw_type = subsys_type;
  692. flash_cmd.fw_len = cpu_to_le16(pkg_len);
  693. flash_cmd.fw_addr = cpu_to_le32(flash_addr);
  694. goodix_append_checksum(&(flash_cmd.buf[2]),
  695. 9, CHECKSUM_MODE_U8_LE);
  696. ret = goodix_send_flash_cmd(&flash_cmd);
  697. if (!ret) {
  698. ts_info("success write package to 0x%x, len %d",
  699. flash_addr, pkg_len - 4);
  700. return 0;
  701. }
  702. } while (ret == -EAGAIN && --retry);
  703. return ret;
  704. }
  705. /**
  706. * goodix_flash_subsystem - flash subsystem firmware,
  707. * Main flow of flashing firmware.
  708. * Each firmware subsystem is divided into several
  709. * packets, the max size of packet is limited to
  710. * @{ISP_MAX_BUFFERSIZE}
  711. * @dev: pointer to touch device
  712. * @subsys: subsystem information
  713. * return: 0 ok, < 0 error
  714. */
  715. static int goodix_flash_subsystem(struct fw_subsys_info *subsys)
  716. {
  717. u32 data_size, offset;
  718. u32 total_size;
  719. //TODO: confirm flash addr ,<< 8??
  720. u32 subsys_base_addr = subsys->flash_addr;
  721. u8 *fw_packet = NULL;
  722. int r = 0;
  723. /*
  724. * if bus(i2c/spi) error occued, then exit, we will do
  725. * hardware reset and re-prepare ISP and then retry
  726. * flashing
  727. */
  728. total_size = subsys->size;
  729. fw_packet = kzalloc(ISP_MAX_BUFFERSIZE + 4, GFP_KERNEL);
  730. if (!fw_packet) {
  731. ts_err("Failed alloc memory");
  732. return -EINVAL;
  733. }
  734. offset = 0;
  735. while (total_size > 0) {
  736. data_size = total_size > ISP_MAX_BUFFERSIZE ?
  737. ISP_MAX_BUFFERSIZE : total_size;
  738. ts_info("Flash firmware to %08x,size:%u bytes",
  739. subsys_base_addr + offset, data_size);
  740. memcpy(fw_packet, &subsys->data[offset], data_size);
  741. /* set checksum for package data */
  742. goodix_append_checksum(fw_packet,
  743. data_size, CHECKSUM_MODE_U16_LE);
  744. r = goodix_flash_package(subsys->type, fw_packet,
  745. subsys_base_addr + offset, data_size + 4);
  746. if (r) {
  747. ts_err("failed flash to %08x,size:%u bytes",
  748. subsys_base_addr + offset, data_size);
  749. break;
  750. }
  751. offset += data_size;
  752. total_size -= data_size;
  753. } /* end while */
  754. kfree(fw_packet);
  755. return r;
  756. }
  757. /**
  758. * goodix_flash_firmware - flash firmware
  759. * @dev: pointer to touch device
  760. * @fw_data: firmware data
  761. * return: 0 ok, < 0 error
  762. */
  763. static int goodix_flash_firmware(struct fw_update_ctrl *fw_ctrl)
  764. {
  765. struct firmware_data *fw_data = &fw_ctrl->fw_data;
  766. struct firmware_summary *fw_summary;
  767. struct fw_subsys_info *fw_x;
  768. struct fw_subsys_info subsys_cfg = {0};
  769. u32 config_data_reg = fw_ctrl->update_info->config_data_reg;
  770. int retry = GOODIX_BUS_RETRY_TIMES;
  771. int i, r = 0, fw_num;
  772. /* start from subsystem 1,
  773. * subsystem 0 is the ISP program
  774. */
  775. fw_summary = &fw_data->fw_summary;
  776. fw_num = fw_summary->subsys_num;
  777. /* flash config data first if we have */
  778. if (fw_ctrl->ic_config && fw_ctrl->ic_config->len) {
  779. subsys_cfg.data = fw_ctrl->ic_config->data;
  780. subsys_cfg.size = fw_ctrl->ic_config->len;
  781. subsys_cfg.flash_addr = config_data_reg;
  782. subsys_cfg.type = CONFIG_DATA_TYPE;
  783. r = goodix_flash_subsystem(&subsys_cfg);
  784. if (r) {
  785. ts_err("failed flash config with ISP, %d", r);
  786. return r;
  787. }
  788. ts_info("success flash config with ISP");
  789. }
  790. for (i = 1; i < fw_num && retry;) {
  791. ts_info("--- Start to flash subsystem[%d] ---", i);
  792. fw_x = &fw_summary->subsys[i];
  793. r = goodix_flash_subsystem(fw_x);
  794. if (r == 0) {
  795. ts_info("--- End flash subsystem[%d]: OK ---", i);
  796. i++;
  797. } else if (r == -EAGAIN) {
  798. retry--;
  799. ts_err("--- End flash subsystem%d: Fail, errno:%d, retry:%d ---",
  800. i, r, GOODIX_BUS_RETRY_TIMES - retry);
  801. } else if (r < 0) { /* bus error */
  802. ts_err("--- End flash subsystem%d: Fatal error:%d exit ---",
  803. i, r);
  804. goto exit_flash;
  805. }
  806. }
  807. exit_flash:
  808. return r;
  809. }
  810. /**
  811. * goodix_update_finish - update finished, FREE resource
  812. * and reset flags---
  813. * @fwu_ctrl: pointer to fw_update_ctrl structrue
  814. * return: 0 ok, < 0 error
  815. */
  816. static int goodix_update_finish(struct fw_update_ctrl *fwu_ctrl)
  817. {
  818. int ret;
  819. if (goodix_fw_update_reset(100))
  820. ts_err("reset abnormal");
  821. ret = goodix_fw_version_compare(fwu_ctrl);
  822. if (ret == COMPARE_EQUAL || ret == COMPARE_CFG_NOTEQUAL)
  823. return 0;
  824. return -EINVAL;
  825. }
  826. /**
  827. * goodix_fw_update_proc - firmware update process, the entry of
  828. * firmware update flow
  829. * @fwu_ctrl: firmware control
  830. * return: = 0 update ok, < 0 error or NO_NEED_UPDATE
  831. */
  832. int goodix_fw_update_proc(struct fw_update_ctrl *fwu_ctrl)
  833. {
  834. #define FW_UPDATE_RETRY 2
  835. int retry0 = FW_UPDATE_RETRY;
  836. int retry1 = FW_UPDATE_RETRY;
  837. int ret = 0;
  838. ret = goodix_parse_firmware(&fwu_ctrl->fw_data);
  839. if (ret < 0)
  840. return ret;
  841. if (!(fwu_ctrl->mode & UPDATE_MODE_FORCE)) {
  842. ret = goodix_fw_version_compare(fwu_ctrl);
  843. if (!ret) {
  844. ts_info("no need to upgrade");
  845. return 0;
  846. }
  847. ts_info("need to upgrade");
  848. }
  849. start_update:
  850. fwu_ctrl->status = UPSTA_PREPARING;
  851. do {
  852. ret = goodix_update_prepare(fwu_ctrl);
  853. if (ret) {
  854. ts_err("failed prepare ISP, retry %d",
  855. FW_UPDATE_RETRY - retry0);
  856. }
  857. } while (ret && --retry0 > 0);
  858. if (ret) {
  859. ts_err("Failed to prepare ISP, exit update:%d", ret);
  860. goto err_fw_prepare;
  861. }
  862. /* progress: 20%~100% */
  863. fwu_ctrl->status = UPSTA_UPDATING;
  864. ret = goodix_flash_firmware(fwu_ctrl);
  865. if (ret < 0 && --retry1 > 0) {
  866. ts_err("Bus error, retry firmware update:%d",
  867. FW_UPDATE_RETRY - retry1);
  868. goto start_update;
  869. }
  870. if (ret)
  871. ts_err("flash fw data enter error, ret:%d", ret);
  872. else
  873. ts_info("flash fw data success, need check version");
  874. err_fw_prepare:
  875. ret = goodix_update_finish(fwu_ctrl);
  876. if (!ret)
  877. ts_info("Firmware update successfully");
  878. else
  879. ts_err("Firmware update failed, ret:%d", ret);
  880. return ret;
  881. }
  882. /*
  883. * goodix_sysfs_update_en_store: start fw update manually
  884. * @buf: '1'[001] update in blocking mode with fwdata from sysfs
  885. * '2'[010] update in blocking mode with fwdata from request
  886. * '5'[101] update in unblocking mode with fwdata from sysfs
  887. * '6'[110] update in unblocking mode with fwdata from request
  888. */
  889. static ssize_t goodix_sysfs_update_en_store(
  890. struct device *dev, struct device_attribute *attr,
  891. const char *buf, size_t count)
  892. {
  893. int ret = 0;
  894. int mode = 0;
  895. struct fw_update_ctrl *fw_ctrl = &goodix_fw_update_ctrl;
  896. if (!buf || count <= 0) {
  897. ts_err("invalid params");
  898. return -EINVAL;
  899. }
  900. if (!fw_ctrl || !fw_ctrl->initialized) {
  901. ts_err("fw module uninit");
  902. return -EINVAL;
  903. }
  904. ts_info("set update mode:0x%x", buf[0]);
  905. if (buf[0] == '1') {
  906. mode = UPDATE_MODE_FORCE | UPDATE_MODE_BLOCK |
  907. UPDATE_MODE_SRC_SYSFS;
  908. } else if (buf[0] == '2') {
  909. mode = UPDATE_MODE_FORCE | UPDATE_MODE_BLOCK |
  910. UPDATE_MODE_SRC_REQUEST;
  911. } else if (buf[0] == '5') {
  912. mode = UPDATE_MODE_FORCE | UPDATE_MODE_SRC_SYSFS;
  913. } else if (buf[0] == '6') {
  914. mode = UPDATE_MODE_FORCE | UPDATE_MODE_SRC_REQUEST;
  915. } else {
  916. ts_err("invalid update mode:0x%x", buf[0]);
  917. return -EINVAL;
  918. }
  919. ret = goodix_do_fw_update(NULL, mode);
  920. if (!ret) {
  921. ts_info("success do update work");
  922. return count;
  923. }
  924. ts_err("failed do fw update work");
  925. return -EINVAL;
  926. }
  927. static ssize_t goodix_sysfs_fwimage_store(struct file *file,
  928. struct kobject *kobj, struct bin_attribute *attr,
  929. char *buf, loff_t pos, size_t count)
  930. {
  931. struct firmware **fw = &goodix_fw_update_ctrl.fw_data.fw_sysfs;
  932. if (*fw == NULL) {
  933. *fw = kzalloc(sizeof(**fw), GFP_KERNEL);
  934. if (*fw == NULL)
  935. return -ENOMEM;
  936. (*fw)->data = vmalloc(GOODIX_FW_MAX_SIEZE);
  937. if ((*fw)->data == NULL) {
  938. kfree(*fw);
  939. *fw = NULL;
  940. return -ENOMEM;
  941. }
  942. }
  943. if (pos + count > GOODIX_FW_MAX_SIEZE)
  944. return -EFAULT;
  945. memcpy((u8 *)&(*fw)->data[pos], buf, count);
  946. (*fw)->size = pos + count;
  947. return count;
  948. }
  949. /* return fw_update result */
  950. static ssize_t goodix_sysfs_result_show(
  951. struct device *dev, struct device_attribute *attr,
  952. char *buf)
  953. {
  954. struct fw_update_ctrl *fw_ctrl = &goodix_fw_update_ctrl;
  955. char str[GOODIX_MAX_STR_LABLE_LEN] = {0};
  956. int r = -EINVAL;
  957. if (!fw_ctrl)
  958. return r;
  959. switch (fw_ctrl->status) {
  960. case UPSTA_PREPARING:
  961. sprintf(str, "preparing");
  962. break;
  963. case UPSTA_UPDATING:
  964. sprintf(str, "updating");
  965. break;
  966. case UPSTA_SUCCESS:
  967. sprintf(str, "success");
  968. break;
  969. case UPSTA_FAILED:
  970. sprintf(str, "failed");
  971. break;
  972. case UPSTA_NOTWORK:
  973. default:
  974. sprintf(str, "notwork");
  975. break;
  976. }
  977. r = snprintf(buf, PAGE_SIZE, "result:%s spend_time:%dms\n",
  978. str, fw_ctrl->spend_time);
  979. return r;
  980. }
  981. static DEVICE_ATTR(update_en, 0220, NULL, goodix_sysfs_update_en_store);
  982. static DEVICE_ATTR(result, 0664, goodix_sysfs_result_show, NULL);
  983. static struct attribute *goodix_fwu_attrs[] = {
  984. &dev_attr_update_en.attr,
  985. &dev_attr_result.attr
  986. };
  987. static int goodix_fw_sysfs_init(struct goodix_ts_core *core_data,
  988. struct fw_update_ctrl *fw_ctrl)
  989. {
  990. int ret = 0, i;
  991. fw_ctrl->kobj = kobject_create_and_add("fwupdate",
  992. &core_data->pdev->dev.kobj);
  993. if (!fw_ctrl->kobj) {
  994. ts_err("failed create sub dir for fwupdate");
  995. return -EINVAL;
  996. }
  997. for (i = 0; i < ARRAY_SIZE(goodix_fwu_attrs) && !ret; i++)
  998. ret = sysfs_create_file(fw_ctrl->kobj, goodix_fwu_attrs[i]);
  999. if (ret) {
  1000. ts_err("failed create fwu sysfs files");
  1001. while (--i >= 0)
  1002. sysfs_remove_file(fw_ctrl->kobj, goodix_fwu_attrs[i]);
  1003. kobject_put(fw_ctrl->kobj);
  1004. return -EINVAL;
  1005. }
  1006. fw_ctrl->attr_fwimage.attr.name = "fwimage";
  1007. fw_ctrl->attr_fwimage.attr.mode = 0664;
  1008. fw_ctrl->attr_fwimage.size = 0;
  1009. fw_ctrl->attr_fwimage.write = goodix_sysfs_fwimage_store;
  1010. ret = sysfs_create_bin_file(fw_ctrl->kobj, &fw_ctrl->attr_fwimage);
  1011. if (ret) {
  1012. ts_err("failed create fwimage bin node, %d", ret);
  1013. for (i = 0; i < ARRAY_SIZE(goodix_fwu_attrs); i++)
  1014. sysfs_remove_file(fw_ctrl->kobj, goodix_fwu_attrs[i]);
  1015. kobject_put(fw_ctrl->kobj);
  1016. }
  1017. return ret;
  1018. }
  1019. static void goodix_fw_sysfs_remove(void)
  1020. {
  1021. struct fw_update_ctrl *fw_ctrl = &goodix_fw_update_ctrl;
  1022. int i;
  1023. sysfs_remove_bin_file(fw_ctrl->kobj, &fw_ctrl->attr_fwimage);
  1024. for (i = 0; i < ARRAY_SIZE(goodix_fwu_attrs); i++)
  1025. sysfs_remove_file(fw_ctrl->kobj,
  1026. goodix_fwu_attrs[i]);
  1027. kobject_put(fw_ctrl->kobj);
  1028. }
  1029. /**
  1030. * goodix_request_firmware - request firmware data from user space
  1031. *
  1032. * @fw_data: firmware struct, contains firmware header info
  1033. * and firmware data pointer.
  1034. * return: 0 - OK, < 0 - error
  1035. */
  1036. static int goodix_request_firmware(struct firmware_data *fw_data,
  1037. const char *name)
  1038. {
  1039. struct fw_update_ctrl *fw_ctrl =
  1040. container_of(fw_data, struct fw_update_ctrl, fw_data);
  1041. struct device *dev = &(fw_ctrl->core_data->pdev->dev);
  1042. int r;
  1043. int retry = GOODIX_RETRY_3;
  1044. ts_info("Request firmware image [%s]", name);
  1045. while (retry--) {
  1046. r = request_firmware(&fw_data->firmware, name, dev);
  1047. if (!r)
  1048. break;
  1049. ts_info("get fw bin retry:[%d]", GOODIX_RETRY_3 - retry);
  1050. msleep(200);
  1051. }
  1052. if (retry < 0) {
  1053. ts_err("Firmware image [%s] not available,errno:%d", name, r);
  1054. return r;
  1055. }
  1056. ts_info("Firmware image [%s] is ready", name);
  1057. return 0;
  1058. }
  1059. /**
  1060. * relase firmware resources
  1061. *
  1062. */
  1063. static inline void goodix_release_firmware(struct firmware_data *fw_data)
  1064. {
  1065. if (fw_data->firmware) {
  1066. release_firmware(fw_data->firmware);
  1067. fw_data->firmware = NULL;
  1068. }
  1069. }
  1070. static int goodix_fw_update_thread(void *data)
  1071. {
  1072. struct fw_update_ctrl *fwu_ctrl = data;
  1073. ktime_t start, end;
  1074. int r = -EINVAL;
  1075. start = ktime_get();
  1076. fwu_ctrl->spend_time = 0;
  1077. fwu_ctrl->status = UPSTA_NOTWORK;
  1078. mutex_lock(&fwu_ctrl->mutex);
  1079. ts_debug("notify update start");
  1080. goodix_ts_blocking_notify(NOTIFY_FWUPDATE_START, NULL);
  1081. if (fwu_ctrl->mode & UPDATE_MODE_SRC_REQUEST) {
  1082. ts_info("Firmware request update starts");
  1083. r = goodix_request_firmware(&fwu_ctrl->fw_data,
  1084. fwu_ctrl->fw_name);
  1085. if (r < 0)
  1086. goto out;
  1087. } else if (fwu_ctrl->mode & UPDATE_MODE_SRC_SYSFS) {
  1088. if (!fwu_ctrl->fw_data.fw_sysfs) {
  1089. ts_err("Invalid firmware from sysfs");
  1090. r = -EINVAL;
  1091. goto out;
  1092. }
  1093. if (fwu_ctrl->fw_data.fw_sysfs->size < 4096) {
  1094. ts_err("Invalid firmware size[%ld] from sysfs",
  1095. fwu_ctrl->fw_data.fw_sysfs->size);
  1096. vfree(fwu_ctrl->fw_data.fw_sysfs->data);
  1097. kfree(fwu_ctrl->fw_data.fw_sysfs);
  1098. fwu_ctrl->fw_data.fw_sysfs = NULL;
  1099. r = -EINVAL;
  1100. goto out;
  1101. }
  1102. } else {
  1103. ts_err("unknown update mode 0x%x", fwu_ctrl->mode);
  1104. r = -EINVAL;
  1105. goto out;
  1106. }
  1107. /* ready to update */
  1108. ts_debug("start update proc");
  1109. r = goodix_fw_update_proc(fwu_ctrl);
  1110. /* clean */
  1111. if (fwu_ctrl->mode & UPDATE_MODE_SRC_SYSFS) {
  1112. vfree(fwu_ctrl->fw_data.fw_sysfs->data);
  1113. kfree(fwu_ctrl->fw_data.fw_sysfs);
  1114. fwu_ctrl->fw_data.fw_sysfs = NULL;
  1115. } else if (fwu_ctrl->mode & UPDATE_MODE_SRC_REQUEST) {
  1116. goodix_release_firmware(&fwu_ctrl->fw_data);
  1117. }
  1118. out:
  1119. fwu_ctrl->mode = UPDATE_MODE_DEFAULT;
  1120. mutex_unlock(&fwu_ctrl->mutex);
  1121. if (r) {
  1122. ts_err("fw update failed, %d", r);
  1123. fwu_ctrl->status = UPSTA_FAILED;
  1124. goodix_ts_blocking_notify(NOTIFY_FWUPDATE_FAILED, NULL);
  1125. } else {
  1126. ts_info("fw update success");
  1127. fwu_ctrl->status = UPSTA_SUCCESS;
  1128. goodix_ts_blocking_notify(NOTIFY_FWUPDATE_SUCCESS, NULL);
  1129. }
  1130. end = ktime_get();
  1131. fwu_ctrl->spend_time = ktime_to_ms(ktime_sub(end, start));
  1132. return r;
  1133. }
  1134. int goodix_do_fw_update(struct goodix_ic_config *ic_config, int mode)
  1135. {
  1136. struct task_struct *fwu_thrd;
  1137. struct fw_update_ctrl *fwu_ctrl = &goodix_fw_update_ctrl;
  1138. int ret;
  1139. if (!fwu_ctrl->initialized) {
  1140. ts_err("fw mode uninit");
  1141. return -EINVAL;
  1142. }
  1143. fwu_ctrl->mode = mode;
  1144. fwu_ctrl->ic_config = ic_config;
  1145. ts_debug("fw update mode 0x%x", mode);
  1146. if (fwu_ctrl->mode & UPDATE_MODE_BLOCK) {
  1147. ret = goodix_fw_update_thread(fwu_ctrl);
  1148. ts_info("fw update return %d", ret);
  1149. return ret;
  1150. }
  1151. /* create and run update thread */
  1152. fwu_thrd = kthread_run(goodix_fw_update_thread,
  1153. fwu_ctrl, "goodix-fwu");
  1154. if (IS_ERR_OR_NULL(fwu_thrd)) {
  1155. ts_err("Failed to create update thread:%ld",
  1156. PTR_ERR(fwu_thrd));
  1157. return -EFAULT;
  1158. }
  1159. ts_info("success create fw update thread");
  1160. return 0;
  1161. }
  1162. int goodix_fw_update_init(struct goodix_ts_core *core_data)
  1163. {
  1164. int ret;
  1165. if (!core_data || !core_data->hw_ops) {
  1166. ts_err("core_data && hw_ops cann't be null");
  1167. return -ENODEV;
  1168. }
  1169. mutex_init(&goodix_fw_update_ctrl.mutex);
  1170. goodix_fw_update_ctrl.core_data = core_data;
  1171. goodix_fw_update_ctrl.mode = 0;
  1172. strlcpy(goodix_fw_update_ctrl.fw_name, core_data->board_data.fw_name,
  1173. sizeof(goodix_fw_update_ctrl.fw_name));
  1174. ret = goodix_fw_sysfs_init(core_data, &goodix_fw_update_ctrl);
  1175. if (ret) {
  1176. ts_err("failed create fwupate sysfs node");
  1177. return ret;
  1178. }
  1179. if (core_data->bus->ic_type == IC_TYPE_BERLIN_A)
  1180. goodix_fw_update_ctrl.update_info = &update_bra;
  1181. else if (core_data->bus->ic_type == IC_TYPE_BERLIN_B)
  1182. goodix_fw_update_ctrl.update_info = &update_brb;
  1183. else
  1184. goodix_fw_update_ctrl.update_info = &update_brd;
  1185. goodix_fw_update_ctrl.initialized = 1;
  1186. return 0;
  1187. }
  1188. void goodix_fw_update_uninit(void)
  1189. {
  1190. if (!goodix_fw_update_ctrl.initialized)
  1191. return;
  1192. mutex_lock(&goodix_fw_update_ctrl.mutex);
  1193. goodix_fw_sysfs_remove();
  1194. goodix_fw_update_ctrl.initialized = 0;
  1195. mutex_unlock(&goodix_fw_update_ctrl.mutex);
  1196. mutex_destroy(&goodix_fw_update_ctrl.mutex);
  1197. }