• Mark Brown's avatar
    regmap: Ensure range selector registers are updated after cache sync · 0ec77316
    Mark Brown authored
    When we sync the register cache we do so with the cache bypassed in order
    to avoid overhead from writing the synced values back into the cache. If
    the regmap has ranges and the selector register for those ranges is in a
    register which is cached this has the unfortunate side effect of meaning
    that the physical and cached copies of the selector register can be out of
    sync after a cache sync. The cache will have whatever the selector was when
    the sync started and the hardware will have the selector for the register
    that was synced last.
    
    Fix this by rewriting all cached selector registers after every sync,
    ensuring that the hardware and cache have the same content. This will
    result in extra writes that wouldn't otherwise be needed but is simple
    so hopefully robust. We don't read from the hardware since not all
    devices have physical read support.
    
    Given that nobody noticed this until now it is likely that we are rarely if
    ever hitting this case.
    Reported-by: default avatarHector Martin <marcan@marcan.st>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20231026-regmap-fix-selector-sync-v1-1-633ded82770d@kernel.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    0ec77316
regcache.c 18.7 KB