summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/beaglebone
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-11-22 15:24:44 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-12-10 14:35:34 +0100
commit9dd7b7a0f2c41e29a45dc9886c1c438364da45c8 (patch)
tree7741bce1d05a4cda69007750d9996f52060a66d8 /arch/arm/boards/beaglebone
parent63ec8ab38370f892385d9e55a0a71f7ed385d61c (diff)
downloadbarebox-9dd7b7a0f2c41e29a45dc9886c1c438364da45c8.tar.gz
barebox-9dd7b7a0f2c41e29a45dc9886c1c438364da45c8.tar.xz
ARM: beaglebone: Switch to devicetree and multiimage
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/boards/beaglebone')
-rw-r--r--arch/arm/boards/beaglebone/beaglebone.h2
-rw-r--r--arch/arm/boards/beaglebone/board.c125
-rw-r--r--arch/arm/boards/beaglebone/lowlevel.c67
3 files changed, 62 insertions, 132 deletions
diff --git a/arch/arm/boards/beaglebone/beaglebone.h b/arch/arm/boards/beaglebone/beaglebone.h
index 25c5b0eebc..a4f48e5b0b 100644
--- a/arch/arm/boards/beaglebone/beaglebone.h
+++ b/arch/arm/boards/beaglebone/beaglebone.h
@@ -1,6 +1,8 @@
#ifndef __BOARD_BEAGLEBONE_H
#define __BOARD_BEAGLEBONE_H
+#include <mach/am33xx-generic.h>
+
static inline int is_beaglebone_black(void)
{
return am33xx_get_cpu_rev() != AM335X_ES1_0;
diff --git a/arch/arm/boards/beaglebone/board.c b/arch/arm/boards/beaglebone/board.c
index dfeb47cee2..439c4c21f8 100644
--- a/arch/arm/boards/beaglebone/board.c
+++ b/arch/arm/boards/beaglebone/board.c
@@ -22,150 +22,41 @@
*/
#include <common.h>
-#include <console.h>
#include <init.h>
#include <driver.h>
#include <envfs.h>
#include <environment.h>
#include <globalvar.h>
#include <sizes.h>
-#include <io.h>
-#include <ns16550.h>
#include <net.h>
#include <bootsource.h>
#include <asm/armlinux.h>
#include <generated/mach-types.h>
#include <mach/am33xx-silicon.h>
-#include <mach/am33xx-clock.h>
-#include <mach/sdrc.h>
#include <mach/sys_info.h>
#include <mach/syslib.h>
#include <mach/gpmc.h>
-#include <mach/ehci.h>
-#include <i2c/i2c.h>
#include <linux/err.h>
-#include <linux/phy.h>
-#include <usb/ehci.h>
-#include <mach/am33xx-devices.h>
-#include <mach/am33xx-mux.h>
-#include <mach/wdt.h>
-#include <mach/am33xx-generic.h>
-#include <mach/cpsw.h>
#include "beaglebone.h"
-#ifdef CONFIG_DRIVER_SERIAL_NS16550
-
-/**
- * @brief UART serial port initialization - remember to enable COM clocks in
- * arch
- *
- * @return result of device registration
- */
-static int beaglebone_console_init(void)
-{
- barebox_set_model("Texas Instruments beaglebone");
- barebox_set_hostname("beaglebone");
-
- am33xx_add_uart0();
-
- return 0;
-}
-console_initcall(beaglebone_console_init);
-#endif /* CONFIG_DRIVER_SERIAL_NS16550 */
-
-static int beaglebone_mem_init(void)
-{
- if (is_beaglebone_black())
- omap_add_ram0(SZ_512M);
- else
- omap_add_ram0(SZ_256M);
-
- return 0;
-}
-mem_initcall(beaglebone_mem_init);
-
-static struct cpsw_slave_data cpsw_slaves[] = {
- {
- .phy_id = 0,
- .phy_if = PHY_INTERFACE_MODE_MII,
- },
-};
-
-static struct cpsw_platform_data cpsw_data = {
- .slave_data = cpsw_slaves,
- .num_slaves = ARRAY_SIZE(cpsw_slaves),
-};
-
-static void beaglebone_eth_init(void)
-{
- am33xx_register_ethaddr(0, 0);
-
- writel(0, AM33XX_MAC_MII_SEL);
-
- am33xx_enable_mii1_pin_mux();
-
- am33xx_add_cpsw(&cpsw_data);
-}
-
-static struct i2c_board_info i2c0_devices[] = {
- {
- I2C_BOARD_INFO("24c256", 0x50)
- },
-};
-
-static const __maybe_unused struct module_pin_mux mmc1_pin_mux[] = {
- {OFFSET(gpmc_ad0), (MODE(1) | RXACTIVE)}, /* MMC1_DAT0 */
- {OFFSET(gpmc_ad1), (MODE(1) | RXACTIVE)}, /* MMC1_DAT1 */
- {OFFSET(gpmc_ad2), (MODE(1) | RXACTIVE)}, /* MMC1_DAT2 */
- {OFFSET(gpmc_ad3), (MODE(1) | RXACTIVE)}, /* MMC1_DAT3 */
- {OFFSET(gpmc_ad4), (MODE(1) | RXACTIVE)}, /* MMC1_DAT4 */
- {OFFSET(gpmc_ad5), (MODE(1) | RXACTIVE)}, /* MMC1_DAT5 */
- {OFFSET(gpmc_ad6), (MODE(1) | RXACTIVE)}, /* MMC1_DAT6 */
- {OFFSET(gpmc_ad7), (MODE(1) | RXACTIVE)}, /* MMC1_DAT7 */
- {OFFSET(gpmc_csn1), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CLK */
- {OFFSET(gpmc_csn2), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CMD */
- {-1},
-};
-
-static struct omap_hsmmc_platform_data beaglebone_sd = {
- .devname = "sd",
-};
-
-static struct omap_hsmmc_platform_data beaglebone_emmc = {
- .devname = "emmc",
-};
-
static int beaglebone_devices_init(void)
{
- am33xx_enable_mmc0_pin_mux();
- am33xx_add_mmc0(&beaglebone_sd);
+ int black;
- if (is_beaglebone_black()) {
- configure_module_pin_mux(mmc1_pin_mux);
- am33xx_add_mmc1(&beaglebone_emmc);
- }
+ if (!of_machine_is_compatible("ti,am335x-bone"))
+ return 0;
if (bootsource_get() == BOOTSOURCE_MMC) {
if (bootsource_get_instance() == 0)
- omap_set_bootmmc_devname("sd");
+ omap_set_bootmmc_devname("mmc0");
else
- omap_set_bootmmc_devname("emmc");
+ omap_set_bootmmc_devname("mmc1");
}
- am33xx_enable_i2c0_pin_mux();
- i2c_register_board_info(0, i2c0_devices, ARRAY_SIZE(i2c0_devices));
- am33xx_add_i2c0(NULL);
-
- beaglebone_eth_init();
-
- return 0;
-}
-device_initcall(beaglebone_devices_init);
+ am33xx_register_ethaddr(0, 0);
-static int beaglebone_env_init(void)
-{
- int black = is_beaglebone_black();
+ black = is_beaglebone_black();
globalvar_add_simple("board.variant", black ? "boneblack" : "bone");
@@ -176,4 +67,4 @@ static int beaglebone_env_init(void)
return 0;
}
-late_initcall(beaglebone_env_init);
+coredevice_initcall(beaglebone_devices_init);
diff --git a/arch/arm/boards/beaglebone/lowlevel.c b/arch/arm/boards/beaglebone/lowlevel.c
index 992e3e4046..92389a9557 100644
--- a/arch/arm/boards/beaglebone/lowlevel.c
+++ b/arch/arm/boards/beaglebone/lowlevel.c
@@ -1,6 +1,7 @@
#include <init.h>
#include <sizes.h>
#include <io.h>
+#include <linux/string.h>
#include <debug_ll.h>
#include <asm/barebox-arm-head.h>
#include <asm/barebox-arm.h>
@@ -102,6 +103,11 @@ static const struct am33xx_emif_regs ddr3_regs = {
.sdram_ref_ctrl = 0xC30,
};
+extern char __dtb_am335x_boneblack_start[];
+extern char __dtb_am335x_boneblack_end[];
+extern char __dtb_am335x_bone_start[];
+extern char __dtb_am335x_bone_end[];
+
/**
* @brief The basic entry point for board initialization.
*
@@ -111,8 +117,22 @@ static const struct am33xx_emif_regs ddr3_regs = {
*
* @return void
*/
-static int beaglebone_board_init(void)
+static noinline int beaglebone_sram_init(void)
{
+ uint32_t fdt, fdt_end, sdram_start, sdram_size;
+
+ sdram_start = 0x80000000;
+
+ if (is_beaglebone_black()) {
+ sdram_size = SZ_512M;
+ fdt = (uint32_t)__dtb_am335x_boneblack_start;
+ fdt_end = (uint32_t)__dtb_am335x_boneblack_end;
+ } else {
+ sdram_size = SZ_256M;
+ fdt = (uint32_t)__dtb_am335x_bone_start;
+ fdt_end = (uint32_t)__dtb_am335x_bone_end;
+ }
+
/* WDT1 is already running when the bootloader gets control
* Disable it to avoid "random" resets
*/
@@ -121,9 +141,6 @@ static int beaglebone_board_init(void)
__raw_writel(WDT_DISABLE_CODE2, AM33XX_WDT_REG(WSPR));
while(__raw_readl(AM33XX_WDT_REG(WWPS)) != 0x0);
- if (am33xx_running_in_sdram())
- return 0;
-
/* Setup the PLLs and the clocks for the peripherals */
if (is_beaglebone_black()) {
am33xx_pll_init(MPUPLL_M_500, 24, DDRPLL_M_400);
@@ -140,23 +157,43 @@ static int beaglebone_board_init(void)
omap_uart_lowlevel_init((void *)AM33XX_UART0_BASE);
putc_ll('>');
- return 0;
+ /*
+ * Copy the devicetree blob to sdram so that the barebox code finds it
+ * inside valid SDRAM instead of SRAM.
+ */
+ memcpy((void *)sdram_start, (void *)fdt, fdt_end - fdt);
+ fdt = sdram_start;
+
+ barebox_arm_entry(sdram_start, sdram_size, fdt);
}
-void __bare_init __naked barebox_arm_reset_vector(uint32_t *data)
+ENTRY_FUNCTION(start_am33xx_beaglebone_sram, bootinfo, r1, r2)
{
- unsigned sdram;
+ am33xx_save_bootinfo((void *)bootinfo);
+
+ /*
+ * Setup C environment, the board init code uses global variables.
+ * Stackpointer has already been initialized by the ROM code.
+ */
+ relocate_to_current_adr();
+ setup_c();
- am33xx_save_bootinfo(data);
+ beaglebone_sram_init();
+}
- arm_cpu_lowlevel_init();
+ENTRY_FUNCTION(start_am33xx_beaglebone_sdram, r0, r1, r2)
+{
+ uint32_t fdt, sdram_size;
- beaglebone_board_init();
+ if (is_beaglebone_black()) {
+ sdram_size = SZ_512M;
+ fdt = (uint32_t)__dtb_am335x_boneblack_start;
+ } else {
+ sdram_size = SZ_256M;
+ fdt = (uint32_t)__dtb_am335x_bone_start;
+ }
- if (is_beaglebone_black())
- sdram = SZ_512M;
- else
- sdram = SZ_256M;
+ fdt -= get_runtime_offset();
- barebox_arm_entry(0x80000000, sdram, 0);
+ barebox_arm_entry(0x80000000, sdram_size, fdt);
}