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

Commit 512f64d9 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman
Browse files

mei: bus: add reference to bus device in struct mei_cl_client



Add reference to the bus device (mei_device) for easier access.
To ensures that referencing cldev->bus is valid during cldev life time
we increase the bus ref counter on a client device creation and drop it
on the device release.

Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent feb8cd0f
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -590,6 +590,20 @@ static struct bus_type mei_cl_bus_type = {
	.uevent		= mei_cl_device_uevent,
};

static struct mei_device *mei_dev_bus_get(struct mei_device *bus)
{
	if (bus)
		get_device(bus->dev);

	return bus;
}

static void mei_dev_bus_put(struct mei_device *bus)
{
	if (bus)
		put_device(bus->dev);
}

static void mei_cl_dev_release(struct device *dev)
{
	struct mei_cl_device *cldev = to_mei_cl_device(dev);
@@ -598,6 +612,7 @@ static void mei_cl_dev_release(struct device *dev)
		return;

	mei_me_cl_put(cldev->me_cl);
	mei_dev_bus_put(cldev->bus);
	kfree(cldev);
}

@@ -641,6 +656,7 @@ struct mei_cl_device *mei_cl_add_device(struct mei_device *bus,
	cldev->dev.parent = bus->dev;
	cldev->dev.bus = &mei_cl_bus_type;
	cldev->dev.type = &mei_cl_device_type;
	cldev->bus      = mei_dev_bus_get(bus);

	strlcpy(cldev->name, name, sizeof(cldev->name));

@@ -650,6 +666,7 @@ struct mei_cl_device *mei_cl_add_device(struct mei_device *bus,
	if (status) {
		dev_err(bus->dev, "Failed to register MEI device\n");
		mei_me_cl_put(cldev->me_cl);
		mei_dev_bus_put(bus);
		kfree(cldev);
		return NULL;
	}
+3 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/mod_devicetable.h>

struct mei_cl_device;
struct mei_device;

typedef void (*mei_cl_event_cb_t)(struct mei_cl_device *device,
			       u32 events, void *context);
@@ -17,6 +18,7 @@ typedef void (*mei_cl_event_cb_t)(struct mei_cl_device *device,
 * Drivers for MEI devices will get an mei_cl_device pointer
 * when being probed and shall use it for doing ME bus I/O.
 *
 * @bus: parent mei device
 * @dev: linux driver model device pointer
 * @me_cl: me client
 * @cl: mei client
@@ -29,6 +31,7 @@ typedef void (*mei_cl_event_cb_t)(struct mei_cl_device *device,
 * @priv_data: client private data
 */
struct mei_cl_device {
	struct mei_device *bus;
	struct device dev;

	struct mei_me_client *me_cl;