Author: manu
Date: Thu Nov 28 17:42:11 2019
New Revision: 355176
URL: https://svnweb.freebsd.org/changeset/base/355176

Log:
  MFC r347097, r351187, r351551-r351552, r352849-r352852
  
  r347097 by ganbold:
  Add emmc clock definitions for Rockchip RK3399 SoC.
  
  r351187 by mmel:
  Improve rk_pinctrl driver:
  - add support for 'output-low', 'output-high', 'output-low' and
    'output-enable' properties. These are use in RK3288 DT files
  - add support for RK3288
  - to reduce overall file size, use local macros for initialization
    of pinctrl description structures.
  
  r351551:
  arm64: rk3328: pinctrl: Add gpio banks and fix iomux
  
  Since r351187 the pinctrl driver need to know the gpio bank as it
  directly attach the gpio driver to handle some setup that might
  be present in the dts, add the gpio banks table for rk3328.
  While here fix some IOMUX definition that prevented to boot
  on RK3328 as pinctrl wasn't configured correctly.
  
  Submitted by: mmel (original version)
  MFC With:     r351187
  
  r351552:
  arm64: rk3399: pinctrl: Add gpio banks and fix iomux
  
  Since r351187 the pinctrl driver need to know the gpio bank as it
  directly attach the gpio driver to handle some setup that might
  be present in the dts, add the gpio banks table for rk3399.
  While here fix some IOMUX definition that prevented to boot
  on RK3399 as pinctrl wasn't configured correctly.
  
  Submitted by: mmel (original version)
  MFC With:     r351187
  
  r352849:
  arm64: rockchip: rk3399: Add usb2 clocks
  
  r352850:
  arm64: rockchip: Implement resets
  
  Module resets where not implemented when rockchip clocks were commited.
  Implement them.
  Since all resets registers are contiguous a driver only need to give
  the start offset and the number of resets. This avoid to have to declare
  every resets.
  
  r352851:
  arm64: rockchip: Fix map_gpio
  
  The map_gpio function wasn't correct, the first element is the pin
  and not the phandle.
  
  r352852:
  dwc: Add more delay for chip reset
  
  On rockchip board it seems that the value in the DTS
  are not enough for reseting the chip, I don't know if
  the value are really incorrect or if DELAY is not precise
  enough or if the rockchip gpio driver have some "lag" of some
  kind or not.
  For now just add more delay.

Modified:
  stable/12/sys/arm64/rockchip/clk/rk3328_cru.c
  stable/12/sys/arm64/rockchip/clk/rk3399_cru.c
  stable/12/sys/arm64/rockchip/clk/rk3399_pmucru.c
  stable/12/sys/arm64/rockchip/clk/rk_cru.c
  stable/12/sys/arm64/rockchip/clk/rk_cru.h
  stable/12/sys/arm64/rockchip/rk_gpio.c
  stable/12/sys/arm64/rockchip/rk_pinctrl.c
  stable/12/sys/dev/dwc/if_dwc.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/arm64/rockchip/clk/rk3328_cru.c
==============================================================================
--- stable/12/sys/arm64/rockchip/clk/rk3328_cru.c       Thu Nov 28 17:34:49 
2019        (r355175)
+++ stable/12/sys/arm64/rockchip/clk/rk3328_cru.c       Thu Nov 28 17:42:11 
2019        (r355176)
@@ -1083,6 +1083,9 @@ rk3328_cru_attach(device_t dev)
        sc->clks = rk3328_clks;
        sc->nclks = nitems(rk3328_clks);
 
+       sc->reset_offset = 0x300;
+       sc->reset_num = 184;
+
        return (rk_cru_attach(dev));
 }
 

Modified: stable/12/sys/arm64/rockchip/clk/rk3399_cru.c
==============================================================================
--- stable/12/sys/arm64/rockchip/clk/rk3399_cru.c       Thu Nov 28 17:34:49 
2019        (r355175)
+++ stable/12/sys/arm64/rockchip/clk/rk3399_cru.c       Thu Nov 28 17:42:11 
2019        (r355176)
@@ -52,6 +52,11 @@ __FBSDID("$FreeBSD$");
 
 /* GATES */
 
+#define        SCLK_USB2PHY0_REF       123
+#define        SCLK_USB2PHY1_REF       124
+#define        ACLK_EMMC_CORE          241
+#define        ACLK_EMMC_NOC           242
+#define        ACLK_EMMC_GRF           243
 #define        PCLK_GPIO2              336
 #define        PCLK_GPIO3              337
 #define        PCLK_GPIO4              338
@@ -61,6 +66,10 @@ __FBSDID("$FreeBSD$");
 #define        PCLK_I2C5               344
 #define        PCLK_I2C6               345
 #define        PCLK_I2C7               346
