static int rvin_digital_notify_bound(struct v4l2_async_notifier *notifier, struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd) { struct rvin_dev *vin = notifier_to_vin(notifier); int ret; v4l2_set_subdev_hostdata(subdev, vin); /* Find source and sink pad of remote subdevice */ ret = rvin_find_pad(subdev, MEDIA_PAD_FL_SOURCE); if (ret < 0) return ret; vin->digital.source_pad = ret; ret = rvin_find_pad(subdev, MEDIA_PAD_FL_SINK); vin->digital.sink_pad = ret < 0 ? 0 : ret; vin->digital.subdev = subdev; vin_dbg(vin, "bound subdev %s source pad: %u sink pad: %u\n", subdev->name, vin->digital.source_pad, vin->digital.sink_pad); return 0; }
static void rvin_graph_notify_unbind(struct v4l2_async_notifier *notifier, struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { struct rvin_dev *vin = notifier_to_vin(notifier); rvin_v4l2_remove(vin); }
static void rvin_digital_notify_unbind(struct v4l2_async_notifier *notifier, struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd) { struct rvin_dev *vin = notifier_to_vin(notifier); vin_dbg(vin, "unbind digital subdev %s\n", subdev->name); rvin_v4l2_remove(vin); vin->digital.subdev = NULL; }
static int rvin_graph_notify_bound(struct v4l2_async_notifier *notifier, struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd) { struct rvin_dev *vin = notifier_to_vin(notifier); vin_dbg(vin, "subdev %s bound\n", subdev->name); vin->entity.entity = &subdev->entity; vin->entity.subdev = subdev; return 0; }
static int rvin_graph_notify_complete(struct v4l2_async_notifier *notifier) { struct rvin_dev *vin = notifier_to_vin(notifier); int ret; ret = v4l2_device_register_subdev_nodes(&vin->v4l2_dev); if (ret < 0) { vin_err(vin, "Failed to register subdev nodes\n"); return ret; } if (!rvin_mbus_supported(vin)) { vin_err(vin, "No supported mediabus format found\n"); return -EINVAL; } return rvin_v4l2_probe(vin); }
static int rvin_digital_notify_complete(struct v4l2_async_notifier *notifier) { struct rvin_dev *vin = notifier_to_vin(notifier); int ret; /* Verify subdevices mbus format */ if (!rvin_mbus_supported(&vin->digital)) { vin_err(vin, "Unsupported media bus format for %s\n", vin->digital.subdev->name); return -EINVAL; } vin_dbg(vin, "Found media bus format for %s: %d\n", vin->digital.subdev->name, vin->digital.code); ret = v4l2_device_register_subdev_nodes(&vin->v4l2_dev); if (ret < 0) { vin_err(vin, "Failed to register subdev nodes\n"); return ret; } return rvin_v4l2_probe(vin); }