diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-06-14 08:01:54 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-06-14 08:01:54 +0000 |
commit | c3d2111d2cb189046d1565e77a0d17646096d5f1 (patch) | |
tree | 510cc6a03e89c00cc4e560082b96ce693ecba30a /target/linux/linux-2.4/patches/ar7/001-flash_map.patch | |
parent | 26118ce258fcf8c31088fb4e160dc25ba281f30a (diff) |
fix board support patch and add mtd flash map driver for ar7
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@1237 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/linux-2.4/patches/ar7/001-flash_map.patch')
-rw-r--r-- | target/linux/linux-2.4/patches/ar7/001-flash_map.patch | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/target/linux/linux-2.4/patches/ar7/001-flash_map.patch b/target/linux/linux-2.4/patches/ar7/001-flash_map.patch new file mode 100644 index 000000000..b4aec5fe2 --- /dev/null +++ b/target/linux/linux-2.4/patches/ar7/001-flash_map.patch @@ -0,0 +1,248 @@ +diff -Nru linux-2.4.30-openwrt/drivers/mtd/maps/Config.in linux-2.4.30-wag-jiauka/drivers/mtd/maps/Config.in +--- linux-2.4.30-openwrt/drivers/mtd/maps/Config.in Sun May 29 18:07:48 2005 ++++ linux-2.4.30-wag-jiauka/drivers/mtd/maps/Config.in Thu Jun 9 01:49:32 2005 +@@ -48,6 +48,21 @@ + fi + + if [ "$CONFIG_MIPS" = "y" ]; then ++ if [ "$CONFIG_AR7" = "y" ]; then ++ dep_tristate ' Flash chip mapping on Texas Instruments AR7' CONFIG_MTD_AVALANCHE $CONFIG_MTD_CFI $CONFIG_MTD_PARTITIONS ++ dep_bool ' Use defaults for Texas Instruments AR7' CONFIG_MTD_AVALANCHE_DEFAULTS $CONFIG_MTD_AVALANCHE ++ if [ "$CONFIG_MTD_AVALANCHE" = "y" -o "$CONFIG_MTD_AVALANCHE" = "m" ]; then ++ if [ "$CONFIG_MTD_AVALANCHE_DEFAULTS" = "y" ]; then ++ define_hex CONFIG_MTD_AVALANCHE_START 0x10000000 ++ define_hex CONFIG_MTD_AVALANCHE_LEN 0x400000 ++ define_int CONFIG_MTD_AVALANCHE_BUSWIDTH 2 ++ else ++ hex ' Physical start address of flash mapping' CONFIG_MTD_AVALANCHE_START 0x10000000 ++ hex ' Physical length of flash mapping' CONFIG_MTD_AVALANCHE_LEN 0x400000 ++ int ' Bus width in octets' CONFIG_MTD_AVALANCHE_BUSWIDTH 2 ++ fi ++ fi ++ fi + dep_tristate ' Pb1000 MTD support' CONFIG_MTD_PB1000 $CONFIG_MIPS_PB1000 + dep_tristate ' Pb1500 MTD support' CONFIG_MTD_PB1500 $CONFIG_MIPS_PB1500 + dep_tristate ' Pb1100 MTD support' CONFIG_MTD_PB1100 $CONFIG_MIPS_PB1100 +diff -Nru linux-2.4.30-openwrt/drivers/mtd/maps/Makefile linux-2.4.30-wag-jiauka/drivers/mtd/maps/Makefile +--- linux-2.4.30-openwrt/drivers/mtd/maps/Makefile Sun May 29 18:07:48 2005 ++++ linux-2.4.30-wag-jiauka/drivers/mtd/maps/Makefile Thu Jun 9 01:49:32 2005 +@@ -10,6 +10,7 @@ + endif + + # Chip mappings ++obj-$(CONFIG_MTD_AVALANCHE) += ar7-flash.o + obj-$(CONFIG_MTD_CDB89712) += cdb89712.o + obj-$(CONFIG_MTD_ARM_INTEGRATOR)+= integrator-flash.o + obj-$(CONFIG_MTD_CFI_FLAGADM) += cfi_flagadm.o +diff -Nru linux-2.4.30-openwrt/drivers/mtd/maps/ar7-flash.c linux-2.4.30-wag-jiauka/drivers/mtd/maps/ar7-flash.c +--- linux-2.4.30-openwrt/drivers/mtd/maps/ar7-flash.c Thu Jan 1 01:00:00 1970 ++++ linux-2.4.30-wag-jiauka/drivers/mtd/maps/ar7-flash.c Thu Jun 9 01:49:32 2005 +@@ -0,0 +1,208 @@ ++/* ++ * $Id$ ++ * ++ * Normal mappings of chips in physical memory ++ */ ++ ++#include <linux/module.h> ++#include <linux/types.h> ++#include <linux/kernel.h> ++#include <asm/io.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/map.h> ++#include <linux/config.h> ++#include <linux/mtd/partitions.h> ++ ++#define WINDOW_ADDR CONFIG_MTD_AVALANCHE_START ++#define WINDOW_SIZE CONFIG_MTD_AVALANCHE_LEN ++#define BUSWIDTH CONFIG_MTD_AVALANCHE_BUSWIDTH ++ ++#include <asm/mips-boards/prom.h> ++extern char *prom_getenv(char *name); ++ ++static int create_mtd_partitions(void); ++static void __exit avalanche_mtd_cleanup(void); ++ ++/* avalanche__partition_info gives details on the logical partitions that splits ++ * the flash device into. If the size if zero we use up to the end of ++ * the device. */ ++#define MAX_NUM_PARTITIONS 5 ++static struct mtd_partition avalanche_partition_info[MAX_NUM_PARTITIONS]; ++static int num_of_partitions = 0; ++ ++static struct mtd_info *avalanche_mtd_info; ++ ++int avalanche_mtd_ready=0; ++ ++__u8 avalanche_read8(struct map_info *map, unsigned long ofs) ++{ ++ return __raw_readb(map->map_priv_1 + ofs); ++} ++ ++__u16 avalanche_read16(struct map_info *map, unsigned long ofs) ++{ ++ return __raw_readw(map->map_priv_1 + ofs); ++} ++ ++__u32 avalanche_read32(struct map_info *map, unsigned long ofs) ++{ ++ return __raw_readl(map->map_priv_1 + ofs); ++} ++ ++void avalanche_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len) ++{ ++ memcpy_fromio(to, map->map_priv_1 + from, len); ++} ++ ++void avalanche_write8(struct map_info *map, __u8 d, unsigned long adr) ++{ ++ __raw_writeb(d, map->map_priv_1 + adr); ++ mb(); ++} ++ ++void avalanche_write16(struct map_info *map, __u16 d, unsigned long adr) ++{ ++ __raw_writew(d, map->map_priv_1 + adr); ++ mb(); ++} ++ ++void avalanche_write32(struct map_info *map, __u32 d, unsigned long adr) ++{ ++ __raw_writel(d, map->map_priv_1 + adr); ++ mb(); ++} ++ ++void avalanche_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 avalanche_map = { ++ name: "Physically mapped flash", ++ size: WINDOW_SIZE, ++ buswidth: BUSWIDTH, ++ read8: avalanche_read8, ++ read16: avalanche_read16, ++ read32: avalanche_read32, ++ copy_from: avalanche_copy_from, ++ write8: avalanche_write8, ++ write16: avalanche_write16, ++ write32: avalanche_write32, ++ copy_to: avalanche_copy_to ++}; ++ ++int __init avalanche_mtd_init(void) ++{ ++ printk(KERN_NOTICE "avalanche flash device: 0x%lx at 0x%lx.\n", (unsigned long)WINDOW_SIZE, (unsigned long)WINDOW_ADDR); ++ avalanche_map.map_priv_1 = (unsigned long)ioremap_nocache(WINDOW_ADDR, WINDOW_SIZE); ++ ++ if (!avalanche_map.map_priv_1) { ++ printk("Failed to ioremap\n"); ++ return -EIO; ++ } ++ ++ avalanche_mtd_info = do_map_probe("cfi_probe", &avalanche_map); ++ if (!avalanche_mtd_info) ++ { ++ avalanche_mtd_cleanup(); ++ return -ENXIO; ++ } ++ ++ avalanche_mtd_info->module = THIS_MODULE; ++ ++ if (!create_mtd_partitions()) ++ add_mtd_device(avalanche_mtd_info); ++ else ++ add_mtd_partitions(avalanche_mtd_info, avalanche_partition_info, num_of_partitions); ++ ++ avalanche_mtd_ready=1; ++ ++ return 0; ++} ++ ++static char *strdup(char *str) ++{ ++ int n = strlen(str)+1; ++ char *s = kmalloc(n, GFP_KERNEL); ++ if (!s) return NULL; ++ return strcpy(s, str); ++} ++ ++ ++static int create_mtd_partitions(void) ++{ ++ unsigned int offset; ++ unsigned int size; ++ unsigned int found; ++ unsigned char *flash_base; ++ unsigned char *flash_end; ++ char *env_ptr; ++ char *base_ptr; ++ char *end_ptr; ++ ++ do { ++ char env_name[20]; ++ ++ found = 0; ++ ++ /* get base and end addresses of flash file system from environment */ ++ sprintf(env_name, "mtd%1u", num_of_partitions); ++printk("Looking for mtd device :%s:\n", env_name); ++ env_ptr = prom_getenv(env_name); ++ if(env_ptr == NULL) { ++ /* No more partitions to find */ ++ break; ++ } ++ ++ /* Extract the start and stop addresses of the partition */ ++ base_ptr = strtok(env_ptr, ","); ++ end_ptr = strtok(NULL, ","); ++ if ((base_ptr == NULL) || (end_ptr == NULL)) { ++ printk("JFFS2 ERROR: Invalid %s start,end.\n", env_name); ++ break; ++ } ++ ++ flash_base = (unsigned char*) simple_strtol(base_ptr, NULL, 0); ++ flash_end = (unsigned char*) simple_strtol(end_ptr, NULL, 0); ++ if((!flash_base) || (!flash_end)) { ++ printk("JFFS2 ERROR: Invalid %s start,end.\n", env_name); ++ break; ++ } ++ ++ offset = virt_to_bus(flash_base) - WINDOW_ADDR; ++ size = flash_end - flash_base; ++ printk("Found a %s image (0x%x), with size (0x%x).\n",env_name, offset, size); ++ ++ /* Setup the partition info. We duplicate the env_name for the partiton name */ ++ avalanche_partition_info[num_of_partitions].name = strdup(env_name); ++ avalanche_partition_info[num_of_partitions].offset = offset; ++ avalanche_partition_info[num_of_partitions].size = size; ++ avalanche_partition_info[num_of_partitions].mask_flags = 0; ++ num_of_partitions++; ++ } while (num_of_partitions < MAX_NUM_PARTITIONS); ++ ++ return num_of_partitions; ++} ++ ++static void __exit avalanche_mtd_cleanup(void) ++{ ++ avalanche_mtd_ready=0; ++ ++ if (avalanche_mtd_info) { ++ del_mtd_partitions(avalanche_mtd_info); ++ del_mtd_device(avalanche_mtd_info); ++ map_destroy(avalanche_mtd_info); ++ } ++ ++ if (avalanche_map.map_priv_1) { ++ iounmap((void *)avalanche_map.map_priv_1); ++ avalanche_map.map_priv_1 = 0; ++ } ++} ++ ++module_init(avalanche_mtd_init); ++module_exit(avalanche_mtd_cleanup); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Snehaprabha Narnakaje"); ++MODULE_DESCRIPTION("Avalanche CFI map driver"); |