media: platform: Switch to v4l2_async_notifier_add_subdev
Switch all media platform drivers to call v4l2_async_notifier_add_subdev() to add asd's to a notifier, in place of referencing the notifier->subdevs[] array. These drivers also must now call v4l2_async_notifier_init() before adding asd's to their notifiers. There may still be cases where a platform driver maintains a list of asd's that is a duplicate of the notifier asd_list, in which case its possible the platform driver list can be removed, and can reference the notifier asd_list instead. One example of where a duplicate list has been removed in this patch is xilinx-vipp.c. If there are such cases remaining, those drivers should be optimized to remove the duplicate platform driver asd lists. None of the changes to the platform drivers in this patch have been tested. Verify that the async subdevices needed by the platform are bound at load time, and that the driver unloads and reloads correctly with no memory leaking of asd objects. Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
d5099f8180
commit
d079f94c90
@@ -1124,7 +1124,6 @@ static int isi_graph_parse(struct atmel_isi *isi, struct device_node *node)
|
||||
|
||||
static int isi_graph_init(struct atmel_isi *isi)
|
||||
{
|
||||
struct v4l2_async_subdev **subdevs = NULL;
|
||||
int ret;
|
||||
|
||||
/* Parse the graph to extract a list of subdevice DT nodes. */
|
||||
@@ -1134,23 +1133,20 @@ static int isi_graph_init(struct atmel_isi *isi)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Register the subdevices notifier. */
|
||||
subdevs = devm_kzalloc(isi->dev, sizeof(*subdevs), GFP_KERNEL);
|
||||
if (!subdevs) {
|
||||
v4l2_async_notifier_init(&isi->notifier);
|
||||
|
||||
ret = v4l2_async_notifier_add_subdev(&isi->notifier, &isi->entity.asd);
|
||||
if (ret) {
|
||||
of_node_put(isi->entity.node);
|
||||
return -ENOMEM;
|
||||
return ret;
|
||||
}
|
||||
|
||||
subdevs[0] = &isi->entity.asd;
|
||||
|
||||
isi->notifier.subdevs = subdevs;
|
||||
isi->notifier.num_subdevs = 1;
|
||||
isi->notifier.ops = &isi_graph_notify_ops;
|
||||
|
||||
ret = v4l2_async_notifier_register(&isi->v4l2_dev, &isi->notifier);
|
||||
if (ret < 0) {
|
||||
dev_err(isi->dev, "Notifier registration failed\n");
|
||||
of_node_put(isi->entity.node);
|
||||
v4l2_async_notifier_cleanup(&isi->notifier);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1303,6 +1299,7 @@ static int atmel_isi_remove(struct platform_device *pdev)
|
||||
isi->fb_descriptors_phys);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
v4l2_async_notifier_unregister(&isi->notifier);
|
||||
v4l2_async_notifier_cleanup(&isi->notifier);
|
||||
v4l2_device_unregister(&isi->v4l2_dev);
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user