Skip to content

Commit 1fc8dc5

Browse files
dlechbroonie
authored andcommitted
spi: axi-spi-engine: remove spi_engine_get_clk_div()
Now that host->max_speed_hz and xfer->effective_speed_hz are properly set, we can use them instead of having to do more complex calculations to get the clock divider for each transfer. This removes the spi_engine_get_clk_div() function and replaces it with just dividing the two clock rates. Since the hardware register value is the divider minus one, we need to subtract one. Subtracting one was previously done in the spi_engine_get_clk_div() function. 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-3-063672323fce@baylibre.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 9d023ec commit 1fc8dc5

1 file changed

Lines changed: 5 additions & 18 deletions

File tree

drivers/spi/spi-axi-spi-engine.c

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -140,21 +140,6 @@ static unsigned int spi_engine_get_config(struct spi_device *spi)
140140
return config;
141141
}
142142

143-
static unsigned int spi_engine_get_clk_div(struct spi_engine *spi_engine,
144-
struct spi_device *spi, struct spi_transfer *xfer)
145-
{
146-
unsigned int clk_div;
147-
148-
clk_div = DIV_ROUND_UP(clk_get_rate(spi_engine->ref_clk),
149-
xfer->speed_hz * 2);
150-
if (clk_div > 255)
151-
clk_div = 255;
152-
else if (clk_div > 0)
153-
clk_div -= 1;
154-
155-
return clk_div;
156-
}
157-
158143
static void spi_engine_gen_xfer(struct spi_engine_program *p, bool dry,
159144
struct spi_transfer *xfer)
160145
{
@@ -243,6 +228,7 @@ static void spi_engine_compile_message(struct spi_engine *spi_engine,
243228
struct spi_message *msg, bool dry, struct spi_engine_program *p)
244229
{
245230
struct spi_device *spi = msg->spi;
231+
struct spi_controller *host = spi->controller;
246232
struct spi_transfer *xfer;
247233
int clk_div, new_clk_div;
248234
bool keep_cs = false;
@@ -258,12 +244,13 @@ static void spi_engine_compile_message(struct spi_engine *spi_engine,
258244
spi_engine_gen_cs(p, dry, spi, !xfer->cs_off);
259245

260246
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
261-
new_clk_div = spi_engine_get_clk_div(spi_engine, spi, xfer);
247+
new_clk_div = host->max_speed_hz / xfer->effective_speed_hz;
262248
if (new_clk_div != clk_div) {
263249
clk_div = new_clk_div;
250+
/* actual divider used is register value + 1 */
264251
spi_engine_program_add_cmd(p, dry,
265252
SPI_ENGINE_CMD_WRITE(SPI_ENGINE_CMD_REG_CLK_DIV,
266-
clk_div));
253+
clk_div - 1));
267254
}
268255

269256
if (bits_per_word != xfer->bits_per_word) {
@@ -274,7 +261,7 @@ static void spi_engine_compile_message(struct spi_engine *spi_engine,
274261
}
275262

276263
spi_engine_gen_xfer(p, dry, xfer);
277-
spi_engine_gen_sleep(p, dry, spi_engine, clk_div, xfer);
264+
spi_engine_gen_sleep(p, dry, spi_engine, clk_div - 1, xfer);
278265

279266
if (xfer->cs_change) {
280267
if (list_is_last(&xfer->transfer_list, &msg->transfers)) {

0 commit comments

Comments
 (0)