[media] marvell-ccic: fill in colorspace
[deliverable/linux.git] / drivers / media / platform / marvell-ccic / mcam-core.c
index dd5b1415f97444103835c677fc1cde879876fe8c..7e54cef09d54f039a5f55539ed6851926961100c 100644 (file)
@@ -188,6 +188,7 @@ static const struct v4l2_pix_format mcam_def_pix_format = {
        .field          = V4L2_FIELD_NONE,
        .bytesperline   = VGA_WIDTH*2,
        .sizeimage      = VGA_WIDTH*VGA_HEIGHT*2,
+       .colorspace     = V4L2_COLORSPACE_SRGB,
 };
 
 static const u32 mcam_def_mbus_code = MEDIA_BUS_FMT_YUYV8_2X8;
@@ -1246,6 +1247,7 @@ static int mcam_setup_vb2(struct mcam_camera *cam)
        vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        vq->drv_priv = cam;
        vq->lock = &cam->s_mutex;
+       vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
        INIT_LIST_HEAD(&cam->buffers);
        switch (cam->buffer_mode) {
        case B_DMA_contig:
@@ -1387,8 +1389,11 @@ static int mcam_vidioc_dqbuf(struct file *filp, void *priv,
 static int mcam_vidioc_querycap(struct file *file, void *priv,
                struct v4l2_capability *cap)
 {
+       struct mcam_camera *cam = priv;
+
        strcpy(cap->driver, "marvell_ccic");
        strcpy(cap->card, "marvell_ccic");
+       strlcpy(cap->bus_info, cam->bus_info, sizeof(cap->bus_info));
        cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
                V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
        cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
@@ -1433,6 +1438,7 @@ static int mcam_vidioc_try_fmt_vid_cap(struct file *filp, void *priv,
                break;
        }
        pix->sizeimage = pix->height * pix->bytesperline;
+       pix->colorspace = V4L2_COLORSPACE_SRGB;
        return ret;
 }
 
@@ -1504,7 +1510,6 @@ static int mcam_vidioc_enum_input(struct file *filp, void *priv,
                return -EINVAL;
 
        input->type = V4L2_INPUT_TYPE_CAMERA;
-       input->std = V4L2_STD_ALL; /* Not sure what should go here */
        strcpy(input->name, "Camera");
        return 0;
 }
@@ -1522,18 +1527,6 @@ static int mcam_vidioc_s_input(struct file *filp, void *priv, unsigned int i)
        return 0;
 }
 
-/* from vivi.c */
-static int mcam_vidioc_s_std(struct file *filp, void *priv, v4l2_std_id a)
-{
-       return 0;
-}
-
-static int mcam_vidioc_g_std(struct file *filp, void *priv, v4l2_std_id *a)
-{
-       *a = V4L2_STD_NTSC_M;
-       return 0;
-}
-
 /*
  * G/S_PARM.  Most of this is done by the sensor, but we are
  * the level which controls the number of read buffers.
@@ -1568,24 +1561,64 @@ static int mcam_vidioc_enum_framesizes(struct file *filp, void *priv,
                struct v4l2_frmsizeenum *sizes)
 {
        struct mcam_camera *cam = priv;
+       struct mcam_format_struct *f;
+       struct v4l2_subdev_frame_size_enum fse = {
+               .index = sizes->index,
+               .which = V4L2_SUBDEV_FORMAT_ACTIVE,
+       };
        int ret;
 
+       f = mcam_find_format(sizes->pixel_format);
+       if (f->pixelformat != sizes->pixel_format)
+               return -EINVAL;
+       fse.code = f->mbus_code;
        mutex_lock(&cam->s_mutex);
-       ret = sensor_call(cam, video, enum_framesizes, sizes);
+       ret = sensor_call(cam, pad, enum_frame_size, NULL, &fse);
        mutex_unlock(&cam->s_mutex);
-       return ret;
+       if (ret)
+               return ret;
+       if (fse.min_width == fse.max_width &&
+           fse.min_height == fse.max_height) {
+               sizes->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+               sizes->discrete.width = fse.min_width;
+               sizes->discrete.height = fse.min_height;
+               return 0;
+       }
+       sizes->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
+       sizes->stepwise.min_width = fse.min_width;
+       sizes->stepwise.max_width = fse.max_width;
+       sizes->stepwise.min_height = fse.min_height;
+       sizes->stepwise.max_height = fse.max_height;
+       sizes->stepwise.step_width = 1;
+       sizes->stepwise.step_height = 1;
+       return 0;
 }
 
 static int mcam_vidioc_enum_frameintervals(struct file *filp, void *priv,
                struct v4l2_frmivalenum *interval)
 {
        struct mcam_camera *cam = priv;
+       struct mcam_format_struct *f;
+       struct v4l2_subdev_frame_interval_enum fie = {
+               .index = interval->index,
+               .width = interval->width,
+               .height = interval->height,
+               .which = V4L2_SUBDEV_FORMAT_ACTIVE,
+       };
        int ret;
 
+       f = mcam_find_format(interval->pixel_format);
+       if (f->pixelformat != interval->pixel_format)
+               return -EINVAL;
+       fie.code = f->mbus_code;
        mutex_lock(&cam->s_mutex);
-       ret = sensor_call(cam, video, enum_frameintervals, interval);
+       ret = sensor_call(cam, pad, enum_frame_interval, NULL, &fie);
        mutex_unlock(&cam->s_mutex);
-       return ret;
+       if (ret)
+               return ret;
+       interval->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+       interval->discrete = fie.interval;
+       return 0;
 }
 
 #ifdef CONFIG_VIDEO_ADV_DEBUG
@@ -1622,8 +1655,6 @@ static const struct v4l2_ioctl_ops mcam_v4l_ioctl_ops = {
        .vidioc_enum_input      = mcam_vidioc_enum_input,
        .vidioc_g_input         = mcam_vidioc_g_input,
        .vidioc_s_input         = mcam_vidioc_s_input,
-       .vidioc_s_std           = mcam_vidioc_s_std,
-       .vidioc_g_std           = mcam_vidioc_g_std,
        .vidioc_reqbufs         = mcam_vidioc_reqbufs,
        .vidioc_querybuf        = mcam_vidioc_querybuf,
        .vidioc_qbuf            = mcam_vidioc_qbuf,
This page took 0.085576 seconds and 5 git commands to generate.