{
        char name[64];
        dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
-       struct device *dev = NULL;
-       int retval = -ENODEV;
-       bool cdev = false;
+       struct device *dev;
+       int retval;
 
        if (index >= driver->num) {
                pr_err("%s: Attempt to register invalid tty line number (%d)\n",
        else
                tty_line_name(driver, index, name);
 
-       if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
-               retval = tty_cdev_add(driver, devt, index, 1);
-               if (retval)
-                       goto error;
-               cdev = true;
-       }
-
        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-       if (!dev) {
-               retval = -ENOMEM;
-               goto error;
-       }
+       if (!dev)
+               return ERR_PTR(-ENOMEM);
 
        dev->devt = devt;
        dev->class = tty_class;
        dev->groups = attr_grp;
        dev_set_drvdata(dev, drvdata);
 
+       dev_set_uevent_suppress(dev, 1);
+
        retval = device_register(dev);
        if (retval)
-               goto error;
+               goto err_put;
+
+       if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
+               retval = tty_cdev_add(driver, devt, index, 1);
+               if (retval)
+                       goto err_del;
+       }
+
+       dev_set_uevent_suppress(dev, 0);
+       kobject_uevent(&dev->kobj, KOBJ_ADD);
 
        return dev;
 
-error:
+err_del:
+       device_del(dev);
+err_put:
        put_device(dev);
-       if (cdev) {
-               cdev_del(driver->cdevs[index]);
-               driver->cdevs[index] = NULL;
-       }
+
        return ERR_PTR(retval);
 }
 EXPORT_SYMBOL_GPL(tty_register_device_attr);