aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunfeng Yun <chunfeng.yun@mediatek.com>2019-03-20 22:53:46 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-03-26 03:40:14 -0400
commitae07809255d3e3419205b673aba6d1dce16a0d65 (patch)
treedc2654cbad0618874d5476dcfa84f10ae5e19754
parent48e0d3735aa557a8adaf94632ca3cf78798e8505 (diff)
usb: mtu3: add debugfs interface files
This adds more debugfs consumers. The debugfs entries read some important registers, fifo status, QMU ring, endpoint status, and IPPC probe interface to get internal status. With these entries, users can check the registers, endpoint and GPD used during run time. Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/mtu3/Makefile4
-rw-r--r--drivers/usb/mtu3/mtu3_core.c3
-rw-r--r--drivers/usb/mtu3/mtu3_debug.h40
-rw-r--r--drivers/usb/mtu3/mtu3_debugfs.c438
-rw-r--r--drivers/usb/mtu3/mtu3_dr.c13
-rw-r--r--drivers/usb/mtu3/mtu3_hw_regs.h11
-rw-r--r--drivers/usb/mtu3/mtu3_plat.c7
7 files changed, 503 insertions, 13 deletions
diff --git a/drivers/usb/mtu3/Makefile b/drivers/usb/mtu3/Makefile
index 4a9715812bf9..7c1826bbcebb 100644
--- a/drivers/usb/mtu3/Makefile
+++ b/drivers/usb/mtu3/Makefile
@@ -17,3 +17,7 @@ endif
17ifneq ($(CONFIG_USB_MTU3_DUAL_ROLE),) 17ifneq ($(CONFIG_USB_MTU3_DUAL_ROLE),)
18 mtu3-y += mtu3_dr.o 18 mtu3-y += mtu3_dr.o
19endif 19endif
20
21ifneq ($(CONFIG_DEBUG_FS),)
22 mtu3-y += mtu3_debugfs.o
23endif
diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
index d354f5c3805a..f106fe81ae10 100644
--- a/drivers/usb/mtu3/mtu3_core.c
+++ b/drivers/usb/mtu3/mtu3_core.c
@@ -16,6 +16,7 @@
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17 17
18#include "mtu3.h" 18#include "mtu3.h"
19#include "mtu3_debug.h"
19 20
20static int ep_fifo_alloc(struct mtu3_ep *mep, u32 seg_size) 21static int ep_fifo_alloc(struct mtu3_ep *mep, u32 seg_size)
21{ 22{
@@ -900,6 +901,8 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb)
900 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) 901 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG)
901 mtu3_stop(mtu); 902 mtu3_stop(mtu);
902 903
904 ssusb_dev_debugfs_init(ssusb);
905
903 dev_dbg(dev, " %s() done...\n", __func__); 906 dev_dbg(dev, " %s() done...\n", __func__);
904 907
905 return 0; 908 return 0;
diff --git a/drivers/usb/mtu3/mtu3_debug.h b/drivers/usb/mtu3/mtu3_debug.h
new file mode 100644
index 000000000000..94d39b00403e
--- /dev/null
+++ b/drivers/usb/mtu3/mtu3_debug.h
@@ -0,0 +1,40 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * mtu3_debug.h - debug header
4 *
5 * Copyright (C) 2019 MediaTek Inc.
6 *
7 * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
8 */
9
10#ifndef __MTU3_DEBUG_H__
11#define __MTU3_DEBUG_H__
12
13#include <linux/debugfs.h>
14
15#define MTU3_DEBUGFS_NAME_LEN 32
16
17struct mtu3_regset {
18 char name[MTU3_DEBUGFS_NAME_LEN];
19 struct debugfs_regset32 regset;
20 size_t nregs;
21};
22
23struct mtu3_file_map {
24 const char *name;
25 int (*show)(struct seq_file *s, void *unused);
26};
27
28#if IS_ENABLED(CONFIG_DEBUG_FS)
29void ssusb_dev_debugfs_init(struct ssusb_mtk *ssusb);
30void ssusb_debugfs_create_root(struct ssusb_mtk *ssusb);
31void ssusb_debugfs_remove_root(struct ssusb_mtk *ssusb);
32
33#else
34static inline void ssusb_dev_debugfs_init(struct ssusb_mtk *ssusb) {}
35static inline void ssusb_debugfs_create_root(struct ssusb_mtk *ssusb) {}
36static inline void ssusb_debugfs_remove_root(struct ssusb_mtk *ssusb) {}
37
38#endif /* CONFIG_DEBUG_FS */
39
40#endif /* __MTU3_DEBUG_H__ */
diff --git a/drivers/usb/mtu3/mtu3_debugfs.c b/drivers/usb/mtu3/mtu3_debugfs.c
new file mode 100644
index 000000000000..7cb1cad5a4b3
--- /dev/null
+++ b/drivers/usb/mtu3/mtu3_debugfs.c
@@ -0,0 +1,438 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * mtu3_debugfs.c - debugfs interface
4 *
5 * Copyright (C) 2019 MediaTek Inc.
6 *
7 * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
8 */
9
10#include <linux/uaccess.h>
11
12#include "mtu3.h"
13#include "mtu3_debug.h"
14
15#define dump_register(nm) \
16{ \
17 .name = __stringify(nm), \
18 .offset = U3D_ ##nm, \
19}
20
21#define dump_prb_reg(nm, os) \
22{ \
23 .name = nm, \
24 .offset = os, \
25}
26
27static const struct debugfs_reg32 mtu3_ippc_regs[] = {
28 dump_register(SSUSB_IP_PW_CTRL0),
29 dump_register(SSUSB_IP_PW_CTRL1),
30 dump_register(SSUSB_IP_PW_CTRL2),
31 dump_register(SSUSB_IP_PW_CTRL3),
32 dump_register(SSUSB_OTG_STS),
33 dump_register(SSUSB_IP_XHCI_CAP),
34 dump_register(SSUSB_IP_DEV_CAP),
35 dump_register(SSUSB_U3_CTRL_0P),
36 dump_register(SSUSB_U2_CTRL_0P),
37 dump_register(SSUSB_HW_ID),
38 dump_register(SSUSB_HW_SUB_ID),
39 dump_register(SSUSB_IP_SPARE0),
40};
41
42static const struct debugfs_reg32 mtu3_dev_regs[] = {
43 dump_register(LV1ISR),
44 dump_register(LV1IER),
45 dump_register(EPISR),
46 dump_register(EPIER),
47 dump_register(EP0CSR),
48 dump_register(RXCOUNT0),
49 dump_register(QISAR0),
50 dump_register(QIER0),
51 dump_register(QISAR1),
52 dump_register(QIER1),
53 dump_register(CAP_EPNTXFFSZ),
54 dump_register(CAP_EPNRXFFSZ),
55 dump_register(CAP_EPINFO),
56 dump_register(MISC_CTRL),
57};
58
59static const struct debugfs_reg32 mtu3_csr_regs[] = {
60 dump_register(DEVICE_CONF),
61 dump_register(DEV_LINK_INTR_ENABLE),
62 dump_register(DEV_LINK_INTR),
63 dump_register(LTSSM_CTRL),
64 dump_register(USB3_CONFIG),
65 dump_register(LINK_STATE_MACHINE),
66 dump_register(LTSSM_INTR_ENABLE),
67 dump_register(LTSSM_INTR),
68 dump_register(U3U2_SWITCH_CTRL),
69 dump_register(POWER_MANAGEMENT),
70 dump_register(DEVICE_CONTROL),
71 dump_register(COMMON_USB_INTR_ENABLE),
72 dump_register(COMMON_USB_INTR),
73 dump_register(USB20_MISC_CONTROL),
74 dump_register(USB20_OPSTATE),
75};
76
77static int mtu3_link_state_show(struct seq_file *sf, void *unused)
78{
79 struct mtu3 *mtu = sf->private;
80 void __iomem *mbase = mtu->mac_base;
81
82 seq_printf(sf, "opstate: %#x, ltssm: %#x\n",
83 mtu3_readl(mbase, U3D_USB20_OPSTATE),
84 LTSSM_STATE(mtu3_readl(mbase, U3D_LINK_STATE_MACHINE)));
85
86 return 0;
87}
88
89static int mtu3_ep_used_show(struct seq_file *sf, void *unused)
90{
91 struct mtu3 *mtu = sf->private;
92 struct mtu3_ep *mep;
93 unsigned long flags;
94 int used = 0;
95 int i;
96
97 spin_lock_irqsave(&mtu->lock, flags);
98
99 for (i = 0; i < mtu->num_eps; i++) {
100 mep = mtu->in_eps + i;
101 if (mep->flags & MTU3_EP_ENABLED) {
102 seq_printf(sf, "%s - type: %d\n", mep->name, mep->type);
103 used++;
104 }
105
106 mep = mtu->out_eps + i;
107 if (mep->flags & MTU3_EP_ENABLED) {
108 seq_printf(sf, "%s - type: %d\n", mep->name, mep->type);
109 used++;
110 }
111 }
112 seq_printf(sf, "total used: %d eps\n", used);
113
114 spin_unlock_irqrestore(&mtu->lock, flags);
115
116 return 0;
117}
118
119DEFINE_SHOW_ATTRIBUTE(mtu3_link_state);
120DEFINE_SHOW_ATTRIBUTE(mtu3_ep_used);
121
122static void mtu3_debugfs_regset(struct mtu3 *mtu, void __iomem *base,
123 const struct debugfs_reg32 *regs, size_t nregs,
124 const char *name, struct dentry *parent)
125{
126 struct debugfs_regset32 *regset;
127 struct mtu3_regset *mregs;
128
129 mregs = devm_kzalloc(mtu->dev, sizeof(*regset), GFP_KERNEL);
130 if (!mregs)
131 return;
132
133 sprintf(mregs->name, "%s", name);
134 regset = &mregs->regset;
135 regset->regs = regs;
136 regset->nregs = nregs;
137 regset->base = base;
138
139 debugfs_create_regset32(mregs->name, 0444, parent, regset);
140}
141
142static void mtu3_debugfs_ep_regset(struct mtu3 *mtu, struct mtu3_ep *mep,
143 struct dentry *parent)
144{
145 struct debugfs_reg32 *regs;
146 int epnum = mep->epnum;
147 int in = mep->is_in;
148
149 regs = devm_kcalloc(mtu->dev, 7, sizeof(*regs), GFP_KERNEL);
150 if (!regs)
151 return;
152
153 regs[0].name = in ? "TCR0" : "RCR0";
154 regs[0].offset = in ? MU3D_EP_TXCR0(epnum) : MU3D_EP_RXCR0(epnum);
155 regs[1].name = in ? "TCR1" : "RCR1";
156 regs[1].offset = in ? MU3D_EP_TXCR1(epnum) : MU3D_EP_RXCR1(epnum);
157 regs[2].name = in ? "TCR2" : "RCR2";
158 regs[2].offset = in ? MU3D_EP_TXCR2(epnum) : MU3D_EP_RXCR2(epnum);
159 regs[3].name = in ? "TQHIAR" : "RQHIAR";
160 regs[3].offset = in ? USB_QMU_TQHIAR(epnum) : USB_QMU_RQHIAR(epnum);
161 regs[4].name = in ? "TQCSR" : "RQCSR";
162 regs[4].offset = in ? USB_QMU_TQCSR(epnum) : USB_QMU_RQCSR(epnum);
163 regs[5].name = in ? "TQSAR" : "RQSAR";
164 regs[5].offset = in ? USB_QMU_TQSAR(epnum) : USB_QMU_RQSAR(epnum);
165 regs[6].name = in ? "TQCPR" : "RQCPR";
166 regs[6].offset = in ? USB_QMU_TQCPR(epnum) : USB_QMU_RQCPR(epnum);
167
168 mtu3_debugfs_regset(mtu, mtu->mac_base, regs, 7, "ep-regs", parent);
169}
170
171static int mtu3_ep_info_show(struct seq_file *sf, void *unused)
172{
173 struct mtu3_ep *mep = sf->private;
174 struct mtu3 *mtu = mep->mtu;
175 unsigned long flags;
176
177 spin_lock_irqsave(&mtu->lock, flags);
178 seq_printf(sf, "ep - type:%d, maxp:%d, slot:%d, flags:%x\n",
179 mep->type, mep->maxp, mep->slot, mep->flags);
180 spin_unlock_irqrestore(&mtu->lock, flags);
181
182 return 0;
183}
184
185static int mtu3_fifo_show(struct seq_file *sf, void *unused)
186{
187 struct mtu3_ep *mep = sf->private;
188 struct mtu3 *mtu = mep->mtu;
189 unsigned long flags;
190
191 spin_lock_irqsave(&mtu->lock, flags);
192 seq_printf(sf, "fifo - seg_size:%d, addr:%d, size:%d\n",
193 mep->fifo_seg_size, mep->fifo_addr, mep->fifo_size);
194 spin_unlock_irqrestore(&mtu->lock, flags);
195
196 return 0;
197}
198
199static int mtu3_qmu_ring_show(struct seq_file *sf, void *unused)
200{
201 struct mtu3_ep *mep = sf->private;
202 struct mtu3 *mtu = mep->mtu;
203 struct mtu3_gpd_ring *ring;
204 unsigned long flags;
205
206 ring = &mep->gpd_ring;
207 spin_lock_irqsave(&mtu->lock, flags);
208 seq_printf(sf,
209 "qmu-ring - dma:%pad, start:%p, end:%p, enq:%p, dep:%p\n",
210 &ring->dma, ring->start, ring->end,
211 ring->enqueue, ring->dequeue);
212 spin_unlock_irqrestore(&mtu->lock, flags);
213
214 return 0;
215}
216
217static int mtu3_qmu_gpd_show(struct seq_file *sf, void *unused)
218{
219 struct mtu3_ep *mep = sf->private;
220 struct mtu3 *mtu = mep->mtu;
221 struct mtu3_gpd_ring *ring;
222 struct qmu_gpd *gpd;
223 dma_addr_t dma;
224 unsigned long flags;
225 int i;
226
227 spin_lock_irqsave(&mtu->lock, flags);
228 ring = &mep->gpd_ring;
229 gpd = ring->start;
230 if (!gpd || !(mep->flags & MTU3_EP_ENABLED)) {
231 seq_puts(sf, "empty!\n");
232 goto out;
233 }
234
235 for (i = 0; i < MAX_GPD_NUM; i++, gpd++) {
236 dma = ring->dma + i * sizeof(*gpd);
237 seq_printf(sf, "gpd.%03d -> %pad, %p: %08x %08x %08x %08x\n",
238 i, &dma, gpd, gpd->dw0_info, gpd->next_gpd,
239 gpd->buffer, gpd->dw3_info);
240 }
241
242out:
243 spin_unlock_irqrestore(&mtu->lock, flags);
244
245 return 0;
246}
247
248static const struct mtu3_file_map mtu3_ep_files[] = {
249 {"ep-info", mtu3_ep_info_show, },
250 {"fifo", mtu3_fifo_show, },
251 {"qmu-ring", mtu3_qmu_ring_show, },
252 {"qmu-gpd", mtu3_qmu_gpd_show, },
253};
254
255static int mtu3_ep_open(struct inode *inode, struct file *file)
256{
257 const char *file_name = file_dentry(file)->d_iname;
258 const struct mtu3_file_map *f_map;
259 int i;
260
261 for (i = 0; i < ARRAY_SIZE(mtu3_ep_files); i++) {
262 f_map = &mtu3_ep_files[i];
263
264 if (strcmp(f_map->name, file_name) == 0)
265 break;
266 }
267
268 return single_open(file, f_map->show, inode->i_private);
269}
270
271static const struct file_operations mtu3_ep_fops = {
272 .open = mtu3_ep_open,
273 .read = seq_read,
274 .llseek = seq_lseek,
275 .release = single_release,
276};
277
278static struct debugfs_reg32 mtu3_prb_regs[] = {
279 dump_prb_reg("enable", U3D_SSUSB_PRB_CTRL0),
280 dump_prb_reg("byte-sell", U3D_SSUSB_PRB_CTRL1),
281 dump_prb_reg("byte-selh", U3D_SSUSB_PRB_CTRL2),
282 dump_prb_reg("module-sel", U3D_SSUSB_PRB_CTRL3),
283 dump_prb_reg("sw-out", U3D_SSUSB_PRB_CTRL4),
284 dump_prb_reg("data", U3D_SSUSB_PRB_CTRL5),
285};
286
287static int mtu3_probe_show(struct seq_file *sf, void *unused)
288{
289 const char *file_name = file_dentry(sf->file)->d_iname;
290 struct mtu3 *mtu = sf->private;
291 const struct debugfs_reg32 *regs;
292 int i;
293
294 for (i = 0; i < ARRAY_SIZE(mtu3_prb_regs); i++) {
295 regs = &mtu3_prb_regs[i];
296
297 if (strcmp(regs->name, file_name) == 0)
298 break;
299 }
300
301 seq_printf(sf, "0x%04x - 0x%08x\n", (u32)regs->offset,
302 mtu3_readl(mtu->ippc_base, (u32)regs->offset));
303
304 return 0;
305}
306
307static int mtu3_probe_open(struct inode *inode, struct file *file)
308{
309 return single_open(file, mtu3_probe_show, inode->i_private);
310}
311
312static ssize_t mtu3_probe_write(struct file *file, const char __user *ubuf,
313 size_t count, loff_t *ppos)
314{
315 const char *file_name = file_dentry(file)->d_iname;
316 struct seq_file *sf = file->private_data;
317 struct mtu3 *mtu = sf->private;
318 const struct debugfs_reg32 *regs;
319 char buf[32];
320 u32 val;
321 int i;
322
323 if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
324 return -EFAULT;
325
326 if (kstrtou32(buf, 0, &val))
327 return -EINVAL;
328
329 for (i = 0; i < ARRAY_SIZE(mtu3_prb_regs); i++) {
330 regs = &mtu3_prb_regs[i];
331
332 if (strcmp(regs->name, file_name) == 0)
333 break;
334 }
335 mtu3_writel(mtu->ippc_base, (u32)regs->offset, val);
336
337 return count;
338}
339
340static const struct file_operations mtu3_probe_fops = {
341 .open = mtu3_probe_open,
342 .write = mtu3_probe_write,
343 .read = seq_read,
344 .llseek = seq_lseek,
345 .release = single_release,
346};
347
348static void mtu3_debugfs_create_prb_files(struct mtu3 *mtu)
349{
350 struct ssusb_mtk *ssusb = mtu->ssusb;
351 struct debugfs_reg32 *regs;
352 struct dentry *dir_prb;
353 int i;
354
355 dir_prb = debugfs_create_dir("probe", ssusb->dbgfs_root);
356
357 for (i = 0; i < ARRAY_SIZE(mtu3_prb_regs); i++) {
358 regs = &mtu3_prb_regs[i];
359 debugfs_create_file(regs->name, 0644, dir_prb,
360 mtu, &mtu3_probe_fops);
361 }
362
363 mtu3_debugfs_regset(mtu, mtu->ippc_base, mtu3_prb_regs,
364 ARRAY_SIZE(mtu3_prb_regs), "regs", dir_prb);
365}
366
367static void mtu3_debugfs_create_ep_dir(struct mtu3_ep *mep,
368 struct dentry *parent)
369{
370 const struct mtu3_file_map *files;
371 struct dentry *dir_ep;
372 int i;
373
374 dir_ep = debugfs_create_dir(mep->name, parent);
375 mtu3_debugfs_ep_regset(mep->mtu, mep, dir_ep);
376
377 for (i = 0; i < ARRAY_SIZE(mtu3_ep_files); i++) {
378 files = &mtu3_ep_files[i];
379
380 debugfs_create_file(files->name, 0444, dir_ep,
381 mep, &mtu3_ep_fops);
382 }
383}
384
385static void mtu3_debugfs_create_ep_dirs(struct mtu3 *mtu)
386{
387 struct ssusb_mtk *ssusb = mtu->ssusb;
388 struct dentry *dir_eps;
389 int i;
390
391 dir_eps = debugfs_create_dir("eps", ssusb->dbgfs_root);
392
393 for (i = 1; i < mtu->num_eps; i++) {
394 mtu3_debugfs_create_ep_dir(mtu->in_eps + i, dir_eps);
395 mtu3_debugfs_create_ep_dir(mtu->out_eps + i, dir_eps);
396 }
397}
398
399void ssusb_dev_debugfs_init(struct ssusb_mtk *ssusb)
400{
401 struct mtu3 *mtu = ssusb->u3d;
402 struct dentry *dir_regs;
403
404 dir_regs = debugfs_create_dir("regs", ssusb->dbgfs_root);
405
406 mtu3_debugfs_regset(mtu, mtu->ippc_base,
407 mtu3_ippc_regs, ARRAY_SIZE(mtu3_ippc_regs),
408 "reg-ippc", dir_regs);
409
410 mtu3_debugfs_regset(mtu, mtu->mac_base,
411 mtu3_dev_regs, ARRAY_SIZE(mtu3_dev_regs),
412 "reg-dev", dir_regs);
413
414 mtu3_debugfs_regset(mtu, mtu->mac_base,
415 mtu3_csr_regs, ARRAY_SIZE(mtu3_csr_regs),
416 "reg-csr", dir_regs);
417
418 mtu3_debugfs_create_ep_dirs(mtu);
419
420 mtu3_debugfs_create_prb_files(mtu);
421
422 debugfs_create_file("link-state", 0444, ssusb->dbgfs_root,
423 mtu, &mtu3_link_state_fops);
424 debugfs_create_file("ep-used", 0444, ssusb->dbgfs_root,
425 mtu, &mtu3_ep_used_fops);
426}
427
428void ssusb_debugfs_create_root(struct ssusb_mtk *ssusb)
429{
430 ssusb->dbgfs_root =
431 debugfs_create_dir(dev_name(ssusb->dev), usb_debug_root);
432}
433
434void ssusb_debugfs_remove_root(struct ssusb_mtk *ssusb)
435{
436 debugfs_remove_recursive(ssusb->dbgfs_root);
437 ssusb->dbgfs_root = NULL;
438}
diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c
index 61694c40e101..3f86ae1e73e8 100644
--- a/drivers/usb/mtu3/mtu3_dr.c
+++ b/drivers/usb/mtu3/mtu3_dr.c
@@ -379,20 +379,12 @@ static const struct file_operations ssusb_vbus_fops = {
379 379
380static void ssusb_debugfs_init(struct ssusb_mtk *ssusb) 380static void ssusb_debugfs_init(struct ssusb_mtk *ssusb)
381{ 381{
382 struct dentry *root; 382 struct dentry *root = ssusb->dbgfs_root;
383
384 root = debugfs_create_dir(dev_name(ssusb->dev), usb_debug_root);
385 ssusb->dbgfs_root = root;
386 383
387 debugfs_create_file("mode", 0644, root, ssusb, &ssusb_mode_fops); 384 debugfs_create_file("mode", 0644, root, ssusb, &ssusb_mode_fops);
388 debugfs_create_file("vbus", 0644, root, ssusb, &ssusb_vbus_fops); 385 debugfs_create_file("vbus", 0644, root, ssusb, &ssusb_vbus_fops);
389} 386}
390 387
391static void ssusb_debugfs_exit(struct ssusb_mtk *ssusb)
392{
393 debugfs_remove_recursive(ssusb->dbgfs_root);
394}
395
396void ssusb_set_force_mode(struct ssusb_mtk *ssusb, 388void ssusb_set_force_mode(struct ssusb_mtk *ssusb,
397 enum mtu3_dr_force_mode mode) 389 enum mtu3_dr_force_mode mode)
398{ 390{
@@ -436,9 +428,6 @@ void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb)
436{ 428{
437 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; 429 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
438 430
439 if (otg_sx->manual_drd_enabled)
440 ssusb_debugfs_exit(ssusb);
441
442 cancel_work_sync(&otg_sx->id_work); 431 cancel_work_sync(&otg_sx->id_work);
443 cancel_work_sync(&otg_sx->vbus_work); 432 cancel_work_sync(&otg_sx->vbus_work);
444} 433}
diff --git a/drivers/usb/mtu3/mtu3_hw_regs.h b/drivers/usb/mtu3/mtu3_hw_regs.h
index bf70ea2426a9..8382d066749e 100644
--- a/drivers/usb/mtu3/mtu3_hw_regs.h
+++ b/drivers/usb/mtu3/mtu3_hw_regs.h
@@ -290,6 +290,7 @@
290#define U3D_LTSSM_CTRL (SSUSB_USB3_MAC_CSR_BASE + 0x0010) 290#define U3D_LTSSM_CTRL (SSUSB_USB3_MAC_CSR_BASE + 0x0010)
291#define U3D_USB3_CONFIG (SSUSB_USB3_MAC_CSR_BASE + 0x001C) 291#define U3D_USB3_CONFIG (SSUSB_USB3_MAC_CSR_BASE + 0x001C)
292 292
293#define U3D_LINK_STATE_MACHINE (SSUSB_USB3_MAC_CSR_BASE + 0x0134)
293#define U3D_LTSSM_INTR_ENABLE (SSUSB_USB3_MAC_CSR_BASE + 0x013C) 294#define U3D_LTSSM_INTR_ENABLE (SSUSB_USB3_MAC_CSR_BASE + 0x013C)
294#define U3D_LTSSM_INTR (SSUSB_USB3_MAC_CSR_BASE + 0x0140) 295#define U3D_LTSSM_INTR (SSUSB_USB3_MAC_CSR_BASE + 0x0140)
295 296
@@ -307,6 +308,9 @@
307/* U3D_USB3_CONFIG */ 308/* U3D_USB3_CONFIG */
308#define USB3_EN BIT(0) 309#define USB3_EN BIT(0)
309 310
311/* U3D_LINK_STATE_MACHINE */
312#define LTSSM_STATE(x) ((x) & 0x1f)
313
310/* U3D_LTSSM_INTR_ENABLE */ 314/* U3D_LTSSM_INTR_ENABLE */
311/* U3D_LTSSM_INTR */ 315/* U3D_LTSSM_INTR */
312#define U3_RESUME_INTR BIT(18) 316#define U3_RESUME_INTR BIT(18)
@@ -372,6 +376,7 @@
372#define U3D_USB20_FRAME_NUM (SSUSB_USB2_CSR_BASE + 0x003C) 376#define U3D_USB20_FRAME_NUM (SSUSB_USB2_CSR_BASE + 0x003C)
373#define U3D_USB20_LPM_PARAMETER (SSUSB_USB2_CSR_BASE + 0x0044) 377#define U3D_USB20_LPM_PARAMETER (SSUSB_USB2_CSR_BASE + 0x0044)
374#define U3D_USB20_MISC_CONTROL (SSUSB_USB2_CSR_BASE + 0x004C) 378#define U3D_USB20_MISC_CONTROL (SSUSB_USB2_CSR_BASE + 0x004C)
379#define U3D_USB20_OPSTATE (SSUSB_USB2_CSR_BASE + 0x0060)
375 380
376/*---------------- SSUSB_USB2_CSR FIELD DEFINITION ----------------*/ 381/*---------------- SSUSB_USB2_CSR FIELD DEFINITION ----------------*/
377 382
@@ -445,6 +450,12 @@
445#define U3D_SSUSB_HW_ID (SSUSB_SIFSLV_IPPC_BASE + 0x00A0) 450#define U3D_SSUSB_HW_ID (SSUSB_SIFSLV_IPPC_BASE + 0x00A0)
446#define U3D_SSUSB_HW_SUB_ID (SSUSB_SIFSLV_IPPC_BASE + 0x00A4) 451#define U3D_SSUSB_HW_SUB_ID (SSUSB_SIFSLV_IPPC_BASE + 0x00A4)
447#define U3D_SSUSB_IP_TRUNK_VERS (U3D_SSUSB_HW_SUB_ID) 452#define U3D_SSUSB_IP_TRUNK_VERS (U3D_SSUSB_HW_SUB_ID)
453#define U3D_SSUSB_PRB_CTRL0 (SSUSB_SIFSLV_IPPC_BASE + 0x00B0)
454#define U3D_SSUSB_PRB_CTRL1 (SSUSB_SIFSLV_IPPC_BASE + 0x00B4)
455#define U3D_SSUSB_PRB_CTRL2 (SSUSB_SIFSLV_IPPC_BASE + 0x00B8)
456#define U3D_SSUSB_PRB_CTRL3 (SSUSB_SIFSLV_IPPC_BASE + 0x00BC)
457#define U3D_SSUSB_PRB_CTRL4 (SSUSB_SIFSLV_IPPC_BASE + 0x00C0)
458#define U3D_SSUSB_PRB_CTRL5 (SSUSB_SIFSLV_IPPC_BASE + 0x00C4)
448#define U3D_SSUSB_IP_SPARE0 (SSUSB_SIFSLV_IPPC_BASE + 0x00C8) 459#define U3D_SSUSB_IP_SPARE0 (SSUSB_SIFSLV_IPPC_BASE + 0x00C8)
449 460
450/*---------------- SSUSB_SIFSLV_IPPC FIELD DEFINITION ----------------*/ 461/*---------------- SSUSB_SIFSLV_IPPC FIELD DEFINITION ----------------*/
diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c
index a326b1d6006a..dca8bd864e63 100644
--- a/drivers/usb/mtu3/mtu3_plat.c
+++ b/drivers/usb/mtu3/mtu3_plat.c
@@ -16,6 +16,7 @@
16 16
17#include "mtu3.h" 17#include "mtu3.h"
18#include "mtu3_dr.h" 18#include "mtu3_dr.h"
19#include "mtu3_debug.h"
19 20
20/* u2-port0 should be powered on and enabled; */ 21/* u2-port0 should be powered on and enabled; */
21int ssusb_check_clocks(struct ssusb_mtk *ssusb, u32 ex_clks) 22int ssusb_check_clocks(struct ssusb_mtk *ssusb, u32 ex_clks)
@@ -232,7 +233,7 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb)
232 int i; 233 int i;
233 int ret; 234 int ret;
234 235
235 ssusb->vusb33 = devm_regulator_get(&pdev->dev, "vusb33"); 236 ssusb->vusb33 = devm_regulator_get(dev, "vusb33");
236 if (IS_ERR(ssusb->vusb33)) { 237 if (IS_ERR(ssusb->vusb33)) {
237 dev_err(dev, "failed to get vusb33\n"); 238 dev_err(dev, "failed to get vusb33\n");
238 return PTR_ERR(ssusb->vusb33); 239 return PTR_ERR(ssusb->vusb33);
@@ -353,6 +354,8 @@ static int mtu3_probe(struct platform_device *pdev)
353 if (ret) 354 if (ret)
354 return ret; 355 return ret;
355 356
357 ssusb_debugfs_create_root(ssusb);
358
356 /* enable power domain */ 359 /* enable power domain */
357 pm_runtime_enable(dev); 360 pm_runtime_enable(dev);
358 pm_runtime_get_sync(dev); 361 pm_runtime_get_sync(dev);
@@ -423,6 +426,7 @@ comm_exit:
423comm_init_err: 426comm_init_err:
424 pm_runtime_put_sync(dev); 427 pm_runtime_put_sync(dev);
425 pm_runtime_disable(dev); 428 pm_runtime_disable(dev);
429 ssusb_debugfs_remove_root(ssusb);
426 430
427 return ret; 431 return ret;
428} 432}
@@ -450,6 +454,7 @@ static int mtu3_remove(struct platform_device *pdev)
450 ssusb_rscs_exit(ssusb); 454 ssusb_rscs_exit(ssusb);
451 pm_runtime_put_sync(&pdev->dev); 455 pm_runtime_put_sync(&pdev->dev);
452 pm_runtime_disable(&pdev->dev); 456 pm_runtime_disable(&pdev->dev);
457 ssusb_debugfs_remove_root(ssusb);
453 458
454 return 0; 459 return 0;
455} 460}