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: Greg Kroah-Hartman <greg@kroah.com>
Reviewed-by: Alex Elder <elder@linaro.org>
This commit is contained in:
Greg Kroah-Hartman 2014-12-24 13:01:46 -08:00
parent 2c07817e72
commit e5646710c1
2 changed files with 22 additions and 29 deletions

View File

@ -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;
}

View File

@ -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)