V4L/DVB (10095): The failure of set_fmt is solved in tw9910
authorKuninori Morimoto <morimoto.kuninori@renesas.com>
Mon, 29 Dec 2008 09:04:16 +0000 (06:04 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:40:28 +0000 (09:40 -0200)
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>
drivers/media/video/tw9910.c

index 75cfde02d0266e3b14ccdd26475fda39f223eeb0..d5cdc4be1a354e41d89e6c2de2b21648b0f0cfce 100644 (file)
@@ -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;
 }