145bd8166SDavid Virag // SPDX-License-Identifier: GPL-2.0-only 245bd8166SDavid Virag /* 345bd8166SDavid Virag * Copyright (C) 2021 Dávid Virág <virag.david003@gmail.com> 445bd8166SDavid Virag * Author: Dávid Virág <virag.david003@gmail.com> 545bd8166SDavid Virag * 645bd8166SDavid Virag * Common Clock Framework support for Exynos7885 SoC. 745bd8166SDavid Virag */ 845bd8166SDavid Virag 945bd8166SDavid Virag #include <linux/clk.h> 1045bd8166SDavid Virag #include <linux/clk-provider.h> 1145bd8166SDavid Virag #include <linux/of.h> 1245bd8166SDavid Virag #include <linux/of_device.h> 1345bd8166SDavid Virag #include <linux/platform_device.h> 1445bd8166SDavid Virag 1545bd8166SDavid Virag #include <dt-bindings/clock/exynos7885.h> 1645bd8166SDavid Virag 1745bd8166SDavid Virag #include "clk.h" 1845bd8166SDavid Virag #include "clk-exynos-arm64.h" 1945bd8166SDavid Virag 20*ef4923c8SKrzysztof Kozlowski /* NOTE: Must be equal to the last clock ID increased by one */ 21*ef4923c8SKrzysztof Kozlowski #define CLKS_NR_TOP (CLK_GOUT_FSYS_USB30DRD + 1) 22*ef4923c8SKrzysztof Kozlowski #define CLKS_NR_CORE (CLK_GOUT_TREX_P_CORE_PCLK_P_CORE + 1) 23*ef4923c8SKrzysztof Kozlowski #define CLKS_NR_PERI (CLK_GOUT_WDT1_PCLK + 1) 24*ef4923c8SKrzysztof Kozlowski #define CLKS_NR_FSYS (CLK_GOUT_MMC_SDIO_SDCLKIN + 1) 25*ef4923c8SKrzysztof Kozlowski 2645bd8166SDavid Virag /* ---- CMU_TOP ------------------------------------------------------------- */ 2745bd8166SDavid Virag 2845bd8166SDavid Virag /* Register Offset definitions for CMU_TOP (0x12060000) */ 2945bd8166SDavid Virag #define PLL_LOCKTIME_PLL_SHARED0 0x0000 3045bd8166SDavid Virag #define PLL_LOCKTIME_PLL_SHARED1 0x0004 3145bd8166SDavid Virag #define PLL_CON0_PLL_SHARED0 0x0100 3245bd8166SDavid Virag #define PLL_CON0_PLL_SHARED1 0x0120 3345bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_CORE_BUS 0x1014 3445bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_CORE_CCI 0x1018 3545bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_CORE_G3D 0x101c 36f392db97SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_FSYS_BUS 0x1028 37f392db97SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_CARD 0x102c 38f392db97SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_EMBD 0x1030 39f392db97SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_SDIO 0x1034 40f392db97SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_FSYS_USB30DRD 0x1038 4145bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_BUS 0x1058 4245bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_SPI0 0x105c 4345bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_SPI1 0x1060 4445bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_UART0 0x1064 4545bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_UART1 0x1068 4645bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_UART2 0x106c 4745bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_USI0 0x1070 4845bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_USI1 0x1074 4945bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLKCMU_PERI_USI2 0x1078 5045bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_CORE_BUS 0x181c 5145bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_CORE_CCI 0x1820 5245bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_CORE_G3D 0x1824 53f392db97SDavid Virag #define CLK_CON_DIV_CLKCMU_FSYS_BUS 0x1844 54f392db97SDavid Virag #define CLK_CON_DIV_CLKCMU_FSYS_MMC_CARD 0x1848 55f392db97SDavid Virag #define CLK_CON_DIV_CLKCMU_FSYS_MMC_EMBD 0x184c 56f392db97SDavid Virag #define CLK_CON_DIV_CLKCMU_FSYS_MMC_SDIO 0x1850 57f392db97SDavid Virag #define CLK_CON_DIV_CLKCMU_FSYS_USB30DRD 0x1854 5845bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_BUS 0x1874 5945bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_SPI0 0x1878 6045bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_SPI1 0x187c 6145bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_UART0 0x1880 6245bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_UART1 0x1884 6345bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_UART2 0x1888 6445bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_USI0 0x188c 6545bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_USI1 0x1890 6645bd8166SDavid Virag #define CLK_CON_DIV_CLKCMU_PERI_USI2 0x1894 6745bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED0_DIV2 0x189c 6845bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED0_DIV3 0x18a0 6945bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED0_DIV4 0x18a4 7045bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED0_DIV5 0x18a8 7145bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED1_DIV2 0x18ac 7245bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED1_DIV3 0x18b0 7345bd8166SDavid Virag #define CLK_CON_DIV_PLL_SHARED1_DIV4 0x18b4 7445bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMUC_PERI_UART1 0x2004 7545bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_CORE_BUS 0x201c 7645bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_CORE_CCI 0x2020 7745bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_CORE_G3D 0x2024 78f392db97SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_FSYS_BUS 0x2044 79f392db97SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_CARD 0x2048 80f392db97SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_EMBD 0x204c 81f392db97SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_SDIO 0x2050 82f392db97SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_FSYS_USB30DRD 0x2054 8345bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_BUS 0x207c 8445bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_SPI0 0x2080 8545bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_SPI1 0x2084 8645bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_UART0 0x2088 8745bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_UART2 0x208c 8845bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_USI0 0x2090 8945bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_USI1 0x2094 9045bd8166SDavid Virag #define CLK_CON_GAT_GATE_CLKCMU_PERI_USI2 0x2098 9145bd8166SDavid Virag 9245bd8166SDavid Virag static const unsigned long top_clk_regs[] __initconst = { 9345bd8166SDavid Virag PLL_LOCKTIME_PLL_SHARED0, 9445bd8166SDavid Virag PLL_LOCKTIME_PLL_SHARED1, 9545bd8166SDavid Virag PLL_CON0_PLL_SHARED0, 9645bd8166SDavid Virag PLL_CON0_PLL_SHARED1, 9745bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_CORE_BUS, 9845bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_CORE_CCI, 9945bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_CORE_G3D, 100f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_BUS, 101f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_CARD, 102f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_EMBD, 103f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_SDIO, 104f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_USB30DRD, 10545bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_BUS, 10645bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_SPI0, 10745bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_SPI1, 10845bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_UART0, 10945bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_UART1, 11045bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_UART2, 11145bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_USI0, 11245bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_USI1, 11345bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_USI2, 11445bd8166SDavid Virag CLK_CON_DIV_CLKCMU_CORE_BUS, 11545bd8166SDavid Virag CLK_CON_DIV_CLKCMU_CORE_CCI, 11645bd8166SDavid Virag CLK_CON_DIV_CLKCMU_CORE_G3D, 117f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_BUS, 118f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_MMC_CARD, 119f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_MMC_EMBD, 120f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_MMC_SDIO, 121f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_USB30DRD, 12245bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_BUS, 12345bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_SPI0, 12445bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_SPI1, 12545bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_UART0, 12645bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_UART1, 12745bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_UART2, 12845bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_USI0, 12945bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_USI1, 13045bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_USI2, 13145bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV2, 13245bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV3, 13345bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV4, 13445bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV5, 13545bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED1_DIV2, 13645bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED1_DIV3, 13745bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED1_DIV4, 13845bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMUC_PERI_UART1, 13945bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_CORE_BUS, 14045bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_CORE_CCI, 14145bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_CORE_G3D, 142f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_BUS, 143f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_CARD, 144f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_EMBD, 145f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_SDIO, 146f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_USB30DRD, 14745bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_BUS, 14845bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_SPI0, 14945bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_SPI1, 15045bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_UART0, 15145bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_UART2, 15245bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_USI0, 15345bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_USI1, 15445bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_USI2, 15545bd8166SDavid Virag }; 15645bd8166SDavid Virag 15745bd8166SDavid Virag static const struct samsung_pll_clock top_pll_clks[] __initconst = { 15845bd8166SDavid Virag PLL(pll_1417x, CLK_FOUT_SHARED0_PLL, "fout_shared0_pll", "oscclk", 15945bd8166SDavid Virag PLL_LOCKTIME_PLL_SHARED0, PLL_CON0_PLL_SHARED0, 16045bd8166SDavid Virag NULL), 16145bd8166SDavid Virag PLL(pll_1417x, CLK_FOUT_SHARED1_PLL, "fout_shared1_pll", "oscclk", 16245bd8166SDavid Virag PLL_LOCKTIME_PLL_SHARED1, PLL_CON0_PLL_SHARED1, 16345bd8166SDavid Virag NULL), 16445bd8166SDavid Virag }; 16545bd8166SDavid Virag 16645bd8166SDavid Virag /* List of parent clocks for Muxes in CMU_TOP: for CMU_CORE */ 16745bd8166SDavid Virag PNAME(mout_core_bus_p) = { "dout_shared0_div2", "dout_shared1_div2", 16845bd8166SDavid Virag "dout_shared0_div3", "dout_shared0_div3" }; 16945bd8166SDavid Virag PNAME(mout_core_cci_p) = { "dout_shared0_div2", "dout_shared1_div2", 17045bd8166SDavid Virag "dout_shared0_div3", "dout_shared0_div3" }; 17145bd8166SDavid Virag PNAME(mout_core_g3d_p) = { "dout_shared0_div2", "dout_shared1_div2", 17245bd8166SDavid Virag "dout_shared0_div3", "dout_shared0_div3" }; 17345bd8166SDavid Virag 17445bd8166SDavid Virag /* List of parent clocks for Muxes in CMU_TOP: for CMU_PERI */ 17545bd8166SDavid Virag PNAME(mout_peri_bus_p) = { "dout_shared0_div4", "dout_shared1_div4" }; 17645bd8166SDavid Virag PNAME(mout_peri_spi0_p) = { "oscclk", "dout_shared0_div4" }; 17745bd8166SDavid Virag PNAME(mout_peri_spi1_p) = { "oscclk", "dout_shared0_div4" }; 17845bd8166SDavid Virag PNAME(mout_peri_uart0_p) = { "oscclk", "dout_shared0_div4" }; 17945bd8166SDavid Virag PNAME(mout_peri_uart1_p) = { "oscclk", "dout_shared0_div4" }; 18045bd8166SDavid Virag PNAME(mout_peri_uart2_p) = { "oscclk", "dout_shared0_div4" }; 18145bd8166SDavid Virag PNAME(mout_peri_usi0_p) = { "oscclk", "dout_shared0_div4" }; 18245bd8166SDavid Virag PNAME(mout_peri_usi1_p) = { "oscclk", "dout_shared0_div4" }; 18345bd8166SDavid Virag PNAME(mout_peri_usi2_p) = { "oscclk", "dout_shared0_div4" }; 18445bd8166SDavid Virag 185f392db97SDavid Virag /* List of parent clocks for Muxes in CMU_TOP: for CMU_FSYS */ 186f392db97SDavid Virag PNAME(mout_fsys_bus_p) = { "dout_shared0_div2", "dout_shared1_div2" }; 187f392db97SDavid Virag PNAME(mout_fsys_mmc_card_p) = { "dout_shared0_div2", "dout_shared1_div2" }; 188f392db97SDavid Virag PNAME(mout_fsys_mmc_embd_p) = { "dout_shared0_div2", "dout_shared1_div2" }; 189f392db97SDavid Virag PNAME(mout_fsys_mmc_sdio_p) = { "dout_shared0_div2", "dout_shared1_div2" }; 190f392db97SDavid Virag PNAME(mout_fsys_usb30drd_p) = { "dout_shared0_div4", "dout_shared1_div4" }; 191f392db97SDavid Virag 19245bd8166SDavid Virag static const struct samsung_mux_clock top_mux_clks[] __initconst = { 19345bd8166SDavid Virag /* CORE */ 19445bd8166SDavid Virag MUX(CLK_MOUT_CORE_BUS, "mout_core_bus", mout_core_bus_p, 19545bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_CORE_BUS, 0, 2), 19645bd8166SDavid Virag MUX(CLK_MOUT_CORE_CCI, "mout_core_cci", mout_core_cci_p, 19745bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_CORE_CCI, 0, 2), 19845bd8166SDavid Virag MUX(CLK_MOUT_CORE_G3D, "mout_core_g3d", mout_core_g3d_p, 19945bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_CORE_G3D, 0, 2), 20045bd8166SDavid Virag 20145bd8166SDavid Virag /* PERI */ 20245bd8166SDavid Virag MUX(CLK_MOUT_PERI_BUS, "mout_peri_bus", mout_peri_bus_p, 20345bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_BUS, 0, 1), 20445bd8166SDavid Virag MUX(CLK_MOUT_PERI_SPI0, "mout_peri_spi0", mout_peri_spi0_p, 20545bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_SPI0, 0, 1), 20645bd8166SDavid Virag MUX(CLK_MOUT_PERI_SPI1, "mout_peri_spi1", mout_peri_spi1_p, 20745bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_SPI1, 0, 1), 20845bd8166SDavid Virag MUX(CLK_MOUT_PERI_UART0, "mout_peri_uart0", mout_peri_uart0_p, 20945bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_UART0, 0, 1), 21045bd8166SDavid Virag MUX(CLK_MOUT_PERI_UART1, "mout_peri_uart1", mout_peri_uart1_p, 21145bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_UART1, 0, 1), 21245bd8166SDavid Virag MUX(CLK_MOUT_PERI_UART2, "mout_peri_uart2", mout_peri_uart2_p, 21345bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_UART2, 0, 1), 21445bd8166SDavid Virag MUX(CLK_MOUT_PERI_USI0, "mout_peri_usi0", mout_peri_usi0_p, 21545bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_USI0, 0, 1), 21645bd8166SDavid Virag MUX(CLK_MOUT_PERI_USI1, "mout_peri_usi1", mout_peri_usi1_p, 21745bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_USI1, 0, 1), 21845bd8166SDavid Virag MUX(CLK_MOUT_PERI_USI2, "mout_peri_usi2", mout_peri_usi2_p, 21945bd8166SDavid Virag CLK_CON_MUX_MUX_CLKCMU_PERI_USI2, 0, 1), 220f392db97SDavid Virag 221f392db97SDavid Virag /* FSYS */ 222f392db97SDavid Virag MUX(CLK_MOUT_FSYS_BUS, "mout_fsys_bus", mout_fsys_bus_p, 223f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_BUS, 0, 1), 224f392db97SDavid Virag MUX(CLK_MOUT_FSYS_MMC_CARD, "mout_fsys_mmc_card", mout_fsys_mmc_card_p, 225f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_CARD, 0, 1), 226f392db97SDavid Virag MUX(CLK_MOUT_FSYS_MMC_EMBD, "mout_fsys_mmc_embd", mout_fsys_mmc_embd_p, 227f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_EMBD, 0, 1), 228f392db97SDavid Virag MUX(CLK_MOUT_FSYS_MMC_SDIO, "mout_fsys_mmc_sdio", mout_fsys_mmc_sdio_p, 229f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_SDIO, 0, 1), 230f392db97SDavid Virag MUX(CLK_MOUT_FSYS_USB30DRD, "mout_fsys_usb30drd", mout_fsys_usb30drd_p, 231f392db97SDavid Virag CLK_CON_MUX_MUX_CLKCMU_FSYS_USB30DRD, 0, 1), 23245bd8166SDavid Virag }; 23345bd8166SDavid Virag 23445bd8166SDavid Virag static const struct samsung_div_clock top_div_clks[] __initconst = { 23545bd8166SDavid Virag /* TOP */ 23645bd8166SDavid Virag DIV(CLK_DOUT_SHARED0_DIV2, "dout_shared0_div2", "fout_shared0_pll", 23745bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV2, 0, 1), 23845bd8166SDavid Virag DIV(CLK_DOUT_SHARED0_DIV3, "dout_shared0_div3", "fout_shared0_pll", 23945bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV3, 0, 2), 240ef80c95cSDavid Virag DIV(CLK_DOUT_SHARED0_DIV4, "dout_shared0_div4", "dout_shared0_div2", 24145bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV4, 0, 1), 24245bd8166SDavid Virag DIV(CLK_DOUT_SHARED0_DIV5, "dout_shared0_div5", "fout_shared0_pll", 24345bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED0_DIV5, 0, 3), 24445bd8166SDavid Virag DIV(CLK_DOUT_SHARED1_DIV2, "dout_shared1_div2", "fout_shared1_pll", 24545bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED1_DIV2, 0, 1), 24645bd8166SDavid Virag DIV(CLK_DOUT_SHARED1_DIV3, "dout_shared1_div3", "fout_shared1_pll", 24745bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED1_DIV3, 0, 2), 248ef80c95cSDavid Virag DIV(CLK_DOUT_SHARED1_DIV4, "dout_shared1_div4", "dout_shared1_div2", 24945bd8166SDavid Virag CLK_CON_DIV_PLL_SHARED1_DIV4, 0, 1), 25045bd8166SDavid Virag 25145bd8166SDavid Virag /* CORE */ 25245bd8166SDavid Virag DIV(CLK_DOUT_CORE_BUS, "dout_core_bus", "gout_core_bus", 25345bd8166SDavid Virag CLK_CON_DIV_CLKCMU_CORE_BUS, 0, 3), 25445bd8166SDavid Virag DIV(CLK_DOUT_CORE_CCI, "dout_core_cci", "gout_core_cci", 25545bd8166SDavid Virag CLK_CON_DIV_CLKCMU_CORE_CCI, 0, 3), 25645bd8166SDavid Virag DIV(CLK_DOUT_CORE_G3D, "dout_core_g3d", "gout_core_g3d", 25745bd8166SDavid Virag CLK_CON_DIV_CLKCMU_CORE_G3D, 0, 3), 25845bd8166SDavid Virag 25945bd8166SDavid Virag /* PERI */ 26045bd8166SDavid Virag DIV(CLK_DOUT_PERI_BUS, "dout_peri_bus", "gout_peri_bus", 26145bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_BUS, 0, 4), 26245bd8166SDavid Virag DIV(CLK_DOUT_PERI_SPI0, "dout_peri_spi0", "gout_peri_spi0", 26345bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_SPI0, 0, 6), 26445bd8166SDavid Virag DIV(CLK_DOUT_PERI_SPI1, "dout_peri_spi1", "gout_peri_spi1", 26545bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_SPI1, 0, 6), 26645bd8166SDavid Virag DIV(CLK_DOUT_PERI_UART0, "dout_peri_uart0", "gout_peri_uart0", 26745bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_UART0, 0, 4), 26845bd8166SDavid Virag DIV(CLK_DOUT_PERI_UART1, "dout_peri_uart1", "gout_peri_uart1", 26945bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_UART1, 0, 4), 27045bd8166SDavid Virag DIV(CLK_DOUT_PERI_UART2, "dout_peri_uart2", "gout_peri_uart2", 27145bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_UART2, 0, 4), 27245bd8166SDavid Virag DIV(CLK_DOUT_PERI_USI0, "dout_peri_usi0", "gout_peri_usi0", 27345bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_USI0, 0, 4), 27445bd8166SDavid Virag DIV(CLK_DOUT_PERI_USI1, "dout_peri_usi1", "gout_peri_usi1", 27545bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_USI1, 0, 4), 27645bd8166SDavid Virag DIV(CLK_DOUT_PERI_USI2, "dout_peri_usi2", "gout_peri_usi2", 27745bd8166SDavid Virag CLK_CON_DIV_CLKCMU_PERI_USI2, 0, 4), 278f392db97SDavid Virag 279f392db97SDavid Virag /* FSYS */ 280f392db97SDavid Virag DIV(CLK_DOUT_FSYS_BUS, "dout_fsys_bus", "gout_fsys_bus", 281f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_BUS, 0, 4), 282f392db97SDavid Virag DIV(CLK_DOUT_FSYS_MMC_CARD, "dout_fsys_mmc_card", "gout_fsys_mmc_card", 283f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_MMC_CARD, 0, 9), 284f392db97SDavid Virag DIV(CLK_DOUT_FSYS_MMC_EMBD, "dout_fsys_mmc_embd", "gout_fsys_mmc_embd", 285f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_MMC_EMBD, 0, 9), 286f392db97SDavid Virag DIV(CLK_DOUT_FSYS_MMC_SDIO, "dout_fsys_mmc_sdio", "gout_fsys_mmc_sdio", 287f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_MMC_SDIO, 0, 9), 288f392db97SDavid Virag DIV(CLK_DOUT_FSYS_USB30DRD, "dout_fsys_usb30drd", "gout_fsys_usb30drd", 289f392db97SDavid Virag CLK_CON_DIV_CLKCMU_FSYS_USB30DRD, 0, 4), 29045bd8166SDavid Virag }; 29145bd8166SDavid Virag 29245bd8166SDavid Virag static const struct samsung_gate_clock top_gate_clks[] __initconst = { 29345bd8166SDavid Virag /* CORE */ 29445bd8166SDavid Virag GATE(CLK_GOUT_CORE_BUS, "gout_core_bus", "mout_core_bus", 29545bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_CORE_BUS, 21, 0, 0), 29645bd8166SDavid Virag GATE(CLK_GOUT_CORE_CCI, "gout_core_cci", "mout_core_cci", 29745bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_CORE_CCI, 21, 0, 0), 29845bd8166SDavid Virag GATE(CLK_GOUT_CORE_G3D, "gout_core_g3d", "mout_core_g3d", 29945bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_CORE_G3D, 21, 0, 0), 30045bd8166SDavid Virag 30145bd8166SDavid Virag /* PERI */ 30245bd8166SDavid Virag GATE(CLK_GOUT_PERI_BUS, "gout_peri_bus", "mout_peri_bus", 30345bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_BUS, 21, 0, 0), 30445bd8166SDavid Virag GATE(CLK_GOUT_PERI_SPI0, "gout_peri_spi0", "mout_peri_spi0", 30545bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_SPI0, 21, 0, 0), 30645bd8166SDavid Virag GATE(CLK_GOUT_PERI_SPI1, "gout_peri_spi1", "mout_peri_spi1", 30745bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_SPI1, 21, 0, 0), 30845bd8166SDavid Virag GATE(CLK_GOUT_PERI_UART0, "gout_peri_uart0", "mout_peri_uart0", 30945bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_UART0, 21, 0, 0), 31045bd8166SDavid Virag GATE(CLK_GOUT_PERI_UART1, "gout_peri_uart1", "mout_peri_uart1", 31145bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMUC_PERI_UART1, 21, 0, 0), 31245bd8166SDavid Virag GATE(CLK_GOUT_PERI_UART2, "gout_peri_uart2", "mout_peri_uart2", 31345bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_UART2, 21, 0, 0), 31445bd8166SDavid Virag GATE(CLK_GOUT_PERI_USI0, "gout_peri_usi0", "mout_peri_usi0", 31545bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_USI0, 21, 0, 0), 31645bd8166SDavid Virag GATE(CLK_GOUT_PERI_USI1, "gout_peri_usi1", "mout_peri_usi1", 31745bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_USI1, 21, 0, 0), 31845bd8166SDavid Virag GATE(CLK_GOUT_PERI_USI2, "gout_peri_usi2", "mout_peri_usi2", 31945bd8166SDavid Virag CLK_CON_GAT_GATE_CLKCMU_PERI_USI2, 21, 0, 0), 320f392db97SDavid Virag 321f392db97SDavid Virag /* FSYS */ 322f392db97SDavid Virag GATE(CLK_GOUT_FSYS_BUS, "gout_fsys_bus", "mout_fsys_bus", 323f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_BUS, 21, 0, 0), 324f392db97SDavid Virag GATE(CLK_GOUT_FSYS_MMC_CARD, "gout_fsys_mmc_card", "mout_fsys_mmc_card", 325f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_CARD, 21, 0, 0), 326f392db97SDavid Virag GATE(CLK_GOUT_FSYS_MMC_EMBD, "gout_fsys_mmc_embd", "mout_fsys_mmc_embd", 327f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_EMBD, 21, 0, 0), 328f392db97SDavid Virag GATE(CLK_GOUT_FSYS_MMC_SDIO, "gout_fsys_mmc_sdio", "mout_fsys_mmc_sdio", 329f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_SDIO, 21, 0, 0), 330f392db97SDavid Virag GATE(CLK_GOUT_FSYS_USB30DRD, "gout_fsys_usb30drd", "mout_fsys_usb30drd", 331f392db97SDavid Virag CLK_CON_GAT_GATE_CLKCMU_FSYS_USB30DRD, 21, 0, 0), 33245bd8166SDavid Virag }; 33345bd8166SDavid Virag 33445bd8166SDavid Virag static const struct samsung_cmu_info top_cmu_info __initconst = { 33545bd8166SDavid Virag .pll_clks = top_pll_clks, 33645bd8166SDavid Virag .nr_pll_clks = ARRAY_SIZE(top_pll_clks), 33745bd8166SDavid Virag .mux_clks = top_mux_clks, 33845bd8166SDavid Virag .nr_mux_clks = ARRAY_SIZE(top_mux_clks), 33945bd8166SDavid Virag .div_clks = top_div_clks, 34045bd8166SDavid Virag .nr_div_clks = ARRAY_SIZE(top_div_clks), 34145bd8166SDavid Virag .gate_clks = top_gate_clks, 34245bd8166SDavid Virag .nr_gate_clks = ARRAY_SIZE(top_gate_clks), 343*ef4923c8SKrzysztof Kozlowski .nr_clk_ids = CLKS_NR_TOP, 34445bd8166SDavid Virag .clk_regs = top_clk_regs, 34545bd8166SDavid Virag .nr_clk_regs = ARRAY_SIZE(top_clk_regs), 34645bd8166SDavid Virag }; 34745bd8166SDavid Virag 34845bd8166SDavid Virag static void __init exynos7885_cmu_top_init(struct device_node *np) 34945bd8166SDavid Virag { 35045bd8166SDavid Virag exynos_arm64_register_cmu(NULL, np, &top_cmu_info); 35145bd8166SDavid Virag } 35245bd8166SDavid Virag 35345bd8166SDavid Virag /* Register CMU_TOP early, as it's a dependency for other early domains */ 35445bd8166SDavid Virag CLK_OF_DECLARE(exynos7885_cmu_top, "samsung,exynos7885-cmu-top", 35545bd8166SDavid Virag exynos7885_cmu_top_init); 35645bd8166SDavid Virag 35745bd8166SDavid Virag /* ---- CMU_PERI ------------------------------------------------------------ */ 35845bd8166SDavid Virag 35945bd8166SDavid Virag /* Register Offset definitions for CMU_PERI (0x10010000) */ 36045bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_BUS_USER 0x0100 36145bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_SPI0_USER 0x0120 36245bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_SPI1_USER 0x0140 36345bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_UART0_USER 0x0160 36445bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_UART1_USER 0x0180 36545bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_UART2_USER 0x01a0 36645bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_USI0_USER 0x01c0 36745bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_USI1_USER 0x01e0 36845bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_PERI_USI2_USER 0x0200 36945bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_GPIO_TOP_PCLK 0x2024 37045bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_HSI2C_0_PCLK 0x2028 37145bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_HSI2C_1_PCLK 0x202c 37245bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_HSI2C_2_PCLK 0x2030 37345bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_HSI2C_3_PCLK 0x2034 37445bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_0_PCLK 0x2038 37545bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_1_PCLK 0x203c 37645bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_2_PCLK 0x2040 37745bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_3_PCLK 0x2044 37845bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_4_PCLK 0x2048 37945bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_5_PCLK 0x204c 38045bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_6_PCLK 0x2050 38145bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_I2C_7_PCLK 0x2054 38245bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_PWM_MOTOR_PCLK 0x2058 38345bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_SPI_0_PCLK 0x205c 38445bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_SPI_0_EXT_CLK 0x2060 38545bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_SPI_1_PCLK 0x2064 38645bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_SPI_1_EXT_CLK 0x2068 38745bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_UART_0_EXT_UCLK 0x206c 38845bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_UART_0_PCLK 0x2070 38945bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_UART_1_EXT_UCLK 0x2074 39045bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_UART_1_PCLK 0x2078 39145bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_UART_2_EXT_UCLK 0x207c 39245bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_UART_2_PCLK 0x2080 39345bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_USI0_PCLK 0x2084 39445bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_USI0_SCLK 0x2088 39545bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_USI1_PCLK 0x208c 39645bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_USI1_SCLK 0x2090 39745bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_USI2_PCLK 0x2094 39845bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_USI2_SCLK 0x2098 39945bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_MCT_PCLK 0x20a0 40045bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_SYSREG_PERI_PCLK 0x20b0 40145bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_WDT_CLUSTER0_PCLK 0x20b4 40245bd8166SDavid Virag #define CLK_CON_GAT_GOUT_PERI_WDT_CLUSTER1_PCLK 0x20b8 40345bd8166SDavid Virag 40445bd8166SDavid Virag static const unsigned long peri_clk_regs[] __initconst = { 40545bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_BUS_USER, 40645bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_SPI0_USER, 40745bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_SPI1_USER, 40845bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_UART0_USER, 40945bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_UART1_USER, 41045bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_UART2_USER, 41145bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_USI0_USER, 41245bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_USI1_USER, 41345bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_USI2_USER, 41445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_GPIO_TOP_PCLK, 41545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_0_PCLK, 41645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_1_PCLK, 41745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_2_PCLK, 41845bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_3_PCLK, 41945bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_0_PCLK, 42045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_1_PCLK, 42145bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_2_PCLK, 42245bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_3_PCLK, 42345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_4_PCLK, 42445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_5_PCLK, 42545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_6_PCLK, 42645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_7_PCLK, 42745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_PWM_MOTOR_PCLK, 42845bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_0_PCLK, 42945bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_0_EXT_CLK, 43045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_1_PCLK, 43145bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_1_EXT_CLK, 43245bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_0_EXT_UCLK, 43345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_0_PCLK, 43445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_1_EXT_UCLK, 43545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_1_PCLK, 43645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_2_EXT_UCLK, 43745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_2_PCLK, 43845bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI0_PCLK, 43945bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI0_SCLK, 44045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI1_PCLK, 44145bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI1_SCLK, 44245bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI2_PCLK, 44345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI2_SCLK, 44445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_MCT_PCLK, 44545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SYSREG_PERI_PCLK, 44645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_WDT_CLUSTER0_PCLK, 44745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_WDT_CLUSTER1_PCLK, 44845bd8166SDavid Virag }; 44945bd8166SDavid Virag 45045bd8166SDavid Virag /* List of parent clocks for Muxes in CMU_PERI */ 45145bd8166SDavid Virag PNAME(mout_peri_bus_user_p) = { "oscclk", "dout_peri_bus" }; 45245bd8166SDavid Virag PNAME(mout_peri_spi0_user_p) = { "oscclk", "dout_peri_spi0" }; 45345bd8166SDavid Virag PNAME(mout_peri_spi1_user_p) = { "oscclk", "dout_peri_spi1" }; 45445bd8166SDavid Virag PNAME(mout_peri_uart0_user_p) = { "oscclk", "dout_peri_uart0" }; 45545bd8166SDavid Virag PNAME(mout_peri_uart1_user_p) = { "oscclk", "dout_peri_uart1" }; 45645bd8166SDavid Virag PNAME(mout_peri_uart2_user_p) = { "oscclk", "dout_peri_uart2" }; 45745bd8166SDavid Virag PNAME(mout_peri_usi0_user_p) = { "oscclk", "dout_peri_usi0" }; 45845bd8166SDavid Virag PNAME(mout_peri_usi1_user_p) = { "oscclk", "dout_peri_usi1" }; 45945bd8166SDavid Virag PNAME(mout_peri_usi2_user_p) = { "oscclk", "dout_peri_usi2" }; 46045bd8166SDavid Virag 46145bd8166SDavid Virag static const struct samsung_mux_clock peri_mux_clks[] __initconst = { 46245bd8166SDavid Virag MUX(CLK_MOUT_PERI_BUS_USER, "mout_peri_bus_user", mout_peri_bus_user_p, 46345bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_BUS_USER, 4, 1), 46445bd8166SDavid Virag MUX(CLK_MOUT_PERI_SPI0_USER, "mout_peri_spi0_user", mout_peri_spi0_user_p, 46545bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_SPI0_USER, 4, 1), 46645bd8166SDavid Virag MUX(CLK_MOUT_PERI_SPI1_USER, "mout_peri_spi1_user", mout_peri_spi1_user_p, 46745bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_PERI_SPI1_USER, 4, 1), 46845bd8166SDavid Virag MUX(CLK_MOUT_PERI_UART0_USER, "mout_peri_uart0_user", 46945bd8166SDavid Virag mout_peri_uart0_user_p, PLL_CON0_MUX_CLKCMU_PERI_UART0_USER, 4, 1), 47045bd8166SDavid Virag MUX(CLK_MOUT_PERI_UART1_USER, "mout_peri_uart1_user", 47145bd8166SDavid Virag mout_peri_uart1_user_p, PLL_CON0_MUX_CLKCMU_PERI_UART1_USER, 4, 1), 47245bd8166SDavid Virag MUX(CLK_MOUT_PERI_UART2_USER, "mout_peri_uart2_user", 47345bd8166SDavid Virag mout_peri_uart2_user_p, PLL_CON0_MUX_CLKCMU_PERI_UART2_USER, 4, 1), 47445bd8166SDavid Virag MUX(CLK_MOUT_PERI_USI0_USER, "mout_peri_usi0_user", 47545bd8166SDavid Virag mout_peri_usi0_user_p, PLL_CON0_MUX_CLKCMU_PERI_USI0_USER, 4, 1), 47645bd8166SDavid Virag MUX(CLK_MOUT_PERI_USI1_USER, "mout_peri_usi1_user", 47745bd8166SDavid Virag mout_peri_usi1_user_p, PLL_CON0_MUX_CLKCMU_PERI_USI1_USER, 4, 1), 47845bd8166SDavid Virag MUX(CLK_MOUT_PERI_USI2_USER, "mout_peri_usi2_user", 47945bd8166SDavid Virag mout_peri_usi2_user_p, PLL_CON0_MUX_CLKCMU_PERI_USI2_USER, 4, 1), 48045bd8166SDavid Virag }; 48145bd8166SDavid Virag 48245bd8166SDavid Virag static const struct samsung_gate_clock peri_gate_clks[] __initconst = { 48345bd8166SDavid Virag /* TODO: Should be enabled in GPIO driver (or made CLK_IS_CRITICAL) */ 48445bd8166SDavid Virag GATE(CLK_GOUT_GPIO_TOP_PCLK, "gout_gpio_top_pclk", 48545bd8166SDavid Virag "mout_peri_bus_user", 48645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_GPIO_TOP_PCLK, 21, CLK_IGNORE_UNUSED, 0), 48745bd8166SDavid Virag GATE(CLK_GOUT_HSI2C0_PCLK, "gout_hsi2c0_pclk", "mout_peri_bus_user", 48845bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_0_PCLK, 21, 0, 0), 48945bd8166SDavid Virag GATE(CLK_GOUT_HSI2C1_PCLK, "gout_hsi2c1_pclk", "mout_peri_bus_user", 49045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_1_PCLK, 21, 0, 0), 49145bd8166SDavid Virag GATE(CLK_GOUT_HSI2C2_PCLK, "gout_hsi2c2_pclk", "mout_peri_bus_user", 49245bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_2_PCLK, 21, 0, 0), 49345bd8166SDavid Virag GATE(CLK_GOUT_HSI2C3_PCLK, "gout_hsi2c3_pclk", "mout_peri_bus_user", 49445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_HSI2C_3_PCLK, 21, 0, 0), 49545bd8166SDavid Virag GATE(CLK_GOUT_I2C0_PCLK, "gout_i2c0_pclk", "mout_peri_bus_user", 49645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_0_PCLK, 21, 0, 0), 49745bd8166SDavid Virag GATE(CLK_GOUT_I2C1_PCLK, "gout_i2c1_pclk", "mout_peri_bus_user", 49845bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_1_PCLK, 21, 0, 0), 49945bd8166SDavid Virag GATE(CLK_GOUT_I2C2_PCLK, "gout_i2c2_pclk", "mout_peri_bus_user", 50045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_2_PCLK, 21, 0, 0), 50145bd8166SDavid Virag GATE(CLK_GOUT_I2C3_PCLK, "gout_i2c3_pclk", "mout_peri_bus_user", 50245bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_3_PCLK, 21, 0, 0), 50345bd8166SDavid Virag GATE(CLK_GOUT_I2C4_PCLK, "gout_i2c4_pclk", "mout_peri_bus_user", 50445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_4_PCLK, 21, 0, 0), 50545bd8166SDavid Virag GATE(CLK_GOUT_I2C5_PCLK, "gout_i2c5_pclk", "mout_peri_bus_user", 50645bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_5_PCLK, 21, 0, 0), 50745bd8166SDavid Virag GATE(CLK_GOUT_I2C6_PCLK, "gout_i2c6_pclk", "mout_peri_bus_user", 50845bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_6_PCLK, 21, 0, 0), 50945bd8166SDavid Virag GATE(CLK_GOUT_I2C7_PCLK, "gout_i2c7_pclk", "mout_peri_bus_user", 51045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_I2C_7_PCLK, 21, 0, 0), 51145bd8166SDavid Virag GATE(CLK_GOUT_PWM_MOTOR_PCLK, "gout_pwm_motor_pclk", 51245bd8166SDavid Virag "mout_peri_bus_user", 51345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_PWM_MOTOR_PCLK, 21, 0, 0), 51445bd8166SDavid Virag GATE(CLK_GOUT_SPI0_PCLK, "gout_spi0_pclk", "mout_peri_bus_user", 51545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_0_PCLK, 21, 0, 0), 51645bd8166SDavid Virag GATE(CLK_GOUT_SPI0_EXT_CLK, "gout_spi0_ipclk", "mout_peri_spi0_user", 51745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_0_EXT_CLK, 21, 0, 0), 51845bd8166SDavid Virag GATE(CLK_GOUT_SPI1_PCLK, "gout_spi1_pclk", "mout_peri_bus_user", 51945bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_1_PCLK, 21, 0, 0), 52045bd8166SDavid Virag GATE(CLK_GOUT_SPI1_EXT_CLK, "gout_spi1_ipclk", "mout_peri_spi1_user", 52145bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SPI_1_EXT_CLK, 21, 0, 0), 52245bd8166SDavid Virag GATE(CLK_GOUT_UART0_EXT_UCLK, "gout_uart0_ext_uclk", "mout_peri_uart0_user", 52345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_0_EXT_UCLK, 21, 0, 0), 52445bd8166SDavid Virag GATE(CLK_GOUT_UART0_PCLK, "gout_uart0_pclk", "mout_peri_bus_user", 52545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_0_PCLK, 21, 0, 0), 52645bd8166SDavid Virag GATE(CLK_GOUT_UART1_EXT_UCLK, "gout_uart1_ext_uclk", "mout_peri_uart1_user", 52745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_1_EXT_UCLK, 21, 0, 0), 52845bd8166SDavid Virag GATE(CLK_GOUT_UART1_PCLK, "gout_uart1_pclk", "mout_peri_bus_user", 52945bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_1_PCLK, 21, 0, 0), 53045bd8166SDavid Virag GATE(CLK_GOUT_UART2_EXT_UCLK, "gout_uart2_ext_uclk", "mout_peri_uart2_user", 53145bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_2_EXT_UCLK, 21, 0, 0), 53245bd8166SDavid Virag GATE(CLK_GOUT_UART2_PCLK, "gout_uart2_pclk", "mout_peri_bus_user", 53345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_UART_2_PCLK, 21, 0, 0), 53445bd8166SDavid Virag GATE(CLK_GOUT_USI0_PCLK, "gout_usi0_pclk", "mout_peri_bus_user", 53545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI0_PCLK, 21, 0, 0), 53645bd8166SDavid Virag GATE(CLK_GOUT_USI0_SCLK, "gout_usi0_sclk", "mout_peri_usi0_user", 53745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI0_SCLK, 21, 0, 0), 53845bd8166SDavid Virag GATE(CLK_GOUT_USI1_PCLK, "gout_usi1_pclk", "mout_peri_bus_user", 53945bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI1_PCLK, 21, 0, 0), 54045bd8166SDavid Virag GATE(CLK_GOUT_USI1_SCLK, "gout_usi1_sclk", "mout_peri_usi1_user", 54145bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI1_SCLK, 21, 0, 0), 54245bd8166SDavid Virag GATE(CLK_GOUT_USI2_PCLK, "gout_usi2_pclk", "mout_peri_bus_user", 54345bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI2_PCLK, 21, 0, 0), 54445bd8166SDavid Virag GATE(CLK_GOUT_USI2_SCLK, "gout_usi2_sclk", "mout_peri_usi2_user", 54545bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_USI2_SCLK, 21, 0, 0), 54645bd8166SDavid Virag GATE(CLK_GOUT_MCT_PCLK, "gout_mct_pclk", "mout_peri_bus_user", 54745bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_MCT_PCLK, 21, 0, 0), 54845bd8166SDavid Virag GATE(CLK_GOUT_SYSREG_PERI_PCLK, "gout_sysreg_peri_pclk", 54945bd8166SDavid Virag "mout_peri_bus_user", 55045bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_SYSREG_PERI_PCLK, 21, 0, 0), 55145bd8166SDavid Virag GATE(CLK_GOUT_WDT0_PCLK, "gout_wdt0_pclk", "mout_peri_bus_user", 55245bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_WDT_CLUSTER0_PCLK, 21, 0, 0), 55345bd8166SDavid Virag GATE(CLK_GOUT_WDT1_PCLK, "gout_wdt1_pclk", "mout_peri_bus_user", 55445bd8166SDavid Virag CLK_CON_GAT_GOUT_PERI_WDT_CLUSTER1_PCLK, 21, 0, 0), 55545bd8166SDavid Virag }; 55645bd8166SDavid Virag 55745bd8166SDavid Virag static const struct samsung_cmu_info peri_cmu_info __initconst = { 55845bd8166SDavid Virag .mux_clks = peri_mux_clks, 55945bd8166SDavid Virag .nr_mux_clks = ARRAY_SIZE(peri_mux_clks), 56045bd8166SDavid Virag .gate_clks = peri_gate_clks, 56145bd8166SDavid Virag .nr_gate_clks = ARRAY_SIZE(peri_gate_clks), 562*ef4923c8SKrzysztof Kozlowski .nr_clk_ids = CLKS_NR_PERI, 56345bd8166SDavid Virag .clk_regs = peri_clk_regs, 56445bd8166SDavid Virag .nr_clk_regs = ARRAY_SIZE(peri_clk_regs), 56545bd8166SDavid Virag .clk_name = "dout_peri_bus", 56645bd8166SDavid Virag }; 56745bd8166SDavid Virag 56845bd8166SDavid Virag static void __init exynos7885_cmu_peri_init(struct device_node *np) 56945bd8166SDavid Virag { 57045bd8166SDavid Virag exynos_arm64_register_cmu(NULL, np, &peri_cmu_info); 57145bd8166SDavid Virag } 57245bd8166SDavid Virag 57345bd8166SDavid Virag /* Register CMU_PERI early, as it's needed for MCT timer */ 57445bd8166SDavid Virag CLK_OF_DECLARE(exynos7885_cmu_peri, "samsung,exynos7885-cmu-peri", 57545bd8166SDavid Virag exynos7885_cmu_peri_init); 57645bd8166SDavid Virag 57745bd8166SDavid Virag /* ---- CMU_CORE ------------------------------------------------------------ */ 57845bd8166SDavid Virag 57945bd8166SDavid Virag /* Register Offset definitions for CMU_CORE (0x12000000) */ 58045bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_CORE_BUS_USER 0x0100 58145bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_CORE_CCI_USER 0x0120 58245bd8166SDavid Virag #define PLL_CON0_MUX_CLKCMU_CORE_G3D_USER 0x0140 58345bd8166SDavid Virag #define CLK_CON_MUX_MUX_CLK_CORE_GIC 0x1000 58445bd8166SDavid Virag #define CLK_CON_DIV_DIV_CLK_CORE_BUSP 0x1800 58545bd8166SDavid Virag #define CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK 0x2054 58645bd8166SDavid Virag #define CLK_CON_GAT_GOUT_CORE_GIC400_CLK 0x2058 5870e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_ACLK 0x215c 5880e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_GCLK 0x2160 5890e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_PCLK 0x2164 5900e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_ACLK_P_CORE 0x2168 5910e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_CCLK_P_CORE 0x216c 5920e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK 0x2170 5930e1b2f1fSDavid Virag #define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK_P_CORE 0x2174 59445bd8166SDavid Virag 59545bd8166SDavid Virag static const unsigned long core_clk_regs[] __initconst = { 59645bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_CORE_BUS_USER, 59745bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_CORE_CCI_USER, 59845bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_CORE_G3D_USER, 59945bd8166SDavid Virag CLK_CON_MUX_MUX_CLK_CORE_GIC, 60045bd8166SDavid Virag CLK_CON_DIV_DIV_CLK_CORE_BUSP, 60145bd8166SDavid Virag CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK, 60245bd8166SDavid Virag CLK_CON_GAT_GOUT_CORE_GIC400_CLK, 6030e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_ACLK, 6040e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_GCLK, 6050e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_PCLK, 6060e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_ACLK_P_CORE, 6070e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_CCLK_P_CORE, 6080e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK, 6090e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK_P_CORE, 61045bd8166SDavid Virag }; 61145bd8166SDavid Virag 61245bd8166SDavid Virag /* List of parent clocks for Muxes in CMU_CORE */ 61345bd8166SDavid Virag PNAME(mout_core_bus_user_p) = { "oscclk", "dout_core_bus" }; 61445bd8166SDavid Virag PNAME(mout_core_cci_user_p) = { "oscclk", "dout_core_cci" }; 61545bd8166SDavid Virag PNAME(mout_core_g3d_user_p) = { "oscclk", "dout_core_g3d" }; 61645bd8166SDavid Virag PNAME(mout_core_gic_p) = { "dout_core_busp", "oscclk" }; 61745bd8166SDavid Virag 61845bd8166SDavid Virag static const struct samsung_mux_clock core_mux_clks[] __initconst = { 61945bd8166SDavid Virag MUX(CLK_MOUT_CORE_BUS_USER, "mout_core_bus_user", mout_core_bus_user_p, 62045bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_CORE_BUS_USER, 4, 1), 62145bd8166SDavid Virag MUX(CLK_MOUT_CORE_CCI_USER, "mout_core_cci_user", mout_core_cci_user_p, 62245bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_CORE_CCI_USER, 4, 1), 62345bd8166SDavid Virag MUX(CLK_MOUT_CORE_G3D_USER, "mout_core_g3d_user", mout_core_g3d_user_p, 62445bd8166SDavid Virag PLL_CON0_MUX_CLKCMU_CORE_G3D_USER, 4, 1), 62545bd8166SDavid Virag MUX(CLK_MOUT_CORE_GIC, "mout_core_gic", mout_core_gic_p, 62645bd8166SDavid Virag CLK_CON_MUX_MUX_CLK_CORE_GIC, 0, 1), 62745bd8166SDavid Virag }; 62845bd8166SDavid Virag 62945bd8166SDavid Virag static const struct samsung_div_clock core_div_clks[] __initconst = { 63045bd8166SDavid Virag DIV(CLK_DOUT_CORE_BUSP, "dout_core_busp", "mout_core_bus_user", 63145bd8166SDavid Virag CLK_CON_DIV_DIV_CLK_CORE_BUSP, 0, 2), 63245bd8166SDavid Virag }; 63345bd8166SDavid Virag 63445bd8166SDavid Virag static const struct samsung_gate_clock core_gate_clks[] __initconst = { 63545bd8166SDavid Virag /* CCI (interconnect) clock must be always running */ 63645bd8166SDavid Virag GATE(CLK_GOUT_CCI_ACLK, "gout_cci_aclk", "mout_core_cci_user", 63745bd8166SDavid Virag CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK, 21, CLK_IS_CRITICAL, 0), 63845bd8166SDavid Virag /* GIC (interrupt controller) clock must be always running */ 63945bd8166SDavid Virag GATE(CLK_GOUT_GIC400_CLK, "gout_gic400_clk", "mout_core_gic", 64045bd8166SDavid Virag CLK_CON_GAT_GOUT_CORE_GIC400_CLK, 21, CLK_IS_CRITICAL, 0), 6410e1b2f1fSDavid Virag /* 6420e1b2f1fSDavid Virag * TREX D and P Core (seems to be related to "bus traffic shaper") 6430e1b2f1fSDavid Virag * clocks must always be running 6440e1b2f1fSDavid Virag */ 6450e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_D_CORE_ACLK, "gout_trex_d_core_aclk", "mout_core_bus_user", 6460e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_ACLK, 21, CLK_IS_CRITICAL, 0), 6470e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_D_CORE_GCLK, "gout_trex_d_core_gclk", "mout_core_g3d_user", 6480e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_GCLK, 21, CLK_IS_CRITICAL, 0), 6490e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_D_CORE_PCLK, "gout_trex_d_core_pclk", "dout_core_busp", 6500e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_PCLK, 21, CLK_IS_CRITICAL, 0), 6510e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_P_CORE_ACLK_P_CORE, "gout_trex_p_core_aclk_p_core", 6520e1b2f1fSDavid Virag "mout_core_bus_user", CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_ACLK_P_CORE, 21, 6530e1b2f1fSDavid Virag CLK_IS_CRITICAL, 0), 6540e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_P_CORE_CCLK_P_CORE, "gout_trex_p_core_cclk_p_core", 6550e1b2f1fSDavid Virag "mout_core_cci_user", CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_CCLK_P_CORE, 21, 6560e1b2f1fSDavid Virag CLK_IS_CRITICAL, 0), 6570e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_P_CORE_PCLK, "gout_trex_p_core_pclk", "dout_core_busp", 6580e1b2f1fSDavid Virag CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK, 21, CLK_IS_CRITICAL, 0), 6590e1b2f1fSDavid Virag GATE(CLK_GOUT_TREX_P_CORE_PCLK_P_CORE, "gout_trex_p_core_pclk_p_core", 6600e1b2f1fSDavid Virag "dout_core_busp", CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK_P_CORE, 21, 6610e1b2f1fSDavid Virag CLK_IS_CRITICAL, 0), 66245bd8166SDavid Virag }; 66345bd8166SDavid Virag 66445bd8166SDavid Virag static const struct samsung_cmu_info core_cmu_info __initconst = { 66545bd8166SDavid Virag .mux_clks = core_mux_clks, 66645bd8166SDavid Virag .nr_mux_clks = ARRAY_SIZE(core_mux_clks), 66745bd8166SDavid Virag .div_clks = core_div_clks, 66845bd8166SDavid Virag .nr_div_clks = ARRAY_SIZE(core_div_clks), 66945bd8166SDavid Virag .gate_clks = core_gate_clks, 67045bd8166SDavid Virag .nr_gate_clks = ARRAY_SIZE(core_gate_clks), 671*ef4923c8SKrzysztof Kozlowski .nr_clk_ids = CLKS_NR_CORE, 67245bd8166SDavid Virag .clk_regs = core_clk_regs, 67345bd8166SDavid Virag .nr_clk_regs = ARRAY_SIZE(core_clk_regs), 67445bd8166SDavid Virag .clk_name = "dout_core_bus", 67545bd8166SDavid Virag }; 67645bd8166SDavid Virag 677f392db97SDavid Virag /* ---- CMU_FSYS ------------------------------------------------------------ */ 678f392db97SDavid Virag 679f392db97SDavid Virag /* Register Offset definitions for CMU_FSYS (0x13400000) */ 680f392db97SDavid Virag #define PLL_CON0_MUX_CLKCMU_FSYS_BUS_USER 0x0100 681f392db97SDavid Virag #define PLL_CON0_MUX_CLKCMU_FSYS_MMC_CARD_USER 0x0120 682f392db97SDavid Virag #define PLL_CON0_MUX_CLKCMU_FSYS_MMC_EMBD_USER 0x0140 683f392db97SDavid Virag #define PLL_CON0_MUX_CLKCMU_FSYS_MMC_SDIO_USER 0x0160 684f392db97SDavid Virag #define PLL_CON0_MUX_CLKCMU_FSYS_USB30DRD_USER 0x0180 685f392db97SDavid Virag #define CLK_CON_GAT_GOUT_FSYS_MMC_CARD_I_ACLK 0x2030 686f392db97SDavid Virag #define CLK_CON_GAT_GOUT_FSYS_MMC_CARD_SDCLKIN 0x2034 687f392db97SDavid Virag #define CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_I_ACLK 0x2038 688f392db97SDavid Virag #define CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_SDCLKIN 0x203c 689f392db97SDavid Virag #define CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_I_ACLK 0x2040 690f392db97SDavid Virag #define CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_SDCLKIN 0x2044 691f392db97SDavid Virag 692f392db97SDavid Virag static const unsigned long fsys_clk_regs[] __initconst = { 693f392db97SDavid Virag PLL_CON0_MUX_CLKCMU_FSYS_BUS_USER, 694f392db97SDavid Virag PLL_CON0_MUX_CLKCMU_FSYS_MMC_CARD_USER, 695f392db97SDavid Virag PLL_CON0_MUX_CLKCMU_FSYS_MMC_EMBD_USER, 696f392db97SDavid Virag PLL_CON0_MUX_CLKCMU_FSYS_MMC_SDIO_USER, 697f392db97SDavid Virag PLL_CON0_MUX_CLKCMU_FSYS_USB30DRD_USER, 698f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_CARD_I_ACLK, 699f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_CARD_SDCLKIN, 700f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_I_ACLK, 701f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_SDCLKIN, 702f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_I_ACLK, 703f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_SDCLKIN, 704f392db97SDavid Virag }; 705f392db97SDavid Virag 706f392db97SDavid Virag /* List of parent clocks for Muxes in CMU_FSYS */ 707f392db97SDavid Virag PNAME(mout_fsys_bus_user_p) = { "oscclk", "dout_fsys_bus" }; 708f392db97SDavid Virag PNAME(mout_fsys_mmc_card_user_p) = { "oscclk", "dout_fsys_mmc_card" }; 709f392db97SDavid Virag PNAME(mout_fsys_mmc_embd_user_p) = { "oscclk", "dout_fsys_mmc_embd" }; 710f392db97SDavid Virag PNAME(mout_fsys_mmc_sdio_user_p) = { "oscclk", "dout_fsys_mmc_sdio" }; 711f392db97SDavid Virag PNAME(mout_fsys_usb30drd_user_p) = { "oscclk", "dout_fsys_usb30drd" }; 712f392db97SDavid Virag 713f392db97SDavid Virag static const struct samsung_mux_clock fsys_mux_clks[] __initconst = { 714f392db97SDavid Virag MUX(CLK_MOUT_FSYS_BUS_USER, "mout_fsys_bus_user", mout_fsys_bus_user_p, 715f392db97SDavid Virag PLL_CON0_MUX_CLKCMU_FSYS_BUS_USER, 4, 1), 716f392db97SDavid Virag MUX_F(CLK_MOUT_FSYS_MMC_CARD_USER, "mout_fsys_mmc_card_user", 717f392db97SDavid Virag mout_fsys_mmc_card_user_p, PLL_CON0_MUX_CLKCMU_FSYS_MMC_CARD_USER, 718f392db97SDavid Virag 4, 1, CLK_SET_RATE_PARENT, 0), 719f392db97SDavid Virag MUX_F(CLK_MOUT_FSYS_MMC_EMBD_USER, "mout_fsys_mmc_embd_user", 720f392db97SDavid Virag mout_fsys_mmc_embd_user_p, PLL_CON0_MUX_CLKCMU_FSYS_MMC_EMBD_USER, 721f392db97SDavid Virag 4, 1, CLK_SET_RATE_PARENT, 0), 722f392db97SDavid Virag MUX_F(CLK_MOUT_FSYS_MMC_SDIO_USER, "mout_fsys_mmc_sdio_user", 723f392db97SDavid Virag mout_fsys_mmc_sdio_user_p, PLL_CON0_MUX_CLKCMU_FSYS_MMC_SDIO_USER, 724f392db97SDavid Virag 4, 1, CLK_SET_RATE_PARENT, 0), 725f392db97SDavid Virag MUX_F(CLK_MOUT_FSYS_USB30DRD_USER, "mout_fsys_usb30drd_user", 726f392db97SDavid Virag mout_fsys_usb30drd_user_p, PLL_CON0_MUX_CLKCMU_FSYS_USB30DRD_USER, 727f392db97SDavid Virag 4, 1, CLK_SET_RATE_PARENT, 0), 728f392db97SDavid Virag }; 729f392db97SDavid Virag 730f392db97SDavid Virag static const struct samsung_gate_clock fsys_gate_clks[] __initconst = { 731f392db97SDavid Virag GATE(CLK_GOUT_MMC_CARD_ACLK, "gout_mmc_card_aclk", "mout_fsys_bus_user", 732f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_CARD_I_ACLK, 21, 0, 0), 733f392db97SDavid Virag GATE(CLK_GOUT_MMC_CARD_SDCLKIN, "gout_mmc_card_sdclkin", 734f392db97SDavid Virag "mout_fsys_mmc_card_user", CLK_CON_GAT_GOUT_FSYS_MMC_CARD_SDCLKIN, 735f392db97SDavid Virag 21, CLK_SET_RATE_PARENT, 0), 736f392db97SDavid Virag GATE(CLK_GOUT_MMC_EMBD_ACLK, "gout_mmc_embd_aclk", "mout_fsys_bus_user", 737f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_I_ACLK, 21, 0, 0), 738f392db97SDavid Virag GATE(CLK_GOUT_MMC_EMBD_SDCLKIN, "gout_mmc_embd_sdclkin", 739f392db97SDavid Virag "mout_fsys_mmc_embd_user", CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_SDCLKIN, 740f392db97SDavid Virag 21, CLK_SET_RATE_PARENT, 0), 741f392db97SDavid Virag GATE(CLK_GOUT_MMC_SDIO_ACLK, "gout_mmc_sdio_aclk", "mout_fsys_bus_user", 742f392db97SDavid Virag CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_I_ACLK, 21, 0, 0), 743f392db97SDavid Virag GATE(CLK_GOUT_MMC_SDIO_SDCLKIN, "gout_mmc_sdio_sdclkin", 744f392db97SDavid Virag "mout_fsys_mmc_sdio_user", CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_SDCLKIN, 745f392db97SDavid Virag 21, CLK_SET_RATE_PARENT, 0), 746f392db97SDavid Virag }; 747f392db97SDavid Virag 748f392db97SDavid Virag static const struct samsung_cmu_info fsys_cmu_info __initconst = { 749f392db97SDavid Virag .mux_clks = fsys_mux_clks, 750f392db97SDavid Virag .nr_mux_clks = ARRAY_SIZE(fsys_mux_clks), 751f392db97SDavid Virag .gate_clks = fsys_gate_clks, 752f392db97SDavid Virag .nr_gate_clks = ARRAY_SIZE(fsys_gate_clks), 753*ef4923c8SKrzysztof Kozlowski .nr_clk_ids = CLKS_NR_FSYS, 754f392db97SDavid Virag .clk_regs = fsys_clk_regs, 755f392db97SDavid Virag .nr_clk_regs = ARRAY_SIZE(fsys_clk_regs), 756f392db97SDavid Virag .clk_name = "dout_fsys_bus", 757f392db97SDavid Virag }; 758f392db97SDavid Virag 75945bd8166SDavid Virag /* ---- platform_driver ----------------------------------------------------- */ 76045bd8166SDavid Virag 76145bd8166SDavid Virag static int __init exynos7885_cmu_probe(struct platform_device *pdev) 76245bd8166SDavid Virag { 76345bd8166SDavid Virag const struct samsung_cmu_info *info; 76445bd8166SDavid Virag struct device *dev = &pdev->dev; 76545bd8166SDavid Virag 76645bd8166SDavid Virag info = of_device_get_match_data(dev); 76745bd8166SDavid Virag exynos_arm64_register_cmu(dev, dev->of_node, info); 76845bd8166SDavid Virag 76945bd8166SDavid Virag return 0; 77045bd8166SDavid Virag } 77145bd8166SDavid Virag 77245bd8166SDavid Virag static const struct of_device_id exynos7885_cmu_of_match[] = { 77345bd8166SDavid Virag { 77445bd8166SDavid Virag .compatible = "samsung,exynos7885-cmu-core", 77545bd8166SDavid Virag .data = &core_cmu_info, 77645bd8166SDavid Virag }, { 777f392db97SDavid Virag .compatible = "samsung,exynos7885-cmu-fsys", 778f392db97SDavid Virag .data = &fsys_cmu_info, 779f392db97SDavid Virag }, { 78045bd8166SDavid Virag }, 78145bd8166SDavid Virag }; 78245bd8166SDavid Virag 78345bd8166SDavid Virag static struct platform_driver exynos7885_cmu_driver __refdata = { 78445bd8166SDavid Virag .driver = { 78545bd8166SDavid Virag .name = "exynos7885-cmu", 78645bd8166SDavid Virag .of_match_table = exynos7885_cmu_of_match, 78745bd8166SDavid Virag .suppress_bind_attrs = true, 78845bd8166SDavid Virag }, 78945bd8166SDavid Virag .probe = exynos7885_cmu_probe, 79045bd8166SDavid Virag }; 79145bd8166SDavid Virag 79245bd8166SDavid Virag static int __init exynos7885_cmu_init(void) 79345bd8166SDavid Virag { 79445bd8166SDavid Virag return platform_driver_register(&exynos7885_cmu_driver); 79545bd8166SDavid Virag } 79645bd8166SDavid Virag core_initcall(exynos7885_cmu_init); 797