blob: 7a428a3f6c6f0f5feefc06aea9f19e2c13270cb7 [file] [log] [blame]
Wang Yafeifa2e93e2018-07-03 17:30:32 +05301/*
2 * Goodix GT9xx touchscreen driver
3 *
4 * Copyright (C) 2016 - 2017 Goodix. Ltd.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be a reference
12 * to you, when you are integrating the GOODiX's CTP IC into your system,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 */
18
19#include <linux/kthread.h>
20#include "gt9xx.h"
21
22#include <linux/namei.h>
23#include <linux/mount.h>
24#include <linux/firmware.h>
25#include <linux/ctype.h>
26
27#define GUP_REG_HW_INFO 0x4220
28#define GUP_REG_FW_MSG 0x41E4
29#define GUP_REG_PID_VID 0x8140
30
31#define FIRMWARE_NAME_LEN_MAX 256
32#define GOODIX_FIRMWARE_FILE_NAME "goodix_firmware.bin"
33#define GOODIX_CONFIG_FILE_NAME "goodix_config.cfg"
34
35#define FW_HEAD_LENGTH 14
36#define FW_SECTION_LENGTH 0x2000 /* 8K */
37#define FW_DSP_ISP_LENGTH 0x1000 /* 4K */
38#define FW_DSP_LENGTH 0x1000 /* 4K */
39#define FW_BOOT_LENGTH 0x800 /* 2K */
40#define FW_SS51_LENGTH (4 * FW_SECTION_LENGTH) /* 32K */
41#define FW_BOOT_ISP_LENGTH 0x800 /* 2k */
42#define FW_GLINK_LENGTH 0x3000 /* 12k */
43#define FW_GWAKE_LENGTH (4 * FW_SECTION_LENGTH) /* 32k */
44
45#define DELAY_FOR_SENDCFG 500
46#define PACK_SIZE 256
47#define MAX_FRAME_CHECK_TIME 5
48
49#define _bRW_MISCTL__SRAM_BANK 0x4048
50#define _bRW_MISCTL__MEM_CD_EN 0x4049
51#define _bRW_MISCTL__CACHE_EN 0x404B
52#define _bRW_MISCTL__TMR0_EN 0x40B0
53#define _rRW_MISCTL__SWRST_B0_ 0x4180
54#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184
55#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190
56#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218
57#define _rRW_MISCTL__BOOT_CTL_ 0x5094
58
59#pragma pack(1)
60struct st_fw_head {
61 u8 hw_info[4]; /* hardware info */
62 u8 pid[8]; /* product id */
63 u16 vid; /* version id */
64};
65#pragma pack()
66
67struct st_update_msg {
68 u8 fw_damaged;
69 u8 fw_flag;
70 const u8 *fw_data;
71 struct file *cfg_file;
72 struct st_fw_head ic_fw_msg;
73 u32 fw_total_len;
74 u32 fw_burned_len;
75 const struct firmware *fw;
76} update_msg;
77
78struct st_update_msg update_msg;
79
80u16 show_len;
81u16 total_len;
82
83static u8 gup_burn_fw_gwake_section(struct i2c_client *client,
84 u8 *fw_section, u16 start_addr,
85 u32 len, u8 bank_cmd);
86
87static s32 gup_init_panel(struct goodix_ts_data *ts)
88{
89 s32 ret = 0;
90 u8 opr_buf[16];
91 u8 sensor_id = 0;
92 u8 drv_cfg_version;
93 u8 flash_cfg_version;
94 struct goodix_config_data *cfg = &ts->pdata->config;
95
96 if (cfg->length < GTP_CONFIG_MIN_LENGTH) {
97 dev_err(&ts->client->dev,
98 "No valid config with sensor_ID(%d) ",
99 sensor_id);
100
101 return -EPERM;
102 }
103
104 ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA,
105 &opr_buf[0], 1);
106 if (ret == SUCCESS) {
107 dev_dbg(&ts->client->dev,
108 "CFG_GROUP%d Config Version: %d, IC Config Version: %d",
109 sensor_id, cfg->data[GTP_ADDR_LENGTH], opr_buf[0]);
110
111 flash_cfg_version = opr_buf[0];
112 drv_cfg_version = cfg->data[GTP_ADDR_LENGTH];
113
114 if (flash_cfg_version < 90 &&
115 flash_cfg_version > drv_cfg_version)
116 cfg->data[GTP_ADDR_LENGTH] = 0x00;
117 } else {
118 dev_err(&ts->client->dev,
119 "Failed to get ic config version!No config sent!");
120 return -EPERM;
121 }
122
123 ret = gtp_send_cfg(ts->client);
124 if (ret < 0)
125 dev_err(&ts->client->dev, "Send config error.");
126 else
127 usleep_range(10000, 11000);
128
129 /* restore config vrsion */
130 cfg->data[GTP_ADDR_LENGTH] = drv_cfg_version;
131
132 return 0;
133}
134
135
136static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8 *msg, s32 len)
137{
138 s32 i = 0;
139
140 msg[0] = (addr >> 8) & 0xff;
141 msg[1] = addr & 0xff;
142
143 for (i = 0; i < 5; i++) {
144 if (gtp_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0)
145 break;
146 }
147
148 if (i >= 5) {
149 dev_err(&client->dev,
150 "Read data from 0x%02x%02x failed!",
151 msg[0], msg[1]);
152 return FAIL;
153 }
154
155 return SUCCESS;
156}
157
158static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val)
159{
160 s32 i = 0;
161 u8 msg[3];
162
163 msg[0] = (addr >> 8) & 0xff;
164 msg[1] = addr & 0xff;
165 msg[2] = val;
166
167 for (i = 0; i < 5; i++) {
168 if (gtp_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0)
169 break;
170 }
171
172 if (i >= 5) {
173 dev_err(&client->dev,
174 "Set data to 0x%02x%02x failed!", msg[0], msg[1]);
175 return FAIL;
176 }
177
178 return SUCCESS;
179}
180
181static u8 gup_get_ic_fw_msg(struct i2c_client *client)
182{
183 s32 ret = -1;
184 u8 retry = 0;
185 u8 buf[16];
186 u8 i;
187
188 /* step1:get hardware info */
189 ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO,
190 &buf[GTP_ADDR_LENGTH], 4);
191 if (ret == FAIL) {
192 dev_err(&client->dev, "[get_ic_fw_msg]get hw_info failed,exit");
193 return FAIL;
194 }
195
196 /* buf[2~5]: 00 06 90 00
197 * hw_info: 00 90 06 00
198 */
199 for (i = 0; i < 4; i++)
200 update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i];
201 dev_dbg(&client->dev,
202 "IC Hardware info:%02x%02x%02x%02x",
203 update_msg.ic_fw_msg.hw_info[0],
204 update_msg.ic_fw_msg.hw_info[1],
205 update_msg.ic_fw_msg.hw_info[2],
206 update_msg.ic_fw_msg.hw_info[3]);
207 /* step2:get firmware message */
208 for (retry = 0; retry < 2; retry++) {
209 ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1);
210 if (ret == FAIL) {
211 dev_err(&client->dev, "Read firmware message fail.");
212 return ret;
213 }
214
215 update_msg.fw_damaged = buf[GTP_ADDR_LENGTH];
216 if ((update_msg.fw_damaged != 0xBE) && (!retry)) {
217 dev_info(&client->dev, "The check sum in ic is error.");
218 dev_info(&client->dev, "The IC will be updated by force.");
219 continue;
220 }
221 break;
222 }
223 dev_dbg(&client->dev,
224 "IC force update flag:0x%x", update_msg.fw_damaged);
225
226 /* step3:get pid & vid */
227 ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID,
228 &buf[GTP_ADDR_LENGTH], 6);
229 if (ret == FAIL) {
230 dev_err(&client->dev, "[get_ic_fw_msg]get pid & vid failed,exit");
231 return FAIL;
232 }
233
234 memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid));
235 memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4);
236 dev_dbg(&client->dev, "IC Product id:%s", update_msg.ic_fw_msg.pid);
237
238 /* GT9XX PID MAPPING */
239 /*|-----FLASH-----RAM-----|
240 *|------918------918-----|
241 *|------968------968-----|
242 *|------913------913-----|
243 *|------913P-----913P----|
244 *|------927------927-----|
245 *|------927P-----927P----|
246 *|------9110-----9110----|
247 *|------9110P----9111----|
248 */
249 if (update_msg.ic_fw_msg.pid[0] != 0) {
250 if (!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) {
251 dev_dbg(&client->dev, "IC Mapping Product id:%s",
252 update_msg.ic_fw_msg.pid);
253 memcpy(update_msg.ic_fw_msg.pid, "9110P", 5);
254 }
255 }
256
257 update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH + 4] +
258 (buf[GTP_ADDR_LENGTH + 5] << 8);
259 dev_dbg(&client->dev, "IC version id:%04x", update_msg.ic_fw_msg.vid);
260
261 return SUCCESS;
262}
263
264s32 gup_enter_update_mode(struct i2c_client *client)
265{
266 s32 ret = -1;
267 s32 retry = 0;
268 u8 rd_buf[3];
269
270 struct goodix_ts_data *ts = i2c_get_clientdata(client);
271
272 /* step1:RST output low last at least 2ms */
273 if (!gpio_is_valid(ts->pdata->rst_gpio)) {
274 dev_err(&ts->client->dev, "update failed, no rst pin\n");
275 return FAIL;
276 }
277 gtp_rst_output(ts, 0);
278 usleep_range(2000, 3000);
279
280 /* step2:select I2C slave addr,INT:0--0xBA;1--0x28. */
281 gtp_int_output(ts, client->addr == 0x14);
282 usleep_range(2000, 3000);
283
284 /* step3:RST output high reset guitar */
285 gtp_rst_output(ts, 1);
286
287 /* 20121211 modify start */
288 usleep_range(5000, 6000);
289 while (retry++ < 200) {
290 /* step4:Hold ss51 & dsp */
291 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
292 if (ret <= 0) {
293 dev_dbg(&client->dev,
294 "Hold ss51 & dsp I2C error,retry:%d",
295 retry);
296 continue;
297 }
298
299 /* step5:Confirm hold */
300 ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1);
301 if (ret <= 0) {
302 dev_dbg(&client->dev,
303 "Hold ss51 & dsp I2C error,retry:%d",
304 retry);
305 continue;
306 }
307 if (rd_buf[GTP_ADDR_LENGTH] == 0x0C) {
308 dev_dbg(&client->dev, "Hold ss51 & dsp confirm SUCCESS");
309 break;
310 }
311 dev_dbg(&client->dev,
312 "Hold ss51 & dsp confirm 0x4180 failed,value:%d",
313 rd_buf[GTP_ADDR_LENGTH]);
314 }
315 if (retry >= 200) {
316 dev_err(&client->dev, "Enter update Hold ss51 failed.");
317 return FAIL;
318 }
319
320 /* step6:DSP_CK and DSP_ALU_CK PowerOn */
321 ret = gup_set_ic_msg(client, 0x4010, 0x00);
322
323 /* 20121211 modify end */
324 return ret;
325}
326
327void gup_leave_update_mode(struct i2c_client *client)
328{
329 struct goodix_ts_data *ts = i2c_get_clientdata(client);
330
331 if (ts->pdata->int_sync && ts->pinctrl.pinctrl)
332 pinctrl_select_state(ts->pinctrl.pinctrl,
333 ts->pinctrl.int_input);
334 else if (ts->pdata->int_sync && gpio_is_valid(ts->pdata->irq_gpio))
335 gpio_direction_input(ts->pdata->irq_gpio);
336 dev_dbg(&client->dev, "[leave_update_mode]reset chip.");
337 gtp_reset_guitar(i2c_connect_client, 20);
338}
339
340static u8 gup_enter_update_judge(struct i2c_client *client,
341 struct st_fw_head *fw_head)
342{
343 u16 u16_tmp;
344 s32 i = 0;
345 u32 fw_len = 0;
346 s32 pid_cmp_len = 0;
347
348 u16_tmp = fw_head->vid;
349 fw_head->vid = (u16)(u16_tmp>>8) + (u16)(u16_tmp<<8);
350
351 dev_info(&client->dev, "FILE HARDWARE INFO:%*ph\n", 4,
352 &fw_head->hw_info[0]);
353 dev_info(&client->dev, "FILE PID:%s\n", fw_head->pid);
354 dev_info(&client->dev, "FILE VID:%04x\n", fw_head->vid);
355
356 dev_info(&client->dev, "IC HARDWARE INFO:%*ph\n", 4,
357 &update_msg.ic_fw_msg.hw_info[0]);
358 dev_info(&client->dev, "IC PID:%s\n", update_msg.ic_fw_msg.pid);
359 dev_info(&client->dev, "IC VID:%04x\n", update_msg.ic_fw_msg.vid);
360
361 if (!memcmp(fw_head->pid, "9158", 4) &&
362 !memcmp(update_msg.ic_fw_msg.pid, "915S", 4)) {
363 dev_info(&client->dev, "Update GT915S to GT9158 directly!");
364 return SUCCESS;
365 }
366 /* First two conditions */
367 if (!memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info,
368 sizeof(update_msg.ic_fw_msg.hw_info))) {
369 fw_len = 42 * 1024;
370 } else {
371 fw_len = fw_head->hw_info[3];
372 fw_len += (((u32)fw_head->hw_info[2]) << 8);
373 fw_len += (((u32)fw_head->hw_info[1]) << 16);
374 fw_len += (((u32)fw_head->hw_info[0]) << 24);
375 }
376 if (update_msg.fw_total_len != fw_len) {
377 dev_err(&client->dev,
378 "Inconsistent firmware size, Update aborted!");
379 dev_err(&client->dev,
380 " Default size: %d(%dK), actual size: %d(%dK)",
381 fw_len, fw_len/1024, update_msg.fw_total_len,
382 update_msg.fw_total_len/1024);
383 return FAIL;
384 }
385 dev_info(&client->dev, "Firmware length:%d(%dK)",
386 update_msg.fw_total_len,
387 update_msg.fw_total_len/1024);
388
389 if (update_msg.fw_damaged != 0xBE) {
390 dev_info(&client->dev, "FW chksum error,need enter update.");
391 return SUCCESS;
392 }
393
394 /* 20130523 start */
395 if (strlen(update_msg.ic_fw_msg.pid) < 3) {
396 dev_info(&client->dev, "Illegal IC pid, need enter update");
397 return SUCCESS;
398 }
399
400 /* check pid legality */
401 for (i = 0; i < 3; i++) {
402 if (!isdigit(update_msg.ic_fw_msg.pid[i])) {
403 dev_info(&client->dev,
404 "Illegal IC pid, need enter update");
405 return SUCCESS;
406 }
407 }
408 /* 20130523 end */
409
410 pid_cmp_len = strlen(fw_head->pid);
411 if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid))
412 pid_cmp_len = strlen(update_msg.ic_fw_msg.pid);
413
414 if ((!memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) ||
415 (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4)) ||
416 (!memcmp(fw_head->pid, "91XX", 4))) {
417 if (!memcmp(fw_head->pid, "91XX", 4))
418 dev_dbg(&client->dev,
419 "Force none same pid update mode.");
420 else
421 dev_dbg(&client->dev, "Get the same pid.");
422
423 /* The third condition */
424 if (fw_head->vid != update_msg.ic_fw_msg.vid) {
425 dev_info(&client->dev, "Need enter update.");
426 return SUCCESS;
427 }
428 dev_err(&client->dev, "File VID == Ic VID, update aborted!");
429 } else {
430 dev_err(&client->dev, "File PID != Ic PID, update aborted!");
431 }
432
433 return FAIL;
434}
435
436static int gup_update_config(struct i2c_client *client)
437{
438 s32 ret = 0;
439 s32 i = 0;
440 s32 file_cfg_len = 0;
441 u8 *file_config;
442 const struct firmware *fw_cfg;
443
444 struct goodix_ts_data *ts = i2c_get_clientdata(client);
445
446 ret = request_firmware(&fw_cfg, GOODIX_CONFIG_FILE_NAME,
447 &client->dev);
448 if (ret < 0) {
449 dev_err(&client->dev,
450 "Cannot get config file - %s (%d)\n",
451 GOODIX_CONFIG_FILE_NAME, ret);
452 return -EFAULT;
453 }
454 if (!fw_cfg || !fw_cfg->data || fw_cfg->size > PAGE_SIZE) {
455 dev_err(&client->dev, "config file illegal");
456 ret = -EFAULT;
457 goto cfg_fw_err;
458 }
459
460 dev_dbg(&client->dev, "config firmware file len:%zu", fw_cfg->size);
461
462 file_config = kzalloc(GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH,
463 GFP_KERNEL);
464 if (!file_config) {
465 ret = -ENOMEM;
466 goto cfg_fw_err;
467 }
468 file_config[0] = GTP_REG_CONFIG_DATA >> 8;
469 file_config[1] = GTP_REG_CONFIG_DATA & 0xff;
470 file_cfg_len = gtp_ascii_to_array(fw_cfg->data, fw_cfg->size,
471 &file_config[GTP_ADDR_LENGTH]);
472 if (file_cfg_len < 0) {
473 dev_err(&client->dev, "failed covert ascii to hex");
474 ret = -EFAULT;
475 goto update_cfg_file_failed;
476 }
477
478 GTP_DEBUG_ARRAY(file_config + GTP_ADDR_LENGTH, file_cfg_len);
479
480 i = 0;
481 while (i++ < 5) {
482 ret = gtp_i2c_write(client, file_config, file_cfg_len + 2);
483 if (ret > 0) {
484 dev_info(&client->dev, "Send config SUCCESS.");
485 msleep(DELAY_FOR_SENDCFG);
486 break;
487 }
488 dev_err(&ts->client->dev, "Send config i2c error.");
489 }
490
491update_cfg_file_failed:
492 kfree(file_config);
493cfg_fw_err:
494 release_firmware(fw_cfg);
495 return ret;
496}
497
498static u8 gup_check_firmware_name(struct i2c_client *client,
499 u8 **path_p)
500{
501 u8 len;
502 u8 *fname;
503
504 if (!(*path_p)) {
505 *path_p = GOODIX_FIRMWARE_FILE_NAME;
506 return 0;
507 }
508
509 len = strnlen(*path_p, FIRMWARE_NAME_LEN_MAX);
510 if (len >= FIRMWARE_NAME_LEN_MAX) {
511 dev_err(&client->dev, "firmware name too long!");
512 return -EINVAL;
513 }
514
515 fname = strrchr(*path_p, '/');
516 if (fname) {
517 fname = fname + 1;
518 *path_p = fname;
519 }
520
521 return 0;
522}
523
524static u8 gup_get_update_file(struct i2c_client *client,
525 struct st_fw_head *fw_head, u8 *path)
526{
527 s32 ret = 0;
528 s32 i = 0;
529 s32 fw_checksum = 0;
530 struct goodix_ts_data *ts = i2c_get_clientdata(client);
531
532 if (ts->pdata->auto_update_cfg) {
533 ret = gup_update_config(client);
534 if (ret <= 0)
535 dev_err(&client->dev, "Update config failed.");
536 }
537
538 ret = gup_check_firmware_name(client, &path);
539 if (ret < 0)
540 return FAIL;
541
542 ret = request_firmware(&update_msg.fw, path, &client->dev);
543 if (ret < 0) {
544 dev_err(&client->dev, "Failed get firmware:%d\n", ret);
545 return FAIL;
546 }
547
548 dev_info(&client->dev, "FW File: %s size=%zu",
549 path, update_msg.fw->size);
550 update_msg.fw_data = update_msg.fw->data;
551 update_msg.fw_total_len = update_msg.fw->size;
552
553 if (update_msg.fw_total_len <
554 FW_HEAD_LENGTH + FW_SECTION_LENGTH * 4 + FW_DSP_ISP_LENGTH +
555 FW_DSP_LENGTH + FW_BOOT_LENGTH) {
556 dev_err(&client->dev,
557 "INVALID bin file(size: %d), update aborted.",
558 update_msg.fw_total_len);
559 goto invalied_fw;
560 }
561
562 update_msg.fw_total_len -= FW_HEAD_LENGTH;
563
564 dev_dbg(&client->dev, "Bin firmware actual size: %d(%dK)",
565 update_msg.fw_total_len, update_msg.fw_total_len/1024);
566
567 memcpy(fw_head, update_msg.fw_data, FW_HEAD_LENGTH);
568
569 /* check firmware legality */
570 fw_checksum = 0;
571 for (i = 0; i < update_msg.fw_total_len; i += 2) {
572 u16 temp;
573
574 temp = (update_msg.fw_data[FW_HEAD_LENGTH + i] << 8) +
575 update_msg.fw_data[FW_HEAD_LENGTH + i + 1];
576 fw_checksum += temp;
577 }
578
579 dev_dbg(&client->dev, "firmware checksum:%x", fw_checksum&0xFFFF);
580 if (fw_checksum & 0xFFFF) {
581 dev_err(&client->dev, "Illegal firmware file.");
582 goto invalied_fw;
583 }
584
585 return SUCCESS;
586
587invalied_fw:
588 update_msg.fw_data = NULL;
589 update_msg.fw_total_len = 0;
590 release_firmware(update_msg.fw);
591 return FAIL;
592}
593
594static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf,
595 u16 start_addr, u16 total_length)
596{
597 s32 ret = 0;
598 u16 burn_addr = start_addr;
599 u16 frame_length = 0;
600 u16 burn_length = 0;
601 u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH];
602 u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH];
603 u8 retry = 0;
604
605 dev_dbg(&client->dev, "Begin burn %dk data to addr 0x%x",
606 total_length / 1024, start_addr);
607 while (burn_length < total_length) {
608 dev_dbg(&client->dev,
609 "B/T:%04d/%04d", burn_length, total_length);
610 frame_length = ((total_length - burn_length)
611 > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length);
612 wr_buf[0] = (u8)(burn_addr>>8);
613 rd_buf[0] = wr_buf[0];
614 wr_buf[1] = (u8)burn_addr;
615 rd_buf[1] = wr_buf[1];
616 memcpy(&wr_buf[GTP_ADDR_LENGTH],
617 &burn_buf[burn_length], frame_length);
618
619 for (retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) {
620 ret = gtp_i2c_write(client,
621 wr_buf, GTP_ADDR_LENGTH + frame_length);
622 if (ret <= 0) {
623 dev_err(&client->dev,
624 "Write frame data i2c error.");
625 continue;
626 }
627 ret = gtp_i2c_read(client, rd_buf,
628 GTP_ADDR_LENGTH + frame_length);
629 if (ret <= 0) {
630 dev_err(&client->dev,
631 "Read back frame data i2c error.");
632 continue;
633 }
634 if (memcmp(&wr_buf[GTP_ADDR_LENGTH],
635 &rd_buf[GTP_ADDR_LENGTH], frame_length)) {
636 dev_err(&client->dev,
637 "Check frame data fail,not equal.");
638 dev_dbg(&client->dev, "write array:");
639 GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH],
640 frame_length);
641 dev_dbg(&client->dev, "read array:");
642 GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH],
643 frame_length);
644 continue;
645 } else {
646 /* dev_dbg(&client->dev,
647 * "Check frame data success.");
648 */
649 break;
650 }
651 }
652 if (retry >= MAX_FRAME_CHECK_TIME) {
653 dev_err(&client->dev,
654 "Burn frame data time out,exit.");
655 return FAIL;
656 }
657 burn_length += frame_length;
658 burn_addr += frame_length;
659 }
660
661 return SUCCESS;
662}
663
664static u8 gup_load_section_file(u8 *buf, u32 offset, u16 length, u8 set_or_end)
665{
666 if (!update_msg.fw_data ||
667 update_msg.fw_total_len < FW_HEAD_LENGTH + offset + length) {
668 pr_err("<<-GTP->> cannot load section data. fw_len=%d read end=%d\n",
669 update_msg.fw_total_len,
670 FW_HEAD_LENGTH + offset + length);
671 return FAIL;
672 }
673
674 if (set_or_end == SEEK_SET) {
675 memcpy(buf, &update_msg.fw_data[FW_HEAD_LENGTH + offset],
676 length);
677 } else {
678 /* seek end */
679 memcpy(buf, &update_msg.fw_data[update_msg.fw_total_len +
680 FW_HEAD_LENGTH - offset], length);
681 }
682
683 return SUCCESS;
684}
685
686static u8 gup_recall_check(struct i2c_client *client, u8 *chk_src,
687 u16 start_rd_addr, u16 chk_length)
688{
689 u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH];
690 s32 ret = 0;
691 u16 recall_addr = start_rd_addr;
692 u16 recall_length = 0;
693 u16 frame_length = 0;
694
695 while (recall_length < chk_length) {
696 frame_length = ((chk_length - recall_length)
697 > PACK_SIZE) ? PACK_SIZE :
698 (chk_length - recall_length);
699 ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length);
700 if (ret <= 0) {
701 dev_err(&client->dev, "recall i2c error,exit");
702 return FAIL;
703 }
704
705 if (memcmp(&rd_buf[GTP_ADDR_LENGTH],
706 &chk_src[recall_length], frame_length)) {
707 dev_err(&client->dev, "Recall frame data fail,not equal.");
708 dev_dbg(&client->dev, "chk_src array:");
709 GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length);
710 dev_dbg(&client->dev, "recall array:");
711 GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length);
712 return FAIL;
713 }
714
715 recall_length += frame_length;
716 recall_addr += frame_length;
717 }
718 dev_dbg(&client->dev,
719 "Recall check %dk firmware success.",
720 (chk_length/1024));
721
722 return SUCCESS;
723}
724
725static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section,
726 u16 start_addr, u8 bank_cmd)
727{
728 s32 ret = 0;
729 u8 rd_buf[5];
730
731 /* step1:hold ss51 & dsp */
732 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
733 if (ret <= 0) {
734 dev_err(&client->dev, "[burn_fw_section]hold ss51 & dsp fail.");
735 return FAIL;
736 }
737
738 /* step2:set scramble */
739 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00);
740 if (ret <= 0) {
741 dev_err(&client->dev, "[burn_fw_section]set scramble fail.");
742 return FAIL;
743 }
744
745 /* step3:select bank */
746 ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK,
747 (bank_cmd >> 4)&0x0F);
748 if (ret <= 0) {
749 dev_err(&client->dev,
750 "[burn_fw_section]select bank %d fail.",
751 (bank_cmd >> 4)&0x0F);
752 return FAIL;
753 }
754
755 /* step4:enable accessing code */
756 ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01);
757 if (ret <= 0) {
758 dev_err(&client->dev,
759 "[burn_fw_section]enable accessing code fail.");
760 return FAIL;
761 }
762
763 /* step5:burn 8k fw section */
764 ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH);
765 if (ret == FAIL) {
766 dev_err(&client->dev,
767 "[burn_fw_section]burn fw_section fail.");
768 return FAIL;
769 }
770
771 /* step6:hold ss51 & release dsp */
772 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04);
773 if (ret <= 0) {
774 dev_err(&client->dev,
775 "[burn_fw_section]hold ss51 & release dsp fail.");
776 return FAIL;
777 }
778 /* must delay */
779 usleep_range(1000, 2000);
780
781 /* step7:send burn cmd to move data to flash from sram */
782 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0f);
783 if (ret <= 0) {
784 dev_err(&client->dev, "[burn_fw_section]send burn cmd fail.");
785 return FAIL;
786 }
787 dev_dbg(&client->dev,
788 "[burn_fw_section]Wait for the burn is complete......");
789 do {
790 ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1);
791 if (ret <= 0) {
792 dev_err(&client->dev,
793 "[burn_fw_section]Get burn state fail");
794 return FAIL;
795 }
796 usleep_range(10000, 11000);
797 /* dev_dbg(&client->dev, "[burn_fw_section]Get burn state:%d.",
798 * rd_buf[GTP_ADDR_LENGTH]);
799 */
800 } while (rd_buf[GTP_ADDR_LENGTH]);
801
802 /* step8:select bank */
803 ret = gup_set_ic_msg(client,
804 _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4) & 0x0F);
805 if (ret <= 0) {
806 dev_err(&client->dev,
807 "[burn_fw_section]select bank %d fail.",
808 (bank_cmd >> 4)&0x0F);
809 return FAIL;
810 }
811
812 /* step9:enable accessing code */
813 ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01);
814 if (ret <= 0) {
815 dev_err(&client->dev,
816 "[burn_fw_section]enable accessing code fail.");
817 return FAIL;
818 }
819
820 /* step10:recall 8k fw section */
821 ret = gup_recall_check(client,
822 fw_section, start_addr, FW_SECTION_LENGTH);
823 if (ret == FAIL) {
824 dev_err(&client->dev,
825 "[burn_fw_section]recall check %dk firmware fail.",
826 FW_SECTION_LENGTH / 1024);
827 return FAIL;
828 }
829
830 /* step11:disable accessing code */
831 ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00);
832 if (ret <= 0) {
833 dev_err(&client->dev,
834 "[burn_fw_section]disable accessing code fail.");
835 return FAIL;
836 }
837
838 return SUCCESS;
839}
840
841static u8 gup_burn_dsp_isp(struct i2c_client *client)
842{
843 s32 ret = 0;
844 u8 *fw_dsp_isp = NULL;
845 u8 retry = 0;
846
847 dev_info(&client->dev, "[burn_dsp_isp]Begin burn dsp isp---->>");
848
849 /* step1:alloc memory */
850 dev_dbg(&client->dev, "[burn_dsp_isp]step1:alloc memory");
851 while (retry++ < 5) {
852 fw_dsp_isp = kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL);
853 if (fw_dsp_isp == NULL) {
854 continue;
855 } else {
856 dev_info(&client->dev,
857 "[burn_dsp_isp]Alloc %dk byte memory success.",
858 FW_DSP_ISP_LENGTH / 1024);
859 break;
860 }
861 }
862 if (retry >= 5) {
863 dev_err(&client->dev, "[burn_dsp_isp]Alloc memory fail,exit.");
864 return FAIL;
865 }
866
867 /* step2:load dsp isp file data */
868 dev_dbg(&client->dev, "[burn_dsp_isp]step2:load dsp isp file data");
869 ret = gup_load_section_file(fw_dsp_isp,
870 FW_DSP_ISP_LENGTH, FW_DSP_ISP_LENGTH, SEEK_END);
871 if (ret == FAIL) {
872 dev_err(&client->dev,
873 "[burn_dsp_isp]load firmware dsp_isp fail.");
874 goto exit_burn_dsp_isp;
875 }
876
877 /* step3:disable wdt,clear cache enable */
878 dev_dbg(&client->dev,
879 "[burn_dsp_isp]step3:disable wdt,clear cache enable");
880 ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00);
881 if (ret <= 0) {
882 dev_err(&client->dev, "[burn_dsp_isp]disable wdt fail.");
883 ret = FAIL;
884 goto exit_burn_dsp_isp;
885 }
886 ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00);
887 if (ret <= 0) {
888 dev_err(&client->dev,
889 "[burn_dsp_isp]clear cache enable fail.");
890 ret = FAIL;
891 goto exit_burn_dsp_isp;
892 }
893
894 /* step4:hold ss51 & dsp */
895 dev_dbg(&client->dev, "[burn_dsp_isp]step4:hold ss51 & dsp");
896 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
897 if (ret <= 0) {
898 dev_err(&client->dev, "[burn_dsp_isp]hold ss51 & dsp fail.");
899 ret = FAIL;
900 goto exit_burn_dsp_isp;
901 }
902
903 /* step5:set boot from sram */
904 dev_dbg(&client->dev, "[burn_dsp_isp]step5:set boot from sram");
905 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02);
906 if (ret <= 0) {
907 dev_err(&client->dev, "[burn_dsp_isp]set boot from sram fail");
908 ret = FAIL;
909 goto exit_burn_dsp_isp;
910 }
911
912 /* step6:software reboot */
913 dev_dbg(&client->dev, "[burn_dsp_isp]step6:software reboot");
914 ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01);
915 if (ret <= 0) {
916 dev_err(&client->dev, "[burn_dsp_isp]software reboot fail.");
917 ret = FAIL;
918 goto exit_burn_dsp_isp;
919 }
920
921 /* step7:select bank2 */
922 dev_dbg(&client->dev, "[burn_dsp_isp]step7:select bank2");
923 ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02);
924 if (ret <= 0) {
925 dev_err(&client->dev, "[burn_dsp_isp]select bank2 fail");
926 ret = FAIL;
927 goto exit_burn_dsp_isp;
928 }
929
930 /* step8:enable accessing code */
931 dev_dbg(&client->dev, "[burn_dsp_isp]step8:enable accessing code");
932 ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01);
933 if (ret <= 0) {
934 dev_err(&client->dev,
935 "[burn_dsp_isp]enable accessing code fail.");
936 ret = FAIL;
937 goto exit_burn_dsp_isp;
938 }
939
940 /* step9:burn 4k dsp_isp */
941 dev_dbg(&client->dev, "[burn_dsp_isp]step9:burn 4k dsp_isp");
942 ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH);
943 if (ret == FAIL) {
944 dev_err(&client->dev, "[burn_dsp_isp]burn dsp_isp fail.");
945 goto exit_burn_dsp_isp;
946 }
947
948 /* step10:set scramble */
949 dev_dbg(&client->dev, "[burn_dsp_isp]step10:set scramble");
950 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00);
951 if (ret <= 0) {
952 dev_err(&client->dev, "[burn_dsp_isp]set scramble fail.");
953 ret = FAIL;
954 goto exit_burn_dsp_isp;
955 }
956 update_msg.fw_burned_len += FW_DSP_ISP_LENGTH;
957 dev_dbg(&client->dev, "[burn_dsp_isp]Burned length:%d",
958 update_msg.fw_burned_len);
959 ret = SUCCESS;
960
961exit_burn_dsp_isp:
962 kfree(fw_dsp_isp);
963
964 return ret;
965}
966
967static u8 gup_burn_fw_ss51(struct i2c_client *client)
968{
969 u8 *fw_ss51 = NULL;
970 u8 retry = 0;
971 s32 ret = 0;
972
973 dev_info(&client->dev, "[burn_fw_ss51]Begin burn ss51 firmware---->>");
974
975 /* step1:alloc memory */
976 dev_dbg(&client->dev, "[burn_fw_ss51]step1:alloc memory");
977 while (retry++ < 5) {
978 fw_ss51 = kzalloc(FW_SECTION_LENGTH, GFP_KERNEL);
979 if (fw_ss51 == NULL) {
980 continue;
981 } else {
982 dev_dbg(&client->dev,
983 "[burn_fw_ss51]Alloc %dk byte memory success.",
984 (FW_SECTION_LENGTH / 1024));
985 break;
986 }
987 }
988 if (retry >= 5) {
989 dev_err(&client->dev, "[burn_fw_ss51]Alloc memory fail,exit.");
990 return FAIL;
991 }
992
993 dev_info(&client->dev, "[burn_fw_ss51]Reset first 8K of ss51 to 0xFF.");
994 dev_dbg(&client->dev, "[burn_fw_ss51]step2: reset bank0 0xC000~0xD000");
995 memset(fw_ss51, 0xFF, FW_SECTION_LENGTH);
996
997 /* step3:clear control flag */
998 dev_dbg(&client->dev, "[burn_fw_ss51]step3:clear control flag");
999 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00);
1000 if (ret <= 0) {
1001 dev_err(&client->dev, "[burn_fw_ss51]clear control flag fail.");
1002 ret = FAIL;
1003 goto exit_burn_fw_ss51;
1004 }
1005
1006 /* step4:burn ss51 firmware section 1 */
1007 dev_dbg(&client->dev,
1008 "[burn_fw_ss51]step4:burn ss51 firmware section 1");
1009 ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01);
1010 if (ret == FAIL) {
1011 dev_err(&client->dev,
1012 "[burn_fw_ss51]burn ss51 firmware section 1 fail.");
1013 goto exit_burn_fw_ss51;
1014 }
1015
1016 /* step5:load ss51 firmware section 2 file data */
1017 dev_dbg(&client->dev,
1018 "[burn_fw_ss51]step5:load ss51 firmware section 2 file data");
1019 ret = gup_load_section_file(fw_ss51,
1020 FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET);
1021 if (ret == FAIL) {
1022 dev_err(&client->dev,
1023 "[burn_fw_ss51]load ss51 firmware section 2 fail.");
1024 goto exit_burn_fw_ss51;
1025 }
1026
1027 /* step6:burn ss51 firmware section 2 */
1028 dev_dbg(&client->dev,
1029 "[burn_fw_ss51]step6:burn ss51 firmware section 2");
1030 ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02);
1031 if (ret == FAIL) {
1032 dev_err(&client->dev,
1033 "[burn_fw_ss51]burn ss51 firmware section 2 fail.");
1034 goto exit_burn_fw_ss51;
1035 }
1036
1037 /* step7:load ss51 firmware section 3 file data */
1038 dev_dbg(&client->dev,
1039 "[burn_fw_ss51]step7:load ss51 firmware section 3 file data");
1040 ret = gup_load_section_file(fw_ss51,
1041 2 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET);
1042 if (ret == FAIL) {
1043 dev_err(&client->dev,
1044 "[burn_fw_ss51]load ss51 firmware section 3 fail.");
1045 goto exit_burn_fw_ss51;
1046 }
1047
1048 /* step8:burn ss51 firmware section 3 */
1049 dev_dbg(&client->dev,
1050 "[burn_fw_ss51]step8:burn ss51 firmware section 3");
1051 ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13);
1052 if (ret == FAIL) {
1053 dev_err(&client->dev,
1054 "[burn_fw_ss51]burn ss51 firmware section 3 fail.");
1055 goto exit_burn_fw_ss51;
1056 }
1057
1058 /* step9:load ss51 firmware section 4 file data */
1059 dev_dbg(&client->dev,
1060 "[burn_fw_ss51]step9:load ss51 firmware section 4 file data");
1061 ret = gup_load_section_file(fw_ss51,
1062 3 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET);
1063 if (ret == FAIL) {
1064 dev_err(&client->dev,
1065 "[burn_fw_ss51]load ss51 firmware section 4 fail.");
1066 goto exit_burn_fw_ss51;
1067 }
1068
1069 /* step10:burn ss51 firmware section 4 */
1070 dev_dbg(&client->dev,
1071 "[burn_fw_ss51]step10:burn ss51 firmware section 4");
1072 ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14);
1073 if (ret == FAIL) {
1074 dev_err(&client->dev,
1075 "[burn_fw_ss51]burn ss51 firmware section 4 fail.");
1076 goto exit_burn_fw_ss51;
1077 }
1078
1079 update_msg.fw_burned_len += (FW_SECTION_LENGTH*4);
1080 dev_dbg(&client->dev, "[burn_fw_ss51]Burned length:%d",
1081 update_msg.fw_burned_len);
1082 ret = SUCCESS;
1083
1084exit_burn_fw_ss51:
1085 kfree(fw_ss51);
1086 return ret;
1087}
1088
1089static u8 gup_burn_fw_dsp(struct i2c_client *client)
1090{
1091 s32 ret = 0;
1092 u8 *fw_dsp = NULL;
1093 u8 retry = 0;
1094 u8 rd_buf[5];
1095
1096 dev_info(&client->dev, "[burn_fw_dsp]Begin burn dsp firmware---->>");
1097 /* step1:alloc memory */
1098 dev_dbg(&client->dev, "[burn_fw_dsp]step1:alloc memory");
1099 while (retry++ < 5) {
1100 fw_dsp = kzalloc(FW_DSP_LENGTH, GFP_KERNEL);
1101 if (fw_dsp == NULL) {
1102 continue;
1103 } else {
1104 dev_dbg(&client->dev,
1105 "[burn_fw_dsp]Alloc %dk byte memory success.",
1106 FW_SECTION_LENGTH / 1024);
1107 break;
1108 }
1109 }
1110 if (retry >= 5) {
1111 dev_err(&client->dev, "[burn_fw_dsp]Alloc memory fail,exit.");
1112 return FAIL;
1113 }
1114
1115 /* step2:load firmware dsp */
1116 dev_dbg(&client->dev, "[burn_fw_dsp]step2:load firmware dsp");
1117 ret = gup_load_section_file(fw_dsp,
1118 4 * FW_SECTION_LENGTH, FW_DSP_LENGTH, SEEK_SET);
1119 if (ret == FAIL) {
1120 dev_err(&client->dev, "[burn_fw_dsp]load firmware dsp fail.");
1121 goto exit_burn_fw_dsp;
1122 }
1123
1124 /* step3:select bank3 */
1125 dev_dbg(&client->dev, "[burn_fw_dsp]step3:select bank3");
1126 ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03);
1127 if (ret <= 0) {
1128 dev_err(&client->dev, "[burn_fw_dsp]select bank3 fail.");
1129 ret = FAIL;
1130 goto exit_burn_fw_dsp;
1131 }
1132
1133 /* step4:hold ss51 & dsp */
1134 dev_dbg(&client->dev, "[burn_fw_dsp]step4:hold ss51 & dsp");
1135 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
1136 if (ret <= 0) {
1137 dev_err(&client->dev, "[burn_fw_dsp]hold ss51 & dsp fail.");
1138 ret = FAIL;
1139 goto exit_burn_fw_dsp;
1140 }
1141
1142 /* step5:set scramble */
1143 dev_dbg(&client->dev, "[burn_fw_dsp]step5:set scramble");
1144 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00);
1145 if (ret <= 0) {
1146 dev_err(&client->dev, "[burn_fw_dsp]set scramble fail.");
1147 ret = FAIL;
1148 goto exit_burn_fw_dsp;
1149 }
1150
1151 /* step6:release ss51 & dsp */
1152 dev_dbg(&client->dev, "[burn_fw_dsp]step6:release ss51 & dsp");
1153 ret = gup_set_ic_msg(
1154 client, _rRW_MISCTL__SWRST_B0_, 0x04);/* 20121211 */
1155 if (ret <= 0) {
1156 dev_err(&client->dev, "[burn_fw_dsp]release ss51 & dsp fail.");
1157 ret = FAIL;
1158 goto exit_burn_fw_dsp;
1159 }
1160 /* must delay */
1161 usleep_range(1000, 1100);
1162
1163 /* step7:burn 4k dsp firmware */
1164 dev_dbg(&client->dev, "[burn_fw_dsp]step7:burn 4k dsp firmware");
1165 ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH);
1166 if (ret == FAIL) {
1167 dev_err(&client->dev, "[burn_fw_dsp]burn fw_section fail.");
1168 goto exit_burn_fw_dsp;
1169 }
1170
1171 /* step8:send burn cmd to move data to flash from sram */
1172 dev_dbg(&client->dev,
1173 "[burn_fw_dsp]step8:send burn cmd to move data to flash from sram");
1174 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05);
1175 if (ret <= 0) {
1176 dev_err(&client->dev, "[burn_fw_dsp]send burn cmd fail.");
1177 goto exit_burn_fw_dsp;
1178 }
1179 dev_dbg(&client->dev, "[burn_fw_dsp]Wait for the burn is complete......");
1180 do {
1181 ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1);
1182 if (ret <= 0) {
1183 dev_err(&client->dev, "[burn_fw_dsp]Get burn state fail");
1184 goto exit_burn_fw_dsp;
1185 }
1186 usleep_range(10000, 11000);
1187 /* dev_dbg(&client->dev, "[burn_fw_dsp]Get burn state:%d.",
1188 * rd_buf[GTP_ADDR_LENGTH]);
1189 */
1190 } while (rd_buf[GTP_ADDR_LENGTH]);
1191
1192 /* step9:recall check 4k dsp firmware */
1193 dev_dbg(&client->dev,
1194 "[burn_fw_dsp]step9:recall check 4k dsp firmware");
1195 ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH);
1196 if (ret == FAIL) {
1197 dev_err(&client->dev,
1198 "[burn_fw_dsp]recall check 4k dsp firmware fail.");
1199 goto exit_burn_fw_dsp;
1200 }
1201
1202 update_msg.fw_burned_len += FW_DSP_LENGTH;
1203 dev_dbg(&client->dev, "[burn_fw_dsp]Burned length:%d",
1204 update_msg.fw_burned_len);
1205 ret = SUCCESS;
1206
1207exit_burn_fw_dsp:
1208 kfree(fw_dsp);
1209
1210 return ret;
1211}
1212
1213static u8 gup_burn_fw_boot(struct i2c_client *client)
1214{
1215 s32 ret = 0;
1216 u8 *fw_boot = NULL;
1217 u8 retry = 0;
1218 u8 rd_buf[5];
1219
1220 dev_info(&client->dev,
1221 "[burn_fw_boot]Begin burn bootloader firmware---->>");
1222
1223 /* step1:Alloc memory */
1224 dev_dbg(&client->dev, "[burn_fw_boot]step1:Alloc memory");
1225 while (retry++ < 5) {
1226 fw_boot = kzalloc(FW_BOOT_LENGTH, GFP_KERNEL);
1227 if (fw_boot == NULL) {
1228 continue;
1229 } else {
1230 dev_dbg(&client->dev,
1231 "[burn_fw_boot]Alloc %dk byte memory success.",
1232 FW_BOOT_LENGTH / 1024);
1233 break;
1234 }
1235 }
1236 if (retry >= 5) {
1237 dev_err(&client->dev, "[burn_fw_boot]Alloc memory fail,exit.");
1238 return FAIL;
1239 }
1240
1241 /* step2:load firmware bootloader */
1242 dev_dbg(&client->dev, "[burn_fw_boot]step2:load firmware bootloader");
1243 ret = gup_load_section_file(fw_boot,
1244 (4 * FW_SECTION_LENGTH + FW_DSP_LENGTH), FW_BOOT_LENGTH, SEEK_SET);
1245 if (ret == FAIL) {
1246 dev_err(&client->dev,
1247 "[burn_fw_boot]load firmware bootcode fail.");
1248 goto exit_burn_fw_boot;
1249 }
1250
1251 /* step3:hold ss51 & dsp */
1252 dev_dbg(&client->dev, "[burn_fw_boot]step3:hold ss51 & dsp");
1253 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
1254 if (ret <= 0) {
1255 dev_err(&client->dev, "[burn_fw_boot]hold ss51 & dsp fail.");
1256 ret = FAIL;
1257 goto exit_burn_fw_boot;
1258 }
1259
1260 /* step4:set scramble */
1261 dev_dbg(&client->dev, "[burn_fw_boot]step4:set scramble");
1262 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00);
1263 if (ret <= 0) {
1264 dev_err(&client->dev, "[burn_fw_boot]set scramble fail.");
1265 ret = FAIL;
1266 goto exit_burn_fw_boot;
1267 }
1268
1269 /* step5:hold ss51 & release dsp */
1270 dev_dbg(&client->dev, "[burn_fw_boot]step5:hold ss51 & release dsp");
1271 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04);
1272 /* 20121211 */
1273 if (ret <= 0) {
1274 dev_err(&client->dev, "[burn_fw_boot]release ss51 & dsp fail");
1275 ret = FAIL;
1276 goto exit_burn_fw_boot;
1277 }
1278 /* must delay */
1279 usleep_range(1000, 1100);
1280
1281 /* step6:select bank3 */
1282 dev_dbg(&client->dev, "[burn_fw_boot]step6:select bank3");
1283 ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03);
1284 if (ret <= 0) {
1285 dev_err(&client->dev, "[burn_fw_boot]select bank3 fail.");
1286 ret = FAIL;
1287 goto exit_burn_fw_boot;
1288 }
1289
1290 /* step6:burn 2k bootloader firmware */
1291 dev_dbg(&client->dev,
1292 "[burn_fw_boot]step6:burn 2k bootloader firmware");
1293 ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH);
1294 if (ret == FAIL) {
1295 dev_err(&client->dev, "[burn_fw_boot]burn fw_boot fail.");
1296 goto exit_burn_fw_boot;
1297 }
1298
1299 /* step7:send burn cmd to move data to flash from sram */
1300 dev_dbg(&client->dev,
1301 "[burn_fw_boot]step7:send burn cmd to move data to flash from sram");
1302 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06);
1303 if (ret <= 0) {
1304 dev_err(&client->dev, "[burn_fw_boot]send burn cmd fail.");
1305 goto exit_burn_fw_boot;
1306 }
1307 dev_dbg(&client->dev,
1308 "[burn_fw_boot]Wait for the burn is complete......");
1309 do {
1310 ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1);
1311 if (ret <= 0) {
1312 dev_err(&client->dev,
1313 "[burn_fw_boot]Get burn state fail");
1314 goto exit_burn_fw_boot;
1315 }
1316 usleep_range(10000, 11000);
1317 /* dev_dbg(&client->dev, "[burn_fw_boot]Get burn state:%d.",
1318 * rd_buf[GTP_ADDR_LENGTH]);
1319 */
1320 } while (rd_buf[GTP_ADDR_LENGTH]);
1321
1322 /* step8:recall check 2k bootloader firmware */
1323 dev_dbg(&client->dev,
1324 "[burn_fw_boot]step8:recall check 2k bootloader firmware");
1325 ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH);
1326 if (ret == FAIL) {
1327 dev_err(&client->dev,
1328 "[burn_fw_boot]recall check 2k bootcode firmware fail");
1329 goto exit_burn_fw_boot;
1330 }
1331
1332 update_msg.fw_burned_len += FW_BOOT_LENGTH;
1333 dev_dbg(&client->dev, "[burn_fw_boot]Burned length:%d",
1334 update_msg.fw_burned_len);
1335 ret = SUCCESS;
1336
1337exit_burn_fw_boot:
1338 kfree(fw_boot);
1339
1340 return ret;
1341}
1342static u8 gup_burn_fw_boot_isp(struct i2c_client *client)
1343{
1344 s32 ret = 0;
1345 u8 *fw_boot_isp = NULL;
1346 u8 retry = 0;
1347 u8 rd_buf[5];
1348
1349 if (update_msg.fw_burned_len >= update_msg.fw_total_len) {
1350 dev_dbg(&client->dev, "No need to upgrade the boot_isp code!");
1351 return SUCCESS;
1352 }
1353 dev_info(&client->dev,
1354 "[burn_fw_boot_isp]Begin burn boot_isp firmware---->>");
1355
1356 /* step1:Alloc memory */
1357 dev_dbg(&client->dev, "[burn_fw_boot_isp]step1:Alloc memory");
1358 while (retry++ < 5) {
1359 fw_boot_isp = kzalloc(FW_BOOT_ISP_LENGTH, GFP_KERNEL);
1360 if (fw_boot_isp == NULL) {
1361 continue;
1362 } else {
1363 dev_dbg(&client->dev,
1364 "[burn_fw_boot_isp]Alloc %dk byte memory success.",
1365 (FW_BOOT_ISP_LENGTH/1024));
1366 break;
1367 }
1368 }
1369 if (retry >= 5) {
1370 dev_err(&client->dev,
1371 "[burn_fw_boot_isp]Alloc memory fail,exit.");
1372 return FAIL;
1373 }
1374
1375 /* step2:load firmware bootloader */
1376 dev_dbg(&client->dev,
1377 "[burn_fw_boot_isp]step2:load firmware bootloader isp");
1378 /* ret = gup_load_section_file(fw_boot_isp,
1379 * (4*FW_SECTION_LENGTH+FW_DSP_LENGTH +
1380 * FW_BOOT_LENGTH+FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET);
1381 */
1382 ret = gup_load_section_file(fw_boot_isp,
1383 (update_msg.fw_burned_len - FW_DSP_ISP_LENGTH),
1384 FW_BOOT_ISP_LENGTH, SEEK_SET);
1385 if (ret == FAIL) {
1386 dev_err(&client->dev,
1387 "[burn_fw_boot_isp]load firmware boot_isp fail.");
1388 goto exit_burn_fw_boot_isp;
1389 }
1390
1391 /* step3:hold ss51 & dsp */
1392 dev_dbg(&client->dev, "[burn_fw_boot_isp]step3:hold ss51 & dsp");
1393 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
1394 if (ret <= 0) {
1395 dev_err(&client->dev, "[burn_fw_boot_isp]hold ss51 & dsp fail");
1396 ret = FAIL;
1397 goto exit_burn_fw_boot_isp;
1398 }
1399
1400 /* step4:set scramble */
1401 dev_dbg(&client->dev, "[burn_fw_boot_isp]step4:set scramble");
1402 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00);
1403 if (ret <= 0) {
1404 dev_err(&client->dev, "[burn_fw_boot_isp]set scramble fail.");
1405 ret = FAIL;
1406 goto exit_burn_fw_boot_isp;
1407 }
1408
1409
1410 /* step5:hold ss51 & release dsp */
1411 dev_dbg(&client->dev,
1412 "[burn_fw_boot_isp]step5:hold ss51 & release dsp");
1413 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04);
1414 /* 20121211 */
1415 if (ret <= 0) {
1416 dev_err(&client->dev,
1417 "[burn_fw_boot_isp]release ss51 & dsp fail.");
1418 ret = FAIL;
1419 goto exit_burn_fw_boot_isp;
1420 }
1421 /* must delay */
1422 usleep_range(1000, 2000);
1423
1424 /* step6:select bank3 */
1425 dev_dbg(&client->dev, "[burn_fw_boot_isp]step6:select bank3");
1426 ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03);
1427 if (ret <= 0) {
1428 dev_err(&client->dev, "[burn_fw_boot_isp]select bank3 fail.");
1429 ret = FAIL;
1430 goto exit_burn_fw_boot_isp;
1431 }
1432
1433 /* step7:burn 2k bootload_isp firmware */
1434 dev_dbg(&client->dev,
1435 "[burn_fw_boot_isp]step7:burn 2k bootloader firmware");
1436 ret = gup_burn_proc(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH);
1437 if (ret == FAIL) {
1438 dev_err(&client->dev,
1439 "[burn_fw_boot_isp]burn fw_section fail.");
1440 goto exit_burn_fw_boot_isp;
1441 }
1442
1443 /* step7:send burn cmd to move data to flash from sram */
1444 dev_dbg(&client->dev,
1445 "[burn_fw_boot_isp]step8:send burn cmd to move data to flash from sram");
1446 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x07);
1447 if (ret <= 0) {
1448 dev_err(&client->dev, "[burn_fw_boot_isp]send burn cmd fail.");
1449 goto exit_burn_fw_boot_isp;
1450 }
1451 dev_dbg(&client->dev,
1452 "[burn_fw_boot_isp]Wait for the burn is complete......");
1453 do {
1454 ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1);
1455 if (ret <= 0) {
1456 dev_err(&client->dev,
1457 "[burn_fw_boot_isp]Get burn state fail");
1458 goto exit_burn_fw_boot_isp;
1459 }
1460 usleep_range(10000, 11000);
1461 /* dev_dbg(&client->dev, "[burn_fw_boot_isp]Get
1462 * burn state:%d.", rd_buf[GTP_ADDR_LENGTH]);
1463 */
1464 } while (rd_buf[GTP_ADDR_LENGTH]);
1465
1466 /* step8:recall check 2k bootload_isp firmware */
1467 dev_dbg(&client->dev,
1468 "[burn_fw_boot_isp]step9:recall check 2k bootloader firmware");
1469 ret = gup_recall_check(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH);
1470 if (ret == FAIL) {
1471 dev_err(&client->dev,
1472 "[burn_fw_boot_isp]recall check 2k bootcode_isp firmware fail.");
1473 goto exit_burn_fw_boot_isp;
1474 }
1475
1476 update_msg.fw_burned_len += FW_BOOT_ISP_LENGTH;
1477 dev_dbg(&client->dev,
1478 "[burn_fw_boot_isp]Burned length:%d", update_msg.fw_burned_len);
1479 ret = SUCCESS;
1480
1481exit_burn_fw_boot_isp:
1482 kfree(fw_boot_isp);
1483
1484 return ret;
1485}
1486
1487static u8 gup_burn_fw_link(struct i2c_client *client)
1488{
1489 u8 *fw_link = NULL;
1490 u8 retry = 0;
1491 s32 ret = 0;
1492 u32 offset;
1493
1494 if (update_msg.fw_burned_len >= update_msg.fw_total_len) {
1495 dev_dbg(&client->dev, "No need to upgrade the link code!");
1496 return SUCCESS;
1497 }
1498 dev_info(&client->dev, "[burn_fw_link]Begin burn link firmware---->>");
1499
1500 /* step1:Alloc memory */
1501 dev_dbg(&client->dev, "[burn_fw_link]step1:Alloc memory");
1502 while (retry++ < 5) {
1503 fw_link = kzalloc(FW_SECTION_LENGTH, GFP_KERNEL);
1504 if (fw_link == NULL) {
1505 continue;
1506 } else {
1507 dev_dbg(&client->dev,
1508 "[burn_fw_link]Alloc %dk byte memory success.",
1509 (FW_SECTION_LENGTH/1024));
1510 break;
1511 }
1512 }
1513 if (retry >= 5) {
1514 dev_err(&client->dev, "[burn_fw_link]Alloc memory fail,exit.");
1515 return FAIL;
1516 }
1517
1518 /* step2:load firmware link section 1 */
1519 dev_dbg(&client->dev,
1520 "[burn_fw_link]step2:load firmware link section 1");
1521 offset = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH;
1522 ret = gup_load_section_file(
1523 fw_link, offset, FW_SECTION_LENGTH, SEEK_SET);
1524 if (ret == FAIL) {
1525 dev_err(&client->dev,
1526 "[burn_fw_link]load firmware link section 1 fail.");
1527 goto exit_burn_fw_link;
1528 }
1529
1530 /* step3:burn link firmware section 1 */
1531 dev_dbg(&client->dev,
1532 "[burn_fw_link]step3:burn link firmware section 1");
1533 ret = gup_burn_fw_gwake_section(
1534 client, fw_link, 0x9000, FW_SECTION_LENGTH, 0x38);
1535
1536 if (ret == FAIL) {
1537 dev_err(&client->dev,
1538 "[burn_fw_link]burn link firmware section 1 fail.");
1539 goto exit_burn_fw_link;
1540 }
1541
1542 /* step4:load link firmware section 2 file data */
1543 dev_dbg(&client->dev,
1544 "[burn_fw_link]step4:load link firmware section 2 file data");
1545 offset += FW_SECTION_LENGTH;
1546 ret = gup_load_section_file(
1547 fw_link, offset, FW_GLINK_LENGTH - FW_SECTION_LENGTH, SEEK_SET);
1548
1549 if (ret == FAIL) {
1550 dev_err(&client->dev,
1551 "[burn_fw_link]load link firmware section 2 fail.");
1552 goto exit_burn_fw_link;
1553 }
1554
1555 /* step5:burn link firmware section 2 */
1556 dev_dbg(&client->dev,
1557 "[burn_fw_link]step4:burn link firmware section 2");
1558 ret = gup_burn_fw_gwake_section(client,
1559 fw_link, 0x9000, FW_GLINK_LENGTH - FW_SECTION_LENGTH, 0x39);
1560
1561 if (ret == FAIL) {
1562 dev_err(&client->dev,
1563 "[burn_fw_link]burn link firmware section 2 fail.");
1564 goto exit_burn_fw_link;
1565 }
1566
1567 update_msg.fw_burned_len += FW_GLINK_LENGTH;
1568 dev_dbg(&client->dev,
1569 "[burn_fw_link]Burned length:%d", update_msg.fw_burned_len);
1570 ret = SUCCESS;
1571
1572exit_burn_fw_link:
1573 kfree(fw_link);
1574
1575 return ret;
1576}
1577
1578static u8 gup_burn_fw_gwake_section(struct i2c_client *client,
1579 u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd)
1580{
1581 s32 ret = 0;
1582 u8 rd_buf[5];
1583
1584 /* step1:hold ss51 & dsp */
1585 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C);
1586 if (ret <= 0) {
1587 dev_err(&client->dev,
1588 "[burn_fw_app_section]hold ss51 & dsp fail.");
1589 return FAIL;
1590 }
1591
1592 /* step2:set scramble */
1593 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00);
1594 if (ret <= 0) {
1595 dev_err(&client->dev,
1596 "[burn_fw_app_section]set scramble fail.");
1597 return FAIL;
1598 }
1599
1600 /* step3:hold ss51 & release dsp */
1601 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04);
1602 if (ret <= 0) {
1603 dev_err(&client->dev,
1604 "[burn_fw_app_section]hold ss51 & release dsp fail.");
1605 return FAIL;
1606 }
1607 /* must delay */
1608 usleep_range(1000, 2000);
1609
1610 /* step4:select bank */
1611 ret = gup_set_ic_msg(
1612 client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F);
1613 if (ret <= 0) {
1614 dev_err(&client->dev,
1615 "[burn_fw_section]select bank %d fail.",
1616 (bank_cmd >> 4)&0x0F);
1617 return FAIL;
1618 }
1619
1620 /* step5:burn fw section */
1621 ret = gup_burn_proc(client, fw_section, start_addr, len);
1622 if (ret == FAIL) {
1623 dev_err(&client->dev,
1624 "[burn_fw_app_section]burn fw_section fail.");
1625 return FAIL;
1626 }
1627
1628 /* step6:send burn cmd to move data to flash from sram */
1629 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0F);
1630 if (ret <= 0) {
1631 dev_err(&client->dev,
1632 "[burn_fw_app_section]send burn cmd fail.");
1633 return FAIL;
1634 }
1635 dev_dbg(&client->dev,
1636 "[burn_fw_section]Wait for the burn is complete......");
1637 do {
1638 ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1);
1639 if (ret <= 0) {
1640 dev_err(&client->dev,
1641 "[burn_fw_app_section]Get burn state fail");
1642 return FAIL;
1643 }
1644 usleep_range(10000, 11000);
1645 /* dev_dbg(&client->dev, "[burn_fw_app_section]Get burn state:%d."
1646 * rd_buf[GTP_ADDR_LENGTH]);
1647 */
1648 } while (rd_buf[GTP_ADDR_LENGTH]);
1649
1650 /* step7:recall fw section */
1651 ret = gup_recall_check(client, fw_section, start_addr, len);
1652 if (ret == FAIL) {
1653 dev_err(&client->dev,
1654 "[burn_fw_app_section]recall check %dk firmware fail.",
1655 len/1024);
1656 return FAIL;
1657 }
1658
1659 return SUCCESS;
1660}
1661
1662static u8 gup_burn_fw_gwake(struct i2c_client *client)
1663{
1664 u8 *fw_gwake = NULL;
1665 u8 retry = 0;
1666 s32 ret = 0;
1667 u16 start_index = 4*FW_SECTION_LENGTH +
1668 FW_DSP_LENGTH + FW_BOOT_LENGTH +
1669 FW_BOOT_ISP_LENGTH + FW_GLINK_LENGTH;/* 32 + 4 + 2 + 4 = 42K */
1670 /* u16 start_index; */
1671
1672 if (start_index >= update_msg.fw_total_len) {
1673 dev_dbg(&client->dev, "No need to upgrade the gwake code!");
1674 return SUCCESS;
1675 }
1676 /* start_index = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; */
1677 dev_info(&client->dev,
1678 "[burn_fw_gwake]Begin burn gwake firmware---->>");
1679
1680 /* step1:alloc memory */
1681 dev_dbg(&client->dev, "[burn_fw_gwake]step1:alloc memory");
1682 while (retry++ < 5) {
1683 fw_gwake =
1684 kzalloc(FW_SECTION_LENGTH, GFP_KERNEL);
1685 if (fw_gwake == NULL) {
1686 continue;
1687 } else {
1688 dev_dbg(&client->dev,
1689 "[burn_fw_gwake]Alloc %dk byte memory success.",
1690 (FW_SECTION_LENGTH/1024));
1691 break;
1692 }
1693 }
1694 if (retry >= 5) {
1695 dev_err(&client->dev, "[burn_fw_gwake]Alloc memory fail,exit.");
1696 return FAIL;
1697 }
1698
1699 /* clear control flag */
1700 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00);
1701 if (ret <= 0) {
1702 dev_err(&client->dev,
1703 "[burn_fw_finish]clear control flag fail.");
1704 goto exit_burn_fw_gwake;
1705 }
1706
1707 /* step2:load app_code firmware section 1 file data */
1708 dev_dbg(&client->dev,
1709 "[burn_fw_gwake]step2:load app_code firmware section 1 file data");
1710 ret = gup_load_section_file(fw_gwake,
1711 start_index, FW_SECTION_LENGTH, SEEK_SET);
1712 if (ret == FAIL) {
1713 dev_err(&client->dev,
1714 "[burn_fw_gwake]load app_code firmware section 1 fail.");
1715 goto exit_burn_fw_gwake;
1716 }
1717
1718 /* step3:burn app_code firmware section 1 */
1719 dev_dbg(&client->dev,
1720 "[burn_fw_gwake]step3:burn app_code firmware section 1");
1721 ret = gup_burn_fw_gwake_section(client,
1722 fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3A);
1723 if (ret == FAIL) {
1724 dev_err(&client->dev,
1725 "[burn_fw_gwake]burn app_code firmware section 1 fail.");
1726 goto exit_burn_fw_gwake;
1727 }
1728
1729 /* step5:load app_code firmware section 2 file data */
1730 dev_dbg(&client->dev,
1731 "[burn_fw_gwake]step5:load app_code firmware section 2 file data");
1732 ret = gup_load_section_file(
1733 fw_gwake, start_index+FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET);
1734 if (ret == FAIL) {
1735 dev_err(&client->dev,
1736 "[burn_fw_gwake]load app_code firmware section 2 fail.");
1737 goto exit_burn_fw_gwake;
1738 }
1739
1740 /* step6:burn app_code firmware section 2 */
1741 dev_dbg(&client->dev,
1742 "[burn_fw_gwake]step6:burn app_code firmware section 2");
1743 ret = gup_burn_fw_gwake_section(client,
1744 fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3B);
1745 if (ret == FAIL) {
1746 dev_err(&client->dev,
1747 "[burn_fw_gwake]burn app_code firmware section 2 fail.");
1748 goto exit_burn_fw_gwake;
1749 }
1750
1751 /* step7:load app_code firmware section 3 file data */
1752 dev_dbg(&client->dev,
1753 "[burn_fw_gwake]step7:load app_code firmware section 3 file data");
1754 ret = gup_load_section_file(
1755 fw_gwake, start_index + 2*FW_SECTION_LENGTH,
1756 FW_SECTION_LENGTH, SEEK_SET);
1757 if (ret == FAIL) {
1758 dev_err(&client->dev,
1759 "[burn_fw_gwake]load app_code firmware section 3 fail.");
1760 goto exit_burn_fw_gwake;
1761 }
1762
1763 /* step8:burn app_code firmware section 3 */
1764 dev_dbg(&client->dev,
1765 "[burn_fw_gwake]step8:burn app_code firmware section 3");
1766 ret = gup_burn_fw_gwake_section(
1767 client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3C);
1768 if (ret == FAIL) {
1769 dev_err(&client->dev,
1770 "[burn_fw_gwake]burn app_code firmware section 3 fail.");
1771 goto exit_burn_fw_gwake;
1772 }
1773
1774 /* step9:load app_code firmware section 4 file data */
1775 dev_dbg(&client->dev,
1776 "[burn_fw_gwake]step9:load app_code firmware section 4 file data");
1777 ret = gup_load_section_file(fw_gwake,
1778 start_index + 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET);
1779 if (ret == FAIL) {
1780 dev_err(&client->dev,
1781 "[burn_fw_gwake]load app_code firmware section 4 fail.");
1782 goto exit_burn_fw_gwake;
1783 }
1784
1785 /* step10:burn app_code firmware section 4 */
1786 dev_dbg(&client->dev,
1787 "[burn_fw_gwake]step10:burn app_code firmware section 4");
1788 ret = gup_burn_fw_gwake_section(
1789 client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3D);
1790 if (ret == FAIL) {
1791 dev_err(&client->dev,
1792 "[burn_fw_gwake]burn app_code firmware section 4 fail.");
1793 goto exit_burn_fw_gwake;
1794 }
1795
1796 /* update_msg.fw_burned_len += FW_GWAKE_LENGTH; */
1797 dev_dbg(&client->dev,
1798 "[burn_fw_gwake]Burned length:%d", update_msg.fw_burned_len);
1799 ret = SUCCESS;
1800
1801exit_burn_fw_gwake:
1802 kfree(fw_gwake);
1803
1804 return ret;
1805}
1806
1807static u8 gup_burn_fw_finish(struct i2c_client *client)
1808{
1809 u8 *fw_ss51 = NULL;
1810 u8 retry = 0;
1811 s32 ret = 0;
1812
1813 dev_info(&client->dev,
1814 "[burn_fw_finish]burn first 8K of ss51 and finish update.");
1815 /* step1:alloc memory */
1816 dev_dbg(&client->dev, "[burn_fw_finish]step1:alloc memory");
1817 while (retry++ < 5) {
1818 fw_ss51 = kzalloc(FW_SECTION_LENGTH, GFP_KERNEL);
1819 if (fw_ss51 == NULL) {
1820 continue;
1821 } else {
1822 dev_dbg(&client->dev,
1823 "[burn_fw_finish]Alloc %dk byte memory success.",
1824 (FW_SECTION_LENGTH/1024));
1825 break;
1826 }
1827 }
1828 if (retry >= 5) {
1829 dev_err(&client->dev,
1830 "[burn_fw_finish]Alloc memory fail,exit.");
1831 return FAIL;
1832 }
1833
1834 dev_dbg(&client->dev, "[burn_fw_finish]step2: burn ss51 first 8K.");
1835 ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET);
1836 if (ret == FAIL) {
1837 dev_err(&client->dev,
1838 "[burn_fw_finish]load ss51 firmware section 1 fail.");
1839 goto exit_burn_fw_finish;
1840 }
1841
1842 dev_dbg(&client->dev, "[burn_fw_finish]step3:clear control flag");
1843 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00);
1844 if (ret <= 0) {
1845 dev_err(&client->dev,
1846 "[burn_fw_finish]clear control flag fail.");
1847 goto exit_burn_fw_finish;
1848 }
1849
1850 dev_dbg(&client->dev,
1851 "[burn_fw_finish]step4:burn ss51 firmware section 1");
1852 ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01);
1853 if (ret == FAIL) {
1854 dev_err(&client->dev,
1855 "[burn_fw_finish]burn ss51 firmware section 1 fail.");
1856 goto exit_burn_fw_finish;
1857 }
1858
1859 /* step11:enable download DSP code */
1860 dev_dbg(&client->dev,
1861 "[burn_fw_finish]step5:enable download DSP code ");
1862 ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99);
1863 if (ret <= 0) {
1864 dev_err(&client->dev,
1865 "[burn_fw_finish]enable download DSP code fail.");
1866 goto exit_burn_fw_finish;
1867 }
1868
1869 /* step12:release ss51 & hold dsp */
1870 dev_dbg(&client->dev, "[burn_fw_finish]step6:release ss51 & hold dsp");
1871 ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08);
1872 if (ret <= 0) {
1873 dev_err(&client->dev,
1874 "[burn_fw_finish]release ss51 & hold dsp fail.");
1875 goto exit_burn_fw_finish;
1876 }
1877
1878 if (fw_ss51 != NULL)
1879 kfree(fw_ss51);
1880 return SUCCESS;
1881
1882exit_burn_fw_finish:
1883 if (fw_ss51 != NULL)
1884 kfree(fw_ss51);
1885
1886 return FAIL;
1887}
1888
1889/* return 0 can update, else no update condition */
1890static int gup_update_condition_check(struct goodix_ts_data *ts)
1891{
1892 if (test_bit(SLEEP_MODE, &ts->flags)) {
1893 dev_info(&ts->client->dev, "Update abort, tp in sleep mode\n");
1894 return -EINVAL;
1895 }
1896
1897 return 0;
1898}
1899s32 gup_update_proc(void *dir)
1900{
1901 s32 ret = 0;
1902 s32 update_ret = FAIL;
1903 u8 retry = 0;
1904 struct st_fw_head fw_head;
1905 struct goodix_ts_data *ts = NULL;
1906
1907 ts = i2c_get_clientdata(i2c_connect_client);
1908
1909 dev_dbg(&ts->client->dev, "[update_proc]Begin update ......\n");
1910
1911 show_len = 1;
1912 total_len = 100;
1913
1914 ret = gup_update_condition_check(ts);
1915 if (ret) {
1916 dev_warn(&ts->client->dev, "Update start failed\n");
1917 return FAIL;
1918 }
1919
1920 if (test_and_set_bit(FW_UPDATE_RUNNING, &ts->flags)) {
1921 dev_warn(&ts->client->dev, "FW update may already running\n");
1922 return FAIL;
1923 }
1924
1925 ret = gup_get_update_file(i2c_connect_client, &fw_head, (u8 *)dir);
1926 if (ret == FAIL) {
1927 dev_err(&ts->client->dev,
1928 "Failed get valied firmware data\n");
1929 clear_bit(FW_UPDATE_RUNNING, &ts->flags);
1930 return FAIL;
1931 }
1932
1933 gtp_work_control_enable(ts, false);
1934 gtp_esd_off(ts);
1935
1936 ret = gup_get_ic_fw_msg(i2c_connect_client);
1937 if (ret == FAIL) {
1938 dev_err(&ts->client->dev, "[update_proc]get ic message fail.");
1939 goto file_fail;
1940 }
1941
1942 if (ts->force_update || dir) {
1943 dev_dbg(&ts->client->dev, "Enter force update.");
1944 } else {
1945 ret = gup_enter_update_judge(i2c_connect_client, &fw_head);
1946 if (ret == FAIL) {
1947 dev_err(&ts->client->dev,
1948 "[update_proc]Doesn't meet update condition\n");
1949 goto file_fail;
1950 }
1951 }
1952
1953 ret = gup_enter_update_mode(ts->client);
1954 if (ret == FAIL) {
1955 dev_err(&ts->client->dev,
1956 "[update_proc]enter update mode fail.");
1957 goto update_fail;
1958 }
1959
1960 while (retry++ < 5) {
1961 show_len = 10;
1962 total_len = 100;
1963 update_msg.fw_burned_len = 0;
1964 ret = gup_burn_dsp_isp(i2c_connect_client);
1965 if (ret == FAIL) {
1966 dev_err(&ts->client->dev,
1967 "[update_proc]burn dsp isp fail.");
1968 continue;
1969 }
1970
1971 show_len = 20;
1972 ret = gup_burn_fw_gwake(i2c_connect_client);
1973 if (ret == FAIL) {
1974 dev_err(&ts->client->dev,
1975 "[update_proc]burn app_code firmware fail.");
1976 continue;
1977 }
1978
1979 show_len = 30;
1980 ret = gup_burn_fw_ss51(i2c_connect_client);
1981 if (ret == FAIL) {
1982 dev_err(&ts->client->dev,
1983 "[update_proc]burn ss51 firmware fail.");
1984 continue;
1985 }
1986
1987 show_len = 40;
1988 ret = gup_burn_fw_dsp(i2c_connect_client);
1989 if (ret == FAIL) {
1990 dev_err(&ts->client->dev,
1991 "[update_proc]burn dsp firmware fail.");
1992 continue;
1993 }
1994
1995 show_len = 50;
1996 ret = gup_burn_fw_boot(i2c_connect_client);
1997 if (ret == FAIL) {
1998 dev_err(&ts->client->dev,
1999 "[update_proc]burn bootloader firmware fail.");
2000 continue;
2001 }
2002 show_len = 60;
2003
2004 ret = gup_burn_fw_boot_isp(i2c_connect_client);
2005 if (ret == FAIL) {
2006 dev_err(&ts->client->dev,
2007 "[update_proc]burn boot_isp firmware fail.");
2008 continue;
2009 }
2010
2011 show_len = 70;
2012 ret = gup_burn_fw_link(i2c_connect_client);
2013 if (ret == FAIL) {
2014 dev_err(&ts->client->dev,
2015 "[update_proc]burn link firmware fail.");
2016 continue;
2017 }
2018
2019 show_len = 80;
2020 ret = gup_burn_fw_finish(i2c_connect_client);
2021 if (ret == FAIL) {
2022 dev_err(&ts->client->dev,
2023 "[update_proc]burn finish fail.");
2024 continue;
2025 }
2026 show_len = 90;
2027 dev_info(&ts->client->dev, "[update_proc]UPDATE SUCCESS.");
2028 retry = 0;
2029 break;
2030 }
2031
2032 if (retry >= 5) {
2033 dev_err(&ts->client->dev,
2034 "[update_proc]retry timeout,UPDATE FAIL.");
2035 update_ret = FAIL;
2036 } else {
2037 update_ret = SUCCESS;
2038 }
2039
2040update_fail:
2041 dev_dbg(&ts->client->dev, "[update_proc]leave update mode.");
2042 gup_leave_update_mode(i2c_connect_client);
2043
2044 msleep(GTP_100_DLY_MS);
2045
2046 if (update_ret == SUCCESS) {
2047 dev_info(&ts->client->dev,
2048 "firmware error auto update, resent config!\n");
2049 gup_init_panel(ts);
2050 }
2051 gtp_get_fw_info(ts->client, &ts->fw_info);
2052
2053file_fail:
2054
2055 update_msg.fw_data = NULL;
2056 update_msg.fw_total_len = 0;
2057 release_firmware(update_msg.fw);
2058
2059 clear_bit(FW_UPDATE_RUNNING, &ts->flags);
2060 gtp_work_control_enable(ts, true);
2061 gtp_esd_on(ts);
2062 total_len = 100;
2063 ts->force_update = false;
2064 if (update_ret == SUCCESS) {
2065 show_len = 100;
2066 clear_bit(FW_ERROR, &ts->flags);
2067 return SUCCESS;
2068 }
2069
2070 show_len = 200;
2071 return FAIL;
2072}
2073
2074u8 gup_init_update_proc(struct goodix_ts_data *ts)
2075{
2076 struct task_struct *thread = NULL;
2077
2078 dev_info(&ts->client->dev, "Ready to run update thread.");
2079
2080 thread = kthread_run(gup_update_proc,
2081 (void *)NULL, "guitar_update");
2082
2083 if (IS_ERR(thread)) {
2084 dev_err(&ts->client->dev,
2085 "Failed to create update thread.\n");
2086 return -EPERM;
2087 }
2088
2089 return 0;
2090}