int cirrus_driver_load(struct drm_device *dev, unsigned long flags) { struct cirrus_device *cdev; int r; cdev = kzalloc(sizeof(struct cirrus_device), GFP_KERNEL); if (cdev == NULL) return -ENOMEM; dev->dev_private = (void *)cdev; r = cirrus_device_init(cdev, dev, dev->pdev, flags); if (r) { dev_err(&dev->pdev->dev, "Fatal error during GPU init: %d\n", r); goto out; } r = cirrus_mm_init(cdev); if (r) dev_err(&dev->pdev->dev, "fatal err on mm init\n"); r = cirrus_modeset_init(cdev); if (r) dev_err(&dev->pdev->dev, "Fatal error during modeset init: %d\n", r); dev->mode_config.funcs = (void *)&cirrus_mode_funcs; out: if (r) cirrus_driver_unload(dev); return r; }
int cirrus_driver_load(struct drm_device *dev, unsigned long flags) { struct cirrus_device *cdev; int r; cdev = kzalloc(sizeof(struct cirrus_device), GFP_KERNEL); if (cdev == NULL) return -ENOMEM; dev->dev_private = (void *)cdev; r = cirrus_device_init(cdev, dev, dev->pdev, flags); if (r) { dev_err(&dev->pdev->dev, "Fatal error during GPU init: %d\n", r); goto out; } r = cirrus_mm_init(cdev); if (r) { dev_err(&dev->pdev->dev, "fatal err on mm init\n"); goto out; } /* * cirrus_modeset_init() is initializing/registering the emulated fbdev * and DRM internals can access/test some of the fields in * mode_config->funcs as part of the fbdev registration process. * Make sure dev->mode_config.funcs is properly set to avoid * dereferencing a NULL pointer. * FIXME: mode_config.funcs assignment should probably be done in * cirrus_modeset_init() (that's a common pattern seen in other DRM * drivers). */ dev->mode_config.funcs = &cirrus_mode_funcs; r = cirrus_modeset_init(cdev); if (r) { dev_err(&dev->pdev->dev, "Fatal error during modeset init: %d\n", r); goto out; } return 0; out: cirrus_driver_unload(dev); return r; }