Blame view

include/media/v4l2-subdev.h 43.3 KB
c942fddf8   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
2
  /*
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
3
4
5
   *  V4L2 sub-device support header.
   *
   *  Copyright (C) 2008  Hans Verkuil <hverkuil@xs4all.nl>
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
6
7
8
9
   */
  
  #ifndef _V4L2_SUBDEV_H
  #define _V4L2_SUBDEV_H
291031192   Sylwester Nawrocki   [media] V4L: Add ...
10
  #include <linux/types.h>
333c8b977   Laurent Pinchart   [media] v4l: v4l2...
11
  #include <linux/v4l2-subdev.h>
61f5db549   Laurent Pinchart   [media] v4l: Make...
12
  #include <media/media-entity.h>
e9e310491   Guennadi Liakhovetski   [media] V4L2: sup...
13
  #include <media/v4l2-async.h>
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
14
  #include <media/v4l2-common.h>
2096a5dcf   Laurent Pinchart   [media] v4l: subd...
15
  #include <media/v4l2-dev.h>
7cd5a16b2   Stanimir Varbanov   [media] v4l: Crea...
16
  #include <media/v4l2-fh.h>
9a74251d8   Guennadi Liakhovetski   V4L/DVB (13658): ...
17
  #include <media/v4l2-mediabus.h>
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
18

1d986add9   Andy Walls   V4L/DVB (13096): ...
19
20
21
22
23
24
25
26
27
  /* generic v4l2_device notify callback notification values */
  #define V4L2_SUBDEV_IR_RX_NOTIFY		_IOW('v', 0, u32)
  #define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ	0x00000001
  #define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED	0x00000002
  #define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN	0x00000004
  #define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN	0x00000008
  
  #define V4L2_SUBDEV_IR_TX_NOTIFY		_IOW('v', 1, u32)
  #define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ	0x00000001
17e484686   jean-michel.hautbois@vodalys.com   [media] v4l2-subd...
28
  #define	V4L2_DEVICE_NOTIFY_EVENT		_IOW('v', 2, struct v4l2_event)
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
29
  struct v4l2_device;
0996517cf   Hans Verkuil   V4L/DVB: v4l2: Ad...
30
  struct v4l2_ctrl_handler;
8ae5640f1   Lars-Peter Clausen   [media] Add helpe...
31
  struct v4l2_event;
02adb1cc7   Sakari Ailus   [media] v4l: subd...
32
33
  struct v4l2_event_subscription;
  struct v4l2_fh;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
34
  struct v4l2_subdev;
f0beea8f4   Laurent Pinchart   [media] v4l: subd...
35
  struct v4l2_subdev_fh;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
36
  struct tuner_setup;
291031192   Sylwester Nawrocki   [media] V4L: Add ...
37
  struct v4l2_mbus_frame_desc;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
38

