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

Commit fb5e4c3e authored by Nick Dyer's avatar Nick Dyer Committed by Dmitry Torokhov
Browse files

Input: atmel_mxt_ts - improve T19 GPIO keys handling



 * The mapping of the GPIO numbers into the T19 status byte varies between
   different maXTouch chips. Some have up to 7 GPIOs. Allowing a keycode array
   of up to 8 items is simpler and more generic. So replace #define with
   configurable number of keys which also allows the removal of is_tp.
 * Rename platform data parameters to include "t19" to prevent confusion with
   T15 key array.
 * Probe aborts early on when pdata is NULL, so no need to check.
 * Move "int i" to beginning of function (mixed declarations and code)
 * Use API calls rather than __set_bit()
 * Remove unused dev variable.

Signed-off-by: default avatarNick Dyer <nick.dyer@itdev.co.uk>
Acked-by: default avatarYufeng Shen <miletus@chromium.org>
Reviewed-by: default avatarHenrik Rydberg <rydberg@euromail.se>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 2cefdb1f
Loading
Loading
Loading
Loading
+17 −27
Original line number Original line Diff line number Diff line
@@ -180,12 +180,6 @@


#define MXT_FWRESET_TIME	175	/* msec */
#define MXT_FWRESET_TIME	175	/* msec */


/* MXT_SPT_GPIOPWM_T19 field */
#define MXT_GPIO0_MASK		0x04
#define MXT_GPIO1_MASK		0x08
#define MXT_GPIO2_MASK		0x10
#define MXT_GPIO3_MASK		0x20

/* Command to unlock bootloader */
/* Command to unlock bootloader */
#define MXT_UNLOCK_CMD_MSB	0xaa
#define MXT_UNLOCK_CMD_MSB	0xaa
#define MXT_UNLOCK_CMD_LSB	0xdc
#define MXT_UNLOCK_CMD_LSB	0xdc
@@ -250,7 +244,6 @@ struct mxt_data {
	const struct mxt_platform_data *pdata;
	const struct mxt_platform_data *pdata;
	struct mxt_object *object_table;
	struct mxt_object *object_table;
	struct mxt_info info;
	struct mxt_info info;
	bool is_tp;


	unsigned int irq;
	unsigned int irq;
	unsigned int max_x;
	unsigned int max_x;
@@ -515,15 +508,16 @@ static int mxt_write_object(struct mxt_data *data,
static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
{
{
	struct input_dev *input = data->input_dev;
	struct input_dev *input = data->input_dev;
	const struct mxt_platform_data *pdata = data->pdata;
	bool button;
	bool button;
	int i;
	int i;


	/* Active-low switch */
	/* Active-low switch */
	for (i = 0; i < MXT_NUM_GPIO; i++) {
	for (i = 0; i < pdata->t19_num_keys; i++) {
		if (data->pdata->key_map[i] == KEY_RESERVED)
		if (pdata->t19_keymap[i] == KEY_RESERVED)
			continue;
			continue;
		button = !(message->message[0] & MXT_GPIO0_MASK << i);
		button = !(message->message[0] & (1 << i));
		input_report_key(input, data->pdata->key_map[i], button);
		input_report_key(input, pdata->t19_keymap[i], button);
	}
	}
}
}


@@ -1084,6 +1078,8 @@ static int mxt_probe(struct i2c_client *client,
	struct input_dev *input_dev;
	struct input_dev *input_dev;
	int error;
	int error;
	unsigned int num_mt_slots;
	unsigned int num_mt_slots;
	unsigned int mt_flags = 0;
	int i;


	if (!pdata)
	if (!pdata)
		return -EINVAL;
		return -EINVAL;
@@ -1096,10 +1092,7 @@ static int mxt_probe(struct i2c_client *client,
		goto err_free_mem;
		goto err_free_mem;
	}
	}


	data->is_tp = pdata && pdata->is_tp;
	input_dev->name = "Atmel maXTouch Touchscreen";

	input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" :
					  "Atmel maXTouch Touchscreen";
	snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
	snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
		 client->adapter->nr, client->addr);
		 client->adapter->nr, client->addr);


