Tegra20 can do horizontal and vertical image flip, but Tegra210 cannot
(either the hardware, or this driver).

In preparation to adding Tegra20 support, add a flag in struct tegra_vi_soc
so the generic vi.c code knows whether the flip controls should be added or
not.

Also provide a generic implementation that simply sets two flags in the
channel struct. The Tegra20 implementation will enable flipping at stream
start based on those flags.

Signed-off-by: Luca Ceresoli <luca.ceres...@bootlin.com>
Reviewed-by: Dmitry Osipenko <dig...@gmail.com>

---

No changes in v6

Changed in v5:
 - Fixed typo in comment

Changed in v4:
 - Added review tags

No changes in v3
No changes in v2
---
 drivers/staging/media/tegra-video/vi.c | 14 +++++++++++++-
 drivers/staging/media/tegra-video/vi.h |  8 ++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/media/tegra-video/vi.c 
b/drivers/staging/media/tegra-video/vi.c
index 5ab24977ec46..39e9df895ede 100644
--- a/drivers/staging/media/tegra-video/vi.c
+++ b/drivers/staging/media/tegra-video/vi.c
@@ -30,7 +30,7 @@
 #include "vi.h"
 #include "video.h"
 
-#define MAX_CID_CONTROLS               1
+#define MAX_CID_CONTROLS               3
 
 /**
  * struct tegra_vi_graph_entity - Entity in the video graph
@@ -910,6 +910,12 @@ static int vi_s_ctrl(struct v4l2_ctrl *ctrl)
        case V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY:
                chan->syncpt_timeout_retry = ctrl->val;
                break;
+       case V4L2_CID_HFLIP:
+               chan->hflip = ctrl->val;
+               break;
+       case V4L2_CID_VFLIP:
+               chan->vflip = ctrl->val;
+               break;
        default:
                return -EINVAL;
        }
@@ -981,6 +987,12 @@ static int tegra_channel_setup_ctrl_handler(struct 
tegra_vi_channel *chan)
                v4l2_ctrl_handler_free(&chan->ctrl_handler);
                return ret;
        }
+
+       if (chan->vi->soc->has_h_v_flip) {
+               v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, 
V4L2_CID_HFLIP, 0, 1, 1, 0);
+               v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, 
V4L2_CID_VFLIP, 0, 1, 1, 0);
+       }
+
 #endif
 
        /* setup the controls */
diff --git a/drivers/staging/media/tegra-video/vi.h 
b/drivers/staging/media/tegra-video/vi.h
index cadf80b742a8..778c0ec475ab 100644
--- a/drivers/staging/media/tegra-video/vi.h
+++ b/drivers/staging/media/tegra-video/vi.h
@@ -74,6 +74,7 @@ struct tegra_vi_ops {
  * @hw_revision: VI hw_revision
  * @vi_max_channels: supported max streaming channels
  * @vi_max_clk_hz: VI clock max frequency
+ * @has_h_v_flip: the chip can do H and V flip, and the driver implements it
  */
 struct tegra_vi_soc {
        const struct tegra_video_format *video_formats;
@@ -83,6 +84,7 @@ struct tegra_vi_soc {
        u32 hw_revision;
        unsigned int vi_max_channels;
        unsigned int vi_max_clk_hz;
+       bool has_h_v_flip:1;
 };
 
 /**
@@ -172,6 +174,9 @@ struct tegra_vi {
  * @tpg_fmts_bitmap: a bitmap for supported TPG formats
  * @pg_mode: test pattern generator mode (disabled/direct/patch)
  * @notifier: V4L2 asynchronous subdevs notifier
+ *
+ * @hflip: Horizontal flip is enabled
+ * @vflip: Vertical flip is enabled
  */
 struct tegra_vi_channel {
        struct list_head list;
@@ -222,6 +227,9 @@ struct tegra_vi_channel {
        enum tegra_vi_pg_mode pg_mode;
 
        struct v4l2_async_notifier notifier;
+
+       bool hflip:1;
+       bool vflip:1;
 };
 
 /**
-- 
2.34.1

Reply via email to