static int wacom_firmware_update(struct wacom_i2c *wac_i2c) { int ret = 0; ret = wacom_load_fw_from_req_fw(wac_i2c); if (ret) goto failure; if (wac_i2c->wac_feature->fw_ic_version < wac_i2c->wac_feature->fw_version) { /*start firm update*/ dev_info(&wac_i2c->client->dev, "%s: Start firmware flashing (kernel image).\n", __func__); mutex_lock(&wac_i2c->lock); wacom_enable_irq(wac_i2c, false); wac_i2c->wac_feature->firm_update_status = 1; ret = wacom_i2c_firm_update(wac_i2c); if (ret) goto update_err; wacom_i2c_set_firm_data(NULL); wacom_i2c_query(wac_i2c); wac_i2c->wac_feature->firm_update_status = 2; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->lock); } else { dev_info(&wac_i2c->client->dev, "%s: firmware update does not need.\n", __func__); } return ret; update_err: wacom_i2c_set_firm_data(NULL); wac_i2c->wac_feature->firm_update_status = -1; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->lock); failure: return ret; }
static ssize_t epen_firmware_update_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); int ret = 1; u32 fw_ic_ver = wac_i2c->wac_feature->fw_ic_version; bool need_update = false; need_update = check_update_condition(wac_i2c, *buf); if (need_update == false) { dev_info(&wac_i2c->client->dev, "%s:Pass Update. Cmd %c, IC ver %04x, Ker ver %04x\n", __func__, *buf, fw_ic_ver, wac_i2c->wac_feature->fw_version); return count; } else { dev_info(&wac_i2c->client->dev, "%s:Update Start. IC fw ver : 0x%x, new fw ver : 0x%x\n", __func__, wac_i2c->wac_feature->fw_ic_version, wac_i2c->wac_feature->fw_version); } switch (*buf) { /*ums*/ case 'I': ret = wacom_fw_load_from_UMS(wac_i2c); if (ret) goto failure; dev_info(&wac_i2c->client->dev, "%s: Start firmware flashing (UMS image).\n", __func__); ums_binary = true; break; /*kernel*/ case 'K': ret = wacom_load_fw_from_req_fw(wac_i2c); if (ret) goto failure; break; /*booting*/ case 'R': ret = wacom_load_fw_from_req_fw(wac_i2c); if (ret) goto failure; dev_info(&wac_i2c->client->dev, "%s: Start firmware flashing (kernel image).\n", __func__); break; default: /*There's no default case*/ break; } /*start firm update*/ mutex_lock(&wac_i2c->lock); wacom_enable_irq(wac_i2c, false); wac_i2c->wac_feature->firm_update_status = 1; ret = wacom_i2c_firm_update(wac_i2c); if (ret) goto update_err; wacom_i2c_set_firm_data(NULL); wacom_i2c_query(wac_i2c); wac_i2c->wac_feature->firm_update_status = 2; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->lock); return count; update_err: wacom_i2c_set_firm_data(NULL); failure: wac_i2c->wac_feature->firm_update_status = -1; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->lock); return -1; }
static ssize_t epen_firmware_update_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); int ret = 1; u32 fw_ic_ver = wac_i2c->wac_feature->fw_version; bool need_update = false; printk(KERN_DEBUG "epen:%s\n", __func__); need_update = check_update_condition(wac_i2c, *buf); if (need_update == false) { printk(KERN_DEBUG"epen:Pass Update." "Cmd %c, IC ver %04x, Ker ver %04x\n", *buf, fw_ic_ver, Firmware_version_of_file); return count; } /*start firm update*/ mutex_lock(&wac_i2c->lock); wacom_enable_irq(wac_i2c, false); wac_i2c->wac_feature->firm_update_status = 1; switch (*buf) { /*ums*/ case 'I': ret = wacom_i2c_fw_update_UMS(wac_i2c); break; /*kernel*/ #ifdef CONFIG_MACH_P4NOTE case 'K': printk(KERN_ERR "epen:Start firmware flashing (kernel image).\n"); ret = wacom_i2c_flash(wac_i2c); break; case 'R': update_fw_p4(wac_i2c); break; #else case 'K': printk(KERN_ERR "epen:Start firmware flashing (kernel image).\n"); case 'R': ret = wacom_i2c_firm_update(wac_i2c); break; #endif default: /*There's no default case*/ break; } if (ret < 0) { printk(KERN_ERR "epen:failed to flash firmware.\n"); goto failure; } printk(KERN_ERR "epen:Finish firmware flashing.\n"); wacom_i2c_query(wac_i2c); wac_i2c->wac_feature->firm_update_status = 2; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->lock); return count; failure: wac_i2c->wac_feature->firm_update_status = -1; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->lock); return -1; }
static ssize_t epen_firmware_update_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); int ret = 1; disable_irq(wac_i2c->irq); #ifdef WACOM_PDCT_WORK_AROUND disable_irq(wac_i2c->irq_pdct); #endif wac_i2c->wac_feature->firm_update_status = 1; printk(KERN_DEBUG "[E-PEN] %s\n", __func__); /* F and B are used by Factory app, and R is used when boot */ switch (*buf) { #ifdef WACOM_UMS_UPDATE /* Block UMS update for MR */ case 'F': printk(KERN_ERR "[E-PEN] Start firmware flashing (UMS).\n"); ret = wacom_i2c_load_fw(wac_i2c->client); break; #endif case 'B': printk(KERN_ERR "[E-PEN] Start firmware flashing (kernel image).\n"); #ifdef CONFIG_MACH_Q1_BD ret = wacom_i2c_firm_update(wac_i2c); #else ret = wacom_i2c_flash(wac_i2c); #endif break; #ifdef CONFIG_MACH_Q1_BD case 'R': /* Q1 board rev 0.3 */ if (system_rev >= 6) { if (wac_i2c->wac_feature->fw_version < Firmware_version_of_file) ret = wacom_i2c_firm_update(wac_i2c); } else { if (wac_i2c->wac_feature->fw_version != Firmware_version_of_file) ret = wacom_i2c_firm_update(wac_i2c); } if (ret > 0) { enable_irq(wac_i2c->irq); #ifdef WACOM_PDCT_WORK_AROUND enable_irq(wac_i2c->irq_pdct); #endif return count; } break; #endif #if defined(CONFIG_MACH_P4NOTE) case 'W': if (Firmware_version_of_file != wac_i2c->wac_feature->fw_version) schedule_work(&wac_i2c->update_work); break; #endif default: printk(KERN_ERR "[E-PEN] wrong parameter.\n"); goto param_err; break; } if (ret < 0) { printk(KERN_ERR "[E-PEN] failed to flash firmware.\n"); goto failure; } printk(KERN_ERR "[E-PEN] Finish firmware flashing.\n"); msleep(800); wacom_i2c_query(wac_i2c); wac_i2c->wac_feature->firm_update_status = 2; enable_irq(wac_i2c->irq); #ifdef WACOM_PDCT_WORK_AROUND enable_irq(wac_i2c->irq_pdct); #endif return count; param_err: failure: wac_i2c->wac_feature->firm_update_status = -1; enable_irq(wac_i2c->irq); #ifdef WACOM_PDCT_WORK_AROUND enable_irq(wac_i2c->irq_pdct); #endif return -1; }