aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2016-12-09 06:47:17 -0500
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-12-21 04:28:20 -0500
commitaff808e813fc2d311137754165cf53d4ee6ddcc2 (patch)
tree4918cac1f2669a3bf0560fe3f19a7ce33c410af5
parent48775cb73c2e26b7ca9d679875a6e570c8b8e124 (diff)
[media] v4l: tvp5150: Reset device at probe time, not in get/set format handlers
The tvp5150 doesn't support format setting through the subdev pad API and thus implements the set format handler as a get format operation. The single handler, tvp5150_fill_fmt(), resets the device by calling tvp5150_reset(). This causes malfunction as the device can be reset at will, possibly from userspace when the subdev userspace API is enabled. The reset call was added in commit ec2c4f3f93cb ("[media] media: tvp5150: Add mbus_fmt callbacks"), probably as an attempt to set the device to a known state before detecting the current TV standard. However, the get format handler doesn't access the hardware to get the TV standard since commit 963ddc63e20d ("[media] media: tvp5150: Add cropping support"). There is thus no need to reset the device when getting the format. However, removing the tvp5150_reset() from the get/set format handlers results in the function not being called at all if the bridge driver doesn't use the .reset() operation. The operation is nowadays abused and shouldn't be used, so shouldn't expect bridge drivers to call it. To make sure the device is properly initialize, move the reset call from the format handlers to the probe function. Cc: stable@vger.kernel.org # For Kernel 4.5 and upper Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r--drivers/media/i2c/tvp5150.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
index 3a0fe8cc64e9..a30bfcb4eec6 100644
--- a/drivers/media/i2c/tvp5150.c
+++ b/drivers/media/i2c/tvp5150.c
@@ -861,8 +861,6 @@ static int tvp5150_fill_fmt(struct v4l2_subdev *sd,
861 861
862 f = &format->format; 862 f = &format->format;
863 863
864 tvp5150_reset(sd, 0);
865
866 f->width = decoder->rect.width; 864 f->width = decoder->rect.width;
867 f->height = decoder->rect.height / 2; 865 f->height = decoder->rect.height / 2;
868 866
@@ -1524,7 +1522,6 @@ static int tvp5150_probe(struct i2c_client *c,
1524 res = core->hdl.error; 1522 res = core->hdl.error;
1525 goto err; 1523 goto err;
1526 } 1524 }
1527 v4l2_ctrl_handler_setup(&core->hdl);
1528 1525
1529 /* Default is no cropping */ 1526 /* Default is no cropping */
1530 core->rect.top = 0; 1527 core->rect.top = 0;
@@ -1535,6 +1532,8 @@ static int tvp5150_probe(struct i2c_client *c,
1535 core->rect.left = 0; 1532 core->rect.left = 0;
1536 core->rect.width = TVP5150_H_MAX; 1533 core->rect.width = TVP5150_H_MAX;
1537 1534
1535 tvp5150_reset(sd, 0); /* Calls v4l2_ctrl_handler_setup() */
1536
1538 res = v4l2_async_register_subdev(sd); 1537 res = v4l2_async_register_subdev(sd);
1539 if (res < 0) 1538 if (res < 0)
1540 goto err; 1539 goto err;