summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2019-09-20 22:42:05 +0000
committerkettenis <kettenis@openbsd.org>2019-09-20 22:42:05 +0000
commitea5e035f4d57ede9f18c82c5c9decc5f46c1925a (patch)
tree273f759f13d156bb8de0dd5d337baf5f60e744a0
parentExtend the identification and validation of elantech-v4 packets to the (diff)
downloadwireguard-openbsd-ea5e035f4d57ede9f18c82c5c9decc5f46c1925a.tar.xz
wireguard-openbsd-ea5e035f4d57ede9f18c82c5c9decc5f46c1925a.zip
Add A20 GMAC clocks.
-rw-r--r--sys/dev/fdt/sxiccmu.c17
-rw-r--r--sys/dev/fdt/sxiccmu_clocks.h4
2 files changed, 18 insertions, 3 deletions
diff --git a/sys/dev/fdt/sxiccmu.c b/sys/dev/fdt/sxiccmu.c
index a19f505042c..60c83ac5a35 100644
--- a/sys/dev/fdt/sxiccmu.c
+++ b/sys/dev/fdt/sxiccmu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sxiccmu.c,v 1.24 2019/09/08 16:45:21 kettenis Exp $ */
+/* $OpenBSD: sxiccmu.c,v 1.25 2019/09/20 22:42:05 kettenis Exp $ */
/*
* Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
* Copyright (c) 2013 Artturi Alm
@@ -887,12 +887,15 @@ sxiccmu_ccu_get_frequency(void *cookie, uint32_t *cells)
#define A10_CPU_CLK_SRC_SEL_OSC24M (0x1 << 16)
#define A10_CPU_CLK_SRC_SEL_PLL1 (0x2 << 16)
#define A10_CPU_CLK_SRC_SEL_200MHZ (0x3 << 16)
+#define A10_AHB_CLK_DIV_RATIO(x) (((x) >> 8) & 0x3)
+#define A10_AXI_CLK_DIV_RATIO(x) (((x) >> 0) & 0x3)
uint32_t
sxiccmu_a10_get_frequency(struct sxiccmu_softc *sc, uint32_t idx)
{
uint32_t parent;
- uint32_t reg, k, m, n, p;
+ uint32_t reg, div;
+ uint32_t k, m, n, p;
switch (idx) {
case A10_CLK_LOSC:
@@ -927,6 +930,16 @@ sxiccmu_a10_get_frequency(struct sxiccmu_softc *sc, uint32_t idx)
return 200000000;
}
return sxiccmu_ccu_get_frequency(sc, &parent);
+ case A10_CLK_AXI:
+ reg = SXIREAD4(sc, A10_CPU_AHB_APB0_CFG_REG);
+ div = 1 << A10_AXI_CLK_DIV_RATIO(reg);
+ parent = A10_CLK_CPU;
+ return sxiccmu_ccu_get_frequency(sc, &parent) / div;
+ case A10_CLK_AHB:
+ reg = SXIREAD4(sc, A10_CPU_AHB_APB0_CFG_REG);
+ div = 1 << A10_AHB_CLK_DIV_RATIO(reg);
+ parent = A10_CLK_AXI;
+ return sxiccmu_ccu_get_frequency(sc, &parent) / div;
case A10_CLK_APB1:
/* XXX Controlled by a MUX. */
return 24000000;
diff --git a/sys/dev/fdt/sxiccmu_clocks.h b/sys/dev/fdt/sxiccmu_clocks.h
index 558c9a66f32..cc545f40b9b 100644
--- a/sys/dev/fdt/sxiccmu_clocks.h
+++ b/sys/dev/fdt/sxiccmu_clocks.h
@@ -13,6 +13,8 @@
#define A10_CLK_PLL_PERIPH 15
#define A10_CLK_CPU 20
+#define A10_CLK_AXI 21
+#define A10_CLK_AHB 23
#define A10_CLK_APB1 25
#define A10_CLK_AHB_EHCI0 27
@@ -63,7 +65,7 @@ struct sxiccmu_ccu_bit sun4i_a10_gates[] = {
[A10_CLK_AHB_MMC3] = { 0x0060, 11 },
[A10_CLK_AHB_EMAC] = { 0x0060, 17 },
[A10_CLK_AHB_SATA] = { 0x0060, 25 },
- [A10_CLK_AHB_GMAC] = { 0x0064, 17 },
+ [A10_CLK_AHB_GMAC] = { 0x0064, 17, A10_CLK_AHB },
[A10_CLK_APB0_PIO] = { 0x0068, 5 },
[A10_CLK_APB1_I2C0] = { 0x006c, 0, A10_CLK_APB1 },
[A10_CLK_APB1_I2C1] = { 0x006c, 1, A10_CLK_APB1 },