media: video-mux: Create media links in bound notifier
Implement a notifier bound op to register media links from the remote sub-device's source pad(s) to the video-mux sink pad(s). 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+huawei@kernel.org>
This commit is contained in:
Родитель
400a9034c4
Коммит
612b385efb
|
@ -17,6 +17,7 @@
|
||||||
#include <media/v4l2-async.h>
|
#include <media/v4l2-async.h>
|
||||||
#include <media/v4l2-device.h>
|
#include <media/v4l2-device.h>
|
||||||
#include <media/v4l2-fwnode.h>
|
#include <media/v4l2-fwnode.h>
|
||||||
|
#include <media/v4l2-mc.h>
|
||||||
#include <media/v4l2-subdev.h>
|
#include <media/v4l2-subdev.h>
|
||||||
|
|
||||||
struct video_mux {
|
struct video_mux {
|
||||||
|
@ -36,6 +37,12 @@ static const struct v4l2_mbus_framefmt video_mux_format_mbus_default = {
|
||||||
.field = V4L2_FIELD_NONE,
|
.field = V4L2_FIELD_NONE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline struct video_mux *
|
||||||
|
notifier_to_video_mux(struct v4l2_async_notifier *n)
|
||||||
|
{
|
||||||
|
return container_of(n, struct video_mux, notifier);
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct video_mux *v4l2_subdev_to_video_mux(struct v4l2_subdev *sd)
|
static inline struct video_mux *v4l2_subdev_to_video_mux(struct v4l2_subdev *sd)
|
||||||
{
|
{
|
||||||
return container_of(sd, struct video_mux, subdev);
|
return container_of(sd, struct video_mux, subdev);
|
||||||
|
@ -332,6 +339,19 @@ static const struct v4l2_subdev_ops video_mux_subdev_ops = {
|
||||||
.video = &video_mux_subdev_video_ops,
|
.video = &video_mux_subdev_video_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int video_mux_notify_bound(struct v4l2_async_notifier *notifier,
|
||||||
|
struct v4l2_subdev *sd,
|
||||||
|
struct v4l2_async_subdev *asd)
|
||||||
|
{
|
||||||
|
struct video_mux *vmux = notifier_to_video_mux(notifier);
|
||||||
|
|
||||||
|
return v4l2_create_fwnode_links(sd, &vmux->subdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct v4l2_async_notifier_operations video_mux_notify_ops = {
|
||||||
|
.bound = video_mux_notify_bound,
|
||||||
|
};
|
||||||
|
|
||||||
static int video_mux_async_register(struct video_mux *vmux,
|
static int video_mux_async_register(struct video_mux *vmux,
|
||||||
unsigned int num_input_pads)
|
unsigned int num_input_pads)
|
||||||
{
|
{
|
||||||
|
@ -369,6 +389,8 @@ static int video_mux_async_register(struct video_mux *vmux,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vmux->notifier.ops = &video_mux_notify_ops;
|
||||||
|
|
||||||
ret = v4l2_async_subdev_notifier_register(&vmux->subdev,
|
ret = v4l2_async_subdev_notifier_register(&vmux->subdev,
|
||||||
&vmux->notifier);
|
&vmux->notifier);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче