Bits related to the interface data width do not have any effect when
the CSI controller is taking input from the MIPI CSI-2 controller.

In prevision of adding support for this case, set these bits
conditionally so there is no ambiguity.

Co-developed-by: Kévin L'hôpital <kevin.lhopi...@bootlin.com>
Signed-off-by: Kévin L'hôpital <kevin.lhopi...@bootlin.com>
Signed-off-by: Paul Kocialkowski <paul.kocialkow...@bootlin.com>
---
 .../platform/sunxi/sun6i-csi/sun6i_csi.c      | 42 +++++++++++--------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c 
b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
index 5d2389a5cd17..a876a05ea3c7 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
@@ -378,8 +378,13 @@ static void sun6i_csi_setup_bus(struct sun6i_csi_dev *sdev)
        unsigned char bus_width;
        u32 flags;
        u32 cfg;
+       bool input_parallel = false;
        bool input_interlaced = false;
 
+       if (endpoint->bus_type == V4L2_MBUS_PARALLEL ||
+           endpoint->bus_type == V4L2_MBUS_BT656)
+               input_parallel = true;
+
        if (csi->config.field == V4L2_FIELD_INTERLACED
            || csi->config.field == V4L2_FIELD_INTERLACED_TB
            || csi->config.field == V4L2_FIELD_INTERLACED_BT)
@@ -395,6 +400,26 @@ static void sun6i_csi_setup_bus(struct sun6i_csi_dev *sdev)
                 CSI_IF_CFG_HREF_POL_MASK | CSI_IF_CFG_FIELD_MASK |
                 CSI_IF_CFG_SRC_TYPE_MASK);
 
+       if (input_parallel) {
+               switch (bus_width) {
+               case 8:
+                       cfg |= CSI_IF_CFG_IF_DATA_WIDTH_8BIT;
+                       break;
+               case 10:
+                       cfg |= CSI_IF_CFG_IF_DATA_WIDTH_10BIT;
+                       break;
+               case 12:
+                       cfg |= CSI_IF_CFG_IF_DATA_WIDTH_12BIT;
+                       break;
+               case 16: /* No need to configure DATA_WIDTH for 16bit */
+                       break;
+               default:
+                       dev_warn(sdev->dev, "Unsupported bus width: %u\n",
+                                bus_width);
+                       break;
+               }
+       }
+
        if (input_interlaced)
                cfg |= CSI_IF_CFG_SRC_TYPE_INTERLACED;
        else
@@ -440,23 +465,6 @@ static void sun6i_csi_setup_bus(struct sun6i_csi_dev *sdev)
                break;
        }
 
-       switch (bus_width) {
-       case 8:
-               cfg |= CSI_IF_CFG_IF_DATA_WIDTH_8BIT;
-               break;
-       case 10:
-               cfg |= CSI_IF_CFG_IF_DATA_WIDTH_10BIT;
-               break;
-       case 12:
-               cfg |= CSI_IF_CFG_IF_DATA_WIDTH_12BIT;
-               break;
-       case 16: /* No need to configure DATA_WIDTH for 16bit */
-               break;
-       default:
-               dev_warn(sdev->dev, "Unsupported bus width: %u\n", bus_width);
-               break;
-       }
-
        regmap_write(sdev->regmap, CSI_IF_CFG_REG, cfg);
 }
 
-- 
2.28.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to