/** * intel_sst_remove - PCI remove function * * @pci: PCI device structure * * This function is called by OS when a device is unloaded * This frees the interrupt etc */ static void __devexit intel_sst_remove(struct pci_dev *pci) { pm_runtime_get_noresume(&pci->dev); pm_runtime_forbid(&pci->dev); unregister_sst(&pci->dev); pci_dev_put(sst_drv_ctx->pci); sst_set_fw_state_locked(sst_drv_ctx, SST_UN_INIT); misc_deregister(&lpe_ctrl); free_irq(pci->irq, sst_drv_ctx); iounmap(sst_drv_ctx->dram); iounmap(sst_drv_ctx->iram); iounmap(sst_drv_ctx->mailbox); iounmap(sst_drv_ctx->shim); if (sst_drv_ctx->pci_id == SST_MRST_PCI_ID) { misc_deregister(&lpe_dev); kfree(sst_drv_ctx->mmap_mem); } else { kfree(sst_drv_ctx->fw_cntx); } kfree(sst_drv_ctx->runtime_param.param.addr); flush_scheduled_work(); destroy_workqueue(sst_drv_ctx->process_reply_wq); destroy_workqueue(sst_drv_ctx->process_msg_wq); destroy_workqueue(sst_drv_ctx->post_msg_wq); destroy_workqueue(sst_drv_ctx->mad_wq); release_firmware(sst_drv_ctx->fw); pm_qos_remove_request(sst_drv_ctx->qos); kfree(sst_drv_ctx->qos); sst_drv_ctx->fw = NULL; kfree(sst_drv_ctx->fw_sg_list.src); kfree(sst_drv_ctx->fw_sg_list.dst); sst_drv_ctx->fw_sg_list.list_len = 0; kfree(sst_drv_ctx->fw_in_mem); sst_drv_ctx->fw_in_mem = NULL; kfree(sst_drv_ctx); sst_drv_ctx = NULL; pci_release_regions(pci); pci_disable_device(pci); pci_set_drvdata(pci, NULL); }
/** * intel_sst_remove - remove function * * @pdev: platform device structure * * This function is called by OS when a device is unloaded * This frees the interrupt etc */ int sst_acpi_remove(struct platform_device *pdev) { struct intel_sst_drv *ctx; ctx = platform_get_drvdata(pdev); sst_debugfs_exit(ctx); pm_runtime_get_noresume(ctx->dev); pm_runtime_disable(ctx->dev); unregister_sst(ctx->dev); sst_set_fw_state_locked(ctx, SST_UN_INIT); misc_deregister(&lpe_ctrl); kfree(ctx->runtime_param.param.addr); flush_scheduled_work(); sst_destroy_workqueue(ctx); kfree(ctx->fw_sg_list.src); kfree(ctx->fw_sg_list.dst); ctx->fw_sg_list.list_len = 0; kfree(ctx->fw_in_mem); ctx->fw_in_mem = NULL; sst_memcpy_free_resources(); sst_drv_ctx = NULL; platform_set_drvdata(pdev, NULL); return 0; }