--- a/arch/mips/sibyte/swarm/platform.c +++ b/arch/mips/sibyte/swarm/platform.c @@ -5,6 +5,7 @@ #include <linux/platform_device.h> #include <linux/ata_platform.h> +#include <asm/addrspace.h> #include <asm/sibyte/board.h> #include <asm/sibyte/sb1250_genbus.h> #include <asm/sibyte/sb1250_regs.h> @@ -137,3 +138,71 @@ static int __init sb1250_device_init(voi return ret; } device_initcall(sb1250_device_init); + +#ifdef CONFIG_SIBYTE_RHONE + +#include <linux/mtd/partitions.h> +#include <linux/mtd/physmap.h> + +/* The board has 16MB flash but CFE sets up only 2MB */ +#define PHYS_TO_K1(a) CKSEG1ADDR(a) +#define BOOTROM_SIZE 0x100 + +static void fixup_cs0_size(void) +{ + SBWRITECSR(((A_IO_EXT_CS_BASE(0)) + R_IO_EXT_MULT_SIZE), BOOTROM_SIZE); +} + +static struct mtd_partition flash_parts[] = { + { + .name = "cfe", + .offset = 0x00000000, + .size = 0x00200000, + .mask_flags = MTD_WRITEABLE, + }, + { + .name = "os", + .offset = 0x00200000, + .size = 0x00d00000, + }, + { + .name = "environment", + .offset = 0x00f00000, + .size = 0x00100000, + .mask_flags = MTD_WRITEABLE, + }, +}; + +static struct physmap_flash_data flash_data = { + .width = 1, + .nr_parts = ARRAY_SIZE(flash_parts), + .parts = flash_parts, +}; + +static struct resource flash_resource = { + .start = 0x1fc00000, + .end = 0x20bfffff, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device flash_device = { + .name = "physmap-flash", + .id = 0, + .resource = &flash_resource, + .num_resources = 1, + .dev = { + .platform_data = &flash_data, + }, +}; + +static int __init flash_setup(void) +{ + fixup_cs0_size(); + platform_device_register(&flash_device); + + return 0; +}; + +device_initcall(flash_setup); + +#endif /* CONFIG_SIBYTE_RHONE */