@@ -1125,20 +1118,15 @@ static int mxt_probe(struct i2c_client *client,
	__set_bit(EV_KEY, input_dev->evbit);
	__set_bit(EV_KEY, input_dev->evbit);
	__set_bit(BTN_TOUCH, input_dev->keybit);
	__set_bit(BTN_TOUCH, input_dev->keybit);


	if (data->is_tp) {
	if (pdata->t19_num_keys) {
		int i;
		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
		__set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
		__set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);


		for (i = 0; i < MXT_NUM_GPIO; i++)
		for (i = 0; i < pdata->t19_num_keys; i++)
			if (pdata->key_map[i] != KEY_RESERVED)
			if (pdata->t19_keymap[i] != KEY_RESERVED)
				__set_bit(pdata->key_map[i], input_dev->keybit);
				input_set_capability(input_dev, EV_KEY,
						     pdata->t19_keymap[i]);


		__set_bit(BTN_TOOL_FINGER, input_dev->keybit);
		mt_flags |= INPUT_MT_POINTER;
		__set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
		__set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
		__set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
		__set_bit(BTN_TOOL_QUINTTAP, input_dev->keybit);


		input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
		input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
		input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
		input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
@@ -1146,6 +1134,8 @@ static int mxt_probe(struct i2c_client *client,
				  MXT_PIXELS_PER_MM);
				  MXT_PIXELS_PER_MM);
		input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
		input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
				  MXT_PIXELS_PER_MM);
				  MXT_PIXELS_PER_MM);

		input_dev->name = "Atmel maXTouch Touchpad";
	}
	}


	/* For single touch */
	/* For single touch */
@@ -1158,7 +1148,7 @@ static int mxt_probe(struct i2c_client *client,


	/* For multi touch */
	/* For multi touch */
	num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
	num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
	error = input_mt_init_slots(input_dev, num_mt_slots, 0);
	error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags);
	if (error)
	if (error)
		goto err_free_object;
		goto err_free_object;
	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
+11 −6
Original line number Original line Diff line number Diff line
@@ -84,16 +84,22 @@ static struct i2c_board_info tsl2563_als_device = {
	I2C_BOARD_INFO("tsl2563", TAOS_ALS_I2C_ADDR),
	I2C_BOARD_INFO("tsl2563", TAOS_ALS_I2C_ADDR),
};
};


static int mxt_t19_keys[] = {
	KEY_RESERVED,
	KEY_RESERVED,
	KEY_RESERVED,
	KEY_RESERVED,
	KEY_RESERVED,
	BTN_LEFT
};

static struct mxt_platform_data atmel_224s_tp_platform_data = {
static struct mxt_platform_data atmel_224s_tp_platform_data = {
	.x_size			= 102*20,
	.x_size			= 102*20,
	.y_size			= 68*20,
	.y_size			= 68*20,
	.orient			= MXT_VERTICAL_FLIP,
	.orient			= MXT_VERTICAL_FLIP,
	.irqflags		= IRQF_TRIGGER_FALLING,
	.irqflags		= IRQF_TRIGGER_FALLING,
	.is_tp			= true,
	.t19_num_keys		= ARRAY_SIZE(mxt_t19_keys),
	.key_map		= { KEY_RESERVED,
	.t19_keymap		= mxt_t19_keys,
				    KEY_RESERVED,
				    KEY_RESERVED,
				    BTN_LEFT },
	.config			= NULL,
	.config			= NULL,
	.config_length		= 0,
	.config_length		= 0,
};
};
@@ -109,7 +115,6 @@ static struct mxt_platform_data atmel_1664s_platform_data = {
	.y_size			= 2560,
	.y_size			= 2560,
	.orient			= MXT_ROTATED_90_COUNTER,
	.orient			= MXT_ROTATED_90_COUNTER,
	.irqflags		= IRQF_TRIGGER_FALLING,
	.irqflags		= IRQF_TRIGGER_FALLING,
	.is_tp			= false,
	.config			= NULL,
	.config			= NULL,
	.config_length		= 0,
	.config_length		= 0,
};
};
+2 −5
Original line number Original line Diff line number Diff line
@@ -15,9 +15,6 @@


#include <linux/types.h>
#include <linux/types.h>


/* For key_map array */
#define MXT_NUM_GPIO		4

/* Orient */
/* Orient */
#define MXT_NORMAL		0x0
#define MXT_NORMAL		0x0
#define MXT_DIAGONAL		0x1
#define MXT_DIAGONAL		0x1
@@ -38,8 +35,8 @@ struct mxt_platform_data {
	unsigned char orient;
	unsigned char orient;


	unsigned long irqflags;
	unsigned long irqflags;
	bool is_tp;
	u8 t19_num_keys;
	const unsigned int key_map[MXT_NUM_GPIO];
	const unsigned int *t19_keymap;
};
};


#endif /* __LINUX_ATMEL_MXT_TS_H */
#endif /* __LINUX_ATMEL_MXT_TS_H */