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); u8 *data; u8 buf_if; int ret; buf_if = COM_QUERY; data = wac_i2c->wac_feature->data; printk(KERN_DEBUG "[E-PEN]:%s:\n", __func__); disable_irq(wac_i2c->irq); wac_i2c->wac_feature->firm_update_status = 1; if (*buf == 'F') { printk(KERN_ERR "[E-PEN]: Start firmware flashing (UMS).\n"); ret = wacom_i2c_load_fw(wac_i2c->client); if (ret < 0) { printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n"); goto failure; } } else if (*buf == 'B') { printk(KERN_ERR "[E-PEN]: Start firmware flashing (kernel image).\n"); ret = wacom_i2c_flash(wac_i2c); if (ret < 0) { printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n"); goto failure; } } else { printk(KERN_ERR "[E-PEN]: wrong parameter.\n"); goto param_err; } 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); return count; param_err: failure: wac_i2c->wac_feature->firm_update_status = -1; enable_irq(wac_i2c->irq); return -1; }
static void wacom_i2c_update_work(struct work_struct *work) { struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, update_work); u32 fw_ver_ic = wac_i2c->wac_feature->fw_version; int ret; int retry = 3; mutex_lock(&wac_i2c->update_lock); wacom_enable_irq(wac_i2c, false); printk(KERN_DEBUG"epen:%s\n", __func__); if (!wac_i2c->update_info.forced) { #if defined(CONFIG_SAMSUNG_PRODUCT_SHIP) if (fw_ver_ic == fw_ver_file) { #else if (fw_ver_ic >= fw_ver_file) { #endif printk(KERN_DEBUG"epen:pass fw update, ic ver %#x, img ver %#x\n", fw_ver_ic, fw_ver_file); goto err_update_load_fw; } } wac_i2c->wac_feature->firm_update_status = 1; ret = wacom_i2c_load_fw(wac_i2c); if (ret < 0) { printk(KERN_DEBUG"epen:failed to load fw(%d)\n", ret); goto err_update_load_fw; } while (retry--) { ret = wacom_i2c_flash(wac_i2c); if (ret) { printk(KERN_DEBUG"epen:failed to flash fw(%d)\n", ret); continue; } break; } if (ret) goto err_update_fw; ret = wacom_i2c_query(wac_i2c); if (ret < 0) { printk(KERN_DEBUG"epen:failed to query to IC(%d)\n", ret); goto err_update_fw; } err_update_fw: wacom_i2c_unload_fw(wac_i2c); err_update_load_fw: wac_i2c->wac_feature->firm_update_status = 2; wacom_enable_irq(wac_i2c, true); mutex_unlock(&wac_i2c->update_lock); } static ssize_t epen_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); int val; sscanf(buf, "%d", &val); if (val == 1) { wacom_enable_irq(wac_i2c, false); /* Reset IC */ wacom_i2c_reset_hw(wac_i2c->wac_pdata); /* I2C Test */ wacom_i2c_query(wac_i2c); wacom_enable_irq(wac_i2c, true); printk(KERN_DEBUG "epen:%s, result %d\n", __func__, wac_i2c->query_status); } return count; } static ssize_t epen_reset_result_show(struct device *dev, struct device_attribute *attr, char *buf) { struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); if (wac_i2c->query_status) { printk(KERN_DEBUG "epen:%s, PASS\n", __func__); return sprintf(buf, "PASS\n"); } else { printk(KERN_DEBUG "epen:%s, FAIL\n", __func__); return sprintf(buf, "FAIL\n"); } } #ifdef WACOM_USE_AVE_TRANSITION static ssize_t epen_ave_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int v1, v2, v3, v4, v5; int height; sscanf(buf, "%d%d%d%d%d%d", &height, &v1, &v2, &v3, &v4, &v5); if (height < 0 || height > 2) { printk(KERN_DEBUG"epen:Height err %d\n", height); return count; } g_aveLevel_C[height] = v1; g_aveLevel_X[height] = v2; g_aveLevel_Y[height] = v3; g_aveLevel_Trs[height] = v4; g_aveLevel_Cor[height] = v5; printk(KERN_DEBUG "epen:%s, v1 %d v2 %d v3 %d v4 %d\n", __func__, v1, v2, v3, v4); return count; }
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; }
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); u8 *data; u8 buf_if; int ret; disable_irq(wac_i2c->irq); #ifdef WACOM_PDCT_WORK_AROUND disable_irq(wac_i2c->irq_pdct); #endif buf_if = COM_QUERY; data = wac_i2c->wac_feature->data; wac_i2c->wac_feature->firm_update_status = 1; if (*buf == 'F') { printk(KERN_ERR "[E-PEN]: Start firmware flashing (UMS).\n"); ret = wacom_i2c_load_fw(wac_i2c->client); if (ret < 0) { printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n"); goto failure; } } else if (*buf == 'B') { printk(KERN_ERR "[E-PEN]: Start firmware flashing (kernel image).\n"); #if 0 //#if defined(CONFIG_KOR_MODEL_SHV_E160S) || defined(CONFIG_KOR_MODEL_SHV_E160K) || defined(CONFIG_KOR_MODEL_SHV_E160L) Binary = Binary_44; #endif ret = wacom_i2c_flash(wac_i2c); if (ret < 0) { printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n"); goto failure; } } else { printk(KERN_ERR "[E-PEN]: wrong parameter.\n"); goto param_err; } 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; }