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: Vincent Knecht <vincent.knecht@mailoo.org>
Link: https://lore.kernel.org/r/20221110171952.34207-2-vincent.knecht@mailoo.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
Vincent Knecht 2022-11-14 16:58:23 -08:00 committed by Dmitry Torokhov
parent 60f07c29e0
commit d87ffe00e4
1 changed files with 30 additions and 10 deletions

View File

@ -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);