Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6480c67 authored by Sarada Prasanna Garnayak's avatar Sarada Prasanna Garnayak
Browse files

input: synaptic_dsx: stay awake the device during firmware update



If touch controller goes into suspend while firmware upgrade is
happening, then the upgrade process will fail. Add support to keep
the touch controller awake during firmware upgrade. Also reduce
the excessive logs coming during firmware upgrade. Now logs are
printed per block only.

Change-Id: I7f20c87b21189b1731a7941c79ba3024c61bdfb9
Signed-off-by: default avatarSarada Prasanna Garnayak <c_sgarna@codeaurora.org>
parent 61b52bcb
Loading
Loading
Loading
Loading
+55 −17
Original line number Diff line number Diff line
@@ -3026,6 +3026,7 @@ static int synaptics_rmi4_probe(struct platform_device *pdev)
	rmi4_data->touch_stopped = false;
	rmi4_data->sensor_sleep = false;
	rmi4_data->irq_enabled = false;
	rmi4_data->fw_updating = false;
	rmi4_data->fingers_on_2d = false;

	rmi4_data->irq_enable = synaptics_rmi4_irq_enable;
@@ -3531,14 +3532,21 @@ static int synaptics_rmi4_suspend(struct device *dev)
			rmi4_data->hw_if->board_data;
	int retval;

	if (rmi4_data->staying_awake)
	if (rmi4_data->stay_awake) {
		rmi4_data->staying_awake = true;
		return 0;
	} else {
		rmi4_data->staying_awake = false;
	}

	if (rmi4_data->suspended)
	if (rmi4_data->suspended) {
		dev_info(dev, "Already in suspend state\n");
		return 0;
	}

	synaptics_secure_touch_stop(rmi4_data, 1);

	if (!rmi4_data->fw_updating) {
		if (!rmi4_data->sensor_sleep) {
			rmi4_data->touch_stopped = true;
			synaptics_rmi4_irq_enable(rmi4_data, false);
@@ -3554,24 +3562,54 @@ static int synaptics_rmi4_suspend(struct device *dev)
		}
		mutex_unlock(&exp_data.mutex);

	synaptics_dsx_regulator_enable(rmi4_data, false);
		retval = synaptics_dsx_regulator_enable(rmi4_data, false);
		if (retval < 0) {
			dev_err(dev, "failed to enter low power mode\n");
			goto err_lpm_regulator;
		}
	} else {
		dev_err(dev,
			"Firmware updating, cannot go into suspend mode\n");
		return 0;
	}

	if (bdata->disable_gpios) {
		if (rmi4_data->ts_pinctrl) {
			retval = synpatics_dsx_pinctrl_select(rmi4_data,
								false);
			if (retval < 0)
			if (retval < 0) {
				dev_err(dev, "Cannot get idle pinctrl state\n");
				goto err_pinctrl_select_suspend;
			}
		}

		retval = synaptics_dsx_gpio_configure(rmi4_data, false);
		if (retval < 0)
		if (retval < 0) {
			dev_err(dev, "failed to put gpios in suspend state\n");
			goto err_gpio_configure;
		}
	}

	rmi4_data->suspended = true;

	return 0;

err_gpio_configure:
	if (rmi4_data->ts_pinctrl) {
		retval = synpatics_dsx_pinctrl_select(rmi4_data, true);
		if (retval < 0)
			dev_err(dev, "Cannot get default pinctrl state\n");
	}
err_pinctrl_select_suspend:
	synaptics_dsx_regulator_enable(rmi4_data, true);
err_lpm_regulator:
	if (rmi4_data->sensor_sleep) {
		synaptics_rmi4_sensor_wake(rmi4_data);
		synaptics_rmi4_irq_enable(rmi4_data, true);
		rmi4_data->touch_stopped = false;
	}

	return retval;
}

 /**
+1 −0
Original line number Diff line number Diff line
@@ -270,6 +270,7 @@ struct synaptics_rmi4_data {
	bool sensor_sleep;
	bool stay_awake;
	bool staying_awake;
	bool fw_updating;
	int (*irq_enable)(struct synaptics_rmi4_data *rmi4_data, bool enable);
	int (*reset_device)(struct synaptics_rmi4_data *rmi4_data);

+39 −2
Original line number Diff line number Diff line
@@ -826,6 +826,27 @@ static int fwu_write_blocks(unsigned char *block_ptr, unsigned short block_cnt,
	unsigned char block_offset[] = {0, 0};
	unsigned short block_num;
	struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
	unsigned int progress;
	unsigned char command_str[10];

	switch (command) {
	case CMD_WRITE_CONFIG_BLOCK:
		progress = 10;
		strlcpy(command_str, "config", 10);
		break;
	case CMD_WRITE_FW_BLOCK:
		progress = 100;
		strlcpy(command_str, "firmware", 10);
		break;
	case CMD_WRITE_LOCKDOWN_BLOCK:
		progress = 1;
		strlcpy(command_str, "lockdown", 10);
		break;
	default:
		progress = 1;
		strlcpy(command_str, "unknown", 10);
		break;
	}

	block_offset[1] |= (fwu->config_area << 5);

@@ -841,6 +862,11 @@ static int fwu_write_blocks(unsigned char *block_ptr, unsigned short block_cnt,
	}

	for (block_num = 0; block_num < block_cnt; block_num++) {
		if (block_num % progress == 0)
			dev_info(rmi4_data->pdev->dev.parent,
				"%s: update %s %3d / %3d\n",
				__func__, command_str, block_num, block_cnt);

		retval = synaptics_rmi4_reg_write(rmi4_data,
				fwu->f34_fd.data_base_addr + fwu->blk_data_off,
				block_ptr,
@@ -869,9 +895,10 @@ static int fwu_write_blocks(unsigned char *block_ptr, unsigned short block_cnt,
		}

		block_ptr += fwu->block_size;
	}

	dev_info(rmi4_data->pdev->dev.parent,
		"updated %d/%d blocks\n", block_num, block_cnt);
	}

	return 0;
}
@@ -1443,11 +1470,21 @@ int synaptics_dsx_fw_updater(unsigned char *fw_data)
	if (!fwu->initialized)
		return -ENODEV;

	fwu->rmi4_data->fw_updating = true;
	if (fwu->rmi4_data->suspended == true) {
		fwu->rmi4_data->fw_updating = false;
		dev_err(fwu->rmi4_data->pdev->dev.parent,
			"Cannot start fw upgrade: Device is in suspend\n");
		return -EBUSY;
	}

	fwu->ext_data_source = fw_data;
	fwu->config_area = UI_CONFIG_AREA;

	retval = fwu_start_reflash();

	fwu->rmi4_data->fw_updating = false;

	return retval;
}
EXPORT_SYMBOL(synaptics_dsx_fw_updater);