Module Name: src
Committed By: jmcneill
Date: Sat Dec 27 19:14:05 UTC 2014
Modified Files:
src/sys/arch/arm/rockchip: rockchip_board.c rockchip_var.h
Log Message:
mmc0 on rk3188 is based on ahb clk, not gpll. add a function to control mmc0
clock as well.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_board.c
cvs rdiff -u -r1.5 -r1.6 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/rockchip_board.c
diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.4 src/sys/arch/arm/rockchip/rockchip_board.c:1.5
--- src/sys/arch/arm/rockchip/rockchip_board.c:1.4 Sat Dec 27 16:18:50 2014
+++ src/sys/arch/arm/rockchip/rockchip_board.c Sat Dec 27 19:14:05 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_board.c,v 1.4 2014/12/27 16:18:50 jmcneill Exp $ */
+/* $NetBSD: rockchip_board.c,v 1.5 2014/12/27 19:14:05 jmcneill Exp $ */
/*-
* Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
#include "opt_rockchip.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.4 2014/12/27 16:18:50 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.5 2014/12/27 19:14:05 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -199,5 +199,41 @@ rockchip_mmc0_get_rate(void)
mmc0_div_con = __SHIFTOUT(clksel_con11,
CRU_CLKSEL_CON11_MMC0_DIV_CON);
- return rockchip_gpll_get_rate() / (mmc0_div_con + 1);
+ return rockchip_ahb_get_rate() / (mmc0_div_con + 1);
+}
+
+u_int
+rockchip_mmc0_set_div(u_int div)
+{
+ bus_space_tag_t bst = &rockchip_bs_tag;
+ bus_space_handle_t bsh;
+ uint32_t clksel_con11;
+
+ if (div == 0 || div > 0x40)
+ return EINVAL;
+
+ rockchip_get_cru_bsh(&bsh);
+
+ clksel_con11 = CRU_CLKSEL_CON11_MMC0_PLL_SEL_MASK |
+ CRU_CLKSEL_CON11_MMC0_DIV_CON_MASK;
+ //clksel_con11 |= CRU_CLKSEL_CON11_MMC0_PLL_SEL; /* GPLL */
+ clksel_con11 |= __SHIFTIN(div - 1, CRU_CLKSEL_CON11_MMC0_DIV_CON);
+
+#ifdef ROCKCHIP_CLOCK_DEBUG
+ const u_int old_rate = rockchip_mmc0_get_rate();
+#endif
+
+ bus_space_write_4(bst, bsh, CRU_CLKSEL_CON_REG(11), clksel_con11);
+
+#ifdef ROCKCHIP_CLOCK_DEBUG
+ const u_int new_rate = rockchip_mmc0_get_rate();
+
+ printf("%s: update %u Hz -> %u Hz\n", __func__, old_rate, new_rate);
+
+ const uint32_t clkgate2 = bus_space_read_4(bst, bsh,
+ CRU_CLKGATE_CON_REG(2));
+ printf("%s: clkgate2 = %#x\n", __func__, clkgate2);
+#endif
+
+ return 0;
}
Index: src/sys/arch/arm/rockchip/rockchip_var.h
diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.5 src/sys/arch/arm/rockchip/rockchip_var.h:1.6
--- src/sys/arch/arm/rockchip/rockchip_var.h:1.5 Sat Dec 27 16:18:50 2014
+++ src/sys/arch/arm/rockchip/rockchip_var.h Sat Dec 27 19:14:05 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_var.h,v 1.5 2014/12/27 16:18:50 jmcneill Exp $ */
+/* $NetBSD: rockchip_var.h,v 1.6 2014/12/27 19:14:05 jmcneill Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -64,5 +64,6 @@ 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);
+u_int rockchip_mmc0_set_div(u_int);
#endif /* _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ */