aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/at91
diff options
context:
space:
mode:
authorBoris BREZILLON <boris.brezillon@free-electrons.com>2014-09-02 03:50:18 -0400
committerMike Turquette <mturquette@linaro.org>2014-09-02 18:37:26 -0400
commit16eeaec77922c1349e130a9541e83a023deaf11f (patch)
treeffbcb2e73a8582170af39d32893236756f5cba39 /drivers/clk/at91
parent13a6073d4c5db3103011eebe8c68b049323ced20 (diff)
clk: at91: fix div by zero in USB clock driver
Test rate value before calculating the div value to avoid div by zero. Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com> Reported-by: Gaël PORTAY <gael.portay@gmail.com> Tested-by: Gaël PORTAY <gael.portay@gmail.com> Signed-off-by: Mike Turquette <mturquette@linaro.org>
Diffstat (limited to 'drivers/clk/at91')
-rw-r--r--drivers/clk/at91/clk-usb.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/clk/at91/clk-usb.c b/drivers/clk/at91/clk-usb.c
index 183877712c6c..24b5b020753a 100644
--- a/drivers/clk/at91/clk-usb.c
+++ b/drivers/clk/at91/clk-usb.c
@@ -279,10 +279,13 @@ static int at91rm9200_clk_usb_set_rate(struct clk_hw *hw, unsigned long rate,
279 int i; 279 int i;
280 struct at91rm9200_clk_usb *usb = to_at91rm9200_clk_usb(hw); 280 struct at91rm9200_clk_usb *usb = to_at91rm9200_clk_usb(hw);
281 struct at91_pmc *pmc = usb->pmc; 281 struct at91_pmc *pmc = usb->pmc;
282 unsigned long div = parent_rate / rate; 282 unsigned long div;
283 283
284 if (parent_rate % rate) 284 if (!rate || parent_rate % rate)
285 return -EINVAL; 285 return -EINVAL;
286
287 div = parent_rate / rate;
288
286 for (i = 0; i < RM9200_USB_DIV_TAB_SIZE; i++) { 289 for (i = 0; i < RM9200_USB_DIV_TAB_SIZE; i++) {
287 if (usb->divisors[i] == div) { 290 if (usb->divisors[i] == div) {
288 tmp = pmc_read(pmc, AT91_CKGR_PLLBR) & 291 tmp = pmc_read(pmc, AT91_CKGR_PLLBR) &