10aae437aSGeert Uytterhoeven /* SPDX-License-Identifier: GPL-2.0 */ 20aae437aSGeert Uytterhoeven /* 30aae437aSGeert Uytterhoeven * RZ/G2L Clock Pulse Generator 40aae437aSGeert Uytterhoeven * 50aae437aSGeert Uytterhoeven * Copyright (C) 2021 Renesas Electronics Corp. 60aae437aSGeert Uytterhoeven * 70aae437aSGeert Uytterhoeven */ 80aae437aSGeert Uytterhoeven 90aae437aSGeert Uytterhoeven #ifndef __RENESAS_RZG2L_CPG_H__ 100aae437aSGeert Uytterhoeven #define __RENESAS_RZG2L_CPG_H__ 110aae437aSGeert Uytterhoeven 121561380eSBiju Das #define CPG_SIPLL5_STBY (0x140) 131561380eSBiju Das #define CPG_SIPLL5_CLK1 (0x144) 141561380eSBiju Das #define CPG_SIPLL5_CLK3 (0x14C) 151561380eSBiju Das #define CPG_SIPLL5_CLK4 (0x150) 161561380eSBiju Das #define CPG_SIPLL5_CLK5 (0x154) 171561380eSBiju Das #define CPG_SIPLL5_MON (0x15C) 1886e122c0SBiju Das #define CPG_PL1_DDIV (0x200) 190aae437aSGeert Uytterhoeven #define CPG_PL2_DDIV (0x204) 200aae437aSGeert Uytterhoeven #define CPG_PL3A_DDIV (0x208) 217ef9c45aSBiju Das #define CPG_PL6_DDIV (0x210) 22373bd6f4SBiju Das #define CPG_PL2SDHI_DSEL (0x218) 23eaff3364SBiju Das #define CPG_CLKSTATUS (0x280) 24f294a0eaSLad Prabhakar #define CPG_PL3_SSEL (0x408) 257ef9c45aSBiju Das #define CPG_PL6_SSEL (0x414) 2670a4af36SBiju Das #define CPG_PL6_ETH_SSEL (0x418) 2746bb3e15SBiju Das #define CPG_PL5_SDIV (0x420) 288090bea3SPhil Edworthy #define CPG_RST_MON (0x680) 296cc859caSBiju Das #define CPG_OTHERFUNC1_REG (0xBE8) 300aae437aSGeert Uytterhoeven 311561380eSBiju Das #define CPG_SIPLL5_STBY_RESETB BIT(0) 321561380eSBiju Das #define CPG_SIPLL5_STBY_RESETB_WEN BIT(16) 331561380eSBiju Das #define CPG_SIPLL5_STBY_SSCG_EN_WEN BIT(18) 341561380eSBiju Das #define CPG_SIPLL5_STBY_DOWNSPREAD_WEN BIT(20) 351561380eSBiju Das #define CPG_SIPLL5_CLK4_RESV_LSB (0xFF) 361561380eSBiju Das #define CPG_SIPLL5_MON_PLL5_LOCK BIT(4) 371561380eSBiju Das 386cc859caSBiju Das #define CPG_OTHERFUNC1_REG_RES0_ON_WEN BIT(16) 396cc859caSBiju Das 4046bb3e15SBiju Das #define CPG_PL5_SDIV_DIV_DSI_A_WEN BIT(16) 4146bb3e15SBiju Das #define CPG_PL5_SDIV_DIV_DSI_B_WEN BIT(24) 4246bb3e15SBiju Das 43eaff3364SBiju Das #define CPG_CLKSTATUS_SELSDHI0_STS BIT(28) 44eaff3364SBiju Das #define CPG_CLKSTATUS_SELSDHI1_STS BIT(29) 45eaff3364SBiju Das 46*f9290517SClaudiu Beznea #define CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US 200 47eaff3364SBiju Das 480aae437aSGeert Uytterhoeven /* n = 0/1/2 for PLL1/4/6 */ 490aae437aSGeert Uytterhoeven #define CPG_SAMPLL_CLK1(n) (0x04 + (16 * n)) 500aae437aSGeert Uytterhoeven #define CPG_SAMPLL_CLK2(n) (0x08 + (16 * n)) 510aae437aSGeert Uytterhoeven 520aae437aSGeert Uytterhoeven #define PLL146_CONF(n) (CPG_SAMPLL_CLK1(n) << 22 | CPG_SAMPLL_CLK2(n) << 12) 530aae437aSGeert Uytterhoeven 540aae437aSGeert Uytterhoeven #define DDIV_PACK(offset, bitpos, size) \ 550aae437aSGeert Uytterhoeven (((offset) << 20) | ((bitpos) << 12) | ((size) << 8)) 5686e122c0SBiju Das #define DIVPL1A DDIV_PACK(CPG_PL1_DDIV, 0, 2) 570aae437aSGeert Uytterhoeven #define DIVPL2A DDIV_PACK(CPG_PL2_DDIV, 0, 3) 5846bb3e15SBiju Das #define DIVDSILPCLK DDIV_PACK(CPG_PL2_DDIV, 12, 2) 590aae437aSGeert Uytterhoeven #define DIVPL3A DDIV_PACK(CPG_PL3A_DDIV, 0, 3) 600aae437aSGeert Uytterhoeven #define DIVPL3B DDIV_PACK(CPG_PL3A_DDIV, 4, 3) 61f294a0eaSLad Prabhakar #define DIVPL3C DDIV_PACK(CPG_PL3A_DDIV, 8, 3) 627ef9c45aSBiju Das #define DIVGPU DDIV_PACK(CPG_PL6_DDIV, 0, 2) 630aae437aSGeert Uytterhoeven 647c5a2561SBiju Das #define SEL_PLL_PACK(offset, bitpos, size) \ 657c5a2561SBiju Das (((offset) << 20) | ((bitpos) << 12) | ((size) << 8)) 667c5a2561SBiju Das 67f294a0eaSLad Prabhakar #define SEL_PLL3_3 SEL_PLL_PACK(CPG_PL3_SSEL, 8, 1) 686cc859caSBiju Das #define SEL_PLL5_4 SEL_PLL_PACK(CPG_OTHERFUNC1_REG, 0, 1) 6970a4af36SBiju Das #define SEL_PLL6_2 SEL_PLL_PACK(CPG_PL6_ETH_SSEL, 0, 1) 707ef9c45aSBiju Das #define SEL_GPU2 SEL_PLL_PACK(CPG_PL6_SSEL, 12, 1) 7170a4af36SBiju Das 72373bd6f4SBiju Das #define SEL_SDHI0 DDIV_PACK(CPG_PL2SDHI_DSEL, 0, 2) 73373bd6f4SBiju Das #define SEL_SDHI1 DDIV_PACK(CPG_PL2SDHI_DSEL, 4, 2) 74373bd6f4SBiju Das 751561380eSBiju Das #define EXTAL_FREQ_IN_MEGA_HZ (24) 761561380eSBiju Das 770aae437aSGeert Uytterhoeven /** 780aae437aSGeert Uytterhoeven * Definitions of CPG Core Clocks 790aae437aSGeert Uytterhoeven * 800aae437aSGeert Uytterhoeven * These include: 810aae437aSGeert Uytterhoeven * - Clock outputs exported to DT 820aae437aSGeert Uytterhoeven * - External input clocks 830aae437aSGeert Uytterhoeven * - Internal CPG clocks 840aae437aSGeert Uytterhoeven */ 850aae437aSGeert Uytterhoeven struct cpg_core_clk { 860aae437aSGeert Uytterhoeven const char *name; 870aae437aSGeert Uytterhoeven unsigned int id; 880aae437aSGeert Uytterhoeven unsigned int parent; 890aae437aSGeert Uytterhoeven unsigned int div; 900aae437aSGeert Uytterhoeven unsigned int mult; 910aae437aSGeert Uytterhoeven unsigned int type; 920aae437aSGeert Uytterhoeven unsigned int conf; 930aae437aSGeert Uytterhoeven const struct clk_div_table *dtable; 940aae437aSGeert Uytterhoeven const char * const *parent_names; 950aae437aSGeert Uytterhoeven int flag; 967c5a2561SBiju Das int mux_flags; 970aae437aSGeert Uytterhoeven int num_parents; 980aae437aSGeert Uytterhoeven }; 990aae437aSGeert Uytterhoeven 1000aae437aSGeert Uytterhoeven enum clk_types { 1010aae437aSGeert Uytterhoeven /* Generic */ 1020aae437aSGeert Uytterhoeven CLK_TYPE_IN, /* External Clock Input */ 1030aae437aSGeert Uytterhoeven CLK_TYPE_FF, /* Fixed Factor Clock */ 1040aae437aSGeert Uytterhoeven CLK_TYPE_SAM_PLL, 1050aae437aSGeert Uytterhoeven 1060aae437aSGeert Uytterhoeven /* Clock with divider */ 1070aae437aSGeert Uytterhoeven CLK_TYPE_DIV, 1087c5a2561SBiju Das 1097c5a2561SBiju Das /* Clock with clock source selector */ 1107c5a2561SBiju Das CLK_TYPE_MUX, 111eaff3364SBiju Das 112eaff3364SBiju Das /* Clock with SD clock source selector */ 113eaff3364SBiju Das CLK_TYPE_SD_MUX, 1141561380eSBiju Das 1151561380eSBiju Das /* Clock for SIPLL5 */ 1161561380eSBiju Das CLK_TYPE_SIPLL5, 1176cc859caSBiju Das 1186cc859caSBiju Das /* Clock for PLL5_4 clock source selector */ 1196cc859caSBiju Das CLK_TYPE_PLL5_4_MUX, 12046bb3e15SBiju Das 12146bb3e15SBiju Das /* Clock for DSI divider */ 12246bb3e15SBiju Das CLK_TYPE_DSI_DIV, 12346bb3e15SBiju Das 1240aae437aSGeert Uytterhoeven }; 1250aae437aSGeert Uytterhoeven 1260aae437aSGeert Uytterhoeven #define DEF_TYPE(_name, _id, _type...) \ 1270aae437aSGeert Uytterhoeven { .name = _name, .id = _id, .type = _type } 1280aae437aSGeert Uytterhoeven #define DEF_BASE(_name, _id, _type, _parent...) \ 1290aae437aSGeert Uytterhoeven DEF_TYPE(_name, _id, _type, .parent = _parent) 1300aae437aSGeert Uytterhoeven #define DEF_SAMPLL(_name, _id, _parent, _conf) \ 1310aae437aSGeert Uytterhoeven DEF_TYPE(_name, _id, CLK_TYPE_SAM_PLL, .parent = _parent, .conf = _conf) 1320aae437aSGeert Uytterhoeven #define DEF_INPUT(_name, _id) \ 1330aae437aSGeert Uytterhoeven DEF_TYPE(_name, _id, CLK_TYPE_IN) 1340aae437aSGeert Uytterhoeven #define DEF_FIXED(_name, _id, _parent, _mult, _div) \ 1350aae437aSGeert Uytterhoeven DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult) 13675b0ad42SPhil Edworthy #define DEF_DIV(_name, _id, _parent, _conf, _dtable) \ 1370aae437aSGeert Uytterhoeven DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \ 13875b0ad42SPhil Edworthy .parent = _parent, .dtable = _dtable, \ 13975b0ad42SPhil Edworthy .flag = CLK_DIVIDER_HIWORD_MASK) 1408282fe00SPhil Edworthy #define DEF_DIV_RO(_name, _id, _parent, _conf, _dtable) \ 1418282fe00SPhil Edworthy DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \ 1428282fe00SPhil Edworthy .parent = _parent, .dtable = _dtable, \ 1438282fe00SPhil Edworthy .flag = CLK_DIVIDER_READ_ONLY) 14475b0ad42SPhil Edworthy #define DEF_MUX(_name, _id, _conf, _parent_names) \ 1457c5a2561SBiju Das DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \ 146ceb3bfabSPhil Edworthy .parent_names = _parent_names, \ 147ceb3bfabSPhil Edworthy .num_parents = ARRAY_SIZE(_parent_names), \ 14875b0ad42SPhil Edworthy .mux_flags = CLK_MUX_HIWORD_MASK) 1498282fe00SPhil Edworthy #define DEF_MUX_RO(_name, _id, _conf, _parent_names) \ 1508282fe00SPhil Edworthy DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \ 1518282fe00SPhil Edworthy .parent_names = _parent_names, \ 1528282fe00SPhil Edworthy .num_parents = ARRAY_SIZE(_parent_names), \ 1538282fe00SPhil Edworthy .mux_flags = CLK_MUX_READ_ONLY) 154ceb3bfabSPhil Edworthy #define DEF_SD_MUX(_name, _id, _conf, _parent_names) \ 155eaff3364SBiju Das DEF_TYPE(_name, _id, CLK_TYPE_SD_MUX, .conf = _conf, \ 156ceb3bfabSPhil Edworthy .parent_names = _parent_names, \ 157ceb3bfabSPhil Edworthy .num_parents = ARRAY_SIZE(_parent_names)) 1581561380eSBiju Das #define DEF_PLL5_FOUTPOSTDIV(_name, _id, _parent) \ 1591561380eSBiju Das DEF_TYPE(_name, _id, CLK_TYPE_SIPLL5, .parent = _parent) 160ceb3bfabSPhil Edworthy #define DEF_PLL5_4_MUX(_name, _id, _conf, _parent_names) \ 1616cc859caSBiju Das DEF_TYPE(_name, _id, CLK_TYPE_PLL5_4_MUX, .conf = _conf, \ 162ceb3bfabSPhil Edworthy .parent_names = _parent_names, \ 163ceb3bfabSPhil Edworthy .num_parents = ARRAY_SIZE(_parent_names)) 16446bb3e15SBiju Das #define DEF_DSI_DIV(_name, _id, _parent, _flag) \ 16546bb3e15SBiju Das DEF_TYPE(_name, _id, CLK_TYPE_DSI_DIV, .parent = _parent, .flag = _flag) 1660aae437aSGeert Uytterhoeven 1670aae437aSGeert Uytterhoeven /** 1680aae437aSGeert Uytterhoeven * struct rzg2l_mod_clk - Module Clocks definitions 1690aae437aSGeert Uytterhoeven * 1700aae437aSGeert Uytterhoeven * @name: handle between common and hardware-specific interfaces 1710aae437aSGeert Uytterhoeven * @id: clock index in array containing all Core and Module Clocks 1720aae437aSGeert Uytterhoeven * @parent: id of parent clock 1730aae437aSGeert Uytterhoeven * @off: register offset 1740aae437aSGeert Uytterhoeven * @bit: ON/MON bit 17532897e6fSBiju Das * @is_coupled: flag to indicate coupled clock 1760aae437aSGeert Uytterhoeven */ 1770aae437aSGeert Uytterhoeven struct rzg2l_mod_clk { 1780aae437aSGeert Uytterhoeven const char *name; 1790aae437aSGeert Uytterhoeven unsigned int id; 1800aae437aSGeert Uytterhoeven unsigned int parent; 1810aae437aSGeert Uytterhoeven u16 off; 1820aae437aSGeert Uytterhoeven u8 bit; 18332897e6fSBiju Das bool is_coupled; 1840aae437aSGeert Uytterhoeven }; 1850aae437aSGeert Uytterhoeven 18632897e6fSBiju Das #define DEF_MOD_BASE(_name, _id, _parent, _off, _bit, _is_coupled) \ 1870aae437aSGeert Uytterhoeven { \ 1880aae437aSGeert Uytterhoeven .name = _name, \ 1890aae437aSGeert Uytterhoeven .id = MOD_CLK_BASE + (_id), \ 1900aae437aSGeert Uytterhoeven .parent = (_parent), \ 1910aae437aSGeert Uytterhoeven .off = (_off), \ 1920aae437aSGeert Uytterhoeven .bit = (_bit), \ 19332897e6fSBiju Das .is_coupled = (_is_coupled), \ 1940aae437aSGeert Uytterhoeven } 1950aae437aSGeert Uytterhoeven 19632897e6fSBiju Das #define DEF_MOD(_name, _id, _parent, _off, _bit) \ 19732897e6fSBiju Das DEF_MOD_BASE(_name, _id, _parent, _off, _bit, false) 19832897e6fSBiju Das 19932897e6fSBiju Das #define DEF_COUPLED(_name, _id, _parent, _off, _bit) \ 20032897e6fSBiju Das DEF_MOD_BASE(_name, _id, _parent, _off, _bit, true) 20132897e6fSBiju Das 2020aae437aSGeert Uytterhoeven /** 2030aae437aSGeert Uytterhoeven * struct rzg2l_reset - Reset definitions 2040aae437aSGeert Uytterhoeven * 2050aae437aSGeert Uytterhoeven * @off: register offset 2060aae437aSGeert Uytterhoeven * @bit: reset bit 2078090bea3SPhil Edworthy * @monbit: monitor bit in CPG_RST_MON register, -1 if none 2080aae437aSGeert Uytterhoeven */ 2090aae437aSGeert Uytterhoeven struct rzg2l_reset { 2100aae437aSGeert Uytterhoeven u16 off; 2110aae437aSGeert Uytterhoeven u8 bit; 2128090bea3SPhil Edworthy s8 monbit; 2130aae437aSGeert Uytterhoeven }; 2140aae437aSGeert Uytterhoeven 2158090bea3SPhil Edworthy #define DEF_RST_MON(_id, _off, _bit, _monbit) \ 2160aae437aSGeert Uytterhoeven [_id] = { \ 2170aae437aSGeert Uytterhoeven .off = (_off), \ 2188090bea3SPhil Edworthy .bit = (_bit), \ 2198090bea3SPhil Edworthy .monbit = (_monbit) \ 2200aae437aSGeert Uytterhoeven } 2218090bea3SPhil Edworthy #define DEF_RST(_id, _off, _bit) \ 2228090bea3SPhil Edworthy DEF_RST_MON(_id, _off, _bit, -1) 2230aae437aSGeert Uytterhoeven 2240aae437aSGeert Uytterhoeven /** 2250aae437aSGeert Uytterhoeven * struct rzg2l_cpg_info - SoC-specific CPG Description 2260aae437aSGeert Uytterhoeven * 2270aae437aSGeert Uytterhoeven * @core_clks: Array of Core Clock definitions 2280aae437aSGeert Uytterhoeven * @num_core_clks: Number of entries in core_clks[] 2290aae437aSGeert Uytterhoeven * @last_dt_core_clk: ID of the last Core Clock exported to DT 2300aae437aSGeert Uytterhoeven * @num_total_core_clks: Total number of Core Clocks (exported + internal) 2310aae437aSGeert Uytterhoeven * 2320aae437aSGeert Uytterhoeven * @mod_clks: Array of Module Clock definitions 2330aae437aSGeert Uytterhoeven * @num_mod_clks: Number of entries in mod_clks[] 2340aae437aSGeert Uytterhoeven * @num_hw_mod_clks: Number of Module Clocks supported by the hardware 2350aae437aSGeert Uytterhoeven * 236099ee032SGeert Uytterhoeven * @resets: Array of Module Reset definitions 237099ee032SGeert Uytterhoeven * @num_resets: Number of entries in resets[] 238099ee032SGeert Uytterhoeven * 2390aae437aSGeert Uytterhoeven * @crit_mod_clks: Array with Module Clock IDs of critical clocks that 2400aae437aSGeert Uytterhoeven * should not be disabled without a knowledgeable driver 2410aae437aSGeert Uytterhoeven * @num_crit_mod_clks: Number of entries in crit_mod_clks[] 24263804400SPhil Edworthy * @has_clk_mon_regs: Flag indicating whether the SoC has CLK_MON registers 2430aae437aSGeert Uytterhoeven */ 2440aae437aSGeert Uytterhoeven struct rzg2l_cpg_info { 2450aae437aSGeert Uytterhoeven /* Core Clocks */ 2460aae437aSGeert Uytterhoeven const struct cpg_core_clk *core_clks; 2470aae437aSGeert Uytterhoeven unsigned int num_core_clks; 2480aae437aSGeert Uytterhoeven unsigned int last_dt_core_clk; 2490aae437aSGeert Uytterhoeven unsigned int num_total_core_clks; 2500aae437aSGeert Uytterhoeven 2510aae437aSGeert Uytterhoeven /* Module Clocks */ 2520aae437aSGeert Uytterhoeven const struct rzg2l_mod_clk *mod_clks; 2530aae437aSGeert Uytterhoeven unsigned int num_mod_clks; 2540aae437aSGeert Uytterhoeven unsigned int num_hw_mod_clks; 2550aae437aSGeert Uytterhoeven 2563702cff6SLad Prabhakar /* No PM Module Clocks */ 2573702cff6SLad Prabhakar const unsigned int *no_pm_mod_clks; 2583702cff6SLad Prabhakar unsigned int num_no_pm_mod_clks; 2593702cff6SLad Prabhakar 2600aae437aSGeert Uytterhoeven /* Resets */ 2610aae437aSGeert Uytterhoeven const struct rzg2l_reset *resets; 2620aae437aSGeert Uytterhoeven unsigned int num_resets; 2630aae437aSGeert Uytterhoeven 2640aae437aSGeert Uytterhoeven /* Critical Module Clocks that should not be disabled */ 2650aae437aSGeert Uytterhoeven const unsigned int *crit_mod_clks; 2660aae437aSGeert Uytterhoeven unsigned int num_crit_mod_clks; 26763804400SPhil Edworthy 26863804400SPhil Edworthy bool has_clk_mon_regs; 2690aae437aSGeert Uytterhoeven }; 2700aae437aSGeert Uytterhoeven 271c8b08822SBiju Das extern const struct rzg2l_cpg_info r9a07g043_cpg_info; 2720aae437aSGeert Uytterhoeven extern const struct rzg2l_cpg_info r9a07g044_cpg_info; 273a1bcf50aSBiju Das extern const struct rzg2l_cpg_info r9a07g054_cpg_info; 2741dd65bb0SPhil Edworthy extern const struct rzg2l_cpg_info r9a09g011_cpg_info; 2750aae437aSGeert Uytterhoeven 2760aae437aSGeert Uytterhoeven #endif 277