Merge tag 'linux-kselftest-kunit-6.1-rc1-2' of git://git.kernel.org/pub/scm/linux...
[linux-block.git] / drivers / clk / sprd / composite.h
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
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_ */