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

media: v4l: Add a helper for setting up link-frequencies control



Add a helper for obtaining supported link frequencies in form most drivers
need them. The result is a bitmap of supported controls.

Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 45db5c21
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -585,3 +585,50 @@ u32 v4l2_fraction_to_interval(u32 numerator, u32 denominator)
	return denominator ? numerator * multiplier / denominator : 0;
}
EXPORT_SYMBOL_GPL(v4l2_fraction_to_interval);

int v4l2_link_freq_to_bitmap(struct device *dev, const u64 *fw_link_freqs,
			     unsigned int num_of_fw_link_freqs,
			     const s64 *driver_link_freqs,
			     unsigned int num_of_driver_link_freqs,
			     unsigned long *bitmap)
{
	unsigned int i;

	*bitmap = 0;

	if (!num_of_fw_link_freqs) {
		dev_err(dev, "no link frequencies in firmware\n");
		return -ENODATA;
	}

	for (i = 0; i < num_of_fw_link_freqs; i++) {
		unsigned int j;

		for (j = 0; j < num_of_driver_link_freqs; j++) {
			if (fw_link_freqs[i] != driver_link_freqs[j])
				continue;

			dev_dbg(dev, "enabling link frequency %lld Hz\n",
				driver_link_freqs[j]);
			*bitmap |= BIT(j);
			break;
		}
	}

	if (!*bitmap) {
		dev_err(dev, "no matching link frequencies found\n");

		dev_dbg(dev, "specified in firmware:\n");
		for (i = 0; i < num_of_fw_link_freqs; i++)
			dev_dbg(dev, "\t%llu Hz\n", fw_link_freqs[i]);

		dev_dbg(dev, "driver supported:\n");
		for (i = 0; i < num_of_driver_link_freqs; i++)
			dev_dbg(dev, "\t%lld Hz\n", driver_link_freqs[i]);

		return -ENOENT;
	}

	return 0;
}
EXPORT_SYMBOL_GPL(v4l2_link_freq_to_bitmap);
+25 −0
Original line number Diff line number Diff line
@@ -547,6 +547,31 @@ void v4l2_simplify_fraction(u32 *numerator, u32 *denominator,
		unsigned int n_terms, unsigned int threshold);
u32 v4l2_fraction_to_interval(u32 numerator, u32 denominator);

/**
 * v4l2_link_freq_to_bitmap - Figure out platform-supported link frequencies
 * @dev: The struct device
 * @fw_link_freqs: Array of link frequencies from firmware
 * @num_of_fw_link_freqs: Number of entries in @fw_link_freqs
 * @driver_link_freqs: Array of link frequencies supported by the driver
 * @num_of_driver_link_freqs: Number of entries in @driver_link_freqs
 * @bitmap: Bitmap of driver-supported link frequencies found in @fw_link_freqs
 *
 * This function checks which driver-supported link frequencies are enabled in
 * system firmware and sets the corresponding bits in @bitmap (after first
 * zeroing it).
 *
 * Return values:
 *	0: Success
 *	-ENOENT: No match found between driver-supported link frequencies and
 *		 those available in firmware.
 *	-ENODATA: No link frequencies were specified in firmware.
 */
int v4l2_link_freq_to_bitmap(struct device *dev, const u64 *fw_link_freqs,
			     unsigned int num_of_fw_link_freqs,
			     const s64 *driver_link_freqs,
			     unsigned int num_of_driver_link_freqs,
			     unsigned long *bitmap);

static inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf)
{
	/*