The exc3000_id.driver_data could store a pointer to the info, like for ACPI/DT-based matching, making I2C, ACPI and DT-based matching more similar. After that, we can simplify the probe() by replacing of_device_get_ match_data() and i2c_match_id() by i2c_get_match_data() as we have similar I2C, ACPI and DT-based matching table. Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> --- drivers/input/touchscreen/exc3000.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/drivers/input/touchscreen/exc3000.c b/drivers/input/touchscreen/exc3000.c index 4c0d99aae9e0..8b65b4e2aa50 100644 --- a/drivers/input/touchscreen/exc3000.c +++ b/drivers/input/touchscreen/exc3000.c @@ -42,8 +42,6 @@ #define EXC3000_RESET_MS 10 #define EXC3000_READY_MS 100 -static const struct i2c_device_id exc3000_id[]; - struct eeti_dev_info { const char *name; int max_xy; @@ -347,12 +345,10 @@ static int exc3000_probe(struct i2c_client *client) return -ENOMEM; data->client = client; - data->info = device_get_match_data(&client->dev); - if (!data->info) { - enum eeti_dev_id eeti_dev_id = - i2c_match_id(exc3000_id, client)->driver_data; - data->info = &exc3000_info[eeti_dev_id]; - } + data->info = i2c_get_match_data(client); + if (!data->info) + return -ENODEV; + timer_setup(&data->timer, exc3000_timer, 0); init_completion(&data->wait_event); mutex_init(&data->query_lock); @@ -445,9 +441,9 @@ static int exc3000_probe(struct i2c_client *client) } static const struct i2c_device_id exc3000_id[] = { - { "exc3000", EETI_EXC3000 }, - { "exc80h60", EETI_EXC80H60 }, - { "exc80h84", EETI_EXC80H84 }, + { "exc3000", .driver_data = (kernel_ulong_t)&exc3000_info[EETI_EXC3000] }, + { "exc80h60", .driver_data = (kernel_ulong_t)&exc3000_info[EETI_EXC80H60] }, + { "exc80h84", .driver_data = (kernel_ulong_t)&exc3000_info[EETI_EXC80H84] }, { } }; MODULE_DEVICE_TABLE(i2c, exc3000_id); -- 2.25.1