Module Name:    src
Committed By:   jmcneill
Date:           Wed Oct 26 22:14:22 UTC 2022

Modified Files:
        src/sys/arch/arm/xilinx: zynq7000_clkc.c

Log Message:
Since this node is a child of a syscon, the reg property doesn't fully
describe the device physical address. Use syscon accessors to read/write
clock registers instead.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/xilinx/zynq7000_clkc.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/xilinx/zynq7000_clkc.c
diff -u src/sys/arch/arm/xilinx/zynq7000_clkc.c:1.2 src/sys/arch/arm/xilinx/zynq7000_clkc.c:1.3
--- src/sys/arch/arm/xilinx/zynq7000_clkc.c:1.2	Wed Oct 26 10:55:23 2022
+++ src/sys/arch/arm/xilinx/zynq7000_clkc.c	Wed Oct 26 22:14:22 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: zynq7000_clkc.c,v 1.2 2022/10/26 10:55:23 jmcneill Exp $ */
+/* $NetBSD: zynq7000_clkc.c,v 1.3 2022/10/26 22:14:22 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: zynq7000_clkc.c,v 1.2 2022/10/26 10:55:23 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zynq7000_clkc.c,v 1.3 2022/10/26 22:14:22 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -41,29 +41,30 @@ __KERNEL_RCSID(0, "$NetBSD: zynq7000_clk
 #include <dev/clk/clk_backend.h>
 
 #include <dev/fdt/fdtvar.h>
+#include <dev/fdt/syscon.h>
 
-#define	ARM_PLL_CTRL	0x000
-#define	DDR_PLL_CTRL	0x004
-#define	IO_PLL_CTRL	0x008
+#define	ARM_PLL_CTRL	0x100
+#define	DDR_PLL_CTRL	0x104
+#define	IO_PLL_CTRL	0x108
 #define	 PLL_FDIV		__BITS(18,12)
-#define	ARM_CLK_CTRL	0x020
-#define	 ARM_CLK_CTRL_DIVISOR		__BITS(13,8)
+#define	ARM_CLK_CTRL	0x120
 #define	 ARM_CLK_CTRL_CPU_1XCLKACT	__BIT(27)
 #define	 ARM_CLK_CTRL_CPU_2XCLKACT	__BIT(26)
 #define	 ARM_CLK_CTRL_CPU_3OR2XCLKACT	__BIT(25)
 #define	 ARM_CLK_CTRL_CPU_6OR4XCLKACT	__BIT(24)
-#define	APER_CLK_CTRL	0x02c
+#define	 ARM_CLK_CTRL_DIVISOR		__BITS(13,8)
+#define	APER_CLK_CTRL	0x12c
 #define	 UART1_CPU_1XCLKACT	__BIT(21)
 #define	 UART0_CPU_1XCLKACT	__BIT(20)
 #define	 SDI1_CPU_1XCLKACT	__BIT(11)
 #define	 SDI0_CPU_1XCLKACT	__BIT(10)
-#define	SDIO_CLK_CTRL	0x050
-#define	UART_CLK_CTRL	0x054
+#define	SDIO_CLK_CTRL	0x150
+#define	UART_CLK_CTRL	0x154
 #define	 CLK_CTRL_DIVISOR	__BITS(13,8)
 #define	 CLK_CTRL_SRCSEL	__BITS(5,4)
 #define	 CLK_CTRL_CLKACT1	__BIT(1)
 #define	 CLK_CTRL_CLKACT0	__BIT(0)
-#define	CLK_621_TRUE	0x0C4
+#define	CLK_621_TRUE	0x1C4
 #define	 CLK_621_TRUE_EN	__BIT(0)
 
 enum xynq7000_clkid {
@@ -135,9 +136,7 @@ struct zynq7000_clkc_softc {
 	struct clk		sc_clk[num_clkid];
 
 	u_int			sc_ps_clk_frequency;
-
-	bus_space_tag_t		sc_bst;
-	bus_space_handle_t	sc_bsh;
+	struct syscon		*sc_syscon;
 };
 
 CFATTACH_DECL_NEW(zynq7000_clkc, sizeof(struct zynq7000_clkc_softc),
@@ -169,7 +168,9 @@ zynq7000_clkc_get_rate_pll(struct zynq70
 {
 	uint32_t val;
 
-	val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, reg);
+	syscon_lock(sc->sc_syscon);
+	val = syscon_read_4(sc->sc_syscon, reg);
+	syscon_unlock(sc->sc_syscon);
 
 	return sc->sc_ps_clk_frequency * __SHIFTOUT(val, PLL_FDIV);
 }
@@ -181,7 +182,10 @@ zynq7000_clkc_get_rate_iop(struct zynq70
 	uint32_t val;
 	u_int prate, sel;
 
-	val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, reg);
+	syscon_lock(sc->sc_syscon);
+	val = syscon_read_4(sc->sc_syscon, reg);
+	syscon_unlock(sc->sc_syscon);
+
 	sel = __SHIFTOUT(val, CLK_CTRL_SRCSEL);
 	if (sel == 2) {
 		prate = zynq7000_clkc_clk_get_rate(sc,
@@ -211,15 +215,17 @@ zynq7000_clkc_clk_get_rate(void *priv, s
 	} else if (clk == &sc->sc_clk[clkid_cpu_6or4x]) {
 		prate = zynq7000_clkc_clk_get_rate(sc,
 		    &sc->sc_clk[clkid_cpu_1x]);
-		val = bus_space_read_4(sc->sc_bst, sc->sc_bsh,
-		    CLK_621_TRUE);
+		syscon_lock(sc->sc_syscon);
+		val = syscon_read_4(sc->sc_syscon, CLK_621_TRUE);
+		syscon_unlock(sc->sc_syscon);
 		return (val & CLK_621_TRUE_EN) != 0 ?
 		    prate * 6 : prate * 4;
 	} else if (clk == &sc->sc_clk[clkid_cpu_3or2x]) {
 		prate = zynq7000_clkc_clk_get_rate(sc,
 		    &sc->sc_clk[clkid_cpu_1x]);
-		val = bus_space_read_4(sc->sc_bst, sc->sc_bsh,
-		    CLK_621_TRUE);
+		syscon_lock(sc->sc_syscon);
+		val = syscon_read_4(sc->sc_syscon, CLK_621_TRUE);
+		syscon_unlock(sc->sc_syscon);
 		return (val & CLK_621_TRUE_EN) != 0 ?
 		    prate * 3 : prate * 2;
 	} else if (clk == &sc->sc_clk[clkid_cpu_2x]) {
@@ -229,9 +235,10 @@ zynq7000_clkc_clk_get_rate(void *priv, s
 	} else if (clk == &sc->sc_clk[clkid_cpu_1x]) {
 		prate = zynq7000_clkc_clk_get_rate(sc,
 		    &sc->sc_clk[clkid_armpll]);
-		val = bus_space_read_4(sc->sc_bst, sc->sc_bsh,
-		    ARM_CLK_CTRL);
-		return prate / __SHIFTOUT(val, ARM_CLK_CTRL_DIVISOR);
+		syscon_lock(sc->sc_syscon);
+		val = syscon_read_4(sc->sc_syscon, ARM_CLK_CTRL);
+		syscon_unlock(sc->sc_syscon);
+		return prate / __SHIFTOUT(val, ARM_CLK_CTRL_DIVISOR) / 6;
 	} else if (clk == &sc->sc_clk[clkid_sdio0] ||
 		   clk == &sc->sc_clk[clkid_sdio1]) {
 		return zynq7000_clkc_get_rate_iop(sc, SDIO_CLK_CTRL);
@@ -295,8 +302,10 @@ zynq7000_clkc_clk_enable(void *priv, str
 		return ENXIO;
 	}
 
-	val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, reg);
-	bus_space_write_4(sc->sc_bst, sc->sc_bsh, reg, val | mask);
+	syscon_lock(sc->sc_syscon);
+	val = syscon_read_4(sc->sc_syscon, reg);
+	syscon_write_4(sc->sc_syscon, reg, val | mask);
+	syscon_unlock(sc->sc_syscon);
 
 	return 0;
 }
@@ -363,9 +372,9 @@ zynq7000_clkc_attach(device_t parent, de
 	}
 
 	sc->sc_dev = self;
-	sc->sc_bst = faa->faa_bst;
-	if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
-		aprint_error(": couldn't map registers\n");
+	sc->sc_syscon = fdtbus_syscon_lookup(OF_parent(phandle));
+	if (sc->sc_syscon == NULL) {
+		aprint_error(": couldn't get syscon registers\n");
 		return;
 	}
 
@@ -393,5 +402,11 @@ zynq7000_clkc_attach(device_t parent, de
 	aprint_normal(": Zynq-7000 PS clock subsystem (PS_CLK %u Hz)\n",
 	    sc->sc_ps_clk_frequency);
 
+	for (clkid = 0; clkid < num_clkid; clkid++) {
+		aprint_debug_dev(self, "clkid %u [%s]: %u Hz\n", clkid,
+		    sc->sc_clk[clkid].name ? sc->sc_clk[clkid].name : "<none>",
+		    clk_get_rate(&sc->sc_clk[clkid]));
+	}
+
 	fdtbus_register_clock_controller(self, phandle, &zynq7000_clkc_fdt_funcs);
 }

Reply via email to