2022-11-06 16:48:45

by Angel Iglesias

[permalink] [raw]
Subject: [PATCH v2 0/2] i2c: core: Introduce i2c_client_get_device_id helper

Introduces a new i2c helper to query driver match tables and recover the
identity of the bound device. This helper should help with the migration
of existing drivers to use the new i2c_driver .probe_new callback, which
does not provide the device id with the pointer to the driver data as the
previous .probe callback.

As part of the patchset, migrated the bmp280 IIO driver to .new_probe
callback using the new helper.

Changes from v1 --> v2:
* Add further clarification that the device queried needs to be bound to
the driver.
* Drops extra newline after function return.
* Discard unrelated style changes.

Previous version:
https://lore.kernel.org/all/[email protected]/

Angel Iglesias (2):
i2c: core: Introduce i2c_client_get_device_id helper function
iio: pressure: bmp280: convert to i2c's .probe_new()

drivers/i2c/i2c-core-base.c | 15 +++++++++++++++
drivers/iio/pressure/bmp280-i2c.c | 6 +++---
include/linux/i2c.h | 1 +
3 files changed, 19 insertions(+), 3 deletions(-)


base-commit: e38fb57870172ed920c206e8d73e2639d83c8847
--
2.38.1



2022-11-06 16:58:41

by Angel Iglesias

[permalink] [raw]
Subject: [PATCH v2 2/2] iio: pressure: bmp280: convert to i2c's .probe_new()

Use i2c_client_get_device_id() to get the i2c_device_id* parameter in the
.new_probe() callback.

Signed-off-by: Angel Iglesias <[email protected]>
Reviewed-by: Andy Shevchenko <[email protected]>

diff --git a/drivers/iio/pressure/bmp280-i2c.c b/drivers/iio/pressure/bmp280-i2c.c
index 0c27211f3ea0..14eab086d24a 100644
--- a/drivers/iio/pressure/bmp280-i2c.c
+++ b/drivers/iio/pressure/bmp280-i2c.c
@@ -5,11 +5,11 @@

#include "bmp280.h"

-static int bmp280_i2c_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
+static int bmp280_i2c_probe(struct i2c_client *client)
{
struct regmap *regmap;
const struct regmap_config *regmap_config;
+ const struct i2c_device_id *id = i2c_client_get_device_id(client);

switch (id->driver_data) {
case BMP180_CHIP_ID:
@@ -65,7 +65,7 @@ static struct i2c_driver bmp280_i2c_driver = {
.of_match_table = bmp280_of_i2c_match,
.pm = pm_ptr(&bmp280_dev_pm_ops),
},
- .probe = bmp280_i2c_probe,
+ .probe_new = bmp280_i2c_probe,
.id_table = bmp280_i2c_id,
};
module_i2c_driver(bmp280_i2c_driver);
--
2.38.1


2022-11-06 17:50:33

by Angel Iglesias

[permalink] [raw]
Subject: [PATCH v2 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]>
Reviewed-by: Andy Shevchenko <[email protected]>

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index b4edf10e8fd0..920676e62c22 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. The device must be bound to a driver or
+ * the function oopses.
+ *
+ * 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-06 17:51:12

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] iio: pressure: bmp280: convert to i2c's .probe_new()

On Sun, 6 Nov 2022 17:43:16 +0100
Angel Iglesias <[email protected]> wrote:

> Use i2c_client_get_device_id() to get the i2c_device_id* parameter in the
> .new_probe() callback.
>
> Signed-off-by: Angel Iglesias <[email protected]>
> Reviewed-by: Andy Shevchenko <[email protected]>

I'm fine with Wolfram picking this up as an example of using the new code,
or I can take it through IIO after merging Wolfram's immutable branch.

So for option 1:
Acked-by: Jonathan Cameron <[email protected]>

>
> diff --git a/drivers/iio/pressure/bmp280-i2c.c b/drivers/iio/pressure/bmp280-i2c.c
> index 0c27211f3ea0..14eab086d24a 100644
> --- a/drivers/iio/pressure/bmp280-i2c.c
> +++ b/drivers/iio/pressure/bmp280-i2c.c
> @@ -5,11 +5,11 @@
>
> #include "bmp280.h"
>
> -static int bmp280_i2c_probe(struct i2c_client *client,
> - const struct i2c_device_id *id)
> +static int bmp280_i2c_probe(struct i2c_client *client)
> {
> struct regmap *regmap;
> const struct regmap_config *regmap_config;
> + const struct i2c_device_id *id = i2c_client_get_device_id(client);
>
> switch (id->driver_data) {
> case BMP180_CHIP_ID:
> @@ -65,7 +65,7 @@ static struct i2c_driver bmp280_i2c_driver = {
> .of_match_table = bmp280_of_i2c_match,
> .pm = pm_ptr(&bmp280_dev_pm_ops),
> },
> - .probe = bmp280_i2c_probe,
> + .probe_new = bmp280_i2c_probe,
> .id_table = bmp280_i2c_id,
> };
> module_i2c_driver(bmp280_i2c_driver);


2022-11-06 17:53:03

by Jonathan Cameron

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

On Sun, 6 Nov 2022 17:42:24 +0100
Angel Iglesias <[email protected]> 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]>
> Reviewed-by: Andy Shevchenko <[email protected]>

Trivial comment inline - otherwise lgtm
Reviewed-by: Jonathan Cameron <[email protected]>

Thanks,

>
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index b4edf10e8fd0..920676e62c22 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. The device must be bound to a driver or
> + * the function oopses.

Maybe don't state what happens otherwise if something changes to make it
instead do something else unfortunate, this comment will need updating.
"The device must be bound to a driver."


> + *
> + * 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 */
>
> /**


2022-11-06 18:27:32

by Angel Iglesias

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

On Sun, 2022-11-06 at 17:22 +0000, Jonathan Cameron wrote:
> On Sun,  6 Nov 2022 17:42:24 +0100
> Angel Iglesias <[email protected]> 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]>
> > Reviewed-by: Andy Shevchenko <[email protected]>
>
> Trivial comment inline - otherwise lgtm
> Reviewed-by: Jonathan Cameron <[email protected]>
>
> Thanks,
>
> >
> > diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> > index b4edf10e8fd0..920676e62c22 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. The device must be bound to a driver or
> > + *         the function oopses.
>
> Maybe don't state what happens otherwise if something changes to make it
> instead do something else unfortunate, this comment will need updating.
> "The device must be bound to a driver."

Sure, sorry for the trouble. I'll wait a bit for more comments and then send v3
fixed.

Thanks for your time,
Angel

>
> > + *
> > + * 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 */
> >  
> >  /**
>