Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 536e1715 authored by Thierry Reding's avatar Thierry Reding
Browse files

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: default avatarThierry Reding <treding@nvidia.com>
parent 281d1bbd
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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;
	}

	/*
+2 −0
Original line number Diff line number Diff line
@@ -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)