/* SPDX-License-Identifier: GPL-2.0 */ /* * Renesas RZ/V2H(P) Clock Pulse Generator * * Copyright (C) 2024 Renesas Electronics Corp. */ #ifndef __RENESAS_RZV2H_CPG_H__ #define __RENESAS_RZV2H_CPG_H__ /** * struct ddiv - Structure for dynamic switching divider * * @offset: register offset * @shift: position of the divider bit * @width: width of the divider * @monbit: monitor bit in CPG_CLKSTATUS0 register */ struct ddiv { unsigned int offset:11; unsigned int shift:4; unsigned int width:4; unsigned int monbit:5; }; #define DDIV_PACK(_offset, _shift, _width, _monbit) \ ((struct ddiv){ \ .offset = _offset, \ .shift = _shift, \ .width = _width, \ .monbit = _monbit \ }) #define CPG_CDDIV0 (0x400) #define CDDIV0_DIVCTL2 DDIV_PACK(CPG_CDDIV0, 8, 3, 2) /** * Definitions of CPG Core Clocks * * These include: * - Clock outputs exported to DT * - External input clocks * - Internal CPG clocks */ struct cpg_core_clk { const char *name; unsigned int id; unsigned int parent; unsigned int div; unsigned int mult; unsigned int type; union { unsigned int conf; struct ddiv ddiv; } cfg; const struct clk_div_table *dtable; u32 flag; }; enum clk_types { /* Generic */ CLK_TYPE_IN, /* External Clock Input */ CLK_TYPE_FF, /* Fixed Factor Clock */ CLK_TYPE_PLL, CLK_TYPE_DDIV, /* Dynamic Switching Divider */ }; /* BIT(31) indicates if CLK1/2 are accessible or not */ #define PLL_CONF(n) (BIT(31) | ((n) & ~GENMASK(31, 16))) #define PLL_CLK_ACCESS(n) ((n) & BIT(31) ? 1 : 0) #define PLL_CLK1_OFFSET(n) ((n) & ~GENMASK(31, 16)) #define PLL_CLK2_OFFSET(n) (((n) & ~GENMASK(31, 16)) + (0x4)) #define DEF_TYPE(_name, _id, _type...) \ { .name = _name, .id = _id, .type = _type } #define DEF_BASE(_name, _id, _type, _parent...) \ DEF_TYPE(_name, _id, _type, .parent = _parent) #define DEF_PLL(_name, _id, _parent, _conf) \ DEF_TYPE(_name, _id, CLK_TYPE_PLL, .parent = _parent, .cfg.conf = _conf) #define DEF_INPUT(_name, _id) \ DEF_TYPE(_name, _id, CLK_TYPE_IN) #define DEF_FIXED(_name, _id, _parent, _mult, _div) \ DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult) #define DEF_DDIV(_name, _id, _parent, _ddiv_packed, _dtable) \ DEF_TYPE(_name, _id, CLK_TYPE_DDIV, \ .cfg.ddiv = _ddiv_packed, \ .parent = _parent, \ .dtable = _dtable, \ .flag = CLK_DIVIDER_HIWORD_MASK) /** * struct rzv2h_mod_clk - Module Clocks definitions * * @name: handle between common and hardware-specific interfaces * @parent: id of parent clock * @critical: flag to indicate the clock is critical * @on_index: control register index * @on_bit: ON bit * @mon_index: monitor register index * @mon_bit: monitor bit */ struct rzv2h_mod_clk { const char *name; u16 parent; bool critical; u8 on_index; u8 on_bit; s8 mon_index; u8 mon_bit; }; #define DEF_MOD_BASE(_name, _parent, _critical, _onindex, _onbit, _monindex, _monbit) \ { \ .name = (_name), \ .parent = (_parent), \ .critical = (_critical), \ .on_index = (_onindex), \ .on_bit = (_onbit), \ .mon_index = (_monindex), \ .mon_bit = (_monbit), \ } #define DEF_MOD(_name, _parent, _onindex, _onbit, _monindex, _monbit) \ DEF_MOD_BASE(_name, _parent, false, _onindex, _onbit, _monindex, _monbit) #define DEF_MOD_CRITICAL(_name, _parent, _onindex, _onbit, _monindex, _monbit) \ DEF_MOD_BASE(_name, _parent, true, _onindex, _onbit, _monindex, _monbit) /** * struct rzv2h_reset - Reset definitions * * @reset_index: reset register index * @reset_bit: reset bit * @mon_index: monitor register index * @mon_bit: monitor bit */ struct rzv2h_reset { u8 reset_index; u8 reset_bit; u8 mon_index; u8 mon_bit; }; #define DEF_RST_BASE(_resindex, _resbit, _monindex, _monbit) \ { \ .reset_index = (_resindex), \ .reset_bit = (_resbit), \ .mon_index = (_monindex), \ .mon_bit = (_monbit), \ } #define DEF_RST(_resindex, _resbit, _monindex, _monbit) \ DEF_RST_BASE(_resindex, _resbit, _monindex, _monbit) /** * struct rzv2h_cpg_info - SoC-specific CPG Description * * @core_clks: Array of Core Clock definitions * @num_core_clks: Number of entries in core_clks[] * @last_dt_core_clk: ID of the last Core Clock exported to DT * @num_total_core_clks: Total number of Core Clocks (exported + internal) * * @mod_clks: Array of Module Clock definitions * @num_mod_clks: Number of entries in mod_clks[] * @num_hw_mod_clks: Number of Module Clocks supported by the hardware * * @resets: Array of Module Reset definitions * @num_resets: Number of entries in resets[] */ struct rzv2h_cpg_info { /* Core Clocks */ const struct cpg_core_clk *core_clks; unsigned int num_core_clks; unsigned int last_dt_core_clk; unsigned int num_total_core_clks; /* Module Clocks */ const struct rzv2h_mod_clk *mod_clks; unsigned int num_mod_clks; unsigned int num_hw_mod_clks; /* Resets */ const struct rzv2h_reset *resets; unsigned int num_resets; }; extern const struct rzv2h_cpg_info r9a09g057_cpg_info; #endif /* __RENESAS_RZV2H_CPG_H__ */