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:
parent
60f07c29e0
commit
d87ffe00e4
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue