]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: dsa: microchip: perform the compatibility check for dev probed
authorArun Ramadoss <arun.ramadoss@microchip.com>
Tue, 17 May 2022 09:43:27 +0000 (15:13 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 May 2022 11:50:59 +0000 (12:50 +0100)
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>
drivers/net/dsa/microchip/ksz8795_spi.c
drivers/net/dsa/microchip/ksz8863_smi.c
drivers/net/dsa/microchip/ksz9477_i2c.c
drivers/net/dsa/microchip/ksz9477_spi.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h

index 5f8d94aee774c82571efc9387fed2e9798de1c0f..961a74c359a8038a8dbd18e5a2b82eaea1594e6b 100644 (file)
@@ -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;
@@ -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;
@@ -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);
index 5883fa7edda2271c59aa35ba6439fee24a4c23cf..b6f99e641dcabc36b74893b6850a3bcd55af0ab3 100644 (file)
@@ -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);
index cbc0b20e7e1bc9179e5cfe04d3fa2e6771763828..faa3163c86b05a55c72f4d32d0d1f2228fa9132b 100644 (file)
@@ -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);
index 87ca464dad323334eba49e7943860d9e295bb028..1bc8b0cbe45833e2ebf408bc7243d48ee06b1488 100644 (file)
@@ -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);
index ebb4753051d413c3ff0fa44deb8fb90e3a1e96c6..09048e5e7ff20ffbfa4e26e1613d026debe0bada 100644 (file)
@@ -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>
@@ -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",
@@ -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)
 {
@@ -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;
@@ -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;
index a8f73e9a63ac91296776ad30af4d56b8d6869505..b526f8027eea7daab74f8c8123fa0203c8f77a70 100644 (file)
@@ -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 */