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

Commit 7a1272b3 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "input: synaptic_dsx: stay awake the device during firmware update"

parents 7727171a e6480c67
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
@@ -824,6 +824,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);

@@ -839,6 +860,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,
@@ -867,9 +893,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;
}
@@ -1441,11 +1468,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);