1
2
3
4
5
6
7
8#ifndef _SURFACE_AGGREGATOR_CONTROLLER_H
9#define _SURFACE_AGGREGATOR_CONTROLLER_H
10
11#include <linux/kref.h>
12#include <linux/list.h>
13#include <linux/mutex.h>
14#include <linux/rbtree.h>
15#include <linux/rwsem.h>
16#include <linux/serdev.h>
17#include <linux/spinlock.h>
18#include <linux/srcu.h>
19#include <linux/types.h>
20#include <linux/workqueue.h>
21
22#include <linux/surface_aggregator/controller.h>
23#include <linux/surface_aggregator/serial_hub.h>
24
25#include "ssh_request_layer.h"
26
27
28
29
30
31
32
33
34struct ssh_seq_counter {
35 u8 value;
36};
37
38
39
40
41
42struct ssh_rqid_counter {
43 u16 value;
44};
45
46
47
48
49
50
51
52
53
54struct ssam_nf_head {
55 struct srcu_struct srcu;
56 struct list_head head;
57};
58
59
60
61
62
63
64
65
66
67
68struct ssam_nf {
69 struct mutex lock;
70 struct rb_root refcount;
71 struct ssam_nf_head head[SSH_NUM_EVENTS];
72};
73
74
75
76
77struct ssam_cplt;
78
79
80
81
82
83
84
85
86
87struct ssam_event_item {
88 struct list_head node;
89 u16 rqid;
90
91 struct {
92 void (*free)(struct ssam_event_item *event);
93 } ops;
94
95 struct ssam_event event;
96};
97
98
99
100
101
102
103
104
105struct ssam_event_queue {
106 struct ssam_cplt *cplt;
107
108 spinlock_t lock;
109 struct list_head head;
110 struct work_struct work;
111};
112
113
114
115
116
117struct ssam_event_target {
118 struct ssam_event_queue queue[SSH_NUM_EVENTS];
119};
120
121
122
123
124
125
126
127
128
129
130
131struct ssam_cplt {
132 struct device *dev;
133 struct workqueue_struct *wq;
134
135 struct {
136 struct ssam_event_target target[SSH_NUM_TARGETS];
137 struct ssam_nf notif;
138 } event;
139};
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157enum ssam_controller_state {
158 SSAM_CONTROLLER_UNINITIALIZED,
159 SSAM_CONTROLLER_INITIALIZED,
160 SSAM_CONTROLLER_STARTED,
161 SSAM_CONTROLLER_STOPPED,
162 SSAM_CONTROLLER_SUSPENDED,
163};
164
165
166
167
168
169
170
171
172
173
174
175struct ssam_controller_caps {
176 u32 ssh_power_profile;
177 u32 ssh_buffer_size;
178 u32 screen_on_sleep_idle_timeout;
179 u32 screen_off_sleep_idle_timeout;
180 u32 d3_closes_handle:1;
181};
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198struct ssam_controller {
199 struct kref kref;
200
201 struct rw_semaphore lock;
202 enum ssam_controller_state state;
203
204 struct ssh_rtl rtl;
205 struct ssam_cplt cplt;
206
207 struct {
208 struct ssh_seq_counter seq;
209 struct ssh_rqid_counter rqid;
210 } counter;
211
212 struct {
213 int num;
214 bool wakeup_enabled;
215 } irq;
216
217 struct ssam_controller_caps caps;
218};
219
220#define to_ssam_controller(ptr, member) \
221 container_of(ptr, struct ssam_controller, member)
222
223#define ssam_dbg(ctrl, fmt, ...) rtl_dbg(&(ctrl)->rtl, fmt, ##__VA_ARGS__)
224#define ssam_info(ctrl, fmt, ...) rtl_info(&(ctrl)->rtl, fmt, ##__VA_ARGS__)
225#define ssam_warn(ctrl, fmt, ...) rtl_warn(&(ctrl)->rtl, fmt, ##__VA_ARGS__)
226#define ssam_err(ctrl, fmt, ...) rtl_err(&(ctrl)->rtl, fmt, ##__VA_ARGS__)
227
228
229
230
231
232
233
234
235
236
237
238
239
240static inline
241int ssam_controller_receive_buf(struct ssam_controller *ctrl,
242 const unsigned char *buf, size_t n)
243{
244 return ssh_ptl_rx_rcvbuf(&ctrl->rtl.ptl, buf, n);
245}
246
247
248
249
250
251
252static inline void ssam_controller_write_wakeup(struct ssam_controller *ctrl)
253{
254 ssh_ptl_tx_wakeup_transfer(&ctrl->rtl.ptl);
255}
256
257int ssam_controller_init(struct ssam_controller *ctrl, struct serdev_device *s);
258int ssam_controller_start(struct ssam_controller *ctrl);
259void ssam_controller_shutdown(struct ssam_controller *ctrl);
260void ssam_controller_destroy(struct ssam_controller *ctrl);
261
262int ssam_notifier_disable_registered(struct ssam_controller *ctrl);
263void ssam_notifier_restore_registered(struct ssam_controller *ctrl);
264
265int ssam_irq_setup(struct ssam_controller *ctrl);
266void ssam_irq_free(struct ssam_controller *ctrl);
267int ssam_irq_arm_for_wakeup(struct ssam_controller *ctrl);
268void ssam_irq_disarm_wakeup(struct ssam_controller *ctrl);
269
270void ssam_controller_lock(struct ssam_controller *c);
271void ssam_controller_unlock(struct ssam_controller *c);
272
273int ssam_get_firmware_version(struct ssam_controller *ctrl, u32 *version);
274int ssam_ctrl_notif_display_off(struct ssam_controller *ctrl);
275int ssam_ctrl_notif_display_on(struct ssam_controller *ctrl);
276int ssam_ctrl_notif_d0_exit(struct ssam_controller *ctrl);
277int ssam_ctrl_notif_d0_entry(struct ssam_controller *ctrl);
278
279int ssam_controller_suspend(struct ssam_controller *ctrl);
280int ssam_controller_resume(struct ssam_controller *ctrl);
281
282int ssam_event_item_cache_init(void);
283void ssam_event_item_cache_destroy(void);
284
285#endif
286