GNU Linux-libre 4.14.290-gnu1
[releases.git] / drivers / usb / dwc3 / debugfs.c
1 /**
2  * debugfs.c - DesignWare USB3 DRD Controller DebugFS file
3  *
4  * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
5  *
6  * Authors: Felipe Balbi <balbi@ti.com>,
7  *          Sebastian Andrzej Siewior <bigeasy@linutronix.de>
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2  of
11  * the License as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  */
18
19 #include <linux/kernel.h>
20 #include <linux/slab.h>
21 #include <linux/ptrace.h>
22 #include <linux/types.h>
23 #include <linux/spinlock.h>
24 #include <linux/debugfs.h>
25 #include <linux/seq_file.h>
26 #include <linux/delay.h>
27 #include <linux/uaccess.h>
28
29 #include <linux/usb/ch9.h>
30
31 #include "core.h"
32 #include "gadget.h"
33 #include "io.h"
34 #include "debug.h"
35
36 #define dump_register(nm)                               \
37 {                                                       \
38         .name   = __stringify(nm),                      \
39         .offset = DWC3_ ##nm,                           \
40 }
41
42 #define dump_ep_register_set(n)                 \
43         {                                       \
44                 .name = "DEPCMDPAR2("__stringify(n)")", \
45                 .offset = DWC3_DEP_BASE(n) +    \
46                         DWC3_DEPCMDPAR2,        \
47         },                                      \
48         {                                       \
49                 .name = "DEPCMDPAR1("__stringify(n)")", \
50                 .offset = DWC3_DEP_BASE(n) +    \
51                         DWC3_DEPCMDPAR1,        \
52         },                                      \
53         {                                       \
54                 .name = "DEPCMDPAR0("__stringify(n)")", \
55                 .offset = DWC3_DEP_BASE(n) +    \
56                         DWC3_DEPCMDPAR0,        \
57         },                                      \
58         {                                       \
59                 .name = "DEPCMD("__stringify(n)")",     \
60                 .offset = DWC3_DEP_BASE(n) +    \
61                         DWC3_DEPCMD,            \
62         }
63
64
65 static const struct debugfs_reg32 dwc3_regs[] = {
66         dump_register(GSBUSCFG0),
67         dump_register(GSBUSCFG1),
68         dump_register(GTXTHRCFG),
69         dump_register(GRXTHRCFG),
70         dump_register(GCTL),
71         dump_register(GEVTEN),
72         dump_register(GSTS),
73         dump_register(GUCTL1),
74         dump_register(GSNPSID),
75         dump_register(GGPIO),
76         dump_register(GUID),
77         dump_register(GUCTL),
78         dump_register(GBUSERRADDR0),
79         dump_register(GBUSERRADDR1),
80         dump_register(GPRTBIMAP0),
81         dump_register(GPRTBIMAP1),
82         dump_register(GHWPARAMS0),
83         dump_register(GHWPARAMS1),
84         dump_register(GHWPARAMS2),
85         dump_register(GHWPARAMS3),
86         dump_register(GHWPARAMS4),
87         dump_register(GHWPARAMS5),
88         dump_register(GHWPARAMS6),
89         dump_register(GHWPARAMS7),
90         dump_register(GDBGFIFOSPACE),
91         dump_register(GDBGLTSSM),
92         dump_register(GPRTBIMAP_HS0),
93         dump_register(GPRTBIMAP_HS1),
94         dump_register(GPRTBIMAP_FS0),
95         dump_register(GPRTBIMAP_FS1),
96
97         dump_register(GUSB2PHYCFG(0)),
98         dump_register(GUSB2PHYCFG(1)),
99         dump_register(GUSB2PHYCFG(2)),
100         dump_register(GUSB2PHYCFG(3)),
101         dump_register(GUSB2PHYCFG(4)),
102         dump_register(GUSB2PHYCFG(5)),
103         dump_register(GUSB2PHYCFG(6)),
104         dump_register(GUSB2PHYCFG(7)),
105         dump_register(GUSB2PHYCFG(8)),
106         dump_register(GUSB2PHYCFG(9)),
107         dump_register(GUSB2PHYCFG(10)),
108         dump_register(GUSB2PHYCFG(11)),
109         dump_register(GUSB2PHYCFG(12)),
110         dump_register(GUSB2PHYCFG(13)),
111         dump_register(GUSB2PHYCFG(14)),
112         dump_register(GUSB2PHYCFG(15)),
113
114         dump_register(GUSB2I2CCTL(0)),
115         dump_register(GUSB2I2CCTL(1)),
116         dump_register(GUSB2I2CCTL(2)),
117         dump_register(GUSB2I2CCTL(3)),
118         dump_register(GUSB2I2CCTL(4)),
119         dump_register(GUSB2I2CCTL(5)),
120         dump_register(GUSB2I2CCTL(6)),
121         dump_register(GUSB2I2CCTL(7)),
122         dump_register(GUSB2I2CCTL(8)),
123         dump_register(GUSB2I2CCTL(9)),
124         dump_register(GUSB2I2CCTL(10)),
125         dump_register(GUSB2I2CCTL(11)),
126         dump_register(GUSB2I2CCTL(12)),
127         dump_register(GUSB2I2CCTL(13)),
128         dump_register(GUSB2I2CCTL(14)),
129         dump_register(GUSB2I2CCTL(15)),
130
131         dump_register(GUSB2PHYACC(0)),
132         dump_register(GUSB2PHYACC(1)),
133         dump_register(GUSB2PHYACC(2)),
134         dump_register(GUSB2PHYACC(3)),
135         dump_register(GUSB2PHYACC(4)),
136         dump_register(GUSB2PHYACC(5)),
137         dump_register(GUSB2PHYACC(6)),
138         dump_register(GUSB2PHYACC(7)),
139         dump_register(GUSB2PHYACC(8)),
140         dump_register(GUSB2PHYACC(9)),
141         dump_register(GUSB2PHYACC(10)),
142         dump_register(GUSB2PHYACC(11)),
143         dump_register(GUSB2PHYACC(12)),
144         dump_register(GUSB2PHYACC(13)),
145         dump_register(GUSB2PHYACC(14)),
146         dump_register(GUSB2PHYACC(15)),
147
148         dump_register(GUSB3PIPECTL(0)),
149         dump_register(GUSB3PIPECTL(1)),
150         dump_register(GUSB3PIPECTL(2)),
151         dump_register(GUSB3PIPECTL(3)),
152         dump_register(GUSB3PIPECTL(4)),
153         dump_register(GUSB3PIPECTL(5)),
154         dump_register(GUSB3PIPECTL(6)),
155         dump_register(GUSB3PIPECTL(7)),
156         dump_register(GUSB3PIPECTL(8)),
157         dump_register(GUSB3PIPECTL(9)),
158         dump_register(GUSB3PIPECTL(10)),
159         dump_register(GUSB3PIPECTL(11)),
160         dump_register(GUSB3PIPECTL(12)),
161         dump_register(GUSB3PIPECTL(13)),
162         dump_register(GUSB3PIPECTL(14)),
163         dump_register(GUSB3PIPECTL(15)),
164
165         dump_register(GTXFIFOSIZ(0)),
166         dump_register(GTXFIFOSIZ(1)),
167         dump_register(GTXFIFOSIZ(2)),
168         dump_register(GTXFIFOSIZ(3)),
169         dump_register(GTXFIFOSIZ(4)),
170         dump_register(GTXFIFOSIZ(5)),
171         dump_register(GTXFIFOSIZ(6)),
172         dump_register(GTXFIFOSIZ(7)),
173         dump_register(GTXFIFOSIZ(8)),
174         dump_register(GTXFIFOSIZ(9)),
175         dump_register(GTXFIFOSIZ(10)),
176         dump_register(GTXFIFOSIZ(11)),
177         dump_register(GTXFIFOSIZ(12)),
178         dump_register(GTXFIFOSIZ(13)),
179         dump_register(GTXFIFOSIZ(14)),
180         dump_register(GTXFIFOSIZ(15)),
181         dump_register(GTXFIFOSIZ(16)),
182         dump_register(GTXFIFOSIZ(17)),
183         dump_register(GTXFIFOSIZ(18)),
184         dump_register(GTXFIFOSIZ(19)),
185         dump_register(GTXFIFOSIZ(20)),
186         dump_register(GTXFIFOSIZ(21)),
187         dump_register(GTXFIFOSIZ(22)),
188         dump_register(GTXFIFOSIZ(23)),
189         dump_register(GTXFIFOSIZ(24)),
190         dump_register(GTXFIFOSIZ(25)),
191         dump_register(GTXFIFOSIZ(26)),
192         dump_register(GTXFIFOSIZ(27)),
193         dump_register(GTXFIFOSIZ(28)),
194         dump_register(GTXFIFOSIZ(29)),
195         dump_register(GTXFIFOSIZ(30)),
196         dump_register(GTXFIFOSIZ(31)),
197
198         dump_register(GRXFIFOSIZ(0)),
199         dump_register(GRXFIFOSIZ(1)),
200         dump_register(GRXFIFOSIZ(2)),
201         dump_register(GRXFIFOSIZ(3)),
202         dump_register(GRXFIFOSIZ(4)),
203         dump_register(GRXFIFOSIZ(5)),
204         dump_register(GRXFIFOSIZ(6)),
205         dump_register(GRXFIFOSIZ(7)),
206         dump_register(GRXFIFOSIZ(8)),
207         dump_register(GRXFIFOSIZ(9)),
208         dump_register(GRXFIFOSIZ(10)),
209         dump_register(GRXFIFOSIZ(11)),
210         dump_register(GRXFIFOSIZ(12)),
211         dump_register(GRXFIFOSIZ(13)),
212         dump_register(GRXFIFOSIZ(14)),
213         dump_register(GRXFIFOSIZ(15)),
214         dump_register(GRXFIFOSIZ(16)),
215         dump_register(GRXFIFOSIZ(17)),
216         dump_register(GRXFIFOSIZ(18)),
217         dump_register(GRXFIFOSIZ(19)),
218         dump_register(GRXFIFOSIZ(20)),
219         dump_register(GRXFIFOSIZ(21)),
220         dump_register(GRXFIFOSIZ(22)),
221         dump_register(GRXFIFOSIZ(23)),
222         dump_register(GRXFIFOSIZ(24)),
223         dump_register(GRXFIFOSIZ(25)),
224         dump_register(GRXFIFOSIZ(26)),
225         dump_register(GRXFIFOSIZ(27)),
226         dump_register(GRXFIFOSIZ(28)),
227         dump_register(GRXFIFOSIZ(29)),
228         dump_register(GRXFIFOSIZ(30)),
229         dump_register(GRXFIFOSIZ(31)),
230
231         dump_register(GEVNTADRLO(0)),
232         dump_register(GEVNTADRHI(0)),
233         dump_register(GEVNTSIZ(0)),
234         dump_register(GEVNTCOUNT(0)),
235
236         dump_register(GHWPARAMS8),
237         dump_register(DCFG),
238         dump_register(DCTL),
239         dump_register(DEVTEN),
240         dump_register(DSTS),
241         dump_register(DGCMDPAR),
242         dump_register(DGCMD),
243         dump_register(DALEPENA),
244
245         dump_ep_register_set(0),
246         dump_ep_register_set(1),
247         dump_ep_register_set(2),
248         dump_ep_register_set(3),
249         dump_ep_register_set(4),
250         dump_ep_register_set(5),
251         dump_ep_register_set(6),
252         dump_ep_register_set(7),
253         dump_ep_register_set(8),
254         dump_ep_register_set(9),
255         dump_ep_register_set(10),
256         dump_ep_register_set(11),
257         dump_ep_register_set(12),
258         dump_ep_register_set(13),
259         dump_ep_register_set(14),
260         dump_ep_register_set(15),
261         dump_ep_register_set(16),
262         dump_ep_register_set(17),
263         dump_ep_register_set(18),
264         dump_ep_register_set(19),
265         dump_ep_register_set(20),
266         dump_ep_register_set(21),
267         dump_ep_register_set(22),
268         dump_ep_register_set(23),
269         dump_ep_register_set(24),
270         dump_ep_register_set(25),
271         dump_ep_register_set(26),
272         dump_ep_register_set(27),
273         dump_ep_register_set(28),
274         dump_ep_register_set(29),
275         dump_ep_register_set(30),
276         dump_ep_register_set(31),
277
278         dump_register(OCFG),
279         dump_register(OCTL),
280         dump_register(OEVT),
281         dump_register(OEVTEN),
282         dump_register(OSTS),
283 };
284
285 static int dwc3_mode_show(struct seq_file *s, void *unused)
286 {
287         struct dwc3             *dwc = s->private;
288         unsigned long           flags;
289         u32                     reg;
290
291         spin_lock_irqsave(&dwc->lock, flags);
292         reg = dwc3_readl(dwc->regs, DWC3_GCTL);
293         spin_unlock_irqrestore(&dwc->lock, flags);
294
295         switch (DWC3_GCTL_PRTCAP(reg)) {
296         case DWC3_GCTL_PRTCAP_HOST:
297                 seq_printf(s, "host\n");
298                 break;
299         case DWC3_GCTL_PRTCAP_DEVICE:
300                 seq_printf(s, "device\n");
301                 break;
302         case DWC3_GCTL_PRTCAP_OTG:
303                 seq_printf(s, "otg\n");
304                 break;
305         default:
306                 seq_printf(s, "UNKNOWN %08x\n", DWC3_GCTL_PRTCAP(reg));
307         }
308
309         return 0;
310 }
311
312 static int dwc3_mode_open(struct inode *inode, struct file *file)
313 {
314         return single_open(file, dwc3_mode_show, inode->i_private);
315 }
316
317 static ssize_t dwc3_mode_write(struct file *file,
318                 const char __user *ubuf, size_t count, loff_t *ppos)
319 {
320         struct seq_file         *s = file->private_data;
321         struct dwc3             *dwc = s->private;
322         u32                     mode = 0;
323         char                    buf[32];
324
325         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
326                 return -EFAULT;
327
328         if (!strncmp(buf, "host", 4))
329                 mode = DWC3_GCTL_PRTCAP_HOST;
330
331         if (!strncmp(buf, "device", 6))
332                 mode = DWC3_GCTL_PRTCAP_DEVICE;
333
334         if (!strncmp(buf, "otg", 3))
335                 mode = DWC3_GCTL_PRTCAP_OTG;
336
337         dwc3_set_mode(dwc, mode);
338
339         return count;
340 }
341
342 static const struct file_operations dwc3_mode_fops = {
343         .open                   = dwc3_mode_open,
344         .write                  = dwc3_mode_write,
345         .read                   = seq_read,
346         .llseek                 = seq_lseek,
347         .release                = single_release,
348 };
349
350 static int dwc3_testmode_show(struct seq_file *s, void *unused)
351 {
352         struct dwc3             *dwc = s->private;
353         unsigned long           flags;
354         u32                     reg;
355
356         spin_lock_irqsave(&dwc->lock, flags);
357         reg = dwc3_readl(dwc->regs, DWC3_DCTL);
358         reg &= DWC3_DCTL_TSTCTRL_MASK;
359         reg >>= 1;
360         spin_unlock_irqrestore(&dwc->lock, flags);
361
362         switch (reg) {
363         case 0:
364                 seq_printf(s, "no test\n");
365                 break;
366         case TEST_J:
367                 seq_printf(s, "test_j\n");
368                 break;
369         case TEST_K:
370                 seq_printf(s, "test_k\n");
371                 break;
372         case TEST_SE0_NAK:
373                 seq_printf(s, "test_se0_nak\n");
374                 break;
375         case TEST_PACKET:
376                 seq_printf(s, "test_packet\n");
377                 break;
378         case TEST_FORCE_EN:
379                 seq_printf(s, "test_force_enable\n");
380                 break;
381         default:
382                 seq_printf(s, "UNKNOWN %d\n", reg);
383         }
384
385         return 0;
386 }
387
388 static int dwc3_testmode_open(struct inode *inode, struct file *file)
389 {
390         return single_open(file, dwc3_testmode_show, inode->i_private);
391 }
392
393 static ssize_t dwc3_testmode_write(struct file *file,
394                 const char __user *ubuf, size_t count, loff_t *ppos)
395 {
396         struct seq_file         *s = file->private_data;
397         struct dwc3             *dwc = s->private;
398         unsigned long           flags;
399         u32                     testmode = 0;
400         char                    buf[32];
401
402         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
403                 return -EFAULT;
404
405         if (!strncmp(buf, "test_j", 6))
406                 testmode = TEST_J;
407         else if (!strncmp(buf, "test_k", 6))
408                 testmode = TEST_K;
409         else if (!strncmp(buf, "test_se0_nak", 12))
410                 testmode = TEST_SE0_NAK;
411         else if (!strncmp(buf, "test_packet", 11))
412                 testmode = TEST_PACKET;
413         else if (!strncmp(buf, "test_force_enable", 17))
414                 testmode = TEST_FORCE_EN;
415         else
416                 testmode = 0;
417
418         spin_lock_irqsave(&dwc->lock, flags);
419         dwc3_gadget_set_test_mode(dwc, testmode);
420         spin_unlock_irqrestore(&dwc->lock, flags);
421
422         return count;
423 }
424
425 static const struct file_operations dwc3_testmode_fops = {
426         .open                   = dwc3_testmode_open,
427         .write                  = dwc3_testmode_write,
428         .read                   = seq_read,
429         .llseek                 = seq_lseek,
430         .release                = single_release,
431 };
432
433 static int dwc3_link_state_show(struct seq_file *s, void *unused)
434 {
435         struct dwc3             *dwc = s->private;
436         unsigned long           flags;
437         enum dwc3_link_state    state;
438         u32                     reg;
439         u8                      speed;
440
441         spin_lock_irqsave(&dwc->lock, flags);
442         reg = dwc3_readl(dwc->regs, DWC3_DSTS);
443         state = DWC3_DSTS_USBLNKST(reg);
444         speed = reg & DWC3_DSTS_CONNECTSPD;
445
446         seq_printf(s, "%s\n", (speed >= DWC3_DSTS_SUPERSPEED) ?
447                    dwc3_gadget_link_string(state) :
448                    dwc3_gadget_hs_link_string(state));
449         spin_unlock_irqrestore(&dwc->lock, flags);
450
451         return 0;
452 }
453
454 static int dwc3_link_state_open(struct inode *inode, struct file *file)
455 {
456         return single_open(file, dwc3_link_state_show, inode->i_private);
457 }
458
459 static ssize_t dwc3_link_state_write(struct file *file,
460                 const char __user *ubuf, size_t count, loff_t *ppos)
461 {
462         struct seq_file         *s = file->private_data;
463         struct dwc3             *dwc = s->private;
464         unsigned long           flags;
465         enum dwc3_link_state    state = 0;
466         char                    buf[32];
467         u32                     reg;
468         u8                      speed;
469
470         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
471                 return -EFAULT;
472
473         if (!strncmp(buf, "SS.Disabled", 11))
474                 state = DWC3_LINK_STATE_SS_DIS;
475         else if (!strncmp(buf, "Rx.Detect", 9))
476                 state = DWC3_LINK_STATE_RX_DET;
477         else if (!strncmp(buf, "SS.Inactive", 11))
478                 state = DWC3_LINK_STATE_SS_INACT;
479         else if (!strncmp(buf, "Recovery", 8))
480                 state = DWC3_LINK_STATE_RECOV;
481         else if (!strncmp(buf, "Compliance", 10))
482                 state = DWC3_LINK_STATE_CMPLY;
483         else if (!strncmp(buf, "Loopback", 8))
484                 state = DWC3_LINK_STATE_LPBK;
485         else
486                 return -EINVAL;
487
488         spin_lock_irqsave(&dwc->lock, flags);
489         reg = dwc3_readl(dwc->regs, DWC3_DSTS);
490         speed = reg & DWC3_DSTS_CONNECTSPD;
491
492         if (speed < DWC3_DSTS_SUPERSPEED &&
493             state != DWC3_LINK_STATE_RECOV) {
494                 spin_unlock_irqrestore(&dwc->lock, flags);
495                 return -EINVAL;
496         }
497
498         dwc3_gadget_set_link_state(dwc, state);
499         spin_unlock_irqrestore(&dwc->lock, flags);
500
501         return count;
502 }
503
504 static const struct file_operations dwc3_link_state_fops = {
505         .open                   = dwc3_link_state_open,
506         .write                  = dwc3_link_state_write,
507         .read                   = seq_read,
508         .llseek                 = seq_lseek,
509         .release                = single_release,
510 };
511
512 struct dwc3_ep_file_map {
513         char name[25];
514         int (*show)(struct seq_file *s, void *unused);
515 };
516
517 static int dwc3_tx_fifo_queue_show(struct seq_file *s, void *unused)
518 {
519         struct dwc3_ep          *dep = s->private;
520         struct dwc3             *dwc = dep->dwc;
521         unsigned long           flags;
522         u32                     val;
523
524         spin_lock_irqsave(&dwc->lock, flags);
525         val = dwc3_core_fifo_space(dep, DWC3_TXFIFOQ);
526         seq_printf(s, "%u\n", val);
527         spin_unlock_irqrestore(&dwc->lock, flags);
528
529         return 0;
530 }
531
532 static int dwc3_rx_fifo_queue_show(struct seq_file *s, void *unused)
533 {
534         struct dwc3_ep          *dep = s->private;
535         struct dwc3             *dwc = dep->dwc;
536         unsigned long           flags;
537         u32                     val;
538
539         spin_lock_irqsave(&dwc->lock, flags);
540         val = dwc3_core_fifo_space(dep, DWC3_RXFIFOQ);
541         seq_printf(s, "%u\n", val);
542         spin_unlock_irqrestore(&dwc->lock, flags);
543
544         return 0;
545 }
546
547 static int dwc3_tx_request_queue_show(struct seq_file *s, void *unused)
548 {
549         struct dwc3_ep          *dep = s->private;
550         struct dwc3             *dwc = dep->dwc;
551         unsigned long           flags;
552         u32                     val;
553
554         spin_lock_irqsave(&dwc->lock, flags);
555         val = dwc3_core_fifo_space(dep, DWC3_TXREQQ);
556         seq_printf(s, "%u\n", val);
557         spin_unlock_irqrestore(&dwc->lock, flags);
558
559         return 0;
560 }
561
562 static int dwc3_rx_request_queue_show(struct seq_file *s, void *unused)
563 {
564         struct dwc3_ep          *dep = s->private;
565         struct dwc3             *dwc = dep->dwc;
566         unsigned long           flags;
567         u32                     val;
568
569         spin_lock_irqsave(&dwc->lock, flags);
570         val = dwc3_core_fifo_space(dep, DWC3_RXREQQ);
571         seq_printf(s, "%u\n", val);
572         spin_unlock_irqrestore(&dwc->lock, flags);
573
574         return 0;
575 }
576
577 static int dwc3_rx_info_queue_show(struct seq_file *s, void *unused)
578 {
579         struct dwc3_ep          *dep = s->private;
580         struct dwc3             *dwc = dep->dwc;
581         unsigned long           flags;
582         u32                     val;
583
584         spin_lock_irqsave(&dwc->lock, flags);
585         val = dwc3_core_fifo_space(dep, DWC3_RXINFOQ);
586         seq_printf(s, "%u\n", val);
587         spin_unlock_irqrestore(&dwc->lock, flags);
588
589         return 0;
590 }
591
592 static int dwc3_descriptor_fetch_queue_show(struct seq_file *s, void *unused)
593 {
594         struct dwc3_ep          *dep = s->private;
595         struct dwc3             *dwc = dep->dwc;
596         unsigned long           flags;
597         u32                     val;
598
599         spin_lock_irqsave(&dwc->lock, flags);
600         val = dwc3_core_fifo_space(dep, DWC3_DESCFETCHQ);
601         seq_printf(s, "%u\n", val);
602         spin_unlock_irqrestore(&dwc->lock, flags);
603
604         return 0;
605 }
606
607 static int dwc3_event_queue_show(struct seq_file *s, void *unused)
608 {
609         struct dwc3_ep          *dep = s->private;
610         struct dwc3             *dwc = dep->dwc;
611         unsigned long           flags;
612         u32                     val;
613
614         spin_lock_irqsave(&dwc->lock, flags);
615         val = dwc3_core_fifo_space(dep, DWC3_EVENTQ);
616         seq_printf(s, "%u\n", val);
617         spin_unlock_irqrestore(&dwc->lock, flags);
618
619         return 0;
620 }
621
622 static int dwc3_ep_transfer_type_show(struct seq_file *s, void *unused)
623 {
624         struct dwc3_ep          *dep = s->private;
625         struct dwc3             *dwc = dep->dwc;
626         unsigned long           flags;
627
628         spin_lock_irqsave(&dwc->lock, flags);
629         if (!(dep->flags & DWC3_EP_ENABLED) ||
630                         !dep->endpoint.desc) {
631                 seq_printf(s, "--\n");
632                 goto out;
633         }
634
635         switch (usb_endpoint_type(dep->endpoint.desc)) {
636         case USB_ENDPOINT_XFER_CONTROL:
637                 seq_printf(s, "control\n");
638                 break;
639         case USB_ENDPOINT_XFER_ISOC:
640                 seq_printf(s, "isochronous\n");
641                 break;
642         case USB_ENDPOINT_XFER_BULK:
643                 seq_printf(s, "bulk\n");
644                 break;
645         case USB_ENDPOINT_XFER_INT:
646                 seq_printf(s, "interrupt\n");
647                 break;
648         default:
649                 seq_printf(s, "--\n");
650         }
651
652 out:
653         spin_unlock_irqrestore(&dwc->lock, flags);
654
655         return 0;
656 }
657
658 static int dwc3_ep_trb_ring_show(struct seq_file *s, void *unused)
659 {
660         struct dwc3_ep          *dep = s->private;
661         struct dwc3             *dwc = dep->dwc;
662         unsigned long           flags;
663         int                     i;
664
665         spin_lock_irqsave(&dwc->lock, flags);
666         if (dep->number <= 1) {
667                 seq_printf(s, "--\n");
668                 goto out;
669         }
670
671         seq_printf(s, "buffer_addr,size,type,ioc,isp_imi,csp,chn,lst,hwo\n");
672
673         for (i = 0; i < DWC3_TRB_NUM; i++) {
674                 struct dwc3_trb *trb = &dep->trb_pool[i];
675                 unsigned int type = DWC3_TRBCTL_TYPE(trb->ctrl);
676
677                 seq_printf(s, "%08x%08x,%d,%s,%d,%d,%d,%d,%d,%d       %c%c\n",
678                                 trb->bph, trb->bpl, trb->size,
679                                 dwc3_trb_type_string(type),
680                                 !!(trb->ctrl & DWC3_TRB_CTRL_IOC),
681                                 !!(trb->ctrl & DWC3_TRB_CTRL_ISP_IMI),
682                                 !!(trb->ctrl & DWC3_TRB_CTRL_CSP),
683                                 !!(trb->ctrl & DWC3_TRB_CTRL_CHN),
684                                 !!(trb->ctrl & DWC3_TRB_CTRL_LST),
685                                 !!(trb->ctrl & DWC3_TRB_CTRL_HWO),
686                                 dep->trb_enqueue == i ? 'E' : ' ',
687                                 dep->trb_dequeue == i ? 'D' : ' ');
688         }
689
690 out:
691         spin_unlock_irqrestore(&dwc->lock, flags);
692
693         return 0;
694 }
695
696 static struct dwc3_ep_file_map map[] = {
697         { "tx_fifo_queue", dwc3_tx_fifo_queue_show, },
698         { "rx_fifo_queue", dwc3_rx_fifo_queue_show, },
699         { "tx_request_queue", dwc3_tx_request_queue_show, },
700         { "rx_request_queue", dwc3_rx_request_queue_show, },
701         { "rx_info_queue", dwc3_rx_info_queue_show, },
702         { "descriptor_fetch_queue", dwc3_descriptor_fetch_queue_show, },
703         { "event_queue", dwc3_event_queue_show, },
704         { "transfer_type", dwc3_ep_transfer_type_show, },
705         { "trb_ring", dwc3_ep_trb_ring_show, },
706 };
707
708 static int dwc3_endpoint_open(struct inode *inode, struct file *file)
709 {
710         const char              *file_name = file_dentry(file)->d_iname;
711         struct dwc3_ep_file_map *f_map;
712         int                     i;
713
714         for (i = 0; i < ARRAY_SIZE(map); i++) {
715                 f_map = &map[i];
716
717                 if (strcmp(f_map->name, file_name) == 0)
718                         break;
719         }
720
721         return single_open(file, f_map->show, inode->i_private);
722 }
723
724 static const struct file_operations dwc3_endpoint_fops = {
725         .open                   = dwc3_endpoint_open,
726         .read                   = seq_read,
727         .llseek                 = seq_lseek,
728         .release                = single_release,
729 };
730
731 static void dwc3_debugfs_create_endpoint_file(struct dwc3_ep *dep,
732                 struct dentry *parent, int type)
733 {
734         struct dentry           *file;
735         struct dwc3_ep_file_map *ep_file = &map[type];
736
737         file = debugfs_create_file(ep_file->name, S_IRUGO, parent, dep,
738                         &dwc3_endpoint_fops);
739 }
740
741 static void dwc3_debugfs_create_endpoint_files(struct dwc3_ep *dep,
742                 struct dentry *parent)
743 {
744         int                     i;
745
746         for (i = 0; i < ARRAY_SIZE(map); i++)
747                 dwc3_debugfs_create_endpoint_file(dep, parent, i);
748 }
749
750 static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep,
751                 struct dentry *parent)
752 {
753         struct dentry           *dir;
754
755         dir = debugfs_create_dir(dep->name, parent);
756         if (IS_ERR_OR_NULL(dir))
757                 return;
758
759         dwc3_debugfs_create_endpoint_files(dep, dir);
760 }
761
762 static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc,
763                 struct dentry *parent)
764 {
765         int                     i;
766
767         for (i = 0; i < dwc->num_eps; i++) {
768                 struct dwc3_ep  *dep = dwc->eps[i];
769
770                 if (!dep)
771                         continue;
772
773                 dwc3_debugfs_create_endpoint_dir(dep, parent);
774         }
775 }
776
777 void dwc3_debugfs_init(struct dwc3 *dwc)
778 {
779         struct dentry           *root;
780         struct dentry           *file;
781
782         root = debugfs_create_dir(dev_name(dwc->dev), NULL);
783         if (IS_ERR_OR_NULL(root)) {
784                 if (!root)
785                         dev_err(dwc->dev, "Can't create debugfs root\n");
786                 return;
787         }
788         dwc->root = root;
789
790         dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL);
791         if (!dwc->regset) {
792                 debugfs_remove_recursive(root);
793                 return;
794         }
795
796         dwc->regset->regs = dwc3_regs;
797         dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
798         dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
799
800         file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
801         if (!file)
802                 dev_dbg(dwc->dev, "Can't create debugfs regdump\n");
803
804         if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)) {
805                 file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
806                                 dwc, &dwc3_mode_fops);
807                 if (!file)
808                         dev_dbg(dwc->dev, "Can't create debugfs mode\n");
809         }
810
811         if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) ||
812                         IS_ENABLED(CONFIG_USB_DWC3_GADGET)) {
813                 file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root,
814                                 dwc, &dwc3_testmode_fops);
815                 if (!file)
816                         dev_dbg(dwc->dev, "Can't create debugfs testmode\n");
817
818                 file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR,
819                                 root, dwc, &dwc3_link_state_fops);
820                 if (!file)
821                         dev_dbg(dwc->dev, "Can't create debugfs link_state\n");
822
823                 dwc3_debugfs_create_endpoint_dirs(dwc, root);
824         }
825 }
826
827 void dwc3_debugfs_exit(struct dwc3 *dwc)
828 {
829         debugfs_remove_recursive(dwc->root);
830         kfree(dwc->regset);
831 }