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
83 struct rzg2l_mod_clk {
92 #define DEF_MOD(_name, _id, _parent, _off, _onoff, _reset) \
95 .id = MOD_CLK_BASE + _id, \
96 .parent = (_parent), \
103 * struct rzg2l_cpg_info - SoC-specific CPG Description
105 * @core_clks: Array of Core Clock definitions
106 * @num_core_clks: Number of entries in core_clks[]
107 * @last_dt_core_clk: ID of the last Core Clock exported to DT
108 * @num_total_core_clks: Total number of Core Clocks (exported + internal)
110 * @mod_clks: Array of Module Clock definitions
111 * @num_mod_clks: Number of entries in mod_clks[]
112 * @num_hw_mod_clks: Number of Module Clocks supported by the hardware
114 * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
115 * should not be disabled without a knowledgeable driver
116 * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
118 struct rzg2l_cpg_info {
120 const struct cpg_core_clk *core_clks;
121 unsigned int num_core_clks;
122 unsigned int last_dt_core_clk;
123 unsigned int num_total_core_clks;
126 const struct rzg2l_mod_clk *mod_clks;
127 unsigned int num_mod_clks;
128 unsigned int num_hw_mod_clks;
130 /* Critical Module Clocks that should not be disabled */
131 const unsigned int *crit_mod_clks;
132 unsigned int num_crit_mod_clks;
135 extern const struct rzg2l_cpg_info r9a07g044_cpg_info;