mei: bus: revamp probe and remove functions
authorTomas Winkler <tomas.winkler@intel.com>
Thu, 23 Jul 2015 12:08:40 +0000 (15:08 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Aug 2015 00:21:58 +0000 (17:21 -0700)
Instead of generating device id on the fly during probing we
find the matching id entry on the device id table.
Get bus the module reference counter so it cannot
be unloaded after the driver has bounded to the client
device

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/bus.c

index 4955a0908d049ab4eb4c40e7407a91b6fed24921..1d9ce9c491cf002187dc0974f29fd5a440251c0b 100644 (file)
@@ -446,30 +446,49 @@ static int mei_cl_device_match(struct device *dev, struct device_driver *drv)
        return 0;
 }
 
+/**
+ * mei_cl_device_probe - bus probe function
+ *
+ * @dev: device
+ *
+ * Return:  0 on success; < 0 otherwise
+ */
 static int mei_cl_device_probe(struct device *dev)
 {
-       struct mei_cl_device *cldev = to_mei_cl_device(dev);
+       struct mei_cl_device *cldev;
        struct mei_cl_driver *cldrv;
-       struct mei_cl_device_id id;
+       const struct mei_cl_device_id *id;
+
+       cldev = to_mei_cl_device(dev);
+       cldrv = to_mei_cl_driver(dev->driver);
 
        if (!cldev)
                return 0;
 
-       cldrv = to_mei_cl_driver(dev->driver);
        if (!cldrv || !cldrv->probe)
                return -ENODEV;
 
-       dev_dbg(dev, "Device probe\n");
+       id = mei_cl_device_find(cldev, cldrv);
+       if (!id)
+               return -ENODEV;
 
-       strlcpy(id.name, cldev->name, sizeof(id.name));
+       __module_get(THIS_MODULE);
 
-       return cldrv->probe(cldev, &id);
+       return cldrv->probe(cldev, id);
 }
 
+/**
+ * mei_cl_device_remove - remove device from the bus
+ *
+ * @dev: device
+ *
+ * Return:  0 on success; < 0 otherwise
+ */
 static int mei_cl_device_remove(struct device *dev)
 {
        struct mei_cl_device *cldev = to_mei_cl_device(dev);
        struct mei_cl_driver *cldrv;
+       int ret = 0;
 
        if (!cldev || !dev->driver)
                return 0;
@@ -480,13 +499,13 @@ static int mei_cl_device_remove(struct device *dev)
        }
 
        cldrv = to_mei_cl_driver(dev->driver);
-       if (!cldrv->remove) {
-               dev->driver = NULL;
+       if (cldrv->remove)
+               ret = cldrv->remove(cldev);
 
-               return 0;
-       }
+       module_put(THIS_MODULE);
+       dev->driver = NULL;
+       return ret;
 
-       return cldrv->remove(cldev);
 }
 
 static ssize_t name_show(struct device *dev, struct device_attribute *a,