Merge branch 'add-ksz9567-with-I2C-support-to-ksz9477-driver'
George McCollister says: ==================== add ksz9567 with I2C support to ksz9477 driver Resurrect KSZ9477 I2C driver support patch originally sent to the list by Tristram Ha and resolve outstanding issues. It now works as similarly to the ksz9477 SPI driver as possible, using the same regmap macros. Add support for ksz9567 to the ksz9477 driver (tested on a board with ksz9567 connected via I2C). Remove NET_DSA_TAG_KSZ_COMMON since it's not needed. Changes since v1: Put ksz9477_i2c.c includes in alphabetical order. Added Reviewed-Bys. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
837636f586
@ -9,6 +9,13 @@ menuconfig NET_DSA_MICROCHIP_KSZ9477
|
||||
help
|
||||
This driver adds support for Microchip KSZ9477 switch chips.
|
||||
|
||||
config NET_DSA_MICROCHIP_KSZ9477_I2C
|
||||
tristate "KSZ9477 series I2C connected switch driver"
|
||||
depends on NET_DSA_MICROCHIP_KSZ9477 && I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Select to enable support for registering switches configured through I2C.
|
||||
|
||||
config NET_DSA_MICROCHIP_KSZ9477_SPI
|
||||
tristate "KSZ9477 series SPI connected switch driver"
|
||||
depends on NET_DSA_MICROCHIP_KSZ9477 && SPI
|
||||
|
@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON) += ksz_common.o
|
||||
obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ9477) += ksz9477.o
|
||||
obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C) += ksz9477_i2c.o
|
||||
obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ9477_SPI) += ksz9477_spi.o
|
||||
obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ8795) += ksz8795.o
|
||||
obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ8795_SPI) += ksz8795_spi.o
|
||||
|
@ -1529,6 +1529,15 @@ static const struct ksz_chip_data ksz9477_switch_chips[] = {
|
||||
.cpu_ports = 0x07, /* can be configured as cpu port */
|
||||
.port_cnt = 3, /* total port count */
|
||||
},
|
||||
{
|
||||
.chip_id = 0x00956700,
|
||||
.dev_name = "KSZ9567",
|
||||
.num_vlans = 4096,
|
||||
.num_alus = 4096,
|
||||
.num_statics = 16,
|
||||
.cpu_ports = 0x7F, /* can be configured as cpu port */
|
||||
.port_cnt = 7, /* total physical port count */
|
||||
},
|
||||
};
|
||||
|
||||
static int ksz9477_switch_init(struct ksz_device *dev)
|
||||
|
101
drivers/net/dsa/microchip/ksz9477_i2c.c
Normal file
101
drivers/net/dsa/microchip/ksz9477_i2c.c
Normal file
@ -0,0 +1,101 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Microchip KSZ9477 series register access through I2C
|
||||
*
|
||||
* Copyright (C) 2018-2019 Microchip Technology Inc.
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "ksz_common.h"
|
||||
|
||||
KSZ_REGMAP_TABLE(ksz9477, not_used, 16, 0, 0);
|
||||
|
||||
static int ksz9477_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *i2c_id)
|
||||
{
|
||||
struct ksz_device *dev;
|
||||
int i, ret;
|
||||
|
||||
dev = ksz_switch_alloc(&i2c->dev, i2c);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ksz9477_regmap_config); i++) {
|
||||
dev->regmap[i] = devm_regmap_init_i2c(i2c,
|
||||
&ksz9477_regmap_config[i]);
|
||||
if (IS_ERR(dev->regmap[i])) {
|
||||
ret = PTR_ERR(dev->regmap[i]);
|
||||
dev_err(&i2c->dev,
|
||||
"Failed to initialize regmap%i: %d\n",
|
||||
ksz9477_regmap_config[i].val_bits, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (i2c->dev.platform_data)
|
||||
dev->pdata = i2c->dev.platform_data;
|
||||
|
||||
ret = ksz9477_switch_register(dev);
|
||||
|
||||
/* Main DSA driver may not be started yet. */
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
i2c_set_clientdata(i2c, dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ksz9477_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
struct ksz_device *dev = i2c_get_clientdata(i2c);
|
||||
|
||||
ksz_switch_remove(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ksz9477_i2c_shutdown(struct i2c_client *i2c)
|
||||
{
|
||||
struct ksz_device *dev = i2c_get_clientdata(i2c);
|
||||
|
||||
if (dev && dev->dev_ops->shutdown)
|
||||
dev->dev_ops->shutdown(dev);
|
||||
}
|
||||
|
||||
static const struct i2c_device_id ksz9477_i2c_id[] = {
|
||||
{ "ksz9477-switch", 0 },
|
||||
{},
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(i2c, ksz9477_i2c_id);
|
||||
|
||||
static const struct of_device_id ksz9477_dt_ids[] = {
|
||||
{ .compatible = "microchip,ksz9477" },
|
||||
{ .compatible = "microchip,ksz9897" },
|
||||
{ .compatible = "microchip,ksz9567" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);
|
||||
|
||||
static struct i2c_driver ksz9477_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "ksz9477-switch",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(ksz9477_dt_ids),
|
||||
},
|
||||
.probe = ksz9477_i2c_probe,
|
||||
.remove = ksz9477_i2c_remove,
|
||||
.shutdown = ksz9477_i2c_shutdown,
|
||||
.id_table = ksz9477_i2c_id,
|
||||
};
|
||||
|
||||
module_i2c_driver(ksz9477_i2c_driver);
|
||||
|
||||
MODULE_AUTHOR("Tristram Ha <Tristram.Ha@microchip.com>");
|
||||
MODULE_DESCRIPTION("Microchip KSZ9477 Series Switch I2C access Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -81,6 +81,7 @@ static const struct of_device_id ksz9477_dt_ids[] = {
|
||||
{ .compatible = "microchip,ksz9893" },
|
||||
{ .compatible = "microchip,ksz9563" },
|
||||
{ .compatible = "microchip,ksz8563" },
|
||||
{ .compatible = "microchip,ksz9567" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);
|
||||
|
@ -294,6 +294,8 @@ static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
|
||||
#define KSZ_SPI_OP_RD 3
|
||||
#define KSZ_SPI_OP_WR 2
|
||||
|
||||
#define swabnot_used(x) 0
|
||||
|
||||
#define KSZ_SPI_OP_FLAG_MASK(opcode, swp, regbits, regpad) \
|
||||
swab##swp((opcode) << ((regbits) + (regpad)))
|
||||
|
||||
|
@ -73,16 +73,11 @@ config NET_DSA_TAG_MTK
|
||||
Say Y or M if you want to enable support for tagging frames for
|
||||
Mediatek switches.
|
||||
|
||||
config NET_DSA_TAG_KSZ_COMMON
|
||||
tristate
|
||||
default n
|
||||
|
||||
config NET_DSA_TAG_KSZ
|
||||
tristate "Tag driver for Microchip 9893 family of switches"
|
||||
select NET_DSA_TAG_KSZ_COMMON
|
||||
tristate "Tag driver for Microchip 8795/9477/9893 families of switches"
|
||||
help
|
||||
Say Y if you want to enable support for tagging frames for the
|
||||
Microchip 9893 family of switches.
|
||||
Microchip 8795/9477/9893 families of switches.
|
||||
|
||||
config NET_DSA_TAG_QCA
|
||||
tristate "Tag driver for Qualcomm Atheros QCA8K switches"
|
||||
|
@ -9,7 +9,7 @@ obj-$(CONFIG_NET_DSA_TAG_BRCM_COMMON) += tag_brcm.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_GSWIP) += tag_gswip.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_KSZ_COMMON) += tag_ksz.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_KSZ) += tag_ksz.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_LAN9303) += tag_lan9303.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_MTK) += tag_mtk.o
|
||||
obj-$(CONFIG_NET_DSA_TAG_QCA) += tag_qca.o
|
||||
|
Loading…
Reference in New Issue
Block a user