spi: axi-spi-engine: restore clkdiv at end of message
authorDavid Lechner <dlechner@baylibre.com>
Mon, 4 Dec 2023 17:33:33 +0000 (11:33 -0600)
committerMark Brown <broonie@kernel.org>
Wed, 6 Dec 2023 14:19:35 +0000 (14:19 +0000)
This modifies the ADI AXI SPI Engine driver to restore the clkdiv
configuration register at the end of a SPI message. Having the clkdiv in
a known state is needed to be able to add a new command in the future
that only performs a delay without any SPI transfers. Furthermore having
that state be the smallest possible divider will allow these delays to
have the highest possible precision.

Changing the initial value of clk_div from -1 to 1 is now possible
because we know the function will always be called with a known clkdiv
config register state. Making this change will also have the effect of
not emitting a clkdiv configuration register instruction in cases where
the maximum sclk rate is used. Having one less instruction to process
reduces delays on the bus which will be beneficial when we implement
offload support to enable reading data from devices at very high rates.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Acked-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Nuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20231204-axi-spi-engine-series-2-v1-7-063672323fce@baylibre.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-axi-spi-engine.c

index 3437829ef8b1c38ac3534c96c8e5c8510afe872c..3798f96da586c3c461a25e5fbf6ebb3b3ffea7f5 100644 (file)
@@ -228,7 +228,7 @@ static void spi_engine_compile_message(struct spi_message *msg, bool dry,
        bool keep_cs = false;
        u8 bits_per_word = 0;
 
-       clk_div = -1;
+       clk_div = 1;
 
        spi_engine_program_add_cmd(p, dry,
                SPI_ENGINE_CMD_WRITE(SPI_ENGINE_CMD_REG_CONFIG,
@@ -280,6 +280,14 @@ static void spi_engine_compile_message(struct spi_message *msg, bool dry,
 
        if (!keep_cs)
                spi_engine_gen_cs(p, dry, spi, false);
+
+       /*
+        * Restore clockdiv to default so that future gen_sleep commands don't
+        * have to be aware of the current register state.
+        */
+       if (clk_div != 1)
+               spi_engine_program_add_cmd(p, dry,
+                       SPI_ENGINE_CMD_WRITE(SPI_ENGINE_CMD_REG_CLK_DIV, 0));
 }
 
 static void spi_engine_xfer_next(struct spi_message *msg,