Detect 16MB flash chips
authorHauke Mehrtens <hauke@hauke-m.de>
Wed, 27 May 2009 18:28:07 +0000 (18:28 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Wed, 27 May 2009 18:28:07 +0000 (18:28 +0000)
SVN-Revision: 16120

target/linux/amazon/files/drivers/mtd/maps/amazon.c

index 3e7dc4f58374060727189ffba7d879f2bb8e648b..8c311418982925b1c75217ffa58a32f0fe9df600 100644 (file)
@@ -41,7 +41,7 @@
 static struct map_info amazon_map = {
        .name = "AMAZON_FLASH",
        .bankwidth = 2,
-       .size = 0x400000,
+       .size = 0x1000000,
 };
 
 static map_word amazon_read16(struct map_info * map, unsigned long ofs)
@@ -107,18 +107,24 @@ unsigned long flash_start = 0x13000000;
 unsigned long flash_size = 0x800000;
 unsigned long uImage_size = 0x10000d;
 
-int find_uImage_size(unsigned long start_offset){
+int find_uImage_size(unsigned long start_offset)
+{
+       unsigned long magic;
        unsigned long temp;
-
-       printk("trying to find uImage and its size\n");
+       amazon_copy_from(&amazon_map, &magic, start_offset, 4);
+       if (!(ntohl(magic) == 0x27051956)) {
+               printk(KERN_INFO "amazon_mtd: invalid magic (0x%08X) of kernel at 0x%08lx \n", ntohl(magic), start_offset);
+               return 0;
+       }
        amazon_copy_from(&amazon_map, &temp, start_offset + 12, 4);
-       printk("kernel size is %d \n", temp + 0x40);
+       printk(KERN_INFO "amazon_mtd: kernel size is %ld \n", temp + 0x40);
        return temp + 0x40;
 }
 
 int __init init_amazon_mtd(void)
 {
        int ret = 0;
+       unsigned long uimage_size;
        struct mtd_info *mymtd = NULL;
        struct mtd_partition *parts = NULL;
 
@@ -146,10 +152,28 @@ int __init init_amazon_mtd(void)
 
        mymtd->owner = THIS_MODULE;
        parts = &amazon_partitions[0];
-       amazon_partitions[2].offset = UBOOT_SIZE + find_uImage_size(amazon_partitions[1].offset);
-       amazon_partitions[1].size = mymtd->size - amazon_partitions[1].offset - (2 * mymtd->erasesize);
-       amazon_partitions[2].size = mymtd->size - amazon_partitions[2].offset - (2 * mymtd->erasesize);
+
+       /* Some Samsung devices are containing a 16 MB flash chip with a bigger U-Boot partition. */
+       if(mymtd->size == 0x01000000 && mymtd->erasesize == 0x00020000) {
+               printk(KERN_INFO "amazon_mtd: Found big flash chip!\n");
+               amazon_partitions[0].size = 0x60000;
+               amazon_partitions[1].offset = 0x60000;
+               uimage_size = find_uImage_size(amazon_partitions[1].offset);
+               amazon_partitions[1].size = uimage_size;
+               amazon_partitions[2].offset = 0x60000 + uimage_size;
+               amazon_partitions[2].size = mymtd->size - amazon_partitions[2].offset - mymtd->erasesize;
+       } else {
+               printk(KERN_INFO "amazon_mtd: Found small flash chip!\n");
+               uimage_size = find_uImage_size(amazon_partitions[1].offset);
+               amazon_partitions[1].size = uimage_size;
+               amazon_partitions[2].offset = UBOOT_SIZE + uimage_size;
+               amazon_partitions[2].size = mymtd->size - amazon_partitions[2].offset - (2 * mymtd->erasesize);
+       }
+
        add_mtd_partitions(mymtd, parts, 3);
+
+       printk(KERN_INFO "amazon_mtd: added %s flash with %dMB\n",
+               amazon_map.name, mymtd->size >> 20);
        return 0;
 }