OSDN Git Service

media: v4l2-mc: switch it to use the new approach to setup pipelines
authorMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Tue, 31 Jul 2018 13:22:40 +0000 (09:22 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 17 Sep 2018 17:16:19 +0000 (13:16 -0400)
Instead of relying on a static map for pids, use the new sig_type
"taint" type to setup the pipelines with the same tipe between
different entities.

Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/media-entity.c
drivers/media/v4l2-core/v4l2-mc.c
include/media/media-entity.h

index 3498551..0b1cb35 100644 (file)
@@ -662,6 +662,32 @@ static void __media_entity_remove_link(struct media_entity *entity,
        kfree(link);
 }
 
+int media_get_pad_index(struct media_entity *entity, bool is_sink,
+                       enum media_pad_signal_type sig_type)
+{
+       int i;
+       bool pad_is_sink;
+
+       if (!entity)
+               return -EINVAL;
+
+       for (i = 0; i < entity->num_pads; i++) {
+               if (entity->pads[i].flags == MEDIA_PAD_FL_SINK)
+                       pad_is_sink = true;
+               else if (entity->pads[i].flags == MEDIA_PAD_FL_SOURCE)
+                       pad_is_sink = false;
+               else
+                       continue;       /* This is an error! */
+
+               if (pad_is_sink != is_sink)
+                       continue;
+               if (entity->pads[i].sig_type == sig_type)
+                       return i;
+       }
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(media_get_pad_index);
+
 int
 media_create_pad_link(struct media_entity *source, u16 source_pad,
                         struct media_entity *sink, u16 sink_pad, u32 flags)
index 982bab3..d9f3397 100644 (file)
@@ -28,7 +28,7 @@ int v4l2_mc_create_media_graph(struct media_device *mdev)
        struct media_entity *io_v4l = NULL, *io_vbi = NULL, *io_swradio = NULL;
        bool is_webcam = false;
        u32 flags;
-       int ret;
+       int ret, pad_sink, pad_source;
 
        if (!mdev)
                return 0;
@@ -97,29 +97,52 @@ int v4l2_mc_create_media_graph(struct media_device *mdev)
        /* Link the tuner and IF video output pads */
        if (tuner) {
                if (if_vid) {
-                       ret = media_create_pad_link(tuner, TUNER_PAD_OUTPUT,
-                                                   if_vid,
-                                                   IF_VID_DEC_PAD_IF_INPUT,
+                       pad_source = media_get_pad_index(tuner, false,
+                                                        PAD_SIGNAL_ANALOG);
+                       pad_sink = media_get_pad_index(if_vid, true,
+                                                      PAD_SIGNAL_ANALOG);
+                       if (pad_source < 0 || pad_sink < 0)
+                               return -EINVAL;
+                       ret = media_create_pad_link(tuner, pad_source,
+                                                   if_vid, pad_sink,
                                                    MEDIA_LNK_FL_ENABLED);
                        if (ret)
                                return ret;
-                       ret = media_create_pad_link(if_vid, IF_VID_DEC_PAD_OUT,
-                                               decoder, DEMOD_PAD_IF_INPUT,
-                                               MEDIA_LNK_FL_ENABLED);
+
+                       pad_source = media_get_pad_index(if_vid, false,
+                                                        PAD_SIGNAL_ANALOG);
+                       pad_sink = media_get_pad_index(decoder, true,
+                                                      PAD_SIGNAL_ANALOG);
+                       if (pad_source < 0 || pad_sink < 0)
+                               return -EINVAL;
+                       ret = media_create_pad_link(if_vid, pad_source,
+                                                   decoder, pad_sink,
+                                                   MEDIA_LNK_FL_ENABLED);
                        if (ret)
                                return ret;
                } else {
-                       ret = media_create_pad_link(tuner, TUNER_PAD_OUTPUT,
-                                               decoder, DEMOD_PAD_IF_INPUT,
-                                               MEDIA_LNK_FL_ENABLED);
+                       pad_source = media_get_pad_index(tuner, false,
+                                                        PAD_SIGNAL_ANALOG);
+                       pad_sink = media_get_pad_index(decoder, true,
+                                                      PAD_SIGNAL_ANALOG);
+                       if (pad_source < 0 || pad_sink < 0)
+                               return -EINVAL;
+                       ret = media_create_pad_link(tuner, pad_source,
+                                                   decoder, pad_sink,
+                                                   MEDIA_LNK_FL_ENABLED);
                        if (ret)
                                return ret;
                }
 
                if (if_aud) {
-                       ret = media_create_pad_link(tuner, TUNER_PAD_AUD_OUT,
-                                                   if_aud,
-                                                   IF_AUD_DEC_PAD_IF_INPUT,
+                       pad_source = media_get_pad_index(tuner, false,
+                                                        PAD_SIGNAL_AUDIO);
+                       pad_sink = media_get_pad_index(if_aud, true,
+                                                      PAD_SIGNAL_AUDIO);
+                       if (pad_source < 0 || pad_sink < 0)
+                               return -EINVAL;
+                       ret = media_create_pad_link(tuner, pad_source,
+                                                   if_aud, pad_sink,
                                                    MEDIA_LNK_FL_ENABLED);
                        if (ret)
                                return ret;
@@ -131,23 +154,32 @@ int v4l2_mc_create_media_graph(struct media_device *mdev)
 
        /* Create demod to V4L, VBI and SDR radio links */
        if (io_v4l) {
-               ret = media_create_pad_link(decoder, DEMOD_PAD_VID_OUT,
-                                       io_v4l, 0,
-                                       MEDIA_LNK_FL_ENABLED);
+               pad_source = media_get_pad_index(decoder, false, PAD_SIGNAL_DV);
+               if (pad_source < 0)
+                       return -EINVAL;
+               ret = media_create_pad_link(decoder, pad_source,
+                                           io_v4l, 0,
+                                           MEDIA_LNK_FL_ENABLED);
                if (ret)
                        return ret;
        }
 
        if (io_swradio) {
-               ret = media_create_pad_link(decoder, DEMOD_PAD_VID_OUT,
-                                       io_swradio, 0,
-                                       MEDIA_LNK_FL_ENABLED);
+               pad_source = media_get_pad_index(decoder, false, PAD_SIGNAL_DV);
+               if (pad_source < 0)
+                       return -EINVAL;
+               ret = media_create_pad_link(decoder, pad_source,
+                                           io_swradio, 0,
+                                           MEDIA_LNK_FL_ENABLED);
                if (ret)
                        return ret;
        }
 
        if (io_vbi) {
-               ret = media_create_pad_link(decoder, DEMOD_PAD_VID_OUT,
+               pad_source = media_get_pad_index(decoder, false, PAD_SIGNAL_DV);
+               if (pad_source < 0)
+                       return -EINVAL;
+               ret = media_create_pad_link(decoder, pad_source,
                                            io_vbi, 0,
                                            MEDIA_LNK_FL_ENABLED);
                if (ret)
@@ -161,15 +193,22 @@ int v4l2_mc_create_media_graph(struct media_device *mdev)
                case MEDIA_ENT_F_CONN_RF:
                        if (!tuner)
                                continue;
-
+                       pad_sink = media_get_pad_index(tuner, true,
+                                                      PAD_SIGNAL_ANALOG);
+                       if (pad_sink < 0)
+                               return -EINVAL;
                        ret = media_create_pad_link(entity, 0, tuner,
-                                                   TUNER_PAD_RF_INPUT,
+                                                   pad_sink,
                                                    flags);
                        break;
                case MEDIA_ENT_F_CONN_SVIDEO:
                case MEDIA_ENT_F_CONN_COMPOSITE:
+                       pad_sink = media_get_pad_index(decoder, true,
+                                                      PAD_SIGNAL_ANALOG);
+                       if (pad_sink < 0)
+                               return -EINVAL;
                        ret = media_create_pad_link(entity, 0, decoder,
-                                                   DEMOD_PAD_IF_INPUT,
+                                                   pad_sink,
                                                    flags);
                        break;
                default:
index b7a53f5..e5f6960 100644 (file)
@@ -671,6 +671,24 @@ static inline void media_entity_cleanup(struct media_entity *entity) {}
 #endif
 
 /**
+ * media_get_pad_index() - retrieves a pad index from an entity
+ *
+ * @entity:    entity where the pads belong
+ * @is_sink:   true if the pad is a sink, false if it is a source
+ * @sig_type:  type of signal of the pad to be search
+ *
+ * This helper function finds the first pad index inside an entity that
+ * satisfies both @is_sink and @sig_type conditions.
+ *
+ * Return:
+ *
+ * On success, return the pad number. If the pad was not found or the media
+ * entity is a NULL pointer, return -EINVAL.
+ */
+int media_get_pad_index(struct media_entity *entity, bool is_sink,
+                       enum media_pad_signal_type sig_type);
+
+/**
  * media_create_pad_link() - creates a link between two entities.
  *
  * @source:    pointer to &media_entity of the source pad.