staging: gasket: interrupt: allow device driver to manage interrupts

Add interrupt type DEVICE_MANAGED, indicating that the device driver
manages interrupt setup and handling.  Future non-PCI wire interrupts
will use this type, calling gasket_handle_interrupt(), which is now made
non-static, to call into the gasket framework in order to update sysfs
files for interrupt counts and other framework interfaces.

Change-Id: Ie0be3d950ed2706f7ada848c19ddf7017e9623b2
Signed-off-by: Todd Poynor <toddpoynor@google.com>
This commit is contained in:
Leonid Lobachev
2019-09-23 14:10:39 -07:00
parent 35113ccbb5
commit 2a20ff1172
3 changed files with 22 additions and 2 deletions

View File

@@ -56,6 +56,7 @@ enum gasket_interrupt_packing {
/* Type of the interrupt supported by the device. */
enum gasket_interrupt_type {
PCI_MSIX = 0,
DEVICE_MANAGED = 1, /* Managed externally in device driver */
};
/*

View File

@@ -93,6 +93,9 @@ static void gasket_interrupt_setup(struct gasket_dev *gasket_dev)
dev_dbg(gasket_dev->dev, "Running interrupt setup\n");
if (interrupt_data->type == DEVICE_MANAGED)
return; /* device driver handles setup */
/* Setup the MSIX table. */
for (i = 0; i < interrupt_data->num_interrupts; i++) {
@@ -145,7 +148,7 @@ static void gasket_interrupt_setup(struct gasket_dev *gasket_dev)
}
}
static void
void
gasket_handle_interrupt(struct gasket_interrupt_data *interrupt_data,
int interrupt_index)
{
@@ -340,7 +343,6 @@ int gasket_interrupt_init(struct gasket_dev *gasket_dev)
interrupt_data->interrupts = driver_desc->interrupts;
interrupt_data->interrupt_bar_index = driver_desc->interrupt_bar_index;
interrupt_data->pack_width = driver_desc->interrupt_pack_width;
interrupt_data->num_configured = 0;
interrupt_data->eventfd_ctxs = kcalloc(driver_desc->num_interrupts,
sizeof(struct eventfd_ctx *),
@@ -369,6 +371,11 @@ int gasket_interrupt_init(struct gasket_dev *gasket_dev)
force_msix_interrupt_unmasking(gasket_dev);
break;
case DEVICE_MANAGED: /* Device driver manages IRQ init */
interrupt_data->num_configured = interrupt_data->num_interrupts;
ret = 0;
break;
default:
ret = -EINVAL;
}
@@ -426,6 +433,10 @@ int gasket_interrupt_reinit(struct gasket_dev *gasket_dev)
force_msix_interrupt_unmasking(gasket_dev);
break;
case DEVICE_MANAGED: /* Device driver manages IRQ reinit */
ret = 0;
break;
default:
ret = -EINVAL;
}
@@ -471,6 +482,9 @@ void gasket_interrupt_cleanup(struct gasket_dev *gasket_dev)
gasket_interrupt_msix_cleanup(interrupt_data);
break;
case DEVICE_MANAGED: /* Device driver manages IRQ cleanup */
break;
default:
break;
}

View File

@@ -45,6 +45,11 @@ void gasket_interrupt_cleanup(struct gasket_dev *gasket_dev);
*/
int gasket_interrupt_reinit(struct gasket_dev *gasket_dev);
/* Handle gasket interrupt processing, called from an external handler. */
void
gasket_handle_interrupt(struct gasket_interrupt_data *interrupt_data,
int interrupt_index);
/*
* Reset the counts stored in the interrupt subsystem.
* @gasket_dev: The Gasket information structure for this device.