int udl_driver_unload(struct drm_device *dev) { struct udl_device *udl = dev->dev_private; if (udl->urbs.count) udl_free_urb_list(dev); udl_fbdev_cleanup(dev); udl_modeset_cleanup(dev); kfree(udl); return 0; }
int udl_driver_load(struct drm_device *dev, unsigned long flags) { struct usb_device *udev = (void*)flags; struct udl_device *udl; int ret = -ENOMEM; DRM_DEBUG("\n"); udl = kzalloc(sizeof(struct udl_device), GFP_KERNEL); if (!udl) return -ENOMEM; udl->udev = udev; udl->ddev = dev; dev->dev_private = udl; if (!udl_parse_vendor_descriptor(dev, udl->udev)) { ret = -ENODEV; DRM_ERROR("firmware not recognized. Assume incompatible device\n"); goto err; } if (udl_select_std_channel(udl)) DRM_ERROR("Selecting channel failed\n"); if (!udl_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) { DRM_ERROR("udl_alloc_urb_list failed\n"); goto err; } DRM_DEBUG("\n"); ret = udl_modeset_init(dev); if (ret) goto err; ret = udl_fbdev_init(dev); if (ret) goto err; ret = drm_vblank_init(dev, 1); if (ret) goto err_fb; return 0; err_fb: udl_fbdev_cleanup(dev); err: if (udl->urbs.count) udl_free_urb_list(dev); kfree(udl); DRM_ERROR("%d\n", ret); return ret; }