• Neil Armstrong's avatar
    spi: meson-spicc: add local pow2 clock ops to preserve rate between messages · 09992025
    Neil Armstrong authored
    At the end of a message, the HW gets a reset in meson_spicc_unprepare_transfer(),
    this resets the SPICC_CONREG register and notably the value set by the
    Common Clock Framework.
    
    This is problematic because:
    - the register value CCF can be different from the corresponding CCF cached rate
    - CCF is allowed to change the clock rate whenever the HW state
    
    This introduces:
    - local pow2 clock ops checking the HW state before allowing a clock operation
    - separation of legacy pow2 clock patch and new enhanced clock path
    - SPICC_CONREG datarate value is now value kepts across messages
    
    It has been checked that:
    - SPICC_CONREG datarate value is kept across messages
    - CCF is only allowed to change the SPICC_CONREG datarate value when busy
    - SPICC_CONREG datarate value is correct for each transfer
    
    This didn't appear before commit 3e0cf4d3 ("spi: meson-spicc: add a linear clock divider support")
    because we recalculated and wrote the rate for each xfer.
    
    Fixes: 3e0cf4d3 ("spi: meson-spicc: add a linear clock divider support")
    Reported-by: default avatarDa Xue <da@libre.computer>
    Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
    Link: https://lore.kernel.org/r/20220811134445.678446-1-narmstrong@baylibre.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    09992025
spi-meson-spicc.c 24.7 KB