[media] au0828: add support for the connectors

Depending on the input, an au0828 may have a different
number of connectors. add entities to represent them.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
Mauro Carvalho Chehab 2015-08-31 11:43:09 -03:00
parent 49a11518f8
commit d1f337375a
3 changed files with 82 additions and 12 deletions

View file

@ -153,11 +153,26 @@ static void au0828_usb_release(struct au0828_dev *dev)
} }
#ifdef CONFIG_VIDEO_AU0828_V4L2 #ifdef CONFIG_VIDEO_AU0828_V4L2
static void au0828_usb_v4l2_media_release(struct au0828_dev *dev)
{
#ifdef CONFIG_MEDIA_CONTROLLER
int i;
for (i = 0; i < AU0828_MAX_INPUT; i++) {
if (AUVI_INPUT(i).type == AU0828_VMUX_UNDEFINED)
return;
media_device_unregister_entity(&dev->input_ent[i]);
}
#endif
}
static void au0828_usb_v4l2_release(struct v4l2_device *v4l2_dev) static void au0828_usb_v4l2_release(struct v4l2_device *v4l2_dev)
{ {
struct au0828_dev *dev = struct au0828_dev *dev =
container_of(v4l2_dev, struct au0828_dev, v4l2_dev); container_of(v4l2_dev, struct au0828_dev, v4l2_dev);
au0828_usb_v4l2_media_release(dev);
v4l2_ctrl_handler_free(&dev->v4l2_ctrl_hdl); v4l2_ctrl_handler_free(&dev->v4l2_ctrl_hdl);
v4l2_device_unregister(&dev->v4l2_dev); v4l2_device_unregister(&dev->v4l2_dev);
au0828_usb_release(dev); au0828_usb_release(dev);

View file

@ -1795,6 +1795,69 @@ static int au0828_vb2_setup(struct au0828_dev *dev)
return 0; return 0;
} }
static void au0828_analog_create_entities(struct au0828_dev *dev)
{
#if defined(CONFIG_MEDIA_CONTROLLER)
static const char * const inames[] = {
[AU0828_VMUX_COMPOSITE] = "Composite",
[AU0828_VMUX_SVIDEO] = "S-Video",
[AU0828_VMUX_CABLE] = "Cable TV",
[AU0828_VMUX_TELEVISION] = "Television",
[AU0828_VMUX_DVB] = "DVB",
[AU0828_VMUX_DEBUG] = "tv debug"
};
int ret, i;
/* Initialize Video and VBI pads */
dev->video_pad.flags = MEDIA_PAD_FL_SINK;
ret = media_entity_init(&dev->vdev.entity, 1, &dev->video_pad);
if (ret < 0)
pr_err("failed to initialize video media entity!\n");
dev->vbi_pad.flags = MEDIA_PAD_FL_SINK;
ret = media_entity_init(&dev->vbi_dev.entity, 1, &dev->vbi_pad);
if (ret < 0)
pr_err("failed to initialize vbi media entity!\n");
/* Create entities for each input connector */
for (i = 0; i < AU0828_MAX_INPUT; i++) {
struct media_entity *ent = &dev->input_ent[i];
if (AUVI_INPUT(i).type == AU0828_VMUX_UNDEFINED)
break;
ent->name = inames[AUVI_INPUT(i).type];
ent->flags = MEDIA_ENT_FL_CONNECTOR;
dev->input_pad[i].flags = MEDIA_PAD_FL_SOURCE;
switch (AUVI_INPUT(i).type) {
case AU0828_VMUX_COMPOSITE:
ent->type = MEDIA_ENT_T_CONN_COMPOSITE;
break;
case AU0828_VMUX_SVIDEO:
ent->type = MEDIA_ENT_T_CONN_SVIDEO;
break;
case AU0828_VMUX_CABLE:
case AU0828_VMUX_TELEVISION:
case AU0828_VMUX_DVB:
ent->type = MEDIA_ENT_T_CONN_RF;
break;
default: /* AU0828_VMUX_DEBUG */
ent->type = MEDIA_ENT_T_CONN_TEST;
break;
}
ret = media_entity_init(ent, 1, &dev->input_pad[i]);
if (ret < 0)
pr_err("failed to initialize input pad[%d]!\n", i);
ret = media_device_register_entity(dev->media_dev, ent);
if (ret < 0)
pr_err("failed to register input entity %d!\n", i);
}
#endif
}
/**************************************************************************/ /**************************************************************************/
int au0828_analog_register(struct au0828_dev *dev, int au0828_analog_register(struct au0828_dev *dev,
@ -1883,17 +1946,8 @@ int au0828_analog_register(struct au0828_dev *dev,
dev->vbi_dev.queue->lock = &dev->vb_vbi_queue_lock; dev->vbi_dev.queue->lock = &dev->vb_vbi_queue_lock;
strcpy(dev->vbi_dev.name, "au0828a vbi"); strcpy(dev->vbi_dev.name, "au0828a vbi");
#if defined(CONFIG_MEDIA_CONTROLLER) /* Init entities at the Media Controller */
dev->video_pad.flags = MEDIA_PAD_FL_SINK; au0828_analog_create_entities(dev);
ret = media_entity_init(&dev->vdev.entity, 1, &dev->video_pad);
if (ret < 0)
pr_err("failed to initialize video media entity!\n");
dev->vbi_pad.flags = MEDIA_PAD_FL_SINK;
ret = media_entity_init(&dev->vbi_dev.entity, 1, &dev->vbi_pad);
if (ret < 0)
pr_err("failed to initialize vbi media entity!\n");
#endif
/* initialize videobuf2 stuff */ /* initialize videobuf2 stuff */
retval = au0828_vb2_setup(dev); retval = au0828_vb2_setup(dev);

View file

@ -94,7 +94,6 @@ struct au0828_board {
unsigned char has_ir_i2c:1; unsigned char has_ir_i2c:1;
unsigned char has_analog:1; unsigned char has_analog:1;
struct au0828_input input[AU0828_MAX_INPUT]; struct au0828_input input[AU0828_MAX_INPUT];
}; };
struct au0828_dvb { struct au0828_dvb {
@ -282,6 +281,8 @@ struct au0828_dev {
struct media_device *media_dev; struct media_device *media_dev;
struct media_pad video_pad, vbi_pad; struct media_pad video_pad, vbi_pad;
struct media_entity *decoder; struct media_entity *decoder;
struct media_entity input_ent[AU0828_MAX_INPUT];
struct media_pad input_pad[AU0828_MAX_INPUT];
#endif #endif
}; };