Skip to content

Commit

Permalink
net: dsa: microchip: perform the compatibility check for dev probed
Browse files Browse the repository at this point in the history
This patch perform the compatibility check for the device after the chip
detect is done. It is to prevent the mismatch between the device
compatible specified in the device tree and actual device found during
the detect. The ksz9477 device doesn't use any .data in the
of_device_id. But the ksz8795_spi uses .data for assigning the regmap
between 8830 family and 87xx family switch. Changed the regmap
assignment based on the chip_id from the .data.

Signed-off-by: Arun Ramadoss <arun.ramadoss@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arun Ramadoss authored and davem330 committed May 18, 2022
1 parent 462d525 commit eee16b1
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 22 deletions.
35 changes: 28 additions & 7 deletions drivers/net/dsa/microchip/ksz8795_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ KSZ_REGMAP_TABLE(ksz8863, 16, KSZ8863_SPI_ADDR_SHIFT,
static int ksz8795_spi_probe(struct spi_device *spi)
{
const struct regmap_config *regmap_config;
const struct ksz_chip_data *chip;
struct device *ddev = &spi->dev;
struct regmap_config rc;
struct ksz_device *dev;
Expand All @@ -50,10 +51,15 @@ static int ksz8795_spi_probe(struct spi_device *spi)
if (!dev)
return -ENOMEM;

regmap_config = device_get_match_data(ddev);
if (!regmap_config)
chip = device_get_match_data(ddev);
if (!chip)
return -EINVAL;

if (chip->chip_id == KSZ8830_CHIP_ID)
regmap_config = ksz8863_regmap_config;
else
regmap_config = ksz8795_regmap_config;

for (i = 0; i < ARRAY_SIZE(ksz8795_regmap_config); i++) {
rc = regmap_config[i];
rc.lock_arg = &dev->regmap_mutex;
Expand Down Expand Up @@ -113,11 +119,26 @@ static void ksz8795_spi_shutdown(struct spi_device *spi)
}

static const struct of_device_id ksz8795_dt_ids[] = {
{ .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 },
{
.compatible = "microchip,ksz8765",
.data = &ksz_switch_chips[KSZ8765]
},
{
.compatible = "microchip,ksz8794",
.data = &ksz_switch_chips[KSZ8794]
},
{
.compatible = "microchip,ksz8795",
.data = &ksz_switch_chips[KSZ8795]
},
{
.compatible = "microchip,ksz8863",
.data = &ksz_switch_chips[KSZ8830]
},
{
.compatible = "microchip,ksz8873",
.data = &ksz_switch_chips[KSZ8830]
},
{},
};
MODULE_DEVICE_TABLE(of, ksz8795_dt_ids);
Expand Down
10 changes: 8 additions & 2 deletions drivers/net/dsa/microchip/ksz8863_smi.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,14 @@ static void ksz8863_smi_shutdown(struct mdio_device *mdiodev)
}

static const struct of_device_id ksz8863_dt_ids[] = {
{ .compatible = "microchip,ksz8863" },
{ .compatible = "microchip,ksz8873" },
{
.compatible = "microchip,ksz8863",
.data = &ksz_switch_chips[KSZ8830]
},
{
.compatible = "microchip,ksz8873",
.data = &ksz_switch_chips[KSZ8830]
},
{ },
};
MODULE_DEVICE_TABLE(of, ksz8863_dt_ids);
Expand Down
30 changes: 24 additions & 6 deletions drivers/net/dsa/microchip/ksz9477_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,30 @@ static const struct i2c_device_id ksz9477_i2c_id[] = {
MODULE_DEVICE_TABLE(i2c, ksz9477_i2c_id);

static const struct of_device_id ksz9477_dt_ids[] = {
{ .compatible = "microchip,ksz9477" },
{ .compatible = "microchip,ksz9897" },
{ .compatible = "microchip,ksz9893" },
{ .compatible = "microchip,ksz9563" },
{ .compatible = "microchip,ksz9567" },
{ .compatible = "microchip,ksz8563" },
{
.compatible = "microchip,ksz9477",
.data = &ksz_switch_chips[KSZ9477]
},
{
.compatible = "microchip,ksz9897",
.data = &ksz_switch_chips[KSZ9897]
},
{
.compatible = "microchip,ksz9893",
.data = &ksz_switch_chips[KSZ9893]
},
{
.compatible = "microchip,ksz9563",
.data = &ksz_switch_chips[KSZ9893]
},
{
.compatible = "microchip,ksz8563",
.data = &ksz_switch_chips[KSZ9893]
},
{
.compatible = "microchip,ksz9567",
.data = &ksz_switch_chips[KSZ9567]
},
{},
};
MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);
Expand Down
30 changes: 24 additions & 6 deletions drivers/net/dsa/microchip/ksz9477_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,30 @@ static void ksz9477_spi_shutdown(struct spi_device *spi)
}

