2022-10-30 18:01:10

by Angel Iglesias

[permalink] [raw]
Subject: [RFC PATCH 1/2] i2c: core: Introduce i2c_client_get_device_id helper function

Introduces new helper function to aid in .probe_new() refactors. In order
to use existing i2c_get_device_id() on the probe callback, the device
match table needs to be accessible in that function, which would require
bigger refactors in some drivers using the deprecated .probe callback.

This issue was discussed in more detail in the IIO mailing list.

Link: https://lore.kernel.org/all/[email protected]/
Suggested-by: Nuno Sá <[email protected]>
Suggested-by: Andy Shevchenko <[email protected]>
Suggested-by: Jonathan Cameron <[email protected]>
Signed-off-by: Angel Iglesias <[email protected]>
---
drivers/i2c/i2c-core-base.c | 15 +++++++++++++++
include/linux/i2c.h | 1 +
2 files changed, 16 insertions(+)

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index b4edf10e8fd0..e6623226e393 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -2236,6 +2236,21 @@ int i2c_get_device_id(const struct i2c_client *client,
}
EXPORT_SYMBOL_GPL(i2c_get_device_id);

+/**
+ * i2c_client_get_device_id - get the driver match table entry of a device
+ * @client: the device to query
+ *
+ * Returns a pointer to the matching entry if found, NULL otherwise.
+ */
+const struct i2c_device_id *i2c_client_get_device_id(const struct i2c_client *client)
+{
+ const struct i2c_driver *drv = to_i2c_driver(client->dev.driver);
+
+ return i2c_match_id(drv->id_table, client);
+
+}
+EXPORT_SYMBOL_GPL(i2c_client_get_device_id);
+
/* ----------------------------------------------------
* the i2c address scanning function
* Will not work for 10-bit addresses!
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index f7c49bbdb8a1..d84e0e99f084 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -189,6 +189,7 @@ s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
u8 *values);
int i2c_get_device_id(const struct i2c_client *client,
struct i2c_device_identity *id);
+const struct i2c_device_id *i2c_client_get_device_id(const struct i2c_client *client);
#endif /* I2C */

