/* * removes a virtio device if a hot remove event has been * requested by the host. */ static int mic_remove_device(struct mic_device_desc __iomem *d, unsigned int offset, struct mic_driver *mdrv) { struct mic_device_ctrl __iomem *dc = (void __iomem *)d + mic_aligned_desc_size(d); struct mic_vdev *mvdev = (struct mic_vdev *)ioread64(&dc->vdev); u8 status; int ret = -1; if (ioread8(&dc->config_change) == MIC_VIRTIO_PARAM_DEV_REMOVE) { dev_dbg(mdrv->dev, "%s %d config_change %d type %d mvdev %p\n", __func__, __LINE__, ioread8(&dc->config_change), ioread8(&d->type), mvdev); status = ioread8(&d->status); reinit_completion(&mvdev->reset_done); unregister_virtio_device(&mvdev->vdev); mic_free_card_irq(mvdev->virtio_cookie, mvdev); if (status & VIRTIO_CONFIG_S_DRIVER_OK) wait_for_completion(&mvdev->reset_done); kfree(mvdev); iowrite8(1, &dc->guest_ack); dev_dbg(mdrv->dev, "%s %d guest_ack %d\n", __func__, __LINE__, ioread8(&dc->guest_ack)); ret = 0; } return ret; }
/* * removes a virtio device if a hot remove event has been * requested by the host. */ static int _vop_remove_device(struct mic_device_desc __iomem *d, unsigned int offset, struct vop_device *vpdev) { struct mic_device_ctrl __iomem *dc = (void __iomem *)d + _vop_aligned_desc_size(d); struct _vop_vdev *vdev = (struct _vop_vdev *)readq(&dc->vdev); u8 status; int ret = -1; if (ioread8(&dc->config_change) == MIC_VIRTIO_PARAM_DEV_REMOVE) { dev_dbg(&vpdev->dev, "%s %d config_change %d type %d vdev %p\n", __func__, __LINE__, ioread8(&dc->config_change), ioread8(&d->type), vdev); status = ioread8(&d->status); reinit_completion(&vdev->reset_done); unregister_virtio_device(&vdev->vdev); vpdev->hw_ops->free_irq(vpdev, vdev->virtio_cookie, vdev); iowrite8(-1, &dc->h2c_vdev_db); if (status & VIRTIO_CONFIG_S_DRIVER_OK) wait_for_completion(&vdev->reset_done); kfree(vdev); iowrite8(1, &dc->guest_ack); dev_dbg(&vpdev->dev, "%s %d guest_ack %d\n", __func__, __LINE__, ioread8(&dc->guest_ack)); iowrite8(-1, &d->type); ret = 0; } return ret; }
static int __devexit virtio_mmio_remove(struct platform_device *pdev) { struct virtio_mmio_device *vm_dev = platform_get_drvdata(pdev); unregister_virtio_device(&vm_dev->vdev); return 0; }
static int zynq_rpmsg_deinitialize(struct platform_device *pdev) { unregister_virtio_device(&(zynq_rpmsg_p->virtio_dev)); put_device(&(zynq_rpmsg_p->mid_dev)); dma_release_declared_memory(&pdev->dev); clear_ipi_handler(zynq_rpmsg_p->vring0); return 0; }