summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2008-12-18 12:52:08 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-30 09:40:26 -0200
commit06daa1af4d207e93c9a8a3e54adef8635ba81c94 (patch)
treeca11a35ceab944222d99926c8ce50e470bb89565
parentccab8a29040b4b57a45f2150c9b6e6115ebdbc44 (diff)
downloadlinux-06daa1af4d207e93c9a8a3e54adef8635ba81c94.tar.gz
V4L/DVB (10090): soc-camera: let drivers decide upon supported field values
sh_mobile_ceu_camera.c is already prepared to support interlaced format, this
patch moves the choice of a field type down to host and / or camera drivers.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/pxa_camera.c10
-rw-r--r--drivers/media/video/soc_camera.c19
2 files changed, 11 insertions, 18 deletions
diff --git a/drivers/media/video/pxa_camera.c b/drivers/media/video/pxa_camera.c
index c3c50de0aa50..b2d9fe5dfd61 100644
--- a/drivers/media/video/pxa_camera.c
+++ b/drivers/media/video/pxa_camera.c
@@ -1215,6 +1215,7 @@ static int pxa_camera_try_fmt(struct soc_camera_device *icd,
 	const struct soc_camera_format_xlate *xlate;
 	struct v4l2_pix_format *pix = &f->fmt.pix;
 	__u32 pixfmt = pix->pixelformat;
+	enum v4l2_field field;
 	int ret;
 
 	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
@@ -1244,6 +1245,15 @@ static int pxa_camera_try_fmt(struct soc_camera_device *icd,
 	ret = icd->ops->try_fmt(icd, f);
 	pix->pixelformat = xlate->host_fmt->fourcc;
 
+	field = pix->field;
+
+	if (field == V4L2_FIELD_ANY) {
+		pix->field = V4L2_FIELD_NONE;
+	} else if (field != V4L2_FIELD_NONE) {
+		dev_err(&icd->dev, "Field type %d unsupported.\n", field);
+		return -EINVAL;
+	}
+
 	return ret;
 }
 
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c
index e86e6bda1b7f..90077cb4fe66 100644
--- a/drivers/media/video/soc_camera.c
+++ b/drivers/media/video/soc_camera.c
@@ -98,28 +98,11 @@ 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);
-	enum v4l2_field field;
-	int ret;
 
 	WARN_ON(priv != file->private_data);
 
-	/*
-	 * TODO: this might also have to migrate to host-drivers, if anyone
-	 * wishes to support other fields
-	 */
-	field = f->fmt.pix.field;
-
-	if (field == V4L2_FIELD_ANY) {
-		f->fmt.pix.field = V4L2_FIELD_NONE;
-	} else if (field != V4L2_FIELD_NONE) {
-		dev_err(&icd->dev, "Field type invalid.\n");
-		return -EINVAL;
-	}
-
 	/* limit format to hardware capabilities */
-	ret = ici->ops->try_fmt(icd, f);
-
-	return ret;
+	return ici->ops->try_fmt(icd, f);
 }
 
 static int soc_camera_enum_input(struct file *file, void *priv,