1 /* SPDX-License-Identifier: GPL-2.0 */
3 * RZ/G2L Clock Pulse Generator
5 * Copyright (C) 2021 Renesas Electronics Corp.
9 #ifndef __RENESAS_RZG2L_CPG_H__
10 #define __RENESAS_RZG2L_CPG_H__
12 #define CPG_PL2_DDIV (0x204)
13 #define CPG_PL3A_DDIV (0x208)
15 /* n = 0/1/2 for PLL1/4/6 */
16 #define CPG_SAMPLL_CLK1(n) (0x04 + (16 * n))
17 #define CPG_SAMPLL_CLK2(n) (0x08 + (16 * n))
19 #define PLL146_CONF(n) (CPG_SAMPLL_CLK1(n) << 22 | CPG_SAMPLL_CLK2(n) << 12)
21 #define DDIV_PACK(offset, bitpos, size) \
22 (((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
23 #define DIVPL2A DDIV_PACK(CPG_PL2_DDIV, 0, 3)
24 #define DIVPL3A DDIV_PACK(CPG_PL3A_DDIV, 0, 3)
25 #define DIVPL3B DDIV_PACK(CPG_PL3A_DDIV, 4, 3)
28 * Definitions of CPG Core Clocks
31 * - Clock outputs exported to DT
32 * - External input clocks
33 * - Internal CPG clocks
43 const struct clk_div_table *dtable;
44 const char * const *parent_names;
51 CLK_TYPE_IN, /* External Clock Input */
52 CLK_TYPE_FF, /* Fixed Factor Clock */
55 /* Clock with divider */
59 #define DEF_TYPE(_name, _id, _type...) \
60 { .name = _name, .id = _id, .type = _type }
61 #define DEF_BASE(_name, _id, _type, _parent...) \
62 DEF_TYPE(_name, _id, _type, .parent = _parent)
63 #define DEF_SAMPLL(_name, _id, _parent, _conf) \
64 DEF_TYPE(_name, _id, CLK_TYPE_SAM_PLL, .parent = _parent, .conf = _conf)
65 #define DEF_INPUT(_name, _id) \
66 DEF_TYPE(_name, _id, CLK_TYPE_IN)
67 #define DEF_FIXED(_name, _id, _parent, _mult, _div) \
68 DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult)
69 #define DEF_DIV(_name, _id, _parent, _conf, _dtable, _flag) \
70 DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
71 .parent = _parent, .dtable = _dtable, .flag = _flag)
74 * struct rzg2l_mod_clk - Module Clocks definitions
76 * @name: handle between common and hardware-specific interfaces
77 * @id: clock index in array containing all Core and Module Clocks
78 * @parent: id of parent clock
79 * @off: register offset
82 struct rzg2l_mod_clk {
90 #define DEF_MOD(_name, _id, _parent, _off, _bit) \
93 .id = MOD_CLK_BASE + (_id), \
94 .parent = (_parent), \
100 * struct rzg2l_reset - Reset definitions
102 * @off: register offset
110 #define DEF_RST(_id, _off, _bit) \
117 * struct rzg2l_cpg_info - SoC-specific CPG Description
119 * @core_clks: Array of Core Clock definitions
120 * @num_core_clks: Number of entries in core_clks[]
121 * @last_dt_core_clk: ID of the last Core Clock exported to DT
122 * @num_total_core_clks: Total number of Core Clocks (exported + internal)
124 * @mod_clks: Array of Module Clock definitions
125 * @num_mod_clks: Number of entries in mod_clks[]
126 * @num_hw_mod_clks: Number of Module Clocks supported by the hardware
128 * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
129 * should not be disabled without a knowledgeable driver
130 * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
132 struct rzg2l_cpg_info {
134 const struct cpg_core_clk *core_clks;
135 unsigned int num_core_clks;
136 unsigned int last_dt_core_clk;
137 unsigned int num_total_core_clks;
140 const struct rzg2l_mod_clk *mod_clks;
141 unsigned int num_mod_clks;
142 unsigned int num_hw_mod_clks;
145 const struct rzg2l_reset *resets;
146 unsigned int num_resets;
148 /* Critical Module Clocks that should not be disabled */
149 const unsigned int *crit_mod_clks;
150 unsigned int num_crit_mod_clks;
153 extern const struct rzg2l_cpg_info r9a07g044_cpg_info;