Skip to content

Commit

Permalink
media: add video control handlers using V4L2 control framework
Browse files Browse the repository at this point in the history
This patch registers four standard control handlers using the corresponding
V4L2 framework.

Signed-off-by: Florian Echtler <floe@butterbrot.org>
[hans.verkuil@cisco.com: lower-cased 0x0F and 0xF0]
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
  • Loading branch information
Florian Echtler authored and Mauro Carvalho Chehab committed Feb 14, 2018
1 parent bbc0c4e commit cee1e3e
Showing 1 changed file with 64 additions and 0 deletions.
64 changes: 64 additions & 0 deletions drivers/input/touchscreen/sur40.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <media/v4l2-device.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-ctrls.h>
#include <media/videobuf2-v4l2.h>
#include <media/videobuf2-dma-sg.h>

Expand Down Expand Up @@ -215,6 +216,7 @@ struct sur40_state {
struct video_device vdev;
struct mutex lock;
struct v4l2_pix_format pix_fmt;
struct v4l2_ctrl_handler hdl;

struct vb2_queue queue;
struct list_head buf_list;
Expand All @@ -224,6 +226,7 @@ struct sur40_state {
struct sur40_data *bulk_in_buffer;
size_t bulk_in_size;
u8 bulk_in_epaddr;
u8 vsvideo;

char phys[64];
};
Expand All @@ -237,6 +240,11 @@ struct sur40_buffer {
static const struct video_device sur40_video_device;
static const struct vb2_queue sur40_queue;
static void sur40_process_video(struct sur40_state *sur40);
static int sur40_s_ctrl(struct v4l2_ctrl *ctrl);

static const struct v4l2_ctrl_ops sur40_ctrl_ops = {
.s_ctrl = sur40_s_ctrl,
};

/*
* Note: an earlier, non-public version of this driver used USB_RECIP_ENDPOINT
Expand Down Expand Up @@ -743,6 +751,36 @@ static int sur40_probe(struct usb_interface *interface,
sur40->vdev.queue = &sur40->queue;
video_set_drvdata(&sur40->vdev, sur40);

/* initialize the control handler for 4 controls */
v4l2_ctrl_handler_init(&sur40->hdl, 4);
sur40->v4l2.ctrl_handler = &sur40->hdl;
sur40->vsvideo = (SUR40_CONTRAST_DEF << 4) | SUR40_GAIN_DEF;

v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_BRIGHTNESS,
SUR40_BRIGHTNESS_MIN, SUR40_BRIGHTNESS_MAX, 1, clamp(brightness,
(uint)SUR40_BRIGHTNESS_MIN, (uint)SUR40_BRIGHTNESS_MAX));

v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_CONTRAST,
SUR40_CONTRAST_MIN, SUR40_CONTRAST_MAX, 1, clamp(contrast,
(uint)SUR40_CONTRAST_MIN, (uint)SUR40_CONTRAST_MAX));

v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_GAIN,
SUR40_GAIN_MIN, SUR40_GAIN_MAX, 1, clamp(gain,
(uint)SUR40_GAIN_MIN, (uint)SUR40_GAIN_MAX));

v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops,
V4L2_CID_BACKLIGHT_COMPENSATION, SUR40_BACKLIGHT_MIN,
SUR40_BACKLIGHT_MAX, 1, SUR40_BACKLIGHT_DEF);

v4l2_ctrl_handler_setup(&sur40->hdl);

if (sur40->hdl.error) {
dev_err(&interface->dev,
"Unable to register video controls.");
v4l2_ctrl_handler_free(&sur40->hdl);
goto err_unreg_v4l2;
}

error = video_register_device(&sur40->vdev, VFL_TYPE_TOUCH, -1);
if (error) {
dev_err(&interface->dev,
Expand Down Expand Up @@ -775,6 +813,7 @@ static void sur40_disconnect(struct usb_interface *interface)
{
struct sur40_state *sur40 = usb_get_intfdata(interface);

v4l2_ctrl_handler_free(&sur40->hdl);
video_unregister_device(&sur40->vdev);
v4l2_device_unregister(&sur40->v4l2);

Expand Down Expand Up @@ -968,6 +1007,31 @@ static int sur40_vidioc_g_fmt(struct file *file, void *priv,
return 0;
}

static int sur40_s_ctrl(struct v4l2_ctrl *ctrl)
{
struct sur40_state *sur40 = container_of(ctrl->handler,
struct sur40_state, hdl);
u8 value = sur40->vsvideo;

switch (ctrl->id) {
case V4L2_CID_BRIGHTNESS:
sur40_set_irlevel(sur40, ctrl->val);
break;
case V4L2_CID_CONTRAST:
value = (value & 0x0f) | (ctrl->val << 4);
sur40_set_vsvideo(sur40, value);
break;
case V4L2_CID_GAIN:
value = (value & 0xf0) | (ctrl->val);
sur40_set_vsvideo(sur40, value);
break;
case V4L2_CID_BACKLIGHT_COMPENSATION:
sur40_set_preprocessor(sur40, ctrl->val);
break;
}
return 0;
}

static int sur40_ioctl_parm(struct file *file, void *priv,
struct v4l2_streamparm *p)
{
Expand Down

0 comments on commit cee1e3e

Please sign in to comment.