diff --git a/Documentation/boards/bcm2835.rst b/Documentation/boards/bcm2835.rst new file mode 100644 index 0000000..13cebb0 --- /dev/null +++ b/Documentation/boards/bcm2835.rst @@ -0,0 +1,17 @@ +Broadcom BCM2835 +================ + +Raspberry Pi +------------ + + 1. Prepare a card with a FAT filesystem. Download a tiny NOOBS LITE + zip archive and unpack it into FAT partition. + See http://www.raspberrypi.org/help/noobs-setup/ for details. + + 2. Compile ``barebox.bin`` image (use ``rpi_defconfig``). + Copy it to the SD/microSD card and name it ``recovery.img``. + + 3. Connect to board's UART (115200 8N1); + Use PIN6 (GND), PIN8 (UART_TX), PIN10 (UART_RX) pins. + + 4. Turn board's power on. diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4aa6afe..09bbe05 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -53,6 +53,7 @@ select COMMON_CLK select CLOCKSOURCE_BCM2835 select ARM_AMBA + select HAS_DEBUG_LL config ARCH_CLPS711X bool "Cirrus Logic EP711x/EP721x/EP731x" @@ -188,9 +189,9 @@ config ARCH_VERSATILE bool "ARM Versatile boards (ARM926EJ-S)" - select CPU_ARM926T select GPIOLIB select HAVE_CLK + select HAS_DEBUG_LL config ARCH_VEXPRESS bool "ARM Vexpres boards" diff --git a/arch/arm/boards/versatile/env/boot.d/001-nor b/arch/arm/boards/versatile/env/boot.d/001-nor new file mode 120000 index 0000000..3db66ae --- /dev/null +++ b/arch/arm/boards/versatile/env/boot.d/001-nor @@ -0,0 +1 @@ +../boot/nor \ No newline at end of file diff --git a/arch/arm/boards/versatile/env/boot.d/101-nor-update b/arch/arm/boards/versatile/env/boot.d/101-nor-update new file mode 120000 index 0000000..e4f1952 --- /dev/null +++ b/arch/arm/boards/versatile/env/boot.d/101-nor-update @@ -0,0 +1 @@ +../boot/nor-update \ No newline at end of file diff --git a/arch/arm/boards/versatile/env/boot/nor b/arch/arm/boards/versatile/env/boot/nor new file mode 100644 index 0000000..3f31605 --- /dev/null +++ b/arch/arm/boards/versatile/env/boot/nor @@ -0,0 +1,15 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + boot-menu-add-entry "$0" "nor" + exit +fi + +global.bootm.image="/dev/nor0.kernel" +global.linux.bootargs.dyn.root="root=ubi0:root ubi.mtd=5 rootfstype=ubifs" + +dtb=/dev/nor0.dtb +filetype -s t ${dtb} +if [ "$t" = dtb ]; then + global.bootm.oftree="${dtb}" +fi diff --git a/arch/arm/boards/versatile/env/boot/nor-update b/arch/arm/boards/versatile/env/boot/nor-update new file mode 100644 index 0000000..728889d --- /dev/null +++ b/arch/arm/boards/versatile/env/boot/nor-update @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + boot-menu-add-entry "$0" "nor update" + exit +fi + +global.bootm.image="/dev/nor0.update" + +dtb=/dev/nor0.dtb +filetype -s t ${dtb} +if [ "$t" = dtb ]; then + global.bootm.oftree="${dtb}" +fi diff --git a/arch/arm/boards/versatile/env/config b/arch/arm/boards/versatile/env/config deleted file mode 100644 index 667dce3..0000000 --- a/arch/arm/boards/versatile/env/config +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -# use 'dhcp' to do dhcp in barebox and in kernel -# use 'none' if you want to skip kernel ip autoconfiguration -ip=dhcp - -# or set your networking parameters here -#eth0.ipaddr=a.b.c.d -#eth0.netmask=a.b.c.d -#eth0.gateway=a.b.c.d -#eth0.serverip=a.b.c.d - -# can be either 'nfs', 'tftp' or 'nor' -kernel_loc=tftp -# can be either 'net', 'nor' or 'initrd' -rootfs_loc=initrd - -# can be either 'jffs2' or 'ubifs' -rootfs_type=ubifs -rootfsimage=root.$rootfs_type - -#kernelimage=zImage -kernelimage=uImage -#kernelimage=Image -#kernelimage=Image.lzo - -nfsroot="$eth0.serverip:/opt/work/busybox/arm9/rootfs_arm" - -nor_parts="256k(barebox)ro,64k(bareboxenv),1536k(kernel),-(root)" -rootfs_mtdblock_nor=3 - -autoboot_timeout=3 - -bootargs="console=ttyAMA0,115200n8 CONSOLE=/dev/ttyAMA0" - -# set a fancy prompt (if support is compiled in) -PS1="\e[1;31m[barebox@\h]:\w\e[0m\n# " - diff --git a/arch/arm/boards/versatile/env/init/automount b/arch/arm/boards/versatile/env/init/automount new file mode 100644 index 0000000..53f9196 --- /dev/null +++ b/arch/arm/boards/versatile/env/init/automount @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + init-menu-add-entry "$0" "Automountpoints" + exit +fi + +# automount tftp server based on $eth0.serverip + +mkdir -p /mnt/tftp +automount /mnt/tftp 'ifup eth0 && mount -t tftp $eth0.serverip /mnt/tftp' diff --git a/arch/arm/boards/versatile/env/init/mtdparts-nor b/arch/arm/boards/versatile/env/init/mtdparts-nor new file mode 100644 index 0000000..9079d48 --- /dev/null +++ b/arch/arm/boards/versatile/env/init/mtdparts-nor @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + init-menu-add-entry "$0" "NOR partitions" + exit +fi + +mtdparts="512k(nor0.barebox)ro,512k(nor0.bareboxenv),4864k(nor0.kernel),256k(nor0.dtb),3M(nor0.update),-(nor0.root)" +kernelname="physmap-flash.0" + +mtdparts-add -d nor0 -k ${kernelname} -p ${mtdparts} diff --git a/arch/arm/boards/versatile/env/init/ps1 b/arch/arm/boards/versatile/env/init/ps1 new file mode 100644 index 0000000..a1d0754 --- /dev/null +++ b/arch/arm/boards/versatile/env/init/ps1 @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ ${global.allow_color} = "true" ]; then + export PS1="\e[1;32mbarebox@\e[1;36m\h:\w\e[0m\n# " +else + export PS1="barebox@\h:\w\n# " +fi diff --git a/arch/arm/boards/versatile/env/nv/boot.default b/arch/arm/boards/versatile/env/nv/boot.default new file mode 100644 index 0000000..c47e1b2 --- /dev/null +++ b/arch/arm/boards/versatile/env/nv/boot.default @@ -0,0 +1 @@ +/env/boot.d diff --git a/arch/arm/boards/versatile/env/nv/linux.bootargs.base b/arch/arm/boards/versatile/env/nv/linux.bootargs.base new file mode 100644 index 0000000..826debe --- /dev/null +++ b/arch/arm/boards/versatile/env/nv/linux.bootargs.base @@ -0,0 +1 @@ +console=ttyAMA0,115200n8 CONSOLE=/dev/ttyAMA0 diff --git a/arch/arm/boards/versatile/versatilepb.c b/arch/arm/boards/versatile/versatilepb.c index fdd0820..9ed1146 100644 --- a/arch/arm/boards/versatile/versatilepb.c +++ b/arch/arm/boards/versatile/versatilepb.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,19 @@ static int vpb_console_init(void) { - barebox_set_hostname("versatilepb"); + char *hostname = "versatilepb-unknown"; + char *model = "ARM Versatile PB"; + + if (cpu_is_arm926()) { + hostname = "versatilepb-arm926"; + model = "ARM Versatile PB (arm926)"; + } else if (cpu_is_arm1176()) { + hostname = "versatilepb-arm1176"; + model = "ARM Versatile PB (arm1176)"; + } + + barebox_set_hostname(hostname); + barebox_set_model(model); versatile_register_uart(0); return 0; @@ -46,8 +59,8 @@ static int vpb_devices_init(void) { add_cfi_flash_device(DEVICE_ID_DYNAMIC, VERSATILE_FLASH_BASE, VERSATILE_FLASH_SIZE, 0); - devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self"); - devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0"); + devfs_add_partition("nor0", 0x00000, SZ_512K, DEVFS_PARTITION_FIXED, "self"); + devfs_add_partition("nor0", SZ_512K, SZ_512K, DEVFS_PARTITION_FIXED, "env0"); add_generic_device("smc91c111", DEVICE_ID_DYNAMIC, NULL, VERSATILE_ETH_BASE, 64 * 1024, IORESOURCE_MEM, &net_pdata); diff --git a/arch/arm/configs/rpi_defconfig b/arch/arm/configs/rpi_defconfig index 05c0136..c6b2c50 100644 --- a/arch/arm/configs/rpi_defconfig +++ b/arch/arm/configs/rpi_defconfig @@ -31,6 +31,7 @@ CONFIG_CMD_FILETYPE=y CONFIG_CMD_ECHO_E=y CONFIG_CMD_LOADB=y +CONFIG_CMD_LOADY=y CONFIG_CMD_MEMINFO=y CONFIG_CMD_IOMEM=y CONFIG_CMD_MM=y diff --git a/arch/arm/configs/versatilepb_arm1176_defconfig b/arch/arm/configs/versatilepb_arm1176_defconfig new file mode 100644 index 0000000..ca0ab36 --- /dev/null +++ b/arch/arm/configs/versatilepb_arm1176_defconfig @@ -0,0 +1,99 @@ +CONFIG_BUILTIN_DTB=y +CONFIG_BUILTIN_DTB_NAME="versatile-pb" +CONFIG_ARCH_VERSATILE=y +CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x80000 +CONFIG_MACH_VERSATILEPB_ARM1176=y +CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y +CONFIG_PBL_IMAGE=y +CONFIG_PBL_RELOCATABLE=y +CONFIG_MALLOC_SIZE=0xa00000 +CONFIG_PROMPT="versatilepb> " +CONFIG_HUSH_FANCY_PROMPT=y +CONFIG_CMDLINE_EDITING=y +CONFIG_AUTO_COMPLETE=y +CONFIG_MENU=y +CONFIG_CONSOLE_ACTIVATE_ALL=y +CONFIG_DEFAULT_COMPRESSION_GZIP=y +CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y +CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/versatile/env" +CONFIG_CMD_DMESG=y +CONFIG_LONGHELP=y +CONFIG_CMD_IOMEM=y +CONFIG_CMD_MEMINFO=y +CONFIG_CMD_BOOTM_SHOW_TYPE=y +CONFIG_CMD_BOOTM_VERBOSE=y +CONFIG_CMD_BOOTM_INITRD=y +CONFIG_CMD_BOOTM_OFTREE=y +CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y +CONFIG_CMD_GO=y +CONFIG_CMD_LOADB=y +CONFIG_CMD_RESET=y +CONFIG_CMD_PARTITION=y +CONFIG_CMD_UBIFORMAT=y +CONFIG_CMD_EXPORT=y +CONFIG_CMD_LOADENV=y +CONFIG_CMD_PRINTENV=y +CONFIG_CMD_MAGICVAR=y +CONFIG_CMD_MAGICVAR_HELP=y +CONFIG_CMD_SAVEENV=y +CONFIG_CMD_FILETYPE=y +CONFIG_CMD_UNCOMPRESS=y +CONFIG_CMD_SLEEP=y +CONFIG_CMD_DHCP=y +CONFIG_CMD_PING=y +CONFIG_CMD_TFTP=y +CONFIG_CMD_ECHO_E=y +CONFIG_CMD_EDIT=y +CONFIG_CMD_LOGIN=y +CONFIG_CMD_MENU=y +CONFIG_CMD_MENU_MANAGEMENT=y +CONFIG_CMD_PASSWD=y +CONFIG_CMD_SPLASH=y +CONFIG_CMD_READLINE=y +CONFIG_CMD_TIMEOUT=y +CONFIG_CMD_CRC=y +CONFIG_CMD_CRC_CMP=y +CONFIG_CMD_FLASH=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_I2C=y +CONFIG_CMD_OF_NODE=y +CONFIG_CMD_OF_PROPERTY=y +CONFIG_CMD_OFTREE=y +CONFIG_NET=y +CONFIG_NET_NFS=y +CONFIG_NET_NETCONSOLE=y +CONFIG_NET_RESOLV=y +CONFIG_OFDEVICE=y +CONFIG_OF_BAREBOX_DRIVERS=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_USB=y +CONFIG_SERIAL_USB_FTDI=y +CONFIG_DRIVER_NET_SMC91111=y +CONFIG_I2C=y +CONFIG_I2C_VERSATILE=y +CONFIG_MTD=y +CONFIG_DRIVER_CFI=y +# CONFIG_DRIVER_CFI_AMD is not set +# CONFIG_DRIVER_CFI_BANK_WIDTH_1 is not set +# CONFIG_DRIVER_CFI_BANK_WIDTH_2 is not set +CONFIG_MTD_UBI=y +CONFIG_USB_HOST=y +CONFIG_USB_EHCI=y +CONFIG_USB_STORAGE=y +CONFIG_VIDEO=y +CONFIG_DRIVER_VIDEO_ARMCLCD=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_SELF_REGISTER=y +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_ACORN_8x8=y +CONFIG_GPIO_PL061=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_DS1307=y +CONFIG_FS_CRAMFS=y +CONFIG_FS_EXT4=y +CONFIG_FS_TFTP=y +CONFIG_FS_NFS=y +CONFIG_PNG=y +CONFIG_SHA1=y +CONFIG_SHA256=y diff --git a/arch/arm/configs/versatilepb_defconfig b/arch/arm/configs/versatilepb_defconfig index 9f7e0e5..54a6fec 100644 --- a/arch/arm/configs/versatilepb_defconfig +++ b/arch/arm/configs/versatilepb_defconfig @@ -1,28 +1,41 @@ CONFIG_BUILTIN_DTB=y CONFIG_BUILTIN_DTB_NAME="versatile-pb" CONFIG_ARCH_VERSATILE=y +CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x80000 CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y +CONFIG_PBL_IMAGE=y +CONFIG_PBL_RELOCATABLE=y CONFIG_PROMPT="versatilepb> " -CONFIG_GLOB=y CONFIG_HUSH_FANCY_PROMPT=y CONFIG_CMDLINE_EDITING=y CONFIG_AUTO_COMPLETE=y CONFIG_MENU=y +CONFIG_CONSOLE_ACTIVATE_ALL=y CONFIG_PARTITION=y -CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y +CONFIG_DEFAULT_COMPRESSION_GZIP=y +CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/versatile/env" +CONFIG_CMD_DMESG=y CONFIG_LONGHELP=y CONFIG_CMD_IOMEM=y CONFIG_CMD_MEMINFO=y CONFIG_CMD_BOOTM_SHOW_TYPE=y +CONFIG_CMD_BOOTM_VERBOSE=y +CONFIG_CMD_BOOTM_INITRD=y +CONFIG_CMD_BOOTM_OFTREE=y +CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y CONFIG_CMD_GO=y CONFIG_CMD_LOADB=y CONFIG_CMD_RESET=y CONFIG_CMD_PARTITION=y +CONFIG_CMD_UBIFORMAT=y CONFIG_CMD_EXPORT=y CONFIG_CMD_LOADENV=y CONFIG_CMD_PRINTENV=y +CONFIG_CMD_MAGICVAR=y +CONFIG_CMD_MAGICVAR_HELP=y CONFIG_CMD_SAVEENV=y +CONFIG_CMD_FILETYPE=y CONFIG_CMD_UNCOMPRESS=y CONFIG_CMD_SLEEP=y CONFIG_CMD_DHCP=y @@ -30,12 +43,16 @@ CONFIG_CMD_TFTP=y CONFIG_CMD_ECHO_E=y CONFIG_CMD_EDIT=y +CONFIG_CMD_LOGIN=y CONFIG_CMD_MENU=y CONFIG_CMD_MENU_MANAGEMENT=y -CONFIG_CMD_LOGIN=y CONFIG_CMD_PASSWD=y +CONFIG_CMD_SPLASH=y CONFIG_CMD_READLINE=y CONFIG_CMD_TIMEOUT=y +CONFIG_CMD_CRC=y +CONFIG_CMD_CRC_CMP=y +CONFIG_CMD_FLASH=y CONFIG_CMD_GPIO=y CONFIG_CMD_I2C=y CONFIG_CMD_OF_NODE=y @@ -51,10 +68,18 @@ CONFIG_DRIVER_NET_SMC91111=y CONFIG_I2C=y CONFIG_I2C_VERSATILE=y +CONFIG_MTD=y +CONFIG_DRIVER_CFI=y +# CONFIG_DRIVER_CFI_AMD is not set +# CONFIG_DRIVER_CFI_BANK_WIDTH_1 is not set +# CONFIG_DRIVER_CFI_BANK_WIDTH_2 is not set +CONFIG_MTD_UBI=y CONFIG_GPIO_PL061=y CONFIG_RTC_CLASS=y CONFIG_RTC_DRV_DS1307=y CONFIG_FS_CRAMFS=y +CONFIG_FS_EXT4=y CONFIG_FS_TFTP=y +CONFIG_FS_NFS=y CONFIG_SHA1=y CONFIG_SHA256=y diff --git a/arch/arm/cpu/lowlevel.S b/arch/arm/cpu/lowlevel.S index c615d5b..b76222d 100644 --- a/arch/arm/cpu/lowlevel.S +++ b/arch/arm/cpu/lowlevel.S @@ -4,23 +4,41 @@ .section ".text_bare_init_","ax" ENTRY(arm_cpu_lowlevel_init) - mov r2, lr - /* set the cpu to SVC32 mode */ + /* set the cpu to SVC32 mode, mask irq and fiq */ mrs r12, cpsr bic r12, r12, #0x1f orr r12, r12, #0xd3 msr cpsr, r12 -#if __LINUX_ARM_ARCH__ >= 7 - isb -#elif __LINUX_ARM_ARCH__ == 6 +#if __LINUX_ARM_ARCH__ >= 6 + /* + * ICIALLU: Invalidate all instruction caches to PoU, + * includes flushing of branch predictors. + * Even if the i-cache is off it might contain stale entries + * that are better discarded before enabling the cache. + * Architectually this is even possible after a cold reset. + */ + mcr p15, 0, r12, c7, c5, 0 + /* DSB, ensure completion of the invalidation */ + mcr p15, 0, r12, c7, c10, 4 + /* + * ISB, ensure instruction fetch path is in sync. + * Note that the ARM Architecture Reference Manual, ARMv7-A and ARMv7-R + * edition (ARM DDI 0406C.c) doesn't define this instruction in the + * ARMv6 part (D12.7.10). It only has: "Support of additional + * operations is IMPLEMENTATION DEFINED". + * But an earlier version of the ARMARM (ARM DDI 0100I) does define it + * as "Flush prefetch buffer (PrefetchFlush)". + */ mcr p15, 0, r12, c7, c5, 4 #endif - /* disable MMU stuff and caches */ - mrc p15, 0, r12, c1, c0, 0 - bic r12, r12 , #(CR_M | CR_C | CR_B) + /* disable MMU stuff and data/unified caches */ + mrc p15, 0, r12, c1, c0, 0 /* SCTLR */ + bic r12, r12, #(CR_M | CR_C | CR_B) bic r12, r12, #(CR_S | CR_R | CR_V) + + /* enable instruction cache */ orr r12, r12, #CR_I #if __LINUX_ARM_ARCH__ >= 6 @@ -34,7 +52,7 @@ orr r12, r12, #CR_B #endif - mcr p15, 0, r12, c1, c0, 0 + mcr p15, 0, r12, c1, c0, 0 /* SCTLR */ - mov pc, r2 + mov pc, lr ENDPROC(arm_cpu_lowlevel_init) diff --git a/arch/arm/include/asm/debug_ll_pl011.h b/arch/arm/include/asm/debug_ll_pl011.h new file mode 100644 index 0000000..db015a3 --- /dev/null +++ b/arch/arm/include/asm/debug_ll_pl011.h @@ -0,0 +1,25 @@ +#ifndef __INCLUDE_ARM_ASM_DEBUG_LL_PL011_H__ +#define __INCLUDE_ARM_ASM_DEBUG_LL_PL011_H__ + +#ifndef DEBUG_LL_UART_ADDR +#error DEBUG_LL_UART_ADDR is undefined! +#endif + +#include +#include + +static inline void PUTC_LL(char c) +{ + /* Wait until there is space in the FIFO */ + while (readl(DEBUG_LL_UART_ADDR + UART01x_FR) & UART01x_FR_TXFF) + ; + + /* Send the character */ + writel(c, DEBUG_LL_UART_ADDR + UART01x_DR); + + /* Wait to make sure it hits the line, in case we die too soon. */ + while (readl(DEBUG_LL_UART_ADDR + UART01x_FR) & UART01x_FR_TXFF) + ; +} + +#endif /* __INCLUDE_ARM_ASM_DEBUG_LL_PL011_H__ */ diff --git a/arch/arm/include/asm/system_info.h b/arch/arm/include/asm/system_info.h index 6182860..0761848 100644 --- a/arch/arm/include/asm/system_info.h +++ b/arch/arm/include/asm/system_info.h @@ -23,7 +23,7 @@ #define CPU_IS_ARM926 0x41069260 #define CPU_IS_ARM926_MASK 0xff0ffff0 -#define CPU_IS_ARM1176 0x410fb767 +#define CPU_IS_ARM1176 0x410fb760 #define CPU_IS_ARM1176_MASK 0xff0ffff0 #define CPU_IS_CORTEX_A8 0x410fc080 diff --git a/arch/arm/mach-bcm2835/include/mach/debug_ll.h b/arch/arm/mach-bcm2835/include/mach/debug_ll.h new file mode 100644 index 0000000..be93cd9 --- /dev/null +++ b/arch/arm/mach-bcm2835/include/mach/debug_ll.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2014 Antony Pavlov + * + * 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. + * + */ + +#ifndef __MACH_BCM2835_DEBUG_LL_H__ +#define __MACH_BCM2835_DEBUG_LL_H__ + +#include + +#define DEBUG_LL_UART_ADDR BCM2835_UART0_BASE + +#include + +#endif /* __MACH_BCM2835_DEBUG_LL_H__ */ diff --git a/arch/arm/mach-highbank/include/mach/debug_ll.h b/arch/arm/mach-highbank/include/mach/debug_ll.h index 4cdbb3c..1820eb1 100644 --- a/arch/arm/mach-highbank/include/mach/debug_ll.h +++ b/arch/arm/mach-highbank/include/mach/debug_ll.h @@ -7,20 +7,8 @@ #ifndef __MACH_DEBUG_LL_H__ #define __MACH_DEBUG_LL_H__ -#include -#include +#define DEBUG_LL_UART_ADDR 0xfff36000 -#define UART_BASE 0xfff36000 +#include -static inline void PUTC_LL(char c) -{ - /* Wait until there is space in the FIFO */ - while (readl(UART_BASE + UART01x_FR) & UART01x_FR_TXFF); - - /* Send the character */ - writel(c, UART_BASE + UART01x_DR); - - /* Wait to make sure it hits the line, in case we die too soon. */ - while (readl(UART_BASE + UART01x_FR) & UART01x_FR_TXFF); -} #endif diff --git a/arch/arm/mach-versatile/Kconfig b/arch/arm/mach-versatile/Kconfig index 9a1bf95..755fdc1 100644 --- a/arch/arm/mach-versatile/Kconfig +++ b/arch/arm/mach-versatile/Kconfig @@ -1,13 +1,26 @@ if ARCH_VERSATILE +config ARCH_TEXT_BASE + default 0x02000000 + +config MACH_VERSATILEPB + bool + default y + select ARM_AMBA + select CLKDEV_LOOKUP + select HAVE_DEFAULT_ENVIRONMENT_NEW + choice prompt "ARM Board type" -config MACH_VERSATILEPB +config MACH_VERSATILEPB_926T bool "ARM Versatile/PB (ARM926EJ-S)" - select ARM_AMBA - select CLKDEV_LOOKUP + select CPU_ARM926T + +config MACH_VERSATILEPB_ARM1176 + bool "ARM Versatile/PB (ARM1176)" + select CPU_ARM1176 endchoice diff --git a/arch/arm/mach-versatile/include/mach/debug_ll.h b/arch/arm/mach-versatile/include/mach/debug_ll.h index f91812b..e6ee877 100644 --- a/arch/arm/mach-versatile/include/mach/debug_ll.h +++ b/arch/arm/mach-versatile/include/mach/debug_ll.h @@ -16,19 +16,8 @@ #ifndef __MACH_DEBUG_LL_H__ #define __MACH_DEBUG_LL_H__ -#include -#include +#define DEBUG_LL_UART_ADDR 0x101F1000 -static inline void PUTC_LL(char c) -{ - /* Wait until there is space in the FIFO */ - while (readl(0x101F1000 + UART01x_FR) & UART01x_FR_TXFF); - - /* Send the character */ - writel(c, 0x101F1000 + UART01x_DR); - - /* Wait to make sure it hits the line, in case we die too soon. */ - while (readl(0x101F1000 + UART01x_FR) & UART01x_FR_TXFF); -} +#include #endif diff --git a/arch/arm/mach-vexpress/include/mach/debug_ll.h b/arch/arm/mach-vexpress/include/mach/debug_ll.h index 15d6e85..89b0692 100644 --- a/arch/arm/mach-vexpress/include/mach/debug_ll.h +++ b/arch/arm/mach-vexpress/include/mach/debug_ll.h @@ -14,20 +14,11 @@ #define DEBUG_LL_PHYS_BASE_RS1 0x1c000000 #ifdef MP -#define UART_BASE DEBUG_LL_PHYS_BASE +#define DEBUG_LL_UART_ADDR DEBUG_LL_PHYS_BASE #else -#define UART_BASE DEBUG_LL_PHYS_BASE_RS1 +#define DEBUG_LL_UART_ADDR DEBUG_LL_PHYS_BASE_RS1 #endif -static inline void PUTC_LL(char c) -{ - /* Wait until there is space in the FIFO */ - while (readl(UART_BASE + UART01x_FR) & UART01x_FR_TXFF); +#include - /* Send the character */ - writel(c, UART_BASE + UART01x_DR); - - /* Wait to make sure it hits the line, in case we die too soon. */ - while (readl(UART_BASE + UART01x_FR) & UART01x_FR_TXFF); -} #endif diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c index b6618ad..799fac8 100644 --- a/drivers/net/cpsw.c +++ b/drivers/net/cpsw.c @@ -910,6 +910,16 @@ struct eth_device *edev = &slave->edev; struct device_d *dev = &slave->dev; int ret; + struct phy_device *phy; + + phy = mdiobus_scan(&priv->miibus, priv->slaves[slave_num].phy_id); + if (IS_ERR(phy)) + return PTR_ERR(phy); + + phy->dev.device_node = priv->slaves[slave_num].dev.device_node; + ret = phy_register_device(phy); + if (ret) + return ret; sprintf(dev->name, "cpsw-slave"); dev->id = slave->slave_num; @@ -1199,22 +1209,11 @@ mdiobus_register(&priv->miibus); for (i = 0; i < priv->num_slaves; i++) { - struct phy_device *phy; - - phy = mdiobus_scan(&priv->miibus, priv->slaves[i].phy_id); - if (IS_ERR(phy)) { - ret = PTR_ERR(phy); - goto out; - } - - phy->dev.device_node = priv->slaves[i].dev.device_node; - ret = phy_register_device(phy); - if (ret) - goto out; - ret = cpsw_slave_setup(&priv->slaves[i], i, priv); - if (ret) - goto out; + if (ret) { + dev_err(dev, "Failed to setup slave %d: %s\n", i, strerror(-ret)); + continue; + } } return 0; diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c index e611891..100688c 100644 --- a/drivers/net/smc91111.c +++ b/drivers/net/smc91111.c @@ -152,6 +152,7 @@ /* Memory Information Register */ /* BANK 0 */ #define MIR_REG 0x0008 +#define MIR_FREE_MASK 0xff00 /* Receive/Phy Control Register */ /* BANK 0 */ @@ -953,6 +954,30 @@ return 0; } +static void smc91c111_ensure_freemem(struct eth_device *edev) +{ + struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv; + u16 mir, rxfifo; + + SMC_SELECT_BANK(priv, 0); + mir = SMC_inw(priv, MIR_REG); + SMC_SELECT_BANK(priv, 2); + + if ((mir & MIR_FREE_MASK) == 0) { + do { + SMC_outw(priv, MC_RELEASE, MMU_CMD_REG); + smc_wait_mmu_release_complete(priv); + + SMC_SELECT_BANK(priv, 0); + mir = SMC_inw(priv, MIR_REG); + SMC_SELECT_BANK(priv, 2); + rxfifo = SMC_inw(priv, RXFIFO_REG); + dev_dbg(&edev->dev, "%s: card memory saturated, tidying up (rx_tx_fifo=0x%04x mir=0x%04x)\n", + SMC_DEV_NAME, rxfifo, mir); + } while (!(rxfifo & RXFIFO_REMPTY)); + } +} + static int smc91c111_eth_send(struct eth_device *edev, void *packet, int packet_length) { @@ -994,6 +1019,7 @@ return -EOVERFLOW; } + smc91c111_ensure_freemem(edev); /* now, try to allocate the memory */ SMC_SELECT_BANK(priv, 2); SMC_outw(priv, MC_ALLOC | numPages, MMU_CMD_REG);