]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fsi: Create bus specific probe and remove functions
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Tue, 9 Dec 2025 11:40:31 +0000 (12:40 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Jan 2026 15:35:36 +0000 (16:35 +0100)
Introduce a bus specific probe and remove function. For now this only
allows to get rid of a cast of the generic device to an fsi device in
the drivers and changes the remove prototype to return void---a non-zero
return value is ignored anyhow.

The objective is to get rid of users of struct device callbacks
.probe(), .remove() and .shutdown() to eventually remove these.

Until all fsi drivers are converted this results in a runtime warning
about the drivers needing an update because there is a bus probe
function and a driver probe function.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Acked-by: Eddie James <eajames@linux.ibm.com>
Link: https://patch.msgid.link/3b53adb75a5ae7894736d46cb6eb85f5ef36520e.1765279318.git.u.kleine-koenig@baylibre.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/fsi/fsi-core.c
include/linux/fsi.h

index 4e60d4b17c11643046c2ba792b13dba22825ea27..83599a1c548b17241a0180cd7355b3cdbda25bc4 100644 (file)
@@ -128,9 +128,31 @@ static int fsi_bus_match(struct device *dev, const struct device_driver *drv)
        return 0;
 }
 
+static int fsi_probe(struct device *dev)
+{
+       struct fsi_device *fsidev = to_fsi_dev(dev);
+       struct fsi_driver *fsidrv = to_fsi_drv(dev->driver);
+
+       if (fsidrv->probe)
+               return fsidrv->probe(fsidev);
+       else
+               return 0;
+}
+
+static void fsi_remove(struct device *dev)
+{
+       struct fsi_device *fsidev = to_fsi_dev(dev);
+       struct fsi_driver *fsidrv = to_fsi_drv(dev->driver);
+
+       if (fsidrv->remove)
+               fsidrv->remove(fsidev);
+}
+
 static const struct bus_type fsi_bus_type = {
        .name = "fsi",
        .match = fsi_bus_match,
+       .probe = fsi_probe,
+       .remove = fsi_remove,
 };
 
 /*
@@ -1392,6 +1414,25 @@ void fsi_master_unregister(struct fsi_master *master)
 }
 EXPORT_SYMBOL_GPL(fsi_master_unregister);
 
+static int fsi_legacy_probe(struct fsi_device *fsidev)
+{
+       struct device *dev = &fsidev->dev;
+       struct device_driver *driver = dev->driver;
+
+       return driver->probe(dev);
+}
+
+static void fsi_legacy_remove(struct fsi_device *fsidev)
+{
+       struct device *dev = &fsidev->dev;
+       struct device_driver *driver = dev->driver;
+       int ret;
+
+       ret = driver->remove(dev);
+       if (unlikely(ret))
+               dev_warn(dev, "Ignoring return value of remove callback (%pe)\n", ERR_PTR(ret));
+}
+
 int fsi_driver_register(struct fsi_driver *fsi_drv)
 {
        if (!fsi_drv)
@@ -1401,6 +1442,15 @@ int fsi_driver_register(struct fsi_driver *fsi_drv)
 
        fsi_drv->drv.bus = &fsi_bus_type;
 
+       /*
+        * This driver needs updating. Note that driver_register() warns about
+        * this, so we're not adding another warning here.
+        */
+       if (!fsi_drv->probe && fsi_drv->drv.probe)
+               fsi_drv->probe = fsi_legacy_probe;
+       if (!fsi_drv->remove && fsi_drv->drv.remove)
+               fsi_drv->remove = fsi_legacy_remove;
+
        return driver_register(&fsi_drv->drv);
 }
 EXPORT_SYMBOL_GPL(fsi_driver_register);
index 3e3a8f3adac38f1ee09710f89acd0b138d271f01..9c67c43f9e6cdfb89250121f56f9f28001b154a5 100644 (file)
@@ -49,6 +49,8 @@ struct fsi_device_id {
        .engine_type = (t), .version = (v),
 
 struct fsi_driver {
+       int (*probe)(struct fsi_device *fsidev);
+       void (*remove)(struct fsi_device *fsidev);
        struct device_driver            drv;
        const struct fsi_device_id      *id_table;
 };