diff options
Diffstat (limited to 'drivers/media/platform/xilinx/xilinx-vipp.c')
| -rw-r--r-- | drivers/media/platform/xilinx/xilinx-vipp.c | 55 | 
1 files changed, 17 insertions, 38 deletions
diff --git a/drivers/media/platform/xilinx/xilinx-vipp.c b/drivers/media/platform/xilinx/xilinx-vipp.c index 3123216b3f70..4285770fde18 100644 --- a/drivers/media/platform/xilinx/xilinx-vipp.c +++ b/drivers/media/platform/xilinx/xilinx-vipp.c @@ -34,13 +34,13 @@   * @subdev: V4L2 subdev   */  struct xvip_graph_entity { -	struct v4l2_async_subdev asd; /* must be first */ +	struct v4l2_async_connection asd; /* must be first */  	struct media_entity *entity;  	struct v4l2_subdev *subdev;  };  static inline struct xvip_graph_entity * -to_xvip_entity(struct v4l2_async_subdev *asd) +to_xvip_entity(struct v4l2_async_connection *asd)  {  	return container_of(asd, struct xvip_graph_entity, asd);  } @@ -54,9 +54,9 @@ xvip_graph_find_entity(struct xvip_composite_device *xdev,  		       const struct fwnode_handle *fwnode)  {  	struct xvip_graph_entity *entity; -	struct v4l2_async_subdev *asd; +	struct v4l2_async_connection *asd; -	list_for_each_entry(asd, &xdev->notifier.asd_list, asd_list) { +	list_for_each_entry(asd, &xdev->notifier.done_list, asc_entry) {  		entity = to_xvip_entity(asd);  		if (entity->asd.match.fwnode == fwnode)  			return entity; @@ -285,13 +285,13 @@ static int xvip_graph_notify_complete(struct v4l2_async_notifier *notifier)  	struct xvip_composite_device *xdev =  		container_of(notifier, struct xvip_composite_device, notifier);  	struct xvip_graph_entity *entity; -	struct v4l2_async_subdev *asd; +	struct v4l2_async_connection *asd;  	int ret;  	dev_dbg(xdev->dev, "notify complete, all subdevs registered\n");  	/* Create links for every entity. */ -	list_for_each_entry(asd, &xdev->notifier.asd_list, asd_list) { +	list_for_each_entry(asd, &xdev->notifier.done_list, asc_entry) {  		entity = to_xvip_entity(asd);  		ret = xvip_graph_build_one(xdev, entity);  		if (ret < 0) @@ -312,36 +312,14 @@ static int xvip_graph_notify_complete(struct v4l2_async_notifier *notifier)  static int xvip_graph_notify_bound(struct v4l2_async_notifier *notifier,  				   struct v4l2_subdev *subdev, -				   struct v4l2_async_subdev *unused) +				   struct v4l2_async_connection *asc)  { -	struct xvip_composite_device *xdev = -		container_of(notifier, struct xvip_composite_device, notifier); -	struct xvip_graph_entity *entity; -	struct v4l2_async_subdev *asd; - -	/* Locate the entity corresponding to the bound subdev and store the -	 * subdev pointer. -	 */ -	list_for_each_entry(asd, &xdev->notifier.asd_list, asd_list) { -		entity = to_xvip_entity(asd); - -		if (entity->asd.match.fwnode != subdev->fwnode) -			continue; +	struct xvip_graph_entity *entity = to_xvip_entity(asc); -		if (entity->subdev) { -			dev_err(xdev->dev, "duplicate subdev for node %p\n", -				entity->asd.match.fwnode); -			return -EINVAL; -		} +	entity->entity = &subdev->entity; +	entity->subdev = subdev; -		dev_dbg(xdev->dev, "subdev %s bound\n", subdev->name); -		entity->entity = &subdev->entity; -		entity->subdev = subdev; -		return 0; -	} - -	dev_err(xdev->dev, "no entity for subdev %s\n", subdev->name); -	return -EINVAL; +	return 0;  }  static const struct v4l2_async_notifier_operations xvip_graph_notify_ops = { @@ -402,7 +380,7 @@ err_notifier_cleanup:  static int xvip_graph_parse(struct xvip_composite_device *xdev)  {  	struct xvip_graph_entity *entity; -	struct v4l2_async_subdev *asd; +	struct v4l2_async_connection *asd;  	int ret;  	/* @@ -415,7 +393,7 @@ static int xvip_graph_parse(struct xvip_composite_device *xdev)  	if (ret < 0)  		return 0; -	list_for_each_entry(asd, &xdev->notifier.asd_list, asd_list) { +	list_for_each_entry(asd, &xdev->notifier.waiting_list, asc_entry) {  		entity = to_xvip_entity(asd);  		ret = xvip_graph_parse_one(xdev, entity->asd.match.fwnode);  		if (ret < 0) { @@ -516,6 +494,8 @@ static int xvip_graph_init(struct xvip_composite_device *xdev)  		goto done;  	} +	v4l2_async_nf_init(&xdev->notifier, &xdev->v4l2_dev); +  	/* Parse the graph to extract a list of subdevice DT nodes. */  	ret = xvip_graph_parse(xdev);  	if (ret < 0) { @@ -523,7 +503,7 @@ static int xvip_graph_init(struct xvip_composite_device *xdev)  		goto done;  	} -	if (list_empty(&xdev->notifier.asd_list)) { +	if (list_empty(&xdev->notifier.waiting_list)) {  		dev_err(xdev->dev, "no subdev found in graph\n");  		ret = -ENOENT;  		goto done; @@ -532,7 +512,7 @@ static int xvip_graph_init(struct xvip_composite_device *xdev)  	/* Register the subdevices notifier. */  	xdev->notifier.ops = &xvip_graph_notify_ops; -	ret = v4l2_async_nf_register(&xdev->v4l2_dev, &xdev->notifier); +	ret = v4l2_async_nf_register(&xdev->notifier);  	if (ret < 0) {  		dev_err(xdev->dev, "notifier registration failed\n");  		goto done; @@ -596,7 +576,6 @@ static int xvip_composite_probe(struct platform_device *pdev)  	xdev->dev = &pdev->dev;  	INIT_LIST_HEAD(&xdev->dmas); -	v4l2_async_nf_init(&xdev->notifier);  	ret = xvip_composite_v4l2_init(xdev);  	if (ret < 0)  |