The regmap config tables are rather similar for various generations of
the KSZ8xxx/KSZ9xxx switches. Introduce a macro which allows generating
those tables without duplication. Note that $regalign parameter is not
used right now, but will be used in KSZ87xx series switches.

Signed-off-by: Marek Vasut <ma...@denx.de>
Cc: Andrew Lunn <and...@lunn.ch>
Cc: Florian Fainelli <f.faine...@gmail.com>
Cc: Tristram Ha <tristram...@microchip.com>
Cc: Woojung Huh <woojung....@microchip.com>
---
V2: New patch
---
 drivers/net/dsa/microchip/ksz9477_spi.c | 28 ++---------------------
 drivers/net/dsa/microchip/ksz_common.h  | 30 +++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/drivers/net/dsa/microchip/ksz9477_spi.c 
b/drivers/net/dsa/microchip/ksz9477_spi.c
index b440641f4898..29b51524cae9 100644
--- a/drivers/net/dsa/microchip/ksz9477_spi.c
+++ b/drivers/net/dsa/microchip/ksz9477_spi.c
@@ -14,36 +14,12 @@
 #include <linux/spi/spi.h>
 
 #include "ksz_priv.h"
+#include "ksz_common.h"
 
 #define SPI_ADDR_SHIFT                 24
 #define SPI_TURNAROUND_SHIFT           5
 
-/* SPI frame opcodes */
-#define KS_SPIOP_RD                    3
-#define KS_SPIOP_WR                    2
-
-#define KS_SPIOP_FLAG_MASK(opcode)             \
-       cpu_to_be16((opcode) << (SPI_ADDR_SHIFT + SPI_TURNAROUND_SHIFT))
-
-#define KSZ_REGMAP_COMMON(width)                                       \
-       {                                                               \
-               .val_bits = (width),                                    \
-               .reg_stride = (width) / 8,                              \
-               .reg_bits = SPI_ADDR_SHIFT,                             \
-               .pad_bits = SPI_TURNAROUND_SHIFT,                       \
-               .max_register = 0xF00,                                  \
-               .cache_type = REGCACHE_NONE,                            \
-               .read_flag_mask = KS_SPIOP_FLAG_MASK(KS_SPIOP_RD),      \
-               .write_flag_mask = KS_SPIOP_FLAG_MASK(KS_SPIOP_WR),     \
-               .reg_format_endian = REGMAP_ENDIAN_BIG,                 \
-               .val_format_endian = REGMAP_ENDIAN_BIG                  \
-       }
-
-static const struct regmap_config ksz9477_regmap_config[] = {
-       KSZ_REGMAP_COMMON(8),
-       KSZ_REGMAP_COMMON(16),
-       KSZ_REGMAP_COMMON(32),
-};
+KSZ_REGMAP_TABLE(ksz9477, SPI_ADDR_SHIFT, SPI_TURNAROUND_SHIFT, 0);
 
 static int ksz9477_spi_probe(struct spi_device *spi)
 {
diff --git a/drivers/net/dsa/microchip/ksz_common.h 
b/drivers/net/dsa/microchip/ksz_common.h
index 903e3e39bfd4..4d30a67c14a3 100644
--- a/drivers/net/dsa/microchip/ksz_common.h
+++ b/drivers/net/dsa/microchip/ksz_common.h
@@ -114,4 +114,34 @@ static inline void ksz_pwrite32(struct ksz_device *dev, 
int port, int offset,
        ksz_write32(dev, dev->dev_ops->get_port_addr(port, offset), data);
 }
 
+/* Regmap tables generation */
+#define KSZ_SPI_OP_RD          3
+#define KSZ_SPI_OP_WR          2
+
+#define KSZ_SPI_OP_FLAG_MASK(opcode, regbits, regpad)                  \
+       cpu_to_be16((opcode) << ((regbits) + (regpad)))
+
+#define KSZ_REGMAP_ENTRY(width, regbits, regpad, regalign)             \
+       {                                                               \
+               .val_bits = (width),                                    \
+               .reg_stride = (width) / 8,                              \
+               .reg_bits = (regbits) + (regalign),                     \
+               .pad_bits = (regpad),                                   \
+               .max_register = 0xF00,                                  \
+               .cache_type = REGCACHE_NONE,                            \
+               .read_flag_mask =                                       \
+                       KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_RD, regbits, regpad), \
+               .write_flag_mask =                                      \
+                       KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_WR, regbits, regpad), \
+               .reg_format_endian = REGMAP_ENDIAN_BIG,                 \
+               .val_format_endian = REGMAP_ENDIAN_BIG                  \
+       }
+
+#define KSZ_REGMAP_TABLE(ksz, regbits, regpad, regalign)               \
+       static const struct regmap_config ksz##_regmap_config[] = {     \
+               KSZ_REGMAP_ENTRY(8, (regbits), (regpad), (regalign)),   \
+               KSZ_REGMAP_ENTRY(16, (regbits), (regpad), (regalign)),  \
+               KSZ_REGMAP_ENTRY(32, (regbits), (regpad), (regalign)),  \
+       }
+
 #endif
-- 
2.19.2

Reply via email to