Commit a45c39b8 authored by Sowjanya Komatineni's avatar Sowjanya Komatineni Committed by Mauro Carvalho Chehab

media: tegra-video: Add custom V4L2 control V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY

This patch adds custom V4L2 control for syncpt timeout retry to continue
capture on error for specified retries count through this control.

This is useful for HDMI-to-CSI bridge debug purposes like for hotplug scenarios
or for ignoring captures till HDMI input is stabilized.
Signed-off-by: default avatarSowjanya Komatineni <skomatineni@nvidia.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 2ac4035a
...@@ -454,6 +454,7 @@ static int chan_capture_kthread_start(void *data) ...@@ -454,6 +454,7 @@ static int chan_capture_kthread_start(void *data)
{ {
struct tegra_vi_channel *chan = data; struct tegra_vi_channel *chan = data;
struct tegra_channel_buffer *buf; struct tegra_channel_buffer *buf;
unsigned int retries = 0;
int err = 0; int err = 0;
while (1) { while (1) {
...@@ -483,8 +484,15 @@ static int chan_capture_kthread_start(void *data) ...@@ -483,8 +484,15 @@ static int chan_capture_kthread_start(void *data)
spin_unlock(&chan->start_lock); spin_unlock(&chan->start_lock);
err = tegra_channel_capture_frame(chan, buf); err = tegra_channel_capture_frame(chan, buf);
if (err) if (!err) {
retries = 0;
continue;
}
if (retries++ > chan->syncpt_timeout_retry)
vb2_queue_error(&chan->queue); vb2_queue_error(&chan->queue);
else
err = 0;
} }
return 0; return 0;
......
...@@ -956,7 +956,6 @@ static const struct v4l2_file_operations tegra_channel_fops = { ...@@ -956,7 +956,6 @@ static const struct v4l2_file_operations tegra_channel_fops = {
/* /*
* V4L2 control operations * V4L2 control operations
*/ */
#if IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)
static int vi_s_ctrl(struct v4l2_ctrl *ctrl) static int vi_s_ctrl(struct v4l2_ctrl *ctrl)
{ {
struct tegra_vi_channel *chan = container_of(ctrl->handler, struct tegra_vi_channel *chan = container_of(ctrl->handler,
...@@ -968,6 +967,9 @@ static int vi_s_ctrl(struct v4l2_ctrl *ctrl) ...@@ -968,6 +967,9 @@ static int vi_s_ctrl(struct v4l2_ctrl *ctrl)
/* pattern change takes effect on next stream */ /* pattern change takes effect on next stream */
chan->pg_mode = ctrl->val + 1; chan->pg_mode = ctrl->val + 1;
break; break;
case V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY:
chan->syncpt_timeout_retry = ctrl->val;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -979,10 +981,22 @@ static const struct v4l2_ctrl_ops vi_ctrl_ops = { ...@@ -979,10 +981,22 @@ static const struct v4l2_ctrl_ops vi_ctrl_ops = {
.s_ctrl = vi_s_ctrl, .s_ctrl = vi_s_ctrl,
}; };
#if IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)
static const char *const vi_pattern_strings[] = { static const char *const vi_pattern_strings[] = {
"Black/White Direct Mode", "Black/White Direct Mode",
"Color Patch Mode", "Color Patch Mode",
}; };
#else
static const struct v4l2_ctrl_config syncpt_timeout_ctrl = {
.ops = &vi_ctrl_ops,
.id = V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY,
.name = "Syncpt timeout retry",
.type = V4L2_CTRL_TYPE_INTEGER,
.min = 1,
.max = 10000,
.step = 1,
.def = 5,
};
#endif #endif
static int tegra_channel_setup_ctrl_handler(struct tegra_vi_channel *chan) static int tegra_channel_setup_ctrl_handler(struct tegra_vi_channel *chan)
...@@ -1004,6 +1018,16 @@ static int tegra_channel_setup_ctrl_handler(struct tegra_vi_channel *chan) ...@@ -1004,6 +1018,16 @@ static int tegra_channel_setup_ctrl_handler(struct tegra_vi_channel *chan)
#else #else
struct v4l2_subdev *subdev; struct v4l2_subdev *subdev;
/* custom control */
v4l2_ctrl_new_custom(&chan->ctrl_handler, &syncpt_timeout_ctrl, NULL);
if (chan->ctrl_handler.error) {
dev_err(chan->vi->dev, "failed to add %s ctrl handler: %d\n",
syncpt_timeout_ctrl.name,
chan->ctrl_handler.error);
v4l2_ctrl_handler_free(&chan->ctrl_handler);
return chan->ctrl_handler.error;
}
subdev = tegra_channel_get_remote_source_subdev(chan); subdev = tegra_channel_get_remote_source_subdev(chan);
if (!subdev) if (!subdev)
return -ENODEV; return -ENODEV;
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include "csi.h" #include "csi.h"
#define V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY (V4L2_CTRL_CLASS_CAMERA | 0x1001)
#define TEGRA_MIN_WIDTH 32U #define TEGRA_MIN_WIDTH 32U
#define TEGRA_MAX_WIDTH 32768U #define TEGRA_MAX_WIDTH 32768U
#define TEGRA_MIN_HEIGHT 32U #define TEGRA_MIN_HEIGHT 32U
...@@ -160,6 +162,7 @@ struct tegra_vi_graph_entity { ...@@ -160,6 +162,7 @@ struct tegra_vi_graph_entity {
* @of_node: device node of VI channel * @of_node: device node of VI channel
* *
* @ctrl_handler: V4L2 control handler of this video channel * @ctrl_handler: V4L2 control handler of this video channel
* @syncpt_timeout_retry: syncpt timeout retry count for the capture
* @fmts_bitmap: a bitmap for supported formats matching v4l2 subdev formats * @fmts_bitmap: a bitmap for supported formats matching v4l2 subdev formats
* @tpg_fmts_bitmap: a bitmap for supported TPG formats * @tpg_fmts_bitmap: a bitmap for supported TPG formats
* @pg_mode: test pattern generator mode (disabled/direct/patch) * @pg_mode: test pattern generator mode (disabled/direct/patch)
...@@ -201,6 +204,7 @@ struct tegra_vi_channel { ...@@ -201,6 +204,7 @@ struct tegra_vi_channel {
struct device_node *of_node; struct device_node *of_node;
struct v4l2_ctrl_handler ctrl_handler; struct v4l2_ctrl_handler ctrl_handler;
unsigned int syncpt_timeout_retry;
DECLARE_BITMAP(fmts_bitmap, MAX_FORMAT_NUM); DECLARE_BITMAP(fmts_bitmap, MAX_FORMAT_NUM);
DECLARE_BITMAP(tpg_fmts_bitmap, MAX_FORMAT_NUM); DECLARE_BITMAP(tpg_fmts_bitmap, MAX_FORMAT_NUM);
enum tegra_vi_pg_mode pg_mode; enum tegra_vi_pg_mode pg_mode;
......
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