gpu: host1x: Call ->remove() only when a device is bound
When a driver's ->probe() function fails, the host1x bus must not call its ->remove() function because the driver will already have cleaned up in the error handling path in ->probe(). Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
parent
281d1bbd34
commit
536e171522
|
@ -116,7 +116,10 @@ static void host1x_subdev_register(struct host1x_device *device,
|
|||
if (list_empty(&device->subdevs)) {
|
||||
err = device->driver->probe(device);
|
||||
if (err < 0)
|
||||
dev_err(&device->dev, "probe failed: %d\n", err);
|
||||
dev_err(&device->dev, "probe failed for %ps: %d\n",
|
||||
device->driver, err);
|
||||
else
|
||||
device->bound = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,10 +133,12 @@ static void __host1x_subdev_unregister(struct host1x_device *device,
|
|||
* If all subdevices have been activated, we're about to remove the
|
||||
* first active subdevice, so unload the driver first.
|
||||
*/
|
||||
if (list_empty(&device->subdevs)) {
|
||||
if (list_empty(&device->subdevs) && device->bound) {
|
||||
err = device->driver->remove(device);
|
||||
if (err < 0)
|
||||
dev_err(&device->dev, "remove failed: %d\n", err);
|
||||
|
||||
device->bound = false;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -272,6 +272,8 @@ struct host1x_device {
|
|||
|
||||
struct mutex clients_lock;
|
||||
struct list_head clients;
|
||||
|
||||
bool bound;
|
||||
};
|
||||
|
||||
static inline struct host1x_device *to_host1x_device(struct device *dev)
|
||||
|
|
Loading…
Reference in New Issue