Merge tag 'media/v4.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - new dvb frontend driver: lnbh29 - new sensor drivers: imx319 and imx 355 - some old soc_camera driver renames to avoid conflict with new drivers - new i.MX Pixel Pipeline (PXP) mem-to-mem platform driver - a new V4L2 frontend for the FWHT codec - several other improvements, bug fixes, code cleanups, etc * tag 'media/v4.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (289 commits) media: rename soc_camera I2C drivers media: cec: forgot to cancel delayed work media: vivid: Support 480p for webcam capture media: v4l2-tpg: fix kernel oops when enabling HFLIP and OSD media: vivid: Add 16-bit bayer to format list media: v4l2-tpg-core: Add 16-bit bayer media: pvrusb2: replace `printk` with `pr_*` media: venus: vdec: fix decoded data size media: cx231xx: fix potential sign-extension overflow on large shift media: dt-bindings: media: rcar_vin: add device tree support for r8a7744 media: isif: fix a NULL pointer dereference bug media: exynos4-is: make const array config_ids static media: cx23885: make const array addr_list static media: ivtv: make const array addr_list static media: bttv-input: make const array addr_list static media: cx18: Don't check for address of video_dev media: dw9807-vcm: Fix probe error handling media: dw9714: Remove useless error message media: dw9714: Fix error handling in probe function media: cec: name for RC passthrough device does not need 'RC for' ...
This commit is contained in:
@@ -63,7 +63,6 @@ struct cec_data {
|
||||
struct delayed_work work;
|
||||
struct completion c;
|
||||
u8 attempts;
|
||||
bool new_initiator;
|
||||
bool blocking;
|
||||
bool completed;
|
||||
};
|
||||
@@ -174,6 +173,7 @@ struct cec_adapter {
|
||||
bool is_configuring;
|
||||
bool is_configured;
|
||||
bool cec_pin_is_high;
|
||||
u8 last_initiator;
|
||||
u32 monitor_all_cnt;
|
||||
u32 monitor_pin_cnt;
|
||||
u32 follower_cnt;
|
||||
@@ -198,9 +198,7 @@ struct cec_adapter {
|
||||
u16 phys_addrs[15];
|
||||
u32 sequence;
|
||||
|
||||
char device_name[32];
|
||||
char input_phys[32];
|
||||
char input_drv[32];
|
||||
};
|
||||
|
||||
static inline void *cec_get_drvdata(const struct cec_adapter *adap)
|
||||
@@ -332,67 +330,6 @@ void cec_queue_pin_5v_event(struct cec_adapter *adap, bool is_high, ktime_t ts);
|
||||
u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
|
||||
unsigned int *offset);
|
||||
|
||||
/**
|
||||
* cec_set_edid_phys_addr() - find and set the physical address
|
||||
*
|
||||
* @edid: pointer to the EDID data
|
||||
* @size: size in bytes of the EDID data
|
||||
* @phys_addr: the new physical address
|
||||
*
|
||||
* This function finds the location of the physical address in the EDID
|
||||
* and fills in the given physical address and updates the checksum
|
||||
* at the end of the EDID block. It does nothing if the EDID doesn't
|
||||
* contain a physical address.
|
||||
*/
|
||||
void cec_set_edid_phys_addr(u8 *edid, unsigned int size, u16 phys_addr);
|
||||
|
||||
/**
|
||||
* cec_phys_addr_for_input() - calculate the PA for an input
|
||||
*
|
||||
* @phys_addr: the physical address of the parent
|
||||
* @input: the number of the input port, must be between 1 and 15
|
||||
*
|
||||
* This function calculates a new physical address based on the input
|
||||
* port number. For example:
|
||||
*
|
||||
* PA = 0.0.0.0 and input = 2 becomes 2.0.0.0
|
||||
*
|
||||
* PA = 3.0.0.0 and input = 1 becomes 3.1.0.0
|
||||
*
|
||||
* PA = 3.2.1.0 and input = 5 becomes 3.2.1.5
|
||||
*
|
||||
* PA = 3.2.1.3 and input = 5 becomes f.f.f.f since it maxed out the depth.
|
||||
*
|
||||
* Return: the new physical address or CEC_PHYS_ADDR_INVALID.
|
||||
*/
|
||||
u16 cec_phys_addr_for_input(u16 phys_addr, u8 input);
|
||||
|
||||
/**
|
||||
* cec_phys_addr_validate() - validate a physical address from an EDID
|
||||
*
|
||||
* @phys_addr: the physical address to validate
|
||||
* @parent: if not %NULL, then this is filled with the parents PA.
|
||||
* @port: if not %NULL, then this is filled with the input port.
|
||||
*
|
||||
* This validates a physical address as read from an EDID. If the
|
||||
* PA is invalid (such as 1.0.1.0 since '0' is only allowed at the end),
|
||||
* then it will return -EINVAL.
|
||||
*
|
||||
* The parent PA is passed into %parent and the input port is passed into
|
||||
* %port. For example:
|
||||
*
|
||||
* PA = 0.0.0.0: has parent 0.0.0.0 and input port 0.
|
||||
*
|
||||
* PA = 1.0.0.0: has parent 0.0.0.0 and input port 1.
|
||||
*
|
||||
* PA = 3.2.0.0: has parent 3.0.0.0 and input port 2.
|
||||
*
|
||||
* PA = f.f.f.f: has parent f.f.f.f and input port 0.
|
||||
*
|
||||
* Return: 0 if the PA is valid, -EINVAL if not.
|
||||
*/
|
||||
int cec_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port);
|
||||
|
||||
#else
|
||||
|
||||
static inline int cec_register_adapter(struct cec_adapter *adap,
|
||||
@@ -427,25 +364,6 @@ static inline u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
|
||||
return CEC_PHYS_ADDR_INVALID;
|
||||
}
|
||||
|
||||
static inline void cec_set_edid_phys_addr(u8 *edid, unsigned int size,
|
||||
u16 phys_addr)
|
||||
{
|
||||
}
|
||||
|
||||
static inline u16 cec_phys_addr_for_input(u16 phys_addr, u8 input)
|
||||
{
|
||||
return CEC_PHYS_ADDR_INVALID;
|
||||
}
|
||||
|
||||
static inline int cec_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port)
|
||||
{
|
||||
if (parent)
|
||||
*parent = phys_addr;
|
||||
if (port)
|
||||
*port = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -461,4 +379,74 @@ static inline void cec_phys_addr_invalidate(struct cec_adapter *adap)
|
||||
cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* cec_get_edid_spa_location() - find location of the Source Physical Address
|
||||
*
|
||||
* @edid: the EDID
|
||||
* @size: the size of the EDID
|
||||
*
|
||||
* This EDID is expected to be a CEA-861 compliant, which means that there are
|
||||
* at least two blocks and one or more of the extensions blocks are CEA-861
|
||||
* blocks.
|
||||
*
|
||||
* The returned location is guaranteed to be <= size-2.
|
||||
*
|
||||
* This is an inline function since it is used by both CEC and V4L2.
|
||||
* Ideally this would go in a module shared by both, but it is overkill to do
|
||||
* that for just a single function.
|
||||
*/
|
||||
static inline unsigned int cec_get_edid_spa_location(const u8 *edid,
|
||||
unsigned int size)
|
||||
{
|
||||
unsigned int blocks = size / 128;
|
||||
unsigned int block;
|
||||
u8 d;
|
||||
|
||||
/* Sanity check: at least 2 blocks and a multiple of the block size */
|
||||
if (blocks < 2 || size % 128)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If there are fewer extension blocks than the size, then update
|
||||
* 'blocks'. It is allowed to have more extension blocks than the size,
|
||||
* since some hardware can only read e.g. 256 bytes of the EDID, even
|
||||
* though more blocks are present. The first CEA-861 extension block
|
||||
* should normally be in block 1 anyway.
|
||||
*/
|
||||
if (edid[0x7e] + 1 < blocks)
|
||||
blocks = edid[0x7e] + 1;
|
||||
|
||||
for (block = 1; block < blocks; block++) {
|
||||
unsigned int offset = block * 128;
|
||||
|
||||
/* Skip any non-CEA-861 extension blocks */
|
||||
if (edid[offset] != 0x02 || edid[offset + 1] != 0x03)
|
||||
continue;
|
||||
|
||||
/* search Vendor Specific Data Block (tag 3) */
|
||||
d = edid[offset + 2] & 0x7f;
|
||||
/* Check if there are Data Blocks */
|
||||
if (d <= 4)
|
||||
continue;
|
||||
if (d > 4) {
|
||||
unsigned int i = offset + 4;
|
||||
unsigned int end = offset + d;
|
||||
|
||||
/* Note: 'end' is always < 'size' */
|
||||
do {
|
||||
u8 tag = edid[i] >> 5;
|
||||
u8 len = edid[i] & 0x1f;
|
||||
|
||||
if (tag == 3 && len >= 5 && i + len <= end &&
|
||||
edid[i + 1] == 0x03 &&
|
||||
edid[i + 2] == 0x0c &&
|
||||
edid[i + 3] == 0x00)
|
||||
return i + 4;
|
||||
i += len + 1;
|
||||
} while (i < end);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _MEDIA_CEC_H */
|
||||
|
@@ -155,12 +155,41 @@ struct media_link {
|
||||
bool is_backlink;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum media_pad_signal_type - type of the signal inside a media pad
|
||||
*
|
||||
* @PAD_SIGNAL_DEFAULT:
|
||||
* Default signal. Use this when all inputs or all outputs are
|
||||
* uniquely identified by the pad number.
|
||||
* @PAD_SIGNAL_ANALOG:
|
||||
* The pad contains an analog signal. It can be Radio Frequency,
|
||||
* Intermediate Frequency, a baseband signal or sub-cariers.
|
||||
* Tuner inputs, IF-PLL demodulators, composite and s-video signals
|
||||
* should use it.
|
||||
* @PAD_SIGNAL_DV:
|
||||
* Contains a digital video signal, with can be a bitstream of samples
|
||||
* taken from an analog TV video source. On such case, it usually
|
||||
* contains the VBI data on it.
|
||||
* @PAD_SIGNAL_AUDIO:
|
||||
* Contains an Intermediate Frequency analog signal from an audio
|
||||
* sub-carrier or an audio bitstream. IF signals are provided by tuners
|
||||
* and consumed by audio AM/FM decoders. Bitstream audio is provided by
|
||||
* an audio decoder.
|
||||
*/
|
||||
enum media_pad_signal_type {
|
||||
PAD_SIGNAL_DEFAULT = 0,
|
||||
PAD_SIGNAL_ANALOG,
|
||||
PAD_SIGNAL_DV,
|
||||
PAD_SIGNAL_AUDIO,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct media_pad - A media pad graph object.
|
||||
*
|
||||
* @graph_obj: Embedded structure containing the media object common data
|
||||
* @entity: Entity this pad belongs to
|
||||
* @index: Pad index in the entity pads array, numbered from 0 to n
|
||||
* @sig_type: Type of the signal inside a media pad
|
||||
* @flags: Pad flags, as defined in
|
||||
* :ref:`include/uapi/linux/media.h <media_header>`
|
||||
* (seek for ``MEDIA_PAD_FL_*``)
|
||||
@@ -169,6 +198,7 @@ struct media_pad {
|
||||
struct media_gobj graph_obj; /* must be first field in struct */
|
||||
struct media_entity *entity;
|
||||
u16 index;
|
||||
enum media_pad_signal_type sig_type;
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
@@ -640,6 +670,24 @@ static inline void media_entity_cleanup(struct media_entity *entity) {}
|
||||
#define media_entity_cleanup(entity) do { } while (false)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* media_get_pad_index() - retrieves a pad index from an entity
|
||||
*
|
||||
* @entity: entity where the pads belong
|
||||
* @is_sink: true if the pad is a sink, false if it is a source
|
||||
* @sig_type: type of signal of the pad to be search
|
||||
*
|
||||
* This helper function finds the first pad index inside an entity that
|
||||
* satisfies both @is_sink and @sig_type conditions.
|
||||
*
|
||||
* Return:
|
||||
*
|
||||
* On success, return the pad number. If the pad was not found or the media
|
||||
* entity is a NULL pointer, return -EINVAL.
|
||||
*/
|
||||
int media_get_pad_index(struct media_entity *entity, bool is_sink,
|
||||
enum media_pad_signal_type sig_type);
|
||||
|
||||
/**
|
||||
* media_create_pad_link() - creates a link between two entities.
|
||||
*
|
||||
|
@@ -317,13 +317,6 @@ struct ir_raw_event {
|
||||
unsigned carrier_report:1;
|
||||
};
|
||||
|
||||
#define DEFINE_IR_RAW_EVENT(event) struct ir_raw_event event = {}
|
||||
|
||||
static inline void init_ir_raw_event(struct ir_raw_event *ev)
|
||||
{
|
||||
memset(ev, 0, sizeof(*ev));
|
||||
}
|
||||
|
||||
#define IR_DEFAULT_TIMEOUT MS_TO_NS(125)
|
||||
#define IR_MAX_DURATION 500000000 /* 500 ms */
|
||||
#define US_TO_NS(usec) ((usec) * 1000)
|
||||
@@ -344,9 +337,7 @@ int ir_raw_encode_carrier(enum rc_proto protocol);
|
||||
|
||||
static inline void ir_raw_event_reset(struct rc_dev *dev)
|
||||
{
|
||||
struct ir_raw_event ev = { .reset = true };
|
||||
|
||||
ir_raw_event_store(dev, &ev);
|
||||
ir_raw_event_store(dev, &((struct ir_raw_event) { .reset = true }));
|
||||
dev->idle = true;
|
||||
ir_raw_event_handle(dev);
|
||||
}
|
||||
|
@@ -1,14 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* rcar-fcp.h -- R-Car Frame Compression Processor Driver
|
||||
*
|
||||
* Copyright (C) 2016 Renesas Electronics Corporation
|
||||
*
|
||||
* Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
#ifndef __MEDIA_RCAR_FCP_H__
|
||||
#define __MEDIA_RCAR_FCP_H__
|
||||
|
@@ -20,9 +20,6 @@ struct v4l2_device;
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_async_notifier;
|
||||
|
||||
/* A random max subdevice number, used to allocate an array on stack */
|
||||
#define V4L2_MAX_SUBDEVS 128U
|
||||
|
||||
/**
|
||||
* enum v4l2_async_match_type - type of asynchronous subdevice logic to be used
|
||||
* in order to identify a match
|
||||
@@ -73,6 +70,8 @@ enum v4l2_async_match_type {
|
||||
* @match.custom.priv:
|
||||
* Driver-specific private struct with match parameters
|
||||
* to be used if %V4L2_ASYNC_MATCH_CUSTOM.
|
||||
* @asd_list: used to add struct v4l2_async_subdev objects to the
|
||||
* master notifier @asd_list
|
||||
* @list: used to link struct v4l2_async_subdev objects, waiting to be
|
||||
* probed, to a notifier->waiting list
|
||||
*
|
||||
@@ -90,14 +89,15 @@ struct v4l2_async_subdev {
|
||||
unsigned short address;
|
||||
} i2c;
|
||||
struct {
|
||||
bool (*match)(struct device *,
|
||||
struct v4l2_async_subdev *);
|
||||
bool (*match)(struct device *dev,
|
||||
struct v4l2_async_subdev *sd);
|
||||
void *priv;
|
||||
} custom;
|
||||
} match;
|
||||
|
||||
/* v4l2-async core private: not to be used by drivers */
|
||||
struct list_head list;
|
||||
struct list_head asd_list;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -121,29 +121,107 @@ struct v4l2_async_notifier_operations {
|
||||
* struct v4l2_async_notifier - v4l2_device notifier data
|
||||
*
|
||||
* @ops: notifier operations
|
||||
* @num_subdevs: number of subdevices used in the subdevs array
|
||||
* @max_subdevs: number of subdevices allocated in the subdevs array
|
||||
* @subdevs: array of pointers to subdevice descriptors
|
||||
* @v4l2_dev: v4l2_device of the root notifier, NULL otherwise
|
||||
* @sd: sub-device that registered the notifier, NULL otherwise
|
||||
* @parent: parent notifier
|
||||
* @asd_list: master list of struct v4l2_async_subdev
|
||||
* @waiting: list of struct v4l2_async_subdev, waiting for their drivers
|
||||
* @done: list of struct v4l2_subdev, already probed
|
||||
* @list: member in a global list of notifiers
|
||||
*/
|
||||
struct v4l2_async_notifier {
|
||||
const struct v4l2_async_notifier_operations *ops;
|
||||
unsigned int num_subdevs;
|
||||
unsigned int max_subdevs;
|
||||
struct v4l2_async_subdev **subdevs;
|
||||
struct v4l2_device *v4l2_dev;
|
||||
struct v4l2_subdev *sd;
|
||||
struct v4l2_async_notifier *parent;
|
||||
struct list_head asd_list;
|
||||
struct list_head waiting;
|
||||
struct list_head done;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_init - Initialize a notifier.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
*
|
||||
* This function initializes the notifier @asd_list. It must be called
|
||||
* before the first call to @v4l2_async_notifier_add_subdev.
|
||||
*/
|
||||
void v4l2_async_notifier_init(struct v4l2_async_notifier *notifier);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_add_subdev - Add an async subdev to the
|
||||
* notifier's master asd list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @asd: pointer to &struct v4l2_async_subdev
|
||||
*
|
||||
* Call this function before registering a notifier to link the
|
||||
* provided asd to the notifiers master @asd_list.
|
||||
*/
|
||||
int v4l2_async_notifier_add_subdev(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_async_subdev *asd);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_add_fwnode_subdev - Allocate and add a fwnode async
|
||||
* subdev to the notifier's master asd_list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @fwnode: fwnode handle of the sub-device to be matched
|
||||
* @asd_struct_size: size of the driver's async sub-device struct, including
|
||||
* sizeof(struct v4l2_async_subdev). The &struct
|
||||
* v4l2_async_subdev shall be the first member of
|
||||
* the driver's async sub-device struct, i.e. both
|
||||
* begin at the same memory address.
|
||||
*
|
||||
* Allocate a fwnode-matched asd of size asd_struct_size, and add it
|
||||
* to the notifiers @asd_list.
|
||||
*/
|
||||
struct v4l2_async_subdev *
|
||||
v4l2_async_notifier_add_fwnode_subdev(struct v4l2_async_notifier *notifier,
|
||||
struct fwnode_handle *fwnode,
|
||||
unsigned int asd_struct_size);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_add_i2c_subdev - Allocate and add an i2c async
|
||||
* subdev to the notifier's master asd_list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @adapter_id: I2C adapter ID to be matched
|
||||
* @address: I2C address of sub-device to be matched
|
||||
* @asd_struct_size: size of the driver's async sub-device struct, including
|
||||
* sizeof(struct v4l2_async_subdev). The &struct
|
||||
* v4l2_async_subdev shall be the first member of
|
||||
* the driver's async sub-device struct, i.e. both
|
||||
* begin at the same memory address.
|
||||
*
|
||||
* Same as above but for I2C matched sub-devices.
|
||||
*/
|
||||
struct v4l2_async_subdev *
|
||||
v4l2_async_notifier_add_i2c_subdev(struct v4l2_async_notifier *notifier,
|
||||
int adapter_id, unsigned short address,
|
||||
unsigned int asd_struct_size);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_add_devname_subdev - Allocate and add a device-name
|
||||
* async subdev to the notifier's master asd_list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @device_name: device name string to be matched
|
||||
* @asd_struct_size: size of the driver's async sub-device struct, including
|
||||
* sizeof(struct v4l2_async_subdev). The &struct
|
||||
* v4l2_async_subdev shall be the first member of
|
||||
* the driver's async sub-device struct, i.e. both
|
||||
* begin at the same memory address.
|
||||
*
|
||||
* Same as above but for device-name matched sub-devices.
|
||||
*/
|
||||
struct v4l2_async_subdev *
|
||||
v4l2_async_notifier_add_devname_subdev(struct v4l2_async_notifier *notifier,
|
||||
const char *device_name,
|
||||
unsigned int asd_struct_size);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_register - registers a subdevice asynchronous notifier
|
||||
*
|
||||
@@ -164,7 +242,8 @@ int v4l2_async_subdev_notifier_register(struct v4l2_subdev *sd,
|
||||
struct v4l2_async_notifier *notifier);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_unregister - unregisters a subdevice asynchronous notifier
|
||||
* v4l2_async_notifier_unregister - unregisters a subdevice
|
||||
* asynchronous notifier
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
*/
|
||||
@@ -177,7 +256,9 @@ void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier);
|
||||
* Release memory resources related to a notifier, including the async
|
||||
* sub-devices allocated for the purposes of the notifier but not the notifier
|
||||
* itself. The user is responsible for calling this function to clean up the
|
||||
* notifier after calling @v4l2_async_notifier_parse_fwnode_endpoints or
|
||||
* notifier after calling
|
||||
* @v4l2_async_notifier_add_subdev,
|
||||
* @v4l2_async_notifier_parse_fwnode_endpoints or
|
||||
* @v4l2_fwnode_reference_parse_sensor_common.
|
||||
*
|
||||
* There is no harm from calling v4l2_async_notifier_cleanup in other
|
||||
@@ -213,8 +294,8 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd);
|
||||
* An error is returned if the module is no longer loaded on any attempts
|
||||
* to register it.
|
||||
*/
|
||||
int __must_check v4l2_async_register_subdev_sensor_common(
|
||||
struct v4l2_subdev *sd);
|
||||
int __must_check
|
||||
v4l2_async_register_subdev_sensor_common(struct v4l2_subdev *sd);
|
||||
|
||||
/**
|
||||
* v4l2_async_unregister_subdev - unregisters a sub-device to the asynchronous
|
||||
|
@@ -154,6 +154,18 @@ struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
|
||||
struct i2c_adapter *adapter, struct i2c_board_info *info,
|
||||
const unsigned short *probe_addrs);
|
||||
|
||||
/**
|
||||
* v4l2_i2c_subdev_set_name - Set name for an I²C sub-device
|
||||
*
|
||||
* @sd: pointer to &struct v4l2_subdev
|
||||
* @client: pointer to struct i2c_client
|
||||
* @devname: the name of the device; if NULL, the I²C device's name will be used
|
||||
* @postfix: sub-device specific string to put right after the I²C device name;
|
||||
* may be NULL
|
||||
*/
|
||||
void v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client *client,
|
||||
const char *devname, const char *postfix);
|
||||
|
||||
/**
|
||||
* v4l2_i2c_subdev_init - Initializes a &struct v4l2_subdev with data from
|
||||
* an i2c_client struct.
|
||||
@@ -283,7 +295,7 @@ struct v4l2_priv_tun_config {
|
||||
* @height: pointer to height that will be adjusted if needed.
|
||||
* @hmin: minimum height.
|
||||
* @hmax: maximum height.
|
||||
* @halign: least significant bit on width.
|
||||
* @halign: least significant bit on height.
|
||||
* @salign: least significant bit for the image size (e. g.
|
||||
* :math:`width * height`).
|
||||
*
|
||||
|
@@ -728,6 +728,22 @@ struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id);
|
||||
*/
|
||||
void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);
|
||||
|
||||
/**
|
||||
* __v4l2_ctrl_grab() - Unlocked variant of v4l2_ctrl_grab.
|
||||
*
|
||||
* @ctrl: The control to (de)activate.
|
||||
* @grabbed: True if the control should become grabbed.
|
||||
*
|
||||
* This sets or clears the V4L2_CTRL_FLAG_GRABBED flag atomically.
|
||||
* Does nothing if @ctrl == NULL.
|
||||
* The V4L2_EVENT_CTRL event will be generated afterwards.
|
||||
* This will usually be called when starting or stopping streaming in the
|
||||
* driver.
|
||||
*
|
||||
* This function assumes that the control handler is locked by the caller.
|
||||
*/
|
||||
void __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
|
||||
|
||||
/**
|
||||
* v4l2_ctrl_grab() - Mark the control as grabbed or not grabbed.
|
||||
*
|
||||
@@ -743,7 +759,15 @@ void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);
|
||||
* This function assumes that the control handler is not locked and will
|
||||
* take the lock itself.
|
||||
*/
|
||||
void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
|
||||
static inline void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
|
||||
{
|
||||
if (!ctrl)
|
||||
return;
|
||||
|
||||
v4l2_ctrl_lock(ctrl);
|
||||
__v4l2_ctrl_grab(ctrl, grabbed);
|
||||
v4l2_ctrl_unlock(ctrl);
|
||||
}
|
||||
|
||||
/**
|
||||
*__v4l2_ctrl_modify_range() - Unlocked variant of v4l2_ctrl_modify_range()
|
||||
|
@@ -10,6 +10,17 @@
|
||||
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
/**
|
||||
* v4l2_calc_timeperframe - helper function to calculate timeperframe based
|
||||
* v4l2_dv_timings fields.
|
||||
* @t: Timings for the video mode.
|
||||
*
|
||||
* Calculates the expected timeperframe using the pixel clock value and
|
||||
* horizontal/vertical measures. This means that v4l2_dv_timings structure
|
||||
* must be correctly and fully filled.
|
||||
*/
|
||||
struct v4l2_fract v4l2_calc_timeperframe(const struct v4l2_dv_timings *t);
|
||||
|
||||
/*
|
||||
* v4l2_dv_timings_presets: list of all dv_timings presets.
|
||||
*/
|
||||
@@ -234,4 +245,10 @@ v4l2_hdmi_rx_colorimetry(const struct hdmi_avi_infoframe *avi,
|
||||
const struct hdmi_vendor_infoframe *hdmi,
|
||||
unsigned int height);
|
||||
|
||||
u16 v4l2_get_edid_phys_addr(const u8 *edid, unsigned int size,
|
||||
unsigned int *offset);
|
||||
void v4l2_set_edid_phys_addr(u8 *edid, unsigned int size, u16 phys_addr);
|
||||
u16 v4l2_phys_addr_for_input(u16 phys_addr, u8 input);
|
||||
int v4l2_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port);
|
||||
|
||||
#endif
|
||||
|
@@ -23,6 +23,7 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <media/v4l2-mediabus.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
struct fwnode_handle;
|
||||
struct v4l2_async_notifier;
|
||||
@@ -70,8 +71,8 @@ struct v4l2_fwnode_bus_parallel {
|
||||
* @clock_lane: the number of the clock lane
|
||||
*/
|
||||
struct v4l2_fwnode_bus_mipi_csi1 {
|
||||
bool clock_inv;
|
||||
bool strobe;
|
||||
unsigned char clock_inv:1;
|
||||
unsigned char strobe:1;
|
||||
bool lane_polarity[2];
|
||||
unsigned char data_lane;
|
||||
unsigned char clock_lane;
|
||||
@@ -130,19 +131,30 @@ struct v4l2_fwnode_link {
|
||||
* @fwnode: pointer to the endpoint's fwnode handle
|
||||
* @vep: pointer to the V4L2 fwnode data structure
|
||||
*
|
||||
* All properties are optional. If none are found, we don't set any flags. This
|
||||
* means the port has a static configuration and no properties have to be
|
||||
* specified explicitly. If any properties that identify the bus as parallel
|
||||
* are found and slave-mode isn't set, we set V4L2_MBUS_MASTER. Similarly, if
|
||||
* we recognise the bus as serial CSI-2 and clock-noncontinuous isn't set, we
|
||||
* set the V4L2_MBUS_CSI2_CONTINUOUS_CLOCK flag. The caller should hold a
|
||||
* reference to @fwnode.
|
||||
* This function parses the V4L2 fwnode endpoint specific parameters from the
|
||||
* firmware. The caller is responsible for assigning @vep.bus_type to a valid
|
||||
* media bus type. The caller may also set the default configuration for the
|
||||
* endpoint --- a configuration that shall be in line with the DT binding
|
||||
* documentation. Should a device support multiple bus types, the caller may
|
||||
* call this function once the correct type is found --- with a default
|
||||
* configuration valid for that type.
|
||||
*
|
||||
* As a compatibility means guessing the bus type is also supported by setting
|
||||
* @vep.bus_type to V4L2_MBUS_UNKNOWN. The caller may not provide a default
|
||||
* configuration in this case as the defaults are specific to a given bus type.
|
||||
* This functionality is deprecated and should not be used in new drivers and it
|
||||
* is only supported for CSI-2 D-PHY, parallel and Bt.656 busses.
|
||||
*
|
||||
* The function does not change the V4L2 fwnode endpoint state if it fails.
|
||||
*
|
||||
* NOTE: This function does not parse properties the size of which is variable
|
||||
* without a low fixed limit. Please use v4l2_fwnode_endpoint_alloc_parse() in
|
||||
* new drivers instead.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
* Return: %0 on success or a negative error code on failure:
|
||||
* %-ENOMEM on memory allocation failure
|
||||
* %-EINVAL on parsing failure
|
||||
* %-ENXIO on mismatching bus types
|
||||
*/
|
||||
int v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
|
||||
struct v4l2_fwnode_endpoint *vep);
|
||||
@@ -160,14 +172,23 @@ void v4l2_fwnode_endpoint_free(struct v4l2_fwnode_endpoint *vep);
|
||||
/**
|
||||
* v4l2_fwnode_endpoint_alloc_parse() - parse all fwnode node properties
|
||||
* @fwnode: pointer to the endpoint's fwnode handle
|
||||
* @vep: pointer to the V4L2 fwnode data structure
|
||||
*
|
||||
* All properties are optional. If none are found, we don't set any flags. This
|
||||
* means the port has a static configuration and no properties have to be
|
||||
* specified explicitly. If any properties that identify the bus as parallel
|
||||
* are found and slave-mode isn't set, we set V4L2_MBUS_MASTER. Similarly, if
|
||||
* we recognise the bus as serial CSI-2 and clock-noncontinuous isn't set, we
|
||||
* set the V4L2_MBUS_CSI2_CONTINUOUS_CLOCK flag. The caller should hold a
|
||||
* reference to @fwnode.
|
||||
* This function parses the V4L2 fwnode endpoint specific parameters from the
|
||||
* firmware. The caller is responsible for assigning @vep.bus_type to a valid
|
||||
* media bus type. The caller may also set the default configuration for the
|
||||
* endpoint --- a configuration that shall be in line with the DT binding
|
||||
* documentation. Should a device support multiple bus types, the caller may
|
||||
* call this function once the correct type is found --- with a default
|
||||
* configuration valid for that type.
|
||||
*
|
||||
* As a compatibility means guessing the bus type is also supported by setting
|
||||
* @vep.bus_type to V4L2_MBUS_UNKNOWN. The caller may not provide a default
|
||||
* configuration in this case as the defaults are specific to a given bus type.
|
||||
* This functionality is deprecated and should not be used in new drivers and it
|
||||
* is only supported for CSI-2 D-PHY, parallel and Bt.656 busses.
|
||||
*
|
||||
* The function does not change the V4L2 fwnode endpoint state if it fails.
|
||||
*
|
||||
* v4l2_fwnode_endpoint_alloc_parse() has two important differences to
|
||||
* v4l2_fwnode_endpoint_parse():
|
||||
@@ -177,11 +198,13 @@ void v4l2_fwnode_endpoint_free(struct v4l2_fwnode_endpoint *vep);
|
||||
* 2. The memory it has allocated to store the variable size data must be freed
|
||||
* using v4l2_fwnode_endpoint_free() when no longer needed.
|
||||
*
|
||||
* Return: Pointer to v4l2_fwnode_endpoint if successful, on an error pointer
|
||||
* on error.
|
||||
* Return: %0 on success or a negative error code on failure:
|
||||
* %-ENOMEM on memory allocation failure
|
||||
* %-EINVAL on parsing failure
|
||||
* %-ENXIO on mismatching bus types
|
||||
*/
|
||||
struct v4l2_fwnode_endpoint *v4l2_fwnode_endpoint_alloc_parse(
|
||||
struct fwnode_handle *fwnode);
|
||||
int v4l2_fwnode_endpoint_alloc_parse(struct fwnode_handle *fwnode,
|
||||
struct v4l2_fwnode_endpoint *vep);
|
||||
|
||||
/**
|
||||
* v4l2_fwnode_parse_link() - parse a link between two endpoints
|
||||
@@ -213,7 +236,6 @@ int v4l2_fwnode_parse_link(struct fwnode_handle *fwnode,
|
||||
*/
|
||||
void v4l2_fwnode_put_link(struct v4l2_fwnode_link *link);
|
||||
|
||||
|
||||
/**
|
||||
* typedef parse_endpoint_func - Driver's callback function to be called on
|
||||
* each V4L2 fwnode endpoint.
|
||||
@@ -232,7 +254,6 @@ typedef int (*parse_endpoint_func)(struct device *dev,
|
||||
struct v4l2_fwnode_endpoint *vep,
|
||||
struct v4l2_async_subdev *asd);
|
||||
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_parse_fwnode_endpoints - Parse V4L2 fwnode endpoints in a
|
||||
* device node
|
||||
@@ -247,7 +268,7 @@ typedef int (*parse_endpoint_func)(struct device *dev,
|
||||
* endpoint. Optional.
|
||||
*
|
||||
* Parse the fwnode endpoints of the @dev device and populate the async sub-
|
||||
* devices array of the notifier. The @parse_endpoint callback function is
|
||||
* devices list in the notifier. The @parse_endpoint callback function is
|
||||
* called for each endpoint with the corresponding async sub-device pointer to
|
||||
* let the caller initialize the driver-specific part of the async sub-device
|
||||
* structure.
|
||||
@@ -258,11 +279,6 @@ typedef int (*parse_endpoint_func)(struct device *dev,
|
||||
* This function may not be called on a registered notifier and may be called on
|
||||
* a notifier only once.
|
||||
*
|
||||
* Do not change the notifier's subdevs array, take references to the subdevs
|
||||
* array itself or change the notifier's num_subdevs field. This is because this
|
||||
* function allocates and reallocates the subdevs array based on parsing
|
||||
* endpoints.
|
||||
*
|
||||
* The &struct v4l2_fwnode_endpoint passed to the callback function
|
||||
* @parse_endpoint is released once the function is finished. If there is a need
|
||||
* to retain that configuration, the user needs to allocate memory for it.
|
||||
@@ -276,10 +292,11 @@ typedef int (*parse_endpoint_func)(struct device *dev,
|
||||
* %-EINVAL if graph or endpoint parsing failed
|
||||
* Other error codes as returned by @parse_endpoint
|
||||
*/
|
||||
int v4l2_async_notifier_parse_fwnode_endpoints(
|
||||
struct device *dev, struct v4l2_async_notifier *notifier,
|
||||
size_t asd_struct_size,
|
||||
parse_endpoint_func parse_endpoint);
|
||||
int
|
||||
v4l2_async_notifier_parse_fwnode_endpoints(struct device *dev,
|
||||
struct v4l2_async_notifier *notifier,
|
||||
size_t asd_struct_size,
|
||||
parse_endpoint_func parse_endpoint);
|
||||
|
||||
/**
|
||||
* v4l2_async_notifier_parse_fwnode_endpoints_by_port - Parse V4L2 fwnode
|
||||
@@ -303,7 +320,7 @@ int v4l2_async_notifier_parse_fwnode_endpoints(
|
||||
* devices). In this case the driver must know which ports to parse.
|
||||
*
|
||||
* Parse the fwnode endpoints of the @dev device on a given @port and populate
|
||||
* the async sub-devices array of the notifier. The @parse_endpoint callback
|
||||
* the async sub-devices list of the notifier. The @parse_endpoint callback
|
||||
* function is called for each endpoint with the corresponding async sub-device
|
||||
* pointer to let the caller initialize the driver-specific part of the async
|
||||
* sub-device structure.
|
||||
@@ -314,11 +331,6 @@ int v4l2_async_notifier_parse_fwnode_endpoints(
|
||||
* This function may not be called on a registered notifier and may be called on
|
||||
* a notifier only once per port.
|
||||
*
|
||||
* Do not change the notifier's subdevs array, take references to the subdevs
|
||||
* array itself or change the notifier's num_subdevs field. This is because this
|
||||
* function allocates and reallocates the subdevs array based on parsing
|
||||
* endpoints.
|
||||
*
|
||||
* The &struct v4l2_fwnode_endpoint passed to the callback function
|
||||
* @parse_endpoint is released once the function is finished. If there is a need
|
||||
* to retain that configuration, the user needs to allocate memory for it.
|
||||
@@ -332,10 +344,12 @@ int v4l2_async_notifier_parse_fwnode_endpoints(
|
||||
* %-EINVAL if graph or endpoint parsing failed
|
||||
* Other error codes as returned by @parse_endpoint
|
||||
*/
|
||||
int v4l2_async_notifier_parse_fwnode_endpoints_by_port(
|
||||
struct device *dev, struct v4l2_async_notifier *notifier,
|
||||
size_t asd_struct_size, unsigned int port,
|
||||
parse_endpoint_func parse_endpoint);
|
||||
int
|
||||
v4l2_async_notifier_parse_fwnode_endpoints_by_port(struct device *dev,
|
||||
struct v4l2_async_notifier *notifier,
|
||||
size_t asd_struct_size,
|
||||
unsigned int port,
|
||||
parse_endpoint_func parse_endpoint);
|
||||
|
||||
/**
|
||||
* v4l2_fwnode_reference_parse_sensor_common - parse common references on
|
||||
@@ -355,7 +369,44 @@ int v4l2_async_notifier_parse_fwnode_endpoints_by_port(
|
||||
* -ENOMEM if memory allocation failed
|
||||
* -EINVAL if property parsing failed
|
||||
*/
|
||||
int v4l2_async_notifier_parse_fwnode_sensor_common(
|
||||
struct device *dev, struct v4l2_async_notifier *notifier);
|
||||
int v4l2_async_notifier_parse_fwnode_sensor_common(struct device *dev,
|
||||
struct v4l2_async_notifier *notifier);
|
||||
|
||||
/**
|
||||
* v4l2_async_register_fwnode_subdev - registers a sub-device to the
|
||||
* asynchronous sub-device framework
|
||||
* and parses fwnode endpoints
|
||||
*
|
||||
* @sd: pointer to struct &v4l2_subdev
|
||||
* @asd_struct_size: size of the driver's async sub-device struct, including
|
||||
* sizeof(struct v4l2_async_subdev). The &struct
|
||||
* v4l2_async_subdev shall be the first member of
|
||||
* the driver's async sub-device struct, i.e. both
|
||||
* begin at the same memory address.
|
||||
* @ports: array of port id's to parse for fwnode endpoints. If NULL, will
|
||||
* parse all ports owned by the sub-device.
|
||||
* @num_ports: number of ports in @ports array. Ignored if @ports is NULL.
|
||||
* @parse_endpoint: Driver's callback function called on each V4L2 fwnode
|
||||
* endpoint. Optional.
|
||||
*
|
||||
* This function is just like v4l2_async_register_subdev() with the
|
||||
* exception that calling it will also allocate a notifier for the
|
||||
* sub-device, parse the sub-device's firmware node endpoints using
|
||||
* v4l2_async_notifier_parse_fwnode_endpoints() or
|
||||
* v4l2_async_notifier_parse_fwnode_endpoints_by_port(), and
|
||||
* registers the sub-device notifier. The sub-device is similarly
|
||||
* unregistered by calling v4l2_async_unregister_subdev().
|
||||
*
|
||||
* While registered, the subdev module is marked as in-use.
|
||||
*
|
||||
* An error is returned if the module is no longer loaded on any attempts
|
||||
* to register it.
|
||||
*/
|
||||
int
|
||||
v4l2_async_register_fwnode_subdev(struct v4l2_subdev *sd,
|
||||
size_t asd_struct_size,
|
||||
unsigned int *ports,
|
||||
unsigned int num_ports,
|
||||
parse_endpoint_func parse_endpoint);
|
||||
|
||||
#endif /* _V4L2_FWNODE_H */
|
||||
|
@@ -23,84 +23,6 @@
|
||||
#include <media/v4l2-dev.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/**
|
||||
* enum tuner_pad_index - tuner pad index for MEDIA_ENT_F_TUNER
|
||||
*
|
||||
* @TUNER_PAD_RF_INPUT: Radiofrequency (RF) sink pad, usually linked to a
|
||||
* RF connector entity.
|
||||
* @TUNER_PAD_OUTPUT: Tuner video output source pad. Contains the video
|
||||
* chrominance and luminance or the hole bandwidth
|
||||
* of the signal converted to an Intermediate Frequency
|
||||
* (IF) or to baseband (on zero-IF tuners).
|
||||
* @TUNER_PAD_AUD_OUT: Tuner audio output source pad. Tuners used to decode
|
||||
* analog TV signals have an extra pad for audio output.
|
||||
* Old tuners use an analog stage with a saw filter for
|
||||
* the audio IF frequency. The output of the pad is, in
|
||||
* this case, the audio IF, with should be decoded either
|
||||
* by the bridge chipset (that's the case of cx2388x
|
||||
* chipsets) or may require an external IF sound
|
||||
* processor, like msp34xx. On modern silicon tuners,
|
||||
* the audio IF decoder is usually incorporated at the
|
||||
* tuner. On such case, the output of this pad is an
|
||||
* audio sampled data.
|
||||
* @TUNER_NUM_PADS: Number of pads of the tuner.
|
||||
*/
|
||||
enum tuner_pad_index {
|
||||
TUNER_PAD_RF_INPUT,
|
||||
TUNER_PAD_OUTPUT,
|
||||
TUNER_PAD_AUD_OUT,
|
||||
TUNER_NUM_PADS
|
||||
};
|
||||
|
||||
/**
|
||||
* enum if_vid_dec_pad_index - video IF-PLL pad index for
|
||||
* MEDIA_ENT_F_IF_VID_DECODER
|
||||
*
|
||||
* @IF_VID_DEC_PAD_IF_INPUT: video Intermediate Frequency (IF) sink pad
|
||||
* @IF_VID_DEC_PAD_OUT: IF-PLL video output source pad. Contains the
|
||||
* video chrominance and luminance IF signals.
|
||||
* @IF_VID_DEC_PAD_NUM_PADS: Number of pads of the video IF-PLL.
|
||||
*/
|
||||
enum if_vid_dec_pad_index {
|
||||
IF_VID_DEC_PAD_IF_INPUT,
|
||||
IF_VID_DEC_PAD_OUT,
|
||||
IF_VID_DEC_PAD_NUM_PADS
|
||||
};
|
||||
|
||||
/**
|
||||
* enum if_aud_dec_pad_index - audio/sound IF-PLL pad index for
|
||||
* MEDIA_ENT_F_IF_AUD_DECODER
|
||||
*
|
||||
* @IF_AUD_DEC_PAD_IF_INPUT: audio Intermediate Frequency (IF) sink pad
|
||||
* @IF_AUD_DEC_PAD_OUT: IF-PLL audio output source pad. Contains the
|
||||
* audio sampled stream data, usually connected
|
||||
* to the bridge bus via an Inter-IC Sound (I2S)
|
||||
* bus.
|
||||
* @IF_AUD_DEC_PAD_NUM_PADS: Number of pads of the audio IF-PLL.
|
||||
*/
|
||||
enum if_aud_dec_pad_index {
|
||||
IF_AUD_DEC_PAD_IF_INPUT,
|
||||
IF_AUD_DEC_PAD_OUT,
|
||||
IF_AUD_DEC_PAD_NUM_PADS
|
||||
};
|
||||
|
||||
/**
|
||||
* enum demod_pad_index - analog TV pad index for MEDIA_ENT_F_ATV_DECODER
|
||||
*
|
||||
* @DEMOD_PAD_IF_INPUT: IF input sink pad.
|
||||
* @DEMOD_PAD_VID_OUT: Video output source pad.
|
||||
* @DEMOD_PAD_VBI_OUT: Vertical Blank Interface (VBI) output source pad.
|
||||
* @DEMOD_PAD_AUDIO_OUT: Audio output source pad.
|
||||
* @DEMOD_NUM_PADS: Maximum number of output pads.
|
||||
*/
|
||||
enum demod_pad_index {
|
||||
DEMOD_PAD_IF_INPUT,
|
||||
DEMOD_PAD_VID_OUT,
|
||||
DEMOD_PAD_VBI_OUT,
|
||||
DEMOD_PAD_AUDIO_OUT,
|
||||
DEMOD_NUM_PADS
|
||||
};
|
||||
|
||||
/* We don't need to include pci.h or usb.h here */
|
||||
struct pci_dev;
|
||||
struct usb_device;
|
||||
|
@@ -14,7 +14,6 @@
|
||||
#include <linux/v4l2-mediabus.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
|
||||
/* Parallel flags */
|
||||
/*
|
||||
* Can the client run in master or in slave mode. By "Master mode" an operation
|
||||
@@ -63,26 +62,34 @@
|
||||
#define V4L2_MBUS_CSI2_CONTINUOUS_CLOCK BIT(8)
|
||||
#define V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK BIT(9)
|
||||
|
||||
#define V4L2_MBUS_CSI2_LANES (V4L2_MBUS_CSI2_1_LANE | V4L2_MBUS_CSI2_2_LANE | \
|
||||
V4L2_MBUS_CSI2_3_LANE | V4L2_MBUS_CSI2_4_LANE)
|
||||
#define V4L2_MBUS_CSI2_CHANNELS (V4L2_MBUS_CSI2_CHANNEL_0 | V4L2_MBUS_CSI2_CHANNEL_1 | \
|
||||
V4L2_MBUS_CSI2_CHANNEL_2 | V4L2_MBUS_CSI2_CHANNEL_3)
|
||||
#define V4L2_MBUS_CSI2_LANES (V4L2_MBUS_CSI2_1_LANE | \
|
||||
V4L2_MBUS_CSI2_2_LANE | \
|
||||
V4L2_MBUS_CSI2_3_LANE | \
|
||||
V4L2_MBUS_CSI2_4_LANE)
|
||||
#define V4L2_MBUS_CSI2_CHANNELS (V4L2_MBUS_CSI2_CHANNEL_0 | \
|
||||
V4L2_MBUS_CSI2_CHANNEL_1 | \
|
||||
V4L2_MBUS_CSI2_CHANNEL_2 | \
|
||||
V4L2_MBUS_CSI2_CHANNEL_3)
|
||||
|
||||
/**
|
||||
* enum v4l2_mbus_type - media bus type
|
||||
* @V4L2_MBUS_UNKNOWN: unknown bus type, no V4L2 mediabus configuration
|
||||
* @V4L2_MBUS_PARALLEL: parallel interface with hsync and vsync
|
||||
* @V4L2_MBUS_BT656: parallel interface with embedded synchronisation, can
|
||||
* also be used for BT.1120
|
||||
* @V4L2_MBUS_CSI1: MIPI CSI-1 serial interface
|
||||
* @V4L2_MBUS_CCP2: CCP2 (Compact Camera Port 2)
|
||||
* @V4L2_MBUS_CSI2: MIPI CSI-2 serial interface
|
||||
* @V4L2_MBUS_CSI2_DPHY: MIPI CSI-2 serial interface, with D-PHY
|
||||
* @V4L2_MBUS_CSI2_CPHY: MIPI CSI-2 serial interface, with C-PHY
|
||||
*/
|
||||
enum v4l2_mbus_type {
|
||||
V4L2_MBUS_UNKNOWN,
|
||||
V4L2_MBUS_PARALLEL,
|
||||
V4L2_MBUS_BT656,
|
||||
V4L2_MBUS_CSI1,
|
||||
V4L2_MBUS_CCP2,
|
||||
V4L2_MBUS_CSI2,
|
||||
V4L2_MBUS_CSI2_DPHY,
|
||||
V4L2_MBUS_CSI2_CPHY,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -102,8 +109,9 @@ struct v4l2_mbus_config {
|
||||
* @pix_fmt: pointer to &struct v4l2_pix_format to be filled
|
||||
* @mbus_fmt: pointer to &struct v4l2_mbus_framefmt to be used as model
|
||||
*/
|
||||
static inline void v4l2_fill_pix_format(struct v4l2_pix_format *pix_fmt,
|
||||
const struct v4l2_mbus_framefmt *mbus_fmt)
|
||||
static inline void
|
||||
v4l2_fill_pix_format(struct v4l2_pix_format *pix_fmt,
|
||||
const struct v4l2_mbus_framefmt *mbus_fmt)
|
||||
{
|
||||
pix_fmt->width = mbus_fmt->width;
|
||||
pix_fmt->height = mbus_fmt->height;
|
||||
@@ -124,7 +132,7 @@ static inline void v4l2_fill_pix_format(struct v4l2_pix_format *pix_fmt,
|
||||
* @code: data format code (from &enum v4l2_mbus_pixelcode)
|
||||
*/
|
||||
static inline void v4l2_fill_mbus_format(struct v4l2_mbus_framefmt *mbus_fmt,
|
||||
const struct v4l2_pix_format *pix_fmt,
|
||||
const struct v4l2_pix_format *pix_fmt,
|
||||
u32 code)
|
||||
{
|
||||
mbus_fmt->width = pix_fmt->width;
|
||||
@@ -144,9 +152,9 @@ static inline void v4l2_fill_mbus_format(struct v4l2_mbus_framefmt *mbus_fmt,
|
||||
* @pix_mp_fmt: pointer to &struct v4l2_pix_format_mplane to be filled
|
||||
* @mbus_fmt: pointer to &struct v4l2_mbus_framefmt to be used as model
|
||||
*/
|
||||
static inline void v4l2_fill_pix_format_mplane(
|
||||
struct v4l2_pix_format_mplane *pix_mp_fmt,
|
||||
const struct v4l2_mbus_framefmt *mbus_fmt)
|
||||
static inline void
|
||||
v4l2_fill_pix_format_mplane(struct v4l2_pix_format_mplane *pix_mp_fmt,
|
||||
const struct v4l2_mbus_framefmt *mbus_fmt)
|
||||
{
|
||||
pix_mp_fmt->width = mbus_fmt->width;
|
||||
pix_mp_fmt->height = mbus_fmt->height;
|
||||
@@ -164,9 +172,9 @@ static inline void v4l2_fill_pix_format_mplane(
|
||||
* @mbus_fmt: pointer to &struct v4l2_mbus_framefmt to be filled
|
||||
* @pix_mp_fmt: pointer to &struct v4l2_pix_format_mplane to be used as model
|
||||
*/
|
||||
static inline void v4l2_fill_mbus_format_mplane(
|
||||
struct v4l2_mbus_framefmt *mbus_fmt,
|
||||
const struct v4l2_pix_format_mplane *pix_mp_fmt)
|
||||
static inline void
|
||||
v4l2_fill_mbus_format_mplane(struct v4l2_mbus_framefmt *mbus_fmt,
|
||||
const struct v4l2_pix_format_mplane *pix_mp_fmt)
|
||||
{
|
||||
mbus_fmt->width = pix_mp_fmt->width;
|
||||
mbus_fmt->height = pix_mp_fmt->height;
|
||||
|
@@ -82,6 +82,32 @@ static inline bool v4l2_rect_same_size(const struct v4l2_rect *r1,
|
||||
return r1->width == r2->width && r1->height == r2->height;
|
||||
}
|
||||
|
||||
/**
|
||||
* v4l2_rect_same_position() - return true if r1 has the same position as r2
|
||||
* @r1: rectangle.
|
||||
* @r2: rectangle.
|
||||
*
|
||||
* Return true if both rectangles have the same position
|
||||
*/
|
||||
static inline bool v4l2_rect_same_position(const struct v4l2_rect *r1,
|
||||
const struct v4l2_rect *r2)
|
||||
{
|
||||
return r1->top == r2->top && r1->left == r2->left;
|
||||
}
|
||||
|
||||
/**
|
||||
* v4l2_rect_equal() - return true if r1 equals r2
|
||||
* @r1: rectangle.
|
||||
* @r2: rectangle.
|
||||
*
|
||||
* Return true if both rectangles have the same size and position.
|
||||
*/
|
||||
static inline bool v4l2_rect_equal(const struct v4l2_rect *r1,
|
||||
const struct v4l2_rect *r2)
|
||||
{
|
||||
return v4l2_rect_same_size(r1, r2) && v4l2_rect_same_position(r1, r2);
|
||||
}
|
||||
|
||||
/**
|
||||
* v4l2_rect_intersect() - calculate the intersection of two rects.
|
||||
* @r: intersection of @r1 and @r2.
|
||||
|
@@ -1,14 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* vsp1.h -- R-Car VSP1 API
|
||||
*
|
||||
* Copyright (C) 2015 Renesas Electronics Corporation
|
||||
*
|
||||
* Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
#ifndef __MEDIA_VSP1_H__
|
||||
#define __MEDIA_VSP1_H__
|
||||
@@ -46,7 +42,7 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index,
|
||||
/**
|
||||
* struct vsp1_du_atomic_config - VSP atomic configuration parameters
|
||||
* @pixelformat: plane pixel format (V4L2 4CC)
|
||||
* @pitch: line pitch in bytes, for all planes
|
||||
* @pitch: line pitch in bytes for the first plane
|
||||
* @mem: DMA memory address for each plane of the frame buffer
|
||||
* @src: source rectangle in the frame buffer (integer coordinates)
|
||||
* @dst: destination rectangle on the display (integer coordinates)
|
||||
|
Reference in New Issue
Block a user