diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-async.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-async.c | 29 | 
1 files changed, 18 insertions, 11 deletions
| diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 96cc733f35ef..851f128eba22 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -12,8 +12,10 @@  #include <linux/err.h>  #include <linux/i2c.h>  #include <linux/list.h> +#include <linux/mm.h>  #include <linux/module.h>  #include <linux/mutex.h> +#include <linux/of.h>  #include <linux/platform_device.h>  #include <linux/slab.h>  #include <linux/types.h> @@ -40,10 +42,14 @@ static bool match_devname(struct v4l2_subdev *sd,  	return !strcmp(asd->match.device_name.name, dev_name(sd->dev));  } -static bool match_of(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) +static bool match_fwnode(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd)  { -	return !of_node_cmp(of_node_full_name(sd->of_node), -			    of_node_full_name(asd->match.of.node)); +	if (!is_of_node(sd->fwnode) || !is_of_node(asd->match.fwnode.fwnode)) +		return sd->fwnode == asd->match.fwnode.fwnode; + +	return !of_node_cmp(of_node_full_name(to_of_node(sd->fwnode)), +			    of_node_full_name( +				    to_of_node(asd->match.fwnode.fwnode)));  }  static bool match_custom(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) @@ -77,8 +83,8 @@ static struct v4l2_async_subdev *v4l2_async_belongs(struct v4l2_async_notifier *  		case V4L2_ASYNC_MATCH_I2C:  			match = match_i2c;  			break; -		case V4L2_ASYNC_MATCH_OF: -			match = match_of; +		case V4L2_ASYNC_MATCH_FWNODE: +			match = match_fwnode;  			break;  		default:  			/* Cannot happen, unless someone breaks us */ @@ -143,7 +149,8 @@ int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,  	struct v4l2_async_subdev *asd;  	int i; -	if (!notifier->num_subdevs || notifier->num_subdevs > V4L2_MAX_SUBDEVS) +	if (!v4l2_dev || !notifier->num_subdevs || +	    notifier->num_subdevs > V4L2_MAX_SUBDEVS)  		return -EINVAL;  	notifier->v4l2_dev = v4l2_dev; @@ -157,7 +164,7 @@ int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,  		case V4L2_ASYNC_MATCH_CUSTOM:  		case V4L2_ASYNC_MATCH_DEVNAME:  		case V4L2_ASYNC_MATCH_I2C: -		case V4L2_ASYNC_MATCH_OF: +		case V4L2_ASYNC_MATCH_FWNODE:  			break;  		default:  			dev_err(notifier->v4l2_dev ? notifier->v4l2_dev->dev : NULL, @@ -204,7 +211,7 @@ void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier)  	if (!notifier->v4l2_dev)  		return; -	dev = kmalloc_array(n_subdev, sizeof(*dev), GFP_KERNEL); +	dev = kvmalloc_array(n_subdev, sizeof(*dev), GFP_KERNEL);  	if (!dev) {  		dev_err(notifier->v4l2_dev->dev,  			"Failed to allocate device cache!\n"); @@ -260,7 +267,7 @@ void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier)  		}  		put_device(d);  	} -	kfree(dev); +	kvfree(dev);  	notifier->v4l2_dev = NULL; @@ -280,8 +287,8 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd)  	 * (struct v4l2_subdev.dev), and async sub-device does not  	 * exist independently of the device at any point of time.  	 */ -	if (!sd->of_node && sd->dev) -		sd->of_node = sd->dev->of_node; +	if (!sd->fwnode && sd->dev) +		sd->fwnode = dev_fwnode(sd->dev);  	mutex_lock(&list_lock); |