media: v4l: Add a helper for obtaining the link frequency

Add a helper for obtaining the link frequency from transmitter drivers.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Sakari Ailus 2020-10-13 16:54:00 +02:00 committed by Mauro Carvalho Chehab
parent 9d0a79e55a
commit 1b888b3ceb
2 changed files with 54 additions and 0 deletions

View File

@ -441,3 +441,36 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat,
return 0;
}
EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt);
s64 v4l2_get_link_rate(struct v4l2_ctrl_handler *handler, unsigned int mul,
unsigned int div)
{
struct v4l2_ctrl *ctrl;
s64 freq;
ctrl = v4l2_ctrl_find(handler, V4L2_CID_LINK_FREQ);
if (ctrl) {
struct v4l2_querymenu qm = { .id = V4L2_CID_LINK_FREQ };
int ret;
qm.index = v4l2_ctrl_g_ctrl(ctrl);
ret = v4l2_querymenu(handler, &qm);
if (ret)
return -ENOENT;
freq = qm.value;
} else {
if (!mul || !div)
return -ENOENT;
ctrl = v4l2_ctrl_find(handler, V4L2_CID_PIXEL_RATE);
if (!ctrl)
return -ENOENT;
freq = div_u64(v4l2_ctrl_g_ctrl_int64(ctrl) * mul, div);
}
return freq > 0 ? freq : -EINVAL;
}
EXPORT_SYMBOL_GPL(v4l2_get_link_rate);

View File

@ -519,6 +519,27 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat,
int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat,
u32 width, u32 height);
/**
* v4l2_get_link_rate - Get link rate from transmitter
*
* @handler: The transmitter's control handler
* @mul: The multiplier between pixel rate and link frequency. Bits per pixel on
* D-PHY, samples per clock on parallel. 0 otherwise.
* @div: The divisor between pixel rate and link frequency. Number of data lanes
* times two on D-PHY, 1 on parallel. 0 otherwise.
*
* This function is intended for obtaining the link frequency from the
* transmitter sub-devices. It returns the link rate, either from the
* V4L2_CID_LINK_FREQ control implemented by the transmitter, or value
* calculated based on the V4L2_CID_PIXEL_RATE implemented by the transmitter.
*
* Returns link frequency on success, otherwise a negative error code:
* -ENOENT: Link frequency or pixel rate control not found
* -EINVAL: Invalid link frequency value
*/
s64 v4l2_get_link_rate(struct v4l2_ctrl_handler *handler, unsigned int mul,
unsigned int div);
static inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf)
{
/*