aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/media-entity.c83
-rw-r--r--include/media/media-device.h2
-rw-r--r--include/media/media-entity.h48
3 files changed, 133 insertions, 0 deletions
diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
index 6ed4a19b0be9..160ce2cc0865 100644
--- a/drivers/media/media-entity.c
+++ b/drivers/media/media-entity.c
@@ -44,11 +44,41 @@ static inline const char *gobj_type(enum media_gobj_type type)
44 return "pad"; 44 return "pad";
45 case MEDIA_GRAPH_LINK: 45 case MEDIA_GRAPH_LINK:
46 return "link"; 46 return "link";
47 case MEDIA_GRAPH_INTF_DEVNODE:
48 return "intf-devnode";
47 default: 49 default:
48 return "unknown"; 50 return "unknown";
49 } 51 }
50} 52}
51 53
54static inline const char *intf_type(struct media_interface *intf)
55{
56 switch (intf->type) {
57 case MEDIA_INTF_T_DVB_FE:
58 return "frontend";
59 case MEDIA_INTF_T_DVB_DEMUX:
60 return "demux";
61 case MEDIA_INTF_T_DVB_DVR:
62 return "DVR";
63 case MEDIA_INTF_T_DVB_CA:
64 return "CA";
65 case MEDIA_INTF_T_DVB_NET:
66 return "dvbnet";
67 case MEDIA_INTF_T_V4L_VIDEO:
68 return "video";
69 case MEDIA_INTF_T_V4L_VBI:
70 return "vbi";
71 case MEDIA_INTF_T_V4L_RADIO:
72 return "radio";
73 case MEDIA_INTF_T_V4L_SUBDEV:
74 return "v4l2-subdev";
75 case MEDIA_INTF_T_V4L_SWRADIO:
76 return "swradio";
77 default:
78 return "unknown-intf";
79 }
80};
81
52static void dev_dbg_obj(const char *event_name, struct media_gobj *gobj) 82static void dev_dbg_obj(const char *event_name, struct media_gobj *gobj)
53{ 83{
54#if defined(DEBUG) || defined (CONFIG_DYNAMIC_DEBUG) 84#if defined(DEBUG) || defined (CONFIG_DYNAMIC_DEBUG)
@@ -84,6 +114,19 @@ static void dev_dbg_obj(const char *event_name, struct media_gobj *gobj)
84 "%s: id 0x%08x pad#%d: '%s':%d\n", 114 "%s: id 0x%08x pad#%d: '%s':%d\n",
85 event_name, gobj->id, media_localid(gobj), 115 event_name, gobj->id, media_localid(gobj),
86 pad->entity->name, pad->index); 116 pad->entity->name, pad->index);
117 break;
118 }
119 case MEDIA_GRAPH_INTF_DEVNODE:
120 {
121 struct media_interface *intf = gobj_to_intf(gobj);
122 struct media_intf_devnode *devnode = intf_to_devnode(intf);
123
124 dev_dbg(gobj->mdev->dev,
125 "%s: id 0x%08x intf_devnode#%d: %s - major: %d, minor: %d\n",
126 event_name, gobj->id, media_localid(gobj),
127 intf_type(intf),
128 devnode->major, devnode->minor);
129 break;
87 } 130 }
88 } 131 }
89#endif 132#endif
@@ -119,6 +162,9 @@ void media_gobj_init(struct media_device *mdev,
119 case MEDIA_GRAPH_LINK: 162 case MEDIA_GRAPH_LINK:
120 gobj->id = media_gobj_gen_id(type, ++mdev->link_id); 163 gobj->id = media_gobj_gen_id(type, ++mdev->link_id);
121 break; 164 break;
165 case MEDIA_GRAPH_INTF_DEVNODE:
166 gobj->id = media_gobj_gen_id(type, ++mdev->intf_devnode_id);
167 break;
122 } 168 }
123 dev_dbg_obj(__func__, gobj); 169 dev_dbg_obj(__func__, gobj);
124} 170}
@@ -793,3 +839,40 @@ struct media_pad *media_entity_remote_pad(struct media_pad *pad)
793 839
794} 840}
795EXPORT_SYMBOL_GPL(media_entity_remote_pad); 841EXPORT_SYMBOL_GPL(media_entity_remote_pad);
842
843
844/* Functions related to the media interface via device nodes */
845
846struct media_intf_devnode *media_devnode_create(struct media_device *mdev,
847 u32 type, u32 flags,
848 u32 major, u32 minor,
849 gfp_t gfp_flags)
850{
851 struct media_intf_devnode *devnode;
852 struct media_interface *intf;
853
854 devnode = kzalloc(sizeof(*devnode), gfp_flags);
855 if (!devnode)
856 return NULL;
857
858 intf = &devnode->intf;
859
860 intf->type = type;
861 intf->flags = flags;
862
863 devnode->major = major;
864 devnode->minor = minor;
865
866 media_gobj_init(mdev, MEDIA_GRAPH_INTF_DEVNODE,
867 &devnode->intf.graph_obj);
868
869 return devnode;
870}
871EXPORT_SYMBOL_GPL(media_devnode_create);
872
873void media_devnode_remove(struct media_intf_devnode *devnode)
874{
875 media_gobj_remove(&devnode->intf.graph_obj);
876 kfree(devnode);
877}
878EXPORT_SYMBOL_GPL(media_devnode_remove);
diff --git a/include/media/media-device.h b/include/media/media-device.h
index 05414e351f8e..3b14394d5701 100644
--- a/include/media/media-device.h
+++ b/include/media/media-device.h
@@ -44,6 +44,7 @@ struct device;
44 * @entity_id: Unique ID used on the last entity registered 44 * @entity_id: Unique ID used on the last entity registered
45 * @pad_id: Unique ID used on the last pad registered 45 * @pad_id: Unique ID used on the last pad registered
46 * @link_id: Unique ID used on the last link registered 46 * @link_id: Unique ID used on the last link registered
47 * @intf_devnode_id: Unique ID used on the last interface devnode registered
47 * @entities: List of registered entities 48 * @entities: List of registered entities
48 * @lock: Entities list lock 49 * @lock: Entities list lock
49 * @graph_mutex: Entities graph operation lock 50 * @graph_mutex: Entities graph operation lock
@@ -73,6 +74,7 @@ struct media_device {
73 u32 entity_id; 74 u32 entity_id;
74 u32 pad_id; 75 u32 pad_id;
75 u32 link_id; 76 u32 link_id;
77 u32 intf_devnode_id;
76 78
77 struct list_head entities; 79 struct list_head entities;
78 80
diff --git a/include/media/media-entity.h b/include/media/media-entity.h
index a493dd9910f4..4d5fc91c4134 100644
--- a/include/media/media-entity.h
+++ b/include/media/media-entity.h
@@ -36,11 +36,14 @@
36 * @MEDIA_GRAPH_ENTITY: Identify a media entity 36 * @MEDIA_GRAPH_ENTITY: Identify a media entity
37 * @MEDIA_GRAPH_PAD: Identify a media pad 37 * @MEDIA_GRAPH_PAD: Identify a media pad
38 * @MEDIA_GRAPH_LINK: Identify a media link 38 * @MEDIA_GRAPH_LINK: Identify a media link
39 * @MEDIA_GRAPH_INTF_DEVNODE: Identify a media Kernel API interface via
40 * a device node
39 */ 41 */
40enum media_gobj_type { 42enum media_gobj_type {
41 MEDIA_GRAPH_ENTITY, 43 MEDIA_GRAPH_ENTITY,
42 MEDIA_GRAPH_PAD, 44 MEDIA_GRAPH_PAD,
43 MEDIA_GRAPH_LINK, 45 MEDIA_GRAPH_LINK,
46 MEDIA_GRAPH_INTF_DEVNODE,
44}; 47};
45 48
46#define MEDIA_BITS_PER_TYPE 8 49#define MEDIA_BITS_PER_TYPE 8
@@ -141,6 +144,34 @@ struct media_entity {
141 } info; 144 } info;
142}; 145};
143 146
147/**
148 * struct media_intf_devnode - Define a Kernel API interface
149 *
150 * @graph_obj: embedded graph object
151 * @type: Type of the interface as defined at the
152 * uapi/media/media.h header, e. g.
153 * MEDIA_INTF_T_*
154 * @flags: Interface flags as defined at uapi/media/media.h
155 */
156struct media_interface {
157 struct media_gobj graph_obj;
158 u32 type;
159 u32 flags;
160};
161
162/**
163 * struct media_intf_devnode - Define a Kernel API interface via a device node
164 *
165 * @intf: embedded interface object
166 * @major: Major number of a device node
167 * @minor: Minor number of a device node
168 */
169struct media_intf_devnode {
170 struct media_interface intf;
171 u32 major;
172 u32 minor;
173};
174
144static inline u32 media_entity_type(struct media_entity *entity) 175static inline u32 media_entity_type(struct media_entity *entity)
145{ 176{
146 return entity->type & MEDIA_ENT_TYPE_MASK; 177 return entity->type & MEDIA_ENT_TYPE_MASK;
@@ -205,6 +236,18 @@ struct media_entity_graph {
205#define gobj_to_link(gobj) \ 236#define gobj_to_link(gobj) \
206 container_of(gobj, struct media_link, graph_obj) 237 container_of(gobj, struct media_link, graph_obj)
207 238
239#define gobj_to_link(gobj) \
240 container_of(gobj, struct media_link, graph_obj)
241
242#define gobj_to_pad(gobj) \
243 container_of(gobj, struct media_pad, graph_obj)
244
245#define gobj_to_intf(gobj) \
246 container_of(gobj, struct media_interface, graph_obj)
247
248#define intf_to_devnode(intf) \
249 container_of(intf, struct media_intf_devnode, intf)
250
208void media_gobj_init(struct media_device *mdev, 251void media_gobj_init(struct media_device *mdev,
209 enum media_gobj_type type, 252 enum media_gobj_type type,
210 struct media_gobj *gobj); 253 struct media_gobj *gobj);
@@ -236,6 +279,11 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
236 struct media_pipeline *pipe); 279 struct media_pipeline *pipe);
237void media_entity_pipeline_stop(struct media_entity *entity); 280void media_entity_pipeline_stop(struct media_entity *entity);
238 281
282struct media_intf_devnode *media_devnode_create(struct media_device *mdev,
283 u32 type, u32 flags,
284 u32 major, u32 minor,
285 gfp_t gfp_flags);
286void media_devnode_remove(struct media_intf_devnode *devnode);
239#define media_entity_call(entity, operation, args...) \ 287#define media_entity_call(entity, operation, args...) \
240 (((entity)->ops && (entity)->ops->operation) ? \ 288 (((entity)->ops && (entity)->ops->operation) ? \
241 (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD) 289 (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD)