static int ct363_init(struct ct36x_data *ts) { int ret = 0, fwchksum, binchksum, updcnt = 5; struct ct363_priv *ct363 = NULL; ret = ct363_init_hw(ts); if(ret < 0) return ret; /* Hardware reset */ ct363_reset_hw(ts); // Get binary Checksum binchksum = ct36x_chip_get_binchksum(); ct36x_dbg(ts, "CT363 init: binchksum = %d\n", binchksum); ret = ct36x_chip_get_fwchksum(ts); if(ret < 0){ dev_err(ts->dev, "CT36X chip: Failed to get fwchksum\n"); return ret; } fwchksum = ret; ct36x_dbg(ts, "CT363 init: fwchksum = %d\n", fwchksum); while(binchksum != fwchksum && updcnt--) { /* Update Firmware */ ret = ct36x_chip_go_bootloader(ts); if(ret < 0){ dev_err(ts->dev, "CT36X chip: Failed to go bootloader\n"); return ret; } /* Hardware reset */ ct363_reset_hw(ts); ret = ct36x_chip_get_fwchksum(ts); if(ret < 0){ dev_err(ts->dev, "CT36X chip: Failed to get fwchksum\n"); return ret; } fwchksum = ret; ct36x_dbg(ts, "CT363 update FW: fwchksum = %d\n", fwchksum); } if(binchksum != fwchksum){ dev_err(ts->dev, "Fail to update FW\n"); return -ENODEV; } /* Hardware reset */ ct363_reset_hw(ts); msleep(5); ts->point_num = CT363_POINT_NUM; ct363 = kzalloc(sizeof(struct ct363_priv), GFP_KERNEL); if(!ct363){ dev_err(ts->dev, "No memory for ct36x"); return -ENOMEM; } ts->priv = ct363; return 0; }
static int ct363_resume(struct ct36x_data *ts) { int i; /* Hardware reset */ ct363_reset_hw(ts); msleep(3); for(i = 0; i < ts->point_num; i++){ input_mt_slot(ts->input, i); input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); } input_sync(ts->input); return 0; }
static int ct363_resume(struct ct36x_data *ts) { int i; /* Hardware reset */ if(ct363_first_init_flag) ct363_reset_hw(ts); else { // gpio_direction_output(ts->rst_io.gpio, ts->rst_io.active_low); // msleep(50); gpio_set_value(ts->rst_io.gpio, !ts->rst_io.active_low); msleep(50); gpio_set_value(ts->rst_io.gpio, ts->rst_io.active_low); msleep(50); } for(i = 0; i < ts->point_num; i++){ input_mt_slot(ts->input, i); input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, false); } input_sync(ts->input); return 0; }