From e4e1a303f54f0c8bc5b5dac06e42dd5f23c5a7b0 Mon Sep 17 00:00:00 2001 From: Andy Boyett Date: Sun, 1 Nov 2009 05:34:46 +0000 Subject: 2.6.28: add ZyXEL and Amit flashmapping and start fixing up GPIO support. Thanks Daniel Gimpelevich SVN-Revision: 18254 --- target/linux/rdc/config-2.6.28 | 13 +- target/linux/rdc/modules.mk | 5 + .../rdc/patches-2.6.28/002-platform_support.patch | 308 +++++++++++++++++++++ .../linux/rdc/patches-2.6.28/003-rootfstype.patch | 11 - 4 files changed, 319 insertions(+), 18 deletions(-) create mode 100644 target/linux/rdc/modules.mk create mode 100644 target/linux/rdc/patches-2.6.28/002-platform_support.patch diff --git a/target/linux/rdc/config-2.6.28 b/target/linux/rdc/config-2.6.28 index 80aecef86a..7fec13148f 100644 --- a/target/linux/rdc/config-2.6.28 +++ b/target/linux/rdc/config-2.6.28 @@ -33,7 +33,7 @@ CONFIG_BOUNCE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CLASSIC_RCU=y CONFIG_CLOCKSOURCE_WATCHDOG=y -CONFIG_CMDLINE="console=ttyS0,38400" +CONFIG_CMDLINE="console=ttyS0,38400 rootfstype=squashfs,jffs2" CONFIG_CMDLINE_BOOL=y # CONFIG_CMDLINE_OVERRIDE is not set # CONFIG_COMPAT_VDSO is not set @@ -176,13 +176,12 @@ CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_COMPLEX_MAPPINGS is not set CONFIG_MTD_CONCAT=y # CONFIG_MTD_NETSC520 is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PHYSMAP_LEN=0 +CONFIG_MTD_PHYSMAP_START=0x8000000 # CONFIG_MTD_R8610 is not set -CONFIG_MTD_RDC3210=y -CONFIG_MTD_RDC3210_ALLOW_JFFS2=y -CONFIG_MTD_RDC3210_BUSWIDTH=2 -# CONFIG_MTD_RDC3210_FACTORY_PRESENT is not set -CONFIG_MTD_RDC3210_SIZE=0x400000 -# CONFIG_MTD_RDC3210_STATIC_MAP is not set +# CONFIG_MTD_RDC3210 is not set # CONFIG_MTD_SC520CDP is not set # CONFIG_MTD_TS5500 is not set # CONFIG_MTRR is not set diff --git a/target/linux/rdc/modules.mk b/target/linux/rdc/modules.mk new file mode 100644 index 0000000000..668c1c063c --- /dev/null +++ b/target/linux/rdc/modules.mk @@ -0,0 +1,5 @@ +define KernelPackage/ide-core/install + rm -f $(1)/etc/modules.d/30-ide-core +endef + + diff --git a/target/linux/rdc/patches-2.6.28/002-platform_support.patch b/target/linux/rdc/patches-2.6.28/002-platform_support.patch new file mode 100644 index 0000000000..e42052ecb4 --- /dev/null +++ b/target/linux/rdc/patches-2.6.28/002-platform_support.patch @@ -0,0 +1,308 @@ +Index: linux-2.6.28.10/arch/x86/mach-rdc321x/gpio.c +=================================================================== +--- linux-2.6.28.10.orig/arch/x86/mach-rdc321x/gpio.c 2009-05-02 11:54:43.000000000 -0700 ++++ linux-2.6.28.10/arch/x86/mach-rdc321x/gpio.c 2009-10-30 22:24:23.779705091 -0700 +@@ -26,7 +26,7 @@ + #include + #include + +-#include ++#include + #include + + +@@ -74,8 +74,8 @@ + } + + /* initially setup the 2 copies of the gpio data registers. +- This function must be called by the platform setup code. */ +-void __init rdc321x_gpio_setup() ++ This function is called before the platform setup code. */ ++static int __init rdc321x_gpio_setup(void) + { + /* this might not be, what others (BIOS, bootloader, etc.) + wrote to these registers before, but it's a good guess. Still +@@ -83,6 +83,8 @@ + + gpio_data_reg1 = rdc321x_conf_read(RDC321X_GPIO_DATA_REG1); + gpio_data_reg2 = rdc321x_conf_read(RDC321X_GPIO_DATA_REG2); ++ ++ return 0; + } + + /* determine, if gpio number is valid */ +@@ -192,3 +194,5 @@ + return 0; + } + EXPORT_SYMBOL(rdc_gpio_direction_output); ++ ++arch_initcall(rdc321x_gpio_setup); +Index: linux-2.6.28.10/arch/x86/mach-rdc321x/platform.c +=================================================================== +--- linux-2.6.28.10.orig/arch/x86/mach-rdc321x/platform.c 2009-05-02 11:54:43.000000000 -0700 ++++ linux-2.6.28.10/arch/x86/mach-rdc321x/platform.c 2009-10-30 22:37:01.595670310 -0700 +@@ -1,7 +1,9 @@ + /* + * Generic RDC321x platform devices + * ++ * Copyright (C) 2007-2008 OpenWrt.org + * Copyright (C) 2007 Florian Fainelli ++ * Copyright (C) 2008 Daniel Gimpelevich + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License +@@ -25,13 +27,59 @@ + #include + #include + #include ++#include + #include ++#include ++#include ++#include ++#include ++#include ++#include + +-#include ++#include ++ ++/* Flash */ ++#ifdef CONFIG_MTD_R8610 ++#define CONFIG_MTD_RDC3210 1 ++#elif defined CONFIG_MTD_RDC3210 ++static struct resource rdc_flash_resource[] = { ++ [0] = { ++ .start = (u32)-CONFIG_MTD_RDC3210_SIZE, ++ .end = (u32)-1, ++ .flags = IORESOURCE_MEM, ++ }, ++}; ++ ++static struct platform_device rdc_flash_device = { ++ .name = "rdc321x-flash", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(rdc_flash_resource), ++ .resource = rdc_flash_resource, ++}; ++#else ++static struct mtd_partition rdc_flash_parts[15]; ++ ++static struct resource rdc_flash_resource = { ++ .end = (u32)-1, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct physmap_flash_data rdc_flash_data = { ++ .parts = rdc_flash_parts, ++}; ++ ++static struct platform_device rdc_flash_device = { ++ .name = "physmap-flash", ++ .id = -1, ++ .resource = &rdc_flash_resource, ++ .num_resources = 1, ++ .dev.platform_data = &rdc_flash_data, ++}; ++#endif + + /* LEDS */ + static struct gpio_led default_leds[] = { +- { .name = "rdc:dmz", .gpio = 1, }, ++ { .name = "rdc321x:dmz", .gpio = 1, }, + }; + + static struct gpio_led_platform_data rdc321x_led_data = { +@@ -54,16 +102,163 @@ + .num_resources = 0, + }; + ++/* Button */ ++static struct gpio_keys_button rdc321x_gpio_btn[] = { ++ { ++ .gpio = 0, ++ .code = BTN_0, ++ .desc = "Reset", ++ .active_low = 1, ++ } ++}; ++ ++static struct gpio_keys_platform_data rdc321x_gpio_btn_data = { ++ .buttons = rdc321x_gpio_btn, ++ .nbuttons = ARRAY_SIZE(rdc321x_gpio_btn), ++}; ++ ++static struct platform_device rdc321x_button = { ++ .name = "gpio-keys", ++ .id = -1, ++ .dev = { ++ .platform_data = &rdc321x_gpio_btn_data, ++ } ++}; ++ + static struct platform_device *rdc321x_devs[] = { ++ &rdc_flash_device, + &rdc321x_leds, +- &rdc321x_wdt ++ &rdc321x_wdt, ++ &rdc321x_button, + }; + ++static int probe_flash_start(struct map_info *the_map) ++{ ++ struct mtd_info *res; ++ ++ the_map->virt = ioremap(the_map->phys, the_map->size); ++ if (the_map->virt == NULL) ++ return 1; ++ for (the_map->bankwidth = 32; the_map->bankwidth; the_map->bankwidth ++ >>= 1) { ++ res = do_map_probe("cfi_probe", the_map); ++ if (res == NULL) ++ res = do_map_probe("jedec_probe", the_map); ++ if (res != NULL) ++ break; ++ } ++ iounmap(the_map->virt); ++ if (res != NULL) ++ the_map->phys = (u32)-(s32)(the_map->size = res->size); ++ return res == NULL; ++} ++ + static int __init rdc_board_setup(void) + { +- rdc321x_gpio_setup(); ++#ifndef CONFIG_MTD_RDC3210 ++ struct map_info rdc_map_info; ++ u32 the_header[4]; + ++ ROOT_DEV = 0; ++ rdc_map_info.name = rdc_flash_device.name; ++ rdc_map_info.phys = 0xff000000; ++ rdc_map_info.size = 0x1000000; ++ rdc_map_info.bankwidth = 2; ++ rdc_map_info.set_vpp = NULL; ++ simple_map_init(&rdc_map_info); ++ while (probe_flash_start(&rdc_map_info)) { ++ rdc_map_info.phys++; ++ if (--rdc_map_info.size) ++ panic("Could not find start of flash!"); ++ } ++ rdc_flash_resource.start = rdc_map_info.phys; ++ rdc_flash_data.width = rdc_map_info.bankwidth; ++ rdc_map_info.virt = ioremap_nocache(rdc_map_info.phys, 0x10); ++ if (rdc_map_info.virt == NULL) ++ panic("Could not ioremap to read device magic!"); ++ the_header[0] = ((u32 *)rdc_map_info.virt)[0]; ++ the_header[1] = ((u32 *)rdc_map_info.virt)[1]; ++ the_header[2] = ((u32 *)rdc_map_info.virt)[2]; ++ the_header[3] = ((u32 *)rdc_map_info.virt)[3]; ++ iounmap(rdc_map_info.virt); ++ if (!memcmp(the_header, "GMTK", 4)) { /* Gemtek */ ++ /* TODO */ ++ } else if (!memcmp(the_header, "CSYS", 4)) { /* Sitecom */ ++ /* TODO */ ++ } else if (!memcmp(((u8 *)the_header) + 14, "Li", 2)) { /* AMIT */ ++ rdc_flash_parts[0].name = "kernel_parthdr"; ++ rdc_flash_parts[0].offset = 0; ++ rdc_flash_parts[0].size = 0x10; ++ rdc_flash_parts[1].name = "kernel"; ++ rdc_flash_parts[1].offset = 0x10; ++ rdc_flash_parts[1].size = 0xffff0; ++ rdc_flash_parts[2].name = "rootfs_parthdr"; ++ rdc_flash_parts[2].offset = 0x100000; ++ rdc_flash_parts[2].size = 0x10; ++ rdc_flash_parts[3].name = "rootfs"; ++ rdc_flash_parts[3].offset = 0x100010; ++ rdc_flash_parts[3].size = rdc_map_info.size - 0x160010; ++ rdc_flash_parts[4].name = "config_parthdr"; ++ rdc_flash_parts[4].offset = rdc_map_info.size - 0x60000; ++ rdc_flash_parts[4].size = 0x10; ++ rdc_flash_parts[5].name = "config"; ++ rdc_flash_parts[5].offset = rdc_map_info.size - 0x5fff0; ++ rdc_flash_parts[5].size = 0xfff0; ++ rdc_flash_parts[6].name = "recoveryfs_parthdr"; ++ rdc_flash_parts[6].offset = rdc_map_info.size - 0x50000; ++ rdc_flash_parts[6].size = 0x10; ++ rdc_flash_parts[7].name = "recoveryfs"; ++ rdc_flash_parts[7].offset = rdc_map_info.size - 0x4fff0; ++ rdc_flash_parts[7].size = 0x3fff0; ++ rdc_flash_parts[8].name = "recovery_parthdr"; ++ rdc_flash_parts[8].offset = rdc_map_info.size - 0x10000; ++ rdc_flash_parts[8].size = 0x10; ++ rdc_flash_parts[9].name = "recovery"; ++ rdc_flash_parts[9].offset = rdc_map_info.size - 0xfff0; ++ rdc_flash_parts[9].size = 0x7ff0; ++ rdc_flash_parts[10].name = "productinfo_parthdr"; ++ rdc_flash_parts[10].offset = rdc_map_info.size - 0x8000; ++ rdc_flash_parts[10].size = 0x10; ++ rdc_flash_parts[11].name = "productinfo"; ++ rdc_flash_parts[11].offset = rdc_map_info.size - 0x7ff0; ++ rdc_flash_parts[11].size = 0x1ff0; ++ rdc_flash_parts[12].name = "bootloader_parthdr"; ++ rdc_flash_parts[12].offset = rdc_map_info.size - 0x6000; ++ rdc_flash_parts[12].size = 0x10; ++ rdc_flash_parts[13].name = "bootloader"; ++ rdc_flash_parts[13].offset = rdc_map_info.size - 0x5ff0; ++ rdc_flash_parts[13].size = 0x5ff0; ++ rdc_flash_parts[14].name = "everything"; ++ rdc_flash_parts[14].offset = 0; ++ rdc_flash_parts[14].size = rdc_map_info.size; ++ rdc_flash_data.nr_parts = 15; ++ } else { /* ZyXEL */ ++ rdc_flash_parts[0].name = "kernel"; ++ rdc_flash_parts[0].offset = 0; ++ rdc_flash_parts[0].size = 0x100000; ++ rdc_flash_parts[1].name = "rootfs"; ++ rdc_flash_parts[1].offset = 0x100000; ++ rdc_flash_parts[1].size = rdc_map_info.size - 0x140000; ++ rdc_flash_parts[2].name = "linux"; ++ rdc_flash_parts[2].offset = 0; ++ rdc_flash_parts[2].size = rdc_map_info.size - 0x40000; ++ rdc_flash_parts[3].name = "config"; ++ rdc_flash_parts[3].offset = rdc_map_info.size - 0x40000; ++ rdc_flash_parts[3].size = 0x10000; ++ rdc_flash_parts[4].name = "productinfo"; ++ rdc_flash_parts[4].offset = rdc_map_info.size - 0x30000; ++ rdc_flash_parts[4].size = 0x10000; ++ rdc_flash_parts[5].name = "bootloader"; ++ rdc_flash_parts[5].offset = rdc_map_info.size - 0x20000; ++ rdc_flash_parts[5].size = 0x20000; ++ rdc_flash_data.nr_parts = 6; ++ } ++#endif + return platform_add_devices(rdc321x_devs, ARRAY_SIZE(rdc321x_devs)); + } + ++#ifdef CONFIG_MTD_RDC3210 + arch_initcall(rdc_board_setup); ++#else ++late_initcall(rdc_board_setup); ++#endif +Index: linux-2.6.28.10/arch/x86/Makefile +=================================================================== +--- linux-2.6.28.10.orig/arch/x86/Makefile 2009-05-02 11:54:43.000000000 -0700 ++++ linux-2.6.28.10/arch/x86/Makefile 2009-10-30 22:04:55.444672426 -0700 +@@ -113,6 +113,10 @@ + mflags-$(CONFIG_X86_VOYAGER) := -Iarch/x86/include/asm/mach-voyager + mcore-$(CONFIG_X86_VOYAGER) := arch/x86/mach-voyager/ + ++# RDC subarch support ++mflags-$(CONFIG_X86_RDC321X) := -Iarch/x86/include/asm/mach-rdc321x ++mcore-$(CONFIG_X86_RDC321X) += arch/x86/mach-rdc321x/ ++ + # generic subarchitecture + mflags-$(CONFIG_X86_GENERICARCH):= -Iarch/x86/include/asm/mach-generic + fcore-$(CONFIG_X86_GENERICARCH) += arch/x86/mach-generic/ +Index: linux-2.6.28.10/arch/x86/include/asm/mach-rdc321x/gpio.h +=================================================================== +--- linux-2.6.28.10.orig/arch/x86/include/asm/mach-rdc321x/gpio.h 2009-10-30 22:31:04.680702348 -0700 ++++ linux-2.6.28.10/arch/x86/include/asm/mach-rdc321x/gpio.h 2009-10-30 22:34:24.024670851 -0700 +@@ -9,7 +9,6 @@ + extern int rdc_gpio_direction_output(unsigned gpio, int value); + extern int rdc_gpio_request(unsigned gpio, const char *label); + extern void rdc_gpio_free(unsigned gpio); +-extern void __init rdc321x_gpio_setup(void); + + /* Wrappers for the arch-neutral GPIO API */ + diff --git a/target/linux/rdc/patches-2.6.28/003-rootfstype.patch b/target/linux/rdc/patches-2.6.28/003-rootfstype.patch index 386e638971..e69de29bb2 100644 --- a/target/linux/rdc/patches-2.6.28/003-rootfstype.patch +++ b/target/linux/rdc/patches-2.6.28/003-rootfstype.patch @@ -1,11 +0,0 @@ ---- a/init/do_mounts.c -+++ b/init/do_mounts.c -@@ -189,6 +189,8 @@ static void __init get_fs_names(char *pa - { - char *s = page; - -+ if (!root_fs_names) -+ root_fs_names = "squashfs,jffs2"; - if (root_fs_names) { - strcpy(page, root_fs_names); - while (*s++) { -- cgit v1.2.3