2 * Copyright (c) 2016 Maxime Ripard. All rights reserved.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
17 #include <linux/bitops.h>
18 #include <linux/clk-provider.h>
20 #include "ccu_common.h"
26 * struct ccu_mp - Definition of an M-P clock
28 * Clocks based on the formula parent >> P / M
33 struct ccu_div_internal m
;
34 struct ccu_div_internal p
;
35 struct ccu_mux_internal mux
;
37 unsigned int fixed_post_div
;
39 struct ccu_common common
;
42 #define SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(_struct, _name, _parents, _reg, \
45 _muxshift, _muxwidth, \
46 _gate, _postdiv, _flags) \
47 struct ccu_mp _struct = { \
49 .m = _SUNXI_CCU_DIV(_mshift, _mwidth), \
50 .p = _SUNXI_CCU_DIV(_pshift, _pwidth), \
51 .mux = _SUNXI_CCU_MUX(_muxshift, _muxwidth), \
52 .fixed_post_div = _postdiv, \
55 .features = CCU_FEATURE_FIXED_POSTDIV, \
56 .hw.init = CLK_HW_INIT_PARENTS(_name, \
63 #define SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
66 _muxshift, _muxwidth, \
68 struct ccu_mp _struct = { \
70 .m = _SUNXI_CCU_DIV(_mshift, _mwidth), \
71 .p = _SUNXI_CCU_DIV(_pshift, _pwidth), \
72 .mux = _SUNXI_CCU_MUX(_muxshift, _muxwidth), \
75 .hw.init = CLK_HW_INIT_PARENTS(_name, \
82 #define SUNXI_CCU_MP_WITH_MUX(_struct, _name, _parents, _reg, \
85 _muxshift, _muxwidth, \
87 SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
90 _muxshift, _muxwidth, \
93 static inline struct ccu_mp
*hw_to_ccu_mp(struct clk_hw
*hw
)
95 struct ccu_common
*common
= hw_to_ccu_common(hw
);
97 return container_of(common
, struct ccu_mp
, common
);
100 extern const struct clk_ops ccu_mp_ops
;
103 * Special class of M-P clock that supports MMC timing modes
105 * Since the MMC clock registers all follow the same layout, we can
106 * simplify the macro for this particular case. In addition, as
107 * switching modes also affects the output clock rate, we need to
108 * have CLK_GET_RATE_NOCACHE for all these types of clocks.
111 #define SUNXI_CCU_MP_MMC_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
113 struct ccu_mp _struct = { \
115 .m = _SUNXI_CCU_DIV(0, 4), \
116 .p = _SUNXI_CCU_DIV(16, 2), \
117 .mux = _SUNXI_CCU_MUX(24, 2), \
120 .features = CCU_FEATURE_MMC_TIMING_SWITCH, \
121 .hw.init = CLK_HW_INIT_PARENTS(_name, \
124 CLK_GET_RATE_NOCACHE | \
129 extern const struct clk_ops ccu_mp_mmc_ops
;
131 #endif /* _CCU_MP_H_ */