usb: Introduce DesignWare USB3 DRD Driver
[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  * All rights reserved.
6  *
7  * Authors: Felipe Balbi <balbi@ti.com>,
8  *          Sebastian Andrzej Siewior <bigeasy@linutronix.de>
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions, and the following disclaimer,
15  *    without modification.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The names of the above-listed copyright holders may not be used
20  *    to endorse or promote products derived from this software without
21  *    specific prior written permission.
22  *
23  * ALTERNATIVELY, this software may be distributed under the terms of the
24  * GNU General Public License ("GPL") version 2, as published by the Free
25  * Software Foundation.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
28  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
29  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
31  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  */
39
40 #include <linux/kernel.h>
41 #include <linux/slab.h>
42 #include <linux/ptrace.h>
43 #include <linux/types.h>
44 #include <linux/spinlock.h>
45 #include <linux/debugfs.h>
46 #include <linux/seq_file.h>
47 #include <linux/delay.h>
48
49 #include <asm/uaccess.h>
50
51 #include "core.h"
52 #include "gadget.h"
53 #include "io.h"
54
55 struct dwc3_register {
56         const char      *name;
57         u32             offset;
58 };
59
60 #define dump_register(nm)                               \
61 {                                                       \
62         .name   = __stringify(nm),                      \
63         .offset = DWC3_ ##nm,                           \
64 }
65
66 static const struct dwc3_register dwc3_regs[] = {
67         dump_register(GSBUSCFG0),
68         dump_register(GSBUSCFG1),
69         dump_register(GTXTHRCFG),
70         dump_register(GRXTHRCFG),
71         dump_register(GCTL),
72         dump_register(GEVTEN),
73         dump_register(GSTS),
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_register(DEPCMDPAR2(0)),
246         dump_register(DEPCMDPAR2(1)),
247         dump_register(DEPCMDPAR2(2)),
248         dump_register(DEPCMDPAR2(3)),
249         dump_register(DEPCMDPAR2(4)),
250         dump_register(DEPCMDPAR2(5)),
251         dump_register(DEPCMDPAR2(6)),
252         dump_register(DEPCMDPAR2(7)),
253         dump_register(DEPCMDPAR2(8)),
254         dump_register(DEPCMDPAR2(9)),
255         dump_register(DEPCMDPAR2(10)),
256         dump_register(DEPCMDPAR2(11)),
257         dump_register(DEPCMDPAR2(12)),
258         dump_register(DEPCMDPAR2(13)),
259         dump_register(DEPCMDPAR2(14)),
260         dump_register(DEPCMDPAR2(15)),
261         dump_register(DEPCMDPAR2(16)),
262         dump_register(DEPCMDPAR2(17)),
263         dump_register(DEPCMDPAR2(18)),
264         dump_register(DEPCMDPAR2(19)),
265         dump_register(DEPCMDPAR2(20)),
266         dump_register(DEPCMDPAR2(21)),
267         dump_register(DEPCMDPAR2(22)),
268         dump_register(DEPCMDPAR2(23)),
269         dump_register(DEPCMDPAR2(24)),
270         dump_register(DEPCMDPAR2(25)),
271         dump_register(DEPCMDPAR2(26)),
272         dump_register(DEPCMDPAR2(27)),
273         dump_register(DEPCMDPAR2(28)),
274         dump_register(DEPCMDPAR2(29)),
275         dump_register(DEPCMDPAR2(30)),
276         dump_register(DEPCMDPAR2(31)),
277
278         dump_register(DEPCMDPAR1(0)),
279         dump_register(DEPCMDPAR1(1)),
280         dump_register(DEPCMDPAR1(2)),
281         dump_register(DEPCMDPAR1(3)),
282         dump_register(DEPCMDPAR1(4)),
283         dump_register(DEPCMDPAR1(5)),
284         dump_register(DEPCMDPAR1(6)),
285         dump_register(DEPCMDPAR1(7)),
286         dump_register(DEPCMDPAR1(8)),
287         dump_register(DEPCMDPAR1(9)),
288         dump_register(DEPCMDPAR1(10)),
289         dump_register(DEPCMDPAR1(11)),
290         dump_register(DEPCMDPAR1(12)),
291         dump_register(DEPCMDPAR1(13)),
292         dump_register(DEPCMDPAR1(14)),
293         dump_register(DEPCMDPAR1(15)),
294         dump_register(DEPCMDPAR1(16)),
295         dump_register(DEPCMDPAR1(17)),
296         dump_register(DEPCMDPAR1(18)),
297         dump_register(DEPCMDPAR1(19)),
298         dump_register(DEPCMDPAR1(20)),
299         dump_register(DEPCMDPAR1(21)),
300         dump_register(DEPCMDPAR1(22)),
301         dump_register(DEPCMDPAR1(23)),
302         dump_register(DEPCMDPAR1(24)),
303         dump_register(DEPCMDPAR1(25)),
304         dump_register(DEPCMDPAR1(26)),
305         dump_register(DEPCMDPAR1(27)),
306         dump_register(DEPCMDPAR1(28)),
307         dump_register(DEPCMDPAR1(29)),
308         dump_register(DEPCMDPAR1(30)),
309         dump_register(DEPCMDPAR1(31)),
310
311         dump_register(DEPCMDPAR0(0)),
312         dump_register(DEPCMDPAR0(1)),
313         dump_register(DEPCMDPAR0(2)),
314         dump_register(DEPCMDPAR0(3)),
315         dump_register(DEPCMDPAR0(4)),
316         dump_register(DEPCMDPAR0(5)),
317         dump_register(DEPCMDPAR0(6)),
318         dump_register(DEPCMDPAR0(7)),
319         dump_register(DEPCMDPAR0(8)),
320         dump_register(DEPCMDPAR0(9)),
321         dump_register(DEPCMDPAR0(10)),
322         dump_register(DEPCMDPAR0(11)),
323         dump_register(DEPCMDPAR0(12)),
324         dump_register(DEPCMDPAR0(13)),
325         dump_register(DEPCMDPAR0(14)),
326         dump_register(DEPCMDPAR0(15)),
327         dump_register(DEPCMDPAR0(16)),
328         dump_register(DEPCMDPAR0(17)),
329         dump_register(DEPCMDPAR0(18)),
330         dump_register(DEPCMDPAR0(19)),
331         dump_register(DEPCMDPAR0(20)),
332         dump_register(DEPCMDPAR0(21)),
333         dump_register(DEPCMDPAR0(22)),
334         dump_register(DEPCMDPAR0(23)),
335         dump_register(DEPCMDPAR0(24)),
336         dump_register(DEPCMDPAR0(25)),
337         dump_register(DEPCMDPAR0(26)),
338         dump_register(DEPCMDPAR0(27)),
339         dump_register(DEPCMDPAR0(28)),
340         dump_register(DEPCMDPAR0(29)),
341         dump_register(DEPCMDPAR0(30)),
342         dump_register(DEPCMDPAR0(31)),
343
344         dump_register(DEPCMD(0)),
345         dump_register(DEPCMD(1)),
346         dump_register(DEPCMD(2)),
347         dump_register(DEPCMD(3)),
348         dump_register(DEPCMD(4)),
349         dump_register(DEPCMD(5)),
350         dump_register(DEPCMD(6)),
351         dump_register(DEPCMD(7)),
352         dump_register(DEPCMD(8)),
353         dump_register(DEPCMD(9)),
354         dump_register(DEPCMD(10)),
355         dump_register(DEPCMD(11)),
356         dump_register(DEPCMD(12)),
357         dump_register(DEPCMD(13)),
358         dump_register(DEPCMD(14)),
359         dump_register(DEPCMD(15)),
360         dump_register(DEPCMD(16)),
361         dump_register(DEPCMD(17)),
362         dump_register(DEPCMD(18)),
363         dump_register(DEPCMD(19)),
364         dump_register(DEPCMD(20)),
365         dump_register(DEPCMD(21)),
366         dump_register(DEPCMD(22)),
367         dump_register(DEPCMD(23)),
368         dump_register(DEPCMD(24)),
369         dump_register(DEPCMD(25)),
370         dump_register(DEPCMD(26)),
371         dump_register(DEPCMD(27)),
372         dump_register(DEPCMD(28)),
373         dump_register(DEPCMD(29)),
374         dump_register(DEPCMD(30)),
375         dump_register(DEPCMD(31)),
376
377         dump_register(OCFG),
378         dump_register(OCTL),
379         dump_register(OEVTEN),
380         dump_register(OSTS),
381 };
382
383 static int dwc3_regdump_show(struct seq_file *s, void *unused)
384 {
385         struct dwc3             *dwc = s->private;
386         int                     i;
387
388         seq_printf(s, "DesignWare USB3 Core Register Dump\n");
389
390         for (i = 0; i < ARRAY_SIZE(dwc3_regs); i++) {
391                 seq_printf(s, "%-20s :    %08x\n", dwc3_regs[i].name,
392                                 dwc3_readl(dwc->regs, dwc3_regs[i].offset));
393         }
394
395         return 0;
396 }
397
398 static int dwc3_regdump_open(struct inode *inode, struct file *file)
399 {
400         return single_open(file, dwc3_regdump_show, inode->i_private);
401 }
402
403 static const struct file_operations dwc3_regdump_fops = {
404         .open                   = dwc3_regdump_open,
405         .read                   = seq_read,
406         .release                = single_release,
407 };
408
409
410 static int dwc3_send_testmode_cmd(struct dwc3 *dwc, int mode)
411 {
412         u32 timeout = 250;
413
414         dwc3_writel(dwc->regs, DWC3_DGCMDPAR, mode);
415         dwc3_writel(dwc->regs, DWC3_DGCMD, DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK |
416                         DWC3_DEPCMD_CMDACT);
417         do {
418                 u32 reg;
419
420                 reg = dwc3_readl(dwc->regs, DWC3_DGCMD);
421                 if (!(reg & DWC3_DEPCMD_CMDACT))
422                         return 0;
423                 timeout--;
424                 if (!timeout)
425                         return -ETIMEDOUT;
426                 mdelay(1);
427         } while (1);
428 }
429
430 static struct dwc3_trb_hw trb_0 __aligned(16);
431 static struct dwc3_trb_hw trb_1 __aligned(16);
432
433 #define BUF_SIZE        4096
434 static int dwc3_testmode_open(struct inode *inode, struct file *file)
435 {
436         struct dwc3 *dwc = inode->i_private;
437         struct dwc3_gadget_ep_cmd_params par0;
438         struct dwc3_gadget_ep_cmd_params par1;
439         struct dwc3_trb         trb;
440         int ret;
441         u8 *buf0;
442         u8 *buf1;
443
444         buf0 = kmalloc(BUF_SIZE, GFP_KERNEL);
445         if (!buf0)
446                 return -ENOMEM;
447         buf1 = kmalloc(BUF_SIZE, GFP_KERNEL);
448         if (!buf1)
449                 return -ENOMEM;
450
451         memset(buf0, 0xaa, BUF_SIZE);
452         memset(buf1, 0x33, BUF_SIZE);
453
454         memset(&trb, 0, sizeof(trb));
455         memset(&par0, 0, sizeof(par0));
456         memset(&par1, 0, sizeof(par1));
457
458         trb.lst = 1;
459         trb.trbctl = DWC3_TRBCTL_NORMAL;
460         trb.length = BUF_SIZE;
461         trb.hwo = 1;
462
463         trb.bplh = virt_to_phys(buf0);
464         dwc3_trb_to_hw(&trb, &trb_0);
465
466         trb.bplh = virt_to_phys(buf1);
467         dwc3_trb_to_hw(&trb, &trb_1);
468
469         par0.param0.depstrtxfer.transfer_desc_addr_high =
470                 upper_32_bits(virt_to_phys(&trb_0));
471         par0.param1.depstrtxfer.transfer_desc_addr_low =
472                 lower_32_bits(virt_to_phys(&trb_0));
473
474         par1.param0.depstrtxfer.transfer_desc_addr_high =
475                 upper_32_bits(virt_to_phys(&trb_1));
476         par1.param1.depstrtxfer.transfer_desc_addr_low =
477                 lower_32_bits(virt_to_phys(&trb_1));
478
479         dwc3_send_testmode_cmd(dwc, 1);
480
481         ret = dwc3_send_gadget_ep_cmd(dwc, 0, DWC3_DEPCMD_STARTTRANSFER, &par0);
482         ret = dwc3_send_gadget_ep_cmd(dwc, 1, DWC3_DEPCMD_STARTTRANSFER, &par1);
483
484         dwc3_send_testmode_cmd(dwc, 0);
485         return -EBUSY;
486 }
487
488 static const struct file_operations dwc3_testmode_fops = {
489         .open                   = dwc3_testmode_open,
490         .read                   = seq_read,
491         .release                = single_release,
492 };
493
494 int __devinit dwc3_debugfs_init(struct dwc3 *dwc)
495 {
496         struct dentry           *root;
497         struct dentry           *file;
498         int                     ret;
499
500         root = debugfs_create_dir(dev_name(dwc->dev), NULL);
501         if (IS_ERR(root)){
502                 ret = PTR_ERR(root);
503                 goto err0;
504         }
505
506         dwc->root = root;
507
508         file = debugfs_create_file("regdump", S_IRUGO, root, dwc,
509                         &dwc3_regdump_fops);
510         if (IS_ERR(file)) {
511                 ret = PTR_ERR(file);
512                 goto err1;
513         }
514         file = debugfs_create_file("testmode", S_IRUGO, root, dwc,
515                         &dwc3_testmode_fops);
516         if (IS_ERR(file)) {
517                 ret = PTR_ERR(file);
518                 goto err1;
519         }
520
521         return 0;
522
523 err1:
524         debugfs_remove_recursive(root);
525
526 err0:
527         return ret;
528 }
529
530 void __devexit dwc3_debugfs_exit(struct dwc3 *dwc)
531 {
532         debugfs_remove_recursive(dwc->root);
533         dwc->root = NULL;
534 }