This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: v4l: Add a helper for setting up link-frequencies control
Author:  Sakari Ailus <sakari.ai...@linux.intel.com>
Date:    Mon Jan 8 16:18:02 2024 +0100

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: Sakari Ailus <sakari.ai...@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mche...@kernel.org>

 drivers/media/v4l2-core/v4l2-common.c | 47 +++++++++++++++++++++++++++++++++++
 include/media/v4l2-common.h           | 25 +++++++++++++++++++
 2 files changed, 72 insertions(+)

---

diff --git a/drivers/media/v4l2-core/v4l2-common.c 
b/drivers/media/v4l2-core/v4l2-common.c
index 273d83de2a87..d34d210908d9 100644
--- a/drivers/media/v4l2-core/v4l2-common.c
+++ b/drivers/media/v4l2-core/v4l2-common.c
@@ -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);
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
index acf5be24a5ca..cd2163f24f8a 100644
--- a/include/media/v4l2-common.h
+++ b/include/media/v4l2-common.h
@@ -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)
 {
        /*
_______________________________________________
linuxtv-commits mailing list -- linuxtv-commits@linuxtv.org
To unsubscribe send an email to linuxtv-commits-le...@linuxtv.org
%(web_page_url)slistinfo/%(_internal_name)s

Reply via email to