| 1 | From a4d005c91d403d9f3d0272db6cc46202c06ec774 Mon Sep 17 00:00:00 2001 |
| 2 | From: Axel Gembe <ago@bastart.eu.org> |
| 3 | Date: Mon, 12 May 2008 18:54:09 +0200 |
| 4 | Subject: [PATCH] bcm963xx: flashmap support |
| 5 | |
| 6 | Signed-off-by: Axel Gembe <ago@bastart.eu.org> |
| 7 | --- |
| 8 | arch/mips/bcm63xx/boards/board_bcm963xx.c | 19 +---------------- |
| 9 | drivers/mtd/maps/bcm963xx-flash.c | 32 ++++++++++++++++++++++++---- |
| 10 | drivers/mtd/redboot.c | 13 +++++++++-- |
| 11 | 3 files changed, 38 insertions(+), 26 deletions(-) |
| 12 | |
| 13 | --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c |
| 14 | +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c |
| 15 | @@ -816,20 +816,6 @@ void __init board_setup(void) |
| 16 | panic("unexpected CPU for bcm963xx board"); |
| 17 | } |
| 18 | |
| 19 | -static struct mtd_partition mtd_partitions[] = { |
| 20 | - { |
| 21 | - .name = "cfe", |
| 22 | - .offset = 0x0, |
| 23 | - .size = 0x40000, |
| 24 | - } |
| 25 | -}; |
| 26 | - |
| 27 | -static struct physmap_flash_data flash_data = { |
| 28 | - .width = 2, |
| 29 | - .nr_parts = ARRAY_SIZE(mtd_partitions), |
| 30 | - .parts = mtd_partitions, |
| 31 | -}; |
| 32 | - |
| 33 | static struct resource mtd_resources[] = { |
| 34 | { |
| 35 | .start = 0, /* filled at runtime */ |
| 36 | @@ -839,12 +825,9 @@ static struct resource mtd_resources[] = |
| 37 | }; |
| 38 | |
| 39 | static struct platform_device mtd_dev = { |
| 40 | - .name = "physmap-flash", |
| 41 | + .name = "bcm963xx-flash", |
| 42 | .resource = mtd_resources, |
| 43 | .num_resources = ARRAY_SIZE(mtd_resources), |
| 44 | - .dev = { |
| 45 | - .platform_data = &flash_data, |
| 46 | - }, |
| 47 | }; |
| 48 | |
| 49 | static struct gpio_led_platform_data bcm63xx_led_data; |
| 50 | --- a/drivers/mtd/maps/bcm963xx-flash.c |
| 51 | +++ b/drivers/mtd/maps/bcm963xx-flash.c |
| 52 | @@ -27,6 +27,8 @@ |
| 53 | #include <linux/vmalloc.h> |
| 54 | #include <linux/platform_device.h> |
| 55 | #include <linux/io.h> |
| 56 | +#include <linux/magic.h> |
| 57 | +#include <linux/jffs2.h> |
| 58 | |
| 59 | #include <asm/mach-bcm63xx/bcm963xx_tag.h> |
| 60 | |
| 61 | @@ -35,6 +37,14 @@ |
| 62 | |
| 63 | #define PFX KBUILD_MODNAME ": " |
| 64 | |
| 65 | +struct squashfs_super_block { |
| 66 | + __le32 s_magic; |
| 67 | + __le32 pad0[9]; |
| 68 | + __le64 bytes_used; |
| 69 | +}; |
| 70 | + |
| 71 | +extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts, unsigned long fis_origin); |
| 72 | + |
| 73 | static struct mtd_partition *parsed_parts; |
| 74 | |
| 75 | static struct mtd_info *bcm963xx_mtd_info; |
| 76 | @@ -219,9 +229,21 @@ probe_ok: |
| 77 | } |
| 78 | } |
| 79 | } else { |
| 80 | - dev_info(&pdev->dev, "unsupported bootloader\n"); |
| 81 | - err = -ENODEV; |
| 82 | - goto err_probe; |
| 83 | + printk(KERN_INFO PFX "assuming RedBoot bootloader\n"); |
| 84 | + if (bcm963xx_mtd_info->size > 0x00400000) { |
| 85 | + printk(KERN_INFO PFX "Support for extended flash memory size : 0x%lx ; ONLY 64MBIT SUPPORT\n", bcm963xx_mtd_info->size); |
| 86 | + bcm963xx_map.virt = (u32)(BCM63XX_EXTENDED_SIZE); |
| 87 | + } |
| 88 | + |
| 89 | +#ifdef CONFIG_MTD_REDBOOT_PARTS |
| 90 | + if (parsed_nr_parts == 0) { |
| 91 | + int ret = parse_redboot_partitions(bcm963xx_mtd_info, &parsed_parts, 0); |
| 92 | + if (ret > 0) { |
| 93 | + part_type = "RedBoot"; |
| 94 | + parsed_nr_parts = ret; |
| 95 | + } |
| 96 | + } |
| 97 | +#endif |
| 98 | } |
| 99 | |
| 100 | return add_mtd_partitions(bcm963xx_mtd_info, parsed_parts, |
| 101 | --- a/drivers/mtd/redboot.c |
| 102 | +++ b/drivers/mtd/redboot.c |
| 103 | @@ -57,7 +57,7 @@ static inline int redboot_checksum(struc |
| 104 | return 1; |
| 105 | } |
| 106 | |
| 107 | -static int parse_redboot_partitions(struct mtd_info *master, |
| 108 | +int parse_redboot_partitions(struct mtd_info *master, |
| 109 | struct mtd_partition **pparts, |
| 110 | unsigned long fis_origin) |
| 111 | { |
| 112 | @@ -180,6 +180,14 @@ static int parse_redboot_partitions(stru |
| 113 | goto out; |
| 114 | } |
| 115 | |
| 116 | + if (!fis_origin) { |
| 117 | + for (i = 0; i < numslots; i++) { |
| 118 | + if (!strncmp(buf[i].name, "RedBoot", 8)) { |
| 119 | + fis_origin = (buf[i].flash_base & (master->size << 1) - 1); |
| 120 | + } |
| 121 | + } |
| 122 | + } |
| 123 | + |
| 124 | for (i = 0; i < numslots; i++) { |
| 125 | struct fis_list *new_fl, **prev; |
| 126 | |
| 127 | @@ -202,9 +210,8 @@ static int parse_redboot_partitions(stru |
| 128 | new_fl->img = &buf[i]; |
| 129 | if (fis_origin) { |
| 130 | buf[i].flash_base -= fis_origin; |
| 131 | - } else { |
| 132 | - buf[i].flash_base &= master->size-1; |
| 133 | } |
| 134 | + buf[i].flash_base &= (master->size << 1) - 1; |
| 135 | |
| 136 | /* I'm sure the JFFS2 code has done me permanent damage. |
| 137 | * I now think the following is _normal_ |
| 138 | |