Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/sunxi Add sun50i DE clocks.



details:   https://anonhg.NetBSD.org/src/rev/73b8e989eebd
branches:  trunk
changeset: 448149:73b8e989eebd
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Tue Jan 22 23:06:49 2019 +0000

description:
Add sun50i DE clocks.

diffstat:

 sys/arch/arm/sunxi/sun4i_a10_ccu.c        |  18 ++++++-----
 sys/arch/arm/sunxi/sun50i_a64_ccu.c       |  27 +++++++++++++++++-
 sys/arch/arm/sunxi/sunxi_ccu.h            |   9 ++++-
 sys/arch/arm/sunxi/sunxi_ccu_fractional.c |  45 ++++++++++++++++++++++++------
 4 files changed, 77 insertions(+), 22 deletions(-)

diffs (263 lines):

diff -r fcca9f36bead -r 73b8e989eebd sys/arch/arm/sunxi/sun4i_a10_ccu.c
--- a/sys/arch/arm/sunxi/sun4i_a10_ccu.c        Tue Jan 22 22:22:06 2019 +0000
+++ b/sys/arch/arm/sunxi/sun4i_a10_ccu.c        Tue Jan 22 23:06:49 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sun4i_a10_ccu.c,v 1.9 2018/04/02 20:57:18 bouyer Exp $ */
+/* $NetBSD: sun4i_a10_ccu.c,v 1.10 2019/01/22 23:06:49 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: sun4i_a10_ccu.c,v 1.9 2018/04/02 20:57:18 bouyer Exp $");
+__KERNEL_RCSID(1, "$NetBSD: sun4i_a10_ccu.c,v 1.10 2019/01/22 23:06:49 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -323,9 +323,10 @@
            __BIT(15),                  /* div_en */
            __BIT(14),                  /* frac_sel */
            270000000, 297000000,       /* frac values */
-           8,                          /* prediv */
-           __BIT(31)                   /* enable */
-           ),
+           0,                          /* prediv */
+           8,                          /* prediv_val */
+           __BIT(31),                  /* enable */
+           0),
        SUNXI_CCU_FRACTIONAL(A10_CLK_PLL_VIDEO1, "pll_video1", "osc24m",
            PLL7_CFG_REG,               /* reg */
            __BITS(7,0),                /* m */
@@ -334,9 +335,10 @@
            __BIT(15),                  /* div_en */
            __BIT(14),                  /* frac_sel */
            270000000, 297000000,       /* frac values */
-           8,                          /* prediv */
-           __BIT(31)                   /* enable */
-           ),
+           0,                          /* prediv */
+           8,                          /* prediv_val */
+           __BIT(31),                  /* enable */
+           0),
        SUNXI_CCU_FIXED_FACTOR(A10_CLK_PLL_VIDEO0_2X,
            "pll_video0x2", "pll_video0",
            1, 2),
