diff mbox series

[v2] i2c: Add i2c_get_match_data()

Message ID 20230601171711.221430-1-biju.das.jz@bp.renesas.com
State Superseded
Headers show
Series [v2] i2c: Add i2c_get_match_data() | expand

Commit Message

Biju Das June 1, 2023, 5:17 p.m. UTC
Add i2c_get_match_data() similar to of_device_get_match_data(),
so that we can optimize the driver code that uses both I2C and
DT-based matching.

Suggested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v1->v2:
 * Dropped parameter const struct i2c_device_id *id and the helper function.

eg: The RTC pcf85063/isl1208 driver code can be optimized with this patch.
-       if (client->dev.of_node) {
+       if (client->dev.of_node)
                config = of_device_get_match_data(&client->dev);
-               if (!config)
-                       return -ENODEV;
-       } else {
-               enum pcf85063_type type =
-                       i2c_match_id(pcf85063_ids, client)->driver_data;
-               if (type >= PCF85063_LAST_ID)
-                       return -ENODEV;
-               config = &pcf85063_cfg[type];
-       }
+       else
+               config = i2c_get_match_data(client);
+
+       if (!config)
+               return -ENODEV;
---
 drivers/i2c/i2c-core-base.c | 14 ++++++++++++++
 include/linux/i2c.h         |  2 ++
 2 files changed, 16 insertions(+)

Comments

Biju Das June 5, 2023, 9:47 a.m. UTC | #1
Hi Wolfram,

Thanks for the feedback.

> -----Original Message-----
> From: Wolfram Sang <wsa@kernel.org>
> Sent: Monday, June 5, 2023 10:25 AM
> To: Biju Das <biju.das.jz@bp.renesas.com>
> Cc: Alessandro Zummo <a.zummo@towertech.it>; Alexandre Belloni
> <alexandre.belloni@bootlin.com>; linux-i2c@vger.kernel.org; linux-
> rtc@vger.kernel.org; Geert Uytterhoeven <geert+renesas@glider.be>;
> Prabhakar Mahadev Lad <prabhakar.mahadev-lad.rj@bp.renesas.com>; linux-
> renesas-soc@vger.kernel.org
> Subject: Re: [PATCH v2] i2c: Add i2c_get_match_data()
> 
> 
> > +       if (client->dev.of_node)
> >                 config = of_device_get_match_data(&client->dev);
> 
> Has it been considered adding this check to the new helper function as
> well? Saves even more boilerplate code, I'd think.

You mean like below?? The new helper function will do both I2C and DT-based matching??

const void *i2c_get_match_data(const struct i2c_client *client)
{
	struct device_driver *drv = client->dev.driver;
	struct i2c_driver *driver = to_i2c_driver(drv);
	const struct i2c_device_id *match;
	const void *match_data;

	if (client->dev.of_node){
		match_data = of_device_get_match_data(&client->dev);
	} else {
	      match = i2c_match_id(driver->id_table, client);
	      if (!match)
		   return NULL;
	
		match_data = (const void *)match->driver_data;
	}

	return match_data;
}
EXPORT_SYMBOL(i2c_get_match_data);

Cheers,
Biju
Biju Das June 5, 2023, 10:24 a.m. UTC | #2
Hi Wolfram,

> Subject: Re: [PATCH v2] i2c: Add i2c_get_match_data()
> 
> 
> > You mean like below?? The new helper function will do both I2C and DT-
> based matching??
> > const void *i2c_get_match_data(const struct i2c_client *client) {
> > 	struct device_driver *drv = client->dev.driver;
> > 	struct i2c_driver *driver = to_i2c_driver(drv);
> > 	const struct i2c_device_id *match;
> > 	const void *match_data;
> >
> > 	if (client->dev.of_node){
> > 		match_data = of_device_get_match_data(&client->dev);
> > 	} else {
> > 	      match = i2c_match_id(driver->id_table, client);
> > 	      if (!match)
> > 		   return NULL;
> >
> > 		match_data = (const void *)match->driver_data;
> > 	}
> >
> > 	return match_data;
> > }
> > EXPORT_SYMBOL(i2c_get_match_data);
> 
> Yes. Not good? I thought a function named 'i2c_get_match_data' should
> get match_data and find out itself where it is coming from. No?

Yes, It looks good to me based on your explanation.

Cheers,
Biju
diff mbox series

Patch

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index ae3af738b03f..8576a1647785 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -114,6 +114,20 @@  const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
 }
 EXPORT_SYMBOL_GPL(i2c_match_id);
 
+const void *i2c_get_match_data(const struct i2c_client *client)
+{
+	struct device_driver *drv = client->dev.driver;
+	struct i2c_driver *driver = to_i2c_driver(drv);
+	const struct i2c_device_id *match;
+
+	match = i2c_match_id(driver->id_table, client);
+	if (!match)
+		return NULL;
+
+	return (const void *)match->driver_data;
+}
+EXPORT_SYMBOL(i2c_get_match_data);
+
 static int i2c_device_match(struct device *dev, struct device_driver *drv)
 {
 	struct i2c_client	*client = i2c_verify_client(dev);
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index 13a1ce38cb0c..3430cc2b05a6 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -367,6 +367,8 @@  struct i2c_adapter *i2c_verify_adapter(struct device *dev);
 const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
 					 const struct i2c_client *client);
 
+const void *i2c_get_match_data(const struct i2c_client *client);
+
 static inline struct i2c_client *kobj_to_i2c_client(struct kobject *kobj)
 {
 	struct device * const dev = kobj_to_dev(kobj);