diff mbox series

i2c: imx: fix divide by zero warning

Message ID 20241125141521.1612947-1-carlos.song@nxp.com (mailing list archive)
State In Next, archived
Headers show
Series i2c: imx: fix divide by zero warning | expand

Commit Message

Carlos Song Nov. 25, 2024, 2:15 p.m. UTC
From: Carlos Song <carlos.song@nxp.com>

Add "i2c_clk_rate / 2" check to avoid "divide by zero warning".
i2c_clk_rate may be zero if i2c clock is disabled.

Signed-off-by: Carlos Song <carlos.song@nxp.com>
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
---
 drivers/i2c/busses/i2c-imx.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

Comments

Frank Li Nov. 25, 2024, 5:18 p.m. UTC | #1
On Mon, Nov 25, 2024 at 10:15:21PM +0800, carlos.song@nxp.com wrote:
> From: Carlos Song <carlos.song@nxp.com>
>
> Add "i2c_clk_rate / 2" check to avoid "divide by zero warning".
> i2c_clk_rate may be zero if i2c clock is disabled.
>
> Signed-off-by: Carlos Song <carlos.song@nxp.com>
> Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
> Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
> ---

You sent this patch twice?

Reviewed-by: Frank Li <Frank.Li@nxp.com>

>  drivers/i2c/busses/i2c-imx.c | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
> index 2c782cdc26bd..5ed4cb61e262 100644
> --- a/drivers/i2c/busses/i2c-imx.c
> +++ b/drivers/i2c/busses/i2c-imx.c
> @@ -623,8 +623,8 @@ static int i2c_imx_acked(struct imx_i2c_struct *i2c_imx)
>  	return 0;
>  }
>
> -static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
> -			    unsigned int i2c_clk_rate)
> +static int i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
> +			   unsigned int i2c_clk_rate)
>  {
>  	struct imx_i2c_clk_pair *i2c_clk_div = i2c_imx->hwdata->clk_div;
>  	unsigned int div;
> @@ -639,7 +639,11 @@ static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
>
>  	/* Divider value calculation */
>  	if (i2c_imx->cur_clk == i2c_clk_rate)
> -		return;
> +		return 0;
> +
> +	/* Keep the denominator of the following program always NOT equal to 0. */
> +	if (!(i2c_clk_rate / 2))
> +		return -EINVAL;
>
>  	i2c_imx->cur_clk = i2c_clk_rate;
>
> @@ -670,6 +674,8 @@ static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
>  	dev_dbg(&i2c_imx->adapter.dev, "IFDR[IC]=0x%x, REAL DIV=%d\n",
>  		i2c_clk_div[i].val, i2c_clk_div[i].div);
>  #endif
> +
> +	return 0;
>  }
>
>  static int i2c_imx_clk_notifier_call(struct notifier_block *nb,
> @@ -679,11 +685,12 @@ static int i2c_imx_clk_notifier_call(struct notifier_block *nb,
>  	struct imx_i2c_struct *i2c_imx = container_of(nb,
>  						      struct imx_i2c_struct,
>  						      clk_change_nb);
> +	int ret = 0;
>
>  	if (action & POST_RATE_CHANGE)
> -		i2c_imx_set_clk(i2c_imx, ndata->new_rate);
> +		ret = i2c_imx_set_clk(i2c_imx, ndata->new_rate);
>
> -	return NOTIFY_OK;
> +	return notifier_from_errno(ret);
>  }
>
>  static int i2c_imx_start(struct imx_i2c_struct *i2c_imx, bool atomic)
> @@ -1782,7 +1789,11 @@ static int i2c_imx_probe(struct platform_device *pdev)
>  		i2c_imx->bitrate = pdata->bitrate;
>  	i2c_imx->clk_change_nb.notifier_call = i2c_imx_clk_notifier_call;
>  	clk_notifier_register(i2c_imx->clk, &i2c_imx->clk_change_nb);
> -	i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk));
> +	ret = i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk));
> +	if (ret < 0) {
> +		dev_err(&pdev->dev, "can't get I2C clock\n");
> +		goto clk_notifier_unregister;
> +	}
>
>  	i2c_imx_reset_regs(i2c_imx);
>
> --
> 2.34.1
>
Carlos Song Nov. 26, 2024, 2:04 a.m. UTC | #2
> -----Original Message-----
> From: Frank Li <frank.li@nxp.com>
> Sent: Tuesday, November 26, 2024 1:18 AM
> To: Carlos Song <carlos.song@nxp.com>
> Cc: o.rempel@pengutronix.de; kernel@pengutronix.de; andi.shyti@kernel.org;
> shawnguo@kernel.org; s.hauer@pengutronix.de; festevam@gmail.com;
> linux-i2c@vger.kernel.org; imx@lists.linux.dev;
> linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org
> Subject: Re: [PATCH] i2c: imx: fix divide by zero warning
> 
> On Mon, Nov 25, 2024 at 10:15:21PM +0800, carlos.song@nxp.com wrote:
> > From: Carlos Song <carlos.song@nxp.com>
> >
> > Add "i2c_clk_rate / 2" check to avoid "divide by zero warning".
> > i2c_clk_rate may be zero if i2c clock is disabled.
> >
> > Signed-off-by: Carlos Song <carlos.song@nxp.com>
> > Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
> > Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
> > ---
> 
> You sent this patch twice?
> 
Yes, because I meet a net error, I send the patch out and wait for a half of hour, but I don't see the mail in the mail list, so I send it again, but another one come in
after 1 hour.. You can dismiss the same one.

