static void atomisp_pci_remove(struct pci_dev *dev) { struct atomisp_device *isp = (struct atomisp_device *) pci_get_drvdata(dev); atomisp_acc_cleanup(isp); pm_runtime_forbid(&dev->dev); pm_runtime_get_noresume(&dev->dev); pm_qos_remove_request(&isp->pm_qos); atomisp_msi_irq_uninit(isp, dev); pci_dev_put(isp->pci_root); atomisp_unregister_entities(isp); destroy_workqueue(isp->wdt_work_queue); atomisp_file_input_cleanup(isp); release_firmware(isp->firmware); hmm_pool_unregister(HMM_POOL_TYPE_RESERVED); }
static void __devexit atomisp_pci_remove(struct pci_dev *dev) { struct atomisp_device *isp = (struct atomisp_device *) pci_get_drvdata(dev); pm_runtime_forbid(&dev->dev); pm_runtime_get_noresume(&dev->dev); pm_qos_remove_request(&isp->pm_qos); atomisp_msi_irq_uninit(isp, dev); free_irq(dev->irq, isp); pci_disable_msi(dev); pci_dev_put(isp->hw_contex.pci_root); atomisp_unregister_entities(isp); flush_workqueue(isp->work_queue); destroy_workqueue(isp->work_queue); iounmap(atomisp_io_base); pci_set_drvdata(dev, NULL); pci_release_region(dev, 0); pci_disable_device(dev); /* in case user forget to close */ /* * fixing me: * MRFLD VP does not use firmware loading * from file system */ if (!IS_MRFLD) release_firmware(isp->firmware); hmm_pool_unregister(HMM_POOL_TYPE_RESERVED); kfree(isp); }