summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Bostic <cbostic@linux.vnet.ibm.com>2017-03-09 22:12:39 +0300
committerJoel Stanley <joel@jms.id.au>2017-03-10 03:07:41 +0300
commitec62e5e4b9bb4f4e9df718fa7aa4d452fa906e1e (patch)
tree4d0506cad32c540e82c5205c1a6f4d3bc733ec94
parente97a91f178e55719b08d48af7f592b18cfd4da91 (diff)
downloadlinux-ec62e5e4b9bb4f4e9df718fa7aa4d452fa906e1e.tar.xz
drivers/fsi: Free up allocated resources on fsi-master unbind
In order to allow repeated bind/unbind operations on fsi-master the scan file created on bind must be removed. Also check for valid pointers during unregister which is the path taken during unbind. Signed-off-by: Christopher Bostic <cbostic@linux.vnet.ibm.com> Signed-off-by: Joel Stanley <joel@jms.id.au>
-rw-r--r--drivers/fsi/fsi-core.c8
-rw-r--r--drivers/fsi/fsi-master-gpio.c1
2 files changed, 5 insertions, 4 deletions
diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index b3b245a02257..3d382e6e4ecc 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -868,11 +868,11 @@ EXPORT_SYMBOL_GPL(fsi_master_register);
void fsi_master_unregister(struct fsi_master *master)
{
- if (master->idx >= 0) {
- ida_simple_remove(&master_ida, master->idx);
- master->idx = -1;
- }
+ if (!master || !master->dev || master->idx < 0)
+ return;
+ ida_simple_remove(&master_ida, master->idx);
+ master->idx = -1;
device_remove_file(master->dev, &dev_attr_fsi_ipoll_period);
fsi_master_unscan(master);
put_device(master->dev);
diff --git a/drivers/fsi/fsi-master-gpio.c b/drivers/fsi/fsi-master-gpio.c
index c92384648036..e3431c49a12b 100644
--- a/drivers/fsi/fsi-master-gpio.c
+++ b/drivers/fsi/fsi-master-gpio.c
@@ -576,6 +576,7 @@ static int fsi_master_gpio_remove(struct platform_device *pdev)
devm_gpiod_put(&pdev->dev, master->gpio_mux);
}
fsi_master_unregister(&master->master);
+ device_remove_file(&pdev->dev, &dev_attr_scan);
return 0;
}