summaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2011-08-01 13:26:08 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2011-08-01 13:26:08 +0200
commit38e356a749191c1832c9726b0b6cb913737af700 (patch)
treee8649d752a11d05d20615b2d4fd3a506baab516b /target
parent2ee33f7b7bb6f36dcee29f7df1e6122b55139e92 (diff)
different make bulkallmod fixes
Diffstat (limited to 'target')
-rw-r--r--target/config/Config.in23
-rw-r--r--target/linux/config/Config.in.bluetooth2
-rw-r--r--target/linux/config/Config.in.crypto2
-rw-r--r--target/linux/patches/2.6.39/cris.patch13194
-rw-r--r--target/linux/patches/2.6.39/ocf-20100325.patch90188
5 files changed, 103398 insertions, 11 deletions
diff --git a/target/config/Config.in b/target/config/Config.in
index 5162a6c72..4ab0999be 100644
--- a/target/config/Config.in
+++ b/target/config/Config.in
@@ -32,15 +32,12 @@ endchoice
choice
prompt "Target Kernel"
depends on ADK_TARGET_SYSTEM_LEMOTE_YEELONG
-config ADK_TARGET_KERNEL
- boolean "Choose target kernel"
+config ADK_TARGET_KERNEL64
+ boolean "64 Bit Kernel"
config ADK_TARGET_KERNEL32
boolean "32 Bit Kernel"
-config ADK_TARGET_KERNEL64
- boolean "64 Bit Kernel"
-
endchoice
config ADK_o32
@@ -61,17 +58,15 @@ config ADK_TARGET_ABI
choice
prompt "Target ABI"
depends on ADK_TARGET_KERNEL64 && ADK_LINUX_MIPS
-config ADK_ABI
- boolean "Choose target ABI"
-
-config ADK_TARGET_ABI_O32
- boolean "O32 ABI (old)"
- select ADK_o32
config ADK_TARGET_ABI_N32
boolean "N32 ABI (new)"
select ADK_n32
+config ADK_TARGET_ABI_O32
+ boolean "O32 ABI (old)"
+ select ADK_o32
+
config ADK_TARGET_ABI_N64
boolean "N64 ABI"
select ADK_n64
@@ -269,6 +264,12 @@ config ADK_TARGET_ABI_CFLAGS
default "-mabi=n32 -Wl,-m -Wl,elf32ltsmipn32" if ADK_TARGET_ABI_N32
default "-mabi=64 -Wl,-m -Wl,elf64ltsmip" if ADK_TARGET_ABI_N64
+config ADK_TARGET_KERNEL_LDFLAGS
+ string
+ default "-mabi=64 -m elf64ltsmip" if ADK_TARGET_ABI_N32
+ default "-mabi=64 -m elf64ltsmip" if ADK_TARGET_ABI_O32
+ default "-mabi=64 -m elf64ltsmip" if ADK_TARGET_ABI_N64
+
config ADK_TARGET_CFLAGS
string
default "-march=geode" if ADK_CPU_GEODE
diff --git a/target/linux/config/Config.in.bluetooth b/target/linux/config/Config.in.bluetooth
index 26ac067b1..73760d14c 100644
--- a/target/linux/config/Config.in.bluetooth
+++ b/target/linux/config/Config.in.bluetooth
@@ -82,6 +82,7 @@ config ADK_KPACKAGE_KMOD_BT_HCIBTUSB
tristate
default n
depends on ADK_KPACKAGE_KMOD_BT
+ depends on ADK_TARGET_WITH_USB
help
Bluetooth HCI USB driver.
This driver is required if you want to use Bluetooth devices with
@@ -106,6 +107,7 @@ config ADK_KPACKAGE_KMOD_BT_HCIBCM203X
select ADK_KPACKAGE_KMOD_FW_LOADER
select ADK_KPACKAGE_KMOD_BT_HCIBTUSB
depends on ADK_KPACKAGE_KMOD_BT
+ depends on ADK_LINUX_X86 || ADK_LINUX_X86_64
help
Bluetooth HCI BCM203x USB driver.
This driver provides the firmware loading mechanism for the Broadcom
diff --git a/target/linux/config/Config.in.crypto b/target/linux/config/Config.in.crypto
index ff6fb6b00..694443350 100644
--- a/target/linux/config/Config.in.crypto
+++ b/target/linux/config/Config.in.crypto
@@ -65,6 +65,8 @@ config ADK_KPACKAGE_KMOD_OCF_HIFN
default n
select ADK_KERNEL_OCF_OCF
depends on ADK_TARGET_WITH_PCI || ADK_TARGET_WITH_MINIPCI
+ depends on !ADK_HARDWARE_QEMU
+ depends on ADK_LINUX_X86 || ADK_LINUX_X86_64
select ADK_KPACKAGE_KMOD_CRYPTO_AES
help
Engine for cryptodev that uses Hifn based accelerators
diff --git a/target/linux/patches/2.6.39/cris.patch b/target/linux/patches/2.6.39/cris.patch
new file mode 100644
index 000000000..f58391a5d
--- /dev/null
+++ b/target/linux/patches/2.6.39/cris.patch
@@ -0,0 +1,13194 @@
+diff -Nur linux-2.6.39.orig/arch/cris/arch-v10/drivers/axisflashmap.c linux-2.6.39/arch/cris/arch-v10/drivers/axisflashmap.c
+--- linux-2.6.39.orig/arch/cris/arch-v10/drivers/axisflashmap.c 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/arch-v10/drivers/axisflashmap.c 2011-07-28 16:16:35.633425525 +0200
+@@ -113,7 +113,7 @@
+
+ /* If no partition-table was found, we use this default-set. */
+ #define MAX_PARTITIONS 7
+-#define NUM_DEFAULT_PARTITIONS 3
++#define NUM_DEFAULT_PARTITIONS 4
+
+ /*
+ * Default flash size is 2MB. CONFIG_ETRAX_PTABLE_SECTOR is most likely the
+@@ -122,19 +122,24 @@
+ */
+ static struct mtd_partition axis_default_partitions[NUM_DEFAULT_PARTITIONS] = {
+ {
+- .name = "boot firmware",
+- .size = CONFIG_ETRAX_PTABLE_SECTOR,
++ .name = "kernel",
++ .size = 0x00,
+ .offset = 0
+ },
+ {
+- .name = "kernel",
+- .size = 0x200000 - (6 * CONFIG_ETRAX_PTABLE_SECTOR),
+- .offset = CONFIG_ETRAX_PTABLE_SECTOR
++ .name = "rootfs",
++ .size = 0x200000 ,
++ .offset = 0x200000
++ },
++ {
++ .name = "cfgfs",
++ .size = 0x20000 ,
++ .offset = CONFIG_ETRAX_MTD_SIZE - 0x20000
+ },
+ {
+- .name = "filesystem",
+- .size = 5 * CONFIG_ETRAX_PTABLE_SECTOR,
+- .offset = 0x200000 - (5 * CONFIG_ETRAX_PTABLE_SECTOR)
++ .name = "linux",
++ .size = CONFIG_ETRAX_MTD_SIZE - 0x20000,
++ .offset = 0
+ }
+ };
+
+@@ -275,6 +280,11 @@
+ struct partitiontable_entry *ptable;
+ int use_default_ptable = 1; /* Until proven otherwise. */
+ const char pmsg[] = " /dev/flash%d at 0x%08x, size 0x%08x\n";
++ unsigned int kernel_part_size = 0;
++ unsigned char *flash_mem = (unsigned char*)(FLASH_CACHED_ADDR);
++ unsigned int flash_scan_count = 0;
++ const char *part_magic = "ACME_PART_MAGIC";
++ unsigned int magic_len = strlen(part_magic);
+
+ if (!(mymtd = flash_probe())) {
+ /* There's no reason to use this module if no flash chip can
+@@ -286,6 +296,31 @@
+ mymtd->name, mymtd->size);
+ axisflash_mtd = mymtd;
+ }
++ /* scan flash to findout where out partition starts */
++
++ printk(KERN_INFO "Scanning flash for end of kernel magic\n");
++ for(flash_scan_count = 0; flash_scan_count < 100000; flash_scan_count++){
++ if(strncmp(&flash_mem[flash_scan_count], part_magic, magic_len - 1) == 0)
++ {
++ kernel_part_size = flash_mem[flash_scan_count + magic_len ];
++ kernel_part_size <<= 8;
++ kernel_part_size += flash_mem[flash_scan_count + magic_len + 2];
++ kernel_part_size <<= 8;
++ kernel_part_size += flash_mem[flash_scan_count + magic_len + 1];
++ kernel_part_size <<= 8;
++ kernel_part_size += flash_mem[flash_scan_count + magic_len + 3];
++ printk(KERN_INFO "Kernel ends at 0x%.08X\n", kernel_part_size);
++ flash_scan_count = 1100000;
++ }
++ }
++
++
++ if(kernel_part_size){
++ kernel_part_size = (kernel_part_size & 0xffff0000);
++ axis_default_partitions[0].size = kernel_part_size;
++ axis_default_partitions[1].size = mymtd->size - axis_default_partitions[0].size - axis_default_partitions[2].size;
++ axis_default_partitions[1].offset = axis_default_partitions[0].size;
++ }
+
+ if (mymtd) {
+ mymtd->owner = THIS_MODULE;
+@@ -354,21 +389,6 @@
+ use_default_ptable = !ptable_ok;
+ }
+
+- if (romfs_in_flash) {
+- /* Add an overlapping device for the root partition (romfs). */
+-
+- axis_partitions[pidx].name = "romfs";
+- axis_partitions[pidx].size = romfs_length;
+- axis_partitions[pidx].offset = romfs_start - FLASH_CACHED_ADDR;
+- axis_partitions[pidx].mask_flags |= MTD_WRITEABLE;
+-
+- printk(KERN_INFO
+- " Adding readonly flash partition for romfs image:\n");
+- printk(pmsg, pidx, axis_partitions[pidx].offset,
+- axis_partitions[pidx].size);
+- pidx++;
+- }
+-
+ #ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
+ if (mymtd) {
+ main_partition.size = mymtd->size;
+@@ -391,36 +411,6 @@
+ if (err)
+ panic("axisflashmap could not add MTD partitions!\n");
+ }
+-
+- if (!romfs_in_flash) {
+- /* Create an RAM device for the root partition (romfs). */
+-
+-#if !defined(CONFIG_MTD_MTDRAM) || (CONFIG_MTDRAM_TOTAL_SIZE != 0) || (CONFIG_MTDRAM_ABS_POS != 0)
+- /* No use trying to boot this kernel from RAM. Panic! */
+- printk(KERN_EMERG "axisflashmap: Cannot create an MTD RAM "
+- "device due to kernel (mis)configuration!\n");
+- panic("This kernel cannot boot from RAM!\n");
+-#else
+- struct mtd_info *mtd_ram;
+-
+- mtd_ram = kmalloc(sizeof(struct mtd_info), GFP_KERNEL);
+- if (!mtd_ram)
+- panic("axisflashmap couldn't allocate memory for "
+- "mtd_info!\n");
+-
+- printk(KERN_INFO " Adding RAM partition for romfs image:\n");
+- printk(pmsg, pidx, (unsigned)romfs_start,
+- (unsigned)romfs_length);
+-
+- err = mtdram_init_device(mtd_ram,
+- (void *)romfs_start,
+- romfs_length,
+- "romfs");
+- if (err)
+- panic("axisflashmap could not initialize MTD RAM "
+- "device!\n");
+-#endif
+- }
+ return err;
+ }
+
+diff -Nur linux-2.6.39.orig/arch/cris/arch-v10/drivers/axisflashmap.c.orig linux-2.6.39/arch/cris/arch-v10/drivers/axisflashmap.c.orig
+--- linux-2.6.39.orig/arch/cris/arch-v10/drivers/axisflashmap.c.orig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/cris/arch-v10/drivers/axisflashmap.c.orig 2011-05-19 06:06:34.000000000 +0200
+@@ -0,0 +1,430 @@
++/*
++ * Physical mapping layer for MTD using the Axis partitiontable format
++ *
++ * Copyright (c) 2001, 2002 Axis Communications AB
++ *
++ * This file is under the GPL.
++ *
++ * First partition is always sector 0 regardless of if we find a partitiontable
++ * or not. In the start of the next sector, there can be a partitiontable that
++ * tells us what other partitions to define. If there isn't, we use a default
++ * partition split defined below.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++
++#include <linux/mtd/concat.h>
++#include <linux/mtd/map.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/mtdram.h>
++#include <linux/mtd/partitions.h>
++
++#include <asm/axisflashmap.h>
++#include <asm/mmu.h>
++#include <arch/sv_addr_ag.h>
++
++#ifdef CONFIG_CRIS_LOW_MAP
++#define FLASH_UNCACHED_ADDR KSEG_8
++#define FLASH_CACHED_ADDR KSEG_5
++#else
++#define FLASH_UNCACHED_ADDR KSEG_E
++#define FLASH_CACHED_ADDR KSEG_F
++#endif
++
++#if CONFIG_ETRAX_FLASH_BUSWIDTH==1
++#define flash_data __u8
++#elif CONFIG_ETRAX_FLASH_BUSWIDTH==2
++#define flash_data __u16
++#elif CONFIG_ETRAX_FLASH_BUSWIDTH==4
++#define flash_data __u32
++#endif
++
++/* From head.S */
++extern unsigned long romfs_start, romfs_length, romfs_in_flash;
++
++/* The master mtd for the entire flash. */
++struct mtd_info* axisflash_mtd = NULL;
++
++/* Map driver functions. */
++
++static map_word flash_read(struct map_info *map, unsigned long ofs)
++{
++ map_word tmp;
++ tmp.x[0] = *(flash_data *)(map->map_priv_1 + ofs);
++ return tmp;
++}
++
++static void flash_copy_from(struct map_info *map, void *to,
++ unsigned long from, ssize_t len)
++{
++ memcpy(to, (void *)(map->map_priv_1 + from), len);
++}
++
++static void flash_write(struct map_info *map, map_word d, unsigned long adr)
++{
++ *(flash_data *)(map->map_priv_1 + adr) = (flash_data)d.x[0];
++}
++
++/*
++ * The map for chip select e0.
++ *
++ * We run into tricky coherence situations if we mix cached with uncached
++ * accesses to we only use the uncached version here.
++ *
++ * The size field is the total size where the flash chips may be mapped on the
++ * chip select. MTD probes should find all devices there and it does not matter
++ * if there are unmapped gaps or aliases (mirrors of flash devices). The MTD
++ * probes will ignore them.
++ *
++ * The start address in map_priv_1 is in virtual memory so we cannot use
++ * MEM_CSE0_START but must rely on that FLASH_UNCACHED_ADDR is the start
++ * address of cse0.
++ */
++static struct map_info map_cse0 = {
++ .name = "cse0",
++ .size = MEM_CSE0_SIZE,
++ .bankwidth = CONFIG_ETRAX_FLASH_BUSWIDTH,
++ .read = flash_read,
++ .copy_from = flash_copy_from,
++ .write = flash_write,
++ .map_priv_1 = FLASH_UNCACHED_ADDR
++};
++
++/*
++ * The map for chip select e1.
++ *
++ * If there was a gap between cse0 and cse1, map_priv_1 would get the wrong
++ * address, but there isn't.
++ */
++static struct map_info map_cse1 = {
++ .name = "cse1",
++ .size = MEM_CSE1_SIZE,
++ .bankwidth = CONFIG_ETRAX_FLASH_BUSWIDTH,
++ .read = flash_read,
++ .copy_from = flash_copy_from,
++ .write = flash_write,
++ .map_priv_1 = FLASH_UNCACHED_ADDR + MEM_CSE0_SIZE
++};
++
++/* If no partition-table was found, we use this default-set. */
++#define MAX_PARTITIONS 7
++#define NUM_DEFAULT_PARTITIONS 3
++
++/*
++ * Default flash size is 2MB. CONFIG_ETRAX_PTABLE_SECTOR is most likely the
++ * size of one flash block and "filesystem"-partition needs 5 blocks to be able
++ * to use JFFS.
++ */
++static struct mtd_partition axis_default_partitions[NUM_DEFAULT_PARTITIONS] = {
++ {
++ .name = "boot firmware",
++ .size = CONFIG_ETRAX_PTABLE_SECTOR,
++ .offset = 0
++ },
++ {
++ .name = "kernel",
++ .size = 0x200000 - (6 * CONFIG_ETRAX_PTABLE_SECTOR),
++ .offset = CONFIG_ETRAX_PTABLE_SECTOR
++ },
++ {
++ .name = "filesystem",
++ .size = 5 * CONFIG_ETRAX_PTABLE_SECTOR,
++ .offset = 0x200000 - (5 * CONFIG_ETRAX_PTABLE_SECTOR)
++ }
++};
++
++/* Initialize the ones normally used. */
++static struct mtd_partition axis_partitions[MAX_PARTITIONS] = {
++ {
++ .name = "part0",
++ .size = CONFIG_ETRAX_PTABLE_SECTOR,
++ .offset = 0
++ },
++ {
++ .name = "part1",
++ .size = 0,
++ .offset = 0
++ },
++ {
++ .name = "part2",
++ .size = 0,
++ .offset = 0
++ },
++ {
++ .name = "part3",
++ .size = 0,
++ .offset = 0
++ },
++ {
++ .name = "part4",
++ .size = 0,
++ .offset = 0
++ },
++ {
++ .name = "part5",
++ .size = 0,
++ .offset = 0
++ },
++ {
++ .name = "part6",
++ .size = 0,
++ .offset = 0
++ },
++};
++
++#ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
++/* Main flash device */
++static struct mtd_partition main_partition = {
++ .name = "main",
++ .size = 0,
++ .offset = 0
++};
++#endif
++
++/*
++ * Probe a chip select for AMD-compatible (JEDEC) or CFI-compatible flash
++ * chips in that order (because the amd_flash-driver is faster).
++ */
++static struct mtd_info *probe_cs(struct map_info *map_cs)
++{
++ struct mtd_info *mtd_cs = NULL;
++
++ printk(KERN_INFO
++ "%s: Probing a 0x%08lx bytes large window at 0x%08lx.\n",
++ map_cs->name, map_cs->size, map_cs->map_priv_1);
++
++#ifdef CONFIG_MTD_CFI
++ mtd_cs = do_map_probe("cfi_probe", map_cs);
++#endif
++#ifdef CONFIG_MTD_JEDECPROBE
++ if (!mtd_cs)
++ mtd_cs = do_map_probe("jedec_probe", map_cs);
++#endif
++
++ return mtd_cs;
++}
++
++/*
++ * Probe each chip select individually for flash chips. If there are chips on
++ * both cse0 and cse1, the mtd_info structs will be concatenated to one struct
++ * so that MTD partitions can cross chip boundries.
++ *
++ * The only known restriction to how you can mount your chips is that each
++ * chip select must hold similar flash chips. But you need external hardware
++ * to do that anyway and you can put totally different chips on cse0 and cse1
++ * so it isn't really much of a restriction.
++ */
++static struct mtd_info *flash_probe(void)
++{
++ struct mtd_info *mtd_cse0;
++ struct mtd_info *mtd_cse1;
++ struct mtd_info *mtd_cse;
++
++ mtd_cse0 = probe_cs(&map_cse0);
++ mtd_cse1 = probe_cs(&map_cse1);
++
++ if (!mtd_cse0 && !mtd_cse1) {
++ /* No chip found. */
++ return NULL;
++ }
++
++ if (mtd_cse0 && mtd_cse1) {
++ struct mtd_info *mtds[] = { mtd_cse0, mtd_cse1 };
++
++ /* Since the concatenation layer adds a small overhead we
++ * could try to figure out if the chips in cse0 and cse1 are
++ * identical and reprobe the whole cse0+cse1 window. But since
++ * flash chips are slow, the overhead is relatively small.
++ * So we use the MTD concatenation layer instead of further
++ * complicating the probing procedure.
++ */
++ mtd_cse = mtd_concat_create(mtds, ARRAY_SIZE(mtds),
++ "cse0+cse1");
++ if (!mtd_cse) {
++ printk(KERN_ERR "%s and %s: Concatenation failed!\n",
++ map_cse0.name, map_cse1.name);
++
++ /* The best we can do now is to only use what we found
++ * at cse0.
++ */
++ mtd_cse = mtd_cse0;
++ map_destroy(mtd_cse1);
++ }
++ } else {
++ mtd_cse = mtd_cse0? mtd_cse0 : mtd_cse1;
++ }
++
++ return mtd_cse;
++}
++
++/*
++ * Probe the flash chip(s) and, if it succeeds, read the partition-table
++ * and register the partitions with MTD.
++ */
++static int __init init_axis_flash(void)
++{
++ struct mtd_info *mymtd;
++ int err = 0;
++ int pidx = 0;
++ struct partitiontable_head *ptable_head = NULL;
++ struct partitiontable_entry *ptable;
++ int use_default_ptable = 1; /* Until proven otherwise. */
++ const char pmsg[] = " /dev/flash%d at 0x%08x, size 0x%08x\n";
++
++ if (!(mymtd = flash_probe())) {
++ /* There's no reason to use this module if no flash chip can
++ * be identified. Make sure that's understood.
++ */
++ printk(KERN_INFO "axisflashmap: Found no flash chip.\n");
++ } else {
++ printk(KERN_INFO "%s: 0x%08x bytes of flash memory.\n",
++ mymtd->name, mymtd->size);
++ axisflash_mtd = mymtd;
++ }
++
++ if (mymtd) {
++ mymtd->owner = THIS_MODULE;
++ ptable_head = (struct partitiontable_head *)(FLASH_CACHED_ADDR +
++ CONFIG_ETRAX_PTABLE_SECTOR +
++ PARTITION_TABLE_OFFSET);
++ }
++ pidx++; /* First partition is always set to the default. */
++
++ if (ptable_head && (ptable_head->magic == PARTITION_TABLE_MAGIC)
++ && (ptable_head->size <
++ (MAX_PARTITIONS * sizeof(struct partitiontable_entry) +
++ PARTITIONTABLE_END_MARKER_SIZE))
++ && (*(unsigned long*)((void*)ptable_head + sizeof(*ptable_head) +
++ ptable_head->size -
++ PARTITIONTABLE_END_MARKER_SIZE)
++ == PARTITIONTABLE_END_MARKER)) {
++ /* Looks like a start, sane length and end of a
++ * partition table, lets check csum etc.
++ */
++ int ptable_ok = 0;
++ struct partitiontable_entry *max_addr =
++ (struct partitiontable_entry *)
++ ((unsigned long)ptable_head + sizeof(*ptable_head) +
++ ptable_head->size);
++ unsigned long offset = CONFIG_ETRAX_PTABLE_SECTOR;
++ unsigned char *p;
++ unsigned long csum = 0;
++
++ ptable = (struct partitiontable_entry *)
++ ((unsigned long)ptable_head + sizeof(*ptable_head));
++
++ /* Lets be PARANOID, and check the checksum. */
++ p = (unsigned char*) ptable;
++
++ while (p <= (unsigned char*)max_addr) {
++ csum += *p++;
++ csum += *p++;
++ csum += *p++;
++ csum += *p++;
++ }
++ ptable_ok = (csum == ptable_head->checksum);
++
++ /* Read the entries and use/show the info. */
++ printk(KERN_INFO " Found a%s partition table at 0x%p-0x%p.\n",
++ (ptable_ok ? " valid" : "n invalid"), ptable_head,
++ max_addr);
++
++ /* We have found a working bootblock. Now read the
++ * partition table. Scan the table. It ends when
++ * there is 0xffffffff, that is, empty flash.
++ */
++ while (ptable_ok
++ && ptable->offset != 0xffffffff
++ && ptable < max_addr
++ && pidx < MAX_PARTITIONS) {
++
++ axis_partitions[pidx].offset = offset + ptable->offset;
++ axis_partitions[pidx].size = ptable->size;
++
++ printk(pmsg, pidx, axis_partitions[pidx].offset,
++ axis_partitions[pidx].size);
++ pidx++;
++ ptable++;
++ }
++ use_default_ptable = !ptable_ok;
++ }
++
++ if (romfs_in_flash) {
++ /* Add an overlapping device for the root partition (romfs). */
++
++ axis_partitions[pidx].name = "romfs";
++ axis_partitions[pidx].size = romfs_length;
++ axis_partitions[pidx].offset = romfs_start - FLASH_CACHED_ADDR;
++ axis_partitions[pidx].mask_flags |= MTD_WRITEABLE;
++
++ printk(KERN_INFO
++ " Adding readonly flash partition for romfs image:\n");
++ printk(pmsg, pidx, axis_partitions[pidx].offset,
++ axis_partitions[pidx].size);
++ pidx++;
++ }
++
++#ifdef CONFIG_ETRAX_AXISFLASHMAP_MTD0WHOLE
++ if (mymtd) {
++ main_partition.size = mymtd->size;
++ err = add_mtd_partitions(mymtd, &main_partition, 1);
++ if (err)
++ panic("axisflashmap: Could not initialize "
++ "partition for whole main mtd device!\n");
++ }
++#endif
++
++ if (mymtd) {
++ if (use_default_ptable) {
++ printk(KERN_INFO " Using default partition table.\n");
++ err = add_mtd_partitions(mymtd, axis_default_partitions,
++ NUM_DEFAULT_PARTITIONS);
++ } else {
++ err = add_mtd_partitions(mymtd, axis_partitions, pidx);
++ }
++
++ if (err)
++ panic("axisflashmap could not add MTD partitions!\n");
++ }
++
++ if (!romfs_in_flash) {
++ /* Create an RAM device for the root partition (romfs). */
++
++#if !defined(CONFIG_MTD_MTDRAM) || (CONFIG_MTDRAM_TOTAL_SIZE != 0) || (CONFIG_MTDRAM_ABS_POS != 0)
++ /* No use trying to boot this kernel from RAM. Panic! */
++ printk(KERN_EMERG "axisflashmap: Cannot create an MTD RAM "
++ "device due to kernel (mis)configuration!\n");
++ panic("This kernel cannot boot from RAM!\n");
++#else
++ struct mtd_info *mtd_ram;
++
++ mtd_ram = kmalloc(sizeof(struct mtd_info), GFP_KERNEL);
++ if (!mtd_ram)
++ panic("axisflashmap couldn't allocate memory for "
++ "mtd_info!\n");
++
++ printk(KERN_INFO " Adding RAM partition for romfs image:\n");
++ printk(pmsg, pidx, (unsigned)romfs_start,
++ (unsigned)romfs_length);
++
++ err = mtdram_init_device(mtd_ram,
++ (void *)romfs_start,
++ romfs_length,
++ "romfs");
++ if (err)
++ panic("axisflashmap could not initialize MTD RAM "
++ "device!\n");
++#endif
++ }
++ return err;
++}
++
++/* This adds the above to the kernels init-call chain. */
++module_init(init_axis_flash);
++
++EXPORT_SYMBOL(axisflash_mtd);
+diff -Nur linux-2.6.39.orig/arch/cris/arch-v10/drivers/ds1302.c linux-2.6.39/arch/cris/arch-v10/drivers/ds1302.c
+--- linux-2.6.39.orig/arch/cris/arch-v10/drivers/ds1302.c 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/arch-v10/drivers/ds1302.c 2011-07-28 16:16:35.863415658 +0200
+@@ -22,6 +22,7 @@
+ #include <linux/mutex.h>
+ #include <linux/bcd.h>
+ #include <linux/capability.h>
++#include <linux/device.h>
+
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+@@ -501,6 +502,10 @@
+ return 0;
+ }
+
++#ifdef CONFIG_SYSFS
++static struct class *rtc_class;
++#endif
++
+ static int __init ds1302_register(void)
+ {
+ ds1302_init();
+@@ -509,6 +514,12 @@
+ ds1302_name, RTC_MAJOR_NR);
+ return -1;
+ }
++ #ifdef CONFIG_SYSFS
++ rtc_class = class_create(THIS_MODULE, "rtc");
++ class_device_create(rtc_class, NULL, MKDEV(RTC_MAJOR_NR, 0),
++ NULL, "rtc");
++ #endif
++
+ return 0;
+
+ }
+diff -Nur linux-2.6.39.orig/arch/cris/arch-v10/drivers/gpio.c linux-2.6.39/arch/cris/arch-v10/drivers/gpio.c
+--- linux-2.6.39.orig/arch/cris/arch-v10/drivers/gpio.c 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/arch-v10/drivers/gpio.c 2011-07-28 16:16:36.023425394 +0200
+@@ -20,6 +20,7 @@
+ #include <linux/poll.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
++#include <linux/device.h>
+
+ #include <asm/etraxgpio.h>
+ #include <arch/svinto.h>
+@@ -798,6 +799,10 @@
+
+ /* main driver initialization routine, called from mem.c */
+
++#ifdef CONFIG_SYSFS
++static struct class *gpio_class;
++#endif
++
+ static int __init gpio_init(void)
+ {
+ int res;
+@@ -811,6 +816,13 @@
+ return res;
+ }
+
++#ifdef CONFIG_SYSFS
++ gpio_class = class_create(THIS_MODULE, "gpio");
++ device_create(gpio_class, NULL, MKDEV(GPIO_MAJOR, 0), NULL, "gpioa");
++ device_create(gpio_class, NULL, MKDEV(GPIO_MAJOR, 1), NULL, "gpiob");
++ device_create(gpio_class, NULL, MKDEV(GPIO_MAJOR, 2), NULL, "leds");
++ device_create(gpio_class, NULL, MKDEV(GPIO_MAJOR, 3), NULL, "gpiog");
++#endif
+ /* Clear all leds */
+ #if defined (CONFIG_ETRAX_CSP0_LEDS) || defined (CONFIG_ETRAX_PA_LEDS) || defined (CONFIG_ETRAX_PB_LEDS)
+ CRIS_LED_NETWORK_SET(0);
+diff -Nur linux-2.6.39.orig/arch/cris/arch-v10/lib/hw_settings.S linux-2.6.39/arch/cris/arch-v10/lib/hw_settings.S
+--- linux-2.6.39.orig/arch/cris/arch-v10/lib/hw_settings.S 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/arch-v10/lib/hw_settings.S 2011-07-28 16:16:36.163758404 +0200
+@@ -58,3 +58,5 @@
+ .dword R_PORT_PB_SET
+ .dword PB_SET_VALUE
+ .dword 0 ; No more register values
++ .ascii "ACME_PART_MAGIC"
++ .dword 0xdeadc0de
+diff -Nur linux-2.6.39.orig/arch/cris/arch-v10/mm/init.c linux-2.6.39/arch/cris/arch-v10/mm/init.c
+--- linux-2.6.39.orig/arch/cris/arch-v10/mm/init.c 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/arch-v10/mm/init.c 2011-07-28 16:16:36.313421347 +0200
+@@ -184,6 +184,9 @@
+
+ free_area_init_node(0, zones_size, PAGE_OFFSET >> PAGE_SHIFT, 0);
+ }
++void free_initrd_mem(unsigned long start, unsigned long end)
++{
++}
+
+ /* Initialize remaps of some I/O-ports. It is important that this
+ * is called before any driver is initialized.
+diff -Nur linux-2.6.39.orig/arch/cris/boot/compressed/Makefile linux-2.6.39/arch/cris/boot/compressed/Makefile
+--- linux-2.6.39.orig/arch/cris/boot/compressed/Makefile 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/boot/compressed/Makefile 2011-07-28 16:16:36.453421314 +0200
+@@ -18,7 +18,7 @@
+ OBJECTS-$(CONFIG_ETRAX_ARCH_V32) = $(obj)/head_v32.o
+ OBJECTS-$(CONFIG_ETRAX_ARCH_V10) = $(obj)/head_v10.o
+ OBJECTS= $(OBJECTS-y) $(obj)/misc.o
+-OBJCOPYFLAGS = -O binary --remove-section=.bss
++#OBJCOPYFLAGS = -O binary --remove-section=.bss
+
+ quiet_cmd_image = BUILD $@
+ cmd_image = cat $(obj)/decompress.bin $(obj)/piggy.gz > $@
+diff -Nur linux-2.6.39.orig/arch/cris/boot/Makefile linux-2.6.39/arch/cris/boot/Makefile
+--- linux-2.6.39.orig/arch/cris/boot/Makefile 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/boot/Makefile 2011-07-28 16:16:36.573671907 +0200
+@@ -5,7 +5,7 @@
+ objcopyflags-$(CONFIG_ETRAX_ARCH_V10) += -R .note -R .comment
+ objcopyflags-$(CONFIG_ETRAX_ARCH_V32) += --remove-section=.bss --remove-section=.note.gnu.build-id
+
+-OBJCOPYFLAGS = -O binary $(objcopyflags-y)
++#OBJCOPYFLAGS = -O binary $(objcopyflags-y)
+
+
+ subdir- := compressed rescue
+@@ -17,7 +17,6 @@
+
+ $(obj)/compressed/vmlinux: $(obj)/Image FORCE
+ $(Q)$(MAKE) $(build)=$(obj)/compressed $@
+- $(Q)$(MAKE) $(build)=$(obj)/rescue $(obj)/rescue/rescue.bin
+
+ $(obj)/zImage: $(obj)/compressed/vmlinux
+ @cp $< $@
+diff -Nur linux-2.6.39.orig/arch/cris/Kconfig linux-2.6.39/arch/cris/Kconfig
+--- linux-2.6.39.orig/arch/cris/Kconfig 2011-05-19 06:06:34.000000000 +0200
++++ linux-2.6.39/arch/cris/Kconfig 2011-07-28 16:16:36.713417234 +0200
+@@ -168,6 +168,12 @@
+ help
+ Size of DRAM (decimal in MB) typically 2, 8 or 16.
+
++config ETRAX_MTD_SIZE
++ hex "MTD size (hex)"
++ default "0x00800000"
++ help
++ Size of MTD device typically 4 or 8 MB.
++
+ config ETRAX_VMEM_SIZE
+ int "Video memory size (dec, in MB)"
+ depends on ETRAX_ARCH_V32 && !ETRAXFS
+@@ -273,7 +279,7 @@
+ select MTD_CFI_AMDSTD
+ select MTD_JEDECPROBE if ETRAX_ARCH_V32
+ select MTD_CHAR
+- select MTD_BLOCK
++ select MTD_BLOCK_RO
+ select MTD_PARTITIONS
+ select MTD_COMPLEX_MAPPINGS
+ help
+@@ -660,6 +666,11 @@
+
+ source "drivers/ide/Kconfig"
+
++#mysteriously part of this standard linux driver was removed from cris build! - info@crisos.org
++source "drivers/scsi/Kconfig"
++
++source "drivers/media/Kconfig"
++
+ source "drivers/net/Kconfig"
+
+ source "drivers/i2c/Kconfig"
+@@ -675,6 +686,8 @@
+
+ source "fs/Kconfig"
+
++source "sound/Kconfig"
++
+ source "drivers/usb/Kconfig"
+
+ source "drivers/uwb/Kconfig"
+diff -Nur linux-2.6.39.orig/arch/cris/Kconfig.orig linux-2.6.39/arch/cris/Kconfig.orig
+--- linux-2.6.39.orig/arch/cris/Kconfig.orig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.39/arch/cris/Kconfig.orig 2011-05-19 06:06:34.000000000 +0200
+@@ -0,0 +1,690 @@
++config MMU
++ bool
++ default y
++
++config ZONE_DMA
++ bool
++ default y
++
++config RWSEM_GENERIC_SPINLOCK
++ bool
++ default y
++
++config RWSEM_XCHGADD_ALGORITHM
++ bool
++
++config GENERIC_CMOS_UPDATE
++ def_bool y
++
++config ARCH_USES_GETTIMEOFFSET
++ def_bool n
++
++config GENERIC_IOMAP
++ bool
++ default y
++
++config ARCH_HAS_ILOG2_U32
++ bool
++ default n
++
++config ARCH_HAS_ILOG2_U64
++ bool
++ default n
++
++config GENERIC_FIND_NEXT_BIT
++ bool
++ default y
++
++config GENERIC_HWEIGHT
++ bool
++ default y
++
++config GENERIC_CALIBRATE_DELAY
++ bool
++ default y
++
++config NO_IOPORT
++ def_bool y
++
++config FORCE_MAX_ZONEORDER
++ int
++ default 6
++
++config CRIS
++ bool
++ default y
++ select HAVE_IDE
++ select HAVE_GENERIC_HARDIRQS
++ select GENERIC_IRQ_SHOW
++
++config HZ
++ int
++ default 100
++
++source "init/Kconfig"
++
++source "kernel/Kconfig.freezer"
++
++menu "General setup"
++
++source "fs/Kconfig.binfmt"
++
++config ETRAX_CMDLINE
++ string "Kernel command line"
++ default "root=/dev/mtdblock3"
++ help
++ Pass additional commands to the kernel.
++
++config ETRAX_WATCHDOG
++ bool "Enable ETRAX watchdog"
++ help
++ Enable the built-in watchdog timer support on ETRAX based embedded
++ network computers.
++
++config ETRAX_WATCHDOG_NICE_DOGGY
++ bool "Disable watchdog during Oops printouts"
++ depends on ETRAX_WATCHDOG
++ help
++ By enabling this you make sure that the watchdog does not bite while
++ printing oopses. Recommended for development systems but not for
++ production releases.
++
++config ETRAX_FAST_TIMER
++ bool "Enable ETRAX fast timer API"
++ help
++ This options enables the API to a fast timer implementation using
++ timer1 to get sub jiffie resolution timers (primarily one-shot
++ timers).
++ This is needed if CONFIG_ETRAX_SERIAL_FAST_TIMER is enabled.
++
++config ETRAX_KMALLOCED_MODULES
++ bool "Enable module allocation with kmalloc"
++ help
++ Enable module allocation with kmalloc instead of vmalloc.
++
++config OOM_REBOOT
++ bool "Enable reboot at out of memory"
++
++source "kernel/Kconfig.preempt"
++
++source mm/Kconfig
++
++endmenu
++
++menu "Hardware setup"
++
++choice
++ prompt "Processor type"
++ default ETRAX100LX
++
++config ETRAX100LX
++ bool "ETRAX-100LX-v1"
++ select ARCH_USES_GETTIMEOFFSET
++ help
++ Support version 1 of the ETRAX 100LX.
++
++config ETRAX100LX_V2
++ bool "ETRAX-100LX-v2"
++ select ARCH_USES_GETTIMEOFFSET
++ help
++ Support version 2 of the ETRAX 100LX.
++
++config SVINTO_SIM
++ bool "ETRAX-100LX-for-xsim-simulator"
++ select ARCH_USES_GETTIMEOFFSET
++ help
++ Support the xsim ETRAX Simulator.
++
++config ETRAXFS
++ bool "ETRAX-FS-V32"
++ help
++ Support CRIS V32.
++
++config CRIS_MACH_ARTPEC3
++ bool "ARTPEC-3"
++ help
++ Support Axis ARTPEC-3.
++
++endchoice
++
++config ETRAX_VCS_SIM
++ bool "VCS Simulator"
++ help
++ Setup hardware to be run in the VCS simulator.
++
++config ETRAX_ARCH_V10
++ bool
++ default y if ETRAX100LX || ETRAX100LX_V2
++ default n if !(ETRAX100LX || ETRAX100LX_V2)
++
++config ETRAX_ARCH_V32
++ bool
++ default y if (ETRAXFS || CRIS_MACH_ARTPEC3)
++ default n if !(ETRAXFS || CRIS_MACH_ARTPEC3)
++
++config ETRAX_DRAM_SIZE
++ int "DRAM size (dec, in MB)"
++ default "8"
++ help
++ Size of DRAM (decimal in MB) typically 2, 8 or 16.
++
++config ETRAX_VMEM_SIZE
++ int "Video memory size (dec, in MB)"
++ depends on ETRAX_ARCH_V32 && !ETRAXFS
++ default 8 if !ETRAXFS
++ help
++ Size of Video accessible memory (decimal, in MB).
++
++config ETRAX_FLASH_BUSWIDTH
++ int "Buswidth of NOR flash in bytes"
++ default "2"
++ help
++ Width in bytes of the NOR Flash bus (1, 2 or 4). Is usually 2.
++
++config ETRAX_NANDFLASH_BUSWIDTH
++ int "Buswidth of NAND flash in bytes"
++ default "1"
++ help
++ Width in bytes of the NAND flash (1 or 2).
++
++config ETRAX_FLASH1_SIZE
++ int "FLASH1 size (dec, in MB. 0 = Unknown)"
++ default "0"
++
++choice
++ prompt "Product debug-port"
++ default ETRAX_DEBUG_PORT0
++
++config ETRAX_DEBUG_PORT0
++ bool "Serial-0"
++ help
++ Choose a serial port for the ETRAX debug console. Default to
++ port 0.
++
++config ETRAX_DEBUG_PORT1
++ bool "Serial-1"
++ help
++ Use serial port 1 for the console.
++
++config ETRAX_DEBUG_PORT2
++ bool "Serial-2"
++ help
++ Use serial port 2 for the console.
++
++config ETRAX_DEBUG_PORT3
++ bool "Serial-3"
++ help
++ Use serial port 3 for the console.
++
++config ETRAX_DEBUG_PORT_NULL
++ bool "disabled"
++ help
++ Disable serial-port debugging.
++
++endchoice
++
++choice
++ prompt "Kernel GDB port"
++ depends on ETRAX_KGDB
++ default ETRAX_KGDB_PORT0
++ help
++ Choose a serial port for kernel debugging. NOTE: This port should
++ not be enabled under Drivers for built-in interfaces (as it has its
++ own initialization code) and should not be the same as the debug port.
++
++config ETRAX_KGDB_PORT0
++ bool "Serial-0"
++ help
++ Use serial port 0 for kernel debugging.
++
++config ETRAX_KGDB_PORT1
++ bool "Serial-1"
++ help
++ Use serial port 1 for kernel debugging.
++
++config ETRAX_KGDB_PORT2
++ bool "Serial-2"
++ help
++ Use serial port 2 for kernel debugging.
++
++config ETRAX_KGDB_PORT3
++ bool "Serial-3"