OSDN Git Service

media: tvp5150: fix standard autodetection
authorPhilipp Zabel <p.zabel@pengutronix.de>
Thu, 28 Jun 2018 16:20:41 +0000 (12:20 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 17 Sep 2018 17:27:59 +0000 (13:27 -0400)
Make sure to not overwrite decoder->norm when setting the standard
in hardware, but only when instructed by V4L2 API calls.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/i2c/tvp5150.c

index d84dac3..82ecbbf 100644 (file)
@@ -736,8 +736,6 @@ static int tvp5150_set_std(struct v4l2_subdev *sd, v4l2_std_id std)
        struct tvp5150 *decoder = to_tvp5150(sd);
        int fmt = 0;
 
-       decoder->norm = std;
-
        /* First tests should be against specific std */
 
        if (std == V4L2_STD_NTSC_443) {
@@ -774,13 +772,37 @@ static int tvp5150_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
        else
                decoder->rect.height = TVP5150_V_MAX_OTHERS;
 
+       decoder->norm = std;
 
        return tvp5150_set_std(sd, std);
 }
 
+static v4l2_std_id tvp5150_read_std(struct v4l2_subdev *sd)
+{
+       int val = tvp5150_read(sd, TVP5150_STATUS_REG_5);
+
+       switch (val & 0x0F) {
+       case 0x01:
+               return V4L2_STD_NTSC;
+       case 0x03:
+               return V4L2_STD_PAL;
+       case 0x05:
+               return V4L2_STD_PAL_M;
+       case 0x07:
+               return V4L2_STD_PAL_N | V4L2_STD_PAL_Nc;
+       case 0x09:
+               return V4L2_STD_NTSC_443;
+       case 0xb:
+               return V4L2_STD_SECAM;
+       default:
+               return V4L2_STD_UNKNOWN;
+       }
+}
+
 static int tvp5150_reset(struct v4l2_subdev *sd, u32 val)
 {
        struct tvp5150 *decoder = to_tvp5150(sd);
+       v4l2_std_id std;
 
        /* Initializes TVP5150 to its default values */
        tvp5150_write_inittab(sd, tvp5150_init_default);
@@ -797,7 +819,13 @@ static int tvp5150_reset(struct v4l2_subdev *sd, u32 val)
        /* Initialize image preferences */
        v4l2_ctrl_handler_setup(&decoder->hdl);
 
-       tvp5150_set_std(sd, decoder->norm);
+       if (decoder->norm == V4L2_STD_ALL)
+               std = tvp5150_read_std(sd);
+       else
+               std = decoder->norm;
+
+       /* Disable autoswitch mode */
+       tvp5150_set_std(sd, std);
 
        if (decoder->mbus_type == V4L2_MBUS_PARALLEL)
                /* 8-bit 4:2:2 YUV with discrete sync output */
@@ -834,28 +862,6 @@ static int tvp5150_s_ctrl(struct v4l2_ctrl *ctrl)
        return -EINVAL;
 }
 
-static v4l2_std_id tvp5150_read_std(struct v4l2_subdev *sd)
-{
-       int val = tvp5150_read(sd, TVP5150_STATUS_REG_5);
-
-       switch (val & 0x0F) {
-       case 0x01:
-               return V4L2_STD_NTSC;
-       case 0x03:
-               return V4L2_STD_PAL;
-       case 0x05:
-               return V4L2_STD_PAL_M;
-       case 0x07:
-               return V4L2_STD_PAL_N | V4L2_STD_PAL_Nc;
-       case 0x09:
-               return V4L2_STD_NTSC_443;
-       case 0xb:
-               return V4L2_STD_SECAM;
-       default:
-               return V4L2_STD_UNKNOWN;
-       }
-}
-
 static void tvp5150_set_default(v4l2_std_id std, struct v4l2_rect *crop)
 {
        /* Default is no cropping */