--- a/arch/mips/sibyte/swarm/platform.c +++ b/arch/mips/sibyte/swarm/platform.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -83,3 +84,71 @@ static int __init swarm_pata_init(void) device_initcall(swarm_pata_init); #endif /* defined(CONFIG_SIBYTE_SWARM) || defined(CONFIG_SIBYTE_LITTLESUR) */ + +#ifdef CONFIG_SIBYTE_RHONE + +#include +#include + +/* 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 */