static int bochs_load(struct drm_device *dev, unsigned long flags) { struct bochs_device *bochs; int ret; bochs = kzalloc(sizeof(*bochs), GFP_KERNEL); if (bochs == NULL) return -ENOMEM; dev->dev_private = bochs; bochs->dev = dev; ret = bochs_hw_init(dev, flags); if (ret) goto err; ret = bochs_mm_init(bochs); if (ret) goto err; ret = bochs_kms_init(bochs); if (ret) goto err; if (enable_fbdev) bochs_fbdev_init(bochs); return 0; err: bochs_unload(dev); return ret; }
static void bochs_pci_remove(struct pci_dev *pdev) { struct drm_device *dev = pci_get_drvdata(pdev); drm_dev_unregister(dev); bochs_unload(dev); drm_dev_put(dev); }
static int bochs_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct drm_device *dev; unsigned long fbsize; int ret; fbsize = pci_resource_len(pdev, 0); if (fbsize < 4 * 1024 * 1024) { DRM_ERROR("less than 4 MB video memory, ignoring device\n"); return -ENOMEM; } ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, 0, "bochsdrmfb"); if (ret) return ret; dev = drm_dev_alloc(&bochs_driver, &pdev->dev); if (IS_ERR(dev)) return PTR_ERR(dev); ret = pci_enable_device(pdev); if (ret) goto err_free_dev; dev->pdev = pdev; pci_set_drvdata(pdev, dev); ret = bochs_load(dev); if (ret) goto err_free_dev; ret = drm_dev_register(dev, 0); if (ret) goto err_unload; return ret; err_unload: bochs_unload(dev); err_free_dev: drm_dev_put(dev); return ret; }