Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149810257
D53993.id167308.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
235 KB
Referenced Files
None
Subscribers
None
D53993.id167308.diff
View Options
diff --git a/sys/arm64/rockchip/rk3568_pcie.c b/sys/arm64/rockchip/rk3568_pcie.c
--- a/sys/arm64/rockchip/rk3568_pcie.c
+++ b/sys/arm64/rockchip/rk3568_pcie.c
@@ -95,10 +95,11 @@
struct resource *irq_res;
void *irq_handle;
phandle_t node;
- struct gpiobus_pin *reset_gpio;
- clk_t aclk_mst, aclk_slv, aclk_dbi, pclk, aux;
+ clk_t aclk_mst, aclk_slv, aclk_dbi, pclk, aux, pipe;
regulator_t regulator;
- hwreset_t hwreset;
+ hwreset_t rst_pipe;
+ hwreset_t rst_power;
+ struct gpiobus_pin *rst_gpio;
phy_t phy;
};
@@ -121,7 +122,7 @@
{
struct rk3568_pcie_softc *sc = device_get_softc(dev);
uint32_t val;
-
+
val = bus_read_4(sc->apb_res, PCIE_CLIENT_LTSSM_STATUS);
if (((val & (RDLH_LINK_UP | SMLH_LINK_UP)) ==
(RDLH_LINK_UP | SMLH_LINK_UP)) &&
@@ -140,27 +141,39 @@
bool status;
/* Assert PCIe reset */
- if (sc->reset_gpio != NULL) {
- if (gpio_pin_setflags(sc->reset_gpio, GPIO_PIN_OUTPUT)) {
- device_printf(dev, "Could not setup PCIe reset\n");
+ if (sc->rst_gpio != NULL) {
+ err = gpio_pin_setflags(sc->rst_gpio, GPIO_PIN_OUTPUT);
+ if (err != 0) {
+ device_printf(dev, "Could not setup PCIe reset: %d\n",
+ err);
return (ENXIO);
}
- if (gpio_pin_set_active(sc->reset_gpio, true)) {
- device_printf(dev, "Could not set PCIe reset\n");
+ err = gpio_pin_set_active(sc->rst_gpio, true);
+ if (err != 0) {
+ device_printf(dev, "Could not set PCIe reset: %d\n",
+ err);
return (ENXIO);
}
}
/* Assert reset */
- if (hwreset_assert(sc->hwreset)) {
- device_printf(dev, "Could not assert reset\n");
+ err = hwreset_assert(sc->rst_pipe);
+ if (err != 0) {
+ device_printf(dev, "Could not assert 'pipe' reset: %d\n", err);
+ return (ENXIO);
+ }
+ err = hwreset_assert(sc->rst_power);
+ if (err != 0) {
+ device_printf(dev, "Could not assert 'power' reset: %d\n", err);
return (ENXIO);
}
/* Powerup PCIe */
if (sc->regulator != NULL) {
- if (regulator_enable(sc->regulator)) {
- device_printf(dev, "Cannot enable regulator\n");
+ err = regulator_enable(sc->regulator);
+ if (err != 0) {
+ device_printf(dev, "Cannot enable regulator: %d\n",
+ err);
return (ENXIO);
}
}
@@ -171,31 +184,53 @@
return (ENXIO);
}
- /* Deassert reset */
- if (hwreset_deassert(sc->hwreset)) {
- device_printf(dev, "Could not deassert reset\n");
- return (ENXIO);
- }
/* Enable clocks */
- if ((err = clk_enable(sc->aclk_mst))) {
- device_printf(dev, "Could not enable aclk_mst clk\n");
+ err = clk_enable(sc->aclk_mst);
+ if (err != 0) {
+ device_printf(dev, "Could not enable 'aclk_mst' clk: %d\n",
+ err);
return (ENXIO);
}
- if ((err = clk_enable(sc->aclk_slv))) {
- device_printf(dev, "Could not enable aclk_slv clk\n");
+ err = clk_enable(sc->aclk_slv);
+ if (err != 0) {
+ device_printf(dev, "Could not enable 'aclk_slv' clk: %d\n",
+ err);
return (ENXIO);
}
- if ((err = clk_enable(sc->aclk_dbi))) {
- device_printf(dev, "Could not enable aclk_dbi clk\n");
+ err = clk_enable(sc->aclk_dbi);
+ if (err != 0) {
+ device_printf(dev, "Could not enable 'aclk_dbi' clk; %d\n",
+ err);
return (ENXIO);
}
- if ((err = clk_enable(sc->pclk))) {
- device_printf(dev, "Could not enable pclk clk\n");
+ err = clk_enable(sc->pclk);
+ if (err != 0) {
+ device_printf(dev, "Could not enable 'pclk' clk: %d\n", err);
return (ENXIO);
}
- if ((err = clk_enable(sc->aux))) {
- device_printf(dev, "Could not enable aux clk\n");
+ err = clk_enable(sc->aux);
+ if (err != 0) {
+ device_printf(dev, "Could not enable 'aux' clk: %d\n", err);
+ return (ENXIO);
+ }
+ err = clk_enable(sc->pipe);
+ if (err != 0) {
+ device_printf(dev, "Could not enable 'pipe' clk: %d\n", err);
+ return (ENXIO);
+ }
+
+ /* Deassert reset */
+ err = hwreset_deassert(sc->rst_pipe);
+ if (err != 0) {
+ device_printf(dev, "Could not deassert 'pipe' reset: %d\n",
+ err);
+ return (ENXIO);
+ }
+ err = hwreset_deassert(sc->rst_power);
+ if (err != 0) {
+ device_printf(dev, "Could not deassert 'power' reset: %d\n",
+ err);
return (ENXIO);
}
@@ -205,9 +240,12 @@
bus_write_4(sc->apb_res, PCIE_CLIENT_GENERAL_CON,
(DEVICE_TYPE_MASK << 16) | DEVICE_TYPE_RC);
- /* Deassert PCIe reset */
- if ((err = gpio_pin_set_active(sc->reset_gpio, false)))
- device_printf(dev, "reset_gpio set failed\n");
+ /* Deassert PCIe bus reset */
+ err = gpio_pin_set_active(sc->rst_gpio, false);
+ if (err != 0) {
+ device_printf(dev, "'reset_gpio' set failed: %d\n", err);
+ return (ENXIO);
+ }
/* Start Link Training and Status State Machine (LTSSM) */
bus_write_4(sc->apb_res, PCIE_CLIENT_GENERAL_CON,
@@ -216,9 +254,11 @@
DELAY(100000);
/* Release PCIe reset */
- if (sc->reset_gpio != NULL) {
- if (gpio_pin_set_active(sc->reset_gpio, true)) {
- device_printf(dev, "Could not release PCIe reset");
+ if (sc->rst_gpio != NULL) {
+ err = gpio_pin_set_active(sc->rst_gpio, true);
+ if (err != 0) {
+ device_printf(dev, "Could not release PCIe reset: %d",
+ err);
return (ENXIO);
}
}
@@ -235,7 +275,8 @@
}
}
- if ((err = pci_dw_init(dev)))
+ err = pci_dw_init(dev);
+ if (err != 0)
return (ENXIO);
/* Delay to have things settle */
@@ -273,8 +314,10 @@
clk_release(sc->aclk_slv);
if (sc->aclk_mst)
clk_release(sc->aclk_mst);
- if (sc->hwreset)
- hwreset_release(sc->hwreset);
+ if (sc->rst_power)
+ hwreset_release(sc->rst_power);
+ if (sc->rst_pipe)
+ hwreset_release(sc->rst_pipe);
if (sc->regulator)
regulator_release(sc->regulator);
if (sc->irq_res)
@@ -293,96 +336,123 @@
rk3568_pcie_attach(device_t dev)
{
struct rk3568_pcie_softc *sc = device_get_softc(dev);
- int error;
+ int err;
sc->dev = dev;
sc->node = ofw_bus_get_node(dev);
/* Setup resources */
- if ((error = ofw_bus_find_string_index(sc->node, "reg-names", "apb",
- &sc->apb_rid))) {
- device_printf(dev, "Cannot get APB memory: %d\n", error);
+ err = ofw_bus_find_string_index(sc->node, "reg-names", "apb",
+ &sc->apb_rid);
+ if (err != 0) {
+ device_printf(dev, "Cannot get APB memory: %d\n", err);
goto fail;
}
- if (!(sc->apb_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &sc->apb_rid, RF_ACTIVE))) {
+
+ sc->apb_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
+ &sc->apb_rid, RF_ACTIVE);
+ if (sc->apb_res == NULL) {
device_printf(dev, "Cannot allocate APB resource\n");
goto fail;
}
- if ((error = ofw_bus_find_string_index(sc->node, "reg-names", "dbi",
- &sc->dbi_rid))) {
- device_printf(dev, "Cannot get DBI memory: %d\n", error);
+
+ err = ofw_bus_find_string_index(sc->node, "reg-names", "dbi",
+ &sc->dbi_rid);
+ if (err != 0) {
+ device_printf(dev, "Cannot get DBI memory: %d\n", err);
goto fail;
}
- if (!(sc->dw_sc.dbi_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &sc->dbi_rid, RF_ACTIVE))) {
+
+ sc->dw_sc.dbi_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
+ &sc->dbi_rid, RF_ACTIVE);
+ if (sc->dw_sc.dbi_res == NULL) {
device_printf(dev, "Cannot allocate DBI resource\n");
goto fail;
}
- if (!(sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
- &sc->irq_rid, RF_ACTIVE | RF_SHAREABLE))) {
+ sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
+ &sc->irq_rid, RF_ACTIVE | RF_SHAREABLE);
+ if (sc->irq_res == NULL) {
device_printf(dev, "Cannot allocate IRQ resource\n");
goto fail;
}
/* Get regulator if present */
- error = regulator_get_by_ofw_property(dev, 0, "vpcie3v3-supply",
+ err = regulator_get_by_ofw_property(dev, 0, "vpcie3v3-supply",
&sc->regulator);
- if (error != 0 && error != ENOENT) {
- device_printf(dev, "Cannot get regulator\n");
+ if (err != 0 && err != ENOENT) {
+ device_printf(dev, "Cannot get regulator: %d\n", err);
goto fail;
}
/* Get reset */
- if (hwreset_get_by_ofw_name(dev, 0, "pipe", &sc->hwreset)) {
- device_printf(dev, "Can not get reset\n");
+ err = hwreset_get_by_ofw_name(dev, 0, "pipe", &sc->rst_pipe);
+ if (err != 0) {
+ device_printf(dev, "Cannot get reset 'pipe': %d\n", err);
+ goto fail;
+ }
+ err = hwreset_get_by_ofw_name(dev, 0, "pwr", &sc->rst_power);
+ if (err != 0) {
+ device_printf(dev, "Cannot get reset 'pwr': %d\n", err);
goto fail;
}
/* Get GPIO reset */
- error = gpio_pin_get_by_ofw_property(dev, sc->node, "reset-gpios",
- &sc->reset_gpio);
- if (error != 0 && error != ENOENT) {
- device_printf(dev, "Cannot get reset-gpios\n");
+ err = gpio_pin_get_by_ofw_property(dev, sc->node, "reset-gpios",
+ &sc->rst_gpio);
+ if (err != 0 && err != ENOENT) {
+ device_printf(dev, "Cannot get reset-gpios: %d\n", err);
goto fail;
}
/* Get clocks */
- if (clk_get_by_ofw_name(dev, 0, "aclk_mst", &sc->aclk_mst)) {
- device_printf(dev, "Can not get aclk_mst clk\n");
+ err = clk_get_by_ofw_name(dev, 0, "aclk_mst", &sc->aclk_mst);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'aclk_mst' clk: %d\n", err);
+ goto fail;
+ }
+ err = clk_get_by_ofw_name(dev, 0, "aclk_slv", &sc->aclk_slv);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'aclk_slv' clk: %d\n", err);
goto fail;
}
- if (clk_get_by_ofw_name(dev, 0, "aclk_slv", &sc->aclk_slv)) {
- device_printf(dev, "Can not get aclk_slv clk\n");
+ err = clk_get_by_ofw_name(dev, 0, "aclk_dbi", &sc->aclk_dbi);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'aclk_dbi' clk: %d\n", err);
goto fail;
}
- if (clk_get_by_ofw_name(dev, 0, "aclk_dbi", &sc->aclk_dbi)) {
- device_printf(dev, "Can not get aclk_dbi clk\n");
+ err = clk_get_by_ofw_name(dev, 0, "pclk", &sc->pclk);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'pclk' clk: %d\n", err);
goto fail;
}
- if (clk_get_by_ofw_name(dev, 0, "pclk", &sc->pclk)) {
- device_printf(dev, "Can not get pclk clk\n");
+ err = clk_get_by_ofw_name(dev, 0, "aux", &sc->aux);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'aux' clk: %d\n", err);
goto fail;
}
- if (clk_get_by_ofw_name(dev, 0, "aux", &sc->aux)) {
- device_printf(dev, "Can not get aux clk\n");
+ err = clk_get_by_ofw_name(dev, 0, "pipe", &sc->pipe);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'pipe' clk: %d\n", err);
goto fail;
}
/* Get PHY */
- if (phy_get_by_ofw_name(dev, 0, "pcie-phy", &sc->phy)) {
- device_printf(dev, "Cannot get 'pcie-phy'\n");
+ err = phy_get_by_ofw_name(dev, 0, "pcie-phy", &sc->phy);
+ if (err != 0) {
+ device_printf(dev, "Cannot get 'pcie-phy' phy: %d\n", err);
goto fail;
}
- if ((error = rk3568_pcie_init_soc(dev)))
+ err = rk3568_pcie_init_soc(dev);
+ if (err != 0)
goto fail;
/* Enable interrupt */
- if ((bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
- NULL, rk3568_intr, sc, &sc->irq_handle))) {
- device_printf(dev, "unable to setup interrupt\n");
+ err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
+ NULL, rk3568_intr, sc, &sc->irq_handle);
+ if (err != 0) {
+ device_printf(dev, "Unable to setup interrupt: %d\n", err);
goto fail;
}
diff --git a/sys/arm64/rockchip/rk_gpio.c b/sys/arm64/rockchip/rk_gpio.c
--- a/sys/arm64/rockchip/rk_gpio.c
+++ b/sys/arm64/rockchip/rk_gpio.c
@@ -315,7 +315,8 @@
* RK3328 and RK3399 doesn't have. So choose the
* version based on parent's compat string.
*/
- if (ofw_bus_node_is_compatible(parent_node, "rockchip,rk3568-pinctrl"))
+ if (ofw_bus_node_is_compatible(parent_node, "rockchip,rk3568-pinctrl") ||
+ ofw_bus_node_is_compatible(parent_node, "rockchip,rk3588-pinctrl"))
sc->version = RK_GPIO_TYPE_V2;
else
sc->version = RK_GPIO_TYPE_V1;
diff --git a/sys/arm64/rockchip/rk_grf.c b/sys/arm64/rockchip/rk_grf.c
--- a/sys/arm64/rockchip/rk_grf.c
+++ b/sys/arm64/rockchip/rk_grf.c
@@ -52,6 +52,20 @@
{"rockchip,rk3568-pipe-grf", 1},
{"rockchip,rk3568-pipe-phy-grf", 1},
{"rockchip,rk3568-pcie3-phy-grf", 1},
+ {"rockchip,rk3588-pmugrf", 1},
+ {"rockchip,rk3588-sys-grf", 1},
+ {"rockchip,rk3588-php-grf", 1},
+ {"rockchip,rk3588-pmu", 1},
+ {"rockchip,rk3588-vop-grf", 1},
+ {"rockchip,rk3588-vo1-grf", 1},
+ {"rockchip,rk3588-vo2-grf", 1},
+ {"rockchip,rk3588-usb-grf", 1},
+ {"rockchip,rk3588-usb2phy-grf", 1},
+ {"rockchip,rk3588-pcie3-phy-grf", 1},
+ {"rockchip,rk3588-pipe-phy-grf", 1},
+ {"rockchip,rk3588-usbdpphy-grf", 1},
+ {"rockchip,rk3588-hdptxphy-grf", 1},
+ {"rockchip,rk3588-ioc", 1},
{NULL, 0}
};
diff --git a/sys/arm64/rockchip/rk_pinctrl.c b/sys/arm64/rockchip/rk_pinctrl.c
--- a/sys/arm64/rockchip/rk_pinctrl.c
+++ b/sys/arm64/rockchip/rk_pinctrl.c
@@ -50,10 +50,18 @@
#include <dev/syscon/syscon.h>
+#include <contrib/device-tree/include/dt-bindings/pinctrl/rockchip.h>
+
#include "gpio_if.h"
#include "syscon_if.h"
#include "fdt_pinctrl_if.h"
+#define RK_CHIP_RK3288 1
+#define RK_CHIP_RK3328 2
+#define RK_CHIP_RK3399 3
+#define RK_CHIP_RK3568 4
+#define RK_CHIP_RK3588 5
+
struct rk_pinctrl_pin_drive {
uint32_t bank;
uint32_t subbank;
@@ -87,6 +95,7 @@
struct rk_pinctrl_softc;
struct rk_pinctrl_conf {
+ int chip;
struct rk_pinctrl_bank *iomux_conf;
uint32_t iomux_nbanks;
struct rk_pinctrl_pin_fixup *pin_fixup;
@@ -96,10 +105,15 @@
struct rk_pinctrl_gpio *gpio_bank;
uint32_t ngpio_bank;
uint32_t (*get_pd_offset)(struct rk_pinctrl_softc *, uint32_t);
+ int (*get_pd_reg)(struct rk_pinctrl_softc *, uint32_t,
+ uint32_t, uint32_t *, uint32_t *, uint32_t *);
+
struct syscon *(*get_syscon)(struct rk_pinctrl_softc *, uint32_t);
int (*parse_bias)(phandle_t, int);
int (*resolv_bias_value)(int, int);
int (*get_bias_value)(int, int);
+ int (*get_bias_reg)(struct rk_pinctrl_softc *, uint32_t,
+ uint32_t, uint32_t *, uint32_t *, uint32_t *);
};
struct rk_pinctrl_softc {
@@ -415,6 +429,7 @@
}
struct rk_pinctrl_conf rk3288_conf = {
+ .chip = RK_CHIP_RK3288,
.iomux_conf = rk3288_iomux_bank,
.iomux_nbanks = nitems(rk3288_iomux_bank),
.pin_fixup = rk3288_pin_fixup,
@@ -560,6 +575,7 @@
}
struct rk_pinctrl_conf rk3328_conf = {
+ .chip = RK_CHIP_RK3328,
.iomux_conf = rk3328_iomux_bank,
.iomux_nbanks = nitems(rk3328_iomux_bank),
.pin_fixup = rk3328_pin_fixup,
@@ -749,6 +765,7 @@
}
struct rk_pinctrl_conf rk3399_conf = {
+ .chip = RK_CHIP_RK3399,
.iomux_conf = rk3399_iomux_bank,
.iomux_nbanks = nitems(rk3399_iomux_bank),
.pin_fixup = rk3399_pin_fixup,
@@ -986,6 +1003,7 @@
}
struct rk_pinctrl_conf rk3568_conf = {
+ .chip = RK_CHIP_RK3568,
.iomux_conf = rk3568_iomux_bank,
.iomux_nbanks = nitems(rk3568_iomux_bank),
.pin_fixup = rk3568_pin_fixup,
@@ -1001,36 +1019,328 @@
.get_bias_value = rk3568_get_bias_value,
};
+
+static struct rk_pinctrl_bank rk3588_iomux_bank[] = {
+ /* bank sub offs nbits */
+ RK_IOMUX(0, 0, 0x0000, 4), /* PMU1_IOC */
+ RK_IOMUX(0, 1, 0x0008, 4), /* GPIO0B_L in PMU1, GPIO0B_H in PMU2 */
+ RK_IOMUX(0, 2, 0x4004, 4), /* PMU2_IOC + BUS_IOC */
+ RK_IOMUX(0, 3, 0x400C, 4),
+
+ RK_IOMUX(1, 0, 0x8020, 4), /* BUS_IOC */
+ RK_IOMUX(1, 1, 0x8028, 4),
+ RK_IOMUX(1, 2, 0x8030, 4),
+ RK_IOMUX(1, 3, 0x8038, 4),
+
+ RK_IOMUX(2, 0, 0x8040, 4),
+ RK_IOMUX(2, 1, 0x8048, 4),
+ RK_IOMUX(2, 2, 0x8050, 4),
+ RK_IOMUX(2, 3, 0x8058, 4),
+
+ RK_IOMUX(3, 0, 0x8060, 4),
+ RK_IOMUX(3, 1, 0x8068, 4),
+ RK_IOMUX(3, 2, 0x8070, 4),
+ RK_IOMUX(3, 3, 0x8078, 4),
+
+ RK_IOMUX(4, 0, 0x8080, 4),
+ RK_IOMUX(4, 1, 0x8084, 4),
+ RK_IOMUX(4, 2, 0x8090, 4),
+ RK_IOMUX(4, 3, 0x8098, 4),
+};
+
+static struct rk_pinctrl_pin_fixup rk3588_pin_fixup[] = {
+ /* bank pin reg bit mask */
+ RK_PINFIX(0, 12, 0x4004, 0, 0x000F),
+ RK_PINFIX(0, 13, 0x4004, 4, 0x00F0),
+ RK_PINFIX(0, 14, 0x4004, 8, 0x0F00),
+ RK_PINFIX(0, 15, 0x4004, 12, 0xF000),
+};
+
+static struct rk_pinctrl_gpio rk3588_gpio_bank[] = {
+ RK_GPIO(0, "gpio0"),
+ RK_GPIO(1, "gpio1"),
+ RK_GPIO(2, "gpio2"),
+ RK_GPIO(3, "gpio3"),
+ RK_GPIO(4, "gpio4"),
+};
+static struct syscon *
+rk3588_get_syscon(struct rk_pinctrl_softc *sc, uint32_t bank)
+{
+
+ return (sc->grf);
+}
+
+/* FDT pinctrl property to register value */
+static int
+rk3588_parse_bias(phandle_t node, int bank)
+{
+
+ if (OF_hasprop(node, "bias-disable"))
+ return (0);
+ if (OF_hasprop(node, "bias-pull-up"))
+ return (3);
+ if (OF_hasprop(node, "bias-pull-down"))
+ return (1);
+ return (-1);
+}
+
+/* Register value to GPIO flags */
+static int
+rk3588_resolv_bias_value(int bank, int bias)
+{
+
+ if (bias == 3)
+ return (GPIO_PIN_PULLUP);
+ if (bias == 1)
+ return (GPIO_PIN_PULLDOWN);
+ return (0);
+}
+
+/* GPIO flags to register value*/
+static int
+rk3588_get_bias_value(int bank, int bias)
+{
+
+ if (bias & GPIO_PIN_PULLUP)
+ return (3);
+ if (bias & GPIO_PIN_PULLDOWN)
+ return (2);
+ return (0);
+}
+
+#define RK3588_PMU1_IOC 0x0000
+#define RK3588_PMU2_IOC 0x4000
+#define RK3588_BUS_IOC 0x8000
+#define RK3588_VCCIO1_4_IOC 0x9000
+#define RK3588_VCCIO3_5_IOC 0xA000
+#define RK3588_VCCIO2_IOC 0xB000
+#define RK3588_VCCIO6_IOC 0xC000
+#define RK3588_EMMC_IOC 0xD000
+
+
+static int
+rk3588_get_pd_reg(struct rk_pinctrl_softc *sc, uint32_t bank, uint32_t pin,
+ uint32_t *reg, uint32_t *bit, uint32_t *mask)
+{
+ if (bank == 0) {
+ if (pin >= RK_PA0 && pin <= RK_PB3) {
+ *reg = RK3588_PMU1_IOC + 0x0010;
+ pin -= RK_PA0;
+ } else if (pin >= RK_PB4 && pin <= RK_PD7) {
+ *reg = RK3588_PMU2_IOC + 0x0014;
+ pin -= RK_PB4;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 1) {
+ if (pin >= RK_PA0 && pin <= RK_PD7) {
+ *reg = RK3588_VCCIO1_4_IOC + 0x0020;
+ pin -= RK_PA0;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 2) {
+ if (pin >= RK_PA0 && pin <= RK_PA3) {
+ *reg = RK3588_EMMC_IOC + 0x0040;
+ pin -= RK_PA0;
+ } else if (pin >= RK_PA4 && pin <= RK_PC7) {
+ *reg = RK3588_VCCIO3_5_IOC + 0x0044;
+ pin -= RK_PA4;
+ } else if (pin >= RK_PD0 && pin <= RK_PD7) {
+ *reg = RK3588_EMMC_IOC + 0x0058;
+ pin -= RK_PA4;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 3) {
+ if (pin >= RK_PA0 && pin <= RK_PD7) {
+ *reg = RK3588_VCCIO3_5_IOC + 0x0068;
+ pin -= RK_PA0;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 4) {
+ if (pin >= RK_PA0 && pin <= RK_PC1) {
+ *reg = RK3588_VCCIO6_IOC + 0x0080;
+ pin -= RK_PA0;
+ } else if (pin >= RK_PC2 && pin <= RK_PC7) {
+ *reg = RK3588_VCCIO6_IOC + 0x0080;
+ pin -= RK_PC0;
+ } else if (pin >= RK_PD0 && pin <= RK_PD7) {
+ *reg = RK3588_VCCIO2_IOC + 0x0098;
+ pin -= RK_PD0;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else {
+ device_printf(sc->dev, "Unknown bank for pin %d and bank %d\n",
+ pin, bank);
+ return (ENXIO);
+ }
+
+ *reg += (pin / 4) * 4;
+ *bit = (pin % 4) * 3;
+ *mask = 7 << *bit;
+
+// device_printf(sc->dev,
+// "%s: bank %d, pin: %d, reg: 0x%04X, bit: %u, mask 0x%04X\n",
+// __func__, bank, pin, *reg, *bit, *mask);
+
+ return (0);
+}
+
+
+static int
+rk3588_get_bias_reg(struct rk_pinctrl_softc *sc, uint32_t bank, uint32_t pin,
+ uint32_t *reg, uint32_t *bit, uint32_t *mask)
+{
+ if (bank == 0) {
+ if (pin >= RK_PA0 && pin <= RK_PB3) {
+ *reg = RK3588_PMU1_IOC + 0x0020;
+ pin -= RK_PA0;
+ } else if (pin >= RK_PB5 && pin <= RK_PD7) {
+ *reg = RK3588_PMU2_IOC + 0x0028;
+ pin -= RK_PB4;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 1) {
+ if (pin >= RK_PA0 && pin <= RK_PD7) {
+ *reg = RK3588_VCCIO1_4_IOC + 0x0110;
+ pin -= RK_PA0;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 2) {
+ if (pin >= RK_PA0 && pin <= RK_PA3) {
+ *reg = RK3588_EMMC_IOC + 0x0120;
+ pin -= RK_PA0;
+ } else if (pin >= RK_PA6 && pin <= RK_PC7) {
+ *reg = RK3588_VCCIO3_5_IOC + 0x0120;
+ pin -= RK_PA4;
+ } else if (pin >= RK_PD0 && pin <= RK_PD7) {
+ *reg = RK3588_EMMC_IOC + 0x0058;
+ pin -= RK_PA4;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 3) {
+ if (pin >= RK_PA0 && pin <= RK_PD7) {
+ *reg = RK3588_VCCIO3_5_IOC + 0x130;
+ pin -= RK_PA0;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else if (bank == 4) {
+ if (pin >= RK_PA0 && pin <= RK_PC1) {
+ *reg = RK3588_VCCIO6_IOC + 0x0140;
+ pin -= RK_PA0;
+ } else if (pin >= RK_PC2 && pin <= RK_PC7) {
+ *reg = RK3588_VCCIO6_IOC + 0x0148;
+ pin -= RK_PC0;
+ } else if (pin >= RK_PD0 && pin <= RK_PD7) {
+ *reg = RK3588_VCCIO2_IOC + 0x014C;
+ pin -= RK_PD0;
+ } else {
+ device_printf(sc->dev,
+ "Unknown pin %d in bank %d\n", pin, bank);
+ return (ENXIO);
+ }
+ } else {
+ device_printf(sc->dev, "Unknown bank for pin %d and bank %d\n",
+ pin, bank);
+ return (ENXIO);
+ }
+
+ *reg += (pin / 8) * 4;
+ *bit = (pin % 8) * 2;
+ *mask = 3 << *bit;
+
+ return (0);
+}
+struct rk_pinctrl_conf rk3588_conf = {
+ .chip = RK_CHIP_RK3588,
+ .iomux_conf = rk3588_iomux_bank,
+ .iomux_nbanks = nitems(rk3588_iomux_bank),
+ .pin_fixup = rk3588_pin_fixup,
+ .npin_fixup = nitems(rk3588_pin_fixup),
+ .gpio_bank = rk3588_gpio_bank,
+ .ngpio_bank = nitems(rk3588_gpio_bank),
+ .get_pd_reg = rk3588_get_pd_reg,
+ .get_syscon = rk3588_get_syscon,
+ .parse_bias = rk3588_parse_bias,
+ .resolv_bias_value = rk3588_resolv_bias_value,
+ .get_bias_value = rk3588_get_bias_value,
+ .get_bias_reg = rk3588_get_bias_reg,
+};
+
static struct ofw_compat_data compat_data[] = {
{"rockchip,rk3288-pinctrl", (uintptr_t)&rk3288_conf},
{"rockchip,rk3328-pinctrl", (uintptr_t)&rk3328_conf},
{"rockchip,rk3399-pinctrl", (uintptr_t)&rk3399_conf},
{"rockchip,rk3568-pinctrl", (uintptr_t)&rk3568_conf},
+ {"rockchip,rk3588-pinctrl", (uintptr_t)&rk3588_conf},
{NULL, 0}
};
-static int
+
+static __noinline int
rk_pinctrl_parse_drive(struct rk_pinctrl_softc *sc, phandle_t node,
- uint32_t bank, uint32_t subbank, uint32_t *drive, uint32_t *offset)
+ uint32_t bank, uint32_t pin, uint32_t *reg, uint32_t *bit, uint32_t *mask,
+ uint32_t *drive)
{
- uint32_t value;
- int i;
+ uint32_t value, subbank;
+ int i, rv;
- if (OF_getencprop(node, "drive-strength", &value,
- sizeof(value)) != 0)
+ rv = OF_getencprop(node, "drive-strength", &value, sizeof(value));
+
+//device_printf(sc->dev, "%s: bank: %u, pin: %u, npin_drive: %u, rv: %d\n",
+// __func__, bank, pin, sc->conf->npin_drive, rv);
+ if (rv <= 0) {
return (-1);
+ }
+//device_printf(sc->dev, "%s: valueddd: 0x%08X, rv: %d\n", __func__, value, rv);
/* Map to the correct drive value */
- for (i = 0; i < sc->conf->npin_drive; i++) {
- if (sc->conf->pin_drive[i].bank != bank &&
- sc->conf->pin_drive[i].subbank != subbank)
- continue;
- if (sc->conf->pin_drive[i].ma == value) {
- *drive = sc->conf->pin_drive[i].value;
- return (0);
+ if (sc->conf->get_pd_reg != NULL) {
+ rv = sc->conf->get_pd_reg(sc, bank, pin, reg, bit, mask);
+ if (rv != 0)
+ return(rv);
+ *drive = value;
+ } else {
+ subbank = pin / 8;
+ for (i = 0; i < sc->conf->npin_drive; i++) {
+ if (sc->conf->pin_drive[i].bank != bank &&
+ sc->conf->pin_drive[i].subbank != subbank)
+ continue;
+ if (sc->conf->pin_drive[i].ma == value) {
+ *bit = (pin % 8) * 2;
+ *mask = (0x3 << *bit);
+ *drive = sc->conf->pin_drive[i].value;
+
+ return (0);
+ }
}
}
-
+//device_printf(sc->dev, "%s: fail\n", __func__);
return (-1);
}
@@ -1142,7 +1452,7 @@
phandle_t pin_conf;
struct syscon *syscon;
uint32_t bank, subbank, pin, function;
- uint32_t bit, mask, reg, drive;
+ uint32_t bit, mask, reg, reg_bus, drive;
int i, rv, bias;
bank = pindata[0];
@@ -1150,13 +1460,14 @@
function = pindata[2];
pin_conf = OF_node_from_xref(pindata[3]);
subbank = pin / 8;
+//device_printf(sc->dev, "%s: bank: %u, pin: %u fnc: %u\n", __func__, bank, pin, function);
for (i = 0; i < sc->conf->iomux_nbanks; i++)
if (sc->conf->iomux_conf[i].bank == bank &&
sc->conf->iomux_conf[i].subbank == subbank)
break;
- if (i == sc->conf->iomux_nbanks) {
+ if (i >= sc->conf->iomux_nbanks) {
device_printf(sc->dev, "Unknown pin %d in bank %d\n", pin,
bank);
return;
@@ -1171,16 +1482,22 @@
/* Then pin pull-up/down */
bias = sc->conf->parse_bias(pin_conf, bank);
if (bias >= 0) {
- reg = sc->conf->get_pd_offset(sc, bank);
- reg += bank * 0x10 + ((pin / 8) * 0x4);
- bit = (pin % 8) * 2;
- mask = (0x3 << bit);
+ if (sc->conf->get_bias_reg != NULL) {
+ rv = sc->conf->get_bias_reg(sc, bank, pin,
+ ®, &bit, &mask);
+ if (rv != 0)
+ return;
+ } else {
+ reg = sc->conf->get_pd_offset(sc, bank);
+ reg += bank * 0x10 + ((pin / 8) * 0x4);
+ bit = (pin % 8) * 2;
+ mask = (0x3 << bit);
+ }
SYSCON_MODIFY_4(syscon, reg, mask, bias << bit | (mask << 16));
}
/* Then drive strength */
- if (ofw_bus_node_is_compatible(ofw_bus_get_node(sc->dev),
- "rockchip,rk3568-pinctrl")) {
+ if (sc->conf->chip == RK_CHIP_RK3568) {
uint32_t value;
if (OF_getencprop(pin_conf, "drive-strength", &value,
sizeof(value)) == 0) {
@@ -1196,14 +1513,13 @@
SYSCON_WRITE_4(syscon, reg, drive | (mask << 16));
}
} else {
- rv = rk_pinctrl_parse_drive(sc, pin_conf, bank, subbank, &drive,
- ®);
- if (rv == 0) {
- bit = (pin % 8) * 2;
- mask = (0x3 << bit);
+ rv = rk_pinctrl_parse_drive(sc, pin_conf, bank, pin, ®, &bit,
+ &mask, &drive);
+//device_printf(sc->dev, "%s: parse drive done: rv: %d, reg: 0x%08X, bit: %u, mask: 0x%08X, drive: %d\n", __func__,
+//rv, reg, bit,mask, drive);
+ if (rv == 0)
SYSCON_MODIFY_4(syscon, reg, mask,
drive << bit | (mask << 16));
- }
}
/* Finally set the pin function */
@@ -1233,17 +1549,65 @@
}
rk_pinctrl_get_fixup(sc, bank, pin, ®, &mask, &bit);
+ /* RK3588 specific */
+ if (sc->conf->chip == RK_CHIP_RK3588) {
+ if ((bank) == 0 && (pin >= RK_PB4) && (pin <= RK_PD7)) {
+ /* Get PMU2 and bus regs */
+ reg_bus = 0x400C + reg; /* PMU1_IOC1 to BUS_IOC */
+ switch (pin) {
+
+ /* Not implemented */
+ case RK_PB4:
+ case RK_PD7:
+//device_printf(sc->dev,
+//"Not implemented: bank %d, pin: %d, fnc: %d\n", bank, pin, function);
+ goto skip_modify;
+
+ /* Not in BUS_IOC*/
+ case RK_PC1:
+ case RK_PC2:
+ case RK_PC3:
+ case RK_PD6:
+//device_printf(sc->dev,
+//"Not implemented in BUS: bank %d, pin: %d, fnc: %d\n", bank, pin, function);
+ break;
+
+ /* In both IOCs */
+ default:
+ if (function >= 8) {
+//device_printf(sc->dev,
+//"Both IOC bank high fnc: %d, pin: %d, fnc: %d, reg: 0x%05X, reg_bus: 0x%05X, bit: %d, mask: 0x%08X\n",
+//bank, pin, function, reg, reg_bus, bit, mask);
+ SYSCON_MODIFY_4(syscon, reg_bus, mask,
+ function << bit | mask << 16);
+ SYSCON_MODIFY_4(syscon, reg, mask,
+ 8 << bit | mask << 16);
+ goto skip_modify;
+//device_printf(sc->dev,
+//"Both IOC bank: %d, pin: %d, fnc: %d, reg: 0x%05X, reg_bus: 0x%05X, bit:%d, mask: 0x%08X\n",
+//bank, pin, function, reg, reg_bus, bit, mask);
+ }
+ break;
+ }
+ }
+ }
+
/*
* NOTE: not all syscon registers uses hi-word write mask, thus
* register modify method should be used.
- * XXXX We should not pass write mask to syscon register
+ * XXXX We should not pass write mask to syscon register
* without hi-word write mask.
*/
- SYSCON_MODIFY_4(syscon, reg, mask, function << bit | (mask << 16));
+//device_printf(sc->dev,
+//"Normal: %d, pin: %d, fnc: %d, reg: 0x%05X, bit:%d, mask: 0x%08X\n",
+//bank, pin, function, reg, bit, mask);
+
+ SYSCON_MODIFY_4(syscon, reg, mask, function << bit | mask << 16);
+
+skip_modify:
/* RK3568 specific pin mux for various functionalities */
- if (ofw_bus_node_is_compatible(ofw_bus_get_node(sc->dev),
- "rockchip,rk3568-pinctrl")) {
+ if (sc->conf->chip == RK_CHIP_RK3568) {
if (bank == 3 && pin == 9 && function == 3)
SYSCON_WRITE_4(sc->grf,
GRF_IOFUNC_SEL0, GMAC1_IOMUX_SEL_M0);
@@ -1270,7 +1634,13 @@
return (ENOENT);
for (i = 0; i != npins; i += 4)
+ {
+//char *nm;
+//OF_getprop_alloc(node, "name", (void **)&nm);
+//device_printf(sc->dev, "%s, name: %s\n", __func__, nm);
+
rk_pinctrl_configure_pin(sc, pins + i);
+ }
return (0);
}
@@ -1293,7 +1663,7 @@
sc->conf->iomux_conf[i].subbank == subbank)
break;
- if (i == sc->conf->iomux_nbanks) {
+ if (i >= sc->conf->iomux_nbanks) {
device_printf(sc->dev, "Unknown pin %d in bank %d\n", pin,
bank);
return (EINVAL);
@@ -1368,6 +1738,7 @@
rv = rk_pinctrl_get_bank(sc, gpio, &bank);
if (rv != 0)
goto done;
+
syscon = sc->conf->get_syscon(sc, bank);
rv = rk_pinctrl_is_gpio_locked(sc, syscon, bank, pin, is_gpio);
@@ -1383,7 +1754,7 @@
{
struct rk_pinctrl_softc *sc;
struct syscon *syscon;
- uint32_t reg, bit;
+ uint32_t reg, bit, mask;
uint32_t bias;
int bank;
int rv = 0;
@@ -1404,11 +1775,19 @@
goto done;
}
/* Get the pullup/pulldown configuration */
- reg = sc->conf->get_pd_offset(sc, bank);
- reg += bank * 0x10 + ((pin / 8) * 0x4);
- bit = (pin % 8) * 2;
+ if (sc->conf->get_bias_reg != NULL) {
+ rv = sc->conf->get_bias_reg(sc, bank, pin,
+ ®, &bit, &mask);
+ if (rv != 0)
+ return (rv);
+ } else {
+ reg = sc->conf->get_pd_offset(sc, bank);
+ reg += bank * 0x10 + ((pin / 8) * 0x4);
+ bit = (pin % 8) * 2;
+ mask = (0x3 << bit);
+ }
reg = SYSCON_READ_4(syscon, reg);
- reg = (reg >> bit) & 0x3;
+ reg = (reg & mask) >> bit;
bias = sc->conf->resolv_bias_value(bank, reg);
*flags = bias;
@@ -1444,10 +1823,17 @@
goto done;
}
/* Get the pullup/pulldown configuration */
- reg = sc->conf->get_pd_offset(sc, bank);
- reg += bank * 0x10 + ((pin / 8) * 0x4);
- bit = (pin % 8) * 2;
- mask = (0x3 << bit);
+ if (sc->conf->get_bias_reg != NULL) {
+ rv = sc->conf->get_bias_reg(sc, bank, pin,
+ ®, &bit, &mask);
+ if (rv != 0)
+ return(rv);
+ } else {
+ reg = sc->conf->get_pd_offset(sc, bank);
+ reg += bank * 0x10 + ((pin / 8) * 0x4);
+ bit = (pin % 8) * 2;
+ mask = (0x3 << bit);
+ }
bias = sc->conf->get_bias_value(bank, flags);
SYSCON_MODIFY_4(syscon, reg, mask, bias << bit | (mask << 16));
@@ -1524,18 +1910,117 @@
gpio_unit += 1;
continue;
}
+ sc->conf->gpio_bank[gpio_unit].gpio_dev = cdev;
rv = device_probe_and_attach(cdev);
if (rv != 0) {
+ sc->conf->gpio_bank[gpio_unit].gpio_dev = NULL;
device_printf(sc->dev,
"Cannot attach GPIO subdevice\n");
gpio_unit += 1;
continue;
}
- sc->conf->gpio_bank[gpio_unit].gpio_dev = cdev;
gpio_unit += 1;
}
fdt_pinctrl_configure_tree(dev);
+#if 0
+#define RK3588_PMU1_IOC 0x0000
+#define RK3588_PMU2_IOC 0x4000
+#define RK3588_BUS_IOC 0x8000
+#define RK3588_VCCIO1_4_IOC 0x9000
+#define RK3588_VCCIO3_5_IOC 0xA000
+#define RK3588_VCCIO2_IOC 0xB000
+#define RK3588_VCCIO6_IOC 0xC000
+#define RK3588_EMMC_IOC 0xD000
+
+int r, j;
+printf("PMU1_IOC Dump:\n");
+for (r = 0; r < 0x3000;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_PMU1_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+printf("PMU2_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_PMU2_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("RK3588_BUS_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_BUS_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("RK3588_VCCIO1_4_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_VCCIO1_4_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("RK3588_VCCIO3_5_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_VCCIO3_5_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("RK3588_VCCIO2_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_VCCIO2_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("RK3588_VCCIO6_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_VCCIO6_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("RK3588_EMMC_IOC Dump:\n");
+for (r = 0; r < 0x300;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", SYSCON_READ_4(sc->grf, RK3588_EMMC_IOC + r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+#endif
bus_attach_children(dev);
return (0);
@@ -1554,7 +2039,7 @@
DEVMETHOD(device_attach, rk_pinctrl_attach),
DEVMETHOD(device_detach, rk_pinctrl_detach),
- /* fdt_pinctrl interface */
+ /* fdt_pinctrl interface */
DEVMETHOD(fdt_pinctrl_configure, rk_pinctrl_configure_pins),
DEVMETHOD(fdt_pinctrl_is_gpio, rk_pinctrl_is_gpio),
DEVMETHOD(fdt_pinctrl_get_flags, rk_pinctrl_get_flags),
diff --git a/sys/arm64/rockchip/rk_usb2phy.c b/sys/arm64/rockchip/rk_usb2phy.c
--- a/sys/arm64/rockchip/rk_usb2phy.c
+++ b/sys/arm64/rockchip/rk_usb2phy.c
@@ -79,9 +79,19 @@
}
};
+struct rk_usb2phy_regs rk3588_regs = {
+ .clk_ctl = {
+ .offset = 0x0000,
+ .enable_mask = 0x10000,
+ /* bit 0 put pll in suspend */
+ .disable_mask = 0x10001,
+ }
+};
+
static struct ofw_compat_data compat_data[] = {
{ "rockchip,rk3399-usb2phy", (uintptr_t)&rk3399_regs },
{ "rockchip,rk3568-usb2phy", (uintptr_t)&rk3568_regs },
+ { "rockchip,rk3588-usb2phy", (uintptr_t)&rk3588_regs },
{ NULL, 0 }
};
@@ -344,8 +354,9 @@
struct rk_usb2phy_softc *sc;
struct phynode_init_def phy_init;
struct phynode *phynode;
- phandle_t node, host;
+ phandle_t node, port;
int err;
+ bool done;
sc = device_get_softc(dev);
sc->dev = dev;
@@ -381,21 +392,39 @@
return (err);
/* Only host is supported right now */
+ done = false;
- host = ofw_bus_find_child(node, "host-port");
- if (host == 0) {
- device_printf(dev, "Cannot find host-port child node\n");
- return (ENXIO);
+ port = ofw_bus_find_child(node, "host-port");
+ if (!done && port != 0) {
+ if (!ofw_bus_node_status_okay(port)) {
+ device_printf(dev, "host-port isn't okay\n");
+ return (ENXIO);
+ }
+
+ regulator_get_by_ofw_property(dev, port, "phy-supply",
+ &sc->phy_supply);
+ phy_init.id = RK_USBPHY_HOST;
+ phy_init.ofw_node = port;
+ done = true;
}
- if (!ofw_bus_node_status_okay(host)) {
- device_printf(dev, "host-port isn't okay\n");
- return (0);
+ port = ofw_bus_find_child(node, "otg-port");
+ if (!done && port != 0) {
+ if (!ofw_bus_node_status_okay(port)) {
+ device_printf(dev, "otg-port isn't okay\n");
+ return (ENXIO);
+ }
+
+ phy_init.id = RK_USBPHY_OTG;
+ phy_init.ofw_node = port;
+ done = true;
+ }
+
+ if (!done) {
+ device_printf(dev, "Cannot find port mode child node\n");
+ return (ENXIO);
}
- regulator_get_by_ofw_property(dev, host, "phy-supply", &sc->phy_supply);
- phy_init.id = RK_USBPHY_HOST;
- phy_init.ofw_node = host;
phynode = phynode_create(dev, &rk_usb2phy_phynode_class, &phy_init);
if (phynode == NULL) {
device_printf(dev, "failed to create host USB2PHY\n");
@@ -406,7 +435,7 @@
return (ENXIO);
}
- OF_device_register_xref(OF_xref_from_node(host), dev);
+ OF_device_register_xref(OF_xref_from_node(port), dev);
return (0);
}
diff --git a/sys/conf/files b/sys/conf/files
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1844,6 +1844,7 @@
dev/iicbus/rtc/ds13rtc.c optional ds13rtc | ds133x | ds1374
dev/iicbus/rtc/ds1672.c optional ds1672
dev/iicbus/rtc/ds3231.c optional ds3231
+dev/iicbus/rtc/hym8563.c optional hym8563 iicbus fdt
dev/iicbus/rtc/isl12xx.c optional isl12xx
dev/iicbus/rtc/nxprtc.c optional nxprtc | pcf8563
dev/iicbus/rtc/pcf85063.c optional pcf85063 iicbus fdt
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -208,6 +208,7 @@
dev/ahci/ahci_generic.c optional ahci
cddl/dev/dtrace/aarch64/dtrace_asm.S optional dtrace compile-with "${DTRACE_S}"
+cddl/dev/dtrace/aarch64/dtrace_isa.c optional dtrace compile-with "${DTRACE_C}"
cddl/dev/dtrace/aarch64/dtrace_subr.c optional dtrace compile-with "${DTRACE_C}"
cddl/dev/fbt/aarch64/fbt_isa.c optional dtrace_fbt | dtraceall compile-with "${FBT_C}"
@@ -751,6 +752,9 @@
dev/iicbus/pmic/rockchip/rk805.c optional fdt rk805 soc_rockchip_rk3328
dev/iicbus/pmic/rockchip/rk808.c optional fdt rk808 soc_rockchip_rk3399
dev/iicbus/pmic/rockchip/rk817.c optional fdt rk817 soc_rockchip_rk3568
+dev/spibus/pmic/rockchip/rk806.c optional fdt rk806 soc_rockchip_rk3588
+dev/spibus/pmic/rockchip/rk806_regulators.c optional fdt rk806 soc_rockchip_rk3588
+dev/spibus/pmic/rockchip/rk806_gpio.c optional fdt rk806 soc_rockchip_rk3588
arm64/rockchip/rk_grf.c optional fdt soc_rockchip
arm64/rockchip/rk_grf_gpio.c optional fdt soc_rockchip
arm64/rockchip/rk_pinctrl.c optional fdt rk_pinctrl soc_rockchip
@@ -776,6 +780,7 @@
dev/clk/rockchip/rk3399_pmucru.c optional fdt soc_rockchip_rk3399
dev/clk/rockchip/rk3568_cru.c optional fdt soc_rockchip_rk3568
dev/clk/rockchip/rk3568_pmucru.c optional fdt soc_rockchip_rk3568
+dev/clk/rockchip/rk3588_cru.c optional fdt soc_rockchip_rk3588
# Xilinx
arm/xilinx/uart_dev_cdnc.c optional uart soc_xilinx_zynq fdt
diff --git a/sys/conf/options.arm64 b/sys/conf/options.arm64
--- a/sys/conf/options.arm64
+++ b/sys/conf/options.arm64
@@ -41,4 +41,5 @@
SOC_ROCKCHIP_RK3328 opt_soc.h # Depends on SOC_ROCKCHIP
SOC_ROCKCHIP_RK3399 opt_soc.h # Depends on SOC_ROCKCHIP
SOC_ROCKCHIP_RK3568 opt_soc.h # Depends on SOC_ROCKCHIP
+SOC_ROCKCHIP_RK3588 opt_soc.h # Depends on SOC_ROCKCHIP
SOC_XILINX_ZYNQ opt_soc.h
diff --git a/sys/dev/clk/rockchip/rk3588_cru.c b/sys/dev/clk/rockchip/rk3588_cru.c
new file mode 100644
--- /dev/null
+++ b/sys/dev/clk/rockchip/rk3588_cru.c
@@ -0,0 +1,2779 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2021, 2022 Soren Schmidt <sos@deepcore.dk>
+ * Copyright (c) 2023, Emmanuel Vadot <manu@freebsd.org>
+ * Copyright (c) 2025, Michal Meloun <mmel@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <machine/bus.h>
+
+#include <dev/fdt/simplebus.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <dev/clk/clk_div.h>
+#include <dev/clk/clk_fixed.h>
+#include <dev/clk/clk_mux.h>
+
+#include <dev/clk/rockchip/rk_cru.h>
+#include <contrib/device-tree/include/dt-bindings/clock/rockchip,rk3588-cru.h>
+#include <contrib/device-tree/include/dt-bindings/reset/rockchip,rk3588-cru.h>
+
+/*
+ TODO:
+ - Implement multiple dividers for armclk
+ - accept rounding flags for all clocks
+*/
+
+#define CRU_BASE 0x00000000
+#define PHP_CRU_BASE 0x00008000
+#define PMU_CRU_BASE 0x00030000
+#define BC0_CRU_BASE 0x00050000
+#define BC1_CRU_BASE 0x00052000
+#define DSU_CRU_BASE 0x00058000
+
+#define CRU_CLKSEL_CON(x) (CRU_BASE + 0x300 + 4 * (x)) /* 178 regs */
+#define CRU_CLKGATE_CON(x) (CRU_BASE + 0x800 + 4 * (x)) /* 78 regs */
+
+/* Some registers */
+#define CRU_MODE_CON0 0x280
+#define BC0_CRU_MODE_CON0 (BC0_CRU_BASE + 0x280)
+#define BC1_CRU_MODE_CON0 (BC1_CRU_BASE + 0x280)
+#define DSU_CRU_MODE_CON0 (DSU_CRU_BASE + 0x280)
+#define CRU_V0PLL_CON0 0x150
+
+/* Relative registers within blocks */
+#define PMU(x) ((PMU_CRU_BASE / 4) + (x))
+#define PHP(x) ((PHP_CRU_BASE / 4) + (x))
+#define BC0(x) ((BC0_CRU_BASE / 4) + (x))
+#define BC1(x) ((BC1_CRU_BASE / 4) + (x))
+#define DSU(x) ((DSU_CRU_BASE / 4) + (x))
+#define PHYREF_ALT_GATE (0x0C38 / 4)
+
+/* Full complex clock with gate */
+#define COMG(_id, _name, _pnames, _f, _o, _ds, _dw, _ms, _mw, _go, _gs) \
+{ \
+ .type = RK_CLK_COMPOSITE, \
+ .clk.composite = &(struct rk_clk_composite_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = _pnames, \
+ .clkdef.parent_cnt = nitems(_pnames), \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS | _f, \
+ .muxdiv_offset = CRU_CLKSEL_CON(_o), \
+ .mux_shift = _ms, \
+ .mux_width = _mw, \
+ .div_shift = _ds, \
+ .div_width = _dw, \
+ .gate_offset = CRU_CLKGATE_CON(_go), \
+ .gate_shift = _gs, \
+ .flags = RK_CLK_COMPOSITE_HAVE_MUX | \
+ RK_CLK_COMPOSITE_HAVE_GATE \
+ }, \
+}
+
+/* Full complex clock with gate and half divider */
+#define COMH(_id, _name, _pnames, _f, _o, _ds, _dw, _ms, _mw, _go, _gs) \
+{ \
+ .type = RK_CLK_COMPOSITE, \
+ .clk.composite = &(struct rk_clk_composite_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = _pnames, \
+ .clkdef.parent_cnt = nitems(_pnames), \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS | _f, \
+ .muxdiv_offset = CRU_CLKSEL_CON(_o), \
+ .mux_shift = _ms, \
+ .mux_width = _mw, \
+ .div_shift = _ds, \
+ .div_width = _dw, \
+ .gate_offset = CRU_CLKGATE_CON(_go), \
+ .gate_shift = _gs, \
+ .flags = RK_CLK_COMPOSITE_HAVE_MUX | \
+ RK_CLK_COMPOSITE_HAVE_GATE | \
+ RK_CLK_COMPOSITE_DIV_HALF, \
+ }, \
+}
+
+/* Complex clock with without mux */
+#define DIVG(_id, _name, _pname, _f, _o, _ds, _dw, _go, _gs) \
+{ \
+ .type = RK_CLK_COMPOSITE, \
+ .clk.composite = &(struct rk_clk_composite_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = &(const char*){_pname}, \
+ .clkdef.parent_cnt = 1, \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS | _f, \
+ .muxdiv_offset = CRU_CLKSEL_CON(_o), \
+ .mux_shift = 0, \
+ .mux_width = 0, \
+ .div_shift = _ds, \
+ .div_width = _dw, \
+ .gate_offset = CRU_CLKGATE_CON(_go), \
+ .gate_shift = _gs, \
+ .flags = RK_CLK_COMPOSITE_HAVE_GATE \
+ }, \
+}
+
+/* Raw mux with reparent option */
+#undef MUX
+#define MUX(_id, _name, _pn, _mo, _ms, _mw) \
+ MUXRAW(_id, _name, _pn, RK_CLK_MUX_REPARENT, \
+ CRU_CLKSEL_CON(_mo), _ms, _mw)
+
+/* Complex clock with gate but without divider. */
+#define MUXG(_id, _name, _pn, _f, _o, _ms, _mw, _go, _gs) \
+{ \
+ .type = RK_CLK_COMPOSITE, \
+ .clk.composite = &(struct rk_clk_composite_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = _pn, \
+ .clkdef.parent_cnt = nitems(_pn), \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS | _f, \
+ .muxdiv_offset = CRU_CLKSEL_CON(_o), \
+ .mux_shift = _ms, \
+ .mux_width = _mw, \
+ .div_shift = 0, \
+ .div_width = 0, \
+ .gate_offset = CRU_CLKGATE_CON(_go), \
+ .gate_shift = _gs, \
+ .flags = RK_CLK_COMPOSITE_HAVE_GATE | \
+ RK_CLK_COMPOSITE_HAVE_MUX, \
+ }, \
+}
+
+/* Fractional rate multipier/divider. */
+#define FRAG(_id, _name, _pname, _f, _o, _go, _gs) \
+{ \
+ .type = RK_CLK_FRACT, \
+ .clk.fract = &(struct rk_clk_fract_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = (const char *[]){_pname}, \
+ .clkdef.parent_cnt = 1, \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS, \
+ .offset = CRU_CLKSEL_CON(_o), \
+ .gate_offset = CRU_CLKGATE_CON(_go), \
+ .gate_shift = _gs, \
+ .flags = RK_CLK_FRACT_HAVE_GATE, \
+ }, \
+}
+#undef GATE
+#define GATE(_idx, _clkname, _pname, _o, _s) \
+{ \
+ .id = _idx, \
+ .name = _clkname, \
+ .parent_name = _pname, \
+ .offset = CRU_CLKGATE_CON(_o), \
+ .shift = _s, \
+ .flags = CLK_NODE_STATIC_STRINGS, \
+}
+#define GATN(_idx, _clkname, _pname, _o, _s) \
+{ \
+ .id = _idx, \
+ .name = _clkname, \
+ .parent_name = _pname, \
+ .offset = CRU_CLKGATE_CON(_o), \
+ .shift = _s, \
+ .flags = CLK_NODE_STATIC_STRINGS | CLK_NODE_CANNOT_STOP, \
+}
+
+/* Linked gate */
+#define GATL(_idx, _clkname, _pname, _linkname, _o, _s) \
+{ \
+ .id = _idx, \
+ .name = _clkname, \
+ .parent_name = _pname, \
+ .offset = CRU_CLKGATE_CON(_o), \
+ .shift = _s, \
+ .flags = CLK_NODE_STATIC_STRINGS, \
+}
+
+#define RK_PLLRATE(_hz, _m, _p, _s, _k) \
+{ \
+ .freq = _hz, \
+ .m = _m, \
+ .p = _p, \
+ .s = _s, \
+ .k = _k, \
+}
+
+/* PLL clock */
+#define PLLI(_id, _name, _plists, _boff, _moff, _mshift) \
+{ \
+ .type = RK3588_CLK_PLL, \
+ .clk.pll = &(struct rk_clk_pll_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = _plists, \
+ .clkdef.parent_cnt = nitems(_plists), \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS, \
+ .base_offset = _boff, \
+ .mode_reg = _moff, \
+ .mode_shift = _mshift, \
+ .rates = rk_pllrates, \
+ }, \
+}
+
+#define PLLF(_id, _name, _plists, _boff, _moff, _mshift) \
+{ \
+ .type = RK3588_CLK_PLL, \
+ .clk.pll = &(struct rk_clk_pll_def) { \
+ .clkdef.id = _id, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = _plists, \
+ .clkdef.parent_cnt = nitems(_plists), \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS, \
+ .base_offset = _boff, \
+ .mode_reg = _moff, \
+ .mode_shift = _mshift, \
+ .rates = rk_pllrates, \
+ .flags = RK_CLK_PLL_FRACTIONAL, \
+ }, \
+}
+
+static struct rk_clk_pll_rate rk_pllrates[] = {
+ /* _mhz, _m, _p, _s, _k */
+ RK_PLLRATE(2520000000, 210, 2, 0, 0),
+ RK_PLLRATE(2496000000, 208, 2, 0, 0),
+ RK_PLLRATE(2472000000, 206, 2, 0, 0),
+ RK_PLLRATE(2448000000, 204, 2, 0, 0),
+ RK_PLLRATE(2424000000, 202, 2, 0, 0),
+ RK_PLLRATE(2400000000, 200, 2, 0, 0),
+ RK_PLLRATE(2376000000, 198, 2, 0, 0),
+ RK_PLLRATE(2352000000, 196, 2, 0, 0),
+ RK_PLLRATE(2328000000, 194, 2, 0, 0),
+ RK_PLLRATE(2304000000, 192, 2, 0, 0),
+ RK_PLLRATE(2280000000, 190, 2, 0, 0),
+ RK_PLLRATE(2256000000, 376, 2, 1, 0),
+ RK_PLLRATE(2232000000, 372, 2, 1, 0),
+ RK_PLLRATE(2208000000, 368, 2, 1, 0),
+ RK_PLLRATE(2184000000, 364, 2, 1, 0),
+ RK_PLLRATE(2160000000, 360, 2, 1, 0),
+ RK_PLLRATE(2136000000, 356, 2, 1, 0),
+ RK_PLLRATE(2112000000, 352, 2, 1, 0),
+ RK_PLLRATE(2088000000, 348, 2, 1, 0),
+ RK_PLLRATE(2064000000, 344, 2, 1, 0),
+ RK_PLLRATE(2040000000, 340, 2, 1, 0),
+ RK_PLLRATE(2016000000, 336, 2, 1, 0),
+ RK_PLLRATE(1992000000, 332, 2, 1, 0),
+ RK_PLLRATE(1968000000, 328, 2, 1, 0),
+ RK_PLLRATE(1944000000, 324, 2, 1, 0),
+ RK_PLLRATE(1920000000, 320, 2, 1, 0),
+ RK_PLLRATE(1896000000, 316, 2, 1, 0),
+ RK_PLLRATE(1872000000, 312, 2, 1, 0),
+ RK_PLLRATE(1848000000, 308, 2, 1, 0),
+ RK_PLLRATE(1824000000, 304, 2, 1, 0),
+ RK_PLLRATE(1800000000, 300, 2, 1, 0),
+ RK_PLLRATE(1776000000, 296, 2, 1, 0),
+ RK_PLLRATE(1752000000, 292, 2, 1, 0),
+ RK_PLLRATE(1728000000, 288, 2, 1, 0),
+ RK_PLLRATE(1704000000, 284, 2, 1, 0),
+ RK_PLLRATE(1680000000, 280, 2, 1, 0),
+ RK_PLLRATE(1656000000, 276, 2, 1, 0),
+ RK_PLLRATE(1632000000, 272, 2, 1, 0),
+ RK_PLLRATE(1608000000, 268, 2, 1, 0),
+ RK_PLLRATE(1584000000, 264, 2, 1, 0),
+ RK_PLLRATE(1560000000, 260, 2, 1, 0),
+ RK_PLLRATE(1536000000, 256, 2, 1, 0),
+ RK_PLLRATE(1512000000, 252, 2, 1, 0),
+ RK_PLLRATE(1488000000, 248, 2, 1, 0),
+ RK_PLLRATE(1464000000, 244, 2, 1, 0),
+ RK_PLLRATE(1440000000, 240, 2, 1, 0),
+ RK_PLLRATE(1416000000, 236, 2, 1, 0),
+ RK_PLLRATE(1392000000, 232, 2, 1, 0),
+ RK_PLLRATE(1320000000, 220, 2, 1, 0),
+ RK_PLLRATE(1200000000, 200, 2, 1, 0),
+ RK_PLLRATE(1188000000, 198, 2, 1, 0),
+ RK_PLLRATE(1100000000, 550, 3, 2, 0),
+ RK_PLLRATE(1008000000, 336, 2, 2, 0),
+ RK_PLLRATE(1000000000, 500, 3, 2, 0),
+ RK_PLLRATE(983040000, 655, 4, 2, 23592),
+ RK_PLLRATE(955520000, 477, 3, 2, 49806),
+ RK_PLLRATE(903168000, 903, 6, 2, 11009),
+ RK_PLLRATE(900000000, 300, 2, 2, 0),
+ RK_PLLRATE(850000000, 425, 3, 2, 0),
+ RK_PLLRATE(816000000, 272, 2, 2, 0),
+ RK_PLLRATE(786432000, 262, 2, 2, 9437),
+ RK_PLLRATE(786000000, 131, 1, 2, 0),
+ RK_PLLRATE(785560000, 392, 3, 2, 51117),
+ RK_PLLRATE(722534400, 963, 8, 2, 24850),
+ RK_PLLRATE(600000000, 200, 2, 2, 0),
+ RK_PLLRATE(594000000, 198, 2, 2, 0),
+ RK_PLLRATE(408000000, 272, 2, 3, 0),
+ RK_PLLRATE(312000000, 208, 2, 3, 0),
+ RK_PLLRATE(216000000, 288, 2, 4, 0),
+ RK_PLLRATE(100000000, 400, 3, 5, 0),
+ RK_PLLRATE(96000000, 256, 2, 5, 0),
+ {},
+};
+
+static struct rk_clk_armclk_rates cpul_rates[] = {
+ {2208000000, 1},
+ {2184000000, 1},
+ {2088000000, 1},
+ {2040000000, 1},
+ {2016000000, 1},
+ {1992000000, 1},
+ {1896000000, 1},
+ {1800000000, 1},
+ {1704000000, 0},
+ {1608000000, 0},
+ {1584000000, 0},
+ {1560000000, 0},
+ {1536000000, 0},
+ {1512000000, 0},
+ {1488000000, 0},
+ {1464000000, 0},
+ {1440000000, 0},
+ {1416000000, 0},
+ {1392000000, 0},
+ {1368000000, 0},
+ {1344000000, 0},
+ {1320000000, 0},
+ {1296000000, 0},
+ {1272000000, 0},
+ {1248000000, 0},
+ {1224000000, 0},
+ {1200000000, 0},
+ {1104000000, 0},
+ {1008000000, 0},
+ {912000000, 0},
+ {816000000, 0},
+ {696000000, 0},
+ {600000000, 0},
+ {408000000, 0},
+ {312000000, 0},
+ {216000000, 0},
+ {96000000, 0},
+};
+
+
+static struct rk_clk_armclk_rates cpubc0_rates[] = {
+ {2496000000, 1},
+ {2400000000, 1},
+ {2304000000, 1},
+ {2208000000, 1},
+ {2184000000, 1},
+ {2088000000, 1},
+ {2040000000, 1},
+ {2016000000, 1},
+ {1992000000, 1},
+ {1896000000, 1},
+ {1800000000, 1},
+ {1704000000, 0},
+ {1608000000, 0},
+ {1584000000, 0},
+ {1560000000, 0},
+ {1536000000, 0},
+ {1512000000, 0},
+ {1488000000, 0},
+ {1464000000, 0},
+ {1440000000, 0},
+ {1416000000, 0},
+ {1392000000, 0},
+ {1368000000, 0},
+ {1344000000, 0},
+ {1320000000, 0},
+ {1296000000, 0},
+ {1272000000, 0},
+ {1248000000, 0},
+ {1224000000, 0},
+ {1200000000, 0},
+ {1104000000, 0},
+ {1008000000, 0},
+ {912000000, 0},
+ {816000000, 0},
+ {696000000, 0},
+ {600000000, 0},
+ {408000000, 0},
+ {312000000, 0},
+ {216000000, 0},
+ {96000000, 0},
+};
+
+static struct rk_clk_armclk_rates cpubc1_rates[] ={
+ {2496000000, 1},
+ {2400000000, 1},
+ {2304000000, 1},
+ {2208000000, 1},
+ {2184000000, 1},
+ {2088000000, 1},
+ {2040000000, 1},
+ {2016000000, 1},
+ {1992000000, 1},
+ {1896000000, 1},
+ {1800000000, 1},
+ {1704000000, 0},
+ {1608000000, 0},
+ {1584000000, 0},
+ {1560000000, 0},
+ {1536000000, 0},
+ {1512000000, 0},
+ {1488000000, 0},
+ {1464000000, 0},
+ {1440000000, 0},
+ {1416000000, 0},
+ {1392000000, 0},
+ {1368000000, 0},
+ {1344000000, 0},
+ {1320000000, 0},
+ {1296000000, 0},
+ {1272000000, 0},
+ {1248000000, 0},
+ {1224000000, 0},
+ {1200000000, 0},
+ {1104000000, 0},
+ {1008000000, 0},
+ {912000000, 0},
+ {816000000, 0},
+ {696000000, 0},
+ {600000000, 0},
+ {408000000, 0},
+ {312000000, 0},
+ {216000000, 0},
+ {96000000, 0},
+};
+
+
+/* Parent clock defines */
+PLIST(m_pll_p) = { "xin24m", "xin32k" };
+PLIST(m_armclkl_p) = { "xin24m", "gpll", "lpll" };
+PLIST(m_armclkb01_p) = { "xin24m", "gpll", "b0pll",};
+PLIST(m_armclkb23_p) = { "xin24m", "gpll", "b1pll",};
+PLIST(b0pll_b1pll_lpll_gpll_p) = { "b0pll", "b1pll", "lpll", "gpll" };
+PLIST(gpll_24m_p) = { "gpll", "xin24m" };
+PLIST(gpll_aupll_p) = { "gpll", "aupll" };
+PLIST(gpll_lpll_p) = { "gpll", "lpll" };
+PLIST(gpll_cpll_p) = { "gpll", "cpll" };
+PLIST(gpll_spll_p) = { "gpll", "spll" };
+PLIST(gpll_cpll_24m_p) = { "gpll", "cpll", "xin24m"};
+PLIST(gpll_cpll_aupll_p) = { "gpll", "cpll", "aupll"};
+PLIST(gpll_cpll_npll_p) = { "gpll", "cpll", "npll"};
+PLIST(gpll_cpll_npll_v0pll_p) = { "gpll", "cpll", "npll", "v0pll"};
+PLIST(gpll_cpll_24m_spll_p) = { "gpll", "cpll", "xin24m", "spll" };
+PLIST(gpll_cpll_aupll_spll_p) = { "gpll", "cpll", "aupll", "spll" };
+PLIST(gpll_cpll_aupll_npll_p) = { "gpll", "cpll", "aupll", "npll" };
+PLIST(gpll_cpll_v0pll_aupll_p) = { "gpll", "cpll", "v0pll", "aupll" };
+PLIST(gpll_cpll_v0pll_spll_p) = { "gpll", "cpll", "v0pll", "spll" };
+PLIST(gpll_cpll_aupll_npll_spll_p) = { "gpll", "cpll", "aupll", "npll", "spll" };
+PLIST(gpll_cpll_dmyaupll_npll_spll_p) = { "gpll", "cpll", "dummy_aupll", "npll", "spll" };
+PLIST(gpll_cpll_npll_aupll_spll_p) = { "gpll", "cpll", "npll", "aupll", "spll" };
+PLIST(gpll_cpll_npll_1000m_p) = { "gpll", "cpll", "npll", "clk_1000m_src" };
+PLIST(m_24m_spll_gpll_cpll_p) = { "xin24m", "spll", "gpll", "cpll" };
+PLIST(m_24m_32k_p) = { "xin24m", "xin32k" };
+PLIST(m_24m_100m_p) = { "xin24m", "clk_100m_src" };
+PLIST(m_200m_100m_p) = { "clk_200m_src", "clk_100m_src" };
+PLIST(m_100m_50m_24m_p) = { "clk_100m_src", "clk_50m_src", "xin24m" };
+PLIST(m_150m_50m_24m_p) = { "clk_150m_src", "clk_50m_src", "xin24m" };
+PLIST(m_150m_100m_24m_p) = { "clk_150m_src", "clk_100m_src", "xin24m" };
+PLIST(m_200m_150m_24m_p) = { "clk_200m_src", "clk_150m_src", "xin24m" };
+PLIST(m_150m_100m_50m_24m_p) = { "clk_150m_src", "clk_100m_src", "clk_50m_src", "xin24m" };
+PLIST(m_200m_100m_50m_24m_p) = { "clk_200m_src", "clk_100m_src", "clk_50m_src", "xin24m" };
+PLIST(m_300m_200m_100m_24m_p) = { "clk_300m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
+PLIST(m_700m_400m_200m_24m_p) = { "clk_700m_src", "clk_400m_src", "clk_200m_src", "xin24m" };
+PLIST(m_500m_250m_100m_24m_p) = { "clk_500m_src", "clk_250m_src", "clk_100m_src", "xin24m" };
+PLIST(m_500m_300m_100m_24m_p) = { "clk_500m_src", "clk_300m_src", "clk_100m_src", "xin24m" };
+PLIST(m_400m_200m_100m_24m_p) = { "clk_400m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
+PLIST(clk_i2s2_2ch_p) = { "clk_i2s2_2ch_src", "clk_i2s2_2ch_frac", "i2s2_mclkin", "xin12m" };
+PLIST(i2s2_2ch_mclkout_p) = { "mclk_i2s2_2ch", "xin12m" };
+PLIST(clk_i2s3_2ch_p) = { "clk_i2s3_2ch_src", "clk_i2s3_2ch_frac", "i2s3_mclkin", "xin12m" };
+PLIST(i2s3_2ch_mclkout_p) = { "mclk_i2s3_2ch", "xin12m" };
+PLIST(clk_i2s0_8ch_tx_p) = { "clk_i2s0_8ch_tx_src", "clk_i2s0_8ch_tx_frac", "i2s0_mclkin", "xin12m" };
+PLIST(clk_i2s0_8ch_rx_p) = { "clk_i2s0_8ch_rx_src", "clk_i2s0_8ch_rx_frac", "i2s0_mclkin", "xin12m" };
+PLIST(i2s0_8ch_mclkout_p) = { "mclk_i2s0_8ch_tx", "mclk_i2s0_8ch_rx", "xin12m" };
+PLIST(clk_i2s1_8ch_tx_p) = { "clk_i2s1_8ch_tx_src", "clk_i2s1_8ch_tx_frac", "i2s1_mclkin", "xin12m" };
+PLIST(clk_i2s1_8ch_rx_p) = { "clk_i2s1_8ch_rx_src", "clk_i2s1_8ch_rx_frac", "i2s1_mclkin", "xin12m" };
+PLIST(i2s1_8ch_mclkout_p) = { "mclk_i2s1_8ch_tx", "mclk_i2s1_8ch_rx", "xin12m" };
+PLIST(clk_i2s4_8ch_tx_p) = { "clk_i2s4_8ch_tx_src", "clk_i2s4_8ch_tx_frac", "i2s4_mclkin", "xin12m" };
+PLIST(clk_i2s5_8ch_tx_p) = { "clk_i2s5_8ch_tx_src", "clk_i2s5_8ch_tx_frac", "i2s5_mclkin", "xin12m" };
+PLIST(clk_i2s6_8ch_tx_p) = { "clk_i2s6_8ch_tx_src", "clk_i2s6_8ch_tx_frac", "i2s6_mclkin", "xin12m" };
+PLIST(clk_i2s6_8ch_rx_p) = { "clk_i2s6_8ch_rx_src", "clk_i2s6_8ch_rx_frac", "i2s6_mclkin", "xin12m" };
+PLIST(i2s6_8ch_mclkout_p) = { "mclk_i2s6_8ch_tx", "mclk_i2s6_8ch_rx", "xin12m" };
+PLIST(clk_i2s7_8ch_rx_p) = { "clk_i2s7_8ch_rx_src", "clk_i2s7_8ch_rx_frac", "i2s7_mclkin", "xin12m" };
+PLIST(clk_i2s8_8ch_tx_p) = { "clk_i2s8_8ch_tx_src", "clk_i2s8_8ch_tx_frac", "i2s8_mclkin", "xin12m" };
+PLIST(clk_i2s9_8ch_rx_p) = { "clk_i2s9_8ch_rx_src", "clk_i2s9_8ch_rx_frac", "i2s9_mclkin", "xin12m" };
+PLIST(clk_i2s10_8ch_rx_p) = { "clk_i2s10_8ch_rx_src", "clk_i2s10_8ch_rx_frac", "i2s10_mclkin", "xin12m" };
+PLIST(clk_spdif0_p) = { "clk_spdif0_src", "clk_spdif0_frac", "xin12m" };
+PLIST(clk_spdif1_p) = { "clk_spdif1_src", "clk_spdif1_frac", "xin12m" };
+PLIST(clk_spdif2_dp0_p) = { "clk_spdif2_dp0_src", "clk_spdif2_dp0_frac", "xin12m" };
+PLIST(clk_spdif3_p) = { "clk_spdif3_src", "clk_spdif3_frac", "xin12m" };
+PLIST(clk_spdif4_p) = { "clk_spdif4_src", "clk_spdif4_frac", "xin12m" };
+PLIST(clk_spdif5_dp1_p) = { "clk_spdif5_dp1_src", "clk_spdif5_dp1_frac", "xin12m" };
+PLIST(clk_uart0_p) = { "clk_uart0_src", "clk_uart0_frac", "xin24m" };
+PLIST(clk_uart1_p) = { "clk_uart1_src", "clk_uart1_frac", "xin24m" };
+PLIST(clk_uart2_p) = { "clk_uart2_src", "clk_uart2_frac", "xin24m" };
+PLIST(clk_uart3_p) = { "clk_uart3_src", "clk_uart3_frac", "xin24m" };
+PLIST(clk_uart4_p) = { "clk_uart4_src", "clk_uart4_frac", "xin24m" };
+PLIST(clk_uart5_p) = { "clk_uart5_src", "clk_uart5_frac", "xin24m" };
+PLIST(clk_uart6_p) = { "clk_uart6_src", "clk_uart6_frac", "xin24m" };
+PLIST(clk_uart7_p) = { "clk_uart7_src", "clk_uart7_frac", "xin24m" };
+PLIST(clk_uart8_p) = { "clk_uart8_src", "clk_uart8_frac", "xin24m" };
+PLIST(clk_uart9_p) = { "clk_uart9_src", "clk_uart9_frac", "xin24m" };
+PLIST(clk_gmac0_ptp_ref_p) = { "cpll", "clk_gmac0_ptpref_io" };
+PLIST(clk_gmac1_ptp_ref_p) = { "cpll", "clk_gmac1_ptpref_io" };
+PLIST(clk_hdmirx_aud_p) = { "clk_hdmirx_aud_src", "clk_hdmirx_aud_frac" };
+PLIST(aclk_hdcp1_root_p) = { "gpll", "cpll", "clk_hdmitrx_refsrc" };
+PLIST(aclk_vop_sub_src_p) = { "aclk_vop_root", "aclk_vop_div2_src" };
+PLIST(dclk_vop0_p) = { "dclk_vop0_src", "clk_hdmiphy_pixel0", "clk_hdmiphy_pixel1" };
+PLIST(dclk_vop1_p) = { "dclk_vop1_src", "clk_hdmiphy_pixel0", "clk_hdmiphy_pixel1" };
+PLIST(dclk_vop2_p) = { "dclk_vop2_src", "clk_hdmiphy_pixel0", "clk_hdmiphy_pixel1" };
+PLIST(pmu_200m_100m_p) = { "clk_pmu1_200m_src", "clk_pmu1_100m_src" };
+PLIST(pmu_300m_24m_p) = { "clk_300m_src", "xin24m" };
+PLIST(pmu_400m_24m_p) = { "clk_400m_src", "xin24m" };
+PLIST(pmu_100m_50m_24m_src_p) = { "clk_pmu1_100m_src", "clk_pmu1_50m_src", "xin24m" };
+PLIST(pmu_24m_32k_100m_src_p) = { "xin24m", "xin32k", "clk_pmu1_100m_src" };
+PLIST(hclk_pmu1_root_p) = { "clk_pmu1_200m_src", "clk_pmu1_100m_src", "clk_pmu1_50m_src", "xin24m" };
+PLIST(hclk_pmu_cm0_root_p) = { "clk_pmu1_400m_src", "clk_pmu1_200m_src", "clk_pmu1_100m_src", "xin24m" };
+PLIST(mclk_pdm0_p) = { "clk_pmu1_300m_src", "clk_pmu1_200m_src" };
+PLIST(m_24m_ppll_spll_p) = { "xin24m", "ppll", "spll" };
+PLIST(m_24m_ppll_p) = { "xin24m", "ppll" };
+PLIST(clk_ref_pipe_phy0_p) = { "clk_ref_pipe_phy0_osc_src", "clk_ref_pipe_phy0_pll_src" };
+PLIST(clk_ref_pipe_phy1_p) = { "clk_ref_pipe_phy1_osc_src", "clk_ref_pipe_phy1_pll_src" };
+PLIST(clk_ref_pipe_phy2_p) = { "clk_ref_pipe_phy2_osc_src", "clk_ref_pipe_phy2_pll_src" };
+
+
+/* CLOCKS */
+static struct rk_clk rk3588_clks[] = {
+ /* External clocks */
+ LINK("xin24m"),
+ LINK("scmi_cclk_sd"),
+
+ /* External clock inputs */
+ FRATE(0, "i2s0_mclkin", 0),
+ FRATE(0, "i2s1_mclkin", 0),
+ FRATE(0, "i2s2_mclkin", 0),
+ FRATE(0, "i2s3_mclkin", 0),
+ FRATE(0, "i2s4_mclkin", 0),
+ FRATE(0, "i2s5_mclkin", 0),
+ FRATE(0, "i2s6_mclkin", 0),
+ FRATE(0, "i2s7_mclkin", 0),
+ FRATE(0, "i2s8_mclkin", 0),
+ FRATE(0, "i2s9_mclkin", 0),
+ FRATE(0, "i2s10_mclkin", 0),
+
+ FRATE(0, "clk_gmac0_ptpref_io", 0),
+ FRATE(0, "clk_gmac1_ptpref_io", 0),
+
+ FRATE(0, "dummy_aupll", 0),
+
+
+
+ FRATE(0, "clk_pipephy0_pipe_i", 0),
+ FRATE(0, "clk_pipephy1_pipe_i", 0),
+ FRATE(0, "clk_pipephy2_pipe_i", 0),
+ FRATE(0, "clk_pipe30phy_pipe0_i", 0),
+ FRATE(0, "clk_pipe30phy_pipe1_i", 0),
+ FRATE(0, "clk_pipe30phy_pipe2_i", 0),
+
+ LINK("clk_hdmiphy_pixel0"),
+ LINK("clk_hdmiphy_pixel1"),
+
+ /* TODO - mmc clocks are fixed divider by 2 with phase controll */
+ FFACT(SCLK_SDIO_DRV, "sdio_drv", "cclk_src_sdio", 1, 2),
+ FFACT(SCLK_SDIO_SAMPLE, "sdio_sample", "cclk_src_sdio", 1, 2),
+ FFACT(SCLK_SDMMC_DRV, "sdmmc_drv", "scmi_cclk_sd", 1, 2),
+ FFACT(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "scmi_cclk_sd", 1, 2),
+
+ /* PLL's */
+ PLLI(PLL_B0PLL, "b0pll", m_pll_p, BC0_CRU_BASE + 0x000, BC0_CRU_MODE_CON0, 0),
+ PLLI(PLL_B1PLL, "b1pll", m_pll_p, BC1_CRU_BASE + 0x000, BC1_CRU_MODE_CON0, 0),
+ PLLI(PLL_LPLL, "lpll", m_pll_p, DSU_CRU_BASE + 0x040, DSU_CRU_MODE_CON0, 0),
+ PLLF(PLL_V0PLL, "v0pll", m_pll_p, 0x160, CRU_MODE_CON0, 4),
+ PLLF(PLL_AUPLL, "aupll", m_pll_p, 0x180, CRU_MODE_CON0, 6),
+ PLLF(PLL_CPLL, "cpll", m_pll_p, 0x1A0, CRU_MODE_CON0, 8),
+ PLLF(PLL_GPLL, "gpll", m_pll_p, 0x1C0, CRU_MODE_CON0, 2),
+ PLLF(PLL_NPLL, "npll", m_pll_p, 0x1E0, CRU_MODE_CON0, 0),
+ PLLI(PLL_PPLL, "ppll", m_pll_p, PHP_CRU_BASE + 0x200, CRU_MODE_CON0, 10),
+
+ FFACT(0, "xin12m", "xin24m", 1, 2),
+ FFACT(0, "aclk_vop_div2_src", "aclk_vop_root", 1, 2), // ??
+
+
+ COMG(CLK_50M_SRC, "clk_50m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 0, 0, 5, 5, 1, 0, 0),
+ COMG(CLK_100M_SRC,"clk_100m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 0, 6, 5, 11, 1, 0, 1),
+
+ COMG(CLK_150M_SRC, "clk_150m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 1, 0, 5, 5, 1, 0, 2),
+ COMG(CLK_200M_SRC, "clk_200m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 1, 6, 5, 11, 1, 0, 3),
+
+ COMG(CLK_250M_SRC, "clk_250m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 2, 0, 5, 5, 1, 0, 4),
+ COMG(CLK_300M_SRC, "clk_300m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 2, 6, 5, 11, 1, 0, 5),
+
+ COMG(CLK_350M_SRC, "clk_350m_src", gpll_spll_p,
+ CLK_NODE_CANNOT_STOP, 3, 0, 5, 5, 1, 0, 6),
+ COMG(CLK_400M_SRC, "clk_400m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 3, 6, 5, 11, 1, 0, 7),
+
+ COMH(CLK_450M_SRC, "clk_450m_src", gpll_cpll_p,
+ 0, 4, 0, 5, 5, 1, 0, 8),
+ COMG(CLK_500M_SRC, "clk_500m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 4, 6, 5, 11, 1, 0, 9),
+
+ COMG(CLK_600M_SRC, "clk_600m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 5, 0, 5, 5, 1, 0, 10),
+ COMG(CLK_650M_SRC, "clk_650m_src", gpll_lpll_p,
+ 0, 5, 6, 5, 11, 1, 0, 11),
+
+ COMG(CLK_700M_SRC, "clk_700m_src", gpll_spll_p,
+ CLK_NODE_CANNOT_STOP, 6, 0, 5, 5, 1, 0, 12),
+ COMG(CLK_800M_SRC, "clk_800m_src", gpll_aupll_p,
+ CLK_NODE_CANNOT_STOP, 6, 6, 5, 11, 1, 0, 13),
+
+ COMH(CLK_1000M_SRC, "clk_1000m_src", gpll_cpll_npll_v0pll_p,
+ CLK_NODE_CANNOT_STOP, 7, 0, 5, 5, 1, 0, 14),
+ COMG(CLK_1200M_SRC,"clk_1200m_src", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 7, 6, 5, 11, 1, 0, 15),
+
+ COMG(ACLK_TOP_ROOT, "aclk_top_root", gpll_cpll_aupll_p,
+ CLK_NODE_CANNOT_STOP, 8, 0, 5, 5, 2, 1, 0),
+ MUXG(PCLK_TOP_ROOT,"pclk_top_root", m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, 8, 7, 2, 1, 2),
+ COMG(ACLK_LOW_TOP_ROOT, "aclk_low_top_root", gpll_cpll_aupll_p,
+ CLK_NODE_CANNOT_STOP, 8, 0, 5, 14, 1, 1, 3),
+
+ MUXG(ACLK_TOP_M300_ROOT, "aclk_top_m300_root", m_300m_200m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 9, 0, 2, 1, 4),
+ MUXG(ACLK_TOP_M500_ROOT, "aclk_top_m500_root", m_500m_300m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 9, 2, 2, 1, 5),
+ MUXG(ACLK_TOP_M400_ROOT, "aclk_top_m400_root", m_400m_200m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 9, 4, 2, 1, 6),
+ MUXG(ACLK_TOP_S200_ROOT, "aclk_top_s200_root", m_200m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, 9, 6, 2, 1, 7),
+ MUXG(ACLK_TOP_S400_ROOT, "aclk_top_s400_root", m_400m_200m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 9, 8, 2, 1, 8),
+
+ COMG(MCLK_GMAC0_OUT, "mclk_gmac0_out", gpll_cpll_p,
+ 0, 15, 0, 7, 7, 1, 5, 3),
+ COMG(REFCLKO25M_ETH0_OUT, "refclko25m_eth0_out", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 15, 8, 7, 15, 1, 5, 4),
+ COMG(REFCLKO25M_ETH1_OUT, "refclko25m_eth1_out", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 16, 0, 7, 7, 1, 5, 5),
+ COMG(CLK_CIFOUT_OUT, "clk_cifout_out_v", gpll_cpll_24m_spll_p,
+ 0, 17, 0, 8, 8, 2, 5, 6),
+ COMG(CLK_MIPI_CAMARAOUT_M0, "clk_mipi_camaraout_m0", m_24m_spll_gpll_cpll_p,
+ 0, 18, 0, 8, 8, 2, 5, 9),
+ COMG(CLK_MIPI_CAMARAOUT_M1, "clk_mipi_camaraout_m1", m_24m_spll_gpll_cpll_p,
+ 0, 19, 0, 8, 8, 2, 5, 10),
+ COMG(CLK_MIPI_CAMARAOUT_M2, "clk_mipi_camaraout_m2", m_24m_spll_gpll_cpll_p,
+ 0, 20, 0, 8, 8, 2, 5, 11),
+ COMG(CLK_MIPI_CAMARAOUT_M3, "clk_mipi_camaraout_m3", m_24m_spll_gpll_cpll_p,
+ 0, 21, 0, 8, 8, 2, 5, 12),
+ COMG(CLK_MIPI_CAMARAOUT_M4, "clk_mipi_camaraout_m4", m_24m_spll_gpll_cpll_p,
+ 0, 22, 0, 8, 8, 2, 5, 13),
+
+ MUXG(HCLK_AUDIO_ROOT, "hclk_audio_root", m_200m_100m_50m_24m_p,
+ 0, 24, 0, 2, 7, 0),
+ MUXG(PCLK_AUDIO_ROOT, "pclk_audio_root", m_100m_50m_24m_p,
+ 0, 24, 2, 2, 7, 1),
+ COMG(CLK_I2S0_8CH_TX_SRC, "clk_i2s0_8ch_tx_src", gpll_aupll_p,
+ 0, 24, 4, 5, 9, 1, 7, 5),
+
+ FRAG(CLK_I2S0_8CH_TX_FRAC, "clk_i2s0_8ch_tx_frac", "clk_i2s0_8ch_tx_src",
+ 0, 25, 7, 6),
+
+ MUX(CLK_I2S0_8CH_TX, "clk_i2s0_8ch_tx", clk_i2s0_8ch_tx_p,
+ 26, 0, 2),
+ COMG(CLK_I2S0_8CH_RX_SRC, "clk_i2s0_8ch_rx_src", m_24m_spll_gpll_cpll_p,
+ 0, 26, 2, 5, 7, 2, 7, 8),
+
+ FRAG(CLK_I2S0_8CH_RX_FRAC, "clk_i2s0_8ch_rx_frac", "clk_i2s0_8ch_rx_src",
+ 0, 27, 7, 9),
+
+ MUX(CLK_I2S0_8CH_RX, "clk_i2s0_8ch_rx", clk_i2s0_8ch_rx_p,
+ 28, 0, 2),
+ MUX(I2S0_8CH_MCLKOUT, "i2s0_8ch_mclkout", i2s0_8ch_mclkout_p,
+ 28, 2, 2),
+ COMG(CLK_I2S2_2CH_SRC, "clk_i2s2_2ch_src", gpll_aupll_p,
+ 0, 28, 4, 5, 9, 1, 7, 14),
+
+ FRAG(CLK_I2S2_2CH_FRAC, "clk_i2s2_2ch_frac", "clk_i2s2_2ch_src",
+ 0, 29, 7, 15),
+
+ MUX(CLK_I2S2_2CH, "clk_i2s2_2ch", clk_i2s2_2ch_p,
+ 30, 0, 2),
+ MUX(I2S2_2CH_MCLKOUT, "i2s2_2ch_mclkout", i2s2_2ch_mclkout_p,
+ 30, 2, 1),
+ COMG(CLK_I2S3_2CH_SRC, "clk_i2s3_2ch_src", gpll_aupll_p,
+ 0, 30, 3, 5, 8, 1, 8, 1),
+
+ FRAG(CLK_I2S3_2CH_FRAC, "clk_i2s3_2ch_frac", "clk_i2s3_2ch_src",
+ 0, 31, 8, 2),
+ MUX(CLK_I2S3_2CH, "clk_i2s3_2ch", clk_i2s3_2ch_p,
+ 32, 0, 2),
+ MUX(I2S3_2CH_MCLKOUT, "i2s3_2ch_mclkout", i2s3_2ch_mclkout_p,
+ 32, 2, 1),
+ COMG(MCLK_PDM1, "clk_spdif0_src", gpll_aupll_p,
+ 0, 32, 3, 5, 8, 1, 8, 15),
+
+ FRAG(CLK_SPDIF0_FRAC, "clk_spdif0_frac", "clk_spdif0_src",
+ 0, 33, 9, 0),
+
+ COMG(CLK_SPDIF1_SRC, "clk_spdif1_src", gpll_aupll_p,
+ 0, 34, 2, 5, 7, 1, 9, 3),
+
+ FRAG(CLK_SPDIF1_FRAC, "clk_spdif1_frac", "clk_spdif1_src",
+ 0, 35, 9, 4),
+
+ MUX(CLK_SPDIF0, "clk_spdif0", clk_spdif0_p,
+ 34, 0, 2),
+
+ MUX(CLK_SPDIF1, "clk_spdif1", clk_spdif1_p,
+ 36, 0, 2),
+ COMG(MCLK_PDM1, "mclk_pdm1", gpll_cpll_aupll_p,
+ 0, 36, 2, 5, 7, 2, 9 ,7),
+
+ COMG(ACLK_BUS_ROOT, "aclk_bus_root", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 38, 0, 5, 5, 1, 10, 0),
+ MUXG(CLK_I2C1, "clk_i2c1", m_200m_100m_p,
+ 0, 38, 6, 1, 11, 0),
+ MUXG(CLK_I2C2, "clk_i2c2", m_200m_100m_p,
+ 0, 38, 7, 1, 11, 1),
+ MUXG(CLK_I2C3, "clk_i2c3", m_200m_100m_p,
+ 0, 38, 8, 1, 11, 2),
+ MUXG(CLK_I2C4, "clk_i2c4", m_200m_100m_p,
+ 0, 38, 9, 1, 11, 3),
+ MUXG(CLK_I2C5, "clk_i2c5", m_200m_100m_p,
+ 0, 38, 10, 1, 11, 4),
+ MUXG(CLK_I2C6, "clk_i2c6", m_200m_100m_p,
+ 0, 38, 11, 1, 11, 5),
+ MUXG(CLK_I2C7, "clk_i2c7", m_200m_100m_p,
+ 0, 38, 12, 1, 11, 6),
+ MUXG(CLK_I2C8, "clk_i2c8", m_200m_100m_p,
+ 0, 38, 13, 1, 11, 7),
+
+
+ COMG(CLK_CAN0, "clk_can0", gpll_cpll_p,
+ 0, 39, 0, 5, 5, 1, 11, 9),
+ COMG(CLK_CAN1, "clk_can1", gpll_cpll_p,
+ 0, 39, 6, 5, 11, 1, 11, 11),
+
+ COMG(CLK_CAN2, "clk_can2", gpll_cpll_p,
+ 0, 40, 0, 5, 5, 1, 11, 13),
+ COMG(CLK_SARADC, "clk_saradc", gpll_24m_p,
+ 0, 40, 6, 8, 14, 1, 11, 15),
+
+ COMG(CLK_TSADC, "clk_tsadc", gpll_24m_p,
+ 0, 41, 0, 8, 8, 1, 12, 1),
+ COMG(CLK_UART1_SRC, "clk_uart1_src", gpll_cpll_p,
+ 0, 41, 9, 5, 14, 1, 12, 11),
+
+ FRAG(CLK_UART1_FRAC, "clk_uart1_frac", "clk_uart1_src",
+ 0, 42, 12, 12),
+
+ MUX(CLK_UART1, "clk_uart1", clk_uart1_p,
+ 43, 0, 2),
+ COMG(CLK_UART2_SRC, "clk_uart2_src", gpll_cpll_p,
+ 0, 43, 2, 5, 7, 1, 12, 14),
+
+ FRAG(CLK_UART2_FRAC, "clk_uart2_frac", "clk_uart2_src",
+ 0, 44, 12, 15),
+
+ MUX(CLK_UART2, "clk_uart2", clk_uart2_p,
+ 45, 0, 2),
+ COMG(CLK_UART3_SRC, "clk_uart3_src", gpll_cpll_p,
+ 0, 45, 2, 5, 7, 1, 13, 1),
+
+ FRAG(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src",
+ 0, 46, 13, 2),
+
+ MUX(CLK_UART3, "clk_uart3", clk_uart3_p,
+ 47, 0, 2),
+ COMG(CLK_UART4_SRC, "clk_uart4_src", gpll_cpll_p,
+ 0, 47, 2, 5, 7, 1, 13, 4),
+
+ FRAG(CLK_UART4_FRAC, "clk_uart4_frac", "clk_uart4_src",
+ 0, 48, 13, 5),
+
+ MUX(CLK_UART4, "clk_uart4", clk_uart4_p,
+ 49, 0, 2),
+ COMG(CLK_UART5_SRC, "clk_uart5_src", gpll_cpll_p,
+ 0, 49, 2, 5, 7, 1, 13, 7),
+
+ FRAG(CLK_UART5_FRAC, "clk_uart5_frac", "clk_uart5_src",
+ 0, 50, 13, 8),
+
+ MUX(CLK_UART5, "clk_uart5", clk_uart5_p,
+ 51, 0, 2),
+ COMG(CLK_UART6_SRC, "clk_uart6_src", gpll_cpll_p,
+ 0, 51, 2, 5, 7, 1, 13, 10),
+
+
+ FRAG(CLK_UART6_FRAC, "clk_uart6_frac", "clk_uart6_src",
+ 0, 52, 13, 11),
+
+ MUX(CLK_UART6, "clk_uart6", clk_uart6_p,
+ 53, 0, 2),
+ COMG(CLK_UART7_SRC, "clk_uart7_src", gpll_cpll_p,
+ 0, 53, 2, 5, 7, 1, 13, 13),
+
+ FRAG(CLK_UART7_FRAC, "clk_uart7_frac", "clk_uart7_src",
+ 0, 54, 13, 14),
+
+ MUX(CLK_UART7, "clk_uart7", clk_uart7_p,
+ 55, 0, 2),
+ COMG(CLK_UART8_SRC, "clk_uart8_src", gpll_cpll_p,
+ 0, 55, 2, 5, 7, 1, 14, 0),
+
+ FRAG(CLK_UART8_FRAC, "clk_uart8_frac", "clk_uart8_src",
+ 0, 56, 14, 1),
+
+ MUX(CLK_UART8, "clk_uart8", clk_uart8_p,
+ 57, 0, 2),
+ COMG(CLK_UART9_SRC, "clk_uart9_src", gpll_cpll_p,
+ 0, 57, 2, 5, 7, 1, 14, 3),
+
+ FRAG(CLK_UART9_FRAC, "clk_uart9_frac", "clk_uart9_src",
+ 0, 58, 14, 4),
+
+ MUX(CLK_UART9, "clk_uart9", clk_uart9_p,
+ 59, 0, 2),
+ MUXG(CLK_SPI0, "clk_spi0", m_200m_150m_24m_p,
+ 0, 59, 2, 2, 14, 11),
+ MUXG(CLK_SPI1, "clk_spi1", m_200m_150m_24m_p,
+ 0, 59, 4, 2, 14, 12),
+ MUXG(CLK_SPI2, "clk_spi2", m_200m_150m_24m_p,
+ 0, 59, 6, 2, 14, 13),
+ MUXG(CLK_SPI3, "clk_spi3", m_200m_150m_24m_p,
+ 0, 59, 8, 2, 14, 14),
+ MUXG(CLK_SPI4, "clk_spi4", m_200m_150m_24m_p,
+ 0, 59, 10, 2, 14, 15),
+ MUXG(CLK_PWM1, "clk_pwm1", m_100m_50m_24m_p,
+ 0, 59, 12, 2, 15, 4),
+ MUXG(CLK_PWM2, "clk_pwm2", m_100m_50m_24m_p,
+ 0, 59, 14, 2, 15, 7),
+
+ MUXG(CLK_PWM3, "clk_pwm3", m_100m_50m_24m_p,
+ 0, 60, 0, 2, 15, 10),
+ MUXG(CLK_BUS_TIMER_ROOT, "clk_bus_timer_root", m_24m_100m_p,
+ 0, 60, 2, 1, 5, 14),
+
+ COMG(DBCLK_GPIO1, "dbclk_gpio1", m_24m_32k_p,
+ 0, 60, 3, 5, 8, 1, 16, 15),
+ COMG(DBCLK_GPIO2, "dbclk_gpio2", m_24m_32k_p,
+ 0, 60, 9, 5, 14, 1, 17, 1),
+
+ COMG(DBCLK_GPIO3, "dbclk_gpio3", m_24m_32k_p,
+ 0, 61, 0, 5, 14, 1, 17, 3),
+ COMG(DBCLK_GPIO4, "dbclk_gpio4", m_24m_32k_p,
+ 0, 61, 6, 5, 11, 1, 17, 5),
+
+ COMG(DCLK_DECOM, "dclk_decom", gpll_spll_p,
+ 0, 62, 0, 5, 5, 1, 17, 8),
+
+ COMG(ACLK_ISP1_ROOT, "aclk_isp1_root", gpll_cpll_aupll_spll_p,
+ 0, 67, 0, 5, 5, 2, 26, 0),
+ MUXG(HCLK_ISP1_ROOT, "hclk_isp1_root", m_200m_100m_50m_24m_p,
+ 0, 67, 7, 2, 26, 1),
+ COMG(CLK_ISP1_CORE, "clk_isp1_core", gpll_cpll_aupll_spll_p,
+ 0, 67, 9, 5, 14, 2, 26, 2),
+
+ MUXG(HCLK_NPU_ROOT, "hclk_npu_root", m_200m_100m_50m_24m_p,
+ 0, 73, 0, 2, 29, 0),
+ COMG(CLK_NPU_DSU0, "clk_npu_dsu0", gpll_cpll_aupll_npll_spll_p,
+ 0, 73, 2, 5, 7, 3, 29, 1),
+
+ MUXG(PCLK_NPU_ROOT, "pclk_npu_root", m_100m_50m_24m_p,
+ 0, 74, 1, 2, 29, 4),
+ MUXG(HCLK_NPU_CM0_ROOT, "hclk_npu_cm0_root", m_400m_200m_100m_24m_p,
+ 0, 74, 5, 2, 30, 1),
+ COMG(CLK_NPU_CM0_RTC, "clk_npu_cm0_rtc", m_24m_32k_p,
+ 0, 74, 7, 5, 12, 1, 30, 5),
+ MUXG(CLK_NPUTIMER_ROOT, "clk_nputimer_root", m_24m_100m_p,
+ 0, 74, 3, 1, 29, 7),
+
+ MUXG(HCLK_NVM_ROOT, "hclk_nvm_root", m_200m_100m_50m_24m_p,
+ 0, 77, 0, 2, 31, 0),
+ COMG(ACLK_NVM_ROOT, "aclk_nvm_root", gpll_cpll_p,
+ 0, 77, 2, 5, 7, 1, 31, 1),
+ COMG(CCLK_EMMC, "cclk_emmc", gpll_cpll_24m_p,
+ 0, 77, 8, 6, 14, 2, 31, 6),
+
+ COMG(BCLK_EMMC, "bclk_emmc", gpll_cpll_p,
+ 0, 78, 0, 5, 5, 1, 31, 7),
+ COMG(SCLK_SFC, "sclk_sfc", gpll_cpll_24m_p,
+ 0, 78, 6, 6, 12, 2, 31, 9),
+
+ COMG(ACLK_PCIE_ROOT, "aclk_pcie_root", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 80, 2, 5, 7, 1, 32, 6),
+ COMG(ACLK_PHP_ROOT, "aclk_php_root", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 80, 8, 5, 13, 1, 32, 7),
+ MUXG(PCLK_PHP_ROOT, "pclk_php_root", m_150m_50m_24m_p,
+ 0, 80, 0, 2, 32, 0),
+
+ COMG(CLK_GMAC0_PTP_REF, "clk_gmac0_ptp_ref", clk_gmac0_ptp_ref_p,
+ 0, 81, 0, 6, 6, 1, 34, 10),
+ COMG(CLK_GMAC1_PTP_REF, "clk_gmac1_ptp_ref", clk_gmac1_ptp_ref_p,
+ 0, 81, 7, 6, 13, 1, 34, 11),
+
+ COMG(CLK_RXOOB0, "clk_rxoob0", gpll_cpll_p,
+ 0, 82, 0, 7, 7, 1, 37, 10),
+ COMG(CLK_RXOOB1, "clk_rxoob1", gpll_cpll_p,
+ 0, 82, 8, 7, 15, 1, 37, 11),
+
+ COMG(CLK_RXOOB2, "clk_rxoob2", gpll_cpll_p,
+ 0, 83, 0, 7, 7, 1, 37, 12),
+ COMG(CLK_GMAC_125M, "clk_gmac_125m", gpll_cpll_p,
+ 0, 83, 8, 7, 15, 1, 35, 5),
+
+ COMG(CLK_GMAC_50M, "clk_gmac_50m", gpll_cpll_p,
+ 0, 84, 0, 7, 7, 1, 35, 6),
+ COMG(CLK_UTMI_OTG2, "clk_utmi_otg2", m_150m_50m_24m_p,
+ 0, 84, 8, 4, 12, 2, 35, 10),
+
+ MUXG(0, "hclk_rkvdec0_root", m_200m_100m_50m_24m_p,
+ 0, 89, 0, 2, 40, 0),
+ COMG(0, "aclk_rkvdec0_root", gpll_cpll_aupll_spll_p,
+ 0, 89, 2, 5, 7, 2, 40, 1),
+ COMG(ACLK_RKVDEC_CCU, "aclk_rkvdec_ccu", gpll_cpll_aupll_spll_p,
+ 0, 89, 9, 5, 14, 2, 40, 2),
+
+ COMG(CLK_RKVDEC0_CA, "clk_rkvdec0_ca", gpll_cpll_p,
+ 0, 90, 0, 5, 5, 1, 40, 7),
+ COMG(CLK_RKVDEC0_HEVC_CA, "clk_rkvdec0_hevc_ca", gpll_cpll_npll_1000m_p,
+ 0, 90, 6, 5, 11, 2, 40, 8),
+
+ COMG(CLK_RKVDEC0_CORE, "clk_rkvdec0_core", gpll_cpll_p,
+ 0, 91, 0, 5, 5, 1, 40, 9),
+
+ MUXG(0, "hclk_rkvdec1_root", m_200m_100m_50m_24m_p,
+ 0, 93, 0, 2, 41, 0),
+ COMG(0, "aclk_rkvdec1_root", gpll_cpll_aupll_npll_p,
+ 0, 93, 2, 5, 7, 2, 41, 1),
+ COMG(CLK_RKVDEC1_CA, "clk_rkvdec1_ca", gpll_cpll_p,
+ 0, 93, 9, 5, 14, 1, 41, 6),
+
+ COMG(CLK_RKVDEC1_HEVC_CA, "clk_rkvdec1_hevc_ca", gpll_cpll_npll_1000m_p,
+ 0, 94, 0, 5, 5, 2, 41, 7),
+ COMG(CLK_RKVDEC1_CORE, "clk_rkvdec1_core", gpll_cpll_p,
+ 0, 94, 7, 5, 12, 1, 41, 8),
+
+ COMG(ACLK_USB_ROOT, "aclk_usb_root", gpll_cpll_p,
+ 0, 96, 0, 5, 5, 1, 42, 0),
+ MUXG(HCLK_USB_ROOT, "hclk_usb_root", m_150m_100m_50m_24m_p,
+ 0, 96, 6, 2, 42, 1),
+
+ COMG(ACLK_VDPU_ROOT, "aclk_vdpu_root", gpll_cpll_aupll_p,
+ 0, 98, 0, 5, 5, 2, 44, 0),
+ MUXG(ACLK_VDPU_LOW_ROOT, "aclk_vdpu_low_root", m_400m_200m_100m_24m_p,
+ 0, 98, 7, 2, 44, 1),
+ MUXG(HCLK_VDPU_ROOT, "hclk_vdpu_root", m_200m_100m_50m_24m_p,
+ 0, 98, 9, 2, 44, 2),
+
+ COMG(ACLK_JPEG_DECODER_ROOT, "aclk_jpeg_decoder_root", gpll_cpll_aupll_spll_p,
+ 0, 99, 0, 5, 5, 2, 44, 3),
+ COMG(CLK_IEP2P0_CORE, "clk_iep2p0_core", gpll_cpll_p,
+ 0, 99, 7, 5, 12, 1, 45, 6),
+
+ MUXG(HCLK_RKVENC0_ROOT, "hclk_rkvenc0_root", m_200m_100m_50m_24m_p,
+ 0, 102, 0, 2, 47, 0),
+ COMG(ACLK_RKVENC0_ROOT, "aclk_rkvenc0_root", gpll_cpll_npll_p,
+ 0, 102, 2, 5, 7, 2, 47, 1),
+ COMG(CLK_RKVENC0_CORE, "clk_rkvenc0_core", gpll_cpll_aupll_npll_p,
+ 0, 102, 9, 5, 14, 2, 47, 6),
+
+ MUXG(HCLK_RKVENC1_ROOT, "hclk_rkvenc1_root", m_200m_100m_50m_24m_p,
+ 0, 104, 0, 2, 48, 0),
+ COMG(ACLK_RKVENC1_ROOT, "aclk_rkvenc1_root", gpll_cpll_npll_p,
+ 0, 104, 2, 5, 7, 2, 48, 1),
+ COMG(CLK_RKVENC1_CORE, "clk_rkvenc1_core", gpll_cpll_aupll_npll_p,
+ 0, 104, 9, 5, 14, 2, 48, 6),
+
+ COMG(ACLK_VI_ROOT, "aclk_vi_root", gpll_cpll_npll_aupll_spll_p,
+ 0, 106, 0, 5, 5, 3, 49, 0),
+ MUXG(HCLK_VI_ROOT, "hclk_vi_root", m_200m_100m_50m_24m_p,
+ 0, 106, 8, 2, 49, 1),
+ MUXG(PCLK_VI_ROOT, "pclk_vi_root", m_100m_50m_24m_p,
+ 0, 106, 10, 2, 49, 2),
+
+ COMG(DCLK_VICAP, "dclk_vicap", gpll_cpll_p,
+ 0, 107, 0, 5, 5, 1, 49, 6),
+ COMG(CLK_ISP0_CORE, "clk_isp0_core", gpll_cpll_aupll_spll_p,
+ 0, 107, 6, 5, 11, 2, 49, 9),
+
+ COMG(CLK_FISHEYE0_CORE, "clk_fisheye0_core", gpll_cpll_aupll_spll_p,
+ 0, 108, 0, 5, 5, 2, 50, 0),
+ COMG(CLK_FISHEYE1_CORE, "clk_fisheye1_core", gpll_cpll_aupll_spll_p,
+ 0, 108, 7, 5, 12, 2, 50, 3),
+ MUXG(ICLK_CSIHOST01, "iclk_csihost01", m_400m_200m_100m_24m_p,
+ 0, 108, 14, 2, 51, 10),
+
+ COMG(ACLK_VOP_ROOT, "aclk_vop_root", gpll_cpll_dmyaupll_npll_spll_p,
+ 0, 110, 0, 5, 5, 3, 5, 0),
+ MUXG(ACLK_VOP_LOW_ROOT, "aclk_vop_low_root", m_400m_200m_100m_24m_p,
+ 0, 110, 8, 2, 52, 1),
+ MUXG(HCLK_VOP_ROOT, "hclk_vop_root", m_200m_100m_50m_24m_p,
+ 0, 110, 10, 2, 52, 2),
+ MUXG(PCLK_VOP_ROOT, "pclk_vop_root", m_100m_50m_24m_p,
+ 0, 110, 12, 2, 52, 3),
+
+ COMG(DCLK_VOP0_SRC, "dclk_vop0_src", gpll_cpll_v0pll_aupll_p,
+ 0, 111, 0, 7, 7, 2, 52, 10),
+ COMG(DCLK_VOP1_SRC, "dclk_vop1_src", gpll_cpll_v0pll_aupll_p,
+ 0, 111, 9, 5, 14, 2, 52, 11),
+
+ COMG(DCLK_VOP2_SRC, "dclk_vop2_src", gpll_cpll_v0pll_aupll_p,
+ 0, 112, 0, 5, 5, 2, 52, 12),
+ MUXG(DCLK_VOP0, "dclk_vop0", dclk_vop0_p,
+ 0, 112, 7, 2, 52, 13),
+ MUXG(DCLK_VOP1, "dclk_vop1", dclk_vop1_p,
+ 0, 112, 9, 2, 53, 0),
+ MUXG(DCLK_VOP2, "dclk_vop2", dclk_vop2_p,
+ 0, 112, 11, 2, 53, 1),
+
+ COMG(DCLK_VOP3, "dclk_vop3", gpll_cpll_v0pll_aupll_p,
+ 0, 113, 0, 7, 7, 2, 53, 2),
+
+ COMG(CLK_DSIHOST0, "clk_dsihost0", gpll_cpll_v0pll_spll_p,
+ 0, 114, 0, 7, 7, 2, 53, 6),
+
+ COMG(CLK_DSIHOST1, "clk_dsihost1", gpll_cpll_v0pll_spll_p,
+ 0, 115, 0, 7, 7, 2, 53, 7),
+ MUX(ACLK_VOP_SUB_SRC, "aclk_vop_sub_src", aclk_vop_sub_src_p,
+ 115, 9, 1),
+
+ COMG(ACLK_VO0_ROOT, "aclk_vo0_root", gpll_cpll_p,
+ 0, 116, 0, 5, 5, 1, 55, 0),
+ MUXG(HCLK_VO0_ROOT, "hclk_vo0_root", m_200m_100m_50m_24m_p,
+ 0, 116, 6, 2, 55, 1),
+ MUXG(HCLK_VO0_S_ROOT, "hclk_vo0_s_root", m_200m_100m_50m_24m_p,
+ 0, 116, 8, 2, 55, 2),
+ MUXG(PCLK_VO0_ROOT, "pclk_vo0_root", m_100m_50m_24m_p,
+ 0, 116, 10, 2, 55, 3),
+ MUXG(PCLK_VO0_S_ROOT, "pclk_vo0_s_root", m_100m_50m_24m_p,
+ 0, 116, 12, 2, 55, 4),
+
+ DIVG(CLK_AUX16M_0, "clk_aux16m_0", "gpll",
+ 0, 117, 0, 8, 56, 2),
+ DIVG(CLK_AUX16M_1, "clk_aux16m_1", "gpll",
+ 0, 117, 8, 8, 56, 3),
+
+ COMG(CLK_I2S4_8CH_TX_SRC, "clk_i2s4_8ch_tx_src", gpll_aupll_p,
+ 0, 118, 0, 5, 5, 1, 56, 11),
+
+ FRAG(CLK_I2S4_8CH_TX_FRAC, "clk_i2s4_8ch_tx_frac", "clk_i2s4_8ch_tx_src",
+ 0, 119, 56, 12),
+
+ MUX(CLK_I2S4_8CH_TX, "clk_i2s4_8ch_tx", clk_i2s4_8ch_tx_p,
+ 120, 0, 2),
+ COMG(CLK_I2S8_8CH_TX_SRC, "clk_i2s8_8ch_tx_src", gpll_aupll_p,
+ 0, 120, 3, 5, 8, 1, 56, 15),
+
+ FRAG(CLK_I2S8_8CH_TX_FRAC, "clk_i2s8_8ch_tx_frac", "clk_i2s8_8ch_tx_src",
+ 0, 121, 57, 0),
+
+ MUX(CLK_I2S8_8CH_TX, "clk_i2s8_8ch_tx", clk_i2s8_8ch_tx_p,
+ 122, 0, 2),
+ COMG(CLK_SPDIF2_DP0_SRC, "clk_spdif2_dp0_src", gpll_aupll_p,
+ 0, 122, 3, 5, 8, 1, 57, 3),
+
+ FRAG(CLK_SPDIF2_DP0_FRAC, "clk_spdif2_dp0_frac", "clk_spdif2_dp0_src",
+ 0, 123, 57, 4),
+
+ MUX(CLK_SPDIF2_DP0, "clk_spdif2_dp0", clk_spdif2_dp0_p,
+ 124, 0, 2),
+
+ COMG(CLK_SPDIF5_DP1_SRC, "clk_spdif5_dp1_src", gpll_aupll_p,
+ 0, 124, 2, 5, 7, 1, 57, 8),
+
+ FRAG(CLK_SPDIF5_DP1_FRAC, "clk_spdif5_dp1_frac", "clk_spdif5_dp1_src",
+ 0, 125, 57, 9),
+
+ MUX(CLK_SPDIF5_DP1, "clk_spdif5_dp1", clk_spdif5_dp1_p,
+ 126, 0, 2),
+
+ COMG(ACLK_HDCP1_ROOT, "aclk_hdcp1_root", aclk_hdcp1_root_p,
+ 0, 128, 0, 5, 5, 2, 59, 0),
+ COMG(ACLK_HDMIRX_ROOT, "aclk_hdmirx_root", gpll_cpll_p,
+ 0, 128, 7, 5, 12, 1, 59, 1),
+ MUXG(HCLK_VO1_ROOT, "hclk_vo1_root", m_200m_100m_50m_24m_p,
+ 0, 128, 13, 2, 59, 2),
+
+ MUXG(HCLK_VO1_S_ROOT, "hclk_vo1_s_root", m_200m_100m_50m_24m_p,
+ 0, 129, 0, 2, 59, 3),
+ MUXG(PCLK_VO1_ROOT, "pclk_vo1_root", m_150m_100m_24m_p,
+ 0, 129, 2, 2, 59, 4),
+ MUXG(PCLK_VO1_S_ROOT, "pclk_vo1_s_root", m_100m_50m_24m_p,
+ 0, 129, 4, 2, 59, 5),
+ COMG(CLK_I2S7_8CH_RX_SRC, "clk_i2s7_8ch_rx_src", gpll_aupll_p,
+ 0, 129, 6, 5, 11, 1, 60, 1),
+
+ FRAG(CLK_I2S7_8CH_RX_FRAC, "clk_i2s7_8ch_rx_frac", "clk_i2s7_8ch_rx_src",
+ 0, 130, 60, 2),
+
+ MUX(CLK_I2S7_8CH_RX, "clk_i2s7_8ch_rx", clk_i2s7_8ch_rx_p,
+ 131, 0, 2),
+
+ COMG(CLK_HDMITX0_EARC, "clk_hdmitx0_earc", gpll_cpll_p,
+ 0, 133, 1, 5, 6, 1, 60, 15),
+
+ COMG(CLK_HDMITX1_EARC, "clk_hdmitx1_earc", gpll_cpll_p,
+ 0, 136, 1, 5, 6, 1, 61, 6),
+
+ COMG(CLK_HDMIRX_AUD_SRC, "clk_hdmirx_aud_src", gpll_aupll_p,
+ 0, 138, 0, 8, 8, 1, 61, 12),
+
+ FRAG(CLK_HDMIRX_AUD_FRAC, "clk_hdmirx_aud_frac", "clk_hdmirx_aud_src",
+ 0, 139, 61, 13),
+
+ MUX(CLK_HDMIRX_AUD_P_MUX, "clk_hdmirx_aud_mux", clk_hdmirx_aud_p,
+ 140, 0, 1),
+ MUXG(CLK_EDP0_200M, "clk_edp0_200m", m_200m_100m_50m_24m_p,
+ 0, 140, 1, 2, 62, 2),
+ MUXG(CLK_EDP1_200M, "clk_edp1_200m", m_200m_100m_50m_24m_p,
+ 0, 140, 3, 2, 62, 5),
+ COMG(CLK_I2S5_8CH_TX_SRC, "clk_i2s5_8ch_tx_src", gpll_aupll_p,
+ 0, 140, 5, 5, 10, 1, 62, 6),
+
+ FRAG(CLK_I2S5_8CH_TX_FRAC, "clk_i2s5_8ch_tx_frac", "clk_i2s5_8ch_tx_src",
+ 0, 141, 62, 7),
+
+ MUX(CLK_I2S5_8CH_TX, "clk_i2s5_8ch_tx", clk_i2s5_8ch_tx_p,
+ 142, 0, 2),
+
+ COMG(CLK_I2S6_8CH_TX_SRC, "clk_i2s6_8ch_tx_src", gpll_aupll_p,
+ 0, 144, 3, 5, 8, 1, 62, 13),
+
+ FRAG(CLK_I2S6_8CH_TX_FRAC, "clk_i2s6_8ch_tx_frac", "clk_i2s6_8ch_tx_src",
+ 0, 145, 62, 14),
+
+ MUX(CLK_I2S6_8CH_TX, "clk_i2s6_8ch_tx", clk_i2s6_8ch_tx_p,
+ 146, 0, 2),
+ COMG(CLK_I2S6_8CH_RX_SRC, "clk_i2s6_8ch_rx_src", gpll_aupll_p,
+ 0, 146, 2, 5, 7, 1, 63, 0),
+
+ FRAG(CLK_I2S6_8CH_RX_FRAC, "clk_i2s6_8ch_rx_frac", "clk_i2s6_8ch_rx_src",
+ 0, 147, 63, 1),
+
+ MUX(CLK_I2S6_8CH_RX, "clk_i2s6_8ch_rx", clk_i2s6_8ch_rx_p,
+ 148, 0, 2),
+ MUX(I2S6_8CH_MCLKOUT, "i2s6_8ch_mclkout", i2s6_8ch_mclkout_p,
+ 148, 2, 2),
+ COMG(CLK_SPDIF3_SRC, "clk_spdif3_src", gpll_aupll_p,
+ 0, 148, 4, 5, 9, 1, 63, 5),
+
+ FRAG(CLK_SPDIF3_FRAC, "clk_spdif3_frac", "clk_spdif3_src",
+ 0, 149, 63, 6),
+
+ MUX(CLK_SPDIF3, "clk_spdif3", clk_spdif3_p,
+ 150, 0, 2),
+ COMG(CLK_SPDIF4_SRC, "clk_spdif4_src", gpll_aupll_p,
+ 0, 150, 2, 5, 7, 1, 63, 9),
+
+ FRAG(CLK_SPDIF4_FRAC, "clk_spdif4_frac", "clk_spdif4_src",
+ 0, 151, 63, 10),
+
+ MUX(CLK_SPDIF4, "clk_spdif4", clk_spdif4_p,
+ 152, 0, 2),
+ COMG(MCLK_SPDIFRX0, "mclk_spdifrx0", gpll_cpll_aupll_p,
+ 0, 152, 2, 5, 7, 2, 63, 13),
+ COMG(MCLK_SPDIFRX1, "mclk_spdifrx1", gpll_cpll_aupll_p,
+ 0, 152, 9, 5, 14, 2, 63, 15),
+
+ COMG(MCLK_SPDIFRX2, "mclk_spdifrx2", gpll_cpll_aupll_p,
+ 0, 153, 0, 5, 5, 2, 64, 1),
+ COMG(CLK_I2S9_8CH_RX_SRC, "clk_i2s9_8ch_rx_src", gpll_aupll_p,
+ 0, 153, 7, 5, 12, 1, 65, 1),
+
+ FRAG(CLK_I2S9_8CH_RX_FRAC, "clk_i2s9_8ch_rx_frac", "clk_i2s9_8ch_rx_src",
+ 0, 154, 65, 2),
+
+ MUX(CLK_I2S9_8CH_RX, "clk_i2s9_8ch_rx", clk_i2s9_8ch_rx_p,
+ 155, 0, 2),
+ COMG(CLK_I2S10_8CH_RX_SRC, "clk_i2s10_8ch_rx_src", gpll_aupll_p,
+ 0, 155, 3, 5, 8, 1, 65, 5),
+
+ FRAG(CLK_I2S10_8CH_RX_FRAC, "clk_i2s10_8ch_rx_frac", "clk_i2s10_8ch_rx_src",
+ 0, 156, 65, 6),
+
+ MUX(CLK_I2S10_8CH_RX, "clk_i2s10_8ch_rx", clk_i2s10_8ch_rx_p,
+ 157, 0, 2),
+ COMH(CLK_HDMITRX_REFSRC, "clk_hdmitrx_refsrc", gpll_cpll_p,
+ 0, 157, 2, 5, 7, 1, 65, 9),
+
+ COMG(CLK_GPU_SRC, "clk_gpu_src", gpll_cpll_aupll_npll_spll_p,
+ 0, 158, 0, 5, 5, 3, 66, 1),
+
+ DIVG(CLK_GPU_STACKS, "clk_gpu_stacks", "clk_gpu_src",
+ 0, 159, 0, 5, 66, 7),
+
+ COMG(ACLK_AV1_ROOT, "aclk_av1_root", gpll_cpll_aupll_p,
+ 0, 163, 0, 5, 5, 2, 68, 0),
+ MUXG(PCLK_AV1_ROOT, "pclk_av1_root", m_200m_100m_50m_24m_p,
+ 0, 163, 7, 2, 68, 3),
+
+ MUXG(ACLK_CENTER_ROOT, "aclk_center_root", m_700m_400m_200m_24m_p,
+ CLK_NODE_CANNOT_STOP, 165, 0, 2, 69, 0),
+ MUXG(ACLK_CENTER_LOW_ROOT, "aclk_center_low_root", m_500m_250m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 165, 2, 2, 69, 1),
+ MUXG(HCLK_CENTER_ROOT, "hclk_center_root", m_400m_200m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 165, 4, 2, 69, 2),
+ MUXG(PCLK_CENTER_ROOT, "pclk_center_root", m_200m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, 165, 6, 2, 69, 3),
+ MUXG(ACLK_CENTER_S200_ROOT, "aclk_center_s200_root", m_200m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, 165, 8, 2, 69, 8),
+ MUXG(ACLK_CENTER_S400_ROOT, "aclk_center_s400_root", m_400m_200m_100m_24m_p,
+ CLK_NODE_CANNOT_STOP, 165, 10, 2, 69, 9),
+ MUXG(CLK_DDR_TIMER_ROOT, "clk_ddr_timer_root", m_24m_100m_p,
+ CLK_NODE_CANNOT_STOP, 165, 12, 1, 69, 15),
+
+ COMG(CLK_DDR_CM0_RTC, "clk_ddr_cm0_rtc", m_24m_32k_p,
+ 0, 166, 0, 5, 5, 1, 70, 4),
+
+ COMG(ACLK_VO1USB_TOP_ROOT, "aclk_vo1usb_top_root", gpll_cpll_p,
+ CLK_NODE_CANNOT_STOP, 170, 0, 5, 5, 1, 74, 0),
+ MUXG(HCLK_VO1USB_TOP_ROOT, "hclk_vo1usb_top_root", m_200m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, 170, 6, 2, 74, 2),
+
+ MUXG(0, "hclk_sdio_root", m_200m_100m_50m_24m_p,
+ 0, 172, 0, 2, 75, 0),
+ COMG(CCLK_SRC_SDIO, "cclk_src_sdio", gpll_cpll_24m_p,
+ 0, 172, 2, 6, 8, 2, 75, 3),
+
+ COMG(ACLK_RGA3_ROOT, "aclk_rga3_root", gpll_cpll_aupll_p,
+ 0, 174, 0, 5, 5, 2, 76, 0),
+ MUXG(HCLK_RGA3_ROOT, "hclk_rga3_root", m_200m_100m_50m_24m_p,
+ 0, 174, 7, 2, 76, 1),
+ COMG(CLK_RGA3_1_CORE, "clk_rga3_1_core", gpll_cpll_aupll_spll_p,
+ 0, 174, 9, 5, 14, 2, 76, 6),
+
+ DIVG(CLK_REF_PIPE_PHY0_PLL_SRC, "clk_ref_pipe_phy0_pll_src", "ppll",
+ 0, 176, 0, 6, 77, 3),
+ DIVG(CLK_REF_PIPE_PHY1_PLL_SRC, "clk_ref_pipe_phy1_pll_src", "ppll",
+ 0, 176, 6, 6, 77, 4),
+
+ DIVG(CLK_REF_PIPE_PHY2_PLL_SRC, "clk_ref_pipe_phy2_pll_src", "ppll",
+ 0, 177, 0, 6, 77, 5),
+ MUX(CLK_REF_PIPE_PHY0, "clk_ref_pipe_phy0", clk_ref_pipe_phy0_p,
+ 177, 6, 1),
+ MUX(CLK_REF_PIPE_PHY1, "clk_ref_pipe_phy1", clk_ref_pipe_phy1_p,
+ 177, 7, 1),
+ MUX(CLK_REF_PIPE_PHY2, "clk_ref_pipe_phy2", clk_ref_pipe_phy2_p,
+ 177, 8, 1),
+
+
+ /* PMU */
+ DIVG(CLK_PMU1_50M_SRC, "clk_pmu1_50m_src", "clk_pmu1_400m_src",
+ CLK_NODE_CANNOT_STOP, PMU(0), 0, 4, PMU(0), 0),
+ DIVG(CLK_PMU1_100M_SRC, "clk_pmu1_100m_src", "clk_pmu1_400m_src",
+ 0, PMU(0), 4, 3, PMU(0), 1),
+ DIVG(CLK_PMU1_200M_SRC, "clk_pmu1_200m_src", "clk_pmu1_400m_src",
+ CLK_NODE_CANNOT_STOP, PMU(0), 7, 3, PMU(0), 2),
+ COMG(CLK_PMU1_300M_SRC, "clk_pmu1_300m_src", pmu_300m_24m_p,
+ CLK_NODE_CANNOT_STOP, PMU(0), 10, 5, 15, 1, PMU(0), 3),
+
+ COMG(CLK_PMU1_400M_SRC, "clk_pmu1_400m_src", pmu_400m_24m_p,
+ CLK_NODE_CANNOT_STOP, PMU(1), 0, 5, 15, 1, PMU(0), 4),
+ MUXG(HCLK_PMU1_ROOT, "hclk_pmu1_root", hclk_pmu1_root_p,
+ CLK_NODE_CANNOT_STOP, PMU(1), 6, 2, PMU(0), 5),
+ MUXG(PCLK_PMU1_ROOT, "pclk_pmu1_root", pmu_100m_50m_24m_src_p,
+ CLK_NODE_CANNOT_STOP, PMU(1), 8, 2, PMU(0), 7),
+ MUXG(HCLK_PMU_CM0_ROOT, "hclk_pmu_cm0_root", hclk_pmu_cm0_root_p,
+ CLK_NODE_CANNOT_STOP, PMU(1), 10, 2, PMU(0), 8),
+
+ MUXG(TCLK_PMU1WDT, "tclk_pmu1wdt", m_24m_32k_p,
+ 0, PMU(2), 6, 1, PMU(1), 7),
+ MUXG(CLK_PMU1TIMER_ROOT, "clk_pmu1timer_root", pmu_24m_32k_100m_src_p,
+ 0, PMU(2), 7, 2, PMU(1), 9),
+ MUXG(CLK_PMU1PWM, "clk_pmu1pwm", pmu_100m_50m_24m_src_p,
+ 0, PMU(2), 9, 2, PMU(1), 13),
+ COMG(CLK_PMU_CM0_RTC, "clk_pmu_cm0_rtc", m_24m_32k_p,
+ CLK_NODE_CANNOT_STOP, PMU(2), 0, 5, 5, 1, PMU(0), 15),
+
+ MUXG(CLK_I2C0, "clk_i2c0", pmu_200m_100m_p,
+ 0, PMU(3), 6, 1, PMU(2), 2),
+ DIVG(CLK_UART0_SRC, "clk_uart0_src", "cpll",
+ 0, PMU(3), 7, 5, PMU(2), 3),
+
+ FRAG(CLK_UART0_FRAC, "clk_uart0_frac", "clk_uart0_src",
+ 0, PMU(4), PMU(2), 4),
+
+ MUX(CLK_UART0, "clk_uart0", clk_uart0_p,
+ PMU(5), 0, 2),
+ DIVG(CLK_I2S1_8CH_TX_SRC, "clk_i2s1_8ch_tx_src", "cpll",
+ 0, PMU(5), 2, 5, PMU(2), 8),
+
+
+ FRAG(CLK_I2S1_8CH_TX_FRAC, "clk_i2s1_8ch_tx_frac", "clk_i2s1_8ch_tx_src",
+ 0, PMU(6), PMU(2), 9),
+
+
+ MUX(CLK_I2S1_8CH_TX, "clk_i2s1_8ch_tx", clk_i2s1_8ch_tx_p,
+ PMU(7), 0, 2),
+ DIVG(CLK_I2S1_8CH_RX_SRC, "clk_i2s1_8ch_rx_src", "cpll",
+ 0, PMU(7), 2, 5, PMU(2), 11),
+
+ FRAG(CLK_I2S1_8CH_RX_FRAC, "clk_i2s1_8ch_rx_frac", "clk_i2s1_8ch_rx_src",
+ 0, PMU(8), PMU(2), 12),
+ MUX(CLK_I2S1_8CH_RX, "clk_i2s1_8ch_rx", clk_i2s1_8ch_rx_p,
+ PMU(9), 0, 2),
+ MUX(I2S1_8CH_MCLKOUT, "i2s1_8ch_mclkout", i2s1_8ch_mclkout_p,
+ PMU(9), 2, 2),
+ MUXG(MCLK_PDM0, "mclk_pdm0", mclk_pdm0_p,
+ 0, PMU(9), 4, 1, PMU(2), 15),
+
+
+ COMG(CLK_USB2PHY_HDPTXRXPHY_REF, "clk_usb2phy_hdptxrxphy_ref", m_24m_ppll_p,
+ CLK_NODE_CANNOT_STOP, PMU(14), 9, 5, 14, 1, PMU(4), 7),
+ COMG(CLK_USBDPPHY_MIPIDCPPHY_REF, "clk_usbdpphy_mipidcpphy_ref", m_24m_ppll_spll_p,
+ CLK_NODE_CANNOT_STOP, PMU(14), 0, 7, 7, 2, PMU(4), 3),
+
+ COMG(CLK_CR_PARA, "clk_cr_para", m_24m_ppll_spll_p,
+ 0, PMU(15), 0, 5, 5, 2, PMU(4), 11),
+
+ MUXG(DBCLK_GPIO0, "dbclk_gpio0", m_24m_32k_p,
+ 0, PMU(17), 0, 1, PMU(5), 6),
+
+
+ /* DSU */
+ COMG(0, "sclk_dsu", b0pll_b1pll_lpll_gpll_p,
+ CLK_NODE_CANNOT_STOP, DSU(0), 0, 5, 12, 2, DSU(0), 4),
+
+ DIVG(0, "aclkm_dsu", "sclk_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(1), 1, 5, DSU(0), 8),
+ DIVG(0, "aclks_dsu", "sclk_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(1), 6, 5, DSU(0), 9),
+ DIVG(0, "aclkmp_dsu", "sclk_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(1), 11, 5, DSU(0), 12),
+
+ DIVG(0, "periph_dsu", "sclk_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(2), 0, 5, DSU(0), 13),
+ DIVG(0, "cntclk_dsu", "periph_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(2), 5, 5, DSU(0), 14),
+ DIVG(0, "tsclk_dsu", "periph_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(2), 10, 5, DSU(0), 15),
+
+ DIVG(0, "atclk_dsu", "sclk_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(3), 0, 5, DSU(1), 0),
+ DIVG(0, "gicclk_dsu", "sclk_dsu",
+ CLK_NODE_CANNOT_STOP, DSU(3), 5, 5, DSU(1), 1),
+
+ COMG(PCLK_DSU_ROOT, "pclk_dsu_root", b0pll_b1pll_lpll_gpll_p,
+ CLK_NODE_CANNOT_STOP, DSU(4), 0, 5, 5, 2, DSU(1), 3),
+ MUXG(PCLK_DSU_NS_ROOT, "pclk_dsu_ns_root", m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, DSU(4), 7, 2, DSU(1), 4),
+ MUXG(PCLK_DSU_S_ROOT, "pclk_dsu_s_root", m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, DSU(4), 11, 2, DSU(2), 2),
+
+ ARMDIV(ARMCLK_L, "armclk_l", m_armclkl_p, cpul_rates,
+ DSU(6), 0, 5, 14, 2, 2, 1),
+
+ /* BC0 */
+ MUXG(PCLK_BIGCORE0_ROOT, "pclk_bigcore0_root", m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, BC0(2), 0, 2, BC0(0), 14),
+ ARMDIV(ARMCLK_B01, "armclk_b01", m_armclkb01_p, cpubc0_rates,
+ BC0(0), 8, 5, 6, 2, 2, 1),
+
+
+ /* BC1 */
+ MUXG(PCLK_BIGCORE1_ROOT, "pclk_bigcore1_root", m_100m_50m_24m_p,
+ CLK_NODE_CANNOT_STOP, BC1(2), 0, 2, BC1(0), 14),
+ ARMDIV(ARMCLK_B23, "armclk_b23", m_armclkb23_p, cpubc1_rates,
+ BC1(0), 8, 5, 6, 2, 2, 1),
+
+};
+
+/* GATES */
+static struct rk_cru_gate rk3588_gates[] = {
+ GATE(PCLK_CSIPHY0, "pclk_csiphy0", "pclk_top_root", 1, 6),
+ GATE(PCLK_CSIPHY1, "pclk_csiphy1", "pclk_top_root", 1, 8),
+
+ GATE(CLK_USBDP_PHY0_IMMORTAL, "clk_usbdp_phy0_immortal", "xin24m", 2, 8),
+ GATE(CLK_USBDP_PHY1_IMMORTAL, "clk_usbdp_phy1_immortal", "xin24m", 2, 15),
+
+
+ GATE(PCLK_MIPI_DCPHY0, "pclk_mipi_dcphy0", "pclk_top_root", 3, 14)
+ ,
+ GATE(PCLK_MIPI_DCPHY1, "pclk_mipi_dcphy1", "pclk_top_root", 4, 3),
+
+ GATN(PCLK_CRU, "pclk_cru", "pclk_top_root", 5, 0),
+
+ GATE(HCLK_I2S0_8CH, "hclk_i2s0_8ch", "hclk_audio_root", 7, 4),
+ GATE(MCLK_I2S0_8CH_TX, "mclk_i2s0_8ch_tx", "clk_i2s0_8ch_tx", 7, 7),
+
+
+ GATE(MCLK_I2S0_8CH_RX, "mclk_i2s0_8ch_rx", "clk_i2s0_8ch_rx", 7, 10),
+ GATE(PCLK_ACDCDIG, "pclk_acdcdig", "pclk_audio_root", 7, 11),
+
+ GATE(MCLK_I2S2_2CH, "mclk_i2s2_2ch", "clk_i2s2_2ch", 8, 0),
+ GATE(MCLK_I2S3_2CH, "mclk_i2s3_2ch", "clk_i2s3_2ch", 8, 3),
+ GATE(CLK_DAC_ACDCDIG, "clk_dac_acdcdig", "mclk_i2s3_2ch", 8, 4),
+ GATE(HCLK_SPDIF0, "hclk_spdif0", "hclk_audio_root", 8, 14),
+
+ GATE(MCLK_SPDIF0, "mclk_spdif0", "clk_spdif0", 9, 1),
+ GATE(HCLK_SPDIF1, "hclk_spdif1", "hclk_audio_root", 9, 2),
+ GATE(HCLK_PDM1, "hclk_pdm1", "hclk_audio_root", 9, 6),
+ GATE(MCLK_SPDIF1, "mclk_spdif1", "clk_spdif1", 9, 5),
+
+ GATN(ACLK_GIC, "aclk_gic", "aclk_bus_root", 10, 3),
+ GATE(ACLK_DMAC0, "aclk_dmac0", "aclk_bus_root", 10, 5),
+ GATE(ACLK_DMAC1, "aclk_dmac1", "aclk_bus_root", 10, 6),
+ GATE(ACLK_DMAC2, "aclk_dmac2", "aclk_bus_root", 10, 7),
+ GATE(PCLK_I2C1, "pclk_i2c1", "pclk_top_root", 10, 8),
+ GATE(PCLK_I2C2, "pclk_i2c2", "pclk_top_root", 10, 9),
+ GATE(PCLK_I2C3, "pclk_i2c3", "pclk_top_root", 10, 10),
+ GATE(PCLK_I2C4, "pclk_i2c4", "pclk_top_root", 10, 11),
+ GATE(PCLK_I2C5, "pclk_i2c5", "pclk_top_root", 10, 12),
+ GATE(PCLK_I2C6, "pclk_i2c6", "pclk_top_root", 10, 13),
+ GATE(PCLK_I2C7, "pclk_i2c7", "pclk_top_root", 10, 14),
+ GATE(PCLK_I2C8, "pclk_i2c8", "pclk_top_root", 10, 15),
+
+ GATE(PCLK_CAN0, "pclk_can0", "pclk_top_root", 11, 8),
+ GATE(PCLK_CAN1, "pclk_can1", "pclk_top_root", 11, 10),
+ GATE(PCLK_CAN2, "pclk_can2", "pclk_top_root", 11, 12),
+ GATE(PCLK_SARADC, "pclk_saradc", "pclk_top_root", 11, 14),
+
+ GATE(PCLK_TSADC, "pclk_tsadc", "pclk_top_root", 12, 0),
+ GATE(PCLK_UART1, "pclk_uart1", "pclk_top_root", 12, 2),
+ GATE(PCLK_UART2, "pclk_uart2", "pclk_top_root", 12, 3),
+ GATE(PCLK_UART3, "pclk_uart3", "pclk_top_root", 12, 4),
+ GATE(PCLK_UART4, "pclk_uart4", "pclk_top_root", 12, 5),
+ GATE(PCLK_UART5, "pclk_uart5", "pclk_top_root", 12, 6),
+ GATE(PCLK_UART6, "pclk_uart6", "pclk_top_root", 12, 7),
+ GATE(PCLK_UART7, "pclk_uart7", "pclk_top_root", 12, 8),
+ GATE(PCLK_UART8, "pclk_uart8", "pclk_top_root", 12, 9),
+ GATE(PCLK_UART9, "pclk_uart9", "pclk_top_root", 12, 10),
+ GATE(SCLK_UART1, "sclk_uart1", "clk_uart1", 12, 13),
+
+ GATE(SCLK_UART2, "sclk_uart2", "clk_uart2", 13, 0),
+ GATE(SCLK_UART3, "sclk_uart3", "clk_uart3", 13, 3),
+ GATE(SCLK_UART4, "sclk_uart4", "clk_uart4", 13, 6),
+ GATE(SCLK_UART5, "sclk_uart5", "clk_uart5", 13, 9),
+ GATE(SCLK_UART6, "sclk_uart6", "clk_uart6", 13, 12),
+ GATE(SCLK_UART7, "sclk_uart7", "clk_uart7", 13, 15),
+
+ GATE(SCLK_UART8, "sclk_uart8", "clk_uart8", 14, 2),
+ GATE(SCLK_UART9, "sclk_uart9", "clk_uart9", 14, 5),
+ GATE(PCLK_SPI0, "pclk_spi0", "pclk_top_root", 14, 6),
+ GATE(PCLK_SPI1, "pclk_spi1", "pclk_top_root", 14, 7),
+ GATE(PCLK_SPI2, "pclk_spi2", "pclk_top_root", 14, 8),
+ GATE(PCLK_SPI3, "pclk_spi3", "pclk_top_root", 14, 9),
+ GATE(PCLK_SPI4, "pclk_spi4", "pclk_top_root", 14, 10),
+
+ GATE(PCLK_WDT0, "pclk_wdt0", "pclk_top_root", 15, 0),
+ GATE(TCLK_WDT0, "tclk_wdt0", "xin24m", 15, 1),
+ GATE(PCLK_PWM1, "pclk_pwm1", "pclk_top_root", 15, 3),
+ GATE(CLK_PWM1_CAPTURE, "clk_pwm1_capture", "xin24m", 15, 5),
+ GATE(PCLK_PWM2, "pclk_pwm2", "pclk_top_root", 15, 6),
+ GATE(CLK_PWM2_CAPTURE, "clk_pwm2_capture", "xin24m", 15, 8),
+ GATE(PCLK_PWM3, "pclk_pwm3", "pclk_top_root", 15, 9),
+ GATE(CLK_PWM3_CAPTURE, "clk_pwm3_capture", "xin24m", 15, 11),
+ GATE(PCLK_BUSTIMER0, "pclk_bustimer0", "pclk_top_root", 15, 12),
+ GATE(PCLK_BUSTIMER1, "pclk_bustimer1", "pclk_top_root", 15, 13),
+ GATE(CLK_BUSTIMER0, "clk_bustimer0", "clk_bus_timer_root", 15, 15),
+
+ GATE(CLK_BUSTIMER1, "clk_bustimer1", "clk_bus_timer_root", 16, 0),
+ GATE(CLK_BUSTIMER2, "clk_bustimer2", "clk_bus_timer_root", 16, 1),
+ GATE(CLK_BUSTIMER3, "clk_bustimer3", "clk_bus_timer_root", 16, 2),
+ GATE(CLK_BUSTIMER4, "clk_bustimer4", "clk_bus_timer_root", 16, 3),
+ GATE(CLK_BUSTIMER5, "clk_bustimer5", "clk_bus_timer_root", 16, 4),
+ GATE(CLK_BUSTIMER6, "clk_bustimer6", "clk_bus_timer_root", 16, 5),
+ GATE(CLK_BUSTIMER7, "clk_bustimer7", "clk_bus_timer_root", 16, 6),
+ GATE(CLK_BUSTIMER8, "clk_bustimer8", "clk_bus_timer_root", 16, 7),
+ GATE(CLK_BUSTIMER9, "clk_bustimer9", "clk_bus_timer_root", 16, 8),
+ GATE(CLK_BUSTIMER10, "clk_bustimer10", "clk_bus_timer_root", 16, 9),
+ GATE(CLK_BUSTIMER11, "clk_bustimer11", "clk_bus_timer_root", 16, 10),
+ GATE(PCLK_MAILBOX0, "pclk_mailbox0", "pclk_top_root", 16, 11),
+ GATE(PCLK_MAILBOX1, "pclk_mailbox1", "pclk_top_root", 16, 12),
+ GATE(PCLK_MAILBOX2, "pclk_mailbox2", "pclk_top_root", 16, 13),
+ GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_top_root", 16, 14),
+
+ GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_top_root", 17, 0),
+ GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_top_root", 17, 2),
+ GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_top_root", 17, 4),
+ GATE(ACLK_DECOM, "aclk_decom", "aclk_bus_root", 17, 6),
+ GATE(PCLK_DECOM, "pclk_decom", "pclk_top_root", 17, 7),
+
+ GATE(ACLK_SPINLOCK, "aclk_spinlock", "aclk_bus_root", 18, 6),
+ GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_top_root", 18, 9),
+ GATE(CLK_OTPC_NS, "clk_otpc_ns", "xin24m", 18, 10),
+ GATE(CLK_OTPC_ARB, "clk_otpc_arb", "xin24m", 18, 11),
+ GATE(CLK_OTP_PHY_G, "clk_otp_phy_g", "xin24m", 18, 13),
+ GATE(CLK_OTPC_AUTO_RD_G, "clk_otpc_auto_rd_g", "xin24m", 18, 12),
+
+ GATN(PCLK_PMU2, "pclk_pmu2", "pclk_top_root", 19, 3),
+ GATN(PCLK_PMUCM0_INTMUX, "pclk_pmucm0_intmux", "pclk_top_root", 19, 4),
+ GATN(PCLK_DDRCM0_INTMUX, "pclk_ddrcm0_intmux", "pclk_top_root", 19, 5),
+
+ GATE(CLK_ISP1_CORE_MARVIN, "clk_isp1_core_marvin", "clk_isp1_core", 26, 3),
+ GATE(CLK_ISP1_CORE_VICAP, "clk_isp1_core_vicap", "clk_isp1_core", 26, 4),
+ GATE(ACLK_ISP1, "aclk_isp1", "aclk_isp1_pre", 26, 5),
+ GATE(HCLK_ISP1, "hclk_isp1", "hclk_isp1_pre", 26, 7),
+
+ GATE(FCLK_NPU_CM0_CORE, "fclk_npu_cm0_core", "hclk_npu_cm0_root",30, 3),
+
+ GATE(HCLK_EMMC, "hclk_emmc", "hclk_nvm", 31, 4),
+ GATE(TMCLK_EMMC, "tmclk_emmc", "xin24m", 31, 8),
+ GATE(HCLK_SFC, "hclk_sfc", "hclk_nvm", 31, 10),
+ GATE(HCLK_SFC_XIP, "hclk_sfc_xip", "hclk_nvm", 31, 11),
+
+ GATE(PCLK_GMAC0, "pclk_gmac0", "pclk_php_root", 32, 3),
+ GATE(PCLK_GMAC1, "pclk_gmac1", "pclk_php_root", 32, 4),
+ GATE(ACLK_PCIE_BRIDGE, "aclk_pcie_bridge", "aclk_pcie_root", 32, 8),
+ GATE(ACLK_GMAC0, "aclk_gmac0", "aclk_mmu_php", 32, 10),
+ GATE(ACLK_GMAC1, "aclk_gmac1", "aclk_mmu_php", 32, 11),
+ GATE(ACLK_PCIE_4L_DBI, "aclk_pcie_4l_dbi", "aclk_php_root", 32, 13),
+ GATE(ACLK_PCIE_2L_DBI, "aclk_pcie_2l_dbi", "aclk_php_root", 32, 14),
+ GATE(ACLK_PCIE_1L0_DBI, "aclk_pcie_1l0_dbi", "aclk_php_root", 32, 15),
+
+ GATE(ACLK_PCIE_1L1_DBI, "aclk_pcie_1l1_dbi", "aclk_php_root", 33, 0),
+ GATE(ACLK_PCIE_1L2_DBI, "aclk_pcie_1l2_dbi", "aclk_php_root", 33, 1),
+ GATE(ACLK_PCIE_4L_MSTR, "aclk_pcie_4l_mstr", "aclk_mmu_pcie", 33, 2),
+ GATE(ACLK_PCIE_2L_MSTR, "aclk_pcie_2l_mstr", "aclk_mmu_pcie", 33, 3),
+ GATE(ACLK_PCIE_1L0_MSTR, "aclk_pcie_1l0_mstr", "aclk_mmu_pcie", 33, 4),
+ GATE(ACLK_PCIE_1L1_MSTR, "aclk_pcie_1l1_mstr", "aclk_mmu_pcie", 33, 5),
+ GATE(ACLK_PCIE_1L2_MSTR, "aclk_pcie_1l2_mstr", "aclk_mmu_pcie", 33, 6),
+ GATE(ACLK_PCIE_4L_SLV, "aclk_pcie_4l_slv", "aclk_php_root", 33, 7),
+ GATE(ACLK_PCIE_2L_SLV, "aclk_pcie_2l_slv", "aclk_php_root", 33, 8),
+ GATE(ACLK_PCIE_1L0_SLV, "aclk_pcie_1l0_slv", "aclk_php_root", 33, 9),
+ GATE(ACLK_PCIE_1L1_SLV, "aclk_pcie_1l1_slv", "aclk_php_root", 33, 10),
+ GATE(ACLK_PCIE_1L2_SLV, "aclk_pcie_1l2_slv", "aclk_php_root", 33, 11),
+ GATE(PCLK_PCIE_4L, "pclk_pcie_4l", "pclk_php_root", 33, 12),
+ GATE(PCLK_PCIE_2L, "pclk_pcie_2l", "pclk_php_root", 33, 13),
+ GATE(PCLK_PCIE_1L0, "pclk_pcie_1l0", "pclk_php_root", 33, 14),
+ GATE(PCLK_PCIE_1L1, "pclk_pcie_1l1", "pclk_php_root", 33, 15),
+
+ GATE(PCLK_PCIE_1L2, "pclk_pcie_1l2", "pclk_php_root", 34, 0),
+ GATE(CLK_PCIE_AUX0, "clk_pcie_aux0", "xin24m", 34, 1),
+ GATE(CLK_PCIE_AUX1, "clk_pcie_aux1", "xin24m", 34, 2),
+ GATE(CLK_PCIE_AUX2, "clk_pcie_aux2", "xin24m", 34, 3),
+ GATE(CLK_PCIE_AUX3, "clk_pcie_aux3", "xin24m", 34, 4),
+ GATE(CLK_PCIE_AUX4, "clk_pcie_aux4", "xin24m", 34, 5),
+ GATN(ACLK_PHP_GIC_ITS, "aclk_php_gic_its", "aclk_pcie_root", 34, 6),
+ GATE(ACLK_MMU_PCIE, "aclk_mmu_pcie", "aclk_pcie_bridge", 34, 7),
+ GATE(ACLK_MMU_PHP, "aclk_mmu_php", "aclk_php_root", 34, 8),
+
+ GATE(ACLK_USB3OTG2, "aclk_usb3otg2", "aclk_mmu_php", 35, 7),
+ GATE(SUSPEND_CLK_USB3OTG2, "suspend_clk_usb3otg2", "xin24m", 35, 8),
+ GATE(REF_CLK_USB3OTG2, "ref_clk_usb3otg2", "xin24m", 35, 9),
+
+ GATE(CLK_PIPEPHY0_REF, "clk_pipephy0_ref", "xin24m", 37, 0),
+ GATE(CLK_PIPEPHY1_REF, "clk_pipephy1_ref", "xin24m", 37, 1),
+ GATE(CLK_PIPEPHY2_REF, "clk_pipephy2_ref", "xin24m", 37, 2),
+ GATE(CLK_PMALIVE0, "clk_pmalive0", "xin24m", 37, 4),
+ GATE(CLK_PMALIVE1, "clk_pmalive1", "xin24m", 37, 5),
+ GATE(CLK_PMALIVE2, "clk_pmalive2", "xin24m", 37, 6),
+ GATE(ACLK_SATA0, "aclk_sata0", "aclk_mmu_php", 37, 7),
+ GATE(ACLK_SATA1, "aclk_sata1", "aclk_mmu_php", 37, 8),
+ GATE(ACLK_SATA2, "aclk_sata2", "aclk_mmu_php", 37, 9),
+
+ GATE(CLK_PIPEPHY0_PIPE_G, "clk_pipephy0_pipe_g", "clk_pipephy0_pipe_i", 38, 3),
+ GATE(CLK_PIPEPHY1_PIPE_G, "clk_pipephy1_pipe_g", "clk_pipephy1_pipe_i", 38, 4),
+ GATE(CLK_PIPEPHY2_PIPE_G, "clk_pipephy2_pipe_g", "clk_pipephy2_pipe_i", 38, 5),
+ GATE(CLK_PIPEPHY0_PIPE_ASIC_G, "clk_pipephy0_pipe_asic_g", "clk_pipephy0_pipe_i", 38, 6),
+ GATE(CLK_PIPEPHY1_PIPE_ASIC_G, "clk_pipephy1_pipe_asic_g", "clk_pipephy1_pipe_i", 38, 7),
+ GATE(CLK_PIPEPHY2_PIPE_ASIC_G, "clk_pipephy2_pipe_asic_g", "clk_pipephy2_pipe_i", 38, 8),
+ GATE(CLK_PIPEPHY2_PIPE_U3_G, "clk_pipephy2_pipe_u3_g", "clk_pipephy2_pipe_i", 38, 9),
+#if 1
+ GATE(CLK_PCIE1L2_PIPE, "clk_pcie1l2_pipe", "clk_pipephy0_pipe_g", 38, 13),
+ GATE(CLK_PCIE1L0_PIPE, "clk_pcie1l0_pipe", "clk_pipephy1_pipe_g", 38, 14),
+ GATE(CLK_PCIE1L1_PIPE, "clk_pcie1l1_pipe", "clk_pipephy2_pipe_g", 38, 15),
+#else
+ GATE(CLK_PCIE1L2_PIPE, "clk_pcie1l2_pipe", "clk_pipephy2_pipe_g", 38, 13),
+ GATE(CLK_PCIE1L0_PIPE, "clk_pcie1l0_pipe", "clk_pipephy0_pipe_g", 38, 14),
+ GATE(CLK_PCIE1L1_PIPE, "clk_pcie1l1_pipe", "clk_pipephy1_pipe_g", 38, 15),
+#endif
+ GATE(CLK_PCIE4L_PIPE, "clk_pcie4l_pipe", "clk_pipe30phy_pipe0_i", 39, 0),
+ GATE(CLK_PCIE2L_PIPE, "clk_pcie2l_pipe", "clk_pipe30phy_pipe2_i", 39, 1),
+
+ GATE(HCLK_RKVDEC0, "hclk_rkvdec0", "hclk_rkvdec0_pre", 40, 3),
+ GATE(ACLK_RKVDEC0, "aclk_rkvdec0", "aclk_rkvdec0_pre", 40, 4),
+
+ GATE(HCLK_RKVDEC1, "hclk_rkvdec1", "hclk_rkvdec1_pre", 41, 2),
+ GATE(ACLK_RKVDEC1, "aclk_rkvdec1", "aclk_rkvdec1_pre", 41, 3),
+
+ GATE(ACLK_USB3OTG0, "aclk_usb3otg0", "aclk_usb", 42, 4),
+ GATE(SUSPEND_CLK_USB3OTG0, "suspend_clk_usb3otg0", "xin24m", 42, 5),
+ GATE(REF_CLK_USB3OTG0, "ref_clk_usb3otg0", "xin24m", 42, 6),
+ GATE(ACLK_USB3OTG1, "aclk_usb3otg1", "aclk_usb", 42, 7),
+ GATE(SUSPEND_CLK_USB3OTG1, "suspend_clk_usb3otg1", "xin24m", 42, 8),
+ GATE(REF_CLK_USB3OTG1, "ref_clk_usb3otg1", "xin24m", 42, 9),
+ GATE(HCLK_HOST0, "hclk_host0", "hclk_usb", 42, 10),
+ GATE(HCLK_HOST_ARB0, "hclk_host_arb0", "hclk_usb", 42, 11),
+ GATE(HCLK_HOST1, "hclk_host1", "hclk_usb", 42, 12),
+ GATE(HCLK_HOST_ARB1, "hclk_host_arb1", "hclk_usb", 42, 13),
+
+ GATE(ACLK_VPU, "aclk_vpu", "aclk_vdpu_low_pre", 44, 8),
+ GATE(HCLK_VPU, "hclk_vpu", "hclk_vdpu_root", 44, 9),
+ GATE(ACLK_JPEG_ENCODER0, "aclk_jpeg_encoder0", "aclk_vdpu_low_pre", 44, 10),
+ GATE(HCLK_JPEG_ENCODER0, "hclk_jpeg_encoder0", "hclk_vdpu_root", 44, 11),
+ GATE(ACLK_JPEG_ENCODER1, "aclk_jpeg_encoder1", "aclk_vdpu_low_pre", 44, 12),
+ GATE(HCLK_JPEG_ENCODER1, "hclk_jpeg_encoder1", "hclk_vdpu_root", 44, 13),
+ GATE(ACLK_JPEG_ENCODER2, "aclk_jpeg_encoder2", "aclk_vdpu_low_pre", 44, 14),
+ GATE(HCLK_JPEG_ENCODER2, "hclk_jpeg_encoder2", "hclk_vdpu_root", 44, 15),
+
+ GATE(ACLK_JPEG_ENCODER3, "aclk_jpeg_encoder3", "aclk_vdpu_low_pre", 45, 0),
+ GATE(HCLK_JPEG_ENCODER3, "hclk_jpeg_encoder3", "hclk_vdpu_root", 45, 1),
+ GATE(ACLK_JPEG_DECODER, "aclk_jpeg_decoder", "aclk_jpeg_decoder_pre", 45, 2),
+ GATE(HCLK_JPEG_DECODER, "hclk_jpeg_decoder", "hclk_vdpu_root", 45, 3),
+ GATE(HCLK_IEP2P0, "hclk_iep2p0", "hclk_vdpu_root", 45, 4),
+ GATE(ACLK_IEP2P0, "aclk_iep2p0", "aclk_vdpu_low_pre", 45, 5),
+ GATE(HCLK_RGA2, "hclk_rga2", "hclk_vdpu_root", 45, 7),
+ GATE(ACLK_RGA2, "aclk_rga2", "aclk_vdpu_root", 45, 8),
+ GATE(HCLK_RGA3_0, "hclk_rga3_0", "hclk_vdpu_root", 45, 10),
+ GATE(ACLK_RGA3_0, "aclk_rga3_0", "aclk_vdpu_root", 45, 11),
+
+ GATE(HCLK_RKVENC0, "hclk_rkvenc0", "hclk_rkvenc0_root", 47, 4),
+ GATE(ACLK_RKVENC0, "aclk_rkvenc0", "aclk_rkvenc0_root", 47, 5),
+
+ GATE(HCLK_RKVENC1, "hclk_rkvenc1", "hclk_rkvenc1_pre", 48, 4),
+ GATE(ACLK_RKVENC1, "aclk_rkvenc1", "aclk_rkvenc1_pre", 48, 5),
+
+ GATE(ACLK_VICAP, "aclk_vicap", "aclk_vi_root", 49, 7),
+ GATE(HCLK_VICAP, "hclk_vicap", "hclk_vi_root", 49, 8),
+ GATE(CLK_ISP0_CORE_MARVIN, "clk_isp0_core_marvin", "clk_isp0_core", 49, 10),
+ GATE(CLK_ISP0_CORE_VICAP, "clk_isp0_core_vicap", "clk_isp0_core", 49, 11),
+ GATE(ACLK_ISP0, "aclk_isp0", "aclk_vi_root", 49, 12),
+ GATE(HCLK_ISP0, "hclk_isp0", "hclk_vi_root", 49, 13),
+ GATE(ACLK_FISHEYE0, "aclk_fisheye0", "aclk_vi_root", 49, 14),
+ GATE(HCLK_FISHEYE0, "hclk_fisheye0", "hclk_vi_root", 49, 15),
+
+ GATE(ACLK_FISHEYE1, "aclk_fisheye1", "aclk_vi_root", 50, 1),
+ GATE(HCLK_FISHEYE1, "hclk_fisheye1", "hclk_vi_root", 50, 2),
+ GATE(PCLK_CSI_HOST_0, "pclk_csi_host_0", "pclk_vi_root", 50, 4),
+ GATE(PCLK_CSI_HOST_1, "pclk_csi_host_1", "pclk_vi_root", 50, 5),
+ GATE(PCLK_CSI_HOST_2, "pclk_csi_host_2", "pclk_vi_root", 50, 6),
+ GATE(PCLK_CSI_HOST_3, "pclk_csi_host_3", "pclk_vi_root", 50, 7),
+ GATE(PCLK_CSI_HOST_4, "pclk_csi_host_4", "pclk_vi_root", 50, 8),
+ GATE(PCLK_CSI_HOST_5, "pclk_csi_host_5", "pclk_vi_root", 50, 9),
+
+
+ GATE(ICLK_CSIHOST0, "iclk_csihost0", "iclk_csihost01", 51, 11),
+ GATE(ICLK_CSIHOST1, "iclk_csihost1", "iclk_csihost01", 51, 12),
+
+ GATE(HCLK_VOP, "hclk_vop", "hclk_vop_root", 52, 8),
+ GATE(ACLK_VOP, "aclk_vop", "aclk_vop_sub_src", 52, 9),
+
+ GATE(PCLK_DSIHOST0, "pclk_dsihost0", "pclk_vop_root", 53, 4),
+ GATE(PCLK_DSIHOST1, "pclk_dsihost1", "pclk_vop_root", 53, 5),
+ GATE(CLK_VOP_PMU, "clk_vop_pmu", "xin24m", 53, 8),
+ GATE(ACLK_VOP_DOBY, "aclk_vop_doby", "aclk_vop_root", 53, 10),
+
+ GATE(HCLK_HDCP_KEY0, "hclk_hdcp_key0", "hclk_vo0_s_root", 55, 11),
+ GATE(ACLK_HDCP0, "aclk_hdcp0", "aclk_hdcp0_pre", 55, 12),
+ GATE(HCLK_HDCP0, "hclk_hdcp0", "hclk_vo0", 55, 13),
+ GATE(PCLK_HDCP0, "pclk_hdcp0", "pclk_vo0_root", 55, 14),
+
+ GATE(ACLK_TRNG0, "aclk_trng0", "aclk_vo0_root", 56, 0),
+ GATE(PCLK_TRNG0, "pclk_trng0", "pclk_vo0_root", 56, 1),
+ GATE(PCLK_DP0, "pclk_dp0", "pclk_vo0_root", 56, 4),
+ GATE(PCLK_DP1, "pclk_dp1", "pclk_vo0_root", 56, 5),
+ GATE(PCLK_S_DP0, "pclk_s_dp0", "pclk_vo0_s_root", 56, 6),
+ GATE(PCLK_S_DP1, "pclk_s_dp1", "pclk_vo0_s_root", 56, 7),
+ GATE(CLK_DP0, "clk_dp0", "aclk_vo0_root", 56, 8),
+ GATE(CLK_DP1, "clk_dp1", "aclk_vo0_root", 56, 9),
+ GATE(HCLK_I2S4_8CH, "hclk_i2s4_8ch", "hclk_vo0", 56, 10),
+ GATE(MCLK_I2S4_8CH_TX, "mclk_i2s4_8ch_tx", "clk_i2s4_8ch_tx", 56, 13),
+ GATE(HCLK_I2S8_8CH, "hclk_i2s8_8ch", "hclk_vo0", 56, 14),
+
+ GATE(MCLK_I2S8_8CH_TX, "mclk_i2s8_8ch_tx", "clk_i2s8_8ch_tx", 57, 1),
+
+ GATE(HCLK_SPDIF2_DP0, "hclk_spdif2_dp0", "hclk_vo0", 57, 2),
+ GATE(MCLK_SPDIF2_DP0, "mclk_spdif2_dp0", "clk_spdif2_dp0", 57, 5),
+ GATE(MCLK_SPDIF2, "mclk_spdif2", "clk_spdif2_dp0", 57, 6),
+ GATE(HCLK_SPDIF5_DP1, "hclk_spdif5_dp1", "hclk_vo0", 57, 7),
+ GATE(MCLK_SPDIF5_DP1, "mclk_spdif5_dp1", "clk_spdif5_dp1", 57, 10),
+ GATE(MCLK_SPDIF5, "mclk_spdif5", "clk_spdif5_dp1", 57, 11),
+
+ GATE(PCLK_S_EDP0, "pclk_s_edp0", "pclk_vo1_s_root", 59, 14),
+ GATE(PCLK_S_EDP1, "pclk_s_edp1", "pclk_vo1_s_root", 59, 15),
+
+ GATE(HCLK_I2S7_8CH, "hclk_i2s7_8ch", "hclk_vo1", 60, 0),
+ GATE(MCLK_I2S7_8CH_RX, "mclk_i2s7_8ch_rx", "clk_i2s7_8ch_rx", 60, 3),
+ GATE(HCLK_HDCP_KEY1, "hclk_hdcp_key1", "hclk_vo1_s_root", 60, 4),
+ GATE(ACLK_HDCP1, "aclk_hdcp1", "aclk_hdcp1_pre", 60, 5),
+ GATE(HCLK_HDCP1, "hclk_hdcp1", "hclk_vo1", 60, 6),
+ GATE(PCLK_HDCP1, "pclk_hdcp1", "pclk_vo1_root", 60, 7),
+ GATE(ACLK_TRNG1, "aclk_trng1", "aclk_hdcp1_root", 60, 9),
+ GATE(PCLK_TRNG1, "pclk_trng1", "pclk_vo1_root", 60, 10),
+ GATE(PCLK_HDMITX0, "pclk_hdmitx0", "pclk_vo1_root", 60, 11),
+
+ GATE(CLK_HDMITX0_REF, "clk_hdmitx0_ref", "aclk_hdcp1_root", 61, 0),
+ GATE(PCLK_HDMITX1, "pclk_hdmitx1", "pclk_vo1_root", 61, 2),
+ GATE(CLK_HDMITX1_REF, "clk_hdmitx1_ref", "aclk_hdcp1_root", 61, 7),
+ GATE(ACLK_HDMIRX, "aclk_hdmirx", "aclk_hdmirx_root", 61, 9),
+ GATE(PCLK_HDMIRX, "pclk_hdmirx", "pclk_vo1_root", 61, 10),
+ GATE(CLK_HDMIRX_REF, "clk_hdmirx_ref", "aclk_hdcp1_root", 61, 11),
+ GATE(CLK_HDMIRX_AUD, "clk_hdmirx_aud", "clk_hdmirx_aud_mux", 61, 14),
+
+ GATE(PCLK_EDP0, "pclk_edp0", "pclk_vo1_root", 62, 0),
+ GATE(CLK_EDP0_24M, "clk_edp0_24m", "xin24m", 62, 1),
+ GATE(PCLK_EDP1, "pclk_edp1", "pclk_vo1_root", 62, 3),
+ GATE(CLK_EDP1_24M, "clk_edp1_24m", "xin24m", 62, 4),
+ GATE(MCLK_I2S5_8CH_TX, "mclk_i2s5_8ch_tx", "clk_i2s5_8ch_tx", 62, 8),
+ GATE(HCLK_I2S5_8CH, "hclk_i2s5_8ch", "hclk_vo1", 62, 12),
+ GATE(MCLK_I2S6_8CH_TX, "mclk_i2s6_8ch_tx", "clk_i2s6_8ch_tx", 62, 15),
+
+ GATE(MCLK_I2S6_8CH_RX, "mclk_i2s6_8ch_rx", "clk_i2s6_8ch_rx", 63, 2),
+ GATE(HCLK_I2S6_8CH, "hclk_i2s6_8ch", "hclk_vo1", 63, 3),
+ GATE(HCLK_SPDIF3, "hclk_spdif3", "hclk_vo1", 63, 4),
+ GATE(MCLK_SPDIF3, "mclk_spdif3", "clk_spdif3", 63, 7),
+ GATE(HCLK_SPDIF4, "hclk_spdif4", "hclk_vo1", 63, 8),
+
+ GATE(MCLK_SPDIF4, "mclk_spdif4", "clk_spdif4", 63, 11),
+ GATE(HCLK_SPDIFRX0, "hclk_spdifrx0", "hclk_vo1", 63, 12),
+ GATE(HCLK_SPDIFRX1, "hclk_spdifrx1", "hclk_vo1", 63, 14),
+
+ GATE(HCLK_SPDIFRX2, "hclk_spdifrx2", "hclk_vo1", 64, 0),
+
+ GATE(HCLK_I2S9_8CH, "hclk_i2s9_8ch", "hclk_vo1", 65, 0),
+ GATE(MCLK_I2S9_8CH_RX, "mclk_i2s9_8ch_rx", "clk_i2s9_8ch_rx", 65, 3),
+ GATE(HCLK_I2S10_8CH, "hclk_i2s10_8ch", "hclk_vo1", 65, 4),
+ GATE(MCLK_I2S10_8CH_RX, "mclk_i2s10_8ch_rx", "clk_i2s10_8ch_rx",65, 7),
+ GATE(PCLK_S_HDMIRX, "pclk_s_hdmirx", "pclk_vo1_s_root", 65, 8),
+
+ GATE(CLK_GPU, "clk_gpu", "clk_gpu_src", 66, 4),
+ GATE(CLK_GPU_COREGROUP, "clk_gpu_coregroup", "clk_gpu_src", 66, 6),
+
+ GATE(CLK_GPU_PVTM, "clk_gpu_pvtm", "xin24m", 67, 0),
+ GATE(CLK_CORE_GPU_PVTM, "clk_core_gpu_pvtm", "clk_gpu_src", 67, 1),
+
+ GATE(PCLK_AV1, "pclk_av1", "pclk_av1_pre", 68, 5),
+ GATE(ACLK_AV1, "aclk_av1", "aclk_av1_pre", 68, 2),
+
+ GATN(ACLK_DMA2DDR, "aclk_dma2ddr", "aclk_center_root", 69, 5),
+ GATN(ACLK_DDR_SHAREMEM, "aclk_ddr_sharemem", "aclk_center_low_root", 69, 6),
+ GATN(FCLK_DDR_CM0_CORE, "fclk_ddr_cm0_core", "hclk_center_root",69, 14),
+
+ GATE(CLK_DDR_TIMER0, "clk_ddr_timer0", "clk_ddr_timer_root", 70, 0),
+ GATE(CLK_DDR_TIMER1, "clk_ddr_timer1", "clk_ddr_timer_root", 70, 1),
+ GATE(TCLK_WDT_DDR, "tclk_wdt_ddr", "xin24m", 70, 2),
+ GATE(PCLK_WDT, "pclk_wdt", "pclk_center_root", 70, 7),
+ GATE(PCLK_TIMER, "pclk_timer", "pclk_center_root", 70, 8),
+ GATN(PCLK_DMA2DDR, "pclk_dma2ddr", "pclk_center_root", 70, 9),
+ GATN(PCLK_SHAREMEM, "pclk_sharemem", "pclk_center_root", 70, 10),
+
+ GATE(PCLK_USBDPPHY0, "pclk_usbdpphy0", "pclk_top_root", 72, 2),
+ GATE(PCLK_USBDPPHY1, "pclk_usbdpphy1", "pclk_top_root", 72, 4),
+ GATE(PCLK_HDPTX0, "pclk_hdptx0", "pclk_top_root", 72, 5),
+ GATE(PCLK_HDPTX1, "pclk_hdptx1", "pclk_top_root", 72, 6),
+
+ GATE(CLK_HDMIHDP0, "clk_hdmihdp0", "xin24m", 73, 12),
+ GATE(CLK_HDMIHDP1, "clk_hdmihdp1", "xin24m", 73, 13),
+
+ GATE(HCLK_SDIO, "hclk_sdio", "hclk_sdio_pre", 75, 2),
+
+ GATE(HCLK_RGA3_1, "hclk_rga3_1", "hclk_rga3_root", 76, 4),
+ GATE(ACLK_RGA3_1, "aclk_rga3_1", "aclk_rga3_root", 76, 5),
+
+ GATE(CLK_REF_PIPE_PHY0_OSC_SRC, "clk_ref_pipe_phy0_osc_src", "xin24m", 77, 0),
+ GATE(CLK_REF_PIPE_PHY1_OSC_SRC, "clk_ref_pipe_phy1_osc_src", "xin24m", 77, 1),
+ GATE(CLK_REF_PIPE_PHY2_OSC_SRC, "clk_ref_pipe_phy2_osc_src", "xin24m", 77, 2),
+
+ /* PHP */
+ GATE(PCLK_PCIE_COMBO_PIPE_PHY0, "pclk_pcie_combo_pipe_phy0", "pclk_top_root", PHP(0), 5),
+ GATE(PCLK_PCIE_COMBO_PIPE_PHY1, "pclk_pcie_combo_pipe_phy1", "pclk_top_root", PHP(0), 6),
+ GATE(PCLK_PCIE_COMBO_PIPE_PHY2, "pclk_pcie_combo_pipe_phy2", "pclk_top_root", PHP(0), 7),
+ GATE(PCLK_PCIE_COMBO_PIPE_PHY, "pclk_pcie_combo_pipe_phy", "pclk_top_root", PHP(0), 8),
+
+ /* PMU */
+ GATN(FCLK_PMU_CM0_CORE, "fclk_pmu_cm0_core", "hclk_pmu_cm0_root", PMU(0), 13),
+
+ GATN(PCLK_PMU1, "pclk_pmu1", "pclk_pmu0_root", PMU(1), 0),
+ GATE(CLK_DDR_FAIL_SAFE, "clk_ddr_fail_safe", "clk_pmu0", PMU(1), 1),
+ GATN(CLK_PMU1, "clk_pmu1", "clk_pmu0", PMU(1), 3),
+ GATE(PCLK_PMU1_IOC, "pclk_pmu1_ioc", "pclk_pmu0_root", PMU(1), 5),
+ GATE(PCLK_PMU1WDT, "pclk_pmu1wdt", "pclk_pmu0_root", PMU(1), 6),
+ GATE(PCLK_PMU1TIMER, "pclk_pmu1timer", "pclk_pmu0_root", PMU(1), 8),
+ GATE(CLK_PMU1TIMER0, "clk_pmu1timer0", "clk_pmu1timer_root", PMU(1), 10),
+ GATE(CLK_PMU1TIMER1, "clk_pmu1timer1", "clk_pmu1timer_root", PMU(1), 11),
+ GATE(PCLK_PMU1PWM, "pclk_pmu1pwm", "pclk_pmu0_root", PMU(1), 12),
+ GATE(CLK_PMU1PWM_CAPTURE, "clk_pmu1pwm_capture", "xin24m", PMU(1), 14),
+
+ GATE(PCLK_I2C0, "pclk_i2c0", "pclk_pmu0_root", PMU(2), 1),
+ GATE(SCLK_UART0, "sclk_uart0", "clk_uart0", PMU(2), 5),
+ GATE(PCLK_UART0, "pclk_uart0", "pclk_pmu0_root", PMU(2), 6),
+ GATE(HCLK_I2S1_8CH, "hclk_i2s1_8ch", "hclk_pmu1_root", PMU(2), 7),
+ GATE(MCLK_I2S1_8CH_TX, "mclk_i2s1_8ch_tx", "clk_i2s1_8ch_tx", PMU(2), 10),
+ GATE(HCLK_PDM0, "hclk_pdm0", "hclk_pmu1_root", PMU(2), 14),
+ GATE(MCLK_I2S1_8CH_RX, "mclk_i2s1_8ch_rx", "clk_i2s1_8ch_rx", PMU(2), 13),
+
+ GATE(HCLK_VAD, "hclk_vad", "hclk_pmu1_root", PMU(3), 0),
+
+ GATE(PCLK_PMU0_ROOT, "pclk_pmu0_root", "pclk_pmu1_root", PMU(5), 0),
+ GATN(CLK_PMU0, "clk_pmu0", "xin24m", PMU(5), 1),
+ GATN(PCLK_PMU0, "pclk_pmu0", "pclk_pmu0_root", PMU(5), 2),
+ GATN(PCLK_PMU0IOC, "pclk_pmu0ioc", "pclk_pmu0_root", PMU(5), 4),
+ GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pmu0_root", PMU(5), 5),
+
+ GATE(CLK_PHY0_REF_ALT_P, "clk_phy0_ref_alt_p", "ppll", PHYREF_ALT_GATE, 0),
+ GATE(CLK_PHY0_REF_ALT_M, "clk_phy0_ref_alt_m", "ppll", PHYREF_ALT_GATE, 1),
+ GATE(CLK_PHY1_REF_ALT_P, "clk_phy1_ref_alt_p", "ppll", PHYREF_ALT_GATE, 2),
+ GATE(CLK_PHY1_REF_ALT_M, "clk_phy1_ref_alt_m", "ppll", PHYREF_ALT_GATE, 3),
+
+ GATN(PCLK_DSU, "pclk_dsu", "pclk_dsu_root", DSU(1), 6),
+ GATN(PCLK_DBG, "pclk_dbg", "pclk_dsu_root", DSU(1), 7),
+ GATE(PCLK_S_DAPLITE, "pclk_s_daplite", "pclk_dsu_ns_root", DSU(1), 8),
+ GATE(PCLK_M_DAPLITE, "pclk_m_daplite", "pclk_dsu_root", DSU(1), 9),
+ GATE(CLK_LITCORE_PVTM, "clk_litcore_pvtm", "xin24m", DSU(2), 0),
+ GATE(CLK_CORE_LITCORE_PVTM, "clk_core_litcore_pvtm", "armclk_l",DSU(2), 1),
+ GATN(PCLK_LITCORE_PVTM, "pclk_litcore_pvtm", "pclk_dsu_ns_root", DSU(2), 6),
+
+ /* Big core 0 */
+ GATE(CLK_BIGCORE0_PVTM, "clk_bigcore0_pvtm", "xin24m", BC0(0), 12),
+ GATE(CLK_CORE_BIGCORE0_PVTM, "clk_core_bigcore0_pvtm", "armclk_b01", BC0(0), 13),
+ GATE(PCLK_BIGCORE0_PVTM, "pclk_bigcore0_pvtm", "pclk_bigcore0_root", BC0(1), 0),
+
+ /* Big core 1 */
+ GATE(CLK_BIGCORE1_PVTM, "clk_bigcore1_pvtm", "xin24m", BC1(0), 12),
+ GATE(CLK_CORE_BIGCORE1_PVTM, "clk_core_bigcore1_pvtm", "armclk_b23", BC1(0), 13),
+ GATE(PCLK_BIGCORE1_PVTM, "pclk_bigcore1_pvtm", "pclk_bigcore1_root", BC1(1), 0),
+
+ /* Linked gates */
+ GATL(ACLK_ISP1_PRE, "aclk_isp1_pre", "aclk_isp1_root", ACLK_VI_ROOT,
+ 26, 6),
+ GATL(HCLK_ISP1_PRE, "hclk_isp1_pre", "hclk_isp1_root", HCLK_VI_ROOT,
+ 26, 8),
+ GATL(HCLK_NVM, "hclk_nvm", "hclk_nvm_root", ACLK_NVM_ROOT,
+ 31, 2),
+ GATL(ACLK_USB, "aclk_usb", "aclk_usb_root", ACLK_VO1USB_TOP_ROOT,
+ 42, 2),
+ GATL(HCLK_USB, "hclk_usb", "hclk_usb_root", HCLK_VO1USB_TOP_ROOT,
+ 42, 3),
+ GATL(ACLK_JPEG_DECODER_PRE, "aclk_jpeg_decoder_pre", "aclk_jpeg_decoder_root", ACLK_VDPU_ROOT,
+ 44, 7),
+ GATL(ACLK_VDPU_LOW_PRE, "aclk_vdpu_low_pre", "aclk_vdpu_low_root", ACLK_VDPU_ROOT,
+ 44, 5),
+ GATL(ACLK_RKVENC1_PRE, "aclk_rkvenc1_pre", "aclk_rkvenc1_root", ACLK_RKVENC0,
+ 48, 3),
+ GATL(HCLK_RKVENC1_PRE, "hclk_rkvenc1_pre", "hclk_rkvenc1_root", HCLK_RKVENC0,
+ 48, 2),
+ GATL(HCLK_RKVDEC0_PRE, "hclk_rkvdec0_pre", "hclk_rkvdec0_root", HCLK_VDPU_ROOT,
+ 40, 5),
+ GATL(ACLK_RKVDEC0_PRE, "aclk_rkvdec0_pre", "aclk_rkvdec0_root", ACLK_VDPU_ROOT,
+ 40, 6),
+ GATL(HCLK_RKVDEC1_PRE, "hclk_rkvdec1_pre", "hclk_rkvdec1_root", HCLK_VDPU_ROOT,
+ 41, 4),
+ GATL(ACLK_RKVDEC1_PRE, "aclk_rkvdec1_pre", "aclk_rkvdec1_root", ACLK_VDPU_ROOT,
+ 41, 5),
+ GATL(ACLK_HDCP0_PRE, "aclk_hdcp0_pre", "aclk_vo0_root", ACLK_VOP_LOW_ROOT,
+ 55, 9),
+ GATL(HCLK_VO0, "hclk_vo0", "hclk_vo0_root", HCLK_VOP_ROOT,
+ 55, 5),
+ GATL(ACLK_HDCP1_PRE, "aclk_hdcp1_pre", "aclk_hdcp1_root", ACLK_VO1USB_TOP_ROOT,
+ 59, 6),
+ GATL(HCLK_VO1, "hclk_vo1", "hclk_vo1_root", HCLK_VO1USB_TOP_ROOT,
+ 59, 9),
+ GATL(ACLK_AV1_PRE, "aclk_av1_pre", "aclk_av1_root", ACLK_VDPU_ROOT,
+ 68, 1),
+ GATL(PCLK_AV1_PRE, "pclk_av1_pre", "pclk_av1_root", HCLK_VDPU_ROOT,
+ 68, 4),
+ GATL(HCLK_SDIO_PRE, "hclk_sdio_pre", "hclk_sdio_root", HCLK_NVM,
+ 75, 1),
+ GATL(PCLK_VO0GRF, "pclk_vo0grf", "pclk_vo0_root", HCLK_VO0,
+ 55, 10),
+ GATL(PCLK_VO1GRF, "pclk_vo1grf", "pclk_vo1_root", HCLK_VO1,
+ 59, 12),
+};
+
+#define RST_BASE(id, reg, bit) [id] = {id, 0x000A00 + (reg) * 4, (bit)}
+#define RST__PHP(id, reg, bit) [id] = {id, 0x008A00 + (reg) * 4, (bit)}
+#define RST_SCRU(id, reg, bit) [id] = {id, 0x100A00 + (reg) * 4, (bit)}
+#define RST_PMU1(id, reg, bit) [id] = {id, 0x300A00 + (reg) * 4, (bit)}
+
+/* mapping table for reset ID to register offset */
+static struct rk_reset_table rk3588_resets[] = {
+ /* SOFTRST_CON01 */
+ RST_BASE(SRST_A_TOP_BIU, 1, 3),
+ RST_BASE(SRST_P_TOP_BIU, 1, 4),
+ RST_BASE(SRST_P_CSIPHY0, 1, 6),
+ RST_BASE(SRST_CSIPHY0, 1, 7),
+ RST_BASE(SRST_P_CSIPHY1, 1, 8),
+ RST_BASE(SRST_CSIPHY1, 1, 9),
+ RST_BASE(SRST_A_TOP_M500_BIU, 1, 15),
+
+ /* SOFTRST_CON02 */
+ RST_BASE(SRST_A_TOP_M400_BIU, 2, 0),
+ RST_BASE(SRST_A_TOP_S200_BIU, 2, 1),
+ RST_BASE(SRST_A_TOP_S400_BIU, 2, 2),
+ RST_BASE(SRST_A_TOP_M300_BIU, 2, 3),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_INIT, 2, 8),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_CMN, 2, 9),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_LANE, 2, 10),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_PCS, 2, 11),
+ RST_BASE(SRST_USBDP_COMBO_PHY1_INIT, 2, 15),
+
+ /* SOFTRST_CON03 */
+ RST_BASE(SRST_USBDP_COMBO_PHY1_CMN, 3, 0),
+ RST_BASE(SRST_USBDP_COMBO_PHY1_LANE, 3, 1),
+ RST_BASE(SRST_USBDP_COMBO_PHY1_PCS, 3, 2),
+ RST_BASE(SRST_DCPHY0, 3, 11),
+ RST_BASE(SRST_P_MIPI_DCPHY0, 3, 14),
+ RST_BASE(SRST_P_MIPI_DCPHY0_GRF, 3, 15),
+
+ /* SOFTRST_CON04 */
+ RST_BASE(SRST_DCPHY1, 4, 0),
+ RST_BASE(SRST_P_MIPI_DCPHY1, 4, 3),
+ RST_BASE(SRST_P_MIPI_DCPHY1_GRF, 4, 4),
+ RST_BASE(SRST_P_APB2ASB_SLV_CDPHY, 4, 5),
+ RST_BASE(SRST_P_APB2ASB_SLV_CSIPHY, 4, 6),
+ RST_BASE(SRST_P_APB2ASB_SLV_VCCIO3_5, 4, 7),
+ RST_BASE(SRST_P_APB2ASB_SLV_VCCIO6, 4, 8),
+ RST_BASE(SRST_P_APB2ASB_SLV_EMMCIO, 4, 9),
+ RST_BASE(SRST_P_APB2ASB_SLV_IOC_TOP, 4, 10),
+ RST_BASE(SRST_P_APB2ASB_SLV_IOC_RIGHT, 4, 11),
+
+ /* SOFTRST_CON05 */
+ RST_BASE(SRST_P_CRU, 5, 0),
+ RST_BASE(SRST_A_CHANNEL_SECURE2VO1USB, 5, 7),
+ RST_BASE(SRST_A_CHANNEL_SECURE2CENTER, 5, 8),
+ RST_BASE(SRST_H_CHANNEL_SECURE2VO1USB, 5, 14),
+ RST_BASE(SRST_H_CHANNEL_SECURE2CENTER, 5, 15),
+
+ /* SOFTRST_CON06 */
+ RST_BASE(SRST_P_CHANNEL_SECURE2VO1USB, 6, 0),
+ RST_BASE(SRST_P_CHANNEL_SECURE2CENTER, 6, 1),
+
+ /* SOFTRST_CON07 */
+ RST_BASE(SRST_H_AUDIO_BIU, 7, 2),
+ RST_BASE(SRST_P_AUDIO_BIU, 7, 3),
+ RST_BASE(SRST_H_I2S0_8CH, 7, 4),
+ RST_BASE(SRST_M_I2S0_8CH_TX, 7, 7),
+ RST_BASE(SRST_M_I2S0_8CH_RX, 7, 10),
+ RST_BASE(SRST_P_ACDCDIG, 7, 11),
+ RST_BASE(SRST_H_I2S2_2CH, 7, 12),
+ RST_BASE(SRST_H_I2S3_2CH, 7, 13),
+
+ /* SOFTRST_CON08 */
+ RST_BASE(SRST_M_I2S2_2CH, 8, 0),
+ RST_BASE(SRST_M_I2S3_2CH, 8, 3),
+ RST_BASE(SRST_DAC_ACDCDIG, 8, 4),
+ RST_BASE(SRST_H_SPDIF0, 8, 14),
+
+ /* SOFTRST_CON09 */
+ RST_BASE(SRST_M_SPDIF0, 9, 1),
+ RST_BASE(SRST_H_SPDIF1, 9, 2),
+ RST_BASE(SRST_M_SPDIF1, 9, 5),
+ RST_BASE(SRST_H_PDM1, 9, 6),
+ RST_BASE(SRST_PDM1, 9, 7),
+
+ /* SOFTRST_CON10 */
+ RST_BASE(SRST_A_BUS_BIU, 10, 1),
+ RST_BASE(SRST_P_BUS_BIU, 10, 2),
+ RST_BASE(SRST_A_GIC, 10, 3),
+ RST_BASE(SRST_A_GIC_DBG, 10, 4),
+ RST_BASE(SRST_A_DMAC0, 10, 5),
+ RST_BASE(SRST_A_DMAC1, 10, 6),
+ RST_BASE(SRST_A_DMAC2, 10, 7),
+ RST_BASE(SRST_P_I2C1, 10, 8),
+ RST_BASE(SRST_P_I2C2, 10, 9),
+ RST_BASE(SRST_P_I2C3, 10, 10),
+ RST_BASE(SRST_P_I2C4, 10, 11),
+ RST_BASE(SRST_P_I2C5, 10, 12),
+ RST_BASE(SRST_P_I2C6, 10, 13),
+ RST_BASE(SRST_P_I2C7, 10, 14),
+ RST_BASE(SRST_P_I2C8, 10, 15),
+
+ /* SOFTRST_CON11 */
+ RST_BASE(SRST_I2C1, 11, 0),
+ RST_BASE(SRST_I2C2, 11, 1),
+ RST_BASE(SRST_I2C3, 11, 2),
+ RST_BASE(SRST_I2C4, 11, 3),
+ RST_BASE(SRST_I2C5, 11, 4),
+ RST_BASE(SRST_I2C6, 11, 5),
+ RST_BASE(SRST_I2C7, 11, 6),
+ RST_BASE(SRST_I2C8, 11, 7),
+ RST_BASE(SRST_P_CAN0, 11, 8),
+ RST_BASE(SRST_CAN0, 11, 9),
+ RST_BASE(SRST_P_CAN1, 11, 10),
+ RST_BASE(SRST_CAN1, 11, 11),
+ RST_BASE(SRST_P_CAN2, 11, 12),
+ RST_BASE(SRST_CAN2, 11, 13),
+ RST_BASE(SRST_P_SARADC, 11, 14),
+
+ /* SOFTRST_CON12 */
+ RST_BASE(SRST_P_TSADC, 12, 0),
+ RST_BASE(SRST_TSADC, 12, 1),
+ RST_BASE(SRST_P_UART1, 12, 2),
+ RST_BASE(SRST_P_UART2, 12, 3),
+ RST_BASE(SRST_P_UART3, 12, 4),
+ RST_BASE(SRST_P_UART4, 12, 5),
+ RST_BASE(SRST_P_UART5, 12, 6),
+ RST_BASE(SRST_P_UART6, 12, 7),
+ RST_BASE(SRST_P_UART7, 12, 8),
+ RST_BASE(SRST_P_UART8, 12, 9),
+ RST_BASE(SRST_P_UART9, 12, 10),
+ RST_BASE(SRST_S_UART1, 12, 13),
+
+ /* SOFTRST_CON13 */
+ RST_BASE(SRST_S_UART2, 13, 0),
+ RST_BASE(SRST_S_UART3, 13, 3),
+ RST_BASE(SRST_S_UART4, 13, 6),
+ RST_BASE(SRST_S_UART5, 13, 9),
+ RST_BASE(SRST_S_UART6, 13, 12),
+ RST_BASE(SRST_S_UART7, 13, 15),
+
+ /* SOFTRST_CON14 */
+ RST_BASE(SRST_S_UART8, 14, 2),
+ RST_BASE(SRST_S_UART9, 14, 5),
+ RST_BASE(SRST_P_SPI0, 14, 6),
+ RST_BASE(SRST_P_SPI1, 14, 7),
+ RST_BASE(SRST_P_SPI2, 14, 8),
+ RST_BASE(SRST_P_SPI3, 14, 9),
+ RST_BASE(SRST_P_SPI4, 14, 10),
+ RST_BASE(SRST_SPI0, 14, 11),
+ RST_BASE(SRST_SPI1, 14, 12),
+ RST_BASE(SRST_SPI2, 14, 13),
+ RST_BASE(SRST_SPI3, 14, 14),
+ RST_BASE(SRST_SPI4, 14, 15),
+
+ /* SOFTRST_CON15 */
+ RST_BASE(SRST_P_WDT0, 15, 0),
+ RST_BASE(SRST_T_WDT0, 15, 1),
+ RST_BASE(SRST_P_SYS_GRF, 15, 2),
+ RST_BASE(SRST_P_PWM1, 15, 3),
+ RST_BASE(SRST_PWM1, 15, 4),
+ RST_BASE(SRST_P_PWM2, 15, 6),
+ RST_BASE(SRST_PWM2, 15, 7),
+ RST_BASE(SRST_P_PWM3, 15, 9),
+ RST_BASE(SRST_PWM3, 15, 10),
+ RST_BASE(SRST_P_BUSTIMER0, 15, 12),
+ RST_BASE(SRST_P_BUSTIMER1, 15, 13),
+ RST_BASE(SRST_BUSTIMER0, 15, 15),
+
+ /* SOFTRST_CON16 */
+ RST_BASE(SRST_BUSTIMER1, 16, 0),
+ RST_BASE(SRST_BUSTIMER2, 16, 1),
+ RST_BASE(SRST_BUSTIMER3, 16, 2),
+ RST_BASE(SRST_BUSTIMER4, 16, 3),
+ RST_BASE(SRST_BUSTIMER5, 16, 4),
+ RST_BASE(SRST_BUSTIMER6, 16, 5),
+ RST_BASE(SRST_BUSTIMER7, 16, 6),
+ RST_BASE(SRST_BUSTIMER8, 16, 7),
+ RST_BASE(SRST_BUSTIMER9, 16, 8),
+ RST_BASE(SRST_BUSTIMER10, 16, 9),
+ RST_BASE(SRST_BUSTIMER11, 16, 10),
+ RST_BASE(SRST_P_MAILBOX0, 16, 11),
+ RST_BASE(SRST_P_MAILBOX1, 16, 12),
+ RST_BASE(SRST_P_MAILBOX2, 16, 13),
+ RST_BASE(SRST_P_GPIO1, 16, 14),
+ RST_BASE(SRST_GPIO1, 16, 15),
+
+ /* SOFTRST_CON17 */
+ RST_BASE(SRST_P_GPIO2, 17, 0),
+ RST_BASE(SRST_GPIO2, 17, 1),
+ RST_BASE(SRST_P_GPIO3, 17, 2),
+ RST_BASE(SRST_GPIO3, 17, 3),
+ RST_BASE(SRST_P_GPIO4, 17, 4),
+ RST_BASE(SRST_GPIO4, 17, 5),
+ RST_BASE(SRST_A_DECOM, 17, 6),
+ RST_BASE(SRST_P_DECOM, 17, 7),
+ RST_BASE(SRST_D_DECOM, 17, 8),
+ RST_BASE(SRST_P_TOP, 17, 9),
+ RST_BASE(SRST_A_GICADB_GIC2CORE_BUS, 17, 11),
+ RST_BASE(SRST_P_DFT2APB, 17, 12),
+ RST_BASE(SRST_P_APB2ASB_MST_TOP, 17, 13),
+ RST_BASE(SRST_P_APB2ASB_MST_CDPHY, 17, 14),
+ RST_BASE(SRST_P_APB2ASB_MST_BOT_RIGHT, 17, 15),
+
+ /* SOFTRST_CON18 */
+ RST_BASE(SRST_P_APB2ASB_MST_IOC_TOP, 18, 0),
+ RST_BASE(SRST_P_APB2ASB_MST_IOC_RIGHT, 18, 1),
+ RST_BASE(SRST_P_APB2ASB_MST_CSIPHY, 18, 2),
+ RST_BASE(SRST_P_APB2ASB_MST_VCCIO3_5, 18, 3),
+ RST_BASE(SRST_P_APB2ASB_MST_VCCIO6, 18, 4),
+ RST_BASE(SRST_P_APB2ASB_MST_EMMCIO, 18, 5),
+ RST_BASE(SRST_A_SPINLOCK, 18, 6),
+ RST_BASE(SRST_P_OTPC_NS, 18, 9),
+ RST_BASE(SRST_OTPC_NS, 18, 10),
+ RST_BASE(SRST_OTPC_ARB, 18, 11),
+
+ /* SOFTRST_CON19 */
+ RST_BASE(SRST_P_BUSIOC, 19, 0),
+ RST_BASE(SRST_P_PMUCM0_INTMUX, 19, 4),
+ RST_BASE(SRST_P_DDRCM0_INTMUX, 19, 5),
+
+ /* SOFTRST_CON20 */
+ RST_BASE(SRST_P_DDR_DFICTL_CH0, 20, 0),
+ RST_BASE(SRST_P_DDR_MON_CH0, 20, 1),
+ RST_BASE(SRST_P_DDR_STANDBY_CH0, 20, 2),
+ RST_BASE(SRST_P_DDR_UPCTL_CH0, 20, 3),
+ RST_BASE(SRST_TM_DDR_MON_CH0, 20, 4),
+ RST_BASE(SRST_P_DDR_GRF_CH01, 20, 5),
+ RST_BASE(SRST_DFI_CH0, 20, 6),
+ RST_BASE(SRST_SBR_CH0, 20, 7),
+ RST_BASE(SRST_DDR_UPCTL_CH0, 20, 8),
+ RST_BASE(SRST_DDR_DFICTL_CH0, 20, 9),
+ RST_BASE(SRST_DDR_MON_CH0, 20, 10),
+ RST_BASE(SRST_DDR_STANDBY_CH0, 20, 11),
+ RST_BASE(SRST_A_DDR_UPCTL_CH0, 20, 12),
+ RST_BASE(SRST_P_DDR_DFICTL_CH1, 20, 13),
+ RST_BASE(SRST_P_DDR_MON_CH1, 20, 14),
+ RST_BASE(SRST_P_DDR_STANDBY_CH1, 20, 15),
+
+ /* SOFTRST_CON21 */
+ RST_BASE(SRST_P_DDR_UPCTL_CH1, 21, 0),
+ RST_BASE(SRST_TM_DDR_MON_CH1, 21, 1),
+ RST_BASE(SRST_DFI_CH1, 21, 2),
+ RST_BASE(SRST_SBR_CH1, 21, 3),
+ RST_BASE(SRST_DDR_UPCTL_CH1, 21, 4),
+ RST_BASE(SRST_DDR_DFICTL_CH1, 21, 5),
+ RST_BASE(SRST_DDR_MON_CH1, 21, 6),
+ RST_BASE(SRST_DDR_STANDBY_CH1, 21, 7),
+ RST_BASE(SRST_A_DDR_UPCTL_CH1, 21, 8),
+ RST_BASE(SRST_A_DDR01_MSCH0, 21, 13),
+ RST_BASE(SRST_A_DDR01_RS_MSCH0, 21, 14),
+ RST_BASE(SRST_A_DDR01_FRS_MSCH0, 21, 15),
+
+ /* SOFTRST_CON22 */
+ RST_BASE(SRST_A_DDR01_SCRAMBLE0, 22, 0),
+ RST_BASE(SRST_A_DDR01_FRS_SCRAMBLE0, 22, 1),
+ RST_BASE(SRST_A_DDR01_MSCH1, 22, 2),
+ RST_BASE(SRST_A_DDR01_RS_MSCH1, 22, 3),
+ RST_BASE(SRST_A_DDR01_FRS_MSCH1, 22, 4),
+ RST_BASE(SRST_A_DDR01_SCRAMBLE1, 22, 5),
+ RST_BASE(SRST_A_DDR01_FRS_SCRAMBLE1, 22, 6),
+ RST_BASE(SRST_P_DDR01_MSCH0, 22, 7),
+ RST_BASE(SRST_P_DDR01_MSCH1, 22, 8),
+
+ /* SOFTRST_CON23 */
+ RST_BASE(SRST_P_DDR_DFICTL_CH2, 23, 0),
+ RST_BASE(SRST_P_DDR_MON_CH2, 23, 1),
+ RST_BASE(SRST_P_DDR_STANDBY_CH2, 23, 2),
+ RST_BASE(SRST_P_DDR_UPCTL_CH2, 23, 3),
+ RST_BASE(SRST_TM_DDR_MON_CH2, 23, 4),
+ RST_BASE(SRST_P_DDR_GRF_CH23, 23, 5),
+ RST_BASE(SRST_DFI_CH2, 23, 6),
+ RST_BASE(SRST_SBR_CH2, 23, 7),
+ RST_BASE(SRST_DDR_UPCTL_CH2, 23, 8),
+ RST_BASE(SRST_DDR_DFICTL_CH2, 23, 9),
+ RST_BASE(SRST_DDR_MON_CH2, 23, 10),
+ RST_BASE(SRST_DDR_STANDBY_CH2, 23, 11),
+ RST_BASE(SRST_A_DDR_UPCTL_CH2, 23, 12),
+ RST_BASE(SRST_P_DDR_DFICTL_CH3, 23, 13),
+ RST_BASE(SRST_P_DDR_MON_CH3, 23, 14),
+ RST_BASE(SRST_P_DDR_STANDBY_CH3, 23, 15),
+
+ /* SOFTRST_CON24 */
+ RST_BASE(SRST_P_DDR_UPCTL_CH3, 24, 0),
+ RST_BASE(SRST_TM_DDR_MON_CH3, 24, 1),
+ RST_BASE(SRST_DFI_CH3, 24, 2),
+ RST_BASE(SRST_SBR_CH3, 24, 3),
+ RST_BASE(SRST_DDR_UPCTL_CH3, 24, 4),
+ RST_BASE(SRST_DDR_DFICTL_CH3, 24, 5),
+ RST_BASE(SRST_DDR_MON_CH3, 24, 6),
+ RST_BASE(SRST_DDR_STANDBY_CH3, 24, 7),
+ RST_BASE(SRST_A_DDR_UPCTL_CH3, 24, 8),
+ RST_BASE(SRST_A_DDR23_MSCH2, 24, 13),
+ RST_BASE(SRST_A_DDR23_RS_MSCH2, 24, 14),
+ RST_BASE(SRST_A_DDR23_FRS_MSCH2, 24, 15),
+
+ /* SOFTRST_CON25 */
+ RST_BASE(SRST_A_DDR23_SCRAMBLE2, 25, 0),
+ RST_BASE(SRST_A_DDR23_FRS_SCRAMBLE2, 25, 1),
+ RST_BASE(SRST_A_DDR23_MSCH3, 25, 2),
+ RST_BASE(SRST_A_DDR23_RS_MSCH3, 25, 3),
+ RST_BASE(SRST_A_DDR23_FRS_MSCH3, 25, 4),
+ RST_BASE(SRST_A_DDR23_SCRAMBLE3, 25, 5),
+ RST_BASE(SRST_A_DDR23_FRS_SCRAMBLE3, 25, 6),
+ RST_BASE(SRST_P_DDR23_MSCH2, 25, 7),
+ RST_BASE(SRST_P_DDR23_MSCH3, 25, 8),
+
+ /* SOFTRST_CON26 */
+ RST_BASE(SRST_ISP1, 26, 3),
+ RST_BASE(SRST_ISP1_VICAP, 26, 4),
+ RST_BASE(SRST_A_ISP1_BIU, 26, 6),
+ RST_BASE(SRST_H_ISP1_BIU, 26, 8),
+
+ /* SOFTRST_CON27 */
+ RST_BASE(SRST_A_RKNN1, 27, 0),
+ RST_BASE(SRST_A_RKNN1_BIU, 27, 1),
+ RST_BASE(SRST_H_RKNN1, 27, 2),
+ RST_BASE(SRST_H_RKNN1_BIU, 27, 3),
+
+ /* SOFTRST_CON28 */
+ RST_BASE(SRST_A_RKNN2, 28, 0),
+ RST_BASE(SRST_A_RKNN2_BIU, 28, 1),
+ RST_BASE(SRST_H_RKNN2, 28, 2),
+ RST_BASE(SRST_H_RKNN2_BIU, 28, 3),
+
+ /* SOFTRST_CON29 */
+ RST_BASE(SRST_A_RKNN_DSU0, 29, 3),
+ RST_BASE(SRST_P_NPUTOP_BIU, 29, 5),
+ RST_BASE(SRST_P_NPU_TIMER, 29, 6),
+ RST_BASE(SRST_NPUTIMER0, 29, 8),
+ RST_BASE(SRST_NPUTIMER1, 29, 9),
+ RST_BASE(SRST_P_NPU_WDT, 29, 10),
+ RST_BASE(SRST_T_NPU_WDT, 29, 11),
+ RST_BASE(SRST_P_NPU_PVTM, 29, 12),
+ RST_BASE(SRST_P_NPU_GRF, 29, 13),
+ RST_BASE(SRST_NPU_PVTM, 29, 14),
+
+ /* SOFTRST_CON30 */
+ RST_BASE(SRST_NPU_PVTPLL, 30, 0),
+ RST_BASE(SRST_H_NPU_CM0_BIU, 30, 2),
+ RST_BASE(SRST_F_NPU_CM0_CORE, 30, 3),
+ RST_BASE(SRST_T_NPU_CM0_JTAG, 30, 4),
+ RST_BASE(SRST_A_RKNN0, 30, 6),
+ RST_BASE(SRST_A_RKNN0_BIU, 30, 7),
+ RST_BASE(SRST_H_RKNN0, 30, 8),
+ RST_BASE(SRST_H_RKNN0_BIU, 30, 9),
+
+ /* SOFTRST_CON31 */
+ RST_BASE(SRST_H_NVM_BIU, 31, 2),
+ RST_BASE(SRST_A_NVM_BIU, 31, 3),
+ RST_BASE(SRST_H_EMMC, 31, 4),
+ RST_BASE(SRST_A_EMMC, 31, 5),
+ RST_BASE(SRST_C_EMMC, 31, 6),
+ RST_BASE(SRST_B_EMMC, 31, 7),
+ RST_BASE(SRST_T_EMMC, 31, 8),
+ RST_BASE(SRST_S_SFC, 31, 9),
+ RST_BASE(SRST_H_SFC, 31, 10),
+ RST_BASE(SRST_H_SFC_XIP, 31, 11),
+
+ /* SOFTRST_CON32 */
+ RST_BASE(SRST_P_GRF, 32, 1),
+ RST_BASE(SRST_P_DEC_BIU, 32, 2),
+ RST_BASE(SRST_P_PHP_BIU, 32, 5),
+ RST_BASE(SRST_A_PCIE_GRIDGE, 32, 8),
+ RST_BASE(SRST_A_PHP_BIU, 32, 9),
+ RST_BASE(SRST_A_GMAC0, 32, 10),
+ RST_BASE(SRST_A_GMAC1, 32, 11),
+ RST_BASE(SRST_A_PCIE_BIU, 32, 12),
+ RST_BASE(SRST_PCIE0_POWER_UP, 32, 13),
+ RST_BASE(SRST_PCIE1_POWER_UP, 32, 14),
+ RST_BASE(SRST_PCIE2_POWER_UP, 32, 15),
+
+ /* SOFTRST_CON33 */
+ RST_BASE(SRST_PCIE3_POWER_UP, 33, 0),
+ RST_BASE(SRST_PCIE4_POWER_UP, 33, 1),
+ RST_BASE(SRST_P_PCIE0, 33, 12),
+ RST_BASE(SRST_P_PCIE1, 33, 13),
+ RST_BASE(SRST_P_PCIE2, 33, 14),
+ RST_BASE(SRST_P_PCIE3, 33, 15),
+
+ /* SOFTRST_CON34 */
+ RST_BASE(SRST_P_PCIE4, 34, 0),
+ RST_BASE(SRST_A_PHP_GIC_ITS, 34, 6),
+ RST_BASE(SRST_A_MMU_PCIE, 34, 7),
+ RST_BASE(SRST_A_MMU_PHP, 34, 8),
+ RST_BASE(SRST_A_MMU_BIU, 34, 9),
+
+ /* SOFTRST_CON35 */
+ RST_BASE(SRST_A_USB3OTG2, 35, 7),
+
+ /* SOFTRST_CON37 */
+ RST_BASE(SRST_PMALIVE0, 37, 4),
+ RST_BASE(SRST_PMALIVE1, 37, 5),
+ RST_BASE(SRST_PMALIVE2, 37, 6),
+ RST_BASE(SRST_A_SATA0, 37, 7),
+ RST_BASE(SRST_A_SATA1, 37, 8),
+ RST_BASE(SRST_A_SATA2, 37, 9),
+ RST_BASE(SRST_RXOOB0, 37, 10),
+ RST_BASE(SRST_RXOOB1, 37, 11),
+ RST_BASE(SRST_RXOOB2, 37, 12),
+ RST_BASE(SRST_ASIC0, 37, 13),
+ RST_BASE(SRST_ASIC1, 37, 14),
+ RST_BASE(SRST_ASIC2, 37, 15),
+
+ /* SOFTRST_CON40 */
+ RST_BASE(SRST_A_RKVDEC_CCU, 40, 2),
+ RST_BASE(SRST_H_RKVDEC0, 40, 3),
+ RST_BASE(SRST_A_RKVDEC0, 40, 4),
+ RST_BASE(SRST_H_RKVDEC0_BIU, 40, 5),
+ RST_BASE(SRST_A_RKVDEC0_BIU, 40, 6),
+ RST_BASE(SRST_RKVDEC0_CA, 40, 7),
+ RST_BASE(SRST_RKVDEC0_HEVC_CA, 40, 8),
+ RST_BASE(SRST_RKVDEC0_CORE, 40, 9),
+
+ /* SOFTRST_CON41 */
+ RST_BASE(SRST_H_RKVDEC1, 41, 2),
+ RST_BASE(SRST_A_RKVDEC1, 41, 3),
+ RST_BASE(SRST_H_RKVDEC1_BIU, 41, 4),
+ RST_BASE(SRST_A_RKVDEC1_BIU, 41, 5),
+ RST_BASE(SRST_RKVDEC1_CA, 41, 6),
+ RST_BASE(SRST_RKVDEC1_HEVC_CA, 41, 7),
+ RST_BASE(SRST_RKVDEC1_CORE, 41, 8),
+
+ /* SOFTRST_CON42 */
+ RST_BASE(SRST_A_USB_BIU, 42, 2),
+ RST_BASE(SRST_H_USB_BIU, 42, 3),
+ RST_BASE(SRST_A_USB3OTG0, 42, 4),
+ RST_BASE(SRST_A_USB3OTG1, 42, 7),
+ RST_BASE(SRST_H_HOST0, 42, 10),
+ RST_BASE(SRST_H_HOST_ARB0, 42, 11),
+ RST_BASE(SRST_H_HOST1, 42, 12),
+ RST_BASE(SRST_H_HOST_ARB1, 42, 13),
+ RST_BASE(SRST_A_USB_GRF, 42, 14),
+ RST_BASE(SRST_C_USB2P0_HOST0, 42, 15),
+
+ /* SOFTRST_CON43 */
+ RST_BASE(SRST_C_USB2P0_HOST1, 43, 0),
+ RST_BASE(SRST_HOST_UTMI0, 43, 1),
+ RST_BASE(SRST_HOST_UTMI1, 43, 2),
+
+ /* SOFTRST_CON44 */
+ RST_BASE(SRST_A_VDPU_BIU, 44, 4),
+ RST_BASE(SRST_A_VDPU_LOW_BIU, 44, 5),
+ RST_BASE(SRST_H_VDPU_BIU, 44, 6),
+ RST_BASE(SRST_A_JPEG_DECODER_BIU, 44, 7),
+ RST_BASE(SRST_A_VPU, 44, 8),
+ RST_BASE(SRST_H_VPU, 44, 9),
+ RST_BASE(SRST_A_JPEG_ENCODER0, 44, 10),
+ RST_BASE(SRST_H_JPEG_ENCODER0, 44, 11),
+ RST_BASE(SRST_A_JPEG_ENCODER1, 44, 12),
+ RST_BASE(SRST_H_JPEG_ENCODER1, 44, 13),
+ RST_BASE(SRST_A_JPEG_ENCODER2, 44, 14),
+ RST_BASE(SRST_H_JPEG_ENCODER2, 44, 15),
+
+ /* SOFTRST_CON45 */
+ RST_BASE(SRST_A_JPEG_ENCODER3, 45, 0),
+ RST_BASE(SRST_H_JPEG_ENCODER3, 45, 1),
+ RST_BASE(SRST_A_JPEG_DECODER, 45, 2),
+ RST_BASE(SRST_H_JPEG_DECODER, 45, 3),
+ RST_BASE(SRST_H_IEP2P0, 45, 4),
+ RST_BASE(SRST_A_IEP2P0, 45, 5),
+ RST_BASE(SRST_IEP2P0_CORE, 45, 6),
+ RST_BASE(SRST_H_RGA2, 45, 7),
+ RST_BASE(SRST_A_RGA2, 45, 8),
+ RST_BASE(SRST_RGA2_CORE, 45, 9),
+ RST_BASE(SRST_H_RGA3_0, 45, 10),
+ RST_BASE(SRST_A_RGA3_0, 45, 11),
+ RST_BASE(SRST_RGA3_0_CORE, 45, 12),
+
+ /* SOFTRST_CON47 */
+ RST_BASE(SRST_H_RKVENC0_BIU, 47, 2),
+ RST_BASE(SRST_A_RKVENC0_BIU, 47, 3),
+ RST_BASE(SRST_H_RKVENC0, 47, 4),
+ RST_BASE(SRST_A_RKVENC0, 47, 5),
+ RST_BASE(SRST_RKVENC0_CORE, 47, 6),
+
+ /* SOFTRST_CON48 */
+ RST_BASE(SRST_H_RKVENC1_BIU, 48, 2),
+ RST_BASE(SRST_A_RKVENC1_BIU, 48, 3),
+ RST_BASE(SRST_H_RKVENC1, 48, 4),
+ RST_BASE(SRST_A_RKVENC1, 48, 5),
+ RST_BASE(SRST_RKVENC1_CORE, 48, 6),
+
+ /* SOFTRST_CON49 */
+ RST_BASE(SRST_A_VI_BIU, 49, 3),
+ RST_BASE(SRST_H_VI_BIU, 49, 4),
+ RST_BASE(SRST_P_VI_BIU, 49, 5),
+ RST_BASE(SRST_D_VICAP, 49, 6),
+ RST_BASE(SRST_A_VICAP, 49, 7),
+ RST_BASE(SRST_H_VICAP, 49, 8),
+ RST_BASE(SRST_ISP0, 49, 10),
+ RST_BASE(SRST_ISP0_VICAP, 49, 11),
+
+ /* SOFTRST_CON50 */
+ RST_BASE(SRST_FISHEYE0, 50, 0),
+ RST_BASE(SRST_FISHEYE1, 50, 3),
+ RST_BASE(SRST_P_CSI_HOST_0, 50, 4),
+ RST_BASE(SRST_P_CSI_HOST_1, 50, 5),
+ RST_BASE(SRST_P_CSI_HOST_2, 50, 6),
+ RST_BASE(SRST_P_CSI_HOST_3, 50, 7),
+ RST_BASE(SRST_P_CSI_HOST_4, 50, 8),
+ RST_BASE(SRST_P_CSI_HOST_5, 50, 9),
+
+ /* SOFTRST_CON51 */
+ RST_BASE(SRST_CSIHOST0_VICAP, 51, 4),
+ RST_BASE(SRST_CSIHOST1_VICAP, 51, 5),
+ RST_BASE(SRST_CSIHOST2_VICAP, 51, 6),
+ RST_BASE(SRST_CSIHOST3_VICAP, 51, 7),
+ RST_BASE(SRST_CSIHOST4_VICAP, 51, 8),
+ RST_BASE(SRST_CSIHOST5_VICAP, 51, 9),
+ RST_BASE(SRST_CIFIN, 51, 13),
+
+ /* SOFTRST_CON52 */
+ RST_BASE(SRST_A_VOP_BIU, 52, 4),
+ RST_BASE(SRST_A_VOP_LOW_BIU, 52, 5),
+ RST_BASE(SRST_H_VOP_BIU, 52, 6),
+ RST_BASE(SRST_P_VOP_BIU, 52, 7),
+ RST_BASE(SRST_H_VOP, 52, 8),
+ RST_BASE(SRST_A_VOP, 52, 9),
+ RST_BASE(SRST_D_VOP0, 52, 13),
+ RST_BASE(SRST_D_VOP2HDMI_BRIDGE0, 52, 14),
+ RST_BASE(SRST_D_VOP2HDMI_BRIDGE1, 52, 15),
+
+ /* SOFTRST_CON53 */
+ RST_BASE(SRST_D_VOP1, 53, 0),
+ RST_BASE(SRST_D_VOP2, 53, 1),
+ RST_BASE(SRST_D_VOP3, 53, 2),
+ RST_BASE(SRST_P_VOPGRF, 53, 3),
+ RST_BASE(SRST_P_DSIHOST0, 53, 4),
+ RST_BASE(SRST_P_DSIHOST1, 53, 5),
+ RST_BASE(SRST_DSIHOST0, 53, 6),
+ RST_BASE(SRST_DSIHOST1, 53, 7),
+ RST_BASE(SRST_VOP_PMU, 53, 8),
+ RST_BASE(SRST_P_VOP_CHANNEL_BIU, 53, 9),
+
+ /* SOFTRST_CON55 */
+ RST_BASE(SRST_H_VO0_BIU, 55, 5),
+ RST_BASE(SRST_H_VO0_S_BIU, 55, 6),
+ RST_BASE(SRST_P_VO0_BIU, 55, 7),
+ RST_BASE(SRST_P_VO0_S_BIU, 55, 8),
+ RST_BASE(SRST_A_HDCP0_BIU, 55, 9),
+ RST_BASE(SRST_P_VO0GRF, 55, 10),
+ RST_BASE(SRST_H_HDCP_KEY0, 55, 11),
+ RST_BASE(SRST_A_HDCP0, 55, 12),
+ RST_BASE(SRST_H_HDCP0, 55, 13),
+ RST_BASE(SRST_HDCP0, 55, 15),
+
+ /* SOFTRST_CON56 */
+ RST_BASE(SRST_P_TRNG0, 56, 1),
+ RST_BASE(SRST_DP0, 56, 8),
+ RST_BASE(SRST_DP1, 56, 9),
+ RST_BASE(SRST_H_I2S4_8CH, 56, 10),
+ RST_BASE(SRST_M_I2S4_8CH_TX, 56, 13),
+ RST_BASE(SRST_H_I2S8_8CH, 56, 14),
+
+ /* SOFTRST_CON57 */
+ RST_BASE(SRST_M_I2S8_8CH_TX, 57, 1),
+ RST_BASE(SRST_H_SPDIF2_DP0, 57, 2),
+ RST_BASE(SRST_M_SPDIF2_DP0, 57, 6),
+ RST_BASE(SRST_H_SPDIF5_DP1, 57, 7),
+ RST_BASE(SRST_M_SPDIF5_DP1, 57, 11),
+
+ /* SOFTRST_CON59 */
+ RST_BASE(SRST_A_HDCP1_BIU, 59, 6),
+ RST_BASE(SRST_A_HDMIRX_BIU, 59, 7),
+ RST_BASE(SRST_A_VO1_BIU, 59, 8),
+ RST_BASE(SRST_H_VOP1_BIU, 59, 9),
+ RST_BASE(SRST_H_VOP1_S_BIU, 59, 10),
+ RST_BASE(SRST_P_VOP1_BIU, 59, 11),
+ RST_BASE(SRST_P_VO1GRF, 59, 12),
+ RST_BASE(SRST_P_VO1_S_BIU, 59, 13),
+
+ /* SOFTRST_CON60 */
+ RST_BASE(SRST_H_I2S7_8CH, 60, 0),
+ RST_BASE(SRST_M_I2S7_8CH_RX, 60, 3),
+ RST_BASE(SRST_H_HDCP_KEY1, 60, 4),
+ RST_BASE(SRST_A_HDCP1, 60, 5),
+ RST_BASE(SRST_H_HDCP1, 60, 6),
+ RST_BASE(SRST_HDCP1, 60, 8),
+ RST_BASE(SRST_P_TRNG1, 60, 10),
+ RST_BASE(SRST_P_HDMITX0, 60, 11),
+
+ /* SOFTRST_CON61 */
+ RST_BASE(SRST_HDMITX0_REF, 61, 0),
+ RST_BASE(SRST_P_HDMITX1, 61, 2),
+ RST_BASE(SRST_HDMITX1_REF, 61, 7),
+ RST_BASE(SRST_A_HDMIRX, 61, 9),
+ RST_BASE(SRST_P_HDMIRX, 61, 10),
+ RST_BASE(SRST_HDMIRX_REF, 61, 11),
+
+ /* SOFTRST_CON62 */
+ RST_BASE(SRST_P_EDP0, 62, 0),
+ RST_BASE(SRST_EDP0_24M, 62, 1),
+ RST_BASE(SRST_P_EDP1, 62, 3),
+ RST_BASE(SRST_EDP1_24M, 62, 4),
+ RST_BASE(SRST_M_I2S5_8CH_TX, 62, 8),
+ RST_BASE(SRST_H_I2S5_8CH, 62, 12),
+ RST_BASE(SRST_M_I2S6_8CH_TX, 62, 15),
+
+ /* SOFTRST_CON63 */
+ RST_BASE(SRST_M_I2S6_8CH_RX, 63, 2),
+ RST_BASE(SRST_H_I2S6_8CH, 63, 3),
+ RST_BASE(SRST_H_SPDIF3, 63, 4),
+ RST_BASE(SRST_M_SPDIF3, 63, 7),
+ RST_BASE(SRST_H_SPDIF4, 63, 8),
+ RST_BASE(SRST_M_SPDIF4, 63, 11),
+ RST_BASE(SRST_H_SPDIFRX0, 63, 12),
+ RST_BASE(SRST_M_SPDIFRX0, 63, 13),
+ RST_BASE(SRST_H_SPDIFRX1, 63, 14),
+ RST_BASE(SRST_M_SPDIFRX1, 63, 15),
+
+ /* SOFTRST_CON64 */
+ RST_BASE(SRST_H_SPDIFRX2, 64, 0),
+ RST_BASE(SRST_M_SPDIFRX2, 64, 1),
+ RST_BASE(SRST_LINKSYM_HDMITXPHY0, 64, 12),
+ RST_BASE(SRST_LINKSYM_HDMITXPHY1, 64, 13),
+ RST_BASE(SRST_VO1_BRIDGE0, 64, 14),
+ RST_BASE(SRST_VO1_BRIDGE1, 64, 15),
+
+ /* SOFTRST_CON65 */
+ RST_BASE(SRST_H_I2S9_8CH, 65, 0),
+ RST_BASE(SRST_M_I2S9_8CH_RX, 65, 3),
+ RST_BASE(SRST_H_I2S10_8CH, 65, 4),
+ RST_BASE(SRST_M_I2S10_8CH_RX, 65, 7),
+ RST_BASE(SRST_P_S_HDMIRX, 65, 8),
+
+ /* SOFTRST_CON66 */
+ RST_BASE(SRST_GPU, 66, 4),
+ RST_BASE(SRST_SYS_GPU, 66, 5),
+ RST_BASE(SRST_A_S_GPU_BIU, 66, 8),
+ RST_BASE(SRST_A_M0_GPU_BIU, 66, 9),
+ RST_BASE(SRST_A_M1_GPU_BIU, 66, 10),
+ RST_BASE(SRST_A_M2_GPU_BIU, 66, 11),
+ RST_BASE(SRST_A_M3_GPU_BIU, 66, 12),
+ RST_BASE(SRST_P_GPU_BIU, 66, 14),
+ RST_BASE(SRST_P_GPU_PVTM, 66, 15),
+
+ /* SOFTRST_CON67 */
+ RST_BASE(SRST_GPU_PVTM, 67, 0),
+ RST_BASE(SRST_P_GPU_GRF, 67, 2),
+ RST_BASE(SRST_GPU_PVTPLL, 67, 3),
+ RST_BASE(SRST_GPU_JTAG, 67, 4),
+
+ /* SOFTRST_CON68 */
+ RST_BASE(SRST_A_AV1_BIU, 68, 1),
+ RST_BASE(SRST_A_AV1, 68, 2),
+ RST_BASE(SRST_P_AV1_BIU, 68, 4),
+ RST_BASE(SRST_P_AV1, 68, 5),
+
+ /* SOFTRST_CON69 */
+ RST_BASE(SRST_A_DDR_BIU, 69, 4),
+ RST_BASE(SRST_A_DMA2DDR, 69, 5),
+ RST_BASE(SRST_A_DDR_SHAREMEM, 69, 6),
+ RST_BASE(SRST_A_DDR_SHAREMEM_BIU, 69, 7),
+ RST_BASE(SRST_A_CENTER_S200_BIU, 69, 10),
+ RST_BASE(SRST_A_CENTER_S400_BIU, 69, 11),
+ RST_BASE(SRST_H_AHB2APB, 69, 12),
+ RST_BASE(SRST_H_CENTER_BIU, 69, 13),
+ RST_BASE(SRST_F_DDR_CM0_CORE, 69, 14),
+
+ /* SOFTRST_CON70 */
+ RST_BASE(SRST_DDR_TIMER0, 70, 0),
+ RST_BASE(SRST_DDR_TIMER1, 70, 1),
+ RST_BASE(SRST_T_WDT_DDR, 70, 2),
+ RST_BASE(SRST_T_DDR_CM0_JTAG, 70, 3),
+ RST_BASE(SRST_P_CENTER_GRF, 70, 5),
+ RST_BASE(SRST_P_AHB2APB, 70, 6),
+ RST_BASE(SRST_P_WDT, 70, 7),
+ RST_BASE(SRST_P_TIMER, 70, 8),
+ RST_BASE(SRST_P_DMA2DDR, 70, 9),
+ RST_BASE(SRST_P_SHAREMEM, 70, 10),
+ RST_BASE(SRST_P_CENTER_BIU, 70, 11),
+ RST_BASE(SRST_P_CENTER_CHANNEL_BIU, 70, 12),
+
+ /* SOFTRST_CON72 */
+ RST_BASE(SRST_P_USBDPGRF0, 72, 1),
+ RST_BASE(SRST_P_USBDPPHY0, 72, 2),
+ RST_BASE(SRST_P_USBDPGRF1, 72, 3),
+ RST_BASE(SRST_P_USBDPPHY1, 72, 4),
+ RST_BASE(SRST_P_HDPTX0, 72, 5),
+ RST_BASE(SRST_P_HDPTX1, 72, 6),
+ RST_BASE(SRST_P_APB2ASB_SLV_BOT_RIGHT, 72, 7),
+ RST_BASE(SRST_P_USB2PHY_U3_0_GRF0, 72, 8),
+ RST_BASE(SRST_P_USB2PHY_U3_1_GRF0, 72, 9),
+ RST_BASE(SRST_P_USB2PHY_U2_0_GRF0, 72, 10),
+ RST_BASE(SRST_P_USB2PHY_U2_1_GRF0, 72, 11),
+ RST_BASE(SRST_HDPTX0_ROPLL, 72, 12),
+ RST_BASE(SRST_HDPTX0_LCPLL, 72, 13),
+ RST_BASE(SRST_HDPTX0, 72, 14),
+ RST_BASE(SRST_HDPTX1_ROPLL, 72, 15),
+
+ /* SOFTRST_CON73 */
+ RST_BASE(SRST_HDPTX1_LCPLL, 73, 0),
+ RST_BASE(SRST_HDPTX1, 73, 1),
+ RST_BASE(SRST_HDPTX0_HDMIRXPHY_SET, 73, 2),
+ RST_BASE(SRST_USBDP_COMBO_PHY0, 73, 3),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_LCPLL, 73, 4),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_ROPLL, 73, 5),
+ RST_BASE(SRST_USBDP_COMBO_PHY0_PCS_HS, 73, 6),
+ RST_BASE(SRST_USBDP_COMBO_PHY1, 73, 7),
+ RST_BASE(SRST_USBDP_COMBO_PHY1_LCPLL, 73, 8),
+ RST_BASE(SRST_USBDP_COMBO_PHY1_ROPLL, 73, 9),
+ RST_BASE(SRST_USBDP_COMBO_PHY1_PCS_HS, 73, 10),
+ RST_BASE(SRST_HDMIHDP0, 73, 12),
+ RST_BASE(SRST_HDMIHDP1, 73, 13),
+
+ /* SOFTRST_CON74 */
+ RST_BASE(SRST_A_VO1USB_TOP_BIU, 74, 1),
+ RST_BASE(SRST_H_VO1USB_TOP_BIU, 74, 3),
+
+ /* SOFTRST_CON75 */
+ RST_BASE(SRST_H_SDIO_BIU, 75, 1),
+ RST_BASE(SRST_H_SDIO, 75, 2),
+ RST_BASE(SRST_SDIO, 75, 3),
+
+ /* SOFTRST_CON76 */
+ RST_BASE(SRST_H_RGA3_BIU, 76, 2),
+ RST_BASE(SRST_A_RGA3_BIU, 76, 3),
+ RST_BASE(SRST_H_RGA3_1, 76, 4),
+ RST_BASE(SRST_A_RGA3_1, 76, 5),
+ RST_BASE(SRST_RGA3_1_CORE, 76, 6),
+
+ /* SOFTRST_CON77 */
+ RST_BASE(SRST_REF_PIPE_PHY0, 77, 6),
+ RST_BASE(SRST_REF_PIPE_PHY1, 77, 7),
+ RST_BASE(SRST_REF_PIPE_PHY2, 77, 8),
+
+ /* PHPTOPCRU_SOFTRST_CON00 */
+ RST__PHP(SRST_P_PHPTOP_CRU, 0, 1),
+ RST__PHP(SRST_P_PCIE2_GRF0, 0, 2),
+ RST__PHP(SRST_P_PCIE2_GRF1, 0, 3),
+ RST__PHP(SRST_P_PCIE2_GRF2, 0, 4),
+ RST__PHP(SRST_P_PCIE2_PHY0, 0, 5),
+ RST__PHP(SRST_P_PCIE2_PHY1, 0, 6),
+ RST__PHP(SRST_P_PCIE2_PHY2, 0, 7),
+ RST__PHP(SRST_P_PCIE3_PHY, 0, 8),
+ RST__PHP(SRST_P_APB2ASB_SLV_CHIP_TOP, 0, 9),
+ RST__PHP(SRST_PCIE30_PHY, 0, 10),
+
+ /* PMU1CRU_SOFTRST_CON00 */
+ RST_PMU1(SRST_H_PMU1_BIU, 0, 10),
+ RST_PMU1(SRST_P_PMU1_BIU, 0, 11),
+ RST_PMU1(SRST_H_PMU_CM0_BIU, 0, 12),
+ RST_PMU1(SRST_F_PMU_CM0_CORE, 0, 13),
+ RST_PMU1(SRST_T_PMU1_CM0_JTAG, 0, 14),
+
+ /* PMU1CRU_SOFTRST_CON01 */
+ RST_PMU1(SRST_DDR_FAIL_SAFE, 1, 1),
+ RST_PMU1(SRST_P_CRU_PMU1, 1, 2),
+ RST_PMU1(SRST_P_PMU1_GRF, 1, 4),
+ RST_PMU1(SRST_P_PMU1_IOC, 1, 5),
+ RST_PMU1(SRST_P_PMU1WDT, 1, 6),
+ RST_PMU1(SRST_T_PMU1WDT, 1, 7),
+ RST_PMU1(SRST_P_PMU1TIMER, 1, 8),
+ RST_PMU1(SRST_PMU1TIMER0, 1, 10),
+ RST_PMU1(SRST_PMU1TIMER1, 1, 11),
+ RST_PMU1(SRST_P_PMU1PWM, 1, 12),
+ RST_PMU1(SRST_PMU1PWM, 1, 13),
+
+ /* PMU1CRU_SOFTRST_CON02 */
+ RST_PMU1(SRST_P_I2C0, 2, 1),
+ RST_PMU1(SRST_I2C0, 2, 2),
+ RST_PMU1(SRST_S_UART0, 2, 5),
+ RST_PMU1(SRST_P_UART0, 2, 6),
+ RST_PMU1(SRST_H_I2S1_8CH, 2, 7),
+ RST_PMU1(SRST_M_I2S1_8CH_TX, 2, 10),
+ RST_PMU1(SRST_M_I2S1_8CH_RX, 2, 13),
+ RST_PMU1(SRST_H_PDM0, 2, 14),
+ RST_PMU1(SRST_PDM0, 2, 15),
+
+ /* PMU1CRU_SOFTRST_CON03 */
+ RST_PMU1(SRST_H_VAD, 3, 0),
+ RST_PMU1(SRST_HDPTX0_INIT, 3, 11),
+ RST_PMU1(SRST_HDPTX0_CMN, 3, 12),
+ RST_PMU1(SRST_HDPTX0_LANE, 3, 13),
+ RST_PMU1(SRST_HDPTX1_INIT, 3, 15),
+
+ /* PMU1CRU_SOFTRST_CON04 */
+ RST_PMU1(SRST_HDPTX1_CMN, 4, 0),
+ RST_PMU1(SRST_HDPTX1_LANE, 4, 1),
+ RST_PMU1(SRST_M_MIPI_DCPHY0, 4, 3),
+ RST_PMU1(SRST_S_MIPI_DCPHY0, 4, 4),
+ RST_PMU1(SRST_M_MIPI_DCPHY1, 4, 5),
+ RST_PMU1(SRST_S_MIPI_DCPHY1, 4, 6),
+ RST_PMU1(SRST_OTGPHY_U3_0, 4, 7),
+ RST_PMU1(SRST_OTGPHY_U3_1, 4, 8),
+ RST_PMU1(SRST_OTGPHY_U2_0, 4, 9),
+ RST_PMU1(SRST_OTGPHY_U2_1, 4, 10),
+
+ /* PMU1CRU_SOFTRST_CON05 */
+ RST_PMU1(SRST_P_PMU0GRF, 5, 3),
+ RST_PMU1(SRST_P_PMU0IOC, 5, 4),
+ RST_PMU1(SRST_P_GPIO0, 5, 5),
+ RST_PMU1(SRST_GPIO0, 5, 6),
+
+ /* SECURECRU_SOFTRST_CON00 */
+ RST_SCRU(SRST_A_SECURE_NS_BIU, 0, 10),
+ RST_SCRU(SRST_H_SECURE_NS_BIU, 0, 11),
+ RST_SCRU(SRST_A_SECURE_S_BIU, 0, 12),
+ RST_SCRU(SRST_H_SECURE_S_BIU, 0, 13),
+ RST_SCRU(SRST_P_SECURE_S_BIU, 0, 14),
+ RST_SCRU(SRST_CRYPTO_CORE, 0, 15),
+
+ /* SECURECRU_SOFTRST_CON01 */
+ RST_SCRU(SRST_CRYPTO_PKA, 1, 0),
+ RST_SCRU(SRST_CRYPTO_RNG, 1, 1),
+ RST_SCRU(SRST_A_CRYPTO, 1, 2),
+ RST_SCRU(SRST_H_CRYPTO, 1, 3),
+ RST_SCRU(SRST_KEYLADDER_CORE, 1, 9),
+ RST_SCRU(SRST_KEYLADDER_RNG, 1, 10),
+ RST_SCRU(SRST_A_KEYLADDER, 1, 11),
+ RST_SCRU(SRST_H_KEYLADDER, 1, 12),
+ RST_SCRU(SRST_P_OTPC_S, 1, 13),
+ RST_SCRU(SRST_OTPC_S, 1, 14),
+ RST_SCRU(SRST_WDT_S, 1, 15),
+
+ /* SECURECRU_SOFTRST_CON02 */
+ RST_SCRU(SRST_T_WDT_S, 2, 0),
+ RST_SCRU(SRST_H_BOOTROM, 2, 1),
+ RST_SCRU(SRST_A_DCF, 2, 2),
+ RST_SCRU(SRST_P_DCF, 2, 3),
+ RST_SCRU(SRST_H_BOOTROM_NS, 2, 5),
+ RST_SCRU(SRST_P_KEYLADDER, 2, 14),
+ RST_SCRU(SRST_H_TRNG_S, 2, 15),
+
+ /* SECURECRU_SOFTRST_CON03 */
+ RST_SCRU(SRST_H_TRNG_NS, 3, 0),
+ RST_SCRU(SRST_D_SDMMC_BUFFER, 3, 1),
+ RST_SCRU(SRST_H_SDMMC, 3, 2),
+ RST_SCRU(SRST_H_SDMMC_BUFFER, 3, 3),
+ RST_SCRU(SRST_SDMMC, 3, 4),
+ RST_SCRU(SRST_P_TRNG_CHK, 3, 5),
+ RST_SCRU(SRST_TRNG_S, 3, 6),
+};
+
+
+
+static int
+rk3588_cru_probe(device_t dev)
+{
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+ if (ofw_bus_is_compatible(dev, "rockchip,rk3588-cru")) {
+ device_set_desc(dev, "Rockchip RK3588 Clock & Reset Unit");
+ return (BUS_PROBE_DEFAULT);
+ }
+ return (ENXIO);
+}
+
+static int
+rk3588_cru_attach(device_t dev)
+{
+ struct rk_cru_softc *sc;
+
+ sc = device_get_softc(dev);
+ sc->dev = dev;
+ sc->clks = rk3588_clks;
+ sc->nclks = nitems(rk3588_clks);
+ sc->gates = rk3588_gates;
+ sc->ngates = nitems(rk3588_gates);
+ sc->reset_table = rk3588_resets;
+ sc->reset_num = nitems(rk3588_resets);
+ return (rk_cru_attach(dev));
+}
+
+static device_method_t methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, rk3588_cru_probe),
+ DEVMETHOD(device_attach, rk3588_cru_attach),
+
+ DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(rk3588_cru, rk3588_cru_driver, methods,
+ sizeof(struct rk_cru_softc), rk_cru_driver);
+
+EARLY_DRIVER_MODULE(rk3588_cru, simplebus, rk3588_cru_driver,
+ 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_EARLY);
diff --git a/sys/dev/clk/rockchip/rk_clk_composite.h b/sys/dev/clk/rockchip/rk_clk_composite.h
--- a/sys/dev/clk/rockchip/rk_clk_composite.h
+++ b/sys/dev/clk/rockchip/rk_clk_composite.h
@@ -41,6 +41,9 @@
uint32_t div_shift;
uint32_t div_width;
+ uint32_t gate_offset;
+ uint32_t gate_shift;
+
uint32_t flags;
};
@@ -48,6 +51,8 @@
#define RK_CLK_COMPOSITE_DIV_EXP 0x0002 /* Register 0, 1, 2, 2, ... */
/* Divider 1, 2, 4, 8, ... */
#define RK_CLK_COMPOSITE_GRF 0x0004 /* Use syscon registers instead of CRU's */
+#define RK_CLK_COMPOSITE_HAVE_GATE 0x0008
+#define RK_CLK_COMPOSITE_DIV_HALF 0x0010 /* Divider is based by 0.5 */
int rk_clk_composite_register(struct clkdom *clkdom,
struct rk_clk_composite_def *clkdef);
diff --git a/sys/dev/clk/rockchip/rk_clk_composite.c b/sys/dev/clk/rockchip/rk_clk_composite.c
--- a/sys/dev/clk/rockchip/rk_clk_composite.c
+++ b/sys/dev/clk/rockchip/rk_clk_composite.c
@@ -47,6 +47,9 @@
uint32_t div_width;
uint32_t div_mask;
+ uint32_t gate_offset;
+ uint32_t gate_shift;
+
uint32_t flags;
struct syscon *grf;
@@ -163,28 +166,87 @@
return (0);
}
+static int
+rk_clk_composite_get_gate(struct clknode *clk, bool *enabled)
+{
+ struct rk_clk_composite_sc *sc;
+ uint32_t val = 0;
+
+ sc = clknode_get_softc(clk);
+
+ if ((sc->flags & RK_CLK_COMPOSITE_HAVE_GATE) == 0)
+ return (ENXIO);
+
+ DEVICE_LOCK(clk);
+ READ4(clk, sc->gate_offset, &val);
+ DEVICE_UNLOCK(clk);
+
+ *enabled = ((val >> sc->gate_shift) & 1) ? false : true;
+
+ return (0);
+}
+
+static int
+rk_clk_composite_set_gate(struct clknode *clk, bool enable)
+{
+ struct rk_clk_composite_sc *sc;
+ uint32_t val = 0;
+
+ sc = clknode_get_softc(clk);
+
+ if ((sc->flags & RK_CLK_COMPOSITE_HAVE_GATE) == 0)
+ return (0);
+
+ DEVICE_LOCK(clk);
+ READ4(clk, sc->gate_offset, &val);
+
+
+ val = 0;
+ if (!enable)
+ val |= 1 << sc->gate_shift;
+ val |= (1 << sc->gate_shift) << RK_CLK_COMPOSITE_MASK_SHIFT;
+ WRITE4(clk, sc->gate_offset, val);
+ DEVICE_UNLOCK(clk);
+
+ dprintf("Set gate to 0x%08X, reg: 0x%08X\n", val, sc->gate_offset);
+
+ return (0);
+}
+
static int
rk_clk_composite_recalc(struct clknode *clk, uint64_t *freq)
{
struct rk_clk_composite_sc *sc;
uint32_t reg, div;
+ bool enabled;
+ int rv;
sc = clknode_get_softc(clk);
DEVICE_LOCK(clk);
-
READ4(clk, sc->muxdiv_offset, ®);
- dprintf("Read: muxdiv_offset=%x, val=%x\n", sc->muxdiv_offset, reg);
-
DEVICE_UNLOCK(clk);
+
+rv = rk_clk_composite_get_gate(clk, &enabled);
+if (rv != 0) enabled = true;
+
div = ((reg & sc->div_mask) >> sc->div_shift);
- if (sc->flags & RK_CLK_COMPOSITE_DIV_EXP)
- div = 1 << div;
- else
- div += 1;
- dprintf("parent_freq=%ju, div=%u\n", *freq, div);
- *freq = *freq / div;
+ dprintf("Read: offset=%x, reg=%x, div: %d, enabled: %d\n",
+ sc->muxdiv_offset, reg, div, enabled);
+
+ if (sc->flags & RK_CLK_COMPOSITE_DIV_HALF) {
+ div = div * 2 + 3;
+ *freq *= 2;
+ *freq /= div;
+ } else {
+ if (sc->flags & RK_CLK_COMPOSITE_DIV_EXP)
+ div = 1 << div;
+ else
+ div += 1;
+ *freq = *freq / div;
+ }
+
dprintf("Final freq=%ju\n", *freq);
return (0);
}
@@ -203,11 +265,16 @@
for (div_reg = 0; div_reg <= ((sc->div_mask >> sc->div_shift) + 1);
div_reg++) {
- if (sc->flags == RK_CLK_COMPOSITE_DIV_EXP)
- div = 1 << div_reg;
- else
- div = div_reg + 1;
- cur = fparent / div;
+
+ if (sc->flags & RK_CLK_COMPOSITE_DIV_HALF) {
+ cur = (2 * fparent) / (div * 2 + 3);
+ } else {
+ if (sc->flags == RK_CLK_COMPOSITE_DIV_EXP)
+ div = 1 << div_reg;
+ else
+ div = div_reg + 1;
+ cur = fparent / div;
+ }
if ((freq - cur) < (freq - best)) {
best = cur;
best_div = div;
@@ -232,6 +299,8 @@
sc = clknode_get_softc(clk);
dprintf("Finding best parent/div for target freq of %ju\n", *fout);
+
+
p_names = clknode_get_parent_names(clk);
for (best_div = 0, best = 0, p_idx = 0;
p_idx != clknode_get_parents_num(clk); p_idx++) {
@@ -239,6 +308,7 @@
clknode_get_freq(p_clk, &fparent);
dprintf("Testing with parent %s (%d) at freq %ju\n",
clknode_get_name(p_clk), p_idx, fparent);
+
div = rk_clk_composite_find_best(sc, fparent, *fout, &div_reg);
cur = fparent / div;
if ((*fout - cur) < (*fout - best)) {
@@ -295,6 +365,8 @@
CLKNODEMETHOD(clknode_set_mux, rk_clk_composite_set_mux),
CLKNODEMETHOD(clknode_recalc_freq, rk_clk_composite_recalc),
CLKNODEMETHOD(clknode_set_freq, rk_clk_composite_set_freq),
+ CLKNODEMETHOD(clknode_set_gate, rk_clk_composite_set_gate),
+ CLKNODEMETHOD(clknode_get_gate, rk_clk_composite_get_gate),
CLKNODEMETHOD_END
};
@@ -326,6 +398,9 @@
sc->div_width = clkdef->div_width;
sc->div_mask = ((1 << clkdef->div_width) - 1) << sc->div_shift;
+ sc->gate_offset = clkdef->gate_offset;
+ sc->gate_shift = clkdef->gate_shift;
+
sc->flags = clkdef->flags;
clknode_register(clkdom, clk);
diff --git a/sys/dev/clk/rockchip/rk_clk_fract.c b/sys/dev/clk/rockchip/rk_clk_fract.c
--- a/sys/dev/clk/rockchip/rk_clk_fract.c
+++ b/sys/dev/clk/rockchip/rk_clk_fract.c
@@ -53,6 +53,7 @@
static int rk_clk_fract_set_freq(struct clknode *clknode, uint64_t fin,
uint64_t *fout, int flag, int *stop);
static int rk_clk_fract_set_gate(struct clknode *clk, bool enable);
+static int rk_clk_fract_get_gate(struct clknode *clk, bool *enabled);
struct rk_clk_fract_sc {
uint32_t flags;
@@ -66,6 +67,7 @@
static clknode_method_t rk_clk_fract_methods[] = {
/* Device interface */
CLKNODEMETHOD(clknode_init, rk_clk_fract_init),
+ CLKNODEMETHOD(clknode_get_gate, rk_clk_fract_get_gate),
CLKNODEMETHOD(clknode_set_gate, rk_clk_fract_set_gate),
CLKNODEMETHOD(clknode_recalc_freq, rk_clk_fract_recalc),
CLKNODEMETHOD(clknode_set_freq, rk_clk_fract_set_freq),
@@ -154,6 +156,26 @@
return(0);
}
+static int
+rk_clk_fract_get_gate(struct clknode *clk, bool *enabled)
+{
+ struct rk_clk_fract_sc *sc;
+ uint32_t val = 0;
+
+ sc = clknode_get_softc(clk);
+
+ if ((sc->flags & RK_CLK_FRACT_HAVE_GATE) == 0)
+ return (ENXIO);
+
+ DEVICE_LOCK(clk);
+ RD4(clk, sc->gate_offset, &val);
+ DEVICE_UNLOCK(clk);
+
+ *enabled = (val >> sc->gate_shift) & 1;
+
+ return (0);
+}
+
static int
rk_clk_fract_set_gate(struct clknode *clk, bool enable)
{
@@ -165,13 +187,13 @@
if ((sc->flags & RK_CLK_FRACT_HAVE_GATE) == 0)
return (0);
+ DEVICE_LOCK(clk);
RD4(clk, sc->gate_offset, &val);
val = 0;
if (!enable)
val |= 1 << sc->gate_shift;
val |= (1 << sc->gate_shift) << RK_CLK_FRACT_MASK_SHIFT;
- DEVICE_LOCK(clk);
WR4(clk, sc->gate_offset, val);
DEVICE_UNLOCK(clk);
diff --git a/sys/dev/clk/rockchip/rk_clk_gate.c b/sys/dev/clk/rockchip/rk_clk_gate.c
--- a/sys/dev/clk/rockchip/rk_clk_gate.c
+++ b/sys/dev/clk/rockchip/rk_clk_gate.c
@@ -47,8 +47,16 @@
#define DEVICE_UNLOCK(_clk) \
CLKDEV_DEVICE_UNLOCK(clknode_get_device(_clk))
+#if 0
+#define dprintf(format, arg...) \
+ printf("%s:(%s)" format, __func__, clknode_get_name(clk), arg)
+#else
+#define dprintf(format, arg...)
+#endif
+
static int rk_clk_gate_init(struct clknode *clk, device_t dev);
static int rk_clk_gate_set_gate(struct clknode *clk, bool enable);
+static int rk_clk_gate_get_gate(struct clknode *clk, bool *enabled);
struct rk_clk_gate_sc {
uint32_t offset;
uint32_t shift;
@@ -63,6 +71,7 @@
/* Device interface */
CLKNODEMETHOD(clknode_init, rk_clk_gate_init),
CLKNODEMETHOD(clknode_set_gate, rk_clk_gate_set_gate),
+ CLKNODEMETHOD(clknode_get_gate, rk_clk_gate_get_gate),
CLKNODEMETHOD_END
};
DEFINE_CLASS_1(rk_clk_gate, rk_clk_gate_class, rk_clk_gate_methods,
@@ -106,9 +115,32 @@
}
RD4(clk, sc->offset, ®);
DEVICE_UNLOCK(clk);
+
+ dprintf("Set gate to 0x%08X, mask 0x%08X, reg: 0x%08X\n",
+ ((sc->ungated ? sc->on_value : sc->off_value) << sc->shift) |
+ RK_CLK_GATE_MASK, sc->mask << sc->shift, sc->offset);
+
return(0);
}
+
+static int
+rk_clk_gate_get_gate(struct clknode *clk, bool *enabled)
+{
+ uint32_t reg;
+ struct rk_clk_gate_sc *sc;
+ int rv;
+
+ sc = clknode_get_softc(clk);
+ DEVICE_LOCK(clk);
+ rv = RD4(clk, sc->offset, ®);
+ DEVICE_UNLOCK(clk);
+ if (rv != 0)
+ return (rv);
+ reg = (reg >> sc->shift) & sc->mask;
+ *enabled = reg == sc->on_value;
+ return(0);
+}
int
rk_clk_gate_register(struct clkdom *clkdom, struct rk_clk_gate_def *clkdef)
{
diff --git a/sys/dev/clk/rockchip/rk_clk_mux.h b/sys/dev/clk/rockchip/rk_clk_mux.h
--- a/sys/dev/clk/rockchip/rk_clk_mux.h
+++ b/sys/dev/clk/rockchip/rk_clk_mux.h
@@ -35,12 +35,15 @@
uint32_t offset;
uint32_t shift;
uint32_t width;
+ uint32_t gate_offset;
+ uint32_t gate_shift;
int mux_flags;
};
#define RK_CLK_MUX_MASK 0xFFFF0000
#define RK_CLK_MUX_REPARENT (1 << 0)
#define RK_CLK_MUX_GRF (1 << 1)
+#define RK_CLK_MUX_HAVE_GATE (1 << 2)
int rk_clk_mux_register(struct clkdom *clkdom, struct rk_clk_mux_def *clkdef);
diff --git a/sys/dev/clk/rockchip/rk_clk_mux.c b/sys/dev/clk/rockchip/rk_clk_mux.c
--- a/sys/dev/clk/rockchip/rk_clk_mux.c
+++ b/sys/dev/clk/rockchip/rk_clk_mux.c
@@ -53,6 +53,7 @@
CLKDEV_DEVICE_LOCK(clknode_get_device(_clk))
#define DEVICE_UNLOCK(_clk) \
CLKDEV_DEVICE_UNLOCK(clknode_get_device(_clk))
+#define RK_CLK_MUX_MASK_SHIFT 16
#if 0
#define dprintf(format, arg...) \
@@ -65,11 +66,15 @@
static int rk_clk_mux_set_mux(struct clknode *clk, int idx);
static int rk_clk_mux_set_freq(struct clknode *clk, uint64_t fparent,
uint64_t *fout, int flags, int *stop);
+static int rk_clk_mux_set_gate(struct clknode *clk, bool enable);
+static int rk_clk_mux_get_gate(struct clknode *clk, bool *enabled);
struct rk_clk_mux_sc {
uint32_t offset;
uint32_t shift;
uint32_t mask;
+ uint32_t gate_offset;
+ uint32_t gate_shift;
int mux_flags;
struct syscon *grf;
};
@@ -77,6 +82,8 @@
static clknode_method_t rk_clk_mux_methods[] = {
/* Device interface */
CLKNODEMETHOD(clknode_init, rk_clk_mux_init),
+ CLKNODEMETHOD(clknode_get_gate, rk_clk_mux_get_gate),
+ CLKNODEMETHOD(clknode_set_gate, rk_clk_mux_set_gate),
CLKNODEMETHOD(clknode_set_mux, rk_clk_mux_set_mux),
CLKNODEMETHOD(clknode_set_freq, rk_clk_mux_set_freq),
CLKNODEMETHOD_END
@@ -173,10 +180,6 @@
sc = clknode_get_softc(clk);
- if ((sc->mux_flags & RK_CLK_MUX_GRF) != 0) {
- *stop = 1;
- return (ENOTSUP);
- }
if ((sc->mux_flags & RK_CLK_MUX_REPARENT) == 0) {
*stop = 0;
return (0);
@@ -218,6 +221,49 @@
return (0);
}
+static int
+rk_clk_mux_get_gate(struct clknode *clk, bool *enabled)
+{
+ struct rk_clk_mux_sc *sc;
+ uint32_t val = 0;
+
+ sc = clknode_get_softc(clk);
+
+ if ((sc->mux_flags & RK_CLK_MUX_HAVE_GATE) == 0)
+ return (ENXIO);
+
+ DEVICE_LOCK(clk);
+ RD4(clk, sc->gate_offset, &val);
+ DEVICE_UNLOCK(clk);
+
+ *enabled = (val >> sc->gate_shift) & 1;
+
+ return (0);
+}
+
+static int
+rk_clk_mux_set_gate(struct clknode *clk, bool enable)
+{
+ struct rk_clk_mux_sc *sc;
+ uint32_t val = 0;
+
+ sc = clknode_get_softc(clk);
+
+ if ((sc->mux_flags & RK_CLK_MUX_HAVE_GATE) == 0)
+ return (0);
+
+ DEVICE_LOCK(clk);
+ RD4(clk, sc->gate_offset, &val);
+
+ val = 0;
+ if (!enable)
+ val |= 1 << sc->gate_shift;
+ val |= (1 << sc->gate_shift) << RK_CLK_MUX_MASK_SHIFT;
+ WR4(clk, sc->gate_offset, val);
+ DEVICE_UNLOCK(clk);
+
+ return (0);
+}
int
rk_clk_mux_register(struct clkdom *clkdom, struct rk_clk_mux_def *clkdef)
{
@@ -232,6 +278,8 @@
sc->offset = clkdef->offset;
sc->shift = clkdef->shift;
sc->mask = (1 << clkdef->width) - 1;
+ sc->gate_offset = clkdef->gate_offset;
+ sc->gate_shift = clkdef->gate_shift;
sc->mux_flags = clkdef->mux_flags;
clknode_register(clkdom, clk);
diff --git a/sys/dev/clk/rockchip/rk_clk_pll.h b/sys/dev/clk/rockchip/rk_clk_pll.h
--- a/sys/dev/clk/rockchip/rk_clk_pll.h
+++ b/sys/dev/clk/rockchip/rk_clk_pll.h
@@ -31,14 +31,25 @@
#include <dev/clk/clk.h>
struct rk_clk_pll_rate {
- uint32_t freq;
- uint32_t refdiv;
- uint32_t fbdiv;
- uint32_t postdiv1;
- uint32_t postdiv2;
- uint32_t dsmpd;
- uint32_t frac;
- uint32_t bwadj;
+ uint32_t freq;
+ union {
+ struct {
+ uint32_t refdiv;
+ uint32_t fbdiv;
+ uint32_t postdiv1;
+ uint32_t postdiv2;
+ uint32_t dsmpd;
+ uint32_t frac;
+ uint32_t bwadj;
+ };
+ /* RK3588 */
+ struct {
+ uint32_t m;
+ uint32_t p;
+ uint32_t s;
+ uint32_t k;
+ };
+ };
};
struct rk_clk_pll_def {
@@ -57,10 +68,13 @@
struct rk_clk_pll_rate *frac_rates;
};
-#define RK_CLK_PLL_HAVE_GATE 0x1
+#define RK_CLK_PLL_HAVE_GATE 0x0001
+#define RK_CLK_PLL_FRACTIONAL 0x0002
+#define RK_CLK_PLL_DDR 0x0004
int rk3066_clk_pll_register(struct clkdom *clkdom, struct rk_clk_pll_def *clkdef);
int rk3328_clk_pll_register(struct clkdom *clkdom, struct rk_clk_pll_def *clkdef);
int rk3399_clk_pll_register(struct clkdom *clkdom, struct rk_clk_pll_def *clkdef);
+int rk3588_clk_pll_register(struct clkdom *clkdom, struct rk_clk_pll_def *clkdef);
#endif /* _RK_CLK_PLL_H_ */
diff --git a/sys/dev/clk/rockchip/rk_clk_pll.c b/sys/dev/clk/rockchip/rk_clk_pll.c
--- a/sys/dev/clk/rockchip/rk_clk_pll.c
+++ b/sys/dev/clk/rockchip/rk_clk_pll.c
@@ -772,3 +772,231 @@
return (0);
}
+
+
+#define RK3588_PLLCON(_sc, i) \
+ ((_sc)->base_offset +(i * 0x4))
+
+#define RK3588_PLLCON_0_M_MASK 0x3FF
+#define RK3588_PLLCON_0_M_SHIFT 0
+#define RK3588_PLLCON_0_BYPASS (1 << 15)
+
+
+#define RK3588_PLLCON_1_P_MASK 0x3F
+#define RK3588_PLLCON_1_P_SHIFT 0
+
+#define RK3588_PLLCON_1_S_MASK 0x7
+#define RK3588_PLLCON_1_S_SHIFT 6
+#define RK3588_PLLCON_1_RESET (1 << 13)
+
+#define RK3588_PLLCON_2_K_MASK 0xFFFF
+#define RK3588_PLLCON_2_K_SHIFT 0
+
+#define RK3588_PLLCON_6_LOCK (1 << 15)
+
+#define RK3588_CLK_PLL_WRITE_MASK 0xFFFF0000
+
+static int
+rk3588_clk_pll_init(struct clknode *clk, device_t dev)
+{
+ clknode_init_parent_idx(clk, 0);
+
+ return (0);
+}
+
+static int
+rk3588_clk_pll_recalc(struct clknode *clk, uint64_t *freq)
+{
+ struct rk_clk_pll_sc *sc;
+ uint32_t con0, con1, con2;
+ uint32_t m, s, p;
+ int16_t k;
+ uint64_t tmp;
+ int64_t ftmp;
+ sc = clknode_get_softc(clk);
+
+ DEVICE_LOCK(clk);
+ READ4(clk, RK3588_PLLCON(sc, 0), &con0);
+ READ4(clk, RK3588_PLLCON(sc, 1), &con1);
+ READ4(clk, RK3588_PLLCON(sc, 2), &con2);
+ DEVICE_UNLOCK(clk);
+
+ /* parse PLL fields */
+ m = (con0 >> RK3588_PLLCON_0_M_SHIFT) & RK3588_PLLCON_0_M_MASK;
+ p = (con1 >> RK3588_PLLCON_1_P_SHIFT) & RK3588_PLLCON_1_P_MASK;
+ s = (con1 >> RK3588_PLLCON_1_S_SHIFT) & RK3588_PLLCON_1_S_MASK;
+ k = (con2 >> RK3588_PLLCON_2_K_SHIFT) & RK3588_PLLCON_2_K_MASK;
+
+ dprintf("con: %x, %x, %x\n", con0, con1, con2);
+ dprintf("m: %x, p: %x, k: %x, s: %x\n", m, p, k, s);
+ dprintf("parent freq=%ju\n", *freq);
+
+ if (con0 & RK3588_PLLCON_0_BYPASS)
+ return(0);
+
+ if (con1 & RK3588_PLLCON_1_RESET) {
+ *freq = 0;
+ return(0); /* ?? or ENXIO */
+ }
+
+ tmp = *freq;
+ tmp *= m;
+ tmp /= p;
+
+ /* Fractional part, k is signed */
+ if (k != 0) {
+ ftmp = *freq;
+ ftmp *= (int64_t)k;
+ ftmp /= p * 65535;
+ tmp += ftmp;
+ }
+ tmp >>= s;
+
+
+ *freq = tmp;
+ dprintf("freq: %ju\n", *freq);
+
+ return (0);
+}
+
+static int
+rk3588_clk_pll_set_freq(struct clknode *clk, uint64_t fparent, uint64_t *fout,
+ int flags, int *stop)
+{
+ struct rk_clk_pll_rate *rates;
+ struct rk_clk_pll_sc *sc;
+ uint32_t reg;
+ uint64_t tmp, ftmp;
+ int timeout;
+
+ sc = clknode_get_softc(clk);
+
+ rates = sc->rates;
+ for (; rates->freq; rates++) {
+ if ((rates->k != 0) && (sc-> flags & RK_CLK_PLL_FRACTIONAL) == 0)
+ continue;
+ if (rates->freq == *fout)
+ break;
+
+ }
+
+ if (rates->freq == 0) {
+ *stop = 1;
+ return (EINVAL);
+ }
+
+ dprintf("Selected rate: %u MHz, m: %x, p: %x, k: %x, s: %x\n",
+ rates->freq, rates->m, rates->p, rates->k, rates->s);
+
+ DEVICE_LOCK(clk);
+
+ /* Set to bypass during frequency change */
+ reg = RK3588_PLLCON_0_BYPASS;
+ reg |= RK3588_PLLCON_0_BYPASS << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 0), reg);
+
+
+ /* Set m */
+ reg = rates->m << RK3588_PLLCON_0_M_SHIFT;
+ reg |= RK3588_PLLCON_0_M_MASK << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 0), reg);
+
+ /* Set p, s */
+ reg = rates->p << RK3588_PLLCON_1_P_SHIFT;
+ reg |= RK3588_PLLCON_1_P_MASK << RK_CLK_PLL_MASK_SHIFT;
+ reg |= rates->s << RK3588_PLLCON_1_S_SHIFT;
+ reg |= RK3588_PLLCON_1_S_MASK << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 1), reg);
+
+ /* Set k */
+ reg = rates->k << RK3588_PLLCON_2_K_SHIFT;
+ reg |= RK3588_PLLCON_2_K_MASK << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 2), reg);
+
+
+ /* Unreset PLL core */
+ reg = 0;
+ reg |= RK3588_PLLCON_1_RESET << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 1), reg);
+
+ /* Wait for lock */
+ for (timeout = 1000; timeout > 0; timeout--) {
+ READ4(clk, RK3588_PLLCON(sc, 6), ®);
+ if ((reg & RK3588_PLLCON_6_LOCK) != 0)
+ break;
+ DELAY(1);
+ }
+
+ if (timeout <= 0) {
+ /* Reset PLL */
+ reg = RK3588_PLLCON_1_RESET;
+ reg |= RK3588_PLLCON_1_RESET << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 1), reg);
+ DEVICE_UNLOCK(clk);
+
+ device_printf(clknode_get_device(clk), "%s: PLL lock timeout\n",
+ clknode_get_name(clk));
+ *fout = 0;
+ *stop = 1;
+ return (ETIMEDOUT);
+ }
+
+ /* Set back to normal mode */
+ reg = 0;
+ reg |= RK3588_PLLCON_0_BYPASS << RK_CLK_PLL_MASK_SHIFT;
+ WRITE4(clk, RK3588_PLLCON(sc, 0), reg);
+
+ DEVICE_UNLOCK(clk);
+
+ tmp = fparent;
+ tmp *= rates->m;
+ tmp /=rates->p;
+
+ /* Fractional part, p is signed */
+ if (rates->k != 0) {
+ ftmp = fparent;
+ ftmp *= rates->k;
+ ftmp /= rates->p * 65535;
+ tmp += ftmp;
+ }
+ tmp >>= rates->s;
+
+ *fout = tmp;
+ *stop = 1;
+ return (0);
+}
+
+static clknode_method_t rk3588_clk_pll_clknode_methods[] = {
+ /* Device interface */
+ CLKNODEMETHOD(clknode_init, rk3588_clk_pll_init),
+ CLKNODEMETHOD(clknode_set_gate, rk_clk_pll_set_gate),
+ CLKNODEMETHOD(clknode_recalc_freq, rk3588_clk_pll_recalc),
+ CLKNODEMETHOD(clknode_set_freq, rk3588_clk_pll_set_freq),
+ CLKNODEMETHOD_END
+};
+
+DEFINE_CLASS_1(rk3588_clk_pll_clknode, rk3588_clk_pll_clknode_class,
+ rk3588_clk_pll_clknode_methods, sizeof(struct rk_clk_pll_sc), clknode_class);
+
+int
+rk3588_clk_pll_register(struct clkdom *clkdom, struct rk_clk_pll_def *clkdef)
+{
+ struct clknode *clk;
+ struct rk_clk_pll_sc *sc;
+
+ clk = clknode_create(clkdom, &rk3588_clk_pll_clknode_class,
+ &clkdef->clkdef);
+ if (clk == NULL)
+ return (1);
+
+ sc = clknode_get_softc(clk);
+
+ sc->base_offset = clkdef->base_offset;
+ sc->mode_reg = clkdef->mode_reg;
+ sc->mode_shift = clkdef->mode_shift;
+ sc->flags = clkdef->flags;
+ sc->rates = clkdef->rates;
+ clknode_register(clkdom, clk);
+
+ return (0);
+}
diff --git a/sys/dev/clk/rockchip/rk_cru.h b/sys/dev/clk/rockchip/rk_cru.h
--- a/sys/dev/clk/rockchip/rk_cru.h
+++ b/sys/dev/clk/rockchip/rk_cru.h
@@ -214,6 +214,7 @@
uint32_t id;
uint32_t offset;
uint32_t shift;
+ uint32_t flags;
};
enum rk_clk_type {
@@ -221,6 +222,7 @@
RK3066_CLK_PLL,
RK3328_CLK_PLL,
RK3399_CLK_PLL,
+ RK3588_CLK_PLL,
RK_CLK_COMPOSITE,
RK_CLK_FIXED,
RK_CLK_FRACT,
@@ -242,6 +244,13 @@
} clk;
};
+struct rk_reset_table {
+ int id;
+ uint32_t reg;
+ int bit;
+};
+
+
struct rk_cru_softc {
device_t dev;
struct resource *res;
@@ -250,6 +259,7 @@
int type;
uint32_t reset_offset;
uint32_t reset_num;
+ struct rk_reset_table *reset_table;
struct rk_cru_gate *gates;
int ngates;
struct rk_clk *clks;
diff --git a/sys/dev/clk/rockchip/rk_cru.c b/sys/dev/clk/rockchip/rk_cru.c
--- a/sys/dev/clk/rockchip/rk_cru.c
+++ b/sys/dev/clk/rockchip/rk_cru.c
@@ -106,21 +106,40 @@
return (0);
}
+static int rk_cru_reset_map(struct rk_cru_softc *sc, uint32_t id,
+ uint32_t *reg, int *bit)
+{
+
+ if (id > sc->reset_num)
+ return (ENXIO);
+
+ if (sc->reset_table == NULL) {
+
+ *reg = sc->reset_offset + id / 16 * 4;
+ *bit = id % 16;
+ } else {
+ if (sc->reset_table[id].id != id)
+ return (ENXIO);
+ *reg = sc->reset_table[id].reg;
+ *bit = sc->reset_table[id].bit;
+ }
+
+ return (0);
+}
+
static int
rk_cru_reset_assert(device_t dev, intptr_t id, bool reset)
{
struct rk_cru_softc *sc;
uint32_t reg;
- int bit;
+ int bit, rv;
uint32_t val;
sc = device_get_softc(dev);
- if (id > sc->reset_num)
- return (ENXIO);
-
- reg = sc->reset_offset + id / 16 * 4;
- bit = id % 16;
+ rv = rk_cru_reset_map(sc, id, ®, &bit);
+ if (rv != 0)
+ return (rv);
mtx_lock(&sc->mtx);
val = 0;
@@ -137,15 +156,14 @@
{
struct rk_cru_softc *sc;
uint32_t reg;
- int bit;
+ int bit, rv;
uint32_t val;
sc = device_get_softc(dev);
- if (id > sc->reset_num)
- return (ENXIO);
- reg = sc->reset_offset + id / 16 * 4;
- bit = id % 16;
+ rv = rk_cru_reset_map(sc, id, ®, &bit);
+ if (rv != 0)
+ return (rv);
mtx_lock(&sc->mtx);
val = CCU_READ4(sc, reg);
@@ -190,6 +208,8 @@
def.clkdef.name = sc->gates[i].name;
def.clkdef.parent_names = &sc->gates[i].parent_name;
def.clkdef.parent_cnt = 1;
+ def.clkdef.flags = CLK_NODE_STATIC_STRINGS |
+ sc->gates[i].flags;
def.offset = sc->gates[i].offset;
def.shift = sc->gates[i].shift;
def.mask = 1;
@@ -240,6 +260,10 @@
rk3399_clk_pll_register(sc->clkdom,
sc->clks[i].clk.pll);
break;
+ case RK3588_CLK_PLL:
+ rk3588_clk_pll_register(sc->clkdom,
+ sc->clks[i].clk.pll);
+ break;
case RK_CLK_COMPOSITE:
rk_clk_composite_register(sc->clkdom,
sc->clks[i].clk.composite);
@@ -275,13 +299,58 @@
if (clkdom_finit(sc->clkdom) != 0)
panic("cannot finalize clkdom initialization\n");
- if (bootverbose)
- clkdom_dump(sc->clkdom);
+// if (bootverbose)
+// clkdom_dump(sc->clkdom);
clk_set_assigned(dev, node);
+if (bootverbose)
+clkdom_dump(sc->clkdom);
+
/* register our self as a reset provider */
hwreset_register_ofw_provider(dev);
+#if 0
+
+#define CRU_BASE 0x00000000
+#define PHP_CRU_BASE 0x00008000
+#define PMU_CRU_BASE 0x00030000
+#define BC0_CRU_BASE 0x00050000
+#define BC1_CRU_BASE 0x00052000
+#define DSU_CRU_BASE 0x00058000
+
+int r, j;
+printf("CRU Dump:\n");
+for (r = 0; r < 0x1000;) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", CCU_READ4(sc, r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+
+printf("PMUCRU Dump:\n");
+for (r = PMU_CRU_BASE; r < (PMU_CRU_BASE + 0x1000);) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", CCU_READ4(sc, r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+printf("PHPCRU Dump:\n");
+for (r = PHP_CRU_BASE; r < (PHP_CRU_BASE + 0x1000);) {
+ printf("0x%04X:", r);
+ for (j = 0; j < 8; j++) {
+ printf(" 0x%08X", CCU_READ4(sc, r));
+ if (j != 7) printf(", ");
+ r += 4;
+ }
+ printf("\n");
+}
+#endif
return (0);
}
diff --git a/sys/dev/fdt/simple_mfd.c b/sys/dev/fdt/simple_mfd.c
--- a/sys/dev/fdt/simple_mfd.c
+++ b/sys/dev/fdt/simple_mfd.c
@@ -207,7 +207,7 @@
if (ofw_bus_is_compatible(dev, "syscon")) {
sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
- RF_ACTIVE);
+ RF_ACTIVE | RF_SHAREABLE);
if (sc->mem_res == NULL) {
device_printf(dev,
"Cannot allocate memory resource\n");
diff --git a/sys/dev/iicbus/gpio/tca64xx.c b/sys/dev/iicbus/gpio/tca64xx.c
--- a/sys/dev/iicbus/gpio/tca64xx.c
+++ b/sys/dev/iicbus/gpio/tca64xx.c
@@ -39,6 +39,7 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sx.h>
#include <sys/systm.h>
#include <sys/sysctl.h>
@@ -93,7 +94,7 @@
device_t dev;
device_t busdev;
enum chip_type chip;
- struct mtx mtx;
+ struct sx mtx;
uint32_t addr;
uint8_t num_pins;
uint8_t in_port_reg;
@@ -260,7 +261,7 @@
sc->dev = dev;
sc->addr = iicbus_get_addr(dev);
- mtx_init(&sc->mtx, "tca64xx gpio", "gpio", MTX_DEF);
+ sx_init(&sc->mtx, "tca64xx gpio");
OF_device_register_xref(OF_xref_from_node(ofw_bus_get_node(dev)), dev);
sc->busdev = gpiobus_add_bus(dev);
if (sc->busdev == NULL) {
@@ -293,7 +294,7 @@
sc = device_get_softc(dev);
gpiobus_detach_bus(dev);
- mtx_destroy(&sc->mtx);
+ sx_destroy(&sc->mtx);
return (0);
}
@@ -383,7 +384,7 @@
if (pin >= pins)
return (EINVAL);
- mtx_lock(&sc->mtx);
+ sx_xlock(&sc->mtx);
addr = TCA64XX_REG_ADDR(pin, sc->conf_reg);
error = tca64xx_read(dev, addr, &val);
@@ -414,7 +415,7 @@
error = tca64xx_write(dev, addr, inv_val);
fail:
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
return (error);
}
@@ -478,11 +479,11 @@
dbg_dev_printf(dev, "Setting pin: %u to %u\n", pin, val);
- mtx_lock(&sc->mtx);
+ sx_xlock(&sc->mtx);
error = tca64xx_read(dev, addr, &value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Failed to read from register.\n");
return (error);
}
@@ -494,12 +495,12 @@
error = tca64xx_write(dev, addr, value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Could not write to register.\n");
return (error);
}
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
return (0);
}
@@ -522,11 +523,11 @@
dbg_dev_printf(dev, "Toggling pin: %d\n", pin);
- mtx_lock(&sc->mtx);
+ sx_xlock(&sc->mtx);
error = tca64xx_read(dev, addr, &value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Cannot read from register.\n");
return (error);
}
@@ -535,12 +536,12 @@
error = tca64xx_write(dev, addr, value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Cannot write to register.\n");
return (error);
}
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
return (0);
}
diff --git a/sys/dev/iicbus/rtc/hym8563.c b/sys/dev/iicbus/rtc/hym8563.c
--- a/sys/dev/iicbus/rtc/hym8563.c
+++ b/sys/dev/iicbus/rtc/hym8563.c
@@ -41,6 +41,7 @@
#include <sys/module.h>
#ifdef FDT
+#include <dev/clk/clk.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
#endif
@@ -73,7 +74,15 @@
#define HYM8563_WEEKDAY 0x06
#define HYM8563_MONTH 0x07 /* plus 1 bit for century */
#define HYM8563_MONTH_CENTURY (1 << 7)
-#define HYM8563_YEAR 0x08
+#define HYM8563_YEAR 0x08
+
+#define HYM8563_CLKOUT 0x0D
+#define HYM8563_CLKOUT_ENABLE (1 << 7)
+#define HYM8563_CLKOUT_32768 0
+#define HYM8563_CLKOUT_1024 1
+#define HYM8563_CLKOUT_32 2
+#define HYM8563_CLKOUT_1 3
+#define HYM8563_CLKOUT_MASK 3
struct hym8563_softc {
device_t dev;
@@ -81,6 +90,12 @@
};
#ifdef FDT
+/* Clock class and method */
+struct hym8563_clk_sc {
+ device_t base_dev;
+};
+
+
static struct ofw_compat_data compat_data[] = {
{"haoyu,hym8563", 1},
{NULL, 0},
@@ -89,35 +104,200 @@
static inline int
-hym8563_read_buf(struct hym8563_softc *sc, uint8_t reg, uint8_t *buf,
- uint16_t buflen)
+hym8563_read_buf(device_t dev, uint8_t reg, uint8_t *buf, uint16_t buflen)
{
- return (iicdev_readfrom(sc->dev, reg, buf, buflen, IIC_WAIT));
+ return (iicdev_readfrom(dev, reg, buf, buflen, IIC_WAIT));
}
static inline int
-hym8563_write_buf(struct hym8563_softc *sc, uint8_t reg, uint8_t *buf,
- uint16_t buflen)
+hym8563_write_buf(device_t dev, uint8_t reg, uint8_t *buf, uint16_t buflen)
{
- return (iicdev_writeto(sc->dev, reg, buf, buflen, IIC_WAIT));
+ return (iicdev_writeto(dev, reg, buf, buflen, IIC_WAIT));
}
static inline int
-hym8563_read_1(struct hym8563_softc *sc, uint8_t reg, uint8_t *data)
+hym8563_read_1(device_t dev, uint8_t reg, uint8_t *data)
{
- return (iicdev_readfrom(sc->dev, reg, data, 1, IIC_WAIT));
+ return (iicdev_readfrom(dev, reg, data, 1, IIC_WAIT));
}
static inline int
-hym8563_write_1(struct hym8563_softc *sc, uint8_t reg, uint8_t val)
+hym8563_write_1(device_t dev, uint8_t reg, uint8_t val)
{
- return (iicdev_writeto(sc->dev, reg, &val, 1, IIC_WAIT));
+ return (iicdev_writeto(dev, reg, &val, 1, IIC_WAIT));
+}
+
+#ifdef FDT
+static int
+hym8563_clk_set_gate(struct clknode *clk, bool enable)
+{
+ struct hym8563_clk_sc *sc;
+ uint8_t val;
+ int rv;
+
+ sc = clknode_get_softc(clk);
+
+ rv = hym8563_read_1(sc->base_dev, HYM8563_CLKOUT, &val);
+ if (rv != 0) {
+ device_printf(sc->base_dev,
+ "Cannot read CLKOUT registers: %d\n", rv);
+ return (rv);
+ }
+ if (enable)
+ val |= HYM8563_CLKOUT_ENABLE;
+ else
+ val &= ~HYM8563_CLKOUT_ENABLE;
+ hym8563_write_1(sc->base_dev, HYM8563_CLKOUT, val);
+ if (rv != 0) {
+ device_printf(sc->base_dev,
+ "Cannot write CLKOUT registers: %d\n", rv);
+ return (rv);
+ }
+ return (0);
}
+static int
+hym8563_clk_recalc(struct clknode *clk, uint64_t *freq)
+{
+ struct hym8563_clk_sc *sc;
+ uint8_t val;
+ int rv;
+
+ sc = clknode_get_softc(clk);
+
+ rv = hym8563_read_1(sc->base_dev, HYM8563_CLKOUT, &val);
+ if (rv != 0) {
+ device_printf(sc->base_dev,
+ "Cannot read CLKOUT registers: %d\n", rv);
+ return (rv);
+ }
+
+ switch (val & HYM8563_CLKOUT_MASK) {
+ case HYM8563_CLKOUT_32768:
+ *freq = 32768;
+ break;
+ case HYM8563_CLKOUT_1024:
+ *freq = 1024;
+ break;
+ case HYM8563_CLKOUT_32:
+ *freq = 32;
+ break;
+ case HYM8563_CLKOUT_1:
+ *freq = 1;
+ break;
+ default:
+ return (EINVAL);
+ }
+ return (0);
+}
+static int
+hym8563_clk_set(struct clknode *clk, uint64_t fparent, uint64_t *fout,
+ int flags, int *stop)
+{
+ struct hym8563_clk_sc *sc;
+ uint8_t val, tmp;
+ int rv;
+
+ sc = clknode_get_softc(clk);
+
+ switch (*fout) {
+ case 32768:
+ tmp = HYM8563_CLKOUT_32768;
+ break;
+ case 1024:
+ tmp = HYM8563_CLKOUT_1024;
+ break;
+ case 32:
+ tmp = HYM8563_CLKOUT_32;
+ break;
+ case 1:
+ tmp = HYM8563_CLKOUT_1;
+ break;
+ default:
+ *stop = 1;
+ return (EINVAL);
+ }
+
+ rv = hym8563_read_1(sc->base_dev, HYM8563_CLKOUT, &val);
+ if (rv != 0) {
+ device_printf(sc->base_dev,
+ "Cannot read CLKOUT registers: %d\n", rv);
+ return (rv);
+ }
+
+ val &= ~HYM8563_CLKOUT_MASK;
+ val |= tmp;
+ rv = hym8563_write_1(sc->base_dev, HYM8563_CLKOUT, val);
+ if (rv != 0) {
+ device_printf(sc->base_dev,
+ "Cannot write CLKOUT registers: %d\n", rv);
+ return (rv);
+ }
+
+ return (0);
+}
+
+static clknode_method_t hym8563_clk_clknode_methods[] = {
+ CLKNODEMETHOD(clknode_recalc_freq, hym8563_clk_recalc),
+ CLKNODEMETHOD(clknode_set_freq, hym8563_clk_set),
+ CLKNODEMETHOD(clknode_set_gate, hym8563_clk_set_gate),
+ CLKNODEMETHOD_END
+};
+
+DEFINE_CLASS_1(hym8563_clk_clknode, hym8563_clk_clknode_class,
+ hym8563_clk_clknode_methods, sizeof(struct hym8563_clk_sc),
+ clknode_class);
+
+
+static int
+hym8563_attach_clocks(struct hym8563_softc *sc)
+{
+ struct clkdom *clkdom;
+ struct clknode_init_def clkidef;
+ struct clknode *clk;
+ struct hym8563_clk_sc *clksc;
+ const char **clknames;
+ phandle_t node;
+ int nclks, rv;
+
+ node = ofw_bus_get_node(sc->dev);
+
+ /* clock-output-names are optional. Could use them for clkidef.name. */
+ nclks = ofw_bus_string_list_to_array(node, "clock-output-names",
+ &clknames);
+
+ clkdom = clkdom_create(sc->dev);
+
+ memset(&clkidef, 0, sizeof(clkidef));
+ clkidef.id = 1;
+ clkidef.name = (nclks == 1) ? clknames[0] : "hym8563-clkout";
+ clk = clknode_create(clkdom, &hym8563_clk_clknode_class, &clkidef);
+ if (clk == NULL) {
+ device_printf(sc->dev, "Cannot create '%s'.\n", clkidef.name);
+ return (ENXIO);
+ }
+ clksc = clknode_get_softc(clk);
+ clksc->base_dev = sc->dev;
+ clknode_register(clkdom, clk);
+
+ rv = clkdom_finit(clkdom);
+ if (rv != 0) {
+ device_printf(sc->dev, "Cannot finalize clkdom initialization: "
+ "%d\n", rv);
+ return (ENXIO);
+ }
+
+ if (bootverbose)
+ clkdom_dump(clkdom);
+
+ return (0);
+}
+#endif
+
static int
hym8563_gettime(device_t dev, struct timespec *ts)
{
@@ -129,7 +309,7 @@
sc = device_get_softc(dev);
/* Read all RTC data */
- rv = hym8563_read_buf(sc, HYM8563_SEC, buf, sizeof(buf));
+ rv = hym8563_read_buf(sc->dev, HYM8563_SEC, buf, sizeof(buf));
if (rv != 0) {
device_printf(sc->dev, "Cannot read time registers: %d\n", rv);
return (rv);
@@ -154,7 +334,7 @@
if (buf[5] & HYM8563_MONTH_CENTURY)
bct.year += 0x100;
- clock_dbgprint_bcd(sc->dev, CLOCK_DBG_READ, &bct);
+ clock_dbgprint_bcd(sc->dev, CLOCK_DBG_READ, &bct);
return (clock_bcd_to_ts(&bct, ts, false));
}
@@ -182,14 +362,14 @@
buf[5] |= HYM8563_MONTH_CENTURY;
/* Stop RTC */
- rv = hym8563_write_1(sc, HYM8563_CTRL1, HYM8563_CTRL1_STOP);
+ rv = hym8563_write_1(sc->dev, HYM8563_CTRL1, HYM8563_CTRL1_STOP);
if (rv != 0) {
device_printf(sc->dev, "Cannot write CTRL1 register: %d\n", rv);
return (rv);
}
/* Write all RTC data */
- rv = hym8563_write_buf(sc, HYM8563_SEC, buf, sizeof(buf));
+ rv = hym8563_write_buf(sc->dev, HYM8563_SEC, buf, sizeof(buf));
if (rv != 0) {
device_printf(sc->dev, "Cannot write time registers: %d\n", rv);
return (rv);
@@ -197,7 +377,7 @@
return (rv);
/* Start RTC again */
- rv = hym8563_write_1(sc, HYM8563_CTRL1, 0);
+ rv = hym8563_write_1(sc->dev, HYM8563_CTRL1, 0);
if (rv != 0) {
device_printf(sc->dev, "Cannot write CTRL1 register: %d\n", rv);
return (rv);
@@ -217,14 +397,14 @@
config_intrhook_disestablish(&sc->init_hook);
/* Clear CTL1 register (stop and test bits) */
- rv = hym8563_write_1(sc, HYM8563_CTRL1, 0);
+ rv = hym8563_write_1(sc->dev, HYM8563_CTRL1, 0);
if (rv != 0) {
device_printf(sc->dev, "Cannot init CTRL1 register: %d\n", rv);
return;
}
-
+
/* Disable interrupts and alarms */
- rv = hym8563_read_1(sc, HYM8563_CTRL2, ®);
+ rv = hym8563_read_1(sc->dev, HYM8563_CTRL2, ®);
if (rv != 0) {
device_printf(sc->dev, "Cannot read CTRL2 register: %d\n", rv);
return;
@@ -232,7 +412,7 @@
rv &= ~HYM8563_CTRL2_TI_TP;
rv &= ~HYM8563_CTRL2_AF;
rv &= ~HYM8563_CTRL2_TF;
- rv = hym8563_write_1(sc, HYM8563_CTRL2, 0);
+ rv = hym8563_write_1(sc->dev, HYM8563_CTRL2, 0);
if (rv != 0) {
device_printf(sc->dev, "Cannot write CTRL2 register: %d\n", rv);
return;
@@ -266,10 +446,15 @@
hym8563_attach(device_t dev)
{
struct hym8563_softc *sc;
-
+
sc = device_get_softc(dev);
sc->dev = dev;
+#ifdef FDT
+ if (hym8563_attach_clocks(sc) != 0)
+ return(ENXIO);
+#endif
+
/*
* Chip init must wait until interrupts are enabled. Often i2c access
* works only when the interrupts are available.
@@ -305,7 +490,8 @@
static DEFINE_CLASS_0(hym8563_rtc, hym8563_driver, hym8563_methods,
sizeof(struct hym8563_softc));
-DRIVER_MODULE(hym8563, iicbus, hym8563_driver, NULL, NULL);
+EARLY_DRIVER_MODULE(hym8563, iicbus, hym8563_driver, NULL, NULL,
+ BUS_PASS_SUPPORTDEV + BUS_PASS_ORDER_FIRST);
MODULE_VERSION(hym8563, 1);
MODULE_DEPEND(hym8563, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER);
IICBUS_FDT_PNP_INFO(compat_data);
diff --git a/sys/dev/mmc/host/dwmmc.c b/sys/dev/mmc/host/dwmmc.c
--- a/sys/dev/mmc/host/dwmmc.c
+++ b/sys/dev/mmc/host/dwmmc.c
@@ -79,7 +79,7 @@
#include "mmcbr_if.h"
-#ifdef DEBUG
+#if 0
#define dprintf(fmt, args...) printf(fmt, ##args)
#else
#define dprintf(x, arg...)
@@ -539,9 +539,7 @@
/* IP block reset is optional */
error = hwreset_get_by_ofw_name(sc->dev, 0, "reset", &sc->hwreset);
- if (error != 0 &&
- error != ENOENT &&
- error != ENODEV) {
+ if (error != 0 && error != ENOENT) {
device_printf(sc->dev, "Cannot get reset\n");
goto fail;
}
@@ -549,9 +547,7 @@
/* vmmc regulator is optional */
error = regulator_get_by_ofw_property(sc->dev, 0, "vmmc-supply",
&sc->vmmc);
- if (error != 0 &&
- error != ENOENT &&
- error != ENODEV) {
+ if (error != 0 && error != ENOENT) {
device_printf(sc->dev, "Cannot get regulator 'vmmc-supply'\n");
goto fail;
}
@@ -559,9 +555,7 @@
/* vqmmc regulator is optional */
error = regulator_get_by_ofw_property(sc->dev, 0, "vqmmc-supply",
&sc->vqmmc);
- if (error != 0 &&
- error != ENOENT &&
- error != ENODEV) {
+ if (error != 0 && error != ENOENT) {
device_printf(sc->dev, "Cannot get regulator 'vqmmc-supply'\n");
goto fail;
}
@@ -577,9 +571,7 @@
/* BIU (Bus Interface Unit clock) is optional */
error = clk_get_by_ofw_name(sc->dev, 0, "biu", &sc->biu);
- if (error != 0 &&
- error != ENOENT &&
- error != ENODEV) {
+ if (error != 0 && error != ENOENT ) {
device_printf(sc->dev, "Cannot get 'biu' clock\n");
goto fail;
}
@@ -597,9 +589,7 @@
* if no clock-frequency property is given
*/
error = clk_get_by_ofw_name(sc->dev, 0, "ciu", &sc->ciu);
- if (error != 0 &&
- error != ENOENT &&
- error != ENODEV) {
+ if (error != 0 && error != ENOENT) {
device_printf(sc->dev, "Cannot get 'ciu' clock\n");
goto fail;
}
@@ -613,12 +603,27 @@
}
error = clk_enable(sc->ciu);
if (error != 0) {
- device_printf(sc->dev, "cannot enable ciu clock\n");
+ device_printf(sc->dev, "cannot enable 'ciu' clock\n");
goto fail;
}
clk_get_freq(sc->ciu, &sc->bus_hz);
}
+ /*
+ Drive and sampling clocks are used only for tuning and should not be
+ enabled outside of the tuning procedure.
+ */
+ error = clk_get_by_ofw_name(sc->dev, 0, "ciu-drive", &sc->ciu_drive);
+ if (error != 0 && error != ENOENT) {
+ device_printf(sc->dev, "Cannot get 'ciu-drive' clock\n");
+ goto fail;
+ }
+ error = clk_get_by_ofw_name(sc->dev, 0, "ciu-sample", &sc->ciu_sample);
+ if (error != 0 && error != ENOENT) {
+ device_printf(sc->dev, "Cannot get 'ciu-sample' clock\n");
+ goto fail;
+ }
+
/* Enable regulators */
if (sc->vmmc != NULL) {
error = regulator_enable(sc->vmmc);
@@ -787,10 +792,15 @@
if (sc->hwreset != NULL && hwreset_deassert(sc->hwreset) != 0)
device_printf(sc->dev, "cannot deassert reset\n");
if (sc->biu != NULL && clk_disable(sc->biu) != 0)
- device_printf(sc->dev, "cannot disable biu clock\n");
+ device_printf(sc->dev, "cannot disable 'biu' clock\n");
if (sc->ciu != NULL && clk_disable(sc->ciu) != 0)
- device_printf(sc->dev, "cannot disable ciu clock\n");
-
+ device_printf(sc->dev, "cannot disable 'ciu' clock\n");
+ if (sc->ciu_drive != NULL && clk_disable(sc->ciu_drive) != 0)
+ device_printf(sc->dev,
+ "cannot disable 'ciu-drive' clock\n");
+ if (sc->ciu_drive != NULL && clk_disable(sc->ciu_sample) != 0)
+ device_printf(sc->dev,
+ "cannot disable 'ciu-sample' clock\n");
if (sc->vmmc && regulator_disable(sc->vmmc) != 0)
device_printf(sc->dev, "Cannot disable vmmc regulator\n");
if (sc->vqmmc && regulator_disable(sc->vqmmc) != 0)
diff --git a/sys/dev/mmc/host/dwmmc_var.h b/sys/dev/mmc/host/dwmmc_var.h
--- a/sys/dev/mmc/host/dwmmc_var.h
+++ b/sys/dev/mmc/host/dwmmc_var.h
@@ -90,6 +90,8 @@
clk_t biu;
clk_t ciu;
+ clk_t ciu_drive;
+ clk_t ciu_sample;
hwreset_t hwreset;
regulator_t vmmc;
regulator_t vqmmc;
diff --git a/sys/dev/ofw/ofw_cpu.c b/sys/dev/ofw/ofw_cpu.c
--- a/sys/dev/ofw/ofw_cpu.c
+++ b/sys/dev/ofw/ofw_cpu.c
@@ -343,6 +343,11 @@
if (sc->sc_cpu_pcpu == NULL)
sc->sc_cpu_pcpu = pcpu_find(device_get_unit(dev));
+#ifdef HAS_CLK
+ clk_set_assigned(dev, node);
+ if (OF_hasprop(node, "clocks") != 0) {
+#endif
+
if (OF_getencprop(node, "clock-frequency", &cell, sizeof(cell)) < 0) {
if (get_freq_from_clk(dev, sc) != 0) {
if (bootverbose)
@@ -357,6 +362,10 @@
sc->sc_nominal_mhz);
OF_device_register_xref(OF_xref_from_node(node), dev);
+
+#ifdef HAS_CLK
+ }
+#endif
bus_identify_children(dev);
bus_attach_children(dev);
return (0);
diff --git a/sys/dev/pci/pci_dw.h b/sys/dev/pci/pci_dw.h
--- a/sys/dev/pci/pci_dw.h
+++ b/sys/dev/pci/pci_dw.h
@@ -61,6 +61,9 @@
#define DW_MISC_CONTROL_1 0x8BC
#define DBI_RO_WR_EN (1 << 0)
+#define DW_MISC_VERSION 0x8F8
+#define DW_MISC_VERSION_TYPE 0x8FC
+
/* Legacy (pre-4.80) iATU mode */
#define DW_IATU_VIEWPORT 0x900
#define IATU_REGION_INBOUND (1U << 31)
diff --git a/sys/dev/pci/pci_dw.c b/sys/dev/pci/pci_dw.c
--- a/sys/dev/pci/pci_dw.c
+++ b/sys/dev/pci/pci_dw.c
@@ -55,10 +55,10 @@
#include "pcib_if.h"
#include "pci_dw_if.h"
-#ifdef DEBUG
-#define debugf(fmt, args...) do { printf(fmt,##args); } while (0)
+#if 0
+#define dprintf(fmt, args...) do { printf(fmt,##args); } while (0)
#else
-#define debugf(fmt, args...)
+#define dprintf(fmt, args...)
#endif
#define DBI_WR1(sc, reg, val) pci_dw_dbi_wr1((sc)->dev, reg, val)
@@ -92,7 +92,7 @@
sc = device_get_softc(dev);
MPASS(sc->dbi_res != NULL);
-
+ dprintf("%s: reg: 0x%04X, width: %d\n", __func__, reg, width);
switch (width) {
case 4:
return (bus_read_4(sc->dbi_res, reg));
@@ -113,6 +113,8 @@
sc = device_get_softc(dev);
MPASS(sc->dbi_res != NULL);
+ dprintf("%s: reg: 0x%04X, val: 0x%08X, width: %d\n", __func__,
+ reg, val, width);
switch (width) {
case 4:
@@ -162,7 +164,7 @@
return (true);
}
- /* we have only 1 device with 1 function root port */
+ /* we have only 1 device with 1 function on root port */
if (slot > 0 || func > 0)
return (false);
return (true);
@@ -434,9 +436,14 @@
nmem = 0;
for (i = 0; i < nranges; i++) {
- if ((ranges[i].pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) ==
- OFW_PCI_PHYS_HI_SPACE_MEM32)
+ switch (ranges[i].pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) {
+ case OFW_PCI_PHYS_HI_SPACE_MEM32:
+ case OFW_PCI_PHYS_HI_SPACE_MEM64:
++nmem;
+ break;
+ default:
+ break;
+ }
}
sc->mem_ranges = malloc(nmem * sizeof(*sc->mem_ranges), M_DEVBUF,
@@ -445,8 +452,9 @@
nmem = 0;
for (i = 0; i < nranges; i++) {
- if ((ranges[i].pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) ==
- OFW_PCI_PHYS_HI_SPACE_IO) {
+ switch (ranges[i].pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) {
+
+ case OFW_PCI_PHYS_HI_SPACE_IO:
if (sc->io_range.size != 0) {
device_printf(sc->dev,
"Duplicated IO range found in DT\n");
@@ -462,9 +470,10 @@
"trimming window size to 4GB\n");
sc->io_range.size = UINT32_MAX;
}
- }
- if ((ranges[i].pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) ==
- OFW_PCI_PHYS_HI_SPACE_MEM32) {
+ break;
+
+ case OFW_PCI_PHYS_HI_SPACE_MEM32:
+ case OFW_PCI_PHYS_HI_SPACE_MEM64:
MPASS(nmem < sc->num_mem_ranges);
sc->mem_ranges[nmem] = ranges[i];
if (sc->mem_ranges[nmem].size > UINT32_MAX) {
@@ -475,6 +484,13 @@
sc->mem_ranges[nmem].size = UINT32_MAX;
}
++nmem;
+ break;
+
+ default:
+ device_printf(sc->dev,
+ "%s: Unsupported range type (0x%X)\n",
+ __func__, ranges[i].pci_hi &
+ OFW_PCI_PHYS_HI_SPACEMASK);
}
}
@@ -703,6 +719,7 @@
struct pci_dw_softc *sc;
int rv, rid;
bool unroll_mode;
+ u_int32_t br[2];
sc = device_get_softc(dev);
sc->dev = dev;
@@ -710,11 +727,30 @@
mtx_init(&sc->mtx, "pci_dw_mtx", NULL, MTX_DEF);
- /* XXXn Should not be this configurable ? */
- sc->bus_start = 0;
- sc->bus_end = 255;
- sc->root_bus = 0;
- sc->sub_bus = 1;
+ if (OF_hasprop(sc->node, "bus-range")) {
+ rv = OF_getencprop(sc->node, "bus-range", br, sizeof(br));
+ if (rv < 0) {
+ device_printf(dev,
+ "Cannot read 'bus-range' property: %d\n", rv);
+ rv = ENXIO;
+ goto out;
+ }
+ if (rv != 8) {
+ device_printf(dev,
+ "Malformed 'bus-range' property: %d\n", rv);
+ rv = ENXIO;
+ goto out;
+ }
+ sc->bus_start = br[0];
+ sc->bus_end = br[1];
+ } else {
+ sc->bus_start = 0;
+ sc->bus_end = 255;
+ }
+ sc->root_bus = sc->bus_start;
+ sc->sub_bus = sc->bus_start + 1;
+ dprintf("%s: bus range[%d..%d], root bus %d, sub bus: %d\n", __func__,
+ sc->bus_end, sc->bus_start, sc->root_bus, sc->sub_bus);
/* Read FDT properties */
if (!sc->coherent)
@@ -724,6 +760,8 @@
sizeof(sc->num_lanes));
if (rv != sizeof(sc->num_lanes))
sc->num_lanes = 1;
+ dprintf("%s: num lanes: %d\n", __func__, sc->num_lanes);
+
if (sc->num_lanes != 1 && sc->num_lanes != 2 &&
sc->num_lanes != 4 && sc->num_lanes != 8) {
device_printf(dev,
@@ -769,7 +807,6 @@
&sc->dmat);
if (rv != 0)
goto out;
-
rv = ofw_pcib_init(dev);
if (rv != 0)
goto out;
@@ -778,6 +815,9 @@
if (rv != 0)
goto out;
+ dprintf("%s: version: 0x%08X, version type:0x%08X\n", __func__,
+ DBI_RD4(sc, DW_MISC_VERSION), DBI_RD4(sc, DW_MISC_VERSION_TYPE));
+
unroll_mode = pci_dw_detect_atu_unroll(sc);
if (bootverbose)
device_printf(dev, "Using iATU %s mode\n",
@@ -786,6 +826,7 @@
rid = 0;
rv = ofw_bus_find_string_index(sc->node, "reg-names", "atu", &rid);
if (rv == 0) {
+ dprintf("%s: Have 'atu' regs\n", __func__);
sc->iatu_ur_res = bus_alloc_resource_any(dev,
SYS_RES_MEMORY, &rid, RF_ACTIVE);
if (sc->iatu_ur_res == NULL) {
@@ -798,6 +839,7 @@
sc->iatu_ur_offset = 0;
sc->iatu_ur_size = rman_get_size(sc->iatu_ur_res);
} else if (rv == ENOENT) {
+ dprintf("%s: Using 'dbi' regs for atu\n", __func__);
sc->iatu_ur_res = sc->dbi_res;
sc->iatu_ur_offset = DW_DEFAULT_IATU_UR_DBI_OFFSET;
sc->iatu_ur_size = DW_DEFAULT_IATU_UR_DBI_SIZE;
diff --git a/sys/dev/pwm/controller/rockchip/rk_pwm.c b/sys/dev/pwm/controller/rockchip/rk_pwm.c
--- a/sys/dev/pwm/controller/rockchip/rk_pwm.c
+++ b/sys/dev/pwm/controller/rockchip/rk_pwm.c
@@ -96,6 +96,7 @@
static struct ofw_compat_data compat_data[] = {
{ "rockchip,rk3288-pwm", 1 },
{ "rockchip,rk3399-pwm", 1 },
+ { "rockchip,rk3588-pwm", 1 },
{ NULL, 0 }
};
@@ -108,6 +109,7 @@
device_t dev;
device_t busdev;
clk_t clk;
+ clk_t pclk;
struct resource *res;
uint64_t clk_freq;
@@ -151,15 +153,36 @@
sc = device_get_softc(dev);
sc->dev = dev;
+ node = ofw_bus_get_node(dev);
- error = clk_get_by_ofw_index(dev, 0, 0, &sc->clk);
- if (error != 0) {
- device_printf(dev, "cannot get clock\n");
- goto fail;
+ if (OF_hasprop(node, "clock_names")) {
+ error = clk_get_by_ofw_name(dev, 0, "pwm", &sc->clk);
+ if (error != 0) {
+ device_printf(dev, "cannot get 'pwm' clock\n");
+ goto fail;
+ }
+ error = clk_get_by_ofw_name(dev, 0, "pclk", &sc->pclk);
+ if (error != 0) {
+ device_printf(dev, "cannot get 'pclk' clock\n");
+ goto fail;
+ }
+ } else {
+ error = clk_get_by_ofw_index(dev, 0, 0, &sc->clk);
+ if (error != 0) {
+ device_printf(dev, "cannot get clock\n");
+ goto fail;
+ }
+ }
+ if (sc->pclk != NULL) {
+ error = clk_enable(sc->pclk);
+ if (error != 0) {
+ device_printf(dev, "cannot enable 'pclk' clock\n");
+ goto fail;
+ }
}
error = clk_enable(sc->clk);
if (error != 0) {
- device_printf(dev, "cannot enable clock\n");
+ device_printf(dev, "cannot enable 'pwm' clock\n");
goto fail;
}
error = clk_get_freq(sc->clk, &sc->clk_freq);
@@ -209,7 +232,6 @@
sc->duty = NS_PER_SEC /
(clk_freq / reg);
- node = ofw_bus_get_node(dev);
OF_device_register_xref(OF_xref_from_node(node), dev);
sc->busdev = device_add_child(dev, "pwmbus", DEVICE_UNIT_ANY);
@@ -237,7 +259,7 @@
}
static phandle_t
-aw_pwm_get_node(device_t bus, device_t dev)
+rk_pwm_get_node(device_t bus, device_t dev)
{
/*
@@ -376,7 +398,7 @@
DEVMETHOD(device_detach, rk_pwm_detach),
/* ofw_bus interface */
- DEVMETHOD(ofw_bus_get_node, aw_pwm_get_node),
+ DEVMETHOD(ofw_bus_get_node, rk_pwm_get_node),
/* pwm interface */
DEVMETHOD(pwmbus_channel_count, rk_pwm_channel_count),
diff --git a/sys/dev/regulator/regulator_fixed.c b/sys/dev/regulator/regulator_fixed.c
--- a/sys/dev/regulator/regulator_fixed.c
+++ b/sys/dev/regulator/regulator_fixed.c
@@ -405,14 +405,22 @@
if (OF_hasprop(node, "gpio-open-drain"))
sc->init_def.gpio_open_drain = true;
- if (!OF_hasprop(node, "gpio"))
- return (0);
- rv = ofw_bus_parse_xref_list_alloc(node, "gpio", "#gpio-cells", 0,
- &sc->gpio_prodxref, &sc->gpio_ncells, &sc->gpio_cells);
- if (rv != 0) {
- sc->gpio_prodxref = 0;
- device_printf(sc->dev, "Malformed gpio property\n");
- return (ENXIO);
+ if (OF_hasprop(node, "gpio")) {
+ rv = ofw_bus_parse_xref_list_alloc(node, "gpio", "#gpio-cells",
+ 0, &sc->gpio_prodxref, &sc->gpio_ncells, &sc->gpio_cells);
+ if (rv != 0) {
+ sc->gpio_prodxref = 0;
+ device_printf(sc->dev, "Malformed gpio property\n");
+ return (ENXIO);
+ }
+ } else if (OF_hasprop(node, "gpios")) {
+ rv = ofw_bus_parse_xref_list_alloc(node, "gpios", "#gpio-cells",
+ 0, &sc->gpio_prodxref, &sc->gpio_ncells, &sc->gpio_cells);
+ if (rv != 0) {
+ sc->gpio_prodxref = 0;
+ device_printf(sc->dev, "Malformed gpios property\n");
+ return (ENXIO);
+ }
}
return (0);
}
diff --git a/sys/dev/spibus/ofw_spibus.c b/sys/dev/spibus/ofw_spibus.c
--- a/sys/dev/spibus/ofw_spibus.c
+++ b/sys/dev/spibus/ofw_spibus.c
@@ -239,6 +239,6 @@
DEFINE_CLASS_1(spibus, ofw_spibus_driver, ofw_spibus_methods,
sizeof(struct spibus_softc), spibus_driver);
-DRIVER_MODULE(ofw_spibus, spi, ofw_spibus_driver, 0, 0);
+EARLY_DRIVER_MODULE(ofw_spibus, spi, ofw_spibus_driver, 0, 0, BUS_PASS_BUS);
MODULE_VERSION(ofw_spibus, 1);
MODULE_DEPEND(ofw_spibus, spibus, 1, 1, 1);
diff --git a/sys/dev/spibus/pmic/rockchip/rk806.h b/sys/dev/spibus/pmic/rockchip/rk806.h
new file mode 100644
--- /dev/null
+++ b/sys/dev/spibus/pmic/rockchip/rk806.h
@@ -0,0 +1,238 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 Michal Meloun <mmel@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _RK806_H_
+
+/* RK806 */
+#define RK806_POWER_EN0 0x0
+#define RK806_POWER_EN1 0x1
+#define RK806_POWER_EN2 0x2
+#define RK806_POWER_EN3 0x3
+#define RK806_POWER_EN4 0x4
+#define RK806_POWER_EN5 0x5
+#define RK806_POWER_SLP_EN0 0x6
+#define RK806_POWER_SLP_EN1 0x7
+#define RK806_POWER_SLP_EN2 0x8
+#define RK806_POWER_DISCHRG_EN0 0x9
+#define RK806_POWER_DISCHRG_EN1 0xA
+#define RK806_POWER_DISCHRG_EN2 0xB
+#define RK806_BUCK_FB_CONFIG 0xC
+#define RK806_SLP_LP_CONFIG 0xD
+#define RK806_POWER_FPWM_EN0 0xE
+#define RK806_POWER_FPWM_EN1 0xF
+#define RK806_BUCK1_CONFIG 0x10
+#define RK806_BUCK2_CONFIG 0x11
+#define RK806_BUCK3_CONFIG 0x12
+#define RK806_BUCK4_CONFIG 0x13
+#define RK806_BUCK5_CONFIG 0x14
+#define RK806_BUCK6_CONFIG 0x15
+#define RK806_BUCK7_CONFIG 0x16
+#define RK806_BUCK8_CONFIG 0x17
+#define RK806_BUCK9_CONFIG 0x18
+#define RK806_BUCK10_CONFIG 0x19
+#define RK806_BUCK1_ON_VSEL 0x1A
+#define RK806_BUCK2_ON_VSEL 0x1B
+#define RK806_BUCK3_ON_VSEL 0x1C
+#define RK806_BUCK4_ON_VSEL 0x1D
+#define RK806_BUCK5_ON_VSEL 0x1E
+#define RK806_BUCK6_ON_VSEL 0x1F
+#define RK806_BUCK7_ON_VSEL 0x20
+#define RK806_BUCK8_ON_VSEL 0x21
+#define RK806_BUCK9_ON_VSEL 0x22
+#define RK806_BUCK10_ON_VSEL 0x23
+#define RK806_BUCK1_SLP_VSEL 0x24
+#define RK806_BUCK2_SLP_VSEL 0x25
+#define RK806_BUCK3_SLP_VSEL 0x26
+#define RK806_BUCK4_SLP_VSEL 0x27
+#define RK806_BUCK5_SLP_VSEL 0x28
+#define RK806_BUCK6_SLP_VSEL 0x29
+#define RK806_BUCK7_SLP_VSEL 0x2A
+#define RK806_BUCK8_SLP_VSEL 0x2B
+#define RK806_BUCK9_SLP_VSEL 0x2D
+#define RK806_BUCK10_SLP_VSEL 0x2E
+#define RK806_NLDO_IMAX 0x42
+#define RK806_NLDO1_ON_VSEL 0x43
+#define RK806_NLDO2_ON_VSEL 0x44
+#define RK806_NLDO3_ON_VSEL 0x45
+#define RK806_NLDO4_ON_VSEL 0x46
+#define RK806_NLDO5_ON_VSEL 0x47
+#define RK806_NLDO1_SLP_VSEL 0x48
+#define RK806_NLDO2_SLP_VSEL 0x49
+#define RK806_NLDO3_SLP_VSEL 0x4A
+#define RK806_NLDO4_SLP_VSEL 0x4B
+#define RK806_NLDO5_SLP_VSEL 0x4C
+#define RK806_PLDO_IMAX 0x4D
+#define RK806_PLDO1_ON_VSEL 0x4E
+#define RK806_PLDO2_ON_VSEL 0x4F
+#define RK806_PLDO3_ON_VSEL 0x50
+#define RK806_PLDO4_ON_VSEL 0x51
+#define RK806_PLDO5_ON_VSEL 0x52
+#define RK806_PLDO6_ON_VSEL 0x53
+#define RK806_PLDO1_SLP_VSEL 0x54
+#define RK806_PLDO2_SLP_VSEL 0x55
+#define RK806_PLDO3_SLP_VSEL 0x56
+#define RK806_PLDO4_SLP_VSEL 0x57
+#define RK806_PLDO5_SLP_VSEL 0x58
+#define RK806_PLDO6_SLP_VSEL 0x59
+#define RK806_CHIP_NAME 0x5A
+#define RK806_CHIP_VER 0x5B
+#define RK806_OTP_VER 0x5C
+#define RK806_SYS_STS 0x5D
+#define RK806_SYS_CFG0 0x5E
+#define RK806_SYS_CFG1 0x5F
+#define RK806_SYS_OPTION 0x61
+#define RK806_PWRCTRL_CONFIG0 0x62
+#define RK806_PWRCTRL_CONFIG1 0x63
+#define RK806_VSEL_CTR_SEL0 0x64
+#define RK806_VSEL_CTR_SEL1 0x65
+#define RK806_VSEL_CTR_SEL2 0x66
+#define RK806_VSEL_CTR_SEL3 0x67
+#define RK806_VSEL_CTR_SEL4 0x68
+#define RK806_VSEL_CTR_SEL5 0x69
+#define RK806_DVS_CTRL_SEL0 0x6A
+#define RK806_DVS_CTRL_SEL1 0x6B
+#define RK806_DVS_CTRL_SEL2 0x6C
+#define RK806_DVS_CTRL_SEL3 0x6D
+#define RK806_DVS_CTRL_SEL4 0x6E
+#define RK806_DVS_CTRL_SEL5 0x6F
+#define RK806_DVS_START_CTRL 0x70
+#define RK806_PWRCTRL_GPIO 0x71
+#define RK806_SYS_CFG3 0x72
+#define RK806_WDT_REG 0x73
+#define RK806_ON_SOURCE 0x74
+#define RK806_OFF_SOURCE 0x75
+#define RK806_PWRON_KEY 0x76
+#define RK806_INT_STS0 0x77
+#define RK806_INT_MSK0 0x78
+#define RK806_INT_STS1 0x79
+#define RK806_INT_MSK1 0x7A
+#define RK806_GPIO_INT_CONFIG 0x7B
+#define RK806_DATA_REG0 0x7C
+#define RK806_DATA_REG1 0x7D
+#define RK806_DATA_REG2 0x7E
+#define RK806_DATA_REG3 0x7F
+#define RK806_DATA_REG4 0x80
+#define RK806_DATA_REG5 0x81
+#define RK806_DATA_REG6 0x82
+#define RK806_DATA_REG7 0x83
+#define RK806_DATA_REG8 0x84
+#define RK806_DATA_REG9 0x85
+#define RK806_DATA_REG10 0x86
+#define RK806_DATA_REG11 0x87
+#define RK806_DATA_REG12 0x88
+#define RK806_DATA_REG13 0x89
+#define RK806_DATA_REG14 0x8A
+#define RK806_DATA_REG15 0x8B
+#define RK806_BUCK_SEQ_REG0 0xB2
+#define RK806_BUCK_SEQ_REG1 0xB3
+#define RK806_BUCK_SEQ_REG2 0xB4
+#define RK806_BUCK_SEQ_REG3 0xB5
+#define RK806_BUCK_SEQ_REG4 0xB6
+#define RK806_BUCK_SEQ_REG5 0xB7
+#define RK806_BUCK_SEQ_REG6 0xB8
+#define RK806_BUCK_SEQ_REG7 0xB9
+#define RK806_BUCK_SEQ_REG8 0xBA
+#define RK806_BUCK_SEQ_REG9 0xBB
+#define RK806_BUCK_SEQ_REG10 0xBC
+#define RK806_BUCK_SEQ_REG11 0xBD
+#define RK806_BUCK_SEQ_REG12 0xBE
+#define RK806_BUCK_SEQ_REG13 0xBF
+#define RK806_BUCK_SEQ_REG14 0xC0
+#define RK806_BUCK_SEQ_REG15 0xC1
+#define RK806_BUCK_SEQ_REG16 0xC2
+#define RK806_BUCK_SEQ_REG17 0xC3
+#define RK806_BACKUP_REG7 0xDC
+#define RK806_BACKUP_REG6 0xE6
+#define RK806_BACKUP_REG5 0xE7
+#define RK806_BACKUP_REG1 0xE8
+#define RK806_BACKUP_REG2 0xE9
+#define RK806_BACKUP_REG3 0xEA
+#define RK806_BACKUP_REG4 0xEB
+
+
+
+
+struct rk806_reg_sc;
+struct rk806_gpio_pin;
+
+struct rk806_softc {
+ device_t dev;
+ struct sx lock;
+ struct resource *irq_res;
+ void *irq_h;
+
+ uint16_t chip_name;
+ uint8_t chip_ver;
+ uint8_t otp_ver;
+
+ /* Regulators. */
+ struct rk806_reg_sc **regs;
+ int nregs;
+
+ /* GPIO */
+ device_t gpio_busdev;
+ struct rk806_gpio_pin **gpio_pins;
+ int gpio_npins;
+ struct sx gpio_lock;
+
+};
+
+#define RD1(sc, reg, val) rk806_read(sc, reg, val)
+#define WR1(sc, reg, val) rk806_write(sc, reg, val)
+#define RM1(sc, reg, clr, set) rk806_modify(sc, reg, clr, set)
+
+int rk806_read(struct rk806_softc *sc, uint8_t reg, uint8_t *val);
+int rk806_write(struct rk806_softc *sc, uint8_t reg, uint8_t val);
+int rk806_modify(struct rk806_softc *sc, uint8_t reg, uint8_t clear,
+ uint8_t set);
+int rk806_read_buf(struct rk806_softc *sc, uint8_t reg, uint8_t *buf,
+ size_t size);
+int rk806_write_buf(struct rk806_softc *sc, uint8_t reg, uint8_t *buf,
+ size_t size);
+
+/* Regulators */
+int rk806_regulator_attach(struct rk806_softc *sc, phandle_t node);
+int rk806_regulator_map(device_t dev, phandle_t xref, int ncells,
+ pcell_t *cells, intptr_t *num);
+
+
+/* GPIO */
+device_t rk806_gpio_get_bus(device_t dev);
+int rk806_gpio_pin_max(device_t dev, int *maxpin);
+int rk806_gpio_pin_getname(device_t dev, uint32_t pin, char *name);
+int rk806_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags);
+int rk806_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps);
+int rk806_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags);
+int rk806_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value);
+int rk806_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val);
+int rk806_gpio_pin_toggle(device_t dev, uint32_t pin);
+int rk806_gpio_map_gpios(device_t dev, phandle_t pdev, phandle_t gparent,
+ int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags);
+int rk806_gpio_attach(struct rk806_softc *sc, phandle_t node);
+int rk806_pinmux_configure(device_t dev, phandle_t cfgxref);
+
+#endif /* _RK806_H_ */
diff --git a/sys/dev/spibus/pmic/rockchip/rk806.c b/sys/dev/spibus/pmic/rockchip/rk806.c
new file mode 100644
--- /dev/null
+++ b/sys/dev/spibus/pmic/rockchip/rk806.c
@@ -0,0 +1,367 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2016 Michal Meloun <mmel@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * RK806 PMIC driver
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/gpio.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/malloc.h>
+#include <sys/rman.h>
+#include <sys/sx.h>
+
+#include <machine/bus.h>
+
+#include <dev/regulator/regulator.h>
+#include <dev/fdt/fdt_pinctrl.h>
+#include <dev/gpio/gpiobusvar.h>
+#include <dev/spibus/spi.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+
+#include "regdev_if.h"
+#include "spibus_if.h"
+
+#include "rk806.h"
+
+static struct ofw_compat_data compat_data[] = {
+ {"rockchip,rk806", 1},
+ {NULL, 0},
+};
+
+#define LOCK(_sc) sx_xlock(&(_sc)->lock)
+#define UNLOCK(_sc) sx_xunlock(&(_sc)->lock)
+#define LOCK_INIT(_sc) sx_init(&(_sc)->lock, "rk806")
+#define LOCK_DESTROY(_sc) sx_destroy(&(_sc)->lock);
+#define ASSERT_LOCKED(_sc) sx_assert(&(_sc)->lock, SA_XLOCKED);
+#define ASSERT_UNLOCKED(_sc) sx_assert(&(_sc)->lock, SA_UNLOCKED);
+
+/* SPI command */
+#define RK806_CMD_READ (0 << 7)
+#define RK806_CMD_WRITE (1 << 7)
+
+#define RK806_CMD_SIZE 0x0F
+
+#define RK806_CMD(CMD, SIZE) (RK806_CMD_##CMD | (SIZE - 1))
+
+#define RK806_CHIP_NAME_ID 0x806
+
+/*
+ * Raw register access function.
+ */
+int
+rk806_read(struct rk806_softc *sc, uint8_t reg, uint8_t *val)
+{
+ uint8_t tx_buf[3];
+ struct spi_command cmd;
+ int rv;
+
+ memset(&cmd, 0, sizeof(cmd));
+ memset(&tx_buf, 0, sizeof(tx_buf));
+ cmd.tx_cmd = &tx_buf;
+ cmd.tx_cmd_sz = sizeof(tx_buf);
+ cmd.rx_data = val;
+ cmd.rx_data_sz = sizeof(*val);
+
+ tx_buf[0] = RK806_CMD(READ, sizeof(*val));
+ tx_buf[1] = reg;
+ tx_buf[2] = 0;
+
+ rv = SPIBUS_TRANSFER(device_get_parent(sc->dev), sc->dev, &cmd);
+ if (rv != 0) {
+ device_printf(sc->dev,
+ "Error when reading reg 0x%02X, rv: %d\n", reg, rv);
+ return (EIO);
+ }
+ return (0);
+}
+
+int
+rk806_write(struct rk806_softc *sc, uint8_t reg, uint8_t val)
+{
+ uint8_t tx_buf[4];
+ struct spi_command cmd;
+ int rv;
+
+ memset(&cmd, 0, sizeof(cmd));
+ memset(&tx_buf, 0, sizeof(tx_buf));
+ cmd.tx_cmd = &tx_buf;
+ cmd.tx_cmd_sz = sizeof(tx_buf);
+
+ tx_buf[0] = RK806_CMD(WRITE, sizeof(val));
+ tx_buf[1] = reg;
+ tx_buf[2] = 0;
+ tx_buf[3] = val;
+
+ rv = SPIBUS_TRANSFER(device_get_parent(sc->dev), sc->dev, &cmd);
+ if (rv != 0) {
+ device_printf(sc->dev,
+ "Error when writing reg 0x%02X, rv: %d\n", reg, rv);
+ return (EIO);
+ }
+ return (0);
+}
+
+int
+rk806_modify(struct rk806_softc *sc, uint8_t reg, uint8_t clear, uint8_t set)
+{
+ uint8_t val;
+ int rv;
+
+ rv = rk806_read(sc, reg, &val);
+ if (rv != 0)
+ return (rv);
+
+ val &= ~clear;
+ val |= set;
+
+ rv = rk806_write(sc, reg, val);
+ if (rv != 0)
+ return (rv);
+
+ return (0);
+}
+
+static int
+rk806_get_version(struct rk806_softc *sc)
+{
+ uint8_t reg1, reg2, otp;
+ int rv;
+
+ /* Verify RK806 ID and version. */
+ rv = RD1(sc, RK806_CHIP_NAME, ®1);
+ if (rv != 0)
+ return (ENXIO);
+ rv = RD1(sc, RK806_CHIP_VER, ®2);
+ if (rv != 0)
+ return (ENXIO);
+ rv = RD1(sc, RK806_OTP_VER, &otp);
+ if (rv != 0)
+ return (ENXIO);
+
+ sc->chip_name = (uint16_t)reg1 << 4;
+ sc->chip_name |= (uint16_t)reg2 >> 4;
+ sc->chip_ver = reg2 & 0x0F;
+ sc->chip_ver = otp & 0x0F;
+
+ if (sc->chip_name != RK806_CHIP_NAME_ID) {
+ device_printf(sc->dev, "Invalid chip, ID is 0x%X\n",
+ sc->chip_name);
+ return (ENXIO);
+ }
+
+ if (bootverbose)
+ device_printf(sc->dev, "RK806 ver: 0x%X, opt: 0x%X\n",
+ sc->chip_ver, sc->otp_ver);
+ return (0);
+}
+
+static int
+rk806_init(struct rk806_softc *sc)
+{
+#if 0
+ uint32_t reg;
+ int rv;
+
+ reg = 0;
+ if (sc->int_pullup)
+ reg |= RK806_INT_PULL_UP;
+ if (sc->i2c_pullup)
+ reg |= RK806_I2C_PULL_UP;
+
+ rv = RM1(sc, RK806_IO_VOLTAGE,
+ RK806_INT_PULL_UP | RK806_I2C_PULL_UP, reg);
+ if (rv != 0)
+ return (ENXIO);
+
+ /* mask interrupts */
+ rv = WR1(sc, RK806_INTERRUPT_MASK1, 0);
+ if (rv != 0)
+ return (ENXIO);
+ rv = WR1(sc, RK806_INTERRUPT_MASK2, 0);
+ if (rv != 0)
+ return (ENXIO);
+ rv = WR1(sc, RK806_INTERRUPT_MASK3, 0);
+ if (rv != 0)
+ return (ENXIO);
+ rv = WR1(sc, RK806_INTERRUPT_MASK4, 0);
+ if (rv != 0)
+ return (ENXIO);
+#endif
+ return (0);
+}
+
+
+static void
+rk806_intr(void *arg)
+{
+ /* XXX Finish temperature alarms. */
+}
+
+static int
+rk806_probe(device_t dev)
+{
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
+ return (ENXIO);
+
+ device_set_desc(dev, "RK806 PMIC");
+ return (BUS_PROBE_DEFAULT);
+}
+
+static int
+rk806_attach(device_t dev)
+{
+ struct rk806_softc *sc;
+ int rv, rid;
+ phandle_t node;
+
+ sc = device_get_softc(dev);
+ sc->dev = dev;
+ node = ofw_bus_get_node(sc->dev);
+ rv = 0;
+
+ LOCK_INIT(sc);
+
+ rid = 0;
+ sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
+ RF_ACTIVE);
+ if (sc->irq_res == NULL) {
+ device_printf(dev, "Cannot allocate interrupt.\n");
+ rv = ENXIO;
+ goto fail;
+ }
+
+ rv = rk806_get_version(sc);
+ if (rv != 0)
+ goto fail;
+ rv = rk806_init(sc);
+ if (rv != 0)
+ goto fail;
+ rv = rk806_regulator_attach(sc, node);
+ if (rv != 0)
+ goto fail;
+ rv = rk806_gpio_attach(sc, node);
+ if (rv != 0)
+ goto fail;
+
+ fdt_pinctrl_register(dev, NULL);
+ fdt_pinctrl_configure_by_name(dev, "default");
+
+ /* Setup interrupt. */
+ rv = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
+ NULL, rk806_intr, sc, &sc->irq_h);
+ if (rv) {
+ device_printf(dev, "Cannot setup interrupt.\n");
+ goto fail;
+ }
+ bus_attach_children(dev);
+ return (0);
+
+fail:
+ if (sc->irq_h != NULL)
+ bus_teardown_intr(dev, sc->irq_res, sc->irq_h);
+ if (sc->irq_res != NULL)
+ bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
+ LOCK_DESTROY(sc);
+ return (rv);
+}
+
+static int
+rk806_detach(device_t dev)
+{
+ struct rk806_softc *sc;
+ int error;
+
+ error = bus_generic_detach(dev);
+ if (error != 0)
+ return (error);
+
+ sc = device_get_softc(dev);
+ if (sc->irq_h != NULL)
+ bus_teardown_intr(dev, sc->irq_res, sc->irq_h);
+ if (sc->irq_res != NULL)
+ bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
+ LOCK_DESTROY(sc);
+
+ return (0);
+}
+
+static phandle_t
+rk806_gpio_get_node(device_t bus, device_t dev)
+{
+
+ /* We only have one child, the GPIO bus, which needs our own node. */
+ return (ofw_bus_get_node(bus));
+}
+
+static device_method_t rk806_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, rk806_probe),
+ DEVMETHOD(device_attach, rk806_attach),
+ DEVMETHOD(device_detach, rk806_detach),
+
+ /* Regdev interface */
+ DEVMETHOD(regdev_map, rk806_regulator_map),
+
+ /* GPIO protocol interface */
+ DEVMETHOD(gpio_get_bus, rk806_gpio_get_bus),
+ DEVMETHOD(gpio_pin_max, rk806_gpio_pin_max),
+ DEVMETHOD(gpio_pin_getname, rk806_gpio_pin_getname),
+ DEVMETHOD(gpio_pin_getflags, rk806_gpio_pin_getflags),
+ DEVMETHOD(gpio_pin_getcaps, rk806_gpio_pin_getcaps),
+ DEVMETHOD(gpio_pin_setflags, rk806_gpio_pin_setflags),
+ DEVMETHOD(gpio_pin_get, rk806_gpio_pin_get),
+ DEVMETHOD(gpio_pin_set, rk806_gpio_pin_set),
+ DEVMETHOD(gpio_pin_toggle, rk806_gpio_pin_toggle),
+ DEVMETHOD(gpio_map_gpios, rk806_gpio_map_gpios),
+
+ /* fdt_pinctrl interface */
+ DEVMETHOD(fdt_pinctrl_configure, rk806_pinmux_configure),
+
+ /* ofw_bus interface */
+ DEVMETHOD(ofw_bus_get_node, rk806_gpio_get_node),
+
+ DEVMETHOD_END
+};
+extern driver_t ofw_gpiobus_driver, gpioc_driver;
+static DEFINE_CLASS_0(rk806_pmic, rk806_driver, rk806_methods,
+ sizeof(struct rk806_softc));
+EARLY_DRIVER_MODULE(rk806_pmic, spibus, rk806_driver, NULL, NULL, 74);
+EARLY_DRIVER_MODULE(ofw_gpiobus, rk806_pmic, ofw_gpiobus_driver,
+ 0, 0, BUS_PASS_BUS + 1);
+DRIVER_MODULE(gpioc, rk806_pmic, gpioc_driver, 0, 0);
+
diff --git a/sys/dev/spibus/pmic/rockchip/rk806_gpio.c b/sys/dev/spibus/pmic/rockchip/rk806_gpio.c
new file mode 100644
--- /dev/null
+++ b/sys/dev/spibus/pmic/rockchip/rk806_gpio.c
@@ -0,0 +1,422 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2016 Michal Meloun <mmel@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/gpio.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/sx.h>
+
+#include <machine/bus.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/gpio/gpiobusvar.h>
+
+#include "rk806.h"
+
+MALLOC_DEFINE(M_RK806_GPIO, "RK806 gpio", "RK806 GPIO");
+
+#define NGPIO 3
+
+#define GPIO_LOCK(_sc) sx_slock(&(_sc)->gpio_lock)
+#define GPIO_UNLOCK(_sc) sx_unlock(&(_sc)->gpio_lock)
+#define GPIO_ASSERT(_sc) sx_assert(&(_sc)->gpio_lock, SA_LOCKED)
+
+#define RK806_GPIO_VAL_MASK(pin) (1 << ((pin) + 4))
+#define RK806_GPIO_DIR_MASK(pin) (1 << (pin))
+
+#define RK806_FNC_SHIFT(pin) (4 *(pin))
+#define RK806_FNC_MASK(pin) (7 << RK806_FNC_SHIFT(pin))
+
+static struct {
+ const char *name;
+ int fnc_val;
+} rk806_fnc_table[] = {
+ {"pin_fun0", 0},
+ {"pin_fun1", 1},
+ {"pin_fun2", 2},
+ {"pin_fun3", 3},
+ {"pin_fun4", 4},
+ {"pin_fun5", 5},
+};
+
+struct rk806_pincfg {
+ char *function;
+ int flags;
+};
+
+struct rk806_gpio_pin {
+ int pin_caps;
+ char pin_name[GPIOMAXNAME];
+};
+
+
+/* --------------------------------------------------------------------------
+ *
+ * Pinmux functions.
+ */
+static int
+rk806_pinmux_get_function(struct rk806_softc *sc, char *name)
+{
+ int i;
+
+ for (i = 0; i < nitems(rk806_fnc_table); i++) {
+ if (strcmp(rk806_fnc_table[i].name, name) == 0)
+ return (rk806_fnc_table[i].fnc_val);
+ }
+ return (-1);
+}
+
+static int
+rk806_pinmux_config_node(struct rk806_softc *sc, char *pin_name,
+ struct rk806_pincfg *cfg)
+{
+ uint8_t tmp;
+ int rv, fnc, pin;
+
+ for (pin = 0; pin < sc->gpio_npins; pin++) {
+ if (strcmp(sc->gpio_pins[pin]->pin_name, pin_name) == 0)
+ break;
+ }
+ if (pin >= sc->gpio_npins) {
+ device_printf(sc->dev, "Unknown pin: %s\n", pin_name);
+ return (ENXIO);
+ }
+
+ if (cfg->function == NULL) {
+ device_printf(sc->dev, "Function is missing for pin %s\n",
+ sc->gpio_pins[pin]->pin_name);
+ }
+
+ fnc = rk806_pinmux_get_function(sc, cfg->function);
+ if (fnc == -1) {
+ device_printf(sc->dev, "Unknown function %s for pin %s\n",
+ cfg->function, sc->gpio_pins[pin]->pin_name);
+ return (ENXIO);
+ }
+
+ GPIO_LOCK(sc);
+ rv = RD1(sc, RK806_PWRCTRL_CONFIG1, &tmp);
+ if (rv != 0) {
+ GPIO_UNLOCK(sc);
+ return (rv);
+ }
+
+ tmp &= ~RK806_FNC_MASK(pin);
+ tmp |= fnc << RK806_FNC_SHIFT(pin);
+
+ rv = WR1(sc, RK806_PWRCTRL_CONFIG1, tmp);
+ GPIO_UNLOCK(sc);
+
+ return (rv);
+}
+
+static int
+rk806_pinmux_read_node(struct rk806_softc *sc, phandle_t node,
+ struct rk806_pincfg *cfg, char **pins, int *lpins)
+{
+ int rv;
+
+
+ *lpins = OF_getprop_alloc(node, "pins", (void **)pins);
+ if (*lpins <= 0)
+ return (ENOENT);
+
+
+ /* Read function (mux) settings. */
+ rv = OF_getprop_alloc(node, "function", (void **)&cfg->function);
+ if (rv <= 0)
+ cfg->function = NULL;
+
+ return (0);
+}
+
+static int
+rk806_pinmux_process_node(struct rk806_softc *sc, phandle_t node)
+{
+ struct rk806_pincfg cfg;
+ char *pins, *pname;
+ int i, len, lpins, rv;
+
+ rv = rk806_pinmux_read_node(sc, node, &cfg, &pins, &lpins);
+ if (rv != 0)
+ return (rv);
+
+ len = 0;
+ pname = pins;
+ do {
+ i = strlen(pname) + 1;
+ rv = rk806_pinmux_config_node(sc, pname, &cfg);
+ if (rv != 0) {
+ device_printf(sc->dev,
+ "Cannot configure pin: %s: %d\n", pname, rv);
+ return (rv);
+ }
+ len += i;
+ pname += i;
+ } while (len < lpins);
+
+ if (pins != NULL)
+ OF_prop_free(pins);
+ if (cfg.function != NULL)
+ OF_prop_free(cfg.function);
+
+ return (0);
+}
+
+int rk806_pinmux_configure(device_t dev, phandle_t cfgxref)
+{
+ struct rk806_softc *sc;
+ phandle_t node, cfgnode;
+ int rv;
+
+ sc = device_get_softc(dev);
+ cfgnode = OF_node_from_xref(cfgxref);
+
+ for (node = OF_child(cfgnode); node != 0; node = OF_peer(node)) {
+ if (!ofw_bus_node_status_okay(node))
+ continue;
+ rv = rk806_pinmux_process_node(sc, node);
+ if (rv != 0)
+ device_printf(dev, "Failed to process pinmux");
+ }
+ return (0);
+}
+
+
+/* --------------------------------------------------------------------------
+ *
+ * GPIO
+ */
+device_t
+rk806_gpio_get_bus(device_t dev)
+{
+ struct rk806_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (sc->gpio_busdev);
+}
+
+int
+rk806_gpio_pin_max(device_t dev, int *maxpin)
+{
+
+ *maxpin = NGPIO - 1;
+ return (0);
+}
+
+int
+rk806_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
+{
+ struct rk806_softc *sc;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+ GPIO_LOCK(sc);
+ *caps = sc->gpio_pins[pin]->pin_caps;
+ GPIO_UNLOCK(sc);
+ return (0);
+}
+
+int
+rk806_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
+{
+ struct rk806_softc *sc;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+ GPIO_LOCK(sc);
+ memcpy(name, sc->gpio_pins[pin]->pin_name, GPIOMAXNAME);
+ GPIO_UNLOCK(sc);
+ return (0);
+}
+
+
+int
+rk806_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *out_flags)
+{
+ struct rk806_softc *sc;
+ uint8_t tmp;
+ int rv;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+ rv = RD1(sc, RK806_PWRCTRL_GPIO, &tmp);
+ GPIO_UNLOCK(sc);
+ if (rv != 0)
+ return (rv);
+ if ((tmp & RK806_GPIO_DIR_MASK(pin)) == 0)
+ *out_flags = GPIO_PIN_INPUT;
+ else
+ *out_flags = GPIO_PIN_OUTPUT;
+ return (0);
+}
+
+int
+rk806_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
+{
+ struct rk806_softc *sc;
+ uint8_t tmp;
+ int rv;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+
+ if (flags != GPIO_PIN_INPUT && flags != GPIO_PIN_OUTPUT)
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+ rv = RD1(sc, RK806_PWRCTRL_GPIO, &tmp);
+ if (rv != 0) {
+ GPIO_UNLOCK(sc);
+ return (rv);
+ }
+ if (flags == GPIO_PIN_INPUT)
+ tmp &= ~RK806_GPIO_DIR_MASK(pin);
+ else
+ tmp |= RK806_GPIO_DIR_MASK(pin);
+ rv = WR1(sc, RK806_PWRCTRL_GPIO, tmp);
+ GPIO_UNLOCK(sc);
+
+ return (rv);
+}
+
+int
+rk806_gpio_pin_set(device_t dev, uint32_t pin, uint32_t val)
+{
+ struct rk806_softc *sc;
+ uint8_t tmp;
+ int rv;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+ rv = RD1(sc, RK806_PWRCTRL_GPIO, &tmp);
+ if (rv != 0) {
+ GPIO_UNLOCK(sc);
+ return (rv);
+ }
+ if (val == 0)
+ tmp &= ~RK806_GPIO_VAL_MASK(pin);
+ else
+ tmp |= RK806_GPIO_VAL_MASK(pin);
+ rv = WR1(sc, RK806_PWRCTRL_GPIO, tmp);
+ GPIO_UNLOCK(sc);
+
+ return (rv);
+}
+
+int
+rk806_gpio_pin_get(device_t dev, uint32_t pin, uint32_t *val)
+{
+ struct rk806_softc *sc;
+ uint8_t tmp;
+ int rv;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+ rv = RD1(sc, RK806_PWRCTRL_GPIO, &tmp);
+ GPIO_UNLOCK(sc);
+ if (rv != 0)
+ return (rv);
+ *val = tmp & RK806_GPIO_VAL_MASK(pin) ? 1: 0;
+ return (0);
+}
+
+int
+rk806_gpio_pin_toggle(device_t dev, uint32_t pin)
+{
+ struct rk806_softc *sc;
+ uint8_t tmp;
+ int rv;
+
+ sc = device_get_softc(dev);
+ if (pin >= sc->gpio_npins)
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+ rv = RD1(sc, RK806_PWRCTRL_GPIO, &tmp);
+ if (rv != 0) {
+ GPIO_UNLOCK(sc);
+ return (rv);
+ }
+ tmp ^= RK806_GPIO_VAL_MASK(pin);
+ rv = WR1(sc, RK806_PWRCTRL_GPIO, tmp);
+ GPIO_UNLOCK(sc);
+ return (rv);
+}
+
+
+int
+rk806_gpio_map_gpios(device_t dev, phandle_t pdev, phandle_t gparent,
+ int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags)
+{
+
+ if (gcells != 2)
+ return (ERANGE);
+ *pin = gpios[0];
+ *flags= gpios[1];
+ return (0);
+}
+
+
+int
+rk806_gpio_attach(struct rk806_softc *sc, phandle_t node)
+{
+ struct rk806_gpio_pin *pin;
+ int i;
+
+ sx_init(&sc->gpio_lock, "RK806 GPIO lock");
+ sc->gpio_npins = NGPIO;
+ sc->gpio_pins = malloc(sizeof(struct rk806_gpio_pin *) *
+ sc->gpio_npins, M_RK806_GPIO, M_WAITOK | M_ZERO);
+
+ sc->gpio_busdev = gpiobus_add_bus(sc->dev);
+ if (sc->gpio_busdev == NULL)
+ return (ENXIO);
+ for (i = 0; i < sc->gpio_npins; i++) {
+ sc->gpio_pins[i] = malloc(sizeof(struct rk806_gpio_pin),
+ M_RK806_GPIO, M_WAITOK | M_ZERO);
+ pin = sc->gpio_pins[i];
+ sprintf(pin->pin_name, "gpio_pwrctrl%d", i + 1);
+ pin->pin_caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT ;
+ }
+ return (0);
+}
diff --git a/sys/dev/spibus/pmic/rockchip/rk806_regulators.c b/sys/dev/spibus/pmic/rockchip/rk806_regulators.c
new file mode 100644
--- /dev/null
+++ b/sys/dev/spibus/pmic/rockchip/rk806_regulators.c
@@ -0,0 +1,601 @@
+/*-
+ * Copyright 2016 Michal Meloun <mmel@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/gpio.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/malloc.h>
+#include <sys/rman.h>
+#include <sys/sx.h>
+
+#include <machine/bus.h>
+
+#include <dev/regulator/regulator.h>
+#include <dev/gpio/gpiobusvar.h>
+
+
+#include "rk806.h"
+
+MALLOC_DEFINE(M_RK806_REG, "RK806 regulator", "RK806 power regulator");
+
+#define DIV_ROUND_UP(n,d) howmany(n, d)
+
+enum rk806_reg_id {
+ RK806_ID_DCDC1,
+ RK806_ID_DCDC2,
+ RK806_ID_DCDC3,
+ RK806_ID_DCDC4,
+ RK806_ID_DCDC5,
+ RK806_ID_DCDC6,
+ RK806_ID_DCDC7,
+ RK806_ID_DCDC8,
+ RK806_ID_DCDC9,
+ RK806_ID_DCDC10,
+
+ RK806_ID_NLDO1,
+ RK806_ID_NLDO2,
+ RK806_ID_NLDO3,
+ RK806_ID_NLDO4,
+ RK806_ID_NLDO5,
+
+ RK806_ID_PLDO1,
+ RK806_ID_PLDO2,
+ RK806_ID_PLDO3,
+ RK806_ID_PLDO4,
+ RK806_ID_PLDO5,
+ RK806_ID_PLDO6,
+};
+
+/* Regulator HW definition. */
+struct reg_def {
+ intptr_t id; /* ID */
+ char *name; /* Regulator name */
+ char *supply_name; /* Source property name */
+ uint8_t cfg_reg;
+ uint8_t volt_reg;
+ uint8_t enable_reg;
+ int enable_bit;
+ struct regulator_range *ranges;
+ int nranges;
+};
+
+
+struct rk806_reg_sc {
+ struct regnode *regnode;
+ struct rk806_softc *base_sc;
+ struct reg_def *def;
+ phandle_t xref;
+
+ struct regnode_std_param *param;
+ int ext_control;
+ int enable_tracking;
+
+ int enable_usec;
+};
+
+static struct regulator_range rk806_buck_ranges[] = {
+ REG_RANGE_INIT( 0, 159, 500000, 6250), /* 500mV ~ 1500mV */
+ REG_RANGE_INIT(160, 235, 1500000, 25000), /* 1500mV ~ 3400mV */
+ REG_RANGE_INIT(236, 255, 3400000, 0),
+};
+
+static struct regulator_range rk806_ldo_ranges[] = {
+ REG_RANGE_INIT(0, 231, 500000, 12500), /* 500mV ~ 3400mV */
+ REG_RANGE_INIT(232, 255, 3400000, 0),
+};
+
+static struct reg_def rk806_def[] = {
+ {
+ .id = RK806_ID_DCDC1,
+ .name = "dcdc-reg1",
+ .supply_name = "vcc1",
+ .cfg_reg = RK806_BUCK1_CONFIG,
+ .volt_reg = RK806_BUCK1_ON_VSEL,
+ .enable_reg = RK806_POWER_EN0,
+ .enable_bit = 0,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC2,
+ .name = "dcdc-reg2",
+ .supply_name = "vcc2",
+ .cfg_reg = RK806_BUCK2_CONFIG,
+ .volt_reg = RK806_BUCK2_ON_VSEL,
+ .enable_reg = RK806_POWER_EN0,
+ .enable_bit = 1,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC3,
+ .name = "dcdc-reg3",
+ .supply_name = "vcc3",
+ .cfg_reg = RK806_BUCK3_CONFIG,
+ .volt_reg = RK806_BUCK3_ON_VSEL,
+ .enable_reg = RK806_POWER_EN0,
+ .enable_bit = 2,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC4,
+ .name = "dcdc-reg4",
+ .supply_name = "vcc4",
+ .cfg_reg = RK806_BUCK4_CONFIG,
+ .volt_reg = RK806_BUCK4_ON_VSEL,
+ .enable_reg = RK806_POWER_EN0,
+ .enable_bit = 3,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC5,
+ .name = "dcdc-reg5",
+ .supply_name = "vcc5",
+ .cfg_reg = RK806_BUCK5_CONFIG,
+ .volt_reg = RK806_BUCK5_ON_VSEL,
+ .enable_reg = RK806_POWER_EN1,
+ .enable_bit = 0,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC6,
+ .name = "dcdc-reg6",
+ .supply_name = "vcc6",
+ .cfg_reg = RK806_BUCK6_CONFIG,
+ .volt_reg = RK806_BUCK6_ON_VSEL,
+ .enable_reg = RK806_POWER_EN1,
+ .enable_bit = 1,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC7,
+ .name = "dcdc-reg7",
+ .supply_name = "vcc7",
+ .cfg_reg = RK806_BUCK7_CONFIG,
+ .volt_reg = RK806_BUCK7_ON_VSEL,
+ .enable_reg = RK806_POWER_EN1,
+ .enable_bit = 2,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC8,
+ .name = "dcdc-reg8",
+ .supply_name = "vcc8",
+ .cfg_reg = RK806_BUCK8_CONFIG,
+ .volt_reg = RK806_BUCK8_ON_VSEL,
+ .enable_reg = RK806_POWER_EN1,
+ .enable_bit = 3,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC9,
+ .name = "dcdc-reg9",
+ .supply_name = "vcc9",
+ .cfg_reg = RK806_BUCK9_CONFIG,
+ .volt_reg = RK806_BUCK9_ON_VSEL,
+ .enable_reg = RK806_POWER_EN2,
+ .enable_bit = 0,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_DCDC10,
+ .name = "dcdc-reg10",
+ .supply_name = "vcc10",
+ .cfg_reg = RK806_BUCK10_CONFIG,
+ .volt_reg = RK806_BUCK10_ON_VSEL,
+ .enable_reg = RK806_POWER_EN2,
+ .enable_bit = 2,
+ .ranges = rk806_buck_ranges,
+ .nranges = nitems(rk806_buck_ranges),
+ },
+ {
+ .id = RK806_ID_NLDO1,
+ .name = "nldo-reg1",
+ .supply_name = "vcc13",
+ .volt_reg = RK806_NLDO1_ON_VSEL,
+ .enable_reg = RK806_POWER_EN3,
+ .enable_bit = 0,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_NLDO2,
+ .name = "nldo-reg2",
+ .supply_name = "vcc13",
+ .volt_reg = RK806_NLDO2_ON_VSEL,
+ .enable_reg = RK806_POWER_EN3,
+ .enable_bit = 1,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_NLDO3,
+ .name = "nldo-reg3",
+ .supply_name = "vcc13",
+ .volt_reg = RK806_NLDO3_ON_VSEL,
+ .enable_reg = RK806_POWER_EN3,
+ .enable_bit = 2,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_NLDO4,
+ .name = "nldo-reg4",
+ .supply_name = "vcc14",
+ .volt_reg = RK806_NLDO4_ON_VSEL,
+ .enable_reg = RK806_POWER_EN3,
+ .enable_bit = 3,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_NLDO5,
+ .name = "nldo-reg5",
+ .supply_name = "vcc14",
+ .volt_reg = RK806_NLDO5_ON_VSEL,
+ .enable_reg = RK806_POWER_EN5,
+ .enable_bit = 2,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_PLDO1,
+ .name = "pldo-reg1",
+ .supply_name = "vcc11",
+ .volt_reg = RK806_PLDO1_ON_VSEL,
+ .enable_reg = RK806_POWER_EN4,
+ .enable_bit = 1,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_PLDO2,
+ .name = "pldo-reg2",
+ .supply_name = "vcc11",
+ .volt_reg = RK806_PLDO2_ON_VSEL,
+ .enable_reg = RK806_POWER_EN4,
+ .enable_bit = 2,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_PLDO3,
+ .name = "pldo-reg3",
+ .supply_name = "vcc11",
+ .volt_reg = RK806_PLDO3_ON_VSEL,
+ .enable_reg = RK806_POWER_EN4,
+ .enable_bit = 3,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_PLDO4,
+ .name = "pldo-reg4",
+ .supply_name = "vcc12",
+ .volt_reg = RK806_PLDO4_ON_VSEL,
+ .enable_reg = RK806_POWER_EN5,
+ .enable_bit = 0,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_PLDO5,
+ .name = "pldo-reg5",
+ .supply_name = "vcc12",
+ .volt_reg = RK806_PLDO5_ON_VSEL,
+ .enable_reg = RK806_POWER_EN5,
+ .enable_bit = 1,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+ {
+ .id = RK806_ID_PLDO6,
+ .name = "pldo-reg6",
+ .supply_name = "vcca",
+ .volt_reg = RK806_PLDO6_ON_VSEL,
+ .enable_reg = RK806_POWER_EN4,
+ .enable_bit = 0,
+ .ranges = rk806_ldo_ranges,
+ .nranges = nitems(rk806_ldo_ranges),
+ },
+};
+
+struct rk806_regnode_init_def {
+ struct regnode_init_def reg_init_def;
+ int ext_control;
+ int enable_tracking;
+};
+
+static int rk806_regnode_init(struct regnode *regnode);
+static int rk806_regnode_enable(struct regnode *regnode, bool enable,
+ int *udelay);
+static int rk806_regnode_set_volt(struct regnode *regnode, int min_uvolt,
+ int max_uvolt, int *udelay);
+static int rk806_regnode_get_volt(struct regnode *regnode, int *uvolt);
+static regnode_method_t rk806_regnode_methods[] = {
+ /* Regulator interface */
+ REGNODEMETHOD(regnode_init, rk806_regnode_init),
+ REGNODEMETHOD(regnode_enable, rk806_regnode_enable),
+ REGNODEMETHOD(regnode_set_voltage, rk806_regnode_set_volt),
+ REGNODEMETHOD(regnode_get_voltage, rk806_regnode_get_volt),
+ REGNODEMETHOD_END
+};
+DEFINE_CLASS_1(rk806_regnode, rk806_regnode_class, rk806_regnode_methods,
+ sizeof(struct rk806_reg_sc), regnode_class);
+
+static int
+rk806_read_sel(struct rk806_reg_sc *sc, uint8_t *sel)
+{
+ int rv;
+
+ rv = RD1(sc->base_sc, sc->def->volt_reg, sel);
+ return (rv);
+}
+
+static int
+rk806_write_sel(struct rk806_reg_sc *sc, uint8_t sel)
+{
+ int rv;
+
+ rv = WR1(sc->base_sc, sc->def->volt_reg, sel);
+ return (rv);
+}
+
+static int
+rk806_reg_enable(struct rk806_reg_sc *sc)
+{
+ int rv;
+
+ rv = WR1(sc->base_sc, sc->def->enable_reg,
+ 1 << (sc->def->enable_bit + 4) | (1 << sc->def->enable_bit));
+ return (rv);
+}
+
+static int
+rk806_reg_disable(struct rk806_reg_sc *sc)
+{
+ int rv;
+
+ rv = WR1(sc->base_sc, sc->def->enable_reg,
+ 1 << (sc->def->enable_bit + 4) | (0 << sc->def->enable_bit));
+ return (rv);
+}
+
+static int
+rk806_regnode_init(struct regnode *regnode)
+{
+ struct rk806_reg_sc *sc;
+
+ sc = regnode_get_softc(regnode);
+ sc->enable_usec = 500;
+
+ return (0);
+}
+
+static void
+rk806_fdt_parse(struct rk806_softc *sc, phandle_t node, struct reg_def *def,
+struct rk806_regnode_init_def *init_def)
+{
+ int rv;
+ phandle_t parent, supply_node;
+ char prop_name[64]; /* Maximum OFW property name length. */
+
+ rv = regulator_parse_ofw_stdparam(sc->dev, node,
+ &init_def->reg_init_def);
+
+ /* Get parent supply. */
+ if (def->supply_name == NULL)
+ return;
+
+ parent = OF_parent(node);
+ snprintf(prop_name, sizeof(prop_name), "%s-supply",
+ def->supply_name);
+ rv = OF_getencprop(parent, prop_name, &supply_node,
+ sizeof(supply_node));
+ if (rv <= 0)
+ return;
+ supply_node = OF_node_from_xref(supply_node);
+ rv = OF_getprop_alloc(supply_node, "regulator-name",
+ (void **)&init_def->reg_init_def.parent_name);
+ if (rv <= 0)
+ init_def->reg_init_def.parent_name = NULL;
+}
+
+static struct rk806_reg_sc *
+rk806_attach(struct rk806_softc *sc, phandle_t node, struct reg_def *def)
+{
+ struct rk806_reg_sc *reg_sc;
+ struct rk806_regnode_init_def init_def;
+ struct regnode *regnode;
+
+ bzero(&init_def, sizeof(init_def));
+
+ rk806_fdt_parse(sc, node, def, &init_def);
+ init_def.reg_init_def.id = def->id;
+ init_def.reg_init_def.ofw_node = node;
+ regnode = regnode_create(sc->dev, &rk806_regnode_class,
+ &init_def.reg_init_def);
+ if (regnode == NULL) {
+ device_printf(sc->dev, "Cannot create regulator.\n");
+ return (NULL);
+ }
+ reg_sc = regnode_get_softc(regnode);
+
+ /* Init regulator softc. */
+ reg_sc->regnode = regnode;
+ reg_sc->base_sc = sc;
+ reg_sc->def = def;
+ reg_sc->xref = OF_xref_from_node(node);
+
+ reg_sc->param = regnode_get_stdparam(regnode);
+
+ regnode_register(regnode);
+ if (bootverbose) {
+ int volt, rv;
+ regnode_topo_slock();
+ rv = regnode_get_voltage(regnode, &volt);
+ if (rv == ENODEV) {
+ device_printf(sc->dev,
+ " Regulator %s: parent doesn't exist yet.\n",
+ regnode_get_name(regnode));
+ } else if (rv != 0) {
+ device_printf(sc->dev,
+ " Regulator %s: voltage: INVALID!!!\n",
+ regnode_get_name(regnode));
+ } else {
+ device_printf(sc->dev,
+ " Regulator %s: voltage: %d uV\n",
+ regnode_get_name(regnode), volt);
+ }
+ regnode_topo_unlock();
+ }
+
+ return (reg_sc);
+}
+
+int
+rk806_regulator_attach(struct rk806_softc *sc, phandle_t node)
+{
+ struct rk806_reg_sc *reg;
+ phandle_t child, rnode;
+ int i;
+
+ rnode = ofw_bus_find_child(node, "regulators");
+ if (rnode <= 0) {
+ device_printf(sc->dev, " Cannot find regulators subnode\n");
+ return (ENXIO);
+ }
+
+ sc->nregs = nitems(rk806_def);
+ sc->regs = malloc(sizeof(struct rk806_reg_sc *) * sc->nregs,
+ M_RK806_REG, M_WAITOK | M_ZERO);
+
+ /* Attach all known regulators if exist in DT. */
+ for (i = 0; i < sc->nregs; i++) {
+ child = ofw_bus_find_child(rnode, rk806_def[i].name);
+ if (child == 0) {
+ if (bootverbose)
+ device_printf(sc->dev,
+ "Regulator %s missing in DT\n",
+ rk806_def[i].name);
+ continue;
+ }
+reg = 0;
+ reg = rk806_attach(sc, child, rk806_def + i);
+ if (reg == NULL) {
+ device_printf(sc->dev, "Cannot attach regulator: %s\n",
+ rk806_def[i].name);
+ return (ENXIO);
+ }
+ sc->regs[i] = reg;
+ }
+
+ return (0);
+}
+
+
+int
+rk806_regulator_map(device_t dev, phandle_t xref, int ncells,
+ pcell_t *cells, intptr_t *num)
+{
+ struct rk806_softc *sc;
+ int i;
+
+ sc = device_get_softc(dev);
+ for (i = 0; i < sc->nregs; i++) {
+ if (sc->regs[i] == NULL)
+ continue;
+ if (sc->regs[i]->xref == xref) {
+ *num = sc->regs[i]->def->id;
+ return (0);
+ }
+ }
+ return (ENXIO);
+}
+
+static int
+rk806_regnode_enable(struct regnode *regnode, bool val, int *udelay)
+{
+ struct rk806_reg_sc *sc;
+ int rv;
+
+ sc = regnode_get_softc(regnode);
+
+ if (val)
+ rv = rk806_reg_enable(sc);
+ else
+ rv = rk806_reg_disable(sc);
+ *udelay = sc->param->enable_delay;
+ return (rv);
+}
+
+static int
+rk806_regnode_set_volt(struct regnode *regnode, int min_uvolt, int max_uvolt,
+ int *udelay)
+{
+ struct rk806_reg_sc *sc;
+ uint8_t sel;
+ int rv;
+
+ sc = regnode_get_softc(regnode);
+
+ *udelay = sc->param->ramp_delay * max_uvolt;
+
+ rv = regulator_range_volt_to_sel8(sc->def->ranges, sc->def->nranges,
+ min_uvolt, max_uvolt, &sel);
+ if (rv != 0)
+ return (rv);
+ rv = rk806_write_sel(sc, sel);
+ return (rv);
+
+}
+
+static int
+rk806_regnode_get_volt(struct regnode *regnode, int *uvolt)
+{
+ struct rk806_reg_sc *sc;
+ uint8_t sel;
+ int rv;
+
+ sc = regnode_get_softc(regnode);
+ rv = rk806_read_sel(sc, &sel);
+ if (rv != 0)
+ return (rv);
+
+ rv = regulator_range_sel8_to_volt(sc->def->ranges, sc->def->nranges,
+ sel, uvolt);
+ return (rv);
+}
diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c
--- a/sys/kern/subr_rman.c
+++ b/sys/kern/subr_rman.c
@@ -598,6 +598,7 @@
if ((flags & RF_SHAREABLE) == 0)
goto out;
+ DPRINTF("!!!!!!!!!!!!!no unshared regions found 1\n");
for (s = r; s && s->r_end <= end; s = TAILQ_NEXT(s, r_link)) {
if (SHARE_TYPE(s->r_flags) == SHARE_TYPE(flags) &&
s->r_start >= start &&
@@ -632,6 +633,15 @@
/*
* We couldn't find anything.
*/
+ DPRINTF("!!!!!!!!!!!!!no unshared regions found 2\n");
+ rv = int_alloc_resource(M_NOWAIT);
+ if (rv == NULL)
+ goto out;
+ rv->r_start = start;
+ rv->r_end = start + count - 1;
+ rv->r_flags = flags;
+ rv->r_dev = dev;
+ rv->r_rm = rm;
out:
mtx_unlock(rm->rm_mtx);
diff --git a/sys/modules/dtb/rockchip/Makefile b/sys/modules/dtb/rockchip/Makefile
--- a/sys/modules/dtb/rockchip/Makefile
+++ b/sys/modules/dtb/rockchip/Makefile
@@ -22,7 +22,10 @@
rockchip/rk3568-nanopi-r5s.dts \
rockchip/rk3566-radxa-zero-3e.dts \
rockchip/rk3566-radxa-zero-3w.dts \
- rockchip/rk3568-bpi-r2-pro.dts
+ rockchip/rk3568-bpi-r2-pro.dts \
+ rockchip/rk3588-rock-5-itx.dts \
+ rockchip/rk3588-rock-5b.dts \
+ rockchip/rk3588-orangepi-5-plus
DTSO= rk3328-analog-sound.dtso \
rk3328-i2c0.dtso \
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 28, 6:46 AM (10 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30462016
Default Alt Text
D53993.id167308.diff (235 KB)
Attached To
Mode
D53993: ARM GICv3: Add support for non-coherent and/or bus address range limited DMA.
Attached
Detach File
Event Timeline
Log In to Comment