static void abov_tk_reset(struct abov_tk_info *info) { struct i2c_client *client = info->client; if (info->enabled == false) return; dev_notice(&client->dev, "%s++\n", __func__); disable_irq_nosync(info->irq); info->enabled = false; release_all_fingers(info); abov_tk_reset_for_bootmode(info); msleep(ABOV_RESET_DELAY); abov_tk_dual_detection_mode(info, 1); if (info->glovemode) abov_glove_mode_enable(client, CMD_GLOVE_ON); info->enabled = true; enable_irq(info->irq); dev_notice(&client->dev, "%s--\n", __func__); }
static int abov_tk_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct abov_tk_info *info = i2c_get_clientdata(client); if (info->enabled) return 0; dev_notice(&info->client->dev, "%s: users=%d\n", __func__, info->input_dev->users); #if 0 abov_tk_reset_for_bootmode(info); msleep(ABOV_RESET_DELAY); if (info->glovemode) abov_glove_mode_enable(client, CMD_GLOVE_ON); #else if (info->pdata->power) { info->pdata->power(info->pdata, true); msleep(ABOV_RESET_DELAY); } else /* touchkey on by i2c */ get_tk_fw_version(info, true); #endif info->enabled = true; enable_irq(info->irq); return 0; }
static ssize_t touchkey_fw_update(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct abov_tk_info *info = dev_get_drvdata(dev); struct i2c_client *client = info->client; int ret; u8 cmd; if (info->fw_update_possible == false) { dev_err(&client->dev, "%s fail (no reset pin)\n", __func__); info->fw_update_state = 2; goto touchkey_fw_update_out; } switch(*buf) { case 's': case 'S': cmd = BUILT_IN; break; case 'i': case 'I': cmd = SDCARD; break; default: info->fw_update_state = 2; goto touchkey_fw_update_out; } info->fw_update_state = 1; disable_irq(info->irq); info->enabled = false; ret = abov_flash_fw(info, false, cmd); if (info->glovemode) abov_glove_mode_enable(client, CMD_GLOVE_ON); info->enabled = true; enable_irq(info->irq); if (ret) { dev_err(&client->dev, "%s fail\n", __func__); info->fw_update_state = 2; } else { dev_notice(&client->dev, "%s success\n", __func__); info->fw_update_state = 0; } touchkey_fw_update_out: dev_dbg(&client->dev, "%s : %d\n", __func__, info->fw_update_state); return count; }
static ssize_t abov_glove_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct abov_tk_info *info = dev_get_drvdata(dev); struct i2c_client *client = info->client; int scan_buffer; int ret; u8 cmd; ret = sscanf(buf, "%d", &scan_buffer); if (ret != 1) { dev_err(&client->dev, "%s: cmd read err\n", __func__); return count; } if (!(scan_buffer == 0 || scan_buffer == 1)) { dev_err(&client->dev, "%s: wrong command(%d)\n", __func__, scan_buffer); return count; } if (!info->enabled) return count; if (info->glovemode == scan_buffer) { dev_info(&client->dev, "%s same command(%d)\n", __func__, scan_buffer); return count; } if (scan_buffer == 1) { dev_notice(&client->dev, "%s glove mode\n", __func__); cmd = CMD_GLOVE_ON; } else { dev_notice(&client->dev, "%s normal mode\n", __func__); cmd = CMD_GLOVE_OFF; } ret = abov_glove_mode_enable(client, cmd); if (ret < 0) { dev_err(&client->dev, "%s fail(%d)\n", __func__, ret); return count; } info->glovemode = scan_buffer; return count; }