2 * Freescale QUICC Engine USB Host Controller Driver
4 * Copyright (c) Freescale Semicondutor, Inc. 2006.
5 * Shlomi Gridish <gridish@freescale.com>
6 * Jerry Huang <Chang-Ming.Huang@freescale.com>
7 * Copyright (c) Logic Product Development, Inc. 2007
8 * Peter Barada <peterb@logicpd.com>
9 * Copyright (c) MontaVista Software, Inc. 2008.
10 * Anton Vorontsov <avorontsov@ru.mvista.com>
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
18 #include <linux/kernel.h>
19 #include <linux/errno.h>
20 #include <linux/debugfs.h>
21 #include <linux/seq_file.h>
22 #include <linux/usb.h>
23 #include <linux/usb/hcd.h>
26 void fhci_dbg_isr(struct fhci_hcd
*fhci
, int usb_er
)
31 fhci
->usb_irq_stat
[12]++;
35 for (i
= 0; i
< 12; ++i
) {
36 if (usb_er
& (1 << i
))
37 fhci
->usb_irq_stat
[i
]++;
41 static int fhci_dfs_regs_show(struct seq_file
*s
, void *v
)
43 struct fhci_hcd
*fhci
= s
->private;
44 struct qe_usb_ctlr __iomem
*regs
= fhci
->regs
;
47 "mode: 0x%x\n" "addr: 0x%x\n"
48 "command: 0x%x\n" "ep0: 0x%x\n"
49 "event: 0x%x\n" "mask: 0x%x\n"
50 "status: 0x%x\n" "SOF timer: %d\n"
52 "lines status: 0x%x\n",
53 in_8(®s
->usb_usmod
), in_8(®s
->usb_usadr
),
54 in_8(®s
->usb_uscom
), in_be16(®s
->usb_usep
[0]),
55 in_be16(®s
->usb_usber
), in_be16(®s
->usb_usbmr
),
56 in_8(®s
->usb_usbs
), in_be16(®s
->usb_ussft
),
57 in_be16(®s
->usb_usfrn
),
58 fhci_ioports_check_bus_state(fhci
));
63 static int fhci_dfs_irq_stat_show(struct seq_file
*s
, void *v
)
65 struct fhci_hcd
*fhci
= s
->private;
66 int *usb_irq_stat
= fhci
->usb_irq_stat
;
69 "RXB: %d\n" "TXB: %d\n" "BSY: %d\n"
70 "SOF: %d\n" "TXE0: %d\n" "TXE1: %d\n"
71 "TXE2: %d\n" "TXE3: %d\n" "IDLE: %d\n"
72 "RESET: %d\n" "SFT: %d\n" "MSF: %d\n"
74 usb_irq_stat
[0], usb_irq_stat
[1], usb_irq_stat
[2],
75 usb_irq_stat
[3], usb_irq_stat
[4], usb_irq_stat
[5],
76 usb_irq_stat
[6], usb_irq_stat
[7], usb_irq_stat
[8],
77 usb_irq_stat
[9], usb_irq_stat
[10], usb_irq_stat
[11],
83 static int fhci_dfs_regs_open(struct inode
*inode
, struct file
*file
)
85 return single_open(file
, fhci_dfs_regs_show
, inode
->i_private
);
88 static int fhci_dfs_irq_stat_open(struct inode
*inode
, struct file
*file
)
90 return single_open(file
, fhci_dfs_irq_stat_show
, inode
->i_private
);
93 static const struct file_operations fhci_dfs_regs_fops
= {
94 .open
= fhci_dfs_regs_open
,
97 .release
= single_release
,
100 static const struct file_operations fhci_dfs_irq_stat_fops
= {
101 .open
= fhci_dfs_irq_stat_open
,
104 .release
= single_release
,
107 void fhci_dfs_create(struct fhci_hcd
*fhci
)
109 struct device
*dev
= fhci_to_hcd(fhci
)->self
.controller
;
111 fhci
->dfs_root
= debugfs_create_dir(dev_name(dev
), usb_debug_root
);
112 if (!fhci
->dfs_root
) {
117 fhci
->dfs_regs
= debugfs_create_file("regs", S_IFREG
| S_IRUGO
,
118 fhci
->dfs_root
, fhci
, &fhci_dfs_regs_fops
);
120 fhci
->dfs_irq_stat
= debugfs_create_file("irq_stat",
121 S_IFREG
| S_IRUGO
, fhci
->dfs_root
, fhci
,
122 &fhci_dfs_irq_stat_fops
);
124 WARN_ON(!fhci
->dfs_regs
|| !fhci
->dfs_irq_stat
);
127 void fhci_dfs_destroy(struct fhci_hcd
*fhci
)
132 if (fhci
->dfs_irq_stat
)
133 debugfs_remove(fhci
->dfs_irq_stat
);
136 debugfs_remove(fhci
->dfs_regs
);
138 debugfs_remove(fhci
->dfs_root
);