/* * * Normal mappings of chips in physical memory */ #include #include #include #include #include #include #include #include #define WINDOW_ADDR 0xffe00000 #define WINDOW_SIZE 0x200000 #define BUSWIDTH 2 extern char* ppcboot_getenv(char* v); static struct mtd_info *mymtd; __u8 m5272c3_read8(struct map_info *map, unsigned long ofs) { return __raw_readb(map->map_priv_1 + ofs); } __u16 m5272c3_read16(struct map_info *map, unsigned long ofs) { return __raw_readw(map->map_priv_1 + ofs); } __u32 m5272c3_read32(struct map_info *map, unsigned long ofs) { return __raw_readl(map->map_priv_1 + ofs); } void m5272c3_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len) { memcpy_fromio(to, map->map_priv_1 + from, len); } void m5272c3_write8(struct map_info *map, __u8 d, unsigned long adr) { __raw_writeb(d, map->map_priv_1 + adr); mb(); } void m5272c3_write16(struct map_info *map, __u16 d, unsigned long adr) { __raw_writew(d, map->map_priv_1 + adr); mb(); } void m5272c3_write32(struct map_info *map, __u32 d, unsigned long adr) { __raw_writel(d, map->map_priv_1 + adr); mb(); } void m5272c3_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len) { memcpy_toio(map->map_priv_1 + to, from, len); } struct map_info m5272c3_map = { name: "MCF5272C3 flash device", size: WINDOW_SIZE, buswidth: BUSWIDTH, read8: m5272c3_read8, read16: m5272c3_read16, read32: m5272c3_read32, copy_from: m5272c3_copy_from, write8: m5272c3_write8, write16: m5272c3_write16, write32: m5272c3_write32, copy_to: m5272c3_copy_to }; /* * MTD 'PARTITIONING' STUFF */ #ifndef CONFIG_PPCBOOT static struct mtd_partition m5272c3_partitions[] = { { name: "kernel (768K)", size: 0xc0000, offset: 0x40000 }, { name: "rootfs (1024K)", size: 0x100000, offset: 0x100000 }, { name: "environment (8K)", size: 0x2000, offset: 0x4000 } }; #else #define M5272C3_MAX_PARTITIONS 8 #define M5272C3_MAX_PARTARGENTRIES 3 #define M5272C3_PTABLE_BUFSIZE 256 static struct mtd_partition m5272c3_partitions[M5272C3_MAX_PARTITIONS]; static int m5272c3_partitions_cnt=0; static char* m5272c3_emptyentry = ""; static void read_m5272c3_partitiontable(void) { char* envptable=ppcboot_getenv("ptable"); if(envptable) { char ptable[M5272C3_PTABLE_BUFSIZE],*p,*pt; int pcnt,acnt,i; char *ptableargentry[M5272C3_MAX_PARTITIONS][M5272C3_MAX_PARTARGENTRIES]; strncpy(ptable,envptable,M5272C3_PTABLE_BUFSIZE-1); ptable[M5272C3_PTABLE_BUFSIZE-1]=0; for(pcnt=0;pcntmodule = THIS_MODULE; #ifdef CONFIG_PPCBOOT read_m5272c3_partitiontable(); if(m5272c3_partitions_cnt) { return add_mtd_partitions(mymtd, m5272c3_partitions, m5272c3_partitions_cnt); } else { return -ENXIO; }; #else return add_mtd_partitions(mymtd, m5272c3_partitions, sizeof(m5272c3_partitions) / sizeof(struct mtd_partition)); #endif } iounmap((void *)m5272c3_map.map_priv_1); return -ENXIO; } static void __exit cleanup_m5272c3(void) { if (mymtd) { del_mtd_partitions(mymtd); map_destroy(mymtd); } if (m5272c3_map.map_priv_1) { iounmap((void *)m5272c3_map.map_priv_1); m5272c3_map.map_priv_1 = 0; } } module_init(init_m5272c3); module_exit(cleanup_m5272c3);