Skip to content

Commit

Permalink
regcache: Add support for sorting defaults arrays
Browse files Browse the repository at this point in the history
The defaults array in regcache must be sorted into ascending register
address order, because binary search is used to locate values in
the array. Add a helper to sort the register defaults array which
can be useful for systems that dynamically create a defaults array
based on external information.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
Link: https://patch.msgid.link/20250217140159.2288784-2-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Charles Keepax authored and Mark Brown committed Feb 27, 2025
1 parent a54a659 commit fd80df3
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
31 changes: 31 additions & 0 deletions drivers/base/regmap/regcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,37 @@ static const struct regcache_ops *cache_types[] = {
&regcache_flat_ops,
};

static int regcache_defaults_cmp(const void *a, const void *b)
{
const struct reg_default *x = a;
const struct reg_default *y = b;

if (x->reg > y->reg)
return 1;
else if (x->reg < y->reg)
return -1;
else
return 0;
}

static void regcache_defaults_swap(void *a, void *b, int size)
{
struct reg_default *x = a;
struct reg_default *y = b;
struct reg_default tmp;

tmp = *x;
*x = *y;
*y = tmp;
}

void regcache_sort_defaults(struct reg_default *defaults, unsigned int ndefaults)
{
sort(defaults, ndefaults, sizeof(*defaults),
regcache_defaults_cmp, regcache_defaults_swap);
}
EXPORT_SYMBOL_GPL(regcache_sort_defaults);

static int regcache_hw_init(struct regmap *map)
{
int i, j;
Expand Down
7 changes: 7 additions & 0 deletions include/linux/regmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -1352,6 +1352,7 @@ bool regmap_can_raw_write(struct regmap *map);
size_t regmap_get_raw_read_max(struct regmap *map);
size_t regmap_get_raw_write_max(struct regmap *map);

void regcache_sort_defaults(struct reg_default *defaults, unsigned int ndefaults);
int regcache_sync(struct regmap *map);
int regcache_sync_region(struct regmap *map, unsigned int min,
unsigned int max);
Expand Down Expand Up @@ -2043,6 +2044,12 @@ static inline bool regmap_might_sleep(struct regmap *map)
return true;
}

static inline void regcache_sort_defaults(struct reg_default *defaults,
unsigned int ndefaults)
{
WARN_ONCE(1, "regmap API is disabled");
}

static inline int regcache_sync(struct regmap *map)
{
WARN_ONCE(1, "regmap API is disabled");
Expand Down

0 comments on commit fd80df3

Please sign in to comment.