hc
2024-05-16 8d2a02b24d66aa359e83eebc1ed3c0f85367a1cb
kernel/drivers/spi/spi-axi-spi-engine.c
....@@ -1,9 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * SPI-Engine SPI controller driver
34 * Copyright 2015 Analog Devices Inc.
45 * Author: Lars-Peter Clausen <lars@metafoo.de>
5
- *
6
- * Licensed under the GPL-2.
76 */
87
98 #include <linux/clk.h>
....@@ -164,10 +163,21 @@
164163 }
165164
166165 static void spi_engine_gen_sleep(struct spi_engine_program *p, bool dry,
167
- struct spi_engine *spi_engine, unsigned int clk_div, unsigned int delay)
166
+ struct spi_engine *spi_engine, unsigned int clk_div,
167
+ struct spi_transfer *xfer)
168168 {
169169 unsigned int spi_clk = clk_get_rate(spi_engine->ref_clk);
170170 unsigned int t;
171
+ int delay;
172
+
173
+ if (xfer->delay_usecs) {
174
+ delay = xfer->delay_usecs;
175
+ } else {
176
+ delay = spi_delay_to_ns(&xfer->delay, xfer);
177
+ if (delay < 0)
178
+ return;
179
+ delay /= 1000;
180
+ }
171181
172182 if (delay == 0)
173183 return;
....@@ -219,8 +229,7 @@
219229 spi_engine_gen_cs(p, dry, spi, true);
220230
221231 spi_engine_gen_xfer(p, dry, xfer);
222
- spi_engine_gen_sleep(p, dry, spi_engine, clk_div,
223
- xfer->delay_usecs);
232
+ spi_engine_gen_sleep(p, dry, spi_engine, clk_div, xfer);
224233
225234 cs_change = xfer->cs_change;
226235 if (list_is_last(&xfer->transfer_list, &msg->transfers))
....@@ -461,7 +470,6 @@
461470 struct spi_engine *spi_engine;
462471 struct spi_master *master;
463472 unsigned int version;
464
- struct resource *res;
465473 int irq;
466474 int ret;
467475
....@@ -480,23 +488,6 @@
480488 spi_master_set_devdata(master, spi_engine);
481489
482490 spin_lock_init(&spi_engine->lock);
483
-
484
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
485
- spi_engine->base = devm_ioremap_resource(&pdev->dev, res);
486
- if (IS_ERR(spi_engine->base)) {
487
- ret = PTR_ERR(spi_engine->base);
488
- goto err_put_master;
489
- }
490
-
491
- version = readl(spi_engine->base + SPI_ENGINE_REG_VERSION);
492
- if (SPI_ENGINE_VERSION_MAJOR(version) != 1) {
493
- dev_err(&pdev->dev, "Unsupported peripheral version %u.%u.%c\n",
494
- SPI_ENGINE_VERSION_MAJOR(version),
495
- SPI_ENGINE_VERSION_MINOR(version),
496
- SPI_ENGINE_VERSION_PATCH(version));
497
- ret = -ENODEV;
498
- goto err_put_master;
499
- }
500491
501492 spi_engine->clk = devm_clk_get(&pdev->dev, "s_axi_aclk");
502493 if (IS_ERR(spi_engine->clk)) {
....@@ -518,6 +509,22 @@
518509 if (ret)
519510 goto err_clk_disable;
520511
512
+ spi_engine->base = devm_platform_ioremap_resource(pdev, 0);
513
+ if (IS_ERR(spi_engine->base)) {
514
+ ret = PTR_ERR(spi_engine->base);
515
+ goto err_ref_clk_disable;
516
+ }
517
+
518
+ version = readl(spi_engine->base + SPI_ENGINE_REG_VERSION);
519
+ if (SPI_ENGINE_VERSION_MAJOR(version) != 1) {
520
+ dev_err(&pdev->dev, "Unsupported peripheral version %u.%u.%c\n",
521
+ SPI_ENGINE_VERSION_MAJOR(version),
522
+ SPI_ENGINE_VERSION_MINOR(version),
523
+ SPI_ENGINE_VERSION_PATCH(version));
524
+ ret = -ENODEV;
525
+ goto err_ref_clk_disable;
526
+ }
527
+
521528 writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_RESET);
522529 writel_relaxed(0xff, spi_engine->base + SPI_ENGINE_REG_INT_PENDING);
523530 writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_INT_ENABLE);