]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
regcache: Use a consistent sort for defaults table
authorMark Brown <broonie@kernel.org>
Wed, 5 Aug 2026 17:51:00 +0000 (18:51 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 6 Aug 2026 11:59:47 +0000 (12:59 +0100)
When we look up registers in the defaults table we use a binary search,
and we have a regcache_sort_defaults() API to help drivers that constuct
their defaults tables on the fly.  Unfortunately the lookup and the sort
don't use the same comparison function, and to make matters worse the
comparison function used during lookups is written for signed register
numbers rather than the unsigned ones we actually have so can produce
suprising results when some of the addresses have the top bit set.

Standardise on the more explicitly coded function to ensure consistent
results.

Reviewed-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20260805-regmap-regcache-sort-v1-1-162186aad8b9@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/regcache.c

index aa8f2efed7798d1df3f4c9c1eb80837c2076968f..480bc76f9a02bad3f65946bbb5a8a37a802bc25f 100644 (file)
@@ -727,14 +727,6 @@ unsigned int regcache_get_val(struct regmap *map, const void *base,
        return -1;
 }
 
-static int regcache_default_cmp(const void *a, const void *b)
-{
-       const struct reg_default *_a = a;
-       const struct reg_default *_b = b;
-
-       return _a->reg - _b->reg;
-}
-
 int regcache_lookup_reg(struct regmap *map, unsigned int reg)
 {
        struct reg_default key;
@@ -744,7 +736,7 @@ int regcache_lookup_reg(struct regmap *map, unsigned int reg)
        key.def = 0;
 
        r = bsearch(&key, map->reg_defaults, map->num_reg_defaults,
-                   sizeof(struct reg_default), regcache_default_cmp);
+                   sizeof(struct reg_default), regcache_defaults_cmp);
 
        if (r)
                return r - map->reg_defaults;