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