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
15struct 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
77static 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
84extern const struct clk_ops sprd_comp_ops;
85
86#endif /* _SPRD_COMPOSITE_H_ */
87