Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
fork
Configure Feed
Select the types of activity you want to include in your feed.
1/* SPDX-License-Identifier: GPL-2.0 */
2//
3// Spreadtrum gate clock driver
4//
5// Copyright (C) 2017 Spreadtrum, Inc.
6// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
7
8#ifndef _SPRD_GATE_H_
9#define _SPRD_GATE_H_
10
11#include "common.h"
12
13struct sprd_gate {
14 u32 enable_mask;
15 u16 flags;
16 u16 sc_offset;
17 u16 udelay;
18
19 struct sprd_clk_common common;
20};
21
22#define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
23 _sc_offset, _enable_mask, _flags, \
24 _gate_flags, _udelay, _ops, _fn) \
25 struct sprd_gate _struct = { \
26 .enable_mask = _enable_mask, \
27 .sc_offset = _sc_offset, \
28 .flags = _gate_flags, \
29 .udelay = _udelay, \
30 .common = { \
31 .regmap = NULL, \
32 .reg = _reg, \
33 .hw.init = _fn(_name, _parent, \
34 _ops, _flags), \
35 } \
36 }
37
38#define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
39 _sc_offset, _enable_mask, _flags, \
40 _gate_flags, _udelay, _ops) \
41 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
42 _sc_offset, _enable_mask, _flags, \
43 _gate_flags, _udelay, _ops, CLK_HW_INIT)
44
45#define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \
46 _enable_mask, _flags, _gate_flags, _ops) \
47 SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
48 _sc_offset, _enable_mask, _flags, \
49 _gate_flags, 0, _ops)
50
51#define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \
52 _enable_mask, _flags, _gate_flags) \
53 SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \
54 _enable_mask, _flags, _gate_flags, \
55 &sprd_sc_gate_ops)
56
57#define SPRD_GATE_CLK(_struct, _name, _parent, _reg, \
58 _enable_mask, _flags, _gate_flags) \
59 SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0, \
60 _enable_mask, _flags, _gate_flags, \
61 &sprd_gate_ops)
62
63#define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \
64 _enable_mask, _flags, _gate_flags, \
65 _udelay) \
66 SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
67 _sc_offset, _enable_mask, _flags, \
68 _gate_flags, _udelay, \
69 &sprd_pll_sc_gate_ops)
70
71
72#define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
73 _sc_offset, _enable_mask, \
74 _flags, _gate_flags, \
75 _udelay, _ops) \
76 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
77 _sc_offset, _enable_mask, _flags, \
78 _gate_flags, _udelay, _ops, \
79 CLK_HW_INIT_HW)
80
81#define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \
82 _sc_offset, _enable_mask, _flags, \
83 _gate_flags, _ops) \
84 SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
85 _sc_offset, _enable_mask, \
86 _flags, _gate_flags, 0, _ops)
87
88#define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \
89 _sc_offset, _enable_mask, _flags, \
90 _gate_flags) \
91 SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \
92 _sc_offset, _enable_mask, _flags, \
93 _gate_flags, &sprd_sc_gate_ops)
94
95#define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg, \
96 _enable_mask, _flags, _gate_flags) \
97 SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0, \
98 _enable_mask, _flags, _gate_flags, \
99 &sprd_gate_ops)
100
101#define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \
102 _sc_offset, _enable_mask, _flags, \
103 _gate_flags, _udelay) \
104 SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
105 _sc_offset, _enable_mask, \
106 _flags, _gate_flags, _udelay, \
107 &sprd_pll_sc_gate_ops)
108
109#define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
110 _reg, _sc_offset, \
111 _enable_mask, _flags, \
112 _gate_flags, _udelay, _ops) \
113 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
114 _sc_offset, _enable_mask, _flags, \
115 _gate_flags, _udelay, _ops, \
116 CLK_HW_INIT_FW_NAME)
117
118#define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \
119 _sc_offset, _enable_mask, _flags, \
120 _gate_flags, _ops) \
121 SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
122 _reg, _sc_offset, \
123 _enable_mask, _flags, \
124 _gate_flags, 0, _ops)
125
126#define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
127 _sc_offset, _enable_mask, _flags, \
128 _gate_flags) \
129 SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \
130 _sc_offset, _enable_mask, _flags, \
131 _gate_flags, &sprd_sc_gate_ops)
132
133#define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
134 _enable_mask, _flags, _gate_flags) \
135 SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0, \
136 _enable_mask, _flags, _gate_flags, \
137 &sprd_gate_ops)
138
139#define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
140 _sc_offset, _enable_mask, _flags, \
141 _gate_flags, _udelay) \
142 SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
143 _reg, _sc_offset, \
144 _enable_mask, _flags, \
145 _gate_flags, _udelay, \
146 &sprd_pll_sc_gate_ops)
147
148static inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw)
149{
150 struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
151
152 return container_of(common, struct sprd_gate, common);
153}
154
155extern const struct clk_ops sprd_gate_ops;
156extern const struct clk_ops sprd_sc_gate_ops;
157extern const struct clk_ops sprd_pll_sc_gate_ops;
158
159#endif /* _SPRD_GATE_H_ */