summaryrefslogtreecommitdiff
path: root/drivers/fsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/fsi')
-rw-r--r--drivers/fsi/fsi-core.c107
-rw-r--r--drivers/fsi/fsi-master-hub.c17
-rw-r--r--drivers/fsi/fsi-sbefifo.c31
-rw-r--r--drivers/fsi/fsi-scom.c30
-rw-r--r--drivers/fsi/i2cr-scom.c15
5 files changed, 109 insertions, 91 deletions
diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index c6c115993ebc..83599a1c548b 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -100,6 +100,61 @@ static int fsi_master_write(struct fsi_master *master, int link,
uint8_t slave_id, uint32_t addr, const void *val, size_t size);
static int fsi_master_break(struct fsi_master *master, int link);
+/* FSI core & Linux bus type definitions */
+
+static int fsi_bus_match(struct device *dev, const struct device_driver *drv)
+{
+ struct fsi_device *fsi_dev = to_fsi_dev(dev);
+ const struct fsi_driver *fsi_drv = to_fsi_drv(drv);
+ const struct fsi_device_id *id;
+
+ if (!fsi_drv->id_table)
+ return 0;
+
+ for (id = fsi_drv->id_table; id->engine_type; id++) {
+ if (id->engine_type != fsi_dev->engine_type)
+ continue;
+ if (id->version == FSI_VERSION_ANY ||
+ id->version == fsi_dev->version) {
+ if (drv->of_match_table) {
+ if (of_driver_match_device(dev, drv))
+ return 1;
+ } else {
+ return 1;
+ }
+ }
+ }
+
+ 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,
+};
+
/*
* fsi_device_read() / fsi_device_write() / fsi_device_peek()
*
@@ -1359,32 +1414,23 @@ void fsi_master_unregister(struct fsi_master *master)
}
EXPORT_SYMBOL_GPL(fsi_master_unregister);
-/* FSI core & Linux bus type definitions */
-
-static int fsi_bus_match(struct device *dev, const struct device_driver *drv)
+static int fsi_legacy_probe(struct fsi_device *fsidev)
{
- struct fsi_device *fsi_dev = to_fsi_dev(dev);
- const struct fsi_driver *fsi_drv = to_fsi_drv(drv);
- const struct fsi_device_id *id;
+ struct device *dev = &fsidev->dev;
+ struct device_driver *driver = dev->driver;
- if (!fsi_drv->id_table)
- return 0;
+ return driver->probe(dev);
+}
- for (id = fsi_drv->id_table; id->engine_type; id++) {
- if (id->engine_type != fsi_dev->engine_type)
- continue;
- if (id->version == FSI_VERSION_ANY ||
- id->version == fsi_dev->version) {
- if (drv->of_match_table) {
- if (of_driver_match_device(dev, drv))
- return 1;
- } else {
- return 1;
- }
- }
- }
+static void fsi_legacy_remove(struct fsi_device *fsidev)
+{
+ struct device *dev = &fsidev->dev;
+ struct device_driver *driver = dev->driver;
+ int ret;
- return 0;
+ 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)
@@ -1394,6 +1440,17 @@ int fsi_driver_register(struct fsi_driver *fsi_drv)
if (!fsi_drv->id_table)
return -EINVAL;
+ 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);
@@ -1404,12 +1461,6 @@ void fsi_driver_unregister(struct fsi_driver *fsi_drv)
}
EXPORT_SYMBOL_GPL(fsi_driver_unregister);
-const struct bus_type fsi_bus_type = {
- .name = "fsi",
- .match = fsi_bus_match,
-};
-EXPORT_SYMBOL_GPL(fsi_bus_type);
-
static int __init fsi_init(void)
{
int rc;
diff --git a/drivers/fsi/fsi-master-hub.c b/drivers/fsi/fsi-master-hub.c
index 6568fed7db3c..a84955bb23b1 100644
--- a/drivers/fsi/fsi-master-hub.c
+++ b/drivers/fsi/fsi-master-hub.c
@@ -192,9 +192,9 @@ static int hub_master_init(struct fsi_master_hub *hub)
return fsi_device_write(dev, FSI_MRESB0, &reg, sizeof(reg));
}
-static int hub_master_probe(struct device *dev)
+static int hub_master_probe(struct fsi_device *fsi_dev)
{
- struct fsi_device *fsi_dev = to_fsi_dev(dev);
+ struct device *dev = &fsi_dev->dev;
struct fsi_master_hub *hub;
uint32_t reg, links;
__be32 __reg;
@@ -235,7 +235,7 @@ static int hub_master_probe(struct device *dev)
hub->master.send_break = hub_master_break;
hub->master.link_enable = hub_master_link_enable;
- dev_set_drvdata(dev, hub);
+ fsi_set_drvdata(fsi_dev, hub);
hub_master_init(hub);
@@ -259,9 +259,9 @@ err_release:
return rc;
}
-static int hub_master_remove(struct device *dev)
+static void hub_master_remove(struct fsi_device *fsi_dev)
{
- struct fsi_master_hub *hub = dev_get_drvdata(dev);
+ struct fsi_master_hub *hub = fsi_get_drvdata(fsi_dev);
fsi_master_unregister(&hub->master);
fsi_slave_release_range(hub->upstream->slave, hub->addr, hub->size);
@@ -272,8 +272,6 @@ static int hub_master_remove(struct device *dev)
* the hub
*/
put_device(&hub->master.dev);
-
- return 0;
}
static const struct fsi_device_id hub_master_ids[] = {
@@ -286,11 +284,10 @@ static const struct fsi_device_id hub_master_ids[] = {
static struct fsi_driver hub_master_driver = {
.id_table = hub_master_ids,
+ .probe = hub_master_probe,
+ .remove = hub_master_remove,
.drv = {
.name = "fsi-master-hub",
- .bus = &fsi_bus_type,
- .probe = hub_master_probe,
- .remove = hub_master_remove,
}
};
diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index 0a98517f3959..6ca5817910cd 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -1022,9 +1022,9 @@ static void sbefifo_free(struct device *dev)
* Probe/remove
*/
-static int sbefifo_probe(struct device *dev)
+static int sbefifo_probe(struct fsi_device *fsi_dev)
{
- struct fsi_device *fsi_dev = to_fsi_dev(dev);
+ struct device *dev = &fsi_dev->dev;
struct sbefifo *sbefifo;
struct device_node *np;
struct platform_device *child;
@@ -1045,7 +1045,7 @@ static int sbefifo_probe(struct device *dev)
sbefifo->magic = SBEFIFO_MAGIC;
sbefifo->fsi_dev = fsi_dev;
- dev_set_drvdata(dev, sbefifo);
+ fsi_set_drvdata(fsi_dev, sbefifo);
mutex_init(&sbefifo->lock);
sbefifo->timeout_in_cmd_ms = SBEFIFO_TIMEOUT_IN_CMD;
sbefifo->timeout_start_rsp_ms = SBEFIFO_TIMEOUT_START_RSP;
@@ -1101,9 +1101,10 @@ static int sbefifo_unregister_child(struct device *dev, void *data)
return 0;
}
-static int sbefifo_remove(struct device *dev)
+static void sbefifo_remove(struct fsi_device *fsi_dev)
{
- struct sbefifo *sbefifo = dev_get_drvdata(dev);
+ struct device *dev = &fsi_dev->dev;
+ struct sbefifo *sbefifo = fsi_get_drvdata(fsi_dev);
dev_dbg(dev, "Removing sbefifo device...\n");
@@ -1117,8 +1118,6 @@ static int sbefifo_remove(struct device *dev)
fsi_free_minor(sbefifo->dev.devt);
device_for_each_child(dev, NULL, sbefifo_unregister_child);
put_device(&sbefifo->dev);
-
- return 0;
}
static const struct fsi_device_id sbefifo_ids[] = {
@@ -1131,26 +1130,14 @@ static const struct fsi_device_id sbefifo_ids[] = {
static struct fsi_driver sbefifo_drv = {
.id_table = sbefifo_ids,
+ .probe = sbefifo_probe,
+ .remove = sbefifo_remove,
.drv = {
.name = DEVICE_NAME,
- .bus = &fsi_bus_type,
- .probe = sbefifo_probe,
- .remove = sbefifo_remove,
}
};
-static int sbefifo_init(void)
-{
- return fsi_driver_register(&sbefifo_drv);
-}
-
-static void sbefifo_exit(void)
-{
- fsi_driver_unregister(&sbefifo_drv);
-}
-
-module_init(sbefifo_init);
-module_exit(sbefifo_exit);
+module_fsi_driver(sbefifo_drv);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Brad Bishop <bradleyb@fuzziesquirrel.com>");
MODULE_AUTHOR("Eddie James <eajames@linux.vnet.ibm.com>");
diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
index 411ddc018cd8..67cd45605fe4 100644
--- a/drivers/fsi/fsi-scom.c
+++ b/drivers/fsi/fsi-scom.c
@@ -527,16 +527,16 @@ static void scom_free(struct device *dev)
kfree(scom);
}
-static int scom_probe(struct device *dev)
+static int scom_probe(struct fsi_device *fsi_dev)
{
- struct fsi_device *fsi_dev = to_fsi_dev(dev);
+ struct device *dev = &fsi_dev->dev;
struct scom_device *scom;
int rc, didx;
scom = kzalloc(sizeof(*scom), GFP_KERNEL);
if (!scom)
return -ENOMEM;
- dev_set_drvdata(dev, scom);
+ fsi_set_drvdata(fsi_dev, scom);
mutex_init(&scom->lock);
/* Grab a reference to the device (parent of our cdev), we'll drop it later */
@@ -574,9 +574,9 @@ static int scom_probe(struct device *dev)
return rc;
}
-static int scom_remove(struct device *dev)
+static void scom_remove(struct fsi_device *fsi_dev)
{
- struct scom_device *scom = dev_get_drvdata(dev);
+ struct scom_device *scom = fsi_get_drvdata(fsi_dev);
mutex_lock(&scom->lock);
scom->dead = true;
@@ -584,8 +584,6 @@ static int scom_remove(struct device *dev)
cdev_device_del(&scom->cdev, &scom->dev);
fsi_free_minor(scom->dev.devt);
put_device(&scom->dev);
-
- return 0;
}
static const struct of_device_id scom_of_ids[] = {
@@ -604,26 +602,14 @@ static const struct fsi_device_id scom_ids[] = {
static struct fsi_driver scom_drv = {
.id_table = scom_ids,
+ .probe = scom_probe,
+ .remove = scom_remove,
.drv = {
.name = "scom",
- .bus = &fsi_bus_type,
.of_match_table = scom_of_ids,
- .probe = scom_probe,
- .remove = scom_remove,
}
};
-static int scom_init(void)
-{
- return fsi_driver_register(&scom_drv);
-}
-
-static void scom_exit(void)
-{
- fsi_driver_unregister(&scom_drv);
-}
-
-module_init(scom_init);
-module_exit(scom_exit);
+module_fsi_driver(scom_drv);
MODULE_DESCRIPTION("SCOM FSI Client device driver");
MODULE_LICENSE("GPL");
diff --git a/drivers/fsi/i2cr-scom.c b/drivers/fsi/i2cr-scom.c
index cb7e02213032..3efca2e944bb 100644
--- a/drivers/fsi/i2cr-scom.c
+++ b/drivers/fsi/i2cr-scom.c
@@ -81,9 +81,9 @@ static const struct file_operations i2cr_scom_fops = {
.write = i2cr_scom_write,
};
-static int i2cr_scom_probe(struct device *dev)
+static int i2cr_scom_probe(struct fsi_device *fsi_dev)
{
- struct fsi_device *fsi_dev = to_fsi_dev(dev);
+ struct device *dev = &fsi_dev->dev;
struct i2cr_scom *scom;
int didx;
int ret;
@@ -115,14 +115,12 @@ static int i2cr_scom_probe(struct device *dev)
return ret;
}
-static int i2cr_scom_remove(struct device *dev)
+static void i2cr_scom_remove(struct fsi_device *fsi_dev)
{
- struct i2cr_scom *scom = dev_get_drvdata(dev);
+ struct i2cr_scom *scom = dev_get_drvdata(&fsi_dev->dev);
cdev_device_del(&scom->cdev, &scom->dev);
fsi_free_minor(scom->dev.devt);
-
- return 0;
}
static const struct of_device_id i2cr_scom_of_ids[] = {
@@ -137,13 +135,12 @@ static const struct fsi_device_id i2cr_scom_ids[] = {
};
static struct fsi_driver i2cr_scom_driver = {
+ .probe = i2cr_scom_probe,
+ .remove = i2cr_scom_remove,
.id_table = i2cr_scom_ids,
.drv = {
.name = "i2cr_scom",
- .bus = &fsi_bus_type,
.of_match_table = i2cr_scom_of_ids,
- .probe = i2cr_scom_probe,
- .remove = i2cr_scom_remove,
}
};