diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.c b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.c index 666b508fc4..cf6580ec02 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.c @@ -9,6 +9,9 @@ #include #include #include +#include +#include +#include #include "devices.h" #include "dev-m25p80.h" @@ -19,12 +22,79 @@ static struct spi_board_info ar71xx_spi_info[] = { .chip_select = 0, .max_speed_hz = 25000000, .modalias = "m25p80", + }, + { + .bus_num = 0, + .chip_select = 1, + .max_speed_hz = 25000000, + .modalias = "m25p80", } }; void __init ar71xx_add_device_m25p80(struct flash_platform_data *pdata) { ar71xx_spi_info[0].platform_data = pdata; - ar71xx_add_device_spi(NULL, ar71xx_spi_info, - ARRAY_SIZE(ar71xx_spi_info)); + ar71xx_add_device_spi(NULL, ar71xx_spi_info, 1); +} + +static struct flash_platform_data *multi_pdata; + +static struct mtd_info *concat_devs[2] = { NULL, NULL }; +static struct work_struct mtd_concat_work; + +static void mtd_concat_add_work(struct work_struct *work) +{ + struct mtd_info *mtd; + + mtd = mtd_concat_create(concat_devs, ARRAY_SIZE(concat_devs), "flash"); + +#ifdef CONFIG_MTD_PARTITIONS + add_mtd_partitions(mtd, multi_pdata->parts, multi_pdata->nr_parts); +#else + add_mtd_device(mtd); +#endif +} + +static void mtd_concat_add(struct mtd_info *mtd) +{ + static bool registered = false; + + if (registered) + return; + + if (!strcmp(mtd->name, "spi0.0")) + concat_devs[0] = mtd; + else if (!strcmp(mtd->name, "spi0.1")) + concat_devs[1] = mtd; + else + return; + + if (!concat_devs[0] || !concat_devs[1]) + return; + + registered = true; + INIT_WORK(&mtd_concat_work, mtd_concat_add_work); + schedule_work(&mtd_concat_work); +} + +static void mtd_concat_remove(struct mtd_info *mtd) +{ +} + +static void add_mtd_concat_notifier(void) +{ + static struct mtd_notifier not = { + .add = mtd_concat_add, + .remove = mtd_concat_remove, + }; + + register_mtd_user(¬); +} + + +void __init ar71xx_add_device_m25p80_multi(struct flash_platform_data *pdata) +{ + multi_pdata = pdata; + add_mtd_concat_notifier(); + ar71xx_add_device_spi(NULL, ar71xx_spi_info, ARRAY_SIZE(ar71xx_spi_info)); } diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.h b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.h index 0b8e56d03f..f732a8438a 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.h +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/dev-m25p80.h @@ -12,5 +12,6 @@ #include void ar71xx_add_device_m25p80(struct flash_platform_data *pdata) __init; +void ar71xx_add_device_m25p80_multi(struct flash_platform_data *pdata) __init; #endif /* _AR71XX_DEV_M25P80_H */ diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wzr-hp-ag300h.c b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wzr-hp-ag300h.c index c85657d7df..d4ba62c84c 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wzr-hp-ag300h.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/mach-wzr-hp-ag300h.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -68,58 +67,12 @@ static struct mtd_partition wzrhpag300h_flash_partitions[] = { #endif /* CONFIG_MTD_PARTITIONS */ -static struct mtd_info *concat_devs[2] = { NULL, NULL }; -static struct work_struct mtd_concat_work; - -static void mtd_concat_add_work(struct work_struct *work) -{ - struct mtd_info *mtd; - - mtd = mtd_concat_create(concat_devs, ARRAY_SIZE(concat_devs), "flash"); - +static struct flash_platform_data wzrhpag300h_flash_data = { #ifdef CONFIG_MTD_PARTITIONS - add_mtd_partitions(mtd, wzrhpag300h_flash_partitions, - ARRAY_SIZE(wzrhpag300h_flash_partitions)); -#else - add_mtd_device(mtd); + .parts = wzrhpag300h_flash_partitions, + .nr_parts = ARRAY_SIZE(wzrhpag300h_flash_partitions), #endif -} - -static void mtd_concat_add(struct mtd_info *mtd) -{ - static bool registered = false; - - if (registered) - return; - - if (!strcmp(mtd->name, "spi0.0")) - concat_devs[0] = mtd; - else if (!strcmp(mtd->name, "spi0.1")) - concat_devs[1] = mtd; - else - return; - - if (!concat_devs[0] || !concat_devs[1]) - return; - - registered = true; - INIT_WORK(&mtd_concat_work, mtd_concat_add_work); - schedule_work(&mtd_concat_work); -} - -static void mtd_concat_remove(struct mtd_info *mtd) -{ -} - -static void add_mtd_concat_notifier(void) -{ - static struct mtd_notifier not = { - .add = mtd_concat_add, - .remove = mtd_concat_remove, - }; - - register_mtd_user(¬); -} +}; static struct gpio_led wzrhpag300h_leds_gpio[] __initdata = { { @@ -169,21 +122,6 @@ static struct gpio_keys_button wzrhpag300h_gpio_keys[] __initdata = { } }; -static struct spi_board_info ar71xx_spi_info[] = { - { - .bus_num = 0, - .chip_select = 0, - .max_speed_hz = 25000000, - .modalias = "m25p80", - }, - { - .bus_num = 0, - .chip_select = 1, - .max_speed_hz = 25000000, - .modalias = "m25p80", - } -}; - static void __init wzrhpag300h_setup(void) { u8 *eeprom1 = (u8 *) KSEG1ADDR(0x1f051000); @@ -218,10 +156,7 @@ static void __init wzrhpag300h_setup(void) ARRAY_SIZE(wzrhpag300h_gpio_keys), wzrhpag300h_gpio_keys); - ar71xx_add_device_spi(NULL, ar71xx_spi_info, - ARRAY_SIZE(ar71xx_spi_info)); - - add_mtd_concat_notifier(); + ar71xx_add_device_m25p80_multi(&wzrhpag300h_flash_data); ap94_pci_init(eeprom1, mac1, eeprom2, mac2); }