Commit e0f79cb7 authored by Dudley Du's avatar Dudley Du Committed by Dmitry Torokhov
Browse files

Input: cyapa - add gen3 trackpad force re-calibrate support



Add force re-calibrate function support for gen3 trackpad device, it can be
used through sysfs calibrate interface.

Signed-off-by: default avatarDudley Du <dudl@cypress.com>
Tested-by: default avatarJeremiah Mahler <jmmahler@gmail.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent f50efd06
Loading
Loading
Loading
Loading
+59 −0
Original line number Original line Diff line number Diff line
@@ -783,6 +783,64 @@ static int cyapa_gen3_do_fw_update(struct cyapa *cyapa,
	return 0;
	return 0;
}
}


static ssize_t cyapa_gen3_do_calibrate(struct device *dev,
				     struct device_attribute *attr,
				     const char *buf, size_t count)
{
	struct cyapa *cyapa = dev_get_drvdata(dev);
	int tries;
	int ret;

	ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
	if (ret < 0) {
		dev_err(dev, "Error reading dev status: %d\n", ret);
		goto out;
	}
	if ((ret & CYAPA_DEV_NORMAL) != CYAPA_DEV_NORMAL) {
		dev_warn(dev, "Trackpad device is busy, device state: 0x%02x\n",
			 ret);
		ret = -EAGAIN;
		goto out;
	}

	ret = cyapa_write_byte(cyapa, CYAPA_CMD_SOFT_RESET,
			       OP_RECALIBRATION_MASK);
	if (ret < 0) {
		dev_err(dev, "Failed to send calibrate command: %d\n",
			ret);
		goto out;
	}

	tries = 20;  /* max recalibration timeout 2s. */
	do {
		/*
		 * For this recalibration, the max time will not exceed 2s.
		 * The average time is approximately 500 - 700 ms, and we
		 * will check the status every 100 - 200ms.
		 */
		usleep_range(100000, 200000);

		ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
		if (ret < 0) {
			dev_err(dev, "Error reading dev status: %d\n",
				ret);
			goto out;
		}
		if ((ret & CYAPA_DEV_NORMAL) == CYAPA_DEV_NORMAL)
			break;
	} while (--tries);

	if (tries == 0) {
		dev_err(dev, "Failed to calibrate. Timeout.\n");
		ret = -ETIMEDOUT;
		goto out;
	}
	dev_dbg(dev, "Calibration successful.\n");

out:
	return ret < 0 ? ret : count;
}

static ssize_t cyapa_gen3_show_baseline(struct device *dev,
static ssize_t cyapa_gen3_show_baseline(struct device *dev,
				   struct device_attribute *attr, char *buf)
				   struct device_attribute *attr, char *buf)
{
{
@@ -1175,6 +1233,7 @@ const struct cyapa_dev_ops cyapa_gen3_ops = {
	.bl_initiate = cyapa_gen3_bl_initiate,
	.bl_initiate = cyapa_gen3_bl_initiate,


	.show_baseline = cyapa_gen3_show_baseline,
	.show_baseline = cyapa_gen3_show_baseline,
	.calibrate_store = cyapa_gen3_do_calibrate,


	.initialize = cyapa_gen3_initialize,
	.initialize = cyapa_gen3_initialize,