diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index 846a533..97c37ec 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig @@ -339,6 +339,14 @@ config MTD_OCOTEA Ocotea board. If you have one of these boards and would like to use the flash chips on it, say 'Y'. +config MTD_P3P440 + tristate "Flash devices mapped on Prodrive P3P440" + depends on MTD_CFI && P3P440 + help + This enables access routines for the flash chips on the Prodrive + P3P440 board. If you have this board and would like to use the + flash chips on it, say 'Y'. + config MTD_REDWOOD tristate "CFI Flash devices mapped on IBM Redwood" depends on MTD_CFI && ( REDWOOD_4 || REDWOOD_5 || REDWOOD_6 ) diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile index 7d9e940..73a681a 100644 --- a/drivers/mtd/maps/Makefile +++ b/drivers/mtd/maps/Makefile @@ -73,3 +73,4 @@ obj-$(CONFIG_MTD_OMAP_NOR) += omap_nor.o obj-$(CONFIG_MTD_PQ2FADS) += pq2fads.o obj-$(CONFIG_MTD_MTX1) += mtx-1_flash.o obj-$(CONFIG_MTD_TQM834x) += tqm834x.o +obj-$(CONFIG_MTD_P3P440) += p3p440.o diff --git a/drivers/mtd/maps/p3p440.c b/drivers/mtd/maps/p3p440.c new file mode 100644 index 0000000..54be1e1 --- /dev/null +++ b/drivers/mtd/maps/p3p440.c @@ -0,0 +1,126 @@ +/* + * $Id: $ + * + * drivers/mtd/maps/p3p440.c + * + * Mapping for Prodrive P3P440 flash + * + * Copyright (c) 2005 DENX Software Engineering + * Stefan Roese + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +extern bd_t __res; + +#define RW_PART0_OF 0 +#define RW_PART0_SZ 0x180000 +#define RW_PART1_SZ 0x280000 +/* Partition 2 will be autosized dynamically... */ +#define RW_PART3_SZ 0x40000 +#define RW_PART4_SZ 0x40000 + +static struct mtd_partition p3p440_flash_partitions[] = { + { + .name = "kernel", + .offset = RW_PART0_OF, + .size = RW_PART0_SZ + }, + { + .name = "root", + .offset = MTDPART_OFS_APPEND, + .size = RW_PART1_SZ, + }, + { + .name = "user", + .offset = MTDPART_OFS_APPEND, +/* .size = RW_PART2_SZ */ /* will be adjusted dynamically */ + }, + { + .name = "env", + .offset = MTDPART_OFS_APPEND, + .size = RW_PART3_SZ, + }, + { + .name = "u-boot", + .offset = MTDPART_OFS_APPEND, + .size = RW_PART4_SZ, + } +}; + +static struct map_info p3p440_flash_map = { + .name = "p3p440-flash", + .bankwidth = 2, +}; + +static struct mtd_info *p3p440_mtd; + +static int __init init_p3p440_flash(void) +{ + unsigned long long flash_base; + unsigned long flash_size; + + flash_base = __res.bi_flashstart | 0x0000000100000000LL; + flash_size = __res.bi_flashsize; + + p3p440_flash_map.size = flash_size; + p3p440_flash_map.phys = flash_base; + p3p440_flash_map.virt = ioremap64(flash_base, p3p440_flash_map.size); + + if (!p3p440_flash_map.virt) { + printk(KERN_NOTICE "init_p3p440_flash: failed to ioremap\n"); + return -EIO; + } + + /* + * Adjust partitions to flash size + */ + p3p440_flash_partitions[2].size = p3p440_flash_map.size - + RW_PART0_SZ - RW_PART1_SZ - RW_PART3_SZ - RW_PART4_SZ; + + simple_map_init(&p3p440_flash_map); + + p3p440_mtd = do_map_probe("cfi_probe", &p3p440_flash_map); + + if (p3p440_mtd) { + p3p440_mtd->owner = THIS_MODULE; + return add_mtd_partitions(p3p440_mtd, + p3p440_flash_partitions, + ARRAY_SIZE(p3p440_flash_partitions)); + } + + return -ENXIO; +} + +static void __exit cleanup_p3p440_flash(void) +{ + if (p3p440_mtd) { + del_mtd_partitions(p3p440_mtd); + map_destroy(p3p440_mtd); + iounmap(p3p440_flash_map.virt); + } +} + +module_init(init_p3p440_flash); +module_exit(cleanup_p3p440_flash); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Stefan Roese "); +MODULE_DESCRIPTION("MTD map and partitions for Prodrive P3P440 board");