Re: [PATCH v11 16/21] V4L2: support asynchronous subdevice registration

2013-06-21 Thread Laurent Pinchart
Hi Guennadi,

On Friday 14 June 2013 21:08:26 Guennadi Liakhovetski wrote:
 Currently bridge device drivers register devices for all subdevices
 synchronously, typically, during their probing. E.g. if an I2C CMOS sensor
 is attached to a video bridge device, the bridge driver will create an I2C
 device and wait for the respective I2C driver to probe. This makes linking
 of devices straight forward, but this approach cannot be used with
 intrinsically asynchronous and unordered device registration systems like
 the Flattened Device Tree. To support such systems this patch adds an
 asynchronous subdevice registration framework to V4L2. To use it respective
 (e.g. I2C) subdevice drivers must register themselves with the framework.
 A bridge driver on the other hand must register notification callbacks,
 that will be called upon various related events.
 
 Signed-off-by: Guennadi Liakhovetski g.liakhovet...@gmx.de

There's still room for improvement, but nothing that can't be handled later, 
so, provided that you push the documentation along with the patches,

Acked-by: Laurent Pinchart laurent.pinch...@ideasonboard.com

 ---
 
 v11: extended comments, renamed one field
 
  drivers/media/v4l2-core/Makefile |3 +-
  drivers/media/v4l2-core/v4l2-async.c |  280 +++
  include/media/v4l2-async.h   |  105 +
  include/media/v4l2-subdev.h  |8 +
  4 files changed, 395 insertions(+), 1 deletions(-)
  create mode 100644 drivers/media/v4l2-core/v4l2-async.c
  create mode 100644 include/media/v4l2-async.h
 
 diff --git a/drivers/media/v4l2-core/Makefile
 b/drivers/media/v4l2-core/Makefile index 628c630..4c33b8d6 100644
 --- a/drivers/media/v4l2-core/Makefile
 +++ b/drivers/media/v4l2-core/Makefile
 @@ -5,7 +5,8 @@
  tuner-objs   :=  tuner-core.o
 
  videodev-objs:=  v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-fh.o 
 \
 - v4l2-event.o v4l2-ctrls.o v4l2-subdev.o v4l2-clk.o
 + v4l2-event.o v4l2-ctrls.o v4l2-subdev.o v4l2-clk.o \
 + v4l2-async.o
  ifeq ($(CONFIG_COMPAT),y)
