svn commit: r308233 - head/sys/arm/allwinner/clk

Jared McNeill jmcneill at FreeBSD.org
Wed Nov 2 23:46:25 UTC 2016


Author: jmcneill
Date: Wed Nov  2 23:46:23 2016
New Revision: 308233
URL: https://svnweb.freebsd.org/changeset/base/308233

Log:
  The DTS may report fewer than 4 parents for a module clock. Avoid setting
  the module clock parent to an out-of-range index in these cases.

Modified:
  head/sys/arm/allwinner/clk/aw_modclk.c

Modified: head/sys/arm/allwinner/clk/aw_modclk.c
==============================================================================
--- head/sys/arm/allwinner/clk/aw_modclk.c	Wed Nov  2 23:44:30 2016	(r308232)
+++ head/sys/arm/allwinner/clk/aw_modclk.c	Wed Nov  2 23:46:23 2016	(r308233)
@@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$");
 #define	SCLK_GATING		(1 << 31)
 #define	CLK_SRC_SEL		(0x3 << 24)
 #define	CLK_SRC_SEL_SHIFT	24
-#define	CLK_SRC_SEL_MAX		0x3
 #define	CLK_RATIO_N		(0x3 << 16)
 #define	CLK_RATIO_N_SHIFT	16
 #define	CLK_RATIO_N_MAX		0x3
@@ -69,6 +68,7 @@ static struct ofw_compat_data compat_dat
 struct aw_modclk_sc {
 	device_t	clkdev;
 	bus_addr_t	reg;
+	u_int		parent_cnt;
 };
 
 #define	MODCLK_READ(sc, val)	CLKDEV_READ_4((sc)->clkdev, (sc)->reg, (val))
@@ -102,7 +102,7 @@ aw_modclk_set_mux(struct clknode *clk, i
 
 	sc = clknode_get_softc(clk);
 
-	if (index < 0 || index > CLK_SRC_SEL_MAX)
+	if (index < 0 || index >= sc->parent_cnt)
 		return (ERANGE);
 
 	DEVICE_LOCK(sc);
@@ -170,7 +170,7 @@ aw_modclk_set_freq(struct clknode *clk, 
 	best_diff = (int64_t)*fout; 
 	best_src = 0;
 
-	for (src = 0; src < CLK_SRC_SEL_MAX; src++) {
+	for (src = 0; src < sc->parent_cnt; src++) {
 		error = clknode_set_parent_by_idx(clk, src);
 		if (error != 0)
 			continue;
@@ -299,6 +299,7 @@ aw_modclk_attach(device_t dev)
 	sc = clknode_get_softc(clk);
 	sc->reg = paddr;
 	sc->clkdev = device_get_parent(dev);
+	sc->parent_cnt = def.parent_cnt;
 
 	clknode_register(clkdom, clk);
 


More information about the svn-src-head mailing list