static const struct of_device_id ksz9477_dt_ids[] = {
{ .compatible = "microchip,ksz9477" },
{ .compatible = "microchip,ksz9897" },
{ .compatible = "microchip,ksz9893" },
{ .compatible = "microchip,ksz9563" },
{ .compatible = "microchip,ksz8563" },
{ .compatible = "microchip,ksz9567" },
{
.compatible = "microchip,ksz9477",
.data = &ksz_switch_chips[KSZ9477]
},
{
.compatible = "microchip,ksz9897",
.data = &ksz_switch_chips[KSZ9897]
},
{
.compatible = "microchip,ksz9893",
.data = &ksz_switch_chips[KSZ9893]
},
{
.compatible = "microchip,ksz9563",
.data = &ksz_switch_chips[KSZ9893]
},
{
.compatible = "microchip,ksz8563",
.data = &ksz_switch_chips[KSZ9893]
},
{
.compatible = "microchip,ksz9567",
.data = &ksz_switch_chips[KSZ9567]
},
{},
};
MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);
Expand Down
25 changes: 24 additions & 1 deletion drivers/net/dsa/microchip/ksz_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/phy.h>
#include <linux/etherdevice.h>
#include <linux/if_bridge.h>
#include <linux/of_device.h>
#include <linux/of_net.h>
#include <net/dsa.h>
#include <net/switchdev.h>
Expand Down Expand Up @@ -59,7 +60,7 @@ struct ksz_stats_raw {
u64 tx_discards;
};

static const struct ksz_chip_data ksz_switch_chips[] = {
const struct ksz_chip_data ksz_switch_chips[] = {
[KSZ8795] = {
.chip_id = KSZ8795_CHIP_ID,
.dev_name = "KSZ8795",
Expand Down Expand Up @@ -210,6 +211,7 @@ static const struct ksz_chip_data ksz_switch_chips[] = {
.port_cnt = 8, /* total physical port count */
},
};
EXPORT_SYMBOL_GPL(ksz_switch_chips);

static const struct ksz_chip_data *ksz_lookup_info(unsigned int prod_num)
{
Expand All @@ -225,6 +227,23 @@ static const struct ksz_chip_data *ksz_lookup_info(unsigned int prod_num)
return NULL;
}

static int ksz_check_device_id(struct ksz_device *dev)
{
const struct ksz_chip_data *dt_chip_data;

dt_chip_data = of_device_get_match_data(dev->dev);

/* Check for Device Tree and Chip ID */
if (dt_chip_data->chip_id != dev->chip_id) {
dev_err(dev->dev,
"Device tree specifies chip %s but found %s, please fix it!\n",
dt_chip_data->dev_name, dev->info->dev_name);
return -ENODEV;
}

return 0;
}

void ksz_r_mib_stats64(struct ksz_device *dev, int port)
{
struct rtnl_link_stats64 *stats;
Expand Down Expand Up @@ -741,6 +760,10 @@ int ksz_switch_register(struct ksz_device *dev,
/* Update the compatible info with the probed one */
dev->info = info;

ret = ksz_check_device_id(dev);
if (ret)
return ret;

ret = dev->dev_ops->init(dev);
if (ret)
return ret;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/dsa/microchip/ksz_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ void ksz_init_mib_timer(struct ksz_device *dev);
void ksz_r_mib_stats64(struct ksz_device *dev, int port);
void ksz_get_stats64(struct dsa_switch *ds, int port,
struct rtnl_link_stats64 *s);
extern const struct ksz_chip_data ksz_switch_chips[];

/* Common DSA access functions */

Expand Down

0 comments on commit eee16b1

Please sign in to comment.