]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/mmc/core/sdio_bus.c
sdio: store vendor strings
[linux-2.6-omap-h63xx.git] / drivers / mmc / core / sdio_bus.c
index 129f0719c391de28b1078d8726faeb73fa25c3da..0713a8c71e54b2980d88127644e14cd9ed87f748 100644 (file)
@@ -46,7 +46,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
                        func->class, func->vendor, func->device);
 }
 
-struct device_attribute sdio_dev_attrs[] = {
+static struct device_attribute sdio_dev_attrs[] = {
        __ATTR_RO(class),
        __ATTR_RO(vendor),
        __ATTR_RO(device),
@@ -128,11 +128,20 @@ static int sdio_bus_probe(struct device *dev)
        struct sdio_driver *drv = to_sdio_driver(dev->driver);
        struct sdio_func *func = dev_to_sdio_func(dev);
        const struct sdio_device_id *id;
+       int ret;
 
        id = sdio_match_device(func, drv);
        if (!id)
                return -ENODEV;
 
+       /* Set the default block size so the driver is sure it's something
+        * sensible. */
+       sdio_claim_host(func);
+       ret = sdio_set_block_size(func, 0);
+       sdio_release_host(func);
+       if (ret)
+               return ret;
+
        return drv->probe(func, id);
 }
 
@@ -143,6 +152,14 @@ static int sdio_bus_remove(struct device *dev)
 
        drv->remove(func);
 
+       if (func->irq_handler) {
+               printk(KERN_WARNING "WARNING: driver %s did not remove "
+                       "its interrupt handler!\n", drv->name);
+               sdio_claim_host(func);
+               sdio_release_irq(func);
+               sdio_release_host(func);
+       }
+
        return 0;
 }
 
@@ -194,6 +211,9 @@ static void sdio_release_func(struct device *dev)
 
        sdio_free_func_cis(func);
 
+       if (func->info)
+               kfree(func->info);
+
        kfree(func);
 }
 
@@ -204,12 +224,10 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
 {
        struct sdio_func *func;
 
-       func = kmalloc(sizeof(struct sdio_func), GFP_KERNEL);
+       func = kzalloc(sizeof(struct sdio_func), GFP_KERNEL);
        if (!func)
                return ERR_PTR(-ENOMEM);
 
-       memset(func, 0, sizeof(struct sdio_func));
-
        func->card = card;
 
        device_initialize(&func->dev);