struct mga_device *mdev;
        int ret;
 
-       mdev = devm_kzalloc(&pdev->dev, sizeof(*mdev), GFP_KERNEL);
-       if (!mdev)
-               return ERR_PTR(-ENOMEM);
+       mdev = devm_drm_dev_alloc(&pdev->dev, &mgag200_driver,
+                                 struct mga_device, base);
+       if (IS_ERR(mdev))
+               return mdev;
        dev = &mdev->base;
 
-       ret = drm_dev_init(dev, &mgag200_driver, &pdev->dev);
-       if (ret)
-               return ERR_PTR(ret);
-
        dev->pdev = pdev;
        pci_set_drvdata(pdev, dev);
 
        ret = mgag200_device_init(mdev, flags);
        if (ret)
-               goto err_drm_dev_put;
+               return ERR_PTR(ret);
 
        return mdev;
-
-err_drm_dev_put:
-       drm_dev_put(dev);
-       return ERR_PTR(ret);
 }
 
 /*
                return ret;
 
        mdev = mgag200_device_create(pdev, ent->driver_data);
-       if (IS_ERR(mdev)) {
-               ret = PTR_ERR(mdev);
-               goto err_drm_dev_put;
-       }
+       if (IS_ERR(mdev))
+               return PTR_ERR(mdev);
        dev = &mdev->base;
 
        ret = drm_dev_register(dev, ent->driver_data);
        if (ret)
-               goto err_drm_dev_put;
+               return ret;
 
        drm_fbdev_generic_setup(dev, 0);
 
        return 0;
-
-err_drm_dev_put:
-       drm_dev_put(dev);
-       return ret;
 }
 
 static void mgag200_pci_remove(struct pci_dev *pdev)
        struct drm_device *dev = pci_get_drvdata(pdev);
 
        drm_dev_unregister(dev);
-       drm_dev_put(dev);
 }
 
 static struct pci_driver mgag200_pci_driver = {