diff mbox

[v2] i2c: efm32: Prevent potential division by zero

Message ID 1460627375.17638.1.camel@ingics.com
State Not Applicable
Headers show

Commit Message

Axel Lin April 14, 2016, 9:49 a.m. UTC
Make sure we don't OOPS in case clock-frequency is set to 0 in a DT. The
variable set here is later used as a divisor.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
---
Hi Uwe,
If my understand is correct, you prefer to make it return error rather
than using default frequency setting if DT setting is wrong.

v2: Make probe return error instead of using default frequency.

 drivers/i2c/busses/i2c-efm32.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Uwe Kleine-König April 14, 2016, 11:40 a.m. UTC | #1
Hello Axel,

On Thu, Apr 14, 2016 at 05:49:35PM +0800, Axel Lin wrote:
> Make sure we don't OOPS in case clock-frequency is set to 0 in a DT. The
> variable set here is later used as a divisor.
> 
> Signed-off-by: Axel Lin <axel.lin@ingics.com>
> ---
> If my understand is correct, you prefer to make it return error rather
> than using default frequency setting if DT setting is wrong.

No, I'd say it doesn't matter that the driver crashes if something
invalid is specified in the device tree. This is not a driver bug, but a
dt bug. So if it happens, fix the device tree, no need to modify the
driver.

Best regards
Uwe
Axel Lin April 14, 2016, 2:17 p.m. UTC | #2
2016-04-14 19:40 GMT+08:00 Uwe Kleine-König <u.kleine-koenig@pengutronix.de>:
> Hello Axel,
>
> On Thu, Apr 14, 2016 at 05:49:35PM +0800, Axel Lin wrote:
>> Make sure we don't OOPS in case clock-frequency is set to 0 in a DT. The
>> variable set here is later used as a divisor.
>>
>> Signed-off-by: Axel Lin <axel.lin@ingics.com>
>> ---
>> If my understand is correct, you prefer to make it return error rather
>> than using default frequency setting if DT setting is wrong.
>
> No, I'd say it doesn't matter that the driver crashes if something
> invalid is specified in the device tree. This is not a driver bug, but a
> dt bug. So if it happens, fix the device tree, no need to modify the
> driver.

I know that such case is a DT bug.
But the intention of this patch is to avoid oops rather than fix dt.
Make probe return error is enough to inform developer fixing dt.
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Uwe Kleine-König April 14, 2016, 6:52 p.m. UTC | #3
Hello Axel,

On Thu, Apr 14, 2016 at 10:17:45PM +0800, Axel Lin wrote:
> 2016-04-14 19:40 GMT+08:00 Uwe Kleine-König <u.kleine-koenig@pengutronix.de>:
> > On Thu, Apr 14, 2016 at 05:49:35PM +0800, Axel Lin wrote:
> >> Make sure we don't OOPS in case clock-frequency is set to 0 in a DT. The
> >> variable set here is later used as a divisor.
> >>
> >> Signed-off-by: Axel Lin <axel.lin@ingics.com>
> >> ---
> >> If my understand is correct, you prefer to make it return error rather
> >> than using default frequency setting if DT setting is wrong.
> >
> > No, I'd say it doesn't matter that the driver crashes if something
> > invalid is specified in the device tree. This is not a driver bug, but a
> > dt bug. So if it happens, fix the device tree, no need to modify the
> > driver.
> 
> I know that such case is a DT bug.
> But the intention of this patch is to avoid oops rather than fix dt.
> Make probe return error is enough to inform developer fixing dt.

an oops is also enough, and maybe even better because $developer cannot
miss it.

I don't care much, because the error probably won't happen. If you ask
me, I like your v2 better.

Best regards
Uwe
diff mbox

Patch

diff --git a/drivers/i2c/busses/i2c-efm32.c b/drivers/i2c/busses/i2c-efm32.c
index 8eff627..7c0636e 100644
--- a/drivers/i2c/busses/i2c-efm32.c
+++ b/drivers/i2c/busses/i2c-efm32.c
@@ -395,6 +395,13 @@  static int efm32_i2c_probe(struct platform_device *pdev)
 		frequency = 100000;
 		dev_info(&pdev->dev, "defaulting to 100 kHz\n");
 	}
+
+	if (frequency == 0) {
+		dev_err(&pdev->dev, "Invalid clock-frequency\n");
+		ret = -EINVAL;
+		goto err_disable_clk;
+	}
+
 	ddata->frequency = frequency;
 
 	rate = clk_get_rate(ddata->clk);