diff options
author | Thierry Reding <treding@nvidia.com> | 2017-11-08 13:08:21 +0100 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2017-12-13 13:42:03 +0100 |
commit | 8f7da1578e90bf1af30269dc6dd8806c96e9c683 (patch) | |
tree | b5b2627f90afa9ae02ecd711e78b8200eef80cb5 | |
parent | gpu: host1x: Rewrite conditional for better readability (diff) | |
download | linux-8f7da1578e90bf1af30269dc6dd8806c96e9c683.tar.xz linux-8f7da1578e90bf1af30269dc6dd8806c96e9c683.zip |
gpu: host1x: Cleanup on initialization failure
When an error happens during the initialization of one of the sub-
devices, make sure to properly cleanup all sub-devices that have been
initialized up to that point.
Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r-- | drivers/gpu/host1x/bus.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpu/host1x/bus.c b/drivers/gpu/host1x/bus.c index 2e57c9cea696..88a3558b7916 100644 --- a/drivers/gpu/host1x/bus.c +++ b/drivers/gpu/host1x/bus.c @@ -211,8 +211,7 @@ int host1x_device_init(struct host1x_device *device) dev_err(&device->dev, "failed to initialize %s: %d\n", dev_name(client->dev), err); - mutex_unlock(&device->clients_lock); - return err; + goto teardown; } } } @@ -220,6 +219,14 @@ int host1x_device_init(struct host1x_device *device) mutex_unlock(&device->clients_lock); return 0; + +teardown: + list_for_each_entry_continue_reverse(client, &device->clients, list) + if (client->ops->exit) + client->ops->exit(client); + + mutex_unlock(&device->clients_lock); + return err; } EXPORT_SYMBOL(host1x_device_init); |