#include <media/media-entity.h>
 #include <media/media-device.h>
 
+/**
+ *  media_gobj_init - Initialize a graph object
+ *
+ * @mdev:      Pointer to the media_device that contains the object
+ * @type:      Type of the object
+ * @gobj:      Pointer to the object
+ *
+ * This routine initializes the embedded struct media_gobj inside a
+ * media graph object. It is called automatically if media_*_create()
+ * calls are used. However, if the object (entity, link, pad, interface)
+ * is embedded on some other object, this function should be called before
+ * registering the object at the media controller.
+ */
+void media_gobj_init(struct media_device *mdev,
+                          enum media_gobj_type type,
+                          struct media_gobj *gobj)
+{
+       /* For now, nothing to do */
+}
+
+/**
+ *  media_gobj_remove - Stop using a graph object on a media device
+ *
+ * @graph_obj: Pointer to the object
+ *
+ * This should be called at media_device_unregister_*() routines
+ */
+void media_gobj_remove(struct media_gobj *gobj)
+{
+       /* For now, nothing to do */
+}
+
 /**
  * media_entity_init - Initialize a media entity
  *
 
 #include <linux/list.h>
 #include <linux/media.h>
 
+/* Enums used internally at the media controller to represent graphs */
+
+/**
+ * enum media_gobj_type - type of a graph object
+ *
+ */
+enum media_gobj_type {
+        /* FIXME: add the types here, as we embed media_gobj */
+       MEDIA_GRAPH_NONE
+};
+
+#define MEDIA_BITS_PER_TYPE            8
+#define MEDIA_BITS_PER_LOCAL_ID                (32 - MEDIA_BITS_PER_TYPE)
+#define MEDIA_LOCAL_ID_MASK             GENMASK(MEDIA_BITS_PER_LOCAL_ID - 1, 0)
+
+/* Structs to represent the objects that belong to a media graph */
+
+/**
+ * struct media_gobj - Define a graph object.
+ *
+ * @id:                Non-zero object ID identifier. The ID should be unique
+ *             inside a media_device, as it is composed by
+ *             MEDIA_BITS_PER_TYPE to store the type plus
+ *             MEDIA_BITS_PER_LOCAL_ID to store a per-type ID
+ *             (called as "local ID").
+ *
+ * All objects on the media graph should have this struct embedded
+ */
+struct media_gobj {
+       u32                     id;
+};
+
+
 struct media_pipeline {
 };
 
        return entity->id;
 }
 
+static inline enum media_gobj_type media_type(struct media_gobj *gobj)
+{
+       return gobj->id >> MEDIA_BITS_PER_LOCAL_ID;
+}
+
+static inline u32 media_localid(struct media_gobj *gobj)
+{
+       return gobj->id & MEDIA_LOCAL_ID_MASK;
+}
+
+static inline u32 media_gobj_gen_id(enum media_gobj_type type, u32 local_id)
+{
+       u32 id;
+
+       id = type << MEDIA_BITS_PER_LOCAL_ID;
+       id |= local_id & MEDIA_LOCAL_ID_MASK;
+
+       return id;
+}
+
 #define MEDIA_ENTITY_ENUM_MAX_DEPTH    16
 #define MEDIA_ENTITY_ENUM_MAX_ID       64
 
        int top;
 };
 
+#define gobj_to_entity(gobj) \
+               container_of(gobj, struct media_entity, graph_obj)
+
+void media_gobj_init(struct media_device *mdev,
+                   enum media_gobj_type type,
+                   struct media_gobj *gobj);
+void media_gobj_remove(struct media_gobj *gobj);
+
 int media_entity_init(struct media_entity *entity, u16 num_pads,
                struct media_pad *pads);
 void media_entity_cleanup(struct media_entity *entity);