All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: linux-media@vger.kernel.org, linux-omap@vger.kernel.org,
	linux-kernel@vger.kernel.org
Cc: sakari.ailus@maxwell.research.nokia.com,
	broonie@opensource.wolfsonmicro.com, lennart@poettering.net
Subject: [RFC/PATCH v6 10/12] v4l: Add a media_device pointer to the v4l2_device structure
Date: Thu, 25 Nov 2010 03:28:17 +0100	[thread overview]
Message-ID: <1290652099-15102-11-git-send-email-laurent.pinchart@ideasonboard.com> (raw)
In-Reply-To: <1290652099-15102-1-git-send-email-laurent.pinchart@ideasonboard.com>

The pointer will later be used to register/unregister media entities
when registering/unregistering a v4l2_subdev or a video_device.

With the introduction of media devices, device drivers need to store a
pointer to a driver-specific structure in the device's drvdata.
v4l2_device can't claim ownership of the drvdata anymore.

To maintain compatibility with drivers that rely on v4l2_device storing
a pointer to itself in the device's drvdata, v4l2_device_register() will
keep doing so if the drvdata is NULL.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 Documentation/video4linux/v4l2-framework.txt |   17 ++++++++++++-----
 drivers/media/video/v4l2-device.c            |   13 +++++++------
 include/media/v4l2-device.h                  |    4 ++++
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/Documentation/video4linux/v4l2-framework.txt b/Documentation/video4linux/v4l2-framework.txt
index 4db1def..aeb2a22 100644
--- a/Documentation/video4linux/v4l2-framework.txt
+++ b/Documentation/video4linux/v4l2-framework.txt
@@ -83,11 +83,17 @@ You must register the device instance:
 
 	v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);
 
-Registration will initialize the v4l2_device struct and link dev->driver_data
-to v4l2_dev. If v4l2_dev->name is empty then it will be set to a value derived
-from dev (driver name followed by the bus_id, to be precise). If you set it
-up before calling v4l2_device_register then it will be untouched. If dev is
-NULL, then you *must* setup v4l2_dev->name before calling v4l2_device_register.
+Registration will initialize the v4l2_device struct. If the dev->driver_data
+field is NULL, it will be linked to v4l2_dev. Drivers that use the media
+device framework in addition to the V4L2 framework need to set
+dev->driver_data manually to point to the driver-specific device structure
+that embed the struct v4l2_device instance. This is achieved by a
+dev_set_drvdata() call before registering the V4L2 device instance.
+
+If v4l2_dev->name is empty then it will be set to a value derived from dev
+(driver name followed by the bus_id, to be precise). If you set it up before
+calling v4l2_device_register then it will be untouched. If dev is NULL, then
+you *must* setup v4l2_dev->name before calling v4l2_device_register.
 
 You can use v4l2_device_set_name() to set the name based on a driver name and
 a driver-global atomic_t instance. This will generate names like ivtv0, ivtv1,
@@ -108,6 +114,7 @@ You unregister with:
 
 	v4l2_device_unregister(struct v4l2_device *v4l2_dev);
 
+If the dev->driver_data field points to v4l2_dev, it will be reset to NULL.
 Unregistering will also automatically unregister all subdevs from the device.
 
 If you have a hotpluggable device (e.g. a USB device), then when a disconnect
diff --git a/drivers/media/video/v4l2-device.c b/drivers/media/video/v4l2-device.c
index 318e911..8447466 100644
--- a/drivers/media/video/v4l2-device.c
+++ b/drivers/media/video/v4l2-device.c
@@ -46,9 +46,8 @@ int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
 	if (!v4l2_dev->name[0])
 		snprintf(v4l2_dev->name, sizeof(v4l2_dev->name), "%s %s",
 			dev->driver->name, dev_name(dev));
-	if (dev_get_drvdata(dev))
-		v4l2_warn(v4l2_dev, "Non-NULL drvdata on register\n");
-	dev_set_drvdata(dev, v4l2_dev);
+	if (!dev_get_drvdata(dev))
+		dev_set_drvdata(dev, v4l2_dev);
 	return 0;
 }
 EXPORT_SYMBOL_GPL(v4l2_device_register);
@@ -71,10 +70,12 @@ EXPORT_SYMBOL_GPL(v4l2_device_set_name);
 
 void v4l2_device_disconnect(struct v4l2_device *v4l2_dev)
 {
-	if (v4l2_dev->dev) {
+	if (v4l2_dev->dev == NULL)
+		return;
+
+	if (dev_get_drvdata(v4l2_dev->dev) == v4l2_dev)
 		dev_set_drvdata(v4l2_dev->dev, NULL);
-		v4l2_dev->dev = NULL;
-	}
+	v4l2_dev->dev = NULL;
 }
 EXPORT_SYMBOL_GPL(v4l2_device_disconnect);
 
diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h
index 6648036..b649c74 100644
--- a/include/media/v4l2-device.h
+++ b/include/media/v4l2-device.h
@@ -21,6 +21,7 @@
 #ifndef _V4L2_DEVICE_H
 #define _V4L2_DEVICE_H
 
