hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/include/media/v4l2-common.h
....@@ -1,3 +1,4 @@
1
+/* SPDX-License-Identifier: GPL-2.0-or-later */
12 /*
23 v4l2 common internal API header
34
....@@ -8,24 +9,12 @@
89
910 Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl>
1011
11
- This program is free software; you can redistribute it and/or modify
12
- it under the terms of the GNU General Public License as published by
13
- the Free Software Foundation; either version 2 of the License, or
14
- (at your option) any later version.
15
-
16
- This program is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU General Public License for more details.
20
-
21
- You should have received a copy of the GNU General Public License
22
- along with this program; if not, write to the Free Software
23
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2412 */
2513
2614 #ifndef V4L2_COMMON_H_
2715 #define V4L2_COMMON_H_
2816
17
+#include <linux/time.h>
2918 #include <media/v4l2-dev.h>
3019
3120 /* Common printk constructs for v4l-i2c drivers. These macros create a unique
....@@ -108,71 +97,12 @@
10897
10998 /* ------------------------------------------------------------------------- */
11099
111
-/* I2C Helper functions */
112
-
113
-struct i2c_driver;
114
-struct i2c_adapter;
115
-struct i2c_client;
116
-struct i2c_device_id;
117100 struct v4l2_device;
118101 struct v4l2_subdev;
119102 struct v4l2_subdev_ops;
120103
121
-/**
122
- * v4l2_i2c_new_subdev - Load an i2c module and return an initialized
123
- * &struct v4l2_subdev.
124
- *
125
- * @v4l2_dev: pointer to &struct v4l2_device
126
- * @adapter: pointer to struct i2c_adapter
127
- * @client_type: name of the chip that's on the adapter.
128
- * @addr: I2C address. If zero, it will use @probe_addrs
129
- * @probe_addrs: array with a list of address. The last entry at such
130
- * array should be %I2C_CLIENT_END.
131
- *
132
- * returns a &struct v4l2_subdev pointer.
133
- */
134
-struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
135
- struct i2c_adapter *adapter, const char *client_type,
136
- u8 addr, const unsigned short *probe_addrs);
137
-
138
-struct i2c_board_info;
139
-
140
-/**
141
- * v4l2_i2c_new_subdev_board - Load an i2c module and return an initialized
142
- * &struct v4l2_subdev.
143
- *
144
- * @v4l2_dev: pointer to &struct v4l2_device
145
- * @adapter: pointer to struct i2c_adapter
146
- * @info: pointer to struct i2c_board_info used to replace the irq,
147
- * platform_data and addr arguments.
148
- * @probe_addrs: array with a list of address. The last entry at such
149
- * array should be %I2C_CLIENT_END.
150
- *
151
- * returns a &struct v4l2_subdev pointer.
152
- */
153
-struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
154
- struct i2c_adapter *adapter, struct i2c_board_info *info,
155
- const unsigned short *probe_addrs);
156
-
157
-/**
158
- * v4l2_i2c_subdev_init - Initializes a &struct v4l2_subdev with data from
159
- * an i2c_client struct.
160
- *
161
- * @sd: pointer to &struct v4l2_subdev
162
- * @client: pointer to struct i2c_client
163
- * @ops: pointer to &struct v4l2_subdev_ops
164
- */
165
-void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
166
- const struct v4l2_subdev_ops *ops);
167
-
168
-/**
169
- * v4l2_i2c_subdev_addr - returns i2c client address of &struct v4l2_subdev.
170
- *
171
- * @sd: pointer to &struct v4l2_subdev
172
- *
173
- * Returns the address of an I2C sub-device
174
- */
175
-unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd);
104
+/* I2C Helper functions */
105
+#include <linux/i2c.h>
176106
177107 /**
178108 * enum v4l2_i2c_tuner_type - specifies the range of tuner address that
....@@ -203,6 +133,76 @@
203133 ADDRS_TV,
204134 ADDRS_TV_WITH_DEMOD,
205135 };
136
+
137
+#if defined(CONFIG_VIDEO_V4L2_I2C)
138
+
139
+/**
140
+ * v4l2_i2c_new_subdev - Load an i2c module and return an initialized
141
+ * &struct v4l2_subdev.
142
+ *
143
+ * @v4l2_dev: pointer to &struct v4l2_device
144
+ * @adapter: pointer to struct i2c_adapter
145
+ * @client_type: name of the chip that's on the adapter.
146
+ * @addr: I2C address. If zero, it will use @probe_addrs
147
+ * @probe_addrs: array with a list of address. The last entry at such
148
+ * array should be %I2C_CLIENT_END.
149
+ *
150
+ * returns a &struct v4l2_subdev pointer.
151
+ */
152
+struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
153
+ struct i2c_adapter *adapter, const char *client_type,
154
+ u8 addr, const unsigned short *probe_addrs);
155
+
156
+/**
157
+ * v4l2_i2c_new_subdev_board - Load an i2c module and return an initialized
158
+ * &struct v4l2_subdev.
159
+ *
160
+ * @v4l2_dev: pointer to &struct v4l2_device
161
+ * @adapter: pointer to struct i2c_adapter
162
+ * @info: pointer to struct i2c_board_info used to replace the irq,
163
+ * platform_data and addr arguments.
164
+ * @probe_addrs: array with a list of address. The last entry at such
165
+ * array should be %I2C_CLIENT_END.
166
+ *
167
+ * returns a &struct v4l2_subdev pointer.
168
+ */
169
+struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
170
+ struct i2c_adapter *adapter, struct i2c_board_info *info,
171
+ const unsigned short *probe_addrs);
172
+
173
+/**
174
+ * v4l2_i2c_subdev_set_name - Set name for an I²C sub-device
175
+ *
176
+ * @sd: pointer to &struct v4l2_subdev
177
+ * @client: pointer to struct i2c_client
178
+ * @devname: the name of the device; if NULL, the I²C device drivers's name
179
+ * will be used
180
+ * @postfix: sub-device specific string to put right after the I²C device name;
181
+ * may be NULL
182
+ */
183
+void v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client,
184
+ const char *devname, const char *postfix);
185
+
186
+/**
187
+ * v4l2_i2c_subdev_init - Initializes a &struct v4l2_subdev with data from
188
+ * an i2c_client struct.
189
+ *
190
+ * @sd: pointer to &struct v4l2_subdev
191
+ * @client: pointer to struct i2c_client
192
+ * @ops: pointer to &struct v4l2_subdev_ops
193
+ */
194
+void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
195
+ const struct v4l2_subdev_ops *ops);
196
+
197
+/**
198
+ * v4l2_i2c_subdev_addr - returns i2c client address of &struct v4l2_subdev.
199
+ *
200
+ * @sd: pointer to &struct v4l2_subdev
201
+ *
202
+ * Returns the address of an I2C sub-device
203
+ */
204
+unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd);
205
+
206206 /**
207207 * v4l2_i2c_tuner_addrs - Return a list of I2C tuner addresses to probe.
208208 *
....@@ -213,14 +213,64 @@
213213 */
214214 const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type);
215215
216
+/**
217
+ * v4l2_i2c_subdev_unregister - Unregister a v4l2_subdev
218
+ *
219
+ * @sd: pointer to &struct v4l2_subdev
220
+ */
221
+void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd);
222
+
223
+#else
224
+
225
+static inline struct v4l2_subdev *
226
+v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
227
+ struct i2c_adapter *adapter, const char *client_type,
228
+ u8 addr, const unsigned short *probe_addrs)
229
+{
230
+ return NULL;
231
+}
232
+
233
+static inline struct v4l2_subdev *
234
+v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
235
+ struct i2c_adapter *adapter, struct i2c_board_info *info,
236
+ const unsigned short *probe_addrs)
237
+{
238
+ return NULL;
239
+}
240
+
241
+static inline void
242
+v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client,
243
+ const char *devname, const char *postfix)
244
+{}
245
+
246
+static inline void
247
+v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
248
+ const struct v4l2_subdev_ops *ops)
249
+{}
250
+
251
+static inline unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd)
252
+{
253
+ return I2C_CLIENT_END;
254
+}
255
+
256
+static inline const unsigned short *
257
+v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type)
258
+{
259
+ return NULL;
260
+}
261
+
262
+static inline void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd)
263
+{}
264
+
265
+#endif
266
+
216267 /* ------------------------------------------------------------------------- */
217268
218269 /* SPI Helper functions */
219
-#if defined(CONFIG_SPI)
220270
221271 #include <linux/spi/spi.h>
222272
223
-struct spi_device;
273
+#if defined(CONFIG_SPI)
224274
225275 /**
226276 * v4l2_spi_new_subdev - Load an spi module and return an initialized
....@@ -246,6 +296,30 @@
246296 */
247297 void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi,
248298 const struct v4l2_subdev_ops *ops);
299
+
300
+/**
301
+ * v4l2_spi_subdev_unregister - Unregister a v4l2_subdev
302
+ *
303
+ * @sd: pointer to &struct v4l2_subdev
304
+ */
305
+void v4l2_spi_subdev_unregister(struct v4l2_subdev *sd);
306
+
307
+#else
308
+
309
+static inline struct v4l2_subdev *
310
+v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev,
311
+ struct spi_master *master, struct spi_board_info *info)
312
+{
313
+ return NULL;
314
+}
315
+
316
+static inline void
317
+v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi,
318
+ const struct v4l2_subdev_ops *ops)
319
+{}
320
+
321
+static inline void v4l2_spi_subdev_unregister(struct v4l2_subdev *sd)
322
+{}
249323 #endif
250324
251325 /* ------------------------------------------------------------------------- */
....@@ -283,7 +357,7 @@
283357 * @height: pointer to height that will be adjusted if needed.
284358 * @hmin: minimum height.
285359 * @hmax: maximum height.
286
- * @halign: least significant bit on width.
360
+ * @halign: least significant bit on height.
287361 * @salign: least significant bit for the image size (e. g.
288362 * :math:`width * height`).
289363 *
....@@ -350,15 +424,6 @@
350424 size_t height_offset, s32 width, s32 height);
351425
352426 /**
353
- * v4l2_get_timestamp - helper routine to get a timestamp to be used when
354
- * filling streaming metadata. Internally, it uses ktime_get_ts(),
355
- * which is the recommended way to get it.
356
- *
357
- * @tv: pointer to &struct timeval to be filled.
358
- */
359
-void v4l2_get_timestamp(struct timeval *tv);
360
-
361
-/**
362427 * v4l2_g_parm_cap - helper routine for vidioc_g_parm to fill this in by
363428 * calling the g_frame_interval op of the given subdev. It only works
364429 * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the
....@@ -384,4 +449,124 @@
384449 int v4l2_s_parm_cap(struct video_device *vdev,
385450 struct v4l2_subdev *sd, struct v4l2_streamparm *a);
386451
452
+/* Compare two v4l2_fract structs */
453
+#define V4L2_FRACT_COMPARE(a, OP, b) \
454
+ ((u64)(a).numerator * (b).denominator OP \
455
+ (u64)(b).numerator * (a).denominator)
456
+
457
+/* ------------------------------------------------------------------------- */
458
+
459
+/* Pixel format and FourCC helpers */
460
+
461
+/**
462
+ * enum v4l2_pixel_encoding - specifies the pixel encoding value
463
+ *
464
+ * @V4L2_PIXEL_ENC_UNKNOWN: Pixel encoding is unknown/un-initialized
465
+ * @V4L2_PIXEL_ENC_YUV: Pixel encoding is YUV
466
+ * @V4L2_PIXEL_ENC_RGB: Pixel encoding is RGB
467
+ * @V4L2_PIXEL_ENC_BAYER: Pixel encoding is Bayer
468
+ */
469
+enum v4l2_pixel_encoding {
470
+ V4L2_PIXEL_ENC_UNKNOWN = 0,
471
+ V4L2_PIXEL_ENC_YUV = 1,
472
+ V4L2_PIXEL_ENC_RGB = 2,
473
+ V4L2_PIXEL_ENC_BAYER = 3,
474
+};
475
+
476
+/**
477
+ * struct v4l2_format_info - information about a V4L2 format
478
+ * @format: 4CC format identifier (V4L2_PIX_FMT_*)
479
+ * @pixel_enc: Pixel encoding (see enum v4l2_pixel_encoding above)
480
+ * @mem_planes: Number of memory planes, which includes the alpha plane (1 to 4).
481
+ * @comp_planes: Number of component planes, which includes the alpha plane (1 to 4).
482
+ * @bpp: Array of per-plane bytes per pixel
483
+ * @hdiv: Horizontal chroma subsampling factor
484
+ * @vdiv: Vertical chroma subsampling factor
485
+ * @block_w: Per-plane macroblock pixel width (optional)
486
+ * @block_h: Per-plane macroblock pixel height (optional)
487
+ */
488
+struct v4l2_format_info {
489
+ u32 format;
490
+ u8 pixel_enc;
491
+ u8 mem_planes;
492
+ u8 comp_planes;
493
+ u8 bpp[4];
494
+ u8 hdiv;
495
+ u8 vdiv;
496
+ u8 block_w[4];
497
+ u8 block_h[4];
498
+};
499
+
500
+static inline bool v4l2_is_format_rgb(const struct v4l2_format_info *f)
501
+{
502
+ return f && f->pixel_enc == V4L2_PIXEL_ENC_RGB;
503
+}
504
+
505
+static inline bool v4l2_is_format_yuv(const struct v4l2_format_info *f)
506
+{
507
+ return f && f->pixel_enc == V4L2_PIXEL_ENC_YUV;
508
+}
509
+
510
+static inline bool v4l2_is_format_bayer(const struct v4l2_format_info *f)
511
+{
512
+ return f && f->pixel_enc == V4L2_PIXEL_ENC_BAYER;
513
+}
514
+
515
+const struct v4l2_format_info *v4l2_format_info(u32 format);
516
+void v4l2_apply_frmsize_constraints(u32 *width, u32 *height,
517
+ const struct v4l2_frmsize_stepwise *frmsize);
518
+int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat,
519
+ u32 width, u32 height);
520
+int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat,
521
+ u32 width, u32 height);
522
+
523
+static inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf)
524
+{
525
+ /*
526
+ * When the timestamp comes from 32-bit user space, there may be
527
+ * uninitialized data in tv_usec, so cast it to u32.
528
+ * Otherwise allow invalid input for backwards compatibility.
529
+ */
530
+ return buf->timestamp.tv_sec * NSEC_PER_SEC +
531
+ (u32)buf->timestamp.tv_usec * NSEC_PER_USEC;
532
+}
533
+
534
+static inline void v4l2_buffer_set_timestamp(struct v4l2_buffer *buf,
535
+ u64 timestamp)
536
+{
537
+ struct timespec64 ts = ns_to_timespec64(timestamp);
538
+
539
+ buf->timestamp.tv_sec = ts.tv_sec;
540
+ buf->timestamp.tv_usec = ts.tv_nsec / NSEC_PER_USEC;
541
+}
542
+
543
+static inline bool v4l2_is_colorspace_valid(__u32 colorspace)
544
+{
545
+ return colorspace > V4L2_COLORSPACE_DEFAULT &&
546
+ colorspace <= V4L2_COLORSPACE_DCI_P3;
547
+}
548
+
549
+static inline bool v4l2_is_xfer_func_valid(__u32 xfer_func)
550
+{
551
+ return xfer_func > V4L2_XFER_FUNC_DEFAULT &&
552
+ xfer_func <= V4L2_XFER_FUNC_SMPTE2084;
553
+}
554
+
555
+static inline bool v4l2_is_ycbcr_enc_valid(__u8 ycbcr_enc)
556
+{
557
+ return ycbcr_enc > V4L2_YCBCR_ENC_DEFAULT &&
558
+ ycbcr_enc <= V4L2_YCBCR_ENC_SMPTE240M;
559
+}
560
+
561
+static inline bool v4l2_is_hsv_enc_valid(__u8 hsv_enc)
562
+{
563
+ return hsv_enc == V4L2_HSV_ENC_180 || hsv_enc == V4L2_HSV_ENC_256;
564
+}
565
+
566
+static inline bool v4l2_is_quant_valid(__u8 quantization)
567
+{
568
+ return quantization == V4L2_QUANTIZATION_FULL_RANGE ||
569
+ quantization == V4L2_QUANTIZATION_LIM_RANGE;
570
+}
571
+
387572 #endif /* V4L2_COMMON_H_ */