| 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| 2 | /* |
| 3 | v4l2 common internal API header |
| 4 | |
| 5 | This header contains internal shared ioctl definitions for use by the |
| 6 | internal low-level v4l2 drivers. |
| 7 | Each ioctl begins with VIDIOC_INT_ to clearly mark that it is an internal |
| 8 | define, |
| 9 | |
| 10 | Copyright (C) 2005 Hans Verkuil <hverkuil@kernel.org> |
| 11 | |
| 12 | */ |
| 13 | |
| 14 | #ifndef V4L2_COMMON_H_ |
| 15 | #define V4L2_COMMON_H_ |
| 16 | |
| 17 | #include <linux/time.h> |
| 18 | #include <media/v4l2-dev.h> |
| 19 | |
| 20 | /* Common printk constructs for v4l-i2c drivers. These macros create a unique |
| 21 | prefix consisting of the driver name, the adapter number and the i2c |
| 22 | address. */ |
| 23 | #define v4l_printk(level, name, adapter, addr, fmt, arg...) \ |
| 24 | printk(level "%s %d-%04x: " fmt, name, i2c_adapter_id(adapter), addr , ## arg) |
| 25 | |
| 26 | #define v4l_client_printk(level, client, fmt, arg...) \ |
| 27 | v4l_printk(level, (client)->dev.driver->name, (client)->adapter, \ |
| 28 | (client)->addr, fmt , ## arg) |
| 29 | |
| 30 | #define v4l_err(client, fmt, arg...) \ |
| 31 | v4l_client_printk(KERN_ERR, client, fmt , ## arg) |
| 32 | |
| 33 | #define v4l_warn(client, fmt, arg...) \ |
| 34 | v4l_client_printk(KERN_WARNING, client, fmt , ## arg) |
| 35 | |
| 36 | #define v4l_info(client, fmt, arg...) \ |
| 37 | v4l_client_printk(KERN_INFO, client, fmt , ## arg) |
| 38 | |
| 39 | /* These three macros assume that the debug level is set with a module |
| 40 | parameter called 'debug'. */ |
| 41 | #define v4l_dbg(level, debug, client, fmt, arg...) \ |
| 42 | do { \ |
| 43 | if (debug >= (level)) \ |
| 44 | v4l_client_printk(KERN_DEBUG, client, fmt , ## arg); \ |
| 45 | } while (0) |
| 46 | |
| 47 | /* Add a version of v4l_dbg to be used on drivers using dev_foo() macros */ |
| 48 | #define dev_dbg_lvl(__dev, __level, __debug, __fmt, __arg...) \ |
| 49 | do { \ |
| 50 | if (__debug >= (__level)) \ |
| 51 | dev_printk(KERN_DEBUG, __dev, __fmt, ##__arg); \ |
| 52 | } while (0) |
| 53 | |
| 54 | /* ------------------------------------------------------------------------- */ |
| 55 | |
| 56 | /* These printk constructs can be used with v4l2_device and v4l2_subdev */ |
| 57 | #define v4l2_printk(level, dev, fmt, arg...) \ |
| 58 | printk(level "%s: " fmt, (dev)->name , ## arg) |
| 59 | |
| 60 | #define v4l2_err(dev, fmt, arg...) \ |
| 61 | v4l2_printk(KERN_ERR, dev, fmt , ## arg) |
| 62 | |
| 63 | #define v4l2_warn(dev, fmt, arg...) \ |
| 64 | v4l2_printk(KERN_WARNING, dev, fmt , ## arg) |
| 65 | |
| 66 | #define v4l2_info(dev, fmt, arg...) \ |
| 67 | v4l2_printk(KERN_INFO, dev, fmt , ## arg) |
| 68 | |
| 69 | /* These three macros assume that the debug level is set with a module |
| 70 | parameter called 'debug'. */ |
| 71 | #define v4l2_dbg(level, debug, dev, fmt, arg...) \ |
| 72 | do { \ |
| 73 | if (debug >= (level)) \ |
| 74 | v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \ |
| 75 | } while (0) |
| 76 | |
| 77 | /** |
| 78 | * v4l2_ctrl_query_fill- Fill in a struct v4l2_queryctrl |
| 79 | * |
| 80 | * @qctrl: pointer to the &struct v4l2_queryctrl to be filled |
| 81 | * @min: minimum value for the control |
| 82 | * @max: maximum value for the control |
| 83 | * @step: control step |
| 84 | * @def: default value for the control |
| 85 | * |
| 86 | * Fills the &struct v4l2_queryctrl fields for the query control. |
| 87 | * |
| 88 | * .. note:: |
| 89 | * |
| 90 | * This function assumes that the @qctrl->id field is filled. |
| 91 | * |
| 92 | * Returns -EINVAL if the control is not known by the V4L2 core, 0 on success. |
| 93 | */ |
| 94 | |
| 95 | int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, |
| 96 | s32 min, s32 max, s32 step, s32 def); |
| 97 | |
| 98 | /* ------------------------------------------------------------------------- */ |
| 99 | |
| 100 | struct clk; |
| 101 | struct v4l2_device; |
| 102 | struct v4l2_subdev; |
| 103 | struct v4l2_subdev_ops; |
| 104 | |
| 105 | /* I2C Helper functions */ |
| 106 | #include <linux/i2c.h> |
| 107 | |
| 108 | /** |
| 109 | * enum v4l2_i2c_tuner_type - specifies the range of tuner address that |
| 110 | * should be used when seeking for I2C devices. |
| 111 | * |
| 112 | * @ADDRS_RADIO: Radio tuner addresses. |
| 113 | * Represent the following I2C addresses: |
| 114 | * 0x10 (if compiled with tea5761 support) |
| 115 | * and 0x60. |
| 116 | * @ADDRS_DEMOD: Demod tuner addresses. |
| 117 | * Represent the following I2C addresses: |
| 118 | * 0x42, 0x43, 0x4a and 0x4b. |
| 119 | * @ADDRS_TV: TV tuner addresses. |
| 120 | * Represent the following I2C addresses: |
| 121 | * 0x42, 0x43, 0x4a, 0x4b, 0x60, 0x61, 0x62, |
| 122 | * 0x63 and 0x64. |
| 123 | * @ADDRS_TV_WITH_DEMOD: TV tuner addresses if demod is present, this |
| 124 | * excludes addresses used by the demodulator |
| 125 | * from the list of candidates. |
| 126 | * Represent the following I2C addresses: |
| 127 | * 0x60, 0x61, 0x62, 0x63 and 0x64. |
| 128 | * |
| 129 | * NOTE: All I2C addresses above use the 7-bit notation. |
| 130 | */ |
| 131 | enum v4l2_i2c_tuner_type { |
| 132 | ADDRS_RADIO, |
| 133 | ADDRS_DEMOD, |
| 134 | ADDRS_TV, |
| 135 | ADDRS_TV_WITH_DEMOD, |
| 136 | }; |
| 137 | |
| 138 | #if defined(CONFIG_VIDEO_V4L2_I2C) |
| 139 | |
| 140 | /** |
| 141 | * v4l2_i2c_new_subdev - 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 | * @client_type: name of the chip that's on the adapter. |
| 147 | * @addr: I2C address. If zero, it will use @probe_addrs |
| 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(struct v4l2_device *v4l2_dev, |
| 154 | struct i2c_adapter *adapter, const char *client_type, |
| 155 | u8 addr, const unsigned short *probe_addrs); |
| 156 | |
| 157 | /** |
| 158 | * v4l2_i2c_new_subdev_board - Load an i2c module and return an initialized |
| 159 | * &struct v4l2_subdev. |
| 160 | * |
| 161 | * @v4l2_dev: pointer to &struct v4l2_device |
| 162 | * @adapter: pointer to struct i2c_adapter |
| 163 | * @info: pointer to struct i2c_board_info used to replace the irq, |
| 164 | * platform_data and addr arguments. |
| 165 | * @probe_addrs: array with a list of address. The last entry at such |
| 166 | * array should be %I2C_CLIENT_END. |
| 167 | * |
| 168 | * returns a &struct v4l2_subdev pointer. |
| 169 | */ |
| 170 | struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, |
| 171 | struct i2c_adapter *adapter, struct i2c_board_info *info, |
| 172 | const unsigned short *probe_addrs); |
| 173 | |
| 174 | /** |
| 175 | * v4l2_i2c_subdev_set_name - Set name for an I²C sub-device |
| 176 | * |
| 177 | * @sd: pointer to &struct v4l2_subdev |
| 178 | * @client: pointer to struct i2c_client |
| 179 | * @devname: the name of the device; if NULL, the I²C device drivers's name |
| 180 | * will be used |
| 181 | * @postfix: sub-device specific string to put right after the I²C device name; |
| 182 | * may be NULL |
| 183 | */ |
| 184 | void v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client, |
| 185 | const char *devname, const char *postfix); |
| 186 | |
| 187 | /** |
| 188 | * v4l2_i2c_subdev_init - Initializes a &struct v4l2_subdev with data from |
| 189 | * an i2c_client struct. |
| 190 | * |
| 191 | * @sd: pointer to &struct v4l2_subdev |
| 192 | * @client: pointer to struct i2c_client |
| 193 | * @ops: pointer to &struct v4l2_subdev_ops |
| 194 | */ |
| 195 | void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, |
| 196 | const struct v4l2_subdev_ops *ops); |
| 197 | |
| 198 | /** |
| 199 | * v4l2_i2c_subdev_addr - returns i2c client address of &struct v4l2_subdev. |
| 200 | * |
| 201 | * @sd: pointer to &struct v4l2_subdev |
| 202 | * |
| 203 | * Returns the address of an I2C sub-device |
| 204 | */ |
| 205 | unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd); |
| 206 | |
| 207 | /** |
| 208 | * v4l2_i2c_tuner_addrs - Return a list of I2C tuner addresses to probe. |
| 209 | * |
| 210 | * @type: type of the tuner to seek, as defined by |
| 211 | * &enum v4l2_i2c_tuner_type. |
| 212 | * |
| 213 | * NOTE: Use only if the tuner addresses are unknown. |
| 214 | */ |
| 215 | const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type); |
| 216 | |
| 217 | /** |
| 218 | * v4l2_i2c_subdev_unregister - Unregister a v4l2_subdev |
| 219 | * |
| 220 | * @sd: pointer to &struct v4l2_subdev |
| 221 | */ |
| 222 | void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd); |
| 223 | |
| 224 | #else |
| 225 | |
| 226 | static inline struct v4l2_subdev * |
| 227 | v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev, |
| 228 | struct i2c_adapter *adapter, const char *client_type, |
| 229 | u8 addr, const unsigned short *probe_addrs) |
| 230 | { |
| 231 | return NULL; |
| 232 | } |
| 233 | |
| 234 | static inline struct v4l2_subdev * |
| 235 | v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, |
| 236 | struct i2c_adapter *adapter, struct i2c_board_info *info, |
| 237 | const unsigned short *probe_addrs) |
| 238 | { |
| 239 | return NULL; |
| 240 | } |
| 241 | |
| 242 | static inline void |
| 243 | v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client, |
| 244 | const char *devname, const char *postfix) |
| 245 | {} |
| 246 | |
| 247 | static inline void |
| 248 | v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, |
| 249 | const struct v4l2_subdev_ops *ops) |
| 250 | {} |
| 251 | |
| 252 | static inline unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd) |
| 253 | { |
| 254 | return I2C_CLIENT_END; |
| 255 | } |
| 256 | |
| 257 | static inline const unsigned short * |
| 258 | v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type) |
| 259 | { |
| 260 | return NULL; |
| 261 | } |
| 262 | |
| 263 | static inline void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd) |
| 264 | {} |
| 265 | |
| 266 | #endif |
| 267 | |
| 268 | /* ------------------------------------------------------------------------- */ |
| 269 | |
| 270 | /* SPI Helper functions */ |
| 271 | |
| 272 | #include <linux/spi/spi.h> |
| 273 | |
| 274 | #if defined(CONFIG_SPI) |
| 275 | |
| 276 | /** |
| 277 | * v4l2_spi_new_subdev - Load an spi module and return an initialized |
| 278 | * &struct v4l2_subdev. |
| 279 | * |
| 280 | * |
| 281 | * @v4l2_dev: pointer to &struct v4l2_device. |
| 282 | * @ctlr: pointer to struct spi_controller. |
| 283 | * @info: pointer to struct spi_board_info. |
| 284 | * |
| 285 | * returns a &struct v4l2_subdev pointer. |
| 286 | */ |
| 287 | struct v4l2_subdev *v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev, |
| 288 | struct spi_controller *ctlr, struct spi_board_info *info); |
| 289 | |
| 290 | /** |
| 291 | * v4l2_spi_subdev_init - Initialize a v4l2_subdev with data from an |
| 292 | * spi_device struct. |
| 293 | * |
| 294 | * @sd: pointer to &struct v4l2_subdev |
| 295 | * @spi: pointer to struct spi_device. |
| 296 | * @ops: pointer to &struct v4l2_subdev_ops |
| 297 | */ |
| 298 | void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi, |
| 299 | const struct v4l2_subdev_ops *ops); |
| 300 | |
| 301 | /** |
| 302 | * v4l2_spi_subdev_unregister - Unregister a v4l2_subdev |
| 303 | * |
| 304 | * @sd: pointer to &struct v4l2_subdev |
| 305 | */ |
| 306 | void v4l2_spi_subdev_unregister(struct v4l2_subdev *sd); |
| 307 | |
| 308 | #else |
| 309 | |
| 310 | static inline struct v4l2_subdev * |
| 311 | v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev, |
| 312 | struct spi_controller *ctlr, struct spi_board_info *info) |
| 313 | { |
| 314 | return NULL; |
| 315 | } |
| 316 | |
| 317 | static inline void |
| 318 | v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi, |
| 319 | const struct v4l2_subdev_ops *ops) |
| 320 | {} |
| 321 | |
| 322 | static inline void v4l2_spi_subdev_unregister(struct v4l2_subdev *sd) |
| 323 | {} |
| 324 | #endif |
| 325 | |
| 326 | /* ------------------------------------------------------------------------- */ |
| 327 | |
| 328 | /* |
| 329 | * FIXME: these remaining ioctls/structs should be removed as well, but they |
| 330 | * are still used in tuner-simple.c (TUNER_SET_CONFIG) and cx18/ivtv (RESET). |
| 331 | * To remove these ioctls some more cleanup is needed in those modules. |
| 332 | * |
| 333 | * It doesn't make much sense on documenting them, as what we really want is |
| 334 | * to get rid of them. |
| 335 | */ |
| 336 | |
| 337 | /* s_config */ |
| 338 | struct v4l2_priv_tun_config { |
| 339 | int tuner; |
| 340 | void *priv; |
| 341 | }; |
| 342 | #define TUNER_SET_CONFIG _IOW('d', 92, struct v4l2_priv_tun_config) |
| 343 | |
| 344 | #define VIDIOC_INT_RESET _IOW ('d', 102, u32) |
| 345 | |
| 346 | /* ------------------------------------------------------------------------- */ |
| 347 | |
| 348 | /* Miscellaneous helper functions */ |
| 349 | |
| 350 | /** |
| 351 | * v4l_bound_align_image - adjust video dimensions according to |
| 352 | * a given constraints. |
| 353 | * |
| 354 | * @width: pointer to width that will be adjusted if needed. |
| 355 | * @wmin: minimum width. |
| 356 | * @wmax: maximum width. |
| 357 | * @walign: least significant bit on width. |
| 358 | * @height: pointer to height that will be adjusted if needed. |
| 359 | * @hmin: minimum height. |
| 360 | * @hmax: maximum height. |
| 361 | * @halign: least significant bit on height. |
| 362 | * @salign: least significant bit for the image size (e. g. |
| 363 | * :math:`width * height`). |
| 364 | * |
| 365 | * Clip an image to have @width between @wmin and @wmax, and @height between |
| 366 | * @hmin and @hmax, inclusive. |
| 367 | * |
| 368 | * Additionally, the @width will be a multiple of :math:`2^{walign}`, |
| 369 | * the @height will be a multiple of :math:`2^{halign}`, and the overall |
| 370 | * size :math:`width * height` will be a multiple of :math:`2^{salign}`. |
| 371 | * |
| 372 | * .. note:: |
| 373 | * |
| 374 | * #. The clipping rectangle may be shrunk or enlarged to fit the alignment |
| 375 | * constraints. |
| 376 | * #. @wmax must not be smaller than @wmin. |
| 377 | * #. @hmax must not be smaller than @hmin. |
| 378 | * #. The alignments must not be so high there are no possible image |
| 379 | * sizes within the allowed bounds. |
| 380 | * #. @wmin and @hmin must be at least 1 (don't use 0). |
| 381 | * #. For @walign, @halign and @salign, if you don't care about a certain |
| 382 | * alignment, specify ``0``, as :math:`2^0 = 1` and one byte alignment |
| 383 | * is equivalent to no alignment. |
| 384 | * #. If you only want to adjust downward, specify a maximum that's the |
| 385 | * same as the initial value. |
| 386 | */ |
| 387 | void v4l_bound_align_image(unsigned int *width, unsigned int wmin, |
| 388 | unsigned int wmax, unsigned int walign, |
| 389 | unsigned int *height, unsigned int hmin, |
| 390 | unsigned int hmax, unsigned int halign, |
| 391 | unsigned int salign); |
| 392 | |
| 393 | /** |
| 394 | * v4l2_find_nearest_size_conditional - Find the nearest size among a discrete |
| 395 | * set of resolutions contained in an array of a driver specific struct, |
| 396 | * with conditionally exlusion of certain modes |
| 397 | * |
| 398 | * @array: a driver specific array of image sizes |
| 399 | * @array_size: the length of the driver specific array of image sizes |
| 400 | * @width_field: the name of the width field in the driver specific struct |
| 401 | * @height_field: the name of the height field in the driver specific struct |
| 402 | * @width: desired width |
| 403 | * @height: desired height |
| 404 | * @func: ignores mode if returns false |
| 405 | * @context: context for the function |
| 406 | * |
| 407 | * Finds the closest resolution to minimize the width and height differences |
| 408 | * between what requested and the supported resolutions. The size of the width |
| 409 | * and height fields in the driver specific must equal to that of u32, i.e. four |
| 410 | * bytes. @func is called for each mode considered, a mode is ignored if @func |
| 411 | * returns false for it. |
| 412 | * |
| 413 | * Returns the best match or NULL if the length of the array is zero. |
| 414 | */ |
| 415 | #define v4l2_find_nearest_size_conditional(array, array_size, width_field, \ |
| 416 | height_field, width, height, \ |
| 417 | func, context) \ |
| 418 | ({ \ |
| 419 | BUILD_BUG_ON(sizeof((array)->width_field) != sizeof(u32) || \ |
| 420 | sizeof((array)->height_field) != sizeof(u32)); \ |
| 421 | (typeof(&(array)[0]))__v4l2_find_nearest_size_conditional( \ |
| 422 | (array), array_size, sizeof(*(array)), \ |
| 423 | offsetof(typeof(*(array)), width_field), \ |
| 424 | offsetof(typeof(*(array)), height_field), \ |
| 425 | width, height, func, context); \ |
| 426 | }) |
| 427 | const void * |
| 428 | __v4l2_find_nearest_size_conditional(const void *array, size_t array_size, |
| 429 | size_t entry_size, size_t width_offset, |
| 430 | size_t height_offset, s32 width, |
| 431 | s32 height, |
| 432 | bool (*func)(const void *array, |
| 433 | size_t index, |
| 434 | const void *context), |
| 435 | const void *context); |
| 436 | |
| 437 | /** |
| 438 | * v4l2_find_nearest_size - Find the nearest size among a discrete set of |
| 439 | * resolutions contained in an array of a driver specific struct |
| 440 | * |
| 441 | * @array: a driver specific array of image sizes |
| 442 | * @array_size: the length of the driver specific array of image sizes |
| 443 | * @width_field: the name of the width field in the driver specific struct |
| 444 | * @height_field: the name of the height field in the driver specific struct |
| 445 | * @width: desired width |
| 446 | * @height: desired height |
| 447 | * |
| 448 | * Finds the closest resolution to minimize the width and height differences |
| 449 | * between what requested and the supported resolutions. The size of the width |
| 450 | * and height fields in the driver specific must equal to that of u32, i.e. four |
| 451 | * bytes. |
| 452 | * |
| 453 | * Returns the best match or NULL if the length of the array is zero. |
| 454 | */ |
| 455 | #define v4l2_find_nearest_size(array, array_size, width_field, \ |
| 456 | height_field, width, height) \ |
| 457 | v4l2_find_nearest_size_conditional(array, array_size, width_field, \ |
| 458 | height_field, width, height, NULL, \ |
| 459 | NULL) |
| 460 | |
| 461 | /** |
| 462 | * v4l2_g_parm_cap - helper routine for vidioc_g_parm to fill this in by |
| 463 | * calling the get_frame_interval op of the given subdev. It only works |
| 464 | * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the |
| 465 | * function name. |
| 466 | * |
| 467 | * @vdev: the struct video_device pointer. Used to determine the device caps. |
| 468 | * @sd: the sub-device pointer. |
| 469 | * @a: the VIDIOC_G_PARM argument. |
| 470 | */ |
| 471 | int v4l2_g_parm_cap(struct video_device *vdev, |
| 472 | struct v4l2_subdev *sd, struct v4l2_streamparm *a); |
| 473 | |
| 474 | /** |
| 475 | * v4l2_s_parm_cap - helper routine for vidioc_s_parm to fill this in by |
| 476 | * calling the set_frame_interval op of the given subdev. It only works |
| 477 | * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the |
| 478 | * function name. |
| 479 | * |
| 480 | * @vdev: the struct video_device pointer. Used to determine the device caps. |
| 481 | * @sd: the sub-device pointer. |
| 482 | * @a: the VIDIOC_S_PARM argument. |
| 483 | */ |
| 484 | int v4l2_s_parm_cap(struct video_device *vdev, |
| 485 | struct v4l2_subdev *sd, struct v4l2_streamparm *a); |
| 486 | |
| 487 | /* Compare two v4l2_fract structs */ |
| 488 | #define V4L2_FRACT_COMPARE(a, OP, b) \ |
| 489 | ((u64)(a).numerator * (b).denominator OP \ |
| 490 | (u64)(b).numerator * (a).denominator) |
| 491 | |
| 492 | /* ------------------------------------------------------------------------- */ |
| 493 | |
| 494 | /* Pixel format and FourCC helpers */ |
| 495 | |
| 496 | /** |
| 497 | * enum v4l2_pixel_encoding - specifies the pixel encoding value |
| 498 | * |
| 499 | * @V4L2_PIXEL_ENC_UNKNOWN: Pixel encoding is unknown/un-initialized |
| 500 | * @V4L2_PIXEL_ENC_YUV: Pixel encoding is YUV |
| 501 | * @V4L2_PIXEL_ENC_RGB: Pixel encoding is RGB |
| 502 | * @V4L2_PIXEL_ENC_BAYER: Pixel encoding is Bayer |
| 503 | */ |
| 504 | enum v4l2_pixel_encoding { |
| 505 | V4L2_PIXEL_ENC_UNKNOWN = 0, |
| 506 | V4L2_PIXEL_ENC_YUV = 1, |
| 507 | V4L2_PIXEL_ENC_RGB = 2, |
| 508 | V4L2_PIXEL_ENC_BAYER = 3, |
| 509 | }; |
| 510 | |
| 511 | /** |
| 512 | * struct v4l2_format_info - information about a V4L2 format |
| 513 | * @format: 4CC format identifier (V4L2_PIX_FMT_*) |
| 514 | * @pixel_enc: Pixel encoding (see enum v4l2_pixel_encoding above) |
| 515 | * @mem_planes: Number of memory planes, which includes the alpha plane (1 to 4). |
| 516 | * @comp_planes: Number of component planes, which includes the alpha plane (1 to 4). |
| 517 | * @bpp: Array of per-plane bytes per pixel |
| 518 | * @bpp_div: Array of per-plane bytes per pixel divisors to support fractional pixel sizes. |
| 519 | * @hdiv: Horizontal chroma subsampling factor |
| 520 | * @vdiv: Vertical chroma subsampling factor |
| 521 | * @block_w: Per-plane macroblock pixel width (optional) |
| 522 | * @block_h: Per-plane macroblock pixel height (optional) |
| 523 | */ |
| 524 | struct v4l2_format_info { |
| 525 | u32 format; |
| 526 | u8 pixel_enc; |
| 527 | u8 mem_planes; |
| 528 | u8 comp_planes; |
| 529 | u8 bpp[4]; |
| 530 | u8 bpp_div[4]; |
| 531 | u8 hdiv; |
| 532 | u8 vdiv; |
| 533 | u8 block_w[4]; |
| 534 | u8 block_h[4]; |
| 535 | }; |
| 536 | |
| 537 | static inline bool v4l2_is_format_rgb(const struct v4l2_format_info *f) |
| 538 | { |
| 539 | return f && f->pixel_enc == V4L2_PIXEL_ENC_RGB; |
| 540 | } |
| 541 | |
| 542 | static inline bool v4l2_is_format_yuv(const struct v4l2_format_info *f) |
| 543 | { |
| 544 | return f && f->pixel_enc == V4L2_PIXEL_ENC_YUV; |
| 545 | } |
| 546 | |
| 547 | static inline bool v4l2_is_format_bayer(const struct v4l2_format_info *f) |
| 548 | { |
| 549 | return f && f->pixel_enc == V4L2_PIXEL_ENC_BAYER; |
| 550 | } |
| 551 | |
| 552 | const struct v4l2_format_info *v4l2_format_info(u32 format); |
| 553 | void v4l2_apply_frmsize_constraints(u32 *width, u32 *height, |
| 554 | const struct v4l2_frmsize_stepwise *frmsize); |
| 555 | int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, |
| 556 | u32 width, u32 height); |
| 557 | int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, |
| 558 | u32 width, u32 height); |
| 559 | |
| 560 | /** |
| 561 | * v4l2_get_link_freq - Get link rate from transmitter |
| 562 | * |
| 563 | * @pad: The transmitter's media pad |
| 564 | * @mul: The multiplier between pixel rate and link frequency. Bits per pixel on |
| 565 | * D-PHY, samples per clock on parallel. 0 otherwise. |
| 566 | * @div: The divisor between pixel rate and link frequency. Number of data lanes |
| 567 | * times two on D-PHY, 1 on parallel. 0 otherwise. |
| 568 | * |
| 569 | * This function obtains and returns the link frequency from the transmitter |
| 570 | * sub-device's pad. The link frequency is retrieved using the get_mbus_config |
| 571 | * sub-device pad operation. If this fails, the function falls back to obtaining |
| 572 | * the frequency either directly from the V4L2_CID_LINK_FREQ control if |
| 573 | * implemented by the transmitter, or by calculating it from the pixel rate |
| 574 | * obtained from the V4L2_CID_PIXEL_RATE control. |
| 575 | * |
| 576 | * Return: |
| 577 | * * >0: Link frequency |
| 578 | * * %-ENOENT: Link frequency or pixel rate control not found |
| 579 | * * %-EINVAL: Invalid link frequency value |
| 580 | */ |
| 581 | #ifdef CONFIG_MEDIA_CONTROLLER |
| 582 | s64 v4l2_get_link_freq(const struct media_pad *pad, unsigned int mul, |
| 583 | unsigned int div); |
| 584 | |
| 585 | /** |
| 586 | * v4l2_get_active_data_lanes - Get number of active data lanes from driver |
| 587 | * |
| 588 | * @pad: The transmitter's media pad. |
| 589 | * @max_data_lanes: The maximum number of active data lanes supported by |
| 590 | * the MIPI CSI link in hardware. |
| 591 | * |
| 592 | * This function is intended for obtaining the number of data lanes that are |
| 593 | * actively being used by the driver for a MIPI CSI-2 device on a given media pad. |
| 594 | * This information is derived from a mbus_config fetched from a device driver |
| 595 | * using the get_mbus_config v4l2_subdev pad op. |
| 596 | * |
| 597 | * Return: |
| 598 | * * >0: Number of active data lanes |
| 599 | * * %-EINVAL: Number of active data lanes is invalid, as it exceeds the maximum |
| 600 | * supported data lanes. |
| 601 | */ |
| 602 | int v4l2_get_active_data_lanes(const struct media_pad *pad, |
| 603 | unsigned int max_data_lanes); |
| 604 | #endif |
| 605 | |
| 606 | void v4l2_simplify_fraction(u32 *numerator, u32 *denominator, |
| 607 | unsigned int n_terms, unsigned int threshold); |
| 608 | u32 v4l2_fraction_to_interval(u32 numerator, u32 denominator); |
| 609 | |
| 610 | /** |
| 611 | * v4l2_link_freq_to_bitmap - Figure out platform-supported link frequencies |
| 612 | * @dev: The struct device |
| 613 | * @fw_link_freqs: Array of link frequencies from firmware |
| 614 | * @num_of_fw_link_freqs: Number of entries in @fw_link_freqs |
| 615 | * @driver_link_freqs: Array of link frequencies supported by the driver |
| 616 | * @num_of_driver_link_freqs: Number of entries in @driver_link_freqs |
| 617 | * @bitmap: Bitmap of driver-supported link frequencies found in @fw_link_freqs |
| 618 | * |
| 619 | * This function checks which driver-supported link frequencies are enabled in |
| 620 | * system firmware and sets the corresponding bits in @bitmap (after first |
| 621 | * zeroing it). |
| 622 | * |
| 623 | * Return: |
| 624 | * * %0: Success |
| 625 | * * %-ENOENT: No match found between driver-supported link frequencies and |
| 626 | * those available in firmware. |
| 627 | * * %-ENODATA: No link frequencies were specified in firmware. |
| 628 | */ |
| 629 | int v4l2_link_freq_to_bitmap(struct device *dev, const u64 *fw_link_freqs, |
| 630 | unsigned int num_of_fw_link_freqs, |
| 631 | const s64 *driver_link_freqs, |
| 632 | unsigned int num_of_driver_link_freqs, |
| 633 | unsigned long *bitmap); |
| 634 | |
| 635 | struct clk *__devm_v4l2_sensor_clk_get(struct device *dev, const char *id, |
| 636 | bool legacy, bool fixed_rate, |
| 637 | unsigned long clk_rate); |
| 638 | |
| 639 | /** |
| 640 | * devm_v4l2_sensor_clk_get - lookup and obtain a reference to a clock producer |
| 641 | * for a camera sensor |
| 642 | * |
| 643 | * @dev: device for v4l2 sensor clock "consumer" |
| 644 | * @id: clock consumer ID |
| 645 | * |
| 646 | * This function behaves the same way as devm_clk_get() except where there |
| 647 | * is no clock producer like in ACPI-based platforms. |
| 648 | * |
| 649 | * For ACPI-based platforms, the function will read the "clock-frequency" |
| 650 | * ACPI _DSD property and register a fixed-clock with the frequency indicated |
| 651 | * in the property. |
| 652 | * |
| 653 | * This function also handles the special ACPI-based system case where: |
| 654 | * |
| 655 | * * The clock-frequency _DSD property is present. |
| 656 | * * A reference to the clock producer is present, where the clock is provided |
| 657 | * by a camera sensor PMIC driver (e.g. int3472/tps68470.c) |
| 658 | * |
| 659 | * In this case try to set the clock-frequency value to the provided clock. |
| 660 | * |
| 661 | * As the name indicates, this function may only be used on camera sensor |
| 662 | * devices. This is because generally only camera sensors do need a clock to |
| 663 | * query the frequency from, due to the requirement to configure the PLL for a |
| 664 | * given CSI-2 interface frequency where the sensor's external clock frequency |
| 665 | * is a factor. Additionally, the clock frequency tends to be available on ACPI |
| 666 | * firmware based systems for camera sensors specifically (if e.g. DisCo for |
| 667 | * Imaging compliant). |
| 668 | * |
| 669 | * Returns a pointer to a struct clk on success or an error pointer on failure. |
| 670 | */ |
| 671 | static inline struct clk * |
| 672 | devm_v4l2_sensor_clk_get(struct device *dev, const char *id) |
| 673 | { |
| 674 | return __devm_v4l2_sensor_clk_get(dev, id, legacy: false, fixed_rate: false, clk_rate: 0); |
| 675 | } |
| 676 | |
| 677 | /** |
| 678 | * devm_v4l2_sensor_clk_get_legacy - lookup and obtain a reference to a clock |
| 679 | * producer for a camera sensor. |
| 680 | * |
| 681 | * @dev: device for v4l2 sensor clock "consumer" |
| 682 | * @id: clock consumer ID |
| 683 | * @fixed_rate: interpret the @clk_rate as a fixed rate or default rate |
| 684 | * @clk_rate: the clock rate |
| 685 | * |
| 686 | * This function behaves the same way as devm_v4l2_sensor_clk_get() except that |
| 687 | * it extends the behaviour on ACPI platforms to all platforms. |
| 688 | * |
| 689 | * The function also provides the ability to set the clock rate to a fixed |
| 690 | * frequency by setting @fixed_rate to true and specifying the fixed frequency |
| 691 | * in @clk_rate, or to use a default clock rate when the "clock-frequency" |
| 692 | * property is absent by setting @fixed_rate to false and specifying the default |
| 693 | * frequency in @clk_rate. Setting @fixed_rate to true and @clk_rate to 0 is an |
| 694 | * error. |
| 695 | * |
| 696 | * This function is meant to support legacy behaviour in existing drivers only. |
| 697 | * It must not be used in any new driver. |
| 698 | * |
| 699 | * Returns a pointer to a struct clk on success or an error pointer on failure. |
| 700 | */ |
| 701 | static inline struct clk * |
| 702 | devm_v4l2_sensor_clk_get_legacy(struct device *dev, const char *id, |
| 703 | bool fixed_rate, unsigned long clk_rate) |
| 704 | { |
| 705 | return __devm_v4l2_sensor_clk_get(dev, id, legacy: true, fixed_rate, clk_rate); |
| 706 | } |
| 707 | |
| 708 | static inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf) |
| 709 | { |
| 710 | /* |
| 711 | * When the timestamp comes from 32-bit user space, there may be |
| 712 | * uninitialized data in tv_usec, so cast it to u32. |
| 713 | * Otherwise allow invalid input for backwards compatibility. |
| 714 | */ |
| 715 | return buf->timestamp.tv_sec * NSEC_PER_SEC + |
| 716 | (u32)buf->timestamp.tv_usec * NSEC_PER_USEC; |
| 717 | } |
| 718 | |
| 719 | static inline void v4l2_buffer_set_timestamp(struct v4l2_buffer *buf, |
| 720 | u64 timestamp) |
| 721 | { |
| 722 | struct timespec64 ts = ns_to_timespec64(nsec: timestamp); |
| 723 | |
| 724 | buf->timestamp.tv_sec = ts.tv_sec; |
| 725 | buf->timestamp.tv_usec = ts.tv_nsec / NSEC_PER_USEC; |
| 726 | } |
| 727 | |
| 728 | static inline bool v4l2_is_colorspace_valid(__u32 colorspace) |
| 729 | { |
| 730 | return colorspace > V4L2_COLORSPACE_DEFAULT && |
| 731 | colorspace < V4L2_COLORSPACE_LAST; |
| 732 | } |
| 733 | |
| 734 | static inline bool v4l2_is_xfer_func_valid(__u32 xfer_func) |
| 735 | { |
| 736 | return xfer_func > V4L2_XFER_FUNC_DEFAULT && |
| 737 | xfer_func < V4L2_XFER_FUNC_LAST; |
| 738 | } |
| 739 | |
| 740 | static inline bool v4l2_is_ycbcr_enc_valid(__u8 ycbcr_enc) |
| 741 | { |
| 742 | return ycbcr_enc > V4L2_YCBCR_ENC_DEFAULT && |
| 743 | ycbcr_enc < V4L2_YCBCR_ENC_LAST; |
| 744 | } |
| 745 | |
| 746 | static inline bool v4l2_is_hsv_enc_valid(__u8 hsv_enc) |
| 747 | { |
| 748 | return hsv_enc == V4L2_HSV_ENC_180 || hsv_enc == V4L2_HSV_ENC_256; |
| 749 | } |
| 750 | |
| 751 | static inline bool v4l2_is_quant_valid(__u8 quantization) |
| 752 | { |
| 753 | return quantization == V4L2_QUANTIZATION_FULL_RANGE || |
| 754 | quantization == V4L2_QUANTIZATION_LIM_RANGE; |
| 755 | } |
| 756 | |
| 757 | #endif /* V4L2_COMMON_H_ */ |
| 758 | |