media: i2c: adv748x: Register only enabled inputs
authorJacopo Mondi <jacopo+renesas@jmondi.org>
Mon, 17 Sep 2018 11:30:57 +0000 (07:30 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Thu, 4 Oct 2018 18:50:44 +0000 (14:50 -0400)
The adv748x assumes input endpoints are always enabled, and registers
a subdevice for each of them when the corresponding output subdevice
is registered.

Fix this by conditionally registering the input subdevice only if it is
actually described in device tree.

Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/i2c/adv748x/adv748x-csi2.c
drivers/media/i2c/adv748x/adv748x.h

index 05b336b..6ce2154 100644 (file)
@@ -78,15 +78,15 @@ static int adv748x_csi2_registered(struct v4l2_subdev *sd)
         *
         * Link HDMI->TXA, and AFE->TXB directly.
         */
-       if (is_txa(tx)) {
+       if (is_txa(tx) && is_hdmi_enabled(state))
                return adv748x_csi2_register_link(tx, sd->v4l2_dev,
                                                  &state->hdmi.sd,
                                                  ADV748X_HDMI_SOURCE);
-       } else {
+       if (!is_txa(tx) && is_afe_enabled(state))
                return adv748x_csi2_register_link(tx, sd->v4l2_dev,
                                                  &state->afe.sd,
                                                  ADV748X_AFE_SOURCE);
-       }
+       return 0;
 }
 
 static const struct v4l2_subdev_internal_ops adv748x_csi2_internal_ops = {
index dccae76..39c2fdc 100644 (file)
@@ -90,6 +90,16 @@ struct adv748x_csi2 {
 #define adv748x_sd_to_csi2(sd) container_of(sd, struct adv748x_csi2, sd)
 #define is_tx_enabled(_tx) ((_tx)->state->endpoints[(_tx)->port] != NULL)
 #define is_txa(_tx) ((_tx) == &(_tx)->state->txa)
+#define is_afe_enabled(_state)                                 \
+       ((_state)->endpoints[ADV748X_PORT_AIN0] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN1] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN2] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN3] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN4] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN5] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN6] != NULL ||      \
+        (_state)->endpoints[ADV748X_PORT_AIN7] != NULL)
+#define is_hdmi_enabled(_state) ((_state)->endpoints[ADV748X_PORT_HDMI] != NULL)
 
 enum adv748x_hdmi_pads {
        ADV748X_HDMI_SINK,