videodev-objs += v4l2-compat-ioctl32.o
  endif
 diff --git a/drivers/media/v4l2-core/v4l2-async.c
 b/drivers/media/v4l2-core/v4l2-async.c new file mode 100644
 index 000..c80ffb4
 --- /dev/null
 +++ b/drivers/media/v4l2-core/v4l2-async.c
 @@ -0,0 +1,280 @@
 +/*
 + * V4L2 asynchronous subdevice registration API
 + *
 + * Copyright (C) 2012-2013, Guennadi Liakhovetski g.liakhovet...@gmx.de
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 + */
 +
 +#include linux/device.h
 +#include linux/err.h
 +#include linux/i2c.h
 +#include linux/list.h
 +#include linux/module.h
 +#include linux/mutex.h
 +#include linux/platform_device.h
 +#include linux/slab.h
 +#include linux/types.h
 +
 +#include media/v4l2-async.h
 +#include media/v4l2-device.h
 +#include media/v4l2-subdev.h
 +
 +static bool match_i2c(struct device *dev, struct v4l2_async_subdev *asd)
 +{
 + struct i2c_client *client = i2c_verify_client(dev);
 + return client 
 + asd-bus_type == V4L2_ASYNC_BUS_I2C 
 + asd-match.i2c.adapter_id == client-adapter-nr 
 + asd-match.i2c.address == client-addr;
 +}
 +
 +static bool match_platform(struct device *dev, struct v4l2_async_subdev
 *asd) +{
 + return asd-bus_type == V4L2_ASYNC_BUS_PLATFORM 
 + !strcmp(asd-match.platform.name, dev_name(dev));
 +}
 +
 +static LIST_HEAD(subdev_list);
 +static LIST_HEAD(notifier_list);
 +static DEFINE_MUTEX(list_lock);
 +
 +static struct v4l2_async_subdev *v4l2_async_belongs(struct
 v4l2_async_notifier *notifier, +  
 struct 
v4l2_async_subdev_list
 *asdl)
 +{
 + struct v4l2_subdev *sd = v4l2_async_to_subdev(asdl);
 + struct v4l2_async_subdev *asd;
 + bool (*match)(struct device *,
 +   struct v4l2_async_subdev *);
 +
 + list_for_each_entry(asd, notifier-waiting, list) {
 + /* bus_type has been verified valid before */
 + switch (asd-bus_type) {
 + case V4L2_ASYNC_BUS_CUSTOM:
 + match = asd-match.custom.match;
 + if (!match)
 + /* Match always */
 + return asd;
 + break;
 + case V4L2_ASYNC_BUS_PLATFORM:
 + match = match_platform;
 + break;
 + case V4L2_ASYNC_BUS_I2C:
 + match = match_i2c;
 + break;
 + default:
 + /* Cannot happen, unless someone breaks us */
 + WARN_ON(true);
 + return NULL;
 + }
 +
 + /* match cannot be NULL here */
 + if 

Re: [PATCH v11 16/21] V4L2: support asynchronous subdevice registration

2013-06-16 Thread Prabhakar Lad
Hi Guennadi,

Thanks for the patch, works fine as expected.

On Sat, Jun 15, 2013 at 12:38 AM, Guennadi Liakhovetski
g.liakhovet...@gmx.de wrote:
 Currently bridge device drivers register devices for all subdevices
 synchronously, typically, during their probing. E.g. if an I2C CMOS sensor
 is attached to a video bridge device, the bridge driver will create an I2C
 device and wait for the respective I2C driver to probe. This makes linking
 of devices straight forward, but this approach cannot be used with
 intrinsically asynchronous and unordered device registration systems like
 the Flattened Device Tree. To support such systems this patch adds an
 asynchronous subdevice registration framework to V4L2. To use it respective
 (e.g. I2C) subdevice drivers must register themselves with the framework.
 A bridge driver on the other hand must register notification callbacks,
 that will be called upon various related events.

 Signed-off-by: Guennadi Liakhovetski g.liakhovet...@gmx.de

Acked-by: Lad, Prabhakar prabhakar.cse...@gmail.com
Tested-by: Lad, Prabhakar prabhakar.cse...@gmail.com

Regards,
--Prabhakar Lad
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v11 16/21] V4L2: support asynchronous subdevice registration

2013-06-14 Thread Guennadi Liakhovetski
Currently bridge device drivers register devices for all subdevices
synchronously, typically, during their probing. E.g. if an I2C CMOS sensor
is attached to a video bridge device, the bridge driver will create an I2C
device and wait for the respective I2C driver to probe. This makes linking
of devices straight forward, but this approach cannot be used with
intrinsically asynchronous and unordered device registration systems like
the Flattened Device Tree. To support such systems this patch adds an
asynchronous subdevice registration framework to V4L2. To use it respective
(e.g. I2C) subdevice drivers must register themselves with the framework.
A bridge driver on the other hand must register notification callbacks,
that will be called upon various related events.

Signed-off-by: Guennadi Liakhovetski g.liakhovet...@gmx.de
---

v11: extended comments, renamed one field

 drivers/media/v4l2-core/Makefile |3 +-
 drivers/media/v4l2-core/v4l2-async.c |  280 ++
 include/media/v4l2-async.h   |  105 +
 include/media/v4l2-subdev.h  |8 +
 4 files changed, 395 insertions(+), 1 deletions(-)
 create mode 100644 drivers/media/v4l2-core/v4l2-async.c
 create mode 100644 include/media/v4l2-async.h

diff --git a/drivers/media/v4l2-core/Makefile b/drivers/media/v4l2-core/Makefile
index 628c630..4c33b8d6 100644
--- a/drivers/media/v4l2-core/Makefile
+++ b/drivers/media/v4l2-core/Makefile
@@ -5,7 +5,8 @@
 tuner-objs :=  tuner-core.o
 
 videodev-objs  :=  v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-fh.o \
-   v4l2-event.o v4l2-ctrls.o v4l2-subdev.o v4l2-clk.o
+   v4l2-event.o v4l2-ctrls.o v4l2-subdev.o v4l2-clk.o \
+   v4l2-async.o
 ifeq ($(CONFIG_COMPAT),y)
   videodev-objs += v4l2-compat-ioctl32.o
 endif
diff --git a/drivers/media/v4l2-core/v4l2-async.c 
b/drivers/media/v4l2-core/v4l2-async.c
new file mode 100644
index 000..c80ffb4
--- /dev/null
+++ b/drivers/media/v4l2-core/v4l2-async.c
@@ -0,0 +1,280 @@
+/*
+ * V4L2 asynchronous subdevice registration API
+ *
+ * Copyright (C) 2012-2013, Guennadi Liakhovetski g.liakhovet...@gmx.de
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include linux/device.h
+#include linux/err.h
+#include linux/i2c.h
+#include linux/list.h
+#include linux/module.h
+#include linux/mutex.h
+#include linux/platform_device.h
+#include linux/slab.h
+#include linux/types.h
+
+#include media/v4l2-async.h
+#include media/v4l2-device.h
+#include media/v4l2-subdev.h
+
+static bool match_i2c(struct device *dev, struct v4l2_async_subdev *asd)
+{
+   struct i2c_client *client = i2c_verify_client(dev);
+   return client 
+   asd-bus_type == V4L2_ASYNC_BUS_I2C 
+   asd-match.i2c.adapter_id == client-adapter-nr 
+   asd-match.i2c.address == client-addr;
+}
+
+static bool match_platform(struct device *dev, struct v4l2_async_subdev *asd)
+{
+   return asd-bus_type == V4L2_ASYNC_BUS_PLATFORM 
+   !strcmp(asd-match.platform.name, dev_name(dev));
+}
+
+static LIST_HEAD(subdev_list);
+static LIST_HEAD(notifier_list);
+static DEFINE_MUTEX(list_lock);
+
+static struct v4l2_async_subdev *v4l2_async_belongs(struct v4l2_async_notifier 
*notifier,
+   struct 
v4l2_async_subdev_list *asdl)
+{
+   struct v4l2_subdev *sd = v4l2_async_to_subdev(asdl);
+   struct v4l2_async_subdev *asd;
+   bool (*match)(struct device *,
+ struct v4l2_async_subdev *);
+
+   list_for_each_entry(asd, notifier-waiting, list) {
+   /* bus_type has been verified valid before */
+   switch (asd-bus_type) {
+   case V4L2_ASYNC_BUS_CUSTOM:
+   match = asd-match.custom.match;
+   if (!match)
+   /* Match always */
+   return asd;
+   break;
+   case V4L2_ASYNC_BUS_PLATFORM:
+   match = match_platform;
+   break;
+   case V4L2_ASYNC_BUS_I2C:
+   match = match_i2c;
+   break;
+   default:
+   /* Cannot happen, unless someone breaks us */
+   WARN_ON(true);
+   return NULL;
+   }
+
+   /* match cannot be NULL here */
+   if (match(sd-dev, asd))
+   return asd;
+   }
+
+   return NULL;
+}
+
+static int v4l2_async_test_notify(struct v4l2_async_notifier *notifier,
+ struct v4l2_async_subdev_list *asdl,
+ struct v4l2_async_subdev *asd)
+{
+   struct v4l2_subdev *sd =