[media] media: v4l-core add enable/disable source common interfaces
authorShuah Khan <shuahkh@osg.samsung.com>
Thu, 11 Feb 2016 23:41:25 +0000 (21:41 -0200)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sat, 27 Feb 2016 11:33:29 +0000 (08:33 -0300)
Add a new interfaces to be used by v4l-core to invoke enable
source and disable_source handlers in the media_device. The
enable_source helper function invokes the enable_source handler
to find media source entity connected to the entity and check
is it is available or busy. If source is available, link is
activated and pipeline is started. The disable_source helper
function invokes the disable_source handler to deactivate and
stop the pipeline.

Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/v4l2-core/v4l2-mc.c
include/media/v4l2-dev.h
include/media/v4l2-mc.h

index 4a1efa827fe273ba756665641a7eb99f474a45d1..643686d405514e51bf92702fe034870e1882ae3a 100644 (file)
@@ -2,6 +2,7 @@
  * Media Controller ancillary functions
  *
  * Copyright (c) 2016 Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+ * Copyright (C) 2016 Shuah Khan <shuahkh@osg.samsung.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 
 #include <linux/module.h>
 #include <media/media-entity.h>
+#include <media/media-device.h>
+#include <media/v4l2-fh.h>
 #include <media/v4l2-mc.h>
+#include <media/videobuf2-core.h>
 
 int v4l2_mc_create_media_graph(struct media_device *mdev)
 
@@ -182,3 +186,34 @@ int v4l2_mc_create_media_graph(struct media_device *mdev)
        return 0;
 }
 EXPORT_SYMBOL_GPL(v4l2_mc_create_media_graph);
+
+int v4l_enable_media_source(struct video_device *vdev)
+{
+       struct media_device *mdev = vdev->entity.graph_obj.mdev;
+       int ret;
+
+       if (!mdev || !mdev->enable_source)
+               return 0;
+       ret = mdev->enable_source(&vdev->entity, &vdev->pipe);
+       if (ret)
+               return -EBUSY;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(v4l_enable_media_source);
+
+void v4l_disable_media_source(struct video_device *vdev)
+{
+       struct media_device *mdev = vdev->entity.graph_obj.mdev;
+
+       if (mdev && mdev->disable_source)
+               mdev->disable_source(&vdev->entity);
+}
+EXPORT_SYMBOL_GPL(v4l_disable_media_source);
+
+int v4l_vb2q_enable_media_source(struct vb2_queue *q)
+{
+       struct v4l2_fh *fh = q->owner;
+
+       return v4l_enable_media_source(fh->vdev);
+}
+EXPORT_SYMBOL_GPL(v4l_vb2q_enable_media_source);
index eeabf20e87a66d5c4306e059c15d277d17cea9a7..76056ab5c5bde3da22b13f371e77a0ab57eef197 100644 (file)
@@ -87,6 +87,7 @@ struct video_device
 #if defined(CONFIG_MEDIA_CONTROLLER)
        struct media_entity entity;
        struct media_intf_devnode *intf_devnode;
+       struct media_pipeline pipe;
 #endif
        /* device ops */
        const struct v4l2_file_operations *fops;
index 431380eb408bbda0cbdc780afa00662295908525..5cbc20923faf1a00dab74008d6e5c20a4862f370 100644 (file)
@@ -18,6 +18,7 @@
 #define _V4L2_MC_H
 
 #include <media/media-device.h>
+#include <media/v4l2-dev.h>
 
 /**
  * enum tuner_pad_index - tuner pad index for MEDIA_ENT_F_TUNER
@@ -116,11 +117,73 @@ struct usb_device;
  */
 int v4l2_mc_create_media_graph(struct media_device *mdev);
 
+/**
+ * v4l_enable_media_source() - Hold media source for exclusive use
+ *                             if free
+ *
+ * @vdev - poniter to struct video_device
+ *
+ * This interface calls enable_source handler to determine if
+ * media source is free for use. The enable_source handler is
+ * responsible for checking is the media source is free and
+ * start a pipeline between the media source and the media
+ * entity associated with the video device. This interface
+ * should be called from v4l2-core and dvb-core interfaces
+ * that change the source configuration.
+ *
+ * Return: returns zero on success or a negative error code.
+ */
+int v4l_enable_media_source(struct video_device *vdev);
+
+/**
+ * v4l_disable_media_source() -        Release media source
+ *
+ * @vdev - poniter to struct video_device
+ *
+ * This interface calls disable_source handler to release
+ * the media source. The disable_source handler stops the
+ * active media pipeline between the media source and the
+ * media entity associated with the video device.
+ *
+ * Return: returns zero on success or a negative error code.
+ */
+void v4l_disable_media_source(struct video_device *vdev);
+
+/*
+ * v4l_vb2q_enable_media_tuner -  Hold media source for exclusive use
+ *                               if free.
+ * @q - pointer to struct vb2_queue
+ *
+ * Wrapper for v4l_enable_media_source(). This function should
+ * be called from v4l2-core to enable the media source with
+ * pointer to struct vb2_queue as the input argument. Some
+ * v4l2-core interfaces don't have access to video device and
+ * this interface finds the struct video_device for the q and
+ * calls v4l_enable_media_source().
+ */
+int v4l_vb2q_enable_media_source(struct vb2_queue *q);
+
 #else
+
 static inline int v4l2_mc_create_media_graph(struct media_device *mdev)
 {
        return 0;
 }
 
+static int v4l_enable_media_source(struct video_device *vdev)
+{
+       return 0;
+}
+
+static void v4l_disable_media_source(struct video_device *vdev)
+{
+       return;
+}
+
+static int v4l_vb2q_enable_media_source(struct vb2_queue *q)
+{
+       return 0;
+}
+
 #endif
-#endif
+#endif /* _V4L2_MC_H */