summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorKuninori Morimoto <morimoto.kuninori@renesas.com>2008-12-29 06:04:16 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-30 09:40:28 -0200
commit6d75611231fb22dbce0019310a9f3dc66918317e (patch)
treeed6228f933a614e5e5c963b31938c6f2bf2348ab /drivers
parented922a892e535c14035210b5be328af1f49561c8 (diff)
V4L/DVB (10095): The failure of set_fmt is solved in tw9910
priv->scale is checked in start_capture. Therefore, it should be NULL if failing in set_fmt. This patch resolve this problem. Signed-off-by: Kuninori Morimoto <morimoto.kuninori@renesas.com> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/tw9910.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/media/video/tw9910.c b/drivers/media/video/tw9910.c
index 75cfde02d026..d5cdc4be1a35 100644
--- a/drivers/media/video/tw9910.c
+++ b/drivers/media/video/tw9910.c
@@ -651,7 +651,7 @@ static int tw9910_set_fmt(struct soc_camera_device *icd, __u32 pixfmt,
*/
priv->scale = tw9910_select_norm(icd, rect->width, rect->height);
if (!priv->scale)
- return ret;
+ goto tw9910_set_fmt_error;
/*
* reset hardware
@@ -659,7 +659,8 @@ static int tw9910_set_fmt(struct soc_camera_device *icd, __u32 pixfmt,
tw9910_reset(priv->client);
ret = tw9910_write_array(priv->client, tw9910_default_regs);
if (ret < 0)
- return ret;
+ goto tw9910_set_fmt_error;
+
/*
* set bus width
*/
@@ -669,7 +670,7 @@ static int tw9910_set_fmt(struct soc_camera_device *icd, __u32 pixfmt,
ret = tw9910_mask_set(priv->client, OPFORM, LEN, val);
if (ret < 0)
- return ret;
+ goto tw9910_set_fmt_error;
/*
* select MPOUT behavior
@@ -697,26 +698,35 @@ static int tw9910_set_fmt(struct soc_camera_device *icd, __u32 pixfmt,
ret = tw9910_mask_set(priv->client, VBICNTL, RTSEL_MASK, val);
if (ret < 0)
- return ret;
+ goto tw9910_set_fmt_error;
/*
* set scale
*/
ret = tw9910_set_scale(priv->client, priv->scale);
if (ret < 0)
- return ret;
+ goto tw9910_set_fmt_error;
/*
* set cropping
*/
ret = tw9910_set_cropping(priv->client, &tw9910_cropping_ctrl);
if (ret < 0)
- return ret;
+ goto tw9910_set_fmt_error;
/*
* set hsync
*/
ret = tw9910_set_hsync(priv->client, &tw9910_hsync_ctrl);
+ if (ret < 0)
+ goto tw9910_set_fmt_error;
+
+ return ret;
+
+tw9910_set_fmt_error:
+
+ tw9910_reset(priv->client);
+ priv->scale = NULL;
return ret;
}