The generic clock framework expects frequencies in Hz whereas the imx clock
authorkettenis <kettenis@openbsd.org>
Sat, 30 Dec 2017 13:34:56 +0000 (13:34 +0000)
committerkettenis <kettenis@openbsd.org>
Sat, 30 Dec 2017 13:34:56 +0000 (13:34 +0000)
code was providing them in kHz.  Get rid of this discrepancy.
Hook up the CPU clock to the generic clock framework and remove the
cpuspeed function as it is no longer needed.

ok patrick@

sys/arch/armv7/imx/imxccm.c
sys/arch/armv7/imx/imxccm_clocks.h
sys/arch/armv7/imx/imxesdhc.c
sys/arch/armv7/imx/imxiic.c
sys/arch/armv7/imx/imxuart.c

index 4847d49..cd95e23 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: imxccm.c,v 1.9 2017/07/18 15:06:37 patrick Exp $ */
+/* $OpenBSD: imxccm.c,v 1.10 2017/12/30 13:34:56 kettenis Exp $ */
 /*
  * Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se>
  *
 #define CCM_PMU_MISC1_LVDSCLK1_OBEN            (1 << 10)
 #define CCM_PMU_MISC1_LVDSCLK1_IBEN            (1 << 12)
 
-#define HCLK_FREQ                              24000
-#define PLL3_80M                               80000
+#define HCLK_FREQ                              24000000
+#define PLL3_80M                               80000000
 
 #define HREAD4(sc, reg)                                                        \
        (bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)))
@@ -226,20 +226,18 @@ struct cfdriver imxccm_cd = {
        NULL, "imxccm", DV_DULL
 };
 
-int imxccm_cpuspeed(int *);
-unsigned int imxccm_decode_pll(enum clocks, unsigned int);
-unsigned int imxccm_get_pll2_pfd(unsigned int);
-unsigned int imxccm_get_pll3_pfd(unsigned int);
-unsigned int imxccm_get_armclk(void);
+uint32_t imxccm_decode_pll(enum clocks, uint32_t);
+uint32_t imxccm_get_pll2_pfd(unsigned int);
+uint32_t imxccm_get_pll3_pfd(unsigned int);
+uint32_t imxccm_get_armclk(void);
 void imxccm_armclk_set_parent(enum clocks);
-void imxccm_armclk_set_freq(unsigned int);
-unsigned int imxccm_get_usdhx(int x);
-unsigned int imxccm_get_periphclk(void);
-unsigned int imxccm_get_fecclk(void);
-unsigned int imxccm_get_ahbclk(void);
-unsigned int imxccm_get_ipgclk(void);
-unsigned int imxccm_get_ipg_perclk(void);
-unsigned int imxccm_get_uartclk(void);
+uint32_t imxccm_get_usdhx(int x);
+uint32_t imxccm_get_periphclk(void);
+uint32_t imxccm_get_fecclk(void);
+uint32_t imxccm_get_ahbclk(void);
+uint32_t imxccm_get_ipgclk(void);
+uint32_t imxccm_get_ipg_perclk(void);
+uint32_t imxccm_get_uartclk(void);
 void imxccm_enable(void *, uint32_t *, int);
 uint32_t imxccm_get_frequency(void *, uint32_t *);
 void imxccm_disable_usb1_chrg_detect(void);
@@ -287,7 +285,7 @@ imxccm_attach(struct device *parent, struct device *self, void *aux)
 
        printf(": imx6 rev 1.%d CPU freq: %d MHz",
            HREAD4(sc, CCM_ANALOG_DIGPROG) & CCM_ANALOG_DIGPROG_MINOR_MASK,
-           imxccm_get_armclk() / 1000);
+           imxccm_get_armclk() / 1000000);
 
        printf("\n");
 
@@ -296,19 +294,10 @@ imxccm_attach(struct device *parent, struct device *self, void *aux)
        sc->sc_cd.cd_enable = imxccm_enable;
        sc->sc_cd.cd_get_frequency = imxccm_get_frequency;
        clock_register(&sc->sc_cd);
-
-       cpu_cpuspeed = imxccm_cpuspeed;
-}
-
-int
-imxccm_cpuspeed(int *freq)
-{
-       *freq = imxccm_get_armclk() / 1000;
-       return (0);
 }
 
-unsigned int
-imxccm_decode_pll(enum clocks pll, unsigned int freq)
+uint32_t
+imxccm_decode_pll(enum clocks pll, uint32_t freq)
 {
        struct imxccm_softc *sc = imxccm_sc;
        uint32_t div;
@@ -334,25 +323,25 @@ imxccm_decode_pll(enum clocks pll, unsigned int freq)
        }
 }
 
-unsigned int
+uint32_t
 imxccm_get_pll2_pfd(unsigned int pfd)
 {
        struct imxccm_softc *sc = imxccm_sc;
 
-       return imxccm_decode_pll(SYS_PLL2, HCLK_FREQ) * 18
+       return imxccm_decode_pll(SYS_PLL2, HCLK_FREQ) * 18ULL
            / CCM_ANALOG_PFD_528_PFDx_FRAC(HREAD4(sc, CCM_ANALOG_PFD_528), pfd);
 }
 
-unsigned int
+uint32_t
 imxccm_get_pll3_pfd(unsigned int pfd)
 {
        struct imxccm_softc *sc = imxccm_sc;
 
-       return imxccm_decode_pll(USB1_PLL3, HCLK_FREQ) * 18
+       return imxccm_decode_pll(USB1_PLL3, HCLK_FREQ) * 18ULL
            / CCM_ANALOG_PFD_480_PFDx_FRAC(HREAD4(sc, CCM_ANALOG_PFD_480), pfd);
 }
 
-unsigned int
+uint32_t
 imxccm_get_armclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -397,14 +386,6 @@ imxccm_armclk_set_parent(enum clocks clock)
        }
 }
 
-void
-imxccm_armclk_set_freq(unsigned int freq)
-{
-       if (freq > 1296000 || freq < 648000)
-               panic("%s: frequency must be between 648MHz and 1296MHz!",
-                   __func__);
-}
-
 unsigned int
 imxccm_get_usdhx(int x)
 {
@@ -427,7 +408,7 @@ imxccm_get_usdhx(int x)
        return clkroot / (podf + 1);
 }
 
-unsigned int
+uint32_t
 imxccm_get_uartclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -438,7 +419,7 @@ imxccm_get_uartclk(void)
        return clkroot / (podf + 1);
 }
 
-unsigned int
+uint32_t
 imxccm_get_periphclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -472,7 +453,7 @@ imxccm_get_periphclk(void)
        }
 }
 
-unsigned int
+uint32_t
 imxccm_get_fecclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -494,10 +475,10 @@ imxccm_get_fecclk(void)
                break;
        }
 
-       return 500000 / div ;
+       return 500000000 / div ;
 }
 
-unsigned int
+uint32_t
 imxccm_get_ahbclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -508,7 +489,7 @@ imxccm_get_ahbclk(void)
        return imxccm_get_periphclk() / (ahb_podf + 1);
 }
 
-unsigned int
+uint32_t
 imxccm_get_ipgclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -519,7 +500,7 @@ imxccm_get_ipgclk(void)
        return imxccm_get_ahbclk() / (ipg_podf + 1);
 }
 
-unsigned int
+uint32_t
 imxccm_get_ipg_perclk(void)
 {
        struct imxccm_softc *sc = imxccm_sc;
@@ -580,6 +561,8 @@ imxccm_get_frequency(void *cookie, uint32_t *cells)
 
        if (sc->sc_gates == imx6ul_gates) {
                switch (idx) {
+               case IMX6UL_CLK_ARM:
+                       return imxccm_get_armclk();
                case IMX6UL_CLK_IPG:
                        return imxccm_get_ipgclk();
                case IMX6UL_CLK_PERCLK:
@@ -592,6 +575,8 @@ imxccm_get_frequency(void *cookie, uint32_t *cells)
                }
        } else {
                switch (idx) {
+               case IMX6_CLK_ARM:
+                       return imxccm_get_armclk();
                case IMX6_CLK_IPG:
                        return imxccm_get_ipgclk();
                case IMX6_CLK_IPG_PER:
index 5324f1e..650644e 100644 (file)
@@ -6,6 +6,7 @@
 
 #define IMX6_CLK_IPG           0x3e
 #define IMX6_CLK_IPG_PER       0x3f
+#define IMX6_CLK_ARM           0x68
 #define IMX6_CLK_I2C1          0x7d
 #define IMX6_CLK_I2C2          0x7e
 #define IMX6_CLK_I2C3          0x7f
@@ -34,6 +35,7 @@ struct imxccm_gate imx6_gates[] = {
  * i.MX6UL clocks.
  */
 
