Commit dce77377 authored by Russell King's avatar Russell King Committed by Russell King

[MMC] Use an IDR for host name indicies

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 1ad434d7
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/idr.h>
#include <linux/mmc/card.h> #include <linux/mmc/card.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
...@@ -236,6 +237,9 @@ static struct class mmc_host_class = { ...@@ -236,6 +237,9 @@ static struct class mmc_host_class = {
.release = mmc_host_classdev_release, .release = mmc_host_classdev_release,
}; };
static DEFINE_IDR(mmc_host_idr);
static DEFINE_SPINLOCK(mmc_host_lock);
/* /*
* Internal function. Allocate a new MMC host. * Internal function. Allocate a new MMC host.
*/ */
...@@ -261,10 +265,19 @@ struct mmc_host *mmc_alloc_host_sysfs(int extra, struct device *dev) ...@@ -261,10 +265,19 @@ struct mmc_host *mmc_alloc_host_sysfs(int extra, struct device *dev)
*/ */
int mmc_add_host_sysfs(struct mmc_host *host) int mmc_add_host_sysfs(struct mmc_host *host)
{ {
static unsigned int host_num; int err;
if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL))
return -ENOMEM;
spin_lock(&mmc_host_lock);
err = idr_get_new(&mmc_host_idr, host, &host->index);
spin_unlock(&mmc_host_lock);
if (err)
return err;
snprintf(host->class_dev.class_id, BUS_ID_SIZE, snprintf(host->class_dev.class_id, BUS_ID_SIZE,
"mmc%d", host_num++); "mmc%d", host->index);
return class_device_add(&host->class_dev); return class_device_add(&host->class_dev);
} }
...@@ -275,6 +288,10 @@ int mmc_add_host_sysfs(struct mmc_host *host) ...@@ -275,6 +288,10 @@ int mmc_add_host_sysfs(struct mmc_host *host)
void mmc_remove_host_sysfs(struct mmc_host *host) void mmc_remove_host_sysfs(struct mmc_host *host)
{ {
class_device_del(&host->class_dev); class_device_del(&host->class_dev);
spin_lock(&mmc_host_lock);
idr_remove(&mmc_host_idr, host->index);
spin_unlock(&mmc_host_lock);
} }
/* /*
......
...@@ -64,6 +64,7 @@ struct device; ...@@ -64,6 +64,7 @@ struct device;
struct mmc_host { struct mmc_host {
struct device *dev; struct device *dev;
struct class_device class_dev; struct class_device class_dev;
int index;
struct mmc_host_ops *ops; struct mmc_host_ops *ops;
unsigned int f_min; unsigned int f_min;
unsigned int f_max; unsigned int f_max;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment