usb: dwc3: core: make dwc3_set_mode() work properly
[linux-2.6-block.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
440         spin_lock_irqsave(&dwc->lock, flags);
441         reg = dwc3_readl(dwc->regs, DWC3_DSTS);
442         state = DWC3_DSTS_USBLNKST(reg);
443         spin_unlock_irqrestore(&dwc->lock, flags);
444
445         seq_printf(s, "%s\n", dwc3_gadget_link_string(state));
446
447         return 0;
448 }
449
450 static int dwc3_link_state_open(struct inode *inode, struct file *file)
451 {
452         return single_open(file, dwc3_link_state_show, inode->i_private);
453 }
454
455 static ssize_t dwc3_link_state_write(struct file *file,
456                 const char __user *ubuf, size_t count, loff_t *ppos)
457 {
458         struct seq_file         *s = file->private_data;
459         struct dwc3             *dwc = s->private;
460         unsigned long           flags;
461         enum dwc3_link_state    state = 0;
462         char                    buf[32];
463
464         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
465                 return -EFAULT;
466
467         if (!strncmp(buf, "SS.Disabled", 11))
468                 state = DWC3_LINK_STATE_SS_DIS;
469         else if (!strncmp(buf, "Rx.Detect", 9))
470                 state = DWC3_LINK_STATE_RX_DET;
471         else if (!strncmp(buf, "SS.Inactive", 11))
472                 state = DWC3_LINK_STATE_SS_INACT;
473         else if (!strncmp(buf, "Recovery", 8))
474                 state = DWC3_LINK_STATE_RECOV;
475         else if (!strncmp(buf, "Compliance", 10))
476                 state = DWC3_LINK_STATE_CMPLY;
477         else if (!strncmp(buf, "Loopback", 8))
478                 state = DWC3_LINK_STATE_LPBK;
479         else
480                 return -EINVAL;
481
482         spin_lock_irqsave(&dwc->lock, flags);
483         dwc3_gadget_set_link_state(dwc, state);
484         spin_unlock_irqrestore(&dwc->lock, flags);
485
486         return count;
487 }
488
489 static const struct file_operations dwc3_link_state_fops = {
490         .open                   = dwc3_link_state_open,
491         .write                  = dwc3_link_state_write,
492         .read                   = seq_read,
493         .llseek                 = seq_lseek,
494         .release                = single_release,
495 };
496
497 struct dwc3_ep_file_map {
498         char name[25];
499         int (*show)(struct seq_file *s, void *unused);
500 };
501
502 static int dwc3_tx_fifo_queue_show(struct seq_file *s, void *unused)
503 {
504         struct dwc3_ep          *dep = s->private;
505         struct dwc3             *dwc = dep->dwc;
506         unsigned long           flags;
507         u32                     val;
508
509         spin_lock_irqsave(&dwc->lock, flags);
510         val = dwc3_core_fifo_space(dep, DWC3_TXFIFOQ);
511         seq_printf(s, "%u\n", val);
512         spin_unlock_irqrestore(&dwc->lock, flags);
513
514         return 0;
515 }
516
517 static int dwc3_rx_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_RXFIFOQ);
526         seq_printf(s, "%u\n", val);
527         spin_unlock_irqrestore(&dwc->lock, flags);
528
529         return 0;
530 }
531
532 static int dwc3_tx_request_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_TXREQQ);
541         seq_printf(s, "%u\n", val);
542         spin_unlock_irqrestore(&dwc->lock, flags);
543
544         return 0;
545 }
546
547 static int dwc3_rx_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_RXREQQ);
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_info_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_RXINFOQ);
571         seq_printf(s, "%u\n", val);
572         spin_unlock_irqrestore(&dwc->lock, flags);
573
574         return 0;
575 }
576
577 static int dwc3_descriptor_fetch_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_DESCFETCHQ);
586         seq_printf(s, "%u\n", val);
587         spin_unlock_irqrestore(&dwc->lock, flags);
588
589         return 0;
590 }
591
592 static int dwc3_event_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_EVENTQ);
601         seq_printf(s, "%u\n", val);
602         spin_unlock_irqrestore(&dwc->lock, flags);
603
604         return 0;
605 }
606
607 static int dwc3_ep_transfer_type_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
613         spin_lock_irqsave(&dwc->lock, flags);
614         if (!(dep->flags & DWC3_EP_ENABLED) ||
615                         !dep->endpoint.desc) {
616                 seq_printf(s, "--\n");
617                 goto out;
618         }
619
620         switch (usb_endpoint_type(dep->endpoint.desc)) {
621         case USB_ENDPOINT_XFER_CONTROL:
622                 seq_printf(s, "control\n");
623                 break;
624         case USB_ENDPOINT_XFER_ISOC:
625                 seq_printf(s, "isochronous\n");
626                 break;
627         case USB_ENDPOINT_XFER_BULK:
628                 seq_printf(s, "bulk\n");
629                 break;
630         case USB_ENDPOINT_XFER_INT:
631                 seq_printf(s, "interrupt\n");
632                 break;
633         default:
634                 seq_printf(s, "--\n");
635         }
636
637 out:
638         spin_unlock_irqrestore(&dwc->lock, flags);
639
640         return 0;
641 }
642
643 static int dwc3_ep_trb_ring_show(struct seq_file *s, void *unused)
644 {
645         struct dwc3_ep          *dep = s->private;
646         struct dwc3             *dwc = dep->dwc;
647         unsigned long           flags;
648         int                     i;
649
650         spin_lock_irqsave(&dwc->lock, flags);
651         if (dep->number <= 1) {
652                 seq_printf(s, "--\n");
653                 goto out;
654         }
655
656         seq_printf(s, "enqueue pointer %d\n", dep->trb_enqueue);
657         seq_printf(s, "dequeue pointer %d\n", dep->trb_dequeue);
658         seq_printf(s, "\n--------------------------------------------------\n\n");
659         seq_printf(s, "buffer_addr,size,type,ioc,isp_imi,csp,chn,lst,hwo\n");
660
661         for (i = 0; i < DWC3_TRB_NUM; i++) {
662                 struct dwc3_trb *trb = &dep->trb_pool[i];
663                 unsigned int type = DWC3_TRBCTL_TYPE(trb->ctrl);
664
665                 seq_printf(s, "%08x%08x,%d,%s,%d,%d,%d,%d,%d,%d\n",
666                                 trb->bph, trb->bpl, trb->size,
667                                 dwc3_trb_type_string(type),
668                                 !!(trb->ctrl & DWC3_TRB_CTRL_IOC),
669                                 !!(trb->ctrl & DWC3_TRB_CTRL_ISP_IMI),
670                                 !!(trb->ctrl & DWC3_TRB_CTRL_CSP),
671                                 !!(trb->ctrl & DWC3_TRB_CTRL_CHN),
672                                 !!(trb->ctrl & DWC3_TRB_CTRL_LST),
673                                 !!(trb->ctrl & DWC3_TRB_CTRL_HWO));
674         }
675
676 out:
677         spin_unlock_irqrestore(&dwc->lock, flags);
678
679         return 0;
680 }
681
682 static struct dwc3_ep_file_map map[] = {
683         { "tx_fifo_queue", dwc3_tx_fifo_queue_show, },
684         { "rx_fifo_queue", dwc3_rx_fifo_queue_show, },
685         { "tx_request_queue", dwc3_tx_request_queue_show, },
686         { "rx_request_queue", dwc3_rx_request_queue_show, },
687         { "rx_info_queue", dwc3_rx_info_queue_show, },
688         { "descriptor_fetch_queue", dwc3_descriptor_fetch_queue_show, },
689         { "event_queue", dwc3_event_queue_show, },
690         { "transfer_type", dwc3_ep_transfer_type_show, },
691         { "trb_ring", dwc3_ep_trb_ring_show, },
692 };
693
694 static int dwc3_endpoint_open(struct inode *inode, struct file *file)
695 {
696         const char              *file_name = file_dentry(file)->d_iname;
697         struct dwc3_ep_file_map *f_map;
698         int                     i;
699
700         for (i = 0; i < ARRAY_SIZE(map); i++) {
701                 f_map = &map[i];
702
703                 if (strcmp(f_map->name, file_name) == 0)
704                         break;
705         }
706
707         return single_open(file, f_map->show, inode->i_private);
708 }
709
710 static const struct file_operations dwc3_endpoint_fops = {
711         .open                   = dwc3_endpoint_open,
712         .read                   = seq_read,
713         .llseek                 = seq_lseek,
714         .release                = single_release,
715 };
716
717 static void dwc3_debugfs_create_endpoint_file(struct dwc3_ep *dep,
718                 struct dentry *parent, int type)
719 {
720         struct dentry           *file;
721         struct dwc3_ep_file_map *ep_file = &map[type];
722
723         file = debugfs_create_file(ep_file->name, S_IRUGO, parent, dep,
724                         &dwc3_endpoint_fops);
725 }
726
727 static void dwc3_debugfs_create_endpoint_files(struct dwc3_ep *dep,
728                 struct dentry *parent)
729 {
730         int                     i;
731
732         for (i = 0; i < ARRAY_SIZE(map); i++)
733                 dwc3_debugfs_create_endpoint_file(dep, parent, i);
734 }
735
736 static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep,
737                 struct dentry *parent)
738 {
739         struct dentry           *dir;
740
741         dir = debugfs_create_dir(dep->name, parent);
742         if (IS_ERR_OR_NULL(dir))
743                 return;
744
745         dwc3_debugfs_create_endpoint_files(dep, dir);
746 }
747
748 static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc,
749                 struct dentry *parent)
750 {
751         int                     i;
752
753         for (i = 0; i < dwc->num_eps; i++) {
754                 struct dwc3_ep  *dep = dwc->eps[i];
755
756                 if (!dep)
757                         continue;
758
759                 dwc3_debugfs_create_endpoint_dir(dep, parent);
760         }
761 }
762
763 void dwc3_debugfs_init(struct dwc3 *dwc)
764 {
765         struct dentry           *root;
766         struct dentry           *file;
767
768         root = debugfs_create_dir(dev_name(dwc->dev), NULL);
769         if (IS_ERR_OR_NULL(root)) {
770                 if (!root)
771                         dev_err(dwc->dev, "Can't create debugfs root\n");
772                 return;
773         }
774         dwc->root = root;
775
776         dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL);
777         if (!dwc->regset) {
778                 debugfs_remove_recursive(root);
779                 return;
780         }
781
782         dwc->regset->regs = dwc3_regs;
783         dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
784         dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
785
786         file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
787         if (!file)
788                 dev_dbg(dwc->dev, "Can't create debugfs regdump\n");
789
790         if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)) {
791                 file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
792                                 dwc, &dwc3_mode_fops);
793                 if (!file)
794                         dev_dbg(dwc->dev, "Can't create debugfs mode\n");
795         }
796
797         if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) ||
798                         IS_ENABLED(CONFIG_USB_DWC3_GADGET)) {
799                 file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root,
800                                 dwc, &dwc3_testmode_fops);
801                 if (!file)
802                         dev_dbg(dwc->dev, "Can't create debugfs testmode\n");
803
804                 file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR,
805                                 root, dwc, &dwc3_link_state_fops);
806                 if (!file)
807                         dev_dbg(dwc->dev, "Can't create debugfs link_state\n");
808
809                 dwc3_debugfs_create_endpoint_dirs(dwc, root);
810         }
811 }
812
813 void dwc3_debugfs_exit(struct dwc3 *dwc)
814 {
815         debugfs_remove_recursive(dwc->root);
816         kfree(dwc->regset);
817 }