* [PATCH 1/7] media: Fix DVB representation at media controller API
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
[not found] ` <cover.1420250453.git.mchehab-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>
` (6 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, linux-api
The DVB devices are identified via a (major, minor) tuple,
and not by a random id. Fix it, before we start using it.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/include/media/media-entity.h b/include/media/media-entity.h
index e00459185d20..de333cc8261b 100644
--- a/include/media/media-entity.h
+++ b/include/media/media-entity.h
@@ -97,7 +97,10 @@ struct media_entity {
u32 device;
u32 subdevice;
} alsa;
- int dvb;
+ struct {
+ u32 major;
+ u32 minor;
+ } dvb;
/* Sub-device specifications */
/* Nothing needed yet */
diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h
index d847c760e8f0..7902e800f019 100644
--- a/include/uapi/linux/media.h
+++ b/include/uapi/linux/media.h
@@ -27,7 +27,7 @@
#include <linux/types.h>
#include <linux/version.h>
-#define MEDIA_API_VERSION KERNEL_VERSION(0, 1, 0)
+#define MEDIA_API_VERSION KERNEL_VERSION(0, 1, 1)
struct media_device_info {
char driver[16];
@@ -88,7 +88,10 @@ struct media_entity_desc {
__u32 device;
__u32 subdevice;
} alsa;
- int dvb;
+ struct {
+ __u32 major;
+ __u32 minor;
+ } dvb;
/* Sub-device specifications */
/* Nothing needed yet */
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread[parent not found: <cover.1420250453.git.mchehab-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>]
* [PATCH 2/7] dvb core: add support for media controller at dvbdev
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
[not found] ` <cover.1420250453.git.mchehab-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>
` (6 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, linux-api-u79uwXL29TY76Z2rM5mHXA
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-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 983db75de350..464a457e7527 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -180,6 +180,59 @@ skip:
return -ENFILE;
}
+static void dvb_register_media_device(struct dvb_device *dvbdev,
+ int type, int minor)
+{
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ int ret;
+
+ if (!dvbdev->mdev)
+ return;
+
+ dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
+ if (!dvbdev->entity)
+ return;
+
+ dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB;
+ dvbdev->entity->info.dvb.major = DVB_MAJOR;
+ dvbdev->entity->info.dvb.minor = minor;
+ dvbdev->entity->name = dvbdev->name;
+ switch(type) {
+ case DVB_DEVICE_FRONTEND:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_FE;
+ break;
+ case DVB_DEVICE_DEMUX:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_DEMUX;
+ break;
+ case DVB_DEVICE_DVR:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_DVR;
+ break;
+ case DVB_DEVICE_CA:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_CA;
+ break;
+ case DVB_DEVICE_NET:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_NET;
+ break;
+ default:
+ kfree(dvbdev->entity);
+ dvbdev->entity = NULL;
+ return;
+ }
+
+ ret = media_device_register_entity(dvbdev->mdev, dvbdev->entity);
+ if (ret < 0) {
+ printk(KERN_ERR
+ "%s: media_device_register_entity failed for %s\n",
+ __func__, dvbdev->entity->name);
+ kfree(dvbdev->entity);
+ dvbdev->entity = NULL;
+ return;
+ }
+
+ printk(KERN_DEBUG "%s: media device '%s' registered.\n",
+ __func__, dvbdev->entity->name);
+#endif
+}
int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
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,
__func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
return PTR_ERR(clsdev);
}
-
dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
adap->num, dnames[type], id, minor, minor);
+ dvb_register_media_device(dvbdev, type, minor);
+
return 0;
}
EXPORT_SYMBOL(dvb_register_device);
@@ -278,6 +332,13 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ if (dvbdev->entity) {
+ media_device_unregister_entity(dvbdev->entity);
+ kfree(dvbdev->entity);
+ }
+#endif
+
list_del (&dvbdev->list_head);
kfree (dvbdev->fops);
kfree (dvbdev);
diff --git a/drivers/media/dvb-core/dvbdev.h b/drivers/media/dvb-core/dvbdev.h
index f96b28e7fc95..f58dfef46984 100644
--- a/drivers/media/dvb-core/dvbdev.h
+++ b/drivers/media/dvb-core/dvbdev.h
@@ -27,6 +27,7 @@
#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/list.h>
+#include <media/media-device.h>
#define DVB_MAJOR 212
@@ -92,6 +93,15 @@ struct dvb_device {
/* don't really need those !? -- FIXME: use video_usercopy */
int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg);
+ /* Needed for media controller register/unregister */
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev;
+ const char *name;
+
+ /* Filled inside dvbdev.c */
+ struct media_entity *entity;
+#endif
+
void *priv;
};
diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h
index 7902e800f019..cdb6946d315e 100644
--- a/include/uapi/linux/media.h
+++ b/include/uapi/linux/media.h
@@ -59,6 +59,12 @@ struct media_device_info {
/* A converter of analogue video to its digital representation. */
#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER (MEDIA_ENT_T_V4L2_SUBDEV + 4)
+#define MEDIA_ENT_T_DVB_FE (MEDIA_ENT_T_V4L2_SUBDEV + 5)
+#define MEDIA_ENT_T_DVB_DEMUX (MEDIA_ENT_T_V4L2_SUBDEV + 6)
+#define MEDIA_ENT_T_DVB_DVR (MEDIA_ENT_T_V4L2_SUBDEV + 7)
+#define MEDIA_ENT_T_DVB_CA (MEDIA_ENT_T_V4L2_SUBDEV + 8)
+#define MEDIA_ENT_T_DVB_NET (MEDIA_ENT_T_V4L2_SUBDEV + 9)
+
#define MEDIA_ENT_FL_DEFAULT (1 << 0)
struct media_entity_desc {
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 2/7] dvb core: add support for media controller at dvbdev
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
0 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, linux-api
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>
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 983db75de350..464a457e7527 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -180,6 +180,59 @@ skip:
return -ENFILE;
}
+static void dvb_register_media_device(struct dvb_device *dvbdev,
+ int type, int minor)
+{
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ int ret;
+
+ if (!dvbdev->mdev)
+ return;
+
+ dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
+ if (!dvbdev->entity)
+ return;
+
+ dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB;
+ dvbdev->entity->info.dvb.major = DVB_MAJOR;
+ dvbdev->entity->info.dvb.minor = minor;
+ dvbdev->entity->name = dvbdev->name;
+ switch(type) {
+ case DVB_DEVICE_FRONTEND:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_FE;
+ break;
+ case DVB_DEVICE_DEMUX:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_DEMUX;
+ break;
+ case DVB_DEVICE_DVR:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_DVR;
+ break;
+ case DVB_DEVICE_CA:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_CA;
+ break;
+ case DVB_DEVICE_NET:
+ dvbdev->entity->flags = MEDIA_ENT_T_DVB_NET;
+ break;
+ default:
+ kfree(dvbdev->entity);
+ dvbdev->entity = NULL;
+ return;
+ }
+
+ ret = media_device_register_entity(dvbdev->mdev, dvbdev->entity);
+ if (ret < 0) {
+ printk(KERN_ERR
+ "%s: media_device_register_entity failed for %s\n",
+ __func__, dvbdev->entity->name);
+ kfree(dvbdev->entity);
+ dvbdev->entity = NULL;
+ return;
+ }
+
+ printk(KERN_DEBUG "%s: media device '%s' registered.\n",
+ __func__, dvbdev->entity->name);
+#endif
+}
int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
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,
__func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
return PTR_ERR(clsdev);
}
-
dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
adap->num, dnames[type], id, minor, minor);
+ dvb_register_media_device(dvbdev, type, minor);
+
return 0;
}
EXPORT_SYMBOL(dvb_register_device);
@@ -278,6 +332,13 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ if (dvbdev->entity) {
+ media_device_unregister_entity(dvbdev->entity);
+ kfree(dvbdev->entity);
+ }
+#endif
+
list_del (&dvbdev->list_head);
kfree (dvbdev->fops);
kfree (dvbdev);
diff --git a/drivers/media/dvb-core/dvbdev.h b/drivers/media/dvb-core/dvbdev.h
index f96b28e7fc95..f58dfef46984 100644
--- a/drivers/media/dvb-core/dvbdev.h
+++ b/drivers/media/dvb-core/dvbdev.h
@@ -27,6 +27,7 @@
#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/list.h>
+#include <media/media-device.h>
#define DVB_MAJOR 212
@@ -92,6 +93,15 @@ struct dvb_device {
/* don't really need those !? -- FIXME: use video_usercopy */
int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg);
+ /* Needed for media controller register/unregister */
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev;
+ const char *name;
+
+ /* Filled inside dvbdev.c */
+ struct media_entity *entity;
+#endif
+
void *priv;
};
diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h
index 7902e800f019..cdb6946d315e 100644
--- a/include/uapi/linux/media.h
+++ b/include/uapi/linux/media.h
@@ -59,6 +59,12 @@ struct media_device_info {
/* A converter of analogue video to its digital representation. */
#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER (MEDIA_ENT_T_V4L2_SUBDEV + 4)
+#define MEDIA_ENT_T_DVB_FE (MEDIA_ENT_T_V4L2_SUBDEV + 5)
+#define MEDIA_ENT_T_DVB_DEMUX (MEDIA_ENT_T_V4L2_SUBDEV + 6)
+#define MEDIA_ENT_T_DVB_DVR (MEDIA_ENT_T_V4L2_SUBDEV + 7)
+#define MEDIA_ENT_T_DVB_CA (MEDIA_ENT_T_V4L2_SUBDEV + 8)
+#define MEDIA_ENT_T_DVB_NET (MEDIA_ENT_T_V4L2_SUBDEV + 9)
+
#define MEDIA_ENT_FL_DEFAULT (1 << 0)
struct media_entity_desc {
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/7] dvb core: add media controller support for DVB frontend
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
2015-01-03 2:04 ` [PATCH 1/7] media: Fix DVB representation at media controller API Mauro Carvalho Chehab
[not found] ` <cover.1420250453.git.mchehab-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
2015-01-03 2:04 ` [PATCH 4/7] dvb core: add support for demux/dvr nodes at media controller Mauro Carvalho Chehab
` (4 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, Shuah Khan, Ole Ernst, Akihiro Tsukada
Now that the dvb core is capable of registering devices via the
media controller, add support for the DVB frontend devices.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index 2cf30576bf39..e34c47de1135 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -2612,12 +2612,16 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
struct dvb_frontend* fe)
{
struct dvb_frontend_private *fepriv;
- static const struct dvb_device dvbdev_template = {
+ const struct dvb_device dvbdev_template = {
.users = ~0,
.writers = 1,
.readers = (~0)-1,
.fops = &dvb_frontend_fops,
- .kernel_ioctl = dvb_frontend_ioctl
+ .kernel_ioctl = dvb_frontend_ioctl,
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ .mdev = fe->mdev,
+ .name = fe->ops.info.name,
+#endif
};
dev_dbg(dvb->device, "%s:\n", __func__);
diff --git a/drivers/media/dvb-core/dvb_frontend.h b/drivers/media/dvb-core/dvb_frontend.h
index 816269e5f706..79b79a90d612 100644
--- a/drivers/media/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb-core/dvb_frontend.h
@@ -40,6 +40,8 @@
#include <linux/dvb/frontend.h>
+#include <media/media-device.h>
+
#include "dvbdev.h"
/*
@@ -415,6 +417,11 @@ struct dtv_frontend_properties {
struct dvb_frontend {
struct dvb_frontend_ops ops;
struct dvb_adapter *dvb;
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev;
+#endif
+
void *demodulator_priv;
void *tuner_priv;
void *frontend_priv;
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 4/7] dvb core: add support for demux/dvr nodes at media controller
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
` (2 preceding siblings ...)
2015-01-03 2:04 ` [PATCH 3/7] dvb core: add media controller support for DVB frontend Mauro Carvalho Chehab
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
2015-01-03 2:04 ` [PATCH 5/7] dvb core: add support for CA node at the " Mauro Carvalho Chehab
` (3 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, Changbing Xiong
Make the dvb core demux support aware of the media controller and
register the corresponding devices.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
index abff803ad69a..9071636534db 100644
--- a/drivers/media/dvb-core/dmxdev.c
+++ b/drivers/media/dvb-core/dmxdev.c
@@ -1136,13 +1136,6 @@ static const struct file_operations dvb_demux_fops = {
.llseek = default_llseek,
};
-static struct dvb_device dvbdev_demux = {
- .priv = NULL,
- .users = 1,
- .writers = 1,
- .fops = &dvb_demux_fops
-};
-
static int dvb_dvr_do_ioctl(struct file *file,
unsigned int cmd, void *parg)
{
@@ -1209,16 +1202,29 @@ static const struct file_operations dvb_dvr_fops = {
.llseek = default_llseek,
};
-static struct dvb_device dvbdev_dvr = {
- .priv = NULL,
- .readers = 1,
- .users = 1,
- .fops = &dvb_dvr_fops
-};
-
int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
{
int i;
+ struct dvb_device dvbdev_demux = {
+ .priv = NULL,
+ .users = 1,
+ .writers = 1,
+ .fops = &dvb_demux_fops,
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ .mdev = dmxdev->mdev,
+ .name = "demux",
+#endif
+ };
+ struct dvb_device dvbdev_dvr = {
+ .priv = NULL,
+ .readers = 1,
+ .users = 1,
+ .fops = &dvb_dvr_fops,
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ .mdev = dmxdev->mdev,
+ .name = "dvr",
+#endif
+ };
if (dmxdev->demux->open(dmxdev->demux) < 0)
return -EUSERS;
diff --git a/drivers/media/dvb-core/dmxdev.h b/drivers/media/dvb-core/dmxdev.h
index 48c6cf92ab99..09832a8e6956 100644
--- a/drivers/media/dvb-core/dmxdev.h
+++ b/drivers/media/dvb-core/dmxdev.h
@@ -36,6 +36,8 @@
#include <linux/dvb/dmx.h>
+#include <media/media-device.h>
+
#include "dvbdev.h"
#include "demux.h"
#include "dvb_ringbuffer.h"
@@ -110,6 +112,10 @@ struct dmxdev {
struct mutex mutex;
spinlock_t lock;
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev;
+#endif
};
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 5/7] dvb core: add support for CA node at the media controller
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
` (3 preceding siblings ...)
2015-01-03 2:04 ` [PATCH 4/7] dvb core: add support for demux/dvr nodes at media controller Mauro Carvalho Chehab
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
2015-01-03 2:04 ` [PATCH 6/7] dvb core: add support for DVB net " Mauro Carvalho Chehab
` (2 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab
Make the dvb core CA support aware of the media controller and
register the corresponding devices.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/dvb-core/dvb_ca_en50221.c b/drivers/media/dvb-core/dvb_ca_en50221.c
index 0aac3096728e..011cb2bc04e1 100644
--- a/drivers/media/dvb-core/dvb_ca_en50221.c
+++ b/drivers/media/dvb-core/dvb_ca_en50221.c
@@ -1638,14 +1638,6 @@ static const struct file_operations dvb_ca_fops = {
.llseek = noop_llseek,
};
-static struct dvb_device dvbdev_ca = {
- .priv = NULL,
- .users = 1,
- .readers = 1,
- .writers = 1,
- .fops = &dvb_ca_fops,
-};
-
/* ******************************************************************************** */
/* Initialisation/shutdown functions */
@@ -1667,6 +1659,17 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
int ret;
struct dvb_ca_private *ca = NULL;
int i;
+ struct dvb_device dvbdev_ca = {
+ .priv = NULL,
+ .users = 1,
+ .readers = 1,
+ .writers = 1,
+ .fops = &dvb_ca_fops,
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ .mdev = pubca->mdev,
+ .name = "ca_en50221",
+#endif
+ };
dprintk("%s\n", __func__);
diff --git a/drivers/media/dvb-core/dvb_ca_en50221.h b/drivers/media/dvb-core/dvb_ca_en50221.h
index 7df2e141187a..c8e69f418eb5 100644
--- a/drivers/media/dvb-core/dvb_ca_en50221.h
+++ b/drivers/media/dvb-core/dvb_ca_en50221.h
@@ -24,6 +24,8 @@
#include <linux/list.h>
#include <linux/dvb/ca.h>
+#include <media/media-device.h>
+
#include "dvbdev.h"
#define DVB_CA_EN50221_POLL_CAM_PRESENT 1
@@ -74,6 +76,10 @@ struct dvb_ca_en50221 {
/* Opaque data used by the dvb_ca core. Do not modify! */
void* private;
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev;
+#endif
};
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 6/7] dvb core: add support for DVB net node at the media controller
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
` (4 preceding siblings ...)
2015-01-03 2:04 ` [PATCH 5/7] dvb core: add support for CA node at the " Mauro Carvalho Chehab
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
2015-01-03 2:04 ` [PATCH 7/7] cx231xx: add media controller support Mauro Carvalho Chehab
2015-01-03 2:08 ` [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, Joe Perches, David Herrmann,
David S. Miller, Dan Carpenter, Tom Gundersen
Make the dvb core network support aware of the media controller and
register the corresponding devices.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c
index e4041f074909..cbb50da6b35f 100644
--- a/drivers/media/dvb-core/dvb_net.c
+++ b/drivers/media/dvb-core/dvb_net.c
@@ -1498,14 +1498,6 @@ static const struct file_operations dvb_net_fops = {
.llseek = noop_llseek,
};
-static struct dvb_device dvbdev_net = {
- .priv = NULL,
- .users = 1,
- .writers = 1,
- .fops = &dvb_net_fops,
-};
-
-
void dvb_net_release (struct dvb_net *dvbnet)
{
int i;
@@ -1530,6 +1522,16 @@ int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
struct dmx_demux *dmx)
{
int i;
+ struct dvb_device dvbdev_net = {
+ .priv = NULL,
+ .users = 1,
+ .writers = 1,
+ .fops = &dvb_net_fops,
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ .mdev = dvbnet->mdev,
+ .name = "dvb net",
+#endif
+ };
mutex_init(&dvbnet->ioctl_mutex);
dvbnet->demux = dmx;
diff --git a/drivers/media/dvb-core/dvb_net.h b/drivers/media/dvb-core/dvb_net.h
index ede78e8c8aa8..7e32e416a67c 100644
--- a/drivers/media/dvb-core/dvb_net.h
+++ b/drivers/media/dvb-core/dvb_net.h
@@ -28,6 +28,8 @@
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
+#include <media/media-device.h>
+
#include "dvbdev.h"
#define DVB_NET_DEVICES_MAX 10
@@ -41,6 +43,10 @@ struct dvb_net {
unsigned int exit:1;
struct dmx_demux *demux;
struct mutex ioctl_mutex;
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev;
+#endif
};
void dvb_net_release(struct dvb_net *);
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 7/7] cx231xx: add media controller support
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
` (5 preceding siblings ...)
2015-01-03 2:04 ` [PATCH 6/7] dvb core: add support for DVB net " Mauro Carvalho Chehab
@ 2015-01-03 2:04 ` Mauro Carvalho Chehab
2015-01-03 2:08 ` [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: Mauro Carvalho Chehab, Linux Media Mailing List,
Mauro Carvalho Chehab, Matthias Schwarzott, Antti Palosaari,
Hans Verkuil
Let's add media controller support for this driver and register it
for both V4L and DVB.
The media controller on this driver is not mandatory, as it can fully
work without it. So, if the media controller register fails, just print
an error message, but proceed with device registering.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c
index ae05d591f228..7e1c73a5172d 100644
--- a/drivers/media/usb/cx231xx/cx231xx-cards.c
+++ b/drivers/media/usb/cx231xx/cx231xx-cards.c
@@ -912,9 +912,6 @@ static inline void cx231xx_set_model(struct cx231xx *dev)
*/
void cx231xx_pre_card_setup(struct cx231xx *dev)
{
-
- cx231xx_set_model(dev);
-
dev_info(dev->dev, "Identified as %s (card=%d)\n",
dev->board.name, dev->model);
@@ -1092,6 +1089,17 @@ void cx231xx_config_i2c(struct cx231xx *dev)
call_all(dev, video, s_stream, 1);
}
+static void cx231xx_unregister_media_device(struct cx231xx *dev)
+{
+#ifdef CONFIG_MEDIA_CONTROLLER
+ if (dev->media_dev) {
+ media_device_unregister(dev->media_dev);
+ kfree(dev->media_dev);
+ dev->media_dev = NULL;
+ }
+#endif
+}
+
/*
* cx231xx_realease_resources()
* unregisters the v4l2,i2c and usb devices
@@ -1099,6 +1107,8 @@ void cx231xx_config_i2c(struct cx231xx *dev)
*/
void cx231xx_release_resources(struct cx231xx *dev)
{
+ cx231xx_unregister_media_device(dev);
+
cx231xx_release_analog_resources(dev);
cx231xx_remove_from_devlist(dev);
@@ -1117,6 +1127,38 @@ void cx231xx_release_resources(struct cx231xx *dev)
clear_bit(dev->devno, &cx231xx_devused);
}
+static void cx231xx_media_device_register(struct cx231xx *dev,
+ struct usb_device *udev)
+{
+#ifdef CONFIG_MEDIA_CONTROLLER
+ struct media_device *mdev;
+ int ret;
+
+ mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
+ if (!mdev)
+ return;
+
+ mdev->dev = dev->dev;
+ strlcpy(mdev->model, dev->board.name, sizeof(mdev->model));
+ if (udev->serial)
+ strlcpy(mdev->serial, udev->serial, sizeof(mdev->serial));
+ strcpy(mdev->bus_info, udev->devpath);
+ mdev->hw_revision = le16_to_cpu(udev->descriptor.bcdDevice);
+ mdev->driver_version = LINUX_VERSION_CODE;
+
+ ret = media_device_register(mdev);
+ if (ret) {
+ dev_err(dev->dev,
+ "Couldn't create a media device. Error: %d\n",
+ ret);
+ kfree(mdev);
+ return;
+ }
+
+ dev->media_dev = mdev;
+#endif
+}
+
/*
* cx231xx_init_dev()
* allocates and inits the device structs, registers i2c bus and v4l device
@@ -1225,10 +1267,8 @@ static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
}
retval = cx231xx_register_analog_devices(dev);
- if (retval) {
- cx231xx_release_analog_resources(dev);
+ if (retval)
goto err_analog;
- }
cx231xx_ir_init(dev);
@@ -1236,6 +1276,8 @@ static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
return 0;
err_analog:
+ cx231xx_unregister_media_device(dev);
+ cx231xx_release_analog_resources(dev);
cx231xx_remove_from_devlist(dev);
err_dev_init:
cx231xx_dev_uninit(dev);
@@ -1437,6 +1479,8 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
dev->video_mode.alt = -1;
dev->dev = d;
+ cx231xx_set_model(dev);
+
dev->interface_count++;
/* reset gpio dir and value */
dev->gpio_dir = 0;
@@ -1501,7 +1545,11 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
/* save our data pointer in this interface device */
usb_set_intfdata(interface, dev);
+ /* Register the media controller */
+ cx231xx_media_device_register(dev, udev);
+
/* Create v4l2 device */
+ dev->v4l2_dev.mdev = dev->media_dev;
retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
if (retval) {
dev_err(d, "v4l2_device_register failed\n");
diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c
index dd600b994e69..1c0d082fc4ef 100644
--- a/drivers/media/usb/cx231xx/cx231xx-dvb.c
+++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c
@@ -500,6 +500,7 @@ static int register_dvb(struct cx231xx_dvb *dvb,
dvb->dmxdev.filternum = 256;
dvb->dmxdev.demux = &dvb->demux.dmx;
dvb->dmxdev.capabilities = 0;
+ dvb->dmxdev.mdev = dev->media_dev;
result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
if (result < 0) {
dev_warn(dev->dev,
@@ -535,6 +536,7 @@ static int register_dvb(struct cx231xx_dvb *dvb,
}
/* register network adapter */
+ dvb->net.mdev = dev->media_dev;
dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
return 0;
@@ -846,6 +848,8 @@ static int dvb_init(struct cx231xx *dev)
result = -EINVAL;
goto out_free;
}
+ if (dev->media_dev)
+ dev->dvb->frontend->mdev = dev->media_dev;
/* register everything */
result = register_dvb(dvb, THIS_MODULE, dev, dev->dev);
diff --git a/drivers/media/usb/cx231xx/cx231xx.h b/drivers/media/usb/cx231xx/cx231xx.h
index 6d6f3ee812f6..af9d6c4041dc 100644
--- a/drivers/media/usb/cx231xx/cx231xx.h
+++ b/drivers/media/usb/cx231xx/cx231xx.h
@@ -658,6 +658,10 @@ struct cx231xx {
struct video_device *vbi_dev;
struct video_device *radio_dev;
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *media_dev;
+#endif
+
unsigned char eedata[256];
struct cx231xx_video_mode video_mode;
--
2.1.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 0/7] dvb core: add basic support for the media controller
2015-01-03 2:04 [PATCH 0/7] dvb core: add basic support for the media controller Mauro Carvalho Chehab
` (6 preceding siblings ...)
2015-01-03 2:04 ` [PATCH 7/7] cx231xx: add media controller support Mauro Carvalho Chehab
@ 2015-01-03 2:08 ` Mauro Carvalho Chehab
7 siblings, 0 replies; 10+ messages in thread
From: Mauro Carvalho Chehab @ 2015-01-03 2:08 UTC (permalink / raw)
Cc: Laurent Pinchart, Linux Media Mailing List, Mauro Carvalho Chehab
Em Sat, 03 Jan 2015 00:04:33 -0200
Mauro Carvalho Chehab <mchehab@osg.samsung.com> escreveu:
> This patch series adds basic support for the media controller at the
> DVB core: it creates one media entity per DVB devnode, if the media
> device is passed as an argument to the DVB structures.
>
> The cx231xx driver was modified to pass such argument for DVB NET,
> DVB frontend and DVB demux.
Forgot to add here, but it is probably worth to show the output of
media-ctl showing the entities created on cx231xx:
$ /usr/local/bin/media-ctl -p
Media controller API version 0.1.1
Media device information
------------------------
driver cx231xx
model Pixelview PlayTV USB Hybrid
serial CIR000000000001
bus info 1.2
hw revision 0x4001
driver version 3.19.0
Device topology
- entity 1: cx25840 19-0044 (0 pad, 0 link)
type V4L2 subdev subtype Unknown flags 0
- entity 2: tuner 21-0060 (0 pad, 0 link)
type V4L2 subdev subtype Unknown flags 0
- entity 3: cx231xx #0 video (0 pad, 0 link)
type Node subtype V4L flags 0
device node name /dev/video0
- entity 4: cx231xx #0 vbi (0 pad, 0 link)
type Node subtype V4L flags 0
device node name /dev/vbi0
- entity 5: Fujitsu mb86A20s (0 pad, 0 link)
type Node subtype DVB flags 20005
- entity 6: demux (0 pad, 0 link)
type Node subtype DVB flags 20006
- entity 7: dvr (0 pad, 0 link)
type Node subtype DVB flags 20007
- entity 8: dvb net (0 pad, 0 link)
type Node subtype DVB flags 20009
PS.: I didn't patch yet the media-ctl to better enumerate the DVB devices.
Cheers,
Mauro
^ permalink raw reply [flat|nested] 10+ messages in thread