Linux Audio

Check our new training course

Loading...
 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, _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
59static 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
66extern const struct clk_ops sprd_comp_ops;
67
68#endif /* _SPRD_COMPOSITE_H_ */