aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/mmc_sysfs.c21
1 files changed, 19 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 @@
12#include <linux/module.h> 12#include <linux/module.h>
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/device.h> 14#include <linux/device.h>
15#include <linux/idr.h>
15 16
16#include <linux/mmc/card.h> 17#include <linux/mmc/card.h>
17#include <linux/mmc/host.h> 18#include <linux/mmc/host.h>
@@ -236,6 +237,9 @@ static struct class mmc_host_class = {
236 .release = mmc_host_classdev_release, 237 .release = mmc_host_classdev_release,
237}; 238};
238 239
240static DEFINE_IDR(mmc_host_idr);
241static DEFINE_SPINLOCK(mmc_host_lock);
242
239/* 243/*
240 * Internal function. Allocate a new MMC host. 244 * Internal function. Allocate a new MMC host.
241 */ 245 */
@@ -261,10 +265,19 @@ struct mmc_host *mmc_alloc_host_sysfs(int extra, struct device *dev)
261 */ 265 */
262int mmc_add_host_sysfs(struct mmc_host *host) 266int mmc_add_host_sysfs(struct mmc_host *host)
263{ 267{
264 static unsigned int host_num; 268 int err;
269
270 if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL))
271 return -ENOMEM;
272
273 spin_lock(&mmc_host_lock);
274 err = idr_get_new(&mmc_host_idr, host, &host->index);
275 spin_unlock(&mmc_host_lock);
276 if (err)
277 return err;
265 278
266 snprintf(host->class_dev.class_id, BUS_ID_SIZE, 279 snprintf(host->class_dev.class_id, BUS_ID_SIZE,
267 "mmc%d", host_num++); 280 "mmc%d", host->index);
268 281
269 return class_device_add(&host->class_dev); 282 return class_device_add(&host->class_dev);
270} 283}
@@ -275,6 +288,10 @@ int mmc_add_host_sysfs(struct mmc_host *host)
275void mmc_remove_host_sysfs(struct mmc_host *host) 288void mmc_remove_host_sysfs(struct mmc_host *host)
276{ 289{
277 class_device_del(&host->class_dev); 290 class_device_del(&host->class_dev);
291
292 spin_lock(&mmc_host_lock);
293 idr_remove(&mmc_host_idr, host->index);
294 spin_unlock(&mmc_host_lock);
278} 295}
279 296
280/* 297/*