Commit e5646710 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

greybus: module: get rid of global list of modules



Use the list that the driver core keeps of our structure, no need to
duplicate it with a local list as well.  This gets rid of a static lock
too, always a nice thing to do.

Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
Reviewed-by: default avatarAlex Elder <elder@linaro.org>
parent 2c07817e
Loading
Loading
Loading
Loading
+22 −27
Original line number Diff line number Diff line
@@ -10,14 +10,6 @@
#include "greybus.h"


/*
 * List of modules in the system.  We really should just walk the list the
 * driver core provides us, but as we have lots of different things on the same
 * "bus" at the same time, a single list of modules is simplest for now.
 */
static DEFINE_SPINLOCK(gb_modules_lock);
static LIST_HEAD(module_list);

/* module sysfs attributes */
#define gb_module_attr(field, type)					\
static ssize_t field##_show(struct device *dev,				\
@@ -58,10 +50,6 @@ static void greybus_module_release(struct device *dev)
{
	struct gb_module *module = to_gb_module(dev);

	spin_lock(&gb_modules_lock);
	list_del(&module->list);
	spin_unlock(&gb_modules_lock);

	kfree(module);
}

@@ -70,24 +58,35 @@ struct device_type greybus_module_type = {
	.release =	greybus_module_release,
};

static int module_find(struct device *dev, void *data)
{
	struct gb_module *module;
	u8 *module_id = data;

	if (!is_gb_module(dev))
		return 0;

	module = to_gb_module(dev);
	if (module->module_id == *module_id)
		return 1;

	return 0;
}

/*
 * Search the list of modules in the system.  If one is found, return it, with
 * the reference count incremented.
 */
static struct gb_module *gb_module_find(u8 module_id)
{
	struct gb_module *module;
	struct device *dev;
	struct gb_module *module = NULL;

	dev = bus_find_device(&greybus_bus_type, NULL,
			      &module_id, module_find);
	if (dev)
		module = to_gb_module(dev);

	spin_lock(&gb_modules_lock);
	list_for_each_entry(module, &module_list, list) {
		if (module->module_id == module_id) {
			get_device(&module->dev);
			goto exit;
		}
	}
	module = NULL;
exit:
	spin_unlock(&gb_modules_lock);
	return module;
}

@@ -119,10 +118,6 @@ static struct gb_module *gb_module_create(struct greybus_host_device *hd,
		return NULL;
	}

	spin_lock(&gb_modules_lock);
	list_add_tail(&module->list, &module_list);
	spin_unlock(&gb_modules_lock);

	return module;
}

+0 −2
Original line number Diff line number Diff line
@@ -12,8 +12,6 @@
/* Greybus "public" definitions" */
struct gb_module {
	struct device dev;

	struct list_head list;
	u8 module_id;		/* Physical location within the Endo */
};
#define to_gb_module(d) container_of(d, struct gb_module, dev)