diff options
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 Binary files differnew file mode 100644 index 0000000000..93112bfca1 --- /dev/null +++ b/arch/arm/boards/mioa701/env/data/dps1.raw.gz 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, ð1_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 @@ -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 * |