summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/mmc_sysfs.c21
-rw-r--r--include/linux/mmc/host.h1
2 files changed, 20 insertions, 2 deletions
diff --git a/drivers/mmc/mmc_sysfs.c b/drivers/mmc/mmc_sysfs.c
index 34fa4a3a02d5..ad8949810fc5 100644
--- a/drivers/mmc/mmc_sysfs.c
+++ b/drivers/mmc/mmc_sysfs.c
@@ -12,6 +12,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
+#include <linux/idr.h>
#include <linux/mmc/card.h>
#include <linux/mmc/host.h>
@@ -236,6 +237,9 @@ static struct class mmc_host_class = {
.release = mmc_host_classdev_release,
};
+static DEFINE_IDR(mmc_host_idr);
+static DEFINE_SPINLOCK(mmc_host_lock);
+
/*
* Internal function. Allocate a new MMC host.
*/
@@ -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)
{
- 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,
- "mmc%d", host_num++);
+ "mmc%d", host->index);
return class_device_add(&host->class_dev);
}
@@ -275,6 +288,10 @@ int mmc_add_host_sysfs(struct mmc_host *host)
void mmc_remove_host_sysfs(struct mmc_host *host)
{
class_device_del(&host->class_dev);
+
+ spin_lock(&mmc_host_lock);
+ idr_remove(&mmc_host_idr, host->index);
+ spin_unlock(&mmc_host_lock);
}
/*
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 113cc27865f0..9a0893f3249e 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -64,6 +64,7 @@ struct device;
struct mmc_host {
struct device *dev;
struct class_device class_dev;
+ int index;
struct mmc_host_ops *ops;
unsigned int f_min;
unsigned int f_max;