| From 6a39f8a0373c45e9e6e2158535000f501950e9a3 Mon Sep 17 00:00:00 2001 |
| From: Janusz Krzysztofik <jmkrzyszt@gmail.com> |
| Date: Tue, 3 Sep 2019 17:11:43 -0300 |
| Subject: [PATCH] media: ov6650: Fix stored frame format not in sync with |
| hardware |
| |
| commit 3143b459de4cdcce67b36827476c966e93c1cf01 upstream. |
| |
| The driver stores frame format settings supposed to be in line with |
| hardware state in a device private structure. Since the driver initial |
| submission, those settings are updated before they are actually applied |
| on hardware. If an error occurs on device update, the stored settings |
| my not reflect hardware state anymore and consecutive calls to |
| .get_fmt() may return incorrect information. That in turn may affect |
| ability of a bridge device to use correct DMA transfer settings if such |
| incorrect informmation on active frame format returned by .get_fmt() is |
| used. |
| |
| Assuming a failed device update means its state hasn't changed, update |
| frame format related settings stored in the device private structure |
| only after they are successfully applied so the stored values always |
| reflect hardware state as closely as possible. |
| |
| Fixes: 2f6e2404799a ("[media] SoC Camera: add driver for OV6650 sensor") |
| Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com> |
| Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c |
| index b9db88903f77..974ab37b95eb 100644 |
| --- a/drivers/media/i2c/ov6650.c |
| +++ b/drivers/media/i2c/ov6650.c |
| @@ -609,7 +609,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) |
| dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code); |
| return -EINVAL; |
| } |
| - priv->code = code; |
| |
| if (code == MEDIA_BUS_FMT_Y8_1X8 || |
| code == MEDIA_BUS_FMT_SBGGR8_1X8) { |
| @@ -635,7 +634,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) |
| dev_dbg(&client->dev, "max resolution: CIF\n"); |
| coma_mask |= COMA_QCIF; |
| } |
| - priv->half_scale = half_scale; |
| |
| clkrc = CLKRC_12MHz; |
| mclk = 12000000; |
| @@ -653,8 +651,13 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) |
| ret = ov6650_reg_rmw(client, REG_COMA, coma_set, coma_mask); |
| if (!ret) |
| ret = ov6650_reg_write(client, REG_CLKRC, clkrc); |
| - if (!ret) |
| + if (!ret) { |
| + priv->half_scale = half_scale; |
| + |
| ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask); |
| + } |
| + if (!ret) |
| + priv->code = code; |
| |
| if (!ret) { |
| mf->colorspace = priv->colorspace; |
| -- |
| 2.7.4 |
| |