1*77894661SBiju Das // SPDX-License-Identifier: GPL-2.0 2*77894661SBiju Das /* 3*77894661SBiju Das * RZ/G3L CPG driver 4*77894661SBiju Das * 5*77894661SBiju Das * Copyright (C) 2026 Renesas Electronics Corp. 6*77894661SBiju Das */ 7*77894661SBiju Das 8*77894661SBiju Das #include <linux/clk-provider.h> 9*77894661SBiju Das #include <linux/device.h> 10*77894661SBiju Das #include <linux/init.h> 11*77894661SBiju Das #include <linux/kernel.h> 12*77894661SBiju Das 13*77894661SBiju Das #include <dt-bindings/clock/renesas,r9a08g046-cpg.h> 14*77894661SBiju Das 15*77894661SBiju Das #include "rzg2l-cpg.h" 16*77894661SBiju Das 17*77894661SBiju Das /* RZ/G3L Specific registers. */ 18*77894661SBiju Das #define G3L_CPG_PL2_DDIV (0x204) 19*77894661SBiju Das #define G3L_CPG_PL3_DDIV (0x208) 20*77894661SBiju Das #define G3L_CLKDIVSTATUS (0x280) 21*77894661SBiju Das 22*77894661SBiju Das /* RZ/G3L Specific division configuration. */ 23*77894661SBiju Das #define G3L_DIVPL2A DDIV_PACK(G3L_CPG_PL2_DDIV, 0, 2) 24*77894661SBiju Das #define G3L_DIVPL2B DDIV_PACK(G3L_CPG_PL2_DDIV, 4, 2) 25*77894661SBiju Das #define G3L_DIVPL3A DDIV_PACK(G3L_CPG_PL3_DDIV, 0, 2) 26*77894661SBiju Das 27*77894661SBiju Das /* RZ/G3L Clock status configuration. */ 28*77894661SBiju Das #define G3L_DIVPL2A_STS DDIV_PACK(G3L_CLKDIVSTATUS, 4, 1) 29*77894661SBiju Das #define G3L_DIVPL2B_STS DDIV_PACK(G3L_CLKDIVSTATUS, 5, 1) 30*77894661SBiju Das #define G3L_DIVPL3A_STS DDIV_PACK(G3L_CLKDIVSTATUS, 8, 1) 31*77894661SBiju Das 32*77894661SBiju Das enum clk_ids { 33*77894661SBiju Das /* Core Clock Outputs exported to DT */ 34*77894661SBiju Das LAST_DT_CORE_CLK = R9A08G046_USB_SCLK, 35*77894661SBiju Das 36*77894661SBiju Das /* External Input Clocks */ 37*77894661SBiju Das CLK_EXTAL, 38*77894661SBiju Das CLK_ETH0_TXC_TX_CLK_IN, 39*77894661SBiju Das CLK_ETH0_RXC_RX_CLK_IN, 40*77894661SBiju Das CLK_ETH1_TXC_TX_CLK_IN, 41*77894661SBiju Das CLK_ETH1_RXC_RX_CLK_IN, 42*77894661SBiju Das 43*77894661SBiju Das /* Internal Core Clocks */ 44*77894661SBiju Das CLK_PLL2, 45*77894661SBiju Das CLK_PLL2_DIV2, 46*77894661SBiju Das CLK_PLL3, 47*77894661SBiju Das CLK_PLL3_DIV2, 48*77894661SBiju Das 49*77894661SBiju Das /* Module Clocks */ 50*77894661SBiju Das MOD_CLK_BASE, 51*77894661SBiju Das }; 52*77894661SBiju Das 53*77894661SBiju Das /* Divider tables */ 54*77894661SBiju Das static const struct clk_div_table dtable_4_128[] = { 55*77894661SBiju Das { 0, 4 }, 56*77894661SBiju Das { 1, 8 }, 57*77894661SBiju Das { 2, 16 }, 58*77894661SBiju Das { 3, 128 }, 59*77894661SBiju Das { 0, 0 }, 60*77894661SBiju Das }; 61*77894661SBiju Das 62*77894661SBiju Das static const struct clk_div_table dtable_8_256[] = { 63*77894661SBiju Das { 0, 8 }, 64*77894661SBiju Das { 1, 16 }, 65*77894661SBiju Das { 2, 32 }, 66*77894661SBiju Das { 3, 256 }, 67*77894661SBiju Das { 0, 0 }, 68*77894661SBiju Das }; 69*77894661SBiju Das 70*77894661SBiju Das static const struct cpg_core_clk r9a08g046_core_clks[] __initconst = { 71*77894661SBiju Das /* External Clock Inputs */ 72*77894661SBiju Das DEF_INPUT("extal", CLK_EXTAL), 73*77894661SBiju Das DEF_INPUT("eth0_txc_tx_clk", CLK_ETH0_TXC_TX_CLK_IN), 74*77894661SBiju Das DEF_INPUT("eth0_rxc_rx_clk", CLK_ETH0_RXC_RX_CLK_IN), 75*77894661SBiju Das DEF_INPUT("eth1_txc_tx_clk", CLK_ETH1_TXC_TX_CLK_IN), 76*77894661SBiju Das DEF_INPUT("eth1_rxc_rx_clk", CLK_ETH1_RXC_RX_CLK_IN), 77*77894661SBiju Das 78*77894661SBiju Das /* Internal Core Clocks */ 79*77894661SBiju Das DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 200, 3), 80*77894661SBiju Das DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 200, 3), 81*77894661SBiju Das DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2, CLK_PLL2, 1, 2), 82*77894661SBiju Das DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2, CLK_PLL3, 1, 2), 83*77894661SBiju Das 84*77894661SBiju Das /* Core output clk */ 85*77894661SBiju Das DEF_G3S_DIV("P0", R9A08G046_CLK_P0, CLK_PLL2_DIV2, G3L_DIVPL2B, G3L_DIVPL2B_STS, 86*77894661SBiju Das dtable_8_256, 0, 0, 0, NULL), 87*77894661SBiju Das DEF_G3S_DIV("P1", R9A08G046_CLK_P1, CLK_PLL3_DIV2, G3L_DIVPL3A, G3L_DIVPL3A_STS, 88*77894661SBiju Das dtable_4_128, 0, 0, 0, NULL), 89*77894661SBiju Das DEF_G3S_DIV("P3", R9A08G046_CLK_P3, CLK_PLL2_DIV2, G3L_DIVPL2A, G3L_DIVPL2A_STS, 90*77894661SBiju Das dtable_4_128, 0, 0, 0, NULL), 91*77894661SBiju Das }; 92*77894661SBiju Das 93*77894661SBiju Das static const struct rzg2l_mod_clk r9a08g046_mod_clks[] = { 94*77894661SBiju Das DEF_MOD("gic_gicclk", R9A08G046_GIC600_GICCLK, R9A08G046_CLK_P1, 0x514, 0, 95*77894661SBiju Das MSTOP(BUS_PERI_COM, BIT(12))), 96*77894661SBiju Das DEF_MOD("ia55_pclk", R9A08G046_IA55_PCLK, R9A08G046_CLK_P0, 0x518, 0, 97*77894661SBiju Das MSTOP(BUS_PERI_CPU, BIT(13))), 98*77894661SBiju Das DEF_MOD("ia55_clk", R9A08G046_IA55_CLK, R9A08G046_CLK_P1, 0x518, 1, 99*77894661SBiju Das MSTOP(BUS_PERI_CPU, BIT(13))), 100*77894661SBiju Das DEF_MOD("dmac_aclk", R9A08G046_DMAC_ACLK, R9A08G046_CLK_P3, 0x52c, 0, 101*77894661SBiju Das MSTOP(BUS_REG1, BIT(2))), 102*77894661SBiju Das DEF_MOD("dmac_pclk", R9A08G046_DMAC_PCLK, R9A08G046_CLK_P3, 0x52c, 1, 103*77894661SBiju Das MSTOP(BUS_REG1, BIT(3))), 104*77894661SBiju Das DEF_MOD("scif0_clk_pck", R9A08G046_SCIF0_CLK_PCK, R9A08G046_CLK_P0, 0x584, 0, 105*77894661SBiju Das MSTOP(BUS_MCPU2, BIT(1))), 106*77894661SBiju Das }; 107*77894661SBiju Das 108*77894661SBiju Das static const struct rzg2l_reset r9a08g046_resets[] = { 109*77894661SBiju Das DEF_RST(R9A08G046_GIC600_GICRESET_N, 0x814, 0), 110*77894661SBiju Das DEF_RST(R9A08G046_GIC600_DBG_GICRESET_N, 0x814, 1), 111*77894661SBiju Das DEF_RST(R9A08G046_IA55_RESETN, 0x818, 0), 112*77894661SBiju Das DEF_RST(R9A08G046_DMAC_ARESETN, 0x82c, 0), 113*77894661SBiju Das DEF_RST(R9A08G046_DMAC_RST_ASYNC, 0x82c, 1), 114*77894661SBiju Das DEF_RST(R9A08G046_SCIF0_RST_SYSTEM_N, 0x884, 0), 115*77894661SBiju Das }; 116*77894661SBiju Das 117*77894661SBiju Das static const unsigned int r9a08g046_crit_mod_clks[] __initconst = { 118*77894661SBiju Das MOD_CLK_BASE + R9A08G046_GIC600_GICCLK, 119*77894661SBiju Das MOD_CLK_BASE + R9A08G046_IA55_CLK, 120*77894661SBiju Das MOD_CLK_BASE + R9A08G046_DMAC_ACLK, 121*77894661SBiju Das }; 122*77894661SBiju Das 123*77894661SBiju Das static const unsigned int r9a08g046_crit_resets[] = { 124*77894661SBiju Das R9A08G046_DMAC_ARESETN, 125*77894661SBiju Das R9A08G046_DMAC_RST_ASYNC, 126*77894661SBiju Das }; 127*77894661SBiju Das 128*77894661SBiju Das const struct rzg2l_cpg_info r9a08g046_cpg_info = { 129*77894661SBiju Das /* Core Clocks */ 130*77894661SBiju Das .core_clks = r9a08g046_core_clks, 131*77894661SBiju Das .num_core_clks = ARRAY_SIZE(r9a08g046_core_clks), 132*77894661SBiju Das .last_dt_core_clk = LAST_DT_CORE_CLK, 133*77894661SBiju Das .num_total_core_clks = MOD_CLK_BASE, 134*77894661SBiju Das 135*77894661SBiju Das /* Critical Module Clocks */ 136*77894661SBiju Das .crit_mod_clks = r9a08g046_crit_mod_clks, 137*77894661SBiju Das .num_crit_mod_clks = ARRAY_SIZE(r9a08g046_crit_mod_clks), 138*77894661SBiju Das 139*77894661SBiju Das /* Module Clocks */ 140*77894661SBiju Das .mod_clks = r9a08g046_mod_clks, 141*77894661SBiju Das .num_mod_clks = ARRAY_SIZE(r9a08g046_mod_clks), 142*77894661SBiju Das .num_hw_mod_clks = R9A08G046_BSC_X_BCK_BSC + 1, 143*77894661SBiju Das 144*77894661SBiju Das /* Resets */ 145*77894661SBiju Das .resets = r9a08g046_resets, 146*77894661SBiju Das .num_resets = R9A08G046_BSC_X_PRESET_BSC + 1, /* Last reset ID + 1 */ 147*77894661SBiju Das 148*77894661SBiju Das /* Critical Resets */ 149*77894661SBiju Das .crit_resets = r9a08g046_crit_resets, 150*77894661SBiju Das .num_crit_resets = ARRAY_SIZE(r9a08g046_crit_resets), 151*77894661SBiju Das 152*77894661SBiju Das .has_clk_mon_regs = true, 153*77894661SBiju Das }; 154