xhci: add helpers for enabling and disabling interrupters
authorMathias Nyman <mathias.nyman@linux.intel.com>
Thu, 2 Feb 2023 15:04:58 +0000 (17:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Feb 2023 15:44:41 +0000 (16:44 +0100)
Simple helpers to set and clear the IE (interrupter enable) bit
for an interrupter.

Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20230202150505.618915-5-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci.c

index 8dc3f2c..6183ce8 100644 (file)
@@ -292,6 +292,32 @@ static void xhci_zero_64b_regs(struct xhci_hcd *xhci)
                xhci_info(xhci, "Fault detected\n");
 }
 
+static int xhci_enable_interrupter(struct xhci_interrupter *ir)
+{
+       u32 iman;
+
+       if (!ir || !ir->ir_set)
+               return -EINVAL;
+
+       iman = readl(&ir->ir_set->irq_pending);
+       writel(ER_IRQ_ENABLE(iman), &ir->ir_set->irq_pending);
+
+       return 0;
+}
+
+static int xhci_disable_interrupter(struct xhci_interrupter *ir)
+{
+       u32 iman;
+
+       if (!ir || !ir->ir_set)
+               return -EINVAL;
+
+       iman = readl(&ir->ir_set->irq_pending);
+       writel(ER_IRQ_DISABLE(iman), &ir->ir_set->irq_pending);
+
+       return 0;
+}
+
 #ifdef CONFIG_USB_PCI
 /*
  * Set up MSI
@@ -610,7 +636,6 @@ static int xhci_init(struct usb_hcd *hcd)
 
 /*-------------------------------------------------------------------------*/
 
-
 static int xhci_run_finished(struct xhci_hcd *xhci)
 {
        struct xhci_interrupter *ir = xhci->interrupter;
@@ -629,8 +654,7 @@ static int xhci_run_finished(struct xhci_hcd *xhci)
        writel(temp, &xhci->op_regs->command);
 
        xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Enable primary interrupter");
-       temp = readl(&ir->ir_set->irq_pending);
-       writel(ER_IRQ_ENABLE(temp), &ir->ir_set->irq_pending);
+       xhci_enable_interrupter(ir);
 
        if (xhci_start(xhci)) {
                xhci_halt(xhci);
@@ -734,6 +758,7 @@ static void xhci_stop(struct usb_hcd *hcd)
 {
        u32 temp;
        struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+       struct xhci_interrupter *ir = xhci->interrupter;
 
        mutex_lock(&xhci->mutex);
 
@@ -770,8 +795,7 @@ static void xhci_stop(struct usb_hcd *hcd)
                        "// Disabling event ring interrupts");
        temp = readl(&xhci->op_regs->status);
        writel((temp & ~0x1fff) | STS_EINT, &xhci->op_regs->status);
-       temp = readl(&xhci->interrupter->ir_set->irq_pending);
-       writel(ER_IRQ_DISABLE(temp), &xhci->interrupter->ir_set->irq_pending);
+       xhci_disable_interrupter(ir);
 
        xhci_dbg_trace(xhci, trace_xhci_dbg_init, "cleaning up memory");
        xhci_mem_cleanup(xhci);
@@ -1227,8 +1251,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
                xhci_dbg(xhci, "// Disabling event ring interrupts\n");
                temp = readl(&xhci->op_regs->status);
                writel((temp & ~0x1fff) | STS_EINT, &xhci->op_regs->status);
-               temp = readl(&xhci->interrupter->ir_set->irq_pending);
-               writel(ER_IRQ_DISABLE(temp), &xhci->interrupter->ir_set->irq_pending);
+               xhci_disable_interrupter(xhci->interrupter);
 
                xhci_dbg(xhci, "cleaning up memory\n");
                xhci_mem_cleanup(xhci);