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;
        /* 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;
 
        /* 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)
                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:
 
 #define media_entity_cleanup(entity) do { } while (false)
 #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.
  *