Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f90c5d79 authored by Shuah Khan's avatar Shuah Khan Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarShuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent b1769651
Loading
Loading
Loading
Loading
+43 −2
Original line number Diff line number Diff line
@@ -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;
}
+1 −0
Original line number Diff line number Diff line
@@ -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
};