/**
--
2.38.1



2022-11-01 13:16:31

by Wolfram Sang

[permalink] [raw]
Subject: Re: [RFC PATCH 1/2] i2c: core: Introduce i2c_client_get_device_id helper function

On Sun, Oct 30, 2022 at 06:52:18PM +0100, Angel Iglesias wrote:
> Introduces new helper function to aid in .probe_new() refactors. In order
> to use existing i2c_get_device_id() on the probe callback, the device
> match table needs to be accessible in that function, which would require
> bigger refactors in some drivers using the deprecated .probe callback.
>
> This issue was discussed in more detail in the IIO mailing list.
>
> Link: https://lore.kernel.org/all/[email protected]/
> Suggested-by: Nuno Sá <[email protected]>
> Suggested-by: Andy Shevchenko <[email protected]>
> Suggested-by: Jonathan Cameron <[email protected]>
> Signed-off-by: Angel Iglesias <[email protected]>

Looks good to me!


Attachments:
(No filename) (789.00 B)
signature.asc (849.00 B)
Download all attachments

2022-11-01 16:09:42

by Uwe Kleine-König

[permalink] [raw]
Subject: Re: [RFC PATCH 1/2] i2c: core: Introduce i2c_client_get_device_id helper function

On Sun, Oct 30, 2022 at 06:52:18PM +0100, Angel Iglesias wrote:
> Introduces new helper function to aid in .probe_new() refactors. In order
> to use existing i2c_get_device_id() on the probe callback, the device
> match table needs to be accessible in that function, which would require
> bigger refactors in some drivers using the deprecated .probe callback.
>
> This issue was discussed in more detail in the IIO mailing list.
>
> Link: https://lore.kernel.org/all/[email protected]/
> Suggested-by: Nuno S? <[email protected]>
> Suggested-by: Andy Shevchenko <[email protected]>
> Suggested-by: Jonathan Cameron <[email protected]>
> Signed-off-by: Angel Iglesias <[email protected]>
> ---
> drivers/i2c/i2c-core-base.c | 15 +++++++++++++++
> include/linux/i2c.h | 1 +
> 2 files changed, 16 insertions(+)
>
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index b4edf10e8fd0..e6623226e393 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -2236,6 +2236,21 @@ int i2c_get_device_id(const struct i2c_client *client,
> }
> EXPORT_SYMBOL_GPL(i2c_get_device_id);
>
> +/**
> + * i2c_client_get_device_id - get the driver match table entry of a device
> + * @client: the device to query
> + *
> + * Returns a pointer to the matching entry if found, NULL otherwise.
> + */
> +const struct i2c_device_id *i2c_client_get_device_id(const struct i2c_client *client)
> +{
> + const struct i2c_driver *drv = to_i2c_driver(client->dev.driver);
> +
> + return i2c_match_id(drv->id_table, client);
> +

I'd drop the empty line after the return. Is it worth to note in a
comment that it only works for bound clients? (Oopses otherwise)

Best regards
Uwe

--
Pengutronix e.K. | Uwe Kleine-K?nig |
Industrial Linux Solutions | https://www.pengutronix.de/ |


Attachments:
(No filename) (1.94 kB)
signature.asc (499.00 B)
Download all attachments

2022-11-01 23:59:22

by Angel Iglesias

[permalink] [raw]
Subject: Re: [RFC PATCH 1/2] i2c: core: Introduce i2c_client_get_device_id helper function

On Tue, 2022-11-01 at 15:54 +0100, Uwe Kleine-König wrote:
> On Sun, Oct 30, 2022 at 06:52:18PM +0100, Angel Iglesias wrote:
> > Introduces new helper function to aid in .probe_new() refactors. In order
> > to use existing i2c_get_device_id() on the probe callback, the device
> > match table needs to be accessible in that function, which would require
> > bigger refactors in some drivers using the deprecated .probe callback.
> >
> > This issue was discussed in more detail in the IIO mailing list.
> >
> > Link:
> > https://lore.kernel.org/all/[email protected]/
> > Suggested-by: Nuno Sá <[email protected]>
> > Suggested-by: Andy Shevchenko <[email protected]>
> > Suggested-by: Jonathan Cameron <[email protected]>
> > Signed-off-by: Angel Iglesias <[email protected]>
> > ---
> >  drivers/i2c/i2c-core-base.c | 15 +++++++++++++++
> >  include/linux/i2c.h         |  1 +
> >  2 files changed, 16 insertions(+)
> >
> > diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> > index b4edf10e8fd0..e6623226e393 100644
> > --- a/drivers/i2c/i2c-core-base.c
> > +++ b/drivers/i2c/i2c-core-base.c
> > @@ -2236,6 +2236,21 @@ int i2c_get_device_id(const struct i2c_client
> > *client,
> >  }
> >  EXPORT_SYMBOL_GPL(i2c_get_device_id);
> >  
> > +/**
> > + * i2c_client_get_device_id - get the driver match table entry of a device
> > + * @client: the device to query
> > + *
> > + * Returns a pointer to the matching entry if found, NULL otherwise.
> > + */
> > +const struct i2c_device_id *i2c_client_get_device_id(const struct
> > i2c_client *client)
> > +{
> > +       const struct i2c_driver *drv = to_i2c_driver(client->dev.driver);
> > +
> > +       return i2c_match_id(drv->id_table, client);
> > +
>
> I'd drop the empty line after the return. Is it worth to note in a
> comment that it only works for bound clients? (Oopses otherwise)

Yup, my bad, that newline shouldn't be there.
Sure, seems reasonable to leave warn just in case.

Kind regards,
Angel

> Best regards
> Uwe
>