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, _dshift, _dwidth,	\
23 				 _flags, _fn)				\
24 	struct sprd_comp _struct = {					\
25 		.mux	= _SPRD_MUX_CLK(_mshift, _mwidth, _table),	\
26 		.div	= _SPRD_DIV_CLK(_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, _dshift, _dwidth,	\
39 				 _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, _dshift, _dwidth,	\
51 				 _flags, CLK_HW_INIT_PARENTS_DATA)
52 
53 #define SPRD_COMP_CLK_DATA(_struct, _name, _parent, _reg, _mshift,	\
54 			   _mwidth, _dshift, _dwidth, _flags)		\
55 	SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg,	NULL,	\
56 				 _mshift, _mwidth, _dshift, _dwidth,	\
57 				 _flags)
58 
hw_to_sprd_comp(const struct clk_hw * hw)59 static inline struct sprd_comp *hw_to_sprd_comp(const struct clk_hw *hw)
60 {
61 	struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
62 
63 	return container_of(common, struct sprd_comp, common);
64 }
65 
66 extern const struct clk_ops sprd_comp_ops;
67 
68 #endif /* _SPRD_COMPOSITE_H_ */
69