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