21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
39
40
41
42
43
44
45
46
47
48
  /**
   * struct v4l2_decode_vbi_line - used to decode_vbi_line
   *
   * @is_second_field: Set to 0 for the first (odd) field;
   *	set to 1 for the second (even) field.
   * @p: Pointer to the sliced VBI data from the decoder. On exit, points to
   *	the start of the payload.
   * @line: Line number of the sliced VBI data (1-23)
   * @type: VBI service type (V4L2_SLICED_*). 0 if no service found
   */
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
49
  struct v4l2_decode_vbi_line {
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
50
51
52
53
  	u32 is_second_field;
  	u8 *p;
  	u32 line;
  	u32 type;
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
54
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
55
56
57
58
59
  /*
   * Sub-devices are devices that are connected somehow to the main bridge
   * device. These devices are usually audio/video muxers/encoders/decoders or
   * sensors and webcam controllers.
   *
e907bf3c9   Mauro Carvalho Chehab   media: include: f...
60
   * Usually these devices are controlled through an i2c bus, but other buses
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
   * may also be used.
   *
   * The v4l2_subdev struct provides a way of accessing these devices in a
   * generic manner. Most operations that these sub-devices support fall in
   * a few categories: core ops, audio ops, video ops and tuner ops.
   *
   * More categories can be added if needed, although this should remain a
   * limited set (no more than approx. 8 categories).
   *
   * Each category has its own set of ops that subdev drivers can implement.
   *
   * A subdev driver can leave the pointer to the category ops NULL if
   * it does not implement them (e.g. an audio subdev will generally not
   * implement the video category ops). The exception is the core category:
   * this must always be present.
   *
   * These ops are all used internally so it is no problem to change, remove
   * or add ops or move ops from one to another category. Currently these
   * ops are based on the original ioctls, but since ops are not limited to
   * one argument there is room for improvement here once all i2c subdev
   * drivers are converted to use these ops.
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
82
   */
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
83
84
85
86
87
88
89
90
91
92
93
94
  /*
   * Core ops: it is highly recommended to implement at least these ops:
   *
   * log_status
   * g_register
   * s_register
   *
   * This provides basic debugging support.
   *
   * The ioctl ops is meant for generic ioctl-like commands. Depending on
   * the use-case it might be better to use subdev-specific ops (currently
   * not yet implemented) since ops provide proper type-checking.
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
95
   */
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
96

4eb2f5572   Mauro Carvalho Chehab   media: v4l2-subde...
97
98
99
100
101
102
103
104
  /**
   * enum v4l2_subdev_io_pin_bits - Subdevice external IO pin configuration
   *	bits
   *
   * @V4L2_SUBDEV_IO_PIN_DISABLE: disables a pin config. ENABLE assumed.
   * @V4L2_SUBDEV_IO_PIN_OUTPUT: set it if pin is an output.
   * @V4L2_SUBDEV_IO_PIN_INPUT: set it if pin is an input.
   * @V4L2_SUBDEV_IO_PIN_SET_VALUE: to set the output value via
4a3fad709   Mauro Carvalho Chehab   media: fix usage ...
105
   *				  &struct v4l2_subdev_io_pin_config->value.
4eb2f5572   Mauro Carvalho Chehab   media: v4l2-subde...
106
107
108
109
110
111
112
113
114
115
   * @V4L2_SUBDEV_IO_PIN_ACTIVE_LOW: pin active is bit 0.
   *				   Otherwise, ACTIVE HIGH is assumed.
   */
  enum v4l2_subdev_io_pin_bits {
  	V4L2_SUBDEV_IO_PIN_DISABLE	= 0,
  	V4L2_SUBDEV_IO_PIN_OUTPUT	= 1,
  	V4L2_SUBDEV_IO_PIN_INPUT	= 2,
  	V4L2_SUBDEV_IO_PIN_SET_VALUE	= 3,
  	V4L2_SUBDEV_IO_PIN_ACTIVE_LOW	= 4,
  };
66752f839   Andy Walls   V4L/DVB: v4l2_sub...
116

21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
117
118
119
  /**
   * struct v4l2_subdev_io_pin_config - Subdevice external IO pin configuration
   *
4eb2f5572   Mauro Carvalho Chehab   media: v4l2-subde...
120
121
   * @flags: bitmask with flags for this pin's config, whose bits are defined by
   *	   &enum v4l2_subdev_io_pin_bits.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
122
123
124
125
126
   * @pin: Chip external IO pin to configure
   * @function: Internal signal pad/function to route to IO pin
   * @value: Initial value for pin - e.g. GPIO output value
   * @strength: Pin drive strength
   */
66752f839   Andy Walls   V4L/DVB: v4l2_sub...
127
  struct v4l2_subdev_io_pin_config {
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
128
129
130
131
132
  	u32 flags;
  	u8 pin;
  	u8 function;
  	u8 value;
  	u8 strength;
66752f839   Andy Walls   V4L/DVB: v4l2_sub...
133
  };
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
134
  /**
783001adf   Mauro Carvalho Chehab   [media] v4l2-subd...
135
136
   * struct v4l2_subdev_core_ops - Define core ops callbacks for subdevs
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
137
   * @log_status: callback for VIDIOC_LOG_STATUS() ioctl handler code.
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
   *
   * @s_io_pin_config: configure one or more chip I/O pins for chips that
   *	multiplex different internal signal pads out to IO pins.  This function
   *	takes a pointer to an array of 'n' pin configuration entries, one for
   *	each pin being configured.  This function could be called at times
   *	other than just subdevice initialization.
   *
   * @init: initialize the sensor registers to some sort of reasonable default
   *	values. Do not use for new drivers and should be removed in existing
   *	drivers.
   *
   * @load_fw: load firmware.
   *
   * @reset: generic reset command. The argument selects which subsystems to
   *	reset. Passing 0 will always reset the whole chip. Do not use for new
   *	drivers without discussing this first on the linux-media mailinglist.
   *	There should be no reason normally to reset a device.
   *
   * @s_gpio: set GPIO pins. Very simple right now, might need to be extended with
   *	a direction argument if needed.
   *
1d8955b2c   Mauro Carvalho Chehab   [media] v4l2-subd...
159
160
161
162
163
164
   * @ioctl: called at the end of ioctl() syscall handler at the V4L2 core.
   *	   used to provide support for private ioctls used on the driver.
   *
   * @compat_ioctl32: called when a 32 bits application uses a 64 bits Kernel,
   *		    in order to fix data passed from/to userspace.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
165
   * @g_register: callback for VIDIOC_DBG_G_REGISTER() ioctl handler code.
783001adf   Mauro Carvalho Chehab   [media] v4l2-subd...
166
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
167
   * @s_register: callback for VIDIOC_DBG_S_REGISTER() ioctl handler code.
783001adf   Mauro Carvalho Chehab   [media] v4l2-subd...
168
   *
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
169
170
171
172
173
174
   * @s_power: puts subdevice in power saving mode (on == 0) or normal operation
   *	mode (on == 1).
   *
   * @interrupt_service_routine: Called by the bridge chip's interrupt service
   *	handler, when an interrupt status has be raised due to this subdev,
   *	so that this subdev can handle the details.  It may schedule work to be
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
175
   *	performed later.  It must not sleep. **Called from an IRQ context**.
1d8955b2c   Mauro Carvalho Chehab   [media] v4l2-subd...
176
177
178
179
180
   *
   * @subscribe_event: used by the drivers to request the control framework that
   *		     for it to be warned when the value of a control changes.
   *
   * @unsubscribe_event: remove event subscription from the control framework.
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
181
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
182
  struct v4l2_subdev_core_ops {
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
183
  	int (*log_status)(struct v4l2_subdev *sd);
66752f839   Andy Walls   V4L/DVB: v4l2_sub...
184
185
  	int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
  				      struct v4l2_subdev_io_pin_config *pincfg);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
186
  	int (*init)(struct v4l2_subdev *sd, u32 val);
cc26b076c   Hans Verkuil   V4L/DVB (11369): ...
187
  	int (*load_fw)(struct v4l2_subdev *sd);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
188
189
  	int (*reset)(struct v4l2_subdev *sd, u32 val);
  	int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
069b74793   Hans Verkuil   V4L/DVB (10138): ...
190
  	long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
ab58a3016   Hans Verkuil   [media] v4l2-subd...
191
192
193
194
  #ifdef CONFIG_COMPAT
  	long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd,
  			       unsigned long arg);
  #endif
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
195
  #ifdef CONFIG_VIDEO_ADV_DEBUG
aecde8b53   Hans Verkuil   V4L/DVB (10141): ...
196
  	int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
977ba3b1b   Hans Verkuil   [media] v4l2: add...
197
  	int (*s_register)(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
198
  #endif
622b828ab   Laurent Pinchart   V4L/DVB (13238): ...
199
  	int (*s_power)(struct v4l2_subdev *sd, int on);
260e689ba   Andy Walls   V4L/DVB: v4l2_sub...
200
201
  	int (*interrupt_service_routine)(struct v4l2_subdev *sd,
  						u32 status, bool *handled);
02adb1cc7   Sakari Ailus   [media] v4l: subd...
202
203
204
205
  	int (*subscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
  			       struct v4l2_event_subscription *sub);
  	int (*unsubscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
  				 struct v4l2_event_subscription *sub);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
206
  };
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
207
  /**
e383ce073   Mauro Carvalho Chehab   [media] get rid o...
208
209
   * struct v4l2_subdev_tuner_ops - Callbacks used when v4l device was opened
   *	in radio mode.
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
210
   *
3aab15af9   Hans Verkuil   media: add tuner ...
211
212
213
   * @standby: puts the tuner in standby mode. It will be woken up
   *	     automatically the next time it is used.
   *
07bf9355c   Mauro Carvalho Chehab   media: v4l2-subde...
214
215
216
217
   * @s_radio: callback that switches the tuner to radio mode.
   *	     drivers should explicitly call it when a tuner ops should
   *	     operate on radio mode, before being able to handle it.
   *	     Used on devices that have both AM/FM radio receiver and TV.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
218
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
219
   * @s_frequency: callback for VIDIOC_S_FREQUENCY() ioctl handler code.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
220
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
221
   * @g_frequency: callback for VIDIOC_G_FREQUENCY() ioctl handler code.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
222
   *		 freq->type must be filled in. Normally done by video_ioctl2()
89cb3ddbe   Mauro Carvalho Chehab   [media] doc-rst: ...
223
   *		 or the bridge driver.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
224
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
225
   * @enum_freq_bands: callback for VIDIOC_ENUM_FREQ_BANDS() ioctl handler code.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
226
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
227
   * @g_tuner: callback for VIDIOC_G_TUNER() ioctl handler code.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
228
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
229
   * @s_tuner: callback for VIDIOC_S_TUNER() ioctl handler code. @vt->type must be
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
230
   *	     filled in. Normally done by video_ioctl2 or the
89cb3ddbe   Mauro Carvalho Chehab   [media] doc-rst: ...
231
   *	     bridge driver.
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
232
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
233
   * @g_modulator: callback for VIDIOC_G_MODULATOR() ioctl handler code.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
234
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
235
   * @s_modulator: callback for VIDIOC_S_MODULATOR() ioctl handler code.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
236
   *
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
237
   * @s_type_addr: sets tuner type and its I2C addr.
91963aae9   Mauro Carvalho Chehab   [media] v4l2-subd...
238
   *
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
239
   * @s_config: sets tda9887 specific stuff, like port1, port2 and qss
07bf9355c   Mauro Carvalho Chehab   media: v4l2-subde...
240
241
242
   *
   * .. note::
   *
4a3fad709   Mauro Carvalho Chehab   media: fix usage ...
243
   *	On devices that have both AM/FM and TV, it is up to the driver
07bf9355c   Mauro Carvalho Chehab   media: v4l2-subde...
244
245
246
247
248
249
   *	to explicitly call s_radio when the tuner should be switched to
   *	radio mode, before handling other &struct v4l2_subdev_tuner_ops
   *	that would require it. An example of such usage is::
   *
   *	  static void s_frequency(void *priv, const struct v4l2_frequency *f)
   *	  {
4a3fad709   Mauro Carvalho Chehab   media: fix usage ...
250
   *		...
07bf9355c   Mauro Carvalho Chehab   media: v4l2-subde...
251
252
253
254
255
   *		if (f.type == V4L2_TUNER_RADIO)
   *			v4l2_device_call_all(v4l2_dev, 0, tuner, s_radio);
   *		...
   *		v4l2_device_call_all(v4l2_dev, 0, tuner, s_frequency);
   *	  }
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
256
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
257
  struct v4l2_subdev_tuner_ops {
3aab15af9   Hans Verkuil   media: add tuner ...
258
  	int (*standby)(struct v4l2_subdev *sd);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
259
  	int (*s_radio)(struct v4l2_subdev *sd);
b530a447b   Hans Verkuil   [media] v4l2: add...
260
  	int (*s_frequency)(struct v4l2_subdev *sd, const struct v4l2_frequency *freq);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
261
  	int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
c58d1de5d   Antti Palosaari   [media] v4l: add ...
262
  	int (*enum_freq_bands)(struct v4l2_subdev *sd, struct v4l2_frequency_band *band);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
263
  	int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
2f73c7c58   Hans Verkuil   [media] v4l2: add...
264
  	int (*s_tuner)(struct v4l2_subdev *sd, const struct v4l2_tuner *vt);
d6bacea6c   Eduardo Valentin   V4L/DVB (12547): ...
265
  	int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
3f70e1f59   Hans Verkuil   [media] v4l2: mak...
266
  	int (*s_modulator)(struct v4l2_subdev *sd, const struct v4l2_modulator *vm);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
267
268
269
  	int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
  	int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
  };
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
270
271
272
273
274
275
276
277
278
279
280
281
  /**
   * struct v4l2_subdev_audio_ops - Callbacks used for audio-related settings
   *
   * @s_clock_freq: set the frequency (in Hz) of the audio clock output.
   *	Used to slave an audio processor to the video decoder, ensuring that
   *	audio and video remain synchronized. Usual values for the frequency
   *	are 48000, 44100 or 32000 Hz. If the frequency is not supported, then
   *	-EINVAL is returned.
   *
   * @s_i2s_clock_freq: sets I2S speed in bps. This is used to provide a standard
   *	way to select I2S clock used by driving digital audio streams at some
   *	board designs. Usual values for the frequency are 1024000 and 2048000.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
282
   *	If the frequency is not supported, then %-EINVAL is returned.
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
283
284
285
286
287
288
289
290
291
   *
   * @s_routing: used to define the input and/or output pins of an audio chip,
   *	and any additional configuration data.
   *	Never attempt to use user-level input IDs (e.g. Composite, S-Video,
   *	Tuner) at this level. An i2c device shouldn't know about whether an
   *	input pin is connected to a Composite connector, become on another
   *	board or platform it might be connected to something else entirely.
   *	The calling driver is responsible for mapping a user-level input to
   *	the right pins on the i2c device.
1d8955b2c   Mauro Carvalho Chehab   [media] v4l2-subd...
292
293
294
   *
   * @s_stream: used to notify the audio code that stream will start or has
   *	stopped.
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
295
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
296
297
298
  struct v4l2_subdev_audio_ops {
  	int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
  	int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
5325b4272   Hans Verkuil   V4L/DVB (11380): ...
299
  	int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
3ccc646b5   Andy Walls   V4L/DVB: cx25840,...
300
  	int (*s_stream)(struct v4l2_subdev *sd, int enable);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
301
  };
bb92895a1   Mauro Carvalho Chehab   media: v4l2-subde...
302
303
304
305
306
307
308
309
310
  /**
   * enum v4l2_mbus_frame_desc_entry - media bus frame description flags
   *
   * @V4L2_MBUS_FRAME_DESC_FL_LEN_MAX:
   *	Indicates that &struct v4l2_mbus_frame_desc_entry->length field
   *	specifies maximum data length.
   * @V4L2_MBUS_FRAME_DESC_FL_BLOB:
   *	Indicates that the format does not have line offsets, i.e.
   *	the receiver should use 1D DMA.
174d6a39b   Sakari Ailus   [media] v4l: V4L2...
311
   */
bb92895a1   Mauro Carvalho Chehab   media: v4l2-subde...
312
313
314
315
  enum v4l2_mbus_frame_desc_flags {
  	V4L2_MBUS_FRAME_DESC_FL_LEN_MAX	= BIT(0),
  	V4L2_MBUS_FRAME_DESC_FL_BLOB	= BIT(1),
  };
291031192   Sylwester Nawrocki   [media] V4L: Add ...
316
317
318
  
  /**
   * struct v4l2_mbus_frame_desc_entry - media bus frame description structure
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
319
   *
bb92895a1   Mauro Carvalho Chehab   media: v4l2-subde...
320
321
   * @flags:	bitmask flags, as defined by &enum v4l2_mbus_frame_desc_flags.
   * @pixelcode:	media bus pixel code, valid if @flags
4a3fad709   Mauro Carvalho Chehab   media: fix usage ...
322
   *		%FRAME_DESC_FL_BLOB is not set.
bb92895a1   Mauro Carvalho Chehab   media: v4l2-subde...
323
324
   * @length:	number of octets per frame, valid if @flags
   *		%V4L2_MBUS_FRAME_DESC_FL_LEN_MAX is set.
291031192   Sylwester Nawrocki   [media] V4L: Add ...
325
326
   */
  struct v4l2_mbus_frame_desc_entry {
bb92895a1   Mauro Carvalho Chehab   media: v4l2-subde...
327
  	enum v4l2_mbus_frame_desc_flags flags;
291031192   Sylwester Nawrocki   [media] V4L: Add ...
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
  	u32 pixelcode;
  	u32 length;
  };
  
  #define V4L2_FRAME_DESC_ENTRY_MAX	4
  
  /**
   * struct v4l2_mbus_frame_desc - media bus data frame description
   * @entry: frame descriptors array
   * @num_entries: number of entries in @entry array
   */
  struct v4l2_mbus_frame_desc {
  	struct v4l2_mbus_frame_desc_entry entry[V4L2_FRAME_DESC_ENTRY_MAX];
  	unsigned short num_entries;
  };
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
343
344
  /**
   * struct v4l2_subdev_video_ops - Callbacks used when v4l device was opened
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
345
   *				  in video mode.
b84aeb03a   Mauro Carvalho Chehab   [media] v4l2-subd...
346
347
348
349
350
351
352
353
354
   *
   * @s_routing: see s_routing in audio_ops, except this version is for video
   *	devices.
   *
   * @s_crystal_freq: sets the frequency of the crystal used to generate the
   *	clocks in Hz. An extra flags field allows device specific configuration
   *	regarding clock frequency dividers, etc. If not used, then set flags
   *	to 0. If the frequency is not supported, then -EINVAL is returned.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
355
   * @g_std: callback for VIDIOC_G_STD() ioctl handler code.
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
356
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
357
   * @s_std: callback for VIDIOC_S_STD() ioctl handler code.
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
358
   *
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
359
360
361
362
363
364
   * @s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
   *	video input devices.
   *
   * @g_std_output: get current standard for video OUTPUT devices. This is ignored
   *	by video input devices.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
365
   * @querystd: callback for VIDIOC_QUERYSTD() ioctl handler code.
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
366
   *
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
367
   * @g_tvnorms: get &v4l2_std_id with all standards supported by the video
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
368
369
370
371
372
   *	CAPTURE device. This is ignored by video output devices.
   *
   * @g_tvnorms_output: get v4l2_std_id with all standards supported by the video
   *	OUTPUT device. This is ignored by video capture devices.
   *
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
373
   * @g_input_status: get input status. Same as the status field in the
8162a0b5a   Mauro Carvalho Chehab   media: v4l2-subde...
374
   *	&struct v4l2_input
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
375
   *
1d8955b2c   Mauro Carvalho Chehab   [media] v4l2-subd...
376
377
378
   * @s_stream: used to notify the driver that a video stream will start or has
   *	stopped.
   *
ecf37493f   Hans Verkuil   [media] v4l2-subd...
379
   * @g_pixelaspect: callback to return the pixelaspect ratio.
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
380
   *
f277267df   Robby Cai   Revert "media: v4...
381
382
383
384
   * @g_parm: callback for VIDIOC_G_PARM() ioctl handler code.
   *
   * @s_parm: callback for VIDIOC_S_PARM() ioctl handler code.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
385
386
   * @g_frame_interval: callback for VIDIOC_SUBDEV_G_FRAME_INTERVAL()
   *		      ioctl handler code.
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
387
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
388
389
   * @s_frame_interval: callback for VIDIOC_SUBDEV_S_FRAME_INTERVAL()
   *		      ioctl handler code.
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
390
391
   *
   * @s_dv_timings: Set custom dv timings in the sub device. This is used
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
392
393
394
   *	when sub device is capable of setting detailed timing information
   *	in the hardware to generate/detect the video signal.
   *
914728ab6   Mauro Carvalho Chehab   [media] v4l2_subd...
395
396
   * @g_dv_timings: Get custom dv timings in the sub device.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
397
   * @query_dv_timings: callback for VIDIOC_QUERY_DV_TIMINGS() ioctl handler code.
b84aeb03a   Mauro Carvalho Chehab   [media] v4l2-subd...
398
   *
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
399
400
401
   * @s_rx_buffer: set a host allocated memory buffer for the subdev. The subdev
   *	can adjust @size to a lower value and must not write more data to the
   *	buffer starting at @data than the original value of @size.
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
402
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
403
  struct v4l2_subdev_video_ops {
5325b4272   Hans Verkuil   V4L/DVB (11380): ...
404
  	int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
3ff4ad815   Hans Verkuil   V4L/DVB (11377): ...
405
  	int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
8774bed9c   Laurent Pinchart   [media] v4l: subd...
406
407
  	int (*g_std)(struct v4l2_subdev *sd, v4l2_std_id *norm);
  	int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
408
  	int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);
5930ab2ba   Tomasz Stanislawski   [media] v4l: add ...
409
  	int (*g_std_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
1b6f1d960   Hans Verkuil   V4L/DVB (10542): ...
410
  	int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std);
48353863e   Hans Verkuil   [media] v4l2-subd...
411
  	int (*g_tvnorms)(struct v4l2_subdev *sd, v4l2_std_id *std);
839cf8134   Tomasz Stanislawski   [media] v4l: add ...
412
  	int (*g_tvnorms_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
1b6f1d960   Hans Verkuil   V4L/DVB (10542): ...
413
  	int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
414
  	int (*s_stream)(struct v4l2_subdev *sd, int enable);
ecf37493f   Hans Verkuil   [media] v4l2-subd...
415
  	int (*g_pixelaspect)(struct v4l2_subdev *sd, struct v4l2_fract *aspect);
f277267df   Robby Cai   Revert "media: v4...
416
417
  	int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
  	int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
35c3017a2   Laurent Pinchart   [media] v4l: v4l2...
418
419
420
421
  	int (*g_frame_interval)(struct v4l2_subdev *sd,
  				struct v4l2_subdev_frame_interval *interval);
  	int (*s_frame_interval)(struct v4l2_subdev *sd,
  				struct v4l2_subdev_frame_interval *interval);
b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
422
423
424
425
  	int (*s_dv_timings)(struct v4l2_subdev *sd,
  			struct v4l2_dv_timings *timings);
  	int (*g_dv_timings)(struct v4l2_subdev *sd,
  			struct v4l2_dv_timings *timings);
5d7758eed   Hans Verkuil   [media] v4l2 fram...
426
427
  	int (*query_dv_timings)(struct v4l2_subdev *sd,
  			struct v4l2_dv_timings *timings);
a375e1dfe   Sylwester Nawrocki   [media] V4L: Add ...
428
429
  	int (*s_rx_buffer)(struct v4l2_subdev *sd, void *buf,
  			   unsigned int *size);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
430
  };
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
431
432
  /**
   * struct v4l2_subdev_vbi_ops - Callbacks used when v4l device was opened
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
433
   *				  in video mode via the vbi device node.
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
434
435
   *
   *  @decode_vbi_line: video decoders that support sliced VBI need to implement
9ef0b3f3f   Mauro Carvalho Chehab   [media] v4l2-subd...
436
   *	this ioctl. Field p of the &struct v4l2_decode_vbi_line is set to the
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
437
438
439
440
   *	start of the VBI data that was generated by the decoder. The driver
   *	then parses the sliced VBI data and sets the other fields in the
   *	struct accordingly. The pointer p is updated to point to the start of
   *	the payload which can be copied verbatim into the data field of the
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
441
   *	&struct v4l2_sliced_vbi_data. If no valid VBI data was found, then the
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
442
443
444
   *	type field is set to 0 on return.
   *
   * @s_vbi_data: used to generate VBI signals on a video signal.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
445
446
447
448
   *	&struct v4l2_sliced_vbi_data is filled with the data packets that
   *	should be output. Note that if you set the line field to 0, then that
   *	VBI signal is disabled. If no valid VBI data was found, then the type
   *	field is set to 0 on return.
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
449
450
451
   *
   * @g_vbi_data: used to obtain the sliced VBI packet from a readback register.
   *	Not all video decoders support this. If no data is available because
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
452
   *	the readback register contains invalid or erroneous data %-EIO is
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
453
454
455
456
   *	returned. Note that you must fill in the 'id' member and the 'field'
   *	member (to determine whether CC data from the first or second field
   *	should be obtained).
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
457
458
   * @g_sliced_vbi_cap: callback for VIDIOC_G_SLICED_VBI_CAP() ioctl handler
   *		      code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
459
   *
5c6629847   Mauro Carvalho Chehab   [media] v4l2-subd...
460
461
462
463
464
   * @s_raw_fmt: setup the video encoder/decoder for raw VBI.
   *
   * @g_sliced_fmt: retrieve the current sliced VBI settings.
   *
   * @s_sliced_fmt: setup the sliced VBI settings.
32cd527f5   Hans Verkuil   V4L/DVB: v4l: mov...
465
466
467
468
469
470
   */
  struct v4l2_subdev_vbi_ops {
  	int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
  	int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
  	int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
  	int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
54aefafbf   Hans Verkuil   V4L/DVB: v4l: add...
471
472
473
  	int (*s_raw_fmt)(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
  	int (*g_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
  	int (*s_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
32cd527f5   Hans Verkuil   V4L/DVB: v4l: mov...
474
  };
325361088   Guennadi Liakhovetski   V4L/DVB (13644): ...
475
476
477
478
479
480
  /**
   * struct v4l2_subdev_sensor_ops - v4l2-subdev sensor operations
   * @g_skip_top_lines: number of lines at the top of the image to be skipped.
   *		      This is needed for some sensors, which always corrupt
   *		      several top lines of the output image, or which send their
   *		      metadata in them.
f80a3ab08   Laurent Pinchart   [media] v4l: Add ...
481
482
483
   * @g_skip_frames: number of frames to skip at stream start. This is needed for
   *		   buggy sensors that generate faulty frames when they are
   *		   turned on.
325361088   Guennadi Liakhovetski   V4L/DVB (13644): ...
484
485
486
   */
  struct v4l2_subdev_sensor_ops {
  	int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines);
f80a3ab08   Laurent Pinchart   [media] v4l: Add ...
487
  	int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames);
325361088   Guennadi Liakhovetski   V4L/DVB (13644): ...
488
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
489
490
491
492
  /**
   * enum v4l2_subdev_ir_mode- describes the type of IR supported
   *
   * @V4L2_SUBDEV_IR_MODE_PULSE_WIDTH: IR uses struct ir_raw_event records
1d986add9   Andy Walls   V4L/DVB (13096): ...
493
   */
1d986add9   Andy Walls   V4L/DVB (13096): ...
494
  enum v4l2_subdev_ir_mode {
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
495
  	V4L2_SUBDEV_IR_MODE_PULSE_WIDTH,
1d986add9   Andy Walls   V4L/DVB (13096): ...
496
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
  /**
   * struct v4l2_subdev_ir_parameters - Parameters for IR TX or TX
   *
   * @bytes_per_data_element: bytes per data element of data in read or
   *	write call.
   * @mode: IR mode as defined by &enum v4l2_subdev_ir_mode.
   * @enable: device is active if true
   * @interrupt_enable: IR interrupts are enabled if true
   * @shutdown: if true: set hardware to low/no power, false: normal mode
   *
   * @modulation: if true, it uses carrier, if false: baseband
   * @max_pulse_width:  maximum pulse width in ns, valid only for baseband signal
   * @carrier_freq: carrier frequency in Hz, valid only for modulated signal
   * @duty_cycle: duty cycle percentage, valid only for modulated signal
   * @invert_level: invert signal level
   *
   * @invert_carrier_sense: Send 0/space as a carrier burst. used only in TX.
   *
   * @noise_filter_min_width: min time of a valid pulse, in ns. Used only for RX.
   * @carrier_range_lower: Lower carrier range, in Hz, valid only for modulated
   *	signal. Used only for RX.
   * @carrier_range_upper: Upper carrier range, in Hz, valid only for modulated
   *	signal. Used only for RX.
   * @resolution: The receive resolution, in ns . Used only for RX.
   */
1d986add9   Andy Walls   V4L/DVB (13096): ...
522
  struct v4l2_subdev_ir_parameters {
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
523
  	unsigned int bytes_per_data_element;
1d986add9   Andy Walls   V4L/DVB (13096): ...
524
525
526
527
  	enum v4l2_subdev_ir_mode mode;
  
  	bool enable;
  	bool interrupt_enable;
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
528
  	bool shutdown;
1d986add9   Andy Walls   V4L/DVB (13096): ...
529

21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
530
531
532
533
534
  	bool modulation;
  	u32 max_pulse_width;
  	unsigned int carrier_freq;
  	unsigned int duty_cycle;
  	bool invert_level;
5a28d9a32   Andy Walls   V4L/DVB: v4l2_sub...
535
536
  
  	/* Tx only */
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
537
  	bool invert_carrier_sense;
1d986add9   Andy Walls   V4L/DVB (13096): ...
538
539
  
  	/* Rx only */
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
540
541
542
543
  	u32 noise_filter_min_width;
  	unsigned int carrier_range_lower;
  	unsigned int carrier_range_upper;
  	u32 resolution;
1d986add9   Andy Walls   V4L/DVB (13096): ...
544
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
545
546
547
548
549
  /**
   * struct v4l2_subdev_ir_ops - operations for IR subdevices
   *
   * @rx_read: Reads received codes or pulse width data.
   *	The semantics are similar to a non-blocking read() call.
f2f475e4c   Randy Dunlap   media: v4l2-subde...
550
   * @rx_g_parameters: Get the current operating parameters and state of
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
551
   *	the IR receiver.
f2f475e4c   Randy Dunlap   media: v4l2-subde...
552
   * @rx_s_parameters: Set the current operating parameters and state of
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
553
554
555
556
557
558
559
560
561
562
563
564
565
   *	the IR receiver.  It is recommended to call
   *	[rt]x_g_parameters first to fill out the current state, and only change
   *	the fields that need to be changed.  Upon return, the actual device
   *	operating parameters and state will be returned.  Note that hardware
   *	limitations may prevent the actual settings from matching the requested
   *	settings - e.g. an actual carrier setting of 35,904 Hz when 36,000 Hz
   *	was requested.  An exception is when the shutdown parameter is true.
   *	The last used operational parameters will be returned, but the actual
   *	state of the hardware be different to minimize power consumption and
   *	processing when shutdown is true.
   *
   * @tx_write: Writes codes or pulse width data for transmission.
   *	The semantics are similar to a non-blocking write() call.
f2f475e4c   Randy Dunlap   media: v4l2-subde...
566
   * @tx_g_parameters: Get the current operating parameters and state of
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
567
   *	the IR transmitter.
f2f475e4c   Randy Dunlap   media: v4l2-subde...
568
   * @tx_s_parameters: Set the current operating parameters and state of
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
569
570
571
572
573
574
575
576
577
578
579
   *	the IR transmitter.  It is recommended to call
   *	[rt]x_g_parameters first to fill out the current state, and only change
   *	the fields that need to be changed.  Upon return, the actual device
   *	operating parameters and state will be returned.  Note that hardware
   *	limitations may prevent the actual settings from matching the requested
   *	settings - e.g. an actual carrier setting of 35,904 Hz when 36,000 Hz
   *	was requested.  An exception is when the shutdown parameter is true.
   *	The last used operational parameters will be returned, but the actual
   *	state of the hardware be different to minimize power consumption and
   *	processing when shutdown is true.
   */
1d986add9   Andy Walls   V4L/DVB (13096): ...
580
  struct v4l2_subdev_ir_ops {
1d986add9   Andy Walls   V4L/DVB (13096): ...
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
  	/* Receiver */
  	int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
  				ssize_t *num);
  
  	int (*rx_g_parameters)(struct v4l2_subdev *sd,
  				struct v4l2_subdev_ir_parameters *params);
  	int (*rx_s_parameters)(struct v4l2_subdev *sd,
  				struct v4l2_subdev_ir_parameters *params);
  
  	/* Transmitter */
  	int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
  				ssize_t *num);
  
  	int (*tx_g_parameters)(struct v4l2_subdev *sd,
  				struct v4l2_subdev_ir_parameters *params);
  	int (*tx_s_parameters)(struct v4l2_subdev *sd,
  				struct v4l2_subdev_ir_parameters *params);
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
599
600
601
  /**
   * struct v4l2_subdev_pad_config - Used for storing subdev pad information.
   *
1059b687d   Baruch Siach   [media] v4l2-subd...
602
603
604
   * @try_fmt: &struct v4l2_mbus_framefmt
   * @try_crop: &struct v4l2_rect to be used for crop
   * @try_compose: &struct v4l2_rect to be used for compose
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
605
606
607
608
   *
   * This structure only needs to be passed to the pad op if the 'which' field
   * of the main argument is set to %V4L2_SUBDEV_FORMAT_TRY. For
   * %V4L2_SUBDEV_FORMAT_ACTIVE it is safe to pass %NULL.
f7234138f   Hans Verkuil   [media] v4l2-subd...
609
610
611
612
613
614
   */
  struct v4l2_subdev_pad_config {
  	struct v4l2_mbus_framefmt try_fmt;
  	struct v4l2_rect try_crop;
  	struct v4l2_rect try_compose;
  };
291031192   Sylwester Nawrocki   [media] V4L: Add ...
615
616
  /**
   * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
617
   *
9b02cbb3e   Laurent Pinchart   [media] v4l: subd...
618
   * @init_cfg: initialize the pad config to default values
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
619
   * @enum_mbus_code: callback for VIDIOC_SUBDEV_ENUM_MBUS_CODE() ioctl handler
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
620
   *		    code.
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
621
   * @enum_frame_size: callback for VIDIOC_SUBDEV_ENUM_FRAME_SIZE() ioctl handler
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
622
623
   *		     code.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
624
   * @enum_frame_interval: callback for VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL() ioctl
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
625
626
   *			 handler code.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
627
   * @get_fmt: callback for VIDIOC_SUBDEV_G_FMT() ioctl handler code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
628
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
629
   * @set_fmt: callback for VIDIOC_SUBDEV_S_FMT() ioctl handler code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
630
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
631
   * @get_selection: callback for VIDIOC_SUBDEV_G_SELECTION() ioctl handler code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
632
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
633
   * @set_selection: callback for VIDIOC_SUBDEV_S_SELECTION() ioctl handler code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
634
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
635
   * @get_edid: callback for VIDIOC_SUBDEV_G_EDID() ioctl handler code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
636
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
637
   * @set_edid: callback for VIDIOC_SUBDEV_S_EDID() ioctl handler code.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
638
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
639
   * @dv_timings_cap: callback for VIDIOC_SUBDEV_DV_TIMINGS_CAP() ioctl handler
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
640
641
   *		    code.
   *
3fb558f6c   Mauro Carvalho Chehab   media: v4l2-subde...
642
   * @enum_dv_timings: callback for VIDIOC_SUBDEV_ENUM_DV_TIMINGS() ioctl handler
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
643
644
   *		     code.
   *
1d8955b2c   Mauro Carvalho Chehab   [media] v4l2-subd...
645
646
647
   * @link_validate: used by the media controller code to check if the links
   *		   that belongs to a pipeline can be used for stream.
   *
291031192   Sylwester Nawrocki   [media] V4L: Add ...
648
   * @get_frame_desc: get the current low level media bus frame parameters.
e44cc20a1   Mauro Carvalho Chehab   [media] v4l2_subd...
649
   *
1d8955b2c   Mauro Carvalho Chehab   [media] v4l2-subd...
650
   * @set_frame_desc: set the low level media bus frame parameters, @fd array
291031192   Sylwester Nawrocki   [media] V4L: Add ...
651
   *                  may be adjusted by the subdev driver to device capabilities.
38df0b850   Jacopo Mondi   media: v4l2-subde...
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
   *
   * @get_mbus_config: get the media bus configuration of a remote sub-device.
   *		     The media bus configuration is usually retrieved from the
   *		     firmware interface at sub-device probe time, immediately
   *		     applied to the hardware and eventually adjusted by the
   *		     driver. Remote sub-devices (usually video receivers) shall
   *		     use this operation to query the transmitting end bus
   *		     configuration in order to adjust their own one accordingly.
   *		     Callers should make sure they get the most up-to-date as
   *		     possible configuration from the remote end, likely calling
   *		     this operation as close as possible to stream on time. The
   *		     operation shall fail if the pad index it has been called on
   *		     is not valid or in case of unrecoverable failures.
   *
   * @set_mbus_config: set the media bus configuration of a remote sub-device.
   *		     This operations is intended to allow, in combination with
   *		     the get_mbus_config operation, the negotiation of media bus
   *		     configuration parameters between media sub-devices. The
   *		     operation shall not fail if the requested configuration is
   *		     not supported, but the driver shall update the content of
   *		     the %config argument to reflect what has been actually
   *		     applied to the hardware. The operation shall fail if the
   *		     pad index it has been called on is not valid or in case of
   *		     unrecoverable failures.
291031192   Sylwester Nawrocki   [media] V4L: Add ...
676
   */
eb08f3548   Laurent Pinchart   [media] v4l: v4l2...
677
  struct v4l2_subdev_pad_ops {
9b02cbb3e   Laurent Pinchart   [media] v4l: subd...
678
679
  	int (*init_cfg)(struct v4l2_subdev *sd,
  			struct v4l2_subdev_pad_config *cfg);
f7234138f   Hans Verkuil   [media] v4l2-subd...
680
681
  	int (*enum_mbus_code)(struct v4l2_subdev *sd,
  			      struct v4l2_subdev_pad_config *cfg,
333c8b977   Laurent Pinchart   [media] v4l: v4l2...
682
683
  			      struct v4l2_subdev_mbus_code_enum *code);
  	int (*enum_frame_size)(struct v4l2_subdev *sd,
f7234138f   Hans Verkuil   [media] v4l2-subd...
684
  			       struct v4l2_subdev_pad_config *cfg,
333c8b977   Laurent Pinchart   [media] v4l: v4l2...
685
  			       struct v4l2_subdev_frame_size_enum *fse);
35c3017a2   Laurent Pinchart   [media] v4l: v4l2...
686
  	int (*enum_frame_interval)(struct v4l2_subdev *sd,
f7234138f   Hans Verkuil   [media] v4l2-subd...
687
  				   struct v4l2_subdev_pad_config *cfg,
35c3017a2   Laurent Pinchart   [media] v4l: v4l2...
688
  				   struct v4l2_subdev_frame_interval_enum *fie);
f7234138f   Hans Verkuil   [media] v4l2-subd...
689
690
  	int (*get_fmt)(struct v4l2_subdev *sd,
  		       struct v4l2_subdev_pad_config *cfg,
333c8b977   Laurent Pinchart   [media] v4l: v4l2...
691
  		       struct v4l2_subdev_format *format);
f7234138f   Hans Verkuil   [media] v4l2-subd...
692
693
  	int (*set_fmt)(struct v4l2_subdev *sd,
  		       struct v4l2_subdev_pad_config *cfg,
333c8b977   Laurent Pinchart   [media] v4l: v4l2...
694
  		       struct v4l2_subdev_format *format);
f7234138f   Hans Verkuil   [media] v4l2-subd...
695
696
  	int (*get_selection)(struct v4l2_subdev *sd,
  			     struct v4l2_subdev_pad_config *cfg,
ae184cda8   Sakari Ailus   [media] v4l: VIDI...
697
  			     struct v4l2_subdev_selection *sel);
f7234138f   Hans Verkuil   [media] v4l2-subd...
698
699
  	int (*set_selection)(struct v4l2_subdev *sd,
  			     struct v4l2_subdev_pad_config *cfg,
ae184cda8   Sakari Ailus   [media] v4l: VIDI...
700
  			     struct v4l2_subdev_selection *sel);
dd519bb34   Hans Verkuil   [media] v4l2: add...
701
702
  	int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid);
  	int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid);
0349f6a5f   Laurent Pinchart   [media] v4l: Add ...
703
704
705
706
  	int (*dv_timings_cap)(struct v4l2_subdev *sd,
  			      struct v4l2_dv_timings_cap *cap);
  	int (*enum_dv_timings)(struct v4l2_subdev *sd,
  			       struct v4l2_enum_dv_timings *timings);
8227c92b6   Sakari Ailus   [media] v4l: Impl...
707
708
709
710
711
  #ifdef CONFIG_MEDIA_CONTROLLER
  	int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,
  			     struct v4l2_subdev_format *source_fmt,
  			     struct v4l2_subdev_format *sink_fmt);
  #endif /* CONFIG_MEDIA_CONTROLLER */
291031192   Sylwester Nawrocki   [media] V4L: Add ...
712
713
714
715
  	int (*get_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
  			      struct v4l2_mbus_frame_desc *fd);
  	int (*set_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
  			      struct v4l2_mbus_frame_desc *fd);
38df0b850   Jacopo Mondi   media: v4l2-subde...
716
717
718
719
  	int (*get_mbus_config)(struct v4l2_subdev *sd, unsigned int pad,
  			       struct v4l2_mbus_config *config);
  	int (*set_mbus_config)(struct v4l2_subdev *sd, unsigned int pad,
  			       struct v4l2_mbus_config *config);
eb08f3548   Laurent Pinchart   [media] v4l: v4l2...
720
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
721
722
723
724
725
726
727
728
729
730
731
732
  /**
   * struct v4l2_subdev_ops - Subdev operations
   *
   * @core: pointer to &struct v4l2_subdev_core_ops. Can be %NULL
   * @tuner: pointer to &struct v4l2_subdev_tuner_ops. Can be %NULL
   * @audio: pointer to &struct v4l2_subdev_audio_ops. Can be %NULL
   * @video: pointer to &struct v4l2_subdev_video_ops. Can be %NULL
   * @vbi: pointer to &struct v4l2_subdev_vbi_ops. Can be %NULL
   * @ir: pointer to &struct v4l2_subdev_ir_ops. Can be %NULL
   * @sensor: pointer to &struct v4l2_subdev_sensor_ops. Can be %NULL
   * @pad: pointer to &struct v4l2_subdev_pad_ops. Can be %NULL
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
733
  struct v4l2_subdev_ops {
325361088   Guennadi Liakhovetski   V4L/DVB (13644): ...
734
735
736
737
  	const struct v4l2_subdev_core_ops	*core;
  	const struct v4l2_subdev_tuner_ops	*tuner;
  	const struct v4l2_subdev_audio_ops	*audio;
  	const struct v4l2_subdev_video_ops	*video;
32cd527f5   Hans Verkuil   V4L/DVB: v4l: mov...
738
  	const struct v4l2_subdev_vbi_ops	*vbi;
325361088   Guennadi Liakhovetski   V4L/DVB (13644): ...
739
740
  	const struct v4l2_subdev_ir_ops		*ir;
  	const struct v4l2_subdev_sensor_ops	*sensor;
eb08f3548   Laurent Pinchart   [media] v4l: v4l2...
741
  	const struct v4l2_subdev_pad_ops	*pad;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
742
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
743
744
  /**
   * struct v4l2_subdev_internal_ops - V4L2 subdev internal ops
45f6f84af   Hans Verkuil   [media] v4l2-subd...
745
   *
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
746
   * @registered: called when this subdev is registered. When called the v4l2_dev
45f6f84af   Hans Verkuil   [media] v4l2-subd...
747
748
   *	field is set to the correct v4l2_device.
   *
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
749
   * @unregistered: called when this subdev is unregistered. When called the
45f6f84af   Hans Verkuil   [media] v4l2-subd...
750
   *	v4l2_dev field is still set to the correct v4l2_device.
f0beea8f4   Laurent Pinchart   [media] v4l: subd...
751
   *
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
752
   * @open: called when the subdev device node is opened by an application.
f0beea8f4   Laurent Pinchart   [media] v4l: subd...
753
   *
0e43734d4   Hans Verkuil   media: v4l2-subde...
754
755
756
757
758
759
760
761
762
763
764
   * @close: called when the subdev device node is closed. Please note that
   *	it is possible for @close to be called after @unregistered!
   *
   * @release: called when the last user of the subdev device is gone. This
   *	happens after the @unregistered callback and when the last open
   *	filehandle to the v4l-subdevX device node was closed. If no device
   *	node was created for this sub-device, then the @release callback
   *	is called right after the @unregistered callback.
   *	The @release callback is typically used to free the memory containing
   *	the v4l2_subdev structure. It is almost certainly required for any
   *	sub-device that sets the V4L2_SUBDEV_FL_HAS_DEVNODE flag.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
765
766
767
768
   *
   * .. note::
   *	Never call this from drivers, only the v4l2 framework can call
   *	these ops.
45f6f84af   Hans Verkuil   [media] v4l2-subd...
769
770
771
772
   */
  struct v4l2_subdev_internal_ops {
  	int (*registered)(struct v4l2_subdev *sd);
  	void (*unregistered)(struct v4l2_subdev *sd);
f0beea8f4   Laurent Pinchart   [media] v4l: subd...
773
774
  	int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
  	int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
0e43734d4   Hans Verkuil   media: v4l2-subde...
775
  	void (*release)(struct v4l2_subdev *sd);
45f6f84af   Hans Verkuil   [media] v4l2-subd...
776
  };
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
777
  #define V4L2_SUBDEV_NAME_SIZE 32
b5b2b7ed5   Hans Verkuil   V4L/DVB (11673): ...
778
  /* Set this flag if this subdev is a i2c device. */
2096a5dcf   Laurent Pinchart   [media] v4l: subd...
779
  #define V4L2_SUBDEV_FL_IS_I2C			(1U << 0)
85e092190   Dmitri Belimov   V4L/DVB: Add SPI ...
780
  /* Set this flag if this subdev is a spi device. */
2096a5dcf   Laurent Pinchart   [media] v4l: subd...
781
782
783
  #define V4L2_SUBDEV_FL_IS_SPI			(1U << 1)
  /* Set this flag if this subdev needs a device node. */
  #define V4L2_SUBDEV_FL_HAS_DEVNODE		(1U << 2)
d138091ff   Luca Ceresoli   media: v4l2-subde...
784
785
786
787
788
  /*
   * Set this flag if this subdev generates events.
   * Note controls can send events, thus drivers exposing controls
   * should set this flag.
   */
02adb1cc7   Sakari Ailus   [media] v4l: subd...
789
  #define V4L2_SUBDEV_FL_HAS_EVENTS		(1U << 3)
b5b2b7ed5   Hans Verkuil   V4L/DVB (11673): ...
790

b1cbab05d   Guennadi Liakhovetski   [media] V4L2: add...
791
  struct regulator_bulk_data;
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
792
793
794
795
796
797
798
  /**
   * struct v4l2_subdev_platform_data - regulators config struct
   *
   * @regulators: Optional regulators used to power on/off the subdevice
   * @num_regulators: Number of regululators
   * @host_priv: Per-subdevice data, specific for a certain video host device
   */
b1cbab05d   Guennadi Liakhovetski   [media] V4L2: add...
799
  struct v4l2_subdev_platform_data {
b1cbab05d   Guennadi Liakhovetski   [media] V4L2: add...
800
801
  	struct regulator_bulk_data *regulators;
  	int num_regulators;
b1cbab05d   Guennadi Liakhovetski   [media] V4L2: add...
802
803
  	void *host_priv;
  };
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
804
805
806
807
808
809
  /**
   * struct v4l2_subdev - describes a V4L2 sub-device
   *
   * @entity: pointer to &struct media_entity
   * @list: List of sub-devices
   * @owner: The owner is the same as the driver's &struct device owner.
cb8d67cf7   Mauro Carvalho Chehab   [media] v4l2-subd...
810
   * @owner_v4l2_dev: true if the &sd->owner matches the owner of @v4l2_dev->dev
0722ef82e   Mauro Carvalho Chehab   media: v4l2-subde...
811
   *	owner. Initialized by v4l2_device_register_subdev().
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
812
813
814
815
816
817
818
819
   * @flags: subdev flags. Can be:
   *   %V4L2_SUBDEV_FL_IS_I2C - Set this flag if this subdev is a i2c device;
   *   %V4L2_SUBDEV_FL_IS_SPI - Set this flag if this subdev is a spi device;
   *   %V4L2_SUBDEV_FL_HAS_DEVNODE - Set this flag if this subdev needs a
   *   device node;
   *   %V4L2_SUBDEV_FL_HAS_EVENTS -  Set this flag if this subdev generates
   *   events.
   *
cb8d67cf7   Mauro Carvalho Chehab   [media] v4l2-subd...
820
821
822
   * @v4l2_dev: pointer to struct &v4l2_device
   * @ops: pointer to struct &v4l2_subdev_ops
   * @internal_ops: pointer to struct &v4l2_subdev_internal_ops.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
823
824
825
826
827
828
829
830
831
   *	Never call these internal ops from within a driver!
   * @ctrl_handler: The control handler of this subdev. May be NULL.
   * @name: Name of the sub-device. Please notice that the name must be unique.
   * @grp_id: can be used to group similar subdevs. Value is driver-specific
   * @dev_priv: pointer to private data
   * @host_priv: pointer to private data used by the device where the subdev
   *	is attached.
   * @devnode: subdev device node
   * @dev: pointer to the physical device, if any
ecdf0cfe7   Sakari Ailus   [media] v4l: asyn...
832
833
   * @fwnode: The fwnode_handle of the subdev, usually the same as
   *	    either dev->of_node->fwnode or dev->fwnode (whichever is non-NULL).
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
834
835
836
837
   * @async_list: Links this subdev to a global subdev_list or @notifier->done
   *	list.
   * @asd: Pointer to respective &struct v4l2_async_subdev.
   * @notifier: Pointer to the managing notifier.
aef69d547   Sakari Ailus   media: v4l: fwnod...
838
839
   * @subdev_notifier: A sub-device notifier implicitly registered for the sub-
   *		     device using v4l2_device_register_sensor_subdev().
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
840
841
842
843
844
845
846
   * @pdata: common part of subdevice platform data
   *
   * Each instance of a subdev driver should create this struct, either
   * stand-alone or embedded in a larger struct.
   *
   * This structure should be initialized by v4l2_subdev_init() or one of
   * its variants: v4l2_spi_subdev_init(), v4l2_i2c_subdev_init().
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
847
848
   */
  struct v4l2_subdev {
61f5db549   Laurent Pinchart   [media] v4l: Make...
849
850
851
  #if defined(CONFIG_MEDIA_CONTROLLER)
  	struct media_entity entity;
  #endif
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
852
853
  	struct list_head list;
  	struct module *owner;
b2a06aecb   Sakari Ailus   [media] v4l: Only...
854
  	bool owner_v4l2_dev;
b5b2b7ed5   Hans Verkuil   V4L/DVB (11673): ...
855
  	u32 flags;
b01676005   Hans Verkuil   V4L/DVB (10644): ...
856
  	struct v4l2_device *v4l2_dev;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
857
  	const struct v4l2_subdev_ops *ops;
45f6f84af   Hans Verkuil   [media] v4l2-subd...
858
  	const struct v4l2_subdev_internal_ops *internal_ops;
0996517cf   Hans Verkuil   V4L/DVB: v4l2: Ad...
859
  	struct v4l2_ctrl_handler *ctrl_handler;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
860
  	char name[V4L2_SUBDEV_NAME_SIZE];
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
861
  	u32 grp_id;
692d55226   Laurent Pinchart   V4L/DVB: v4l: Add...
862
863
  	void *dev_priv;
  	void *host_priv;
3e0ec41c5   Guennadi Liakhovetski   [media] V4L: dyna...
864
  	struct video_device *devnode;
668773b84   Guennadi Liakhovetski   [media] V4L2: add...
865
  	struct device *dev;
ecdf0cfe7   Sakari Ailus   [media] v4l: asyn...
866
  	struct fwnode_handle *fwnode;
b426b3a66   Sylwester Nawrocki   [media] V4L: Merg...
867
  	struct list_head async_list;
b426b3a66   Sylwester Nawrocki   [media] V4L: Merg...
868
  	struct v4l2_async_subdev *asd;
b426b3a66   Sylwester Nawrocki   [media] V4L: Merg...
869
  	struct v4l2_async_notifier *notifier;
aef69d547   Sakari Ailus   media: v4l: fwnod...
870
  	struct v4l2_async_notifier *subdev_notifier;
b1cbab05d   Guennadi Liakhovetski   [media] V4L2: add...
871
  	struct v4l2_subdev_platform_data *pdata;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
872
  };
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
873
874
875
876
877
878
879
  
  /**
   * media_entity_to_v4l2_subdev - Returns a &struct v4l2_subdev from
   *    the &struct media_entity embedded in it.
   *
   * @ent: pointer to &struct media_entity.
   */
47f910f0e   Kieran Bingham   [media] v4l: subd...
880
881
882
883
884
885
886
887
  #define media_entity_to_v4l2_subdev(ent)				\
  ({									\
  	typeof(ent) __me_sd_ent = (ent);				\
  									\
  	__me_sd_ent ?							\
  		container_of(__me_sd_ent, struct v4l2_subdev, entity) :	\
  		NULL;							\
  })
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
888
889
890
891
892
893
  /**
   * vdev_to_v4l2_subdev - Returns a &struct v4l2_subdev from
   *	the &struct video_device embedded on it.
   *
   * @vdev: pointer to &struct video_device
   */
2096a5dcf   Laurent Pinchart   [media] v4l: subd...
894
  #define vdev_to_v4l2_subdev(vdev) \
c5a766ceb   Sakari Ailus   [media] v4l: vdev...
895
  	((struct v4l2_subdev *)video_get_drvdata(vdev))
2096a5dcf   Laurent Pinchart   [media] v4l: subd...
896

21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
897
898
899
  /**
   * struct v4l2_subdev_fh - Used for storing subdev information per file handle
   *
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
900
901
   * @vfh: pointer to &struct v4l2_fh
   * @pad: pointer to &struct v4l2_subdev_pad_config
218bf10e3   Hans Verkuil   media: v4l2-subde...
902
   * @owner: module pointer to the owner of this file handle
7cd5a16b2   Stanimir Varbanov   [media] v4l: Crea...
903
904
905
   */
  struct v4l2_subdev_fh {
  	struct v4l2_fh vfh;
218bf10e3   Hans Verkuil   media: v4l2-subde...
906
  	struct module *owner;
7cd5a16b2   Stanimir Varbanov   [media] v4l: Crea...
907
  #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
f7234138f   Hans Verkuil   [media] v4l2-subd...
908
  	struct v4l2_subdev_pad_config *pad;
7cd5a16b2   Stanimir Varbanov   [media] v4l: Crea...
909
910
  #endif
  };
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
911
912
913
914
915
916
  /**
   * to_v4l2_subdev_fh - Returns a &struct v4l2_subdev_fh from
   *	the &struct v4l2_fh embedded on it.
   *
   * @fh: pointer to &struct v4l2_fh
   */
7cd5a16b2   Stanimir Varbanov   [media] v4l: Crea...
917
918
919
920
  #define to_v4l2_subdev_fh(fh)	\
  	container_of(fh, struct v4l2_subdev_fh, vfh)
  
  #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
921
922
923
924
925
926
927
928
929
  
  /**
   * v4l2_subdev_get_try_format - ancillary routine to call
   *	&struct v4l2_subdev_pad_config->try_fmt
   *
   * @sd: pointer to &struct v4l2_subdev
   * @cfg: pointer to &struct v4l2_subdev_pad_config array.
   * @pad: index of the pad in the @cfg array.
   */
8ecbde62c   Hans Verkuil   media: v4l2-subde...
930
931
932
933
  static inline struct v4l2_mbus_framefmt *
  v4l2_subdev_get_try_format(struct v4l2_subdev *sd,
  			   struct v4l2_subdev_pad_config *cfg,
  			   unsigned int pad)
ab9bb73a0   Mauro Carvalho Chehab   media: v4l2-subde...
934
935
936
937
938
  {
  	if (WARN_ON(pad >= sd->entity.num_pads))
  		pad = 0;
  	return &cfg[pad].try_fmt;
  }
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
939
940
941
942
943
944
945
946
  /**
   * v4l2_subdev_get_try_crop - ancillary routine to call
   *	&struct v4l2_subdev_pad_config->try_crop
   *
   * @sd: pointer to &struct v4l2_subdev
   * @cfg: pointer to &struct v4l2_subdev_pad_config array.
   * @pad: index of the pad in the @cfg array.
   */
8ecbde62c   Hans Verkuil   media: v4l2-subde...
947
948
949
950
  static inline struct v4l2_rect *
  v4l2_subdev_get_try_crop(struct v4l2_subdev *sd,
  			 struct v4l2_subdev_pad_config *cfg,
  			 unsigned int pad)
ab9bb73a0   Mauro Carvalho Chehab   media: v4l2-subde...
951
952
953
954
955
  {
  	if (WARN_ON(pad >= sd->entity.num_pads))
  		pad = 0;
  	return &cfg[pad].try_crop;
  }
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
956
  /**
e8bf419e0   Hans Verkuil   include/media/v4l...
957
   * v4l2_subdev_get_try_compose - ancillary routine to call
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
958
959
960
961
962
963
   *	&struct v4l2_subdev_pad_config->try_compose
   *
   * @sd: pointer to &struct v4l2_subdev
   * @cfg: pointer to &struct v4l2_subdev_pad_config array.
   * @pad: index of the pad in the @cfg array.
   */
8ecbde62c   Hans Verkuil   media: v4l2-subde...
964
965
966
967
  static inline struct v4l2_rect *
  v4l2_subdev_get_try_compose(struct v4l2_subdev *sd,
  			    struct v4l2_subdev_pad_config *cfg,
  			    unsigned int pad)
ab9bb73a0   Mauro Carvalho Chehab   media: v4l2-subde...
968
969
970
971
972
  {
  	if (WARN_ON(pad >= sd->entity.num_pads))
  		pad = 0;
  	return &cfg[pad].try_compose;
  }
8ecbde62c   Hans Verkuil   media: v4l2-subde...
973

7cd5a16b2   Stanimir Varbanov   [media] v4l: Crea...
974
  #endif
2096a5dcf   Laurent Pinchart   [media] v4l: subd...
975
  extern const struct v4l2_file_operations v4l2_subdev_fops;
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
976
977
978
979
980
981
  /**
   * v4l2_set_subdevdata - Sets V4L2 dev private device data
   *
   * @sd: pointer to &struct v4l2_subdev
   * @p: pointer to the private device data to be stored.
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
982
983
  static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
  {
692d55226   Laurent Pinchart   V4L/DVB: v4l: Add...
984
  	sd->dev_priv = p;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
985
  }
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
986
987
988
989
990
991
992
  /**
   * v4l2_get_subdevdata - Gets V4L2 dev private device data
   *
   * @sd: pointer to &struct v4l2_subdev
   *
   * Returns the pointer to the private device data to be stored.
   */
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
993
994
  static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
  {
692d55226   Laurent Pinchart   V4L/DVB: v4l: Add...
995
996
  	return sd->dev_priv;
  }
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
997
  /**
e383ce073   Mauro Carvalho Chehab   [media] get rid o...
998
   * v4l2_set_subdev_hostdata - Sets V4L2 dev private host data
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
999
1000
1001
1002
   *
   * @sd: pointer to &struct v4l2_subdev
   * @p: pointer to the private data to be stored.
   */
692d55226   Laurent Pinchart   V4L/DVB: v4l: Add...
1003
1004
1005
1006
  static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
  {
  	sd->host_priv = p;
  }
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1007
  /**
e383ce073   Mauro Carvalho Chehab   [media] get rid o...
1008
   * v4l2_get_subdev_hostdata - Gets V4L2 dev private data
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1009
1010
1011
1012
1013
   *
   * @sd: pointer to &struct v4l2_subdev
   *
   * Returns the pointer to the private host data to be stored.
   */
692d55226   Laurent Pinchart   V4L/DVB: v4l: Add...
1014
1015
1016
  static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
  {
  	return sd->host_priv;
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
1017
  }
8227c92b6   Sakari Ailus   [media] v4l: Impl...
1018
  #ifdef CONFIG_MEDIA_CONTROLLER
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1019
1020
  
  /**
8fe784b9a   Steve Longerbeam   media: v4l2-subde...
1021
1022
1023
   * v4l2_subdev_get_fwnode_pad_1_to_1 - Get pad number from a subdev fwnode
   *                                     endpoint, assuming 1:1 port:pad
   *
2f5011698   Colton Lewis   media: v4l2: Corr...
1024
1025
   * @entity: Pointer to the subdev entity
   * @endpoint: Pointer to a parsed fwnode endpoint
8fe784b9a   Steve Longerbeam   media: v4l2-subde...
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
   *
   * This function can be used as the .get_fwnode_pad operation for
   * subdevices that map port numbers and pad indexes 1:1. If the endpoint
   * is owned by the subdevice, the function returns the endpoint port
   * number.
   *
   * Returns the endpoint port number on success or a negative error code.
   */
  int v4l2_subdev_get_fwnode_pad_1_to_1(struct media_entity *entity,
  				      struct fwnode_endpoint *endpoint);
  
  /**
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
   * v4l2_subdev_link_validate_default - validates a media link
   *
   * @sd: pointer to &struct v4l2_subdev
   * @link: pointer to &struct media_link
   * @source_fmt: pointer to &struct v4l2_subdev_format
   * @sink_fmt: pointer to &struct v4l2_subdev_format
   *
   * This function ensures that width, height and the media bus pixel
   * code are equal on both source and sink of the link.
   */
8227c92b6   Sakari Ailus   [media] v4l: Impl...
1048
1049
1050
1051
  int v4l2_subdev_link_validate_default(struct v4l2_subdev *sd,
  				      struct media_link *link,
  				      struct v4l2_subdev_format *source_fmt,
  				      struct v4l2_subdev_format *sink_fmt);
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
  
  /**
   * v4l2_subdev_link_validate - validates a media link
   *
   * @link: pointer to &struct media_link
   *
   * This function calls the subdev's link_validate ops to validate
   * if a media link is valid for streaming. It also internally
   * calls v4l2_subdev_link_validate_default() to ensure that
   * width, height and the media bus pixel code are equal on both
   * source and sink of the link.
   */
8227c92b6   Sakari Ailus   [media] v4l: Impl...
1064
  int v4l2_subdev_link_validate(struct media_link *link);
9b02cbb3e   Laurent Pinchart   [media] v4l: subd...
1065

21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
  /**
   * v4l2_subdev_alloc_pad_config - Allocates memory for pad config
   *
   * @sd: pointer to struct v4l2_subdev
   */
  struct
  v4l2_subdev_pad_config *v4l2_subdev_alloc_pad_config(struct v4l2_subdev *sd);
  
  /**
   * v4l2_subdev_free_pad_config - Frees memory allocated by
   *	v4l2_subdev_alloc_pad_config().
   *
   * @cfg: pointer to &struct v4l2_subdev_pad_config
   */
9b02cbb3e   Laurent Pinchart   [media] v4l: subd...
1080
  void v4l2_subdev_free_pad_config(struct v4l2_subdev_pad_config *cfg);
8227c92b6   Sakari Ailus   [media] v4l: Impl...
1081
  #endif /* CONFIG_MEDIA_CONTROLLER */
9b02cbb3e   Laurent Pinchart   [media] v4l: subd...
1082

21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1083
1084
1085
1086
1087
1088
  /**
   * v4l2_subdev_init - initializes the sub-device struct
   *
   * @sd: pointer to the &struct v4l2_subdev to be initialized
   * @ops: pointer to &struct v4l2_subdev_ops.
   */
3dd5ee080   Laurent Pinchart   [media] v4l: subd...
1089
1090
  void v4l2_subdev_init(struct v4l2_subdev *sd,
  		      const struct v4l2_subdev_ops *ops);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
1091

a8fa55078   Janusz Krzysztofik   media: v4l2-subde...
1092
  extern const struct v4l2_subdev_ops v4l2_subdev_call_wrappers;
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
1093
1094
1095
1096
1097
1098
  /**
   * v4l2_subdev_call - call an operation of a v4l2_subdev.
   *
   * @sd: pointer to the &struct v4l2_subdev
   * @o: name of the element at &struct v4l2_subdev_ops that contains @f.
   *     Each element there groups a set of callbacks functions.
aab7b7d19   Wolfram Sang   media: v4l2-subde...
1099
   * @f: callback function to be called.
02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
1100
1101
   *     The callback functions are defined in groups, according to
   *     each element at &struct v4l2_subdev_ops.
60d70d75c   Jonathan Neuschäfer   media: v4l2: Swit...
1102
   * @args: arguments for @f.
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1103
1104
   *
   * Example: err = v4l2_subdev_call(sd, video, s_std, norm);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
1105
1106
   */
  #define v4l2_subdev_call(sd, o, f, args...)				\
da48c948c   Arnd Bergmann   media: fix warnin...
1107
  	({								\
3d769df5f   Hans Verkuil   media: v4l2-subde...
1108
  		struct v4l2_subdev *__sd = (sd);			\
da48c948c   Arnd Bergmann   media: fix warnin...
1109
  		int __result;						\
3d769df5f   Hans Verkuil   media: v4l2-subde...
1110
  		if (!__sd)						\
da48c948c   Arnd Bergmann   media: fix warnin...
1111
  			__result = -ENODEV;				\
3d769df5f   Hans Verkuil   media: v4l2-subde...
1112
  		else if (!(__sd->ops->o && __sd->ops->o->f))		\
da48c948c   Arnd Bergmann   media: fix warnin...
1113
  			__result = -ENOIOCTLCMD;			\
a8fa55078   Janusz Krzysztofik   media: v4l2-subde...
1114
1115
1116
1117
  		else if (v4l2_subdev_call_wrappers.o &&			\
  			 v4l2_subdev_call_wrappers.o->f)		\
  			__result = v4l2_subdev_call_wrappers.o->f(	\
  							__sd, ##args);	\
da48c948c   Arnd Bergmann   media: fix warnin...
1118
  		else							\
3d769df5f   Hans Verkuil   media: v4l2-subde...
1119
  			__result = __sd->ops->o->f(__sd, ##args);	\
da48c948c   Arnd Bergmann   media: fix warnin...
1120
1121
  		__result;						\
  	})
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
1122

02679876b   Mauro Carvalho Chehab   media: v4l2-subde...
1123
1124
1125
1126
1127
1128
1129
1130
  /**
   * v4l2_subdev_has_op - Checks if a subdev defines a certain operation.
   *
   * @sd: pointer to the &struct v4l2_subdev
   * @o: The group of callback functions in &struct v4l2_subdev_ops
   * which @f is a part of.
   * @f: callback function to be checked for its existence.
   */
2180f92de   Hans Verkuil   [media] v4l2-core...
1131
1132
  #define v4l2_subdev_has_op(sd, o, f) \
  	((sd)->ops->o && (sd)->ops->o->f)
21c29de1d   Mauro Carvalho Chehab   [media] v4l2-subd...
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
  /**
   * v4l2_subdev_notify_event() - Delivers event notification for subdevice
   * @sd: The subdev for which to deliver the event
   * @ev: The event to deliver
   *
   * Will deliver the specified event to all userspace event listeners which are
   * subscribed to the v42l subdev event queue as well as to the bridge driver
   * using the notify callback. The notification type for the notify callback
   * will be %V4L2_DEVICE_NOTIFY_EVENT.
   */
8ae5640f1   Lars-Peter Clausen   [media] Add helpe...
1143
1144
  void v4l2_subdev_notify_event(struct v4l2_subdev *sd,
  			      const struct v4l2_event *ev);
2a1fcdf08   Hans Verkuil   V4L/DVB (9820): v...
1145
  #endif