Skip to content

Commit 34c2202

Browse files
committed
spi: axi-spi-engine: improve version checks
Merge series from David Lechner <dlechner@baylibre.com>: We have a pending major version bump for the axi-spi-engine so to prepare for that, improve the existing version checks for feature enablement.
2 parents 9ca01e9 + 30db1b2 commit 34c2202

2 files changed

Lines changed: 28 additions & 10 deletions

File tree

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,7 +1050,7 @@ static int spi_engine_probe(struct platform_device *pdev)
10501050
return -ENODEV;
10511051
}
10521052

1053-
if (ADI_AXI_PCORE_VER_MINOR(version) >= 1) {
1053+
if (adi_axi_pcore_ver_gteq(version, 1, 1)) {
10541054
unsigned int sizes = readl(spi_engine->base +
10551055
SPI_ENGINE_REG_OFFLOAD_MEM_ADDR_WIDTH);
10561056

@@ -1064,7 +1064,7 @@ static int spi_engine_probe(struct platform_device *pdev)
10641064
}
10651065

10661066
/* IP v1.5 dropped the requirement for SYNC in offload messages. */
1067-
spi_engine->offload_requires_sync = ADI_AXI_PCORE_VER_MINOR(version) < 5;
1067+
spi_engine->offload_requires_sync = !adi_axi_pcore_ver_gteq(version, 1, 5);
10681068

10691069
writel_relaxed(0x00, spi_engine->base + SPI_ENGINE_REG_RESET);
10701070
writel_relaxed(0xff, spi_engine->base + SPI_ENGINE_REG_INT_PENDING);
@@ -1091,15 +1091,12 @@ static int spi_engine_probe(struct platform_device *pdev)
10911091
host->put_offload = spi_engine_put_offload;
10921092
host->num_chipselect = 8;
10931093

1094-
/* Some features depend of the IP core version. */
1095-
if (ADI_AXI_PCORE_VER_MAJOR(version) >= 1) {
1096-
if (ADI_AXI_PCORE_VER_MINOR(version) >= 2) {
1097-
host->mode_bits |= SPI_CS_HIGH;
1098-
host->setup = spi_engine_setup;
1099-
}
1100-
if (ADI_AXI_PCORE_VER_MINOR(version) >= 3)
1101-
host->mode_bits |= SPI_MOSI_IDLE_LOW | SPI_MOSI_IDLE_HIGH;
1094+
if (adi_axi_pcore_ver_gteq(version, 1, 2)) {
1095+
host->mode_bits |= SPI_CS_HIGH;
1096+
host->setup = spi_engine_setup;
11021097
}
1098+
if (adi_axi_pcore_ver_gteq(version, 1, 3))
1099+
host->mode_bits |= SPI_MOSI_IDLE_LOW | SPI_MOSI_IDLE_HIGH;
11031100

11041101
if (host->max_speed_hz == 0)
11051102
return dev_err_probe(&pdev->dev, -EINVAL, "spi_clk rate is 0");

include/linux/adi-axi-common.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
* https://wiki.analog.com/resources/fpga/docs/hdl/regmap
99
*/
1010

11+
#include <linux/types.h>
12+
1113
#ifndef ADI_AXI_COMMON_H_
1214
#define ADI_AXI_COMMON_H_
1315

@@ -21,6 +23,25 @@
2123
#define ADI_AXI_PCORE_VER_MINOR(version) (((version) >> 8) & 0xff)
2224
#define ADI_AXI_PCORE_VER_PATCH(version) ((version) & 0xff)
2325

26+
/**
27+
* adi_axi_pcore_ver_gteq() - check if a version is satisfied
28+
* @version: the full version read from the hardware
29+
* @major: the major version to compare against
30+
* @minor: the minor version to compare against
31+
*
32+
* ADI AXI IP Cores use semantic versioning, so this can be used to check for
33+
* feature availability.
34+
*
35+
* Return: true if the version is greater than or equal to the specified
36+
* major and minor version, false otherwise.
37+
*/
38+
static inline bool adi_axi_pcore_ver_gteq(u32 version, u32 major, u32 minor)
39+
{
40+
return ADI_AXI_PCORE_VER_MAJOR(version) > (major) ||
41+
(ADI_AXI_PCORE_VER_MAJOR(version) == (major) &&
42+
ADI_AXI_PCORE_VER_MINOR(version) >= (minor));
43+
}
44+
2445
#define ADI_AXI_INFO_FPGA_TECH(info) (((info) >> 24) & 0xff)
2546
#define ADI_AXI_INFO_FPGA_FAMILY(info) (((info) >> 16) & 0xff)
2647
#define ADI_AXI_INFO_FPGA_SPEED_GRADE(info) (((info) >> 8) & 0xff)

0 commit comments

Comments
 (0)