]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - include/media/media-entity.h
[media] media: use media_gobj inside links
[mirror_ubuntu-artful-kernel.git] / include / media / media-entity.h
index 197f9379975395dd259defbeb92bf0a5eccd2e86..bf93c90e921882339f9842391a1833a935eaecfa 100644 (file)
 #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
+ *
+ * @MEDIA_GRAPH_ENTITY:                Identify a media entity
+ * @MEDIA_GRAPH_PAD:           Identify a media pad
+ * @MEDIA_GRAPH_LINK:          Identify a media link
+ */
+enum media_gobj_type {
+       MEDIA_GRAPH_ENTITY,
+       MEDIA_GRAPH_PAD,
+       MEDIA_GRAPH_LINK,
+};
+
+#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 {
 };
 
 struct media_link {
+       struct media_gobj graph_obj;
        struct media_pad *source;       /* Source pad */
        struct media_pad *sink;         /* Sink pad  */
        struct media_link *reverse;     /* Link in the reverse direction */
@@ -39,6 +77,7 @@ struct media_link {
 };
 
 struct media_pad {
+       struct media_gobj graph_obj;
        struct media_entity *entity;    /* Entity this pad belongs to */
        u16 index;                      /* Pad index in the entity pads array */
        unsigned long flags;            /* Pad flags (MEDIA_PAD_FL_*) */
@@ -61,10 +100,9 @@ struct media_entity_operations {
 };
 
 struct media_entity {
+       struct media_gobj graph_obj;
        struct list_head list;
        struct media_device *parent;    /* Media device this entity belongs to*/
-       u32 id;                         /* Entity ID, unique in the parent media
-                                        * device context */
        const char *name;               /* Entity name */
        u32 type;                       /* Entity type (MEDIA_ENT_T_*) */
        u32 revision;                   /* Entity revision, driver specific */
@@ -113,6 +151,31 @@ static inline u32 media_entity_subtype(struct media_entity *entity)
        return entity->type & MEDIA_ENT_SUBTYPE_MASK;
 }
 
+static inline u32 media_entity_id(struct media_entity *entity)
+{
+       return entity->graph_obj.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
 
@@ -133,8 +196,16 @@ struct media_entity_graph {
        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, u16 extra_links);
+               struct media_pad *pads);
 void media_entity_cleanup(struct media_entity *entity);
 
 int media_entity_create_link(struct media_entity *source, u16 source_pad,