> Reviewed-by: Frank Li <Frank.Li@nxp.com>
> 
> >  drivers/i2c/busses/i2c-imx.c | 23 +++++++++++++++++------
> >  1 file changed, 17 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/i2c/busses/i2c-imx.c
> > b/drivers/i2c/busses/i2c-imx.c index 2c782cdc26bd..5ed4cb61e262 100644
> > --- a/drivers/i2c/busses/i2c-imx.c
> > +++ b/drivers/i2c/busses/i2c-imx.c
> > @@ -623,8 +623,8 @@ static int i2c_imx_acked(struct imx_i2c_struct
> *i2c_imx)
> >  	return 0;
> >  }
> >
> > -static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
> > -			    unsigned int i2c_clk_rate)
> > +static int i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
> > +			   unsigned int i2c_clk_rate)
> >  {
> >  	struct imx_i2c_clk_pair *i2c_clk_div = i2c_imx->hwdata->clk_div;
> >  	unsigned int div;
> > @@ -639,7 +639,11 @@ static void i2c_imx_set_clk(struct imx_i2c_struct
> > *i2c_imx,
> >
> >  	/* Divider value calculation */
> >  	if (i2c_imx->cur_clk == i2c_clk_rate)
> > -		return;
> > +		return 0;
> > +
> > +	/* Keep the denominator of the following program always NOT equal to 0.
> */
> > +	if (!(i2c_clk_rate / 2))
> > +		return -EINVAL;
> >
> >  	i2c_imx->cur_clk = i2c_clk_rate;
> >
> > @@ -670,6 +674,8 @@ static void i2c_imx_set_clk(struct imx_i2c_struct
> *i2c_imx,
> >  	dev_dbg(&i2c_imx->adapter.dev, "IFDR[IC]=0x%x, REAL DIV=%d\n",
> >  		i2c_clk_div[i].val, i2c_clk_div[i].div);  #endif
> > +
> > +	return 0;
> >  }
> >
> >  static int i2c_imx_clk_notifier_call(struct notifier_block *nb, @@
> > -679,11 +685,12 @@ static int i2c_imx_clk_notifier_call(struct notifier_block
> *nb,
> >  	struct imx_i2c_struct *i2c_imx = container_of(nb,
> >  						      struct imx_i2c_struct,
> >  						      clk_change_nb);
> > +	int ret = 0;
> >
> >  	if (action & POST_RATE_CHANGE)
> > -		i2c_imx_set_clk(i2c_imx, ndata->new_rate);
> > +		ret = i2c_imx_set_clk(i2c_imx, ndata->new_rate);
> >
> > -	return NOTIFY_OK;
> > +	return notifier_from_errno(ret);
> >  }
> >
> >  static int i2c_imx_start(struct imx_i2c_struct *i2c_imx, bool atomic)
> > @@ -1782,7 +1789,11 @@ static int i2c_imx_probe(struct platform_device
> *pdev)
> >  		i2c_imx->bitrate = pdata->bitrate;
> >  	i2c_imx->clk_change_nb.notifier_call = i2c_imx_clk_notifier_call;
> >  	clk_notifier_register(i2c_imx->clk, &i2c_imx->clk_change_nb);
> > -	i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk));
> > +	ret = i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk));
> > +	if (ret < 0) {
> > +		dev_err(&pdev->dev, "can't get I2C clock\n");
> > +		goto clk_notifier_unregister;
> > +	}
> >
> >  	i2c_imx_reset_regs(i2c_imx);
> >
> > --
> > 2.34.1
> >
Wolfram Sang Nov. 29, 2024, 1:54 a.m. UTC | #3
> > You sent this patch twice?
> > 
> Yes, because I meet a net error, I send the patch out and wait for a
> half of hour, but I don't see the mail in the mail list, so I send it
> again, but another one come in after 1 hour.. You can dismiss the same
> one.

