1 1.1 skrll /* $NetBSD: sun20i_d1_ccu.c,v 1.1 2024/08/13 07:20:23 skrll Exp $ */ 2 1.1 skrll 3 1.1 skrll /*- 4 1.1 skrll * Copyright (c) 2024 Rui-Xiang Guo 5 1.1 skrll * All rights reserved. 6 1.1 skrll * 7 1.1 skrll * Redistribution and use in source and binary forms, with or without 8 1.1 skrll * modification, are permitted provided that the following conditions 9 1.1 skrll * are met: 10 1.1 skrll * 1. Redistributions of source code must retain the above copyright 11 1.1 skrll * notice, this list of conditions and the following disclaimer. 12 1.1 skrll * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 skrll * notice, this list of conditions and the following disclaimer in the 14 1.1 skrll * documentation and/or other materials provided with the distribution. 15 1.1 skrll * 16 1.1 skrll * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 skrll * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 skrll * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 skrll * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 skrll * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 1.1 skrll * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 1.1 skrll * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 1.1 skrll * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 1.1 skrll * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 skrll * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 skrll * SUCH DAMAGE. 27 1.1 skrll */ 28 1.1 skrll 29 1.1 skrll #include <sys/cdefs.h> 30 1.1 skrll 31 1.1 skrll __KERNEL_RCSID(1, "$NetBSD: sun20i_d1_ccu.c,v 1.1 2024/08/13 07:20:23 skrll Exp $"); 32 1.1 skrll 33 1.1 skrll #include <sys/param.h> 34 1.1 skrll #include <sys/bus.h> 35 1.1 skrll #include <sys/device.h> 36 1.1 skrll #include <sys/systm.h> 37 1.1 skrll 38 1.1 skrll #include <dev/fdt/fdtvar.h> 39 1.1 skrll 40 1.1 skrll #include <arm/sunxi/sunxi_ccu.h> 41 1.1 skrll #include <riscv/sunxi/sun20i_d1_ccu.h> 42 1.1 skrll 43 1.1 skrll #define PLL_CPU_CTRL_REG 0x000 44 1.1 skrll #define PLL_DDR_CTRL_REG 0x010 45 1.1 skrll #define PLL_PERI_CTRL_REG 0x020 46 1.1 skrll #define PLL_AUDIO1_CTRL_REG 0x080 47 1.1 skrll #define PSI_CLK_REG 0x510 48 1.1 skrll #define APB0_CLK_REG 0x520 49 1.1 skrll #define APB1_CLK_REG 0x524 50 1.1 skrll #define MBUS_CLK_REG 0x540 51 1.1 skrll #define DE_BGR_REG 0x60c 52 1.1 skrll #define DI_BGR_REG 0x62c 53 1.1 skrll #define G2D_BGR_REG 0x63c 54 1.1 skrll #define CE_BGR_REG 0x68c 55 1.1 skrll #define VE_BGR_REG 0x69c 56 1.1 skrll #define DMA_BGR_REG 0x70c 57 1.1 skrll #define MSGBOX_BGR_REG 0x71c 58 1.1 skrll #define SPINLOCK_BGR_REG 0x72c 59 1.1 skrll #define HSTIMER_BGR_REG 0x73c 60 1.1 skrll #define AVS_CLK_REG 0x740 61 1.1 skrll #define DBGSYS_BGR_REG 0x78c 62 1.1 skrll #define PWM_BGR_REG 0x7ac 63 1.1 skrll #define IOMMU_BGR_REG 0x7bc 64 1.1 skrll #define DRAM_CLK_REG 0x800 65 1.1 skrll #define MBUS_MAT_CLK_GATING_REG 0x804 66 1.1 skrll #define DRAM_BGR_REG 0x80c 67 1.1 skrll #define SMHC0_CLK_REG 0x830 68 1.1 skrll #define SMHC1_CLK_REG 0x834 69 1.1 skrll #define SMHC2_CLK_REG 0x838 70 1.1 skrll #define SMHC_BGR_REG 0x84c 71 1.1 skrll #define UART_BGR_REG 0x90c 72 1.1 skrll #define TWI_BGR_REG 0x91c 73 1.1 skrll #define SPI_BGR_REG 0x96c 74 1.1 skrll #define EMAC_BGR_REG 0x97c 75 1.1 skrll #define IRTX_BGR_REG 0x9cc 76 1.1 skrll #define GPADC_BGR_REG 0x9ec 77 1.1 skrll #define THS_BGR_REG 0x9fc 78 1.1 skrll #define I2S_BGR_REG 0xa20 79 1.1 skrll #define OWA_BGR_REG 0xa2c 80 1.1 skrll #define DMIC_BGR_REG 0xa4c 81 1.1 skrll #define AUDIO_CODEC_BGR_REG 0xa5c 82 1.1 skrll #define USB0_CLK_REG 0xa70 83 1.1 skrll #define USB1_CLK_REG 0xa74 84 1.1 skrll #define USB_BGR_REG 0xa8c 85 1.1 skrll #define LRADC_BGR_REG 0xa9c 86 1.1 skrll #define DPSS_TOP_BGR_REG 0xabc 87 1.1 skrll #define HDMI_BGR_REG 0xb1c 88 1.1 skrll #define DSI_BGR_REG 0xb4c 89 1.1 skrll #define TCONLCD_BGR_REG 0xb7c 90 1.1 skrll #define TCONTV_BGR_REG 0xb9c 91 1.1 skrll #define LVDS_BGR_REG 0xbac 92 1.1 skrll #define TVE_BGR_REG 0xbbc 93 1.1 skrll #define TVD_BGR_REG 0xbdc 94 1.1 skrll #define LEDC_BGR_REG 0xbfc 95 1.1 skrll #define CSI_BGR_REG 0xc1c 96 1.1 skrll #define TPADC_BGR_REG 0xc5c 97 1.1 skrll #define DSP_BGR_REG 0xc7c 98 1.1 skrll #define RISCV_CFG_BGR_REG 0xd0c 99 1.1 skrll 100 1.1 skrll static int sun20i_d1_ccu_match(device_t, cfdata_t, void *); 101 1.1 skrll static void sun20i_d1_ccu_attach(device_t, device_t, void *); 102 1.1 skrll 103 1.1 skrll static const struct device_compatible_entry compat_data[] = { 104 1.1 skrll { .compat = "allwinner,sun20i-d1-ccu" }, 105 1.1 skrll DEVICE_COMPAT_EOL 106 1.1 skrll }; 107 1.1 skrll 108 1.1 skrll CFATTACH_DECL_NEW(sunxi_d1_ccu, sizeof(struct sunxi_ccu_softc), 109 1.1 skrll sun20i_d1_ccu_match, sun20i_d1_ccu_attach, NULL, NULL); 110 1.1 skrll 111 1.1 skrll static struct sunxi_ccu_reset sun20i_d1_ccu_resets[] = { 112 1.1 skrll SUNXI_CCU_RESET(D1_RST_MBUS, MBUS_CLK_REG, 30), 113 1.1 skrll 114 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DE, DE_BGR_REG, 16), 115 1.1 skrll 116 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DI, DI_BGR_REG, 16), 117 1.1 skrll 118 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_G2D, G2D_BGR_REG, 16), 119 1.1 skrll 120 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_CE, CE_BGR_REG, 16), 121 1.1 skrll 122 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_VE, VE_BGR_REG, 16), 123 1.1 skrll 124 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DMA, DMA_BGR_REG, 16), 125 1.1 skrll 126 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_MSGBOX0, MSGBOX_BGR_REG, 16), 127 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_MSGBOX1, MSGBOX_BGR_REG, 17), 128 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_MSGBOX2, MSGBOX_BGR_REG, 18), 129 1.1 skrll 130 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_SPINLOCK, SPINLOCK_BGR_REG, 16), 131 1.1 skrll 132 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_HSTIMER, HSTIMER_BGR_REG, 16), 133 1.1 skrll 134 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DBGSYS, DBGSYS_BGR_REG, 16), 135 1.1 skrll 136 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_PWM, PWM_BGR_REG, 16), 137 1.1 skrll 138 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DRAM, DRAM_BGR_REG, 16), 139 1.1 skrll 140 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_MMC0, SMHC_BGR_REG, 16), 141 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_MMC1, SMHC_BGR_REG, 17), 142 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_MMC2, SMHC_BGR_REG, 18), 143 1.1 skrll 144 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_UART0, UART_BGR_REG, 16), 145 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_UART1, UART_BGR_REG, 17), 146 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_UART2, UART_BGR_REG, 18), 147 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_UART3, UART_BGR_REG, 19), 148 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_UART4, UART_BGR_REG, 20), 149 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_UART5, UART_BGR_REG, 21), 150 1.1 skrll 151 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2C0, TWI_BGR_REG, 16), 152 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2C1, TWI_BGR_REG, 17), 153 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2C2, TWI_BGR_REG, 18), 154 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2C3, TWI_BGR_REG, 19), 155 1.1 skrll 156 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_SPI0, SPI_BGR_REG, 16), 157 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_SPI1, SPI_BGR_REG, 17), 158 1.1 skrll 159 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_EMAC, EMAC_BGR_REG, 16), 160 1.1 skrll 161 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_IRTX, IRTX_BGR_REG, 16), 162 1.1 skrll 163 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_GPADC, GPADC_BGR_REG, 16), 164 1.1 skrll 165 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_THS, THS_BGR_REG, 16), 166 1.1 skrll 167 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2S0, I2S_BGR_REG, 16), 168 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2S1, I2S_BGR_REG, 17), 169 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_I2S2, I2S_BGR_REG, 18), 170 1.1 skrll 171 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_SPDIF, OWA_BGR_REG, 16), 172 1.1 skrll 173 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DMIC, DMIC_BGR_REG, 16), 174 1.1 skrll 175 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_AUDIO, AUDIO_CODEC_BGR_REG, 16), 176 1.1 skrll 177 1.1 skrll SUNXI_CCU_RESET(D1_RST_USB_PHY0, USB0_CLK_REG, 30), 178 1.1 skrll 179 1.1 skrll SUNXI_CCU_RESET(D1_RST_USB_PHY1, USB1_CLK_REG, 30), 180 1.1 skrll 181 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_OHCI0, USB_BGR_REG, 16), 182 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_OHCI1, USB_BGR_REG, 17), 183 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_EHCI0, USB_BGR_REG, 20), 184 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_EHCI1, USB_BGR_REG, 21), 185 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_OTG, USB_BGR_REG, 24), 186 1.1 skrll 187 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_LRADC, LRADC_BGR_REG, 16), 188 1.1 skrll 189 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DPSS_TOP, DPSS_TOP_BGR_REG, 16), 190 1.1 skrll 191 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_HDMI_SUB, HDMI_BGR_REG, 17), 192 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_HDMI_MAIN, HDMI_BGR_REG, 16), 193 1.1 skrll 194 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DSI, DSI_BGR_REG, 16), 195 1.1 skrll 196 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TCONLCD, TCONLCD_BGR_REG, 16), 197 1.1 skrll 198 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TCONTV, TCONTV_BGR_REG, 16), 199 1.1 skrll 200 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_LVDS, LVDS_BGR_REG, 16), 201 1.1 skrll 202 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TVE_TOP, TVE_BGR_REG, 16), 203 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TVE, TVE_BGR_REG, 17), 204 1.1 skrll 205 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TVD_TOP, TVD_BGR_REG, 16), 206 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TVD, TVD_BGR_REG, 17), 207 1.1 skrll 208 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_LEDC, LEDC_BGR_REG, 16), 209 1.1 skrll 210 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_CSI, CSI_BGR_REG, 16), 211 1.1 skrll 212 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_TPADC, TPADC_BGR_REG, 16), 213 1.1 skrll 214 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DSP, DSP_BGR_REG, 16), 215 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DSP_CFG, DSP_BGR_REG, 17), 216 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_DSP_DBG, DSP_BGR_REG, 18), 217 1.1 skrll 218 1.1 skrll SUNXI_CCU_RESET(D1_RST_BUS_RISCV_CFG, RISCV_CFG_BGR_REG, 16), 219 1.1 skrll }; 220 1.1 skrll 221 1.1 skrll static const char *psi_parents[] = { "hosc", "losc", "iosc", "pll_periph" }; 222 1.1 skrll static const char *apb_parents[] = { "hosc", "losc", "psi", "pll_periph" }; 223 1.1 skrll static const char *dram_parents[] = { "pll_ddr", "pll_audio1_div2", "pll_periph_2x", "pll_periph_800m" }; 224 1.1 skrll static const char *mmc_parents[] = { "hosc", "pll_periph", "pll_periph_2x", "pll_audio1_div2" }; 225 1.1 skrll static const char *mmc2_parents[] = { "pll_periph", "pll_periph_2x", "pll_periph_800m", "pll_audio1_div2" }; 226 1.1 skrll 227 1.1 skrll static struct sunxi_ccu_clk sun20i_d1_ccu_clks[] = { 228 1.1 skrll SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_CPU, "pll_cpu", "hosc", 229 1.1 skrll PLL_CPU_CTRL_REG, /* reg */ 230 1.1 skrll __BITS(15,8), /* n */ 231 1.1 skrll 0, /* k */ 232 1.1 skrll 0, /* m */ 233 1.1 skrll 0, /* p */ 234 1.1 skrll __BIT(31), /* enable */ 235 1.1 skrll __BIT(28), /* lock */ 236 1.1 skrll NULL, /* table */ 237 1.1 skrll SUNXI_CCU_NKMP_SCALE_CLOCK), 238 1.1 skrll 239 1.1 skrll SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_DDR, "pll_ddr", "hosc", 240 1.1 skrll PLL_DDR_CTRL_REG, /* reg */ 241 1.1 skrll __BITS(15,8), /* n */ 242 1.1 skrll 0, /* k */ 243 1.1 skrll __BIT(1), /* m */ 244 1.1 skrll __BIT(0), /* p */ 245 1.1 skrll __BIT(31), /* enable */ 246 1.1 skrll __BIT(28), /* lock */ 247 1.1 skrll NULL, /* table */ 248 1.1 skrll SUNXI_CCU_NKMP_SCALE_CLOCK), 249 1.1 skrll 250 1.1 skrll SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_PERIPH_2X, "pll_periph_2x", "hosc", 251 1.1 skrll PLL_PERI_CTRL_REG, /* reg */ 252 1.1 skrll __BITS(15,8), /* n */ 253 1.1 skrll 0, /* k */ 254 1.1 skrll __BIT(1), /* m */ 255 1.1 skrll __BITS(18,16), /* p */ 256 1.1 skrll __BIT(31), /* enable */ 257 1.1 skrll __BIT(28), /* lock */ 258 1.1 skrll NULL, /* table */ 259 1.1 skrll SUNXI_CCU_NKMP_SCALE_CLOCK), 260 1.1 skrll 261 1.1 skrll SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_PERIPH_800M, "pll_periph_800m", "hosc", 262 1.1 skrll PLL_PERI_CTRL_REG, /* reg */ 263 1.1 skrll __BITS(15,8), /* n */ 264 1.1 skrll 0, /* k */ 265 1.1 skrll __BIT(1), /* m */ 266 1.1 skrll __BITS(22,20), /* p */ 267 1.1 skrll __BIT(31), /* enable */ 268 1.1 skrll __BIT(28), /* lock */ 269 1.1 skrll NULL, /* table */ 270 1.1 skrll SUNXI_CCU_NKMP_SCALE_CLOCK), 271 1.1 skrll 272 1.1 skrll SUNXI_CCU_FIXED_FACTOR(D1_CLK_PLL_PERIPH, "pll_periph", "pll_periph_2x", 2, 1), 273 1.1 skrll 274 1.1 skrll SUNXI_CCU_NKMP_TABLE(D1_CLK_PLL_AUDIO1, "pll_audio1_div2", "hosc", 275 1.1 skrll PLL_AUDIO1_CTRL_REG, /* reg */ 276 1.1 skrll __BITS(15,8), /* n */ 277 1.1 skrll 0, /* k */ 278 1.1 skrll __BIT(1), /* m */ 279 1.1 skrll __BITS(18,16), /* p */ 280 1.1 skrll __BIT(31), /* enable */ 281 1.1 skrll __BIT(28), /* lock */ 282 1.1 skrll NULL, /* table */ 283 1.1 skrll SUNXI_CCU_NKMP_SCALE_CLOCK), 284 1.1 skrll 285 1.1 skrll SUNXI_CCU_NM(D1_CLK_PSI, "psi", psi_parents, 286 1.1 skrll PSI_CLK_REG, /* reg */ 287 1.1 skrll __BITS(9,8), /* n */ 288 1.1 skrll __BITS(1,0), /* m */ 289 1.1 skrll __BITS(25,24), /* sel */ 290 1.1 skrll 0, /* enable */ 291 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 292 1.1 skrll 293 1.1 skrll SUNXI_CCU_NM(D1_CLK_APB0, "apb0", apb_parents, 294 1.1 skrll APB0_CLK_REG, /* reg */ 295 1.1 skrll __BITS(9,8), /* n */ 296 1.1 skrll __BITS(4,0), /* m */ 297 1.1 skrll __BITS(25,24), /* sel */ 298 1.1 skrll 0, /* enable */ 299 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 300 1.1 skrll 301 1.1 skrll SUNXI_CCU_NM(D1_CLK_APB1, "apb1", apb_parents, 302 1.1 skrll APB1_CLK_REG, /* reg */ 303 1.1 skrll __BITS(9,8), /* n */ 304 1.1 skrll __BITS(4,0), /* m */ 305 1.1 skrll __BITS(25,24), /* sel */ 306 1.1 skrll 0, /* enable */ 307 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 308 1.1 skrll 309 1.1 skrll SUNXI_CCU_FIXED_FACTOR(D1_CLK_MBUS, "mbus", "dram", 4, 1), 310 1.1 skrll 311 1.1 skrll SUNXI_CCU_NM(D1_CLK_DRAM, "dram", dram_parents, 312 1.1 skrll DRAM_CLK_REG, /* reg */ 313 1.1 skrll __BITS(9,8), /* n */ 314 1.1 skrll __BITS(1,0), /* m */ 315 1.1 skrll __BITS(26,24), /* sel */ 316 1.1 skrll __BIT(31), /* enable */ 317 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 318 1.1 skrll 319 1.1 skrll SUNXI_CCU_NM(D1_CLK_MMC0, "mmc0", mmc_parents, 320 1.1 skrll SMHC0_CLK_REG, /* reg */ 321 1.1 skrll __BITS(9,8), /* n */ 322 1.1 skrll __BITS(3,0), /* m */ 323 1.1 skrll __BITS(26,24), /* sel */ 324 1.1 skrll __BIT(31), /* enable */ 325 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 326 1.1 skrll SUNXI_CCU_NM(D1_CLK_MMC1, "mmc1", mmc_parents, 327 1.1 skrll SMHC1_CLK_REG, /* reg */ 328 1.1 skrll __BITS(9,8), /* n */ 329 1.1 skrll __BITS(3,0), /* m */ 330 1.1 skrll __BITS(26,24), /* sel */ 331 1.1 skrll __BIT(31), /* enable */ 332 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 333 1.1 skrll SUNXI_CCU_NM(D1_CLK_MMC2, "mmc2", mmc2_parents, 334 1.1 skrll SMHC2_CLK_REG, /* reg */ 335 1.1 skrll __BITS(9,8), /* n */ 336 1.1 skrll __BITS(3,0), /* m */ 337 1.1 skrll __BITS(26,24), /* sel */ 338 1.1 skrll __BIT(31), /* enable */ 339 1.1 skrll SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN), 340 1.1 skrll 341 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DE, "bus-de", "psi", 342 1.1 skrll DE_BGR_REG, 0), 343 1.1 skrll 344 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DI, "bus-di", "psi", 345 1.1 skrll DI_BGR_REG, 0), 346 1.1 skrll 347 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_G2D, "bus-g2d", "psi", 348 1.1 skrll G2D_BGR_REG ,0), 349 1.1 skrll 350 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_CE, "bus-ce", "psi", 351 1.1 skrll CE_BGR_REG, 0), 352 1.1 skrll 353 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_VE, "bus-ve", "psi", 354 1.1 skrll VE_BGR_REG, 0), 355 1.1 skrll 356 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DMA, "bus-dma", "psi", 357 1.1 skrll DMA_BGR_REG, 0), 358 1.1 skrll 359 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_MSGBOX0, "bus-msgbox0", "psi", 360 1.1 skrll MSGBOX_BGR_REG, 0), 361 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_MSGBOX1, "bus-msgbox1", "psi", 362 1.1 skrll MSGBOX_BGR_REG, 1), 363 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_MSGBOX2, "bus-msgbox2", "psi", 364 1.1 skrll MSGBOX_BGR_REG, 2), 365 1.1 skrll 366 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_SPINLOCK, "bus-spinlock", "psi", 367 1.1 skrll SPINLOCK_BGR_REG, 0), 368 1.1 skrll 369 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_HSTIMER, "bus-hstimer", "psi", 370 1.1 skrll HSTIMER_BGR_REG, 0), 371 1.1 skrll 372 1.1 skrll SUNXI_CCU_GATE(D1_CLK_AVS, "avs", "hosc", 373 1.1 skrll AVS_CLK_REG, 31), 374 1.1 skrll 375 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DBGSYS, "bus-dbgsys", "psi", 376 1.1 skrll DBGSYS_BGR_REG, 0), 377 1.1 skrll 378 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_PWM, "bus-pwm", "apb0", 379 1.1 skrll PWM_BGR_REG, 0), 380 1.1 skrll 381 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_IOMMU, "bus-iommu", "apb0", 382 1.1 skrll IOMMU_BGR_REG, 0), 383 1.1 skrll 384 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_DMA, "mbus-dma", "mbus", 385 1.1 skrll MBUS_MAT_CLK_GATING_REG, 0), 386 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_VE, "mbus-ve", "mbus", 387 1.1 skrll MBUS_MAT_CLK_GATING_REG, 1), 388 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_CE, "mbus-ce", "mbus", 389 1.1 skrll MBUS_MAT_CLK_GATING_REG, 2), 390 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_TVIN, "mbus-tvin", "mbus", 391 1.1 skrll MBUS_MAT_CLK_GATING_REG, 7), 392 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_CSI, "mbus-csi", "mbus", 393 1.1 skrll MBUS_MAT_CLK_GATING_REG, 8), 394 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_G2D, "mbus-g2d", "mbus", 395 1.1 skrll MBUS_MAT_CLK_GATING_REG, 10), 396 1.1 skrll SUNXI_CCU_GATE(D1_CLK_MBUS_RISCV, "mbus-riscv", "mbus", 397 1.1 skrll MBUS_MAT_CLK_GATING_REG, 11), 398 1.1 skrll 399 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DRAM, "bus-dram", "psi", 400 1.1 skrll DRAM_BGR_REG, 0), 401 1.1 skrll 402 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_MMC0, "bus-mmc0", "psi", 403 1.1 skrll SMHC_BGR_REG, 0), 404 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_MMC1, "bus-mmc1", "psi", 405 1.1 skrll SMHC_BGR_REG, 1), 406 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_MMC2, "bus-mmc2", "psi", 407 1.1 skrll SMHC_BGR_REG, 2), 408 1.1 skrll 409 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_UART0, "bus-uart0", "apb1", 410 1.1 skrll UART_BGR_REG, 0), 411 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_UART1, "bus-uart1", "apb1", 412 1.1 skrll UART_BGR_REG, 1), 413 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_UART2, "bus-uart2", "apb1", 414 1.1 skrll UART_BGR_REG, 2), 415 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_UART3, "bus-uart3", "apb1", 416 1.1 skrll UART_BGR_REG, 3), 417 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_UART4, "bus-uart4", "apb1", 418 1.1 skrll UART_BGR_REG, 4), 419 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_UART5, "bus-uart5", "apb1", 420 1.1 skrll UART_BGR_REG, 5), 421 1.1 skrll 422 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2C0, "bus-i2c0", "apb1", 423 1.1 skrll TWI_BGR_REG, 0), 424 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2C1, "bus-i2c1", "apb1", 425 1.1 skrll TWI_BGR_REG, 1), 426 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2C2, "bus-i2c2", "apb1", 427 1.1 skrll TWI_BGR_REG, 2), 428 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2C3, "bus-i2c3", "apb1", 429 1.1 skrll TWI_BGR_REG, 3), 430 1.1 skrll 431 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_SPI0, "bus-spi0", "psi", 432 1.1 skrll SPI_BGR_REG, 0), 433 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_SPI1, "bus-spi1", "psi", 434 1.1 skrll SPI_BGR_REG, 1), 435 1.1 skrll 436 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_EMAC, "bus-emac", "psi", 437 1.1 skrll EMAC_BGR_REG, 0), 438 1.1 skrll 439 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_IRTX, "bus-irtx", "apb0", 440 1.1 skrll IRTX_BGR_REG, 0), 441 1.1 skrll 442 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_GPADC, "bus-gpadc", "apb0", 443 1.1 skrll GPADC_BGR_REG, 0), 444 1.1 skrll 445 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_THS, "bus-ths", "apb0", 446 1.1 skrll THS_BGR_REG, 0), 447 1.1 skrll 448 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2S0, "bus-i2s0", "apb0", 449 1.1 skrll I2S_BGR_REG, 0), 450 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2S1, "bus-i2s1", "apb0", 451 1.1 skrll I2S_BGR_REG, 1), 452 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_I2S2, "bus-i2s2", "apb0", 453 1.1 skrll I2S_BGR_REG, 2), 454 1.1 skrll 455 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_SPDIF, "bus-spdif", "apb0", 456 1.1 skrll OWA_BGR_REG, 0), 457 1.1 skrll 458 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DMIC, "bus-dmic", "apb0", 459 1.1 skrll DMIC_BGR_REG, 0), 460 1.1 skrll 461 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_AUDIO, "bus-audio", "apb0", 462 1.1 skrll AUDIO_CODEC_BGR_REG, 0), 463 1.1 skrll 464 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_OHCI0, "bus-ohci0", "psi", 465 1.1 skrll USB_BGR_REG, 0), 466 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_OHCI1, "bus-ohci1", "psi", 467 1.1 skrll USB_BGR_REG, 1), 468 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_EHCI0, "bus-ehci0", "psi", 469 1.1 skrll USB_BGR_REG, 4), 470 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_EHCI1, "bus-ehci1", "psi", 471 1.1 skrll USB_BGR_REG, 5), 472 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_OTG, "bus-otg", "psi", 473 1.1 skrll USB_BGR_REG, 8), 474 1.1 skrll 475 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_LRADC, "bus-lradc", "apb0", 476 1.1 skrll LRADC_BGR_REG, 0), 477 1.1 skrll 478 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DPSS_TOP, "bus-dpss-top", "psi", 479 1.1 skrll DPSS_TOP_BGR_REG, 0), 480 1.1 skrll 481 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_HDMI, "bus-hdmi", "psi", 482 1.1 skrll HDMI_BGR_REG, 0), 483 1.1 skrll 484 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DSI, "bus-dsi", "psi", 485 1.1 skrll DSI_BGR_REG, 0), 486 1.1 skrll 487 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TCONLCD, "bus-tconlcd", "psi", 488 1.1 skrll TCONLCD_BGR_REG, 0), 489 1.1 skrll 490 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TCONTV, "bus-tcontv", "psi", 491 1.1 skrll TCONTV_BGR_REG, 0), 492 1.1 skrll 493 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TVE_TOP, "bus-tve-top", "psi", 494 1.1 skrll TVE_BGR_REG, 0), 495 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TVE, "bus-tve", "psi", 496 1.1 skrll TVE_BGR_REG, 1), 497 1.1 skrll 498 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TVD_TOP, "bus-tvd-top", "psi", 499 1.1 skrll TVD_BGR_REG, 0), 500 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TVD, "bus-tvd", "psi", 501 1.1 skrll TVD_BGR_REG, 1), 502 1.1 skrll 503 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_LEDC, "bus-ledc", "psi", 504 1.1 skrll LEDC_BGR_REG, 0), 505 1.1 skrll 506 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_CSI, "bus-csi", "psi", 507 1.1 skrll CSI_BGR_REG, 0), 508 1.1 skrll 509 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_TPADC, "bus-tpadc", "apb0", 510 1.1 skrll TPADC_BGR_REG, 0), 511 1.1 skrll 512 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_DSP_CFG, "bus-dsp-cfg", "psi", 513 1.1 skrll DSP_BGR_REG, 1), 514 1.1 skrll 515 1.1 skrll SUNXI_CCU_GATE(D1_CLK_BUS_RISCV_CFG, "bus-riscv-cfg", "psi", 516 1.1 skrll RISCV_CFG_BGR_REG, 0), 517 1.1 skrll }; 518 1.1 skrll 519 1.1 skrll static int 520 1.1 skrll sun20i_d1_ccu_match(device_t parent, cfdata_t cf, void *aux) 521 1.1 skrll { 522 1.1 skrll struct fdt_attach_args * const faa = aux; 523 1.1 skrll 524 1.1 skrll return of_compatible_match(faa->faa_phandle, compat_data); 525 1.1 skrll } 526 1.1 skrll 527 1.1 skrll static void 528 1.1 skrll sun20i_d1_ccu_attach(device_t parent, device_t self, void *aux) 529 1.1 skrll { 530 1.1 skrll struct sunxi_ccu_softc * const sc = device_private(self); 531 1.1 skrll struct fdt_attach_args * const faa = aux; 532 1.1 skrll 533 1.1 skrll sc->sc_dev = self; 534 1.1 skrll sc->sc_phandle = faa->faa_phandle; 535 1.1 skrll sc->sc_bst = faa->faa_bst; 536 1.1 skrll 537 1.1 skrll sc->sc_resets = sun20i_d1_ccu_resets; 538 1.1 skrll sc->sc_nresets = __arraycount(sun20i_d1_ccu_resets); 539 1.1 skrll 540 1.1 skrll sc->sc_clks = sun20i_d1_ccu_clks; 541 1.1 skrll sc->sc_nclks = __arraycount(sun20i_d1_ccu_clks); 542 1.1 skrll 543 1.1 skrll if (sunxi_ccu_attach(sc) != 0) 544 1.1 skrll return; 545 1.1 skrll 546 1.1 skrll aprint_naive("\n"); 547 1.1 skrll aprint_normal(": D1 CCU\n"); 548 1.1 skrll 549 1.1 skrll sunxi_ccu_print(sc); 550 1.1 skrll } 551