Enhance i2c_get_match_data() for a faster path for device_get_match_data(). While at it, add const to struct i2c_driver to prevent overriding the driver pointer. Suggested-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- v6->v7: * Updated commit description by removing unnecessary wrapping. * Moved the patch from #3 to #2. * Added Rb tag from Andy v6: * Separate patch to prepare for better difference for i2c_match_id() changes. --- drivers/i2c/i2c-core-base.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 60746652fd52..7005dfe64066 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -116,20 +116,19 @@ EXPORT_SYMBOL_GPL(i2c_match_id); const void *i2c_get_match_data(const struct i2c_client *client) { - struct i2c_driver *driver = to_i2c_driver(client->dev.driver); + const struct i2c_driver *driver = to_i2c_driver(client->dev.driver); const struct i2c_device_id *match; const void *data; data = device_get_match_data(&client->dev); - if (!data) { - match = i2c_match_id(driver->id_table, client); - if (!match) - return NULL; + if (data) + return data; - data = (const void *)match->driver_data; - } + match = i2c_match_id(driver->id_table, client); + if (!match) + return NULL; - return data; + return (const void *)match->driver_data; } EXPORT_SYMBOL(i2c_get_match_data); -- 2.25.1