source: trunk/target/linux/lantiq/patches/211-nor_split.patch @ 24526

Last change on this file since 24526 was 24526, checked in by blogic, 5 years ago

[lantiq] adds new lantiq kernel. once the codebase is fully tested and know to be working on all the devices previously supported by ifxmips, we will drop ifxmips support.

File size: 2.6 KB
  • drivers/mtd/maps/lantiq.c

    a b  
    2424#include <lantiq.h> 
    2525#include <lantiq_platform.h> 
    2626 
     27#ifdef CONFIG_SOC_LANTIQ_XWAY 
     28#include <xway.h> 
     29#endif 
     30 
    2731static map_word 
    2832lq_read16(struct map_info *map, unsigned long adr) 
    2933{ 
    lq_copy_to(struct map_info *map, unsigne 
    7781        spin_unlock_irqrestore(&ebu_lock, flags); 
    7882} 
    7983 
     84static unsigned long 
     85find_uImage_size(struct map_info *map, unsigned long offset) 
     86{ 
     87#define UBOOT_MAGIC     0x56190527 
     88        unsigned long magic; 
     89        unsigned long temp; 
     90        map->copy_from(map, &magic, offset, 4); 
     91        if (le32_to_cpu(magic) != UBOOT_MAGIC) 
     92                return 0; 
     93        map->copy_from(map, &temp, offset + 12, 4); 
     94        return temp + 0x40; 
     95} 
     96 
     97static int 
     98detect_squashfs_partition(struct map_info *map, unsigned long offset) 
     99{ 
     100        unsigned long temp; 
     101        map->copy_from(map, &temp, offset, 4); 
     102        return le32_to_cpu(temp) == SQUASHFS_MAGIC; 
     103} 
     104 
     105static struct mtd_partition split_partitions[] = { 
     106        { 
     107                .name = "kernel", 
     108                .offset = 0x0, 
     109                .size = 0x0, 
     110        }, { 
     111                .name = "rootfs", 
     112                .offset = 0x0, 
     113                .size = 0x0, 
     114        }, 
     115}; 
     116 
     117static int 
     118mtd_split_linux(struct map_info *map, struct mtd_info *mtd, 
     119        struct mtd_partition *parts, int nr_parts) 
     120{ 
     121        int base_part = 0; 
     122        int i; 
     123        for (i = 0; i < nr_parts && !base_part; i++) { 
     124                if(!strcmp("linux", parts[i].name)) 
     125                        base_part = i; 
     126        } 
     127        if (!base_part) 
     128                return 0; 
     129        split_partitions[0].size = find_uImage_size(map, parts[base_part].offset); 
     130        if (!split_partitions[0].size) { 
     131                printk(KERN_INFO "lq_nor: no uImage found in linux partition"); 
     132                return -1; 
     133        } 
     134        if (!detect_squashfs_partition(map, 
     135                        parts[base_part].offset + split_partitions[0].size)) { 
     136                split_partitions[0].size &= ~(mtd->erasesize - 1); 
     137                split_partitions[0].size += mtd->erasesize; 
     138        } 
     139        split_partitions[0].offset = parts[base_part].offset; 
     140        split_partitions[1].offset = 
     141                parts[base_part].offset + split_partitions[0].size; 
     142        split_partitions[1].size = 
     143                parts[base_part].size - split_partitions[0].size; 
     144 
     145        base_part++; 
     146        add_mtd_partitions(mtd, parts, base_part); 
     147        add_mtd_partitions(mtd, split_partitions, 2); 
     148        if(nr_parts != base_part) 
     149                add_mtd_partitions(mtd, &parts[base_part], nr_parts - base_part); 
     150        return nr_parts + 2; 
     151} 
     152 
    80153static const char *part_probe_types[] = { "cmdlinepart", NULL }; 
    81154 
    82155static struct map_info lq_map = { 
    lq_mtd_probe(struct platform_device *pde 
    142215                parts = lq_mtd_data->parts; 
    143216        } 
    144217 
    145         add_mtd_partitions(lq_mtd, parts, nr_parts); 
     218        if (!mtd_split_linux(&lq_map, lq_mtd, parts, nr_parts)) 
     219                add_mtd_partitions(lq_mtd, parts, nr_parts); 
    146220        return 0; 
    147221} 
    148222 
Note: See TracBrowser for help on using the repository browser.