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

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.orgSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 60f07c29
...@@ -26,23 +26,28 @@ ...@@ -26,23 +26,28 @@
#define MODE_DATA_RAW 0x5A #define MODE_DATA_RAW 0x5A
#define MAX_SUPPORTED_FINGER_NUM 5 #define MSG2638_MAX_FINGERS 5
#define CHIP_ON_DELAY_MS 15 #define CHIP_ON_DELAY_MS 15
#define FIRMWARE_ON_DELAY_MS 50 #define FIRMWARE_ON_DELAY_MS 50
#define RESET_DELAY_MIN_US 10000 #define RESET_DELAY_MIN_US 10000
#define RESET_DELAY_MAX_US 11000 #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 xy_hi; /* higher bits of x and y coordinates */
u8 x_low; u8 x_low;
u8 y_low; u8 y_low;
u8 pressure; u8 pressure;
}; };
struct touch_event { struct msg2638_touch_event {
u8 mode; u8 mode;
struct packet pkt[MAX_SUPPORTED_FINGER_NUM]; struct msg2638_packet pkt[MSG2638_MAX_FINGERS];
u8 proximity; u8 proximity;
u8 checksum; u8 checksum;
}; };
...@@ -53,6 +58,7 @@ struct msg2638_ts_data { ...@@ -53,6 +58,7 @@ struct msg2638_ts_data {
struct touchscreen_properties prop; struct touchscreen_properties prop;
struct regulator_bulk_data supplies[2]; struct regulator_bulk_data supplies[2];
struct gpio_desc *reset_gpiod; struct gpio_desc *reset_gpiod;
int max_fingers;
}; };
static u8 msg2638_checksum(u8 *data, u32 length) static u8 msg2638_checksum(u8 *data, u32 length)
...@@ -71,7 +77,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler) ...@@ -71,7 +77,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler)
struct msg2638_ts_data *msg2638 = msg2638_handler; struct msg2638_ts_data *msg2638 = msg2638_handler;
struct i2c_client *client = msg2638->client; struct i2c_client *client = msg2638->client;
struct input_dev *input = msg2638->input_dev; struct input_dev *input = msg2638->input_dev;
struct touch_event touch_event; struct msg2638_touch_event touch_event;
u32 len = sizeof(touch_event); u32 len = sizeof(touch_event);
struct i2c_msg msg[] = { struct i2c_msg msg[] = {
{ {
...@@ -81,7 +87,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler) ...@@ -81,7 +87,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler)
.buf = (u8 *)&touch_event, .buf = (u8 *)&touch_event,
}, },
}; };
struct packet *p; struct msg2638_packet *p;
u16 x, y; u16 x, y;
int ret; int ret;
int i; int i;
...@@ -103,7 +109,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler) ...@@ -103,7 +109,7 @@ static irqreturn_t msg2638_ts_irq_handler(int irq, void *msg2638_handler)
goto out; goto out;
} }
for (i = 0; i < MAX_SUPPORTED_FINGER_NUM; i++) { for (i = 0; i < msg2638->max_fingers; i++) {
p = &touch_event.pkt[i]; p = &touch_event.pkt[i];
/* Ignore non-pressed finger data */ /* Ignore non-pressed finger data */
...@@ -215,7 +221,7 @@ static int msg2638_init_input_dev(struct msg2638_ts_data *msg2638) ...@@ -215,7 +221,7 @@ static int msg2638_init_input_dev(struct msg2638_ts_data *msg2638)
return -EINVAL; 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); INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
if (error) { if (error) {
dev_err(dev, "Failed to initialize MT slots: %d\n", 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) ...@@ -233,6 +239,7 @@ static int msg2638_init_input_dev(struct msg2638_ts_data *msg2638)
static int msg2638_ts_probe(struct i2c_client *client) static int msg2638_ts_probe(struct i2c_client *client)
{ {
const struct msg_chip_data *chip_data;
struct device *dev = &client->dev; struct device *dev = &client->dev;
struct msg2638_ts_data *msg2638; struct msg2638_ts_data *msg2638;
int error; int error;
...@@ -249,6 +256,14 @@ static int msg2638_ts_probe(struct i2c_client *client) ...@@ -249,6 +256,14 @@ static int msg2638_ts_probe(struct i2c_client *client)
msg2638->client = client; msg2638->client = client;
i2c_set_clientdata(client, msg2638); 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[0].supply = "vdd";
msg2638->supplies[1].supply = "vddio"; msg2638->supplies[1].supply = "vddio";
error = devm_regulator_bulk_get(dev, ARRAY_SIZE(msg2638->supplies), error = devm_regulator_bulk_get(dev, ARRAY_SIZE(msg2638->supplies),
...@@ -272,7 +287,7 @@ static int msg2638_ts_probe(struct i2c_client *client) ...@@ -272,7 +287,7 @@ static int msg2638_ts_probe(struct i2c_client *client)
} }
error = devm_request_threaded_irq(dev, client->irq, error = devm_request_threaded_irq(dev, client->irq,
NULL, msg2638_ts_irq_handler, NULL, chip_data->irq_handler,
IRQF_ONESHOT | IRQF_NO_AUTOEN, IRQF_ONESHOT | IRQF_NO_AUTOEN,
client->name, msg2638); client->name, msg2638);
if (error) { if (error) {
...@@ -316,8 +331,13 @@ static int __maybe_unused msg2638_resume(struct device *dev) ...@@ -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 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[] = { 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); MODULE_DEVICE_TABLE(of, msg2638_of_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment