1*1b72c59dSHaylen Chu /* SPDX-License-Identifier: GPL-2.0-only */
2*1b72c59dSHaylen Chu /*
3*1b72c59dSHaylen Chu * Copyright (c) 2024 SpacemiT Technology Co. Ltd
4*1b72c59dSHaylen Chu * Copyright (c) 2024-2025 Haylen Chu <heylenay@4d2.org>
5*1b72c59dSHaylen Chu */
6*1b72c59dSHaylen Chu
7*1b72c59dSHaylen Chu #ifndef _CCU_DDN_H_
8*1b72c59dSHaylen Chu #define _CCU_DDN_H_
9*1b72c59dSHaylen Chu
10*1b72c59dSHaylen Chu #include <linux/bitops.h>
11*1b72c59dSHaylen Chu #include <linux/clk-provider.h>
12*1b72c59dSHaylen Chu
13*1b72c59dSHaylen Chu #include "ccu_common.h"
14*1b72c59dSHaylen Chu
15*1b72c59dSHaylen Chu struct ccu_ddn {
16*1b72c59dSHaylen Chu struct ccu_common common;
17*1b72c59dSHaylen Chu unsigned int num_mask;
18*1b72c59dSHaylen Chu unsigned int num_shift;
19*1b72c59dSHaylen Chu unsigned int den_mask;
20*1b72c59dSHaylen Chu unsigned int den_shift;
21*1b72c59dSHaylen Chu };
22*1b72c59dSHaylen Chu
23*1b72c59dSHaylen Chu #define CCU_DDN_INIT(_name, _parent, _flags) \
24*1b72c59dSHaylen Chu CLK_HW_INIT_HW(#_name, &_parent.common.hw, &spacemit_ccu_ddn_ops, _flags)
25*1b72c59dSHaylen Chu
26*1b72c59dSHaylen Chu #define CCU_DDN_DEFINE(_name, _parent, _reg_ctrl, _num_shift, _num_width, \
27*1b72c59dSHaylen Chu _den_shift, _den_width, _flags) \
28*1b72c59dSHaylen Chu static struct ccu_ddn _name = { \
29*1b72c59dSHaylen Chu .common = { \
30*1b72c59dSHaylen Chu .reg_ctrl = _reg_ctrl, \
31*1b72c59dSHaylen Chu .hw.init = CCU_DDN_INIT(_name, _parent, _flags), \
32*1b72c59dSHaylen Chu }, \
33*1b72c59dSHaylen Chu .num_mask = GENMASK(_num_shift + _num_width - 1, _num_shift), \
34*1b72c59dSHaylen Chu .num_shift = _num_shift, \
35*1b72c59dSHaylen Chu .den_mask = GENMASK(_den_shift + _den_width - 1, _den_shift), \
36*1b72c59dSHaylen Chu .den_shift = _den_shift, \
37*1b72c59dSHaylen Chu }
38*1b72c59dSHaylen Chu
hw_to_ccu_ddn(struct clk_hw * hw)39*1b72c59dSHaylen Chu static inline struct ccu_ddn *hw_to_ccu_ddn(struct clk_hw *hw)
40*1b72c59dSHaylen Chu {
41*1b72c59dSHaylen Chu struct ccu_common *common = hw_to_ccu_common(hw);
42*1b72c59dSHaylen Chu
43*1b72c59dSHaylen Chu return container_of(common, struct ccu_ddn, common);
44*1b72c59dSHaylen Chu }
45*1b72c59dSHaylen Chu
46*1b72c59dSHaylen Chu extern const struct clk_ops spacemit_ccu_ddn_ops;
47*1b72c59dSHaylen Chu
48*1b72c59dSHaylen Chu #endif
49