Skip to content

Commit 7b6c1b4

Browse files
liubiingregkh
authored andcommitted
usb: musb: fix runtime PM in debugfs
MUSB driver now has runtime PM support, but the debugfs driver misses the PM _get/_put() calls, which could cause MUSB register access failure. Cc: [email protected] # 4.9+ Acked-by: Tony Lindgren <[email protected]> Signed-off-by: Bin Liu <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 620f1a6 commit 7b6c1b4

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

drivers/usb/musb/musb_debugfs.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ static int musb_regdump_show(struct seq_file *s, void *unused)
114114
unsigned i;
115115

116116
seq_printf(s, "MUSB (M)HDRC Register Dump\n");
117+
pm_runtime_get_sync(musb->controller);
117118

118119
for (i = 0; i < ARRAY_SIZE(musb_regmap); i++) {
119120
switch (musb_regmap[i].size) {
@@ -132,6 +133,8 @@ static int musb_regdump_show(struct seq_file *s, void *unused)
132133
}
133134
}
134135

136+
pm_runtime_mark_last_busy(musb->controller);
137+
pm_runtime_put_autosuspend(musb->controller);
135138
return 0;
136139
}
137140

@@ -145,7 +148,10 @@ static int musb_test_mode_show(struct seq_file *s, void *unused)
145148
struct musb *musb = s->private;
146149
unsigned test;
147150

151+
pm_runtime_get_sync(musb->controller);
148152
test = musb_readb(musb->mregs, MUSB_TESTMODE);
153+
pm_runtime_mark_last_busy(musb->controller);
154+
pm_runtime_put_autosuspend(musb->controller);
149155

150156
if (test & MUSB_TEST_FORCE_HOST)
151157
seq_printf(s, "force host\n");
@@ -194,11 +200,12 @@ static ssize_t musb_test_mode_write(struct file *file,
194200
u8 test;
195201
char buf[18];
196202

203+
pm_runtime_get_sync(musb->controller);
197204
test = musb_readb(musb->mregs, MUSB_TESTMODE);
198205
if (test) {
199206
dev_err(musb->controller, "Error: test mode is already set. "
200207
"Please do USB Bus Reset to start a new test.\n");
201-
return count;
208+
goto ret;
202209
}
203210

204211
memset(buf, 0x00, sizeof(buf));
@@ -234,6 +241,9 @@ static ssize_t musb_test_mode_write(struct file *file,
234241

235242
musb_writeb(musb->mregs, MUSB_TESTMODE, test);
236243

244+
ret:
245+
pm_runtime_mark_last_busy(musb->controller);
246+
pm_runtime_put_autosuspend(musb->controller);
237247
return count;
238248
}
239249

@@ -254,8 +264,13 @@ static int musb_softconnect_show(struct seq_file *s, void *unused)
254264
switch (musb->xceiv->otg->state) {
255265
case OTG_STATE_A_HOST:
256266
case OTG_STATE_A_WAIT_BCON:
267+
pm_runtime_get_sync(musb->controller);
268+
257269
reg = musb_readb(musb->mregs, MUSB_DEVCTL);
258270
connect = reg & MUSB_DEVCTL_SESSION ? 1 : 0;
271+
272+
pm_runtime_mark_last_busy(musb->controller);
273+
pm_runtime_put_autosuspend(musb->controller);
259274
break;
260275
default:
261276
connect = -1;
@@ -284,6 +299,7 @@ static ssize_t musb_softconnect_write(struct file *file,
284299
if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
285300
return -EFAULT;
286301

302+
pm_runtime_get_sync(musb->controller);
287303
if (!strncmp(buf, "0", 1)) {
288304
switch (musb->xceiv->otg->state) {
289305
case OTG_STATE_A_HOST:
@@ -314,6 +330,8 @@ static ssize_t musb_softconnect_write(struct file *file,
314330
}
315331
}
316332

333+
pm_runtime_mark_last_busy(musb->controller);
334+
pm_runtime_put_autosuspend(musb->controller);
317335
return count;
318336
}
319337

0 commit comments

Comments
 (0)