Commit 52dd0483 authored by Mathias Nyman's avatar Mathias Nyman Committed by Greg Kroah-Hartman
Browse files

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: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20230202150505.618915-5-mathias.nyman@linux.intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b17a57f8
Loading
Loading
Loading
Loading
+30 −7
Original line number Diff line number Diff line
@@ -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);