net: dsa: microchip: Factor out regmap config generation into common header
authorMarek Vasut <marex@denx.de>
Tue, 25 Jun 2019 23:43:47 +0000 (01:43 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 27 Jun 2019 18:00:32 +0000 (11:00 -0700)
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 <marex@denx.de>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: Tristram Ha <Tristram.Ha@microchip.com>
Cc: Woojung Huh <Woojung.Huh@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz9477_spi.c
drivers/net/dsa/microchip/ksz_common.h

index d1ffdf51d58c740b48f4d70db1448b149b827782..5a9e27b337a8296839442c21b2db005fd3179eac 100644 (file)
 #include <linux/spi/spi.h>
 
 #include "ksz_priv.h"
+#include "ksz_common.h"
 
 #define SPI_ADDR_SHIFT                 24
 #define SPI_ADDR_ALIGN                 3
 #define SPI_TURNAROUND_SHIFT           5
 
-/* SPI frame opcodes */
-#define KS_SPIOP_RD                    3
-#define KS_SPIOP_WR                    2
-
-#define KS_SPIOP_FLAG_MASK(opcode)             \
-       swab32((opcode) << (SPI_ADDR_SHIFT + SPI_TURNAROUND_SHIFT))
-
-#define KSZ_REGMAP_COMMON(width)                                       \
-       {                                                               \
-               .val_bits = (width),                                    \
-               .reg_stride = (width) / 8,                              \
-               .reg_bits = SPI_ADDR_SHIFT + SPI_ADDR_ALIGN,            \
-               .pad_bits = SPI_TURNAROUND_SHIFT,                       \
-               .max_register = BIT(SPI_ADDR_SHIFT) - 1,                \
-               .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, 32, SPI_ADDR_SHIFT,
+                SPI_TURNAROUND_SHIFT, SPI_ADDR_ALIGN);
 
 static int ksz9477_spi_probe(struct spi_device *spi)
 {
index c3871ed9b0977f150b55ae65f450e3d329bd720c..745318424f7139b24c8a64224098cb51a4c9ccae 100644 (file)
@@ -133,4 +133,36 @@ static inline u32 ksz_pread32_poll(struct ksz_poll_ctx *ctx)
        return data;
 }
 
+/* Regmap tables generation */
+#define KSZ_SPI_OP_RD          3
+#define KSZ_SPI_OP_WR          2
+
+#define KSZ_SPI_OP_FLAG_MASK(opcode, swp, regbits, regpad)             \
+       swab##swp((opcode) << ((regbits) + (regpad)))
+
+#define KSZ_REGMAP_ENTRY(width, swp, regbits, regpad, regalign)                \
+       {                                                               \
+               .val_bits = (width),                                    \
+               .reg_stride = (width) / 8,                              \
+               .reg_bits = (regbits) + (regalign),                     \
+               .pad_bits = (regpad),                                   \
+               .max_register = BIT(regbits) - 1,                       \
+               .cache_type = REGCACHE_NONE,                            \
+               .read_flag_mask =                                       \
+                       KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_RD, swp,        \
+                                            regbits, regpad),          \
+               .write_flag_mask =                                      \
+                       KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_WR, swp,        \
+                                            regbits, regpad),          \
+               .reg_format_endian = REGMAP_ENDIAN_BIG,                 \
+               .val_format_endian = REGMAP_ENDIAN_BIG                  \
+       }
+
+#define KSZ_REGMAP_TABLE(ksz, swp, regbits, regpad, regalign)          \
+       static const struct regmap_config ksz##_regmap_config[] = {     \
+               KSZ_REGMAP_ENTRY(8, swp, (regbits), (regpad), (regalign)), \
+               KSZ_REGMAP_ENTRY(16, swp, (regbits), (regpad), (regalign)), \
+               KSZ_REGMAP_ENTRY(32, swp, (regbits), (regpad), (regalign)), \
+       }
+
 #endif