Пример #1
0
/**
* 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;
}