#include <linux/squashfs_fs.h>
#include <linux/jffs2.h>
#include <linux/crc32.h>
+#ifdef CONFIG_SSB
#include <linux/ssb/ssb.h>
+#endif
#include <asm/io.h>
#define WINDOW_SIZE 0x400000
#define BUSWIDTH 2
+#ifdef CONFIG_SSB
extern struct ssb_bus ssb;
+#endif
static struct mtd_info *bcm947xx_mtd;
-static void bcm947xx_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
-{
-#define MIPS_MEMCPY_ALIGN 4
- map_word ret;
- ssize_t transfer;
- ssize_t done = 0;
- if ((len >= MIPS_MEMCPY_ALIGN) && (!(from & (MIPS_MEMCPY_ALIGN - 1))) && (!(((unsigned int)to & (MIPS_MEMCPY_ALIGN - 1))))) {
- done = len & ~(MIPS_MEMCPY_ALIGN - 1);
- memcpy_fromio(to, map->virt + from, done);
- }
- while (done < len) {
- ret = map->read(map, from + done);
- transfer = len - done;
- if (transfer > map->bankwidth)
- transfer = map->bankwidth;
- memcpy((void *)((unsigned long)to + done), &ret.x[0], transfer);
- done += transfer;
- }
-}
-
static struct map_info bcm947xx_map = {
name: "Physically mapped flash",
size: WINDOW_SIZE,
int __init init_bcm947xx_map(void)
{
+#ifdef CONFIG_SSB
struct ssb_mipscore *mcore = &ssb.mipscore;
+#endif
size_t size;
int ret = 0;
#ifdef CONFIG_MTD_PARTITIONS
struct mtd_partition *parts;
int i;
#endif
+
+#ifdef CONFIG_SSB
u32 window = mcore->flash_window;
u32 window_size = mcore->flash_window_size;
bcm947xx_map.phys = window;
bcm947xx_map.size = window_size;
bcm947xx_map.virt = ioremap_nocache(window, window_size);
+#else
+ printk("flash init: 0x%08x 0x%08x\n", WINDOW_ADDR, WINDOW_SIZE);
+ bcm947xx_map.virt = ioremap_nocache(WINDOW_ADDR, WINDOW_SIZE);
+#endif
if (!bcm947xx_map.virt) {
printk("Failed to ioremap\n");
}
simple_map_init(&bcm947xx_map);
- bcm947xx_map.copy_from = bcm947xx_map_copy_from;
-
if (!(bcm947xx_mtd = do_map_probe("cfi_probe", &bcm947xx_map))) {
printk("Failed to do_map_probe\n");
iounmap((void *)bcm947xx_map.virt);