+#include <media/media-device.h>
 #include <media/v4l2-subdev.h>
 
 /* Each instance of a V4L2 device should create the v4l2_device struct,
@@ -39,6 +40,9 @@ struct v4l2_device {
 	   Note: dev might be NULL if there is no parent device
 	   as is the case with e.g. ISA devices. */
 	struct device *dev;
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	struct media_device *mdev;
+#endif
 	/* used to keep track of the registered subdevs */
 	struct list_head subdevs;
 	/* lock this struct; can be used by the driver as well if this
-- 
1.7.2.2


  parent reply	other threads:[~2010-11-25  2:31 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-25  2:28 [RFC/PATCH v6 00/12] Media controller (core and V4L2) Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 01/12] media: Media device node support Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 02/12] media: Media device Laurent Pinchart
2010-11-25  9:33   ` Clemens Ladisch
2010-11-25 14:42     ` Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 03/12] media: Entities, pads and links Laurent Pinchart
2010-11-25  9:38   ` [RFC/PATCH v6 03/12] [alsa-devel] " Clemens Ladisch
2010-11-25  9:38     ` [RFC/PATCH v6 03/12] " Clemens Ladisch
2010-11-25 13:41     ` [RFC/PATCH v6 03/12] [alsa-devel] " Mark Brown
2010-11-25 13:41       ` [RFC/PATCH v6 03/12] " Mark Brown
2010-11-25 15:29       ` [RFC/PATCH v6 03/12] [alsa-devel] " Laurent Pinchart
2010-11-25 15:35         ` Mark Brown
2010-11-25 15:35           ` [RFC/PATCH v6 03/12] " Mark Brown
2010-11-25 15:21     ` [RFC/PATCH v6 03/12] [alsa-devel] " Laurent Pinchart
2010-11-25 15:28       ` Mark Brown
2010-11-25 15:28         ` [RFC/PATCH v6 03/12] " Mark Brown
2010-11-26  9:10       ` [RFC/PATCH v6 03/12] [alsa-devel] " Clemens Ladisch
2010-11-26  9:10         ` [RFC/PATCH v6 03/12] " Clemens Ladisch
2010-12-13 16:10         ` [alsa-devel] " Clemens Ladisch
2010-12-13 16:10           ` Clemens Ladisch
2010-12-14 12:00           ` [alsa-devel] " Laurent Pinchart
2010-12-14 12:40             ` Hans Verkuil
2010-12-14 12:53               ` Laurent Pinchart
2010-12-14 12:53                 ` Laurent Pinchart
2010-12-14 13:49                 ` [alsa-devel] " Clemens Ladisch
2010-12-14 13:49                   ` Clemens Ladisch
2010-12-14 23:50                   ` [alsa-devel] " Laurent Pinchart
2010-12-14 23:50                     ` Laurent Pinchart
2010-12-21 16:49                     ` [alsa-devel] " Hans Verkuil
2010-12-14 13:31             ` Clemens Ladisch
2010-12-14 13:31               ` Clemens Ladisch
2010-12-14 13:54               ` [alsa-devel] " Takashi Iwai
2010-12-14 13:54                 ` Takashi Iwai
2010-12-14 14:25               ` [alsa-devel] " Laurent Pinchart
2010-12-14 14:25                 ` Laurent Pinchart
2010-12-14 15:30                 ` [alsa-devel] " Clemens Ladisch
2010-12-14 15:30                   ` Clemens Ladisch
2010-12-14 23:30                 ` Raymond Yau
2010-12-14 14:51               ` [alsa-devel] " Hans Verkuil
2010-12-14 14:57                 ` Laurent Pinchart
2010-12-14 14:57                   ` Laurent Pinchart
2010-12-14 14:49           ` [alsa-devel] " Sakari Ailus
2010-11-25 13:36   ` Mark Brown
2010-11-25 15:40     ` Laurent Pinchart
2010-11-25 15:49       ` Mark Brown
2010-11-26 14:13         ` Laurent Pinchart
2010-11-26 14:14           ` Mark Brown
2010-11-28 12:34             ` Laurent Pinchart
2010-11-28 15:57               ` Hans Verkuil
2010-11-25  2:28 ` [RFC/PATCH v6 04/12] media: Entity graph traversal Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 05/12] media: Reference count and power handling Laurent Pinchart
2010-11-25 13:49   ` Mark Brown
2010-11-25 15:43     ` Laurent Pinchart
2010-11-25 17:49       ` Sakari Ailus
2010-11-25 21:47         ` Mark Brown
2010-11-28 12:33           ` Laurent Pinchart
2010-11-28 18:25             ` Mark Brown
2010-11-25  2:28 ` [RFC/PATCH v6 06/12] media: Media device information query Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 07/12] media: Entities, pads and links enumeration Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 08/12] media: Links setup Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 09/12] media: Entity locking and pipeline management Laurent Pinchart
2010-11-25 13:53   ` Mark Brown
2010-11-25 15:47     ` Laurent Pinchart
2010-11-25  2:28 ` Laurent Pinchart [this message]
2010-11-25  2:28 ` [RFC/PATCH v6 11/12] v4l: Make video_device inherit from media_entity Laurent Pinchart
2010-11-25 11:38   ` Hans Verkuil
2010-11-25 14:37     ` Laurent Pinchart
2010-11-25  2:28 ` [RFC/PATCH v6 12/12] v4l: Make v4l2_subdev " Laurent Pinchart
2010-11-25 14:28 ` [RFC/PATCH v6 00/12] Media controller (core and V4L2) Mark Brown
2010-11-26 14:07   ` Laurent Pinchart
     [not found] ` <201012031119.36771.laurent.pinchart@ideasonboard.com>
     [not found]   ` <201012031306.18520.hverkuil@xs4all.nl>
2010-12-03 13:50     ` [RFC/PATCH v6 03/12] media: Entities, pads and links Laurent Pinchart
2010-12-03 14:54       ` Mark Brown
2010-12-07 17:13         ` Hans Verkuil
2010-12-07 17:55           ` Mark Brown
2010-12-07 18:11             ` Hans Verkuil
2010-12-07 19:03               ` Mark Brown
2010-12-09 12:53                 ` Laurent Pinchart
2010-12-10 16:35                 ` Sakari Ailus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1290652099-15102-11-git-send-email-laurent.pinchart@ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=lennart@poettering.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=sakari.ailus@maxwell.research.nokia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.