diff options
-rw-r--r-- | drivers/media/media-entity.c | 83 | ||||
-rw-r--r-- | include/media/media-device.h | 2 | ||||
-rw-r--r-- | include/media/media-entity.h | 48 |
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 | ||
54 | static 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 | |||
52 | static void dev_dbg_obj(const char *event_name, struct media_gobj *gobj) | 82 | static 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 | } |
795 | EXPORT_SYMBOL_GPL(media_entity_remote_pad); | 841 | EXPORT_SYMBOL_GPL(media_entity_remote_pad); |
842 | |||
843 | |||
844 | /* Functions related to the media interface via device nodes */ | ||
845 | |||
846 | struct 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 | } | ||
871 | EXPORT_SYMBOL_GPL(media_devnode_create); | ||
872 | |||
873 | void media_devnode_remove(struct media_intf_devnode *devnode) | ||
874 | { | ||
875 | media_gobj_remove(&devnode->intf.graph_obj); | ||
876 | kfree(devnode); | ||
877 | } | ||
878 | EXPORT_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 | */ |
40 | enum media_gobj_type { | 42 | enum 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 | */ | ||
156 | struct 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 | */ | ||
169 | struct media_intf_devnode { | ||
170 | struct media_interface intf; | ||
171 | u32 major; | ||
172 | u32 minor; | ||
173 | }; | ||
174 | |||
144 | static inline u32 media_entity_type(struct media_entity *entity) | 175 | static 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 | |||
208 | void media_gobj_init(struct media_device *mdev, | 251 | void 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); |
237 | void media_entity_pipeline_stop(struct media_entity *entity); | 280 | void media_entity_pipeline_stop(struct media_entity *entity); |
238 | 281 | ||
282 | struct 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); | ||
286 | void 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) |