Commit e878742c authored by Bingbu Cao's avatar Bingbu Cao Committed by Mauro Carvalho Chehab

media: staging/intel-ipu3: make imgu use fixed running mode

Currently, the imgu running mode need user to set by v4l2 ctrl.
However, imgu only support 2 pipes and 2 operation modes - video and
still. This patch make the first imgu subdev running as video and second
one running as still, it will make the user understand easily, it can
also cover current camera use cases requirement. The running mode is set
during subdev registering, no race-condition after change, so it is safe
to change the mode data type to integer.
Signed-off-by: default avatarBingbu Cao <bingbu.cao@intel.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 92590966
...@@ -234,9 +234,9 @@ The IPU3 ImgU pipelines can be configured using the Media Controller, defined at ...@@ -234,9 +234,9 @@ The IPU3 ImgU pipelines can be configured using the Media Controller, defined at
Firmware binary selection Firmware binary selection
------------------------- -------------------------
The firmware binary is selected using the V4L2_CID_INTEL_IPU3_MODE, currently The firmware binary is selected according to the running mode of imgu. There are
defined in drivers/staging/media/ipu3/include/intel-ipu3.h . "VIDEO" and "STILL" 2 modes are available - "video" and "still". "ipu3-imgu video" are running under
modes are available. "video" mode and "ipu3-imgu still" is running under "still" mode.
Processing the image in raw Bayer format Processing the image in raw Bayer format
---------------------------------------- ----------------------------------------
......
...@@ -12,10 +12,6 @@ ...@@ -12,10 +12,6 @@
#define V4L2_META_FMT_IPU3_PARAMS v4l2_fourcc('i', 'p', '3', 'p') /* IPU3 processing parameters */ #define V4L2_META_FMT_IPU3_PARAMS v4l2_fourcc('i', 'p', '3', 'p') /* IPU3 processing parameters */
#define V4L2_META_FMT_IPU3_STAT_3A v4l2_fourcc('i', 'p', '3', 's') /* IPU3 3A statistics */ #define V4L2_META_FMT_IPU3_STAT_3A v4l2_fourcc('i', 'p', '3', 's') /* IPU3 3A statistics */
/* from include/uapi/linux/v4l2-controls.h */
#define V4L2_CID_INTEL_IPU3_BASE (V4L2_CID_USER_BASE + 0x10c0)
#define V4L2_CID_INTEL_IPU3_MODE (V4L2_CID_INTEL_IPU3_BASE + 1)
/******************* ipu3_uapi_stats_3a *******************/ /******************* ipu3_uapi_stats_3a *******************/
#define IPU3_UAPI_MAX_STRIPES 2 #define IPU3_UAPI_MAX_STRIPES 2
......
...@@ -67,8 +67,6 @@ static int imgu_subdev_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -67,8 +67,6 @@ static int imgu_subdev_s_stream(struct v4l2_subdev *sd, int enable)
struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
dev_dbg(dev, "%s %d for pipe %u", __func__, enable, pipe); dev_dbg(dev, "%s %d for pipe %u", __func__, enable, pipe);
/* grab ctrl after streamon and return after off */
v4l2_ctrl_grab(imgu_sd->ctrl, enable);
if (!enable) { if (!enable) {
imgu_sd->active = false; imgu_sd->active = false;
...@@ -96,7 +94,7 @@ static int imgu_subdev_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -96,7 +94,7 @@ static int imgu_subdev_s_stream(struct v4l2_subdev *sd, int enable)
if (imgu_pipe->nodes[IMGU_NODE_VF].enabled) if (imgu_pipe->nodes[IMGU_NODE_VF].enabled)
css_pipe->vf_output_en = true; css_pipe->vf_output_en = true;
if (atomic_read(&imgu_sd->running_mode) == IPU3_RUNNING_MODE_VIDEO) if (imgu_sd->running_mode == IPU3_RUNNING_MODE_VIDEO)
css_pipe->pipe_id = IPU3_CSS_PIPE_ID_VIDEO; css_pipe->pipe_id = IPU3_CSS_PIPE_ID_VIDEO;
else else
css_pipe->pipe_id = IPU3_CSS_PIPE_ID_CAPTURE; css_pipe->pipe_id = IPU3_CSS_PIPE_ID_CAPTURE;
...@@ -668,7 +666,7 @@ static int imgu_fmt(struct imgu_device *imgu, unsigned int pipe, int node, ...@@ -668,7 +666,7 @@ static int imgu_fmt(struct imgu_device *imgu, unsigned int pipe, int node,
if (imgu_pipe->nodes[IMGU_NODE_VF].enabled) if (imgu_pipe->nodes[IMGU_NODE_VF].enabled)
css_pipe->vf_output_en = true; css_pipe->vf_output_en = true;
if (atomic_read(&imgu_sd->running_mode) == IPU3_RUNNING_MODE_VIDEO) if (imgu_sd->running_mode == IPU3_RUNNING_MODE_VIDEO)
css_pipe->pipe_id = IPU3_CSS_PIPE_ID_VIDEO; css_pipe->pipe_id = IPU3_CSS_PIPE_ID_VIDEO;
else else
css_pipe->pipe_id = IPU3_CSS_PIPE_ID_CAPTURE; css_pipe->pipe_id = IPU3_CSS_PIPE_ID_CAPTURE;
...@@ -899,11 +897,6 @@ static struct v4l2_subdev_internal_ops imgu_subdev_internal_ops = { ...@@ -899,11 +897,6 @@ static struct v4l2_subdev_internal_ops imgu_subdev_internal_ops = {
.open = imgu_subdev_open, .open = imgu_subdev_open,
}; };
static const struct v4l2_subdev_core_ops imgu_subdev_core_ops = {
.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
.unsubscribe_event = v4l2_event_subdev_unsubscribe,
};
static const struct v4l2_subdev_video_ops imgu_subdev_video_ops = { static const struct v4l2_subdev_video_ops imgu_subdev_video_ops = {
.s_stream = imgu_subdev_s_stream, .s_stream = imgu_subdev_s_stream,
}; };
...@@ -917,7 +910,6 @@ static const struct v4l2_subdev_pad_ops imgu_subdev_pad_ops = { ...@@ -917,7 +910,6 @@ static const struct v4l2_subdev_pad_ops imgu_subdev_pad_ops = {
}; };
static const struct v4l2_subdev_ops imgu_subdev_ops = { static const struct v4l2_subdev_ops imgu_subdev_ops = {
.core = &imgu_subdev_core_ops,
.video = &imgu_subdev_video_ops, .video = &imgu_subdev_video_ops,
.pad = &imgu_subdev_pad_ops, .pad = &imgu_subdev_pad_ops,
}; };
...@@ -1011,44 +1003,6 @@ static const struct v4l2_ioctl_ops imgu_v4l2_meta_ioctl_ops = { ...@@ -1011,44 +1003,6 @@ static const struct v4l2_ioctl_ops imgu_v4l2_meta_ioctl_ops = {
.vidioc_expbuf = vb2_ioctl_expbuf, .vidioc_expbuf = vb2_ioctl_expbuf,
}; };
static int imgu_sd_s_ctrl(struct v4l2_ctrl *ctrl)
{
struct imgu_v4l2_subdev *imgu_sd =
container_of(ctrl->handler, struct imgu_v4l2_subdev, ctrl_handler);
struct imgu_device *imgu = v4l2_get_subdevdata(&imgu_sd->subdev);
struct device *dev = &imgu->pci_dev->dev;
dev_dbg(dev, "set val %d to ctrl 0x%8x for subdev %u",
ctrl->val, ctrl->id, imgu_sd->pipe);
switch (ctrl->id) {
case V4L2_CID_INTEL_IPU3_MODE:
atomic_set(&imgu_sd->running_mode, ctrl->val);
return 0;
default:
return -EINVAL;
}
}
static const struct v4l2_ctrl_ops imgu_subdev_ctrl_ops = {
.s_ctrl = imgu_sd_s_ctrl,
};
static const char * const imgu_ctrl_mode_strings[] = {
"Video mode",
"Still mode",
};
static const struct v4l2_ctrl_config imgu_subdev_ctrl_mode = {
.ops = &imgu_subdev_ctrl_ops,
.id = V4L2_CID_INTEL_IPU3_MODE,
.name = "IPU3 Pipe Mode",
.type = V4L2_CTRL_TYPE_MENU,
.max = ARRAY_SIZE(imgu_ctrl_mode_strings) - 1,
.def = IPU3_RUNNING_MODE_VIDEO,
.qmenu = imgu_ctrl_mode_strings,
};
/******************** Framework registration ********************/ /******************** Framework registration ********************/
/* helper function to config node's video properties */ /* helper function to config node's video properties */
...@@ -1094,7 +1048,6 @@ static int imgu_v4l2_subdev_register(struct imgu_device *imgu, ...@@ -1094,7 +1048,6 @@ static int imgu_v4l2_subdev_register(struct imgu_device *imgu,
unsigned int pipe) unsigned int pipe)
{ {
int i, r; int i, r;
struct v4l2_ctrl_handler *hdl = &imgu_sd->ctrl_handler;
struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe]; struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
/* Initialize subdev media entity */ /* Initialize subdev media entity */
...@@ -1115,21 +1068,12 @@ static int imgu_v4l2_subdev_register(struct imgu_device *imgu, ...@@ -1115,21 +1068,12 @@ static int imgu_v4l2_subdev_register(struct imgu_device *imgu,
v4l2_subdev_init(&imgu_sd->subdev, &imgu_subdev_ops); v4l2_subdev_init(&imgu_sd->subdev, &imgu_subdev_ops);
imgu_sd->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_STATISTICS; imgu_sd->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_STATISTICS;
imgu_sd->subdev.internal_ops = &imgu_subdev_internal_ops; imgu_sd->subdev.internal_ops = &imgu_subdev_internal_ops;
imgu_sd->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE | imgu_sd->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
V4L2_SUBDEV_FL_HAS_EVENTS;
snprintf(imgu_sd->subdev.name, sizeof(imgu_sd->subdev.name), snprintf(imgu_sd->subdev.name, sizeof(imgu_sd->subdev.name),
"%s %u", IMGU_NAME, pipe); "%s %s", IMGU_NAME, pipe ? "still" : "video");
v4l2_set_subdevdata(&imgu_sd->subdev, imgu); v4l2_set_subdevdata(&imgu_sd->subdev, imgu);
atomic_set(&imgu_sd->running_mode, IPU3_RUNNING_MODE_VIDEO); imgu_sd->running_mode =
v4l2_ctrl_handler_init(hdl, 1); pipe ? IPU3_RUNNING_MODE_STILL : IPU3_RUNNING_MODE_VIDEO;
imgu_sd->subdev.ctrl_handler = hdl;
imgu_sd->ctrl = v4l2_ctrl_new_custom(hdl, &imgu_subdev_ctrl_mode, NULL);
if (hdl->error) {
r = hdl->error;
dev_err(&imgu->pci_dev->dev,
"failed to create subdev v4l2 ctrl with err %d", r);
goto fail_subdev;
}
r = v4l2_device_register_subdev(&imgu->v4l2_dev, &imgu_sd->subdev); r = v4l2_device_register_subdev(&imgu->v4l2_dev, &imgu_sd->subdev);
if (r) { if (r) {
dev_err(&imgu->pci_dev->dev, dev_err(&imgu->pci_dev->dev,
...@@ -1141,7 +1085,6 @@ static int imgu_v4l2_subdev_register(struct imgu_device *imgu, ...@@ -1141,7 +1085,6 @@ static int imgu_v4l2_subdev_register(struct imgu_device *imgu,
return 0; return 0;
fail_subdev: fail_subdev:
v4l2_ctrl_handler_free(imgu_sd->subdev.ctrl_handler);
media_entity_cleanup(&imgu_sd->subdev.entity); media_entity_cleanup(&imgu_sd->subdev.entity);
return r; return r;
...@@ -1236,8 +1179,8 @@ static int imgu_v4l2_node_setup(struct imgu_device *imgu, unsigned int pipe, ...@@ -1236,8 +1179,8 @@ static int imgu_v4l2_node_setup(struct imgu_device *imgu, unsigned int pipe,
} }
/* Initialize vdev */ /* Initialize vdev */
snprintf(vdev->name, sizeof(vdev->name), "%s %u %s", snprintf(vdev->name, sizeof(vdev->name), "%s %s %s",
IMGU_NAME, pipe, node->name); IMGU_NAME, pipe ? "still" : "video", node->name);
vdev->release = video_device_release_empty; vdev->release = video_device_release_empty;
vdev->fops = &imgu_v4l2_fops; vdev->fops = &imgu_v4l2_fops;
vdev->lock = &node->lock; vdev->lock = &node->lock;
...@@ -1312,7 +1255,6 @@ static void imgu_v4l2_subdev_cleanup(struct imgu_device *imgu, unsigned int i) ...@@ -1312,7 +1255,6 @@ static void imgu_v4l2_subdev_cleanup(struct imgu_device *imgu, unsigned int i)
struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[i]; struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[i];
v4l2_device_unregister_subdev(&imgu_pipe->imgu_sd.subdev); v4l2_device_unregister_subdev(&imgu_pipe->imgu_sd.subdev);
v4l2_ctrl_handler_free(imgu_pipe->imgu_sd.subdev.ctrl_handler);
media_entity_cleanup(&imgu_pipe->imgu_sd.subdev.entity); media_entity_cleanup(&imgu_pipe->imgu_sd.subdev.entity);
} }
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <linux/iova.h> #include <linux/iova.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/videobuf2-dma-sg.h> #include <media/videobuf2-dma-sg.h>
...@@ -96,9 +95,7 @@ struct imgu_v4l2_subdev { ...@@ -96,9 +95,7 @@ struct imgu_v4l2_subdev {
struct v4l2_rect bds; /* bayer-domain scaled resolution*/ struct v4l2_rect bds; /* bayer-domain scaled resolution*/
struct v4l2_rect gdc; /* gdc output resolution */ struct v4l2_rect gdc; /* gdc output resolution */
} rect; } rect;
struct v4l2_ctrl_handler ctrl_handler; unsigned int running_mode;
struct v4l2_ctrl *ctrl;
atomic_t running_mode;
bool active; bool active;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment