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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}