• Mark Brown's avatar
    regmap: mmio: Revert to v4.4 endianness handling · 320549a2
    Mark Brown authored
    Commit 29bb45f2 (regmap-mmio: Use native endianness for read/write)
    attempted to fix some long standing bugs in the MMIO implementation for
    big endian systems caused by duplicate byte swapping in both regmap and
    readl()/writel() which affected MIPS systems as when they are in big
    endian mode they flip the endianness of all registers in the system, not
    just the CPU.  MIPS systems had worked around this by declaring regmap
    using IPs as little endian which is inaccurate, unfortunately the issue
    had not been reported.
    
    Sadly the fix makes things worse rather than better.  By changing the
    behaviour to match the documentation it caused behaviour changes for
    other IPs which broke them and by using the __raw I/O accessors to avoid
    the endianness swapping in readl()/writel() it removed some memory
    ordering guarantees and could potentially generate unvirtualisable
    instructions on some architectures.
    
    Unfortunately sorting out all this mess in any half way sensible fashion
    was far too invasive to go in during an -rc cycle so instead let's go
    back to the old broken behaviour for v4.5, the better fixes are already
    queued for v4.6.  This does mean that we keep the broken MIPS DTs for
    another release but that seems the least bad way of handling the
    situation.
    Reported-by: default avatarJohannes Berg <johannes@sipsolutions.net>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    320549a2
regmap-mmio.c 6.94 KB