The media controller doesn't need separate counts of input and output
pads. Merge them into a pads count.

Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>

Index: v4l-dvb-mc/linux/drivers/media/video/v4l2-device.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/v4l2-device.c
+++ v4l-dvb-mc/linux/drivers/media/video/v4l2-device.c
@@ -107,15 +107,12 @@ static long mc_enum_entities(struct v4l2
                strlcpy(mc_ent.descr, ent->descr, sizeof(mc_ent.descr));
        mc_ent.type = ent->type;
        mc_ent.subtype = ent->subtype;
-       mc_ent.inputs = ent->inputs;
-       mc_ent.outputs = ent->outputs;
+       mc_ent.pads = ent->pads;
        mc_ent.total_possible_links = 0;
        if (ent->links) {
                int l;
 
-               for (l = 0; l < ent->inputs; l++)
-                       mc_ent.total_possible_links += 
ent->links[l].nr_of_remote_pads;
-               for (l = ent->num_inputs; l < ent->num_inputs + ent->outputs; 
l++)
+               for (l = 0; l < ent->pads; l++)
                        mc_ent.total_possible_links += 
ent->links[l].nr_of_remote_pads;
        }
        mc_ent.v4l.major = ent->v4l.major;
@@ -139,25 +136,13 @@ static long mc_enum_links(struct v4l2_de
        if (ent == NULL)
                return -EINVAL;
        if (ent->links) {
-               for (l = 0; l < ent->inputs; l++)
-                       total_possible_links += ent->links[l].nr_of_remote_pads;
-               for (l = ent->num_inputs; l < ent->num_inputs + ent->outputs; 
l++)
+               for (l = 0; l < ent->pads; l++)
                        total_possible_links += ent->links[l].nr_of_remote_pads;
        }
        if (ios.status) {
                int s = 0;
 
-               for (l = 0; l < ent->inputs; l++, s++) {
-                       struct v4l2_mc_io_status stat = { 0, 0 };
-
-                       if (ent->links) {
-                               stat.active_pads = ent->links[l].active;
-                               stat.nr_of_remote_pads = 
ent->links[l].nr_of_remote_pads;
-                       }
-                       if (copy_to_user(uios->status + s, &stat, sizeof(stat)))
-                               return -EFAULT;
-               }
-               for (l = ent->num_inputs; l < ent->num_inputs + ent->outputs; 
l++, s++) {
+               for (l = 0; l < ent->pads; l++, s++) {
                        struct v4l2_mc_io_status stat = { 0, 0 };
 
                        if (ent->links) {
@@ -172,13 +157,7 @@ static long mc_enum_links(struct v4l2_de
        if (ios.remote_pads && total_possible_links) {
                int p = 0;
 
-               for (l = 0; l < ent->inputs; l++) {
-                       if (copy_to_user(uios->remote_pads + p, 
ent->links[l].remote_pads,
-                                       ent->links[l].nr_of_remote_pads * 
sizeof(ent->links[l].remote_pads[0])))
-                               return -EFAULT;
-                       p += ent->links[l].nr_of_remote_pads;
-               }
-               for (l = ent->num_inputs; l < ent->num_inputs + ent->outputs; 
l++) {
+               for (l = 0; l < ent->pads; l++) {
                        if (copy_to_user(uios->remote_pads + p, 
ent->links[l].remote_pads,
                                        ent->links[l].nr_of_remote_pads * 
sizeof(ent->links[l].remote_pads[0])))
                                return -EFAULT;
Index: v4l-dvb-mc/linux/include/linux/videodev2.h
===================================================================
--- v4l-dvb-mc.orig/linux/include/linux/videodev2.h
+++ v4l-dvb-mc/linux/include/linux/videodev2.h
@@ -1554,15 +1554,18 @@ struct v4l2_dbg_chip_ident {
 #define V4L2_SUBDEV_TYPE_VID_ENCODER 2
 #define V4L2_SUBDEV_TYPE_MISC       3
 
+#define V4L2_PAD_TYPE_INPUT            1
+#define V4L2_PAD_TYPE_OUTPUT           2
 
 struct v4l2_mc_io {
        __u32 entity;   /* entity ID */
-       __u8 io;                /* input or output index */
+       __u8 pad;       /* pad index */
 };
 
 struct v4l2_mc_io_status {
        __u32 active_pads;
        __u8 nr_of_remote_pads;
+       __u32 type;     /* pad type */
 };
 
 struct v4l2_mc_entity {
@@ -1571,8 +1574,7 @@ struct v4l2_mc_entity {
        char descr[256];
        __u32 type;
        __u32 subtype;
-       __u8 inputs;
-       __u8 outputs;
+       __u8 pads;
        __u32 total_possible_links;
 
        union {
@@ -1595,7 +1597,7 @@ struct v4l2_mc_entity {
 
 struct v4l2_mc_ios {
        __u32 entity;
-       /* Should have enough room for inputs+outputs elements */
+       /* Should have enough room for pads elements */
        struct v4l2_mc_io_status *status;
        /* Should have enough room for total_possible_links elements */
        struct v4l2_mc_io *remote_pads;
Index: v4l-dvb-mc/linux/include/media/v4l2-mc.h
===================================================================
--- v4l-dvb-mc.orig/linux/include/media/v4l2-mc.h
+++ v4l-dvb-mc/linux/include/media/v4l2-mc.h
@@ -17,11 +17,9 @@ struct v4l2_entity {
        const char *descr;
        u32 type;
        u32 subtype;
-       u8 inputs;
-       u8 outputs;
-       u8 num_inputs;
-       u8 num_outputs;
-       /* points to a v4l2_entity_io array of size num_inputs + num_outputs 
links */
+       u8 pads;
+       u8 num_pads;
+       /* points to a v4l2_entity_io array of size num_pads links */
        struct v4l2_entity_io *links;
 
        /* The entity's ioctl, accessible through the media controller */
@@ -45,15 +43,14 @@ struct v4l2_entity {
        };
 };
 
-static inline void v4l2_entity_prep(struct v4l2_entity *ent, u8 num_inputs, u8 
num_outputs,
+static inline void v4l2_entity_prep(struct v4l2_entity *ent, u8 num_pads,
                struct v4l2_entity_io *links, struct v4l2_mc_io *remote_pads)
 {
        int i;
 
-       ent->num_inputs = num_inputs;
-       ent->num_outputs = num_outputs;
+       ent->num_pads = num_pads;
        ent->links = links;
-       for (i = 0; i < num_inputs + num_outputs; i++) {
+       for (i = 0; i < num_pads; i++) {
                links[i].nr_of_remote_pads = 1;
                links[i].remote_pads = remote_pads + i;
        }
@@ -64,18 +61,16 @@ static inline void v4l2_entity_connect(s
 {
        int source_link, sink_link;
 
-       if (source == NULL || sink == NULL ||
-                       source->outputs >= source->num_outputs ||
-                       sink->inputs >= sink->num_inputs)
+       if (source == NULL || sink == NULL || source->pads >= source->num_pads)
                return;
 
-       source_link = source->num_inputs + source->outputs++;
-       sink_link = sink->inputs++;
+       source_link = source->pads++;
+       sink_link = sink->pads++;
        source->links[source_link].remote_pads[0].entity = sink->id;
-       source->links[source_link].remote_pads[0].io = sink_link;
+       source->links[source_link].remote_pads[0].pad = sink_link;
        source->links[source_link].active = active;
        sink->links[sink_link].remote_pads[0].entity = source->id;
-       sink->links[sink_link].remote_pads[0].io = source_link;
+       sink->links[sink_link].remote_pads[0].pad = source_link;
        sink->links[sink_link].active = active;
 }
 
Index: v4l-dvb-mc/v4l2-apps/util/v4l2-mc.cpp
===================================================================
--- v4l-dvb-mc.orig/v4l2-apps/util/v4l2-mc.cpp
+++ v4l-dvb-mc/v4l2-apps/util/v4l2-mc.cpp
@@ -170,6 +170,18 @@ static std::string entity2s(int fd, unsi
        return ent.name;
 }
 
+static std::string padtype2s(unsigned type)
+{
+       switch (type) {
+       case V4L2_PAD_TYPE_INPUT:
+               return "input";
+       case V4L2_PAD_TYPE_OUTPUT:
+               return "output";
+       default:
+               return "unknown";
+       }
+}
+
 static void show_topology(int fd)
 {
        struct v4l2_mc_entity ent;
@@ -193,8 +205,7 @@ static void show_topology(int fd)
                printf("\tDescription: %s\n", ent.descr);
                printf("\tType:        %s\n", enttype2s(ent.type).c_str());
                printf("\tSubtype:     %s\n", subtype2s(ent.type, 
ent.subtype).c_str());
-               printf("\tInputs:      %d\n", ent.inputs);
-               printf("\tOutputs:     %d\n", ent.outputs);
+               printf("\tPads:        %d\n", ent.pads);
                printf("\tTotal Links: %d\n", ent.total_possible_links);
 
                if (ent.type == V4L2_ENTITY_TYPE_NODE) {
@@ -222,54 +233,33 @@ static void show_topology(int fd)
 
                ios.entity = ent.id;
                ios.status = (struct v4l2_mc_io_status *)
-                       malloc((ent.inputs + ent.outputs) * sizeof(struct 
v4l2_mc_io_status));
+                       malloc(ent.pads * sizeof(struct v4l2_mc_io_status));
                ios.remote_pads = (struct v4l2_mc_io *)
                        malloc(ent.total_possible_links * sizeof(struct 
v4l2_mc_io));
                if (ioctl(fd, VIDIOC_MC_ENUM_LINKS, &ios) >= 0) {
                        int i;
                        int p = 0;
 
-                       for (i = 0; i < ent.inputs; i++) {
+                       for (i = 0; i < ent.pads; i++) {
                                int j;
 
-                               printf("\tInput %d:     ", i);
+                               printf("\tPad %d (%s):     ", i, 
padtype2s(ios.status[i].type).c_str());
                                if (ios.status[i].nr_of_remote_pads == 1) {
                                        printf("%s/%d %s\n",
                                                entity2s(fd, 
ios.remote_pads[p].entity).c_str(),
-                                               ios.remote_pads[p].io,
+                                               ios.remote_pads[p].pad,
                                                ios.status[i].active_pads == 1 
? "(active)" : "");
                                }
                                else {
                                        for (j = 0; j < 
ios.status[i].nr_of_remote_pads; j++) {
                                                printf("\t\t\t%s/%d %s\n",
                                                        entity2s(fd, 
ios.remote_pads[p+j].entity).c_str(),
-                                                       ios.remote_pads[p+j].io,
+                                                       
ios.remote_pads[p+j].pad,
                                                        
(ios.status[i].active_pads & (1 << j)) ? "(active)" : "");
                                        }
                                }
                                p += ios.status[i].nr_of_remote_pads;
                        }
-
-                       for (i = 0; i < ent.outputs; i++) {
-                               int j;
-
-                               printf("\tOutput %d:    ", i);
-                               if (ios.status[ent.inputs + 
i].nr_of_remote_pads == 1) {
-                                       printf("%s/%d %s\n",
-                                               entity2s(fd, 
ios.remote_pads[p].entity).c_str(),
-                                               ios.remote_pads[p].io,
-                                               ios.status[ent.inputs + 
i].active_pads == 1 ? "(active)" : "");
-                               }
-                               else {
-                                       for (j = 0; j < ios.status[ent.inputs + 
i].nr_of_remote_pads; j++) {
-                                               printf("\t\t\t%s/%d %s\n",
-                                                       entity2s(fd, 
ios.remote_pads[p+j].entity).c_str(),
-                                                       ios.remote_pads[p+j].io,
-                                                       (ios.status[ent.inputs 
+ i].active_pads & (1 << j)) ? "(active)" : "");
-                                       }
-                               }
-                               p += ios.status[ent.inputs + 
i].nr_of_remote_pads;
-                       }
                }
                free(ios.status);
                free(ios.remote_pads);
@@ -298,26 +288,28 @@ static void dot_topology(int fd)
                        ent.type == V4L2_ENTITY_TYPE_NODE ? "oval" : "box");
                ios.entity = ent.id;
                ios.status = (struct v4l2_mc_io_status *)
-                       malloc((ent.inputs + ent.outputs) * sizeof(struct 
v4l2_mc_io_status));
+                       malloc(ent.pads * sizeof(struct v4l2_mc_io_status));
                ios.remote_pads = (struct v4l2_mc_io *)
                        malloc(ent.total_possible_links * sizeof(struct 
v4l2_mc_io));
                if (ioctl(fd, VIDIOC_MC_ENUM_LINKS, &ios) >= 0) {
                        int i;
                        int p = 0;
 
-                       for (i = 0; i < ent.inputs; i++)
-                               p += ios.status[i].nr_of_remote_pads;
-
-                       for (i = 0; i < ent.outputs; i++) {
+                       for (i = 0; i < ent.pads; i++) {
                                int j;
 
-                               for (j = 0; j < ios.status[ent.inputs + 
i].nr_of_remote_pads; j++) {
+                               if (ios.status[i].type != V4L2_PAD_TYPE_OUTPUT) 
{
+                                       p += ios.status[i].nr_of_remote_pads;
+                                       continue;
+                               }
+
+                               for (j = 0; j < 
ios.status[i].nr_of_remote_pads; j++) {
                                        printf("\tn%08x -> n%08x ", ent.id, 
ios.remote_pads[p+j].entity);
-                                       if (!(ios.status[ent.inputs + 
i].active_pads & (1 << j)))
+                                       if (!(ios.status[i].active_pads & (1 << 
j)))
                                                printf("[style=dashed]");
                                        printf("\n");
                                }
-                               p += ios.status[ent.inputs + 
i].nr_of_remote_pads;
+                               p += ios.status[i].nr_of_remote_pads;
                        }
                }
                free(ios.status);
Index: v4l-dvb-mc/linux/drivers/media/video/ivtv/ivtv-driver.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/ivtv/ivtv-driver.c
+++ v4l-dvb-mc/linux/drivers/media/video/ivtv/ivtv-driver.c
@@ -697,9 +697,9 @@ static int __devinit ivtv_init_struct1(s
        v4l2_subdev_init(&itv->sd_encoder, NULL);
        v4l2_subdev_init(&itv->sd_decoder, NULL);
        strlcpy(itv->sd_encoder.name, "MPEG encoder", 
sizeof(itv->sd_encoder.name));
-       v4l2_entity_prep(&itv->sd_encoder.entity, SD_ENC_NUM_INPUTS, 
SD_ENC_NUM_OUTPUTS,
+       v4l2_entity_prep(&itv->sd_encoder.entity, SD_ENC_NUM_INPUTS + 
SD_ENC_NUM_OUTPUTS,
                itv->sd_enc_links, itv->sd_enc_remote);
-       v4l2_entity_prep(&itv->sd_decoder.entity, SD_DEC_NUM_INPUTS, 
SD_DEC_NUM_OUTPUTS,
+       v4l2_entity_prep(&itv->sd_decoder.entity, SD_DEC_NUM_INPUTS + 
SD_DEC_NUM_OUTPUTS,
                itv->sd_dec_links, itv->sd_dec_remote);
        strlcpy(itv->sd_decoder.name, "MPEG decoder", 
sizeof(itv->sd_decoder.name));
        err = v4l2_device_register_subdev(&itv->v4l2_dev, &itv->sd_encoder);
Index: v4l-dvb-mc/linux/drivers/media/video/ivtv/ivtv-gpio.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/ivtv/ivtv-gpio.c
+++ v4l-dvb-mc/linux/drivers/media/video/ivtv/ivtv-gpio.c
@@ -374,7 +374,7 @@ int ivtv_gpio_init(struct ivtv *itv)
        write_reg(itv->card->gpio_init.direction | pin, IVTV_REG_GPIO_DIR);
        v4l2_subdev_init(&itv->sd_gpio, &subdev_ops);
        snprintf(itv->sd_gpio.name, sizeof(itv->sd_gpio.name), "%s-gpio", 
itv->v4l2_dev.name);
-       v4l2_entity_prep(&itv->sd_gpio.entity, 0, 1, &itv->sd_gpio_links, 
&itv->sd_gpio_remote);
+       v4l2_entity_prep(&itv->sd_gpio.entity, 1, &itv->sd_gpio_links, 
&itv->sd_gpio_remote);
        itv->sd_gpio.grp_id = IVTV_HW_GPIO;
        v4l2_entity_connect(&itv->sd_gpio.entity, &itv->sd_encoder.entity, 1);
        return v4l2_device_register_subdev(&itv->v4l2_dev, &itv->sd_gpio);
Index: v4l-dvb-mc/linux/drivers/media/video/ivtv/ivtv-streams.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/ivtv/ivtv-streams.c
+++ v4l-dvb-mc/linux/drivers/media/video/ivtv/ivtv-streams.c
@@ -269,10 +269,10 @@ static int ivtv_reg_dev(struct ivtv *itv
                return -ENOMEM;
        }
        if (type <= IVTV_ENC_STREAM_TYPE_RAD || type == 
IVTV_DEC_STREAM_TYPE_VBI)
-               v4l2_entity_prep(&s->vdev->entity, 1, 0,
+               v4l2_entity_prep(&s->vdev->entity, 1,
                        itv->stream_links + type, itv->stream_remote + type);
        else
-               v4l2_entity_prep(&s->vdev->entity, 0, 1,
+               v4l2_entity_prep(&s->vdev->entity, 1,
                        itv->stream_links + type, itv->stream_remote + type);
        if (type <= IVTV_ENC_STREAM_TYPE_RAD)
                v4l2_entity_connect(&itv->sd_encoder.entity, &s->vdev->entity, 
1);
Index: v4l-dvb-mc/linux/drivers/media/video/msp3400-driver.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/msp3400-driver.c
+++ v4l-dvb-mc/linux/drivers/media/video/msp3400-driver.c
@@ -764,7 +764,7 @@ static int msp_probe(struct i2c_client *
 
        sd = &state->sd;
        v4l2_i2c_subdev_init(sd, client, &msp_ops);
-       v4l2_entity_prep(&sd->entity, 0, 1, &state->sd_output, 
&state->remote_input);
+       v4l2_entity_prep(&sd->entity, 1, &state->sd_output, 
&state->remote_input);
 
        state->v4l2_std = V4L2_STD_NTSC;
        state->audmode = V4L2_TUNER_MODE_STEREO;
Index: v4l-dvb-mc/linux/drivers/media/video/saa7115.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/saa7115.c
+++ v4l-dvb-mc/linux/drivers/media/video/saa7115.c
@@ -1604,7 +1604,7 @@ static int saa711x_probe(struct i2c_clie
                return -ENOMEM;
        sd = &state->sd;
        v4l2_i2c_subdev_init(sd, client, &saa711x_ops);
-       v4l2_entity_prep(&sd->entity, 0, 1, &state->sd_output, 
&state->remote_input);
+       v4l2_entity_prep(&sd->entity, 1, &state->sd_output, 
&state->remote_input);
        state->input = -1;
        state->output = SAA7115_IPORT_ON;
        state->enable = 1;
Index: v4l-dvb-mc/linux/drivers/media/video/saa7127.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/saa7127.c
+++ v4l-dvb-mc/linux/drivers/media/video/saa7127.c
@@ -740,7 +740,7 @@ static int saa7127_probe(struct i2c_clie
 
        sd = &state->sd;
        v4l2_i2c_subdev_init(sd, client, &saa7127_ops);
-       v4l2_entity_prep(&sd->entity, 1, 0, &state->sd_input, 
&state->remote_output);
+       v4l2_entity_prep(&sd->entity, 1, &state->sd_input, 
&state->remote_output);
 
        /* First test register 0: Bits 5-7 are a version ID (should be 0),
           and bit 2 should also be 0.
Index: v4l-dvb-mc/linux/drivers/media/video/tuner-core.c
===================================================================
--- v4l-dvb-mc.orig/linux/drivers/media/video/tuner-core.c
+++ v4l-dvb-mc/linux/drivers/media/video/tuner-core.c
@@ -1041,7 +1041,7 @@ static int tuner_probe(struct i2c_client
        if (NULL == t)
                return -ENOMEM;
        v4l2_i2c_subdev_init(&t->sd, client, &tuner_ops);
-       v4l2_entity_prep(&t->sd.entity, 0, 1, &t->sd_output, &t->remote_input);
+       v4l2_entity_prep(&t->sd.entity, 1, &t->sd_output, &t->remote_input);
        t->i2c = client;
        t->name = "(tuner unset)";
        t->type = UNSET;


--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to