]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/mtd/maps/pcmciamtd.c
Merge branch 'rio.b19' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/bird
[linux-2.6-omap-h63xx.git] / drivers / mtd / maps / pcmciamtd.c
index e9086f0cb2faa6c5a0382138da55e8a16a740f78..c861134cbc48d253ccc3530568402b0de0665441 100644 (file)
@@ -111,8 +111,8 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
        memreq_t mrq;
        int ret;
 
-       if(!(dev->p_dev->state & DEV_PRESENT)) {
-               DEBUG(1, "device removed state = 0x%4.4X", dev->p_dev->state);
+       if (!pcmcia_dev_present(dev->p_dev)) {
+               DEBUG(1, "device removed");
                return 0;
        }
 
@@ -238,7 +238,7 @@ static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const v
 
 /* read/write{8,16} copy_{from,to} routines with direct access */
 
-#define DEV_REMOVED(x)  (!(*(u_int *)x->map_priv_1 & DEV_PRESENT))
+#define DEV_REMOVED(x)  (!(pcmcia_dev_present(((struct pcmciamtd_dev *)map->map_priv_1)->p_dev)))
 
 static map_word pcmcia_read8(struct map_info *map, unsigned long ofs)
 {
@@ -487,7 +487,7 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link,
 #define CS_CHECK(fn, ret) \
 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
-static void pcmciamtd_config(struct pcmcia_device *link)
+static int pcmciamtd_config(struct pcmcia_device *link)
 {
        struct pcmciamtd_dev *dev = link->priv;
        struct mtd_info *mtd = NULL;
@@ -503,9 +503,6 @@ static void pcmciamtd_config(struct pcmcia_device *link)
 
        DEBUG(3, "link=0x%p", link);
 
-       /* Configure card */
-       link->state |= DEV_CONFIG;
-
        DEBUG(2, "Validating CIS");
        ret = pcmcia_validate_cis(link, &cisinfo);
        if(ret != CS_SUCCESS) {
@@ -561,7 +558,7 @@ static void pcmciamtd_config(struct pcmcia_device *link)
        if(!dev->win_size) {
                err("Cant allocate memory window");
                pcmciamtd_release(link);
-               return;
+               return -ENODEV;
        }
        DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10);
 
@@ -573,7 +570,7 @@ static void pcmciamtd_config(struct pcmcia_device *link)
        if(!dev->win_base) {
                err("ioremap(%lu, %u) failed", req.Base, req.Size);
                pcmciamtd_release(link);
-               return;
+               return -ENODEV;
        }
        DEBUG(1, "mapped window dev = %p req.base = 0x%lx base = %p size = 0x%x",
              dev, req.Base, dev->win_base, req.Size);
@@ -605,6 +602,7 @@ static void pcmciamtd_config(struct pcmcia_device *link)
        ret = pcmcia_request_configuration(link, &link->conf);
        if(ret != CS_SUCCESS) {
                cs_error(link, RequestConfiguration, ret);
+               return -ENODEV;
        }
 
        if(mem_type == 1) {
@@ -612,7 +610,7 @@ static void pcmciamtd_config(struct pcmcia_device *link)
        } else if(mem_type == 2) {
                mtd = do_map_probe("map_rom", &dev->pcmcia_map);
        } else {
-               for(i = 0; i < sizeof(probes) / sizeof(char *); i++) {
+               for(i = 0; i < ARRAY_SIZE(probes); i++) {
                        DEBUG(1, "Trying %s", probes[i]);
                        mtd = do_map_probe(probes[i], &dev->pcmcia_map);
                        if(mtd)
@@ -625,7 +623,7 @@ static void pcmciamtd_config(struct pcmcia_device *link)
        if(!mtd) {
                DEBUG(1, "Cant find an MTD");
                pcmciamtd_release(link);
-               return;
+               return -ENODEV;
        }
 
        dev->mtd_info = mtd;
@@ -650,7 +648,6 @@ static void pcmciamtd_config(struct pcmcia_device *link)
           use the faster non-remapping read/write functions */
        if(mtd->size <= dev->win_size) {
                DEBUG(1, "Using non remapping memory functions");
-               dev->pcmcia_map.map_priv_1 = (unsigned long)&(dev->p_dev->state);
                dev->pcmcia_map.map_priv_2 = (unsigned long)dev->win_base;
                if (dev->pcmcia_map.bankwidth == 1) {
                        dev->pcmcia_map.read = pcmcia_read8;
@@ -668,19 +665,18 @@ static void pcmciamtd_config(struct pcmcia_device *link)
                dev->mtd_info = NULL;
                err("Couldnt register MTD device");
                pcmciamtd_release(link);
-               return;
+               return -ENODEV;
        }
        snprintf(dev->node.dev_name, sizeof(dev->node.dev_name), "mtd%d", mtd->index);
        info("mtd%d: %s", mtd->index, mtd->name);
-       link->state &= ~DEV_CONFIG_PENDING;
        link->dev_node = &dev->node;
-       return;
+       return 0;
 
  cs_failed:
        cs_error(link, last_fn, last_ret);
        err("CS Error, exiting");
        pcmciamtd_release(link);
-       return;
+       return -ENODEV;
 }
 
 
@@ -711,17 +707,17 @@ static int pcmciamtd_resume(struct pcmcia_device *dev)
 
 static void pcmciamtd_detach(struct pcmcia_device *link)
 {
-       DEBUG(3, "link=0x%p", link);
+       struct pcmciamtd_dev *dev = link->priv;
 
-       if(link->state & DEV_CONFIG) {
-               struct pcmciamtd_dev *dev = link->priv;
-               if(dev->mtd_info) {
-                       del_mtd_device(dev->mtd_info);
-                       info("mtd%d: Removed", dev->mtd_info->index);
-               }
+       DEBUG(3, "link=0x%p", link);
 
-               pcmciamtd_release(link);
+       if(dev->mtd_info) {
+               del_mtd_device(dev->mtd_info);
+               map_destroy(dev->mtd_info);
+               info("mtd%d: Removed", dev->mtd_info->index);
        }
+
+       pcmciamtd_release(link);
 }
 
 
@@ -730,7 +726,7 @@ static void pcmciamtd_detach(struct pcmcia_device *link)
  * with Card Services.
  */
 
-static int pcmciamtd_attach(struct pcmcia_device *link)
+static int pcmciamtd_probe(struct pcmcia_device *link)
 {
        struct pcmciamtd_dev *dev;
 
@@ -746,10 +742,7 @@ static int pcmciamtd_attach(struct pcmcia_device *link)
        link->conf.Attributes = 0;
        link->conf.IntType = INT_MEMORY;
 
-       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
-       pcmciamtd_config(link);
-
-       return 0;
+       return pcmciamtd_config(link);
 }
 
 static struct pcmcia_device_id pcmciamtd_ids[] = {
@@ -783,7 +776,7 @@ static struct pcmcia_driver pcmciamtd_driver = {
        .drv            = {
                .name   = "pcmciamtd"
        },
-       .probe          = pcmciamtd_attach,
+       .probe          = pcmciamtd_probe,
        .remove         = pcmciamtd_detach,
        .owner          = THIS_MODULE,
        .id_table       = pcmciamtd_ids,