Commit 74cb319b authored by Kai-Heng Feng's avatar Kai-Heng Feng Committed by Greg Kroah-Hartman

usb: xhci: dbc: Don't decrement runtime PM counter if DBC is not started

pm_runtime_put_sync() gets called everytime in xhci_dbc_stop().

If dbc is not started, this makes the runtime PM counter incorrectly
becomes 0, and calls autosuspend function. Then we'll keep seeing this:
[54664.762220] xhci_hcd 0000:00:14.0: Root hub is not suspended

So only calls pm_runtime_put_sync() when dbc was started.
Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 021c9179
...@@ -508,16 +508,18 @@ static int xhci_do_dbc_start(struct xhci_hcd *xhci) ...@@ -508,16 +508,18 @@ static int xhci_do_dbc_start(struct xhci_hcd *xhci)
return 0; return 0;
} }
static void xhci_do_dbc_stop(struct xhci_hcd *xhci) static int xhci_do_dbc_stop(struct xhci_hcd *xhci)
{ {
struct xhci_dbc *dbc = xhci->dbc; struct xhci_dbc *dbc = xhci->dbc;
if (dbc->state == DS_DISABLED) if (dbc->state == DS_DISABLED)
return; return -1;
writel(0, &dbc->regs->control); writel(0, &dbc->regs->control);
xhci_dbc_mem_cleanup(xhci); xhci_dbc_mem_cleanup(xhci);
dbc->state = DS_DISABLED; dbc->state = DS_DISABLED;
return 0;
} }
static int xhci_dbc_start(struct xhci_hcd *xhci) static int xhci_dbc_start(struct xhci_hcd *xhci)
...@@ -544,6 +546,7 @@ static int xhci_dbc_start(struct xhci_hcd *xhci) ...@@ -544,6 +546,7 @@ static int xhci_dbc_start(struct xhci_hcd *xhci)
static void xhci_dbc_stop(struct xhci_hcd *xhci) static void xhci_dbc_stop(struct xhci_hcd *xhci)
{ {
int ret;
unsigned long flags; unsigned long flags;
struct xhci_dbc *dbc = xhci->dbc; struct xhci_dbc *dbc = xhci->dbc;
struct dbc_port *port = &dbc->port; struct dbc_port *port = &dbc->port;
...@@ -556,9 +559,10 @@ static void xhci_dbc_stop(struct xhci_hcd *xhci) ...@@ -556,9 +559,10 @@ static void xhci_dbc_stop(struct xhci_hcd *xhci)
xhci_dbc_tty_unregister_device(xhci); xhci_dbc_tty_unregister_device(xhci);
spin_lock_irqsave(&dbc->lock, flags); spin_lock_irqsave(&dbc->lock, flags);
xhci_do_dbc_stop(xhci); ret = xhci_do_dbc_stop(xhci);
spin_unlock_irqrestore(&dbc->lock, flags); spin_unlock_irqrestore(&dbc->lock, flags);
if (!ret)
pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller); pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment