Signed-off-by: Florian Echtler <f...@butterbrot.org>
---
 drivers/input/touchscreen/sur40.c | 114 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/drivers/input/touchscreen/sur40.c 
b/drivers/input/touchscreen/sur40.c
index 63c7264b..c4b7cf1 100644
--- a/drivers/input/touchscreen/sur40.c
+++ b/drivers/input/touchscreen/sur40.c
@@ -953,6 +953,119 @@ static int sur40_vidioc_g_fmt(struct file *file, void 
*priv,
        return 0;
 }
 
+
+static int sur40_vidioc_queryctrl(struct file *file, void *fh,
+                              struct v4l2_queryctrl *qc)
+{
+
+       switch (qc->id) {
+       case V4L2_CID_BRIGHTNESS:
+               qc->flags = 0;
+               sprintf(qc->name, "Brightness");
+               qc->type = V4L2_CTRL_TYPE_INTEGER;
+               qc->minimum = SUR40_BRIGHTNESS_MIN;
+               qc->default_value = SUR40_BRIGHTNESS_DEF;
+               qc->maximum = SUR40_BRIGHTNESS_MAX;
+               qc->step = 8;
+               return 0;
+       case V4L2_CID_CONTRAST:
+               qc->flags = 0;
+               sprintf(qc->name, "Contrast");
+               qc->type = V4L2_CTRL_TYPE_INTEGER;
+               qc->minimum = SUR40_CONTRAST_MIN;
+               qc->default_value = SUR40_CONTRAST_DEF;
+               qc->maximum = SUR40_CONTRAST_MAX;
+               qc->step = 1;
+               return 0;
+       case V4L2_CID_GAIN:
+               qc->flags = 0;
+               sprintf(qc->name, "Gain");
+               qc->type = V4L2_CTRL_TYPE_INTEGER;
+               qc->minimum = SUR40_GAIN_MIN;
+               qc->default_value = SUR40_GAIN_DEF;
+               qc->maximum = SUR40_GAIN_MAX;
+               qc->step = 1;
+               return 0;
+       case V4L2_CID_BACKLIGHT_COMPENSATION:
+               qc->flags = 0;
+               sprintf(qc->name, "Preprocessor");
+               qc->type = V4L2_CTRL_TYPE_INTEGER;
+               qc->minimum = SUR40_BACKLIGHT_MIN;
+               qc->default_value = SUR40_BACKLIGHT_DEF;
+               qc->maximum = SUR40_BACKLIGHT_MAX;
+               qc->step = 1;
+               return 0;
+       default:
+               qc->flags = V4L2_CTRL_FLAG_DISABLED;
+               return -EINVAL;
+       }
+}
+
+static int sur40_vidioc_g_ctrl(struct file *file, void *fh,
+                           struct v4l2_control *ctrl)
+{
+
+       switch (ctrl->id) {
+       case V4L2_CID_BRIGHTNESS:
+               ctrl->value = sur40_v4l2_brightness;
+               return 0;
+       case V4L2_CID_CONTRAST:
+               ctrl->value = sur40_v4l2_contrast;
+               return 0;
+       case V4L2_CID_GAIN:
+               ctrl->value = sur40_v4l2_gain;
+               return 0;
+       case V4L2_CID_BACKLIGHT_COMPENSATION:
+               ctrl->value = sur40_v4l2_backlight;
+               return 0;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int sur40_vidioc_s_ctrl(struct file *file, void *fh,
+                           struct v4l2_control *ctrl)
+{
+       u8 value = 0;
+       struct sur40_state *sur40 = video_drvdata(file);
+
+       switch (ctrl->id) {
+       case V4L2_CID_BRIGHTNESS:
+               sur40_v4l2_brightness = ctrl->value;
+               if (sur40_v4l2_brightness < SUR40_BRIGHTNESS_MIN)
+                       sur40_v4l2_brightness = SUR40_BRIGHTNESS_MIN;
+               else if (sur40_v4l2_brightness > SUR40_BRIGHTNESS_MAX)
+                       sur40_v4l2_brightness = SUR40_BRIGHTNESS_MAX;
+               sur40_set_irlevel(sur40, sur40_v4l2_brightness);
+               return 0;
+       case V4L2_CID_CONTRAST:
+               sur40_v4l2_contrast = ctrl->value;
+               if (sur40_v4l2_contrast < SUR40_CONTRAST_MIN)
+                       sur40_v4l2_contrast = SUR40_CONTRAST_MIN;
+               else if (sur40_v4l2_contrast > SUR40_CONTRAST_MAX)
+                       sur40_v4l2_contrast = SUR40_CONTRAST_MAX;
+               value = (sur40_v4l2_contrast << 4) + sur40_v4l2_gain;
+               sur40_set_vsvideo(sur40, value);
+               return 0;
+       case V4L2_CID_GAIN:
+               sur40_v4l2_gain = ctrl->value;
+               if (sur40_v4l2_gain < SUR40_GAIN_MIN)
+                       sur40_v4l2_gain = SUR40_GAIN_MIN;
+               else if (sur40_v4l2_gain > SUR40_GAIN_MAX)
+                       sur40_v4l2_gain = SUR40_GAIN_MAX;
+               value = (sur40_v4l2_contrast << 4) + sur40_v4l2_gain;
+               sur40_set_vsvideo(sur40, value);
+               return 0;
+       case V4L2_CID_BACKLIGHT_COMPENSATION:
+               sur40_v4l2_backlight = ctrl->value;
+               sur40_set_preprocessor(sur40, sur40_v4l2_backlight);
+               return 0;
+       default:
+               return -EINVAL;
+       }
+}
+
+
 static int sur40_ioctl_parm(struct file *file, void *priv,
                            struct v4l2_streamparm *p)
 {
@@ -1071,6 +1181,10 @@ static const struct v4l2_ioctl_ops sur40_video_ioctl_ops 
= {
        .vidioc_g_input         = sur40_vidioc_g_input,
        .vidioc_s_input         = sur40_vidioc_s_input,
 
+       .vidioc_queryctrl       = sur40_vidioc_queryctrl,
+       .vidioc_g_ctrl          = sur40_vidioc_g_ctrl,
+       .vidioc_s_ctrl          = sur40_vidioc_s_ctrl,
+
        .vidioc_reqbufs         = vb2_ioctl_reqbufs,
        .vidioc_create_bufs     = vb2_ioctl_create_bufs,
        .vidioc_querybuf        = vb2_ioctl_querybuf,
-- 
2.7.4

Reply via email to