+#define IMX6UL_CLK_ARM         0x5d
 #define IMX6UL_CLK_PERCLK      0x63
 #define IMX6UL_CLK_IPG         0x64
 #define IMX6UL_CLK_GPT1_BUS    0x98
index 164aed4..8414ded 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: imxesdhc.c,v 1.37 2017/07/18 18:45:44 patrick Exp $   */
+/*     $OpenBSD: imxesdhc.c,v 1.38 2017/12/30 13:34:56 kettenis Exp $  */
 /*
  * Copyright (c) 2009 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -338,7 +338,7 @@ imxesdhc_attach(struct device *parent, struct device *self, void *aux)
        /*
         * Determine the base clock frequency. (2.2.24)
         */
-       sc->clkbase = clock_get_frequency(faa->fa_node, "per");
+       sc->clkbase = clock_get_frequency(faa->fa_node, "per") / 1000;
 
        printf("%s: %d MHz base clock\n", DEVNAME(sc), sc->clkbase / 1000);
 
index fb12045..79a7af8 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: imxiic.c,v 1.13 2017/03/06 06:44:46 kettenis Exp $ */
+/* $OpenBSD: imxiic.c,v 1.14 2017/12/30 13:34:56 kettenis Exp $ */
 /*
  * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se>
  *
@@ -166,7 +166,7 @@ imxiic_setspeed(struct imxiic_softc *sc, u_int speed)
                uint32_t div;
                int i;
 
-               i2c_clk_rate = clock_get_frequency(sc->sc_node, NULL);
+               i2c_clk_rate = clock_get_frequency(sc->sc_node, NULL) / 1000;
                div = (i2c_clk_rate + speed - 1) / speed;
                if (div < imxiic_clk_div[0][0])
                        i = 0;
index ed87442..5f2e686 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: imxuart.c,v 1.16 2017/10/27 11:23:28 kevlo Exp $ */
+/* $OpenBSD: imxuart.c,v 1.17 2017/12/30 13:34:56 kettenis Exp $ */
 /*
  * Copyright (c) 2005 Dale Rahn <drahn@motorola.com>
  *
@@ -548,7 +548,7 @@ imxuartopen(dev_t dev, int flag, int mode, struct proc *p)
 
                /* formula: clk / (rfdiv * 1600) */
                bus_space_write_2(iot, ioh, IMXUART_UBMR,
-                   (clock_get_frequency(sc->sc_node, "per") * 1000) / 1600);
+                   clock_get_frequency(sc->sc_node, "per") / 1600);
 
                SET(sc->sc_ucr1, IMXUART_CR1_EN|IMXUART_CR1_RRDYEN);
                SET(sc->sc_ucr2, IMXUART_CR2_TXEN|IMXUART_CR2_RXEN);