+#define        HCLK_HOST0              456
+#define        HCLK_HOST0_ARB          457
+#define        HCLK_HOST1              458
+#define        HCLK_HOST1_ARB          459
 #define        HCLK_SDMMC              462
 
 static struct rk_cru_gate rk3399_gates[] = {
@@ -80,6 +89,12 @@ static struct rk_cru_gate rk3399_gates[] = {
        CRU_GATE(0, "cpll_aclk_perihp_src", "cpll", 0x314, 0)
        CRU_GATE(0, "gpll_aclk_perihp_src", "gpll", 0x314, 1)
 
+       /* CRU_CLKGATE_CON6 */
+       CRU_GATE(0, "gpll_aclk_emmc_src", "gpll", 0x318, 12)
+       CRU_GATE(0, "cpll_aclk_emmc_src", "cpll", 0x318, 13)
+       CRU_GATE(SCLK_USB2PHY0_REF, "clk_usb2phy0_ref", "xin24m", 0x318, 5)
+       CRU_GATE(SCLK_USB2PHY1_REF, "clk_usb2phy1_ref", "xin24m", 0x318, 6)
+
        /* CRU_CLKGATE_CON7 */
        CRU_GATE(0, "gpll_aclk_perilp0_src", "gpll", 0x31C, 0)
        CRU_GATE(0, "cpll_aclk_perilp0_src", "cpll", 0x31C, 1)
@@ -88,6 +103,12 @@ static struct rk_cru_gate rk3399_gates[] = {
        CRU_GATE(0, "hclk_perilp1_cpll_src", "cpll", 0x320, 1)
        CRU_GATE(0, "hclk_perilp1_gpll_src", "gpll", 0x320, 0)
 
+       /* CRU_CLKGATE_CON20 */
+       CRU_GATE(HCLK_HOST0, "hclk_host0", "hclk_perihp", 0x350, 5)
+       CRU_GATE(HCLK_HOST0_ARB, "hclk_host0_arb", "hclk_perihp", 0x350, 6)
+       CRU_GATE(HCLK_HOST1, "hclk_host1", "hclk_perihp", 0x350, 7)
+       CRU_GATE(HCLK_HOST1_ARB, "hclk_host1_arb", "hclk_perihp", 0x350, 8)
+
        /* CRU_CLKGATE_CON22 */
        CRU_GATE(PCLK_I2C7, "pclk_rki2c7", "pclk_perilp1", 0x358, 5)
        CRU_GATE(PCLK_I2C1, "pclk_rki2c1", "pclk_perilp1", 0x358, 6)
@@ -101,6 +122,11 @@ static struct rk_cru_gate rk3399_gates[] = {
        CRU_GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_alive", 0x37c, 4)
        CRU_GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_alive", 0x37c, 5)
 
+       /* CRU_CLKGATE_CON32 */
+       CRU_GATE(ACLK_EMMC_CORE, "aclk_emmccore", "aclk_emmc", 0x380, 8)
+       CRU_GATE(ACLK_EMMC_NOC, "aclk_emmc_noc", "aclk_emmc", 0x380, 9)
+       CRU_GATE(ACLK_EMMC_GRF, "aclk_emmcgrf", "aclk_emmc", 0x380, 10)
+
        /* CRU_CLKGATE_CON33 */
        CRU_GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_sd", 0x384, 8)
 };
@@ -1445,6 +1471,60 @@ static struct rk_clk_composite_def sclk_sdmmc = {
        .flags = RK_CLK_COMPOSITE_HAVE_MUX | RK_CLK_COMPOSITE_HAVE_GATE,
 };
 
+/*
+ * emmc
+ */
+
+#define        SCLK_EMMC               78
+
+static const char *sclk_emmc_parents[] = {"cpll", "gpll", "npll"};
+
+static struct rk_clk_composite_def sclk_emmc = {
+       .clkdef = {
+               .id = SCLK_EMMC,
+               .name = "sclk_emmc",
+               .parent_names = sclk_emmc_parents,
+               .parent_cnt = nitems(sclk_emmc_parents),
+       },
+
+       .muxdiv_offset = 0x158,
+       .mux_shift = 8,
+       .mux_width = 3,
+
+       .div_shift = 0,
+       .div_width = 7,
+
+       .gate_offset = 0x318,
+       .gate_shift = 14,
+
+       .flags = RK_CLK_COMPOSITE_HAVE_MUX | RK_CLK_COMPOSITE_HAVE_GATE,
+};
+
+#define        ACLK_EMMC               240
+
+static const char *aclk_emmc_parents[] = {
+       "cpll_aclk_emmc_src",
+       "gpll_aclk_emmc_src"
+};
+
+static struct rk_clk_composite_def aclk_emmc = {
+       .clkdef = {
+               .id = ACLK_EMMC,
+               .name = "aclk_emmc",
+               .parent_names = aclk_emmc_parents,
+               .parent_cnt = nitems(aclk_emmc_parents),
+       },
+
+       .muxdiv_offset = 0x154,
+       .mux_shift = 7,
+       .mux_width = 1,
+
+       .div_shift = 0,
+       .div_width = 5,
+
+       .flags = RK_CLK_COMPOSITE_HAVE_MUX,
+};
+
 static struct rk_clk rk3399_clks[] = {
        {
                .type = RK3399_CLK_PLL,
@@ -1553,6 +1633,15 @@ static struct rk_clk rk3399_clks[] = {
                .type = RK_CLK_COMPOSITE,
                .clk.composite = &sclk_sdmmc,
        },
+
+       {
+               .type = RK_CLK_COMPOSITE,
+               .clk.composite = &sclk_emmc,
+       },
+       {
+               .type = RK_CLK_COMPOSITE,
+               .clk.composite = &aclk_emmc,
+       },
 };
 
 static int
@@ -1583,6 +1672,9 @@ rk3399_cru_attach(device_t dev)
 
        sc->clks = rk3399_clks;
        sc->nclks = nitems(rk3399_clks);
+
+       sc->reset_offset = 0x400;
+       sc->reset_num = 335;
 
        return (rk_cru_attach(dev));
 }

Modified: stable/12/sys/arm64/rockchip/clk/rk3399_pmucru.c
==============================================================================
--- stable/12/sys/arm64/rockchip/clk/rk3399_pmucru.c    Thu Nov 28 17:34:49 
2019        (r355175)
+++ stable/12/sys/arm64/rockchip/clk/rk3399_pmucru.c    Thu Nov 28 17:42:11 
2019        (r355176)
@@ -846,6 +846,9 @@ rk3399_pmucru_attach(device_t dev)
        sc->clks = rk3399_pmu_clks;
        sc->nclks = nitems(rk3399_pmu_clks);
 
+       sc->reset_offset = 0x110;
+       sc->reset_num = 30;
+
        return (rk_cru_attach(dev));
 }
 

Modified: stable/12/sys/arm64/rockchip/clk/rk_cru.c
==============================================================================
--- stable/12/sys/arm64/rockchip/clk/rk_cru.c   Thu Nov 28 17:34:49 2019        
(r355175)
+++ stable/12/sys/arm64/rockchip/clk/rk_cru.c   Thu Nov 28 17:42:11 2019        
(r355176)
@@ -112,20 +112,23 @@ static int
 rk_cru_reset_assert(device_t dev, intptr_t id, bool reset)
 {
        struct rk_cru_softc *sc;
+       uint32_t reg;
+       int bit;
        uint32_t val;
 
        sc = device_get_softc(dev);
 
-       if (id >= sc->nresets || sc->resets[id].offset == 0)
-               return (0);
+       if (id > sc->reset_num)
+               return (ENXIO);
 
+       reg = sc->reset_offset + id / 16 * 4;
+       bit = id % 16;
+
        mtx_lock(&sc->mtx);
-       val = CCU_READ4(sc, sc->resets[id].offset);
+       val = 0;
        if (reset)
-               val &= ~(1 << sc->resets[id].shift);
-       else
-               val |= 1 << sc->resets[id].shift;
-       CCU_WRITE4(sc, sc->resets[id].offset, val);
+               val = (1 << bit);
+       CCU_WRITE4(sc, reg, val | ((1 << bit) << 16));
        mtx_unlock(&sc->mtx);
 
        return (0);
@@ -135,18 +138,25 @@ static int
 rk_cru_reset_is_asserted(device_t dev, intptr_t id, bool *reset)
 {
        struct rk_cru_softc *sc;
+       uint32_t reg;
+       int bit;
        uint32_t val;
 
        sc = device_get_softc(dev);
 
-       if (id >= sc->nresets || sc->resets[id].offset == 0)
-               return (0);
+       if (id > sc->reset_num)
+               return (ENXIO);
+       reg = sc->reset_offset + id / 16 * 4;
+       bit = id % 16;
 
        mtx_lock(&sc->mtx);
-       val = CCU_READ4(sc, sc->resets[id].offset);
-       *reset = (val & (1 << sc->resets[id].shift)) != 0 ? false : true;
+       val = CCU_READ4(sc, reg);
        mtx_unlock(&sc->mtx);
 
+       *reset = true;
+       if (val & (1 << bit))
+               *reset = true;
+
        return (0);
 }
 
@@ -254,8 +264,8 @@ rk_cru_attach(device_t dev)
        clk_set_assigned(dev, node);
 
        /* If we have resets, register our self as a reset provider */
-       if (sc->resets)
-               hwreset_register_ofw_provider(dev);
+       /* if (sc->resets) */
+       /*      hwreset_register_ofw_provider(dev); */
 
        return (0);
 }

Modified: stable/12/sys/arm64/rockchip/clk/rk_cru.h
==============================================================================
--- stable/12/sys/arm64/rockchip/clk/rk_cru.h   Thu Nov 28 17:34:49 2019        
(r355175)
+++ stable/12/sys/arm64/rockchip/clk/rk_cru.h   Thu Nov 28 17:42:11 2019        
(r355176)
@@ -37,11 +37,6 @@
 #include <arm64/rockchip/clk/rk_clk_mux.h>
 #include <arm64/rockchip/clk/rk_clk_pll.h>
 
-struct rk_cru_reset {
-       uint32_t        offset;
-       uint32_t        shift;
-};
-
 struct rk_cru_gate {
        const char      *name;
        const char      *parent_name;
@@ -84,8 +79,8 @@ struct rk_cru_softc {
        struct clkdom           *clkdom;
        struct mtx              mtx;
        int                     type;
-       struct rk_cru_reset     *resets;
-       int                     nresets;
+       uint32_t                reset_offset;
+       uint32_t                reset_num;
        struct rk_cru_gate      *gates;
        int                     ngates;
        struct rk_clk           *clks;

Modified: stable/12/sys/arm64/rockchip/rk_gpio.c
==============================================================================
--- stable/12/sys/arm64/rockchip/rk_gpio.c      Thu Nov 28 17:34:49 2019        
(r355175)
+++ stable/12/sys/arm64/rockchip/rk_gpio.c      Thu Nov 28 17:42:11 2019        
(r355176)
@@ -388,9 +388,9 @@ rk_gpio_map_gpios(device_t bus, phandle_t dev, phandle
     pcell_t *gpios, uint32_t *pin, uint32_t *flags)
 {
 
-       /* The gpios are mapped as <gpio-phandle pin flags> */
-       *pin = gpios[1];
-       *flags = gpios[2];
+       /* The gpios are mapped as <pin flags> */
+       *pin = gpios[0];
+       *flags = gpios[1];
        return (0);
 }
 

Modified: stable/12/sys/arm64/rockchip/rk_pinctrl.c
==============================================================================
--- stable/12/sys/arm64/rockchip/rk_pinctrl.c   Thu Nov 28 17:34:49 2019        
(r355175)
+++ stable/12/sys/arm64/rockchip/rk_pinctrl.c   Thu Nov 28 17:42:11 2019        
(r355176)
@@ -34,11 +34,12 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/bus.h>
 
+#include <sys/gpio.h>
 #include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/rman.h>
 #include <sys/lock.h>
+#include <sys/module.h>
 #include <sys/mutex.h>
+#include <sys/rman.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -53,10 +54,9 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/extres/syscon/syscon.h>
 
+#include "gpio_if.h"
 #include "syscon_if.h"
 
-#include "opt_soc.h"
-
 struct rk_pinctrl_pin_drive {
        uint32_t        bank;
        uint32_t        subbank;
@@ -66,8 +66,8 @@ struct rk_pinctrl_pin_drive {
 };
 
 struct rk_pinctrl_bank {
-       uint32_t        bank_num;
-       uint32_t        subbank_num;
+       uint32_t        bank;
+       uint32_t        subbank;
        uint32_t        offset;
        uint32_t        nbits;
 };
@@ -81,6 +81,13 @@ struct rk_pinctrl_pin_fixup {
        uint32_t        mask;
 };
 
+struct rk_pinctrl_gpio {
+       uint32_t        bank;
+       char            *gpio_name;
+       device_t        gpio_dev;
+};
+
+
 struct rk_pinctrl_softc;
 
 struct rk_pinctrl_conf {
@@ -90,8 +97,10 @@ struct rk_pinctrl_conf {
        uint32_t                        npin_fixup;
        struct rk_pinctrl_pin_drive     *pin_drive;
        uint32_t                        npin_drive;
-       uint32_t                        (*get_pd_offset)(struct 
rk_pinctrl_softc *, uint32_t);
-       struct syscon                   *(*get_syscon)(struct rk_pinctrl_softc 
*, uint32_t);
+       struct rk_pinctrl_gpio          *gpio_bank;
+       uint32_t                        ngpio_bank;
+       uint32_t        (*get_pd_offset)(struct rk_pinctrl_softc *, uint32_t);
+       struct syscon   *(*get_syscon)(struct rk_pinctrl_softc *, uint32_t);
 };
 
 struct rk_pinctrl_softc {
@@ -102,218 +111,395 @@ struct rk_pinctrl_softc {
        struct rk_pinctrl_conf  *conf;
 };
 
+#define        RK_IOMUX(_bank, _subbank, _offset, _nbits)                      
\
+{                                                                      \
+       .bank = _bank,                                                  \
+       .subbank = _subbank,                                            \
+       .offset = _offset,                                              \
+       .nbits = _nbits,                                                \
+}
+
+#define        RK_PINFIX(_bank, _pin, _reg, _bit, _mask)                       
\
+{                                                                      \
+       .bank = _bank,                                                  \
+       .pin = _pin,                                                    \
+       .reg = _reg,                                                    \
+       .bit = _bit,                                                    \
+       .mask = _mask,                                                  \
+}
+
+#define        RK_PINDRIVE(_bank, _subbank, _offset, _value, _ma)              
\
+{                                                                      \
+       .bank = _bank,                                                  \
+       .subbank = _subbank,                                            \
+       .offset = _offset,                                              \
+       .value = _value,                                                \
+       .ma = _ma,                                                      \
+}
+#define        RK_GPIO(_bank, _name)                                           
\
+{                                                                      \
+       .bank = _bank,                                                  \
+       .gpio_name = _name,                                             \
+}
+
+static struct rk_pinctrl_gpio rk3288_gpio_bank[] = {
+       RK_GPIO(0, "gpio0"),
+       RK_GPIO(1, "gpio1"),
+       RK_GPIO(2, "gpio2"),
+       RK_GPIO(3, "gpio3"),
+       RK_GPIO(4, "gpio4"),
+       RK_GPIO(5, "gpio5"),
+       RK_GPIO(6, "gpio6"),
+       RK_GPIO(7, "gpio7"),
+       RK_GPIO(8, "gpio8"),
+};
+
+static struct rk_pinctrl_bank rk3288_iomux_bank[] = {
+       /*    bank sub  offs   nbits */
+       /* PMU */
+       RK_IOMUX(0, 0, 0x0084, 2),
+       RK_IOMUX(0, 1, 0x0088, 2),
+       RK_IOMUX(0, 2, 0x008C, 2),
+       /* GFR */
+       RK_IOMUX(1, 3, 0x000C, 2),
+       RK_IOMUX(2, 0, 0x0010, 2),
+       RK_IOMUX(2, 1, 0x0014, 2),
+       RK_IOMUX(2, 2, 0x0018, 2),
+       RK_IOMUX(2, 3, 0x001C, 2),
+       RK_IOMUX(3, 0, 0x0020, 2),
+       RK_IOMUX(3, 1, 0x0024, 2),
+       RK_IOMUX(3, 2, 0x0028, 2),
+       RK_IOMUX(3, 3, 0x002C, 4),
+       RK_IOMUX(4, 0, 0x0034, 4),
+       RK_IOMUX(4, 1, 0x003C, 4),
+       RK_IOMUX(4, 2, 0x0044, 2),
+       RK_IOMUX(4, 3, 0x0048, 2),
+       /* 5,0 - Empty */
+       RK_IOMUX(5, 1, 0x0050, 2),
+       RK_IOMUX(5, 2, 0x0054, 2),
+       /* 5,3 - Empty */
+       RK_IOMUX(6, 0, 0x005C, 2),
+       RK_IOMUX(6, 1, 0x0060, 2),
+       RK_IOMUX(6, 2, 0x0064, 2),
+       /* 6,3 - Empty */
+       RK_IOMUX(7, 0, 0x006C, 2),
+       RK_IOMUX(7, 1, 0x0070, 2),
+       RK_IOMUX(7, 2, 0x0074, 4),
+       /* 7,3 - Empty */
+       RK_IOMUX(8, 0, 0x0080, 2),
+       RK_IOMUX(8, 1, 0x0084, 2),
+       /* 8,2 - Empty */
+       /* 8,3 - Empty */
+
+};
+
+static struct rk_pinctrl_pin_fixup rk3288_pin_fixup[] = {
+};
+
+static struct rk_pinctrl_pin_drive rk3288_pin_drive[] = {
+       /*       bank sub offs val ma */
+       /* GPIO0A (PMU)*/
+       RK_PINDRIVE(0, 0, 0x070, 0, 2),
+       RK_PINDRIVE(0, 0, 0x070, 1, 4),
+       RK_PINDRIVE(0, 0, 0x070, 2, 8),
+       RK_PINDRIVE(0, 0, 0x070, 3, 12),
+
+       /* GPIO0B (PMU)*/
+       RK_PINDRIVE(0, 1, 0x074, 0, 2),
+       RK_PINDRIVE(0, 1, 0x074, 1, 4),
+       RK_PINDRIVE(0, 1, 0x074, 2, 8),
+       RK_PINDRIVE(0, 1, 0x074, 3, 12),
+
+       /* GPIO0C (PMU)*/
+       RK_PINDRIVE(0, 2, 0x078, 0, 2),
+       RK_PINDRIVE(0, 2, 0x078, 1, 4),
+       RK_PINDRIVE(0, 2, 0x078, 2, 8),
+       RK_PINDRIVE(0, 2, 0x078, 3, 12),
+
+       /* GPIO1D */
+       RK_PINDRIVE(1, 3, 0x1CC, 0, 2),
+       RK_PINDRIVE(1, 3, 0x1CC, 1, 4),
+       RK_PINDRIVE(1, 3, 0x1CC, 2, 8),
+       RK_PINDRIVE(1, 3, 0x1CC, 3, 12),
+
+       /* GPIO2A */
+       RK_PINDRIVE(2, 0, 0x1D0, 0, 2),
+       RK_PINDRIVE(2, 0, 0x1D0, 1, 4),
+       RK_PINDRIVE(2, 0, 0x1D0, 2, 8),
+       RK_PINDRIVE(2, 0, 0x1D0, 3, 12),
+
+       /* GPIO2B */
+       RK_PINDRIVE(2, 1, 0x1D4, 0, 2),
+       RK_PINDRIVE(2, 1, 0x1D4, 1, 4),
+       RK_PINDRIVE(2, 1, 0x1D4, 2, 8),
+       RK_PINDRIVE(2, 1, 0x1D4, 3, 12),
+
+       /* GPIO2C */
+       RK_PINDRIVE(2, 2, 0x1D8, 0, 2),
+       RK_PINDRIVE(2, 2, 0x1D8, 1, 4),
+       RK_PINDRIVE(2, 2, 0x1D8, 2, 8),
+       RK_PINDRIVE(2, 2, 0x1D8, 3, 12),
+
+       /* GPIO2D */
+       RK_PINDRIVE(2, 3, 0x1DC, 0, 2),
+       RK_PINDRIVE(2, 3, 0x1DC, 1, 4),
+       RK_PINDRIVE(2, 3, 0x1DC, 2, 8),
+       RK_PINDRIVE(2, 3, 0x1DC, 3, 12),
+
+       /* GPIO3A */
+       RK_PINDRIVE(3, 0, 0x1E0, 0, 2),
+       RK_PINDRIVE(3, 0, 0x1E0, 1, 4),
+       RK_PINDRIVE(3, 0, 0x1E0, 2, 8),
+       RK_PINDRIVE(3, 0, 0x1E0, 3, 12),
+
+       /* GPIO3B */
+       RK_PINDRIVE(3, 1, 0x1E4, 0, 2),
+       RK_PINDRIVE(3, 1, 0x1E4, 1, 4),
+       RK_PINDRIVE(3, 1, 0x1E4, 2, 8),
+       RK_PINDRIVE(3, 1, 0x1E4, 3, 12),
+
+       /* GPIO3C */
+       RK_PINDRIVE(3, 2, 0x1E8, 0, 2),
+       RK_PINDRIVE(3, 2, 0x1E8, 1, 4),
+       RK_PINDRIVE(3, 2, 0x1E8, 2, 8),
+       RK_PINDRIVE(3, 2, 0x1E8, 3, 12),
+
+       /* GPIO3D */
+       RK_PINDRIVE(3, 3, 0x1EC, 0, 2),
+       RK_PINDRIVE(3, 3, 0x1EC, 1, 4),
+       RK_PINDRIVE(3, 3, 0x1EC, 2, 8),
+       RK_PINDRIVE(3, 3, 0x1EC, 3, 12),
+
+       /* GPIO4A */
+       RK_PINDRIVE(4, 0, 0x1F0, 0, 2),
+       RK_PINDRIVE(4, 0, 0x1F0, 1, 4),
+       RK_PINDRIVE(4, 0, 0x1F0, 2, 8),
+       RK_PINDRIVE(4, 0, 0x1F0, 3, 12),
+
+       /* GPIO4B */
+       RK_PINDRIVE(4, 1, 0x1F4, 0, 2),
+       RK_PINDRIVE(4, 1, 0x1F4, 1, 4),
+       RK_PINDRIVE(4, 1, 0x1F4, 2, 8),
+       RK_PINDRIVE(4, 1, 0x1F4, 3, 12),
+
+       /* GPIO4C */
+       RK_PINDRIVE(4, 2, 0x1F8, 0, 2),
+       RK_PINDRIVE(4, 2, 0x1F8, 1, 4),
+       RK_PINDRIVE(4, 2, 0x1F8, 2, 8),
+       RK_PINDRIVE(4, 2, 0x1F8, 3, 12),
+
+       /* GPIO4D */
+       RK_PINDRIVE(4, 3, 0x1FC, 0, 2),
+       RK_PINDRIVE(4, 3, 0x1FC, 1, 4),
+       RK_PINDRIVE(4, 3, 0x1FC, 2, 8),
+       RK_PINDRIVE(4, 3, 0x1FC, 3, 12),
+
+       /* GPIO5B */
+       RK_PINDRIVE(5, 1, 0x204, 0, 2),
+       RK_PINDRIVE(5, 1, 0x204, 1, 4),
+       RK_PINDRIVE(5, 1, 0x204, 2, 8),
+       RK_PINDRIVE(5, 1, 0x204, 3, 12),
+
+       /* GPIO5C */
+       RK_PINDRIVE(5, 2, 0x208, 0, 2),
+       RK_PINDRIVE(5, 2, 0x208, 1, 4),
+       RK_PINDRIVE(5, 2, 0x208, 2, 8),
+       RK_PINDRIVE(5, 2, 0x208, 3, 12),
+
+       /* GPIO6A */
+       RK_PINDRIVE(6, 0, 0x210, 0, 2),
+       RK_PINDRIVE(6, 0, 0x210, 1, 4),
+       RK_PINDRIVE(6, 0, 0x210, 2, 8),
+       RK_PINDRIVE(6, 0, 0x210, 3, 12),
+
+       /* GPIO6B */
+       RK_PINDRIVE(6, 1, 0x214, 0, 2),
+       RK_PINDRIVE(6, 1, 0x214, 1, 4),
+       RK_PINDRIVE(6, 1, 0x214, 2, 8),
+       RK_PINDRIVE(6, 1, 0x214, 3, 12),
+
+       /* GPIO6C */
+       RK_PINDRIVE(6, 2, 0x218, 0, 2),
+       RK_PINDRIVE(6, 2, 0x218, 1, 4),
+       RK_PINDRIVE(6, 2, 0x218, 2, 8),
+       RK_PINDRIVE(6, 2, 0x218, 3, 12),
+
+       /* GPIO7A */
+       RK_PINDRIVE(7, 0, 0x220, 0, 2),
+       RK_PINDRIVE(7, 0, 0x220, 1, 4),
+       RK_PINDRIVE(7, 0, 0x220, 2, 8),
+       RK_PINDRIVE(7, 0, 0x220, 3, 12),
+
+       /* GPIO7B */
+       RK_PINDRIVE(7, 1, 0x224, 0, 2),
+       RK_PINDRIVE(7, 1, 0x224, 1, 4),
+       RK_PINDRIVE(7, 1, 0x224, 2, 8),
+       RK_PINDRIVE(7, 1, 0x224, 3, 12),
+
+       /* GPIO7C */
+       RK_PINDRIVE(7, 2, 0x228, 0, 2),
+       RK_PINDRIVE(7, 2, 0x228, 1, 4),
+       RK_PINDRIVE(7, 2, 0x228, 2, 8),
+       RK_PINDRIVE(7, 2, 0x228, 3, 12),
+
+       /* GPIO8A */
+       RK_PINDRIVE(8, 0, 0x230, 0, 2),
+       RK_PINDRIVE(8, 0, 0x230, 1, 4),
+       RK_PINDRIVE(8, 0, 0x230, 2, 8),
+       RK_PINDRIVE(8, 0, 0x230, 3, 12),
+
+       /* GPIO8B */
+       RK_PINDRIVE(8, 1, 0x234, 0, 2),
+       RK_PINDRIVE(8, 1, 0x234, 1, 4),
+       RK_PINDRIVE(8, 1, 0x234, 2, 8),
+       RK_PINDRIVE(8, 1, 0x234, 3, 12),
+};
+
+static uint32_t
+rk3288_get_pd_offset(struct rk_pinctrl_softc *sc, uint32_t bank)
+{
+       if (bank == 0)
+               return (0x064);         /* PMU */
+       return (0x130);
+}
+
+static struct syscon *
+rk3288_get_syscon(struct rk_pinctrl_softc *sc, uint32_t bank)
+{
+       if (bank == 0)
+               return (sc->pmu);
+       return (sc->grf);
+}
+
+struct rk_pinctrl_conf rk3288_conf = {
+       .iomux_conf = rk3288_iomux_bank,
+       .iomux_nbanks = nitems(rk3288_iomux_bank),
+       .pin_fixup = rk3288_pin_fixup,
+       .npin_fixup = nitems(rk3288_pin_fixup),
+       .pin_drive = rk3288_pin_drive,
+       .npin_drive = nitems(rk3288_pin_drive),
+       .gpio_bank = rk3288_gpio_bank,
+       .ngpio_bank = nitems(rk3288_gpio_bank),
+       .get_pd_offset = rk3288_get_pd_offset,
+       .get_syscon = rk3288_get_syscon,
+};
+
+static struct rk_pinctrl_gpio rk3328_gpio_bank[] = {
+       RK_GPIO(0, "gpio0"),
+       RK_GPIO(1, "gpio1"),
+       RK_GPIO(2, "gpio2"),
+       RK_GPIO(3, "gpio3"),
+};
+
 static struct rk_pinctrl_bank rk3328_iomux_bank[] = {
-       {
-               .bank_num = 0,
-               .subbank_num = 0,
-               .offset = 0x00,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 0,
-               .subbank_num = 1,
-               .offset = 0x04,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 0,
-               .subbank_num = 2,
-               .offset = 0x08,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 0,
-               .subbank_num = 3,
-               .offset = 0xc,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 0,
-               .offset = 0x10,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 1,
-               .offset = 0x14,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 2,
-               .offset = 0x18,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 3,
-               .offset = 0x1C,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 2,
-               .subbank_num = 0,
-               .offset = 0x20,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 2,
-               .subbank_num = 1,
-               .offset = 0x24,
-               .nbits = 3,
-       },
-       {
-               .bank_num = 2,
-               .subbank_num = 2,
-               .offset = 0x2c,
-               .nbits = 3,
-       },
-       {
-               .bank_num = 2,
-               .subbank_num = 3,
-               .offset = 0x34,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 3,
-               .subbank_num = 0,
-               .offset = 0x38,
-               .nbits = 3,
-       },
-       {
-               .bank_num = 3,
-               .subbank_num = 1,
-               .offset = 0x40,
-               .nbits = 3,
-       },
-       {
-               .bank_num = 3,
-               .subbank_num = 2,
-               .offset = 0x48,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 3,
-               .subbank_num = 3,
-               .offset = 0x4c,
-               .nbits = 2,
-       },
+       /*    bank sub offs nbits */
+       RK_IOMUX(0, 0, 0x0000, 2),
+       RK_IOMUX(0, 1, 0x0004, 2),
+       RK_IOMUX(0, 2, 0x0008, 2),
+       RK_IOMUX(0, 3, 0x000C, 2),
+       RK_IOMUX(1, 0, 0x0010, 2),
+       RK_IOMUX(1, 1, 0x0014, 2),
+       RK_IOMUX(1, 2, 0x0018, 2),
+       RK_IOMUX(1, 3, 0x001C, 2),
+       RK_IOMUX(2, 0, 0x0020, 2),
+       RK_IOMUX(2, 1, 0x0024, 3),
+       RK_IOMUX(2, 2, 0x002c, 3),
+       RK_IOMUX(2, 3, 0x0034, 2),
+       RK_IOMUX(3, 0, 0x0038, 3),
+       RK_IOMUX(3, 1, 0x0040, 3),
+       RK_IOMUX(3, 2, 0x0048, 2),
+       RK_IOMUX(3, 3, 0x004c, 2),
 };
 
 static struct rk_pinctrl_pin_fixup rk3328_pin_fixup[] = {
-       {
-               .bank = 2,
-               .pin = 12,
-               .reg = 0x24,
-               .bit = 8,
-               .mask = 0x300,
-       },
-       {
-               .bank = 2,
-               .pin = 15,
-               .reg = 0x28,
-               .bit = 0,
-               .mask = 0x7,
-       },
-       {
-               .bank = 2,
-               .pin = 23,
-               .reg = 0x30,
-               .bit = 14,
-               .mask = 0x6000,
-       },
+       /*      bank  pin reg  bit  mask */
+       RK_PINFIX(2, 12, 0x24,  8, 0x300),
+       RK_PINFIX(2, 15, 0x28,  0, 0x7),
+       RK_PINFIX(2, 23, 0x30, 14, 0x6000),
 };
 
-#define        RK_PINDRIVE(_bank, _subbank, _offset, _value, _ma)      \
-       {       \
-               .bank = _bank,          \
-               .subbank = _subbank,    \
-               .offset = _offset,      \
-               .value = _value,        \
-               .ma = _ma,              \
-       },
 
 static struct rk_pinctrl_pin_drive rk3328_pin_drive[] = {
-       RK_PINDRIVE(0, 0, 0x200, 0, 2)
-       RK_PINDRIVE(0, 0, 0x200, 1, 4)
-       RK_PINDRIVE(0, 0, 0x200, 2, 8)
-       RK_PINDRIVE(0, 0, 0x200, 3, 12)
+       /*       bank sub  offs val ma */
+       RK_PINDRIVE(0, 0, 0x200, 0, 2),
+       RK_PINDRIVE(0, 0, 0x200, 1, 4),
+       RK_PINDRIVE(0, 0, 0x200, 2, 8),
+       RK_PINDRIVE(0, 0, 0x200, 3, 12),
 
-       RK_PINDRIVE(0, 1, 0x204, 0, 2)
-       RK_PINDRIVE(0, 1, 0x204, 1, 4)
-       RK_PINDRIVE(0, 1, 0x204, 2, 8)
-       RK_PINDRIVE(0, 1, 0x204, 3, 12)
+       RK_PINDRIVE(0, 1, 0x204, 0, 2),
+       RK_PINDRIVE(0, 1, 0x204, 1, 4),
+       RK_PINDRIVE(0, 1, 0x204, 2, 8),
+       RK_PINDRIVE(0, 1, 0x204, 3, 12),
 
-       RK_PINDRIVE(0, 2, 0x208, 0, 2)
-       RK_PINDRIVE(0, 2, 0x208, 1, 4)
-       RK_PINDRIVE(0, 2, 0x208, 2, 8)
-       RK_PINDRIVE(0, 2, 0x208, 3, 12)
+       RK_PINDRIVE(0, 2, 0x208, 0, 2),
+       RK_PINDRIVE(0, 2, 0x208, 1, 4),
+       RK_PINDRIVE(0, 2, 0x208, 2, 8),
+       RK_PINDRIVE(0, 2, 0x208, 3, 12),
 
-       RK_PINDRIVE(0, 3, 0x20C, 0, 2)
-       RK_PINDRIVE(0, 3, 0x20C, 1, 4)
-       RK_PINDRIVE(0, 3, 0x20C, 2, 8)
-       RK_PINDRIVE(0, 3, 0x20C, 3, 12)
+       RK_PINDRIVE(0, 3, 0x20C, 0, 2),
+       RK_PINDRIVE(0, 3, 0x20C, 1, 4),
+       RK_PINDRIVE(0, 3, 0x20C, 2, 8),
+       RK_PINDRIVE(0, 3, 0x20C, 3, 12),
 
-       RK_PINDRIVE(1, 0, 0x210, 0, 2)
-       RK_PINDRIVE(1, 0, 0x210, 1, 4)
-       RK_PINDRIVE(1, 0, 0x210, 2, 8)
-       RK_PINDRIVE(1, 0, 0x210, 3, 12)
+       RK_PINDRIVE(1, 0, 0x210, 0, 2),
+       RK_PINDRIVE(1, 0, 0x210, 1, 4),
+       RK_PINDRIVE(1, 0, 0x210, 2, 8),
+       RK_PINDRIVE(1, 0, 0x210, 3, 12),
 
-       RK_PINDRIVE(1, 1, 0x214, 0, 2)
-       RK_PINDRIVE(1, 1, 0x214, 1, 4)
-       RK_PINDRIVE(1, 1, 0x214, 2, 8)
-       RK_PINDRIVE(1, 1, 0x214, 3, 12)
+       RK_PINDRIVE(1, 1, 0x214, 0, 2),
+       RK_PINDRIVE(1, 1, 0x214, 1, 4),
+       RK_PINDRIVE(1, 1, 0x214, 2, 8),
+       RK_PINDRIVE(1, 1, 0x214, 3, 12),
 
-       RK_PINDRIVE(1, 2, 0x218, 0, 2)
-       RK_PINDRIVE(1, 2, 0x218, 1, 4)
-       RK_PINDRIVE(1, 2, 0x218, 2, 8)
-       RK_PINDRIVE(1, 2, 0x218, 3, 12)
+       RK_PINDRIVE(1, 2, 0x218, 0, 2),
+       RK_PINDRIVE(1, 2, 0x218, 1, 4),
+       RK_PINDRIVE(1, 2, 0x218, 2, 8),
+       RK_PINDRIVE(1, 2, 0x218, 3, 12),
 
-       RK_PINDRIVE(1, 3, 0x21C, 0, 2)
-       RK_PINDRIVE(1, 3, 0x21C, 1, 4)
-       RK_PINDRIVE(1, 3, 0x21C, 2, 8)
-       RK_PINDRIVE(1, 3, 0x21C, 3, 12)
+       RK_PINDRIVE(1, 3, 0x21C, 0, 2),
+       RK_PINDRIVE(1, 3, 0x21C, 1, 4),
+       RK_PINDRIVE(1, 3, 0x21C, 2, 8),
+       RK_PINDRIVE(1, 3, 0x21C, 3, 12),
 
-       RK_PINDRIVE(2, 0, 0x220, 0, 2)
-       RK_PINDRIVE(2, 0, 0x220, 1, 4)
-       RK_PINDRIVE(2, 0, 0x220, 2, 8)
-       RK_PINDRIVE(2, 0, 0x220, 3, 12)
+       RK_PINDRIVE(2, 0, 0x220, 0, 2),
+       RK_PINDRIVE(2, 0, 0x220, 1, 4),
+       RK_PINDRIVE(2, 0, 0x220, 2, 8),
+       RK_PINDRIVE(2, 0, 0x220, 3, 12),
 
-       RK_PINDRIVE(2, 1, 0x224, 0, 2)
-       RK_PINDRIVE(2, 1, 0x224, 1, 4)
-       RK_PINDRIVE(2, 1, 0x224, 2, 8)
-       RK_PINDRIVE(2, 1, 0x224, 3, 12)
+       RK_PINDRIVE(2, 1, 0x224, 0, 2),
+       RK_PINDRIVE(2, 1, 0x224, 1, 4),
+       RK_PINDRIVE(2, 1, 0x224, 2, 8),
+       RK_PINDRIVE(2, 1, 0x224, 3, 12),
 
-       RK_PINDRIVE(2, 2, 0x228, 0, 2)
-       RK_PINDRIVE(2, 2, 0x228, 1, 4)
-       RK_PINDRIVE(2, 2, 0x228, 2, 8)
-       RK_PINDRIVE(2, 2, 0x228, 3, 12)
+       RK_PINDRIVE(2, 2, 0x228, 0, 2),
+       RK_PINDRIVE(2, 2, 0x228, 1, 4),
+       RK_PINDRIVE(2, 2, 0x228, 2, 8),
+       RK_PINDRIVE(2, 2, 0x228, 3, 12),
 
-       RK_PINDRIVE(2, 3, 0x22C, 0, 2)
-       RK_PINDRIVE(2, 3, 0x22C, 1, 4)
-       RK_PINDRIVE(2, 3, 0x22C, 2, 8)
-       RK_PINDRIVE(2, 3, 0x22C, 3, 12)
+       RK_PINDRIVE(2, 3, 0x22C, 0, 2),
+       RK_PINDRIVE(2, 3, 0x22C, 1, 4),
+       RK_PINDRIVE(2, 3, 0x22C, 2, 8),
+       RK_PINDRIVE(2, 3, 0x22C, 3, 12),
 
-       RK_PINDRIVE(3, 0, 0x230, 0, 2)
-       RK_PINDRIVE(3, 0, 0x230, 1, 4)
-       RK_PINDRIVE(3, 0, 0x230, 2, 8)
-       RK_PINDRIVE(3, 0, 0x230, 3, 12)
+       RK_PINDRIVE(3, 0, 0x230, 0, 2),
+       RK_PINDRIVE(3, 0, 0x230, 1, 4),
+       RK_PINDRIVE(3, 0, 0x230, 2, 8),
+       RK_PINDRIVE(3, 0, 0x230, 3, 12),
 
-       RK_PINDRIVE(3, 1, 0x234, 0, 2)
-       RK_PINDRIVE(3, 1, 0x234, 1, 4)
-       RK_PINDRIVE(3, 1, 0x234, 2, 8)
-       RK_PINDRIVE(3, 1, 0x234, 3, 12)
+       RK_PINDRIVE(3, 1, 0x234, 0, 2),
+       RK_PINDRIVE(3, 1, 0x234, 1, 4),
+       RK_PINDRIVE(3, 1, 0x234, 2, 8),
+       RK_PINDRIVE(3, 1, 0x234, 3, 12),
 
-       RK_PINDRIVE(3, 2, 0x238, 0, 2)
-       RK_PINDRIVE(3, 2, 0x238, 1, 4)
-       RK_PINDRIVE(3, 2, 0x238, 2, 8)
-       RK_PINDRIVE(3, 2, 0x238, 3, 12)
+       RK_PINDRIVE(3, 2, 0x238, 0, 2),
+       RK_PINDRIVE(3, 2, 0x238, 1, 4),
+       RK_PINDRIVE(3, 2, 0x238, 2, 8),
+       RK_PINDRIVE(3, 2, 0x238, 3, 12),
 
-       RK_PINDRIVE(3, 3, 0x23C, 0, 2)
-       RK_PINDRIVE(3, 3, 0x23C, 1, 4)
-       RK_PINDRIVE(3, 3, 0x23C, 2, 8)
-       RK_PINDRIVE(3, 3, 0x23C, 3, 12)
+       RK_PINDRIVE(3, 3, 0x23C, 0, 2),
+       RK_PINDRIVE(3, 3, 0x23C, 1, 4),
+       RK_PINDRIVE(3, 3, 0x23C, 2, 8),
+       RK_PINDRIVE(3, 3, 0x23C, 3, 12),
 };
 
 static uint32_t
@@ -335,171 +521,83 @@ struct rk_pinctrl_conf rk3328_conf = {
        .npin_fixup = nitems(rk3328_pin_fixup),
        .pin_drive = rk3328_pin_drive,
        .npin_drive = nitems(rk3328_pin_drive),
+       .gpio_bank = rk3328_gpio_bank,
+       .ngpio_bank = nitems(rk3328_gpio_bank),
        .get_pd_offset = rk3328_get_pd_offset,
        .get_syscon = rk3328_get_syscon,
 };
 
+static struct rk_pinctrl_gpio rk3399_gpio_bank[] = {
+       RK_GPIO(0, "gpio0"),
+       RK_GPIO(1, "gpio1"),
+       RK_GPIO(2, "gpio2"),
+       RK_GPIO(3, "gpio3"),
+       RK_GPIO(4, "gpio4"),
+};
+
 static struct rk_pinctrl_bank rk3399_iomux_bank[] = {
-       {
-               .bank_num = 0,
-               .subbank_num = 0,
-               .offset = 0x00,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 0,
-               .subbank_num = 1,
-               .offset = 0x04,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 0,
-               .subbank_num = 2,
-               .offset = 0x08,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 0,
-               .subbank_num = 3,
-               .offset = 0x0c,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 0,
-               .offset = 0x10,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 1,
-               .offset = 0x14,
-               .nbits = 2,
-       },
-       {
-               .bank_num = 1,
-               .subbank_num = 2,
-               .offset = 0x18,
-               .nbits = 2,

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to