]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: dsa: microchip: Add Microchip KSZ8863 SPI based driver support
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Tue, 27 Apr 2021 07:09:05 +0000 (09:09 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Apr 2021 21:13:24 +0000 (14:13 -0700)
Add KSZ88X3 driver support. We add support for the KXZ88X3 three port
switches using the SPI Interface.

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz8795_spi.c

index 45420c07c99fc7cf1e94181a7c5e41f98c0be5e7..85ba12aa82d818ac24f8719dc0043c3c4c113e43 100644 (file)
 #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 regmap_config rc;
        struct ksz_device *dev;
-       int i, ret;
+       struct ksz8 *ksz8;
+       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);