net: dsa: microchip: Add Microchip KSZ8863 SPI based driver support
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>
This commit is contained in:
parent
4b20a07e10
commit
cc13e52c3a
@ -14,34 +14,52 @@
|
|||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
|
|
||||||
|
#include "ksz8.h"
|
||||||
#include "ksz_common.h"
|
#include "ksz_common.h"
|
||||||
|
|
||||||
#define SPI_ADDR_SHIFT 12
|
#define KSZ8795_SPI_ADDR_SHIFT 12
|
||||||
#define SPI_ADDR_ALIGN 3
|
#define KSZ8795_SPI_ADDR_ALIGN 3
|
||||||
#define SPI_TURNAROUND_SHIFT 1
|
#define KSZ8795_SPI_TURNAROUND_SHIFT 1
|
||||||
|
|
||||||
KSZ_REGMAP_TABLE(ksz8795, 16, SPI_ADDR_SHIFT,
|
#define KSZ8863_SPI_ADDR_SHIFT 8
|
||||||
SPI_TURNAROUND_SHIFT, SPI_ADDR_ALIGN);
|
#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)
|
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 regmap_config rc;
|
||||||
struct ksz_device *dev;
|
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)
|
if (!dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
regmap_config = device_get_match_data(ddev);
|
||||||
|
if (!regmap_config)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(ksz8795_regmap_config); i++) {
|
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;
|
rc.lock_arg = &dev->regmap_mutex;
|
||||||
dev->regmap[i] = devm_regmap_init_spi(spi, &rc);
|
dev->regmap[i] = devm_regmap_init_spi(spi, &rc);
|
||||||
if (IS_ERR(dev->regmap[i])) {
|
if (IS_ERR(dev->regmap[i])) {
|
||||||
ret = PTR_ERR(dev->regmap[i]);
|
ret = PTR_ERR(dev->regmap[i]);
|
||||||
dev_err(&spi->dev,
|
dev_err(&spi->dev,
|
||||||
"Failed to initialize regmap%i: %d\n",
|
"Failed to initialize regmap%i: %d\n",
|
||||||
ksz8795_regmap_config[i].val_bits, ret);
|
regmap_config[i].val_bits, ret);
|
||||||
return 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[] = {
|
static const struct of_device_id ksz8795_dt_ids[] = {
|
||||||
{ .compatible = "microchip,ksz8765" },
|
{ .compatible = "microchip,ksz8765", .data = &ksz8795_regmap_config },
|
||||||
{ .compatible = "microchip,ksz8794" },
|
{ .compatible = "microchip,ksz8794", .data = &ksz8795_regmap_config },
|
||||||
{ .compatible = "microchip,ksz8795" },
|
{ .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);
|
MODULE_DEVICE_TABLE(of, ksz8795_dt_ids);
|
||||||
|
Loading…
Reference in New Issue
Block a user