Module Name: src Committed By: jmcneill Date: Sat Dec 27 16:18:50 UTC 2014
Modified Files: src/sys/arch/arm/rockchip: files.rockchip obio.c rockchip_board.c rockchip_crureg.h rockchip_var.h Log Message: More clock fixes, debugging. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/files.rockchip \ src/sys/arch/arm/rockchip/obio.c \ src/sys/arch/arm/rockchip/rockchip_crureg.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_board.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_var.h 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/rockchip/files.rockchip diff -u src/sys/arch/arm/rockchip/files.rockchip:1.2 src/sys/arch/arm/rockchip/files.rockchip:1.3 --- src/sys/arch/arm/rockchip/files.rockchip:1.2 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/files.rockchip Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -# $NetBSD: files.rockchip,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ +# $NetBSD: files.rockchip,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ # # Configuration info for Rockchip ARM Peripherals # @@ -41,3 +41,6 @@ defparam opt_rockchip.h CONMODE # Memory parameters defparam opt_rockchip.h MEMSIZE + +# Debugging parameters +defflag opt_rockchip.h ROCKCHIP_CLOCK_DEBUG Index: src/sys/arch/arm/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.2 src/sys/arch/arm/rockchip/obio.c:1.3 --- src/sys/arch/arm/rockchip/obio.c:1.2 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/obio.c Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -35,8 +35,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "opt_rockchip.h" + #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.3 2014/12/27 16:18:50 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -66,6 +68,10 @@ void obio_iomux(int, int); void obio_init_gpio(void); void obio_swporta(int, int, int); +#ifdef ROCKCHIP_CLOCK_DEBUG +static void obio_dump_clocks(void); +#endif + /* there can be only one */ bool obio_found; @@ -86,6 +92,10 @@ obio_attach(device_t parent, device_t se aprint_naive("\n"); aprint_normal(": On-board I/O\n"); +#ifdef ROCKCHIP_CLOCK_DEBUG + obio_dump_clocks(); +#endif + obio_init_grf(); obio_init_gpio(); @@ -208,3 +218,16 @@ void obio_swporta(int gpio_base, int off printf("gpio: 0x%08x 0x%08x -> 0x%08x\n", gpio_base + offset, old, renew); } + +#ifdef ROCKCHIP_CLOCK_DEBUG +static void +obio_dump_clocks(void) +{ + printf("APLL: %u Hz\n", rockchip_apll_get_rate()); + printf("GPLL: %u Hz\n", rockchip_gpll_get_rate()); + printf("CPU: %u Hz\n", rockchip_cpu_get_rate()); + printf("AHB: %u Hz\n", rockchip_ahb_get_rate()); + printf("A9PERIPH: %u Hz\n", rockchip_a9periph_get_rate()); + printf("MMC0: %u Hz\n", rockchip_mmc0_get_rate()); +} +#endif Index: src/sys/arch/arm/rockchip/rockchip_crureg.h diff -u src/sys/arch/arm/rockchip/rockchip_crureg.h:1.2 src/sys/arch/arm/rockchip/rockchip_crureg.h:1.3 --- src/sys/arch/arm/rockchip/rockchip_crureg.h:1.2 Sat Dec 27 02:12:29 2014 +++ src/sys/arch/arm/rockchip/rockchip_crureg.h Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_crureg.h,v 1.2 2014/12/27 02:12:29 jmcneill Exp $ */ +/* $NetBSD: rockchip_crureg.h,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca> @@ -55,12 +55,12 @@ #define CRU_GLB_CNT_TH_REG 0x0140 #define CRU_PLL_CON0_CLKR_MASK __BITS(29,24) -#define CRU_PLL_CON0_CLKOD_MASK __BITS(19,16) +#define CRU_PLL_CON0_CLKOD_MASK __BITS(21,16) #define CRU_PLL_CON0_CLKR __BITS(13,8) -#define CRU_PLL_CON0_CLKOD __BITS(3,0) +#define CRU_PLL_CON0_CLKOD __BITS(5,0) -#define CRU_PLL_CON1_CLKF_MASK __BITS(28,16) -#define CRU_PLL_CON1_CLKF __BITS(12,0) +#define CRU_PLL_CON1_CLKF_MASK __BITS(31,16) +#define CRU_PLL_CON1_CLKF __BITS(15,0) #define CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL_MASK __BIT(24) #define CRU_CLKSEL_CON0_CORE_PERI_DIV_CON_MASK __BITS(23,22) @@ -68,6 +68,7 @@ #define CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL __BIT(8) #define CRU_CLKSEL_CON0_CORE_PERI_DIV_CON __BITS(7,6) #define CRU_CLKSEL_CON0_A9_CORE_DIV_CON __BITS(4,0) +#define RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON __BITS(13,9) #define CRU_CLKSEL_CON10_PERI_PLL_SEL_MASK __BIT(31) #define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON_MASK __BITS(29,28) @@ -78,6 +79,9 @@ #define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON __BITS(9,8) #define CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON __BITS(4,0) +#define CRU_CLKSEL_CON11_MMC0_DIV_CON_MASK __BITS(21,16) +#define CRU_CLKSEL_CON11_MMC0_DIV_CON __BITS(5,0) + #define CRU_GLB_SRST_FST_MAGIC 0xfdb9 #endif /* !_ROCKCHIP_CRUREG_H */ Index: src/sys/arch/arm/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.3 src/sys/arch/arm/rockchip/rockchip_board.c:1.4 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.3 Sat Dec 27 02:12:29 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.3 2014/12/27 02:12:29 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.4 2014/12/27 16:18:50 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca> @@ -26,8 +26,10 @@ * SUCH DAMAGE. */ +#include "opt_rockchip.h" + #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.3 2014/12/27 02:12:29 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.4 2014/12/27 16:18:50 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -81,7 +83,13 @@ rockchip_pll_get_rate(bus_size_t con0_re no = __SHIFTOUT(pll_con0, CRU_PLL_CON0_CLKOD) + 1; nf = __SHIFTOUT(pll_con1, CRU_PLL_CON1_CLKF) + 1; - return ROCKCHIP_REF_FREQ * nf / (nr * no); +#ifdef ROCKCHIP_CLOCK_DEBUG + printf("%s: %#x %#x: nr=%d no=%d nf=%d\n", __func__, + (unsigned int)con0_reg, (unsigned int)con1_reg, + nr, no, nf); +#endif + + return (ROCKCHIP_REF_FREQ * nf) / (nr * no); } u_int @@ -102,15 +110,58 @@ rockchip_cpu_get_rate(void) bus_space_tag_t bst = &rockchip_bs_tag; bus_space_handle_t bsh; uint32_t clksel_con0; + uint32_t a9_core_div_con; + u_int rate; + + rockchip_get_cru_bsh(&bsh); + + clksel_con0 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(0)); + if (clksel_con0 & CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL) { + rate = rockchip_gpll_get_rate(); + } else { + rate = rockchip_apll_get_rate(); + } + +#if notyet + if (rockchip_chip_id() == ROCKCHIP_CHIP_ID_RK3188) { + a9_core_div_con = __SHIFTOUT(clksel_con0, + RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON); + } else { + a9_core_div_con = __SHIFTOUT(clksel_con0, + CRU_CLKSEL_CON0_A9_CORE_DIV_CON); + } +#else + a9_core_div_con = 0; +#endif + +#ifdef ROCKCHIP_CLOCK_DEBUG + printf("%s: clksel_con0=%#x\n", __func__, clksel_con0); +#endif + + return rate / (a9_core_div_con + 1); +} + +u_int +rockchip_a9periph_get_rate(void) +{ + bus_space_tag_t bst = &rockchip_bs_tag; + bus_space_handle_t bsh; + uint32_t clksel_con0; + uint32_t core_peri_div_con; + u_int rate; rockchip_get_cru_bsh(&bsh); clksel_con0 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(0)); if (clksel_con0 & CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL) { - return rockchip_gpll_get_rate(); + rate = rockchip_gpll_get_rate(); } else { - return rockchip_apll_get_rate(); + rate = rockchip_apll_get_rate(); } + core_peri_div_con = __SHIFTOUT(clksel_con0, + CRU_CLKSEL_CON0_CORE_PERI_DIV_CON); + + return rate / ((1 << core_peri_div_con) * 2); } u_int @@ -132,3 +183,21 @@ rockchip_ahb_get_rate(void) return rockchip_gpll_get_rate() / (hclk_div * aclk_div); } + +u_int +rockchip_mmc0_get_rate(void) +{ + bus_space_tag_t bst = &rockchip_bs_tag; + bus_space_handle_t bsh; + uint32_t clksel_con11; + uint32_t mmc0_div_con; + + rockchip_get_cru_bsh(&bsh); + + clksel_con11 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(11)); + + mmc0_div_con = __SHIFTOUT(clksel_con11, + CRU_CLKSEL_CON11_MMC0_DIV_CON); + + return rockchip_gpll_get_rate() / (mmc0_div_con + 1); +} Index: src/sys/arch/arm/rockchip/rockchip_var.h diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.4 src/sys/arch/arm/rockchip/rockchip_var.h:1.5 --- src/sys/arch/arm/rockchip/rockchip_var.h:1.4 Sat Dec 27 02:12:29 2014 +++ src/sys/arch/arm/rockchip/rockchip_var.h Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_var.h,v 1.4 2014/12/27 02:12:29 jmcneill Exp $ */ +/* $NetBSD: rockchip_var.h,v 1.5 2014/12/27 16:18:50 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -32,6 +32,8 @@ #ifndef _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ #define _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ +#include "opt_rockchip.h" + #include <sys/types.h> #include <sys/bus.h> @@ -60,5 +62,7 @@ u_int rockchip_apll_get_rate(void); u_int rockchip_gpll_get_rate(void); u_int rockchip_cpu_get_rate(void); u_int rockchip_ahb_get_rate(void); +u_int rockchip_a9periph_get_rate(void); +u_int rockchip_mmc0_get_rate(void); #endif /* _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ */