xref: /openbmc/linux/drivers/clk/renesas/renesas-cpg-mssr.h (revision b3a33077c0ddb9819398091c70e5999afa8a4526)
1*b3a33077SSimon Horman /*
2*b3a33077SSimon Horman  * Renesas Clock Pulse Generator / Module Standby and Software Reset
3*b3a33077SSimon Horman  *
4*b3a33077SSimon Horman  * Copyright (C) 2015 Glider bvba
5*b3a33077SSimon Horman  *
6*b3a33077SSimon Horman  * This program is free software; you can redistribute it and/or modify
7*b3a33077SSimon Horman  * it under the terms of the GNU General Public License as published by
8*b3a33077SSimon Horman  * the Free Software Foundation; version 2 of the License.
9*b3a33077SSimon Horman  */
10*b3a33077SSimon Horman 
11*b3a33077SSimon Horman #ifndef __CLK_RENESAS_CPG_MSSR_H__
12*b3a33077SSimon Horman #define __CLK_RENESAS_CPG_MSSR_H__
13*b3a33077SSimon Horman 
14*b3a33077SSimon Horman     /*
15*b3a33077SSimon Horman      * Definitions of CPG Core Clocks
16*b3a33077SSimon Horman      *
17*b3a33077SSimon Horman      * These include:
18*b3a33077SSimon Horman      *   - Clock outputs exported to DT
19*b3a33077SSimon Horman      *   - External input clocks
20*b3a33077SSimon Horman      *   - Internal CPG clocks
21*b3a33077SSimon Horman      */
22*b3a33077SSimon Horman 
23*b3a33077SSimon Horman struct cpg_core_clk {
24*b3a33077SSimon Horman 	/* Common */
25*b3a33077SSimon Horman 	const char *name;
26*b3a33077SSimon Horman 	unsigned int id;
27*b3a33077SSimon Horman 	unsigned int type;
28*b3a33077SSimon Horman 	/* Depending on type */
29*b3a33077SSimon Horman 	unsigned int parent;	/* Core Clocks only */
30*b3a33077SSimon Horman 	unsigned int div;
31*b3a33077SSimon Horman 	unsigned int mult;
32*b3a33077SSimon Horman 	unsigned int offset;
33*b3a33077SSimon Horman };
34*b3a33077SSimon Horman 
35*b3a33077SSimon Horman enum clk_types {
36*b3a33077SSimon Horman 	/* Generic */
37*b3a33077SSimon Horman 	CLK_TYPE_IN,		/* External Clock Input */
38*b3a33077SSimon Horman 	CLK_TYPE_FF,		/* Fixed Factor Clock */
39*b3a33077SSimon Horman 	CLK_TYPE_DIV6P1,	/* DIV6 Clock with 1 parent clock */
40*b3a33077SSimon Horman 
41*b3a33077SSimon Horman 	/* Custom definitions start here */
42*b3a33077SSimon Horman 	CLK_TYPE_CUSTOM,
43*b3a33077SSimon Horman };
44*b3a33077SSimon Horman 
45*b3a33077SSimon Horman #define DEF_TYPE(_name, _id, _type...)	\
46*b3a33077SSimon Horman 	{ .name = _name, .id = _id, .type = _type }
47*b3a33077SSimon Horman #define DEF_BASE(_name, _id, _type, _parent...)	\
48*b3a33077SSimon Horman 	DEF_TYPE(_name, _id, _type, .parent = _parent)
49*b3a33077SSimon Horman 
50*b3a33077SSimon Horman #define DEF_INPUT(_name, _id) \
51*b3a33077SSimon Horman 	DEF_TYPE(_name, _id, CLK_TYPE_IN)
52*b3a33077SSimon Horman #define DEF_FIXED(_name, _id, _parent, _div, _mult)	\
53*b3a33077SSimon Horman 	DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult)
54*b3a33077SSimon Horman #define DEF_DIV6P1(_name, _id, _parent, _offset)	\
55*b3a33077SSimon Horman 	DEF_BASE(_name, _id, CLK_TYPE_DIV6P1, _parent, .offset = _offset)
56*b3a33077SSimon Horman #define DEF_SD(_name, _id, _parent, _offset)	\
57*b3a33077SSimon Horman 	DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset)
58*b3a33077SSimon Horman 
59*b3a33077SSimon Horman 
60*b3a33077SSimon Horman     /*
61*b3a33077SSimon Horman      * Definitions of Module Clocks
62*b3a33077SSimon Horman      */
63*b3a33077SSimon Horman 
64*b3a33077SSimon Horman struct mssr_mod_clk {
65*b3a33077SSimon Horman 	const char *name;
66*b3a33077SSimon Horman 	unsigned int id;
67*b3a33077SSimon Horman 	unsigned int parent;	/* Add MOD_CLK_BASE for Module Clocks */
68*b3a33077SSimon Horman };
69*b3a33077SSimon Horman 
70*b3a33077SSimon Horman /* Convert from sparse base-100 to packed index space */
71*b3a33077SSimon Horman #define MOD_CLK_PACK(x)	((x) - ((x) / 100) * (100 - 32))
72*b3a33077SSimon Horman 
73*b3a33077SSimon Horman #define MOD_CLK_ID(x)	(MOD_CLK_BASE + MOD_CLK_PACK(x))
74*b3a33077SSimon Horman 
75*b3a33077SSimon Horman #define DEF_MOD(_name, _mod, _parent...)	\
76*b3a33077SSimon Horman 	{ .name = _name, .id = MOD_CLK_ID(_mod), .parent = _parent }
77*b3a33077SSimon Horman 
78*b3a33077SSimon Horman 
79*b3a33077SSimon Horman struct device_node;
80*b3a33077SSimon Horman 
81*b3a33077SSimon Horman     /**
82*b3a33077SSimon Horman      * SoC-specific CPG/MSSR Description
83*b3a33077SSimon Horman      *
84*b3a33077SSimon Horman      * @core_clks: Array of Core Clock definitions
85*b3a33077SSimon Horman      * @num_core_clks: Number of entries in core_clks[]
86*b3a33077SSimon Horman      * @last_dt_core_clk: ID of the last Core Clock exported to DT
87*b3a33077SSimon Horman      * @num_total_core_clks: Total number of Core Clocks (exported + internal)
88*b3a33077SSimon Horman      *
89*b3a33077SSimon Horman      * @mod_clks: Array of Module Clock definitions
90*b3a33077SSimon Horman      * @num_mod_clks: Number of entries in mod_clks[]
91*b3a33077SSimon Horman      * @num_hw_mod_clks: Number of Module Clocks supported by the hardware
92*b3a33077SSimon Horman      *
93*b3a33077SSimon Horman      * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
94*b3a33077SSimon Horman      *                 should not be disabled without a knowledgeable driver
95*b3a33077SSimon Horman      * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
96*b3a33077SSimon Horman      *
97*b3a33077SSimon Horman      * @core_pm_clks: Array with IDs of Core Clocks that are suitable for Power
98*b3a33077SSimon Horman      *                Management, in addition to Module Clocks
99*b3a33077SSimon Horman      * @num_core_pm_clks: Number of entries in core_pm_clks[]
100*b3a33077SSimon Horman      *
101*b3a33077SSimon Horman      * @init: Optional callback to perform SoC-specific initialization
102*b3a33077SSimon Horman      * @cpg_clk_register: Optional callback to handle special Core Clock types
103*b3a33077SSimon Horman      */
104*b3a33077SSimon Horman 
105*b3a33077SSimon Horman struct cpg_mssr_info {
106*b3a33077SSimon Horman 	/* Core Clocks */
107*b3a33077SSimon Horman 	const struct cpg_core_clk *core_clks;
108*b3a33077SSimon Horman 	unsigned int num_core_clks;
109*b3a33077SSimon Horman 	unsigned int last_dt_core_clk;
110*b3a33077SSimon Horman 	unsigned int num_total_core_clks;
111*b3a33077SSimon Horman 
112*b3a33077SSimon Horman 	/* Module Clocks */
113*b3a33077SSimon Horman 	const struct mssr_mod_clk *mod_clks;
114*b3a33077SSimon Horman 	unsigned int num_mod_clks;
115*b3a33077SSimon Horman 	unsigned int num_hw_mod_clks;
116*b3a33077SSimon Horman 
117*b3a33077SSimon Horman 	/* Critical Module Clocks that should not be disabled */
118*b3a33077SSimon Horman 	const unsigned int *crit_mod_clks;
119*b3a33077SSimon Horman 	unsigned int num_crit_mod_clks;
120*b3a33077SSimon Horman 
121*b3a33077SSimon Horman 	/* Core Clocks suitable for PM, in addition to the Module Clocks */
122*b3a33077SSimon Horman 	const unsigned int *core_pm_clks;
123*b3a33077SSimon Horman 	unsigned int num_core_pm_clks;
124*b3a33077SSimon Horman 
125*b3a33077SSimon Horman 	/* Callbacks */
126*b3a33077SSimon Horman 	int (*init)(struct device *dev);
127*b3a33077SSimon Horman 	struct clk *(*cpg_clk_register)(struct device *dev,
128*b3a33077SSimon Horman 					const struct cpg_core_clk *core,
129*b3a33077SSimon Horman 					const struct cpg_mssr_info *info,
130*b3a33077SSimon Horman 					struct clk **clks, void __iomem *base);
131*b3a33077SSimon Horman };
132*b3a33077SSimon Horman 
133*b3a33077SSimon Horman extern const struct cpg_mssr_info r8a7795_cpg_mssr_info;
134*b3a33077SSimon Horman #endif
135