summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--arch/arm/boards/a9m2410/a9m2410.c4
-rw-r--r--arch/arm/boards/a9m2440/a9m2440.c4
-rw-r--r--arch/arm/boards/at91rm9200ek/init.c4
-rw-r--r--arch/arm/boards/at91sam9260ek/init.c8
-rw-r--r--arch/arm/boards/at91sam9261ek/init.c8
-rw-r--r--arch/arm/boards/at91sam9263ek/init.c12
-rw-r--r--arch/arm/boards/at91sam9m10g45ek/init.c8
-rw-r--r--arch/arm/boards/at91sam9x5ek/init.c8
-rw-r--r--arch/arm/boards/dss11/init.c6
-rw-r--r--arch/arm/boards/edb93xx/edb93xx.c4
-rw-r--r--arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c4
-rw-r--r--arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c4
-rw-r--r--arch/arm/boards/eukrea_cpuimx27/lowlevel_init.S2
-rw-r--r--arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c4
-rw-r--r--arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c4
-rw-r--r--arch/arm/boards/freescale-mx25-3-stack/3stack.c4
-rw-r--r--arch/arm/boards/freescale-mx25-3-stack/lowlevel_init.S2
-rw-r--r--arch/arm/boards/freescale-mx35-3-stack/3stack.c8
-rw-r--r--arch/arm/boards/freescale-mx35-3-stack/lowlevel_init.S2
-rw-r--r--arch/arm/boards/freescale-mx51-pdk/board.c4
-rw-r--r--arch/arm/boards/freescale-mx53-loco/board.c4
-rw-r--r--arch/arm/boards/freescale-mx53-smd/board.c4
-rw-r--r--arch/arm/boards/freescale-mx6-arm2/board.c4
-rw-r--r--arch/arm/boards/guf-cupid/board.c4
-rw-r--r--arch/arm/boards/guf-neso/board.c4
-rw-r--r--arch/arm/boards/imx21ads/lowlevel_init.S2
-rw-r--r--arch/arm/boards/imx27ads/imx27ads.c4
-rw-r--r--arch/arm/boards/karo-tx25/board.c4
-rw-r--r--arch/arm/boards/karo-tx51/tx51.c4
-rw-r--r--arch/arm/boards/mini2440/mini2440.c4
-rw-r--r--arch/arm/boards/mioa701/board.c13
-rw-r--r--arch/arm/boards/mioa701/env/bin/barebox_update5
-rw-r--r--arch/arm/boards/mioa701/env/bin/dps1_unlock12
-rw-r--r--arch/arm/boards/mioa701/env/bin/dps1_update12
-rw-r--r--arch/arm/boards/mioa701/env/bin/init19
-rw-r--r--arch/arm/boards/mioa701/env/data/dps1.raw.gzbin0 -> 1239 bytes
-rw-r--r--arch/arm/boards/mmccpu/init.c4
-rw-r--r--arch/arm/boards/netx/netx.c4
-rw-r--r--arch/arm/boards/nhk8815/setup.c8
-rw-r--r--arch/arm/boards/pcm027/board.c4
-rw-r--r--arch/arm/boards/pcm037/lowlevel_init.S2
-rw-r--r--arch/arm/boards/pcm037/pcm037.c4
-rw-r--r--arch/arm/boards/pcm038/Makefile5
-rw-r--r--arch/arm/boards/pcm038/pcm038.c183
-rw-r--r--arch/arm/boards/pcm038/pcm038.dox5
-rw-r--r--arch/arm/boards/pcm038/pcm970.c80
-rw-r--r--arch/arm/boards/pcm043/pcm043.c8
-rw-r--r--arch/arm/boards/pcm049/board.c6
-rw-r--r--arch/arm/boards/phycard-a-l1/pca-a-l1.c6
-rw-r--r--arch/arm/boards/phycard-a-xl2/pca-a-xl2.c6
-rw-r--r--arch/arm/boards/phycard-i.MX27/lowlevel_init.S2
-rw-r--r--arch/arm/boards/phycard-i.MX27/pca100.c4
-rw-r--r--arch/arm/boards/pm9261/init.c4
-rw-r--r--arch/arm/boards/pm9263/init.c4
-rw-r--r--arch/arm/boards/pm9g45/init.c4
-rw-r--r--arch/arm/boards/scb9328/scb9328.c4
-rw-r--r--arch/arm/boards/tny-a926x/init.c8
-rw-r--r--arch/arm/boards/tqma53/board.c4
-rw-r--r--arch/arm/boards/usb-a926x/init.c8
-rw-r--r--arch/arm/boards/versatile/versatilepb.c4
-rw-r--r--arch/arm/cpu/start.c2
-rw-r--r--arch/arm/include/asm/barebox-arm-head.h3
-rw-r--r--arch/arm/include/asm/setup.h53
-rw-r--r--arch/arm/lib/armlinux.c2
-rw-r--r--arch/arm/lib/bootm.c3
-rw-r--r--arch/arm/mach-imx/Kconfig8
-rw-r--r--arch/arm/mach-omap/devices-gpmc-nand.c2
-rw-r--r--arch/arm/mach-omap/xload.c2
-rw-r--r--arch/arm/mach-samsung/include/mach/s3c-generic.h4
-rw-r--r--arch/arm/mach-samsung/s3c24xx-clocks.c17
-rw-r--r--arch/arm/tools/mach-types193
-rw-r--r--arch/blackfin/boards/ipe337/ipe337.c4
-rw-r--r--arch/blackfin/lib/blackfin_linux.c2
-rw-r--r--arch/mips/boards/qemu-malta/init.c4
-rw-r--r--arch/mips/boot/start.S12
-rw-r--r--arch/mips/include/debug_ll_ns16550.h40
-rw-r--r--arch/mips/lib/Makefile1
-rw-r--r--arch/mips/lib/bootm.c43
-rw-r--r--arch/mips/mach-malta/include/mach/debug_ll.h11
-rw-r--r--arch/mips/mach-malta/include/mach/hardware.h1
-rw-r--r--arch/nios2/boards/generic/generic.c4
-rw-r--r--arch/nios2/lib/bootm.c2
-rw-r--r--arch/ppc/boards/pcm030/pcm030.c4
-rw-r--r--arch/ppc/include/asm/io.h28
-rw-r--r--arch/ppc/lib/Makefile1
-rw-r--r--arch/ppc/lib/reloc.S47
-rw-r--r--arch/ppc/mach-mpc5xxx/start.S14
-rw-r--r--commands/Kconfig19
-rw-r--r--commands/Makefile1
-rw-r--r--commands/crc.c2
-rw-r--r--commands/edit.c17
-rw-r--r--commands/global.c62
-rw-r--r--commands/i2c.c26
-rw-r--r--commands/linux16.c2
-rw-r--r--commands/ls.c6
-rw-r--r--commands/mem.c10
-rw-r--r--commands/partition.c2
-rw-r--r--commands/saveenv.c6
-rw-r--r--commands/timeout.c16
-rw-r--r--common/Kconfig15
-rw-r--r--common/Makefile2
-rw-r--r--common/bootargs.c83
-rw-r--r--common/env.c2
-rw-r--r--common/environment.c6
-rw-r--r--common/filetype.c2
-rw-r--r--common/globalvar.c65
-rw-r--r--common/misc.c2
-rw-r--r--common/oftree.c3
-rw-r--r--defaultenv/config4
-rw-r--r--drivers/mtd/nand/nand_imx.c2
-rw-r--r--drivers/nor/cfi_flash.h10
-rw-r--r--drivers/serial/Kconfig2
-rw-r--r--drivers/serial/serial_s3c.c55
-rw-r--r--drivers/spi/imx_spi.c4
-rw-r--r--drivers/spi/spi.c2
-rw-r--r--drivers/usb/host/ohci-hcd.c4
-rw-r--r--fs/Kconfig4
-rw-r--r--fs/Makefile1
-rw-r--r--fs/fs.c349
-rw-r--r--fs/nfs.c1054
-rw-r--r--fs/ramfs.c47
-rw-r--r--include/boot.h16
-rw-r--r--include/filetype.h1
-rw-r--r--include/globalvar.h12
-rw-r--r--include/io.h21
-rw-r--r--include/linux/mtd/nand.h2
-rw-r--r--include/linux/types.h2
-rw-r--r--include/magicvar.h8
-rw-r--r--include/param.h1
-rw-r--r--include/partition.h3
-rw-r--r--include/qsort.h7
-rw-r--r--lib/Kconfig3
-rw-r--r--lib/Makefile1
-rw-r--r--lib/glob.c11
-rw-r--r--lib/make_directory.c13
-rw-r--r--lib/parameter.c18
-rw-r--r--lib/qsort.c79
-rw-r--r--scripts/mod/modpost.c2
139 files changed, 2576 insertions, 594 deletions
diff --git a/.gitignore b/.gitignore
index 8a5c58357d..8e208e0e64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,7 +36,7 @@ barebox.netx
barebox.map
System.map
Module.symvers
-barebox_default_env
+barebox_default_env*
#
# Generated include files
diff --git a/arch/arm/boards/a9m2410/a9m2410.c b/arch/arm/boards/a9m2410/a9m2410.c
index 1a3181ebfb..7c51d584a6 100644
--- a/arch/arm/boards/a9m2410/a9m2410.c
+++ b/arch/arm/boards/a9m2410/a9m2410.c
@@ -121,10 +121,10 @@ static int a9m2410_devices_init(void)
#ifdef CONFIG_NAND
/* ----------- add some vital partitions -------- */
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
#endif
diff --git a/arch/arm/boards/a9m2440/a9m2440.c b/arch/arm/boards/a9m2440/a9m2440.c
index 4094e31cd7..fcb8729078 100644
--- a/arch/arm/boards/a9m2440/a9m2440.c
+++ b/arch/arm/boards/a9m2440/a9m2440.c
@@ -141,10 +141,10 @@ static int a9m2440_devices_init(void)
#ifdef CONFIG_NAND
/* ----------- add some vital partitions -------- */
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
#endif
armlinux_set_bootparams((void*)S3C_SDRAM_BASE + 0x100);
diff --git a/arch/arm/boards/at91rm9200ek/init.c b/arch/arm/boards/at91rm9200ek/init.c
index 3875f4ab4d..17fb8e1678 100644
--- a/arch/arm/boards/at91rm9200ek/init.c
+++ b/arch/arm/boards/at91rm9200ek/init.c
@@ -124,8 +124,8 @@ static int at91rm9200ek_devices_init(void)
ek_add_device_udc();
#if defined(CONFIG_DRIVER_CFI) || defined(CONFIG_DRIVER_CFI_OLD)
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
#endif
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
diff --git a/arch/arm/boards/at91sam9260ek/init.c b/arch/arm/boards/at91sam9260ek/init.c
index a1d37507af..daadf9489f 100644
--- a/arch/arm/boards/at91sam9260ek/init.c
+++ b/arch/arm/boards/at91sam9260ek/init.c
@@ -264,13 +264,13 @@ static int at91sam9260ek_devices_init(void)
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
ek_set_board_type();
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
return 0;
diff --git a/arch/arm/boards/at91sam9261ek/init.c b/arch/arm/boards/at91sam9261ek/init.c
index acc71f4f58..b0cab5b0e6 100644
--- a/arch/arm/boards/at91sam9261ek/init.c
+++ b/arch/arm/boards/at91sam9261ek/init.c
@@ -251,12 +251,12 @@ static int at91sam9261ek_devices_init(void)
ek_add_device_buttons();
ek_device_add_leds();
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "at91bootstrap_raw");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
diff --git a/arch/arm/boards/at91sam9263ek/init.c b/arch/arm/boards/at91sam9263ek/init.c
index 33b7955edb..68f4bfc3f1 100644
--- a/arch/arm/boards/at91sam9263ek/init.c
+++ b/arch/arm/boards/at91sam9263ek/init.c
@@ -191,16 +191,16 @@ static int at91sam9263ek_devices_init(void)
ek_add_device_buttons();
if (IS_ENABLED(CONFIG_DRIVER_CFI) && cdev_by_name("nor0")) {
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
} else if (IS_ENABLED(CONFIG_NAND_ATMEL)) {
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
}
diff --git a/arch/arm/boards/at91sam9m10g45ek/init.c b/arch/arm/boards/at91sam9m10g45ek/init.c
index c4b1a97f8e..d4209a076f 100644
--- a/arch/arm/boards/at91sam9m10g45ek/init.c
+++ b/arch/arm/boards/at91sam9m10g45ek/init.c
@@ -230,13 +230,13 @@ static int at91sam9m10g45ek_devices_init(void)
ek_device_add_leds();
ek_device_add_keyboard();
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_6 + 0x100));
diff --git a/arch/arm/boards/at91sam9x5ek/init.c b/arch/arm/boards/at91sam9x5ek/init.c
index 1839dd6642..ee0343ae17 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -144,13 +144,13 @@ static int at91sam9x5ek_devices_init(void)
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
armlinux_set_architecture(CONFIG_MACH_AT91SAM9X5EK);
- devfs_add_partition("nand0", 0x00000, SZ_256K, PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_256K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
- devfs_add_partition("nand0", SZ_256K, SZ_256K + SZ_128K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_256K, SZ_256K + SZ_128K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_512K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_512K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K + SZ_256K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K + SZ_256K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
return 0;
diff --git a/arch/arm/boards/dss11/init.c b/arch/arm/boards/dss11/init.c
index 950cf763e9..aacef3342f 100644
--- a/arch/arm/boards/dss11/init.c
+++ b/arch/arm/boards/dss11/init.c
@@ -138,11 +138,11 @@ static int dss11_devices_init(void)
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
armlinux_set_architecture(MACH_TYPE_DSS11);
- devfs_add_partition("nand0", 0x00000, 0x20000, PARTITION_FIXED, "bootstrap");
+ devfs_add_partition("nand0", 0x00000, 0x20000, DEVFS_PARTITION_FIXED, "bootstrap");
dev_add_bb_dev("bootstrap", "bootstrap.bb");
- devfs_add_partition("nand0", 0x20000, 0x40000, PARTITION_FIXED, "barebox");
+ devfs_add_partition("nand0", 0x20000, 0x40000, DEVFS_PARTITION_FIXED, "barebox");
dev_add_bb_dev("barebox", "barebox.bb");
- devfs_add_partition("nand0", 0x60000, 0x40000, PARTITION_FIXED, "barebox-env");
+ devfs_add_partition("nand0", 0x60000, 0x40000, DEVFS_PARTITION_FIXED, "barebox-env");
dev_add_bb_dev("barebox-env", "env0");
return 0;
diff --git a/arch/arm/boards/edb93xx/edb93xx.c b/arch/arm/boards/edb93xx/edb93xx.c
index e1e8adcddb..d32daf4923 100644
--- a/arch/arm/boards/edb93xx/edb93xx.c
+++ b/arch/arm/boards/edb93xx/edb93xx.c
@@ -63,8 +63,8 @@ static int ep93xx_devices_init(void)
* Create partitions that should be
* not touched by any regular user
*/
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
diff --git a/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c b/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c
index c717f0b0a2..ff12d496f5 100644
--- a/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c
+++ b/arch/arm/boards/eukrea_cpuimx25/eukrea_cpuimx25.c
@@ -232,11 +232,11 @@ static int eukrea_cpuimx25_devices_init(void)
imx25_add_nand(&nand_info);
devfs_add_partition("nand0", 0x00000, 0x40000,
- PARTITION_FIXED, "self_raw");
+ DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
devfs_add_partition("nand0", 0x40000, 0x20000,
- PARTITION_FIXED, "env_raw");
+ DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
/* enable LCD */
diff --git a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c
index 45ba4f00d1..63e87c9551 100644
--- a/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c
+++ b/arch/arm/boards/eukrea_cpuimx27/eukrea_cpuimx27.c
@@ -200,8 +200,8 @@ static int eukrea_cpuimx27_devices_init(void)
i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
imx27_add_i2c0(NULL);
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
envdev = "NOR";
diff --git a/arch/arm/boards/eukrea_cpuimx27/lowlevel_init.S b/arch/arm/boards/eukrea_cpuimx27/lowlevel_init.S
index 5295a8a227..e31854606d 100644
--- a/arch/arm/boards/eukrea_cpuimx27/lowlevel_init.S
+++ b/arch/arm/boards/eukrea_cpuimx27/lowlevel_init.S
@@ -124,7 +124,7 @@ board_init_lowlevel:
copy_loop:
ldmia r0!, {r3-r9} /* copy from source address [r0] */
stmia r1!, {r3-r9} /* copy to target address [r1] */
- cmp r0, r2 /* until source end addreee [r2] */
+ cmp r0, r2 /* until source end address [r2] */
ble copy_loop
ldr pc, =1f /* Jump to SDRAM */
diff --git a/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c b/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c
index 37c32ad0db..55fcc0cab4 100644
--- a/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c
+++ b/arch/arm/boards/eukrea_cpuimx35/eukrea_cpuimx35.c
@@ -149,9 +149,9 @@ static int eukrea_cpuimx35_devices_init(void)
#endif
imx35_add_nand(&nand_info);
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
imx35_add_fec(&fec_info);
diff --git a/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c b/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c
index 2bda9743df..3cc7a72252 100644
--- a/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c
+++ b/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c
@@ -118,9 +118,9 @@ static int eukrea_cpuimx51_devices_init(void)
#endif
imx51_add_nand(&nand_info);
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
gpio_direction_output(GPIO_LAN8700_RESET, 0);
diff --git a/arch/arm/boards/freescale-mx25-3-stack/3stack.c b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
index ac781fd134..323cd1107f 100644
--- a/arch/arm/boards/freescale-mx25-3-stack/3stack.c
+++ b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
@@ -225,10 +225,10 @@ static int imx25_devices_init(void)
imx25_add_nand(&nand_info);
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
diff --git a/arch/arm/boards/freescale-mx25-3-stack/lowlevel_init.S b/arch/arm/boards/freescale-mx25-3-stack/lowlevel_init.S
index 73bb14723e..7b75233ebb 100644
--- a/arch/arm/boards/freescale-mx25-3-stack/lowlevel_init.S
+++ b/arch/arm/boards/freescale-mx25-3-stack/lowlevel_init.S
@@ -117,7 +117,7 @@ board_init_lowlevel:
copy_loop:
ldmia r0!, {r3-r9} /* copy from source address [r0] */
stmia r1!, {r3-r9} /* copy to target address [r1] */
- cmp r0, r2 /* until source end addreee [r2] */
+ cmp r0, r2 /* until source end address [r2] */
ble copy_loop
ldr pc, =1f /* Jump to SDRAM */
diff --git a/arch/arm/boards/freescale-mx35-3-stack/3stack.c b/arch/arm/boards/freescale-mx35-3-stack/3stack.c
index ca8680a82c..cb1280d377 100644
--- a/arch/arm/boards/freescale-mx35-3-stack/3stack.c
+++ b/arch/arm/boards/freescale-mx35-3-stack/3stack.c
@@ -162,15 +162,15 @@ static int f3s_devices_init(void)
switch ((reg >> 25) & 0x3) {
case 0x01: /* NAND is the source */
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x80000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x80000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
break;
case 0x00: /* NOR is the source */
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 0x80000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 0x80000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
break;
}
diff --git a/arch/arm/boards/freescale-mx35-3-stack/lowlevel_init.S b/arch/arm/boards/freescale-mx35-3-stack/lowlevel_init.S
index 413e04a63f..30dbcc035a 100644
--- a/arch/arm/boards/freescale-mx35-3-stack/lowlevel_init.S
+++ b/arch/arm/boards/freescale-mx35-3-stack/lowlevel_init.S
@@ -173,7 +173,7 @@ board_init_lowlevel:
copy_loop:
ldmia r0!, {r3-r9} /* copy from source address [r0] */
stmia r1!, {r3-r9} /* copy to target address [r1] */
- cmp r0, r2 /* until source end addreee [r2] */
+ cmp r0, r2 /* until source end address [r2] */
ble copy_loop
ldr pc, =1f /* Jump to SDRAM */
diff --git a/arch/arm/boards/freescale-mx51-pdk/board.c b/arch/arm/boards/freescale-mx51-pdk/board.c
index 28c7dbc0ad..74b32a99aa 100644
--- a/arch/arm/boards/freescale-mx51-pdk/board.c
+++ b/arch/arm/boards/freescale-mx51-pdk/board.c
@@ -257,8 +257,8 @@ device_initcall(f3s_devices_init);
static int f3s_part_init(void)
{
- devfs_add_partition("disk0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("disk0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("disk0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("disk0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/arm/boards/freescale-mx53-loco/board.c b/arch/arm/boards/freescale-mx53-loco/board.c
index ac3323b4ed..0d715559dc 100644
--- a/arch/arm/boards/freescale-mx53-loco/board.c
+++ b/arch/arm/boards/freescale-mx53-loco/board.c
@@ -203,8 +203,8 @@ device_initcall(loco_devices_init);
static int loco_part_init(void)
{
- devfs_add_partition("disk0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("disk0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("disk0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("disk0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/arm/boards/freescale-mx53-smd/board.c b/arch/arm/boards/freescale-mx53-smd/board.c
index b6632555af..04831030a8 100644
--- a/arch/arm/boards/freescale-mx53-smd/board.c
+++ b/arch/arm/boards/freescale-mx53-smd/board.c
@@ -149,8 +149,8 @@ device_initcall(smd_devices_init);
static int smd_part_init(void)
{
- devfs_add_partition("disk0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("disk0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("disk0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("disk0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/arm/boards/freescale-mx6-arm2/board.c b/arch/arm/boards/freescale-mx6-arm2/board.c
index 14224727a2..e4a9a49b55 100644
--- a/arch/arm/boards/freescale-mx6-arm2/board.c
+++ b/arch/arm/boards/freescale-mx6-arm2/board.c
@@ -152,8 +152,8 @@ static int arm2_devices_init(void)
armlinux_set_bootparams((void *)0x10000100);
armlinux_set_architecture(3837);
- devfs_add_partition("disk0", 0, SZ_1M, PARTITION_FIXED, "self0");
- devfs_add_partition("disk0", SZ_1M + SZ_1M, SZ_512K, PARTITION_FIXED, "env0");
+ devfs_add_partition("disk0", 0, SZ_1M, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("disk0", SZ_1M + SZ_1M, SZ_512K, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/arm/boards/guf-cupid/board.c b/arch/arm/boards/guf-cupid/board.c
index 653d4408f9..fb3c56061e 100644
--- a/arch/arm/boards/guf-cupid/board.c
+++ b/arch/arm/boards/guf-cupid/board.c
@@ -130,9 +130,9 @@ static int cupid_devices_init(void)
imx35_add_fec(&fec_info);
imx35_add_nand(&nand_info);
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x80000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x80000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
imx35_add_fb(&ipu_fb_data);
diff --git a/arch/arm/boards/guf-neso/board.c b/arch/arm/boards/guf-neso/board.c
index 84ef2253b3..fbb20c10e0 100644
--- a/arch/arm/boards/guf-neso/board.c
+++ b/arch/arm/boards/guf-neso/board.c
@@ -285,10 +285,10 @@ static int neso_devices_init(void)
imx27_add_fec(&fec_info);
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x80000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x80000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
armlinux_set_bootparams((void *)0xa0000100);
diff --git a/arch/arm/boards/imx21ads/lowlevel_init.S b/arch/arm/boards/imx21ads/lowlevel_init.S
index 607da27476..7926e281c6 100644
--- a/arch/arm/boards/imx21ads/lowlevel_init.S
+++ b/arch/arm/boards/imx21ads/lowlevel_init.S
@@ -138,7 +138,7 @@ board_init_lowlevel:
copy_loop:
ldmia r0!, {r3-r9} /* copy from source address [r0] */
stmia r1!, {r3-r9} /* copy to target address [r1] */
- cmp r0, r2 /* until source end addreee [r2] */
+ cmp r0, r2 /* until source end address [r2] */
ble copy_loop
ldr pc, =1f /* Jump to SDRAM */
diff --git a/arch/arm/boards/imx27ads/imx27ads.c b/arch/arm/boards/imx27ads/imx27ads.c
index 7ffaeab2f8..ff002249de 100644
--- a/arch/arm/boards/imx27ads/imx27ads.c
+++ b/arch/arm/boards/imx27ads/imx27ads.c
@@ -111,8 +111,8 @@ static int mx27ads_devices_init(void)
add_cfi_flash_device(-1, 0xC0000000, 32 * 1024 * 1024, 0);
imx27_add_fec(&fec_info);
- devfs_add_partition("nor0", 0x00000, 0x20000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x20000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x20000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x20000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
armlinux_set_bootparams((void *)0xa0000100);
diff --git a/arch/arm/boards/karo-tx25/board.c b/arch/arm/boards/karo-tx25/board.c
index 7df2e4c6ec..040c75bda6 100644
--- a/arch/arm/boards/karo-tx25/board.c
+++ b/arch/arm/boards/karo-tx25/board.c
@@ -116,10 +116,10 @@ static int tx25_devices_init(void)
imx25_add_nand(&nand_info);
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x80000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x80000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
armlinux_set_bootparams((void *)0x80000100);
diff --git a/arch/arm/boards/karo-tx51/tx51.c b/arch/arm/boards/karo-tx51/tx51.c
index b0b4278dd3..096683a1ad 100644
--- a/arch/arm/boards/karo-tx51/tx51.c
+++ b/arch/arm/boards/karo-tx51/tx51.c
@@ -271,9 +271,9 @@ device_initcall(tx51_devices_init);
static int tx51_part_init(void)
{
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x80000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x80000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
return 0;
diff --git a/arch/arm/boards/mini2440/mini2440.c b/arch/arm/boards/mini2440/mini2440.c
index 361a3e294f..03e3d6c5ca 100644
--- a/arch/arm/boards/mini2440/mini2440.c
+++ b/arch/arm/boards/mini2440/mini2440.c
@@ -305,11 +305,11 @@ static int mini2440_devices_init(void)
#ifdef CONFIG_NAND
/* ----------- add some vital partitions -------- */
devfs_del_partition("self_raw");
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
devfs_del_partition("env_raw");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
#endif
add_generic_device("s3c_mci", 0, NULL, S3C2410_SDI_BASE, 0,
diff --git a/arch/arm/boards/mioa701/board.c b/arch/arm/boards/mioa701/board.c
index 14c81104ff..ab5a493e76 100644
--- a/arch/arm/boards/mioa701/board.c
+++ b/arch/arm/boards/mioa701/board.c
@@ -261,8 +261,17 @@ static int mioa701_coredevice_init(void)
/* route pins */
pxa2xx_mfp_config(ARRAY_AND_SIZE(mioa701_pin_config));
- CCCR = CCCR_A | 0x20110;
- cclk = 0x02;
+ /*
+ * Put the board in superspeed (520 MHz) to speed-up logo/OS loading.
+ * This requires to command the Maxim 1586 to upgrade core voltage to
+ * 1.475 V, on the power I2C bus (device 0x14).
+ */
+ CCCR = CCCR_A | 0x20290;
+ PCFR = PCFR_GPR_EN | PCFR_FVC | PCFR_DC_EN | PCFR_PI2C_EN | PCFR_OPDE;
+ PCMD(0) = PCMD_LC | 0x1f;
+ PVCR = 0x14;
+
+ cclk = 0x0b;
asm volatile("mcr p14, 0, %0, c6, c0, 0 @ set CCLK"
: : "r" (cclk) : "cc");
diff --git a/arch/arm/boards/mioa701/env/bin/barebox_update b/arch/arm/boards/mioa701/env/bin/barebox_update
index 564549bb75..b544563bef 100644
--- a/arch/arm/boards/mioa701/env/bin/barebox_update
+++ b/arch/arm/boards/mioa701/env/bin/barebox_update
@@ -3,3 +3,8 @@
# Page+OOB specific partitions
addpart /dev/mtdraw0 1081344@3649536(msipl)
addpart /dev/mtdraw0 270336@3649536(barebox)
+
+if [ -r /barebox.BIP0 ]; then
+ erase /dev/mtdraw0.barebox
+ cp -v /barebox.BIP0 /dev/mtdraw0.barebox
+fi
diff --git a/arch/arm/boards/mioa701/env/bin/dps1_unlock b/arch/arm/boards/mioa701/env/bin/dps1_unlock
new file mode 100644
index 0000000000..2d7dab8c58
--- /dev/null
+++ b/arch/arm/boards/mioa701/env/bin/dps1_unlock
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# Shell to unlock the DPS1 with "12345678" key.
+
+mw -b 0x105e 0x31
+mw -b 0x105e 0x32
+mw -b 0x105e 0x33
+mw -b 0x105e 0x34
+mw -b 0x105e 0x35
+mw -b 0x105e 0x36
+mw -b 0x105e 0x37
+mw -b 0x105e 0x38
diff --git a/arch/arm/boards/mioa701/env/bin/dps1_update b/arch/arm/boards/mioa701/env/bin/dps1_update
new file mode 100644
index 0000000000..a9d72da891
--- /dev/null
+++ b/arch/arm/boards/mioa701/env/bin/dps1_update
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# Page+OOB specific partitions
+addpart /dev/mtdraw0 67584@202752(dps1)
+uncompress /env/data/dps1.raw.gz /dps1.raw
+
+if [ -r /dps1.raw ]; then
+ dps1_unlock
+ erase /dev/mtdraw0.dps1
+ cp -v /dps1.raw /dev/mtdraw0.dps1
+ dps1_unlock
+fi
diff --git a/arch/arm/boards/mioa701/env/bin/init b/arch/arm/boards/mioa701/env/bin/init
index 8a54da0c10..494d0674aa 100644
--- a/arch/arm/boards/mioa701/env/bin/init
+++ b/arch/arm/boards/mioa701/env/bin/init
@@ -22,14 +22,19 @@ if [ $? = 0 ]; then
fi
echo "No custom environment found"
-echo -n "Hit any key to stop autoboot: "
-timeout -a $autoboot_timeout
-if [ $? != 0 ]; then
- echo
- echo "Welcome to barebox console"
- exit
+
+gpio_get_value 22
+is_usb_connected=$?
+if [ $is_usb_connected != 0 ]; then
+ echo -n "Hit any key to stop autoboot: "
+ timeout -a $autoboot_timeout
+ if [ $? != 0 ]; then
+ echo
+ echo "Welcome to barebox console"
+ exit
+ fi
fi
echo "Booting linux kernel on docg3 chip ..."
-bootargs="$bootargs mtdparts=mtd0:$mtdparts root=/dev/mtd4"
+bootargs="$bootargs mtdparts=docg3.0:$mtdparts ubi.mtd=4 rootfstype=ubifs root=ubi0:linux_root ro"
bootm /dev/mtd0.kernel
diff --git a/arch/arm/boards/mioa701/env/data/dps1.raw.gz b/arch/arm/boards/mioa701/env/data/dps1.raw.gz
new file mode 100644
index 0000000000..93112bfca1
--- /dev/null
+++ b/arch/arm/boards/mioa701/env/data/dps1.raw.gz
Binary files differ
diff --git a/arch/arm/boards/mmccpu/init.c b/arch/arm/boards/mmccpu/init.c
index 9d4d496521..a7120400fa 100644
--- a/arch/arm/boards/mmccpu/init.c
+++ b/arch/arm/boards/mmccpu/init.c
@@ -63,8 +63,8 @@ static int mmccpu_devices_init(void)
at91_add_device_eth(0, &macb_pdata);
add_cfi_flash_device(0, AT91_CHIPSELECT_0, 0, 0);
- devfs_add_partition("nor0", 0x00000, 256 * 1024, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 128 * 1024, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 256 * 1024, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 128 * 1024, DEVFS_PARTITION_FIXED, "env0");
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
armlinux_set_architecture(MACH_TYPE_MMCCPU);
diff --git a/arch/arm/boards/netx/netx.c b/arch/arm/boards/netx/netx.c
index 7873d32fbf..c4a8733aad 100644
--- a/arch/arm/boards/netx/netx.c
+++ b/arch/arm/boards/netx/netx.c
@@ -54,10 +54,10 @@ static int netx_devices_init(void) {
add_generic_device("netx-eth", DEVICE_ID_DYNAMIC, NULL, 0, 0, IORESOURCE_MEM,
&eth1_data);
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
/* Do not overwrite primary env for now */
- devfs_add_partition("nor0", 0xc0000, 0x80000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0xc0000, 0x80000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
diff --git a/arch/arm/boards/nhk8815/setup.c b/arch/arm/boards/nhk8815/setup.c
index ae76124c7f..173892acd8 100644
--- a/arch/arm/boards/nhk8815/setup.c
+++ b/arch/arm/boards/nhk8815/setup.c
@@ -103,11 +103,11 @@ static int nhk8815_devices_init(void)
armlinux_set_architecture(MACH_TYPE_NOMADIK);
armlinux_set_bootparams((void *)(0x00000100));
- devfs_add_partition("nand0", 0x0000000, 0x040000, PARTITION_FIXED, "xloader_raw");
- devfs_add_partition("nand0", 0x0040000, 0x080000, PARTITION_FIXED, "meminit_raw");
- devfs_add_partition("nand0", 0x0080000, 0x200000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x0000000, 0x040000, DEVFS_PARTITION_FIXED, "xloader_raw");
+ devfs_add_partition("nand0", 0x0040000, 0x080000, DEVFS_PARTITION_FIXED, "meminit_raw");
+ devfs_add_partition("nand0", 0x0080000, 0x200000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x7FE0000, 0x020000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x7FE0000, 0x020000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
return 0;
diff --git a/arch/arm/boards/pcm027/board.c b/arch/arm/boards/pcm027/board.c
index ab55c345c8..2801967dd2 100644
--- a/arch/arm/boards/pcm027/board.c
+++ b/arch/arm/boards/pcm027/board.c
@@ -165,8 +165,8 @@ static int pcm027_devices_init(void)
armlinux_set_bootparams((void *)0xa0000100);
armlinux_set_architecture(MACH_TYPE_PCM027);
- devfs_add_partition("nor0", 0x00000, SZ_512K, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", SZ_512K, SZ_256K, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, SZ_512K, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", SZ_512K, SZ_256K, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
return 0;
diff --git a/arch/arm/boards/pcm037/lowlevel_init.S b/arch/arm/boards/pcm037/lowlevel_init.S
index 8988db23a2..cc4674d2e2 100644
--- a/arch/arm/boards/pcm037/lowlevel_init.S
+++ b/arch/arm/boards/pcm037/lowlevel_init.S
@@ -151,7 +151,7 @@ clear_iomux:
copy_loop:
ldmia r0!, {r3-r9} /* copy from source address [r0] */
stmia r1!, {r3-r9} /* copy to target address [r1] */
- cmp r0, r2 /* until source end addreee [r2] */
+ cmp r0, r2 /* until source end address [r2] */
ble copy_loop
ldr pc, =1f /* Jump to SDRAM */
diff --git a/arch/arm/boards/pcm037/pcm037.c b/arch/arm/boards/pcm037/pcm037.c
index 660c9ab428..d789b28e01 100644
--- a/arch/arm/boards/pcm037/pcm037.c
+++ b/arch/arm/boards/pcm037/pcm037.c
@@ -194,8 +194,8 @@ static int imx31_devices_init(void)
* Create partitions that should be
* not touched by any regular user
*/
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0"); /* ourself */
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0"); /* environment */
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0"); /* ourself */
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0"); /* environment */
protect_file("/dev/env0", 1);
diff --git a/arch/arm/boards/pcm038/Makefile b/arch/arm/boards/pcm038/Makefile
index 970804e280..6cd3a5b6c6 100644
--- a/arch/arm/boards/pcm038/Makefile
+++ b/arch/arm/boards/pcm038/Makefile
@@ -1,3 +1,2 @@
-
-obj-y += lowlevel.o
-obj-y += pcm038.o
+obj-y += lowlevel.o pcm038.o
+obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970.o
diff --git a/arch/arm/boards/pcm038/pcm038.c b/arch/arm/boards/pcm038/pcm038.c
index d481bdc576..badc978a24 100644
--- a/arch/arm/boards/pcm038/pcm038.c
+++ b/arch/arm/boards/pcm038/pcm038.c
@@ -30,17 +30,13 @@
#include <generated/mach-types.h>
#include <partition.h>
#include <fs.h>
-#include <fcntl.h>
#include <nand.h>
-#include <command.h>
#include <spi/spi.h>
#include <io.h>
#include <mach/imx-nand.h>
#include <mach/imx-pll.h>
#include <mach/imxfb.h>
-#include <asm/mmu.h>
#include <i2c/i2c.h>
-#include <usb/ulpi.h>
#include <mach/spi.h>
#include <mach/iomux-mx27.h>
#include <mach/devices-imx27.h>
@@ -110,27 +106,67 @@ static struct imx_fb_platform_data pcm038_fb_data = {
.dmacr = 0x00020010,
};
-#ifdef CONFIG_USB
-static void pcm038_usbh_init(void)
+/**
+ * The spctl0 register is a beast: Seems you can read it
+ * only one times without writing it again.
+ */
+static inline uint32_t get_pll_spctl10(void)
{
- uint32_t temp;
+ uint32_t reg;
- temp = readl(IMX_OTG_BASE + 0x600);
- temp &= ~((3 << 21) | 1);
- temp |= (1 << 5) | (1 << 16) | (1 << 19) | (1 << 20);
- writel(temp, IMX_OTG_BASE + 0x600);
+ reg = SPCTL0;
+ SPCTL0 = reg;
+
+ return reg;
+}
- temp = readl(IMX_OTG_BASE + 0x584);
- temp &= ~(3 << 30);
- temp |= 2 << 30;
- writel(temp, IMX_OTG_BASE + 0x584);
+/**
+ * If the PLL settings are in place switch the CPU core frequency to the max. value
+ */
+static int pcm038_power_init(void)
+{
+#ifdef CONFIG_MFD_MC13XXX
+ uint32_t spctl0 = get_pll_spctl10();
+ struct mc13xxx *mc13xxx = mc13xxx_get();
- mdelay(10);
+ /* PLL registers already set to their final values? */
+ if (spctl0 == SPCTL0_VAL && MPCTL0 == MPCTL0_VAL) {
+ console_flush();
+ if (mc13xxx) {
+ mc13xxx_reg_write(mc13xxx, MC13783_REG_SWITCHERS(0),
+ MC13783_SWX_VOLTAGE(MC13783_SWX_VOLTAGE_1_450) |
+ MC13783_SWX_VOLTAGE_DVS(MC13783_SWX_VOLTAGE_1_450) |
+ MC13783_SWX_VOLTAGE_STANDBY(MC13783_SWX_VOLTAGE_1_450));
+
+ mc13xxx_reg_write(mc13xxx, MC13783_REG_SWITCHERS(4),
+ MC13783_SW1A_MODE(MC13783_SWX_MODE_NO_PULSE_SKIP) |
+ MC13783_SW1A_MODE_STANDBY(MC13783_SWX_MODE_NO_PULSE_SKIP) |
+ MC13783_SW1A_SOFTSTART |
+ MC13783_SW1B_MODE(MC13783_SWX_MODE_NO_PULSE_SKIP) |
+ MC13783_SW1B_MODE_STANDBY(MC13783_SWX_MODE_NO_PULSE_SKIP) |
+ MC13783_SW1B_SOFTSTART |
+ MC13783_SW_PLL_FACTOR(32));
- ulpi_setup((void *)(IMX_OTG_BASE + 0x570), 1);
-}
+ /* wait for required power level to run the CPU at 400 MHz */
+ udelay(100000);
+ CSCR = CSCR_VAL_FINAL;
+ PCDR0 = 0x130410c3;
+ PCDR1 = 0x09030911;
+
+ /* Clocks have changed. Notify clients */
+ clock_notifier_call_chain();
+ } else {
+ printf("Failed to initialize PMIC. Will continue with low CPU speed\n");
+ }
+ }
#endif
+ /* clock gating enable */
+ GPCR = 0x00050f08;
+
+ return 0;
+}
+
static int pcm038_mem_init(void)
{
arm_add_mem_device("ram0", 0xa0000000, 128 * 1024 * 1024);
@@ -202,19 +238,6 @@ static int pcm038_devices_init(void)
PA29_PF_VSYNC,
PA30_PF_CONTRAST,
PA31_PF_OE_ACD,
- /* USB host 2 */
- PA0_PF_USBH2_CLK,
- PA1_PF_USBH2_DIR,
- PA2_PF_USBH2_DATA7,
- PA3_PF_USBH2_NXT,
- PA4_PF_USBH2_STP,
- PD19_AF_USBH2_DATA4,
- PD20_AF_USBH2_DATA3,
- PD21_AF_USBH2_DATA6,
- PD22_AF_USBH2_DATA0,
- PD23_AF_USBH2_DATA2,
- PD24_AF_USBH2_DATA1,
- PD26_AF_USBH2_DATA5,
/* I2C1 */
PD17_PF_I2C_DATA | GPIO_PUEN,
PD18_PF_I2C_CLK,
@@ -229,9 +252,6 @@ static int pcm038_devices_init(void)
/* configure SRAM on cs1 */
imx27_setup_weimcs(1, 0x0000d843, 0x22252521, 0x22220a00);
- /* configure SJA1000 on cs4 */
- imx27_setup_weimcs(4, 0x0000DCF6, 0x444A0301, 0x44443302);
-
/* initizalize gpios */
for (i = 0; i < ARRAY_SIZE(mode); i++)
imx_gpio_mode(mode[i]);
@@ -239,12 +259,11 @@ static int pcm038_devices_init(void)
PCCR0 |= PCCR0_CSPI1_EN;
PCCR1 |= PCCR1_PERCLK2_EN;
- gpio_direction_output(GPIO_PORTD | 28, 0);
- gpio_set_value(GPIO_PORTD | 28, 0);
-
spi_register_board_info(pcm038_spi_board_info, ARRAY_SIZE(pcm038_spi_board_info));
imx27_add_spi0(&pcm038_spi_0_data);
+ pcm038_power_init();
+
add_cfi_flash_device(-1, 0xC0000000, 32 * 1024 * 1024, 0);
imx27_add_nand(&nand_info);
imx27_add_fb(&pcm038_fb_data);
@@ -253,11 +272,6 @@ static int pcm038_devices_init(void)
imx27_add_i2c0(NULL);
imx27_add_i2c1(NULL);
-#ifdef CONFIG_USB
- pcm038_usbh_init();
- add_generic_usb_ehci_device(-1, IMX_OTG_BASE + 0x400, NULL);
-#endif
-
/* Register the fec device after the PLL re-initialisation
* as the fec depends on the (now higher) ipg clock
*/
@@ -269,19 +283,19 @@ static int pcm038_devices_init(void)
case GPCR_BOOT_16BIT_NAND_512:
case GPCR_BOOT_8BIT_NAND_512:
devfs_add_partition("nand0", 0x00000, 0x80000,
- PARTITION_FIXED, "self_raw");
+ DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
devfs_add_partition("nand0", 0x80000, 0x100000,
- PARTITION_FIXED, "env_raw");
+ DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
envdev = "NAND";
break;
default:
devfs_add_partition("nor0", 0x00000, 0x80000,
- PARTITION_FIXED, "self0");
+ DEVFS_PARTITION_FIXED, "self0");
devfs_add_partition("nor0", 0x80000, 0x100000,
- PARTITION_FIXED, "env0");
+ DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
envdev = "NOR";
@@ -305,80 +319,3 @@ static int pcm038_console_init(void)
}
console_initcall(pcm038_console_init);
-
-#ifdef CONFIG_MFD_MC13XXX
-static int pmic_power(void)
-{
- struct mc13xxx *mc13xxx;
-
- mc13xxx = mc13xxx_get();
- if (!mc13xxx)
- return -ENODEV;
-
- mc13xxx_reg_write(mc13xxx, MC13783_REG_SWITCHERS(0),
- MC13783_SWX_VOLTAGE(MC13783_SWX_VOLTAGE_1_450) |
- MC13783_SWX_VOLTAGE_DVS(MC13783_SWX_VOLTAGE_1_450) |
- MC13783_SWX_VOLTAGE_STANDBY(MC13783_SWX_VOLTAGE_1_450));
-
- mc13xxx_reg_write(mc13xxx, MC13783_REG_SWITCHERS(4),
- MC13783_SW1A_MODE(MC13783_SWX_MODE_NO_PULSE_SKIP) |
- MC13783_SW1A_MODE_STANDBY(MC13783_SWX_MODE_NO_PULSE_SKIP) |
- MC13783_SW1A_SOFTSTART |
- MC13783_SW1B_MODE(MC13783_SWX_MODE_NO_PULSE_SKIP) |
- MC13783_SW1B_MODE_STANDBY(MC13783_SWX_MODE_NO_PULSE_SKIP) |
- MC13783_SW1B_SOFTSTART |
- MC13783_SW_PLL_FACTOR(32));
-
- return 0;
-}
-#else
-# define pmic_power() (1)
-#endif
-
-/**
- * The spctl0 register is a beast: Seems you can read it
- * only one times without writing it again.
- */
-static inline uint32_t get_pll_spctl10(void)
-{
- uint32_t reg;
-
- reg = SPCTL0;
- SPCTL0 = reg;
-
- return reg;
-}
-
-/**
- * If the PLL settings are in place switch the CPU core frequency to the max. value
- */
-static int pcm038_power_init(void)
-{
- uint32_t spctl0;
-
- spctl0 = get_pll_spctl10();
-
- /* PLL registers already set to their final values? */
- if (spctl0 == SPCTL0_VAL && MPCTL0 == MPCTL0_VAL) {
- console_flush();
- if (!pmic_power()) {
- /* wait for required power level to run the CPU at 400 MHz */
- udelay(100000);
- CSCR = CSCR_VAL_FINAL;
- PCDR0 = 0x130410c3;
- PCDR1 = 0x09030911;
- /* Clocks have changed. Notify clients */
- clock_notifier_call_chain();
- } else {
- printf("Failed to initialize PMIC. Will continue with low CPU speed\n");
- }
- }
-
- /* clock gating enable */
- GPCR = 0x00050f08;
-
- return 0;
-}
-
-late_initcall(pcm038_power_init);
-
diff --git a/arch/arm/boards/pcm038/pcm038.dox b/arch/arm/boards/pcm038/pcm038.dox
index 9b17674a21..85177d2eb1 100644
--- a/arch/arm/boards/pcm038/pcm038.dox
+++ b/arch/arm/boards/pcm038/pcm038.dox
@@ -2,7 +2,8 @@
This CPU card is based on a Freescale i.MX27 CPU. The card is shipped with:
-- up to 32MiB NOR type Flash Memory
-- 32MiB synchronous dynamic RAM
+- up to 64MB NOR Flash Memory
+- up to 1GB NAND Flash Memory
+- up to 256MB DRAM
*/
diff --git a/arch/arm/boards/pcm038/pcm970.c b/arch/arm/boards/pcm038/pcm970.c
new file mode 100644
index 0000000000..cd80677fc5
--- /dev/null
+++ b/arch/arm/boards/pcm038/pcm970.c
@@ -0,0 +1,80 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <io.h>
+#include <init.h>
+#include <mach/imx-regs.h>
+#include <mach/iomux-mx27.h>
+#include <mach/gpio.h>
+#include <usb/ulpi.h>
+
+#ifdef CONFIG_USB
+static void pcm970_usbh2_init(void)
+{
+ uint32_t temp;
+
+ temp = readl(IMX_OTG_BASE + 0x600);
+ temp &= ~((3 << 21) | 1);
+ temp |= (1 << 5) | (1 << 16) | (1 << 19) | (1 << 20);
+ writel(temp, IMX_OTG_BASE + 0x600);
+
+ temp = readl(IMX_OTG_BASE + 0x584);
+ temp &= ~(3 << 30);
+ temp |= 2 << 30;
+ writel(temp, IMX_OTG_BASE + 0x584);
+
+ mdelay(10);
+
+ if (!ulpi_setup((void *)(IMX_OTG_BASE + 0x570), 1))
+ add_generic_usb_ehci_device(-1, IMX_OTG_BASE + 0x400, NULL);
+}
+#endif
+
+static int pcm970_init(void)
+{
+ int i;
+ unsigned int mode[] = {
+ /* USB Host 2 */
+ PA0_PF_USBH2_CLK,
+ PA1_PF_USBH2_DIR,
+ PA2_PF_USBH2_DATA7,
+ PA3_PF_USBH2_NXT,
+ PA4_PF_USBH2_STP,
+ PD19_AF_USBH2_DATA4,
+ PD20_AF_USBH2_DATA3,
+ PD21_AF_USBH2_DATA6,
+ PD22_AF_USBH2_DATA0,
+ PD23_AF_USBH2_DATA2,
+ PD24_AF_USBH2_DATA1,
+ PD26_AF_USBH2_DATA5,
+ };
+
+ for (i = 0; i < ARRAY_SIZE(mode); i++)
+ imx_gpio_mode(mode[i]);
+
+ /* Configure SJA1000 on cs4 */
+ imx27_setup_weimcs(4, 0x0000DCF6, 0x444A0301, 0x44443302);
+
+#ifdef CONFIG_USB
+ pcm970_usbh2_init();
+#endif
+
+ return 0;
+}
+
+late_initcall(pcm970_init);
diff --git a/arch/arm/boards/pcm043/pcm043.c b/arch/arm/boards/pcm043/pcm043.c
index 6da5dd45fb..152b47ce65 100644
--- a/arch/arm/boards/pcm043/pcm043.c
+++ b/arch/arm/boards/pcm043/pcm043.c
@@ -153,15 +153,15 @@ static int imx35_devices_init(void)
if ((reg & 0xc00) == 0x800) { /* reset mode: external boot */
switch ( (reg >> 25) & 0x3) {
case 0x01: /* NAND is the source */
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
break;
case 0x00: /* NOR is the source */
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0"); /* ourself */
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0"); /* environment */
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0"); /* ourself */
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0"); /* environment */
protect_file("/dev/env0", 1);
break;
}
diff --git a/arch/arm/boards/pcm049/board.c b/arch/arm/boards/pcm049/board.c
index e4043edca1..5b7854a5e3 100644
--- a/arch/arm/boards/pcm049/board.c
+++ b/arch/arm/boards/pcm049/board.c
@@ -111,11 +111,11 @@ static int pcm049_devices_init(void)
OMAP_ECC_BCH8_CODE_HW, &omap4_nand_cfg);
#ifdef CONFIG_PARTITION
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "xload_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "xload_raw");
dev_add_bb_dev("xload_raw", "xload");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_128K + SZ_256K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_128K + SZ_256K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
#endif
diff --git a/arch/arm/boards/phycard-a-l1/pca-a-l1.c b/arch/arm/boards/phycard-a-l1/pca-a-l1.c
index c8e93641c4..1cc2815df9 100644
--- a/arch/arm/boards/phycard-a-l1/pca-a-l1.c
+++ b/arch/arm/boards/phycard-a-l1/pca-a-l1.c
@@ -336,13 +336,13 @@ static int pcaal1_late_init(void)
nand = get_device_by_name("nand0");
- devfs_add_partition("nand0", 0x00000, 0x80000, PARTITION_FIXED, "x-loader");
+ devfs_add_partition("nand0", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "x-loader");
dev_add_bb_dev("self_raw", "x_loader0");
- devfs_add_partition("nand0", 0x80000, 0x1e0000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x80000, 0x1e0000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x260000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x260000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
return 0;
diff --git a/arch/arm/boards/phycard-a-xl2/pca-a-xl2.c b/arch/arm/boards/phycard-a-xl2/pca-a-xl2.c
index 7358fe0606..128cb8fd28 100644
--- a/arch/arm/boards/phycard-a-xl2/pca-a-xl2.c
+++ b/arch/arm/boards/phycard-a-xl2/pca-a-xl2.c
@@ -129,13 +129,13 @@ static int pcaaxl2_devices_init(void)
#ifdef CONFIG_PARTITION
devfs_add_partition("nand0", 0x00000, SZ_128K,
- PARTITION_FIXED, "xload_raw");
+ DEVFS_PARTITION_FIXED, "xload_raw");
dev_add_bb_dev("xload_raw", "xload");
devfs_add_partition("nand0", SZ_128K, SZ_256K,
- PARTITION_FIXED, "self_raw");
+ DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
devfs_add_partition("nand0", SZ_128K + SZ_256K, SZ_128K,
- PARTITION_FIXED, "env_raw");
+ DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
#endif
diff --git a/arch/arm/boards/phycard-i.MX27/lowlevel_init.S b/arch/arm/boards/phycard-i.MX27/lowlevel_init.S
index 9349581165..3ef2c543e6 100644
--- a/arch/arm/boards/phycard-i.MX27/lowlevel_init.S
+++ b/arch/arm/boards/phycard-i.MX27/lowlevel_init.S
@@ -111,7 +111,7 @@ board_init_lowlevel:
copy_loop:
ldmia r0!, {r3-r9} /* copy from source address [r0] */
stmia r1!, {r3-r9} /* copy to target address [r1] */
- cmp r0, r2 /* until source end addreee [r2] */
+ cmp r0, r2 /* until source end address [r2] */
ble copy_loop
ldr pc, =1f /* Jump to SDRAM */
diff --git a/arch/arm/boards/phycard-i.MX27/pca100.c b/arch/arm/boards/phycard-i.MX27/pca100.c
index a0a9911a88..6fdcf6ea62 100644
--- a/arch/arm/boards/phycard-i.MX27/pca100.c
+++ b/arch/arm/boards/phycard-i.MX27/pca100.c
@@ -303,10 +303,10 @@ static int pca100_devices_init(void)
#endif
nand = get_device_by_name("nand0");
- devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x20000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
armlinux_set_bootparams((void *)0xa0000100);
diff --git a/arch/arm/boards/pm9261/init.c b/arch/arm/boards/pm9261/init.c
index f7f2928c44..7f22f9bcda 100644
--- a/arch/arm/boards/pm9261/init.c
+++ b/arch/arm/boards/pm9261/init.c
@@ -140,8 +140,8 @@ static int pm9261_devices_init(void)
pm_add_device_dm9000();
add_cfi_flash_device(0, AT91_CHIPSELECT_0, 4 * 1024 * 1024, 0);
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self");
- devfs_add_partition("nor0", 0x40000, 0x10000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self");
+ devfs_add_partition("nor0", 0x40000, 0x10000, DEVFS_PARTITION_FIXED, "env0");
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
armlinux_set_architecture(MACH_TYPE_PM9261);
diff --git a/arch/arm/boards/pm9263/init.c b/arch/arm/boards/pm9263/init.c
index 499ee466e4..28e1b1c5f6 100644
--- a/arch/arm/boards/pm9263/init.c
+++ b/arch/arm/boards/pm9263/init.c
@@ -111,8 +111,8 @@ static int pm9263_devices_init(void)
at91_add_device_eth(0, &macb_pdata);
add_cfi_flash_device(0, AT91_CHIPSELECT_0, 4 * 1024 * 1024, 0);
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 0x10000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 0x10000, DEVFS_PARTITION_FIXED, "env0");
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
armlinux_set_architecture(MACH_TYPE_PM9263);
diff --git a/arch/arm/boards/pm9g45/init.c b/arch/arm/boards/pm9g45/init.c
index 9b2227647a..6ef31b600a 100644
--- a/arch/arm/boards/pm9g45/init.c
+++ b/arch/arm/boards/pm9g45/init.c
@@ -141,9 +141,9 @@ static int pm9g45_devices_init(void)
at91_add_device_eth(0, &macb_pdata);
pm9g45_add_device_usbh();
- devfs_add_partition("nand0", 0x00000, 0x80000, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", 0x40000, 0x40000, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", 0x40000, 0x40000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_6 + 0x100));
diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c
index 906a17e07e..9a342a8170 100644
--- a/arch/arm/boards/scb9328/scb9328.c
+++ b/arch/arm/boards/scb9328/scb9328.c
@@ -92,8 +92,8 @@ static int scb9328_devices_init(void)
add_dm9000_device(-1, 0x16000000, 0x16000004,
IORESOURCE_MEM_16BIT, &dm9000_data);
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
armlinux_set_bootparams((void *)0x08000100);
diff --git a/arch/arm/boards/tny-a926x/init.c b/arch/arm/boards/tny-a926x/init.c
index eeaca7626f..2cb7da7cff 100644
--- a/arch/arm/boards/tny-a926x/init.c
+++ b/arch/arm/boards/tny-a926x/init.c
@@ -192,13 +192,13 @@ static int tny_a9260_devices_init(void)
at91_add_device_spi(0, &spi_pdata);
}
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
return 0;
diff --git a/arch/arm/boards/tqma53/board.c b/arch/arm/boards/tqma53/board.c
index 947c3f107a..8c3d855608 100644
--- a/arch/arm/boards/tqma53/board.c
+++ b/arch/arm/boards/tqma53/board.c
@@ -254,8 +254,8 @@ device_initcall(tqma53_devices_init);
static int tqma53_part_init(void)
{
- devfs_add_partition("disk0", 0x00000, SZ_1M, PARTITION_FIXED, "self0");
- devfs_add_partition("disk0", SZ_1M, SZ_1M, PARTITION_FIXED, "env0");
+ devfs_add_partition("disk0", 0x00000, SZ_1M, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("disk0", SZ_1M, SZ_1M, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/arm/boards/usb-a926x/init.c b/arch/arm/boards/usb-a926x/init.c
index 57609b1818..824a38a94d 100644
--- a/arch/arm/boards/usb-a926x/init.c
+++ b/arch/arm/boards/usb-a926x/init.c
@@ -331,13 +331,13 @@ static int usb_a9260_devices_init(void)
armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
usb_a9260_set_board_type();
- devfs_add_partition("nand0", 0x00000, SZ_128K, PARTITION_FIXED, "at91bootstrap_raw");
+ devfs_add_partition("nand0", 0x00000, SZ_128K, DEVFS_PARTITION_FIXED, "at91bootstrap_raw");
dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
- devfs_add_partition("nand0", SZ_128K, SZ_256K, PARTITION_FIXED, "self_raw");
+ devfs_add_partition("nand0", SZ_128K, SZ_256K, DEVFS_PARTITION_FIXED, "self_raw");
dev_add_bb_dev("self_raw", "self0");
- devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, PARTITION_FIXED, "env_raw");
+ devfs_add_partition("nand0", SZ_256K + SZ_128K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
- devfs_add_partition("nand0", SZ_512K, SZ_128K, PARTITION_FIXED, "env_raw1");
+ devfs_add_partition("nand0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env_raw1");
dev_add_bb_dev("env_raw1", "env1");
return 0;
diff --git a/arch/arm/boards/versatile/versatilepb.c b/arch/arm/boards/versatile/versatilepb.c
index 436f42177c..b95e605ab2 100644
--- a/arch/arm/boards/versatile/versatilepb.c
+++ b/arch/arm/boards/versatile/versatilepb.c
@@ -51,8 +51,8 @@ mem_initcall(vpb_mem_init);
static int vpb_devices_init(void)
{
add_cfi_flash_device(-1, VERSATILE_FLASH_BASE, VERSATILE_FLASH_SIZE, 0);
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
add_generic_device("smc91c111", DEVICE_ID_DYNAMIC, NULL, VERSATILE_ETH_BASE,
64 * 1024, IORESOURCE_MEM, NULL);
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index ede8fd1f09..c7462f6e2e 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -108,7 +108,7 @@ void __naked __bare_init reset(void)
/*
* Board code can jump here by either returning from board_init_lowlevel
- * or by calling this funtion directly.
+ * or by calling this function directly.
*/
void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
{
diff --git a/arch/arm/include/asm/barebox-arm-head.h b/arch/arm/include/asm/barebox-arm-head.h
index 0dc3074a27..2c250e948e 100644
--- a/arch/arm/include/asm/barebox-arm-head.h
+++ b/arch/arm/include/asm/barebox-arm-head.h
@@ -24,8 +24,7 @@ static inline void barebox_arm_head(void)
"1: b 1b\n"
"1: b 1b\n"
#endif
- ".word 0x65726162\n" /* 'bare' */
- ".word 0x00786f62\n" /* 'box' */
+ ".asciz \"barebox\"\n"
".word _text\n" /* text base. If copied there,
* barebox can skip relocation
*/
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h
index 89df4dc708..6ce35fb8d3 100644
--- a/arch/arm/include/asm/setup.h
+++ b/arch/arm/include/asm/setup.h
@@ -1,6 +1,4 @@
/*
- * linux/include/asm/setup.h
- *
* Copyright (C) 1997-1999 Russell King
*
* This program is free software; you can redistribute it and/or modify
@@ -10,13 +8,6 @@
* Structure passed to kernel to tell it about the
* hardware it's running on. See linux/Documentation/arm/Setup
* for more info.
- *
- * NOTE:
- * This file contains two ways to pass information from the boot
- * loader to the kernel. The old struct param_struct is deprecated,
- * but it will be kept in the kernel for 5 years from now
- * (2001). This will allow boot loaders to convert to the new struct
- * tag way.
*/
#ifndef __ASMARM_SETUP_H
#define __ASMARM_SETUP_H
@@ -32,50 +23,6 @@
*/
#define COMMAND_LINE_SIZE 1024
-/* This is the old deprecated way to pass parameters to the kernel */
-struct param_struct {
- union {
- struct {
- unsigned long page_size; /* 0 */
- unsigned long nr_pages; /* 4 */
- unsigned long ramdisk_size; /* 8 */
- unsigned long flags; /* 12 */
-#define FLAG_READONLY 1
-#define FLAG_RDLOAD 4
-#define FLAG_RDPROMPT 8
- unsigned long rootdev; /* 16 */
- unsigned long video_num_cols; /* 20 */
- unsigned long video_num_rows; /* 24 */
- unsigned long video_x; /* 28 */
- unsigned long video_y; /* 32 */
- unsigned long memc_control_reg; /* 36 */
- unsigned char sounddefault; /* 40 */
- unsigned char adfsdrives; /* 41 */
- unsigned char bytes_per_char_h; /* 42 */
- unsigned char bytes_per_char_v; /* 43 */
- unsigned long pages_in_bank[4]; /* 44 */
- unsigned long pages_in_vram; /* 60 */
- unsigned long initrd_start; /* 64 */
- unsigned long initrd_size; /* 68 */
- unsigned long rd_start; /* 72 */
- unsigned long system_rev; /* 76 */
- unsigned long system_serial_low; /* 80 */
- unsigned long system_serial_high; /* 84 */
- unsigned long mem_fclk_21285; /* 88 */
- } s;
- char unused[256];
- } u1;
- union {
- char paths[8][128];
- struct {
- unsigned long magic;
- char n[1024 - sizeof(unsigned long)];
- } s;
- } u2;
- char commandline[COMMAND_LINE_SIZE];
-};
-
-
/*
* The new way of passing information: a list of tagged entries
*/
diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
index a167036db5..9f9dea8754 100644
--- a/arch/arm/lib/armlinux.c
+++ b/arch/arm/lib/armlinux.c
@@ -227,7 +227,7 @@ static void setup_end_tag (void)
static void setup_tags(unsigned long initrd_address,
unsigned long initrd_size, int swap)
{
- const char *commandline = getenv("bootargs");
+ const char *commandline = linux_bootargs_get();
setup_start_tag();
setup_memory_tags();
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
index c4a50c301c..033e2eb15b 100644
--- a/arch/arm/lib/bootm.c
+++ b/arch/arm/lib/bootm.c
@@ -394,7 +394,7 @@ static int do_bootm_aimage(struct image_data *data)
}
if (!getenv("aimage_noverwrite_bootargs"))
- setenv("bootargs", header->cmdline);
+ linux_bootargs_overwrite(header->cmdline);
if (!getenv("aimage_noverwrite_tags"))
armlinux_set_bootparams((void*)header->tags_addr);
@@ -432,6 +432,7 @@ static int do_bootm_aimage(struct image_data *data)
return __do_bootm_linux(data, 0);
err_out:
+ linux_bootargs_overwrite(NULL);
close(fd);
return ret;
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 32367627d4..b402677d10 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -294,6 +294,14 @@ config MACH_PCM038
Say Y here if you are using Phytec's phyCORE-i.MX27 (pcm038) equipped
with a Freescale i.MX27 Processor
+config MACH_PCM970_BASEBOARD
+ bool "PHYTEC PCM970 development board"
+ depends on MACH_PCM038
+ default y
+ help
+ This adds board specific devices that can be found on Phytec's
+ PCM970 evaluation board.
+
config MACH_NESO
bool "Garz+Fricke Neso"
select MACH_HAS_LOWLEVEL_INIT
diff --git a/arch/arm/mach-omap/devices-gpmc-nand.c b/arch/arm/mach-omap/devices-gpmc-nand.c
index 0fc32f1d07..cf87b57d7f 100644
--- a/arch/arm/mach-omap/devices-gpmc-nand.c
+++ b/arch/arm/mach-omap/devices-gpmc-nand.c
@@ -49,7 +49,7 @@ static struct gpmc_nand_platform_data nand_plat = {
/**
* @brief gpmc_generic_nand_devices_init - init generic nand device
*
- * @return success/fail based on device funtion
+ * @return success/fail based on device function
*/
int gpmc_generic_nand_devices_init(int cs, int width,
enum gpmc_ecc_mode eccmode, struct gpmc_config *nand_cfg)
diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
index 59f75e237a..13024abac7 100644
--- a/arch/arm/mach-omap/xload.c
+++ b/arch/arm/mach-omap/xload.c
@@ -14,7 +14,7 @@ void *omap_xload_boot_nand(int offset, int size)
void *to = xmalloc(size);
struct cdev *cdev;
- devfs_add_partition("nand0", offset, size, PARTITION_FIXED, "x");
+ devfs_add_partition("nand0", offset, size, DEVFS_PARTITION_FIXED, "x");
dev_add_bb_dev("x", "bbx");
cdev = cdev_open("bbx", O_RDONLY);
diff --git a/arch/arm/mach-samsung/include/mach/s3c-generic.h b/arch/arm/mach-samsung/include/mach/s3c-generic.h
index 4ea3dd7ea4..5d3808ef5b 100644
--- a/arch/arm/mach-samsung/include/mach/s3c-generic.h
+++ b/arch/arm/mach-samsung/include/mach/s3c-generic.h
@@ -30,5 +30,9 @@ uint32_t s3c_get_fclk(void);
uint32_t s3c_get_hclk(void);
uint32_t s3c_get_pclk(void);
uint32_t s3c_get_uclk(void);
+
+unsigned s3c_get_uart_clk(unsigned src);
+
uint32_t s3c24xx_get_memory_size(void);
+
void s3c24xx_disable_second_sdram_bank(void);
diff --git a/arch/arm/mach-samsung/s3c24xx-clocks.c b/arch/arm/mach-samsung/s3c24xx-clocks.c
index a99d1b9d18..13e68678e1 100644
--- a/arch/arm/mach-samsung/s3c24xx-clocks.c
+++ b/arch/arm/mach-samsung/s3c24xx-clocks.c
@@ -118,6 +118,23 @@ uint32_t s3c24_get_uclk(void)
}
/**
+ * Return correct UART frequency based on the UCON register
+ */
+unsigned s3c_get_uart_clk(unsigned src)
+{
+ switch (src & 3) {
+ case 0:
+ case 2:
+ return s3c_get_pclk();
+ case 1:
+ return 0; /* TODO UEXTCLK */
+ case 3:
+ return 0; /* TODO FCLK/n */
+ }
+ return 0; /* not reached, to make compiler happy */
+}
+
+/**
* Show the user the current clock settings
*/
int s3c24xx_dump_clocks(void)
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
index ff97af41df..325513f31a 100644
--- a/arch/arm/tools/mach-types
+++ b/arch/arm/tools/mach-types
@@ -12,7 +12,7 @@
#
# http://www.arm.linux.org.uk/developer/machines/?action=new
#
-# Last update: Thu Feb 9 12:00:12 2012
+# Last update: Mon May 14 09:28:07 2012
#
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
#
@@ -3424,7 +3424,7 @@ h1600 MACH_H1600 H1600 3465
mini210 MACH_MINI210 MINI210 3466
mini8168 MACH_MINI8168 MINI8168 3467
pc7308 MACH_PC7308 PC7308 3468
-ge863pro3 MACH_GE863 GE863 3469
+ge863_pro3_evk MACH_GE863 GE863 3469
kmm2m01 MACH_KMM2M01 KMM2M01 3470
mx51erebus MACH_MX51EREBUS MX51EREBUS 3471
wm8650refboard MACH_WM8650REFBOARD WM8650REFBOARD 3472
@@ -3733,7 +3733,7 @@ shelter MACH_SHELTER SHELTER 3778
omap3_devkit8500 MACH_OMAP3_DEVKIT8500 OMAP3_DEVKIT8500 3779
edgetd MACH_EDGETD EDGETD 3780
copperyard MACH_COPPERYARD COPPERYARD 3781
-edge MACH_EDGE EDGE 3782
+edge_test MACH_EDGE EDGE 3782
edge_u MACH_EDGE_U EDGE_U 3783
edge_td MACH_EDGE_TD EDGE_TD 3784
wdss MACH_WDSS WDSS 3785
@@ -3945,7 +3945,7 @@ u8520 MACH_U8520 U8520 3990
manta MACH_MANTA MANTA 3991
spear1340_lcad MACH_SPEAR_EM_S900 SPEAR_EM_S900 3992
mpq8064_cdp MACH_MPQ8064_CDP MPQ8064_CDP 3993
-mpq8064_stb MACH_MPQ8064_STB MPQ8064_STB 3994
+mpq8064_hrd MACH_MPQ8064_STB MPQ8064_STB 3994
mpq8064_dtv MACH_MPQ8064_DTV MPQ8064_DTV 3995
dm368som MACH_DM368SOM DM368SOM 3996
gprisb2 MACH_GPRISB2 GPRISB2 3997
@@ -3963,3 +3963,188 @@ pcats_9307_type_a MACH_PCATS_9307_TYPE_A PCATS_9307_TYPE_A 4008
pcats_9307_type_o MACH_PCATS_9307_TYPE_O PCATS_9307_TYPE_O 4009
pcats_9307_type_r MACH_PCATS_9307_TYPE_R PCATS_9307_TYPE_R 4010
streamplug MACH_STREAMPLUG STREAMPLUG 4011
+icechicken_dev MACH_ICECHICKEN_DEV ICECHICKEN_DEV 4012
+hedgehog MACH_HEDGEHOG HEDGEHOG 4013
+yusend_obc MACH_YUSEND_OBC YUSEND_OBC 4014
+imxninja MACH_IMXNINJA IMXNINJA 4015
+omap4_jarod MACH_OMAP4_JAROD OMAP4_JAROD 4016
+eco5_pk MACH_ECO5_PK ECO5_PK 4017
+qj2440 MACH_QJ2440 QJ2440 4018
+mx6q_mercury MACH_MX6Q_MERCURY MX6Q_MERCURY 4019
+cm6810 MACH_CM6810 CM6810 4020
+omap4_torpedo MACH_OMAP4_TORPEDO OMAP4_TORPEDO 4021
+nsa310 MACH_NSA310 NSA310 4022
+tmx536 MACH_TMX536 TMX536 4023
+ktt20 MACH_KTT20 KTT20 4024
+dragonix MACH_DRAGONIX DRAGONIX 4025
+lungching MACH_LUNGCHING LUNGCHING 4026
+bulogics MACH_BULOGICS BULOGICS 4027
+mx535_sx MACH_MX535_SX MX535_SX 4028
+ngui3250 MACH_NGUI3250 NGUI3250 4029
+salutec_dac MACH_SALUTEC_DAC SALUTEC_DAC 4030
+loco MACH_LOCO LOCO 4031
+ctera_plug_usi MACH_CTERA_PLUG_USI CTERA_PLUG_USI 4032
+scepter MACH_SCEPTER SCEPTER 4033
+sga MACH_SGA SGA 4034
+p_81_j5 MACH_P_81_J5 P_81_J5 4035
+p_81_o4 MACH_P_81_O4 P_81_O4 4036
+msm8625_surf MACH_MSM8625_SURF MSM8625_SURF 4037
+carallon_shark MACH_CARALLON_SHARK CARALLON_SHARK 4038
+lsgc_icam MACH_LSGCICAM LSGCICAM 4039
+ordog MACH_ORDOG ORDOG 4040
+puente_io MACH_PUENTE_IO PUENTE_IO 4041
+msm8625_evb MACH_MSM8625_EVB MSM8625_EVB 4042
+ev_am1707 MACH_EV_AM1707 EV_AM1707 4043
+ev_am1707e2 MACH_EV_AM1707E2 EV_AM1707E2 4044
+ev_am3517e2 MACH_EV_AM3517E2 EV_AM3517E2 4045
+calabria MACH_CALABRIA CALABRIA 4046
+ev_imx287 MACH_EV_IMX287 EV_IMX287 4047
+erau MACH_ERAU ERAU 4048
+sichuan MACH_SICHUAN SICHUAN 4049
+sopdm MACH_WIRMA3 WIRMA3 4050
+davinci_da850 MACH_DAVINCI_DA850 DAVINCI_DA850 4051
+omap138_trunarc MACH_OMAP138_TRUNARC OMAP138_TRUNARC 4052
+bcm4761 MACH_BCM4761 BCM4761 4053
+picasso_e2 MACH_PICASSO_E2 PICASSO_E2 4054
+picasso_mf MACH_PICASSO_MF PICASSO_MF 4055
+miro MACH_MIRO MIRO 4056
+at91sam9g20ewon3 MACH_AT91SAM9G20EWON3 AT91SAM9G20EWON3 4057
+yoyo MACH_YOYO YOYO 4058
+windjkl MACH_WINDJKL WINDJKL 4059
+monarudo MACH_MONARUDO MONARUDO 4060
+batan MACH_BATAN BATAN 4061
+tadao MACH_TADAO TADAO 4062
+baso MACH_BASO BASO 4063
+mahon MACH_MAHON MAHON 4064
+villec2 MACH_VILLEC2 VILLEC2 4065
+asi1230 MACH_ASI1230 ASI1230 4066
+alaska MACH_ALASKA ALASKA 4067
+swarco_shdsl2 MACH_SWARCO_SHDSL2 SWARCO_SHDSL2 4068
+oxrtu MACH_OXRTU OXRTU 4069
+omap5_panda MACH_OMAP5_PANDA OMAP5_PANDA 4070
+imx286 MACH_MX28XDI MX28XDI 4071
+c8000 MACH_C8000 C8000 4072
+bje_display3_5 MACH_BJE_DISPLAY3_5 BJE_DISPLAY3_5 4073
+picomod7 MACH_PICOMOD7 PICOMOD7 4074
+picocom5 MACH_PICOCOM5 PICOCOM5 4075
+qblissa8 MACH_QBLISSA8 QBLISSA8 4076
+armstonea8 MACH_ARMSTONEA8 ARMSTONEA8 4077
+netdcu14 MACH_NETDCU14 NETDCU14 4078
+at91sam9x5_epiphan MACH_AT91SAM9X5_EPIPHAN AT91SAM9X5_EPIPHAN 4079
+p2u MACH_P2U P2U 4080
+doris MACH_DORIS DORIS 4081
+j49 MACH_J49 J49 4082
+vdss2e MACH_VDSS2E VDSS2E 4083
+vc300 MACH_VC300 VC300 4084
+ns115_pad_test MACH_NS115_PAD_TEST NS115_PAD_TEST 4085
+ns115_pad_ref MACH_NS115_PAD_REF NS115_PAD_REF 4086
+ns115_phone_test MACH_NS115_PHONE_TEST NS115_PHONE_TEST 4087
+ns115_phone_ref MACH_NS115_PHONE_REF NS115_PHONE_REF 4088
+golfc MACH_GOLFC GOLFC 4089
+xerox_olympus MACH_XEROX_OLYMPUS XEROX_OLYMPUS 4090
+mx6sl_arm2 MACH_MX6SL_ARM2 MX6SL_ARM2 4091
+csb1701_csb1726 MACH_CSB1701_CSB1726 CSB1701_CSB1726 4092
+at91sam9xeek MACH_AT91SAM9XEEK AT91SAM9XEEK 4093
+ebv210 MACH_EBV210 EBV210 4094
+msm7627a_qrd7 MACH_MSM7627A_QRD7 MSM7627A_QRD7 4095
+svthin MACH_SVTHIN SVTHIN 4096
+duovero MACH_DUOVERO DUOVERO 4097
+chupacabra MACH_CHUPACABRA CHUPACABRA 4098
+scorpion MACH_SCORPION SCORPION 4099
+davinci_he_hmi10 MACH_DAVINCI_HE_HMI10 DAVINCI_HE_HMI10 4100
+topkick MACH_TOPKICK TOPKICK 4101
+m3_auguestrush MACH_M3_AUGUESTRUSH M3_AUGUESTRUSH 4102
+ipc335x MACH_IPC335X IPC335X 4103
+sun4i MACH_SUN4I SUN4I 4104
+imx233_olinuxino MACH_IMX233_OLINUXINO IMX233_OLINUXINO 4105
+k2_wl MACH_K2_WL K2_WL 4106
+k2_ul MACH_K2_UL K2_UL 4107
+k2_cl MACH_K2_CL K2_CL 4108
+minbari_w MACH_MINBARI_W MINBARI_W 4109
+minbari_m MACH_MINBARI_M MINBARI_M 4110
+k035 MACH_K035 K035 4111
+ariel MACH_ARIEL ARIEL 4112
+arielsaarc MACH_ARIELSAARC ARIELSAARC 4113
+arieldkb MACH_ARIELDKB ARIELDKB 4114
+armadillo810 MACH_ARMADILLO810 ARMADILLO810 4115
+tam335x MACH_TAM335X TAM335X 4116
+grouper MACH_GROUPER GROUPER 4117
+mpcsa21_9g20 MACH_MPCSA21_9G20 MPCSA21_9G20 4118
+m6u_cpu MACH_M6U_CPU M6U_CPU 4119
+davinci_dp10 MACH_DAVINCI_DP10 DAVINCI_DP10 4120
+ginkgo MACH_GINKGO GINKGO 4121
+cgt_qmx6 MACH_CGT_QMX6 CGT_QMX6 4122
+profpga MACH_PROFPGA PROFPGA 4123
+acfx100oc MACH_ACFX100OC ACFX100OC 4124
+acfx100nb MACH_ACFX100NB ACFX100NB 4125
+capricorn MACH_CAPRICORN CAPRICORN 4126
+pisces MACH_PISCES PISCES 4127
+aries MACH_ARIES ARIES 4128
+cancer MACH_CANCER CANCER 4129
+leo MACH_LEO LEO 4130
+virgo MACH_VIRGO VIRGO 4131
+sagittarius MACH_SAGITTARIUS SAGITTARIUS 4132
+devil MACH_DEVIL DEVIL 4133
+ballantines MACH_BALLANTINES BALLANTINES 4134
+omap3_procerusvpu MACH_OMAP3_PROCERUSVPU OMAP3_PROCERUSVPU 4135
+my27 MACH_MY27 MY27 4136
+sun6i MACH_SUN6I SUN6I 4137
+sun5i MACH_SUN5I SUN5I 4138
+mx512_mx MACH_MX512_MX MX512_MX 4139
+kzm9g MACH_KZM9G KZM9G 4140
+vdstbn MACH_VDSTBN VDSTBN 4141
+cfa10036 MACH_CFA10036 CFA10036 4142
+cfa10049 MACH_CFA10049 CFA10049 4143
+pcm051 MACH_PCM051 PCM051 4144
+vybrid_vf7xx MACH_VYBRID_VF7XX VYBRID_VF7XX 4145
+vybrid_vf6xx MACH_VYBRID_VF6XX VYBRID_VF6XX 4146
+vybrid_vf5xx MACH_VYBRID_VF5XX VYBRID_VF5XX 4147
+vybrid_vf4xx MACH_VYBRID_VF4XX VYBRID_VF4XX 4148
+aria_g25 MACH_ARIA_G25 ARIA_G25 4149
+bcm21553 MACH_BCM21553 BCM21553 4150
+smdk5410 MACH_SMDK5410 SMDK5410 4151
+lpc18xx MACH_LPC18XX LPC18XX 4152
+oratisparty MACH_ORATISPARTY ORATISPARTY 4153
+qseven MACH_QSEVEN QSEVEN 4154
+gmv_generic MACH_GMV_GENERIC GMV_GENERIC 4155
+th_link_eth MACH_TH_LINK_ETH TH_LINK_ETH 4156
+tn_muninn MACH_TN_MUNINN TN_MUNINN 4157
+rampage MACH_RAMPAGE RAMPAGE 4158
+visstrim_mv10 MACH_VISSTRIM_MV10 VISSTRIM_MV10 4159
+monacotdu MACH_MONACO_TDU MONACO_TDU 4160
+monacoul MACH_MONACO_UL MONACO_UL 4161
+enrc2u MACH_ENRC2_U ENRC2_U 4162
+evitareul MACH_EVITA_UL EVITA_UL 4163
+mx28_wilma MACH_MX28_WILMA MX28_WILMA 4164
+monacou MACH_MONACO_U MONACO_U 4165
+msm8625_ffa MACH_MSM8625_FFA MSM8625_FFA 4166
+vpu101 MACH_VPU101 VPU101 4167
+operaul MACH_OPERA_UL OPERA_UL 4168
+baileys MACH_BAILEYS BAILEYS 4169
+familybox MACH_FAMILYBOX FAMILYBOX 4170
+ensemble_mx35 MACH_ENSEMBLE_MX35 ENSEMBLE_MX35 4171
+sc_sps_1 MACH_SC_SPS_1 SC_SPS_1 4172
+ucsimply_sam9260 MACH_UCSIMPLY_SAM9260 UCSIMPLY_SAM9260 4173
+unicorn MACH_UNICORN UNICORN 4174
+m9g45a MACH_M9G45A M9G45A 4175
+mtwebif MACH_MTWEBIF MTWEBIF 4176
+playstone MACH_PLAYSTONE PLAYSTONE 4177
+chelsea MACH_CHELSEA CHELSEA 4178
+bayern MACH_BAYERN BAYERN 4179
+mitwo MACH_MITWO MITWO 4180
+mx25_noah MACH_MX25_NOAH MX25_NOAH 4181
+stm_b2020 MACH_STM_B2020 STM_B2020 4182
+annax_src MACH_ANNAX_SRC ANNAX_SRC 4183
+ionics_stratus MACH_IONICS_STRATUS IONICS_STRATUS 4184
+hugo MACH_HUGO HUGO 4185
+em300 MACH_EM300 EM300 4186
+mmp3_qseven MACH_MMP3_QSEVEN MMP3_QSEVEN 4187
+bosphorus2 MACH_BOSPHORUS2 BOSPHORUS2 4188
+tt2200 MACH_TT2200 TT2200 4189
+ocelot3 MACH_OCELOT3 OCELOT3 4190
+tek_cobra MACH_TEK_COBRA TEK_COBRA 4191
+protou MACH_PROTOU PROTOU 4192
+msm8625_evt MACH_MSM8625_EVT MSM8625_EVT 4193
+mx53_sellwood MACH_MX53_SELLWOOD MX53_SELLWOOD 4194
+somiq_am35 MACH_SOMIQ_AM35 SOMIQ_AM35 4195
+somiq_am37 MACH_SOMIQ_AM37 SOMIQ_AM37 4196
diff --git a/arch/blackfin/boards/ipe337/ipe337.c b/arch/blackfin/boards/ipe337/ipe337.c
index 3c5566d704..b3f07bbb6d 100644
--- a/arch/blackfin/boards/ipe337/ipe337.c
+++ b/arch/blackfin/boards/ipe337/ipe337.c
@@ -19,8 +19,8 @@ static int ipe337_devices_init(void) {
add_generic_device("smc911x", DEVICE_ID_DYNAMIC, NULL, 0x24000000, 4096,
IORESOURCE_MEM, NULL);
- devfs_add_partition("nor0", 0x00000, 0x20000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x20000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x20000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x20000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
diff --git a/arch/blackfin/lib/blackfin_linux.c b/arch/blackfin/lib/blackfin_linux.c
index 458d1b180b..7798bbd34b 100644
--- a/arch/blackfin/lib/blackfin_linux.c
+++ b/arch/blackfin/lib/blackfin_linux.c
@@ -43,7 +43,7 @@
static int do_bootm_linux(struct image_data *idata)
{
int (*appl)(char *cmdline);
- const char *cmdline = getenv("bootargs");
+ const char *cmdline = linux_bootargs_get();
char *cmdlinedest = (char *) CMD_LINE_ADDR;
if (!idata->os_res)
diff --git a/arch/mips/boards/qemu-malta/init.c b/arch/mips/boards/qemu-malta/init.c
index 16dc77c559..2a6eadbfb7 100644
--- a/arch/mips/boards/qemu-malta/init.c
+++ b/arch/mips/boards/qemu-malta/init.c
@@ -34,8 +34,8 @@ static int malta_devices_init(void)
{
add_cfi_flash_device(0, 0x1e000000, SZ_4M, 0);
- devfs_add_partition("nor0", 0x0, SZ_512K, PARTITION_FIXED, "self");
- devfs_add_partition("nor0", SZ_512K, SZ_64K, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x0, SZ_512K, DEVFS_PARTITION_FIXED, "self");
+ devfs_add_partition("nor0", SZ_512K, SZ_64K, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/mips/boot/start.S b/arch/mips/boot/start.S
index b756d40d3d..e8868e1dc0 100644
--- a/arch/mips/boot/start.S
+++ b/arch/mips/boot/start.S
@@ -25,6 +25,8 @@
#include <asm/mipsregs.h>
#include <asm/asm.h>
#include <asm-generic/memory_layout.h>
+#include <generated/compile.h>
+#include <generated/utsrelease.h>
/*
* ADR macro instruction (inspired by ARM)
@@ -52,6 +54,16 @@ _pc: addiu \rd, ra, \label - _pc # label is assumed to be
.align 4
EXPORT(_start)
+
+ b __start
+ nop
+
+ .org 0x10
+ .ascii "barebox " UTS_RELEASE " " UTS_VERSION
+ .byte 0
+
+ .align 4
+__start:
/* disable watchpoints */
mtc0 zero, CP0_WATCHLO
mtc0 zero, CP0_WATCHHI
diff --git a/arch/mips/include/debug_ll_ns16550.h b/arch/mips/include/debug_ll_ns16550.h
new file mode 100644
index 0000000000..9280219449
--- /dev/null
+++ b/arch/mips/include/debug_ll_ns16550.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This file is part of barebox.
+ * See file CREDITS for list of people who contributed to this project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** @file
+ * This file contains declaration for early output support
+ */
+#ifndef __INCLUDE_ARCH_DEBUG_LL_NS16550_H__
+#define __INCLUDE_ARCH_DEBUG_LL_NS16550_H__
+
+#include <asm/io.h>
+
+#define rbr (0 << DEBUG_LL_UART_SHIFT)
+#define lsr (5 << DEBUG_LL_UART_SHIFT)
+
+#define LSR_THRE 0x20 /* Xmit holding register empty */
+
+static __inline__ void putc(char ch)
+{
+ while (!(__raw_readb((u8 *)DEBUG_LL_UART_ADDR + lsr) & LSR_THRE));
+ __raw_writeb(ch, (u8 *)DEBUG_LL_UART_ADDR + rbr);
+}
+
+#endif /* __INCLUDE_ARCH_DEBUG_LL_NS16550_H__ */
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile
index 45fe920c44..85aa19418d 100644
--- a/arch/mips/lib/Makefile
+++ b/arch/mips/lib/Makefile
@@ -6,3 +6,4 @@ obj-y += ashrdi3.o
obj-y += memory.o
obj-$(CONFIG_CMD_MIPS_CPUINFO) += cpuinfo.o
+obj-$(CONFIG_CMD_BOOTM) += bootm.o
diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
new file mode 100644
index 0000000000..3d6a4ce648
--- /dev/null
+++ b/arch/mips/lib/bootm.c
@@ -0,0 +1,43 @@
+#include <boot.h>
+#include <common.h>
+#include <init.h>
+#include <fs.h>
+#include <errno.h>
+#include <binfmt.h>
+
+#include <asm/byteorder.h>
+
+static int do_bootm_barebox(struct image_data *data)
+{
+ void (*barebox)(void);
+
+ barebox = read_file(data->os_file, NULL);
+ if (!barebox)
+ return -EINVAL;
+
+ shutdown_barebox();
+
+ barebox();
+
+ reset_cpu(0);
+}
+
+static struct image_handler barebox_handler = {
+ .name = "MIPS barebox",
+ .bootm = do_bootm_barebox,
+ .filetype = filetype_mips_barebox,
+};
+
+static struct binfmt_hook binfmt_barebox_hook = {
+ .type = filetype_mips_barebox,
+ .exec = "bootm",
+};
+
+static int mips_register_image_handler(void)
+{
+ register_image_handler(&barebox_handler);
+ binfmt_register(&binfmt_barebox_hook);
+
+ return 0;
+}
+late_initcall(mips_register_image_handler);
diff --git a/arch/mips/mach-malta/include/mach/debug_ll.h b/arch/mips/mach-malta/include/mach/debug_ll.h
index ccc9d9bfc7..9de469ba86 100644
--- a/arch/mips/mach-malta/include/mach/debug_ll.h
+++ b/arch/mips/mach-malta/include/mach/debug_ll.h
@@ -24,17 +24,8 @@
#ifndef __INCLUDE_ARCH_DEBUG_LL_H__
#define __INCLUDE_ARCH_DEBUG_LL_H__
-#include <io.h>
#include <mach/hardware.h>
-#define rbr 0
-#define lsr 5
-#define LSR_THRE 0x20 /* Xmit holding register empty */
-
-static __inline__ void putc(char ch)
-{
- while (!(__raw_readb(DEBUG_LL_UART_ADDR + lsr) & LSR_THRE));
- __raw_writeb(ch, DEBUG_LL_UART_ADDR + rbr);
-}
+#include <debug_ll_ns16550.h>
#endif /* __INCLUDE_ARCH_DEBUG_LL_H__ */
diff --git a/arch/mips/mach-malta/include/mach/hardware.h b/arch/mips/mach-malta/include/mach/hardware.h
index f827cc3557..ddeb1b7dd0 100644
--- a/arch/mips/mach-malta/include/mach/hardware.h
+++ b/arch/mips/mach-malta/include/mach/hardware.h
@@ -22,6 +22,7 @@
#define __INCLUDE_ARCH_HARDWARE_H__
#define DEBUG_LL_UART_ADDR 0xb00003f8
+#define DEBUG_LL_UART_SHIFT 0
/*
* Reset register.
diff --git a/arch/nios2/boards/generic/generic.c b/arch/nios2/boards/generic/generic.c
index 758e75a812..b51b94afbf 100644
--- a/arch/nios2/boards/generic/generic.c
+++ b/arch/nios2/boards/generic/generic.c
@@ -40,8 +40,8 @@ static int generic_devices_init(void)
register_device(&mac_dev);
/*register_device(&epcs_flash_device);*/
- devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", 0x40000, 0x20000, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
protect_file("/dev/env0", 1);
diff --git a/arch/nios2/lib/bootm.c b/arch/nios2/lib/bootm.c
index 1cd43c81af..5713a893cb 100644
--- a/arch/nios2/lib/bootm.c
+++ b/arch/nios2/lib/bootm.c
@@ -39,7 +39,7 @@
static int do_bootm_linux(struct image_data *idata)
{
void (*kernel)(int, int, int, const char *);
- const char *commandline = getenv ("bootargs");
+ const char *commandline = linux_bootargs_get();
if (!idata->os_res)
return -EINVAL;
diff --git a/arch/ppc/boards/pcm030/pcm030.c b/arch/ppc/boards/pcm030/pcm030.c
index 36e80a10eb..ba6aa43182 100644
--- a/arch/ppc/boards/pcm030/pcm030.c
+++ b/arch/ppc/boards/pcm030/pcm030.c
@@ -62,8 +62,8 @@ static int devices_init (void)
if (ret)
return 0;
- devfs_add_partition("nor0", s.st_size - SZ_1M, SZ_512K, PARTITION_FIXED, "self0");
- devfs_add_partition("nor0", s.st_size - SZ_512K, SZ_512K, PARTITION_FIXED, "env0");
+ devfs_add_partition("nor0", s.st_size - SZ_1M, SZ_512K, DEVFS_PARTITION_FIXED, "self0");
+ devfs_add_partition("nor0", s.st_size - SZ_512K, SZ_512K, DEVFS_PARTITION_FIXED, "env0");
return 0;
}
diff --git a/arch/ppc/include/asm/io.h b/arch/ppc/include/asm/io.h
index 13187cae24..00529898dd 100644
--- a/arch/ppc/include/asm/io.h
+++ b/arch/ppc/include/asm/io.h
@@ -105,6 +105,34 @@ extern void _outsl_ns(volatile u32 *port, const void *buf, int nl);
#define iobarrier_w() eieio()
/*
+ * Non ordered and non-swapping "raw" accessors
+ */
+static inline unsigned char __raw_readb(const volatile void __iomem *addr)
+{
+ return *(volatile unsigned char __force *)(addr);
+}
+static inline unsigned short __raw_readw(const volatile void __iomem *addr)
+{
+ return *(volatile unsigned short __force *)(addr);
+}
+static inline unsigned int __raw_readl(const volatile void __iomem *addr)
+{
+ return *(volatile unsigned int __force *)(addr);
+}
+static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr)
+{
+ *(volatile unsigned char __force *)(addr) = v;
+}
+static inline void __raw_writew(unsigned short v, volatile void __iomem *addr)
+{
+ *(volatile unsigned short __force *)(addr) = v;
+}
+static inline void __raw_writel(unsigned int v, volatile void __iomem *addr)
+{
+ *(volatile unsigned int __force *)(addr) = v;
+}
+
+/*
* 8, 16 and 32 bit, big and little endian I/O operations, with barrier.
*/
extern inline int in_8(volatile u8 *addr)
diff --git a/arch/ppc/lib/Makefile b/arch/ppc/lib/Makefile
index 0f5e01761d..ba2f078b62 100644
--- a/arch/ppc/lib/Makefile
+++ b/arch/ppc/lib/Makefile
@@ -8,4 +8,5 @@ obj-y += misc.o
obj-$(CONFIG_CMD_BOOTM) += ppclinux.o
obj-$(CONFIG_MODULES) += module.o
obj-y += crtsavres.o
+obj-y += reloc.o
diff --git a/arch/ppc/lib/reloc.S b/arch/ppc/lib/reloc.S
new file mode 100644
index 0000000000..92ee189494
--- /dev/null
+++ b/arch/ppc/lib/reloc.S
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009 Wolfgang Denk <wd@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <asm/ppc_asm.tmpl>
+
+ .file "reloc.S"
+
+ .text
+ /*
+ * Function: relocate entries for one exception vector
+ */
+ .globl trap_reloc
+ .type trap_reloc, @function
+trap_reloc:
+ lwz r0, 0(r7) /* hdlr ... */
+ add r0, r0, r3 /* ... += dest_addr */
+ stw r0, 0(r7)
+
+ lwz r0, 4(r7) /* int_return ... */
+ add r0, r0, r3 /* ... += dest_addr */
+ stw r0, 4(r7)
+
+ lwz r0, 8(r7) /* transfer_to_handler ...*/
+ add r0, r0, r3 /* ... += dest_addr */
+ stw r0, 8(r7)
+
+ blr
+ .size trap_reloc, .-trap_reloc
diff --git a/arch/ppc/mach-mpc5xxx/start.S b/arch/ppc/mach-mpc5xxx/start.S
index e098a87cc1..04e8fe3f4b 100644
--- a/arch/ppc/mach-mpc5xxx/start.S
+++ b/arch/ppc/mach-mpc5xxx/start.S
@@ -726,20 +726,6 @@ trap_init:
mtlr r4 /* restore link register */
blr
- /*
- * Function: relocate entries for one exception vector
- */
-trap_reloc:
- lwz r0, 0(r7) /* hdlr ... */
- add r0, r0, r3 /* ... += dest_addr */
- stw r0, 0(r7)
-
- lwz r0, 4(r7) /* int_return ... */
- add r0, r0, r3 /* ... += dest_addr */
- stw r0, 4(r7)
-
- blr
-
.globl _text_base
_text_base:
.long TEXT_BASE
diff --git a/commands/Kconfig b/commands/Kconfig
index 49a56ca2ff..1839538dde 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -113,6 +113,13 @@ config CMD_LINUX_EXEC
help
This command executes a command on the Linux host.
+config CMD_GLOBAL
+ select GLOBALVAR
+ tristate
+ prompt "global"
+ help
+ The global command allows to create global variables
+
endmenu
menu "file commands "
@@ -389,6 +396,18 @@ config CMD_BOOTU
compile in the 'bootu' command to start raw (uncompressed)
Linux images
+config FLEXIBLE_BOOTARGS
+ bool
+ prompt "flexible Linux bootargs generation"
+ depends on CMD_GLOBAL
+ help
+ Select this to get a more flexible bootargs generation. With this
+ option the bootargs are concatenated together from global variables
+ beginning with 'global.linux.bootargs.' and 'global.linux.mtdparts.'
+ This allows for more flexible scripting since with it it's possible
+ to replace parts of the bootargs string without reconstructing it
+ completely
+
config CMD_LINUX16
tristate
depends on X86
diff --git a/commands/Makefile b/commands/Makefile
index f02b5cac3a..4c8a0a9595 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -65,3 +65,4 @@ obj-$(CONFIG_CMD_MAGICVAR) += magicvar.o
obj-$(CONFIG_CMD_IOMEM) += iomem.o
obj-$(CONFIG_CMD_LINUX_EXEC) += linux_exec.o
obj-$(CONFIG_CMD_AUTOMOUNT) += automount.o
+obj-$(CONFIG_CMD_GLOBAL) += global.o
diff --git a/commands/crc.c b/commands/crc.c
index df229410f6..a0d3af63fa 100644
--- a/commands/crc.c
+++ b/commands/crc.c
@@ -48,7 +48,7 @@ static int file_crc(char* filename, ulong start, ulong size, ulong *crc,
if (start > 0) {
ret = lseek(fd, start, SEEK_SET);
- if (ret == -1) {
+ if (ret < 0) {
perror("lseek");
goto out;
}
diff --git a/commands/edit.c b/commands/edit.c
index fae76cdb55..eddec0b935 100644
--- a/commands/edit.c
+++ b/commands/edit.c
@@ -62,7 +62,7 @@ static int scrcol = 0; /* the first column on screen */
static void pos(int x, int y)
{
- printf("%c[%d;%dH", 27, y + 1, x + 1);
+ printf("%c[%d;%dH", 27, y + 2, x + 1);
}
static char *screenline(char *line, int *pos)
@@ -409,6 +409,17 @@ static int do_edit(int argc, char *argv[])
lastscrcol = 0;
printf("%c[2J", 27);
+
+ pos(0, -1);
+
+ printf("%c[7m %-25s <ctrl-d>: Save and quit <ctrl-c>: quit %c[0m",
+ 27, argv[1], 27);
+ printf("%c[2;%dr", 27, screenheight);
+
+ screenheight--; /* status line */
+
+ pos(0, 0);
+
refresh(1);
while (1) {
@@ -416,7 +427,7 @@ static int do_edit(int argc, char *argv[])
if (textx > curlen)
textx = curlen;
- if (textx < 0)
+ if (textx < 1)
textx = 0;
screenline(curline->data, &linepos);
@@ -531,7 +542,7 @@ static int do_edit(int argc, char *argv[])
}
out:
free_buffer();
- printf("%c[2J", 27);
+ printf("%c[2J%c[r", 27, 27);
printf("\n");
return 0;
}
diff --git a/commands/global.c b/commands/global.c
new file mode 100644
index 0000000000..de6b13e7bd
--- /dev/null
+++ b/commands/global.c
@@ -0,0 +1,62 @@
+/*
+ * global.c - global shell variables
+ *
+ * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <common.h>
+#include <malloc.h>
+#include <command.h>
+#include <globalvar.h>
+#include <environment.h>
+
+static int do_global(int argc, char *argv[])
+{
+ int ret;
+ char *value;
+
+ if (argc != 2)
+ return COMMAND_ERROR_USAGE;
+
+ value = strchr(argv[1], '=');
+ if (value) {
+ *value = 0;
+ value++;
+ }
+
+ ret = globalvar_add_simple(argv[1]);
+
+ if (value) {
+ char *name = asprintf("global.%s", argv[1]);
+ ret = setenv(name, value);
+ free(name);
+ }
+
+ return ret ? 1 : 0;
+}
+
+BAREBOX_CMD_HELP_START(global)
+BAREBOX_CMD_HELP_USAGE("global <var>[=<value]\n")
+BAREBOX_CMD_HELP_SHORT("add a new global variable named <var>, optionally set to <value>\n")
+BAREBOX_CMD_HELP_END
+
+BAREBOX_CMD_START(global)
+ .cmd = do_global,
+ .usage = "create global variables",
+ BAREBOX_CMD_HELP(cmd_global_help)
+BAREBOX_CMD_END
diff --git a/commands/i2c.c b/commands/i2c.c
index 39bae35a33..763db8a1ab 100644
--- a/commands/i2c.c
+++ b/commands/i2c.c
@@ -74,10 +74,10 @@ static int do_i2c_write(int argc, char *argv[])
{
struct i2c_adapter *adapter = NULL;
struct i2c_client client;
- int addr = -1, reg = -1, count = -1, verbose = 0, ret, opt, i, bus = 0;
+ int addr = -1, reg = -1, count = -1, verbose = 0, ret, opt, i, bus = 0, wide = 0;
u8 *buf;
- while ((opt = getopt(argc, argv, "a:b:r:v")) > 0) {
+ while ((opt = getopt(argc, argv, "a:b:r:v:w")) > 0) {
switch (opt) {
case 'a':
addr = simple_strtol(optarg, NULL, 0);
@@ -91,6 +91,9 @@ static int do_i2c_write(int argc, char *argv[])
case 'v':
verbose = 1;
break;
+ case 'w':
+ wide = 1;
+ break;
}
}
@@ -112,13 +115,13 @@ static int do_i2c_write(int argc, char *argv[])
for (i = 0; i < count; i++)
*(buf + i) = (char) simple_strtol(argv[optind+i], NULL, 16);
- ret = i2c_write_reg(&client, reg, buf, count);
+ ret = i2c_write_reg(&client, reg | (wide ? I2C_ADDR_16_BIT : 0), buf, count);
if (ret != count)
goto out;
ret = 0;
if (verbose) {
- printf("wrote %i bytes starting at reg 0x%02x to i2cdev 0x%02x on bus %i\n",
+ printf("wrote %i bytes starting at reg 0x%04x to i2cdev 0x%02x on bus %i\n",
count, reg, addr, adapter->nr);
for (i = 0; i < count; i++)
printf("0x%02x ", *(buf + i));
@@ -135,7 +138,8 @@ static const __maybe_unused char cmd_i2c_write_help[] =
"write to i2c device.\n"
" -a 0x<addr> i2c device address\n"
" -b <bus_num> i2c bus number (default = 0)\n"
-" -r 0x<reg> start register\n";
+" -r 0x<reg> start register\n"
+" -w use 16bit-wide address access\n";
BAREBOX_CMD_START(i2c_write)
.cmd = do_i2c_write,
@@ -148,9 +152,9 @@ static int do_i2c_read(int argc, char *argv[])
struct i2c_adapter *adapter = NULL;
struct i2c_client client;
u8 *buf;
- int count = -1, addr = -1, reg = -1, verbose = 0, ret, opt, bus = 0;
+ int count = -1, addr = -1, reg = -1, verbose = 0, ret, opt, bus = 0, wide = 0;
- while ((opt = getopt(argc, argv, "a:b:c:r:v")) > 0) {
+ while ((opt = getopt(argc, argv, "a:b:c:r:v:w")) > 0) {
switch (opt) {
case 'a':
addr = simple_strtol(optarg, NULL, 0);
@@ -167,6 +171,9 @@ static int do_i2c_read(int argc, char *argv[])
case 'v':
verbose = 1;
break;
+ case 'w':
+ wide = 1;
+ break;
}
}
@@ -183,11 +190,11 @@ static int do_i2c_read(int argc, char *argv[])
client.addr = addr;
buf = xmalloc(count);
- ret = i2c_read_reg(&client, reg, buf, count);
+ ret = i2c_read_reg(&client, reg | (wide ? I2C_ADDR_16_BIT : 0), buf, count);
if (ret == count) {
int i;
if (verbose)
- printf("read %i bytes starting at reg 0x%02x from i2cdev 0x%02x on bus %i\n",
+ printf("read %i bytes starting at reg 0x%04x from i2cdev 0x%02x on bus %i\n",
count, reg, addr, adapter->nr);
for (i = 0; i < count; i++)
printf("0x%02x ", *(buf + i));
@@ -205,6 +212,7 @@ static const __maybe_unused char cmd_i2c_read_help[] =
" -a 0x<addr> i2c device address\n"
" -b <bus_num> i2c bus number (default = 0)\n"
" -r 0x<reg> start register\n"
+" -w use 16bit-wide address access\n"
" -c <count> byte count\n";
BAREBOX_CMD_START(i2c_read)
diff --git a/commands/linux16.c b/commands/linux16.c
index 20413b6f0d..eccafa8b57 100644
--- a/commands/linux16.c
+++ b/commands/linux16.c
@@ -162,7 +162,7 @@ static int do_linux16(int argc, char *argv[])
unsigned real_mode_size;
int vid_mode = NORMAL_VGA;
size_t image_size;
- const char *cmdline = getenv("bootargs");
+ const char *cmdline = linux_bootargs_get();
const char *kernel_file;
while((opt = getopt(argc, argv, "v:")) > 0) {
diff --git a/commands/ls.c b/commands/ls.c
index c98d2dad57..ad609f3133 100644
--- a/commands/ls.c
+++ b/commands/ls.c
@@ -49,7 +49,7 @@ int ls(const char *path, ulong flags)
string_list_init(&sl);
if (stat(path, &s))
- return errno;
+ return -errno;
if (flags & LS_SHOWARG && s.st_mode & S_IFDIR)
printf("%s:\n", path);
@@ -61,7 +61,7 @@ int ls(const char *path, ulong flags)
dir = opendir(path);
if (!dir)
- return errno;
+ return -errno;
while ((d = readdir(dir))) {
sprintf(tmp, "%s/%s", path, d->d_name);
@@ -85,7 +85,7 @@ int ls(const char *path, ulong flags)
dir = opendir(path);
if (!dir) {
- errno = -ENOENT;
+ errno = ENOENT;
return -ENOENT;
}
diff --git a/commands/mem.c b/commands/mem.c
index d8e90e056f..f32e5d8299 100644
--- a/commands/mem.c
+++ b/commands/mem.c
@@ -122,7 +122,7 @@ static int open_and_lseek(const char *filename, int mode, off_t pos)
return fd;
ret = lseek(fd, pos, SEEK_SET);
- if (ret == -1) {
+ if (ret < 0) {
perror("lseek");
close(fd);
return ret;
@@ -170,7 +170,6 @@ static int do_mem_md(int argc, char *argv[])
char *filename = DEVMEM;
int mode = O_RWSIZE_4;
- errno = 0;
if (mem_parse_options(argc, argv, "bwls:", &mode, &filename, NULL) < 0)
return 1;
@@ -207,7 +206,7 @@ static int do_mem_md(int argc, char *argv[])
out:
close(fd);
- return errno;
+ return ret ? 1 : 0;
}
static const __maybe_unused char cmd_md_help[] =
@@ -243,8 +242,6 @@ static int do_mem_mw(int argc, char *argv[])
int mode = O_RWSIZE_4;
ulong adr;
- errno = 0;
-
if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &filename) < 0)
return 1;
@@ -279,12 +276,13 @@ static int do_mem_mw(int argc, char *argv[])
perror("write");
break;
}
+ ret = 0;
optind++;
}
close(fd);
- return errno;
+ return ret ? 1 : 0;
}
static const __maybe_unused char cmd_mw_help[] =
diff --git a/commands/partition.c b/commands/partition.c
index 6cce0423d3..4c3f30c257 100644
--- a/commands/partition.c
+++ b/commands/partition.c
@@ -97,7 +97,7 @@ static int mtd_part_do_parse_one(char *devname, const char *partstr,
partstr = end;
if (*partstr == 'r' && *(partstr + 1) == 'o') {
- flags |= PARTITION_READONLY;
+ flags |= DEVFS_PARTITION_READONLY;
end = (char *)(partstr + 2);
}
diff --git a/commands/saveenv.c b/commands/saveenv.c
index a4b279676d..549fcd4279 100644
--- a/commands/saveenv.c
+++ b/commands/saveenv.c
@@ -54,7 +54,7 @@ static int do_saveenv(int argc, char *argv[])
ret = protect(fd, ~0, 0, 0);
/* ENOSYS is no error here, many devices do not need it */
- if (ret && errno != -ENOSYS) {
+ if (ret && errno != ENOSYS) {
printf("could not unprotect %s: %s\n", filename, errno_str());
close(fd);
return 1;
@@ -63,7 +63,7 @@ static int do_saveenv(int argc, char *argv[])
ret = erase(fd, ~0, 0);
/* ENOSYS is no error here, many devices do not need it */
- if (ret && errno != -ENOSYS) {
+ if (ret && errno != ENOSYS) {
printf("could not erase %s: %s\n", filename, errno_str());
close(fd);
return 1;
@@ -82,7 +82,7 @@ static int do_saveenv(int argc, char *argv[])
ret = protect(fd, ~0, 0, 1);
/* ENOSYS is no error here, many devices do not need it */
- if (ret && errno != -ENOSYS) {
+ if (ret && errno != ENOSYS) {
printf("could not protect %s: %s\n", filename, errno_str());
close(fd);
return 1;
diff --git a/commands/timeout.c b/commands/timeout.c
index 01ece52ac3..d4e90cd897 100644
--- a/commands/timeout.c
+++ b/commands/timeout.c
@@ -25,6 +25,7 @@
#include <errno.h>
#include <getopt.h>
#include <clock.h>
+#include <environment.h>
#define TIMEOUT_RETURN (1 << 0)
#define TIMEOUT_CTRLC (1 << 1)
@@ -35,9 +36,11 @@ static int do_timeout(int argc, char *argv[])
{
int timeout = 3, ret = 1;
int flags = 0, opt, countdown;
+ int key = 0;
uint64_t start, second;
+ const char *varname = NULL;
- while((opt = getopt(argc, argv, "t:crsa")) > 0) {
+ while((opt = getopt(argc, argv, "t:crsav:")) > 0) {
switch(opt) {
case 'r':
flags |= TIMEOUT_RETURN;
@@ -51,6 +54,9 @@ static int do_timeout(int argc, char *argv[])
case 's':
flags |= TIMEOUT_SILENT;
break;
+ case 'v':
+ varname = optarg;
+ break;
default:
return 1;
}
@@ -71,13 +77,14 @@ static int do_timeout(int argc, char *argv[])
do {
if (tstc()) {
- int key = getc();
+ key = getc();
if (flags & TIMEOUT_CTRLC && key == 3)
goto out;
if (flags & TIMEOUT_ANYKEY)
goto out;
if (flags & TIMEOUT_RETURN && key == '\n')
goto out;
+ key = 0;
}
if (!(flags & TIMEOUT_SILENT) && is_timeout(second, SECOND)) {
printf("\b\b%2d", countdown--);
@@ -87,6 +94,11 @@ static int do_timeout(int argc, char *argv[])
ret = 0;
out:
+ if (varname && key) {
+ char str[2] = { };
+ str[0] = key;
+ setenv(varname, str);
+ }
if (!(flags & TIMEOUT_SILENT))
printf("\n");
diff --git a/common/Kconfig b/common/Kconfig
index 73d620a576..9f0e0f86f9 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -47,6 +47,9 @@ config BINFMT
bool
select FILETYPE
+config GLOBALVAR
+ bool
+
menu "General Settings "
config LOCALVERSION
@@ -307,7 +310,13 @@ config GLOB
depends on SHELL_HUSH
help
If you want to use wildcards like * or ? say y here.
-
+
+config GLOB_SORT
+ select QSORT
+ bool
+ prompt "glob sort support"
+ depends on GLOB
+
config PROMPT_HUSH_PS2
string
depends on SHELL_HUSH
@@ -493,6 +502,7 @@ config DEFAULT_ENVIRONMENT_GENERIC
select HUSH_GETOPT
select CMD_CRC
select CMD_CRC_CMP
+ select CMD_AUTOMOUNT if HAVE_DEFAULT_ENVIRONMENT_NEW
prompt "Default environment generic"
help
With this option barebox will use the generic default
@@ -502,6 +512,9 @@ config DEFAULT_ENVIRONMENT_GENERIC
at least contain a /env/config file.
This will be able to overwrite the files from defaultenv.
+config HAVE_DEFAULT_ENVIRONMENT_NEW
+ bool
+
config DEFAULT_ENVIRONMENT_PATH
string
depends on DEFAULT_ENVIRONMENT
diff --git a/common/Makefile b/common/Makefile
index a58aef94c8..b49e6e0141 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -29,11 +29,13 @@ obj-$(CONFIG_CMD_BOOTM) += uimage.o
obj-y += startup.o
obj-y += misc.o
obj-y += memsize.o
+obj-$(CONFIG_GLOBALVAR) += globalvar.o
obj-$(CONFIG_FILETYPE) += filetype.o
obj-y += resource.o
obj-$(CONFIG_MENU) += menu.o
obj-$(CONFIG_PASSWORD) += password.o
obj-$(CONFIG_MODULES) += module.o
+obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o
extra-$(CONFIG_MODULES) += module.lds
ifdef CONFIG_DEFAULT_ENVIRONMENT
diff --git a/common/bootargs.c b/common/bootargs.c
new file mode 100644
index 0000000000..60e936da37
--- /dev/null
+++ b/common/bootargs.c
@@ -0,0 +1,83 @@
+/*
+ * bootargs.c - concatenate Linux bootargs
+ *
+ * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <common.h>
+#include <boot.h>
+#include <malloc.h>
+#include <magicvar.h>
+#include <globalvar.h>
+#include <environment.h>
+
+static char *linux_bootargs;
+static int linux_bootargs_overwritten;
+
+/*
+ * This returns the Linux bootargs
+ *
+ * There are two ways to handle bootargs. The old legacy way is to use the
+ * 'bootargs' environment variable. The new and more flexible way is to use
+ * global variables beginning with "global.linux.bootargs." and
+ * "global.linux.mtdparts.". These variables will be concatenated together to
+ * the resulting bootargs. If there are no "global.linux.bootargs." variables
+ * we fall back to "bootargs"
+ */
+const char *linux_bootargs_get(void)
+{
+ char *bootargs, *mtdparts;
+
+ if (linux_bootargs_overwritten)
+ return linux_bootargs;
+
+ free(linux_bootargs);
+
+ bootargs = globalvar_get_match("linux.bootargs.", " ");
+ if (!strlen(bootargs))
+ return getenv("bootargs");
+
+ mtdparts = globalvar_get_match("linux.mtdparts.", ";");
+
+ if (strlen(mtdparts)) {
+ linux_bootargs = asprintf("%s mtdparts=%s", bootargs, mtdparts);
+ free(bootargs);
+ free(mtdparts);
+ } else {
+ free(mtdparts);
+ linux_bootargs = bootargs;
+ }
+
+ return linux_bootargs;
+}
+
+int linux_bootargs_overwrite(const char *bootargs)
+{
+ if (bootargs) {
+ free(linux_bootargs);
+ linux_bootargs = xstrdup(bootargs);
+ linux_bootargs_overwritten = 1;
+ } else {
+ linux_bootargs_overwritten = 0;
+ }
+
+ return 0;
+}
+
+BAREBOX_MAGICVAR_NAMED(global_linux_bootargs_, global.linux.bootargs.*, "Linux bootargs variables");
+BAREBOX_MAGICVAR_NAMED(global_linux_mtdparts_, global.linux.mtdparts.*, "Linux mtdparts variables");
diff --git a/common/env.c b/common/env.c
index e57a520a35..a01a27e24f 100644
--- a/common/env.c
+++ b/common/env.c
@@ -219,7 +219,7 @@ int setenv(const char *_name, const char *value)
else
ret = -ENODEV;
- errno = ret;
+ errno = -ret;
if (ret < 0)
perror("set parameter");
diff --git a/common/environment.c b/common/environment.c
index 0fdbd03e00..52ce0de1da 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -187,7 +187,7 @@ int envfs_load(char *filename, char *dir)
ret = read(envfd, &super, sizeof(struct envfs_super));
if ( ret < sizeof(struct envfs_super)) {
perror("read");
- ret = errno;
+ ret = -errno;
goto out;
}
@@ -210,7 +210,7 @@ int envfs_load(char *filename, char *dir)
ret = read(envfd, buf, size);
if (ret < size) {
perror("read");
- ret = errno;
+ ret = -errno;
goto out;
}
@@ -256,7 +256,7 @@ int envfs_load(char *filename, char *dir)
inode_size);
if (ret < inode_size) {
perror("write");
- ret = errno;
+ ret = -errno;
close(fd);
goto out;
}
diff --git a/common/filetype.c b/common/filetype.c
index 15a37325df..39c2098862 100644
--- a/common/filetype.c
+++ b/common/filetype.c
@@ -78,6 +78,8 @@ enum filetype file_detect_type(void *_buf)
return filetype_oftree;
if (strncmp(buf8, "ANDROID!", 8) == 0)
return filetype_aimage;
+ if (strncmp(buf8 + 0x10, "barebox", 7) == 0)
+ return filetype_mips_barebox;
return filetype_unknown;
}
diff --git a/common/globalvar.c b/common/globalvar.c
new file mode 100644
index 0000000000..71296ff5a3
--- /dev/null
+++ b/common/globalvar.c
@@ -0,0 +1,65 @@
+#include <common.h>
+#include <malloc.h>
+#include <globalvar.h>
+#include <init.h>
+
+static struct device_d global_device = {
+ .name = "global",
+ .id = DEVICE_ID_SINGLE,
+};
+
+int globalvar_add(const char *name,
+ int (*set)(struct device_d *dev, struct param_d *p, const char *val),
+ const char *(*get)(struct device_d *, struct param_d *p),
+ unsigned long flags)
+{
+ return dev_add_param(&global_device, name, set, get, flags);
+}
+
+/*
+ * globalvar_get_match
+ *
+ * get a concatenated string of all globalvars beginning with 'match'.
+ * This adds whitespaces between the different globalvars
+ */
+char *globalvar_get_match(const char *match, const char *seperator)
+{
+ char *val = NULL;
+ struct param_d *param;
+
+ list_for_each_entry(param, &global_device.parameters, list) {
+ if (!strncmp(match, param->name, strlen(match))) {
+ const char *p = dev_get_param(&global_device, param->name);
+ if (val) {
+ char *new = asprintf("%s%s%s", val, seperator, p);
+ free(val);
+ val = new;
+ } else {
+ val = xstrdup(p);
+ }
+ }
+ }
+
+ if (!val)
+ val = xstrdup("");
+
+ return val;
+}
+
+/*
+ * globalvar_add_simple
+ *
+ * add a new globalvar named 'name'
+ */
+int globalvar_add_simple(const char *name)
+{
+ return globalvar_add(name, NULL, NULL, 0);
+}
+
+static int globalvar_init(void)
+{
+ register_device(&global_device);
+
+ return 0;
+}
+postconsole_initcall(globalvar_init);
diff --git a/common/misc.c b/common/misc.c
index b31a45c1a4..01e1b19e0d 100644
--- a/common/misc.c
+++ b/common/misc.c
@@ -112,7 +112,7 @@ EXPORT_SYMBOL(strerror);
const char *errno_str(void)
{
- return strerror(-errno);
+ return strerror(errno);
}
EXPORT_SYMBOL(errno_str);
diff --git a/common/oftree.c b/common/oftree.c
index a657d31664..49758a9ddf 100644
--- a/common/oftree.c
+++ b/common/oftree.c
@@ -11,6 +11,7 @@
#include <errno.h>
#include <getopt.h>
#include <init.h>
+#include <boot.h>
#define MAX_LEVEL 32 /* how deeply nested we will go */
@@ -257,7 +258,7 @@ static int of_fixup_bootargs(struct fdt_header *fdt)
if (nodeoffset < 0)
return nodeoffset;
- str = getenv("bootargs");
+ str = linux_bootargs_get();
if (str) {
err = fdt_setprop(fdt, nodeoffset,
"bootargs", str, strlen(str)+1);
diff --git a/defaultenv/config b/defaultenv/config
index 3e4c2eef6c..7b61d29730 100644
--- a/defaultenv/config
+++ b/defaultenv/config
@@ -1,7 +1,9 @@
#!/bin/sh
hostname=FIXME
-#user=
+if [ -z "$user" ]; then
+# user=
+fi
# Enter MAC address here if not retrieved automatically
#eth0.ethaddr=de:ad:be:ef:00:00
diff --git a/drivers/mtd/nand/nand_imx.c b/drivers/mtd/nand/nand_imx.c
index 85cfbeda95..e75ffbc819 100644
--- a/drivers/mtd/nand/nand_imx.c
+++ b/drivers/mtd/nand/nand_imx.c
@@ -1135,7 +1135,7 @@ static int __init imxnd_probe(struct device_d *dev)
this->ecc.layout = oob_smallpage;
- /* NAND bus width determines access funtions used by upper layer */
+ /* NAND bus width determines access functions used by upper layer */
if (pdata->width == 2) {
this->options |= NAND_BUSWIDTH_16;
this->ecc.layout = &nandv1_hw_eccoob_smallpage;
diff --git a/drivers/nor/cfi_flash.h b/drivers/nor/cfi_flash.h
index df482b6c56..fec08940ab 100644
--- a/drivers/nor/cfi_flash.h
+++ b/drivers/nor/cfi_flash.h
@@ -30,7 +30,17 @@
#include <linux/mtd/mtd.h>
typedef unsigned long flash_sect_t;
+
+#if defined(CONFIG_DRIVER_CFI_BANK_WIDTH_8)
typedef u64 cfiword_t;
+#elif defined(CONFIG_DRIVER_CFI_BANK_WIDTH_4)
+typedef u32 cfiword_t;
+#elif defined(CONFIG_DRIVER_CFI_BANK_WIDTH_2)
+typedef u16 cfiword_t;
+#else
+typedef u8 cfiword_t;
+#endif
+
struct cfi_cmd_set;
/*-----------------------------------------------------------------------
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 186b59638f..a9383da9d7 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -80,7 +80,7 @@ config DRIVER_SERIAL_PL010
config DRIVER_SERIAL_S3C
bool "Samsung S3C serial driver"
- depends on ARCH_S3C24xx
+ depends on ARCH_SAMSUNG
default y
help
Say Y here if you want to use the CONS on a Samsung S3C CPU
diff --git a/drivers/serial/serial_s3c.c b/drivers/serial/serial_s3c.c
index 2bdc1df696..7a9b355704 100644
--- a/drivers/serial/serial_s3c.c
+++ b/drivers/serial/serial_s3c.c
@@ -40,6 +40,17 @@
#define UTXH 0x20 /* transmitt */
#define URXH 0x24 /* receive */
#define UBRDIV 0x28 /* baudrate generator */
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+# define UBRDIVSLOT 0x2c /* baudrate slot generator */
+#endif
+#ifdef S3C_UART_HAS_UINTM
+# define UINTM 0x38 /* interrupt mask register */
+#endif
+
+#ifndef S3C_UART_CLKSEL
+/* Use pclk */
+# define S3C_UART_CLKSEL 0
+#endif
struct s3c_uart {
void __iomem *regs;
@@ -51,26 +62,32 @@ struct s3c_uart {
static unsigned s3c_get_arch_uart_input_clock(void __iomem *base)
{
unsigned reg = readw(base + UCON);
-
- switch (reg & 0xc00) {
- case 0x000:
- case 0x800:
- return s3c_get_pclk();
- case 0x400:
- break; /* TODO UEXTCLK */
- case 0xc00:
- break; /* TODO FCLK/n */
- }
-
- return 0; /* not nice, but we can't emit an error message! */
+ reg = (reg >> 10) & 0x3;
+ return s3c_get_uart_clk(reg);
}
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+/*
+ * This table takes the fractional value of the baud divisor and gives
+ * the recommended setting for the UDIVSLOT register. Refer the datasheet
+ * for further details
+ */
+static const uint16_t udivslot_table[] __maybe_unused = {
+ 0x0000, 0x0080, 0x0808, 0x0888, 0x2222, 0x4924, 0x4A52, 0x54AA,
+ 0x5555, 0xD555, 0xD5D5, 0xDDD5, 0xDDDD, 0xDFDD, 0xDFDF, 0xFFDF,
+};
+#endif
+
static int s3c_serial_setbaudrate(struct console_device *cdev, int baudrate)
{
struct s3c_uart *priv = to_s3c_uart(cdev);
void __iomem *base = priv->regs;
unsigned val;
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+ val = s3c_get_arch_uart_input_clock(base) / baudrate;
+ writew(udivslot_table[val & 15], base + UBRDIVSLOT);
+#endif
val = s3c_get_arch_uart_input_clock(base) / (16 * baudrate) - 1;
writew(val, base + UBRDIV);
@@ -88,11 +105,15 @@ static int s3c_serial_init_port(struct console_device *cdev)
/* Normal,No parity,1 stop,8 bit */
writeb(0x03, base + ULCON);
- /*
- * tx=level,rx=edge,disable timeout int.,enable rx error int.,
- * normal,interrupt or polling
- */
- writew(0x0245, base + UCON);
+
+ /* tx=level,rx=edge,disable timeout int.,enable rx error int.,
+ * normal, interrupt or polling, no pre-divider */
+ writew(0x0245 | ((S3C_UART_CLKSEL) << 10), base + UCON);
+
+#ifdef S3C_UART_HAS_UINTM
+ /* 'interrupt or polling mode' for both directions */
+ writeb(0xf, base + UINTM);
+#endif
#ifdef CONFIG_DRIVER_SERIAL_S3C_AUTOSYNC
writeb(0x10, base + UMCON); /* enable auto flow control */
diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c
index 3b33b669fb..42358f2e6a 100644
--- a/drivers/spi/imx_spi.c
+++ b/drivers/spi/imx_spi.c
@@ -145,6 +145,10 @@ struct spi_imx_devtype_data {
static int imx_spi_setup(struct spi_device *spi)
{
+ struct imx_spi *imx = container_of(spi->master, struct imx_spi, master);
+
+ imx->chipselect(spi, 0);
+
debug("%s mode 0x%08x bits_per_word: %d speed: %d\n",
__FUNCTION__, spi->mode, spi->bits_per_word,
spi->max_speed_hz);
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 7a8aed42e2..a7fe10cba0 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -78,6 +78,8 @@ struct spi_device *spi_new_device(struct spi_master *master,
proxy->bits_per_word = chip->bits_per_word ? chip->bits_per_word : 8;
proxy->dev.platform_data = chip->platform_data;
strcpy(proxy->dev.name, chip->name);
+ /* allocate a free id for this chip */
+ proxy->dev.id = DEVICE_ID_DYNAMIC;
proxy->dev.type_data = proxy;
dev_add_child(master->dev, &proxy->dev);
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index f103101464..05e4094386 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -859,6 +859,8 @@ static void td_fill(struct ohci *ohci, unsigned int info,
td->hwNextTD = virt_to_phys((void *)m32_swap((unsigned long)td_pt));
+ dma_flush_range((unsigned long)data, (unsigned long)(data + len));
+
/* append to queue */
td->ed->hwTailP = td->hwNextTD;
}
@@ -1555,6 +1557,8 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
dev->status = stat;
dev->act_len = urb->actual_length;
+ dma_inv_range((unsigned long)buffer, (unsigned long)(buffer + transfer_len));
+
pkt_print(urb, dev, pipe, buffer, transfer_len,
setup, "RET(ctlr)", usb_pipein(pipe));
diff --git a/fs/Kconfig b/fs/Kconfig
index e5f307fd26..769a99eab1 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -23,6 +23,10 @@ config FS_TFTP
bool
prompt "tftp support"
+config FS_NFS
+ bool
+ prompt "nfs support"
+
source fs/fat/Kconfig
config PARTITION_NEED_MTD
diff --git a/fs/Makefile b/fs/Makefile
index d2040939b5..1b52beefbf 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -5,3 +5,4 @@ obj-$(CONFIG_FS_DEVFS) += devfs.o
obj-$(CONFIG_FS_FAT) += fat/
obj-y += fs.o
obj-$(CONFIG_FS_TFTP) += tftp.o
+obj-$(CONFIG_FS_NFS) += nfs.o
diff --git a/fs/fs.c b/fs/fs.c
index 04dace49d2..e5ae6d532b 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -211,8 +211,8 @@ static void put_file(FILE *f)
static int check_fd(int fd)
{
if (fd < 0 || fd >= MAX_FILES || !files[fd].in_use) {
- errno = -EBADF;
- return errno;
+ errno = EBADF;
+ return -errno;
}
return 0;
@@ -361,7 +361,7 @@ static int dir_is_empty(const char *pathname)
dir = opendir(pathname);
if (!dir) {
- errno = -ENOENT;
+ errno = ENOENT;
return -ENOENT;
}
@@ -389,47 +389,42 @@ static int path_check_prereq(const char *path, unsigned int flags)
{
struct stat s;
unsigned int m;
-
- errno = 0;
+ int ret = 0;
if (stat(path, &s)) {
- if (flags & S_UB_DOES_NOT_EXIST) {
- errno = 0;
+ if (flags & S_UB_DOES_NOT_EXIST)
goto out;
- }
- errno = -ENOENT;
+ ret = -ENOENT;
goto out;
}
if (flags & S_UB_DOES_NOT_EXIST) {
- errno = -EEXIST;
+ ret = -EEXIST;
goto out;
}
- if (flags == S_UB_EXISTS) {
- errno = 0;
+ if (flags == S_UB_EXISTS)
goto out;
- }
m = s.st_mode;
if (S_ISDIR(m)) {
if (flags & S_IFREG) {
- errno = -EISDIR;
+ ret = -EISDIR;
goto out;
}
if ((flags & S_UB_IS_EMPTY) && !dir_is_empty(path)) {
- errno = -ENOTEMPTY;
+ ret = -ENOTEMPTY;
goto out;
}
}
if ((flags & S_IFDIR) && S_ISREG(m)) {
- errno = -ENOTDIR;
+ ret = -ENOTDIR;
goto out;
}
out:
- return errno;
+ return ret;
}
const char *getcwd(void)
@@ -441,9 +436,11 @@ EXPORT_SYMBOL(getcwd);
int chdir(const char *pathname)
{
char *p = normalise_path(pathname);
- errno = 0;
+ int ret;
+
- if (path_check_prereq(p, S_IFDIR))
+ ret = path_check_prereq(p, S_IFDIR);
+ if (ret)
goto out;
strcpy(cwd, p);
@@ -451,7 +448,10 @@ int chdir(const char *pathname)
out:
free(p);
- return errno;
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(chdir);
@@ -461,24 +461,34 @@ int unlink(const char *pathname)
struct fs_driver_d *fsdrv;
char *p = normalise_path(pathname);
char *freep = p;
+ int ret;
- if (path_check_prereq(pathname, S_IFREG))
+ ret = path_check_prereq(pathname, S_IFREG);
+ if (ret) {
+ ret = -EINVAL;
goto out;
+ }
fsdev = get_fs_device_and_root_path(&p);
- if (!fsdev)
+ if (!fsdev) {
+ ret = -ENOENT;
goto out;
+ }
fsdrv = fsdev->driver;
if (!fsdrv->unlink) {
- errno = -ENOSYS;
+ ret = -ENOSYS;
goto out;
}
- errno = fsdrv->unlink(&fsdev->dev, p);
+ ret = fsdrv->unlink(&fsdev->dev, p);
+ if (ret)
+ errno = -ret;
out:
free(freep);
- return errno;
+ if (ret)
+ errno = -ret;
+ return ret;
}
EXPORT_SYMBOL(unlink);
@@ -491,28 +501,31 @@ int open(const char *pathname, int flags, ...)
struct stat s;
char *path = normalise_path(pathname);
char *freep = path;
+ int ret;
exist_err = stat(path, &s);
if (!exist_err && S_ISDIR(s.st_mode)) {
- errno = -EISDIR;
+ ret = -EISDIR;
goto out1;
}
if (exist_err && !(flags & O_CREAT)) {
- errno = exist_err;
+ ret = exist_err;
goto out1;
}
f = get_file();
if (!f) {
- errno = -EMFILE;
+ ret = -EMFILE;
goto out1;
}
fsdev = get_fs_device_and_root_path(&path);
- if (!fsdev)
+ if (!fsdev) {
+ ret = -ENOENT;
goto out;
+ }
fsdrv = fsdev->driver;
@@ -520,28 +533,28 @@ int open(const char *pathname, int flags, ...)
f->flags = flags;
if ((flags & O_ACCMODE) && !fsdrv->write) {
- errno = -EROFS;
+ ret = -EROFS;
goto out;
}
if (exist_err) {
if (NULL != fsdrv->create)
- errno = fsdrv->create(&fsdev->dev, path,
+ ret = fsdrv->create(&fsdev->dev, path,
S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO);
else
- errno = -EROFS;
- if (errno)
+ ret = -EROFS;
+ if (ret)
goto out;
}
- errno = fsdrv->open(&fsdev->dev, f, path);
- if (errno)
+ ret = fsdrv->open(&fsdev->dev, f, path);
+ if (ret)
goto out;
if (flags & O_TRUNC) {
- errno = fsdrv->truncate(&fsdev->dev, f, 0);
+ ret = fsdrv->truncate(&fsdev->dev, f, 0);
f->size = 0;
- if (errno)
+ if (ret)
goto out;
}
@@ -555,7 +568,9 @@ out:
put_file(f);
out1:
free(freep);
- return errno;
+ if (ret)
+ errno = -ret;
+ return ret;
}
EXPORT_SYMBOL(open);
@@ -570,19 +585,22 @@ int ioctl(int fd, int request, void *buf)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
fsdrv = dev_to_fs_driver(dev);
if (fsdrv->ioctl)
- errno = fsdrv->ioctl(dev, f, request, buf);
+ ret = fsdrv->ioctl(dev, f, request, buf);
else
- errno = -ENOSYS;
- return errno;
+ ret = -ENOSYS;
+ if (ret)
+ errno = -ret;
+ return ret;
}
int read(int fd, void *buf, size_t count)
@@ -590,9 +608,10 @@ int read(int fd, void *buf, size_t count)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
@@ -604,11 +623,13 @@ int read(int fd, void *buf, size_t count)
if (!count)
return 0;
- errno = fsdrv->read(dev, f, buf, count);
+ ret = fsdrv->read(dev, f, buf, count);
- if (errno > 0)
- f->pos += errno;
- return errno;
+ if (ret > 0)
+ f->pos += ret;
+ if (ret < 0)
+ errno = -ret;
+ return ret;
}
EXPORT_SYMBOL(read);
@@ -617,30 +638,33 @@ ssize_t write(int fd, const void *buf, size_t count)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
fsdrv = dev_to_fs_driver(dev);
if (f->pos + count > f->size) {
- errno = fsdrv->truncate(dev, f, f->pos + count);
- if (errno) {
- if (errno != -ENOSPC)
- return errno;
+ ret = fsdrv->truncate(dev, f, f->pos + count);
+ if (ret) {
+ if (ret != -ENOSPC)
+ goto out;
count = f->size - f->pos;
if (!count)
- return errno;
+ goto out;
} else {
f->size = f->pos + count;
}
}
- errno = fsdrv->write(dev, f, buf, count);
-
- if (errno > 0)
- f->pos += errno;
- return errno;
+ ret = fsdrv->write(dev, f, buf, count);
+ if (ret > 0)
+ f->pos += ret;
+out:
+ if (ret < 0)
+ errno = -ret;
+ return ret;
}
EXPORT_SYMBOL(write);
@@ -649,19 +673,23 @@ int flush(int fd)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
fsdrv = dev_to_fs_driver(dev);
if (fsdrv->flush)
- errno = fsdrv->flush(dev, f);
+ ret = fsdrv->flush(dev, f);
else
- errno = 0;
+ ret = 0;
+
+ if (ret)
+ errno = -ret;
- return errno;
+ return ret;
}
off_t lseek(int fildes, off_t offset, int whence)
@@ -670,20 +698,21 @@ off_t lseek(int fildes, off_t offset, int whence)
struct fs_driver_d *fsdrv;
FILE *f = &files[fildes];
off_t pos;
+ int ret;
if (check_fd(fildes))
return -1;
- errno = 0;
-
dev = f->dev;
fsdrv = dev_to_fs_driver(dev);
if (!fsdrv->lseek) {
- errno = -ENOSYS;
- return -1;
+ ret = -ENOSYS;
+ goto out;
}
- switch(whence) {
+ ret = -EINVAL;
+
+ switch (whence) {
case SEEK_SET:
if (offset > f->size)
goto out;
@@ -703,11 +732,13 @@ off_t lseek(int fildes, off_t offset, int whence)
goto out;
}
- return fsdrv->lseek(dev, f, pos);
+ ret = fsdrv->lseek(dev, f, pos);
out:
- errno = -EINVAL;
- return -1;
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(lseek);
@@ -716,9 +747,10 @@ int erase(int fd, size_t count, unsigned long offset)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
@@ -728,11 +760,14 @@ int erase(int fd, size_t count, unsigned long offset)
count = f->size - f->pos;
if (fsdrv->erase)
- errno = fsdrv->erase(dev, f, count, offset);
+ ret = fsdrv->erase(dev, f, count, offset);
else
- errno = -ENOSYS;
+ ret = -ENOSYS;
+
+ if (ret)
+ errno = -ret;
- return errno;
+ return ret;
}
EXPORT_SYMBOL(erase);
@@ -741,9 +776,10 @@ int protect(int fd, size_t count, unsigned long offset, int prot)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
@@ -753,11 +789,14 @@ int protect(int fd, size_t count, unsigned long offset, int prot)
count = f->size - f->pos;
if (fsdrv->protect)
- errno = fsdrv->protect(dev, f, count, offset, prot);
+ ret = fsdrv->protect(dev, f, count, offset, prot);
else
- errno = -ENOSYS;
+ ret = -ENOSYS;
+
+ if (ret)
+ errno = -ret;
- return errno;
+ return ret;
}
EXPORT_SYMBOL(protect);
@@ -781,21 +820,25 @@ void *memmap(int fd, int flags)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
- void *ret = (void *)-1;
+ void *retp = (void *)-1;
+ int ret;
if (check_fd(fd))
- return ret;
+ return retp;
dev = f->dev;
fsdrv = dev_to_fs_driver(dev);
if (fsdrv->memmap)
- errno = fsdrv->memmap(dev, f, &ret, flags);
+ ret = fsdrv->memmap(dev, f, &retp, flags);
else
- errno = -EINVAL;
+ ret = -EINVAL;
- return ret;
+ if (ret)
+ errno = -ret;
+
+ return retp;
}
EXPORT_SYMBOL(memmap);
@@ -804,17 +847,22 @@ int close(int fd)
struct device_d *dev;
struct fs_driver_d *fsdrv;
FILE *f = &files[fd];
+ int ret;
if (check_fd(fd))
- return errno;
+ return -errno;
dev = f->dev;
fsdrv = dev_to_fs_driver(dev);
- errno = fsdrv->close(dev, f);
+ ret = fsdrv->close(dev, f);
put_file(f);
- return errno;
+
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(close);
@@ -893,23 +941,22 @@ int mount(const char *device, const char *fsname, const char *_path)
int ret;
char *path = normalise_path(_path);
- errno = 0;
-
debug("mount: %s on %s type %s\n", device, path, fsname);
if (fs_dev_root) {
fsdev = get_fsdevice_by_path(path);
if (fsdev != fs_dev_root) {
printf("sorry, no nested mounts\n");
- errno = -EBUSY;
+ ret = -EBUSY;
goto err_free_path;
}
- if (path_check_prereq(path, S_IFDIR))
+ ret = path_check_prereq(path, S_IFDIR);
+ if (ret)
goto err_free_path;
} else {
/* no mtab, so we only allow to mount on '/' */
if (*path != '/' || *(path + 1)) {
- errno = -ENOTDIR;
+ ret = -ENOTDIR;
goto err_free_path;
}
}
@@ -924,22 +971,19 @@ int mount(const char *device, const char *fsname, const char *_path)
if (!strncmp(device, "/dev/", 5))
fsdev->cdev = cdev_by_name(device + 5);
- if ((ret = register_device(&fsdev->dev))) {
- errno = ret;
+ ret = register_device(&fsdev->dev);
+ if (ret)
goto err_register;
- }
if (!fsdev->dev.driver) {
/*
* Driver didn't accept the device or no driver for this
* device. Bail out
*/
- errno = -EINVAL;
+ ret = -EINVAL;
goto err_no_driver;
}
- errno = 0;
-
return 0;
err_no_driver:
@@ -949,7 +993,9 @@ err_register:
err_free_path:
free(path);
- return errno;
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(mount);
@@ -968,13 +1014,13 @@ int umount(const char *pathname)
free(p);
if (f == fs_dev_root && !list_is_singular(&fs_device_list)) {
- errno = -EBUSY;
- return errno;
+ errno = EBUSY;
+ return -EBUSY;
}
if (!fsdev) {
- errno = -EFAULT;
- return errno;
+ errno = EFAULT;
+ return -EFAULT;
}
unregister_device(&fsdev->dev);
@@ -990,13 +1036,17 @@ DIR *opendir(const char *pathname)
struct fs_driver_d *fsdrv;
char *p = normalise_path(pathname);
char *freep = p;
+ int ret;
- if (path_check_prereq(pathname, S_IFDIR))
+ ret = path_check_prereq(pathname, S_IFDIR);
+ if (ret)
goto out;
fsdev = get_fs_device_and_root_path(&p);
- if (!fsdev)
+ if (!fsdev) {
+ ret = -ENOENT;
goto out;
+ }
fsdrv = fsdev->driver;
debug("opendir: fsdrv: %p\n",fsdrv);
@@ -1005,31 +1055,54 @@ DIR *opendir(const char *pathname)
if (dir) {
dir->dev = &fsdev->dev;
dir->fsdrv = fsdrv;
+ } else {
+ /*
+ * FIXME: The fs drivers should return ERR_PTR here so that
+ * we are able to forward the error
+ */
+ ret = -EINVAL;
}
out:
free(freep);
+
+ if (ret)
+ errno = -ret;
+
return dir;
}
EXPORT_SYMBOL(opendir);
struct dirent *readdir(DIR *dir)
{
+ struct dirent *ent;
+
if (!dir)
return NULL;
- return dir->fsdrv->readdir(dir->dev, dir);
+ ent = dir->fsdrv->readdir(dir->dev, dir);
+
+ if (!ent)
+ errno = EBADF;
+
+ return ent;
}
EXPORT_SYMBOL(readdir);
int closedir(DIR *dir)
{
+ int ret;
+
if (!dir) {
- errno = -EBADF;
- return -1;
+ errno = EBADF;
+ return -EBADF;
}
- return dir->fsdrv->closedir(dir->dev, dir);
+ ret = dir->fsdrv->closedir(dir->dev, dir);
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(closedir);
@@ -1040,6 +1113,7 @@ int stat(const char *filename, struct stat *s)
struct fs_device_d *fsdev;
char *f = normalise_path(filename);
char *freep = f;
+ int ret;
automount_mount(f, 1);
@@ -1047,7 +1121,7 @@ int stat(const char *filename, struct stat *s)
fsdev = get_fsdevice_by_path(f);
if (!fsdev) {
- errno = -ENOENT;
+ ret = -ENOENT;
goto out;
}
@@ -1062,10 +1136,14 @@ int stat(const char *filename, struct stat *s)
if (*f == 0)
f = "/";
- errno = fsdrv->stat(dev, f, s);
+ ret = fsdrv->stat(dev, f, s);
out:
free(freep);
- return errno;
+
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(stat);
@@ -1075,24 +1153,30 @@ int mkdir (const char *pathname, mode_t mode)
struct fs_device_d *fsdev;
char *p = normalise_path(pathname);
char *freep = p;
+ int ret;
- if (path_check_prereq(pathname, S_UB_DOES_NOT_EXIST))
+ ret = path_check_prereq(pathname, S_UB_DOES_NOT_EXIST);
+ if (ret)
goto out;
fsdev = get_fs_device_and_root_path(&p);
- if (!fsdev)
- goto out;
- fsdrv = fsdev->driver;
-
- if (fsdrv->mkdir) {
- errno = fsdrv->mkdir(&fsdev->dev, p);
+ if (!fsdev) {
+ ret = -ENOENT;
goto out;
}
+ fsdrv = fsdev->driver;
- errno = -EROFS;
+ if (fsdrv->mkdir)
+ ret = fsdrv->mkdir(&fsdev->dev, p);
+ else
+ ret = -EROFS;
out:
free(freep);
- return errno;
+
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(mkdir);
@@ -1102,24 +1186,30 @@ int rmdir (const char *pathname)
struct fs_device_d *fsdev;
char *p = normalise_path(pathname);
char *freep = p;
+ int ret;
- if (path_check_prereq(pathname, S_IFDIR | S_UB_IS_EMPTY))
+ ret = path_check_prereq(pathname, S_IFDIR | S_UB_IS_EMPTY);
+ if (ret)
goto out;
fsdev = get_fs_device_and_root_path(&p);
- if (!fsdev)
- goto out;
- fsdrv = fsdev->driver;
-
- if (fsdrv->rmdir) {
- errno = fsdrv->rmdir(&fsdev->dev, p);
+ if (!fsdev) {
+ ret = -ENOENT;
goto out;
}
+ fsdrv = fsdev->driver;
- errno = -EROFS;
+ if (fsdrv->rmdir)
+ ret = fsdrv->rmdir(&fsdev->dev, p);
+ else
+ ret = -EROFS;
out:
free(freep);
- return errno;
+
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
EXPORT_SYMBOL(rmdir);
@@ -1184,4 +1274,3 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset
return size;
}
EXPORT_SYMBOL(mem_write);
-
diff --git a/fs/nfs.c b/fs/nfs.c
new file mode 100644
index 0000000000..75a8f25066
--- /dev/null
+++ b/fs/nfs.c
@@ -0,0 +1,1054 @@
+/*
+ * nfs.c - barebox NFS driver
+ *
+ * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+ * Copyright (c) Masami Komiya <mkomiya@sonare.it> 2004
+ *
+ * Based on U-Boot NFS code which is based on NetBSD code
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <net.h>
+#include <driver.h>
+#include <fs.h>
+#include <errno.h>
+#include <libgen.h>
+#include <fcntl.h>
+#include <fs.h>
+#include <init.h>
+#include <linux/stat.h>
+#include <linux/err.h>
+#include <kfifo.h>
+#include <sizes.h>
+
+#define SUNRPC_PORT 111
+
+#define PROG_PORTMAP 100000
+#define PROG_NFS 100003
+#define PROG_MOUNT 100005
+
+#define MSG_CALL 0
+#define MSG_REPLY 1
+
+#define PORTMAP_GETPORT 3
+
+#define MOUNT_ADDENTRY 1
+#define MOUNT_UMOUNT 3
+
+#define NFS_GETATTR 1
+#define NFS_LOOKUP 4
+#define NFS_READLINK 5
+#define NFS_READ 6
+#define NFS_READDIR 16
+
+#define NFS_FHSIZE 32
+
+enum nfs_stat {
+ NFS_OK = 0,
+ NFSERR_PERM = 1,
+ NFSERR_NOENT = 2,
+ NFSERR_IO = 5,
+ NFSERR_NXIO = 6,
+ NFSERR_ACCES = 13,
+ NFSERR_EXIST = 17,
+ NFSERR_NODEV = 19,
+ NFSERR_NOTDIR = 20,
+ NFSERR_ISDIR = 21,
+ NFSERR_FBIG = 27,
+ NFSERR_NOSPC = 28,
+ NFSERR_ROFS = 30,
+ NFSERR_NAMETOOLONG=63,
+ NFSERR_NOTEMPTY = 66,
+ NFSERR_DQUOT = 69,
+ NFSERR_STALE = 70,
+ NFSERR_WFLUSH = 99,
+};
+
+static void *nfs_packet;
+static int nfs_len;
+
+struct rpc_call {
+ uint32_t id;
+ uint32_t type;
+ uint32_t rpcvers;
+ uint32_t prog;
+ uint32_t vers;
+ uint32_t proc;
+ uint32_t data[0];
+};
+
+struct rpc_reply {
+ uint32_t id;
+ uint32_t type;
+ uint32_t rstatus;
+ uint32_t verifier;
+ uint32_t v2;
+ uint32_t astatus;
+ uint32_t data[0];
+};
+
+#define NFS_TIMEOUT (2 * SECOND)
+#define NFS_MAX_RESEND 5
+
+struct nfs_priv {
+ struct net_connection *con;
+ IPaddr_t server;
+ char *path;
+ int mount_port;
+ int nfs_port;
+ unsigned long rpc_id;
+ char rootfh[NFS_FHSIZE];
+};
+
+struct file_priv {
+ struct kfifo *fifo;
+ void *buf;
+ char filefh[NFS_FHSIZE];
+ struct nfs_priv *npriv;
+};
+
+static uint64_t nfs_timer_start;
+
+static int nfs_state;
+#define STATE_DONE 1
+#define STATE_START 2
+
+enum ftype {
+ NFNON = 0,
+ NFREG = 1,
+ NFDIR = 2,
+ NFBLK = 3,
+ NFCHR = 4,
+ NFLNK = 5
+};
+
+struct fattr {
+ uint32_t type;
+ uint32_t mode;
+ uint32_t nlink;
+ uint32_t uid;
+ uint32_t gid;
+ uint32_t size;
+ uint32_t blocksize;
+ uint32_t rdev;
+ uint32_t blocks;
+};
+
+struct readdirargs {
+ char filefh[NFS_FHSIZE];
+ uint32_t cookie;
+ uint32_t count;
+};
+
+struct xdr_stream {
+ __be32 *p;
+ void *buf;
+ __be32 *end;
+};
+
+#define xdr_zero 0
+#define XDR_QUADLEN(l) (((l) + 3) >> 2)
+
+static void xdr_init(struct xdr_stream *stream, void *buf, int len)
+{
+ stream->p = stream->buf = buf;
+ stream->end = stream->buf + len;
+}
+
+static __be32 *__xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes)
+{
+ __be32 *p = xdr->p;
+ __be32 *q = p + XDR_QUADLEN(nbytes);
+
+ if (q > xdr->end || q < p)
+ return NULL;
+ xdr->p = q;
+ return p;
+}
+
+static __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes)
+{
+ __be32 *p;
+
+ if (nbytes == 0)
+ return xdr->p;
+ if (xdr->p == xdr->end)
+ return NULL;
+ p = __xdr_inline_decode(xdr, nbytes);
+
+ return p;
+}
+
+static int decode_filename(struct xdr_stream *xdr,
+ char *name, u32 *length)
+{
+ __be32 *p;
+ u32 count;
+
+ p = xdr_inline_decode(xdr, 4);
+ if (!p)
+ goto out_overflow;
+ count = be32_to_cpup(p);
+ if (count > 255)
+ goto out_nametoolong;
+ p = xdr_inline_decode(xdr, count);
+ if (!p)
+ goto out_overflow;
+ memcpy(name, p, count);
+ name[count] = 0;
+ *length = count;
+ return 0;
+out_nametoolong:
+ printk("NFS: returned filename too long: %u\n", count);
+ return -ENAMETOOLONG;
+out_overflow:
+ printf("%s overflow\n",__func__);
+ return -EIO;
+}
+
+/*
+ * rpc_add_credentials - Add RPC authentication/verifier entries
+ */
+static uint32_t *rpc_add_credentials(uint32_t *p)
+{
+ int hl;
+ int hostnamelen = 0;
+
+ /*
+ * Here's the executive summary on authentication requirements of the
+ * various NFS server implementations: Linux accepts both AUTH_NONE
+ * and AUTH_UNIX authentication (also accepts an empty hostname field
+ * in the AUTH_UNIX scheme). *BSD refuses AUTH_NONE, but accepts
+ * AUTH_UNIX (also accepts an empty hostname field in the AUTH_UNIX
+ * scheme). To be safe, use AUTH_UNIX and pass the hostname if we have
+ * it (if the BOOTP/DHCP reply didn't give one, just use an empty
+ * hostname).
+ */
+
+ hl = (hostnamelen + 3) & ~3;
+
+ /* Provide an AUTH_UNIX credential. */
+ *p++ = htonl(1); /* AUTH_UNIX */
+ *p++ = htonl(hl + 20); /* auth length */
+ *p++ = htonl(0); /* stamp */
+ *p++ = htonl(hostnamelen); /* hostname string */
+
+ if (hostnamelen & 3)
+ *(p + hostnamelen / 4) = 0; /* add zero padding */
+
+ /* memcpy(p, hostname, hostnamelen); */ /* empty hostname */
+
+ p += hl / 4;
+ *p++ = 0; /* uid */
+ *p++ = 0; /* gid */
+ *p++ = 0; /* auxiliary gid list */
+
+ /* Provide an AUTH_NONE verifier. */
+ *p++ = 0; /* AUTH_NONE */
+ *p++ = 0; /* auth length */
+
+ return p;
+}
+
+static int rpc_check_reply(unsigned char *pkt, int rpc_prog, unsigned long rpc_id, int *nfserr)
+{
+ uint32_t *data;
+ struct rpc_reply rpc;
+
+ *nfserr = 0;
+
+ if (!pkt)
+ return -EAGAIN;
+
+ memcpy(&rpc, pkt, sizeof(rpc));
+
+ if (ntohl(rpc.id) != rpc_id)
+ return -EINVAL;
+
+ if (rpc.rstatus ||
+ rpc.verifier ||
+ rpc.astatus ) {
+ return -EINVAL;
+ }
+
+ if (rpc_prog == PROG_PORTMAP)
+ return 0;
+
+ data = (uint32_t *)(pkt + sizeof(struct rpc_reply));
+ *nfserr = ntohl(net_read_uint32(data));
+ *nfserr = -*nfserr;
+
+ debug("%s: state: %d, err %d\n", __func__, nfs_state, *nfserr);
+
+ return 0;
+}
+
+/*
+ * rpc_req - synchronous RPC request
+ */
+static int rpc_req(struct nfs_priv *npriv, int rpc_prog, int rpc_proc,
+ uint32_t *data, int datalen)
+{
+ struct rpc_call pkt;
+ unsigned long id;
+ int dport;
+ int ret;
+ unsigned char *payload = net_udp_get_payload(npriv->con);
+ int nfserr;
+ int tries = 0;
+
+ npriv->rpc_id++;
+ id = npriv->rpc_id;
+
+ pkt.id = htonl(id);
+ pkt.type = htonl(MSG_CALL);
+ pkt.rpcvers = htonl(2); /* use RPC version 2 */
+ pkt.prog = htonl(rpc_prog);
+ pkt.vers = htonl(2); /* portmapper is version 2 */
+ pkt.proc = htonl(rpc_proc);
+
+ memcpy(payload, &pkt, sizeof(pkt));
+ memcpy(payload + sizeof(pkt), data, datalen * sizeof(uint32_t));
+
+ if (rpc_prog == PROG_PORTMAP)
+ dport = SUNRPC_PORT;
+ else if (rpc_prog == PROG_MOUNT)
+ dport = npriv->mount_port;
+ else
+ dport = npriv->nfs_port;
+
+ npriv->con->udp->uh_dport = htons(dport);
+
+again:
+ ret = net_udp_send(npriv->con, sizeof(pkt) + datalen * sizeof(uint32_t));
+
+ nfs_timer_start = get_time_ns();
+
+ nfs_state = STATE_START;
+ nfs_packet = NULL;
+
+ while (nfs_state != STATE_DONE) {
+ if (ctrlc()) {
+ ret = -EINTR;
+ break;
+ }
+ net_poll();
+
+ if (is_timeout(nfs_timer_start, NFS_TIMEOUT)) {
+ tries++;
+ if (tries == NFS_MAX_RESEND)
+ return -ETIMEDOUT;
+ goto again;
+ }
+
+ ret = rpc_check_reply(nfs_packet, rpc_prog,
+ npriv->rpc_id, &nfserr);
+ if (!ret) {
+ ret = nfserr;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+/*
+ * rpc_lookup_req - Lookup RPC Port numbers
+ */
+static int rpc_lookup_req(struct nfs_priv *npriv, int prog, int ver)
+{
+ uint32_t data[16];
+ int ret;
+ uint32_t port;
+
+ data[0] = 0; data[1] = 0; /* auth credential */
+ data[2] = 0; data[3] = 0; /* auth verifier */
+ data[4] = htonl(prog);
+ data[5] = htonl(ver);
+ data[6] = htonl(17); /* IP_UDP */
+ data[7] = 0;
+
+ ret = rpc_req(npriv, PROG_PORTMAP, PORTMAP_GETPORT, data, 8);
+ if (ret)
+ return ret;
+
+ port = net_read_uint32((uint32_t *)(nfs_packet + sizeof(struct rpc_reply)));
+
+ switch (prog) {
+ case PROG_MOUNT:
+ npriv->mount_port = ntohl(port);
+ debug("mount port: %d\n", npriv->mount_port);
+ break;
+ case PROG_NFS:
+ npriv->nfs_port = ntohl(port);
+ debug("nfs port: %d\n", npriv->nfs_port);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/*
+ * nfs_mount_req - Mount an NFS Filesystem
+ */
+static int nfs_mount_req(struct nfs_priv *npriv)
+{
+ uint32_t data[1024];
+ uint32_t *p;
+ int len;
+ int pathlen;
+ int ret;
+
+ pathlen = strlen(npriv->path);
+
+ debug("%s: %s\n", __func__, npriv->path);
+
+ p = &(data[0]);
+ p = rpc_add_credentials(p);
+
+ *p++ = htonl(pathlen);
+ if (pathlen & 3)
+ *(p + pathlen / 4) = 0;
+
+ memcpy (p, npriv->path, pathlen);
+ p += (pathlen + 3) / 4;
+
+ len = p - &(data[0]);
+
+ ret = rpc_req(npriv, PROG_MOUNT, MOUNT_ADDENTRY, data, len);
+ if (ret)
+ return ret;
+
+ memcpy(npriv->rootfh, nfs_packet + sizeof(struct rpc_reply) + 4, NFS_FHSIZE);
+
+ return 0;
+}
+
+/*
+ * nfs_umountall_req - Unmount all our NFS Filesystems on the Server
+ */
+static void nfs_umount_req(struct nfs_priv *npriv)
+{
+ uint32_t data[1024];
+ uint32_t *p;
+ int len;
+ int pathlen;
+
+ pathlen = strlen(npriv->path);
+
+ p = &(data[0]);
+ p = rpc_add_credentials(p);
+
+ *p++ = htonl(pathlen);
+ if (pathlen & 3)
+ *(p + pathlen / 4) = 0;
+
+ memcpy (p, npriv->path, pathlen);
+ p += (pathlen + 3) / 4;
+
+ len = p - &(data[0]);
+
+ rpc_req(npriv, PROG_MOUNT, MOUNT_UMOUNT, data, len);
+}
+
+/*
+ * nfs_lookup_req - Lookup Pathname
+ */
+static int nfs_lookup_req(struct file_priv *priv, const char *filename,
+ int fnamelen)
+{
+ uint32_t data[1024];
+ uint32_t *p;
+ int len;
+ int ret;
+
+ p = &(data[0]);
+ p = rpc_add_credentials(p);
+
+ memcpy(p, priv->filefh, NFS_FHSIZE);
+
+ p += (NFS_FHSIZE / 4);
+ *p++ = htonl(fnamelen);
+
+ if (fnamelen & 3)
+ *(p + fnamelen / 4) = 0;
+
+ memcpy(p, filename, fnamelen);
+ p += (fnamelen + 3) / 4;
+
+ len = p - &(data[0]);
+
+ ret = rpc_req(priv->npriv, PROG_NFS, NFS_LOOKUP, data, len);
+ if (ret)
+ return ret;
+
+ memcpy(priv->filefh, nfs_packet + sizeof(struct rpc_reply) + 4, NFS_FHSIZE);
+
+ return 0;
+}
+
+static int nfs_attr_req(struct file_priv *priv, struct stat *s)
+{
+ uint32_t data[1024];
+ uint32_t *p;
+ int len;
+ int ret;
+ struct fattr *fattr;
+ uint32_t type;
+
+ p = &(data[0]);
+ p = rpc_add_credentials(p);
+
+ memcpy(p, priv->filefh, NFS_FHSIZE);
+ p += (NFS_FHSIZE / 4);
+ *p++ = 0;
+
+ len = p - &(data[0]);
+
+ ret = rpc_req(priv->npriv, PROG_NFS, NFS_GETATTR, data, len);
+ if (ret)
+ return ret;
+
+ fattr = nfs_packet + sizeof(struct rpc_reply) + 4;
+
+ type = ntohl(net_read_uint32(&fattr->type));
+
+ s->st_size = ntohl(net_read_uint32(&fattr->size));
+ s->st_mode = ntohl(net_read_uint32(&fattr->mode));
+
+ return 0;
+}
+
+static void *nfs_readdirattr_req(struct file_priv *priv, int *plen, uint32_t cookie)
+{
+ uint32_t data[1024];
+ uint32_t *p;
+ int len;
+ int ret;
+ void *buf;
+
+ p = &(data[0]);
+ p = rpc_add_credentials(p);
+
+ memcpy(p, priv->filefh, NFS_FHSIZE);
+ p += (NFS_FHSIZE / 4);
+ *p++ = htonl(cookie); /* cookie */
+ *p++ = htonl(1024); /* count */
+ *p++ = 0;
+
+ len = p - &(data[0]);
+
+ ret = rpc_req(priv->npriv, PROG_NFS, NFS_READDIR, data, len);
+ if (ret)
+ return NULL;
+
+ *plen = nfs_len - sizeof(struct rpc_reply) + 4;
+
+ buf = xzalloc(*plen);
+
+ memcpy(buf, nfs_packet + sizeof(struct rpc_reply) + 4, *plen);
+
+ return buf;
+}
+
+/*
+ * nfs_read_req - Read File on NFS Server
+ */
+static int nfs_read_req(struct file_priv *priv, int offset, int readlen)
+{
+ uint32_t data[1024];
+ uint32_t *p;
+ uint32_t *filedata;
+ int len;
+ int ret;
+ int rlen;
+
+ p = &(data[0]);
+ p = rpc_add_credentials(p);
+
+ memcpy (p, priv->filefh, NFS_FHSIZE);
+ p += (NFS_FHSIZE / 4);
+ *p++ = htonl(offset);
+ *p++ = htonl(readlen);
+ *p++ = 0;
+
+ len = p - &(data[0]);
+
+ ret = rpc_req(priv->npriv, PROG_NFS, NFS_READ, data, len);
+ if (ret)
+ return ret;
+
+ filedata = (uint32_t *)(nfs_packet + sizeof(struct rpc_reply));
+
+ rlen = ntohl(net_read_uint32(filedata + 18));
+
+ kfifo_put(priv->fifo, (char *)(filedata + 19), rlen);
+
+ return 0;
+}
+
+#if 0
+static int nfs_readlink_reply(unsigned char *pkt, unsigned len)
+{
+ uint32_t *data;
+ char *path;
+ int rlen;
+// int ret;
+
+ data = (uint32_t *)(pkt + sizeof(struct rpc_reply));
+
+ data++;
+
+ rlen = ntohl(net_read_uint32(data)); /* new path length */
+
+ data++;
+ path = (char *)data;
+
+ if (*path != '/') {
+ strcat(nfs_path, "/");
+ strncat(nfs_path, path, rlen);
+ } else {
+ memcpy(nfs_path, path, rlen);
+ nfs_path[rlen] = 0;
+ }
+ return 0;
+}
+#endif
+
+static void nfs_handler(void *ctx, char *packet, unsigned len)
+{
+ char *pkt = net_eth_to_udp_payload(packet);
+
+ nfs_state = STATE_DONE;
+ nfs_packet = pkt;
+ nfs_len = len;
+}
+
+static int nfs_create(struct device_d *dev, const char *pathname, mode_t mode)
+{
+ return -ENOSYS;
+}
+
+static int nfs_unlink(struct device_d *dev, const char *pathname)
+{
+ return -ENOSYS;
+}
+
+static int nfs_mkdir(struct device_d *dev, const char *pathname)
+{
+ return -ENOSYS;
+}
+
+static int nfs_rmdir(struct device_d *dev, const char *pathname)
+{
+ return -ENOSYS;
+}
+
+static int nfs_truncate(struct device_d *dev, FILE *f, ulong size)
+{
+ return -ENOSYS;
+}
+
+static struct file_priv *nfs_do_open(struct device_d *dev, const char *filename)
+{
+ struct file_priv *priv;
+ struct nfs_priv *npriv = dev->priv;
+ int ret;
+ const char *fname, *tok;
+
+ priv = xzalloc(sizeof(*priv));
+
+ priv->npriv = npriv;
+
+ if (!*filename) {
+ memcpy(priv->filefh, npriv->rootfh, NFS_FHSIZE);
+ return priv;
+ }
+
+ filename++;
+
+ fname = filename;
+
+ memcpy(priv->filefh, npriv->rootfh, NFS_FHSIZE);
+
+ while (*fname) {
+ int flen;
+
+ tok = strchr(fname, '/');
+ if (tok)
+ flen = tok - fname;
+ else
+ flen = strlen(fname);
+
+ ret = nfs_lookup_req(priv, fname, flen);
+ if (ret)
+ goto out;
+
+ if (tok)
+ fname += flen + 1;
+ else
+ break;
+ }
+
+ return priv;
+
+out:
+ free(priv);
+
+ return ERR_PTR(ret);
+}
+
+static void nfs_do_close(struct file_priv *priv)
+{
+ if (priv->fifo)
+ kfifo_free(priv->fifo);
+
+ free(priv);
+}
+
+static struct file_priv *nfs_do_stat(struct device_d *dev, const char *filename, struct stat *s)
+{
+ struct file_priv *priv;
+ int ret;
+
+ priv = nfs_do_open(dev, filename);
+ if (IS_ERR(priv))
+ return priv;
+
+ ret = nfs_attr_req(priv, s);
+ if (ret) {
+ nfs_do_close(priv);
+ return ERR_PTR(ret);
+ }
+
+ return priv;
+}
+
+static int nfs_open(struct device_d *dev, FILE *file, const char *filename)
+{
+ struct file_priv *priv;
+ struct stat s;
+
+ priv = nfs_do_stat(dev, filename, &s);
+ if (IS_ERR(priv))
+ return PTR_ERR(priv);
+
+ file->inode = priv;
+ file->size = s.st_size;
+
+ priv->fifo = kfifo_alloc(1024);
+ if (!priv->fifo) {
+ free(priv);
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+static int nfs_close(struct device_d *dev, FILE *file)
+{
+ struct file_priv *priv = file->inode;
+
+ nfs_do_close(priv);
+
+ return 0;
+}
+
+static int nfs_write(struct device_d *_dev, FILE *file, const void *inbuf,
+ size_t insize)
+{
+ return -ENOSYS;
+}
+
+static int nfs_read(struct device_d *dev, FILE *file, void *buf, size_t insize)
+{
+ struct file_priv *priv = file->inode;
+ int now, outsize = 0, ret, pos = file->pos;
+
+ while (insize) {
+ now = kfifo_get(priv->fifo, buf, insize);
+ outsize += now;
+ buf += now;
+ insize -= now;
+
+ if (insize) {
+ now = 1024;
+
+ if (pos + now > file->size)
+ now = file->size - pos;
+
+ ret = nfs_read_req(priv, pos, now);
+ if (ret)
+ return ret;
+ pos += now;
+ }
+ }
+
+ return outsize;
+}
+
+static off_t nfs_lseek(struct device_d *dev, FILE *file, off_t pos)
+{
+ struct file_priv *priv = file->inode;
+
+ file->pos = pos;
+ kfifo_reset(priv->fifo);
+
+ return file->pos;
+}
+
+struct nfs_dir {
+ DIR dir;
+ struct xdr_stream stream;
+ struct dirent ent;
+ struct file_priv *priv;
+ uint32_t cookie;
+};
+
+static DIR *nfs_opendir(struct device_d *dev, const char *pathname)
+{
+ struct file_priv *priv;
+ struct stat s;
+ int ret;
+ void *buf;
+ struct nfs_dir *dir;
+ int len;
+
+ priv = nfs_do_open(dev, pathname);
+ if (IS_ERR(priv))
+ return NULL;
+
+ ret = nfs_attr_req(priv, &s);
+ if (ret)
+ return NULL;
+
+ if (!S_ISDIR(s.st_mode))
+ return NULL;
+
+ dir = xzalloc(sizeof(*dir));
+ dir->priv = priv;
+
+ buf = nfs_readdirattr_req(priv, &len, 0);
+ if (!buf)
+ return NULL;
+
+ xdr_init(&dir->stream, buf, len);
+
+ return &dir->dir;
+}
+
+static struct dirent *nfs_readdir(struct device_d *dev, DIR *dir)
+{
+ struct nfs_dir *ndir = (void *)dir;
+ __be32 *p;
+ int ret;
+ int len;
+ struct xdr_stream *xdr = &ndir->stream;
+
+again:
+ p = xdr_inline_decode(xdr, 4);
+ if (!p)
+ goto out_overflow;
+
+ if (*p++ == xdr_zero) {
+ p = xdr_inline_decode(xdr, 4);
+ if (!p)
+ goto out_overflow;
+ if (*p++ == xdr_zero) {
+ void *buf;
+ int len;
+
+ /*
+ * End of current entries, read next chunk.
+ */
+
+ free(ndir->stream.buf);
+
+ buf = nfs_readdirattr_req(ndir->priv, &len, ndir->cookie);
+ if (!buf)
+ return NULL;
+
+ xdr_init(&ndir->stream, buf, len);
+
+ goto again;
+ }
+ return NULL; /* -EINVAL */
+ }
+
+ p = xdr_inline_decode(xdr, 4);
+ if (!p)
+ goto out_overflow;
+
+ ret = decode_filename(xdr, ndir->ent.d_name, &len);
+ if (ret)
+ return NULL;
+
+ /*
+ * The type (size and byte order) of nfscookie isn't defined in
+ * RFC 1094. This implementation assumes that it's an XDR uint32.
+ */
+ p = xdr_inline_decode(xdr, 4);
+ if (!p)
+ goto out_overflow;
+
+ ndir->cookie = be32_to_cpup(p);
+
+ return &ndir->ent;
+
+out_overflow:
+
+ printf("nfs: overflow error\n");
+
+ return NULL;
+
+}
+
+static int nfs_closedir(struct device_d *dev, DIR *dir)
+{
+ struct nfs_dir *ndir = (void *)dir;
+
+ nfs_do_close(ndir->priv);
+ free(ndir->stream.buf);
+ free(ndir);
+
+ return 0;
+}
+
+static int nfs_stat(struct device_d *dev, const char *filename, struct stat *s)
+{
+ struct file_priv *priv;
+
+ priv = nfs_do_stat(dev, filename, s);
+ if (IS_ERR(priv)) {
+ return PTR_ERR(priv);
+ } else {
+ nfs_do_close(priv);
+ return 0;
+ }
+}
+
+static int nfs_probe(struct device_d *dev)
+{
+ struct fs_device_d *fsdev = dev_to_fs_device(dev);
+ struct nfs_priv *npriv = xzalloc(sizeof(struct nfs_priv));
+ char *tmp = xstrdup(fsdev->backingstore);
+ char *path;
+ int ret;
+
+ dev->priv = npriv;
+
+ debug("nfs: mount: %s\n", fsdev->backingstore);
+
+ path = strchr(tmp, ':');
+ if (!path) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ *path = 0;
+
+ npriv->path = xstrdup(path + 1);
+
+ npriv->server = resolv(tmp);
+
+ debug("nfs: server: %s path: %s\n", tmp, npriv->path);
+
+ npriv->con = net_udp_new(npriv->server, 0, nfs_handler, npriv);
+ if (IS_ERR(npriv->con)) {
+ ret = PTR_ERR(npriv->con);
+ goto err1;
+ }
+
+ /* Need a priviliged source port */
+ net_udp_bind(npriv->con, 1000);
+
+ ret = rpc_lookup_req(npriv, PROG_MOUNT, 1);
+ if (ret) {
+ printf("lookup mount port failed with %d\n", ret);
+ goto err2;
+ }
+
+ ret = rpc_lookup_req(npriv, PROG_NFS, 2);
+ if (ret) {
+ printf("lookup nfs port failed with %d\n", ret);
+ goto err2;
+ }
+
+ ret = nfs_mount_req(npriv);
+ if (ret) {
+ printf("mounting failed with %d\n", ret);
+ goto err2;
+ }
+
+ free(tmp);
+
+ return 0;
+
+err2:
+ net_unregister(npriv->con);
+err1:
+ free(npriv->path);
+err:
+ free(tmp);
+ free(npriv);
+
+ return ret;
+}
+
+static void nfs_remove(struct device_d *dev)
+{
+ struct nfs_priv *npriv = dev->priv;
+
+ nfs_umount_req(npriv);
+
+ net_unregister(npriv->con);
+ free(npriv->path);
+ free(npriv);
+}
+
+static struct fs_driver_d nfs_driver = {
+ .open = nfs_open,
+ .close = nfs_close,
+ .read = nfs_read,
+ .lseek = nfs_lseek,
+ .opendir = nfs_opendir,
+ .readdir = nfs_readdir,
+ .closedir = nfs_closedir,
+ .stat = nfs_stat,
+ .create = nfs_create,
+ .unlink = nfs_unlink,
+ .mkdir = nfs_mkdir,
+ .rmdir = nfs_rmdir,
+ .write = nfs_write,
+ .truncate = nfs_truncate,
+ .flags = 0,
+ .drv = {
+ .probe = nfs_probe,
+ .remove = nfs_remove,
+ .name = "nfs",
+ }
+};
+
+static int nfs_init(void)
+{
+ return register_fs_driver(&nfs_driver);
+}
+coredevice_initcall(nfs_init);
diff --git a/fs/ramfs.c b/fs/ramfs.c
index 83ab6dfc06..cec5e769b0 100644
--- a/fs/ramfs.c
+++ b/fs/ramfs.c
@@ -48,6 +48,10 @@ struct ramfs_inode {
ulong size;
struct ramfs_chunk *data;
+
+ /* Points to recently used chunk */
+ int recent_chunk;
+ struct ramfs_chunk *recent_chunkp;
};
struct ramfs_priv {
@@ -297,6 +301,35 @@ static int ramfs_close(struct device_d *dev, FILE *f)
return 0;
}
+static struct ramfs_chunk *ramfs_find_chunk(struct ramfs_inode *node, int chunk)
+{
+ struct ramfs_chunk *data;
+ int left = chunk;
+
+ if (chunk == 0)
+ return node->data;
+
+ if (node->recent_chunk == chunk)
+ return node->recent_chunkp;
+
+ if (node->recent_chunk < chunk && node->recent_chunk != 0) {
+ /* Start at last known chunk */
+ data = node->recent_chunkp;
+ left -= node->recent_chunk;
+ } else {
+ /* Start at first chunk */
+ data = node->data;
+ }
+
+ while (left--)
+ data = data->next;
+
+ node->recent_chunkp = data;
+ node->recent_chunk = chunk;
+
+ return data;
+}
+
static int ramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t insize)
{
struct ramfs_inode *node = (struct ramfs_inode *)f->inode;
@@ -311,11 +344,7 @@ static int ramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t insize)
debug("%s: reading from chunk %d\n", __FUNCTION__, chunk);
/* Position ourself in stream */
- data = node->data;
- while (chunk) {
- data = data->next;
- chunk--;
- }
+ data = ramfs_find_chunk(node, chunk);
ofs = f->pos % CHUNK_SIZE;
/* Read till end of current chunk */
@@ -364,11 +393,7 @@ static int ramfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t i
debug("%s: writing to chunk %d\n", __FUNCTION__, chunk);
/* Position ourself in stream */
- data = node->data;
- while (chunk) {
- data = data->next;
- chunk--;
- }
+ data = ramfs_find_chunk(node, chunk);
ofs = f->pos % CHUNK_SIZE;
/* Write till end of current chunk */
@@ -429,6 +454,8 @@ static int ramfs_truncate(struct device_d *dev, FILE *f, ulong size)
ramfs_put_chunk(data);
data = tmp;
}
+ if (node->recent_chunk > newchunks)
+ node->recent_chunk = 0;
}
if (newchunks > oldchunks) {
diff --git a/include/boot.h b/include/boot.h
index a17bf25a4c..3ce0de125b 100644
--- a/include/boot.h
+++ b/include/boot.h
@@ -5,6 +5,7 @@
#include <filetype.h>
#include <of.h>
#include <linux/list.h>
+#include <environment.h>
struct image_data {
/* simplest case. barebox has already loaded the os here */
@@ -71,4 +72,19 @@ static inline int bootm_verbose(struct image_data *data)
}
#endif
+#ifdef CONFIG_FLEXIBLE_BOOTARGS
+const char *linux_bootargs_get(void);
+int linux_bootargs_overwrite(const char *bootargs);
+#else
+static inline const char *linux_bootargs_get(void)
+{
+ return getenv("bootargs");
+}
+
+static inline int linux_bootargs_overwrite(const char *bootargs)
+{
+ return setenv("bootargs", bootargs);
+}
+#endif
+
#endif /* __BOOT_H */
diff --git a/include/filetype.h b/include/filetype.h
index 93387938be..f5de8ed2b5 100644
--- a/include/filetype.h
+++ b/include/filetype.h
@@ -17,6 +17,7 @@ enum filetype {
filetype_oftree,
filetype_aimage,
filetype_sh,
+ filetype_mips_barebox,
};
const char *file_type_to_string(enum filetype f);
diff --git a/include/globalvar.h b/include/globalvar.h
new file mode 100644
index 0000000000..7cc3976f6b
--- /dev/null
+++ b/include/globalvar.h
@@ -0,0 +1,12 @@
+#ifndef __GLOBALVAR_H
+#define __GLOBALVAR_H
+
+int globalvar_add_simple(const char *name);
+
+int globalvar_add(const char *name,
+ int (*set)(struct device_d *dev, struct param_d *p, const char *val),
+ const char *(*get)(struct device_d *, struct param_d *p),
+ unsigned long flags);
+char *globalvar_get_match(const char *match, const char *seperator);
+
+#endif /* __GLOBALVAR_H */
diff --git a/include/io.h b/include/io.h
index 39b5e614b7..8d885de68f 100644
--- a/include/io.h
+++ b/include/io.h
@@ -4,20 +4,11 @@
#include <asm/io.h>
/* cpu_read/cpu_write: cpu native io accessors */
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define cpu_readb(a) readb(a)
-#define cpu_readw(a) in_be16(a)
-#define cpu_readl(a) in_be32(a)
-#define cpu_writeb(v, a) writeb((v), (a))
-#define cpu_writew(v, a) out_be16((a), (v))
-#define cpu_writel(v, a) out_be32((a), (v))
-#else
-#define cpu_readb(a) readb(a)
-#define cpu_readw(a) readw(a)
-#define cpu_readl(a) readl(a)
-#define cpu_writeb(v, a) writeb((v), (a))
-#define cpu_writew(v, a) writew((v), (a))
-#define cpu_writel(v, a) writel((v), (a))
-#endif
+#define cpu_readb(a) __raw_readb(a)
+#define cpu_readw(a) __raw_readw(a)
+#define cpu_readl(a) __raw_readl(a)
+#define cpu_writeb(v, a) __raw_writeb((v), (a))
+#define cpu_writew(v, a) __raw_writew((v), (a))
+#define cpu_writel(v, a) __raw_writel((v), (a))
#endif /* __IO_H */
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 8e208765f7..2a1c4ff67b 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -313,7 +313,7 @@ struct nand_buffers {
* @select_chip: [REPLACEABLE] select chip nr
* @block_bad: [REPLACEABLE] check, if the block is bad
* @block_markbad: [REPLACEABLE] mark the block bad
- * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific funtion for controlling
+ * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific function for controlling
* ALE/CLE/nCE. Also used to write command and address
* @dev_ready: [BOARDSPECIFIC] hardwarespecific function for accesing device ready/busy line
* If set to NULL no access to ready/busy is available and the ready/busy information
diff --git a/include/linux/types.h b/include/linux/types.h
index 16cc3ce128..76c6b670a2 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -144,8 +144,10 @@ typedef __u32 __bitwise __wsum;
#ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 phys_addr_t;
+typedef u64 phys_size_t;
#else
typedef u32 phys_addr_t;
+typedef u32 phys_size_t;
#endif
typedef phys_addr_t resource_size_t;
diff --git a/include/magicvar.h b/include/magicvar.h
index d27a2e32a3..bb5bd2591f 100644
--- a/include/magicvar.h
+++ b/include/magicvar.h
@@ -18,14 +18,18 @@ extern struct magicvar __barebox_magicvar_end;
#endif
#ifdef CONFIG_CMD_MAGICVAR
-#define BAREBOX_MAGICVAR(_name, _description) \
+#define BAREBOX_MAGICVAR_NAMED(_name, _varname, _description) \
extern const struct magicvar __barebox_magicvar_##_name; \
const struct magicvar __barebox_magicvar_##_name \
__attribute__ ((unused,section (".barebox_magicvar_" __stringify(_name)))) = { \
- .name = #_name, \
+ .name = #_varname, \
.description = MAGICVAR_DESCRIPTION(_description), \
};
+
+#define BAREBOX_MAGICVAR(_name, _description) \
+ BAREBOX_MAGICVAR_NAMED(_name, _name, _description)
#else
+#define BAREBOX_MAGICVAR_NAMED(_name, _varname, _description)
#define BAREBOX_MAGICVAR(_name, _description)
#endif
diff --git a/include/param.h b/include/param.h
index e7b66a4d68..a855102d15 100644
--- a/include/param.h
+++ b/include/param.h
@@ -14,7 +14,6 @@ struct param_d {
int (*set)(struct device_d *, struct param_d *param, const char *val);
unsigned int flags;
char *name;
- struct param_d *next;
char *value;
struct list_head list;
};
diff --git a/include/partition.h b/include/partition.h
index 4eac8de86b..0827bb40c6 100644
--- a/include/partition.h
+++ b/include/partition.h
@@ -3,9 +3,6 @@
struct device_d;
-#define PARTITION_FIXED (1 << 0)
-#define PARTITION_READONLY (1 << 1)
-
struct partition {
int num;
diff --git a/include/qsort.h b/include/qsort.h
new file mode 100644
index 0000000000..bbb23595b2
--- /dev/null
+++ b/include/qsort.h
@@ -0,0 +1,7 @@
+#ifndef __QSORT_H
+#define __QSORT_H
+
+void qsort(void *base, size_t nel, size_t width,
+ int (*comp)(const void *, const void *));
+
+#endif /* __QSORT_H */
diff --git a/lib/Kconfig b/lib/Kconfig
index f886e6e2a5..3bcde5c1ff 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -35,4 +35,7 @@ config BCH
config BITREV
bool
+config QSORT
+ bool
+
endmenu
diff --git a/lib/Makefile b/lib/Makefile
index 01a01b5966..4e6b1ee90d 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -33,3 +33,4 @@ obj-$(CONFIG_FDT) += fdt/
obj-$(CONFIG_UNCOMPRESS) += uncompress.o
obj-$(CONFIG_BCH) += bch.o
obj-$(CONFIG_BITREV) += bitrev.o
+obj-$(CONFIG_QSORT) += qsort.o
diff --git a/lib/glob.c b/lib/glob.c
index 74d2b123e3..c4c60674b6 100644
--- a/lib/glob.c
+++ b/lib/glob.c
@@ -22,6 +22,7 @@ Cambridge, MA 02139, USA. */
#include <malloc.h>
#include <xfuncs.h>
#include <fnmatch.h>
+#include <qsort.h>
#define _GNU_SOURCE
#include <glob.h>
@@ -75,12 +76,10 @@ int glob_pattern_p(const char *pattern, int quote)
#ifdef CONFIG_GLOB_SORT
/* Do a collated comparison of A and B. */
-static int collated_compare(a, b)
-const __ptr_t a;
-const __ptr_t b;
+static int collated_compare(const void *a, const void *b)
{
- const char *const s1 = *(const char *const *)a;
- const char *const s2 = *(const char *const *)b;
+ const char *s1 = a;
+ const char *s2 = b;
if (s1 == s2)
return 0;
@@ -266,7 +265,7 @@ int glob(const char *pattern, int flags,
/* Sort the vector. */
qsort((__ptr_t) & pglob->gl_pathv[oldcount],
pglob->gl_pathc - oldcount,
- sizeof(char *), (__compar_fn_t) collated_compare);
+ sizeof(char *), collated_compare);
#endif
status = 0;
out:
diff --git a/lib/make_directory.c b/lib/make_directory.c
index 274bc146cf..c14c86d45b 100644
--- a/lib/make_directory.c
+++ b/lib/make_directory.c
@@ -12,6 +12,7 @@ int make_directory(const char *dir)
char *s = strdup(dir);
char *path = s;
char c;
+ int ret = 0;
do {
c = 0;
@@ -33,12 +34,10 @@ int make_directory(const char *dir)
/* If we failed for any other reason than the directory
* already exists, output a diagnostic and return -1.*/
-#ifdef __BAREBOX__
- if (errno != -EEXIST)
-#else
- if (errno != EEXIST)
-#endif
+ if (errno != EEXIST) {
+ ret = -errno;
break;
+ }
}
if (!c)
goto out;
@@ -50,7 +49,9 @@ int make_directory(const char *dir)
out:
free(path);
- return errno;
+ if (ret)
+ errno = -ret;
+ return ret;
}
#ifdef __BAREBOX__
EXPORT_SYMBOL(make_directory);
diff --git a/lib/parameter.c b/lib/parameter.c
index baf7720cb4..b2b8d945a6 100644
--- a/lib/parameter.c
+++ b/lib/parameter.c
@@ -54,7 +54,7 @@ const char *dev_get_param(struct device_d *dev, const char *name)
struct param_d *param = get_param_by_name(dev, name);
if (!param) {
- errno = -EINVAL;
+ errno = EINVAL;
return NULL;
}
@@ -87,26 +87,30 @@ int dev_set_param_ip(struct device_d *dev, char *name, IPaddr_t ip)
int dev_set_param(struct device_d *dev, const char *name, const char *val)
{
struct param_d *param;
+ int ret;
if (!dev) {
- errno = -ENODEV;
+ errno = ENODEV;
return -ENODEV;
}
param = get_param_by_name(dev, name);
if (!param) {
- errno = -EINVAL;
+ errno = EINVAL;
return -EINVAL;
}
if (param->flags & PARAM_FLAG_RO) {
- errno = -EACCES;
+ errno = EACCES;
return -EACCES;
}
- errno = param->set(dev, param, val);
- return errno;
+ ret = param->set(dev, param, val);
+ if (ret)
+ errno = -ret;
+
+ return ret;
}
/**
@@ -135,7 +139,7 @@ int dev_param_set_generic(struct device_d *dev, struct param_d *p,
static const char *param_get_generic(struct device_d *dev, struct param_d *p)
{
- return p->value;
+ return p->value ? p->value : "";
}
static struct param_d *__dev_add_param(struct device_d *dev, const char *name,
diff --git a/lib/qsort.c b/lib/qsort.c
new file mode 100644
index 0000000000..f64871489d
--- /dev/null
+++ b/lib/qsort.c
@@ -0,0 +1,79 @@
+/*
+ * Code adapted from uClibc-0.9.30.3
+ *
+ * It is therefore covered by the GNU LESSER GENERAL PUBLIC LICENSE
+ * Version 2.1, February 1999
+ *
+ * Wolfgang Denk <wd@denx.de>
+ */
+
+/* This code is derived from a public domain shell sort routine by
+ * Ray Gardner and found in Bob Stout's snippets collection. The
+ * original code is included below in an #if 0/#endif block.
+ *
+ * I modified it to avoid the possibility of overflow in the wgap
+ * calculation, as well as to reduce the generated code size with
+ * bcc and gcc. */
+
+#include <linux/types.h>
+#include <common.h>
+#include <qsort.h>
+
+void qsort(void *base,
+ size_t nel,
+ size_t width,
+ int (*comp)(const void *, const void *))
+{
+ size_t wgap, i, j, k;
+ char tmp;
+
+ if (nel < 2 || width == 0)
+ return;
+
+ /* check for overflow */
+ if (nel <= ((size_t)(-1)) / width)
+ return;
+
+ wgap = 0;
+ do {
+ wgap = 3 * wgap + 1;
+ } while (wgap < (nel - 1) / 3);
+
+ /*
+ * From the above, we know that either wgap == 1 < nel or
+ * ((wgap-1) / 3 < (int) ((nel - 1) / 3) <= (nel - 1) / 3 ==> wgap < nel.
+ */
+ wgap *= width; /* So this can not overflow if wnel doesn't. */
+ nel *= width; /* Convert nel to 'wnel' */
+ do {
+ i = wgap;
+ do {
+ j = i;
+ do {
+ char *a;
+ char *b;
+
+ j -= wgap;
+ a = j + ((char *)base);
+ b = a + wgap;
+
+ if (comp(a, b) <= 0)
+ break;
+
+ k = width;
+ do {
+ tmp = *a;
+ *a++ = *b;
+ *b++ = tmp;
+ } while (--k);
+ } while (j >= wgap);
+ i += width;
+ } while (i < nel);
+ wgap = (wgap - width) / 3;
+ } while (wgap);
+}
+
+int strcmp_compar(const void *p1, const void *p2)
+{
+ return strcmp((const char *)p1, (const char *)p2);
+}
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index e99448602c..795ee8d09b 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -604,7 +604,7 @@ static int strrcmp(const char *s, const char *sub)
* Whitelist to allow certain references to pass with no warning.
*
* Pattern 0:
- * Do not warn if funtion/data are marked with __init_refok/__initdata_refok.
+ * Do not warn if function/data are marked with __init_refok/__initdata_refok.
* The pattern is identified by:
* fromsec = .text.init.refok | .data.init.refok
*