xref: /linux/drivers/clk/sprd/composite.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
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