Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef5eba44 authored by Elson Roy Serrao's avatar Elson Roy Serrao
Browse files

usb: dwc3: Check USB LPM status before accessing registers



USB controller registers can be accessed when USB session
is not active or USB is in low power mode. This results
in unclocked register access. Prevent this by checking
the USB LPM status before accessing the registers.

Change-Id: I5a31bda1d88ac65b28afc2b545a44b4574b8548a
Signed-off-by: default avatarElson Roy Serrao <eserrao@codeaurora.org>
parent 6b3ddc57
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -282,6 +282,32 @@ static const struct debugfs_reg32 dwc3_regs[] = {
	dump_register(OSTS),
};

static int dwc3_regdump_show(struct seq_file *s, void *unused)
{
	struct dwc3		*dwc = s->private;

	if (atomic_read(&dwc->in_lpm)) {
		seq_puts(s, "USB device is powered off\n");
		return 0;
	}

	debugfs_print_regs32(s, dwc->regset->regs, dwc->regset->nregs,
				dwc->regset->base, "");
	return 0;
}

static int dwc3_regdump_open(struct inode *inode, struct file *file)
{
	return single_open(file, dwc3_regdump_show, inode->i_private);
}

static const struct file_operations dwc3_regdump_fops = {
	.open			= dwc3_regdump_open,
	.read			= seq_read,
	.llseek			= seq_lseek,
	.release		= single_release,
};

static int dwc3_mode_show(struct seq_file *s, void *unused)
{
	struct dwc3		*dwc = s->private;
@@ -997,7 +1023,7 @@ void dwc3_debugfs_init(struct dwc3 *dwc)

	dwc->root = root;

	debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
	debugfs_create_file("regdump", 0444, root, dwc, &dwc3_regdump_fops);

	if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)) {
		debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, dwc,