diff mbox series

[v2,1/2] include: kernel.h: port find_closest() from Linux

Message ID 20230319212344.1691814-2-judge.packham@gmail.com
State Accepted
Commit b5f045e12fea0a64a3749c4da1bdfd579530b67e
Delegated to: Tom Rini
Headers show
Series max313xx RTC driver | expand

Commit Message

Chris Packham March 19, 2023, 9:23 p.m. UTC
The find_closest() macro can be used to find an element in a sorted
array that is closest to an input value. Bring in this macro from
Linux v6.3-rc1-2-g8ca09d5fa354.

Signed-off-by: Chris Packham <judge.packham@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Add note on which Linux version this came from
- Collect review from Simon

 include/linux/kernel.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Comments

Tom Rini March 31, 2023, 2:15 p.m. UTC | #1
On Mon, Mar 20, 2023 at 10:23:43AM +1300, Chris Packham wrote:

> The find_closest() macro can be used to find an element in a sorted
> array that is closest to an input value. Bring in this macro from
> Linux v6.3-rc1-2-g8ca09d5fa354.
> 
> Signed-off-by: Chris Packham <judge.packham@gmail.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 3e71d61074b6..5cd6c9dc8219 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -284,4 +284,28 @@ 
 	offsetof(struct structure, member) == (offset), \
 	"`struct " #structure "` offset for `" #member "` is not " #offset)
 
+#define __find_closest(x, a, as, op)					\
+({									\
+	typeof(as) __fc_i, __fc_as = (as) - 1;				\
+	typeof(x) __fc_x = (x);						\
+	typeof(*a) const *__fc_a = (a);					\
+	for (__fc_i = 0; __fc_i < __fc_as; __fc_i++) {			\
+		if (__fc_x op DIV_ROUND_CLOSEST(__fc_a[__fc_i] +	\
+						__fc_a[__fc_i + 1], 2))	\
+			break;						\
+	}								\
+	(__fc_i);							\
+})
+
+/**
+ * find_closest - locate the closest element in a sorted array
+ * @x: The reference value.
+ * @a: The array in which to look for the closest element. Must be sorted
+ *  in ascending order.
+ * @as: Size of 'a'.
+ *
+ * Returns the index of the element closest to 'x'.
+ */
+#define find_closest(x, a, as) __find_closest(x, a, as, <=)
+
 #endif