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

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

Merge "input: ft5x06_ts: remove proximity sensor support"

parents b1ed2fdd 6c5f9d2f
Loading
Loading
Loading
Loading
+2 −243
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@
#include <linux/regulator/consumer.h>
#include <linux/firmware.h>
#include <linux/debugfs.h>
#include <linux/sensors.h>
#include <linux/input/ft5x06_ts.h>
#include <linux/init.h>
#include <linux/fs.h>
@@ -80,19 +79,6 @@
#define FT_REG_FW_MIN_VER	0xB2
#define FT_REG_FW_SUB_MIN_VER	0xB3

/* psensor register address*/
#define FT_REG_PSENSOR_ENABLE	0xB0
#define FT_REG_PSENSOR_STATUS	0x01

/* psensor register bits*/
#define FT_PSENSOR_ENABLE_MASK	0x01
#define FT_PSENSOR_STATUS_NEAR	0xC0
#define FT_PSENSOR_STATUS_FAR	0xE0
#define FT_PSENSOR_FAR_TO_NEAR	0
#define FT_PSENSOR_NEAR_TO_FAR	1
#define FT_PSENSOR_ORIGINAL_STATE_FAR	1
#define FT_PSENSOR_WAKEUP_TIMEOUT	500

/* gesture register address*/
#define FT_REG_GESTURE_ENABLE	0xD0
#define FT_REG_GESTURE_OUTPUT	0xD3
@@ -251,7 +237,6 @@ struct ft5x06_ts_data {
	struct i2c_client *client;
	struct input_dev *input_dev;
	const struct ft5x06_ts_platform_data *pdata;
	struct ft5x06_psensor_platform_data *psensor_pdata;
	struct ft5x06_gesture_platform_data *gesture_pdata;
	struct regulator *vdd;
	struct regulator *vcc_i2c;
@@ -281,29 +266,6 @@ struct ft5x06_ts_data {
static int ft5x06_ts_start(struct device *dev);
static int ft5x06_ts_stop(struct device *dev);

static struct sensors_classdev __maybe_unused sensors_proximity_cdev = {
	.name = "ft5x06-proximity",
	.vendor = "FocalTech",
	.version = 1,
	.handle = SENSORS_PROXIMITY_HANDLE,
	.type = SENSOR_TYPE_PROXIMITY,
	.max_range = "5.0",
	.resolution = "5.0",
	.sensor_power = "0.1",
	.min_delay = 0,
	.fifo_reserved_event_count = 0,
	.fifo_max_event_count = 0,
	.enabled = 0,
	.delay_msec = 200,
	.sensors_enable = NULL,
	.sensors_poll_delay = NULL,
};

static inline bool ft5x06_psensor_support_enabled(void)
{
	return config_enabled(CONFIG_TOUCHSCREEN_FT5X06_PSENSOR);
}

static inline bool ft5x06_gesture_support_enabled(void)
{
	return config_enabled(CONFIG_TOUCHSCREEN_FT5X06_GESTURE);
@@ -384,84 +346,6 @@ static int ft5x0x_read_reg(struct i2c_client *client, u8 addr, u8 *val)
	return ft5x06_i2c_read(client, &addr, 1, val, 1);
}

#ifdef CONFIG_TOUCHSCREEN_FT5X06_PSENSOR
static void ft5x06_psensor_enable(struct ft5x06_ts_data *data, int enable)
{
	u8 state;
	int ret = -1;

	if (data->client == NULL)
		return;

	ft5x0x_read_reg(data->client, FT_REG_PSENSOR_ENABLE, &state);
	if (enable)
		state |= FT_PSENSOR_ENABLE_MASK;
	else
		state &= ~FT_PSENSOR_ENABLE_MASK;

	ret = ft5x0x_write_reg(data->client, FT_REG_PSENSOR_ENABLE, state);
	if (ret < 0)
		dev_err(&data->client->dev,
			"write psensor switch command failed\n");
}

static int ft5x06_psensor_enable_set(struct sensors_classdev *sensors_cdev,
		unsigned int enable)
{
	struct ft5x06_psensor_platform_data *psensor_pdata =
		container_of(sensors_cdev,
			struct ft5x06_psensor_platform_data, ps_cdev);
	struct ft5x06_ts_data *data = psensor_pdata->data;
	struct input_dev *input_dev = data->psensor_pdata->input_psensor_dev;

	mutex_lock(&input_dev->mutex);
	ft5x06_psensor_enable(data, enable);
	psensor_pdata->tp_psensor_data = FT_PSENSOR_ORIGINAL_STATE_FAR;
	if (enable)
		psensor_pdata->tp_psensor_opened = 1;
	else
		psensor_pdata->tp_psensor_opened = 0;
	mutex_unlock(&input_dev->mutex);
	return enable;
}

static int ft5x06_read_tp_psensor_data(struct ft5x06_ts_data *data)
{
	u8 psensor_status;
	char tmp;
	int ret = 1;

	ft5x0x_read_reg(data->client,
			FT_REG_PSENSOR_STATUS, &psensor_status);

	tmp = data->psensor_pdata->tp_psensor_data;
	if (psensor_status == FT_PSENSOR_STATUS_NEAR)
		data->psensor_pdata->tp_psensor_data =
						FT_PSENSOR_FAR_TO_NEAR;
	else if (psensor_status == FT_PSENSOR_STATUS_FAR)
		data->psensor_pdata->tp_psensor_data =
						FT_PSENSOR_NEAR_TO_FAR;

	if (tmp != data->psensor_pdata->tp_psensor_data) {
		dev_dbg(&data->client->dev,
				"%s sensor data changed\n", __func__);
		ret = 0;
	}
	return ret;
}
#else
static int ft5x06_psensor_enable_set(struct sensors_classdev *sensors_cdev,
		unsigned int enable)
{
	return enable;
}

static int ft5x06_read_tp_psensor_data(struct ft5x06_ts_data *data)
{
	return 0;
}
#endif

#ifdef CONFIG_TOUCHSCREEN_FT5X06_GESTURE
static ssize_t ft5x06_gesture_enable_to_set_show(struct device *dev,
				struct device_attribute *attr, char *buf)
@@ -711,24 +595,6 @@ static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id)
	ip_dev = data->input_dev;
	buf = data->tch_data;

	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support &&
		data->psensor_pdata->tp_psensor_opened) {
		rc = ft5x06_read_tp_psensor_data(data);
		if (!rc) {
			if (data->suspended)
				pm_wakeup_event(&data->client->dev,
					FT_PSENSOR_WAKEUP_TIMEOUT);
			input_report_abs(data->psensor_pdata->input_psensor_dev,
					ABS_DISTANCE,
					data->psensor_pdata->tp_psensor_data);
			input_sync(data->psensor_pdata->input_psensor_dev);
			if (data->suspended)
				return IRQ_HANDLED;
		}
		if (data->suspended)
			return IRQ_HANDLED;
	}

	if (ft5x06_gesture_support_enabled() && data->pdata->gesture_support) {
		ft5x0x_read_reg(data->client, FT_REG_GESTURE_ENABLE,
					&gesture_is_active);
@@ -1190,18 +1056,6 @@ static int ft5x06_ts_suspend(struct device *dev)
		return 0;
	}

	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support &&
		device_may_wakeup(dev) &&
		data->psensor_pdata->tp_psensor_opened) {

		err = enable_irq_wake(data->client->irq);
		if (err)
			dev_err(&data->client->dev,
				"%s: set_irq_wake failed\n", __func__);
		data->suspended = true;
		return err;
	}

	if (ft5x06_gesture_support_enabled() && data->pdata->gesture_support &&
		device_may_wakeup(dev) &&
		data->gesture_pdata->gesture_enable_to_set) {
@@ -1228,18 +1082,6 @@ static int ft5x06_ts_resume(struct device *dev)
		return 0;
	}

	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support &&
		device_may_wakeup(dev) &&
		data->psensor_pdata->tp_psensor_opened) {
		err = disable_irq_wake(data->client->irq);
		if (err)
			dev_err(&data->client->dev,
				"%s: disable_irq_wake failed\n",
				__func__);
		data->suspended = false;
		return err;
	}

	if (ft5x06_gesture_support_enabled() && data->pdata->gesture_support &&
		device_may_wakeup(dev) &&
		!(data->gesture_pdata->in_pocket) &&
@@ -2073,9 +1915,6 @@ static int ft5x06_parse_dt(struct device *dev,
	pdata->ignore_id_check = of_property_read_bool(np,
						"focaltech,ignore-id-check");

	pdata->psensor_support = of_property_read_bool(np,
						"focaltech,psensor-support");

	pdata->gesture_support = of_property_read_bool(np,
						"focaltech,gesture-support");

@@ -2114,15 +1953,14 @@ static int ft5x06_ts_probe(struct i2c_client *client,
			   const struct i2c_device_id *id)
{
	struct ft5x06_ts_platform_data *pdata;
	struct ft5x06_psensor_platform_data *psensor_pdata;
	struct ft5x06_gesture_platform_data *gesture_pdata;
	struct ft5x06_ts_data *data;
	struct input_dev *input_dev;
	struct input_dev *psensor_input_dev;
	struct dentry *temp;
	u8 reg_value;
	u8 reg_addr;
	int err, len;

	if (client->dev.of_node) {
		pdata = devm_kzalloc(&client->dev,
			sizeof(struct ft5x06_ts_platform_data), GFP_KERNEL);
@@ -2286,55 +2124,6 @@ static int ft5x06_ts_probe(struct i2c_client *client,
		goto free_gpio;
	}

	if (data->pdata->psensor_support && data->pdata->gesture_support) {
		dev_err(&client->dev,
			"Unsupport psensor & gesture at the same time\n");
		goto irq_free;
	}
	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support) {
		device_init_wakeup(&client->dev, 1);
		psensor_pdata = devm_kzalloc(&client->dev,
				sizeof(struct ft5x06_psensor_platform_data),
				GFP_KERNEL);
		if (!psensor_pdata) {
			dev_err(&client->dev, "Failed to allocate memory\n");
			goto irq_free;
		}
		data->psensor_pdata = psensor_pdata;

		psensor_input_dev = input_allocate_device();
		if (!psensor_input_dev) {
			dev_err(&data->client->dev,
				"Failed to allocate device\n");
			goto free_psensor_pdata;
		}

		__set_bit(EV_ABS, psensor_input_dev->evbit);
		input_set_abs_params(psensor_input_dev,
					ABS_DISTANCE, 0, 1, 0, 0);
		psensor_input_dev->name = "proximity";
		psensor_input_dev->id.bustype = BUS_I2C;
		psensor_input_dev->dev.parent = &data->client->dev;
		data->psensor_pdata->input_psensor_dev = psensor_input_dev;

		err = input_register_device(psensor_input_dev);
		if (err) {
			dev_err(&data->client->dev,
				"Unable to register device, err=%d\n", err);
			goto free_psensor_input_dev;
		}

		psensor_pdata->ps_cdev = sensors_proximity_cdev;
		psensor_pdata->ps_cdev.sensors_enable =
					ft5x06_psensor_enable_set;
		psensor_pdata->data = data;

		err = sensors_classdev_register(&psensor_input_dev->dev,
						&psensor_pdata->ps_cdev);
		if (err)
			goto unregister_psensor_input_device;
	}

	if (ft5x06_gesture_support_enabled() && data->pdata->gesture_support) {
		device_init_wakeup(&client->dev, 1);
		gesture_pdata = devm_kzalloc(&client->dev,
@@ -2342,7 +2131,7 @@ static int ft5x06_ts_probe(struct i2c_client *client,
				GFP_KERNEL);
		if (!gesture_pdata) {
			dev_err(&client->dev, "Failed to allocate memory\n");
			goto free_psensor_class_sysfs;
			goto free_gesture_dev;
		}
		data->gesture_pdata = gesture_pdata;
		gesture_pdata->data = data;
@@ -2522,28 +2311,7 @@ free_gesture_pdata:
		devm_kfree(&client->dev, gesture_pdata);
		data->gesture_pdata = NULL;
	}
free_psensor_class_sysfs:
	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support)
		sensors_classdev_unregister(&psensor_pdata->ps_cdev);
unregister_psensor_input_device:
	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support)
		input_unregister_device(data->psensor_pdata->input_psensor_dev);
free_psensor_input_dev:
	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support)
		input_free_device(data->psensor_pdata->input_psensor_dev);
free_psensor_pdata:
	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support) {
		devm_kfree(&client->dev, psensor_pdata);
		data->psensor_pdata = NULL;
	}
