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; }