diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-device.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-device.c | 32 | 
1 files changed, 15 insertions, 17 deletions
diff --git a/drivers/media/v4l2-core/v4l2-device.c b/drivers/media/v4l2-core/v4l2-device.c index 513969fa695..8ed5da2170b 100644 --- a/drivers/media/v4l2-core/v4l2-device.c +++ b/drivers/media/v4l2-core/v4l2-device.c @@ -112,7 +112,7 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)  	/* Unregister subdevs */  	list_for_each_entry_safe(sd, next, &v4l2_dev->subdevs, list) {  		v4l2_device_unregister_subdev(sd); -#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE)) +#if IS_ENABLED(CONFIG_I2C)  		if (sd->flags & V4L2_SUBDEV_FL_IS_I2C) {  			struct i2c_client *client = v4l2_get_subdevdata(sd); @@ -159,31 +159,21 @@ int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev,  	sd->v4l2_dev = v4l2_dev;  	if (sd->internal_ops && sd->internal_ops->registered) {  		err = sd->internal_ops->registered(sd); -		if (err) { -			module_put(sd->owner); -			return err; -		} +		if (err) +			goto error_module;  	}  	/* This just returns 0 if either of the two args is NULL */  	err = v4l2_ctrl_add_handler(v4l2_dev->ctrl_handler, sd->ctrl_handler, NULL); -	if (err) { -		if (sd->internal_ops && sd->internal_ops->unregistered) -			sd->internal_ops->unregistered(sd); -		module_put(sd->owner); -		return err; -	} +	if (err) +		goto error_unregister;  #if defined(CONFIG_MEDIA_CONTROLLER)  	/* Register the entity. */  	if (v4l2_dev->mdev) {  		err = media_device_register_entity(v4l2_dev->mdev, entity); -		if (err < 0) { -			if (sd->internal_ops && sd->internal_ops->unregistered) -				sd->internal_ops->unregistered(sd); -			module_put(sd->owner); -			return err; -		} +		if (err < 0) +			goto error_unregister;  	}  #endif @@ -192,6 +182,14 @@ int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev,  	spin_unlock(&v4l2_dev->lock);  	return 0; + +error_unregister: +	if (sd->internal_ops && sd->internal_ops->unregistered) +		sd->internal_ops->unregistered(sd); +error_module: +	module_put(sd->owner); +	sd->v4l2_dev = NULL; +	return err;  }  EXPORT_SYMBOL_GPL(v4l2_device_register_subdev);  |