summaryrefslogtreecommitdiffstats
path: root/sys/dev/fdt/imxccm.c
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-10-12 17:38:28 +0000
committerpatrick <patrick@openbsd.org>2020-10-12 17:38:28 +0000
commit6d21c932f79015bf0cc654c00c7dc66388994b3f (patch)
treef042ffeec0fdce748c236c86d4938c83350727ca /sys/dev/fdt/imxccm.c
parentOCOTP's parent clock is the IPG clock on i.MX8M. (diff)
downloadwireguard-openbsd-6d21c932f79015bf0cc654c00c7dc66388994b3f.tar.xz
wireguard-openbsd-6d21c932f79015bf0cc654c00c7dc66388994b3f.zip
Add support for the i.MX8M AHB clocks. These behave just like all the
other composite clocks. With this we can get the frequency for the OCOTP.
Diffstat (limited to 'sys/dev/fdt/imxccm.c')
-rw-r--r--sys/dev/fdt/imxccm.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/sys/dev/fdt/imxccm.c b/sys/dev/fdt/imxccm.c
index beb246ea022..91301606e86 100644
--- a/sys/dev/fdt/imxccm.c
+++ b/sys/dev/fdt/imxccm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: imxccm.c,v 1.21 2020/04/28 19:26:45 patrick Exp $ */
+/* $OpenBSD: imxccm.c,v 1.22 2020/10/12 17:38:28 patrick Exp $ */
/*
* Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se>
*
@@ -244,11 +244,13 @@ uint32_t imxccm_get_ipgclk(struct imxccm_softc *);
uint32_t imxccm_get_ipg_perclk(struct imxccm_softc *);
uint32_t imxccm_get_uartclk(struct imxccm_softc *);
uint32_t imxccm_imx8mm_enet(struct imxccm_softc *sc, uint32_t);
+uint32_t imxccm_imx8mm_ahb(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mm_i2c(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mm_uart(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mm_usdhc(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mq_ecspi(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mq_enet(struct imxccm_softc *sc, uint32_t);
+uint32_t imxccm_imx8mq_ahb(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mq_i2c(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mq_pwm(struct imxccm_softc *sc, uint32_t);
uint32_t imxccm_imx8mq_uart(struct imxccm_softc *sc, uint32_t);
@@ -775,6 +777,35 @@ imxccm_imx8mm_enet(struct imxccm_softc *sc, uint32_t idx)
}
uint32_t
+imxccm_imx8mm_ahb(struct imxccm_softc *sc, uint32_t idx)
+{
+ uint32_t mux;
+
+ if (idx >= sc->sc_nmuxs || sc->sc_muxs[idx].reg == 0)
+ return 0;
+
+ mux = HREAD4(sc, sc->sc_muxs[idx].reg);
+ mux >>= sc->sc_muxs[idx].shift;
+ mux &= sc->sc_muxs[idx].mask;
+
+ switch (mux) {
+ case 0:
+ return clock_get_frequency(sc->sc_node, "osc_24m");
+ case 1:
+ return 133 * 1000 * 1000; /* sys_pll1_133m */
+ case 2:
+ return 800 * 1000 * 1000; /* sys_pll1_800m */
+ case 3:
+ return 400 * 1000 * 1000; /* sys_pll1_400m */
+ case 4:
+ return 125 * 1000 * 1000; /* sys_pll2_125m */
+ default:
+ printf("%s: 0x%08x 0x%08x\n", __func__, idx, mux);
+ return 0;
+ }
+}
+
+uint32_t
imxccm_imx8mm_i2c(struct imxccm_softc *sc, uint32_t idx)
{
uint32_t mux;
@@ -886,6 +917,35 @@ imxccm_imx8mq_enet(struct imxccm_softc *sc, uint32_t idx)
}
uint32_t
+imxccm_imx8mq_ahb(struct imxccm_softc *sc, uint32_t idx)
+{
+ uint32_t mux;
+
+ if (idx >= sc->sc_nmuxs || sc->sc_muxs[idx].reg == 0)
+ return 0;
+
+ mux = HREAD4(sc, sc->sc_muxs[idx].reg);
+ mux >>= sc->sc_muxs[idx].shift;
+ mux &= sc->sc_muxs[idx].mask;
+
+ switch (mux) {
+ case 0:
+ return clock_get_frequency(sc->sc_node, "osc_25m");
+ case 1:
+ return 133 * 1000 * 1000; /* sys1_pll_133m */
+ case 2:
+ return 800 * 1000 * 1000; /* sys1_pll_800m */
+ case 3:
+ return 400 * 1000 * 1000; /* sys1_pll_400m */
+ case 4:
+ return 125 * 1000 * 1000; /* sys2_pll_125m */
+ default:
+ printf("%s: 0x%08x 0x%08x\n", __func__, idx, mux);
+ return 0;
+ }
+}
+
+uint32_t
imxccm_imx8mq_i2c(struct imxccm_softc *sc, uint32_t idx)
{
uint32_t mux;
@@ -1387,6 +1447,9 @@ imxccm_get_frequency(void *cookie, uint32_t *cells)
case IMX8MM_CLK_ENET_AXI:
freq = imxccm_imx8mm_enet(sc, idx);
break;
+ case IMX8MM_CLK_AHB:
+ freq = imxccm_imx8mm_ahb(sc, idx);
+ break;
case IMX8MM_CLK_I2C1:
case IMX8MM_CLK_I2C2:
case IMX8MM_CLK_I2C3:
@@ -1433,6 +1496,9 @@ imxccm_get_frequency(void *cookie, uint32_t *cells)
case IMX8MQ_CLK_ENET_AXI:
freq = imxccm_imx8mq_enet(sc, idx);
break;
+ case IMX8MQ_CLK_AHB:
+ freq = imxccm_imx8mq_ahb(sc, idx);
+ break;
case IMX8MQ_CLK_I2C1:
case IMX8MQ_CLK_I2C2:
case IMX8MQ_CLK_I2C3: