[adm5120] flash driver fixes
[openwrt/svn-archive/archive.git] / target / linux / adm5120-2.6 / files / drivers / mtd / maps / adm5120-flash.c
index a60e6e54bc1fef6cc37f9cf42299440b1be8dfc4..25193a2f0220490be0a9b34ff2c8ec4b6dc3ad7b 100644 (file)
 #define DRV_DESC       "ADM5120 flash MAP driver"
 #define MAX_PARSED_PARTS 8
 
-#define MAP_DBG(m, f, a...)    printk(KERN_DEBUG "%s: " f, (m->name) , ## a)
+#ifdef ADM5120_FLASH_DEBUG
+#define MAP_DBG(m, f, a...)    printk(KERN_INFO "%s: " f, (m->name) , ## a)
+#else
+#define MAP_DBG(m, f, a...)    do {} while (0)
+#endif
 #define MAP_ERR(m, f, a...)    printk(KERN_ERR "%s: " f, (m->name) , ## a)
 #define MAP_INFO(m, f, a...)   printk(KERN_INFO "%s: " f, (m->name) , ## a)
 
@@ -145,7 +149,7 @@ static void adm5120_flash_switchbank(struct map_info *map,
        if (bank > 1)
                BUG();
 
-       MAP_DBG(map, "ofs=%lu, switching to bank %u\n", ofs, bank);
+       MAP_DBG(map, "switching to bank %u, ofs=%lX\n", bank, ofs);
        amap->switch_bank(bank);
 }
 
@@ -190,26 +194,24 @@ static void adm5120_flash_copy_from(struct map_info *map, void *to,
        char *p;
        ssize_t t;
 
-       MAP_DBG(map, "copying %lu byte(s) from %lu to %lX\n",
-               (unsigned long)len, from, (unsigned long)to);
+       MAP_DBG(map, "copy_from, to=%lX, from=%lX, len=%lX\n",
+               (unsigned long)to, from, (unsigned long)len);
 
        if (from > amap->chip_size)
                return;
 
        p = (char *)to;
        while (len > 0) {
-               if (len > BANK_SIZE - (from & BANK_OFFS_MASK))
-                       t = BANK_SIZE - (from & BANK_OFFS_MASK);
-               else
-                       t = len;
+               t = len;
+               if (from < BANK_SIZE && from+len > BANK_SIZE)
+                       t = BANK_SIZE-from;
 
-               MAP_DBG(map, "copying %lu byte(s) from %lu to %lX\n",
+               FLASH_LOCK();
+               MAP_DBG(map, "copying %lu byte(s) from %lX to %lX\n",
                        (unsigned long)t, (from & BANK_OFFS_MASK),
                        (unsigned long)p);
-
-               FLASH_LOCK();
                adm5120_flash_switchbank(map, from);
-               inline_map_copy_from(map, to, (from & BANK_OFFS_MASK), t);
+               inline_map_copy_from(map, p, (from & BANK_OFFS_MASK), t);
                FLASH_UNLOCK();
                p += t;
                from += t;
@@ -485,7 +487,7 @@ static int adm5120_flash_probe(struct platform_device *dev)
        }
 
        MAP_INFO(map, "found at 0x%lX, size:%ldKiB, width:%d bits\n",
-               (unsigned long)map->phys, (unsigned long)map->size >> 10,
+               (unsigned long)map->phys, (unsigned long)info->mtd->size >> 10,
                map->bankwidth*8);
 
        info->mtd->owner = THIS_MODULE;