Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[pandora-kernel.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  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions, and the following disclaimer,
14  *    without modification.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. The names of the above-listed copyright holders may not be used
19  *    to endorse or promote products derived from this software without
20  *    specific prior written permission.
21  *
22  * ALTERNATIVELY, this software may be distributed under the terms of the
23  * GNU General Public License ("GPL") version 2, as published by the Free
24  * Software Foundation.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
27  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
28  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
30  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  */
38
39 #include <linux/kernel.h>
40 #include <linux/slab.h>
41 #include <linux/ptrace.h>
42 #include <linux/types.h>
43 #include <linux/spinlock.h>
44 #include <linux/debugfs.h>
45 #include <linux/seq_file.h>
46 #include <linux/delay.h>
47 #include <linux/uaccess.h>
48
49 #include "core.h"
50 #include "gadget.h"
51 #include "io.h"
52 #include "debug.h"
53
54 #define dump_register(nm)                               \
55 {                                                       \
56         .name   = __stringify(nm),                      \
57         .offset = DWC3_ ##nm,                           \
58 }
59
60 static const struct debugfs_reg32 dwc3_regs[] = {
61         dump_register(GSBUSCFG0),
62         dump_register(GSBUSCFG1),
63         dump_register(GTXTHRCFG),
64         dump_register(GRXTHRCFG),
65         dump_register(GCTL),
66         dump_register(GEVTEN),
67         dump_register(GSTS),
68         dump_register(GSNPSID),
69         dump_register(GGPIO),
70         dump_register(GUID),
71         dump_register(GUCTL),
72         dump_register(GBUSERRADDR0),
73         dump_register(GBUSERRADDR1),
74         dump_register(GPRTBIMAP0),
75         dump_register(GPRTBIMAP1),
76         dump_register(GHWPARAMS0),
77         dump_register(GHWPARAMS1),
78         dump_register(GHWPARAMS2),
79         dump_register(GHWPARAMS3),
80         dump_register(GHWPARAMS4),
81         dump_register(GHWPARAMS5),
82         dump_register(GHWPARAMS6),
83         dump_register(GHWPARAMS7),
84         dump_register(GDBGFIFOSPACE),
85         dump_register(GDBGLTSSM),
86         dump_register(GPRTBIMAP_HS0),
87         dump_register(GPRTBIMAP_HS1),
88         dump_register(GPRTBIMAP_FS0),
89         dump_register(GPRTBIMAP_FS1),
90
91         dump_register(GUSB2PHYCFG(0)),
92         dump_register(GUSB2PHYCFG(1)),
93         dump_register(GUSB2PHYCFG(2)),
94         dump_register(GUSB2PHYCFG(3)),
95         dump_register(GUSB2PHYCFG(4)),
96         dump_register(GUSB2PHYCFG(5)),
97         dump_register(GUSB2PHYCFG(6)),
98         dump_register(GUSB2PHYCFG(7)),
99         dump_register(GUSB2PHYCFG(8)),
100         dump_register(GUSB2PHYCFG(9)),
101         dump_register(GUSB2PHYCFG(10)),
102         dump_register(GUSB2PHYCFG(11)),
103         dump_register(GUSB2PHYCFG(12)),
104         dump_register(GUSB2PHYCFG(13)),
105         dump_register(GUSB2PHYCFG(14)),
106         dump_register(GUSB2PHYCFG(15)),
107
108         dump_register(GUSB2I2CCTL(0)),
109         dump_register(GUSB2I2CCTL(1)),
110         dump_register(GUSB2I2CCTL(2)),
111         dump_register(GUSB2I2CCTL(3)),
112         dump_register(GUSB2I2CCTL(4)),
113         dump_register(GUSB2I2CCTL(5)),
114         dump_register(GUSB2I2CCTL(6)),
115         dump_register(GUSB2I2CCTL(7)),
116         dump_register(GUSB2I2CCTL(8)),
117         dump_register(GUSB2I2CCTL(9)),
118         dump_register(GUSB2I2CCTL(10)),
119         dump_register(GUSB2I2CCTL(11)),
120         dump_register(GUSB2I2CCTL(12)),
121         dump_register(GUSB2I2CCTL(13)),
122         dump_register(GUSB2I2CCTL(14)),
123         dump_register(GUSB2I2CCTL(15)),
124
125         dump_register(GUSB2PHYACC(0)),
126         dump_register(GUSB2PHYACC(1)),
127         dump_register(GUSB2PHYACC(2)),
128         dump_register(GUSB2PHYACC(3)),
129         dump_register(GUSB2PHYACC(4)),
130         dump_register(GUSB2PHYACC(5)),
131         dump_register(GUSB2PHYACC(6)),
132         dump_register(GUSB2PHYACC(7)),
133         dump_register(GUSB2PHYACC(8)),
134         dump_register(GUSB2PHYACC(9)),
135         dump_register(GUSB2PHYACC(10)),
136         dump_register(GUSB2PHYACC(11)),
137         dump_register(GUSB2PHYACC(12)),
138         dump_register(GUSB2PHYACC(13)),
139         dump_register(GUSB2PHYACC(14)),
140         dump_register(GUSB2PHYACC(15)),
141
142         dump_register(GUSB3PIPECTL(0)),
143         dump_register(GUSB3PIPECTL(1)),
144         dump_register(GUSB3PIPECTL(2)),
145         dump_register(GUSB3PIPECTL(3)),
146         dump_register(GUSB3PIPECTL(4)),
147         dump_register(GUSB3PIPECTL(5)),
148         dump_register(GUSB3PIPECTL(6)),
149         dump_register(GUSB3PIPECTL(7)),
150         dump_register(GUSB3PIPECTL(8)),
151         dump_register(GUSB3PIPECTL(9)),
152         dump_register(GUSB3PIPECTL(10)),
153         dump_register(GUSB3PIPECTL(11)),
154         dump_register(GUSB3PIPECTL(12)),
155         dump_register(GUSB3PIPECTL(13)),
156         dump_register(GUSB3PIPECTL(14)),
157         dump_register(GUSB3PIPECTL(15)),
158
159         dump_register(GTXFIFOSIZ(0)),
160         dump_register(GTXFIFOSIZ(1)),
161         dump_register(GTXFIFOSIZ(2)),
162         dump_register(GTXFIFOSIZ(3)),
163         dump_register(GTXFIFOSIZ(4)),
164         dump_register(GTXFIFOSIZ(5)),
165         dump_register(GTXFIFOSIZ(6)),
166         dump_register(GTXFIFOSIZ(7)),
167         dump_register(GTXFIFOSIZ(8)),
168         dump_register(GTXFIFOSIZ(9)),
169         dump_register(GTXFIFOSIZ(10)),
170         dump_register(GTXFIFOSIZ(11)),
171         dump_register(GTXFIFOSIZ(12)),
172         dump_register(GTXFIFOSIZ(13)),
173         dump_register(GTXFIFOSIZ(14)),
174         dump_register(GTXFIFOSIZ(15)),
175         dump_register(GTXFIFOSIZ(16)),
176         dump_register(GTXFIFOSIZ(17)),
177         dump_register(GTXFIFOSIZ(18)),
178         dump_register(GTXFIFOSIZ(19)),
179         dump_register(GTXFIFOSIZ(20)),
180         dump_register(GTXFIFOSIZ(21)),
181         dump_register(GTXFIFOSIZ(22)),
182         dump_register(GTXFIFOSIZ(23)),
183         dump_register(GTXFIFOSIZ(24)),
184         dump_register(GTXFIFOSIZ(25)),
185         dump_register(GTXFIFOSIZ(26)),
186         dump_register(GTXFIFOSIZ(27)),
187         dump_register(GTXFIFOSIZ(28)),
188         dump_register(GTXFIFOSIZ(29)),
189         dump_register(GTXFIFOSIZ(30)),
190         dump_register(GTXFIFOSIZ(31)),
191
192         dump_register(GRXFIFOSIZ(0)),
193         dump_register(GRXFIFOSIZ(1)),
194         dump_register(GRXFIFOSIZ(2)),
195         dump_register(GRXFIFOSIZ(3)),
196         dump_register(GRXFIFOSIZ(4)),
197         dump_register(GRXFIFOSIZ(5)),
198         dump_register(GRXFIFOSIZ(6)),
199         dump_register(GRXFIFOSIZ(7)),
200         dump_register(GRXFIFOSIZ(8)),
201         dump_register(GRXFIFOSIZ(9)),
202         dump_register(GRXFIFOSIZ(10)),
203         dump_register(GRXFIFOSIZ(11)),
204         dump_register(GRXFIFOSIZ(12)),
205         dump_register(GRXFIFOSIZ(13)),
206         dump_register(GRXFIFOSIZ(14)),
207         dump_register(GRXFIFOSIZ(15)),
208         dump_register(GRXFIFOSIZ(16)),
209         dump_register(GRXFIFOSIZ(17)),
210         dump_register(GRXFIFOSIZ(18)),
211         dump_register(GRXFIFOSIZ(19)),
212         dump_register(GRXFIFOSIZ(20)),
213         dump_register(GRXFIFOSIZ(21)),
214         dump_register(GRXFIFOSIZ(22)),
215         dump_register(GRXFIFOSIZ(23)),
216         dump_register(GRXFIFOSIZ(24)),
217         dump_register(GRXFIFOSIZ(25)),
218         dump_register(GRXFIFOSIZ(26)),
219         dump_register(GRXFIFOSIZ(27)),
220         dump_register(GRXFIFOSIZ(28)),
221         dump_register(GRXFIFOSIZ(29)),
222         dump_register(GRXFIFOSIZ(30)),
223         dump_register(GRXFIFOSIZ(31)),
224
225         dump_register(GEVNTADRLO(0)),
226         dump_register(GEVNTADRHI(0)),
227         dump_register(GEVNTSIZ(0)),
228         dump_register(GEVNTCOUNT(0)),
229
230         dump_register(GHWPARAMS8),
231         dump_register(DCFG),
232         dump_register(DCTL),
233         dump_register(DEVTEN),
234         dump_register(DSTS),
235         dump_register(DGCMDPAR),
236         dump_register(DGCMD),
237         dump_register(DALEPENA),
238
239         dump_register(DEPCMDPAR2(0)),
240         dump_register(DEPCMDPAR2(1)),
241         dump_register(DEPCMDPAR2(2)),
242         dump_register(DEPCMDPAR2(3)),
243         dump_register(DEPCMDPAR2(4)),
244         dump_register(DEPCMDPAR2(5)),
245         dump_register(DEPCMDPAR2(6)),
246         dump_register(DEPCMDPAR2(7)),
247         dump_register(DEPCMDPAR2(8)),
248         dump_register(DEPCMDPAR2(9)),
249         dump_register(DEPCMDPAR2(10)),
250         dump_register(DEPCMDPAR2(11)),
251         dump_register(DEPCMDPAR2(12)),
252         dump_register(DEPCMDPAR2(13)),
253         dump_register(DEPCMDPAR2(14)),
254         dump_register(DEPCMDPAR2(15)),
255         dump_register(DEPCMDPAR2(16)),
256         dump_register(DEPCMDPAR2(17)),
257         dump_register(DEPCMDPAR2(18)),
258         dump_register(DEPCMDPAR2(19)),
259         dump_register(DEPCMDPAR2(20)),
260         dump_register(DEPCMDPAR2(21)),
261         dump_register(DEPCMDPAR2(22)),
262         dump_register(DEPCMDPAR2(23)),
263         dump_register(DEPCMDPAR2(24)),
264         dump_register(DEPCMDPAR2(25)),
265         dump_register(DEPCMDPAR2(26)),
266         dump_register(DEPCMDPAR2(27)),
267         dump_register(DEPCMDPAR2(28)),
268         dump_register(DEPCMDPAR2(29)),
269         dump_register(DEPCMDPAR2(30)),
270         dump_register(DEPCMDPAR2(31)),
271
272         dump_register(DEPCMDPAR1(0)),
273         dump_register(DEPCMDPAR1(1)),
274         dump_register(DEPCMDPAR1(2)),
275         dump_register(DEPCMDPAR1(3)),
276         dump_register(DEPCMDPAR1(4)),
277         dump_register(DEPCMDPAR1(5)),
278         dump_register(DEPCMDPAR1(6)),
279         dump_register(DEPCMDPAR1(7)),
280         dump_register(DEPCMDPAR1(8)),
281         dump_register(DEPCMDPAR1(9)),
282         dump_register(DEPCMDPAR1(10)),
283         dump_register(DEPCMDPAR1(11)),
284         dump_register(DEPCMDPAR1(12)),
285         dump_register(DEPCMDPAR1(13)),
286         dump_register(DEPCMDPAR1(14)),
287         dump_register(DEPCMDPAR1(15)),
288         dump_register(DEPCMDPAR1(16)),
289         dump_register(DEPCMDPAR1(17)),
290         dump_register(DEPCMDPAR1(18)),
291         dump_register(DEPCMDPAR1(19)),
292         dump_register(DEPCMDPAR1(20)),
293         dump_register(DEPCMDPAR1(21)),
294         dump_register(DEPCMDPAR1(22)),
295         dump_register(DEPCMDPAR1(23)),
296         dump_register(DEPCMDPAR1(24)),
297         dump_register(DEPCMDPAR1(25)),
298         dump_register(DEPCMDPAR1(26)),
299         dump_register(DEPCMDPAR1(27)),
300         dump_register(DEPCMDPAR1(28)),
301         dump_register(DEPCMDPAR1(29)),
302         dump_register(DEPCMDPAR1(30)),
303         dump_register(DEPCMDPAR1(31)),
304
305         dump_register(DEPCMDPAR0(0)),
306         dump_register(DEPCMDPAR0(1)),
307         dump_register(DEPCMDPAR0(2)),
308         dump_register(DEPCMDPAR0(3)),
309         dump_register(DEPCMDPAR0(4)),
310         dump_register(DEPCMDPAR0(5)),
311         dump_register(DEPCMDPAR0(6)),
312         dump_register(DEPCMDPAR0(7)),
313         dump_register(DEPCMDPAR0(8)),
314         dump_register(DEPCMDPAR0(9)),
315         dump_register(DEPCMDPAR0(10)),
316         dump_register(DEPCMDPAR0(11)),
317         dump_register(DEPCMDPAR0(12)),
318         dump_register(DEPCMDPAR0(13)),
319         dump_register(DEPCMDPAR0(14)),
320         dump_register(DEPCMDPAR0(15)),
321         dump_register(DEPCMDPAR0(16)),
322         dump_register(DEPCMDPAR0(17)),
323         dump_register(DEPCMDPAR0(18)),
324         dump_register(DEPCMDPAR0(19)),
325         dump_register(DEPCMDPAR0(20)),
326         dump_register(DEPCMDPAR0(21)),
327         dump_register(DEPCMDPAR0(22)),
328         dump_register(DEPCMDPAR0(23)),
329         dump_register(DEPCMDPAR0(24)),
330         dump_register(DEPCMDPAR0(25)),
331         dump_register(DEPCMDPAR0(26)),
332         dump_register(DEPCMDPAR0(27)),
333         dump_register(DEPCMDPAR0(28)),
334         dump_register(DEPCMDPAR0(29)),
335         dump_register(DEPCMDPAR0(30)),
336         dump_register(DEPCMDPAR0(31)),
337
338         dump_register(DEPCMD(0)),
339         dump_register(DEPCMD(1)),
340         dump_register(DEPCMD(2)),
341         dump_register(DEPCMD(3)),
342         dump_register(DEPCMD(4)),
343         dump_register(DEPCMD(5)),
344         dump_register(DEPCMD(6)),
345         dump_register(DEPCMD(7)),
346         dump_register(DEPCMD(8)),
347         dump_register(DEPCMD(9)),
348         dump_register(DEPCMD(10)),
349         dump_register(DEPCMD(11)),
350         dump_register(DEPCMD(12)),
351         dump_register(DEPCMD(13)),
352         dump_register(DEPCMD(14)),
353         dump_register(DEPCMD(15)),
354         dump_register(DEPCMD(16)),
355         dump_register(DEPCMD(17)),
356         dump_register(DEPCMD(18)),
357         dump_register(DEPCMD(19)),
358         dump_register(DEPCMD(20)),
359         dump_register(DEPCMD(21)),
360         dump_register(DEPCMD(22)),
361         dump_register(DEPCMD(23)),
362         dump_register(DEPCMD(24)),
363         dump_register(DEPCMD(25)),
364         dump_register(DEPCMD(26)),
365         dump_register(DEPCMD(27)),
366         dump_register(DEPCMD(28)),
367         dump_register(DEPCMD(29)),
368         dump_register(DEPCMD(30)),
369         dump_register(DEPCMD(31)),
370
371         dump_register(OCFG),
372         dump_register(OCTL),
373         dump_register(OEVTEN),
374         dump_register(OSTS),
375 };
376
377 static int dwc3_regdump_show(struct seq_file *s, void *unused)
378 {
379         struct dwc3             *dwc = s->private;
380
381         seq_printf(s, "DesignWare USB3 Core Register Dump\n");
382         debugfs_print_regs32(s, dwc3_regs, ARRAY_SIZE(dwc3_regs),
383                              dwc->regs, "");
384         return 0;
385 }
386
387 static int dwc3_regdump_open(struct inode *inode, struct file *file)
388 {
389         return single_open(file, dwc3_regdump_show, inode->i_private);
390 }
391
392 static const struct file_operations dwc3_regdump_fops = {
393         .open                   = dwc3_regdump_open,
394         .read                   = seq_read,
395         .release                = single_release,
396 };
397
398 static int dwc3_mode_show(struct seq_file *s, void *unused)
399 {
400         struct dwc3             *dwc = s->private;
401         unsigned long           flags;
402         u32                     reg;
403
404         spin_lock_irqsave(&dwc->lock, flags);
405         reg = dwc3_readl(dwc->regs, DWC3_GCTL);
406         spin_unlock_irqrestore(&dwc->lock, flags);
407
408         switch (DWC3_GCTL_PRTCAP(reg)) {
409         case DWC3_GCTL_PRTCAP_HOST:
410                 seq_printf(s, "host\n");
411                 break;
412         case DWC3_GCTL_PRTCAP_DEVICE:
413                 seq_printf(s, "device\n");
414                 break;
415         case DWC3_GCTL_PRTCAP_OTG:
416                 seq_printf(s, "OTG\n");
417                 break;
418         default:
419                 seq_printf(s, "UNKNOWN %08x\n", DWC3_GCTL_PRTCAP(reg));
420         }
421
422         return 0;
423 }
424
425 static int dwc3_mode_open(struct inode *inode, struct file *file)
426 {
427         return single_open(file, dwc3_mode_show, inode->i_private);
428 }
429
430 static ssize_t dwc3_mode_write(struct file *file,
431                 const char __user *ubuf, size_t count, loff_t *ppos)
432 {
433         struct seq_file         *s = file->private_data;
434         struct dwc3             *dwc = s->private;
435         unsigned long           flags;
436         u32                     mode = 0;
437         char                    buf[32];
438
439         if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
440                 return -EFAULT;
441
442         if (!strncmp(buf, "host", 4))
443                 mode |= DWC3_GCTL_PRTCAP_HOST;
444
445         if (!strncmp(buf, "device", 6))
446                 mode |= DWC3_GCTL_PRTCAP_DEVICE;
447
448         if (!strncmp(buf, "otg", 3))
449                 mode |= DWC3_GCTL_PRTCAP_OTG;
450
451         if (mode) {
452                 spin_lock_irqsave(&dwc->lock, flags);
453                 dwc3_set_mode(dwc, mode);
454                 spin_unlock_irqrestore(&dwc->lock, flags);
455         }
456         return count;
457 }
458
459 static const struct file_operations dwc3_mode_fops = {
460         .open                   = dwc3_mode_open,
461         .write                  = dwc3_mode_write,
462         .read                   = seq_read,
463         .llseek                 = seq_lseek,
464         .release                = single_release,
465 };
466
467 int __devinit dwc3_debugfs_init(struct dwc3 *dwc)
468 {
469         struct dentry           *root;
470         struct dentry           *file;
471         int                     ret;
472
473         root = debugfs_create_dir(dev_name(dwc->dev), NULL);
474         if (IS_ERR(root)) {
475                 ret = PTR_ERR(root);
476                 goto err0;
477         }
478
479         dwc->root = root;
480
481         file = debugfs_create_file("regdump", S_IRUGO, root, dwc,
482                         &dwc3_regdump_fops);
483         if (IS_ERR(file)) {
484                 ret = PTR_ERR(file);
485                 goto err1;
486         }
487
488         file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
489                         dwc, &dwc3_mode_fops);
490         if (IS_ERR(file)) {
491                 ret = PTR_ERR(file);
492                 goto err1;
493         }
494
495         return 0;
496
497 err1:
498         debugfs_remove_recursive(root);
499
500 err0:
501         return ret;
502 }
503
504 void __devexit dwc3_debugfs_exit(struct dwc3 *dwc)
505 {
506         debugfs_remove_recursive(dwc->root);
507         dwc->root = NULL;
508 }