[media] media: au0828-core register entity_notify hook

Register entity_notify async hook to create links between existing
bridge driver entities and a newly added non-bridge driver entities. For
example, this handler creates link between V4L decoder entity and ALSA
mixer entity.

[mchehab@osg.samsung.com: fix merge conflicts and make
 au0828_media_graph_notify static to shut up a warning]

Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
Shuah Khan 2016-02-11 21:41:34 -02:00 committed by Mauro Carvalho Chehab
parent b176965176
commit f90c5d79e5
2 changed files with 44 additions and 2 deletions

View file

@ -20,6 +20,7 @@
*/
#include "au0828.h"
#include "au8522.h"
#include <linux/module.h>
#include <linux/slab.h>
@ -204,14 +205,43 @@ static int au0828_media_device_init(struct au0828_dev *dev,
return 0;
}
static void au0828_media_graph_notify(struct media_entity *new,
void *notify_data)
{
#ifdef CONFIG_MEDIA_CONTROLLER
struct au0828_dev *dev = (struct au0828_dev *) notify_data;
int ret;
if (!dev->decoder)
return;
switch (new->function) {
case MEDIA_ENT_F_AUDIO_MIXER:
ret = media_create_pad_link(dev->decoder,
AU8522_PAD_AUDIO_OUT,
new, 0,
MEDIA_LNK_FL_ENABLED);
if (ret)
dev_err(&dev->usbdev->dev,
"Mixer Pad Link Create Error: %d\n",
ret);
break;
default:
break;
}
#endif
}
static int au0828_media_device_register(struct au0828_dev *dev,
struct usb_device *udev)
{
#ifdef CONFIG_MEDIA_CONTROLLER
int ret;
if (dev->media_dev &&
!media_devnode_is_registered(&dev->media_dev->devnode)) {
if (!dev->media_dev)
return 0;
if (!media_devnode_is_registered(&dev->media_dev->devnode)) {
/* register media device */
ret = media_device_register(dev->media_dev);
@ -221,6 +251,17 @@ static int au0828_media_device_register(struct au0828_dev *dev,
return ret;
}
}
/* register entity_notify callback */
dev->entity_notify.notify_data = (void *) dev;
dev->entity_notify.notify = (void *) au0828_media_graph_notify;
ret = media_device_register_entity_notify(dev->media_dev,
&dev->entity_notify);
if (ret) {
dev_err(&udev->dev,
"Media Device register entity_notify Error: %d\n",
ret);
return ret;
}
#endif
return 0;
}

View file

@ -282,6 +282,7 @@ struct au0828_dev {
struct media_entity *decoder;
struct media_entity input_ent[AU0828_MAX_INPUT];
struct media_pad input_pad[AU0828_MAX_INPUT];
struct media_entity_notify entity_notify;
#endif
};