]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/media/video/pxa_camera.c
V4L/DVB (9788): soc-camera: simplify naming
[mirror_ubuntu-bionic-kernel.git] / drivers / media / video / pxa_camera.c
index eb6be580292899ed8a6b5d0fa41b204f52d9f07d..665eef236f5bba39e50c64356a891348cd27d496 100644 (file)
@@ -904,15 +904,46 @@ static int pxa_camera_try_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
        return soc_camera_bus_param_compatible(camera_flags, bus_flags) ? 0 : -EINVAL;
 }
 
-static int pxa_camera_set_fmt_cap(struct soc_camera_device *icd,
-                                 __u32 pixfmt, struct v4l2_rect *rect)
+static int pxa_camera_set_fmt(struct soc_camera_device *icd,
+                             __u32 pixfmt, struct v4l2_rect *rect)
 {
-       return icd->ops->set_fmt_cap(icd, pixfmt, rect);
+       const struct soc_camera_data_format *cam_fmt;
+       int ret;
+
+       /*
+        * TODO: find a suitable supported by the SoC output format, check
+        * whether the sensor supports one of acceptable input formats.
+        */
+       if (pixfmt) {
+               cam_fmt = soc_camera_format_by_fourcc(icd, pixfmt);
+               if (!cam_fmt)
+                       return -EINVAL;
+       }
+
+       ret = icd->ops->set_fmt(icd, pixfmt, rect);
+       if (pixfmt && !ret)
+               icd->current_fmt = cam_fmt;
+
+       return ret;
 }
 
-static int pxa_camera_try_fmt_cap(struct soc_camera_device *icd,
-                                 struct v4l2_format *f)
+static int pxa_camera_try_fmt(struct soc_camera_device *icd,
+                             struct v4l2_format *f)
 {
+       const struct soc_camera_data_format *cam_fmt;
+       int ret = pxa_camera_try_bus_param(icd, f->fmt.pix.pixelformat);
+
+       if (ret < 0)
+               return ret;
+
+       /*
+        * TODO: find a suitable supported by the SoC output format, check
+        * whether the sensor supports one of acceptable input formats.
+        */
+       cam_fmt = soc_camera_format_by_fourcc(icd, f->fmt.pix.pixelformat);
+       if (!cam_fmt)
+               return -EINVAL;
+
        /* limit to pxa hardware capabilities */
        if (f->fmt.pix.height < 32)
                f->fmt.pix.height = 32;
@@ -924,8 +955,12 @@ static int pxa_camera_try_fmt_cap(struct soc_camera_device *icd,
                f->fmt.pix.width = 2048;
        f->fmt.pix.width &= ~0x01;
 
+       f->fmt.pix.bytesperline = f->fmt.pix.width *
+               DIV_ROUND_UP(cam_fmt->depth, 8);
+       f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
+
        /* limit to sensor capabilities */
-       return icd->ops->try_fmt_cap(icd, f);
+       return icd->ops->try_fmt(icd, f);
 }
 
 static int pxa_camera_reqbufs(struct soc_camera_file *icf,
@@ -1033,13 +1068,12 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
        .remove         = pxa_camera_remove_device,
        .suspend        = pxa_camera_suspend,
        .resume         = pxa_camera_resume,
-       .set_fmt_cap    = pxa_camera_set_fmt_cap,
-       .try_fmt_cap    = pxa_camera_try_fmt_cap,
+       .set_fmt        = pxa_camera_set_fmt,
+       .try_fmt        = pxa_camera_try_fmt,
        .init_videobuf  = pxa_camera_init_videobuf,
        .reqbufs        = pxa_camera_reqbufs,
        .poll           = pxa_camera_poll,
        .querycap       = pxa_camera_querycap,
-       .try_bus_param  = pxa_camera_try_bus_param,
        .set_bus_param  = pxa_camera_set_bus_param,
 };