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
;
36 struct ccu_common common
;
39 #define SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
42 _muxshift, _muxwidth, \
44 struct ccu_mp _struct = { \
46 .m = _SUNXI_CCU_DIV(_mshift, _mwidth), \
47 .p = _SUNXI_CCU_DIV(_pshift, _pwidth), \
48 .mux = _SUNXI_CCU_MUX(_muxshift, _muxwidth), \
51 .hw.init = CLK_HW_INIT_PARENTS(_name, \
58 #define SUNXI_CCU_MP_WITH_MUX(_struct, _name, _parents, _reg, \
61 _muxshift, _muxwidth, \
63 SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
66 _muxshift, _muxwidth, \
69 static inline struct ccu_mp
*hw_to_ccu_mp(struct clk_hw
*hw
)
71 struct ccu_common
*common
= hw_to_ccu_common(hw
);
73 return container_of(common
, struct ccu_mp
, common
);
76 extern const struct clk_ops ccu_mp_ops
;
79 * Special class of M-P clock that supports MMC timing modes
81 * Since the MMC clock registers all follow the same layout, we can
82 * simplify the macro for this particular case. In addition, as
83 * switching modes also affects the output clock rate, we need to
84 * have CLK_GET_RATE_NOCACHE for all these types of clocks.
87 #define SUNXI_CCU_MP_MMC_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
89 struct ccu_mp _struct = { \
91 .m = _SUNXI_CCU_DIV(0, 4), \
92 .p = _SUNXI_CCU_DIV(16, 2), \
93 .mux = _SUNXI_CCU_MUX(24, 2), \
96 .features = CCU_FEATURE_MMC_TIMING_SWITCH, \
97 .hw.init = CLK_HW_INIT_PARENTS(_name, \
100 CLK_GET_RATE_NOCACHE | \
105 extern const struct clk_ops ccu_mp_mmc_ops
;
107 #endif /* _CCU_MP_H_ */