/** * mei_remove - Device Removal Routine * * @pdev: PCI device structure * * mei_remove is called by the PCI subsystem to alert the driver * that it should release a PCI device. */ static void __devexit mei_remove(struct pci_dev *pdev) { struct mei_device *dev; if (mei_device != pdev) return; dev = pci_get_drvdata(pdev); if (!dev) return; mutex_lock(&dev->device_lock); mei_wd_stop(dev, false); mei_device = NULL; if (dev->iamthif_cl.state == MEI_FILE_CONNECTED) { dev->iamthif_cl.state = MEI_FILE_DISCONNECTING; mei_disconnect_host_client(dev, &dev->iamthif_cl); } if (dev->wd_cl.state == MEI_FILE_CONNECTED) { dev->wd_cl.state = MEI_FILE_DISCONNECTING; mei_disconnect_host_client(dev, &dev->wd_cl); } /* remove entry if already in list */ dev_dbg(&pdev->dev, "list del iamthif and wd file list.\n"); mei_remove_client_from_file_list(dev, dev->wd_cl.host_client_id); mei_remove_client_from_file_list(dev, dev->iamthif_cl.host_client_id); dev->iamthif_current_cb = NULL; dev->num_mei_me_clients = 0; mutex_unlock(&dev->device_lock); flush_scheduled_work(); /* disable interrupts */ mei_disable_interrupts(dev); free_irq(pdev->irq, dev); pci_set_drvdata(pdev, NULL); if (dev->mem_addr) pci_iounmap(pdev, dev->mem_addr); kfree(dev); pci_release_regions(pdev); pci_disable_device(pdev); }
/* * mei_wd_ops_stop - wd stop command from the watchdog core. * * @wd_dev - watchdog device struct * * returns 0 if success, negative errno code for failure */ static int mei_wd_ops_stop(struct watchdog_device *wd_dev) { struct mei_device *dev; dev = pci_get_drvdata(mei_device); if (!dev) return -ENODEV; mutex_lock(&dev->device_lock); mei_wd_stop(dev, false); mutex_unlock(&dev->device_lock); return 0; }
void mei_stop(struct mei_device *dev) { dev_dbg(&dev->pdev->dev, "stopping the device.\n"); mutex_lock(&dev->device_lock); cancel_delayed_work(&dev->timer_work); mei_wd_stop(dev); dev->dev_state = MEI_DEV_POWER_DOWN; mei_reset(dev, 0); mutex_unlock(&dev->device_lock); flush_scheduled_work(); }
void mei_stop(struct mei_device *dev) { dev_dbg(&dev->pdev->dev, "stopping the device.\n"); mei_cancel_work(dev); mei_nfc_host_exit(dev); mutex_lock(&dev->device_lock); mei_wd_stop(dev); dev->dev_state = MEI_DEV_POWER_DOWN; mei_reset(dev); mutex_unlock(&dev->device_lock); mei_watchdog_unregister(dev); }
void mei_stop(struct mei_device *dev) { dev_dbg(&dev->pdev->dev, "stopping the device.\n"); mei_cancel_work(dev); mei_nfc_host_exit(dev); mutex_lock(&dev->device_lock); mei_wd_stop(dev); dev->dev_state = MEI_DEV_POWER_DOWN; mei_reset(dev); /* move device to disabled state unconditionally */ dev->dev_state = MEI_DEV_DISABLED; mutex_unlock(&dev->device_lock); mei_watchdog_unregister(dev); }