summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>2026-08-18 14:21:04 +0200
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>2026-08-18 14:21:04 +0200
commit146cc263e457ff6055fe7829e4f4f4b0b5d5dd86 (patch)
tree142888e27c64734484f916a31cdbe11f3abad41b /drivers/base
parentaaef12abc48c27b65d9ff2de0a232723a1f06c8d (diff)
parent8d3ae59288f1e7d58d76558a6ee96d533bc5019f (diff)
Merge tag 'v7.2' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into gpio/for-next
Linux 7.2
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/regmap/regcache.c27
-rw-r--r--drivers/base/regmap/regmap-sdw-mbq.c4
2 files changed, 19 insertions, 12 deletions
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index aa8f2efed779..623db7a1f3bd 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -123,6 +123,8 @@ static void regcache_hw_exit(struct regmap *map)
int regcache_init(struct regmap *map, const struct regmap_config *config)
{
+ bool sort_defaults = false;
+ unsigned int reg_prev = 0;
int count = 0;
int ret;
int i;
@@ -149,10 +151,16 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
return -EINVAL;
}
- for (i = 0; i < config->num_reg_defaults; i++)
+ for (i = 0; i < config->num_reg_defaults; i++) {
if (config->reg_defaults[i].reg % map->reg_stride)
return -EINVAL;
+ if (reg_prev > config->reg_defaults[i].reg)
+ sort_defaults = true;
+
+ reg_prev = config->reg_defaults[i].reg;
+ }
+
for (i = 0; i < ARRAY_SIZE(cache_types); i++)
if (cache_types[i]->type == map->cache_type)
break;
@@ -186,6 +194,13 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
sizeof(*map->reg_defaults), GFP_KERNEL);
if (!tmp_buf)
return -ENOMEM;
+
+ /* regcache_lookup_reg() bsearch()es this array */
+ if (sort_defaults) {
+ dev_warn(map->dev,
+ "Driver needs fixing: Unsorted reg_defaults, sorting the copy\n");
+ regcache_sort_defaults(tmp_buf, map->num_reg_defaults);
+ }
map->reg_defaults = tmp_buf;
} else if (map->num_reg_defaults_raw) {
count = regcache_count_cacheable_registers(map);
@@ -727,14 +742,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 +751,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;
diff --git a/drivers/base/regmap/regmap-sdw-mbq.c b/drivers/base/regmap/regmap-sdw-mbq.c
index 2585933d4946..b0312f57c980 100644
--- a/drivers/base/regmap/regmap-sdw-mbq.c
+++ b/drivers/base/regmap/regmap-sdw-mbq.c
@@ -56,10 +56,10 @@ static int regmap_sdw_mbq_poll_busy(struct sdw_slave *slave, unsigned int reg,
reg = SDW_SDCA_CTL(SDW_SDCA_CTL_FUNC(reg), 0,
SDCA_CTL_ENTITY_0_FUNCTION_STATUS, 0);
- if (ctx->readable_reg(dev, reg)) {
+ if (!ctx->readable_reg || ctx->readable_reg(dev, reg)) {
ret = read_poll_timeout(sdw_read_no_pm, val,
val < 0 || !(val & SDCA_CTL_ENTITY_0_FUNCTION_BUSY),
- ctx->cfg.timeout_us, ctx->cfg.retry_us,
+ ctx->cfg.retry_us, ctx->cfg.timeout_us,
false, slave, reg);
if (val < 0)
return val;