return !strcmp(asd->match.device_name.name, dev_name(dev));
 }
 
+static bool match_of(struct device *dev, struct v4l2_async_subdev *asd)
+{
+       return dev->of_node == asd->match.of.node;
+}
+
 static LIST_HEAD(subdev_list);
 static LIST_HEAD(notifier_list);
 static DEFINE_MUTEX(list_lock);
                case V4L2_ASYNC_MATCH_I2C:
                        match = match_i2c;
                        break;
+               case V4L2_ASYNC_MATCH_OF:
+                       match = match_of;
+                       break;
                default:
                        /* Cannot happen, unless someone breaks us */
                        WARN_ON(true);
                case V4L2_ASYNC_MATCH_CUSTOM:
                case V4L2_ASYNC_MATCH_DEVNAME:
                case V4L2_ASYNC_MATCH_I2C:
+               case V4L2_ASYNC_MATCH_OF:
                        break;
                default:
                        dev_err(notifier->v4l2_dev ? notifier->v4l2_dev->dev : NULL,
 
 #include <linux/mutex.h>
 
 struct device;
+struct device_node;
 struct v4l2_device;
 struct v4l2_subdev;
 struct v4l2_async_notifier;
        V4L2_ASYNC_MATCH_CUSTOM,
        V4L2_ASYNC_MATCH_DEVNAME,
        V4L2_ASYNC_MATCH_I2C,
+       V4L2_ASYNC_MATCH_OF,
 };
 
 /**
 struct v4l2_async_subdev {
        enum v4l2_async_match_type match_type;
        union {
+               struct {
+                       const struct device_node *node;
+               } of;
                struct {
                        const char *name;
                } device_name;