diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c
index 4f44ef4a3b71c4cd33ff06ac248a9ce659eb3dda..d3fa051977022e4e179919391f2d1ee192c14b25 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb2011.c
@@ -11,6 +11,10 @@
 #include <linux/phy.h>
 #include <linux/platform_device.h>
 #include <linux/ar8216_platform.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
 
 #include <asm/mach-ath79/ar71xx_regs.h>
 
@@ -19,6 +23,43 @@
 #include "dev-m25p80.h"
 #include "machtypes.h"
 
+#define RB_ROUTERBOOT_OFFSET	0x0000
+#define RB_ROUTERBOOT_SIZE	0xb000
+#define RB_HARD_CFG_OFFSET	0xb000
+#define RB_HARD_CFG_SIZE	0x1000
+#define RB_BIOS_OFFSET		0xd000
+#define RB_BIOS_SIZE		0x2000
+#define RB_SOFT_CFG_OFFSET	0xf000
+#define RB_SOFT_CFG_SIZE	0x1000
+
+static struct mtd_partition rb2011_spi_partitions[] = {
+	{
+		.name		= "routerboot",
+		.offset		= RB_ROUTERBOOT_OFFSET,
+		.size		= RB_ROUTERBOOT_SIZE,
+		.mask_flags	= MTD_WRITEABLE,
+	}, {
+		.name		= "hard_config",
+		.offset		= RB_HARD_CFG_OFFSET,
+		.size		= RB_HARD_CFG_SIZE,
+		.mask_flags	= MTD_WRITEABLE,
+	}, {
+		.name		= "bios",
+		.offset		= RB_BIOS_OFFSET,
+		.size		= RB_BIOS_SIZE,
+		.mask_flags	= MTD_WRITEABLE,
+	}, {
+		.name		= "soft_config",
+		.offset		= RB_SOFT_CFG_OFFSET,
+		.size		= RB_SOFT_CFG_SIZE,
+	}
+};
+
+static struct flash_platform_data rb2011_spi_flash_data = {
+	.parts		= rb2011_spi_partitions,
+	.nr_parts	= ARRAY_SIZE(rb2011_spi_partitions),
+};
+
 static struct ar8327_pad_cfg rb2011_ar8327_pad0_cfg = {
 	.mode = AR8327_PAD_MAC_RGMII,
 	.txclk_delay_en = true,
@@ -65,7 +106,7 @@ static void __init rb2011_gmac_setup(void)
 
 static void __init rb2011_setup(void)
 {
-	ath79_register_m25p80(NULL);
+	ath79_register_m25p80(&rb2011_spi_flash_data);
 
 	rb2011_gmac_setup();