Commit d87ffe00 authored by Vincent Knecht's avatar Vincent Knecht Committed by Dmitry Torokhov
Browse files

Input: msg2638 - set max finger number and irqhandler from driver data



This will allow us to add other MStar touchscreen variants' support.
No functional change.

Signed-off-by: default avatarVincent Knecht <vincent.knecht@mailoo.org>
Link: https://lore.kernel.org/r/20221110171952.34207-2-vincent.knecht@mailoo.org


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 60f07c29
Loading
Loading
Loading
Loading
+30 −10
Original line number Diff line number Diff line
@@ -26,23 +26,28 @@

#define MODE_DATA_RAW			0x5A

#define MAX_SUPPORTED_FINGER_NUM	5
#define MSG2638_MAX_FINGERS		5

#define CHIP_ON_DELAY_MS		15
#define FIRMWARE_ON_DELAY_MS		50
#define RESET_DELAY_MIN_US		10000
#define RESET_DELAY_MAX_US		11000

struct packet {
struct msg_chip_data {
	irq_handler_t irq_handler;
	unsigned int max_fingers;
};

struct msg2638_packet {
	u8	xy_hi; /* higher bits of x and y coordinates */
	u8	x_low;
	u8	y_low;
	u8	pressure;
};

struct touch_event {
struct msg2638_touch_event {
	u8	mode;
	struct	packet pkt[MAX_SUPPORTED_FINGER_NUM];
	struct	msg2638_packet pkt[MSG2638_MAX_FINGERS];
	u8	proximity;
	u8	checksum;
};
@@ -53,6 +58,7 @@ struct msg2638_ts_data {
	struct touchscreen_properties prop;
	struct regulator_bulk_data supplies[2];
	struct gpio_desc *reset_gpiod;
	int max_fingers;
};

static u8 msg2638_checksum(u8 *data, u32 length)
@@ -71,7 +77,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler)
	struct msg2638_ts_data *msg2638 = msg2638_handler;
	struct i2c_client *client = msg2638->client;
	struct input_dev *input = msg2638->input_dev;
	struct touch_event touch_event;
	struct msg2638_touch_event touch_event;
	u32 len = sizeof(touch_event);
	struct i2c_msg msg[] = {
		{
@@ -81,7 +87,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler)
			.buf	= (u8 *)&touch_event,
		},
	};
	struct packet *p;
	struct msg2638_packet *p;
	u16 x, y;
	int ret;
	int i;
@@ -103,7 +109,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler)
		goto out;
	}

	for (i = 0; i < MAX_SUPPORTED_FINGER_NUM; i++) {
	for (i = 0; i < msg2638->max_fingers; i++) {
		p = &touch_event.pkt[i];

		/* Ignore non-pressed finger data */
@@ -215,7 +221,7 @@ static int msg2638_init_input_dev(struct msg2638_ts_data *msg2638)
		return -EINVAL;
	}

	error = input_mt_init_slots(input_dev, MAX_SUPPORTED_FINGER_NUM,
	error = input_mt_init_slots(input_dev, msg2638->max_fingers,
				    INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
	if (error) {
		dev_err(dev, "Failed to initialize MT slots: %d\n", error);
@@ -233,6 +239,7 @@ static int msg2638_init_input_dev(struct msg2638_ts_data *msg2638)

static int msg2638_ts_probe(struct i2c_client *client)
{
	const struct msg_chip_data *chip_data;
	struct device *dev = &client->dev;
	struct msg2638_ts_data *msg2638;
	int error;
@@ -249,6 +256,14 @@ static int msg2638_ts_probe(struct i2c_client *client)
	msg2638->client = client;
	i2c_set_clientdata(client, msg2638);

	chip_data = device_get_match_data(&client->dev);
	if (!chip_data || !chip_data->max_fingers) {
		dev_err(dev, "Invalid or missing chip data\n");
		return -EINVAL;
	}

	msg2638->max_fingers = chip_data->max_fingers;

	msg2638->supplies[0].supply = "vdd";
	msg2638->supplies[1].supply = "vddio";
	error = devm_regulator_bulk_get(dev, ARRAY_SIZE(msg2638->supplies),
@@ -272,7 +287,7 @@ static int msg2638_ts_probe(struct i2c_client *client)
	}

	error = devm_request_threaded_irq(dev, client->irq,
					  NULL, msg2638_ts_irq_handler,
					  NULL, chip_data->irq_handler,
					  IRQF_ONESHOT | IRQF_NO_AUTOEN,
					  client->name, msg2638);
	if (error) {
@@ -316,8 +331,13 @@ static int __maybe_unused msg2638_resume(struct device *dev)

static SIMPLE_DEV_PM_OPS(msg2638_pm_ops, msg2638_suspend, msg2638_resume);

static const struct msg_chip_data msg2638_data = {
	.irq_handler = msg2638_ts_irq_handler,
	.max_fingers = MSG2638_MAX_FINGERS,
};

static const struct of_device_id msg2638_of_match[] = {
	{ .compatible = "mstar,msg2638" },
	{ .compatible = "mstar,msg2638", .data = &msg2638_data },
	{ }
};
MODULE_DEVICE_TABLE(of, msg2638_of_match);