1 /* SPDX-License-Identifier: GPL-2.0 */
2 //
3 // Spreadtrum composite clock driver
4 //
5 // Copyright (C) 2017 Spreadtrum, Inc.
6 // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
7
8 #ifndef _SPRD_COMPOSITE_H_
9 #define _SPRD_COMPOSITE_H_
10
11 #include "common.h"
12 #include "mux.h"
13 #include "div.h"
14
15 struct sprd_comp {
16 struct sprd_mux_ssel mux;
17 struct sprd_div_internal div;
18 struct sprd_clk_common common;
19 };
20
21 #define SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \
22 _mshift, _mwidth, _doffset, _dshift, \
23 _dwidth, _flags, _fn) \
24 struct sprd_comp _struct = { \
25 .mux = _SPRD_MUX_CLK(_mshift, _mwidth, _table), \
26 .div = _SPRD_DIV_CLK(_doffset, _dshift, _dwidth), \
27 .common = { \
28 .regmap = NULL, \
29 .reg = _reg, \
30 .hw.init = _fn(_name, _parent, \
31 &sprd_comp_ops, _flags), \
32 } \
33 }
34
35 #define SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, _table, \
36 _mshift, _mwidth, _dshift, _dwidth, _flags) \
37 SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \
38 _mshift, _mwidth, 0x0, _dshift, \
39 _dwidth, _flags, CLK_HW_INIT_PARENTS)
40
41 #define SPRD_COMP_CLK(_struct, _name, _parent, _reg, _mshift, \
42 _mwidth, _dshift, _dwidth, _flags) \
43 SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, NULL, \
44 _mshift, _mwidth, _dshift, _dwidth, _flags)
45
46 #define SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, _table, \
47 _mshift, _mwidth, _dshift, \
48 _dwidth, _flags) \
49 SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \
50 _mshift, _mwidth, 0x0, _dshift, \
51 _dwidth, _flags, \
52 CLK_HW_INIT_PARENTS_DATA)
53
54 #define SPRD_COMP_CLK_DATA(_struct, _name, _parent, _reg, _mshift, \
55 _mwidth, _dshift, _dwidth, _flags) \
56 SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, NULL, \
57 _mshift, _mwidth, _dshift, _dwidth, \
58 _flags)
59
60 #define SPRD_COMP_CLK_DATA_TABLE_OFFSET(_struct, _name, _parent, _reg, \
61 _table, _mshift, _mwidth, \
62 _doffset, _dshift, _dwidth, \
63 _flags) \
64 SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \
65 _mshift, _mwidth, _doffset, _dshift, \
66 _dwidth, _flags, \
67 CLK_HW_INIT_PARENTS_DATA)
68
69 #define SPRD_COMP_CLK_DATA_OFFSET(_struct, _name, _parent, _reg, \
70 _mshift, _mwidth, _doffset, _dshift, \
71 _dwidth, _flags) \
72 SPRD_COMP_CLK_DATA_TABLE_OFFSET(_struct, _name, _parent, _reg, \
73 NULL, _mshift, _mwidth, \
74 _doffset, _dshift, _dwidth, \
75 _flags)
76
hw_to_sprd_comp(const struct clk_hw * hw)77 static inline struct sprd_comp *hw_to_sprd_comp(const struct clk_hw *hw)
78 {
79 struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
80
81 return container_of(common, struct sprd_comp, common);
82 }
83
84 extern const struct clk_ops sprd_comp_ops;
85
86 #endif /* _SPRD_COMPOSITE_H_ */
87