1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2b2f0648fSHans Verkuil /* 3b2f0648fSHans Verkuil v4l2 common internal API header 4b2f0648fSHans Verkuil 5b2f0648fSHans Verkuil This header contains internal shared ioctl definitions for use by the 6b2f0648fSHans Verkuil internal low-level v4l2 drivers. 7b2f0648fSHans Verkuil Each ioctl begins with VIDIOC_INT_ to clearly mark that it is an internal 8b2f0648fSHans Verkuil define, 9b2f0648fSHans Verkuil 10b2f0648fSHans Verkuil Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl> 11b2f0648fSHans Verkuil 12b2f0648fSHans Verkuil */ 13b2f0648fSHans Verkuil 14b2f0648fSHans Verkuil #ifndef V4L2_COMMON_H_ 15b2f0648fSHans Verkuil #define V4L2_COMMON_H_ 16b2f0648fSHans Verkuil 17401998faSMauro Carvalho Chehab #include <media/v4l2-dev.h> 18401998faSMauro Carvalho Chehab 1976a59fe7SMauro Carvalho Chehab /* Common printk constructs for v4l-i2c drivers. These macros create a unique 207e8b09eaSHans Verkuil prefix consisting of the driver name, the adapter number and the i2c 217e8b09eaSHans Verkuil address. */ 227e8b09eaSHans Verkuil #define v4l_printk(level, name, adapter, addr, fmt, arg...) \ 237e8b09eaSHans Verkuil printk(level "%s %d-%04x: " fmt, name, i2c_adapter_id(adapter), addr , ## arg) 247e8b09eaSHans Verkuil 257e8b09eaSHans Verkuil #define v4l_client_printk(level, client, fmt, arg...) \ 26f9d32f25SLars-Peter Clausen v4l_printk(level, (client)->dev.driver->name, (client)->adapter, \ 277e8b09eaSHans Verkuil (client)->addr, fmt , ## arg) 287e8b09eaSHans Verkuil 297e8b09eaSHans Verkuil #define v4l_err(client, fmt, arg...) \ 307e8b09eaSHans Verkuil v4l_client_printk(KERN_ERR, client, fmt , ## arg) 317e8b09eaSHans Verkuil 327e8b09eaSHans Verkuil #define v4l_warn(client, fmt, arg...) \ 337e8b09eaSHans Verkuil v4l_client_printk(KERN_WARNING, client, fmt , ## arg) 347e8b09eaSHans Verkuil 357e8b09eaSHans Verkuil #define v4l_info(client, fmt, arg...) \ 367e8b09eaSHans Verkuil v4l_client_printk(KERN_INFO, client, fmt , ## arg) 377e8b09eaSHans Verkuil 387e8b09eaSHans Verkuil /* These three macros assume that the debug level is set with a module 397e8b09eaSHans Verkuil parameter called 'debug'. */ 40f167cb4eSMauro Carvalho Chehab #define v4l_dbg(level, debug, client, fmt, arg...) \ 417e8b09eaSHans Verkuil do { \ 427e8b09eaSHans Verkuil if (debug >= (level)) \ 437e8b09eaSHans Verkuil v4l_client_printk(KERN_DEBUG, client, fmt , ## arg); \ 447e8b09eaSHans Verkuil } while (0) 457e8b09eaSHans Verkuil 46a41231d5SMauro Carvalho Chehab /* Add a version of v4l_dbg to be used on drivers using dev_foo() macros */ 47a41231d5SMauro Carvalho Chehab #define dev_dbg_lvl(__dev, __level, __debug, __fmt, __arg...) \ 48a41231d5SMauro Carvalho Chehab do { \ 49a41231d5SMauro Carvalho Chehab if (__debug >= (__level)) \ 50a41231d5SMauro Carvalho Chehab dev_printk(KERN_DEBUG, __dev, __fmt, ##__arg); \ 51a41231d5SMauro Carvalho Chehab } while (0) 52a41231d5SMauro Carvalho Chehab 537e8b09eaSHans Verkuil /* ------------------------------------------------------------------------- */ 547e8b09eaSHans Verkuil 55dd99120cSHans Verkuil /* These printk constructs can be used with v4l2_device and v4l2_subdev */ 56dd99120cSHans Verkuil #define v4l2_printk(level, dev, fmt, arg...) \ 57dd99120cSHans Verkuil printk(level "%s: " fmt, (dev)->name , ## arg) 58dd99120cSHans Verkuil 59dd99120cSHans Verkuil #define v4l2_err(dev, fmt, arg...) \ 60dd99120cSHans Verkuil v4l2_printk(KERN_ERR, dev, fmt , ## arg) 61dd99120cSHans Verkuil 62dd99120cSHans Verkuil #define v4l2_warn(dev, fmt, arg...) \ 63dd99120cSHans Verkuil v4l2_printk(KERN_WARNING, dev, fmt , ## arg) 64dd99120cSHans Verkuil 65dd99120cSHans Verkuil #define v4l2_info(dev, fmt, arg...) \ 66dd99120cSHans Verkuil v4l2_printk(KERN_INFO, dev, fmt , ## arg) 67dd99120cSHans Verkuil 68dd99120cSHans Verkuil /* These three macros assume that the debug level is set with a module 69dd99120cSHans Verkuil parameter called 'debug'. */ 70dd99120cSHans Verkuil #define v4l2_dbg(level, debug, dev, fmt, arg...) \ 71dd99120cSHans Verkuil do { \ 72dd99120cSHans Verkuil if (debug >= (level)) \ 73dd99120cSHans Verkuil v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \ 74dd99120cSHans Verkuil } while (0) 75dd99120cSHans Verkuil 76b8719158SMauro Carvalho Chehab /** 77b8719158SMauro Carvalho Chehab * v4l2_ctrl_query_fill- Fill in a struct v4l2_queryctrl 78b8719158SMauro Carvalho Chehab * 79b8719158SMauro Carvalho Chehab * @qctrl: pointer to the &struct v4l2_queryctrl to be filled 80b8719158SMauro Carvalho Chehab * @min: minimum value for the control 81b8719158SMauro Carvalho Chehab * @max: maximum value for the control 82b8719158SMauro Carvalho Chehab * @step: control step 83b8719158SMauro Carvalho Chehab * @def: default value for the control 84b8719158SMauro Carvalho Chehab * 85b8719158SMauro Carvalho Chehab * Fills the &struct v4l2_queryctrl fields for the query control. 86b8719158SMauro Carvalho Chehab * 87b8719158SMauro Carvalho Chehab * .. note:: 88b8719158SMauro Carvalho Chehab * 89b8719158SMauro Carvalho Chehab * This function assumes that the @qctrl->id field is filled. 90b8719158SMauro Carvalho Chehab * 91b8719158SMauro Carvalho Chehab * Returns -EINVAL if the control is not known by the V4L2 core, 0 on success. 92b8719158SMauro Carvalho Chehab */ 93dd99120cSHans Verkuil 94b8719158SMauro Carvalho Chehab int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, 95b8719158SMauro Carvalho Chehab s32 min, s32 max, s32 step, s32 def); 969cb2318bSHans Verkuil 979cb2318bSHans Verkuil /* ------------------------------------------------------------------------- */ 989cb2318bSHans Verkuil 9978a3b4dbSHans Verkuil /* I2C Helper functions */ 1008ffbc655SHans Verkuil 1018ffbc655SHans Verkuil struct i2c_driver; 1028ffbc655SHans Verkuil struct i2c_adapter; 1038ffbc655SHans Verkuil struct i2c_client; 104d2653e92SJean Delvare struct i2c_device_id; 105dd99120cSHans Verkuil struct v4l2_device; 106dd99120cSHans Verkuil struct v4l2_subdev; 107dd99120cSHans Verkuil struct v4l2_subdev_ops; 1088ffbc655SHans Verkuil 109a39c57f8SMauro Carvalho Chehab /** 110a39c57f8SMauro Carvalho Chehab * v4l2_i2c_new_subdev - Load an i2c module and return an initialized 111a39c57f8SMauro Carvalho Chehab * &struct v4l2_subdev. 112a39c57f8SMauro Carvalho Chehab * 113a39c57f8SMauro Carvalho Chehab * @v4l2_dev: pointer to &struct v4l2_device 114a39c57f8SMauro Carvalho Chehab * @adapter: pointer to struct i2c_adapter 115a39c57f8SMauro Carvalho Chehab * @client_type: name of the chip that's on the adapter. 116a39c57f8SMauro Carvalho Chehab * @addr: I2C address. If zero, it will use @probe_addrs 117a39c57f8SMauro Carvalho Chehab * @probe_addrs: array with a list of address. The last entry at such 118a39c57f8SMauro Carvalho Chehab * array should be %I2C_CLIENT_END. 119a39c57f8SMauro Carvalho Chehab * 120a39c57f8SMauro Carvalho Chehab * returns a &struct v4l2_subdev pointer. 121a39c57f8SMauro Carvalho Chehab */ 1223c7c9370SHans Verkuil struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev, 1239a1f8b34SLaurent Pinchart struct i2c_adapter *adapter, const char *client_type, 124f0222c7dSHans Verkuil u8 addr, const unsigned short *probe_addrs); 125f0222c7dSHans Verkuil 126f0222c7dSHans Verkuil struct i2c_board_info; 127f0222c7dSHans Verkuil 128a39c57f8SMauro Carvalho Chehab /** 129a39c57f8SMauro Carvalho Chehab * v4l2_i2c_new_subdev_board - Load an i2c module and return an initialized 130a39c57f8SMauro Carvalho Chehab * &struct v4l2_subdev. 131a39c57f8SMauro Carvalho Chehab * 132a39c57f8SMauro Carvalho Chehab * @v4l2_dev: pointer to &struct v4l2_device 133a39c57f8SMauro Carvalho Chehab * @adapter: pointer to struct i2c_adapter 134a39c57f8SMauro Carvalho Chehab * @info: pointer to struct i2c_board_info used to replace the irq, 135a39c57f8SMauro Carvalho Chehab * platform_data and addr arguments. 136a39c57f8SMauro Carvalho Chehab * @probe_addrs: array with a list of address. The last entry at such 137a39c57f8SMauro Carvalho Chehab * array should be %I2C_CLIENT_END. 138a39c57f8SMauro Carvalho Chehab * 139a39c57f8SMauro Carvalho Chehab * returns a &struct v4l2_subdev pointer. 140a39c57f8SMauro Carvalho Chehab */ 141f0222c7dSHans Verkuil struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, 1429a1f8b34SLaurent Pinchart struct i2c_adapter *adapter, struct i2c_board_info *info, 1439a1f8b34SLaurent Pinchart const unsigned short *probe_addrs); 144f0222c7dSHans Verkuil 145a39c57f8SMauro Carvalho Chehab /** 14606582930SSakari Ailus * v4l2_i2c_subdev_set_name - Set name for an I²C sub-device 14706582930SSakari Ailus * 14806582930SSakari Ailus * @sd: pointer to &struct v4l2_subdev 14906582930SSakari Ailus * @client: pointer to struct i2c_client 15006582930SSakari Ailus * @devname: the name of the device; if NULL, the I²C device's name will be used 15106582930SSakari Ailus * @postfix: sub-device specific string to put right after the I²C device name; 15206582930SSakari Ailus * may be NULL 15306582930SSakari Ailus */ 15406582930SSakari Ailus void v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client, 15506582930SSakari Ailus const char *devname, const char *postfix); 15606582930SSakari Ailus 15706582930SSakari Ailus /** 158a39c57f8SMauro Carvalho Chehab * v4l2_i2c_subdev_init - Initializes a &struct v4l2_subdev with data from 159a39c57f8SMauro Carvalho Chehab * an i2c_client struct. 160a39c57f8SMauro Carvalho Chehab * 161a39c57f8SMauro Carvalho Chehab * @sd: pointer to &struct v4l2_subdev 162a39c57f8SMauro Carvalho Chehab * @client: pointer to struct i2c_client 163a39c57f8SMauro Carvalho Chehab * @ops: pointer to &struct v4l2_subdev_ops 164a39c57f8SMauro Carvalho Chehab */ 165dd99120cSHans Verkuil void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, 166dd99120cSHans Verkuil const struct v4l2_subdev_ops *ops); 167a39c57f8SMauro Carvalho Chehab 168a39c57f8SMauro Carvalho Chehab /** 169a39c57f8SMauro Carvalho Chehab * v4l2_i2c_subdev_addr - returns i2c client address of &struct v4l2_subdev. 170a39c57f8SMauro Carvalho Chehab * 171a39c57f8SMauro Carvalho Chehab * @sd: pointer to &struct v4l2_subdev 172a39c57f8SMauro Carvalho Chehab * 173a39c57f8SMauro Carvalho Chehab * Returns the address of an I2C sub-device 174a39c57f8SMauro Carvalho Chehab */ 175ab373190SHans Verkuil unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd); 176dd99120cSHans Verkuil 17776a59fe7SMauro Carvalho Chehab /** 17876a59fe7SMauro Carvalho Chehab * enum v4l2_i2c_tuner_type - specifies the range of tuner address that 17976a59fe7SMauro Carvalho Chehab * should be used when seeking for I2C devices. 18076a59fe7SMauro Carvalho Chehab * 18176a59fe7SMauro Carvalho Chehab * @ADDRS_RADIO: Radio tuner addresses. 18276a59fe7SMauro Carvalho Chehab * Represent the following I2C addresses: 18376a59fe7SMauro Carvalho Chehab * 0x10 (if compiled with tea5761 support) 18476a59fe7SMauro Carvalho Chehab * and 0x60. 18576a59fe7SMauro Carvalho Chehab * @ADDRS_DEMOD: Demod tuner addresses. 18676a59fe7SMauro Carvalho Chehab * Represent the following I2C addresses: 18776a59fe7SMauro Carvalho Chehab * 0x42, 0x43, 0x4a and 0x4b. 18876a59fe7SMauro Carvalho Chehab * @ADDRS_TV: TV tuner addresses. 18976a59fe7SMauro Carvalho Chehab * Represent the following I2C addresses: 19076a59fe7SMauro Carvalho Chehab * 0x42, 0x43, 0x4a, 0x4b, 0x60, 0x61, 0x62, 19176a59fe7SMauro Carvalho Chehab * 0x63 and 0x64. 19276a59fe7SMauro Carvalho Chehab * @ADDRS_TV_WITH_DEMOD: TV tuner addresses if demod is present, this 19376a59fe7SMauro Carvalho Chehab * excludes addresses used by the demodulator 19476a59fe7SMauro Carvalho Chehab * from the list of candidates. 19576a59fe7SMauro Carvalho Chehab * Represent the following I2C addresses: 19676a59fe7SMauro Carvalho Chehab * 0x60, 0x61, 0x62, 0x63 and 0x64. 19776a59fe7SMauro Carvalho Chehab * 19876a59fe7SMauro Carvalho Chehab * NOTE: All I2C addresses above use the 7-bit notation. 19976a59fe7SMauro Carvalho Chehab */ 200c7d29e2fSHans Verkuil enum v4l2_i2c_tuner_type { 20176a59fe7SMauro Carvalho Chehab ADDRS_RADIO, 20276a59fe7SMauro Carvalho Chehab ADDRS_DEMOD, 20376a59fe7SMauro Carvalho Chehab ADDRS_TV, 204c7d29e2fSHans Verkuil ADDRS_TV_WITH_DEMOD, 205c7d29e2fSHans Verkuil }; 20676a59fe7SMauro Carvalho Chehab /** 20776a59fe7SMauro Carvalho Chehab * v4l2_i2c_tuner_addrs - Return a list of I2C tuner addresses to probe. 20876a59fe7SMauro Carvalho Chehab * 20976a59fe7SMauro Carvalho Chehab * @type: type of the tuner to seek, as defined by 21076a59fe7SMauro Carvalho Chehab * &enum v4l2_i2c_tuner_type. 21176a59fe7SMauro Carvalho Chehab * 21276a59fe7SMauro Carvalho Chehab * NOTE: Use only if the tuner addresses are unknown. 21376a59fe7SMauro Carvalho Chehab */ 214c7d29e2fSHans Verkuil const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type); 215c7d29e2fSHans Verkuil 2168ffbc655SHans Verkuil /* ------------------------------------------------------------------------- */ 2178ffbc655SHans Verkuil 21885e09219SDmitri Belimov /* SPI Helper functions */ 21985e09219SDmitri Belimov #if defined(CONFIG_SPI) 22085e09219SDmitri Belimov 22185e09219SDmitri Belimov #include <linux/spi/spi.h> 22285e09219SDmitri Belimov 22385e09219SDmitri Belimov struct spi_device; 22485e09219SDmitri Belimov 225b8719158SMauro Carvalho Chehab /** 226b8719158SMauro Carvalho Chehab * v4l2_spi_new_subdev - Load an spi module and return an initialized 227b8719158SMauro Carvalho Chehab * &struct v4l2_subdev. 228b8719158SMauro Carvalho Chehab * 229b8719158SMauro Carvalho Chehab * 230b8719158SMauro Carvalho Chehab * @v4l2_dev: pointer to &struct v4l2_device. 231b8719158SMauro Carvalho Chehab * @master: pointer to struct spi_master. 232b8719158SMauro Carvalho Chehab * @info: pointer to struct spi_board_info. 233b8719158SMauro Carvalho Chehab * 234b8719158SMauro Carvalho Chehab * returns a &struct v4l2_subdev pointer. 235b8719158SMauro Carvalho Chehab */ 23685e09219SDmitri Belimov struct v4l2_subdev *v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev, 23785e09219SDmitri Belimov struct spi_master *master, struct spi_board_info *info); 23885e09219SDmitri Belimov 239b8719158SMauro Carvalho Chehab /** 240b8719158SMauro Carvalho Chehab * v4l2_spi_subdev_init - Initialize a v4l2_subdev with data from an 241b8719158SMauro Carvalho Chehab * spi_device struct. 242b8719158SMauro Carvalho Chehab * 243b8719158SMauro Carvalho Chehab * @sd: pointer to &struct v4l2_subdev 244b8719158SMauro Carvalho Chehab * @spi: pointer to struct spi_device. 245b8719158SMauro Carvalho Chehab * @ops: pointer to &struct v4l2_subdev_ops 246b8719158SMauro Carvalho Chehab */ 24785e09219SDmitri Belimov void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi, 24885e09219SDmitri Belimov const struct v4l2_subdev_ops *ops); 24985e09219SDmitri Belimov #endif 25085e09219SDmitri Belimov 25185e09219SDmitri Belimov /* ------------------------------------------------------------------------- */ 25285e09219SDmitri Belimov 25301154ef5SMauro Carvalho Chehab /* 25401154ef5SMauro Carvalho Chehab * FIXME: these remaining ioctls/structs should be removed as well, but they 25501154ef5SMauro Carvalho Chehab * are still used in tuner-simple.c (TUNER_SET_CONFIG) and cx18/ivtv (RESET). 25601154ef5SMauro Carvalho Chehab * To remove these ioctls some more cleanup is needed in those modules. 25776a59fe7SMauro Carvalho Chehab * 25876a59fe7SMauro Carvalho Chehab * It doesn't make much sense on documenting them, as what we really want is 25976a59fe7SMauro Carvalho Chehab * to get rid of them. 26001154ef5SMauro Carvalho Chehab */ 2617e8b09eaSHans Verkuil 26278a3b4dbSHans Verkuil /* s_config */ 2637f171123SMauro Carvalho Chehab struct v4l2_priv_tun_config { 2647f171123SMauro Carvalho Chehab int tuner; 2657f171123SMauro Carvalho Chehab void *priv; 2667f171123SMauro Carvalho Chehab }; 2677f171123SMauro Carvalho Chehab #define TUNER_SET_CONFIG _IOW('d', 92, struct v4l2_priv_tun_config) 2685e453dc7SMichael Krufky 2696c31e598SHans Verkuil #define VIDIOC_INT_RESET _IOW ('d', 102, u32) 2706c31e598SHans Verkuil 271b0d3159bSTrent Piepho /* ------------------------------------------------------------------------- */ 272b0d3159bSTrent Piepho 273b0d3159bSTrent Piepho /* Miscellaneous helper functions */ 274b0d3159bSTrent Piepho 27576a59fe7SMauro Carvalho Chehab /** 27676a59fe7SMauro Carvalho Chehab * v4l_bound_align_image - adjust video dimensions according to 27776a59fe7SMauro Carvalho Chehab * a given constraints. 27876a59fe7SMauro Carvalho Chehab * 27976a59fe7SMauro Carvalho Chehab * @width: pointer to width that will be adjusted if needed. 28076a59fe7SMauro Carvalho Chehab * @wmin: minimum width. 28176a59fe7SMauro Carvalho Chehab * @wmax: maximum width. 28276a59fe7SMauro Carvalho Chehab * @walign: least significant bit on width. 28376a59fe7SMauro Carvalho Chehab * @height: pointer to height that will be adjusted if needed. 28476a59fe7SMauro Carvalho Chehab * @hmin: minimum height. 28576a59fe7SMauro Carvalho Chehab * @hmax: maximum height. 286ae5a8ca8SNiklas Söderlund * @halign: least significant bit on height. 28776a59fe7SMauro Carvalho Chehab * @salign: least significant bit for the image size (e. g. 28876a59fe7SMauro Carvalho Chehab * :math:`width * height`). 28976a59fe7SMauro Carvalho Chehab * 29076a59fe7SMauro Carvalho Chehab * Clip an image to have @width between @wmin and @wmax, and @height between 29176a59fe7SMauro Carvalho Chehab * @hmin and @hmax, inclusive. 29276a59fe7SMauro Carvalho Chehab * 29376a59fe7SMauro Carvalho Chehab * Additionally, the @width will be a multiple of :math:`2^{walign}`, 29476a59fe7SMauro Carvalho Chehab * the @height will be a multiple of :math:`2^{halign}`, and the overall 29576a59fe7SMauro Carvalho Chehab * size :math:`width * height` will be a multiple of :math:`2^{salign}`. 29676a59fe7SMauro Carvalho Chehab * 29776a59fe7SMauro Carvalho Chehab * .. note:: 29876a59fe7SMauro Carvalho Chehab * 29976a59fe7SMauro Carvalho Chehab * #. The clipping rectangle may be shrunk or enlarged to fit the alignment 30076a59fe7SMauro Carvalho Chehab * constraints. 30176a59fe7SMauro Carvalho Chehab * #. @wmax must not be smaller than @wmin. 30276a59fe7SMauro Carvalho Chehab * #. @hmax must not be smaller than @hmin. 30376a59fe7SMauro Carvalho Chehab * #. The alignments must not be so high there are no possible image 30476a59fe7SMauro Carvalho Chehab * sizes within the allowed bounds. 30576a59fe7SMauro Carvalho Chehab * #. @wmin and @hmin must be at least 1 (don't use 0). 30676a59fe7SMauro Carvalho Chehab * #. For @walign, @halign and @salign, if you don't care about a certain 30776a59fe7SMauro Carvalho Chehab * alignment, specify ``0``, as :math:`2^0 = 1` and one byte alignment 30876a59fe7SMauro Carvalho Chehab * is equivalent to no alignment. 30976a59fe7SMauro Carvalho Chehab * #. If you only want to adjust downward, specify a maximum that's the 31076a59fe7SMauro Carvalho Chehab * same as the initial value. 31176a59fe7SMauro Carvalho Chehab */ 31276a59fe7SMauro Carvalho Chehab void v4l_bound_align_image(unsigned int *width, unsigned int wmin, 313b0d3159bSTrent Piepho unsigned int wmax, unsigned int walign, 31476a59fe7SMauro Carvalho Chehab unsigned int *height, unsigned int hmin, 315b0d3159bSTrent Piepho unsigned int hmax, unsigned int halign, 316b0d3159bSTrent Piepho unsigned int salign); 3173fd8e647SHans Verkuil 31876a59fe7SMauro Carvalho Chehab /** 31995ce9c28SSakari Ailus * v4l2_find_nearest_size - Find the nearest size among a discrete 32095ce9c28SSakari Ailus * set of resolutions contained in an array of a driver specific struct. 32195ce9c28SSakari Ailus * 32295ce9c28SSakari Ailus * @array: a driver specific array of image sizes 323d2dc57b1SSakari Ailus * @array_size: the length of the driver specific array of image sizes 32495ce9c28SSakari Ailus * @width_field: the name of the width field in the driver specific struct 32595ce9c28SSakari Ailus * @height_field: the name of the height field in the driver specific struct 32695ce9c28SSakari Ailus * @width: desired width. 32795ce9c28SSakari Ailus * @height: desired height. 32895ce9c28SSakari Ailus * 32995ce9c28SSakari Ailus * Finds the closest resolution to minimize the width and height differences 33095ce9c28SSakari Ailus * between what requested and the supported resolutions. The size of the width 33195ce9c28SSakari Ailus * and height fields in the driver specific must equal to that of u32, i.e. four 33295ce9c28SSakari Ailus * bytes. 33395ce9c28SSakari Ailus * 33495ce9c28SSakari Ailus * Returns the best match or NULL if the length of the array is zero. 33595ce9c28SSakari Ailus */ 336d2dc57b1SSakari Ailus #define v4l2_find_nearest_size(array, array_size, width_field, height_field, \ 33795ce9c28SSakari Ailus width, height) \ 33895ce9c28SSakari Ailus ({ \ 33995ce9c28SSakari Ailus BUILD_BUG_ON(sizeof((array)->width_field) != sizeof(u32) || \ 34095ce9c28SSakari Ailus sizeof((array)->height_field) != sizeof(u32)); \ 3412bbc46e8SSakari Ailus (typeof(&(array)[0]))__v4l2_find_nearest_size( \ 342d2dc57b1SSakari Ailus (array), array_size, sizeof(*(array)), \ 34395ce9c28SSakari Ailus offsetof(typeof(*(array)), width_field), \ 34495ce9c28SSakari Ailus offsetof(typeof(*(array)), height_field), \ 34595ce9c28SSakari Ailus width, height); \ 34695ce9c28SSakari Ailus }) 34795ce9c28SSakari Ailus const void * 34895ce9c28SSakari Ailus __v4l2_find_nearest_size(const void *array, size_t array_size, 34995ce9c28SSakari Ailus size_t entry_size, size_t width_offset, 35095ce9c28SSakari Ailus size_t height_offset, s32 width, s32 height); 35195ce9c28SSakari Ailus 35295ce9c28SSakari Ailus /** 353672de9a7SHans Verkuil * v4l2_g_parm_cap - helper routine for vidioc_g_parm to fill this in by 354672de9a7SHans Verkuil * calling the g_frame_interval op of the given subdev. It only works 355672de9a7SHans Verkuil * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the 356672de9a7SHans Verkuil * function name. 357672de9a7SHans Verkuil * 358672de9a7SHans Verkuil * @vdev: the struct video_device pointer. Used to determine the device caps. 359672de9a7SHans Verkuil * @sd: the sub-device pointer. 360672de9a7SHans Verkuil * @a: the VIDIOC_G_PARM argument. 361672de9a7SHans Verkuil */ 362672de9a7SHans Verkuil int v4l2_g_parm_cap(struct video_device *vdev, 363672de9a7SHans Verkuil struct v4l2_subdev *sd, struct v4l2_streamparm *a); 364672de9a7SHans Verkuil 365672de9a7SHans Verkuil /** 366672de9a7SHans Verkuil * v4l2_s_parm_cap - helper routine for vidioc_s_parm to fill this in by 367672de9a7SHans Verkuil * calling the s_frame_interval op of the given subdev. It only works 368672de9a7SHans Verkuil * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the 369672de9a7SHans Verkuil * function name. 370672de9a7SHans Verkuil * 371672de9a7SHans Verkuil * @vdev: the struct video_device pointer. Used to determine the device caps. 372672de9a7SHans Verkuil * @sd: the sub-device pointer. 373672de9a7SHans Verkuil * @a: the VIDIOC_S_PARM argument. 374672de9a7SHans Verkuil */ 375672de9a7SHans Verkuil int v4l2_s_parm_cap(struct video_device *vdev, 376672de9a7SHans Verkuil struct v4l2_subdev *sd, struct v4l2_streamparm *a); 377672de9a7SHans Verkuil 37885de5e06SAkinobu Mita /* Compare two v4l2_fract structs */ 37985de5e06SAkinobu Mita #define V4L2_FRACT_COMPARE(a, OP, b) \ 38085de5e06SAkinobu Mita ((u64)(a).numerator * (b).denominator OP \ 38185de5e06SAkinobu Mita (u64)(b).numerator * (a).denominator) 38285de5e06SAkinobu Mita 383f44b969aSEzequiel Garcia /* ------------------------------------------------------------------------- */ 384f44b969aSEzequiel Garcia 385f44b969aSEzequiel Garcia /* Pixel format and FourCC helpers */ 386f44b969aSEzequiel Garcia 387f44b969aSEzequiel Garcia /** 388f44b969aSEzequiel Garcia * struct v4l2_format_info - information about a V4L2 format 389f44b969aSEzequiel Garcia * @format: 4CC format identifier (V4L2_PIX_FMT_*) 390f44b969aSEzequiel Garcia * @mem_planes: Number of memory planes, which includes the alpha plane (1 to 4). 391f44b969aSEzequiel Garcia * @comp_planes: Number of component planes, which includes the alpha plane (1 to 4). 392f44b969aSEzequiel Garcia * @bpp: Array of per-plane bytes per pixel 393f44b969aSEzequiel Garcia * @hdiv: Horizontal chroma subsampling factor 394f44b969aSEzequiel Garcia * @vdiv: Vertical chroma subsampling factor 395f44b969aSEzequiel Garcia * @block_w: Per-plane macroblock pixel width (optional) 396f44b969aSEzequiel Garcia * @block_h: Per-plane macroblock pixel height (optional) 397f44b969aSEzequiel Garcia */ 398f44b969aSEzequiel Garcia struct v4l2_format_info { 399f44b969aSEzequiel Garcia u32 format; 400f44b969aSEzequiel Garcia u8 mem_planes; 401f44b969aSEzequiel Garcia u8 comp_planes; 402f44b969aSEzequiel Garcia u8 bpp[4]; 403f44b969aSEzequiel Garcia u8 hdiv; 404f44b969aSEzequiel Garcia u8 vdiv; 405f44b969aSEzequiel Garcia u8 block_w[4]; 406f44b969aSEzequiel Garcia u8 block_h[4]; 407f44b969aSEzequiel Garcia }; 408f44b969aSEzequiel Garcia 409f44b969aSEzequiel Garcia const struct v4l2_format_info *v4l2_format_info(u32 format); 410f44b969aSEzequiel Garcia 411f44b969aSEzequiel Garcia int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, int pixelformat, 412f44b969aSEzequiel Garcia int width, int height); 413f44b969aSEzequiel Garcia int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, int pixelformat, 414f44b969aSEzequiel Garcia int width, int height); 415f44b969aSEzequiel Garcia 416b2f0648fSHans Verkuil #endif /* V4L2_COMMON_H_ */ 417