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 rvin_digital_graph_init(struct rvin_dev *vin) { struct v4l2_async_subdev **subdevs = NULL; int ret; ret = rvin_digital_graph_parse(vin); if (ret) return ret; if (!vin->digital.asd.match.fwnode.fwnode) { vin_dbg(vin, "No digital subdevice found\n"); return -ENODEV; } /* Register the subdevices notifier. */ subdevs = devm_kzalloc(vin->dev, sizeof(*subdevs), GFP_KERNEL); if (subdevs == NULL) return -ENOMEM; subdevs[0] = &vin->digital.asd; vin_dbg(vin, "Found digital subdevice %s\n", of_node_full_name(to_of_node(subdevs[0]->match.fwnode.fwnode))); vin->notifier.num_subdevs = 1; vin->notifier.subdevs = subdevs; vin->notifier.bound = rvin_digital_notify_bound; vin->notifier.unbind = rvin_digital_notify_unbind; vin->notifier.complete = rvin_digital_notify_complete; ret = v4l2_async_notifier_register(&vin->v4l2_dev, &vin->notifier); if (ret < 0) { vin_err(vin, "Notifier registration failed\n"); return ret; } return 0; }