diff mbox series

[v2,1/4] media: v4l: Add a helper for setting up link-frequencies control

Message ID 20240108075221.15757-2-sakari.ailus@linux.intel.com (mailing list archive)
State New
Headers show
Series Add link frequency to bitmap helper | expand

Commit Message

Sakari Ailus Jan. 8, 2024, 7:52 a.m. UTC
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.ailus@linux.intel.com>
---
 drivers/media/v4l2-core/v4l2-common.c | 47 +++++++++++++++++++++++++++
 include/media/v4l2-common.h           | 25 ++++++++++++++
 2 files changed, 72 insertions(+)

Comments

kernel test robot Jan. 8, 2024, 3:10 p.m. UTC | #1
Hi Sakari,

kernel test robot noticed the following build errors:

[auto build test ERROR on media-tree/master]
[also build test ERROR on linuxtv-media-stage/master sailus-media-tree/streams linus/master v6.7 next-20240108]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Sakari-Ailus/media-v4l-Add-a-helper-for-setting-up-link-frequencies-control/20240108-155716
base:   git://linuxtv.org/media_tree.git master
patch link:    https://lore.kernel.org/r/20240108075221.15757-2-sakari.ailus%40linux.intel.com
patch subject: [PATCH v2 1/4] media: v4l: Add a helper for setting up link-frequencies control
config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20240108/202401082245.yka9kMRc-lkp@intel.com/config)
compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240108/202401082245.yka9kMRc-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401082245.yka9kMRc-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/media/v4l2-core/v4l2-common.c:634:19: error: use of undeclared identifier 'v4l2_link_frequencies_to_bitmap'; did you mean 'v4l2_link_freq_to_bitmap'?
     634 | EXPORT_SYMBOL_GPL(v4l2_link_frequencies_to_bitmap);
         |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                   v4l2_link_freq_to_bitmap
   include/linux/export.h:87:48: note: expanded from macro 'EXPORT_SYMBOL_GPL'
      87 | #define EXPORT_SYMBOL_GPL(sym)          _EXPORT_SYMBOL(sym, "GPL")
         |                                                        ^
   include/linux/export.h:83:54: note: expanded from macro '_EXPORT_SYMBOL'
      83 | #define _EXPORT_SYMBOL(sym, license)    __EXPORT_SYMBOL(sym, license, "")
         |                                                         ^
   include/linux/export.h:74:16: note: expanded from macro '__EXPORT_SYMBOL'
      74 |         extern typeof(sym) sym;                                 \
         |                       ^
   drivers/media/v4l2-core/v4l2-common.c:589:5: note: 'v4l2_link_freq_to_bitmap' declared here
     589 | int v4l2_link_freq_to_bitmap(struct device *dev, const u64 *fw_link_freqs,
         |     ^
   1 error generated.


vim +634 drivers/media/v4l2-core/v4l2-common.c

   588	
   589	int v4l2_link_freq_to_bitmap(struct device *dev, const u64 *fw_link_freqs,
   590				     unsigned int num_of_fw_link_freqs,
   591				     const s64 *driver_link_freqs,
   592				     unsigned int num_of_driver_link_freqs,
   593				     unsigned long *bitmap)
   594	{
   595		unsigned int i;
   596	
   597		*bitmap = 0;
   598	
   599		if (!num_of_fw_link_freqs) {
   600			dev_err(dev, "no link frequencies in firmware\n");
   601			return -ENODATA;
   602		}
   603	
   604		for (i = 0; i < num_of_fw_link_freqs; i++) {
   605			unsigned int j;
   606	
   607			for (j = 0; j < num_of_driver_link_freqs; j++) {
   608				if (fw_link_freqs[i] != driver_link_freqs[j])
   609					continue;
   610	
   611				dev_dbg(dev, "enabling link frequency %lld Hz\n",
   612					driver_link_freqs[j]);
   613				*bitmap |= BIT(j);
   614				break;
   615			}
   616		}
   617	
   618		if (!*bitmap) {
   619			dev_err(dev, "no matching link frequencies found\n");
   620	
   621			dev_dbg(dev, "specified in firmware:\n");
   622			for (i = 0; i < num_of_fw_link_freqs; i++)
   623				dev_dbg(dev, "\t%llu Hz\n", fw_link_freqs[i]);
   624	
   625			dev_dbg(dev, "driver supported:\n");
   626			for (i = 0; i < num_of_driver_link_freqs; i++)
   627				dev_dbg(dev, "\t%lld Hz\n", driver_link_freqs[i]);
   628	
   629			return -ENOENT;
   630		}
   631	
   632		return 0;
   633	}
 > 634	EXPORT_SYMBOL_GPL(v4l2_link_frequencies_to_bitmap);
diff mbox series

Patch

diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c
index 273d83de2a87..353e94f52f5d 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_frequencies_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)
 {
 	/*