aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-01-02 10:19:51 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-02-13 18:10:12 -0500
commita0246e02f466482a34c8ad94bedbe4efa498662d (patch)
tree0a4a7f135d52a987303f9ac8a9eef3972146780e
parent0b6ffd45ca7d2c20f752da06282fc83bff0a01b8 (diff)
[media] dvbdev: add support for media controller
Provide a way to register media controller device nodes at the DVB core. Please notice that the dvbdev callers also require changes for the devices to be registered via the media controller. Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/Kconfig10
-rw-r--r--drivers/media/dvb-core/dvbdev.c63
-rw-r--r--drivers/media/dvb-core/dvbdev.h13
3 files changed, 84 insertions, 2 deletions
diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig
index 49cd30870e0d..3ef0f90b128f 100644
--- a/drivers/media/Kconfig
+++ b/drivers/media/Kconfig
@@ -87,13 +87,21 @@ config MEDIA_RC_SUPPORT
87 87
88config MEDIA_CONTROLLER 88config MEDIA_CONTROLLER
89 bool "Media Controller API" 89 bool "Media Controller API"
90 depends on MEDIA_CAMERA_SUPPORT 90 depends on MEDIA_CAMERA_SUPPORT || MEDIA_ANALOG_TV_SUPPORT || MEDIA_DIGITAL_TV_SUPPORT
91 ---help--- 91 ---help---
92 Enable the media controller API used to query media devices internal 92 Enable the media controller API used to query media devices internal
93 topology and configure it dynamically. 93 topology and configure it dynamically.
94 94
95 This API is mostly used by camera interfaces in embedded platforms. 95 This API is mostly used by camera interfaces in embedded platforms.
96 96
97config MEDIA_CONTROLLER_DVB
98 bool "Enable Media controller for DVB"
99 depends on MEDIA_CONTROLLER
100 ---help---
101 Enable the media controller API support for DVB.
102
103 This is currently experimental.
104
97# 105#
98# Video4Linux support 106# Video4Linux support
99# Only enables if one of the V4L2 types (ATV, webcam, radio) is selected 107# Only enables if one of the V4L2 types (ATV, webcam, radio) is selected
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 983db75de350..f98fd3b29afe 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -180,6 +180,59 @@ skip:
180 return -ENFILE; 180 return -ENFILE;
181} 181}
182 182
183static void dvb_register_media_device(struct dvb_device *dvbdev,
184 int type, int minor)
185{
186#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
187 int ret;
188
189 if (!dvbdev->adapter->mdev)
190 return;
191
192 dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
193 if (!dvbdev->entity)
194 return;
195
196 dvbdev->entity->info.dev.major = DVB_MAJOR;
197 dvbdev->entity->info.dev.minor = minor;
198 dvbdev->entity->name = dvbdev->name;
199 switch (type) {
200 case DVB_DEVICE_FRONTEND:
201 dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_FE;
202 break;
203 case DVB_DEVICE_DEMUX:
204 dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_DEMUX;
205 break;
206 case DVB_DEVICE_DVR:
207 dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_DVR;
208 break;
209 case DVB_DEVICE_CA:
210 dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_CA;
211 break;
212 case DVB_DEVICE_NET:
213 dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_NET;
214 break;
215 default:
216 kfree(dvbdev->entity);
217 dvbdev->entity = NULL;
218 return;
219 }
220
221 ret = media_device_register_entity(dvbdev->adapter->mdev,
222 dvbdev->entity);
223 if (ret < 0) {
224 printk(KERN_ERR
225 "%s: media_device_register_entity failed for %s\n",
226 __func__, dvbdev->entity->name);
227 kfree(dvbdev->entity);
228 dvbdev->entity = NULL;
229 return;
230 }
231
232 printk(KERN_DEBUG "%s: media device '%s' registered.\n",
233 __func__, dvbdev->entity->name);
234#endif
235}
183 236
184int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, 237int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
185 const struct dvb_device *template, void *priv, int type) 238 const struct dvb_device *template, void *priv, int type)
@@ -258,10 +311,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
258 __func__, adap->num, dnames[type], id, PTR_ERR(clsdev)); 311 __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
259 return PTR_ERR(clsdev); 312 return PTR_ERR(clsdev);
260 } 313 }
261
262 dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", 314 dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
263 adap->num, dnames[type], id, minor, minor); 315 adap->num, dnames[type], id, minor, minor);
264 316
317 dvb_register_media_device(dvbdev, type, minor);
318
265 return 0; 319 return 0;
266} 320}
267EXPORT_SYMBOL(dvb_register_device); 321EXPORT_SYMBOL(dvb_register_device);
@@ -278,6 +332,13 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
278 332
279 device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor)); 333 device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
280 334
335#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
336 if (dvbdev->entity) {
337 media_device_unregister_entity(dvbdev->entity);
338 kfree(dvbdev->entity);
339 }
340#endif
341
281 list_del (&dvbdev->list_head); 342 list_del (&dvbdev->list_head);
282 kfree (dvbdev->fops); 343 kfree (dvbdev->fops);
283 kfree (dvbdev); 344 kfree (dvbdev);
diff --git a/drivers/media/dvb-core/dvbdev.h b/drivers/media/dvb-core/dvbdev.h
index f96b28e7fc95..485d8e660aea 100644
--- a/drivers/media/dvb-core/dvbdev.h
+++ b/drivers/media/dvb-core/dvbdev.h
@@ -27,6 +27,7 @@
27#include <linux/poll.h> 27#include <linux/poll.h>
28#include <linux/fs.h> 28#include <linux/fs.h>
29#include <linux/list.h> 29#include <linux/list.h>
30#include <media/media-device.h>
30 31
31#define DVB_MAJOR 212 32#define DVB_MAJOR 212
32 33
@@ -71,6 +72,10 @@ struct dvb_adapter {
71 int mfe_shared; /* indicates mutually exclusive frontends */ 72 int mfe_shared; /* indicates mutually exclusive frontends */
72 struct dvb_device *mfe_dvbdev; /* frontend device in use */ 73 struct dvb_device *mfe_dvbdev; /* frontend device in use */
73 struct mutex mfe_lock; /* access lock for thread creation */ 74 struct mutex mfe_lock; /* access lock for thread creation */
75
76#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
77 struct media_device *mdev;
78#endif
74}; 79};
75 80
76 81
@@ -92,6 +97,14 @@ struct dvb_device {
92 /* don't really need those !? -- FIXME: use video_usercopy */ 97 /* don't really need those !? -- FIXME: use video_usercopy */
93 int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg); 98 int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg);
94 99
100 /* Needed for media controller register/unregister */
101#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
102 const char *name;
103
104 /* Filled inside dvbdev.c */
105 struct media_entity *entity;
106#endif
107
95 void *priv; 108 void *priv;
96}; 109};
97 110