diff mbox series

[v2,2/2] i2c: Add i2c_device_get_match_data() callback

Message ID 20230726130804.186313-3-biju.das.jz@bp.renesas.com
State New
Headers show
Series Extend device_get_match_data() to struct bus_type | expand

Commit Message

Biju Das July 26, 2023, 1:08 p.m. UTC
Add i2c_device_get_match_data() callback to struct bus_type().

While at it, introduced i2c_get_match_data_helper() to avoid code
duplication with i2c_get_match_data().

Suggested-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
RFC V1->v2:
 * Replaced "Signed-off-by"->"Suggested-by" tag for Dmitry.
 * Fixed build warnings reported by kernel test robot <lkp@intel.com>
 * Added const qualifier to return type and parameter struct i2c_driver
   in i2c_get_match_data_helper().
 * Added const qualifier to struct i2c_driver in i2c_get_match_data()
 * Dropped driver variable from i2c_device_get_match_data()
 * Replaced to_i2c_client with logic for assigning verify_client as it
   returns non const pointer.
---
 drivers/i2c/i2c-core-base.c | 36 +++++++++++++++++++++++++++---------
 1 file changed, 27 insertions(+), 9 deletions(-)

Comments

Andy Shevchenko July 26, 2023, 4:44 p.m. UTC | #1
On Wed, Jul 26, 2023 at 02:08:04PM +0100, Biju Das wrote:
> Add i2c_device_get_match_data() callback to struct bus_type().
> 
> While at it, introduced i2c_get_match_data_helper() to avoid code
> duplication with i2c_get_match_data().

I have not been Cc'ed to this...

...

> +static const void *i2c_device_get_match_data(const struct device *dev)
> +{
> +	const struct i2c_client *client = (dev->type == &i2c_client_type) ?
> +					  to_i2c_client(dev) : NULL;

There is an API i2c_verify_client() or something like this, I don't remember
by heart.

> +	if (!dev->driver)
> +		return NULL;
> +
> +	return i2c_get_match_data_helper(to_i2c_driver(dev->driver), client);
> +}

...

> +const void *i2c_get_match_data(const struct i2c_client *client)
> +{
> +	const struct i2c_driver *driver = to_i2c_driver(client->dev.driver);
>  	const void *data;
>  
>  	data = device_get_match_data(&client->dev);
> -	if (!data) {
> -		match = i2c_match_id(driver->id_table, client);
> -		if (!match)
> -			return NULL;
> -
> -		data = (const void *)match->driver_data;
> -	}
> +	if (!data)
> +		data = i2c_get_match_data_helper(driver, client);

	if (data)
		return data;

	return i2c_...;

>  
>  	return data;
>  }

...

Side question, what is the idea for i2c_of_match_device()? Shouldn't you also
take it into consideration?
Biju Das July 27, 2023, 7:27 a.m. UTC | #2
Hi Andy Shevchenko,

Thanks for the feedback.

> Subject: Re: [PATCH v2 2/2] i2c: Add i2c_device_get_match_data()
> callback
> 
> On Wed, Jul 26, 2023 at 02:08:04PM +0100, Biju Das wrote:
> > Add i2c_device_get_match_data() callback to struct bus_type().
> >
> > While at it, introduced i2c_get_match_data_helper() to avoid code
> > duplication with i2c_get_match_data().
> 
> I have not been Cc'ed to this...

I execute one script per patch, to pick the recipient list. Somehow it did not pick your name. Next time I will make sure you are on the Cc list.

> 
> ...
> 
> > +static const void *i2c_device_get_match_data(const struct device
> > +*dev) {
> > +	const struct i2c_client *client = (dev->type ==
> &i2c_client_type) ?
> > +					  to_i2c_client(dev) : NULL;
> 
> There is an API i2c_verify_client() or something like this, I don't
> remember by heart.

Dmitry already responded.

> 
> > +	if (!dev->driver)
> > +		return NULL;
> > +
> > +	return i2c_get_match_data_helper(to_i2c_driver(dev->driver),
> > +client); }
> 
> ...
> 
> > +const void *i2c_get_match_data(const struct i2c_client *client) {
> > +	const struct i2c_driver *driver = to_i2c_driver(client-
> >dev.driver);
> >  	const void *data;
> >
> >  	data = device_get_match_data(&client->dev);
> > -	if (!data) {
> > -		match = i2c_match_id(driver->id_table, client);
> > -		if (!match)
> > -			return NULL;
> > -
> > -		data = (const void *)match->driver_data;
> > -	}
> > +	if (!data)
> > +		data = i2c_get_match_data_helper(driver, client);
> 
> 	if (data)
> 		return data;
> 
> 	return i2c_...;

OK.

> 
> >
> >  	return data;
> >  }
> 
> ...
> 
> Side question, what is the idea for i2c_of_match_device()? Shouldn't you
> also take it into consideration?

I guess you are ok with Dmitry's suggestion.

Cheers,
Biju
Andy Shevchenko July 27, 2023, 9:59 a.m. UTC | #3
On Wed, Jul 26, 2023 at 10:56:41AM -0700, Dmitry Torokhov wrote:
> On Wed, Jul 26, 2023 at 07:44:17PM +0300, Andy Shevchenko wrote:
> > On Wed, Jul 26, 2023 at 02:08:04PM +0100, Biju Das wrote:

...

> > > +static const void *i2c_device_get_match_data(const struct device *dev)
> > > +{
> > > +   const struct i2c_client *client = (dev->type == &i2c_client_type) ?
> > > +                                     to_i2c_client(dev) : NULL;
> >
> > There is an API i2c_verify_client() or something like this, I don't remember
> > by heart.
> 
> It's been discussed in a separate thread. i2c_verify_client() needs a
> non-const pointer. It would be nice to clean up i2c_verify_client() to
> accept both variants, but that can be done later.

Then this code needs a TODO comment:

	/* TODO: use i2c_verify_client() when it accepts const pointer */


> > > +   if (!dev->driver)
> > > +           return NULL;
> > > +
> > > +   return i2c_get_match_data_helper(to_i2c_driver(dev->driver), client);
> > > +}

...

> > Side question, what is the idea for i2c_of_match_device()? Shouldn't you also
> > take it into consideration?
> 
> Good call. I think we need to add something like
> 
>         if (!data && driver->driver.of_match_table) {
>                 match =
> i2c_of_match_device_sysfs(driver->driver.of_match_table, client);
>                 if (match)
>                         data = match->data;
>         }
> 
> to i2c_device_get_match_data().

Haven't checked myself, by I trust your suggestion. Let's see it in v3 then.
Biju Das Aug. 1, 2023, 6:46 a.m. UTC | #4
Hi Andy Shevchenko,

Thanks for the feedback.

> Subject: Re: [PATCH v2 2/2] i2c: Add i2c_device_get_match_data()
> callback
> 
> On Wed, Jul 26, 2023 at 10:56:41AM -0700, Dmitry Torokhov wrote:
> > On Wed, Jul 26, 2023 at 07:44:17PM +0300, Andy Shevchenko wrote:
> > > On Wed, Jul 26, 2023 at 02:08:04PM +0100, Biju Das wrote:
> 
> ...
> 
> > > > +static const void *i2c_device_get_match_data(const struct device
> > > > +*dev) {
> > > > +   const struct i2c_client *client = (dev->type ==
> &i2c_client_type) ?
> > > > +                                     to_i2c_client(dev) : NULL;
> > >
> > > There is an API i2c_verify_client() or something like this, I don't
> > > remember by heart.
> >
> > It's been discussed in a separate thread. i2c_verify_client() needs a
> > non-const pointer. It would be nice to clean up i2c_verify_client() to
> > accept both variants, but that can be done later.
> 
> Then this code needs a TODO comment:
> 
> 	/* TODO: use i2c_verify_client() when it accepts const pointer */

Agreed.

> 
> 
> > > > +   if (!dev->driver)
> > > > +           return NULL;
> > > > +
> > > > +   return i2c_get_match_data_helper(to_i2c_driver(dev->driver),
> > > > +client); }
> 
> ...
> 
> > > Side question, what is the idea for i2c_of_match_device()? Shouldn't
> > > you also take it into consideration?
> >
> > Good call. I think we need to add something like
> >
> >         if (!data && driver->driver.of_match_table) {
> >                 match =
> > i2c_of_match_device_sysfs(driver->driver.of_match_table, client);
> >                 if (match)
> >                         data = match->data;
> >         }
> >
> > to i2c_device_get_match_data().
> 
> Haven't checked myself, by I trust your suggestion. Let's see it in v3
> then.

OK, will send V3 to provide feedback.

Cheers,
Biju
diff mbox series

Patch

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index 60746652fd52..6183e9e36889 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -114,20 +114,37 @@  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)
+static const void *i2c_get_match_data_helper(const struct i2c_driver *driver,
+					     const struct i2c_client *client)
 {
-	struct i2c_driver *driver = to_i2c_driver(client->dev.driver);
 	const struct i2c_device_id *match;
+
+	match = i2c_match_id(driver->id_table, client);
+	if (!match)
+		return NULL;
+
+	return (const void *)match->driver_data;
+}
+
+static const void *i2c_device_get_match_data(const struct device *dev)
+{
+	const struct i2c_client *client = (dev->type == &i2c_client_type) ?
+					  to_i2c_client(dev) : NULL;
+
+	if (!dev->driver)
+		return NULL;
+
+	return i2c_get_match_data_helper(to_i2c_driver(dev->driver), client);
+}
+
+const void *i2c_get_match_data(const struct i2c_client *client)
+{
+	const struct i2c_driver *driver = to_i2c_driver(client->dev.driver);
 	const void *data;
 
 	data = device_get_match_data(&client->dev);
-	if (!data) {
-		match = i2c_match_id(driver->id_table, client);
-		if (!match)
-			return NULL;
-
-		data = (const void *)match->driver_data;
-	}
+	if (!data)
+		data = i2c_get_match_data_helper(driver, client);
 
 	return data;
 }
@@ -695,6 +712,7 @@  struct bus_type i2c_bus_type = {
 	.probe		= i2c_device_probe,
 	.remove		= i2c_device_remove,
 	.shutdown	= i2c_device_shutdown,
+	.get_match_data	= i2c_device_get_match_data,
 };
 EXPORT_SYMBOL_GPL(i2c_bus_type);