Commit 1b888b3c authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab
Browse files

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



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

Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 9d0a79e5
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -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);
+21 −0
Original line number Diff line number Diff line
@@ -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)
{
	/*