You can also check 'http://patchwork.ozlabs.org/project/linux-i2c/list/'
to see if it made it to the list.
Carlos Song Nov. 29, 2024, 2:23 a.m. UTC | #4
> -----Original Message-----
> From: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Sent: Friday, November 29, 2024 9:55 AM
> To: Carlos Song <carlos.song@nxp.com>
> Cc: Frank Li <frank.li@nxp.com>; o.rempel@pengutronix.de;
> kernel@pengutronix.de; andi.shyti@kernel.org; shawnguo@kernel.org;
> s.hauer@pengutronix.de; festevam@gmail.com; linux-i2c@vger.kernel.org;
> imx@lists.linux.dev; linux-arm-kernel@lists.infradead.org;
> linux-kernel@vger.kernel.org
> Subject: [EXT] Re: [PATCH] i2c: imx: fix divide by zero warning
> 
> 
> > > You sent this patch twice?
> > >
> > Yes, because I meet a net error, I send the patch out and wait for a
> > half of hour, but I don't see the mail in the mail list, so I send it
> > again, but another one come in after 1 hour.. You can dismiss the same
> > one.
> 
> You can also check 'http://patchwork.ozlabs.org/project/linux-i2c/list/'
> to see if it made it to the list.

Thank you! I will check it when I meet issue next time:).
Andi Shyti Dec. 5, 2024, 12:49 p.m. UTC | #5
Hi Carlos,

On Mon, Nov 25, 2024 at 10:15:21PM +0800, carlos.song@nxp.com wrote:
> From: Carlos Song <carlos.song@nxp.com>
> 
> Add "i2c_clk_rate / 2" check to avoid "divide by zero warning".
> i2c_clk_rate may be zero if i2c clock is disabled.
> 
> Signed-off-by: Carlos Song <carlos.song@nxp.com>
> Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
> Signed-off-by: Haibo Chen <haibo.chen@nxp.com>

merged to i2c/i2c-host,

thanks,
Andi
diff mbox series

Patch

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 2c782cdc26bd..5ed4cb61e262 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -623,8 +623,8 @@  static int i2c_imx_acked(struct imx_i2c_struct *i2c_imx)
 	return 0;
 }
 
-static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
-			    unsigned int i2c_clk_rate)
+static int i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
+			   unsigned int i2c_clk_rate)
 {
 	struct imx_i2c_clk_pair *i2c_clk_div = i2c_imx->hwdata->clk_div;
 	unsigned int div;
@@ -639,7 +639,11 @@  static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
 
 	/* Divider value calculation */
 	if (i2c_imx->cur_clk == i2c_clk_rate)
-		return;
+		return 0;
+
+	/* Keep the denominator of the following program always NOT equal to 0. */
+	if (!(i2c_clk_rate / 2))
+		return -EINVAL;
 
 	i2c_imx->cur_clk = i2c_clk_rate;
 
@@ -670,6 +674,8 @@  static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
 	dev_dbg(&i2c_imx->adapter.dev, "IFDR[IC]=0x%x, REAL DIV=%d\n",
 		i2c_clk_div[i].val, i2c_clk_div[i].div);
 #endif
+
+	return 0;
 }
 
 static int i2c_imx_clk_notifier_call(struct notifier_block *nb,
@@ -679,11 +685,12 @@  static int i2c_imx_clk_notifier_call(struct notifier_block *nb,
 	struct imx_i2c_struct *i2c_imx = container_of(nb,
 						      struct imx_i2c_struct,
 						      clk_change_nb);
+	int ret = 0;
 
 	if (action & POST_RATE_CHANGE)
-		i2c_imx_set_clk(i2c_imx, ndata->new_rate);
+		ret = i2c_imx_set_clk(i2c_imx, ndata->new_rate);
 
-	return NOTIFY_OK;
+	return notifier_from_errno(ret);
 }
 
 static int i2c_imx_start(struct imx_i2c_struct *i2c_imx, bool atomic)
@@ -1782,7 +1789,11 @@  static int i2c_imx_probe(struct platform_device *pdev)
 		i2c_imx->bitrate = pdata->bitrate;
 	i2c_imx->clk_change_nb.notifier_call = i2c_imx_clk_notifier_call;
 	clk_notifier_register(i2c_imx->clk, &i2c_imx->clk_change_nb);
-	i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk));
+	ret = i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk));
+	if (ret < 0) {
+		dev_err(&pdev->dev, "can't get I2C clock\n");
+		goto clk_notifier_unregister;
+	}
 
 	i2c_imx_reset_regs(i2c_imx);