Commit 64f5905e authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab

V4L/DVB (10080): soc-camera: readability improvements, more strict operations checks

Simplify multiple drivers by replacing f->fmt.pix.* with a single pointer
dereference, merge some needlessly broken lines, verify host and camera
operations pointers on registration.
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9414de39
...@@ -327,15 +327,17 @@ static int mt9m001_set_fmt(struct soc_camera_device *icd, ...@@ -327,15 +327,17 @@ static int mt9m001_set_fmt(struct soc_camera_device *icd,
static int mt9m001_try_fmt(struct soc_camera_device *icd, static int mt9m001_try_fmt(struct soc_camera_device *icd,
struct v4l2_format *f) struct v4l2_format *f)
{ {
if (f->fmt.pix.height < 32 + icd->y_skip_top) struct v4l2_pix_format *pix = &f->fmt.pix;
f->fmt.pix.height = 32 + icd->y_skip_top;
if (f->fmt.pix.height > 1024 + icd->y_skip_top) if (pix->height < 32 + icd->y_skip_top)
f->fmt.pix.height = 1024 + icd->y_skip_top; pix->height = 32 + icd->y_skip_top;
if (f->fmt.pix.width < 48) if (pix->height > 1024 + icd->y_skip_top)
f->fmt.pix.width = 48; pix->height = 1024 + icd->y_skip_top;
if (f->fmt.pix.width > 1280) if (pix->width < 48)
f->fmt.pix.width = 1280; pix->width = 48;
f->fmt.pix.width &= ~0x01; /* has to be even, unsure why was ~3 */ if (pix->width > 1280)
pix->width = 1280;
pix->width &= ~0x01; /* has to be even, unsure why was ~3 */
return 0; return 0;
} }
......
...@@ -503,10 +503,12 @@ static int mt9m111_set_fmt(struct soc_camera_device *icd, ...@@ -503,10 +503,12 @@ static int mt9m111_set_fmt(struct soc_camera_device *icd,
static int mt9m111_try_fmt(struct soc_camera_device *icd, static int mt9m111_try_fmt(struct soc_camera_device *icd,
struct v4l2_format *f) struct v4l2_format *f)
{ {
if (f->fmt.pix.height > MT9M111_MAX_HEIGHT) struct v4l2_pix_format *pix = &f->fmt.pix;
f->fmt.pix.height = MT9M111_MAX_HEIGHT;
if (f->fmt.pix.width > MT9M111_MAX_WIDTH) if (pix->height > MT9M111_MAX_HEIGHT)
f->fmt.pix.width = MT9M111_MAX_WIDTH; pix->height = MT9M111_MAX_HEIGHT;
if (pix->width > MT9M111_MAX_WIDTH)
pix->width = MT9M111_MAX_WIDTH;
return 0; return 0;
} }
......
...@@ -406,15 +406,17 @@ static int mt9v022_set_fmt(struct soc_camera_device *icd, ...@@ -406,15 +406,17 @@ static int mt9v022_set_fmt(struct soc_camera_device *icd,
static int mt9v022_try_fmt(struct soc_camera_device *icd, static int mt9v022_try_fmt(struct soc_camera_device *icd,
struct v4l2_format *f) struct v4l2_format *f)
{ {
if (f->fmt.pix.height < 32 + icd->y_skip_top) struct v4l2_pix_format *pix = &f->fmt.pix;
f->fmt.pix.height = 32 + icd->y_skip_top;
if (f->fmt.pix.height > 480 + icd->y_skip_top) if (pix->height < 32 + icd->y_skip_top)
f->fmt.pix.height = 480 + icd->y_skip_top; pix->height = 32 + icd->y_skip_top;
if (f->fmt.pix.width < 48) if (pix->height > 480 + icd->y_skip_top)
f->fmt.pix.width = 48; pix->height = 480 + icd->y_skip_top;
if (f->fmt.pix.width > 752) if (pix->width < 48)
f->fmt.pix.width = 752; pix->width = 48;
f->fmt.pix.width &= ~0x03; /* ? */ if (pix->width > 752)
pix->width = 752;
pix->width &= ~0x03; /* ? */
return 0; return 0;
} }
......
...@@ -240,8 +240,7 @@ static int pxa_videobuf_setup(struct videobuf_queue *vq, unsigned int *count, ...@@ -240,8 +240,7 @@ static int pxa_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
unsigned int *size) unsigned int *size)
{ {
struct soc_camera_device *icd = vq->priv_data; struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
dev_dbg(&icd->dev, "count=%d, size=%d\n", *count, *size); dev_dbg(&icd->dev, "count=%d, size=%d\n", *count, *size);
...@@ -267,8 +266,7 @@ static int pxa_videobuf_setup(struct videobuf_queue *vq, unsigned int *count, ...@@ -267,8 +266,7 @@ static int pxa_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
static void free_buffer(struct videobuf_queue *vq, struct pxa_buffer *buf) static void free_buffer(struct videobuf_queue *vq, struct pxa_buffer *buf)
{ {
struct soc_camera_device *icd = vq->priv_data; struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb); struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
int i; int i;
...@@ -344,8 +342,7 @@ static int pxa_videobuf_prepare(struct videobuf_queue *vq, ...@@ -344,8 +342,7 @@ static int pxa_videobuf_prepare(struct videobuf_queue *vq,
struct videobuf_buffer *vb, enum v4l2_field field) struct videobuf_buffer *vb, enum v4l2_field field)
{ {
struct soc_camera_device *icd = vq->priv_data; struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb); struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
int ret; int ret;
...@@ -464,8 +461,7 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq, ...@@ -464,8 +461,7 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq,
struct videobuf_buffer *vb) struct videobuf_buffer *vb)
{ {
struct soc_camera_device *icd = vq->priv_data; struct soc_camera_device *icd = vq->priv_data;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb); struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
struct pxa_buffer *active; struct pxa_buffer *active;
...@@ -915,8 +911,7 @@ static int test_platform_param(struct pxa_camera_dev *pcdev, ...@@ -915,8 +911,7 @@ static int test_platform_param(struct pxa_camera_dev *pcdev,
static int pxa_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt) static int pxa_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
{ {
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
unsigned long dw, bpp, bus_flags, camera_flags, common_flags; unsigned long dw, bpp, bus_flags, camera_flags, common_flags;
u32 cicr0, cicr1, cicr2, cicr3, cicr4 = 0; u32 cicr0, cicr1, cicr2, cicr3, cicr4 = 0;
...@@ -1298,8 +1293,7 @@ static int pxa_camera_querycap(struct soc_camera_host *ici, ...@@ -1298,8 +1293,7 @@ static int pxa_camera_querycap(struct soc_camera_host *ici,
static int pxa_camera_suspend(struct soc_camera_device *icd, pm_message_t state) static int pxa_camera_suspend(struct soc_camera_device *icd, pm_message_t state)
{ {
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
int i = 0, ret = 0; int i = 0, ret = 0;
...@@ -1317,8 +1311,7 @@ static int pxa_camera_suspend(struct soc_camera_device *icd, pm_message_t state) ...@@ -1317,8 +1311,7 @@ static int pxa_camera_suspend(struct soc_camera_device *icd, pm_message_t state)
static int pxa_camera_resume(struct soc_camera_device *icd) static int pxa_camera_resume(struct soc_camera_device *icd)
{ {
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv; struct pxa_camera_dev *pcdev = ici->priv;
int i = 0, ret = 0; int i = 0, ret = 0;
......
...@@ -98,8 +98,7 @@ static int soc_camera_try_fmt_vid_cap(struct file *file, void *priv, ...@@ -98,8 +98,7 @@ static int soc_camera_try_fmt_vid_cap(struct file *file, void *priv,
{ {
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
enum v4l2_field field; enum v4l2_field field;
int ret; int ret;
...@@ -163,8 +162,7 @@ static int soc_camera_reqbufs(struct file *file, void *priv, ...@@ -163,8 +162,7 @@ static int soc_camera_reqbufs(struct file *file, void *priv,
int ret; int ret;
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
WARN_ON(priv != file->private_data); WARN_ON(priv != file->private_data);
...@@ -388,8 +386,7 @@ static unsigned int soc_camera_poll(struct file *file, poll_table *pt) ...@@ -388,8 +386,7 @@ static unsigned int soc_camera_poll(struct file *file, poll_table *pt)
{ {
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
if (list_empty(&icf->vb_vidq.stream)) { if (list_empty(&icf->vb_vidq.stream)) {
dev_err(&icd->dev, "Trying to poll with no queued buffers!\n"); dev_err(&icd->dev, "Trying to poll with no queued buffers!\n");
...@@ -415,9 +412,9 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -415,9 +412,9 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
{ {
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent); struct v4l2_pix_format *pix = &f->fmt.pix;
__u32 pixfmt = f->fmt.pix.pixelformat; __u32 pixfmt = pix->pixelformat;
int ret; int ret;
struct v4l2_rect rect; struct v4l2_rect rect;
...@@ -429,9 +426,9 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -429,9 +426,9 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
rect.left = icd->x_current; rect.left = icd->x_current;
rect.top = icd->y_current; rect.top = icd->y_current;
rect.width = f->fmt.pix.width; rect.width = pix->width;
rect.height = f->fmt.pix.height; rect.height = pix->height;
ret = ici->ops->set_fmt(icd, f->fmt.pix.pixelformat, &rect); ret = ici->ops->set_fmt(icd, pix->pixelformat, &rect);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} else if (!icd->current_fmt || } else if (!icd->current_fmt ||
...@@ -443,7 +440,7 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -443,7 +440,7 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
icd->width = rect.width; icd->width = rect.width;
icd->height = rect.height; icd->height = rect.height;
icf->vb_vidq.field = f->fmt.pix.field; icf->vb_vidq.field = pix->field;
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
dev_warn(&icd->dev, "Attention! Wrong buf-type %d\n", dev_warn(&icd->dev, "Attention! Wrong buf-type %d\n",
f->type); f->type);
...@@ -479,16 +476,17 @@ static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv, ...@@ -479,16 +476,17 @@ static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
{ {
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct v4l2_pix_format *pix = &f->fmt.pix;
WARN_ON(priv != file->private_data); WARN_ON(priv != file->private_data);
f->fmt.pix.width = icd->width; pix->width = icd->width;
f->fmt.pix.height = icd->height; pix->height = icd->height;
f->fmt.pix.field = icf->vb_vidq.field; pix->field = icf->vb_vidq.field;
f->fmt.pix.pixelformat = icd->current_fmt->fourcc; pix->pixelformat = icd->current_fmt->fourcc;
f->fmt.pix.bytesperline = f->fmt.pix.width * pix->bytesperline = pix->width *
DIV_ROUND_UP(icd->current_fmt->depth, 8); DIV_ROUND_UP(icd->current_fmt->depth, 8);
f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; pix->sizeimage = pix->height * pix->bytesperline;
dev_dbg(&icd->dev, "current_fmt->fourcc: 0x%08x\n", dev_dbg(&icd->dev, "current_fmt->fourcc: 0x%08x\n",
icd->current_fmt->fourcc); icd->current_fmt->fourcc);
return 0; return 0;
...@@ -499,8 +497,7 @@ static int soc_camera_querycap(struct file *file, void *priv, ...@@ -499,8 +497,7 @@ static int soc_camera_querycap(struct file *file, void *priv,
{ {
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
WARN_ON(priv != file->private_data); WARN_ON(priv != file->private_data);
...@@ -651,8 +648,7 @@ static int soc_camera_s_crop(struct file *file, void *fh, ...@@ -651,8 +648,7 @@ static int soc_camera_s_crop(struct file *file, void *fh,
{ {
struct soc_camera_file *icf = file->private_data; struct soc_camera_file *icf = file->private_data;
struct soc_camera_device *icd = icf->icd; struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
int ret; int ret;
if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
...@@ -776,13 +772,9 @@ static int scan_add_device(struct soc_camera_device *icd) ...@@ -776,13 +772,9 @@ static int scan_add_device(struct soc_camera_device *icd)
static int soc_camera_probe(struct device *dev) static int soc_camera_probe(struct device *dev)
{ {
struct soc_camera_device *icd = to_soc_camera_dev(dev); struct soc_camera_device *icd = to_soc_camera_dev(dev);
struct soc_camera_host *ici = struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
to_soc_camera_host(icd->dev.parent);
int ret; int ret;
if (!icd->ops->probe)
return -ENODEV;
/* We only call ->add() here to activate and probe the camera. /* We only call ->add() here to activate and probe the camera.
* We shall ->remove() and deactivate it immediately afterwards. */ * We shall ->remove() and deactivate it immediately afterwards. */
ret = ici->ops->add(icd); ret = ici->ops->add(icd);
...@@ -863,7 +855,16 @@ int soc_camera_host_register(struct soc_camera_host *ici) ...@@ -863,7 +855,16 @@ int soc_camera_host_register(struct soc_camera_host *ici)
int ret; int ret;
struct soc_camera_host *ix; struct soc_camera_host *ix;
if (!ici->ops->init_videobuf || !ici->ops->add || !ici->ops->remove) if (!ici || !ici->ops ||
!ici->ops->try_fmt ||
!ici->ops->set_fmt ||
!ici->ops->set_bus_param ||
!ici->ops->querycap ||
!ici->ops->init_videobuf ||
!ici->ops->reqbufs ||
!ici->ops->add ||
!ici->ops->remove ||
!ici->ops->poll)
return -EINVAL; return -EINVAL;
/* Number might be equal to the platform device ID */ /* Number might be equal to the platform device ID */
...@@ -931,7 +932,16 @@ int soc_camera_device_register(struct soc_camera_device *icd) ...@@ -931,7 +932,16 @@ int soc_camera_device_register(struct soc_camera_device *icd)
struct soc_camera_device *ix; struct soc_camera_device *ix;
int num = -1, i; int num = -1, i;
if (!icd) if (!icd || !icd->ops ||
!icd->ops->probe ||
!icd->ops->init ||
!icd->ops->release ||
!icd->ops->start_capture ||
!icd->ops->stop_capture ||
!icd->ops->set_fmt ||
!icd->ops->try_fmt ||
!icd->ops->query_bus_param ||
!icd->ops->set_bus_param)
return -EINVAL; return -EINVAL;
for (i = 0; i < 256 && num < 0; i++) { for (i = 0; i < 256 && num < 0; i++) {
...@@ -953,7 +963,9 @@ int soc_camera_device_register(struct soc_camera_device *icd) ...@@ -953,7 +963,9 @@ int soc_camera_device_register(struct soc_camera_device *icd)
icd->dev.bus = &soc_camera_bus_type; icd->dev.bus = &soc_camera_bus_type;
dev_set_name(&icd->dev, "%u-%u", icd->iface, icd->devnum); dev_set_name(&icd->dev, "%u-%u", icd->iface, icd->devnum);
icd->dev.release = dummy_release; icd->dev.release = dummy_release;
icd->use_count = 0;
icd->host_priv = NULL;
return scan_add_device(icd); return scan_add_device(icd);
} }
......
...@@ -89,9 +89,10 @@ static int soc_camera_platform_try_fmt(struct soc_camera_device *icd, ...@@ -89,9 +89,10 @@ static int soc_camera_platform_try_fmt(struct soc_camera_device *icd,
struct v4l2_format *f) struct v4l2_format *f)
{ {
struct soc_camera_platform_info *p = soc_camera_platform_get_info(icd); struct soc_camera_platform_info *p = soc_camera_platform_get_info(icd);
struct v4l2_pix_format *pix = &f->fmt.pix;
f->fmt.pix.width = p->format.width; pix->width = p->format.width;
f->fmt.pix.height = p->format.height; pix->height = p->format.height;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment