Path: blob/main/sys/dev/clk/rockchip/rk3328_cru.c
108036 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2018-2021 Emmanuel Vadot <[email protected]>4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR15* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES16* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.17* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,18* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,19* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;20* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED21* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,22* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/2627#include <sys/param.h>28#include <sys/systm.h>29#include <sys/bus.h>30#include <sys/rman.h>31#include <sys/kernel.h>32#include <sys/module.h>33#include <machine/bus.h>3435#include <dev/fdt/simplebus.h>3637#include <dev/ofw/ofw_bus.h>38#include <dev/ofw/ofw_bus_subr.h>3940#include <dev/clk/clk_div.h>41#include <dev/clk/clk_fixed.h>42#include <dev/clk/clk_mux.h>4344#include <dev/clk/rockchip/rk_cru.h>4546#define CRU_CLKSEL_CON(x) (0x100 + (x) * 0x4)47#define CRU_CLKGATE_CON(x) (0x200 + (x) * 0x4)4849/* Registers */50#define RK3328_GRF_SOC_CON4 0x41051#define RK3328_GRF_MAC_CON1 0x90452#define RK3328_GRF_MAC_CON2 0x9085354/* Exported clocks */5556#define PLL_APLL 157#define PLL_DPLL 258#define PLL_CPLL 359#define PLL_GPLL 460#define PLL_NPLL 561#define ARMCLK 66263/* SCLK */64#define SCLK_RTC32K 3065#define SCLK_SDMMC_EXT 3166#define SCLK_SPI 3267#define SCLK_SDMMC 3368#define SCLK_SDIO 3469#define SCLK_EMMC 3570#define SCLK_TSADC 3671#define SCLK_SARADC 3772#define SCLK_UART0 3873#define SCLK_UART1 3974#define SCLK_UART2 4075#define SCLK_I2S0 4176#define SCLK_I2S1 4277#define SCLK_I2S2 4378#define SCLK_I2S1_OUT 4479#define SCLK_I2S2_OUT 4580#define SCLK_SPDIF 4681#define SCLK_TIMER0 4782#define SCLK_TIMER1 4883#define SCLK_TIMER2 4984#define SCLK_TIMER3 5085#define SCLK_TIMER4 5186#define SCLK_TIMER5 5287#define SCLK_WIFI 5388#define SCLK_CIF_OUT 5489#define SCLK_I2C0 5590#define SCLK_I2C1 5691#define SCLK_I2C2 5792#define SCLK_I2C3 5893#define SCLK_CRYPTO 5994#define SCLK_PWM 6095#define SCLK_PDM 6196#define SCLK_EFUSE 6297#define SCLK_OTP 6398#define SCLK_DDRCLK 6499#define SCLK_VDEC_CABAC 65100#define SCLK_VDEC_CORE 66101#define SCLK_VENC_DSP 67102#define SCLK_VENC_CORE 68103#define SCLK_RGA 69104#define SCLK_HDMI_SFC 70105#define SCLK_HDMI_CEC 71 /* Unused ? */106#define SCLK_USB3_REF 72107#define SCLK_USB3_SUSPEND 73108#define SCLK_SDMMC_DRV 74109#define SCLK_SDIO_DRV 75110#define SCLK_EMMC_DRV 76111#define SCLK_SDMMC_EXT_DRV 77112#define SCLK_SDMMC_SAMPLE 78113#define SCLK_SDIO_SAMPLE 79114#define SCLK_EMMC_SAMPLE 80115#define SCLK_SDMMC_EXT_SAMPLE 81116#define SCLK_VOP 82117#define SCLK_MAC2PHY_RXTX 83118#define SCLK_MAC2PHY_SRC 84119#define SCLK_MAC2PHY_REF 85120#define SCLK_MAC2PHY_OUT 86121#define SCLK_MAC2IO_RX 87122#define SCLK_MAC2IO_TX 88123#define SCLK_MAC2IO_REFOUT 89124#define SCLK_MAC2IO_REF 90125#define SCLK_MAC2IO_OUT 91126#define SCLK_TSP 92127#define SCLK_HSADC_TSP 93128#define SCLK_USB3PHY_REF 94129#define SCLK_REF_USB3OTG 95130#define SCLK_USB3OTG_REF 96131#define SCLK_USB3OTG_SUSPEND 97132#define SCLK_REF_USB3OTG_SRC 98133#define SCLK_MAC2IO_SRC 99134#define SCLK_MAC2IO 100135#define SCLK_MAC2PHY 101136#define SCLK_MAC2IO_EXT 102137138/* DCLK */139#define DCLK_LCDC 120140#define DCLK_HDMIPHY 121141#define HDMIPHY 122142#define USB480M 123143#define DCLK_LCDC_SRC 124144145/* ACLK */146#define ACLK_AXISRAM 130 /* Unused */147#define ACLK_VOP_PRE 131148#define ACLK_USB3OTG 132149#define ACLK_RGA_PRE 133150#define ACLK_DMAC 134 /* Unused */151#define ACLK_GPU 135152#define ACLK_BUS_PRE 136153#define ACLK_PERI_PRE 137154#define ACLK_RKVDEC_PRE 138155#define ACLK_RKVDEC 139156#define ACLK_RKVENC 140157#define ACLK_VPU_PRE 141158#define ACLK_VIO_PRE 142159#define ACLK_VPU 143160#define ACLK_VIO 144161#define ACLK_VOP 145162#define ACLK_GMAC 146163#define ACLK_H265 147164#define ACLK_H264 148165#define ACLK_MAC2PHY 149166#define ACLK_MAC2IO 150167#define ACLK_DCF 151168#define ACLK_TSP 152169#define ACLK_PERI 153170#define ACLK_RGA 154171#define ACLK_IEP 155172#define ACLK_CIF 156173#define ACLK_HDCP 157174175/* PCLK */176#define PCLK_GPIO0 200177#define PCLK_GPIO1 201178#define PCLK_GPIO2 202179#define PCLK_GPIO3 203180#define PCLK_GRF 204181#define PCLK_I2C0 205182#define PCLK_I2C1 206183#define PCLK_I2C2 207184#define PCLK_I2C3 208185#define PCLK_SPI 209186#define PCLK_UART0 210187#define PCLK_UART1 211188#define PCLK_UART2 212189#define PCLK_TSADC 213190#define PCLK_PWM 214191#define PCLK_TIMER 215192#define PCLK_BUS_PRE 216193#define PCLK_PERI_PRE 217 /* Unused */194#define PCLK_HDMI_CTRL 218 /* Unused */195#define PCLK_HDMI_PHY 219 /* Unused */196#define PCLK_GMAC 220197#define PCLK_H265 221198#define PCLK_MAC2PHY 222199#define PCLK_MAC2IO 223200#define PCLK_USB3PHY_OTG 224201#define PCLK_USB3PHY_PIPE 225202#define PCLK_USB3_GRF 226203#define PCLK_USB2_GRF 227204#define PCLK_HDMIPHY 228205#define PCLK_DDR 229206#define PCLK_PERI 230207#define PCLK_HDMI 231208#define PCLK_HDCP 232209#define PCLK_DCF 233210#define PCLK_SARADC 234211#define PCLK_ACODECPHY 235212#define PCLK_WDT 236 /* Controlled from the secure GRF */213214/* HCLK */215#define HCLK_PERI 308216#define HCLK_TSP 309217#define HCLK_GMAC 310 /* Unused */218#define HCLK_I2S0_8CH 311219#define HCLK_I2S1_8CH 312220#define HCLK_I2S2_2CH 313221#define HCLK_SPDIF_8CH 314222#define HCLK_VOP 315223#define HCLK_NANDC 316 /* Unused */224#define HCLK_SDMMC 317225#define HCLK_SDIO 318226#define HCLK_EMMC 319227#define HCLK_SDMMC_EXT 320228#define HCLK_RKVDEC_PRE 321229#define HCLK_RKVDEC 322230#define HCLK_RKVENC 323231#define HCLK_VPU_PRE 324232#define HCLK_VIO_PRE 325233#define HCLK_VPU 326234/* 327 doesn't exists */235#define HCLK_BUS_PRE 328236#define HCLK_PERI_PRE 329 /* Unused */237#define HCLK_H264 330238#define HCLK_CIF 331239#define HCLK_OTG_PMU 332240#define HCLK_OTG 333241#define HCLK_HOST0 334242#define HCLK_HOST0_ARB 335243#define HCLK_CRYPTO_MST 336244#define HCLK_CRYPTO_SLV 337245#define HCLK_PDM 338246#define HCLK_IEP 339247#define HCLK_RGA 340248#define HCLK_HDCP 341249250static struct rk_cru_gate rk3328_gates[] = {251/* CRU_CLKGATE_CON0 */252GATE(0, "core_apll_clk", "apll", 0, 0),253GATE(0, "core_dpll_clk", "dpll", 0, 1),254GATE(0, "core_gpll_clk", "gpll", 0, 2),255/* Bit 3 bus_src_clk_en */256/* Bit 4 clk_ddrphy_src_en */257/* Bit 5 clk_ddrpd_src_en */258/* Bit 6 clk_ddrmon_en */259/* Bit 7-8 unused */260/* Bit 9 testclk_en */261GATE(SCLK_WIFI, "sclk_wifi", "sclk_wifi_c", 0, 10),262GATE(SCLK_RTC32K, "clk_rtc32k", "clk_rtc32k_c", 0, 11),263GATE(0, "core_npll_clk", "npll", 0, 12),264/* Bit 13-15 unused */265266/* CRU_CLKGATE_CON1 */267/* Bit 0 unused */268GATE(0, "clk_i2s0_div", "clk_i2s0_div_c", 1, 1),269GATE(0, "clk_i2s0_frac", "clk_i2s0_frac_f", 1, 2),270GATE(SCLK_I2S0, "clk_i2s0", "clk_i2s0_mux", 1, 3),271GATE(0, "clk_i2s1_div", "clk_i2s1_div_c", 1, 4),272GATE(0, "clk_i2s1_frac", "clk_i2s1_frac_f", 1, 5),273GATE(SCLK_I2S1, "clk_i2s1", "clk_i2s1_mux", 1, 6),274GATE(0, "clk_i2s1_out", "clk_i2s1_mux", 1, 7),275GATE(0, "clk_i2s2_div", "clk_i2s2_div_c", 1, 8),276GATE(0, "clk_i2s2_frac", "clk_i2s2_frac_f", 1, 9),277GATE(SCLK_I2S2, "clk_i2s2", "clk_i2s2_mux", 1, 10),278GATE(0, "clk_i2s2_out", "clk_i2s2_mux", 1, 11),279GATE(0, "clk_spdif_div", "clk_spdif_div_c", 1, 12),280GATE(0, "clk_spdif_frac", "clk_spdif_frac_f", 1, 13),281GATE(0, "clk_uart0_div", "clk_uart0_div_c", 1, 14),282GATE(0, "clk_uart0_frac", "clk_uart0_frac_f", 1, 15),283284/* CRU_CLKGATE_CON2 */285GATE(0, "clk_uart1_div", "clk_uart1_div_c", 2, 0),286GATE(0, "clk_uart1_frac", "clk_uart1_frac_f", 2, 1),287GATE(0, "clk_uart2_div", "clk_uart2_div_c", 2, 2),288GATE(0, "clk_uart2_frac", "clk_uart2_frac_f", 2, 3),289GATE(SCLK_CRYPTO, "clk_crypto", "clk_crypto_c", 2, 4),290GATE(SCLK_TSP, "clk_tsp", "clk_tsp_c", 2, 5),291GATE(SCLK_TSADC, "clk_tsadc_src", "clk_tsadc_c", 2, 6),292GATE(SCLK_SPI, "clk_spi", "clk_spi_c", 2, 7),293GATE(SCLK_PWM, "clk_pwm", "clk_pwm_c", 2, 8),294GATE(SCLK_I2C0, "clk_i2c0_src", "clk_i2c0_c", 2, 9),295GATE(SCLK_I2C1, "clk_i2c1_src", "clk_i2c1_c", 2, 10),296GATE(SCLK_I2C2, "clk_i2c2_src", "clk_i2c2_c", 2, 11),297GATE(SCLK_I2C3, "clk_i2c3_src", "clk_i2c3_c", 2, 12),298GATE(SCLK_EFUSE, "clk_efuse", "clk_efuse_c", 2, 13),299GATE(SCLK_SARADC, "clk_saradc", "clk_saradc_c", 2, 14),300GATE(SCLK_PDM, "clk_pdm", "clk_pdm_c", 2, 15),301302/* CRU_CLKGATE_CON3 */303GATE(SCLK_MAC2PHY_SRC, "clk_mac2phy_src", "clk_mac2phy_src_c", 3, 0),304GATE(SCLK_MAC2IO_SRC, "clk_mac2io_src", "clk_mac2io_src_c", 3, 1),305GATE(ACLK_GMAC, "aclk_gmac", "aclk_gmac_c", 3, 2),306/* Bit 3 gmac_gpll_src_en Unused ? */307/* Bit 4 gmac_vpll_src_en Unused ? */308GATE(SCLK_MAC2IO_OUT, "clk_mac2io_out", "clk_mac2io_out_c", 3, 5),309/* Bit 6-7 unused */310GATE(SCLK_OTP, "clk_otp", "clk_otp_c", 3, 8),311/* Bit 9-15 unused */312313/* CRU_CLKGATE_CON4 */314GATE(0, "periph_gclk_src", "gpll", 4, 0),315GATE(0, "periph_cclk_src", "cpll", 4, 1),316GATE(0, "hdmiphy_peri", "hdmiphy", 4, 2),317GATE(SCLK_SDMMC, "clk_mmc0_src", "clk_sdmmc_c", 4, 3),318GATE(SCLK_SDIO, "clk_sdio_src", "clk_sdio_c", 4, 4),319GATE(SCLK_EMMC, "clk_emmc_src", "clk_emmc_c", 4, 5),320GATE(SCLK_REF_USB3OTG_SRC, "clk_ref_usb3otg_src", "clk_ref_usb3otg_src_c", 4, 6),321GATE(SCLK_USB3OTG_REF, "clk_usb3_otg0_ref", "xin24m", 4, 7),322GATE(SCLK_USB3OTG_SUSPEND, "clk_usb3otg_suspend", "clk_usb3otg_suspend_c", 4, 8),323/* Bit 9 clk_usb3phy_ref_25m_en */324GATE(SCLK_SDMMC_EXT, "clk_sdmmc_ext", "clk_sdmmc_ext_c", 4, 10),325/* Bit 11-15 unused */326327/* CRU_CLKGATE_CON5 */328GATE(ACLK_RGA_PRE, "aclk_rga_pre", "aclk_rga_pre_c", 5, 0),329GATE(SCLK_RGA, "sclk_rga", "sclk_rga_c", 5, 0),330GATE(ACLK_VIO_PRE, "aclk_vio_pre", "aclk_vio_pre_c", 5, 2),331GATE(SCLK_CIF_OUT, "clk_cif_src", "clk_cif_src_c", 5, 3),332GATE(SCLK_HDMI_SFC, "clk_hdmi_sfc", "xin24m", 5, 4),333GATE(ACLK_VOP_PRE, "aclk_vop_pre", "aclk_vop_pre_c", 5, 5),334GATE(DCLK_LCDC_SRC, "vop_dclk_src", "vop_dclk_src_c", 5, 6),335/* Bit 7-15 unused */336337/* CRU_CLKGATE_CON6 */338GATE(ACLK_RKVDEC_PRE, "aclk_rkvdec_pre", "aclk_rkvdec_c", 6, 0),339GATE(SCLK_VDEC_CABAC, "sclk_cabac", "sclk_cabac_c", 6, 1),340GATE(SCLK_VDEC_CORE, "sclk_vdec_core", "sclk_vdec_core_c", 6, 2),341GATE(ACLK_RKVENC, "aclk_rkvenc", "aclk_rkvenc_c", 6, 3),342GATE(SCLK_VENC_CORE, "sclk_venc", "sclk_venc_c", 6, 4),343GATE(ACLK_VPU_PRE, "aclk_vpu_pre", "aclk_vpu_pre_c", 6, 5),344GATE(0, "aclk_gpu_pre", "aclk_gpu_pre_c", 6, 6),345GATE(SCLK_VENC_DSP, "sclk_venc_dsp", "sclk_venc_dsp_c", 6, 7),346/* Bit 8-15 unused */347348/* CRU_CLKGATE_CON7 */349/* Bit 0 aclk_core_en */350/* Bit 1 clk_core_periph_en */351/* Bit 2 clk_jtag_en */352/* Bit 3 unused */353/* Bit 4 pclk_ddr_en */354/* Bit 5-15 unused */355356/* CRU_CLKGATE_CON8 */357GATE(ACLK_BUS_PRE, "aclk_bus_pre", "aclk_bus_pre_c", 8, 0),358GATE(HCLK_BUS_PRE, "hclk_bus_pre", "hclk_bus_pre_c", 8, 1),359GATE(PCLK_BUS_PRE, "pclk_bus_pre", "pclk_bus_pre_c", 8, 2),360GATE(0, "pclk_bus", "pclk_bus_pre", 8, 3),361GATE(0, "pclk_phy", "pclk_bus_pre", 8, 4),362GATE(SCLK_TIMER0, "sclk_timer0", "xin24m", 8, 5),363GATE(SCLK_TIMER1, "sclk_timer1", "xin24m", 8, 6),364GATE(SCLK_TIMER2, "sclk_timer2", "xin24m", 8, 7),365GATE(SCLK_TIMER3, "sclk_timer3", "xin24m", 8, 8),366GATE(SCLK_TIMER4, "sclk_timer4", "xin24m", 8, 9),367GATE(SCLK_TIMER5, "sclk_timer5", "xin24m", 8, 10),368/* Bit 11-15 unused */369370/* CRU_CLKGATE_CON9 */371GATE(PCLK_GMAC, "pclk_gmac", "aclk_gmac", 9, 0),372GATE(SCLK_MAC2PHY_RXTX, "clk_gmac2phy_rx", "clk_mac2phy", 9, 1),373GATE(SCLK_MAC2PHY_OUT, "clk_mac2phy_out", "clk_mac2phy_out_c", 9, 2),374GATE(SCLK_MAC2PHY_REF, "clk_gmac2phy_ref", "clk_mac2phy", 9, 3),375GATE(SCLK_MAC2IO_RX, "clk_gmac2io_rx", "clk_mac2io", 9, 4),376GATE(SCLK_MAC2IO_TX, "clk_gmac2io_tx", "clk_mac2io", 9, 5),377GATE(SCLK_MAC2IO_REFOUT, "clk_gmac2io_refout", "clk_mac2io", 9, 6),378GATE(SCLK_MAC2IO_REF, "clk_gmac2io_ref", "clk_mac2io", 9, 7),379/* Bit 8-15 unused */380381/* CRU_CLKGATE_CON10 */382GATE(ACLK_PERI, "aclk_peri", "aclk_peri_pre", 10, 0),383GATE(HCLK_PERI, "hclk_peri", "hclk_peri_c", 10, 1),384GATE(PCLK_PERI, "pclk_peri", "pclk_peri_c", 10, 2),385/* Bit 3-15 unused */386387/* CRU_CLKGATE_CON11 */388GATE(HCLK_RKVDEC_PRE, "hclk_rkvdec_pre", "aclk_rkvdec_pre", 11, 0),389/* Bit 1-3 unused */390GATE(HCLK_RKVENC, "hclk_rkvenc", "aclk_rkvenc", 11, 4),391/* Bit 5-7 unused */392GATE(HCLK_VPU_PRE, "hclk_vpu_pre", "aclk_vpu_pre", 11, 8),393/* Bit 9-15 unused */394395/* CRU_CLKGATE_CON12 */396/* unused */397398/* CRU_CLKGATE_CON13 */399/* Bit 0 aclk_core_niu_en */400/* Bit 1 aclk_gic400_en */401/* Bit 2-15 unused */402403/* CRU_CLKGATE_CON14 */404GATE(ACLK_GPU, "aclk_gpu", "aclk_gpu_pre", 14, 0),405GATE(0, "aclk_gpu_niu", "aclk_gpu_pre", 14, 1),406/* Bit 2-15 unused */407408/* CRU_CLKGATE_CON15*/409/* Bit 0 aclk_intmem_en Unused */410/* Bit 1 aclk_dmac_bus_en Unused */411/* Bit 2 hclk_rom_en Unused */412GATE(HCLK_I2S0_8CH, "hclk_i2s0_8ch", "hclk_bus_pre", 15, 3),413GATE(HCLK_I2S1_8CH, "hclk_i2s1_8ch", "hclk_bus_pre", 15, 4),414GATE(HCLK_I2S2_2CH, "hclk_i2s2_2ch", "hclk_bus_pre", 15, 5),415GATE(HCLK_SPDIF_8CH, "hclk_spdif_8ch", "hclk_bus_pre", 15, 6),416GATE(HCLK_CRYPTO_MST, "hclk_crypto_mst", "hclk_bus_pre", 15, 7),417GATE(HCLK_CRYPTO_SLV, "hclk_crypto_slv", "hclk_bus_pre", 15, 8),418GATE(0, "pclk_efuse", "pclk_bus", 15, 9),419GATE(PCLK_I2C0, "pclk_i2c0", "pclk_bus", 15, 10),420GATE(ACLK_DCF, "aclk_dcf", "aclk_bus_pre", 15, 11),421GATE(0, "aclk_bus_niu", "aclk_bus_pre", 15, 12),422GATE(0, "hclk_bus_niu", "hclk_bus_pre", 15, 13),423GATE(0, "pclk_bus_niu", "pclk_bus_pre", 15, 14),424GATE(0, "pclk_phy_niu", "pclk_phy", 15, 14),425/* Bit 15 pclk_phy_niu_en */426427/* CRU_CLKGATE_CON16 */428GATE(PCLK_I2C1, "pclk_i2c1", "pclk_bus", 16, 0),429GATE(PCLK_I2C2, "pclk_i2c2", "pclk_bus", 16, 1),430GATE(PCLK_I2C3, "pclk_i2c3", "pclk_bus", 16, 2),431GATE(PCLK_TIMER, "pclk_timer0", "pclk_bus", 16, 3),432GATE(0, "pclk_stimer", "pclk_bus", 16, 4),433GATE(PCLK_SPI, "pclk_spi", "pclk_bus", 16, 5),434GATE(PCLK_PWM, "pclk_pwm", "pclk_bus", 16, 6),435GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_bus", 16, 7),436GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_bus", 16, 8),437GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_bus", 16, 9),438GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_bus", 16, 10),439GATE(PCLK_UART0, "pclk_uart0", "pclk_bus", 16, 11),440GATE(PCLK_UART1, "pclk_uart1", "pclk_bus", 16, 12),441GATE(PCLK_UART2, "pclk_uart2", "pclk_bus", 16, 13),442GATE(PCLK_TSADC, "pclk_tsadc", "pclk_bus", 16, 14),443GATE(PCLK_DCF, "pclk_dcf", "pclk_bus", 16, 15),444445/* CRU_CLKGATE_CON17 */446GATE(PCLK_GRF, "pclk_grf", "pclk_bus", 17, 0),447/* Bit 1 unused */448GATE(PCLK_USB3_GRF, "pclk_usb3grf", "pclk_phy", 17, 2),449GATE(0, "pclk_ddrphy", "pclk_phy", 17, 3),450GATE(0, "pclk_cru", "pclk_bus", 17, 4),451GATE(PCLK_ACODECPHY, "pclk_acodecphy", "pclk_phy", 17, 5),452GATE(0, "pclk_sgrf", "pclk_bus", 17, 6),453GATE(PCLK_HDMIPHY, "pclk_hdmiphy", "pclk_phy", 17, 7),454GATE(0, "pclk_vdacphy", "pclk_bus", 17, 8),455/* Bit 9 unused */456GATE(0, "pclk_sim", "pclk_bus", 17, 10),457GATE(HCLK_TSP, "hclk_tsp", "hclk_bus_pre", 17, 11),458GATE(ACLK_TSP, "aclk_tsp", "aclk_bus_pre", 17, 12),459/* Bit 13 clk_hsadc_0_tsp_en Depend on a gpio clock ? */460GATE(PCLK_USB2_GRF, "pclk_usb2grf", "pclk_phy", 17, 14),461GATE(PCLK_SARADC, "pclk_saradc", "pclk_bus", 17, 15),462463/* CRU_CLKGATE_CON18 */464/* Bit 0 unused */465/* Bit 1 pclk_ddr_upctl_en */466/* Bit 2 pclk_ddr_msch_en */467/* Bit 3 pclk_ddr_mon_en */468/* Bit 4 aclk_ddr_upctl_en */469/* Bit 5 clk_ddr_upctl_en */470/* Bit 6 clk_ddr_msch_en */471/* Bit 7 pclk_ddrstdby_en */472/* Bit 8-15 unused */473474/* CRU_CLKGATE_CON19 */475GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_peri", 19, 0),476GATE(HCLK_SDIO, "hclk_sdio", "hclk_peri", 19, 1),477GATE(HCLK_EMMC, "hclk_emmc", "hclk_peri", 19, 2),478/* Bit 3-5 unused */479GATE(HCLK_HOST0, "hclk_host0", "hclk_peri", 19, 6),480GATE(HCLK_HOST0_ARB, "hclk_host0_arg", "hclk_peri", 19, 7),481GATE(HCLK_OTG, "hclk_otg", "hclk_peri", 19, 8),482GATE(HCLK_OTG_PMU, "hclk_otg_pmu", "hclk_peri", 19, 9),483/* Bit 10 unused */484GATE(0, "aclk_peri_niu", "aclk_peri", 19, 11),485GATE(0, "hclk_peri_niu", "hclk_peri", 19, 12),486GATE(0, "pclk_peri_niu", "hclk_peri", 19, 13),487GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_peri", 19, 14),488GATE(HCLK_SDMMC_EXT, "hclk_sdmmc_ext", "hclk_peri", 19, 15),489490/* CRU_CLKGATE_CON20 */491/* unused */492493/* CRU_CLKGATE_CON21 */494/* Bit 0-1 unused */495GATE(ACLK_VOP, "aclk_vop", "aclk_vop_pre", 21, 2),496GATE(HCLK_VOP, "hclk_vop", "hclk_vio_pre", 21, 3),497GATE(0, "aclk_vop_niu", "aclk_vop_pre", 21, 4),498GATE(0, "hclk_vop_niu", "hclk_vio_pre", 21, 5),499GATE(ACLK_IEP, "aclk_iep", "aclk_vio_pre", 21, 6),500GATE(HCLK_IEP, "hclk_iep", "hclk_vio_pre", 21, 7),501GATE(ACLK_CIF, "aclk_cif", "aclk_vio_pre", 21, 8),502GATE(HCLK_CIF, "hclk_cif", "hclk_vio_pre", 21, 9),503GATE(ACLK_RGA, "aclk_rga", "aclk_rga_pre", 21, 10),504GATE(HCLK_RGA, "hclk_rga", "hclk_vio_pre", 21, 11),505GATE(0, "hclk_ahb1tom", "hclk_vio_pre", 21, 12),506GATE(0, "pclk_vio_h2p", "hclk_vio_pre", 21, 13),507GATE(0, "hclk_vio_h2p", "hclk_vio_pre", 21, 14),508GATE(ACLK_HDCP, "aclk_hdcp", "aclk_vio_pre", 21, 15),509510/* CRU_CLKGATE_CON22 */511GATE(HCLK_HDCP, "hclk_hdcp", "hclk_vio_pre", 22, 0),512GATE(0, "hclk_vio_niu", "hclk_vio_pre", 22, 1),513GATE(0, "aclk_vio_niu", "aclk_vio_pre", 22, 2),514GATE(0, "aclk_rga_niu", "aclk_rga_pre", 22, 3),515GATE(PCLK_HDMI, "pclk_hdmi", "hclk_vio_pre", 22, 4),516GATE(PCLK_HDCP, "pclk_hdcp", "hclk_vio_pre", 22, 5),517/* Bit 6-15 unused */518519/* CRU_CLKGATE_CON23 */520GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_pre", 23, 0),521GATE(HCLK_VPU, "hclk_vpu", "hclk_vpu_pre", 23, 1),522GATE(0, "aclk_vpu_niu", "aclk_vpu_pre", 23, 2),523GATE(0, "hclk_vpu_niu", "hclk_vpu_pre", 23, 3),524/* Bit 4-15 unused */525526/* CRU_CLKGATE_CON24 */527GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pre", 24, 0),528GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_pre", 24, 1),529GATE(0, "aclk_rkvdec_niu", "aclk_rkvdec_pre", 24, 2),530GATE(0, "hclk_rkvdec_niu", "hclk_rkvdec_pre", 24, 3),531/* Bit 4-15 unused */532533/* CRU_CLKGATE_CON25 */534GATE(0, "aclk_rkvenc_niu", "aclk_rkvenc", 25, 0),535GATE(0, "hclk_rkvenc_niu", "hclk_rkvenc", 25, 1),536GATE(ACLK_H265, "aclk_h265", "aclk_rkvenc", 25, 2),537GATE(PCLK_H265, "pclk_h265", "hclk_rkvenc", 25, 3),538GATE(ACLK_H264, "aclk_h264", "aclk_rkvenc", 25, 4),539GATE(HCLK_H264, "hclk_h264", "hclk_rkvenc", 25, 5),540GATE(0, "aclk_axisram", "hclk_rkvenc", 25, 6),541/* Bit 7-15 unused */542543/* CRU_CLKGATE_CON26 */544GATE(ACLK_MAC2PHY, "aclk_gmac2phy", "aclk_gmac", 26, 0),545GATE(PCLK_MAC2PHY, "pclk_gmac2phy", "pclk_gmac", 26, 1),546GATE(ACLK_MAC2IO, "aclk_gmac2io", "aclk_gmac", 26, 2),547GATE(PCLK_MAC2IO, "pclk_gmac2io", "pclk_gmac", 26, 3),548GATE(0, "aclk_gmac_niu", "aclk_gmac", 26, 4),549GATE(0, "pclk_gmac_niu", "pclk_gmac", 26, 5),550/* Bit 6-15 unused */551552/* CRU_CLKGATE_CON27 */553/* Bit 0 clk_ddrphy_en */554/* Bit 1 clk4x_ddrphy_en */555556/* CRU_CLKGATE_CON28 */557GATE(HCLK_PDM, "hclk_pdm", "hclk_bus_pre", 28, 0),558GATE(PCLK_USB3PHY_OTG, "pclk_usb3phy_otg", "pclk_phy", 28, 1),559GATE(PCLK_USB3PHY_PIPE, "pclk_usb3phy_pipe", "pclk_phy", 28, 2),560GATE(0, "pclk_pmu", "pclk_bus", 28, 3),561GATE(0, "pclk_otp", "pclk_bus", 28, 4)562/* Bit 5-15 unused */563};564565/*566* PLLs567*/568569#define PLL_RATE(_hz, _ref, _fb, _post1, _post2, _dspd, _frac) \570{ \571.freq = _hz, \572.refdiv = _ref, \573.fbdiv = _fb, \574.postdiv1 = _post1, \575.postdiv2 = _post2, \576.dsmpd = _dspd, \577.frac = _frac, \578}579580static struct rk_clk_pll_rate rk3328_pll_rates[] = {581/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */582PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),583PLL_RATE(1584000000, 1, 66, 1, 1, 1, 0),584PLL_RATE(1560000000, 1, 65, 1, 1, 1, 0),585PLL_RATE(1536000000, 1, 64, 1, 1, 1, 0),586PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0),587PLL_RATE(1488000000, 1, 62, 1, 1, 1, 0),588PLL_RATE(1464000000, 1, 61, 1, 1, 1, 0),589PLL_RATE(1440000000, 1, 60, 1, 1, 1, 0),590PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0),591PLL_RATE(1392000000, 1, 58, 1, 1, 1, 0),592PLL_RATE(1368000000, 1, 57, 1, 1, 1, 0),593PLL_RATE(1344000000, 1, 56, 1, 1, 1, 0),594PLL_RATE(1320000000, 1, 55, 1, 1, 1, 0),595PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0),596PLL_RATE(1272000000, 1, 53, 1, 1, 1, 0),597PLL_RATE(1248000000, 1, 52, 1, 1, 1, 0),598PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),599PLL_RATE(1188000000, 2, 99, 1, 1, 1, 0),600PLL_RATE(1104000000, 1, 46, 1, 1, 1, 0),601PLL_RATE(1100000000, 12, 550, 1, 1, 1, 0),602PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0),603PLL_RATE(1000000000, 6, 500, 2, 1, 1, 0),604PLL_RATE(984000000, 1, 82, 2, 1, 1, 0),605PLL_RATE(960000000, 1, 80, 2, 1, 1, 0),606PLL_RATE(936000000, 1, 78, 2, 1, 1, 0),607PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),608PLL_RATE(900000000, 4, 300, 2, 1, 1, 0),609PLL_RATE(888000000, 1, 74, 2, 1, 1, 0),610PLL_RATE(864000000, 1, 72, 2, 1, 1, 0),611PLL_RATE(840000000, 1, 70, 2, 1, 1, 0),612PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),613PLL_RATE(800000000, 6, 400, 2, 1, 1, 0),614PLL_RATE(700000000, 6, 350, 2, 1, 1, 0),615PLL_RATE(696000000, 1, 58, 2, 1, 1, 0),616PLL_RATE(600000000, 1, 75, 3, 1, 1, 0),617PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),618PLL_RATE(504000000, 1, 63, 3, 1, 1, 0),619PLL_RATE(500000000, 6, 250, 2, 1, 1, 0),620PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),621PLL_RATE(312000000, 1, 52, 2, 2, 1, 0),622PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),623PLL_RATE(96000000, 1, 64, 4, 4, 1, 0),624{},625};626627static struct rk_clk_pll_rate rk3328_pll_frac_rates[] = {628PLL_RATE(1016064000, 3, 127, 1, 1, 0, 134217),629PLL_RATE(983040000, 24, 983, 1, 1, 0, 671088),630PLL_RATE(491520000, 24, 983, 2, 1, 0, 671088),631PLL_RATE(61440000, 6, 215, 7, 2, 0, 671088),632PLL_RATE(56448000, 12, 451, 4, 4, 0, 9797894),633PLL_RATE(40960000, 12, 409, 4, 5, 0, 10066329),634{},635};636637/* Clock parents */638PLIST(pll_src_p) = {"xin24m"};639PLIST(xin24m_rtc32k_p) = {"xin24m", "clk_rtc32k"};640641PLIST(pll_src_cpll_gpll_p) = {"cpll", "gpll"};642PLIST(pll_src_cpll_gpll_apll_p) = {"cpll", "gpll", "apll"};643PLIST(pll_src_cpll_gpll_xin24m_p) = {"cpll", "gpll", "xin24m", "xin24m" /* Dummy */};644PLIST(pll_src_cpll_gpll_usb480m_p) = {"cpll", "gpll", "usb480m"};645PLIST(pll_src_cpll_gpll_hdmiphy_p) = {"cpll", "gpll", "hdmi_phy"};646PLIST(pll_src_cpll_gpll_hdmiphy_usb480m_p) = {"cpll", "gpll", "hdmi_phy", "usb480m"};647PLIST(pll_src_apll_gpll_dpll_npll_p) = {"apll", "gpll", "dpll", "npll"};648PLIST(pll_src_cpll_gpll_xin24m_usb480m_p) = {"cpll", "gpll", "xin24m", "usb480m"};649PLIST(mux_ref_usb3otg_p) = { "xin24m", "clk_usb3_otg0_ref" };650PLIST(mux_mac2io_p) = { "clk_mac2io_src", "gmac_clkin" };651PLIST(mux_mac2io_ext_p) = { "clk_mac2io", "gmac_clkin" };652PLIST(mux_mac2phy_p) = { "clk_mac2phy_src", "phy_50m_out" };653PLIST(mux_i2s0_p) = { "clk_i2s0_div", "clk_i2s0_frac", "xin12m", "xin12m" };654PLIST(mux_i2s1_p) = { "clk_i2s1_div", "clk_i2s1_frac", "clkin_i2s1", "xin12m" };655PLIST(mux_i2s2_p) = { "clk_i2s2_div", "clk_i2s2_frac", "clkin_i2s2", "xin12m" };656PLIST(mux_dclk_lcdc_p) = {"hdmiphy", "vop_dclk_src"};657PLIST(mux_hdmiphy_p) = {"hdmi_phy", "xin24m"};658PLIST(mux_usb480m_p) = {"usb480m_phy", "xin24m"};659PLIST(mux_uart0_p) = {"clk_uart0_div", "clk_uart0_frac", "xin24m", "xin24m"};660PLIST(mux_uart1_p) = {"clk_uart1_div", "clk_uart1_frac", "xin24m", "xin24m"};661PLIST(mux_uart2_p) = {"clk_uart2_div", "clk_uart2_frac", "xin24m", "xin24m"};662PLIST(mux_spdif_p) = {"clk_spdif_div", "clk_spdif_frac", "xin12m", "xin12m"};663PLIST(mux_cif_p) = {"clk_cif_pll", "xin24m"};664665static struct rk_clk_pll_def apll = {666.clkdef = {667.id = PLL_APLL,668.name = "apll",669.parent_names = pll_src_p,670.parent_cnt = nitems(pll_src_p),671},672.base_offset = 0x00,673.gate_offset = 0x200,674.gate_shift = 0,675.mode_reg = 0x80,676.mode_shift = 1,677.flags = RK_CLK_PLL_HAVE_GATE,678.frac_rates = rk3328_pll_frac_rates,679};680681static struct rk_clk_pll_def dpll = {682.clkdef = {683.id = PLL_DPLL,684.name = "dpll",685.parent_names = pll_src_p,686.parent_cnt = nitems(pll_src_p),687},688.base_offset = 0x20,689.gate_offset = 0x200,690.gate_shift = 1,691.mode_reg = 0x80,692.mode_shift = 4,693.flags = RK_CLK_PLL_HAVE_GATE,694};695696static struct rk_clk_pll_def cpll = {697.clkdef = {698.id = PLL_CPLL,699.name = "cpll",700.parent_names = pll_src_p,701.parent_cnt = nitems(pll_src_p),702},703.base_offset = 0x40,704.mode_reg = 0x80,705.mode_shift = 8,706.rates = rk3328_pll_rates,707};708709static struct rk_clk_pll_def gpll = {710.clkdef = {711.id = PLL_GPLL,712.name = "gpll",713.parent_names = pll_src_p,714.parent_cnt = nitems(pll_src_p),715},716.base_offset = 0x60,717.gate_offset = 0x200,718.gate_shift = 2,719.mode_reg = 0x80,720.mode_shift = 12,721.flags = RK_CLK_PLL_HAVE_GATE,722.frac_rates = rk3328_pll_frac_rates,723};724725static struct rk_clk_pll_def npll = {726.clkdef = {727.id = PLL_NPLL,728.name = "npll",729.parent_names = pll_src_p,730.parent_cnt = nitems(pll_src_p),731},732.base_offset = 0xa0,733.gate_offset = 0x200,734.gate_shift = 12,735.mode_reg = 0x80,736.mode_shift = 1,737.flags = RK_CLK_PLL_HAVE_GATE,738.rates = rk3328_pll_rates,739};740741static struct rk_clk_armclk_rates rk3328_armclk_rates[] = {742{743.freq = 1296000000,744.div = 1,745},746{747.freq = 1200000000,748.div = 1,749},750{751.freq = 1104000000,752.div = 1,753},754{755.freq = 1008000000,756.div = 1,757},758{759.freq = 912000000,760.div = 1,761},762{763.freq = 816000000,764.div = 1,765},766{767.freq = 696000000,768.div = 1,769},770{771.freq = 600000000,772.div = 1,773},774{775.freq = 408000000,776.div = 1,777},778{779.freq = 312000000,780.div = 1,781},782{783.freq = 216000000,784.div = 1,785},786{787.freq = 96000000,788.div = 1,789},790};791792static struct rk_clk_armclk_def armclk = {793.clkdef = {794.id = ARMCLK,795.name = "armclk",796.parent_names = pll_src_apll_gpll_dpll_npll_p,797.parent_cnt = nitems(pll_src_apll_gpll_dpll_npll_p),798},799.muxdiv_offset = 0x100,800.mux_shift = 6,801.mux_width = 2,802803.div_shift = 0,804.div_width = 5,805806.flags = RK_CLK_COMPOSITE_HAVE_MUX,807.main_parent = 3, /* npll */808.alt_parent = 0, /* apll */809810.rates = rk3328_armclk_rates,811.nrates = nitems(rk3328_armclk_rates),812};813814static struct rk_clk rk3328_clks[] = {815/* External clocks */816LINK("xin24m"),817LINK("gmac_clkin"),818LINK("hdmi_phy"),819LINK("usb480m_phy"),820FRATE(0, "xin12m", 12000000),821FRATE(0, "phy_50m_out", 50000000),822FRATE(0, "clkin_i2s1", 0),823FRATE(0, "clkin_i2s2", 0),824825/* PLLs */826{827.type = RK3328_CLK_PLL,828.clk.pll = &apll829},830{831.type = RK3328_CLK_PLL,832.clk.pll = &dpll833},834{835.type = RK3328_CLK_PLL,836.clk.pll = &cpll837},838{839.type = RK3328_CLK_PLL,840.clk.pll = &gpll841},842{843.type = RK3328_CLK_PLL,844.clk.pll = &npll845},846847{848.type = RK_CLK_ARMCLK,849.clk.armclk = &armclk,850},851852/* CRU_CRU_MISC */853MUXRAW(HDMIPHY, "hdmiphy", mux_hdmiphy_p, 0, 0x84, 13, 1),854MUXRAW(USB480M, "usb480m", mux_usb480m_p, 0, 0x84, 15, 1),855856/* CRU_CLKSEL_CON0 */857/* COMP clk_core_div_con core_clk_pll_sel */858COMP(0, "aclk_bus_pre_c", pll_src_cpll_gpll_hdmiphy_p, 0, 0, 8, 5, 13, 2),859860/* CRU_CLKSEL_CON1 */861/* CDIV clk_core_dbg_div_con */862/* CDIV aclk_core_div_con */863CDIV(0, "hclk_bus_pre_c", "aclk_bus_pre", 0, 1, 8, 2),864CDIV(0, "pclk_bus_pre_c", "aclk_bus_pre", 0, 1, 12, 2),865866/* CRU_CLKSEL_CON2 */867/* CDIV test_div_con */868/* CDIV func_24m_div_con */869870/* CRU_CLKSEL_CON3 */871/* COMP ddr_div_cnt ddr_clk_pll_sel */872873/* CRU_CLKSEL_CON4 */874COMP(0, "clk_otp_c", pll_src_cpll_gpll_xin24m_p, 0, 4, 0, 6, 6, 2),875/* COMP pd_ddr_div_con ddrpdclk_clk_pll_sel */876877/* CRU_CLKSEL_CON5 */878COMP(0, "clk_efuse_c", pll_src_cpll_gpll_xin24m_p, 0, 5, 8, 5, 14, 2),879880/* CRU_CLKSEL_CON6 */881MUX(0, "clk_i2s0_mux", mux_i2s0_p, RK_CLK_MUX_REPARENT, 6, 8, 2),882COMP(0, "clk_i2s0_div_c", pll_src_cpll_gpll_p, 0, 6, 0, 7, 15, 1),883884/* CRU_CLKSEL_CON7 */885FRACT(0, "clk_i2s0_frac_f", "clk_i2s0_div", 0, 7),886887/* CRU_CLKSEL_CON8 */888MUX(0, "clk_i2s1_mux", mux_i2s1_p, RK_CLK_MUX_REPARENT, 8, 8, 2),889COMP(0, "clk_i2s1_div_c", pll_src_cpll_gpll_p, 0, 8, 0, 7, 15, 1),890/* MUX i2s1_out_sel */891892/* CRU_CLKSEL_CON9 */893FRACT(0, "clk_i2s1_frac_f", "clk_i2s1_div", 0, 9),894895/* CRU_CLKSEL_CON10 */896MUX(0, "clk_i2s2_mux", mux_i2s2_p, RK_CLK_MUX_REPARENT, 10, 8, 2),897COMP(0, "clk_i2s2_div_c", pll_src_cpll_gpll_p, 0, 10, 0, 7, 15, 1),898/* MUX i2s2_out_sel */899900/* CRU_CLKSEL_CON11 */901FRACT(0, "clk_i2s2_frac_f", "clk_i2s2_div", 0, 11),902903/* CRU_CLKSEL_CON12 */904MUX(0, "clk_spdif_pll", pll_src_cpll_gpll_p, 0, 12, 15, 1),905MUX(SCLK_SPDIF, "clk_spdif", mux_spdif_p, 0, 12, 8, 2),906CDIV(0, "clk_spdif_div_c", "clk_spdif_pll", 0, 12, 0, 7),907908/* CRU_CLKSEL_CON13 */909FRACT(0, "clk_spdif_frac_f", "clk_spdif", 0, 13),910911/* CRU_CLKSEL_CON14 */912MUX(0, "clk_uart0_pll", pll_src_cpll_gpll_usb480m_p, 0, 14, 12, 2),913MUX(SCLK_UART0, "clk_uart0", mux_uart0_p, 0, 14, 8, 2),914CDIV(0, "clk_uart0_div_c", "clk_uart0_pll", 0, 14, 0, 7),915916/* CRU_CLKSEL_CON15 */917FRACT(0, "clk_uart0_frac_f", "clk_uart0_pll", 0, 15),918919/* CRU_CLKSEL_CON16 */920MUX(0, "clk_uart1_pll", pll_src_cpll_gpll_usb480m_p, 0, 16, 12, 2),921MUX(SCLK_UART1, "clk_uart1", mux_uart1_p, 0, 16, 8, 2),922CDIV(0, "clk_uart1_div_c", "clk_uart1_pll", 0, 16, 0, 7),923924/* CRU_CLKSEL_CON17 */925FRACT(0, "clk_uart1_frac_f", "clk_uart1_pll", 0, 17),926927/* CRU_CLKSEL_CON18 */928MUX(0, "clk_uart2_pll", pll_src_cpll_gpll_usb480m_p, 0, 18, 12, 2),929MUX(SCLK_UART2, "clk_uart2", mux_uart2_p, 0, 18, 8, 2),930CDIV(0, "clk_uart2_div_c", "clk_uart2_pll", 0, 18, 0, 7),931932/* CRU_CLKSEL_CON19 */933FRACT(0, "clk_uart2_frac_f", "clk_uart2_pll", 0, 19),934935/* CRU_CLKSEL_CON20 */936COMP(0, "clk_pdm_c", pll_src_cpll_gpll_apll_p, 0, 20, 8, 5, 14, 2),937COMP(0, "clk_crypto_c", pll_src_cpll_gpll_p, 0, 20, 0, 5, 7, 1),938939/* CRU_CLKSEL_CON21 */940COMP(0, "clk_tsp_c", pll_src_cpll_gpll_p, 0, 21, 8, 5, 15, 1),941942/* CRU_CLKSEL_CON22 */943CDIV(0, "clk_tsadc_c", "xin24m", 0, 22, 0, 10),944945/* CRU_CLKSEL_CON23 */946CDIV(0, "clk_saradc_c", "xin24m", 0, 23, 0, 10),947948/* CRU_CLKSEL_CON24 */949COMP(0, "clk_pwm_c", pll_src_cpll_gpll_p, 0, 24, 8, 7, 15, 1),950COMP(0, "clk_spi_c", pll_src_cpll_gpll_p, 0, 24, 0, 7, 7, 1),951952/* CRU_CLKSEL_CON25 */953COMP(0, "aclk_gmac_c", pll_src_cpll_gpll_p, 0, 35, 0, 5, 6, 2),954CDIV(0, "pclk_gmac_c", "pclk_gmac", 0, 25, 8, 3),955956/* CRU_CLKSEL_CON26 */957CDIV(0, "clk_mac2phy_out_c", "clk_mac2phy", 0, 26, 8, 2),958COMP(0, "clk_mac2phy_src_c", pll_src_cpll_gpll_p, 0, 26, 0, 5, 7, 1),959960/* CRU_CLKSEL_CON27 */961COMP(0, "clk_mac2io_src_c", pll_src_cpll_gpll_p, 0, 27, 0, 5, 7, 1),962COMP(0, "clk_mac2io_out_c", pll_src_cpll_gpll_p, 0, 27, 8, 5, 15, 1),963964/* CRU_CLKSEL_CON28 */965COMP(ACLK_PERI_PRE, "aclk_peri_pre", pll_src_cpll_gpll_hdmiphy_p, 0, 28, 0, 5, 6, 2),966967/* CRU_CLKSEL_CON29 */968CDIV(0, "pclk_peri_c", "aclk_peri_pre", 0, 29, 0, 2),969CDIV(0, "hclk_peri_c", "aclk_peri_pre", 0, 29, 4, 3),970971/* CRU_CLKSEL_CON30 */972COMP(0, "clk_sdmmc_c", pll_src_cpll_gpll_xin24m_usb480m_p, 0, 30, 0, 8, 8, 2),973974/* CRU_CLKSEL_CON31 */975COMP(0, "clk_sdio_c", pll_src_cpll_gpll_xin24m_usb480m_p, 0, 31, 0, 8, 8, 2),976977/* CRU_CLKSEL_CON32 */978COMP(0, "clk_emmc_c", pll_src_cpll_gpll_xin24m_usb480m_p, 0, 32, 0, 8, 8, 2),979980/* CRU_CLKSEL_CON33 */981COMP(0, "clk_usb3otg_suspend_c", xin24m_rtc32k_p, 0, 33, 0, 10, 15, 1),982983/* CRU_CLKSEL_CON34 */984COMP(0, "clk_i2c0_c", pll_src_cpll_gpll_p, 0, 34, 0, 7, 7, 1),985COMP(0, "clk_i2c1_c", pll_src_cpll_gpll_p, 0, 34, 8, 7, 15, 1),986987/* CRU_CLKSEL_CON35 */988COMP(0, "clk_i2c2_c", pll_src_cpll_gpll_p, 0, 35, 0, 7, 7, 1),989COMP(0, "clk_i2c3_c", pll_src_cpll_gpll_p, 0, 35, 8, 7, 15, 1),990991/* CRU_CLKSEL_CON36 */992COMP(0, "aclk_rga_pre_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 36, 8, 5, 14, 2),993COMP(0, "sclk_rga_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 36, 0, 5, 6, 2),994995/* CRU_CLKSEL_CON37 */996COMP(0, "aclk_vio_pre_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 37, 0, 5, 6, 2),997CDIV(HCLK_VIO_PRE, "hclk_vio_pre", "aclk_vio_pre", 0, 37, 8, 5),998999/* CRU_CLKSEL_CON38 */1000COMP(0, "clk_rtc32k_c", pll_src_cpll_gpll_xin24m_p, 0, 38, 0, 14, 14, 2),10011002/* CRU_CLKSEL_CON39 */1003COMP(0, "aclk_vop_pre_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 39, 0, 5, 6, 2),10041005/* CRU_CLKSEL_CON40 */1006COMP(0, "vop_dclk_src_c", pll_src_cpll_gpll_p, 0, 40, 8, 8, 0, 1),1007CDIV(DCLK_HDMIPHY, "hdmiphy_div", "vop_dclk_src", 0, 40, 3, 3),1008/* MUX vop_dclk_frac_sel */1009MUX(DCLK_LCDC, "vop_dclk", mux_dclk_lcdc_p, 0, 40, 1, 1),10101011/* CRU_CLKSEL_CON41 */1012/* FRACT dclk_vop_frac_div_con */10131014/* CRU_CLKSEL_CON42 */1015MUX(0, "clk_cif_pll", pll_src_cpll_gpll_p, 0, 42, 7, 1),1016COMP(0, "clk_cif_src_c", mux_cif_p, 0, 42, 0, 5, 5, 1),10171018/* CRU_CLKSEL_CON43 */1019COMP(0, "clk_sdmmc_ext_c", pll_src_cpll_gpll_xin24m_usb480m_p, 0, 43, 0, 8, 8, 2),10201021/* CRU_CLKSEL_CON44 */1022COMP(0, "aclk_gpu_pre_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 44, 0, 5, 6, 2),10231024/* CRU_CLKSEL_CON45 */1025MUX(SCLK_REF_USB3OTG, "clk_ref_usb3otg", mux_ref_usb3otg_p, 0, 45, 8, 1),1026COMP(0, "clk_ref_usb3otg_src_c", pll_src_cpll_gpll_p, 0, 45, 0, 7, 7, 1),10271028/* CRU_CLKSEL_CON46 */1029/* Unused */10301031/* CRU_CLKSEL_CON47 */1032/* Unused */10331034/* CRU_CLKSEL_CON48 */1035COMP(0, "sclk_cabac_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 48, 8, 5, 14, 2),1036COMP(0, "aclk_rkvdec_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 48, 0, 5, 6, 2),10371038/* CRU_CLKSEL_CON49 */1039COMP(0, "sclk_vdec_core_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 49, 0, 5, 6, 2),10401041/* CRU_CLKSEL_CON50 */1042COMP(0, "aclk_vpu_pre_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 50, 0, 5, 6, 2),10431044/* CRU_CLKSEL_CON51 */1045COMP(0, "sclk_venc_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 51, 8, 5, 14, 2),1046COMP(0, "aclk_rkvenc_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 51, 0, 5, 6, 2),10471048/* CRU_CLKSEL_CON52 */1049COMP(0, "sclk_venc_dsp_c", pll_src_cpll_gpll_hdmiphy_usb480m_p, 0, 51, 8, 5, 14, 2),1050COMP(0, "sclk_wifi_c", pll_src_cpll_gpll_usb480m_p, 0, 51, 0, 6, 6, 2),10511052/* GRF_SOC_CON4 */1053MUXGRF(SCLK_MAC2IO_EXT, "clk_mac2io_ext", mux_mac2io_ext_p, 0, RK3328_GRF_SOC_CON4, 14, 1),10541055/* GRF_MAC_CON1 */1056MUXGRF(SCLK_MAC2IO, "clk_mac2io", mux_mac2io_p, 0, RK3328_GRF_MAC_CON1, 10, 1),10571058/* GRF_MAC_CON2 */1059MUXGRF(SCLK_MAC2PHY, "clk_mac2phy", mux_mac2phy_p, 0, RK3328_GRF_MAC_CON2, 10, 1),10601061/*1062* This clock is controlled in the secure world1063*/1064FFACT(PCLK_WDT, "pclk_wdt", "pclk_bus", 1, 1),1065};10661067static int1068rk3328_cru_probe(device_t dev)1069{10701071if (!ofw_bus_status_okay(dev))1072return (ENXIO);10731074if (ofw_bus_is_compatible(dev, "rockchip,rk3328-cru")) {1075device_set_desc(dev, "Rockchip RK3328 Clock and Reset Unit");1076return (BUS_PROBE_DEFAULT);1077}10781079return (ENXIO);1080}10811082static int1083rk3328_cru_attach(device_t dev)1084{1085struct rk_cru_softc *sc;10861087sc = device_get_softc(dev);1088sc->dev = dev;10891090sc->gates = rk3328_gates;1091sc->ngates = nitems(rk3328_gates);10921093sc->clks = rk3328_clks;1094sc->nclks = nitems(rk3328_clks);10951096sc->reset_offset = 0x300;1097sc->reset_num = 184;10981099return (rk_cru_attach(dev));1100}11011102static device_method_t rk3328_cru_methods[] = {1103/* Device interface */1104DEVMETHOD(device_probe, rk3328_cru_probe),1105DEVMETHOD(device_attach, rk3328_cru_attach),11061107DEVMETHOD_END1108};11091110DEFINE_CLASS_1(rk3328_cru, rk3328_cru_driver, rk3328_cru_methods,1111sizeof(struct rk_cru_softc), rk_cru_driver);11121113EARLY_DRIVER_MODULE(rk3328_cru, simplebus, rk3328_cru_driver, 0, 0,1114BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);111511161117