Drivers such as intel_pmc_ipc.c can be unloaded as well so in order to support those in this driver add a new function that can be called to remove the SCU IPC if the driver is unloaded. Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- arch/x86/include/asm/intel_scu_ipc.h | 1 + drivers/platform/x86/intel_scu_ipc.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/arch/x86/include/asm/intel_scu_ipc.h b/arch/x86/include/asm/intel_scu_ipc.h index 1a76e874657e..bde7dc87c00c 100644 --- a/arch/x86/include/asm/intel_scu_ipc.h +++ b/arch/x86/include/asm/intel_scu_ipc.h @@ -32,6 +32,7 @@ struct intel_scu_ipc_pdata { struct intel_scu_ipc_dev * intel_scu_ipc_probe(struct device *dev, const struct intel_scu_ipc_pdata *pdata); +void intel_scu_ipc_remove(struct intel_scu_ipc_dev *scu); struct intel_scu_ipc_dev *intel_scu_ipc_dev_get(void); void intel_scu_ipc_dev_put(struct intel_scu_ipc_dev *scu); diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c index a729319fd708..b66320f0050c 100644 --- a/drivers/platform/x86/intel_scu_ipc.c +++ b/drivers/platform/x86/intel_scu_ipc.c @@ -565,3 +565,21 @@ intel_scu_ipc_probe(struct device *dev, const struct intel_scu_ipc_pdata *pdata) return scu; } EXPORT_SYMBOL_GPL(intel_scu_ipc_probe); + +/** + * intel_scu_ipc_remove() - Remove SCU IPC + * @scu: SCU IPC handle + * + * This unregisters the SCU IPC device and releases the interrupt. + */ +void intel_scu_ipc_remove(struct intel_scu_ipc_dev *scu) +{ + mutex_lock(&ipclock); + if (!WARN_ON(!scu->dev)) { + if (scu->irq > 0) + devm_free_irq(scu->dev, scu->irq, scu); + scu->dev = NULL; + } + mutex_unlock(&ipclock); +} +EXPORT_SYMBOL_GPL(intel_scu_ipc_remove); -- 2.24.1