Merge existing fixes from spi/for-5.16 into new branch
[sfrench/cifs-2.6.git] / drivers / spi / spi.c
index a2988aed984cbfc4a0f3e030c8d34f84a7234de4..fdd530b150a7abdc95a74c9399bed5242d729492 100644 (file)
@@ -450,6 +450,47 @@ int __spi_register_driver(struct module *owner, struct spi_driver *sdrv)
 {
        sdrv->driver.owner = owner;
        sdrv->driver.bus = &spi_bus_type;
+
+       /*
+        * For Really Good Reasons we use spi: modaliases not of:
+        * modaliases for DT so module autoloading won't work if we
+        * don't have a spi_device_id as well as a compatible string.
+        */
+       if (sdrv->driver.of_match_table) {
+               const struct of_device_id *of_id;
+
+               for (of_id = sdrv->driver.of_match_table; of_id->compatible[0];
+                    of_id++) {
+                       const char *of_name;
+
+                       /* Strip off any vendor prefix */
+                       of_name = strnchr(of_id->compatible,
+                                         sizeof(of_id->compatible), ',');
+                       if (of_name)
+                               of_name++;
+                       else
+                               of_name = of_id->compatible;
+
+                       if (sdrv->id_table) {
+                               const struct spi_device_id *spi_id;
+
+                               for (spi_id = sdrv->id_table; spi_id->name[0];
+                                    spi_id++)
+                                       if (strcmp(spi_id->name, of_name) == 0)
+                                               break;
+
+                               if (spi_id->name[0])
+                                       continue;
+                       } else {
+                               if (strcmp(sdrv->driver.name, of_name) == 0)
+                                       continue;
+                       }
+
+                       pr_warn("SPI driver %s has no spi_device_id for %s\n",
+                               sdrv->driver.name, of_id->compatible);
+               }
+       }
+
        return driver_register(&sdrv->driver);
 }
 EXPORT_SYMBOL_GPL(__spi_register_driver);