xref: /openbmc/linux/drivers/clk/sunxi-ng/ccu_nk.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*9c92ab61SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2adbfb005SMaxime Ripard /*
3adbfb005SMaxime Ripard  * Copyright (c) 2016 Maxime Ripard. All rights reserved.
4adbfb005SMaxime Ripard  */
5adbfb005SMaxime Ripard 
6adbfb005SMaxime Ripard #ifndef _CCU_NK_H_
7adbfb005SMaxime Ripard #define _CCU_NK_H_
8adbfb005SMaxime Ripard 
9adbfb005SMaxime Ripard #include <linux/clk-provider.h>
10adbfb005SMaxime Ripard 
11adbfb005SMaxime Ripard #include "ccu_common.h"
12adbfb005SMaxime Ripard #include "ccu_div.h"
13adbfb005SMaxime Ripard #include "ccu_mult.h"
14adbfb005SMaxime Ripard 
15adbfb005SMaxime Ripard /*
16adbfb005SMaxime Ripard  * struct ccu_nk - Definition of an N-K clock
17adbfb005SMaxime Ripard  *
18adbfb005SMaxime Ripard  * Clocks based on the formula parent * N * K
19adbfb005SMaxime Ripard  */
20adbfb005SMaxime Ripard struct ccu_nk {
21adbfb005SMaxime Ripard 	u16			reg;
22adbfb005SMaxime Ripard 	u32			enable;
23adbfb005SMaxime Ripard 	u32			lock;
24adbfb005SMaxime Ripard 
25a501a14eSMaxime Ripard 	struct ccu_mult_internal	n;
26a501a14eSMaxime Ripard 	struct ccu_mult_internal	k;
27adbfb005SMaxime Ripard 
28adbfb005SMaxime Ripard 	unsigned int		fixed_post_div;
29adbfb005SMaxime Ripard 
30adbfb005SMaxime Ripard 	struct ccu_common	common;
31adbfb005SMaxime Ripard };
32adbfb005SMaxime Ripard 
33adbfb005SMaxime Ripard #define SUNXI_CCU_NK_WITH_GATE_LOCK_POSTDIV(_struct, _name, _parent, _reg, \
34adbfb005SMaxime Ripard 					    _nshift, _nwidth,		\
35adbfb005SMaxime Ripard 					    _kshift, _kwidth,		\
36adbfb005SMaxime Ripard 					    _gate, _lock, _postdiv,	\
37adbfb005SMaxime Ripard 					    _flags)			\
38adbfb005SMaxime Ripard 	struct ccu_nk _struct = {					\
39adbfb005SMaxime Ripard 		.enable		= _gate,				\
40adbfb005SMaxime Ripard 		.lock		= _lock,				\
41adbfb005SMaxime Ripard 		.k		= _SUNXI_CCU_MULT(_kshift, _kwidth),	\
42adbfb005SMaxime Ripard 		.n		= _SUNXI_CCU_MULT(_nshift, _nwidth),	\
43adbfb005SMaxime Ripard 		.fixed_post_div	= _postdiv,				\
44adbfb005SMaxime Ripard 		.common		= {					\
45adbfb005SMaxime Ripard 			.reg		= _reg,				\
46adbfb005SMaxime Ripard 			.features	= CCU_FEATURE_FIXED_POSTDIV,	\
47adbfb005SMaxime Ripard 			.hw.init	= CLK_HW_INIT(_name,		\
48adbfb005SMaxime Ripard 						      _parent,		\
49adbfb005SMaxime Ripard 						      &ccu_nk_ops,	\
50adbfb005SMaxime Ripard 						      _flags),		\
51adbfb005SMaxime Ripard 		},							\
52adbfb005SMaxime Ripard 	}
53adbfb005SMaxime Ripard 
hw_to_ccu_nk(struct clk_hw * hw)54adbfb005SMaxime Ripard static inline struct ccu_nk *hw_to_ccu_nk(struct clk_hw *hw)
55adbfb005SMaxime Ripard {
56adbfb005SMaxime Ripard 	struct ccu_common *common = hw_to_ccu_common(hw);
57adbfb005SMaxime Ripard 
58adbfb005SMaxime Ripard 	return container_of(common, struct ccu_nk, common);
59adbfb005SMaxime Ripard }
60adbfb005SMaxime Ripard 
61adbfb005SMaxime Ripard extern const struct clk_ops ccu_nk_ops;
62adbfb005SMaxime Ripard 
63adbfb005SMaxime Ripard #endif /* _CCU_NK_H_ */
64