|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | // | 
|  | // Spreadtrum composite clock driver | 
|  | // | 
|  | // Copyright (C) 2017 Spreadtrum, Inc. | 
|  | // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> | 
|  |  | 
|  | #ifndef _SPRD_COMPOSITE_H_ | 
|  | #define _SPRD_COMPOSITE_H_ | 
|  |  | 
|  | #include "common.h" | 
|  | #include "mux.h" | 
|  | #include "div.h" | 
|  |  | 
|  | struct sprd_comp { | 
|  | struct sprd_mux_ssel	mux; | 
|  | struct sprd_div_internal	div; | 
|  | struct sprd_clk_common	common; | 
|  | }; | 
|  |  | 
|  | #define SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table,	\ | 
|  | _mshift, _mwidth, _doffset, _dshift,	\ | 
|  | _dwidth, _flags, _fn)			\ | 
|  | struct sprd_comp _struct = {					\ | 
|  | .mux	= _SPRD_MUX_CLK(_mshift, _mwidth, _table),	\ | 
|  | .div	= _SPRD_DIV_CLK(_doffset, _dshift, _dwidth),	\ | 
|  | .common = {						\ | 
|  | .regmap		= NULL,				\ | 
|  | .reg		= _reg,				\ | 
|  | .hw.init = _fn(_name, _parent,			\ | 
|  | &sprd_comp_ops, _flags),		\ | 
|  | }							\ | 
|  | } | 
|  |  | 
|  | #define SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, _table,	\ | 
|  | _mshift, _mwidth, _dshift, _dwidth, _flags)	\ | 
|  | SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table,	\ | 
|  | _mshift, _mwidth, 0x0, _dshift,	\ | 
|  | _dwidth, _flags, CLK_HW_INIT_PARENTS) | 
|  |  | 
|  | #define SPRD_COMP_CLK(_struct, _name, _parent, _reg, _mshift,		\ | 
|  | _mwidth, _dshift, _dwidth, _flags)		\ | 
|  | SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, NULL,	\ | 
|  | _mshift, _mwidth, _dshift, _dwidth, _flags) | 
|  |  | 
|  | #define SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, _table,	\ | 
|  | _mshift, _mwidth, _dshift,		\ | 
|  | _dwidth, _flags)			\ | 
|  | SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table,	\ | 
|  | _mshift, _mwidth, 0x0, _dshift,	\ | 
|  | _dwidth, _flags,			\ | 
|  | CLK_HW_INIT_PARENTS_DATA) | 
|  |  | 
|  | #define SPRD_COMP_CLK_DATA(_struct, _name, _parent, _reg, _mshift,	\ | 
|  | _mwidth, _dshift, _dwidth, _flags)		\ | 
|  | SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, NULL,	\ | 
|  | _mshift, _mwidth, _dshift, _dwidth,	\ | 
|  | _flags) | 
|  |  | 
|  | #define SPRD_COMP_CLK_DATA_TABLE_OFFSET(_struct, _name, _parent, _reg,	\ | 
|  | _table, _mshift, _mwidth,	\ | 
|  | _doffset, _dshift, _dwidth,	\ | 
|  | _flags)				\ | 
|  | SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table,	\ | 
|  | _mshift, _mwidth, _doffset, _dshift,	\ | 
|  | _dwidth, _flags,			\ | 
|  | CLK_HW_INIT_PARENTS_DATA) | 
|  |  | 
|  | #define SPRD_COMP_CLK_DATA_OFFSET(_struct, _name, _parent, _reg,	\ | 
|  | _mshift, _mwidth, _doffset, _dshift,	\ | 
|  | _dwidth, _flags)			\ | 
|  | SPRD_COMP_CLK_DATA_TABLE_OFFSET(_struct, _name, _parent, _reg,	\ | 
|  | NULL, _mshift, _mwidth,		\ | 
|  | _doffset, _dshift, _dwidth,	\ | 
|  | _flags) | 
|  |  | 
|  | static inline struct sprd_comp *hw_to_sprd_comp(const struct clk_hw *hw) | 
|  | { | 
|  | struct sprd_clk_common *common = hw_to_sprd_clk_common(hw); | 
|  |  | 
|  | return container_of(common, struct sprd_comp, common); | 
|  | } | 
|  |  | 
|  | extern const struct clk_ops sprd_comp_ops; | 
|  |  | 
|  | #endif /* _SPRD_COMPOSITE_H_ */ |