Re: [PATCH 3/4] soc-camera: add support for camera-host controls

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Guennadi,

It's a very interesting patch. Actually some camera interfaces support
for various image effects and I was wondering how to use them in SoC
camera subsystem.

But here is a question. Is it possible to make a choice with the same
CID between icd and ici? I mean, if both of camera interface and
camera device are supporting for same CID how can user select any of
them to use? Sometimes, some image effects supported by camera
interface are not good so I want to use the same effect supported by
external camera ISP device.

I think, it might be possible but I can't see how.
Cheers,

Nate

On Thu, Jun 11, 2009 at 4:12 PM, Guennadi
Liakhovetski<g.liakhovetski@xxxxxx> wrote:
> Until now soc-camera only supported client (sensor) controls. This patch
> enables camera-host drivers to implement their own controls too.
>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@xxxxxx>
> ---
>  drivers/media/video/soc_camera.c |   24 ++++++++++++++++++++++++
>  include/media/soc_camera.h       |    4 ++++
>  2 files changed, 28 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c
> index 824c68b..8e987ca 100644
> --- a/drivers/media/video/soc_camera.c
> +++ b/drivers/media/video/soc_camera.c
> @@ -633,6 +633,7 @@ static int soc_camera_queryctrl(struct file *file, void *priv,
>  {
>        struct soc_camera_file *icf = file->private_data;
>        struct soc_camera_device *icd = icf->icd;
> +       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
>        int i;
>
>        WARN_ON(priv != file->private_data);
> @@ -640,6 +641,15 @@ static int soc_camera_queryctrl(struct file *file, void *priv,
>        if (!qc->id)
>                return -EINVAL;
>
> +       /* First check host controls */
> +       for (i = 0; i < ici->ops->num_controls; i++)
> +               if (qc->id == ici->ops->controls[i].id) {
> +                       memcpy(qc, &(ici->ops->controls[i]),
> +                               sizeof(*qc));
> +                       return 0;
> +               }
> +
> +       /* Then device controls */
>        for (i = 0; i < icd->ops->num_controls; i++)
>                if (qc->id == icd->ops->controls[i].id) {
>                        memcpy(qc, &(icd->ops->controls[i]),
> @@ -656,6 +666,7 @@ static int soc_camera_g_ctrl(struct file *file, void *priv,
>        struct soc_camera_file *icf = file->private_data;
>        struct soc_camera_device *icd = icf->icd;
>        struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
> +       int ret;
>
>        WARN_ON(priv != file->private_data);
>
> @@ -672,6 +683,12 @@ static int soc_camera_g_ctrl(struct file *file, void *priv,
>                return 0;
>        }
>
> +       if (ici->ops->get_ctrl) {
> +               ret = ici->ops->get_ctrl(icd, ctrl);
> +               if (ret != -ENOIOCTLCMD)
> +                       return ret;
> +       }
> +
>        return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, g_ctrl, ctrl);
>  }
>
> @@ -681,9 +698,16 @@ static int soc_camera_s_ctrl(struct file *file, void *priv,
>        struct soc_camera_file *icf = file->private_data;
>        struct soc_camera_device *icd = icf->icd;
>        struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
> +       int ret;
>
>        WARN_ON(priv != file->private_data);
>
> +       if (ici->ops->set_ctrl) {
> +               ret = ici->ops->set_ctrl(icd, ctrl);
> +               if (ret != -ENOIOCTLCMD)
> +                       return ret;
> +       }
> +
>        return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, s_ctrl, ctrl);
>  }
>
> diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
> index 3bc5b6b..2d116bb 100644
> --- a/include/media/soc_camera.h
> +++ b/include/media/soc_camera.h
> @@ -83,7 +83,11 @@ struct soc_camera_host_ops {
>        int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *);
>        int (*querycap)(struct soc_camera_host *, struct v4l2_capability *);
>        int (*set_bus_param)(struct soc_camera_device *, __u32);
> +       int (*get_ctrl)(struct soc_camera_device *, struct v4l2_control *);
> +       int (*set_ctrl)(struct soc_camera_device *, struct v4l2_control *);
>        unsigned int (*poll)(struct file *, poll_table *);
> +       const struct v4l2_queryctrl *controls;
> +       int num_controls;
>  };
>
>  #define SOCAM_SENSOR_INVERT_PCLK       (1 << 0)
> --
> 1.6.2.4
>
>



-- 
=
DongSoo, Nathaniel Kim
Engineer
Mobile S/W Platform Lab.
Digital Media & Communications R&D Centre
Samsung Electronics CO., LTD.
e-mail : dongsoo.kim@xxxxxxxxx
          dongsoo45.kim@xxxxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux