162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci v4l2 common internal API header 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci This header contains internal shared ioctl definitions for use by the 662306a36Sopenharmony_ci internal low-level v4l2 drivers. 762306a36Sopenharmony_ci Each ioctl begins with VIDIOC_INT_ to clearly mark that it is an internal 862306a36Sopenharmony_ci define, 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#ifndef V4L2_COMMON_H_ 1562306a36Sopenharmony_ci#define V4L2_COMMON_H_ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <linux/time.h> 1862306a36Sopenharmony_ci#include <media/v4l2-dev.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* Common printk constructs for v4l-i2c drivers. These macros create a unique 2162306a36Sopenharmony_ci prefix consisting of the driver name, the adapter number and the i2c 2262306a36Sopenharmony_ci address. */ 2362306a36Sopenharmony_ci#define v4l_printk(level, name, adapter, addr, fmt, arg...) \ 2462306a36Sopenharmony_ci printk(level "%s %d-%04x: " fmt, name, i2c_adapter_id(adapter), addr , ## arg) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define v4l_client_printk(level, client, fmt, arg...) \ 2762306a36Sopenharmony_ci v4l_printk(level, (client)->dev.driver->name, (client)->adapter, \ 2862306a36Sopenharmony_ci (client)->addr, fmt , ## arg) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define v4l_err(client, fmt, arg...) \ 3162306a36Sopenharmony_ci v4l_client_printk(KERN_ERR, client, fmt , ## arg) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define v4l_warn(client, fmt, arg...) \ 3462306a36Sopenharmony_ci v4l_client_printk(KERN_WARNING, client, fmt , ## arg) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define v4l_info(client, fmt, arg...) \ 3762306a36Sopenharmony_ci v4l_client_printk(KERN_INFO, client, fmt , ## arg) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* These three macros assume that the debug level is set with a module 4062306a36Sopenharmony_ci parameter called 'debug'. */ 4162306a36Sopenharmony_ci#define v4l_dbg(level, debug, client, fmt, arg...) \ 4262306a36Sopenharmony_ci do { \ 4362306a36Sopenharmony_ci if (debug >= (level)) \ 4462306a36Sopenharmony_ci v4l_client_printk(KERN_DEBUG, client, fmt , ## arg); \ 4562306a36Sopenharmony_ci } while (0) 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* Add a version of v4l_dbg to be used on drivers using dev_foo() macros */ 4862306a36Sopenharmony_ci#define dev_dbg_lvl(__dev, __level, __debug, __fmt, __arg...) \ 4962306a36Sopenharmony_ci do { \ 5062306a36Sopenharmony_ci if (__debug >= (__level)) \ 5162306a36Sopenharmony_ci dev_printk(KERN_DEBUG, __dev, __fmt, ##__arg); \ 5262306a36Sopenharmony_ci } while (0) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* These printk constructs can be used with v4l2_device and v4l2_subdev */ 5762306a36Sopenharmony_ci#define v4l2_printk(level, dev, fmt, arg...) \ 5862306a36Sopenharmony_ci printk(level "%s: " fmt, (dev)->name , ## arg) 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define v4l2_err(dev, fmt, arg...) \ 6162306a36Sopenharmony_ci v4l2_printk(KERN_ERR, dev, fmt , ## arg) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define v4l2_warn(dev, fmt, arg...) \ 6462306a36Sopenharmony_ci v4l2_printk(KERN_WARNING, dev, fmt , ## arg) 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define v4l2_info(dev, fmt, arg...) \ 6762306a36Sopenharmony_ci v4l2_printk(KERN_INFO, dev, fmt , ## arg) 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* These three macros assume that the debug level is set with a module 7062306a36Sopenharmony_ci parameter called 'debug'. */ 7162306a36Sopenharmony_ci#define v4l2_dbg(level, debug, dev, fmt, arg...) \ 7262306a36Sopenharmony_ci do { \ 7362306a36Sopenharmony_ci if (debug >= (level)) \ 7462306a36Sopenharmony_ci v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \ 7562306a36Sopenharmony_ci } while (0) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/** 7862306a36Sopenharmony_ci * v4l2_ctrl_query_fill- Fill in a struct v4l2_queryctrl 7962306a36Sopenharmony_ci * 8062306a36Sopenharmony_ci * @qctrl: pointer to the &struct v4l2_queryctrl to be filled 8162306a36Sopenharmony_ci * @min: minimum value for the control 8262306a36Sopenharmony_ci * @max: maximum value for the control 8362306a36Sopenharmony_ci * @step: control step 8462306a36Sopenharmony_ci * @def: default value for the control 8562306a36Sopenharmony_ci * 8662306a36Sopenharmony_ci * Fills the &struct v4l2_queryctrl fields for the query control. 8762306a36Sopenharmony_ci * 8862306a36Sopenharmony_ci * .. note:: 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci * This function assumes that the @qctrl->id field is filled. 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci * Returns -EINVAL if the control is not known by the V4L2 core, 0 on success. 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciint v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, 9662306a36Sopenharmony_ci s32 min, s32 max, s32 step, s32 def); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */ 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistruct v4l2_device; 10162306a36Sopenharmony_cistruct v4l2_subdev; 10262306a36Sopenharmony_cistruct v4l2_subdev_ops; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci/* I2C Helper functions */ 10562306a36Sopenharmony_ci#include <linux/i2c.h> 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/** 10862306a36Sopenharmony_ci * enum v4l2_i2c_tuner_type - specifies the range of tuner address that 10962306a36Sopenharmony_ci * should be used when seeking for I2C devices. 11062306a36Sopenharmony_ci * 11162306a36Sopenharmony_ci * @ADDRS_RADIO: Radio tuner addresses. 11262306a36Sopenharmony_ci * Represent the following I2C addresses: 11362306a36Sopenharmony_ci * 0x10 (if compiled with tea5761 support) 11462306a36Sopenharmony_ci * and 0x60. 11562306a36Sopenharmony_ci * @ADDRS_DEMOD: Demod tuner addresses. 11662306a36Sopenharmony_ci * Represent the following I2C addresses: 11762306a36Sopenharmony_ci * 0x42, 0x43, 0x4a and 0x4b. 11862306a36Sopenharmony_ci * @ADDRS_TV: TV tuner addresses. 11962306a36Sopenharmony_ci * Represent the following I2C addresses: 12062306a36Sopenharmony_ci * 0x42, 0x43, 0x4a, 0x4b, 0x60, 0x61, 0x62, 12162306a36Sopenharmony_ci * 0x63 and 0x64. 12262306a36Sopenharmony_ci * @ADDRS_TV_WITH_DEMOD: TV tuner addresses if demod is present, this 12362306a36Sopenharmony_ci * excludes addresses used by the demodulator 12462306a36Sopenharmony_ci * from the list of candidates. 12562306a36Sopenharmony_ci * Represent the following I2C addresses: 12662306a36Sopenharmony_ci * 0x60, 0x61, 0x62, 0x63 and 0x64. 12762306a36Sopenharmony_ci * 12862306a36Sopenharmony_ci * NOTE: All I2C addresses above use the 7-bit notation. 12962306a36Sopenharmony_ci */ 13062306a36Sopenharmony_cienum v4l2_i2c_tuner_type { 13162306a36Sopenharmony_ci ADDRS_RADIO, 13262306a36Sopenharmony_ci ADDRS_DEMOD, 13362306a36Sopenharmony_ci ADDRS_TV, 13462306a36Sopenharmony_ci ADDRS_TV_WITH_DEMOD, 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#if defined(CONFIG_VIDEO_V4L2_I2C) 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/** 14062306a36Sopenharmony_ci * v4l2_i2c_new_subdev - Load an i2c module and return an initialized 14162306a36Sopenharmony_ci * &struct v4l2_subdev. 14262306a36Sopenharmony_ci * 14362306a36Sopenharmony_ci * @v4l2_dev: pointer to &struct v4l2_device 14462306a36Sopenharmony_ci * @adapter: pointer to struct i2c_adapter 14562306a36Sopenharmony_ci * @client_type: name of the chip that's on the adapter. 14662306a36Sopenharmony_ci * @addr: I2C address. If zero, it will use @probe_addrs 14762306a36Sopenharmony_ci * @probe_addrs: array with a list of address. The last entry at such 14862306a36Sopenharmony_ci * array should be %I2C_CLIENT_END. 14962306a36Sopenharmony_ci * 15062306a36Sopenharmony_ci * returns a &struct v4l2_subdev pointer. 15162306a36Sopenharmony_ci */ 15262306a36Sopenharmony_cistruct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev, 15362306a36Sopenharmony_ci struct i2c_adapter *adapter, const char *client_type, 15462306a36Sopenharmony_ci u8 addr, const unsigned short *probe_addrs); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci/** 15762306a36Sopenharmony_ci * v4l2_i2c_new_subdev_board - Load an i2c module and return an initialized 15862306a36Sopenharmony_ci * &struct v4l2_subdev. 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * @v4l2_dev: pointer to &struct v4l2_device 16162306a36Sopenharmony_ci * @adapter: pointer to struct i2c_adapter 16262306a36Sopenharmony_ci * @info: pointer to struct i2c_board_info used to replace the irq, 16362306a36Sopenharmony_ci * platform_data and addr arguments. 16462306a36Sopenharmony_ci * @probe_addrs: array with a list of address. The last entry at such 16562306a36Sopenharmony_ci * array should be %I2C_CLIENT_END. 16662306a36Sopenharmony_ci * 16762306a36Sopenharmony_ci * returns a &struct v4l2_subdev pointer. 16862306a36Sopenharmony_ci */ 16962306a36Sopenharmony_cistruct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, 17062306a36Sopenharmony_ci struct i2c_adapter *adapter, struct i2c_board_info *info, 17162306a36Sopenharmony_ci const unsigned short *probe_addrs); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/** 17462306a36Sopenharmony_ci * v4l2_i2c_subdev_set_name - Set name for an I²C sub-device 17562306a36Sopenharmony_ci * 17662306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev 17762306a36Sopenharmony_ci * @client: pointer to struct i2c_client 17862306a36Sopenharmony_ci * @devname: the name of the device; if NULL, the I²C device drivers's name 17962306a36Sopenharmony_ci * will be used 18062306a36Sopenharmony_ci * @postfix: sub-device specific string to put right after the I²C device name; 18162306a36Sopenharmony_ci * may be NULL 18262306a36Sopenharmony_ci */ 18362306a36Sopenharmony_civoid v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client, 18462306a36Sopenharmony_ci const char *devname, const char *postfix); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/** 18762306a36Sopenharmony_ci * v4l2_i2c_subdev_init - Initializes a &struct v4l2_subdev with data from 18862306a36Sopenharmony_ci * an i2c_client struct. 18962306a36Sopenharmony_ci * 19062306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev 19162306a36Sopenharmony_ci * @client: pointer to struct i2c_client 19262306a36Sopenharmony_ci * @ops: pointer to &struct v4l2_subdev_ops 19362306a36Sopenharmony_ci */ 19462306a36Sopenharmony_civoid v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, 19562306a36Sopenharmony_ci const struct v4l2_subdev_ops *ops); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci/** 19862306a36Sopenharmony_ci * v4l2_i2c_subdev_addr - returns i2c client address of &struct v4l2_subdev. 19962306a36Sopenharmony_ci * 20062306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev 20162306a36Sopenharmony_ci * 20262306a36Sopenharmony_ci * Returns the address of an I2C sub-device 20362306a36Sopenharmony_ci */ 20462306a36Sopenharmony_ciunsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/** 20762306a36Sopenharmony_ci * v4l2_i2c_tuner_addrs - Return a list of I2C tuner addresses to probe. 20862306a36Sopenharmony_ci * 20962306a36Sopenharmony_ci * @type: type of the tuner to seek, as defined by 21062306a36Sopenharmony_ci * &enum v4l2_i2c_tuner_type. 21162306a36Sopenharmony_ci * 21262306a36Sopenharmony_ci * NOTE: Use only if the tuner addresses are unknown. 21362306a36Sopenharmony_ci */ 21462306a36Sopenharmony_ciconst unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci/** 21762306a36Sopenharmony_ci * v4l2_i2c_subdev_unregister - Unregister a v4l2_subdev 21862306a36Sopenharmony_ci * 21962306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev 22062306a36Sopenharmony_ci */ 22162306a36Sopenharmony_civoid v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd); 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci#else 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic inline struct v4l2_subdev * 22662306a36Sopenharmony_civ4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev, 22762306a36Sopenharmony_ci struct i2c_adapter *adapter, const char *client_type, 22862306a36Sopenharmony_ci u8 addr, const unsigned short *probe_addrs) 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci return NULL; 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic inline struct v4l2_subdev * 23462306a36Sopenharmony_civ4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev, 23562306a36Sopenharmony_ci struct i2c_adapter *adapter, struct i2c_board_info *info, 23662306a36Sopenharmony_ci const unsigned short *probe_addrs) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci return NULL; 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic inline void 24262306a36Sopenharmony_civ4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client, 24362306a36Sopenharmony_ci const char *devname, const char *postfix) 24462306a36Sopenharmony_ci{} 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistatic inline void 24762306a36Sopenharmony_civ4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, 24862306a36Sopenharmony_ci const struct v4l2_subdev_ops *ops) 24962306a36Sopenharmony_ci{} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic inline unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci return I2C_CLIENT_END; 25462306a36Sopenharmony_ci} 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_cistatic inline const unsigned short * 25762306a36Sopenharmony_civ4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type) 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci return NULL; 26062306a36Sopenharmony_ci} 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_cistatic inline void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd) 26362306a36Sopenharmony_ci{} 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci#endif 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */ 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci/* SPI Helper functions */ 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci#include <linux/spi/spi.h> 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci#if defined(CONFIG_SPI) 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci/** 27662306a36Sopenharmony_ci * v4l2_spi_new_subdev - Load an spi module and return an initialized 27762306a36Sopenharmony_ci * &struct v4l2_subdev. 27862306a36Sopenharmony_ci * 27962306a36Sopenharmony_ci * 28062306a36Sopenharmony_ci * @v4l2_dev: pointer to &struct v4l2_device. 28162306a36Sopenharmony_ci * @master: pointer to struct spi_master. 28262306a36Sopenharmony_ci * @info: pointer to struct spi_board_info. 28362306a36Sopenharmony_ci * 28462306a36Sopenharmony_ci * returns a &struct v4l2_subdev pointer. 28562306a36Sopenharmony_ci */ 28662306a36Sopenharmony_cistruct v4l2_subdev *v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev, 28762306a36Sopenharmony_ci struct spi_master *master, struct spi_board_info *info); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci/** 29062306a36Sopenharmony_ci * v4l2_spi_subdev_init - Initialize a v4l2_subdev with data from an 29162306a36Sopenharmony_ci * spi_device struct. 29262306a36Sopenharmony_ci * 29362306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev 29462306a36Sopenharmony_ci * @spi: pointer to struct spi_device. 29562306a36Sopenharmony_ci * @ops: pointer to &struct v4l2_subdev_ops 29662306a36Sopenharmony_ci */ 29762306a36Sopenharmony_civoid v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi, 29862306a36Sopenharmony_ci const struct v4l2_subdev_ops *ops); 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/** 30162306a36Sopenharmony_ci * v4l2_spi_subdev_unregister - Unregister a v4l2_subdev 30262306a36Sopenharmony_ci * 30362306a36Sopenharmony_ci * @sd: pointer to &struct v4l2_subdev 30462306a36Sopenharmony_ci */ 30562306a36Sopenharmony_civoid v4l2_spi_subdev_unregister(struct v4l2_subdev *sd); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci#else 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic inline struct v4l2_subdev * 31062306a36Sopenharmony_civ4l2_spi_new_subdev(struct v4l2_device *v4l2_dev, 31162306a36Sopenharmony_ci struct spi_master *master, struct spi_board_info *info) 31262306a36Sopenharmony_ci{ 31362306a36Sopenharmony_ci return NULL; 31462306a36Sopenharmony_ci} 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_cistatic inline void 31762306a36Sopenharmony_civ4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi, 31862306a36Sopenharmony_ci const struct v4l2_subdev_ops *ops) 31962306a36Sopenharmony_ci{} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic inline void v4l2_spi_subdev_unregister(struct v4l2_subdev *sd) 32262306a36Sopenharmony_ci{} 32362306a36Sopenharmony_ci#endif 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */ 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci/* 32862306a36Sopenharmony_ci * FIXME: these remaining ioctls/structs should be removed as well, but they 32962306a36Sopenharmony_ci * are still used in tuner-simple.c (TUNER_SET_CONFIG) and cx18/ivtv (RESET). 33062306a36Sopenharmony_ci * To remove these ioctls some more cleanup is needed in those modules. 33162306a36Sopenharmony_ci * 33262306a36Sopenharmony_ci * It doesn't make much sense on documenting them, as what we really want is 33362306a36Sopenharmony_ci * to get rid of them. 33462306a36Sopenharmony_ci */ 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci/* s_config */ 33762306a36Sopenharmony_cistruct v4l2_priv_tun_config { 33862306a36Sopenharmony_ci int tuner; 33962306a36Sopenharmony_ci void *priv; 34062306a36Sopenharmony_ci}; 34162306a36Sopenharmony_ci#define TUNER_SET_CONFIG _IOW('d', 92, struct v4l2_priv_tun_config) 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci#define VIDIOC_INT_RESET _IOW ('d', 102, u32) 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */ 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci/* Miscellaneous helper functions */ 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/** 35062306a36Sopenharmony_ci * v4l_bound_align_image - adjust video dimensions according to 35162306a36Sopenharmony_ci * a given constraints. 35262306a36Sopenharmony_ci * 35362306a36Sopenharmony_ci * @width: pointer to width that will be adjusted if needed. 35462306a36Sopenharmony_ci * @wmin: minimum width. 35562306a36Sopenharmony_ci * @wmax: maximum width. 35662306a36Sopenharmony_ci * @walign: least significant bit on width. 35762306a36Sopenharmony_ci * @height: pointer to height that will be adjusted if needed. 35862306a36Sopenharmony_ci * @hmin: minimum height. 35962306a36Sopenharmony_ci * @hmax: maximum height. 36062306a36Sopenharmony_ci * @halign: least significant bit on height. 36162306a36Sopenharmony_ci * @salign: least significant bit for the image size (e. g. 36262306a36Sopenharmony_ci * :math:`width * height`). 36362306a36Sopenharmony_ci * 36462306a36Sopenharmony_ci * Clip an image to have @width between @wmin and @wmax, and @height between 36562306a36Sopenharmony_ci * @hmin and @hmax, inclusive. 36662306a36Sopenharmony_ci * 36762306a36Sopenharmony_ci * Additionally, the @width will be a multiple of :math:`2^{walign}`, 36862306a36Sopenharmony_ci * the @height will be a multiple of :math:`2^{halign}`, and the overall 36962306a36Sopenharmony_ci * size :math:`width * height` will be a multiple of :math:`2^{salign}`. 37062306a36Sopenharmony_ci * 37162306a36Sopenharmony_ci * .. note:: 37262306a36Sopenharmony_ci * 37362306a36Sopenharmony_ci * #. The clipping rectangle may be shrunk or enlarged to fit the alignment 37462306a36Sopenharmony_ci * constraints. 37562306a36Sopenharmony_ci * #. @wmax must not be smaller than @wmin. 37662306a36Sopenharmony_ci * #. @hmax must not be smaller than @hmin. 37762306a36Sopenharmony_ci * #. The alignments must not be so high there are no possible image 37862306a36Sopenharmony_ci * sizes within the allowed bounds. 37962306a36Sopenharmony_ci * #. @wmin and @hmin must be at least 1 (don't use 0). 38062306a36Sopenharmony_ci * #. For @walign, @halign and @salign, if you don't care about a certain 38162306a36Sopenharmony_ci * alignment, specify ``0``, as :math:`2^0 = 1` and one byte alignment 38262306a36Sopenharmony_ci * is equivalent to no alignment. 38362306a36Sopenharmony_ci * #. If you only want to adjust downward, specify a maximum that's the 38462306a36Sopenharmony_ci * same as the initial value. 38562306a36Sopenharmony_ci */ 38662306a36Sopenharmony_civoid v4l_bound_align_image(unsigned int *width, unsigned int wmin, 38762306a36Sopenharmony_ci unsigned int wmax, unsigned int walign, 38862306a36Sopenharmony_ci unsigned int *height, unsigned int hmin, 38962306a36Sopenharmony_ci unsigned int hmax, unsigned int halign, 39062306a36Sopenharmony_ci unsigned int salign); 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci/** 39362306a36Sopenharmony_ci * v4l2_find_nearest_size - Find the nearest size among a discrete 39462306a36Sopenharmony_ci * set of resolutions contained in an array of a driver specific struct. 39562306a36Sopenharmony_ci * 39662306a36Sopenharmony_ci * @array: a driver specific array of image sizes 39762306a36Sopenharmony_ci * @array_size: the length of the driver specific array of image sizes 39862306a36Sopenharmony_ci * @width_field: the name of the width field in the driver specific struct 39962306a36Sopenharmony_ci * @height_field: the name of the height field in the driver specific struct 40062306a36Sopenharmony_ci * @width: desired width. 40162306a36Sopenharmony_ci * @height: desired height. 40262306a36Sopenharmony_ci * 40362306a36Sopenharmony_ci * Finds the closest resolution to minimize the width and height differences 40462306a36Sopenharmony_ci * between what requested and the supported resolutions. The size of the width 40562306a36Sopenharmony_ci * and height fields in the driver specific must equal to that of u32, i.e. four 40662306a36Sopenharmony_ci * bytes. 40762306a36Sopenharmony_ci * 40862306a36Sopenharmony_ci * Returns the best match or NULL if the length of the array is zero. 40962306a36Sopenharmony_ci */ 41062306a36Sopenharmony_ci#define v4l2_find_nearest_size(array, array_size, width_field, height_field, \ 41162306a36Sopenharmony_ci width, height) \ 41262306a36Sopenharmony_ci ({ \ 41362306a36Sopenharmony_ci BUILD_BUG_ON(sizeof((array)->width_field) != sizeof(u32) || \ 41462306a36Sopenharmony_ci sizeof((array)->height_field) != sizeof(u32)); \ 41562306a36Sopenharmony_ci (typeof(&(array)[0]))__v4l2_find_nearest_size( \ 41662306a36Sopenharmony_ci (array), array_size, sizeof(*(array)), \ 41762306a36Sopenharmony_ci offsetof(typeof(*(array)), width_field), \ 41862306a36Sopenharmony_ci offsetof(typeof(*(array)), height_field), \ 41962306a36Sopenharmony_ci width, height); \ 42062306a36Sopenharmony_ci }) 42162306a36Sopenharmony_ciconst void * 42262306a36Sopenharmony_ci__v4l2_find_nearest_size(const void *array, size_t array_size, 42362306a36Sopenharmony_ci size_t entry_size, size_t width_offset, 42462306a36Sopenharmony_ci size_t height_offset, s32 width, s32 height); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci/** 42762306a36Sopenharmony_ci * v4l2_g_parm_cap - helper routine for vidioc_g_parm to fill this in by 42862306a36Sopenharmony_ci * calling the g_frame_interval op of the given subdev. It only works 42962306a36Sopenharmony_ci * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the 43062306a36Sopenharmony_ci * function name. 43162306a36Sopenharmony_ci * 43262306a36Sopenharmony_ci * @vdev: the struct video_device pointer. Used to determine the device caps. 43362306a36Sopenharmony_ci * @sd: the sub-device pointer. 43462306a36Sopenharmony_ci * @a: the VIDIOC_G_PARM argument. 43562306a36Sopenharmony_ci */ 43662306a36Sopenharmony_ciint v4l2_g_parm_cap(struct video_device *vdev, 43762306a36Sopenharmony_ci struct v4l2_subdev *sd, struct v4l2_streamparm *a); 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci/** 44062306a36Sopenharmony_ci * v4l2_s_parm_cap - helper routine for vidioc_s_parm to fill this in by 44162306a36Sopenharmony_ci * calling the s_frame_interval op of the given subdev. It only works 44262306a36Sopenharmony_ci * for V4L2_BUF_TYPE_VIDEO_CAPTURE(_MPLANE), hence the _cap in the 44362306a36Sopenharmony_ci * function name. 44462306a36Sopenharmony_ci * 44562306a36Sopenharmony_ci * @vdev: the struct video_device pointer. Used to determine the device caps. 44662306a36Sopenharmony_ci * @sd: the sub-device pointer. 44762306a36Sopenharmony_ci * @a: the VIDIOC_S_PARM argument. 44862306a36Sopenharmony_ci */ 44962306a36Sopenharmony_ciint v4l2_s_parm_cap(struct video_device *vdev, 45062306a36Sopenharmony_ci struct v4l2_subdev *sd, struct v4l2_streamparm *a); 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci/* Compare two v4l2_fract structs */ 45362306a36Sopenharmony_ci#define V4L2_FRACT_COMPARE(a, OP, b) \ 45462306a36Sopenharmony_ci ((u64)(a).numerator * (b).denominator OP \ 45562306a36Sopenharmony_ci (u64)(b).numerator * (a).denominator) 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci/* ------------------------------------------------------------------------- */ 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci/* Pixel format and FourCC helpers */ 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci/** 46262306a36Sopenharmony_ci * enum v4l2_pixel_encoding - specifies the pixel encoding value 46362306a36Sopenharmony_ci * 46462306a36Sopenharmony_ci * @V4L2_PIXEL_ENC_UNKNOWN: Pixel encoding is unknown/un-initialized 46562306a36Sopenharmony_ci * @V4L2_PIXEL_ENC_YUV: Pixel encoding is YUV 46662306a36Sopenharmony_ci * @V4L2_PIXEL_ENC_RGB: Pixel encoding is RGB 46762306a36Sopenharmony_ci * @V4L2_PIXEL_ENC_BAYER: Pixel encoding is Bayer 46862306a36Sopenharmony_ci */ 46962306a36Sopenharmony_cienum v4l2_pixel_encoding { 47062306a36Sopenharmony_ci V4L2_PIXEL_ENC_UNKNOWN = 0, 47162306a36Sopenharmony_ci V4L2_PIXEL_ENC_YUV = 1, 47262306a36Sopenharmony_ci V4L2_PIXEL_ENC_RGB = 2, 47362306a36Sopenharmony_ci V4L2_PIXEL_ENC_BAYER = 3, 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci/** 47762306a36Sopenharmony_ci * struct v4l2_format_info - information about a V4L2 format 47862306a36Sopenharmony_ci * @format: 4CC format identifier (V4L2_PIX_FMT_*) 47962306a36Sopenharmony_ci * @pixel_enc: Pixel encoding (see enum v4l2_pixel_encoding above) 48062306a36Sopenharmony_ci * @mem_planes: Number of memory planes, which includes the alpha plane (1 to 4). 48162306a36Sopenharmony_ci * @comp_planes: Number of component planes, which includes the alpha plane (1 to 4). 48262306a36Sopenharmony_ci * @bpp: Array of per-plane bytes per pixel 48362306a36Sopenharmony_ci * @bpp_div: Array of per-plane bytes per pixel divisors to support fractional pixel sizes. 48462306a36Sopenharmony_ci * @hdiv: Horizontal chroma subsampling factor 48562306a36Sopenharmony_ci * @vdiv: Vertical chroma subsampling factor 48662306a36Sopenharmony_ci * @block_w: Per-plane macroblock pixel width (optional) 48762306a36Sopenharmony_ci * @block_h: Per-plane macroblock pixel height (optional) 48862306a36Sopenharmony_ci */ 48962306a36Sopenharmony_cistruct v4l2_format_info { 49062306a36Sopenharmony_ci u32 format; 49162306a36Sopenharmony_ci u8 pixel_enc; 49262306a36Sopenharmony_ci u8 mem_planes; 49362306a36Sopenharmony_ci u8 comp_planes; 49462306a36Sopenharmony_ci u8 bpp[4]; 49562306a36Sopenharmony_ci u8 bpp_div[4]; 49662306a36Sopenharmony_ci u8 hdiv; 49762306a36Sopenharmony_ci u8 vdiv; 49862306a36Sopenharmony_ci u8 block_w[4]; 49962306a36Sopenharmony_ci u8 block_h[4]; 50062306a36Sopenharmony_ci}; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_cistatic inline bool v4l2_is_format_rgb(const struct v4l2_format_info *f) 50362306a36Sopenharmony_ci{ 50462306a36Sopenharmony_ci return f && f->pixel_enc == V4L2_PIXEL_ENC_RGB; 50562306a36Sopenharmony_ci} 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cistatic inline bool v4l2_is_format_yuv(const struct v4l2_format_info *f) 50862306a36Sopenharmony_ci{ 50962306a36Sopenharmony_ci return f && f->pixel_enc == V4L2_PIXEL_ENC_YUV; 51062306a36Sopenharmony_ci} 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_cistatic inline bool v4l2_is_format_bayer(const struct v4l2_format_info *f) 51362306a36Sopenharmony_ci{ 51462306a36Sopenharmony_ci return f && f->pixel_enc == V4L2_PIXEL_ENC_BAYER; 51562306a36Sopenharmony_ci} 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ciconst struct v4l2_format_info *v4l2_format_info(u32 format); 51862306a36Sopenharmony_civoid v4l2_apply_frmsize_constraints(u32 *width, u32 *height, 51962306a36Sopenharmony_ci const struct v4l2_frmsize_stepwise *frmsize); 52062306a36Sopenharmony_ciint v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, 52162306a36Sopenharmony_ci u32 width, u32 height); 52262306a36Sopenharmony_ciint v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, 52362306a36Sopenharmony_ci u32 width, u32 height); 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci/** 52662306a36Sopenharmony_ci * v4l2_get_link_freq - Get link rate from transmitter 52762306a36Sopenharmony_ci * 52862306a36Sopenharmony_ci * @handler: The transmitter's control handler 52962306a36Sopenharmony_ci * @mul: The multiplier between pixel rate and link frequency. Bits per pixel on 53062306a36Sopenharmony_ci * D-PHY, samples per clock on parallel. 0 otherwise. 53162306a36Sopenharmony_ci * @div: The divisor between pixel rate and link frequency. Number of data lanes 53262306a36Sopenharmony_ci * times two on D-PHY, 1 on parallel. 0 otherwise. 53362306a36Sopenharmony_ci * 53462306a36Sopenharmony_ci * This function is intended for obtaining the link frequency from the 53562306a36Sopenharmony_ci * transmitter sub-devices. It returns the link rate, either from the 53662306a36Sopenharmony_ci * V4L2_CID_LINK_FREQ control implemented by the transmitter, or value 53762306a36Sopenharmony_ci * calculated based on the V4L2_CID_PIXEL_RATE implemented by the transmitter. 53862306a36Sopenharmony_ci * 53962306a36Sopenharmony_ci * Returns link frequency on success, otherwise a negative error code: 54062306a36Sopenharmony_ci * -ENOENT: Link frequency or pixel rate control not found 54162306a36Sopenharmony_ci * -EINVAL: Invalid link frequency value 54262306a36Sopenharmony_ci */ 54362306a36Sopenharmony_cis64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul, 54462306a36Sopenharmony_ci unsigned int div); 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_civoid v4l2_simplify_fraction(u32 *numerator, u32 *denominator, 54762306a36Sopenharmony_ci unsigned int n_terms, unsigned int threshold); 54862306a36Sopenharmony_ciu32 v4l2_fraction_to_interval(u32 numerator, u32 denominator); 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_cistatic inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf) 55162306a36Sopenharmony_ci{ 55262306a36Sopenharmony_ci /* 55362306a36Sopenharmony_ci * When the timestamp comes from 32-bit user space, there may be 55462306a36Sopenharmony_ci * uninitialized data in tv_usec, so cast it to u32. 55562306a36Sopenharmony_ci * Otherwise allow invalid input for backwards compatibility. 55662306a36Sopenharmony_ci */ 55762306a36Sopenharmony_ci return buf->timestamp.tv_sec * NSEC_PER_SEC + 55862306a36Sopenharmony_ci (u32)buf->timestamp.tv_usec * NSEC_PER_USEC; 55962306a36Sopenharmony_ci} 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_cistatic inline void v4l2_buffer_set_timestamp(struct v4l2_buffer *buf, 56262306a36Sopenharmony_ci u64 timestamp) 56362306a36Sopenharmony_ci{ 56462306a36Sopenharmony_ci struct timespec64 ts = ns_to_timespec64(timestamp); 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci buf->timestamp.tv_sec = ts.tv_sec; 56762306a36Sopenharmony_ci buf->timestamp.tv_usec = ts.tv_nsec / NSEC_PER_USEC; 56862306a36Sopenharmony_ci} 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_cistatic inline bool v4l2_is_colorspace_valid(__u32 colorspace) 57162306a36Sopenharmony_ci{ 57262306a36Sopenharmony_ci return colorspace > V4L2_COLORSPACE_DEFAULT && 57362306a36Sopenharmony_ci colorspace < V4L2_COLORSPACE_LAST; 57462306a36Sopenharmony_ci} 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_cistatic inline bool v4l2_is_xfer_func_valid(__u32 xfer_func) 57762306a36Sopenharmony_ci{ 57862306a36Sopenharmony_ci return xfer_func > V4L2_XFER_FUNC_DEFAULT && 57962306a36Sopenharmony_ci xfer_func < V4L2_XFER_FUNC_LAST; 58062306a36Sopenharmony_ci} 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_cistatic inline bool v4l2_is_ycbcr_enc_valid(__u8 ycbcr_enc) 58362306a36Sopenharmony_ci{ 58462306a36Sopenharmony_ci return ycbcr_enc > V4L2_YCBCR_ENC_DEFAULT && 58562306a36Sopenharmony_ci ycbcr_enc < V4L2_YCBCR_ENC_LAST; 58662306a36Sopenharmony_ci} 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_cistatic inline bool v4l2_is_hsv_enc_valid(__u8 hsv_enc) 58962306a36Sopenharmony_ci{ 59062306a36Sopenharmony_ci return hsv_enc == V4L2_HSV_ENC_180 || hsv_enc == V4L2_HSV_ENC_256; 59162306a36Sopenharmony_ci} 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_cistatic inline bool v4l2_is_quant_valid(__u8 quantization) 59462306a36Sopenharmony_ci{ 59562306a36Sopenharmony_ci return quantization == V4L2_QUANTIZATION_FULL_RANGE || 59662306a36Sopenharmony_ci quantization == V4L2_QUANTIZATION_LIM_RANGE; 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci#endif /* V4L2_COMMON_H_ */ 600