Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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