Эх сурвалжийг харах

[media] v4l: vsp1: bru: Make the background color configurable

Expose the background color to userspace through the V4L2_CID_BG_COLOR
control.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Laurent Pinchart 11 жил өмнө
parent
commit
a16e279459

+ 46 - 5
drivers/media/platform/vsp1/vsp1_bru.c

@@ -37,6 +37,32 @@ static inline void vsp1_bru_write(struct vsp1_bru *bru, u32 reg, u32 data)
 	vsp1_write(bru->entity.vsp1, reg, data);
 	vsp1_write(bru->entity.vsp1, reg, data);
 }
 }
 
 
+/* -----------------------------------------------------------------------------
+ * Controls
+ */
+
+static int bru_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct vsp1_bru *bru =
+		container_of(ctrl->handler, struct vsp1_bru, ctrls);
+
+	if (!vsp1_entity_is_streaming(&bru->entity))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_BG_COLOR:
+		vsp1_bru_write(bru, VI6_BRU_VIRRPF_COL, ctrl->val |
+			       (0xff << VI6_BRU_VIRRPF_COL_A_SHIFT));
+		break;
+	}
+
+	return 0;
+}
+
+static const struct v4l2_ctrl_ops bru_ctrl_ops = {
+	.s_ctrl = bru_s_ctrl,
+};
+
 /* -----------------------------------------------------------------------------
 /* -----------------------------------------------------------------------------
  * V4L2 Subdevice Core Operations
  * V4L2 Subdevice Core Operations
  */
  */
@@ -48,6 +74,11 @@ static int bru_s_stream(struct v4l2_subdev *subdev, int enable)
 	struct v4l2_mbus_framefmt *format;
 	struct v4l2_mbus_framefmt *format;
 	unsigned int flags;
 	unsigned int flags;
 	unsigned int i;
 	unsigned int i;
+	int ret;
+
+	ret = vsp1_entity_set_streaming(&bru->entity, enable);
+	if (ret < 0)
+		return ret;
 
 
 	if (!enable)
 	if (!enable)
 		return 0;
 		return 0;
@@ -68,15 +99,11 @@ static int bru_s_stream(struct v4l2_subdev *subdev, int enable)
 		       flags & V4L2_PIX_FMT_FLAG_PREMUL_ALPHA ?
 		       flags & V4L2_PIX_FMT_FLAG_PREMUL_ALPHA ?
 		       0 : VI6_BRU_INCTRL_NRM);
 		       0 : VI6_BRU_INCTRL_NRM);
 
 
-	/* Set the background position to cover the whole output image and
-	 * set its color to opaque black.
-	 */
+	/* Set the background position to cover the whole output image. */
 	vsp1_bru_write(bru, VI6_BRU_VIRRPF_SIZE,
 	vsp1_bru_write(bru, VI6_BRU_VIRRPF_SIZE,
 		       (format->width << VI6_BRU_VIRRPF_SIZE_HSIZE_SHIFT) |
 		       (format->width << VI6_BRU_VIRRPF_SIZE_HSIZE_SHIFT) |
 		       (format->height << VI6_BRU_VIRRPF_SIZE_VSIZE_SHIFT));
 		       (format->height << VI6_BRU_VIRRPF_SIZE_VSIZE_SHIFT));
 	vsp1_bru_write(bru, VI6_BRU_VIRRPF_LOC, 0);
 	vsp1_bru_write(bru, VI6_BRU_VIRRPF_LOC, 0);
-	vsp1_bru_write(bru, VI6_BRU_VIRRPF_COL,
-		       0xff << VI6_BRU_VIRRPF_COL_A_SHIFT);
 
 
 	/* Route BRU input 1 as SRC input to the ROP unit and configure the ROP
 	/* Route BRU input 1 as SRC input to the ROP unit and configure the ROP
 	 * unit with a NOP operation to make BRU input 1 available as the
 	 * unit with a NOP operation to make BRU input 1 available as the
@@ -407,5 +434,19 @@ struct vsp1_bru *vsp1_bru_create(struct vsp1_device *vsp1)
 
 
 	vsp1_entity_init_formats(subdev, NULL);
 	vsp1_entity_init_formats(subdev, NULL);
 
 
+	/* Initialize the control handler. */
+	v4l2_ctrl_handler_init(&bru->ctrls, 1);
+	v4l2_ctrl_new_std(&bru->ctrls, &bru_ctrl_ops, V4L2_CID_BG_COLOR,
+			  0, 0xffffff, 1, 0);
+
+	bru->entity.subdev.ctrl_handler = &bru->ctrls;
+
+	if (bru->ctrls.error) {
+		dev_err(vsp1->dev, "bru: failed to initialize controls\n");
+		ret = bru->ctrls.error;
+		vsp1_entity_destroy(&bru->entity);
+		return ERR_PTR(ret);
+	}
+
 	return bru;
 	return bru;
 }
 }

+ 3 - 0
drivers/media/platform/vsp1/vsp1_bru.h

@@ -14,6 +14,7 @@
 #define __VSP1_BRU_H__
 #define __VSP1_BRU_H__
 
 
 #include <media/media-entity.h>
 #include <media/media-entity.h>
+#include <media/v4l2-ctrls.h>
 #include <media/v4l2-subdev.h>
 #include <media/v4l2-subdev.h>
 
 
 #include "vsp1_entity.h"
 #include "vsp1_entity.h"
@@ -27,6 +28,8 @@ struct vsp1_rwpf;
 struct vsp1_bru {
 struct vsp1_bru {
 	struct vsp1_entity entity;
 	struct vsp1_entity entity;
 
 
+	struct v4l2_ctrl_handler ctrls;
+
 	struct {
 	struct {
 		struct vsp1_rwpf *rpf;
 		struct vsp1_rwpf *rpf;
 		struct v4l2_rect compose;
 		struct v4l2_rect compose;