Re: [PATCH 0/3] ASoC: cs35l41/cs35l45/cs4265: sort the reg_defaults tables

Péter Ujfalusi <[email protected]> Wed, 5 Aug 2026 12:59:30 +0300
Newsgroups org.kernel.vger.linux-sound,org.kernel.vger.stable
Message-ID <[email protected]>

On 05/08/2026 12:56, Richard Fitzgerald wrote:
> On 05/08/2026 10:52 am, Péter Ujfalusi wrote:
>>
>>
>> On 05/08/2026 12:38, Richard Fitzgerald wrote:
>>> On 05/08/2026 10:25 am, Charles Keepax wrote:
>>>> On Wed, Aug 05, 2026 at 12:10:10PM +0300, Péter Ujfalusi wrote:
>>>>> On 05/08/2026 12:00, Richard Fitzgerald wrote:
>>>>>>>> Found by an audit of all reg_defaults tables under sound/, the
>>>>>>>> SoundWire
>>>>>>>> codec drivers are fixed by a separate series.
>>>>>>>
>>>>>>> Wow. Would it make sense to have a regmap helper to double-check the
>>>>>>> addresses are indeed in-order in those reg_default tables?
>>>>>>> I am not sure how this requirement can be enforced by just
>>>>>>> inspection, a
>>>>>>> warning would help detect this sort of issues on more platforms.
>>>>>>>
>>>>>> It does seem probable that anything that relies on people just
>>>>>> remembering to keep a large table sorted is prone to breaking,
>>>>>> especially if the addresses are provided by named constant instead of
>>>>>> a list of hardcoded numbers.
>>>>>>
>>>>>> Should regmap check the table when the regmap is first created?
>>>>>> As it has to search the table during normal use anyway, one extra
>>>>>> walk
>>>>>> when the regmap is created probably isn't a serious overhead.
>>>>>
>>>>> But it will be done for _all_ devices which uses regmap on boot, small
>>>>> things do add up, see my reply to Pierre-Louis.
>>>>
>>>> Indeed, if we were to add some sort of auto-checker it should
>>>> be guarded behind something like perhaps a Kconfig option or the
>>>> DEBUG define.
>>>>
>>>> Thanks,
>>>> Charles
>>>
>>> regcache_init() already walks the defaults table checking the stride
>>>
>>>      for (i = 0; i < config->num_reg_defaults; i++)
>>>          if (config->reg_defaults[i].reg % map->reg_stride)
>>>              return -EINVAL;
>>>
>>> so checking that each entry is larger than previous is trivial extra
>>> overhead. I think most regmaps are cached.
>>
>> Right, I think this should work:
>>
>> diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/
>> regcache.c
>> index aa8f2efed779..ce4b11d8a758 100644
>> --- a/drivers/base/regmap/regcache.c
>> +++ b/drivers/base/regmap/regcache.c
>> @@ -123,6 +123,7 @@ static void regcache_hw_exit(struct regmap *map)
>>     int regcache_init(struct regmap *map, const struct regmap_config
>> *config)
>>   {
>> +    bool sort_defaults = false;
>>       int count = 0;
>>       int ret;
>>       int i;
>> @@ -149,10 +150,15 @@ 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 (i && config->reg_defaults[i - 1].reg >
> 
> You could test the stride of defaults[0] first before the loop, and
> start the loop at i = 1. Then on each loop you can test [i] against
> [i - 1] without the need to check i != 0 every time.

OK, should be better like that

> I don't think we need to sort them. Just fail, so that an unsorted table
> must be fixed.

That would be a big regression all around the place, ordering w/ the
debug message if developer is interested is much better.

-- 
Péter