static int rcar_vin_remove(struct platform_device *pdev) { struct rvin_dev *vin = platform_get_drvdata(pdev); pm_runtime_disable(&pdev->dev); v4l2_async_notifier_unregister(&vin->notifier); rvin_dma_remove(vin); return 0; }
static int rvin_graph_init(struct rvin_dev *vin) { struct v4l2_async_subdev **subdevs = NULL; int ret; /* Parse the graph to extract a list of subdevice DT nodes. */ ret = rvin_graph_parse(vin, vin->dev->of_node); if (ret < 0) { vin_err(vin, "Graph parsing failed\n"); goto done; } if (!ret) { vin_err(vin, "No subdev found in graph\n"); goto done; } if (ret != 1) { vin_err(vin, "More then one subdev found in graph\n"); goto done; } /* Register the subdevices notifier. */ subdevs = devm_kzalloc(vin->dev, sizeof(*subdevs), GFP_KERNEL); if (subdevs == NULL) { ret = -ENOMEM; goto done; } subdevs[0] = &vin->entity.asd; vin->notifier.subdevs = subdevs; vin->notifier.num_subdevs = 1; vin->notifier.bound = rvin_graph_notify_bound; vin->notifier.unbind = rvin_graph_notify_unbind; vin->notifier.complete = rvin_graph_notify_complete; ret = v4l2_async_notifier_register(&vin->v4l2_dev, &vin->notifier); if (ret < 0) { vin_err(vin, "Notifier registration failed\n"); goto done; } ret = 0; done: if (ret < 0) { v4l2_async_notifier_unregister(&vin->notifier); of_node_put(vin->entity.node); } return ret; }
static int imx_media_remove(struct platform_device *pdev) { struct imx_media_dev *imxmd = (struct imx_media_dev *)platform_get_drvdata(pdev); v4l2_info(&imxmd->v4l2_dev, "Removing imx-media\n"); v4l2_async_notifier_unregister(&imxmd->notifier); imx_media_unregister_ipu_internal_subdevs(imxmd); v4l2_async_notifier_cleanup(&imxmd->notifier); media_device_unregister(&imxmd->md); v4l2_device_unregister(&imxmd->v4l2_dev); media_device_cleanup(&imxmd->md); return 0; }
static int imx7_csi_remove(struct platform_device *pdev) { struct v4l2_subdev *sd = platform_get_drvdata(pdev); struct imx7_csi *csi = v4l2_get_subdevdata(sd); struct imx_media_dev *imxmd = csi->imxmd; v4l2_async_notifier_unregister(&imxmd->notifier); v4l2_async_notifier_cleanup(&imxmd->notifier); media_device_unregister(&imxmd->md); v4l2_device_unregister(&imxmd->v4l2_dev); media_device_cleanup(&imxmd->md); imx_media_capture_device_unregister(csi->vdev); imx_media_capture_device_remove(csi->vdev); v4l2_async_unregister_subdev(sd); v4l2_ctrl_handler_free(&csi->ctrl_hdlr); mutex_destroy(&csi->lock); return 0; }