• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2016 Maxime Ripard. All rights reserved.
4  */
5 
6 #ifndef _CCU_GATE_H_
7 #define _CCU_GATE_H_
8 
9 #include <linux/clk-provider.h>
10 
11 #include "ccu_common.h"
12 
13 struct ccu_gate {
14 	u32			enable;
15 	u32			fixed_rate;
16 
17 	struct ccu_common	common;
18 };
19 
20 #define SUNXI_CCU_GATE_WITH_FIXED_RATE(_struct, _name, _parent, _reg,	\
21 				       _fixed_rate, _gate)	\
22 	struct ccu_gate _struct = {					\
23 		.enable		= _gate,				\
24 		.fixed_rate	= _fixed_rate,				\
25 		.common	= {						\
26 			.reg		= _reg,				\
27 			.features	= CCU_FEATURE_FIXED_RATE_GATE,	\
28 			.hw.init	= CLK_HW_INIT(_name,		\
29 						      _parent,		\
30 						      &ccu_gate_ops,	\
31 						      0),		\
32 		}							\
33 	}
34 
35 #define SUNXI_CCU_GATE_WITH_PREDIV(_struct, _name, _parent, _reg,	\
36 				   _prediv, _gate, _flags)		\
37 	struct ccu_gate _struct = {					\
38 		.enable	= _gate,					\
39 		.common	= {						\
40 			.reg		= _reg,				\
41 			.prediv		= _prediv,			\
42 			.features	= CCU_FEATURE_ALL_PREDIV,	\
43 			.hw.init	= CLK_HW_INIT(_name,		\
44 						      _parent,		\
45 						      &ccu_gate_ops,	\
46 						      _flags),		\
47 		}							\
48 	}
49 
50 #define SUNXI_CCU_GATE_WITH_KEY(_struct, _name, _parent, _reg,		\
51 				_key_value, _gate, _flags)		\
52 	struct ccu_gate _struct = {					\
53 		.enable	= _gate,					\
54 		.common	= {						\
55 			.reg		= _reg,				\
56 			.key_value	= _key_value,			\
57 			.features	= CCU_FEATURE_KEY_FIELD_MOD,	\
58 			.hw.init	= CLK_HW_INIT(_name,		\
59 						      _parent,		\
60 						      &ccu_gate_ops,	\
61 						      _flags),		\
62 		}							\
63 	}
64 
65 #define SUNXI_CCU_GATE(_struct, _name, _parent, _reg, _gate, _flags)	\
66 	struct ccu_gate _struct = {					\
67 		.enable	= _gate,					\
68 		.common	= {						\
69 			.reg		= _reg,				\
70 			.hw.init	= CLK_HW_INIT(_name,		\
71 						      _parent,		\
72 						      &ccu_gate_ops,	\
73 						      _flags),		\
74 		}							\
75 	}
76 
77 #define SUNXI_CCU_GATE_HW(_struct, _name, _parent, _reg, _gate, _flags)	\
78 	struct ccu_gate _struct = {					\
79 		.enable	= _gate,					\
80 		.common	= {						\
81 			.reg		= _reg,				\
82 			.hw.init	= CLK_HW_INIT_HW(_name,		\
83 							 _parent,	\
84 							 &ccu_gate_ops,	\
85 							 _flags),	\
86 		}							\
87 	}
88 
89 #define SUNXI_CCU_GATE_FW(_struct, _name, _parent, _reg, _gate, _flags)	\
90 	struct ccu_gate _struct = {					\
91 		.enable	= _gate,					\
92 		.common	= {						\
93 			.reg		= _reg,				\
94 			.hw.init	= CLK_HW_INIT_FW_NAME(_name,	\
95 							      _parent,	\
96 							      &ccu_gate_ops, \
97 							      _flags),	\
98 		}							\
99 	}
100 
101 /*
102  * The following two macros allow the re-use of the data structure
103  * holding the parent info.
104  */
105 #define SUNXI_CCU_GATE_HWS(_struct, _name, _parent, _reg, _gate, _flags) \
106 	struct ccu_gate _struct = {					\
107 		.enable	= _gate,					\
108 		.common	= {						\
109 			.reg		= _reg,				\
110 			.hw.init	= CLK_HW_INIT_HWS(_name,	\
111 							  _parent,	\
112 							  &ccu_gate_ops, \
113 							  _flags),	\
114 		}							\
115 	}
116 
117 #define SUNXI_CCU_GATE_DATA(_struct, _name, _data, _reg, _gate, _flags)	\
118 	struct ccu_gate _struct = {					\
119 		.enable	= _gate,					\
120 		.common	= {						\
121 			.reg		= _reg,				\
122 			.hw.init	=				\
123 				CLK_HW_INIT_PARENTS_DATA(_name,		\
124 							 _data,		\
125 							 &ccu_gate_ops,	\
126 							 _flags),	\
127 		}							\
128 	}
129 
hw_to_ccu_gate(struct clk_hw * hw)130 static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
131 {
132 	struct ccu_common *common = hw_to_ccu_common(hw);
133 
134 	return container_of(common, struct ccu_gate, common);
135 }
136 
137 void ccu_gate_helper_disable(struct ccu_common *common, u32 gate);
138 int ccu_gate_helper_enable(struct ccu_common *common, u32 gate);
139 int ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate);
140 
141 extern const struct clk_ops ccu_gate_ops;
142 
143 #endif /* _CCU_GATE_H_ */
144