i2c: mpc: Use of_property_read_reg() to parse "reg"

Message ID 20230609183044.1764951-1-robh@kernel.org
State New
Headers
Series i2c: mpc: Use of_property_read_reg() to parse "reg" |

Commit Message

Rob Herring June 9, 2023, 6:30 p.m. UTC
  Use the recently added of_property_read_reg() helper to get the
untranslated "reg" address value.

Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/i2c/busses/i2c-mpc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
  

Comments

Andi Shyti June 10, 2023, 9:36 a.m. UTC | #1
Hi Rob,

On Fri, Jun 09, 2023 at 12:30:44PM -0600, Rob Herring wrote:
> Use the recently added of_property_read_reg() helper to get the
> untranslated "reg" address value.
> 
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
>  drivers/i2c/busses/i2c-mpc.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> index cfd074ee6d54..595dce9218ad 100644
> --- a/drivers/i2c/busses/i2c-mpc.c
> +++ b/drivers/i2c/busses/i2c-mpc.c
> @@ -316,9 +316,10 @@ static void mpc_i2c_setup_512x(struct device_node *node,
>  	if (node_ctrl) {
>  		ctrl = of_iomap(node_ctrl, 0);
>  		if (ctrl) {
> +			u64 addr;
>  			/* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
> -			pval = of_get_property(node, "reg", NULL);
> -			idx = (*pval & 0xff) / 0x20;
> +			of_property_read_reg(node, 0, &addr, NULL);

because of_property_read_reg() can return error, can we check
also the error value here?

Thanks,
Andi

> +			idx = (addr & 0xff) / 0x20;
>  			setbits32(ctrl, 1 << (24 + idx * 2));
>  			iounmap(ctrl);
>  		}
> -- 
> 2.39.2
>
  
Rob Herring June 12, 2023, 7:27 p.m. UTC | #2
On Sat, Jun 10, 2023 at 3:36 AM Andi Shyti <andi.shyti@kernel.org> wrote:
>
> Hi Rob,
>
> On Fri, Jun 09, 2023 at 12:30:44PM -0600, Rob Herring wrote:
> > Use the recently added of_property_read_reg() helper to get the
> > untranslated "reg" address value.
> >
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> >  drivers/i2c/busses/i2c-mpc.c | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> > index cfd074ee6d54..595dce9218ad 100644
> > --- a/drivers/i2c/busses/i2c-mpc.c
> > +++ b/drivers/i2c/busses/i2c-mpc.c
> > @@ -316,9 +316,10 @@ static void mpc_i2c_setup_512x(struct device_node *node,
> >       if (node_ctrl) {
> >               ctrl = of_iomap(node_ctrl, 0);
> >               if (ctrl) {
> > +                     u64 addr;
> >                       /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
> > -                     pval = of_get_property(node, "reg", NULL);
> > -                     idx = (*pval & 0xff) / 0x20;
> > +                     of_property_read_reg(node, 0, &addr, NULL);
>
> because of_property_read_reg() can return error, can we check
> also the error value here?

Why? The old code wasn't worried about of_get_property() returning
NULL on the same possible errors. If anyone is still actually using
mpc512x, I don't think their DTB will have an error at this point.
IOW, is improving the error handling on this really worth it?

Rob
  
Andi Shyti June 12, 2023, 9:08 p.m. UTC | #3
Hi Rob,

On Mon, Jun 12, 2023 at 01:27:03PM -0600, Rob Herring wrote:
> On Sat, Jun 10, 2023 at 3:36 AM Andi Shyti <andi.shyti@kernel.org> wrote:
> >
> > Hi Rob,
> >
> > On Fri, Jun 09, 2023 at 12:30:44PM -0600, Rob Herring wrote:
> > > Use the recently added of_property_read_reg() helper to get the
> > > untranslated "reg" address value.
> > >
> > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > ---
> > >  drivers/i2c/busses/i2c-mpc.c | 5 +++--
> > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> > > index cfd074ee6d54..595dce9218ad 100644
> > > --- a/drivers/i2c/busses/i2c-mpc.c
> > > +++ b/drivers/i2c/busses/i2c-mpc.c
> > > @@ -316,9 +316,10 @@ static void mpc_i2c_setup_512x(struct device_node *node,
> > >       if (node_ctrl) {
> > >               ctrl = of_iomap(node_ctrl, 0);
> > >               if (ctrl) {
> > > +                     u64 addr;
> > >                       /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
> > > -                     pval = of_get_property(node, "reg", NULL);
> > > -                     idx = (*pval & 0xff) / 0x20;
> > > +                     of_property_read_reg(node, 0, &addr, NULL);
> >
> > because of_property_read_reg() can return error, can we check
> > also the error value here?
> 
> Why?

Because if a function can return an error, the error must be
checked. Even if the property is "reg" and the binding says that
it's required. Otherwise let's make those functions void.

> The old code wasn't worried about of_get_property() returning
> NULL on the same possible errors.

Sure! Checking the error comes for free. The patch is fine as it
is, mine was a little improvement I asked for. I can still ack
it and add the error handling later myself :)

> If anyone is still actually using
> mpc512x, I don't think their DTB will have an error at this point.
> IOW, is improving the error handling on this really worth it?

In my view, every error needs to be checked as every error is
unlikely to happen: it makes the code future proof and makes sure
other components failure don't impact the normal functioning of
this driver.

Anyway, the patch is doing what you described and for the sole
economy of this change:

Acked-by: Andi Shyti <andi.shyti@kernel.org> 

Thank you,
Andi
  
Rob Herring June 12, 2023, 9:26 p.m. UTC | #4
On Mon, Jun 12, 2023 at 3:08 PM Andi Shyti <andi.shyti@kernel.org> wrote:
>
> Hi Rob,
>
> On Mon, Jun 12, 2023 at 01:27:03PM -0600, Rob Herring wrote:
> > On Sat, Jun 10, 2023 at 3:36 AM Andi Shyti <andi.shyti@kernel.org> wrote:
> > >
> > > Hi Rob,
> > >
> > > On Fri, Jun 09, 2023 at 12:30:44PM -0600, Rob Herring wrote:
> > > > Use the recently added of_property_read_reg() helper to get the
> > > > untranslated "reg" address value.
> > > >
> > > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > > ---
> > > >  drivers/i2c/busses/i2c-mpc.c | 5 +++--
> > > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> > > > index cfd074ee6d54..595dce9218ad 100644
> > > > --- a/drivers/i2c/busses/i2c-mpc.c
> > > > +++ b/drivers/i2c/busses/i2c-mpc.c
> > > > @@ -316,9 +316,10 @@ static void mpc_i2c_setup_512x(struct device_node *node,
> > > >       if (node_ctrl) {
> > > >               ctrl = of_iomap(node_ctrl, 0);
> > > >               if (ctrl) {
> > > > +                     u64 addr;
> > > >                       /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
> > > > -                     pval = of_get_property(node, "reg", NULL);
> > > > -                     idx = (*pval & 0xff) / 0x20;
> > > > +                     of_property_read_reg(node, 0, &addr, NULL);
> > >
> > > because of_property_read_reg() can return error, can we check
> > > also the error value here?
> >
> > Why?
>
> Because if a function can return an error, the error must be
> checked. Even if the property is "reg" and the binding says that
> it's required. Otherwise let's make those functions void.

Then every function should have a must_check annotation, but they
don't as the function is designed to work with optional properties
where we want to ignore errors.

> > The old code wasn't worried about of_get_property() returning
> > NULL on the same possible errors.
>
> Sure! Checking the error comes for free. The patch is fine as it
> is, mine was a little improvement I asked for. I can still ack
> it and add the error handling later myself :)
>
> > If anyone is still actually using
> > mpc512x, I don't think their DTB will have an error at this point.
> > IOW, is improving the error handling on this really worth it?
>
> In my view, every error needs to be checked as every error is
> unlikely to happen: it makes the code future proof and makes sure
> other components failure don't impact the normal functioning of
> this driver.

An error in this case is a bad DT. It's not the kernel's job to ensure
DT is correct. If it is, then it is doing a terrible job. The reason
we have dtschema is to ensure correctness.

Rob
  
Wolfram Sang June 14, 2023, 8:36 a.m. UTC | #5
On Fri, Jun 09, 2023 at 12:30:44PM -0600, Rob Herring wrote:
> Use the recently added of_property_read_reg() helper to get the
> untranslated "reg" address value.
> 
> Signed-off-by: Rob Herring <robh@kernel.org>

Applied to for-next, thanks!
  
Guenter Roeck June 21, 2023, 4:44 p.m. UTC | #6
On Fri, Jun 09, 2023 at 12:30:44PM -0600, Rob Herring wrote:
> Use the recently added of_property_read_reg() helper to get the
> untranslated "reg" address value.
> 
> Signed-off-by: Rob Herring <robh@kernel.org>

This patch results in:

Building powerpc:ppc32_allmodconfig ... failed
--------------
Error log:
drivers/i2c/busses/i2c-mpc.c: In function 'mpc_i2c_setup_512x':
drivers/i2c/busses/i2c-mpc.c:310:20: error: unused variable 'pval' [-Werror=unused-variable]
  310 |         const u32 *pval;

because pval is no longer used.

Guenter

> ---
>  drivers/i2c/busses/i2c-mpc.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> index cfd074ee6d54..595dce9218ad 100644
> --- a/drivers/i2c/busses/i2c-mpc.c
> +++ b/drivers/i2c/busses/i2c-mpc.c
> @@ -316,9 +316,10 @@ static void mpc_i2c_setup_512x(struct device_node *node,
>  	if (node_ctrl) {
>  		ctrl = of_iomap(node_ctrl, 0);
>  		if (ctrl) {
> +			u64 addr;
>  			/* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
> -			pval = of_get_property(node, "reg", NULL);
> -			idx = (*pval & 0xff) / 0x20;
> +			of_property_read_reg(node, 0, &addr, NULL);
> +			idx = (addr & 0xff) / 0x20;
>  			setbits32(ctrl, 1 << (24 + idx * 2));
>  			iounmap(ctrl);
>  		}
> -- 
> 2.39.2
>
  

Patch

diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index cfd074ee6d54..595dce9218ad 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -316,9 +316,10 @@  static void mpc_i2c_setup_512x(struct device_node *node,
 	if (node_ctrl) {
 		ctrl = of_iomap(node_ctrl, 0);
 		if (ctrl) {
+			u64 addr;
 			/* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
-			pval = of_get_property(node, "reg", NULL);
-			idx = (*pval & 0xff) / 0x20;
+			of_property_read_reg(node, 0, &addr, NULL);
+			idx = (addr & 0xff) / 0x20;
 			setbits32(ctrl, 1 << (24 + idx * 2));
 			iounmap(ctrl);
 		}