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;
        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;
 }
 
 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);
 
 }
 
 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);
 
 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);
 
 }
 
 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);
 
 #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>
        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",
                .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)
 {
        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;
        /* 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;
 
 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 */