cdev_init(&gdev->chrdev, &gpio_fileops);
        gdev->chrdev.owner = THIS_MODULE;
-       gdev->chrdev.kobj.parent = &gdev->dev.kobj;
        gdev->dev.devt = MKDEV(MAJOR(gpio_devt), gdev->id);
-       status = cdev_add(&gdev->chrdev, gdev->dev.devt, 1);
-       if (status < 0)
-               chip_warn(gdev->chip, "failed to add char device %d:%d\n",
-                         MAJOR(gpio_devt), gdev->id);
-       else
-               chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n",
-                        MAJOR(gpio_devt), gdev->id);
-       status = device_add(&gdev->dev);
+
+       status = cdev_device_add(&gdev->chrdev, &gdev->dev);
        if (status)
-               goto err_remove_chardev;
+               return status;
+
+       chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n",
+                MAJOR(gpio_devt), gdev->id);
 
        status = gpiochip_sysfs_register(gdev);
        if (status)
        return 0;
 
 err_remove_device:
-       device_del(&gdev->dev);
-err_remove_chardev:
-       cdev_del(&gdev->chrdev);
+       cdev_device_del(&gdev->chrdev, &gdev->dev);
        return status;
 }
 
         * be removed, else it will be dangling until the last user is
         * gone.
         */
-       cdev_del(&gdev->chrdev);
-       device_del(&gdev->dev);
+       cdev_device_del(&gdev->chrdev, &gdev->dev);
        put_device(&gdev->dev);
 }
 EXPORT_SYMBOL_GPL(gpiochip_remove);