irq_free:
	if ((ft5x06_psensor_support_enabled() &&
		data->pdata->psensor_support) ||
		(ft5x06_gesture_support_enabled() &&
		data->pdata->gesture_support))

		device_init_wakeup(&client->dev, 0);
	free_irq(client->irq, data);
free_gpio:
	if (gpio_is_valid(pdata->reset_gpio))
		gpio_free(pdata->reset_gpio);
@@ -2590,15 +2358,6 @@ static int ft5x06_ts_remove(struct i2c_client *client)
		data->gesture_pdata = NULL;
	}

	if (ft5x06_psensor_support_enabled() && data->pdata->psensor_support) {

		device_init_wakeup(&client->dev, 0);
		sensors_classdev_unregister(&data->psensor_pdata->ps_cdev);
		input_unregister_device(data->psensor_pdata->input_psensor_dev);
		devm_kfree(&client->dev, data->psensor_pdata);
		data->psensor_pdata = NULL;
	}

	debugfs_remove_recursive(data->dir);
	device_remove_file(&client->dev, &dev_attr_force_update_fw);
	device_remove_file(&client->dev, &dev_attr_update_fw);
+0 −9
Original line number Diff line number Diff line
@@ -34,14 +34,6 @@ struct fw_upgrade_info {
	u16 delay_erase_flash;
};

struct ft5x06_psensor_platform_data {
	struct input_dev *input_psensor_dev;
	struct sensors_classdev ps_cdev;
	int tp_psensor_opened;
	char tp_psensor_data; /* 0 near, 1 far */
	struct ft5x06_ts_data *data;
};

struct ft5x06_gesture_platform_data {
	int gesture_enable_to_set;	/* enable/disable gesture */
	int in_pocket;	/* whether in pocket mode or not */
@@ -76,7 +68,6 @@ struct ft5x06_ts_platform_data {
	bool no_force_update;
	bool i2c_pull_up;
	bool ignore_id_check;
	bool psensor_support;
	bool gesture_support;
	int (*power_init)(bool);
	int (*power_on)(bool);