Module Name:    src
Committed By:   hkenken
Date:           Tue Jul 30 11:11:15 UTC 2019

Modified Files:
        src/sys/arch/arm/imx: imx6_ccm.c

Log Message:
Fix overflow to calculate frequencies.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/imx/imx6_ccm.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/imx/imx6_ccm.c
diff -u src/sys/arch/arm/imx/imx6_ccm.c:1.12 src/sys/arch/arm/imx/imx6_ccm.c:1.13
--- src/sys/arch/arm/imx/imx6_ccm.c:1.12	Fri Jul 26 06:57:54 2019
+++ src/sys/arch/arm/imx/imx6_ccm.c	Tue Jul 30 11:11:15 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: imx6_ccm.c,v 1.12 2019/07/26 06:57:54 skrll Exp $	*/
+/*	$NetBSD: imx6_ccm.c,v 1.13 2019/07/30 11:11:15 hkenken Exp $	*/
 
 /*
  * Copyright (c) 2010-2012, 2014  Genetec Corporation.  All rights reserved.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.12 2019/07/26 06:57:54 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.13 2019/07/30 11:11:15 hkenken Exp $");
 
 #include "opt_cputypes.h"
 
@@ -1031,6 +1031,7 @@ imxccm_clk_get_rate_pll_generic(struct i
     const u_int rate_parent)
 {
 	struct imx6_clk_pll *pll = &iclk->clk.pll;
+	uint64_t freq = rate_parent;
 
 	KASSERT((pll->type == IMX6_CLK_PLL_GENNERIC) ||
 	    (pll->type == IMX6_CLK_PLL_USB));
@@ -1038,7 +1039,7 @@ imxccm_clk_get_rate_pll_generic(struct i
 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
 	uint32_t div = __SHIFTOUT(v, pll->mask);
 
-	return rate_parent * ((div == 1) ? 22 : 20);
+	return freq * ((div == 1) ? 22 : 20);
 }
 
 static u_int
@@ -1046,13 +1047,14 @@ imxccm_clk_get_rate_pll_sys(struct imxcc
     const u_int rate_parent)
 {
 	struct imx6_clk_pll *pll = &iclk->clk.pll;
+	uint64_t freq = rate_parent;
 
 	KASSERT(pll->type == IMX6_CLK_PLL_SYS);
 
 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
 	uint32_t div = __SHIFTOUT(v, pll->mask);
 
-	return rate_parent * div / 2;
+	return freq * div / 2;
 }
 
 #define PLL_AUDIO_VIDEO_NUM_OFFSET	0x10
@@ -1063,7 +1065,7 @@ imxccm_clk_get_rate_pll_audio_video(stru
     struct imx6_clk *iclk, const u_int rate_parent)
 {
 	struct imx6_clk_pll *pll = &iclk->clk.pll;
-	uint64_t freq;
+	uint64_t freq = rate_parent;
 
 	KASSERT(pll->type == IMX6_CLK_PLL_AUDIO_VIDEO);
 
@@ -1074,10 +1076,9 @@ imxccm_clk_get_rate_pll_audio_video(stru
 	uint32_t denom = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog,
 	    pll->reg + PLL_AUDIO_VIDEO_DENOM_OFFSET);
 
-	uint64_t tmp = rate_parent * num / denom;
-	freq = (uint64_t)rate_parent * div + tmp;
+	uint64_t tmp = freq * num / denom;
 
-	return freq;
+	return freq * div + tmp;
 }
 
 static u_int
@@ -1102,7 +1103,7 @@ imxccm_clk_get_rate_fixed_factor(struct 
 	parent = imx6_clk_find(iclk->parent);
 	KASSERT(parent != NULL);
 
-	const u_int rate_parent = imxccm_clk_get_rate(sc, &parent->base);
+	uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
 
 	return rate_parent * fixed_factor->mult / fixed_factor->div;
 }
@@ -1118,7 +1119,7 @@ imxccm_clk_get_rate_pll(struct imxccm_so
 	parent = imx6_clk_find(iclk->parent);
 	KASSERT(parent != NULL);
 
-	const u_int rate_parent = imxccm_clk_get_rate(sc, &parent->base);
+	uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
 
 	switch(pll->type) {
 	case IMX6_CLK_PLL_GENNERIC:
@@ -1182,7 +1183,7 @@ imxccm_clk_get_rate_pfd(struct imxccm_so
 	parent = imx6_clk_find(iclk->parent);
 	KASSERT(parent != NULL);
 
-	const u_int rate_parent = imxccm_clk_get_rate(sc, &parent->base);
+	uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
 
 	uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pfd->reg);
 	uint32_t n = __SHIFTOUT(v, __BITS(5, 0) << (pfd->index * 8));

Reply via email to