Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -327,15 +327,17 @@ static int mt9m001_set_fmt(struct soc_camera_device *icd,
static int mt9m001_try_fmt(struct soc_camera_device *icd,
			   struct v4l2_format *f)
{
	if (f->fmt.pix.height < 32 + icd->y_skip_top)
		f->fmt.pix.height = 32 + icd->y_skip_top;
	if (f->fmt.pix.height > 1024 + icd->y_skip_top)
		f->fmt.pix.height = 1024 + icd->y_skip_top;
	if (f->fmt.pix.width < 48)
		f->fmt.pix.width = 48;
	if (f->fmt.pix.width > 1280)
		f->fmt.pix.width = 1280;
	f->fmt.pix.width &= ~0x01; /* has to be even, unsure why was ~3 */
	struct v4l2_pix_format *pix = &f->fmt.pix;

	if (pix->height < 32 + icd->y_skip_top)
		pix->height = 32 + icd->y_skip_top;
	if (pix->height > 1024 + icd->y_skip_top)
		pix->height = 1024 + icd->y_skip_top;
	if (pix->width < 48)
		pix->width = 48;
	if (pix->width > 1280)
		pix->width = 1280;
	pix->width &= ~0x01; /* has to be even, unsure why was ~3 */

	return 0;
}
+6 −4
Original line number Diff line number Diff line
@@ -503,10 +503,12 @@ static int mt9m111_set_fmt(struct soc_camera_device *icd,
static int mt9m111_try_fmt(struct soc_camera_device *icd,
			   struct v4l2_format *f)
{
	if (f->fmt.pix.height > MT9M111_MAX_HEIGHT)
		f->fmt.pix.height = MT9M111_MAX_HEIGHT;
	if (f->fmt.pix.width > MT9M111_MAX_WIDTH)
		f->fmt.pix.width = MT9M111_MAX_WIDTH;
	struct v4l2_pix_format *pix = &f->fmt.pix;

	if (pix->height > MT9M111_MAX_HEIGHT)
		pix->height = MT9M111_MAX_HEIGHT;
	if (pix->width > MT9M111_MAX_WIDTH)
		pix->width = MT9M111_MAX_WIDTH;

	return 0;
}
+11 −9
Original line number Diff line number Diff line
@@ -406,15 +406,17 @@ static int mt9v022_set_fmt(struct soc_camera_device *icd,
static int mt9v022_try_fmt(struct soc_camera_device *icd,
			   struct v4l2_format *f)
{
	if (f->fmt.pix.height < 32 + icd->y_skip_top)
		f->fmt.pix.height = 32 + icd->y_skip_top;
	if (f->fmt.pix.height > 480 + icd->y_skip_top)
		f->fmt.pix.height = 480 + icd->y_skip_top;
	if (f->fmt.pix.width < 48)
		f->fmt.pix.width = 48;
	if (f->fmt.pix.width > 752)
		f->fmt.pix.width = 752;
	f->fmt.pix.width &= ~0x03; /* ? */
	struct v4l2_pix_format *pix = &f->fmt.pix;

	if (pix->height < 32 + icd->y_skip_top)
		pix->height = 32 + icd->y_skip_top;
	if (pix->height > 480 + icd->y_skip_top)
		pix->height = 480 + icd->y_skip_top;
	if (pix->width < 48)
		pix->width = 48;
	if (pix->width > 752)
		pix->width = 752;
	pix->width &= ~0x03; /* ? */

	return 0;
}
+7 −14
Original line number Diff line number Diff line
@@ -240,8 +240,7 @@ static int pxa_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
			      unsigned int *size)
{
	struct soc_camera_device *icd = vq->priv_data;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;

	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,
static void free_buffer(struct videobuf_queue *vq, struct pxa_buffer *buf)
{
	struct soc_camera_device *icd = vq->priv_data;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;
	struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
	int i;
@@ -344,8 +342,7 @@ static int pxa_videobuf_prepare(struct videobuf_queue *vq,
		struct videobuf_buffer *vb, enum v4l2_field field)
{
	struct soc_camera_device *icd = vq->priv_data;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;
	struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
	int ret;
@@ -464,8 +461,7 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq,
			       struct videobuf_buffer *vb)
{
	struct soc_camera_device *icd = vq->priv_data;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;
	struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
	struct pxa_buffer *active;
@@ -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)
{
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;
	unsigned long dw, bpp, bus_flags, camera_flags, common_flags;
	u32 cicr0, cicr1, cicr2, cicr3, cicr4 = 0;
@@ -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)
{
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;
	int i = 0, ret = 0;

@@ -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)
{
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct pxa_camera_dev *pcdev = ici->priv;
	int i = 0, ret = 0;

+43 −31
Original line number Diff line number Diff line
@@ -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_device *icd = icf->icd;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	enum v4l2_field field;
	int ret;

@@ -163,8 +162,7 @@ static int soc_camera_reqbufs(struct file *file, void *priv,
	int ret;
	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);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

	WARN_ON(priv != file->private_data);

@@ -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_device *icd = icf->icd;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

	if (list_empty(&icf->vb_vidq.stream)) {
		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,
{
	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);
	__u32 pixfmt = f->fmt.pix.pixelformat;
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct v4l2_pix_format *pix = &f->fmt.pix;
	__u32 pixfmt = pix->pixelformat;
	int ret;
	struct v4l2_rect rect;

@@ -429,9 +426,9 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,

	rect.left	= icd->x_current;
	rect.top	= icd->y_current;
	rect.width	= f->fmt.pix.width;
	rect.height	= f->fmt.pix.height;
	ret = ici->ops->set_fmt(icd, f->fmt.pix.pixelformat, &rect);
	rect.width	= pix->width;
	rect.height	= pix->height;
	ret = ici->ops->set_fmt(icd, pix->pixelformat, &rect);
	if (ret < 0) {
		return ret;
	} else if (!icd->current_fmt ||
@@ -443,7 +440,7 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,

	icd->width		= rect.width;
	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)
		dev_warn(&icd->dev, "Attention! Wrong buf-type %d\n",
			 f->type);
@@ -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_device *icd = icf->icd;
	struct v4l2_pix_format *pix = &f->fmt.pix;

	WARN_ON(priv != file->private_data);

	f->fmt.pix.width	= icd->width;
	f->fmt.pix.height	= icd->height;
	f->fmt.pix.field	= icf->vb_vidq.field;
	f->fmt.pix.pixelformat	= icd->current_fmt->fourcc;
	f->fmt.pix.bytesperline	= f->fmt.pix.width *
	pix->width		= icd->width;
	pix->height		= icd->height;
	pix->field		= icf->vb_vidq.field;
	pix->pixelformat	= icd->current_fmt->fourcc;
	pix->bytesperline	= pix->width *
		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",
		icd->current_fmt->fourcc);
	return 0;
@@ -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_device *icd = icf->icd;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

	WARN_ON(priv != file->private_data);

@@ -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_device *icd = icf->icd;
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	int ret;

	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
@@ -776,13 +772,9 @@ static int scan_add_device(struct soc_camera_device *icd)
static int soc_camera_probe(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
	struct soc_camera_host *ici =
		to_soc_camera_host(icd->dev.parent);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	int ret;

	if (!icd->ops->probe)
		return -ENODEV;

	/* We only call ->add() here to activate and probe the camera.
	 * We shall ->remove() and deactivate it immediately afterwards. */
	ret = ici->ops->add(icd);
@@ -863,7 +855,16 @@ int soc_camera_host_register(struct soc_camera_host *ici)
	int ret;
	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;

	/* Number might be equal to the platform device ID */
@@ -931,7 +932,16 @@ int soc_camera_device_register(struct soc_camera_device *icd)
	struct soc_camera_device *ix;
	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;

	for (i = 0; i < 256 && num < 0; i++) {
@@ -954,6 +964,8 @@ int soc_camera_device_register(struct soc_camera_device *icd)
	dev_set_name(&icd->dev, "%u-%u", icd->iface, icd->devnum);

	icd->dev.release	= dummy_release;
	icd->use_count		= 0;
	icd->host_priv		= NULL;

	return scan_add_device(icd);
}
Loading