diff -r fcca9f36bead -r 73b8e989eebd sys/arch/arm/sunxi/sun50i_a64_ccu.c
--- a/sys/arch/arm/sunxi/sun50i_a64_ccu.c       Tue Jan 22 22:22:06 2019 +0000
+++ b/sys/arch/arm/sunxi/sun50i_a64_ccu.c       Tue Jan 22 23:06:49 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sun50i_a64_ccu.c,v 1.9 2018/05/18 02:03:00 jmcneill Exp $ */
+/* $NetBSD: sun50i_a64_ccu.c,v 1.10 2019/01/22 23:06:49 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: sun50i_a64_ccu.c,v 1.9 2018/05/18 02:03:00 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: sun50i_a64_ccu.c,v 1.10 2019/01/22 23:06:49 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -44,6 +44,7 @@
 #define        PLL_AUDIO_CTRL_REG      0x008
 #define        PLL_PERIPH0_CTRL_REG    0x028
 #define        PLL_PERIPH1_CTRL_REG    0x02c
+#define        PLL_DE_CTRL_REG         0x048
 #define        AHB1_APB1_CFG_REG       0x054
 #define        APB2_CFG_REG            0x058
 #define        AHB2_CFG_REG            0x05c
@@ -59,6 +60,7 @@
 #define        USBPHY_CFG_REG          0x0cc
 #define        DRAM_CFG_REG            0x0f4
 #define        MBUS_RST_REG            0x0fc
+#define        DE_CLK_REG              0x104
 #define        AC_DIG_CLK_REG          0x140
 #define        BUS_SOFT_RST_REG0       0x2c0
 #define        BUS_SOFT_RST_REG1       0x2c4
@@ -143,6 +145,7 @@
 static const char *apb2_parents[] = { "losc", "hosc", "pll_periph0" };
 static const char *mmc_parents[] = { "hosc", "pll_periph0_2x", "pll_periph1_2x" };
 static const char *ths_parents[] = { "hosc", NULL, NULL, NULL };
+static const char *de_parents[] = { "pll_periph0_2x", "pll_de" };
 
 static const struct sunxi_ccu_nkmp_tbl sun50i_a64_cpux_table[] = {
        { 60000000, 9, 0, 0, 2 },
@@ -259,6 +262,19 @@
        SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_AUDIO_4X, "pll_audio_4x", "pll_audio_base", 1, 4),
        SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_AUDIO_8X, "pll_audio_8x", "pll_audio_base", 1, 8),
 
+       SUNXI_CCU_FRACTIONAL(A64_CLK_PLL_DE, "pll_de", "hosc",
+           DE_CLK_REG,                 /* reg */
+           __BITS(14,8),               /* m */
+           16,                         /* m_min */
+           50,                         /* m_max */
+           __BIT(24),                  /* div_en */
+           __BIT(25),                  /* frac_sel */
+           270000000, 297000000,       /* frac values */
+           __BITS(3,0),                /* prediv */
+           2,                          /* prediv_val */
+           __BIT(31),                  /* enable */
+           SUNXI_CCU_FRACTIONAL_PLUSONE),
+
        SUNXI_CCU_PREDIV(A64_CLK_AHB1, "ahb1", ahb1_parents,
            AHB1_APB1_CFG_REG,  /* reg */
            __BITS(7,6),        /* prediv */
@@ -318,6 +334,13 @@
            __BIT(31),          /* enable */
            SUNXI_CCU_DIV_TIMES_TWO),
 
+       SUNXI_CCU_DIV_GATE(A64_CLK_DE, "de", de_parents,
+           DE_CLK_REG,         /* reg */
+           __BITS(3,0),        /* div */
+           __BITS(26,24),      /* sel */
+           __BIT(31),          /* enable */
+           0),
+
        SUNXI_CCU_GATE(A64_CLK_AC_DIG, "ac-dig", "pll_audio",
            AC_DIG_CLK_REG, 31),
        SUNXI_CCU_GATE(A64_CLK_AC_DIG_4X, "ac-dig-4x", "pll_audio_4x",
diff -r fcca9f36bead -r 73b8e989eebd sys/arch/arm/sunxi/sunxi_ccu.h
--- a/sys/arch/arm/sunxi/sunxi_ccu.h    Tue Jan 22 22:22:06 2019 +0000
+++ b/sys/arch/arm/sunxi/sunxi_ccu.h    Tue Jan 22 23:06:49 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_ccu.h,v 1.19 2019/01/02 17:29:58 jmcneill Exp $ */
+/* $NetBSD: sunxi_ccu.h,v 1.20 2019/01/22 23:06:49 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -369,7 +369,10 @@
        uint32_t        frac_sel;
        uint32_t        frac[2];
        uint32_t        prediv;
+       uint32_t        prediv_val;
        uint32_t        enable;
+       uint32_t        flags;
+#define        SUNXI_CCU_FRACTIONAL_PLUSONE    __BIT(0)
 };
 
 int    sunxi_ccu_fractional_enable(struct sunxi_ccu_softc *,
@@ -384,7 +387,8 @@
                                    struct sunxi_ccu_clk *);
 
 #define        SUNXI_CCU_FRACTIONAL(_id, _name, _parent, _reg, _m, _m_min, _m_max, \
-                    _div_en, _frac_sel, _frac0, _frac1, _prediv, _enable) \
+                    _div_en, _frac_sel, _frac0, _frac1, _prediv, _prediv_val, \
+                    _enable, _flags)                                   \
        [_id] = {                                                       \
                .type = SUNXI_CCU_FRACTIONAL,                           \
                .base.name = (_name),                                   \
@@ -394,6 +398,7 @@
                .u.fractional.m_min = (_m_min),                         \
                .u.fractional.m_max = (_m_max),                         \
                .u.fractional.prediv = (_prediv),                       \
+               .u.fractional.prediv_val = (_prediv_val),               \
                .u.fractional.div_en = (_div_en),                       \
                .u.fractional.frac_sel = (_frac_sel),                   \
                .u.fractional.frac[0] = (_frac0),                       \
diff -r fcca9f36bead -r 73b8e989eebd sys/arch/arm/sunxi/sunxi_ccu_fractional.c
--- a/sys/arch/arm/sunxi/sunxi_ccu_fractional.c Tue Jan 22 22:22:06 2019 +0000
+++ b/sys/arch/arm/sunxi/sunxi_ccu_fractional.c Tue Jan 22 23:06:49 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_ccu_fractional.c,v 1.2 2018/04/01 21:19:17 bouyer Exp $ */
+/* $NetBSD: sunxi_ccu_fractional.c,v 1.3 2019/01/22 23:06:49 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu_fractional.c,v 1.2 2018/04/01 21:19:17 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu_fractional.c,v 1.3 2019/01/22 23:06:49 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -78,10 +78,13 @@
        if (rate == 0)
                return 0;
 
-       if (fractional->prediv > 0)
-               rate = rate / fractional->prediv;
+       val = CCU_READ(sc, fractional->reg);
 
-       val = CCU_READ(sc, fractional->reg);
+       if (fractional->prediv != 0) {
+               rate = rate / (__SHIFTOUT(val, fractional->prediv) + 1);
+       } else if (fractional->prediv_val > 0) {
+               rate = rate / fractional->prediv_val;
+       }
 
        if (fractional->enable && !(val & fractional->enable))
                return 0;
@@ -92,6 +95,9 @@
        }
        m = __SHIFTOUT(val, fractional->m);
 
+       if (fractional->flags & SUNXI_CCU_FRACTIONAL_PLUSONE)
+               m++;
+
        return rate * m;
 }
 
@@ -116,10 +122,19 @@
        if (parent_rate == 0)
                return (new_rate == 0) ? 0 : ERANGE;
 
-       if (fractional->prediv > 0)
-               parent_rate = parent_rate / fractional->prediv;
+       val = CCU_READ(sc, fractional->reg);
 
-       val = CCU_READ(sc, fractional->reg);
+       if (fractional->prediv != 0) {
+               if (fractional->prediv_val > 0) {
+                       val &= ~fractional->prediv;
+                       val |= __SHIFTIN(fractional->prediv_val - 1,
+                                        fractional->prediv);
+               }
+               parent_rate = parent_rate / (__SHIFTOUT(val, fractional->prediv) + 1);
+       } else if (fractional->prediv_val > 0) {
+               parent_rate = parent_rate / fractional->prediv_val;
+       }
+
        for (i = 0; i < __arraycount(fractional->frac); i++) {
                if (fractional->frac[i] == new_rate) {
                        val &= ~fractional->div_en;
@@ -149,6 +164,9 @@
        if (best_rate == 0)
                return ERANGE;
 
+       if (fractional->flags & SUNXI_CCU_FRACTIONAL_PLUSONE)
+               best_m--;
+
        val &= ~fractional->m;
        val |= __SHIFTIN(best_m, fractional->m);
        CCU_WRITE(sc, fractional->reg, val);
@@ -165,6 +183,7 @@
        u_int parent_rate, best_rate;
        u_int m, rate;
        int best_diff;
+       uint32_t val;
        int i;
 
        clkp = &clk->base;
@@ -176,8 +195,14 @@
        if (parent_rate == 0)
                return 0;
 
-       if (fractional->prediv > 0)
-               parent_rate = parent_rate / fractional->prediv;
+       val = CCU_READ(sc, fractional->reg);
+
+       if (fractional->prediv_val > 0) {
+               parent_rate = parent_rate / fractional->prediv_val;
+       } else if (fractional->prediv != 0) {
+               val = CCU_READ(sc, fractional->reg);
+               parent_rate = parent_rate / (__SHIFTOUT(val, fractional->prediv) + 1);
+       }
 
        for (i = 0; i < __arraycount(fractional->frac); i++) {
                if (fractional->frac[i] == try_rate) {



Home | Main Index | Thread Index | Old Index