UPSTREAM: usb: dwc3: debugfs: dump out endpoint details
[firefly-linux-kernel-4.4.55.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 - DWC3_GLOBALS_REGS_START, \
40 }
41
42 static const struct debugfs_reg32 dwc3_regs[] = {
43         dump_register(GSBUSCFG0),
44         dump_register(GSBUSCFG1),
45         dump_register(GTXTHRCFG),
46         dump_register(GRXTHRCFG),
47         dump_register(GCTL),
48         dump_register(GEVTEN),
49         dump_register(GSTS),
50         dump_register(GUCTL1),
51         dump_register(GSNPSID),
52         dump_register(GGPIO),
53         dump_register(GUID),
54         dump_register(GUCTL),
55         dump_register(GBUSERRADDR0),
56         dump_register(GBUSERRADDR1),
57         dump_register(GPRTBIMAP0),
58         dump_register(GPRTBIMAP1),
59         dump_register(GHWPARAMS0),
60         dump_register(GHWPARAMS1),
61         dump_register(GHWPARAMS2),
62         dump_register(GHWPARAMS3),
63         dump_register(GHWPARAMS4),
64         dump_register(GHWPARAMS5),
65         dump_register(GHWPARAMS6),
66         dump_register(GHWPARAMS7),
67         dump_register(GDBGFIFOSPACE),
68         dump_register(GDBGLTSSM),
69         dump_register(GPRTBIMAP_HS0),
70         dump_register(GPRTBIMAP_HS1),
71         dump_register(GPRTBIMAP_FS0),
72         dump_register(GPRTBIMAP_FS1),
73
74         dump_register(GUSB2PHYCFG(0)),
75         dump_register(GUSB2PHYCFG(1)),
76         dump_register(GUSB2PHYCFG(2)),
77         dump_register(GUSB2PHYCFG(3)),
78         dump_register(GUSB2PHYCFG(4)),
79         dump_register(GUSB2PHYCFG(5)),
80         dump_register(GUSB2PHYCFG(6)),
81         dump_register(GUSB2PHYCFG(7)),
82         dump_register(GUSB2PHYCFG(8)),
83         dump_register(GUSB2PHYCFG(9)),
84         dump_register(GUSB2PHYCFG(10)),
85         dump_register(GUSB2PHYCFG(11)),
86         dump_register(GUSB2PHYCFG(12)),
87         dump_register(GUSB2PHYCFG(13)),
88         dump_register(GUSB2PHYCFG(14)),
89         dump_register(GUSB2PHYCFG(15)),
90
91         dump_register(GUSB2I2CCTL(0)),
92         dump_register(GUSB2I2CCTL(1)),
93         dump_register(GUSB2I2CCTL(2)),
94         dump_register(GUSB2I2CCTL(3)),
95         dump_register(GUSB2I2CCTL(4)),
96         dump_register(GUSB2I2CCTL(5)),
97         dump_register(GUSB2I2CCTL(6)),
98         dump_register(GUSB2I2CCTL(7)),
99         dump_register(GUSB2I2CCTL(8)),
100         dump_register(GUSB2I2CCTL(9)),
101         dump_register(GUSB2I2CCTL(10)),
102         dump_register(GUSB2I2CCTL(11)),
103         dump_register(GUSB2I2CCTL(12)),
104         dump_register(GUSB2I2CCTL(13)),
105         dump_register(GUSB2I2CCTL(14)),
106         dump_register(GUSB2I2CCTL(15)),
107
108         dump_register(GUSB2PHYACC(0)),
109         dump_register(GUSB2PHYACC(1)),
110         dump_register(GUSB2PHYACC(2)),
111         dump_register(GUSB2PHYACC(3)),
112         dump_register(GUSB2PHYACC(4)),
113         dump_register(GUSB2PHYACC(5)),
114         dump_register(GUSB2PHYACC(6)),
115         dump_register(GUSB2PHYACC(7)),
116         dump_register(GUSB2PHYACC(8)),
117         dump_register(GUSB2PHYACC(9)),
118         dump_register(GUSB2PHYACC(10)),
119         dump_register(GUSB2PHYACC(11)),
120         dump_register(GUSB2PHYACC(12)),
121         dump_register(GUSB2PHYACC(13)),
122         dump_register(GUSB2PHYACC(14)),
123         dump_register(GUSB2PHYACC(15)),
124
125         dump_register(GUSB3PIPECTL(0)),
126         dump_register(GUSB3PIPECTL(1)),
127         dump_register(GUSB3PIPECTL(2)),
128         dump_register(GUSB3PIPECTL(3)),
129         dump_register(GUSB3PIPECTL(4)),
130         dump_register(GUSB3PIPECTL(5)),
131         dump_register(GUSB3PIPECTL(6)),
132         dump_register(GUSB3PIPECTL(7)),
133         dump_register(GUSB3PIPECTL(8)),
134         dump_register(GUSB3PIPECTL(9)),
135         dump_register(GUSB3PIPECTL(10)),
136         dump_register(GUSB3PIPECTL(11)),
137         dump_register(GUSB3PIPECTL(12)),
138         dump_register(GUSB3PIPECTL(13)),
139         dump_register(GUSB3PIPECTL(14)),
140         dump_register(GUSB3PIPECTL(15)),
141
142         dump_register(GTXFIFOSIZ(0)),
143         dump_register(GTXFIFOSIZ(1)),
144         dump_register(GTXFIFOSIZ(2)),
145         dump_register(GTXFIFOSIZ(3)),
146         dump_register(GTXFIFOSIZ(4)),
147         dump_register(GTXFIFOSIZ(5)),
148         dump_register(GTXFIFOSIZ(6)),
149         dump_register(GTXFIFOSIZ(7)),
150         dump_register(GTXFIFOSIZ(8)),
151         dump_register(GTXFIFOSIZ(9)),
152         dump_register(GTXFIFOSIZ(10)),
153         dump_register(GTXFIFOSIZ(11)),
154         dump_register(GTXFIFOSIZ(12)),
155         dump_register(GTXFIFOSIZ(13)),
156         dump_register(GTXFIFOSIZ(14)),
157         dump_register(GTXFIFOSIZ(15)),
158         dump_register(GTXFIFOSIZ(16)),
159         dump_register(GTXFIFOSIZ(17)),
160         dump_register(GTXFIFOSIZ(18)),
161         dump_register(GTXFIFOSIZ(19)),
162         dump_register(GTXFIFOSIZ(20)),
163         dump_register(GTXFIFOSIZ(21)),
164         dump_register(GTXFIFOSIZ(22)),
165         dump_register(GTXFIFOSIZ(23)),
166         dump_register(GTXFIFOSIZ(24)),
167         dump_register(GTXFIFOSIZ(25)),
168         dump_register(GTXFIFOSIZ(26)),
169         dump_register(GTXFIFOSIZ(27)),
170         dump_register(GTXFIFOSIZ(28)),
171         dump_register(GTXFIFOSIZ(29)),
172         dump_register(GTXFIFOSIZ(30)),
173         dump_register(GTXFIFOSIZ(31)),
174
175         dump_register(GRXFIFOSIZ(0)),
176         dump_register(GRXFIFOSIZ(1)),
177         dump_register(GRXFIFOSIZ(2)),
178         dump_register(GRXFIFOSIZ(3)),
179         dump_register(GRXFIFOSIZ(4)),
180         dump_register(GRXFIFOSIZ(5)),
181         dump_register(GRXFIFOSIZ(6)),
182         dump_register(GRXFIFOSIZ(7)),
183         dump_register(GRXFIFOSIZ(8)),
184         dump_register(GRXFIFOSIZ(9)),
185         dump_register(GRXFIFOSIZ(10)),
186         dump_register(GRXFIFOSIZ(11)),
187         dump_register(GRXFIFOSIZ(12)),
188         dump_register(GRXFIFOSIZ(13)),
189         dump_register(GRXFIFOSIZ(14)),
190         dump_register(GRXFIFOSIZ(15)),
191         dump_register(GRXFIFOSIZ(16)),
192         dump_register(GRXFIFOSIZ(17)),
193         dump_register(GRXFIFOSIZ(18)),
194         dump_register(GRXFIFOSIZ(19)),
195         dump_register(GRXFIFOSIZ(20)),
196         dump_register(GRXFIFOSIZ(21)),
197         dump_register(GRXFIFOSIZ(22)),
198         dump_register(GRXFIFOSIZ(23)),
199         dump_register(GRXFIFOSIZ(24)),
200         dump_register(GRXFIFOSIZ(25)),
201         dump_register(GRXFIFOSIZ(26)),
202         dump_register(GRXFIFOSIZ(27)),
203         dump_register(GRXFIFOSIZ(28)),
204         dump_register(GRXFIFOSIZ(29)),
205         dump_register(GRXFIFOSIZ(30)),
206         dump_register(GRXFIFOSIZ(31)),
207
208         dump_register(GEVNTADRLO(0)),
209         dump_register(GEVNTADRHI(0)),
210         dump_register(GEVNTSIZ(0)),
211         dump_register(GEVNTCOUNT(0)),
212
213         dump_register(GHWPARAMS8),
214         dump_register(DCFG),
215         dump_register(DCTL),
216         dump_register(DEVTEN),
217         dump_register(DSTS),
218         dump_register(DGCMDPAR),
219         dump_register(DGCMD),
220         dump_register(DALEPENA),
221
222         dump_register(DEPCMDPAR2(0)),
223         dump_register(DEPCMDPAR2(1)),
224         dump_register(DEPCMDPAR2(2)),
225         dump_register(DEPCMDPAR2(3)),
226         dump_register(DEPCMDPAR2(4)),
227         dump_register(DEPCMDPAR2(5)),
228         dump_register(DEPCMDPAR2(6)),
229         dump_register(DEPCMDPAR2(7)),
230         dump_register(DEPCMDPAR2(8)),
231         dump_register(DEPCMDPAR2(9)),
232         dump_register(DEPCMDPAR2(10)),
233         dump_register(DEPCMDPAR2(11)),
234         dump_register(DEPCMDPAR2(12)),
235         dump_register(DEPCMDPAR2(13)),
236         dump_register(DEPCMDPAR2(14)),
237         dump_register(DEPCMDPAR2(15)),
238         dump_register(DEPCMDPAR2(16)),
239         dump_register(DEPCMDPAR2(17)),
240         dump_register(DEPCMDPAR2(18)),
241         dump_register(DEPCMDPAR2(19)),
242         dump_register(DEPCMDPAR2(20)),
243         dump_register(DEPCMDPAR2(21)),
244         dump_register(DEPCMDPAR2(22)),
245         dump_register(DEPCMDPAR2(23)),
246         dump_register(DEPCMDPAR2(24)),
247         dump_register(DEPCMDPAR2(25)),
248         dump_register(DEPCMDPAR2(26)),
249         dump_register(DEPCMDPAR2(27)),
250         dump_register(DEPCMDPAR2(28)),
251         dump_register(DEPCMDPAR2(29)),
252         dump_register(DEPCMDPAR2(30)),
253         dump_register(DEPCMDPAR2(31)),
254
255         dump_register(DEPCMDPAR1(0)),
256         dump_register(DEPCMDPAR1(1)),
257         dump_register(DEPCMDPAR1(2)),
258         dump_register(DEPCMDPAR1(3)),
259         dump_register(DEPCMDPAR1(4)),
260         dump_register(DEPCMDPAR1(5)),
261         dump_register(DEPCMDPAR1(6)),
262         dump_register(DEPCMDPAR1(7)),
263         dump_register(DEPCMDPAR1(8)),
264         dump_register(DEPCMDPAR1(9)),
265         dump_register(DEPCMDPAR1(10)),
266         dump_register(DEPCMDPAR1(11)),
267         dump_register(DEPCMDPAR1(12)),
268         dump_register(DEPCMDPAR1(13)),
269         dump_register(DEPCMDPAR1(14)),
270         dump_register(DEPCMDPAR1(15)),
271         dump_register(DEPCMDPAR1(16)),
272         dump_register(DEPCMDPAR1(17)),
273         dump_register(DEPCMDPAR1(18)),
274         dump_register(DEPCMDPAR1(19)),
275         dump_register(DEPCMDPAR1(20)),
276         dump_register(DEPCMDPAR1(21)),
277         dump_register(DEPCMDPAR1(22)),
278         dump_register(DEPCMDPAR1(23)),
279         dump_register(DEPCMDPAR1(24)),
280         dump_register(DEPCMDPAR1(25)),
281         dump_register(DEPCMDPAR1(26)),
282         dump_register(DEPCMDPAR1(27)),
283         dump_register(DEPCMDPAR1(28)),
284         dump_register(DEPCMDPAR1(29)),
285         dump_register(DEPCMDPAR1(30)),
286         dump_register(DEPCMDPAR1(31)),
287
288         dump_register(DEPCMDPAR0(0)),
289         dump_register(DEPCMDPAR0(1)),
290         dump_register(DEPCMDPAR0(2)),
291         dump_register(DEPCMDPAR0(3)),
292         dump_register(DEPCMDPAR0(4)),
293         dump_register(DEPCMDPAR0(5)),
294         dump_register(DEPCMDPAR0(6)),
295         dump_register(DEPCMDPAR0(7)),
296         dump_register(DEPCMDPAR0(8)),
297         dump_register(DEPCMDPAR0(9)),
298         dump_register(DEPCMDPAR0(10)),
299         dump_register(DEPCMDPAR0(11)),
300         dump_register(DEPCMDPAR0(12)),
301         dump_register(DEPCMDPAR0(13)),
302         dump_register(DEPCMDPAR0(14)),
303         dump_register(DEPCMDPAR0(15)),
304         dump_register(DEPCMDPAR0(16)),
305         dump_register(DEPCMDPAR0(17)),
306         dump_register(DEPCMDPAR0(18)),
307         dump_register(DEPCMDPAR0(19)),
308         dump_register(DEPCMDPAR0(20)),
309         dump_register(DEPCMDPAR0(21)),
310         dump_register(DEPCMDPAR0(22)),
311         dump_register(DEPCMDPAR0(23)),
312         dump_register(DEPCMDPAR0(24)),
313         dump_register(DEPCMDPAR0(25)),
314         dump_register(DEPCMDPAR0(26)),
315         dump_register(DEPCMDPAR0(27)),
316         dump_register(DEPCMDPAR0(28)),
317         dump_register(DEPCMDPAR0(29)),
318         dump_register(DEPCMDPAR0(30)),
319         dump_register(DEPCMDPAR0(31)),
320
321         dump_register(DEPCMD(0)),
322         dump_register(DEPCMD(1)),
323         dump_register(DEPCMD(2)),
324         dump_register(DEPCMD(3)),
325         dump_register(DEPCMD(4)),
326         dump_register(DEPCMD(5)),
327         dump_register(DEPCMD(6)),
328         dump_register(DEPCMD(7)),
329         dump_register(DEPCMD(8)),
330         dump_register(DEPCMD(9)),
331         dump_register(DEPCMD(10)),
332         dump_register(DEPCMD(11)),
333         dump_register(DEPCMD(12)),
334         dump_register(DEPCMD(13)),
335         dump_register(DEPCMD(14)),
336         dump_register(DEPCMD(15)),
337         dump_register(DEPCMD(16)),
338         dump_register(DEPCMD(17)),
339         dump_register(DEPCMD(18)),
340         dump_register(DEPCMD(19)),
341         dump_register(DEPCMD(20)),
342         dump_register(DEPCMD(21)),
343         dump_register(DEPCMD(22)),
344         dump_register(DEPCMD(23)),
345         dump_register(DEPCMD(24)),
346         dump_register(DEPCMD(25)),
347         dump_register(DEPCMD(26)),
348         dump_register(DEPCMD(27)),
349         dump_register(DEPCMD(28)),
350         dump_register(DEPCMD(29)),
351         dump_register(DEPCMD(30)),
352         dump_register(DEPCMD(31)),
353
354         dump_register(OCFG),
355         dump_register(OCTL),
356         dump_register(OEVT),
357         dump_register(OEVTEN),
358         dump_register(OSTS),
359 };
360
361 static int dwc3_mode_show(struct seq_file *s, void *unused)
362 {
363         struct dwc3             *dwc = s->private;
364         unsigned long           flags;
365         u32                     reg;
366
367         spin_lock_irqsave(&dwc->lock, flags);
368         reg = dwc3_readl(dwc->regs, DWC3_GCTL);
369         spin_unlock_irqrestore(&dwc->lock, flags);
370
371         switch (DWC3_GCTL_PRTCAP(reg)) {
372         case DWC3_GCTL_PRTCAP_HOST:
373                 seq_printf(s, "host\n");
374                 break;
375         case DWC3_GCTL_PRTCAP_DEVICE:
376                 seq_printf(s, "device\n");
377                 break;
378         case DWC3_GCTL_PRTCAP_OTG:
379                 seq_printf(s, "OTG\n");
380                 break;
381         default:
382                 seq_printf(s, "UNKNOWN %08x\n", DWC3_GCTL_PRTCAP(reg));
383         }
384
385         return 0;
386 }
387
388 static int dwc3_mode_open(struct inode *inode, struct file *file)
389 {
390         return single_open(file, dwc3_mode_show, inode->i_private);
391 }
392
393 static ssize_t dwc3_mode_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                     mode = 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, "host", 4))
406                 mode |= DWC3_GCTL_PRTCAP_HOST;
407
408         if (!strncmp(buf, "device", 6))
409                 mode |= DWC3_GCTL_PRTCAP_DEVICE;
410
411         if (!strncmp(buf, "otg", 3))
412                 mode |= DWC3_GCTL_PRTCAP_OTG;
413
414         if (mode) {
415                 spin_lock_irqsave(&dwc->lock, flags);
416                 dwc3_set_mode(dwc, mode);
417                 spin_unlock_irqrestore(&dwc->lock, flags);
418         }
419         return count;
420 }
421
422 static const struct file_operations dwc3_mode_fops = {
423         .open                   = dwc3_mode_open,
424         .write                  = dwc3_mode_write,
425         .read                   = seq_read,
426         .llseek                 = seq_lseek,
427         .release                = single_release,
428 };
429
430 static int dwc3_testmode_show(struct seq_file *s, void *unused)
431 {
432         struct dwc3             *dwc = s->private;
433         unsigned long           flags;
434         u32                     reg;
435
436         spin_lock_irqsave(&dwc->lock, flags);
437         reg = dwc3_readl(dwc->regs, DWC3_DCTL);
438         reg &= DWC3_DCTL_TSTCTRL_MASK;
439         reg >>= 1;
440         spin_unlock_irqrestore(&dwc->lock, flags);
441
442         switch (reg) {
443         case 0:
444                 seq_printf(s, "no test\n");
445                 break;
446         case TEST_J:
447                 seq_printf(s, "test_j\n");
448                 break;
449         case TEST_K:
450                 seq_printf(s, "test_k\n");
451                 break;
452         case TEST_SE0_NAK:
453                 seq_printf(s, "test_se0_nak\n");
454                 break;
455         case TEST_PACKET:
456                 seq_printf(s, "test_packet\n");
457                 break;
458         case TEST_FORCE_EN:
459                 seq_printf(s, "test_force_enable\n");
460                 break;
461         default:
462                 seq_printf(s, "UNKNOWN %d\n", reg);
463         }
464
465         return 0;
466 }
467
468 static int dwc3_testmode_open(struct inode *inode, struct file *file)
469 {
470         return single_open(file, dwc3_testmode_show, inode->i_private);
471 }
472
473 static ssize_t dwc3_testmode_write(struct file *file,
474                 const char __user *ubuf, size_t count, loff_t *ppos)
475 {
476         struct seq_file         *s = file->private_data;
477         struct dwc3             *dwc = s->private;
478         unsigned long           flags;
479         u32                     testmode = 0;
480         char                    buf[32];
481
482         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
483                 return -EFAULT;
484
485         if (!strncmp(buf, "test_j", 6))
486                 testmode = TEST_J;
487         else if (!strncmp(buf, "test_k", 6))
488                 testmode = TEST_K;
489         else if (!strncmp(buf, "test_se0_nak", 12))
490                 testmode = TEST_SE0_NAK;
491         else if (!strncmp(buf, "test_packet", 11))
492                 testmode = TEST_PACKET;
493         else if (!strncmp(buf, "test_force_enable", 17))
494                 testmode = TEST_FORCE_EN;
495         else
496                 testmode = 0;
497
498         spin_lock_irqsave(&dwc->lock, flags);
499         dwc3_gadget_set_test_mode(dwc, testmode);
500         spin_unlock_irqrestore(&dwc->lock, flags);
501
502         return count;
503 }
504
505 static const struct file_operations dwc3_testmode_fops = {
506         .open                   = dwc3_testmode_open,
507         .write                  = dwc3_testmode_write,
508         .read                   = seq_read,
509         .llseek                 = seq_lseek,
510         .release                = single_release,
511 };
512
513 static int dwc3_link_state_show(struct seq_file *s, void *unused)
514 {
515         struct dwc3             *dwc = s->private;
516         unsigned long           flags;
517         enum dwc3_link_state    state;
518         u32                     reg;
519
520         spin_lock_irqsave(&dwc->lock, flags);
521         reg = dwc3_readl(dwc->regs, DWC3_DSTS);
522         state = DWC3_DSTS_USBLNKST(reg);
523         spin_unlock_irqrestore(&dwc->lock, flags);
524
525         switch (state) {
526         case DWC3_LINK_STATE_U0:
527                 seq_printf(s, "U0\n");
528                 break;
529         case DWC3_LINK_STATE_U1:
530                 seq_printf(s, "U1\n");
531                 break;
532         case DWC3_LINK_STATE_U2:
533                 seq_printf(s, "U2\n");
534                 break;
535         case DWC3_LINK_STATE_U3:
536                 seq_printf(s, "U3\n");
537                 break;
538         case DWC3_LINK_STATE_SS_DIS:
539                 seq_printf(s, "SS.Disabled\n");
540                 break;
541         case DWC3_LINK_STATE_RX_DET:
542                 seq_printf(s, "Rx.Detect\n");
543                 break;
544         case DWC3_LINK_STATE_SS_INACT:
545                 seq_printf(s, "SS.Inactive\n");
546                 break;
547         case DWC3_LINK_STATE_POLL:
548                 seq_printf(s, "Poll\n");
549                 break;
550         case DWC3_LINK_STATE_RECOV:
551                 seq_printf(s, "Recovery\n");
552                 break;
553         case DWC3_LINK_STATE_HRESET:
554                 seq_printf(s, "HRESET\n");
555                 break;
556         case DWC3_LINK_STATE_CMPLY:
557                 seq_printf(s, "Compliance\n");
558                 break;
559         case DWC3_LINK_STATE_LPBK:
560                 seq_printf(s, "Loopback\n");
561                 break;
562         case DWC3_LINK_STATE_RESET:
563                 seq_printf(s, "Reset\n");
564                 break;
565         case DWC3_LINK_STATE_RESUME:
566                 seq_printf(s, "Resume\n");
567                 break;
568         default:
569                 seq_printf(s, "UNKNOWN %d\n", state);
570         }
571
572         return 0;
573 }
574
575 static int dwc3_link_state_open(struct inode *inode, struct file *file)
576 {
577         return single_open(file, dwc3_link_state_show, inode->i_private);
578 }
579
580 static ssize_t dwc3_link_state_write(struct file *file,
581                 const char __user *ubuf, size_t count, loff_t *ppos)
582 {
583         struct seq_file         *s = file->private_data;
584         struct dwc3             *dwc = s->private;
585         unsigned long           flags;
586         enum dwc3_link_state    state = 0;
587         char                    buf[32];
588
589         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
590                 return -EFAULT;
591
592         if (!strncmp(buf, "SS.Disabled", 11))
593                 state = DWC3_LINK_STATE_SS_DIS;
594         else if (!strncmp(buf, "Rx.Detect", 9))
595                 state = DWC3_LINK_STATE_RX_DET;
596         else if (!strncmp(buf, "SS.Inactive", 11))
597                 state = DWC3_LINK_STATE_SS_INACT;
598         else if (!strncmp(buf, "Recovery", 8))
599                 state = DWC3_LINK_STATE_RECOV;
600         else if (!strncmp(buf, "Compliance", 10))
601                 state = DWC3_LINK_STATE_CMPLY;
602         else if (!strncmp(buf, "Loopback", 8))
603                 state = DWC3_LINK_STATE_LPBK;
604         else
605                 return -EINVAL;
606
607         spin_lock_irqsave(&dwc->lock, flags);
608         dwc3_gadget_set_link_state(dwc, state);
609         spin_unlock_irqrestore(&dwc->lock, flags);
610
611         return count;
612 }
613
614 static const struct file_operations dwc3_link_state_fops = {
615         .open                   = dwc3_link_state_open,
616         .write                  = dwc3_link_state_write,
617         .read                   = seq_read,
618         .llseek                 = seq_lseek,
619         .release                = single_release,
620 };
621
622 struct dwc3_ep_file_map {
623         char name[25];
624         int (*show)(struct seq_file *s, void *unused);
625 };
626
627 static int dwc3_tx_fifo_queue_show(struct seq_file *s, void *unused)
628 {
629         struct dwc3_ep          *dep = s->private;
630         struct dwc3             *dwc = dep->dwc;
631         unsigned long           flags;
632         u32                     val;
633
634         spin_lock_irqsave(&dwc->lock, flags);
635         val = dwc3_core_fifo_space(dep, DWC3_TXFIFOQ);
636         seq_printf(s, "%u\n", val);
637         spin_unlock_irqrestore(&dwc->lock, flags);
638
639         return 0;
640 }
641
642 static int dwc3_rx_fifo_queue_show(struct seq_file *s, void *unused)
643 {
644         struct dwc3_ep          *dep = s->private;
645         struct dwc3             *dwc = dep->dwc;
646         unsigned long           flags;
647         u32                     val;
648
649         spin_lock_irqsave(&dwc->lock, flags);
650         val = dwc3_core_fifo_space(dep, DWC3_RXFIFOQ);
651         seq_printf(s, "%u\n", val);
652         spin_unlock_irqrestore(&dwc->lock, flags);
653
654         return 0;
655 }
656
657 static int dwc3_tx_request_queue_show(struct seq_file *s, void *unused)
658 {
659         struct dwc3_ep          *dep = s->private;
660         struct dwc3             *dwc = dep->dwc;
661         unsigned long           flags;
662         u32                     val;
663
664         spin_lock_irqsave(&dwc->lock, flags);
665         val = dwc3_core_fifo_space(dep, DWC3_TXREQQ);
666         seq_printf(s, "%u\n", val);
667         spin_unlock_irqrestore(&dwc->lock, flags);
668
669         return 0;
670 }
671
672 static int dwc3_rx_request_queue_show(struct seq_file *s, void *unused)
673 {
674         struct dwc3_ep          *dep = s->private;
675         struct dwc3             *dwc = dep->dwc;
676         unsigned long           flags;
677         u32                     val;
678
679         spin_lock_irqsave(&dwc->lock, flags);
680         val = dwc3_core_fifo_space(dep, DWC3_RXREQQ);
681         seq_printf(s, "%u\n", val);
682         spin_unlock_irqrestore(&dwc->lock, flags);
683
684         return 0;
685 }
686
687 static int dwc3_rx_info_queue_show(struct seq_file *s, void *unused)
688 {
689         struct dwc3_ep          *dep = s->private;
690         struct dwc3             *dwc = dep->dwc;
691         unsigned long           flags;
692         u32                     val;
693
694         spin_lock_irqsave(&dwc->lock, flags);
695         val = dwc3_core_fifo_space(dep, DWC3_RXINFOQ);
696         seq_printf(s, "%u\n", val);
697         spin_unlock_irqrestore(&dwc->lock, flags);
698
699         return 0;
700 }
701
702 static int dwc3_descriptor_fetch_queue_show(struct seq_file *s, void *unused)
703 {
704         struct dwc3_ep          *dep = s->private;
705         struct dwc3             *dwc = dep->dwc;
706         unsigned long           flags;
707         u32                     val;
708
709         spin_lock_irqsave(&dwc->lock, flags);
710         val = dwc3_core_fifo_space(dep, DWC3_DESCFETCHQ);
711         seq_printf(s, "%u\n", val);
712         spin_unlock_irqrestore(&dwc->lock, flags);
713
714         return 0;
715 }
716
717 static int dwc3_event_queue_show(struct seq_file *s, void *unused)
718 {
719         struct dwc3_ep          *dep = s->private;
720         struct dwc3             *dwc = dep->dwc;
721         unsigned long           flags;
722         u32                     val;
723
724         spin_lock_irqsave(&dwc->lock, flags);
725         val = dwc3_core_fifo_space(dep, DWC3_EVENTQ);
726         seq_printf(s, "%u\n", val);
727         spin_unlock_irqrestore(&dwc->lock, flags);
728
729         return 0;
730 }
731
732 static int dwc3_ep_transfer_type_show(struct seq_file *s, void *unused)
733 {
734         struct dwc3_ep          *dep = s->private;
735         struct dwc3             *dwc = dep->dwc;
736         unsigned long           flags;
737
738         spin_lock_irqsave(&dwc->lock, flags);
739         if (!(dep->flags & DWC3_EP_ENABLED) ||
740                         !dep->endpoint.desc) {
741                 seq_printf(s, "--\n");
742                 goto out;
743         }
744
745         switch (usb_endpoint_type(dep->endpoint.desc)) {
746         case USB_ENDPOINT_XFER_CONTROL:
747                 seq_printf(s, "control\n");
748                 break;
749         case USB_ENDPOINT_XFER_ISOC:
750                 seq_printf(s, "isochronous\n");
751                 break;
752         case USB_ENDPOINT_XFER_BULK:
753                 seq_printf(s, "bulk\n");
754                 break;
755         case USB_ENDPOINT_XFER_INT:
756                 seq_printf(s, "interrupt\n");
757                 break;
758         default:
759                 seq_printf(s, "--\n");
760         }
761
762 out:
763         spin_unlock_irqrestore(&dwc->lock, flags);
764
765         return 0;
766 }
767
768 static inline const char *dwc3_trb_type_string(struct dwc3_trb *trb)
769 {
770         switch (DWC3_TRBCTL_TYPE(trb->ctrl)) {
771         case DWC3_TRBCTL_NORMAL:
772                 return "normal";
773         case DWC3_TRBCTL_CONTROL_SETUP:
774                 return "control-setup";
775         case DWC3_TRBCTL_CONTROL_STATUS2:
776                 return "control-status2";
777         case DWC3_TRBCTL_CONTROL_STATUS3:
778                 return "control-status3";
779         case DWC3_TRBCTL_CONTROL_DATA:
780                 return "control-data";
781         case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
782                 return "isoc-first";
783         case DWC3_TRBCTL_ISOCHRONOUS:
784                 return "isoc";
785         case DWC3_TRBCTL_LINK_TRB:
786                 return "link";
787         default:
788                 return "UNKNOWN";
789         }
790 }
791
792 static int dwc3_ep_trb_ring_show(struct seq_file *s, void *unused)
793 {
794         struct dwc3_ep          *dep = s->private;
795         struct dwc3             *dwc = dep->dwc;
796         unsigned long           flags;
797         int                     i;
798
799         spin_lock_irqsave(&dwc->lock, flags);
800         if (dep->number <= 1) {
801                 seq_printf(s, "--\n");
802                 goto out;
803         }
804
805         seq_printf(s, "enqueue pointer %d\n", dep->trb_enqueue);
806         seq_printf(s, "dequeue pointer %d\n", dep->trb_dequeue);
807         seq_printf(s, "\n--------------------------------------------------\n\n");
808         seq_printf(s, "buffer_addr,size,type,ioc,isp_imi,csp,chn,lst,hwo\n");
809
810         for (i = 0; i < DWC3_TRB_NUM; i++) {
811                 struct dwc3_trb *trb = &dep->trb_pool[i];
812
813                 seq_printf(s, "%08x%08x,%d,%s,%d,%d,%d,%d,%d,%d\n",
814                                 trb->bph, trb->bpl, trb->size,
815                                 dwc3_trb_type_string(trb),
816                                 !!(trb->ctrl & DWC3_TRB_CTRL_IOC),
817                                 !!(trb->ctrl & DWC3_TRB_CTRL_ISP_IMI),
818                                 !!(trb->ctrl & DWC3_TRB_CTRL_CSP),
819                                 !!(trb->ctrl & DWC3_TRB_CTRL_CHN),
820                                 !!(trb->ctrl & DWC3_TRB_CTRL_LST),
821                                 !!(trb->ctrl & DWC3_TRB_CTRL_HWO));
822         }
823
824 out:
825         spin_unlock_irqrestore(&dwc->lock, flags);
826
827         return 0;
828 }
829
830 static struct dwc3_ep_file_map map[] = {
831         { "tx_fifo_queue", dwc3_tx_fifo_queue_show, },
832         { "rx_fifo_queue", dwc3_rx_fifo_queue_show, },
833         { "tx_request_queue", dwc3_tx_request_queue_show, },
834         { "rx_request_queue", dwc3_rx_request_queue_show, },
835         { "rx_info_queue", dwc3_rx_info_queue_show, },
836         { "descriptor_fetch_queue", dwc3_descriptor_fetch_queue_show, },
837         { "event_queue", dwc3_event_queue_show, },
838         { "transfer_type", dwc3_ep_transfer_type_show, },
839         { "trb_ring", dwc3_ep_trb_ring_show, },
840 };
841
842 static int dwc3_endpoint_open(struct inode *inode, struct file *file)
843 {
844         const char              *file_name = file_dentry(file)->d_iname;
845         struct dwc3_ep_file_map *f_map;
846         int                     i;
847
848         for (i = 0; i < ARRAY_SIZE(map); i++) {
849                 f_map = &map[i];
850
851                 if (strcmp(f_map->name, file_name) == 0)
852                         break;
853         }
854
855         return single_open(file, f_map->show, inode->i_private);
856 }
857
858 static const struct file_operations dwc3_endpoint_fops = {
859         .open                   = dwc3_endpoint_open,
860         .read                   = seq_read,
861         .llseek                 = seq_lseek,
862         .release                = single_release,
863 };
864
865 static void dwc3_debugfs_create_endpoint_file(struct dwc3_ep *dep,
866                 struct dentry *parent, int type)
867 {
868         struct dentry           *file;
869         struct dwc3_ep_file_map *ep_file = &map[type];
870
871         file = debugfs_create_file(ep_file->name, S_IRUGO, parent, dep,
872                         &dwc3_endpoint_fops);
873 }
874
875 static void dwc3_debugfs_create_endpoint_files(struct dwc3_ep *dep,
876                 struct dentry *parent)
877 {
878         int                     i;
879
880         for (i = 0; i < ARRAY_SIZE(map); i++)
881                 dwc3_debugfs_create_endpoint_file(dep, parent, i);
882 }
883
884 static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep,
885                 struct dentry *parent)
886 {
887         struct dentry           *dir;
888
889         dir = debugfs_create_dir(dep->name, parent);
890         if (IS_ERR_OR_NULL(dir))
891                 return;
892
893         dwc3_debugfs_create_endpoint_files(dep, dir);
894 }
895
896 static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc,
897                 struct dentry *parent)
898 {
899         int                     i;
900
901         for (i = 0; i < dwc->num_in_eps; i++) {
902                 u8              epnum = (i << 1) | 1;
903                 struct dwc3_ep  *dep = dwc->eps[epnum];
904
905                 if (!dep)
906                         continue;
907
908                 dwc3_debugfs_create_endpoint_dir(dep, parent);
909         }
910
911         for (i = 0; i < dwc->num_out_eps; i++) {
912                 u8              epnum = (i << 1);
913                 struct dwc3_ep  *dep = dwc->eps[epnum];
914
915                 if (!dep)
916                         continue;
917
918                 dwc3_debugfs_create_endpoint_dir(dep, parent);
919         }
920 }
921
922 void dwc3_debugfs_init(struct dwc3 *dwc)
923 {
924         struct dentry           *root;
925         struct dentry           *file;
926
927         root = debugfs_create_dir(dev_name(dwc->dev), NULL);
928         if (IS_ERR_OR_NULL(root)) {
929                 if (!root)
930                         dev_err(dwc->dev, "Can't create debugfs root\n");
931                 return;
932         }
933         dwc->root = root;
934
935         dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL);
936         if (!dwc->regset) {
937                 debugfs_remove_recursive(root);
938                 return;
939         }
940
941         dwc->regset->regs = dwc3_regs;
942         dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
943         dwc->regset->base = dwc->regs;
944
945         file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
946         if (!file)
947                 dev_dbg(dwc->dev, "Can't create debugfs regdump\n");
948
949         if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)) {
950                 file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
951                                 dwc, &dwc3_mode_fops);
952                 if (!file)
953                         dev_dbg(dwc->dev, "Can't create debugfs mode\n");
954         }
955
956         if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) ||
957                         IS_ENABLED(CONFIG_USB_DWC3_GADGET)) {
958                 file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root,
959                                 dwc, &dwc3_testmode_fops);
960                 if (!file)
961                         dev_dbg(dwc->dev, "Can't create debugfs testmode\n");
962
963                 file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR,
964                                 root, dwc, &dwc3_link_state_fops);
965                 if (!file)
966                         dev_dbg(dwc->dev, "Can't create debugfs link_state\n");
967
968                 dwc3_debugfs_create_endpoint_dirs(dwc, root);
969         }
970 }
971
972 void dwc3_debugfs_exit(struct dwc3 *dwc)
973 {
974         debugfs_remove_recursive(dwc->root);
975         kfree(dwc->regset);
976 }