linux/include/media/v4l2-async.h
<<
>>
Prefs
   1/*
   2 * V4L2 asynchronous subdevice registration API
   3 *
   4 * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#ifndef V4L2_ASYNC_H
  12#define V4L2_ASYNC_H
  13
  14#include <linux/list.h>
  15#include <linux/mutex.h>
  16
  17struct device;
  18struct device_node;
  19struct v4l2_device;
  20struct v4l2_subdev;
  21struct v4l2_async_notifier;
  22
  23/* A random max subdevice number, used to allocate an array on stack */
  24#define V4L2_MAX_SUBDEVS 128U
  25
  26/**
  27 * enum v4l2_async_match_type - type of asynchronous subdevice logic to be used
  28 *      in order to identify a match
  29 *
  30 * @V4L2_ASYNC_MATCH_CUSTOM: Match will use the logic provided by &struct
  31 *      v4l2_async_subdev.match ops
  32 * @V4L2_ASYNC_MATCH_DEVNAME: Match will use the device name
  33 * @V4L2_ASYNC_MATCH_I2C: Match will check for I2C adapter ID and address
  34 * @V4L2_ASYNC_MATCH_OF: Match will use OF node
  35 *
  36 * This enum is used by the asyncrhronous sub-device logic to define the
  37 * algorithm that will be used to match an asynchronous device.
  38 */
  39enum v4l2_async_match_type {
  40        V4L2_ASYNC_MATCH_CUSTOM,
  41        V4L2_ASYNC_MATCH_DEVNAME,
  42        V4L2_ASYNC_MATCH_I2C,
  43        V4L2_ASYNC_MATCH_OF,
  44};
  45
  46/**
  47 * struct v4l2_async_subdev - sub-device descriptor, as known to a bridge
  48 *
  49 * @match_type: type of match that will be used
  50 * @match:      union of per-bus type matching data sets
  51 * @list:       used to link struct v4l2_async_subdev objects, waiting to be
  52 *              probed, to a notifier->waiting list
  53 */
  54struct v4l2_async_subdev {
  55        enum v4l2_async_match_type match_type;
  56        union {
  57                struct {
  58                        const struct device_node *node;
  59                } of;
  60                struct {
  61                        const char *name;
  62                } device_name;
  63                struct {
  64                        int adapter_id;
  65                        unsigned short address;
  66                } i2c;
  67                struct {
  68                        bool (*match)(struct device *,
  69                                      struct v4l2_async_subdev *);
  70                        void *priv;
  71                } custom;
  72        } match;
  73
  74        /* v4l2-async core private: not to be used by drivers */
  75        struct list_head list;
  76};
  77
  78/**
  79 * struct v4l2_async_notifier - v4l2_device notifier data
  80 *
  81 * @num_subdevs: number of subdevices
  82 * @subdevs:    array of pointers to subdevice descriptors
  83 * @v4l2_dev:   pointer to struct v4l2_device
  84 * @waiting:    list of struct v4l2_async_subdev, waiting for their drivers
  85 * @done:       list of struct v4l2_subdev, already probed
  86 * @list:       member in a global list of notifiers
  87 * @bound:      a subdevice driver has successfully probed one of subdevices
  88 * @complete:   all subdevices have been probed successfully
  89 * @unbind:     a subdevice is leaving
  90 */
  91struct v4l2_async_notifier {
  92        unsigned int num_subdevs;
  93        struct v4l2_async_subdev **subdevs;
  94        struct v4l2_device *v4l2_dev;
  95        struct list_head waiting;
  96        struct list_head done;
  97        struct list_head list;
  98        int (*bound)(struct v4l2_async_notifier *notifier,
  99                     struct v4l2_subdev *subdev,
 100                     struct v4l2_async_subdev *asd);
 101        int (*complete)(struct v4l2_async_notifier *notifier);
 102        void (*unbind)(struct v4l2_async_notifier *notifier,
 103                       struct v4l2_subdev *subdev,
 104                       struct v4l2_async_subdev *asd);
 105};
 106
 107/**
 108 * v4l2_async_notifier_register - registers a subdevice asynchronous notifier
 109 *
 110 * @v4l2_dev: pointer to &struct v4l2_device
 111 * @notifier: pointer to &struct v4l2_async_notifier
 112 */
 113int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
 114                                 struct v4l2_async_notifier *notifier);
 115
 116/**
 117 * v4l2_async_notifier_unregister - unregisters a subdevice asynchronous notifier
 118 *
 119 * @notifier: pointer to &struct v4l2_async_notifier
 120 */
 121void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier);
 122
 123/**
 124 * v4l2_async_register_subdev - registers a sub-device to the asynchronous
 125 *      subdevice framework
 126 *
 127 * @sd: pointer to &struct v4l2_subdev
 128 */
 129int v4l2_async_register_subdev(struct v4l2_subdev *sd);
 130
 131/**
 132 * v4l2_async_unregister_subdev - unregisters a sub-device to the asynchronous
 133 *      subdevice framework
 134 *
 135 * @sd: pointer to &struct v4l2_subdev
 136 */
 137void v4l2_async_unregister_subdev(struct v4l2_subdev *sd);
 138#endif
 139