mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
xhci: add helpers for enabling and disabling interrupters
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>
This commit is contained in:
parent
b17a57f89f
commit
52dd0483e8
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user