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