GNU Linux-libre 4.14.290-gnu1
[releases.git] / drivers / staging / greybus / svc.c
1 /*
2  * SVC Greybus driver.
3  *
4  * Copyright 2015 Google Inc.
5  * Copyright 2015 Linaro Ltd.
6  *
7  * Released under the GPLv2 only.
8  */
9
10 #include <linux/debugfs.h>
11 #include <linux/workqueue.h>
12
13 #include "greybus.h"
14
15 #define SVC_INTF_EJECT_TIMEOUT          9000
16 #define SVC_INTF_ACTIVATE_TIMEOUT       6000
17 #define SVC_INTF_RESUME_TIMEOUT         3000
18
19 struct gb_svc_deferred_request {
20         struct work_struct work;
21         struct gb_operation *operation;
22 };
23
24
25 static int gb_svc_queue_deferred_request(struct gb_operation *operation);
26
27 static ssize_t endo_id_show(struct device *dev,
28                         struct device_attribute *attr, char *buf)
29 {
30         struct gb_svc *svc = to_gb_svc(dev);
31
32         return sprintf(buf, "0x%04x\n", svc->endo_id);
33 }
34 static DEVICE_ATTR_RO(endo_id);
35
36 static ssize_t ap_intf_id_show(struct device *dev,
37                         struct device_attribute *attr, char *buf)
38 {
39         struct gb_svc *svc = to_gb_svc(dev);
40
41         return sprintf(buf, "%u\n", svc->ap_intf_id);
42 }
43 static DEVICE_ATTR_RO(ap_intf_id);
44
45 // FIXME
46 // This is a hack, we need to do this "right" and clean the interface up
47 // properly, not just forcibly yank the thing out of the system and hope for the
48 // best.  But for now, people want their modules to come out without having to
49 // throw the thing to the ground or get out a screwdriver.
50 static ssize_t intf_eject_store(struct device *dev,
51                                 struct device_attribute *attr, const char *buf,
52                                 size_t len)
53 {
54         struct gb_svc *svc = to_gb_svc(dev);
55         unsigned short intf_id;
56         int ret;
57
58         ret = kstrtou16(buf, 10, &intf_id);
59         if (ret < 0)
60                 return ret;
61
62         dev_warn(dev, "Forcibly trying to eject interface %d\n", intf_id);
63
64         ret = gb_svc_intf_eject(svc, intf_id);
65         if (ret < 0)
66                 return ret;
67
68         return len;
69 }
70 static DEVICE_ATTR_WO(intf_eject);
71
72 static ssize_t watchdog_show(struct device *dev, struct device_attribute *attr,
73                              char *buf)
74 {
75         struct gb_svc *svc = to_gb_svc(dev);
76
77         return sprintf(buf, "%s\n",
78                        gb_svc_watchdog_enabled(svc) ? "enabled" : "disabled");
79 }
80
81 static ssize_t watchdog_store(struct device *dev,
82                               struct device_attribute *attr, const char *buf,
83                               size_t len)
84 {
85         struct gb_svc *svc = to_gb_svc(dev);
86         int retval;
87         bool user_request;
88
89         retval = strtobool(buf, &user_request);
90         if (retval)
91                 return retval;
92
93         if (user_request)
94                 retval = gb_svc_watchdog_enable(svc);
95         else
96                 retval = gb_svc_watchdog_disable(svc);
97         if (retval)
98                 return retval;
99         return len;
100 }
101 static DEVICE_ATTR_RW(watchdog);
102
103 static ssize_t watchdog_action_show(struct device *dev,
104                                     struct device_attribute *attr, char *buf)
105 {
106         struct gb_svc *svc = to_gb_svc(dev);
107
108         if (svc->action == GB_SVC_WATCHDOG_BITE_PANIC_KERNEL)
109                 return sprintf(buf, "panic\n");
110         else if (svc->action == GB_SVC_WATCHDOG_BITE_RESET_UNIPRO)
111                 return sprintf(buf, "reset\n");
112
113         return -EINVAL;
114 }
115
116 static ssize_t watchdog_action_store(struct device *dev,
117                                      struct device_attribute *attr,
118                                      const char *buf, size_t len)
119 {
120         struct gb_svc *svc = to_gb_svc(dev);
121
122         if (sysfs_streq(buf, "panic"))
123                 svc->action = GB_SVC_WATCHDOG_BITE_PANIC_KERNEL;
124         else if (sysfs_streq(buf, "reset"))
125                 svc->action = GB_SVC_WATCHDOG_BITE_RESET_UNIPRO;
126         else
127                 return -EINVAL;
128
129         return len;
130 }
131 static DEVICE_ATTR_RW(watchdog_action);
132
133 static int gb_svc_pwrmon_rail_count_get(struct gb_svc *svc, u8 *value)
134 {
135         struct gb_svc_pwrmon_rail_count_get_response response;
136         int ret;
137
138         ret = gb_operation_sync(svc->connection,
139                                 GB_SVC_TYPE_PWRMON_RAIL_COUNT_GET, NULL, 0,
140                                 &response, sizeof(response));
141         if (ret) {
142                 dev_err(&svc->dev, "failed to get rail count: %d\n", ret);
143                 return ret;
144         }
145
146         *value = response.rail_count;
147
148         return 0;
149 }
150
151 static int gb_svc_pwrmon_rail_names_get(struct gb_svc *svc,
152                 struct gb_svc_pwrmon_rail_names_get_response *response,
153                 size_t bufsize)
154 {
155         int ret;
156
157         ret = gb_operation_sync(svc->connection,
158                                 GB_SVC_TYPE_PWRMON_RAIL_NAMES_GET, NULL, 0,
159                                 response, bufsize);
160         if (ret) {
161                 dev_err(&svc->dev, "failed to get rail names: %d\n", ret);
162                 return ret;
163         }
164
165         if (response->status != GB_SVC_OP_SUCCESS) {
166                 dev_err(&svc->dev,
167                         "SVC error while getting rail names: %u\n",
168                         response->status);
169                 return -EREMOTEIO;
170         }
171
172         return 0;
173 }
174
175 static int gb_svc_pwrmon_sample_get(struct gb_svc *svc, u8 rail_id,
176                                     u8 measurement_type, u32 *value)
177 {
178         struct gb_svc_pwrmon_sample_get_request request;
179         struct gb_svc_pwrmon_sample_get_response response;
180         int ret;
181
182         request.rail_id = rail_id;
183         request.measurement_type = measurement_type;
184
185         ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_PWRMON_SAMPLE_GET,
186                                 &request, sizeof(request),
187                                 &response, sizeof(response));
188         if (ret) {
189                 dev_err(&svc->dev, "failed to get rail sample: %d\n", ret);
190                 return ret;
191         }
192
193         if (response.result) {
194                 dev_err(&svc->dev,
195                         "UniPro error while getting rail power sample (%d %d): %d\n",
196                         rail_id, measurement_type, response.result);
197                 switch (response.result) {
198                 case GB_SVC_PWRMON_GET_SAMPLE_INVAL:
199                         return -EINVAL;
200                 case GB_SVC_PWRMON_GET_SAMPLE_NOSUPP:
201                         return -ENOMSG;
202                 default:
203                         return -EREMOTEIO;
204                 }
205         }
206
207         *value = le32_to_cpu(response.measurement);
208
209         return 0;
210 }
211
212 int gb_svc_pwrmon_intf_sample_get(struct gb_svc *svc, u8 intf_id,
213                                   u8 measurement_type, u32 *value)
214 {
215         struct gb_svc_pwrmon_intf_sample_get_request request;
216         struct gb_svc_pwrmon_intf_sample_get_response response;
217         int ret;
218
219         request.intf_id = intf_id;
220         request.measurement_type = measurement_type;
221
222         ret = gb_operation_sync(svc->connection,
223                                 GB_SVC_TYPE_PWRMON_INTF_SAMPLE_GET,
224                                 &request, sizeof(request),
225                                 &response, sizeof(response));
226         if (ret) {
227                 dev_err(&svc->dev, "failed to get intf sample: %d\n", ret);
228                 return ret;
229         }
230
231         if (response.result) {
232                 dev_err(&svc->dev,
233                         "UniPro error while getting intf power sample (%d %d): %d\n",
234                         intf_id, measurement_type, response.result);
235                 switch (response.result) {
236                 case GB_SVC_PWRMON_GET_SAMPLE_INVAL:
237                         return -EINVAL;
238                 case GB_SVC_PWRMON_GET_SAMPLE_NOSUPP:
239                         return -ENOMSG;
240                 default:
241                         return -EREMOTEIO;
242                 }
243         }
244
245         *value = le32_to_cpu(response.measurement);
246
247         return 0;
248 }
249
250 static struct attribute *svc_attrs[] = {
251         &dev_attr_endo_id.attr,
252         &dev_attr_ap_intf_id.attr,
253         &dev_attr_intf_eject.attr,
254         &dev_attr_watchdog.attr,
255         &dev_attr_watchdog_action.attr,
256         NULL,
257 };
258 ATTRIBUTE_GROUPS(svc);
259
260 int gb_svc_intf_device_id(struct gb_svc *svc, u8 intf_id, u8 device_id)
261 {
262         struct gb_svc_intf_device_id_request request;
263
264         request.intf_id = intf_id;
265         request.device_id = device_id;
266
267         return gb_operation_sync(svc->connection, GB_SVC_TYPE_INTF_DEVICE_ID,
268                                  &request, sizeof(request), NULL, 0);
269 }
270
271 int gb_svc_intf_eject(struct gb_svc *svc, u8 intf_id)
272 {
273         struct gb_svc_intf_eject_request request;
274         int ret;
275
276         request.intf_id = intf_id;
277
278         /*
279          * The pulse width for module release in svc is long so we need to
280          * increase the timeout so the operation will not return to soon.
281          */
282         ret = gb_operation_sync_timeout(svc->connection,
283                                         GB_SVC_TYPE_INTF_EJECT, &request,
284                                         sizeof(request), NULL, 0,
285                                         SVC_INTF_EJECT_TIMEOUT);
286         if (ret) {
287                 dev_err(&svc->dev, "failed to eject interface %u\n", intf_id);
288                 return ret;
289         }
290
291         return 0;
292 }
293
294 int gb_svc_intf_vsys_set(struct gb_svc *svc, u8 intf_id, bool enable)
295 {
296         struct gb_svc_intf_vsys_request request;
297         struct gb_svc_intf_vsys_response response;
298         int type, ret;
299
300         request.intf_id = intf_id;
301
302         if (enable)
303                 type = GB_SVC_TYPE_INTF_VSYS_ENABLE;
304         else
305                 type = GB_SVC_TYPE_INTF_VSYS_DISABLE;
306
307         ret = gb_operation_sync(svc->connection, type,
308                         &request, sizeof(request),
309                         &response, sizeof(response));
310         if (ret < 0)
311                 return ret;
312         if (response.result_code != GB_SVC_INTF_VSYS_OK)
313                 return -EREMOTEIO;
314         return 0;
315 }
316
317 int gb_svc_intf_refclk_set(struct gb_svc *svc, u8 intf_id, bool enable)
318 {
319         struct gb_svc_intf_refclk_request request;
320         struct gb_svc_intf_refclk_response response;
321         int type, ret;
322
323         request.intf_id = intf_id;
324
325         if (enable)
326                 type = GB_SVC_TYPE_INTF_REFCLK_ENABLE;
327         else
328                 type = GB_SVC_TYPE_INTF_REFCLK_DISABLE;
329
330         ret = gb_operation_sync(svc->connection, type,
331                         &request, sizeof(request),
332                         &response, sizeof(response));
333         if (ret < 0)
334                 return ret;
335         if (response.result_code != GB_SVC_INTF_REFCLK_OK)
336                 return -EREMOTEIO;
337         return 0;
338 }
339
340 int gb_svc_intf_unipro_set(struct gb_svc *svc, u8 intf_id, bool enable)
341 {
342         struct gb_svc_intf_unipro_request request;
343         struct gb_svc_intf_unipro_response response;
344         int type, ret;
345
346         request.intf_id = intf_id;
347
348         if (enable)
349                 type = GB_SVC_TYPE_INTF_UNIPRO_ENABLE;
350         else
351                 type = GB_SVC_TYPE_INTF_UNIPRO_DISABLE;
352
353         ret = gb_operation_sync(svc->connection, type,
354                         &request, sizeof(request),
355                         &response, sizeof(response));
356         if (ret < 0)
357                 return ret;
358         if (response.result_code != GB_SVC_INTF_UNIPRO_OK)
359                 return -EREMOTEIO;
360         return 0;
361 }
362
363 int gb_svc_intf_activate(struct gb_svc *svc, u8 intf_id, u8 *intf_type)
364 {
365         struct gb_svc_intf_activate_request request;
366         struct gb_svc_intf_activate_response response;
367         int ret;
368
369         request.intf_id = intf_id;
370
371         ret = gb_operation_sync_timeout(svc->connection,
372                         GB_SVC_TYPE_INTF_ACTIVATE,
373                         &request, sizeof(request),
374                         &response, sizeof(response),
375                         SVC_INTF_ACTIVATE_TIMEOUT);
376         if (ret < 0)
377                 return ret;
378         if (response.status != GB_SVC_OP_SUCCESS) {
379                 dev_err(&svc->dev, "failed to activate interface %u: %u\n",
380                                 intf_id, response.status);
381                 return -EREMOTEIO;
382         }
383
384         *intf_type = response.intf_type;
385
386         return 0;
387 }
388
389 int gb_svc_intf_resume(struct gb_svc *svc, u8 intf_id)
390 {
391         struct gb_svc_intf_resume_request request;
392         struct gb_svc_intf_resume_response response;
393         int ret;
394
395         request.intf_id = intf_id;
396
397         ret = gb_operation_sync_timeout(svc->connection,
398                                         GB_SVC_TYPE_INTF_RESUME,
399                                         &request, sizeof(request),
400                                         &response, sizeof(response),
401                                         SVC_INTF_RESUME_TIMEOUT);
402         if (ret < 0) {
403                 dev_err(&svc->dev, "failed to send interface resume %u: %d\n",
404                         intf_id, ret);
405                 return ret;
406         }
407
408         if (response.status != GB_SVC_OP_SUCCESS) {
409                 dev_err(&svc->dev, "failed to resume interface %u: %u\n",
410                         intf_id, response.status);
411                 return -EREMOTEIO;
412         }
413
414         return 0;
415 }
416
417 int gb_svc_dme_peer_get(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
418                         u32 *value)
419 {
420         struct gb_svc_dme_peer_get_request request;
421         struct gb_svc_dme_peer_get_response response;
422         u16 result;
423         int ret;
424
425         request.intf_id = intf_id;
426         request.attr = cpu_to_le16(attr);
427         request.selector = cpu_to_le16(selector);
428
429         ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_DME_PEER_GET,
430                                 &request, sizeof(request),
431                                 &response, sizeof(response));
432         if (ret) {
433                 dev_err(&svc->dev, "failed to get DME attribute (%u 0x%04x %u): %d\n",
434                                 intf_id, attr, selector, ret);
435                 return ret;
436         }
437
438         result = le16_to_cpu(response.result_code);
439         if (result) {
440                 dev_err(&svc->dev, "UniPro error while getting DME attribute (%u 0x%04x %u): %u\n",
441                                 intf_id, attr, selector, result);
442                 return -EREMOTEIO;
443         }
444
445         if (value)
446                 *value = le32_to_cpu(response.attr_value);
447
448         return 0;
449 }
450
451 int gb_svc_dme_peer_set(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
452                         u32 value)
453 {
454         struct gb_svc_dme_peer_set_request request;
455         struct gb_svc_dme_peer_set_response response;
456         u16 result;
457         int ret;
458
459         request.intf_id = intf_id;
460         request.attr = cpu_to_le16(attr);
461         request.selector = cpu_to_le16(selector);
462         request.value = cpu_to_le32(value);
463
464         ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_DME_PEER_SET,
465                                 &request, sizeof(request),
466                                 &response, sizeof(response));
467         if (ret) {
468                 dev_err(&svc->dev, "failed to set DME attribute (%u 0x%04x %u %u): %d\n",
469                                 intf_id, attr, selector, value, ret);
470                 return ret;
471         }
472
473         result = le16_to_cpu(response.result_code);
474         if (result) {
475                 dev_err(&svc->dev, "UniPro error while setting DME attribute (%u 0x%04x %u %u): %u\n",
476                                 intf_id, attr, selector, value, result);
477                 return -EREMOTEIO;
478         }
479
480         return 0;
481 }
482
483 int gb_svc_connection_create(struct gb_svc *svc,
484                                 u8 intf1_id, u16 cport1_id,
485                                 u8 intf2_id, u16 cport2_id,
486                                 u8 cport_flags)
487 {
488         struct gb_svc_conn_create_request request;
489
490         request.intf1_id = intf1_id;
491         request.cport1_id = cpu_to_le16(cport1_id);
492         request.intf2_id = intf2_id;
493         request.cport2_id = cpu_to_le16(cport2_id);
494         request.tc = 0;         /* TC0 */
495         request.flags = cport_flags;
496
497         return gb_operation_sync(svc->connection, GB_SVC_TYPE_CONN_CREATE,
498                                  &request, sizeof(request), NULL, 0);
499 }
500
501 void gb_svc_connection_destroy(struct gb_svc *svc, u8 intf1_id, u16 cport1_id,
502                                u8 intf2_id, u16 cport2_id)
503 {
504         struct gb_svc_conn_destroy_request request;
505         struct gb_connection *connection = svc->connection;
506         int ret;
507
508         request.intf1_id = intf1_id;
509         request.cport1_id = cpu_to_le16(cport1_id);
510         request.intf2_id = intf2_id;
511         request.cport2_id = cpu_to_le16(cport2_id);
512
513         ret = gb_operation_sync(connection, GB_SVC_TYPE_CONN_DESTROY,
514                                 &request, sizeof(request), NULL, 0);
515         if (ret) {
516                 dev_err(&svc->dev, "failed to destroy connection (%u:%u %u:%u): %d\n",
517                                 intf1_id, cport1_id, intf2_id, cport2_id, ret);
518         }
519 }
520
521 /* Creates bi-directional routes between the devices */
522 int gb_svc_route_create(struct gb_svc *svc, u8 intf1_id, u8 dev1_id,
523                                u8 intf2_id, u8 dev2_id)
524 {
525         struct gb_svc_route_create_request request;
526
527         request.intf1_id = intf1_id;
528         request.dev1_id = dev1_id;
529         request.intf2_id = intf2_id;
530         request.dev2_id = dev2_id;
531
532         return gb_operation_sync(svc->connection, GB_SVC_TYPE_ROUTE_CREATE,
533                                  &request, sizeof(request), NULL, 0);
534 }
535
536 /* Destroys bi-directional routes between the devices */
537 void gb_svc_route_destroy(struct gb_svc *svc, u8 intf1_id, u8 intf2_id)
538 {
539         struct gb_svc_route_destroy_request request;
540         int ret;
541
542         request.intf1_id = intf1_id;
543         request.intf2_id = intf2_id;
544
545         ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_ROUTE_DESTROY,
546                                 &request, sizeof(request), NULL, 0);
547         if (ret) {
548                 dev_err(&svc->dev, "failed to destroy route (%u %u): %d\n",
549                                 intf1_id, intf2_id, ret);
550         }
551 }
552
553 int gb_svc_intf_set_power_mode(struct gb_svc *svc, u8 intf_id, u8 hs_series,
554                                u8 tx_mode, u8 tx_gear, u8 tx_nlanes,
555                                u8 tx_amplitude, u8 tx_hs_equalizer,
556                                u8 rx_mode, u8 rx_gear, u8 rx_nlanes,
557                                u8 flags, u32 quirks,
558                                struct gb_svc_l2_timer_cfg *local,
559                                struct gb_svc_l2_timer_cfg *remote)
560 {
561         struct gb_svc_intf_set_pwrm_request request;
562         struct gb_svc_intf_set_pwrm_response response;
563         int ret;
564         u16 result_code;
565
566         memset(&request, 0, sizeof(request));
567
568         request.intf_id = intf_id;
569         request.hs_series = hs_series;
570         request.tx_mode = tx_mode;
571         request.tx_gear = tx_gear;
572         request.tx_nlanes = tx_nlanes;
573         request.tx_amplitude = tx_amplitude;
574         request.tx_hs_equalizer = tx_hs_equalizer;
575         request.rx_mode = rx_mode;
576         request.rx_gear = rx_gear;
577         request.rx_nlanes = rx_nlanes;
578         request.flags = flags;
579         request.quirks = cpu_to_le32(quirks);
580         if (local)
581                 request.local_l2timerdata = *local;
582         if (remote)
583                 request.remote_l2timerdata = *remote;
584
585         ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_INTF_SET_PWRM,
586                                 &request, sizeof(request),
587                                 &response, sizeof(response));
588         if (ret < 0)
589                 return ret;
590
591         result_code = response.result_code;
592         if (result_code != GB_SVC_SETPWRM_PWR_LOCAL) {
593                 dev_err(&svc->dev, "set power mode = %d\n", result_code);
594                 return -EIO;
595         }
596
597         return 0;
598 }
599 EXPORT_SYMBOL_GPL(gb_svc_intf_set_power_mode);
600
601 int gb_svc_intf_set_power_mode_hibernate(struct gb_svc *svc, u8 intf_id)
602 {
603         struct gb_svc_intf_set_pwrm_request request;
604         struct gb_svc_intf_set_pwrm_response response;
605         int ret;
606         u16 result_code;
607
608         memset(&request, 0, sizeof(request));
609
610         request.intf_id = intf_id;
611         request.hs_series = GB_SVC_UNIPRO_HS_SERIES_A;
612         request.tx_mode = GB_SVC_UNIPRO_HIBERNATE_MODE;
613         request.rx_mode = GB_SVC_UNIPRO_HIBERNATE_MODE;
614
615         ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_INTF_SET_PWRM,
616                                 &request, sizeof(request),
617                                 &response, sizeof(response));
618         if (ret < 0) {
619                 dev_err(&svc->dev,
620                         "failed to send set power mode operation to interface %u: %d\n",
621                         intf_id, ret);
622                 return ret;
623         }
624
625         result_code = response.result_code;
626         if (result_code != GB_SVC_SETPWRM_PWR_OK) {
627                 dev_err(&svc->dev,
628                         "failed to hibernate the link for interface %u: %u\n",
629                         intf_id, result_code);
630                 return -EIO;
631         }
632
633         return 0;
634 }
635
636 int gb_svc_ping(struct gb_svc *svc)
637 {
638         return gb_operation_sync_timeout(svc->connection, GB_SVC_TYPE_PING,
639                                          NULL, 0, NULL, 0,
640                                          GB_OPERATION_TIMEOUT_DEFAULT * 2);
641 }
642
643 static int gb_svc_version_request(struct gb_operation *op)
644 {
645         struct gb_connection *connection = op->connection;
646         struct gb_svc *svc = gb_connection_get_data(connection);
647         struct gb_svc_version_request *request;
648         struct gb_svc_version_response *response;
649
650         if (op->request->payload_size < sizeof(*request)) {
651                 dev_err(&svc->dev, "short version request (%zu < %zu)\n",
652                                 op->request->payload_size,
653                                 sizeof(*request));
654                 return -EINVAL;
655         }
656
657         request = op->request->payload;
658
659         if (request->major > GB_SVC_VERSION_MAJOR) {
660                 dev_warn(&svc->dev, "unsupported major version (%u > %u)\n",
661                                 request->major, GB_SVC_VERSION_MAJOR);
662                 return -ENOTSUPP;
663         }
664
665         svc->protocol_major = request->major;
666         svc->protocol_minor = request->minor;
667
668         if (!gb_operation_response_alloc(op, sizeof(*response), GFP_KERNEL))
669                 return -ENOMEM;
670
671         response = op->response->payload;
672         response->major = svc->protocol_major;
673         response->minor = svc->protocol_minor;
674
675         return 0;
676 }
677
678 static ssize_t pwr_debugfs_voltage_read(struct file *file, char __user *buf,
679                                         size_t len, loff_t *offset)
680 {
681         struct svc_debugfs_pwrmon_rail *pwrmon_rails =
682                 file_inode(file)->i_private;
683         struct gb_svc *svc = pwrmon_rails->svc;
684         int ret, desc;
685         u32 value;
686         char buff[16];
687
688         ret = gb_svc_pwrmon_sample_get(svc, pwrmon_rails->id,
689                                        GB_SVC_PWRMON_TYPE_VOL, &value);
690         if (ret) {
691                 dev_err(&svc->dev,
692                         "failed to get voltage sample %u: %d\n",
693                         pwrmon_rails->id, ret);
694                 return ret;
695         }
696
697         desc = scnprintf(buff, sizeof(buff), "%u\n", value);
698
699         return simple_read_from_buffer(buf, len, offset, buff, desc);
700 }
701
702 static ssize_t pwr_debugfs_current_read(struct file *file, char __user *buf,
703                                         size_t len, loff_t *offset)
704 {
705         struct svc_debugfs_pwrmon_rail *pwrmon_rails =
706                 file_inode(file)->i_private;
707         struct gb_svc *svc = pwrmon_rails->svc;
708         int ret, desc;
709         u32 value;
710         char buff[16];
711
712         ret = gb_svc_pwrmon_sample_get(svc, pwrmon_rails->id,
713                                        GB_SVC_PWRMON_TYPE_CURR, &value);
714         if (ret) {
715                 dev_err(&svc->dev,
716                         "failed to get current sample %u: %d\n",
717                         pwrmon_rails->id, ret);
718                 return ret;
719         }
720
721         desc = scnprintf(buff, sizeof(buff), "%u\n", value);
722
723         return simple_read_from_buffer(buf, len, offset, buff, desc);
724 }
725
726 static ssize_t pwr_debugfs_power_read(struct file *file, char __user *buf,
727                                       size_t len, loff_t *offset)
728 {
729         struct svc_debugfs_pwrmon_rail *pwrmon_rails =
730                 file_inode(file)->i_private;
731         struct gb_svc *svc = pwrmon_rails->svc;
732         int ret, desc;
733         u32 value;
734         char buff[16];
735
736         ret = gb_svc_pwrmon_sample_get(svc, pwrmon_rails->id,
737                                        GB_SVC_PWRMON_TYPE_PWR, &value);
738         if (ret) {
739                 dev_err(&svc->dev, "failed to get power sample %u: %d\n",
740                         pwrmon_rails->id, ret);
741                 return ret;
742         }
743
744         desc = scnprintf(buff, sizeof(buff), "%u\n", value);
745
746         return simple_read_from_buffer(buf, len, offset, buff, desc);
747 }
748
749 static const struct file_operations pwrmon_debugfs_voltage_fops = {
750         .read           = pwr_debugfs_voltage_read,
751 };
752
753 static const struct file_operations pwrmon_debugfs_current_fops = {
754         .read           = pwr_debugfs_current_read,
755 };
756
757 static const struct file_operations pwrmon_debugfs_power_fops = {
758         .read           = pwr_debugfs_power_read,
759 };
760
761 static void gb_svc_pwrmon_debugfs_init(struct gb_svc *svc)
762 {
763         int i;
764         size_t bufsize;
765         struct dentry *dent;
766         struct gb_svc_pwrmon_rail_names_get_response *rail_names;
767         u8 rail_count;
768
769         dent = debugfs_create_dir("pwrmon", svc->debugfs_dentry);
770         if (IS_ERR_OR_NULL(dent))
771                 return;
772
773         if (gb_svc_pwrmon_rail_count_get(svc, &rail_count))
774                 goto err_pwrmon_debugfs;
775
776         if (!rail_count || rail_count > GB_SVC_PWRMON_MAX_RAIL_COUNT)
777                 goto err_pwrmon_debugfs;
778
779         bufsize = sizeof(*rail_names) +
780                 GB_SVC_PWRMON_RAIL_NAME_BUFSIZE * rail_count;
781
782         rail_names = kzalloc(bufsize, GFP_KERNEL);
783         if (!rail_names)
784                 goto err_pwrmon_debugfs;
785
786         svc->pwrmon_rails = kcalloc(rail_count, sizeof(*svc->pwrmon_rails),
787                                     GFP_KERNEL);
788         if (!svc->pwrmon_rails)
789                 goto err_pwrmon_debugfs_free;
790
791         if (gb_svc_pwrmon_rail_names_get(svc, rail_names, bufsize))
792                 goto err_pwrmon_debugfs_free;
793
794         for (i = 0; i < rail_count; i++) {
795                 struct dentry *dir;
796                 struct svc_debugfs_pwrmon_rail *rail = &svc->pwrmon_rails[i];
797                 char fname[GB_SVC_PWRMON_RAIL_NAME_BUFSIZE];
798
799                 snprintf(fname, sizeof(fname), "%s",
800                          (char *)&rail_names->name[i]);
801
802                 rail->id = i;
803                 rail->svc = svc;
804
805                 dir = debugfs_create_dir(fname, dent);
806                 debugfs_create_file("voltage_now", 0444, dir, rail,
807                                     &pwrmon_debugfs_voltage_fops);
808                 debugfs_create_file("current_now", 0444, dir, rail,
809                                     &pwrmon_debugfs_current_fops);
810                 debugfs_create_file("power_now", 0444, dir, rail,
811                                     &pwrmon_debugfs_power_fops);
812         }
813
814         kfree(rail_names);
815         return;
816
817 err_pwrmon_debugfs_free:
818         kfree(rail_names);
819         kfree(svc->pwrmon_rails);
820         svc->pwrmon_rails = NULL;
821
822 err_pwrmon_debugfs:
823         debugfs_remove(dent);
824 }
825
826 static void gb_svc_debugfs_init(struct gb_svc *svc)
827 {
828         svc->debugfs_dentry = debugfs_create_dir(dev_name(&svc->dev),
829                                                  gb_debugfs_get());
830         gb_svc_pwrmon_debugfs_init(svc);
831 }
832
833 static void gb_svc_debugfs_exit(struct gb_svc *svc)
834 {
835         debugfs_remove_recursive(svc->debugfs_dentry);
836         kfree(svc->pwrmon_rails);
837         svc->pwrmon_rails = NULL;
838 }
839
840 static int gb_svc_hello(struct gb_operation *op)
841 {
842         struct gb_connection *connection = op->connection;
843         struct gb_svc *svc = gb_connection_get_data(connection);
844         struct gb_svc_hello_request *hello_request;
845         int ret;
846
847         if (op->request->payload_size < sizeof(*hello_request)) {
848                 dev_warn(&svc->dev, "short hello request (%zu < %zu)\n",
849                                 op->request->payload_size,
850                                 sizeof(*hello_request));
851                 return -EINVAL;
852         }
853
854         hello_request = op->request->payload;
855         svc->endo_id = le16_to_cpu(hello_request->endo_id);
856         svc->ap_intf_id = hello_request->interface_id;
857
858         ret = device_add(&svc->dev);
859         if (ret) {
860                 dev_err(&svc->dev, "failed to register svc device: %d\n", ret);
861                 return ret;
862         }
863
864         ret = gb_svc_watchdog_create(svc);
865         if (ret) {
866                 dev_err(&svc->dev, "failed to create watchdog: %d\n", ret);
867                 goto err_unregister_device;
868         }
869
870         gb_svc_debugfs_init(svc);
871
872         return gb_svc_queue_deferred_request(op);
873
874 err_unregister_device:
875         gb_svc_watchdog_destroy(svc);
876         device_del(&svc->dev);
877         return ret;
878 }
879
880 static struct gb_interface *gb_svc_interface_lookup(struct gb_svc *svc,
881                                                         u8 intf_id)
882 {
883         struct gb_host_device *hd = svc->hd;
884         struct gb_module *module;
885         size_t num_interfaces;
886         u8 module_id;
887
888         list_for_each_entry(module, &hd->modules, hd_node) {
889                 module_id = module->module_id;
890                 num_interfaces = module->num_interfaces;
891
892                 if (intf_id >= module_id &&
893                                 intf_id < module_id + num_interfaces) {
894                         return module->interfaces[intf_id - module_id];
895                 }
896         }
897
898         return NULL;
899 }
900
901 static struct gb_module *gb_svc_module_lookup(struct gb_svc *svc, u8 module_id)
902 {
903         struct gb_host_device *hd = svc->hd;
904         struct gb_module *module;
905
906         list_for_each_entry(module, &hd->modules, hd_node) {
907                 if (module->module_id == module_id)
908                         return module;
909         }
910
911         return NULL;
912 }
913
914 static void gb_svc_process_hello_deferred(struct gb_operation *operation)
915 {
916         struct gb_connection *connection = operation->connection;
917         struct gb_svc *svc = gb_connection_get_data(connection);
918         int ret;
919
920         /*
921          * XXX This is a hack/work-around to reconfigure the APBridgeA-Switch
922          * link to PWM G2, 1 Lane, Slow Auto, so that it has sufficient
923          * bandwidth for 3 audio streams plus boot-over-UniPro of a hot-plugged
924          * module.
925          *
926          * The code should be removed once SW-2217, Heuristic for UniPro
927          * Power Mode Changes is resolved.
928          */
929         ret = gb_svc_intf_set_power_mode(svc, svc->ap_intf_id,
930                                          GB_SVC_UNIPRO_HS_SERIES_A,
931                                          GB_SVC_UNIPRO_SLOW_AUTO_MODE,
932                                          2, 1,
933                                          GB_SVC_SMALL_AMPLITUDE,
934                                          GB_SVC_NO_DE_EMPHASIS,
935                                          GB_SVC_UNIPRO_SLOW_AUTO_MODE,
936                                          2, 1,
937                                          0, 0,
938                                          NULL, NULL);
939
940         if (ret)
941                 dev_warn(&svc->dev,
942                         "power mode change failed on AP to switch link: %d\n",
943                         ret);
944 }
945
946 static void gb_svc_process_module_inserted(struct gb_operation *operation)
947 {
948         struct gb_svc_module_inserted_request *request;
949         struct gb_connection *connection = operation->connection;
950         struct gb_svc *svc = gb_connection_get_data(connection);
951         struct gb_host_device *hd = svc->hd;
952         struct gb_module *module;
953         size_t num_interfaces;
954         u8 module_id;
955         u16 flags;
956         int ret;
957
958         /* The request message size has already been verified. */
959         request = operation->request->payload;
960         module_id = request->primary_intf_id;
961         num_interfaces = request->intf_count;
962         flags = le16_to_cpu(request->flags);
963
964         dev_dbg(&svc->dev, "%s - id = %u, num_interfaces = %zu, flags = 0x%04x\n",
965                         __func__, module_id, num_interfaces, flags);
966
967         if (flags & GB_SVC_MODULE_INSERTED_FLAG_NO_PRIMARY) {
968                 dev_warn(&svc->dev, "no primary interface detected on module %u\n",
969                                 module_id);
970         }
971
972         module = gb_svc_module_lookup(svc, module_id);
973         if (module) {
974                 dev_warn(&svc->dev, "unexpected module-inserted event %u\n",
975                                 module_id);
976                 return;
977         }
978
979         module = gb_module_create(hd, module_id, num_interfaces);
980         if (!module) {
981                 dev_err(&svc->dev, "failed to create module\n");
982                 return;
983         }
984
985         ret = gb_module_add(module);
986         if (ret) {
987                 gb_module_put(module);
988                 return;
989         }
990
991         list_add(&module->hd_node, &hd->modules);
992 }
993
994 static void gb_svc_process_module_removed(struct gb_operation *operation)
995 {
996         struct gb_svc_module_removed_request *request;
997         struct gb_connection *connection = operation->connection;
998         struct gb_svc *svc = gb_connection_get_data(connection);
999         struct gb_module *module;
1000         u8 module_id;
1001
1002         /* The request message size has already been verified. */
1003         request = operation->request->payload;
1004         module_id = request->primary_intf_id;
1005
1006         dev_dbg(&svc->dev, "%s - id = %u\n", __func__, module_id);
1007
1008         module = gb_svc_module_lookup(svc, module_id);
1009         if (!module) {
1010                 dev_warn(&svc->dev, "unexpected module-removed event %u\n",
1011                                 module_id);
1012                 return;
1013         }
1014
1015         module->disconnected = true;
1016
1017         gb_module_del(module);
1018         list_del(&module->hd_node);
1019         gb_module_put(module);
1020 }
1021
1022 static void gb_svc_process_intf_oops(struct gb_operation *operation)
1023 {
1024         struct gb_svc_intf_oops_request *request;
1025         struct gb_connection *connection = operation->connection;
1026         struct gb_svc *svc = gb_connection_get_data(connection);
1027         struct gb_interface *intf;
1028         u8 intf_id;
1029         u8 reason;
1030
1031         /* The request message size has already been verified. */
1032         request = operation->request->payload;
1033         intf_id = request->intf_id;
1034         reason = request->reason;
1035
1036         intf = gb_svc_interface_lookup(svc, intf_id);
1037         if (!intf) {
1038                 dev_warn(&svc->dev, "unexpected interface-oops event %u\n",
1039                          intf_id);
1040                 return;
1041         }
1042
1043         dev_info(&svc->dev, "Deactivating interface %u, interface oops reason = %u\n",
1044                  intf_id, reason);
1045
1046         mutex_lock(&intf->mutex);
1047         intf->disconnected = true;
1048         gb_interface_disable(intf);
1049         gb_interface_deactivate(intf);
1050         mutex_unlock(&intf->mutex);
1051 }
1052
1053 static void gb_svc_process_intf_mailbox_event(struct gb_operation *operation)
1054 {
1055         struct gb_svc_intf_mailbox_event_request *request;
1056         struct gb_connection *connection = operation->connection;
1057         struct gb_svc *svc = gb_connection_get_data(connection);
1058         struct gb_interface *intf;
1059         u8 intf_id;
1060         u16 result_code;
1061         u32 mailbox;
1062
1063         /* The request message size has already been verified. */
1064         request = operation->request->payload;
1065         intf_id = request->intf_id;
1066         result_code = le16_to_cpu(request->result_code);
1067         mailbox = le32_to_cpu(request->mailbox);
1068
1069         dev_dbg(&svc->dev, "%s - id = %u, result = 0x%04x, mailbox = 0x%08x\n",
1070                         __func__, intf_id, result_code, mailbox);
1071
1072         intf = gb_svc_interface_lookup(svc, intf_id);
1073         if (!intf) {
1074                 dev_warn(&svc->dev, "unexpected mailbox event %u\n", intf_id);
1075                 return;
1076         }
1077
1078         gb_interface_mailbox_event(intf, result_code, mailbox);
1079 }
1080
1081 static void gb_svc_process_deferred_request(struct work_struct *work)
1082 {
1083         struct gb_svc_deferred_request *dr;
1084         struct gb_operation *operation;
1085         struct gb_svc *svc;
1086         u8 type;
1087
1088         dr = container_of(work, struct gb_svc_deferred_request, work);
1089         operation = dr->operation;
1090         svc = gb_connection_get_data(operation->connection);
1091         type = operation->request->header->type;
1092
1093         switch (type) {
1094         case GB_SVC_TYPE_SVC_HELLO:
1095                 gb_svc_process_hello_deferred(operation);
1096                 break;
1097         case GB_SVC_TYPE_MODULE_INSERTED:
1098                 gb_svc_process_module_inserted(operation);
1099                 break;
1100         case GB_SVC_TYPE_MODULE_REMOVED:
1101                 gb_svc_process_module_removed(operation);
1102                 break;
1103         case GB_SVC_TYPE_INTF_MAILBOX_EVENT:
1104                 gb_svc_process_intf_mailbox_event(operation);
1105                 break;
1106         case GB_SVC_TYPE_INTF_OOPS:
1107                 gb_svc_process_intf_oops(operation);
1108                 break;
1109         default:
1110                 dev_err(&svc->dev, "bad deferred request type: 0x%02x\n", type);
1111         }
1112
1113         gb_operation_put(operation);
1114         kfree(dr);
1115 }
1116
1117 static int gb_svc_queue_deferred_request(struct gb_operation *operation)
1118 {
1119         struct gb_svc *svc = gb_connection_get_data(operation->connection);
1120         struct gb_svc_deferred_request *dr;
1121
1122         dr = kmalloc(sizeof(*dr), GFP_KERNEL);
1123         if (!dr)
1124                 return -ENOMEM;
1125
1126         gb_operation_get(operation);
1127
1128         dr->operation = operation;
1129         INIT_WORK(&dr->work, gb_svc_process_deferred_request);
1130
1131         queue_work(svc->wq, &dr->work);
1132
1133         return 0;
1134 }
1135
1136 static int gb_svc_intf_reset_recv(struct gb_operation *op)
1137 {
1138         struct gb_svc *svc = gb_connection_get_data(op->connection);
1139         struct gb_message *request = op->request;
1140         struct gb_svc_intf_reset_request *reset;
1141         u8 intf_id;
1142
1143         if (request->payload_size < sizeof(*reset)) {
1144                 dev_warn(&svc->dev, "short reset request received (%zu < %zu)\n",
1145                                 request->payload_size, sizeof(*reset));
1146                 return -EINVAL;
1147         }
1148         reset = request->payload;
1149
1150         intf_id = reset->intf_id;
1151
1152         /* FIXME Reset the interface here */
1153
1154         return 0;
1155 }
1156
1157 static int gb_svc_module_inserted_recv(struct gb_operation *op)
1158 {
1159         struct gb_svc *svc = gb_connection_get_data(op->connection);
1160         struct gb_svc_module_inserted_request *request;
1161
1162         if (op->request->payload_size < sizeof(*request)) {
1163                 dev_warn(&svc->dev, "short module-inserted request received (%zu < %zu)\n",
1164                                 op->request->payload_size, sizeof(*request));
1165                 return -EINVAL;
1166         }
1167
1168         request = op->request->payload;
1169
1170         dev_dbg(&svc->dev, "%s - id = %u\n", __func__,
1171                         request->primary_intf_id);
1172
1173         return gb_svc_queue_deferred_request(op);
1174 }
1175
1176 static int gb_svc_module_removed_recv(struct gb_operation *op)
1177 {
1178         struct gb_svc *svc = gb_connection_get_data(op->connection);
1179         struct gb_svc_module_removed_request *request;
1180
1181         if (op->request->payload_size < sizeof(*request)) {
1182                 dev_warn(&svc->dev, "short module-removed request received (%zu < %zu)\n",
1183                                 op->request->payload_size, sizeof(*request));
1184                 return -EINVAL;
1185         }
1186
1187         request = op->request->payload;
1188
1189         dev_dbg(&svc->dev, "%s - id = %u\n", __func__,
1190                         request->primary_intf_id);
1191
1192         return gb_svc_queue_deferred_request(op);
1193 }
1194
1195 static int gb_svc_intf_oops_recv(struct gb_operation *op)
1196 {
1197         struct gb_svc *svc = gb_connection_get_data(op->connection);
1198         struct gb_svc_intf_oops_request *request;
1199
1200         if (op->request->payload_size < sizeof(*request)) {
1201                 dev_warn(&svc->dev, "short intf-oops request received (%zu < %zu)\n",
1202                          op->request->payload_size, sizeof(*request));
1203                 return -EINVAL;
1204         }
1205
1206         return gb_svc_queue_deferred_request(op);
1207 }
1208
1209 static int gb_svc_intf_mailbox_event_recv(struct gb_operation *op)
1210 {
1211         struct gb_svc *svc = gb_connection_get_data(op->connection);
1212         struct gb_svc_intf_mailbox_event_request *request;
1213
1214         if (op->request->payload_size < sizeof(*request)) {
1215                 dev_warn(&svc->dev, "short mailbox request received (%zu < %zu)\n",
1216                                 op->request->payload_size, sizeof(*request));
1217                 return -EINVAL;
1218         }
1219
1220         request = op->request->payload;
1221
1222         dev_dbg(&svc->dev, "%s - id = %u\n", __func__, request->intf_id);
1223
1224         return gb_svc_queue_deferred_request(op);
1225 }
1226
1227 static int gb_svc_request_handler(struct gb_operation *op)
1228 {
1229         struct gb_connection *connection = op->connection;
1230         struct gb_svc *svc = gb_connection_get_data(connection);
1231         u8 type = op->type;
1232         int ret = 0;
1233
1234         /*
1235          * SVC requests need to follow a specific order (at least initially) and
1236          * below code takes care of enforcing that. The expected order is:
1237          * - PROTOCOL_VERSION
1238          * - SVC_HELLO
1239          * - Any other request, but the earlier two.
1240          *
1241          * Incoming requests are guaranteed to be serialized and so we don't
1242          * need to protect 'state' for any races.
1243          */
1244         switch (type) {
1245         case GB_SVC_TYPE_PROTOCOL_VERSION:
1246                 if (svc->state != GB_SVC_STATE_RESET)
1247                         ret = -EINVAL;
1248                 break;
1249         case GB_SVC_TYPE_SVC_HELLO:
1250                 if (svc->state != GB_SVC_STATE_PROTOCOL_VERSION)
1251                         ret = -EINVAL;
1252                 break;
1253         default:
1254                 if (svc->state != GB_SVC_STATE_SVC_HELLO)
1255                         ret = -EINVAL;
1256                 break;
1257         }
1258
1259         if (ret) {
1260                 dev_warn(&svc->dev, "unexpected request 0x%02x received (state %u)\n",
1261                                 type, svc->state);
1262                 return ret;
1263         }
1264
1265         switch (type) {
1266         case GB_SVC_TYPE_PROTOCOL_VERSION:
1267                 ret = gb_svc_version_request(op);
1268                 if (!ret)
1269                         svc->state = GB_SVC_STATE_PROTOCOL_VERSION;
1270                 return ret;
1271         case GB_SVC_TYPE_SVC_HELLO:
1272                 ret = gb_svc_hello(op);
1273                 if (!ret)
1274                         svc->state = GB_SVC_STATE_SVC_HELLO;
1275                 return ret;
1276         case GB_SVC_TYPE_INTF_RESET:
1277                 return gb_svc_intf_reset_recv(op);
1278         case GB_SVC_TYPE_MODULE_INSERTED:
1279                 return gb_svc_module_inserted_recv(op);
1280         case GB_SVC_TYPE_MODULE_REMOVED:
1281                 return gb_svc_module_removed_recv(op);
1282         case GB_SVC_TYPE_INTF_MAILBOX_EVENT:
1283                 return gb_svc_intf_mailbox_event_recv(op);
1284         case GB_SVC_TYPE_INTF_OOPS:
1285                 return gb_svc_intf_oops_recv(op);
1286         default:
1287                 dev_warn(&svc->dev, "unsupported request 0x%02x\n", type);
1288                 return -EINVAL;
1289         }
1290 }
1291
1292 static void gb_svc_release(struct device *dev)
1293 {
1294         struct gb_svc *svc = to_gb_svc(dev);
1295
1296         if (svc->connection)
1297                 gb_connection_destroy(svc->connection);
1298         ida_destroy(&svc->device_id_map);
1299         destroy_workqueue(svc->wq);
1300         kfree(svc);
1301 }
1302
1303 struct device_type greybus_svc_type = {
1304         .name           = "greybus_svc",
1305         .release        = gb_svc_release,
1306 };
1307
1308 struct gb_svc *gb_svc_create(struct gb_host_device *hd)
1309 {
1310         struct gb_svc *svc;
1311
1312         svc = kzalloc(sizeof(*svc), GFP_KERNEL);
1313         if (!svc)
1314                 return NULL;
1315
1316         svc->wq = alloc_workqueue("%s:svc", WQ_UNBOUND, 1, dev_name(&hd->dev));
1317         if (!svc->wq) {
1318                 kfree(svc);
1319                 return NULL;
1320         }
1321
1322         svc->dev.parent = &hd->dev;
1323         svc->dev.bus = &greybus_bus_type;
1324         svc->dev.type = &greybus_svc_type;
1325         svc->dev.groups = svc_groups;
1326         svc->dev.dma_mask = svc->dev.parent->dma_mask;
1327         device_initialize(&svc->dev);
1328
1329         dev_set_name(&svc->dev, "%d-svc", hd->bus_id);
1330
1331         ida_init(&svc->device_id_map);
1332         svc->state = GB_SVC_STATE_RESET;
1333         svc->hd = hd;
1334
1335         svc->connection = gb_connection_create_static(hd, GB_SVC_CPORT_ID,
1336                                                 gb_svc_request_handler);
1337         if (IS_ERR(svc->connection)) {
1338                 dev_err(&svc->dev, "failed to create connection: %ld\n",
1339                                 PTR_ERR(svc->connection));
1340                 goto err_put_device;
1341         }
1342
1343         gb_connection_set_data(svc->connection, svc);
1344
1345         return svc;
1346
1347 err_put_device:
1348         put_device(&svc->dev);
1349         return NULL;
1350 }
1351
1352 int gb_svc_add(struct gb_svc *svc)
1353 {
1354         int ret;
1355
1356         /*
1357          * The SVC protocol is currently driven by the SVC, so the SVC device
1358          * is added from the connection request handler when enough
1359          * information has been received.
1360          */
1361         ret = gb_connection_enable(svc->connection);
1362         if (ret)
1363                 return ret;
1364
1365         return 0;
1366 }
1367
1368 static void gb_svc_remove_modules(struct gb_svc *svc)
1369 {
1370         struct gb_host_device *hd = svc->hd;
1371         struct gb_module *module, *tmp;
1372
1373         list_for_each_entry_safe(module, tmp, &hd->modules, hd_node) {
1374                 gb_module_del(module);
1375                 list_del(&module->hd_node);
1376                 gb_module_put(module);
1377         }
1378 }
1379
1380 void gb_svc_del(struct gb_svc *svc)
1381 {
1382         gb_connection_disable_rx(svc->connection);
1383
1384         /*
1385          * The SVC device may have been registered from the request handler.
1386          */
1387         if (device_is_registered(&svc->dev)) {
1388                 gb_svc_debugfs_exit(svc);
1389                 gb_svc_watchdog_destroy(svc);
1390                 device_del(&svc->dev);
1391         }
1392
1393         flush_workqueue(svc->wq);
1394
1395         gb_svc_remove_modules(svc);
1396
1397         gb_connection_disable(svc->connection);
1398 }
1399
1400 void gb_svc_put(struct gb_svc *svc)
1401 {
1402         put_device(&svc->dev);
1403 }