|
@@ -3293,9 +3293,8 @@ struct device *tty_register_device_attr(struct tty_driver *driver,
|
|
{
|
|
{
|
|
char name[64];
|
|
char name[64];
|
|
dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
|
|
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) {
|
|
if (index >= driver->num) {
|
|
pr_err("%s: Attempt to register invalid tty line number (%d)\n",
|
|
pr_err("%s: Attempt to register invalid tty line number (%d)\n",
|
|
@@ -3308,18 +3307,9 @@ struct device *tty_register_device_attr(struct tty_driver *driver,
|
|
else
|
|
else
|
|
tty_line_name(driver, index, name);
|
|
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);
|
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
|
- if (!dev) {
|
|
|
|
- retval = -ENOMEM;
|
|
|
|
- goto error;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!dev)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
dev->devt = devt;
|
|
dev->devt = devt;
|
|
dev->class = tty_class;
|
|
dev->class = tty_class;
|
|
@@ -3329,18 +3319,28 @@ struct device *tty_register_device_attr(struct tty_driver *driver,
|
|
dev->groups = attr_grp;
|
|
dev->groups = attr_grp;
|
|
dev_set_drvdata(dev, drvdata);
|
|
dev_set_drvdata(dev, drvdata);
|
|
|
|
|
|
|
|
+ dev_set_uevent_suppress(dev, 1);
|
|
|
|
+
|
|
retval = device_register(dev);
|
|
retval = device_register(dev);
|
|
if (retval)
|
|
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;
|
|
return dev;
|
|
|
|
|
|
-error:
|
|
|
|
|
|
+err_del:
|
|
|
|
+ device_del(dev);
|
|
|
|
+err_put:
|
|
put_device(dev);
|
|
put_device(dev);
|
|
- if (cdev) {
|
|
|
|
- cdev_del(driver->cdevs[index]);
|
|
|
|
- driver->cdevs[index] = NULL;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
return ERR_PTR(retval);
|
|
return ERR_PTR(retval);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(tty_register_device_attr);
|
|
EXPORT_SYMBOL_GPL(tty_register_device_attr);
|