summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/mei/bus.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 4955a0908d04..1d9ce9c491cf 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -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,