Add KSZ88X3 driver support. We add support for the KXZ88X3 three port
switches using the SPI Interface.

Reviewed-by: Florian Fainelli <f.faine...@gmail.com>
Signed-off-by: Michael Grzeschik <m.grzesc...@pengutronix.de>

---
v1 -> v2: - this glue was not implemented
v2 -> v3: - this glue was part of previous bigger patch
v3 -> v4: - this glue was moved to this separate patch
v4 -> v5: - added reviewed by from f.fainelli
          - using device_get_match_data instead of own matching code
---
 drivers/net/dsa/microchip/ksz8795_spi.c | 44 ++++++++++++++++++-------
 1 file changed, 32 insertions(+), 12 deletions(-)

diff --git a/drivers/net/dsa/microchip/ksz8795_spi.c 
b/drivers/net/dsa/microchip/ksz8795_spi.c
index 45420c07c99fc..708f8daaedbc2 100644
--- a/drivers/net/dsa/microchip/ksz8795_spi.c
+++ b/drivers/net/dsa/microchip/ksz8795_spi.c
@@ -14,34 +14,52 @@
 #include <linux/regmap.h>
 #include <linux/spi/spi.h>
 
+#include "ksz8.h"
 #include "ksz_common.h"
 
-#define SPI_ADDR_SHIFT                 12
-#define SPI_ADDR_ALIGN                 3
-#define SPI_TURNAROUND_SHIFT           1
+#define KSZ8795_SPI_ADDR_SHIFT                 12
+#define KSZ8795_SPI_ADDR_ALIGN                 3
+#define KSZ8795_SPI_TURNAROUND_SHIFT           1
 
-KSZ_REGMAP_TABLE(ksz8795, 16, SPI_ADDR_SHIFT,
-                SPI_TURNAROUND_SHIFT, SPI_ADDR_ALIGN);
+#define KSZ8863_SPI_ADDR_SHIFT                 8
+#define KSZ8863_SPI_ADDR_ALIGN                 8
+#define KSZ8863_SPI_TURNAROUND_SHIFT           0
+
+KSZ_REGMAP_TABLE(ksz8795, 16, KSZ8795_SPI_ADDR_SHIFT,
+                KSZ8795_SPI_TURNAROUND_SHIFT, KSZ8795_SPI_ADDR_ALIGN);
+
+KSZ_REGMAP_TABLE(ksz8863, 16, KSZ8863_SPI_ADDR_SHIFT,
+                KSZ8863_SPI_TURNAROUND_SHIFT, KSZ8863_SPI_ADDR_ALIGN);
 
 static int ksz8795_spi_probe(struct spi_device *spi)
 {
+       const struct regmap_config *regmap_config;
+       struct device *ddev = &spi->dev;
+       struct ksz8 *ksz8;
        struct regmap_config rc;
        struct ksz_device *dev;
-       int i, ret;
+       int i, ret = 0;
 
-       dev = ksz_switch_alloc(&spi->dev, spi);
+       ksz8 = devm_kzalloc(&spi->dev, sizeof(struct ksz8), GFP_KERNEL);
+       ksz8->priv = spi;
+
+       dev = ksz_switch_alloc(&spi->dev, ksz8);
        if (!dev)
                return -ENOMEM;
 
+       regmap_config = device_get_match_data(ddev);
+       if (!regmap_config)
+               return -EINVAL;
+
        for (i = 0; i < ARRAY_SIZE(ksz8795_regmap_config); i++) {
-               rc = ksz8795_regmap_config[i];
+               rc = regmap_config[i];
                rc.lock_arg = &dev->regmap_mutex;
                dev->regmap[i] = devm_regmap_init_spi(spi, &rc);
                if (IS_ERR(dev->regmap[i])) {
                        ret = PTR_ERR(dev->regmap[i]);
                        dev_err(&spi->dev,
                                "Failed to initialize regmap%i: %d\n",
-                               ksz8795_regmap_config[i].val_bits, ret);
+                               regmap_config[i].val_bits, ret);
                        return ret;
                }
        }
@@ -85,9 +103,11 @@ static void ksz8795_spi_shutdown(struct spi_device *spi)
 }
 
 static const struct of_device_id ksz8795_dt_ids[] = {
-       { .compatible = "microchip,ksz8765" },
-       { .compatible = "microchip,ksz8794" },
-       { .compatible = "microchip,ksz8795" },
+       { .compatible = "microchip,ksz8765", .data = &ksz8795_regmap_config },
+       { .compatible = "microchip,ksz8794", .data = &ksz8795_regmap_config },
+       { .compatible = "microchip,ksz8795", .data = &ksz8795_regmap_config },
+       { .compatible = "microchip,ksz8863", .data = &ksz8863_regmap_config },
+       { .compatible = "microchip,ksz8873", .data = &ksz8863_regmap_config },
        {},
 };
 MODULE_DEVICE_TABLE(of, ksz8795_dt_ids);
-- 
2.29.2

Reply via email to