mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH] Add support for Baltos systems
@ 2016-05-27 13:48 yegorslists
  2016-05-30  5:33 ` Sascha Hauer
  2016-05-31 18:46 ` Trent Piepho
  0 siblings, 2 replies; 7+ messages in thread
From: yegorslists @ 2016-05-27 13:48 UTC (permalink / raw)
  To: barebox

From: Yegor Yefremov <yegorslists@googlemail.com>

OnRISC Baltos devices are based on a am335x SoC and can be booted
either from MMC or NAND.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
---
 arch/arm/boards/Makefile                |   1 +
 arch/arm/boards/vscom-baltos/Makefile   |   2 +
 arch/arm/boards/vscom-baltos/board.c    | 170 +++++++++++++
 arch/arm/boards/vscom-baltos/lowlevel.c | 116 +++++++++
 arch/arm/dts/Makefile                   |   1 +
 arch/arm/dts/am335x-baltos-minimal.dts  | 439 ++++++++++++++++++++++++++++++++
 arch/arm/mach-omap/Kconfig              |   7 +
 images/Makefile.am33xx                  |   8 +
 8 files changed, 744 insertions(+)
 create mode 100644 arch/arm/boards/vscom-baltos/Makefile
 create mode 100644 arch/arm/boards/vscom-baltos/board.c
 create mode 100644 arch/arm/boards/vscom-baltos/lowlevel.c
 create mode 100644 arch/arm/dts/am335x-baltos-minimal.dts

diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile
index 9241b66..9bf3154 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -135,3 +135,4 @@ obj-$(CONFIG_MACH_VIRT2REAL)			+= virt2real/
 obj-$(CONFIG_MACH_ZEDBOARD)			+= avnet-zedboard/
 obj-$(CONFIG_MACH_ZYLONITE)			+= zylonite/
 obj-$(CONFIG_MACH_VARISCITE_MX6)		+= variscite-mx6/
+obj-$(CONFIG_MACH_VSCOM_BALTOS)			+= vscom-baltos/
diff --git a/arch/arm/boards/vscom-baltos/Makefile b/arch/arm/boards/vscom-baltos/Makefile
new file mode 100644
index 0000000..092c31d
--- /dev/null
+++ b/arch/arm/boards/vscom-baltos/Makefile
@@ -0,0 +1,2 @@
+lwl-y += lowlevel.o
+obj-y += board.o
diff --git a/arch/arm/boards/vscom-baltos/board.c b/arch/arm/boards/vscom-baltos/board.c
new file mode 100644
index 0000000..1027a1e
--- /dev/null
+++ b/arch/arm/boards/vscom-baltos/board.c
@@ -0,0 +1,170 @@
+/*
+ * (C) Copyright 2008
+ * Texas Instruments, <www.ti.com>
+ * Raghavendra KH <r-khandenahally@ti.com>
+ *
+ * Copyright (C) 2012 Jan Luebbe <j.luebbe@pengutronix.de>
+ *
+ * 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.
+ */
+
+/**
+ * @file
+ * @brief OnRISC Baltos Specific Board Initialization routines
+ */
+
+#include <common.h>
+#include <init.h>
+#include <driver.h>
+#include <envfs.h>
+#include <environment.h>
+#include <globalvar.h>
+#include <linux/sizes.h>
+#include <net.h>
+#include <envfs.h>
+#include <bootsource.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <mach/am33xx-generic.h>
+#include <mach/am33xx-silicon.h>
+#include <mach/sys_info.h>
+#include <mach/syslib.h>
+#include <mach/gpmc.h>
+#include <linux/err.h>
+#include <mach/bbu.h>
+#include <libfile.h>
+
+static struct omap_barebox_part baltos_barebox_part = {
+	.nand_offset = SZ_512K,
+	.nand_size = 0x1e0000,
+};
+
+typedef struct _BSP_VS_HWPARAM
+{
+        uint32_t Magic;
+        uint32_t HwRev;
+        uint32_t SerialNumber;
+        char PrdDate[11];
+        uint16_t SystemId;
+        uint8_t MAC1[6];
+        uint8_t MAC2[6];
+        uint8_t MAC3[6];
+} __attribute__ ((packed)) BSP_VS_HWPARAM;
+
+BSP_VS_HWPARAM hw_param;
+
+static void baltos_validate_eeprom(void)
+{
+	printf("Baltos: incorrect magic number (0x%x) in EEPROM\n",
+			hw_param.Magic);
+
+	/* fill default values */
+	hw_param.SystemId = 210;
+
+	hw_param.MAC1[0] = 0x00;
+	hw_param.MAC1[1] = 0x00;
+	hw_param.MAC1[2] = 0x00;
+	hw_param.MAC1[3] = 0x00;
+	hw_param.MAC1[4] = 0x00;
+	hw_param.MAC1[5] = 0x01;
+
+	hw_param.MAC2[0] = 0x00;
+	hw_param.MAC2[1] = 0x00;
+	hw_param.MAC2[2] = 0x00;
+	hw_param.MAC2[3] = 0x00;
+	hw_param.MAC2[4] = 0x00;
+	hw_param.MAC2[5] = 0x02;
+
+	hw_param.MAC3[0] = 0x00;
+	hw_param.MAC3[1] = 0x00;
+	hw_param.MAC3[2] = 0x00;
+	hw_param.MAC3[3] = 0x00;
+	hw_param.MAC3[4] = 0x00;
+	hw_param.MAC3[5] = 0x03;
+}
+
+static int baltos_read_eeprom(void)
+{
+	size_t size;
+	char *buf, var_buf[32];
+	int rc;
+	unsigned char mac_addr[6];
+
+	rc = read_file_2("/dev/eeprom0", &size, (void *)&buf, sizeof(hw_param));
+	if (rc && rc != -EFBIG) {
+		return rc;
+	}
+
+	memcpy(&hw_param, buf, sizeof(hw_param));
+
+	free(buf);
+
+	if (hw_param.Magic != 0xDEADBEEF) {
+		baltos_validate_eeprom();
+	}
+
+	sprintf(var_buf, "%d", hw_param.SystemId);
+	globalvar_add_simple("board.id", var_buf);
+
+	/* setup MAC1 */
+	mac_addr[0] = hw_param.MAC1[0];
+	mac_addr[1] = hw_param.MAC1[1];
+	mac_addr[2] = hw_param.MAC1[2];
+	mac_addr[3] = hw_param.MAC1[3];
+	mac_addr[4] = hw_param.MAC1[4];
+	mac_addr[5] = hw_param.MAC1[5];
+
+	eth_register_ethaddr(0, mac_addr);
+
+	/* setup MAC2 */
+	mac_addr[0] = hw_param.MAC2[0];
+	mac_addr[1] = hw_param.MAC2[1];
+	mac_addr[2] = hw_param.MAC2[2];
+	mac_addr[3] = hw_param.MAC2[3];
+	mac_addr[4] = hw_param.MAC2[4];
+	mac_addr[5] = hw_param.MAC2[5];
+
+	eth_register_ethaddr(1, mac_addr);
+
+	return 0;
+}
+environment_initcall(baltos_read_eeprom);
+
+static int baltos_mem_init(void)
+{
+	uint32_t sdram_size;
+
+	if (!of_machine_is_compatible("vscom,onrisc"))
+		return 0;
+
+	sdram_size = SZ_256M;
+
+	arm_add_mem_device("ram0", 0x80000000, sdram_size);
+
+	return 0;
+}
+mem_initcall(baltos_mem_init);
+
+static int baltos_devices_init(void)
+{
+	if (!of_machine_is_compatible("vscom,onrisc"))
+		return 0;
+
+	globalvar_add_simple("board.variant", "baltos");
+
+	omap_set_barebox_part(&baltos_barebox_part);
+
+	if (IS_ENABLED(CONFIG_SHELL_NONE))
+		return am33xx_of_register_bootdevice();
+
+	return 0;
+}
+coredevice_initcall(baltos_devices_init);
diff --git a/arch/arm/boards/vscom-baltos/lowlevel.c b/arch/arm/boards/vscom-baltos/lowlevel.c
new file mode 100644
index 0000000..6acbdb9
--- /dev/null
+++ b/arch/arm/boards/vscom-baltos/lowlevel.c
@@ -0,0 +1,116 @@
+#include <init.h>
+#include <linux/sizes.h>
+#include <io.h>
+#include <linux/string.h>
+#include <debug_ll.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <mach/am33xx-silicon.h>
+#include <mach/am33xx-clock.h>
+#include <mach/generic.h>
+#include <mach/sdrc.h>
+#include <mach/sys_info.h>
+#include <mach/syslib.h>
+#include <mach/am33xx-mux.h>
+#include <mach/am33xx-generic.h>
+#include <mach/wdt.h>
+
+static const struct am33xx_ddr_data ddr3_data = {
+	.rd_slave_ratio0        = 0x38,
+	.wr_dqs_slave_ratio0    = 0x44,
+	.fifo_we_slave_ratio0	= 0x94,
+	.wr_slave_ratio0        = 0x7D,
+	.use_rank0_delay	= 0x01,
+	.dll_lock_diff0		= 0x0,
+};
+
+static const struct am33xx_cmd_control ddr3_cmd_ctrl = {
+	.slave_ratio0	= 0x80,
+	.dll_lock_diff0	= 0x1,
+	.invert_clkout0	= 0x0,
+	.slave_ratio1	= 0x80,
+	.dll_lock_diff1	= 0x1,
+	.invert_clkout1	= 0x0,
+	.slave_ratio2	= 0x80,
+	.dll_lock_diff2	= 0x1,
+	.invert_clkout2	= 0x0,
+};
+
+static const struct am33xx_emif_regs ddr3_regs = {
+	.emif_read_latency	= 0x100007,
+	.emif_tim1		= 0x0AAAD4DB,
+	.emif_tim2		= 0x266B7FDA,
+	.emif_tim3		= 0x501F867F,
+	.zq_config		= 0x50074BE4,
+	.sdram_config		= 0x61C05332,
+	.sdram_config2		= 0x0,
+	.sdram_ref_ctrl		= 0xC30,
+};
+
+extern char __dtb_am335x_baltos_minimal_start[];
+
+/**
+ * @brief The basic entry point for board initialization.
+ *
+ * This is called as part of machine init (after arch init).
+ * This is again called with stack in SRAM, so not too many
+ * constructs possible here.
+ *
+ * @return void
+ */
+static noinline int baltos_sram_init(void)
+{
+	uint32_t sdram_size;
+	void *fdt;
+
+	fdt = __dtb_am335x_baltos_minimal_start;
+
+	sdram_size = SZ_256M;
+
+	/* WDT1 is already running when the bootloader gets control
+	 * Disable it to avoid "random" resets
+	 */
+	__raw_writel(WDT_DISABLE_CODE1, AM33XX_WDT_REG(WSPR));
+	while(__raw_readl(AM33XX_WDT_REG(WWPS)) != 0x0);
+	__raw_writel(WDT_DISABLE_CODE2, AM33XX_WDT_REG(WSPR));
+	while(__raw_readl(AM33XX_WDT_REG(WWPS)) != 0x0);
+
+	/* Setup the PLLs and the clocks for the peripherals */
+	am33xx_pll_init(MPUPLL_M_500, DDRPLL_M_400);
+	am335x_sdram_init(0x18B, &ddr3_cmd_ctrl, &ddr3_regs,
+			&ddr3_data);
+
+	am33xx_uart_soft_reset((void *)AM33XX_UART0_BASE);
+	am33xx_enable_uart0_pin_mux();
+	omap_uart_lowlevel_init((void *)AM33XX_UART0_BASE);
+	putc_ll('>');
+
+	barebox_arm_entry(0x80000000, sdram_size, fdt);
+}
+
+ENTRY_FUNCTION(start_am33xx_baltos_sram, bootinfo, r1, r2)
+{
+	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();
+
+	baltos_sram_init();
+}
+
+ENTRY_FUNCTION(start_am33xx_baltos_sdram, r0, r1, r2)
+{
+	uint32_t sdram_size;
+	void *fdt;
+
+	sdram_size = SZ_256M;
+	fdt = __dtb_am335x_baltos_minimal_start;
+
+	fdt -= get_runtime_offset();
+
+	barebox_arm_entry(0x80000000, sdram_size, fdt);
+}
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 813e098..0bfd17d 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -75,5 +75,6 @@ pbl-dtb-$(CONFIG_MACH_TX6X) += imx6q-tx6q.dtb.o
 pbl-dtb-$(CONFIG_MACH_UDOO) += imx6q-udoo.dtb.o
 pbl-dtb-$(CONFIG_MACH_USI_TOPKICK) += kirkwood-topkick-bb.dtb.o
 pbl-dtb-$(CONFIG_MACH_VARISCITE_MX6) += imx6q-var-custom.dtb.o
+pbl-dtb-$(CONFIG_MACH_VSCOM_BALTOS) += am335x-baltos-minimal.dtb.o
 
 clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.lzo
diff --git a/arch/arm/dts/am335x-baltos-minimal.dts b/arch/arm/dts/am335x-baltos-minimal.dts
new file mode 100644
index 0000000..13eb91c
--- /dev/null
+++ b/arch/arm/dts/am335x-baltos-minimal.dts
@@ -0,0 +1,439 @@
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * 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.
+ */
+
+/*
+ * VScom OnRISC
+ * http://www.vscom.de
+ */
+
+/dts-v1/;
+
+#include "am33xx.dtsi"
+#include <dt-bindings/pwm/pwm.h>
+
+/ {
+	model = "OnRISC Baltos";
+	compatible = "vscom,onrisc", "ti,am33xx";
+
+	chosen {
+		linux,stdout-path = &uart0;
+	};
+
+	cpus {
+		cpu@0 {
+			cpu0-supply = <&vdd1_reg>;
+		};
+	};
+
+	vbat: fixedregulator@0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vbat";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		regulator-boot-on;
+	};
+};
+
+&am33xx_pinmux {
+	mmc1_pins: pinmux_mmc1_pins {
+		pinctrl-single,pins = <
+			0xf0 (MUX_MODE0 | INPUT_EN | PULL_UP)	/* mmc0_dat3.mmc0_dat3 */
+			0xf4 (MUX_MODE0 | INPUT_EN | PULL_UP)	/* mmc0_dat2.mmc0_dat2 */
+			0xf8 (MUX_MODE0 | INPUT_EN | PULL_UP)	/* mmc0_dat1.mmc0_dat1 */
+			0xfc (MUX_MODE0 | INPUT_EN | PULL_UP)	/* mmc0_dat0.mmc0_dat0 */
+			0x100 (MUX_MODE0 | INPUT_EN | PULL_UP)	/* mmc0_clk.mmc0_clk */
+			0x104 (MUX_MODE0 | INPUT_EN | PULL_UP)	/* mmc0_cmd.mmc0_cmd */
+		>;
+	};
+
+	i2c1_pins: pinmux_i2c1_pins {
+		pinctrl-single,pins = <
+			0x158 0x2a      /* spi0_d1.i2c1_sda_mux3, INPUT | MODE2 */
+			0x15c 0x2a      /* spi0_cs0.i2c1_scl_mux3, INPUT | MODE2 */
+		>;
+	};
+
+	tps65910_pins: pinmux_tps65910_pins {
+		pinctrl-single,pins = <
+			0x078 (PIN_INPUT_PULLUP | MUX_MODE7)      /* gpmc_ben1.gpio1[28] */
+		>;
+
+	};
+	tca6416_pins: pinmux_tca6416_pins {
+		pinctrl-single,pins = <
+			AM33XX_IOPAD(0x9b4, PIN_INPUT_PULLUP | MUX_MODE7)      /* xdma_event_intr1.gpio0[20] tca6416 stuff */
+		>;
+	};
+
+	uart0_pins: pinmux_uart0_pins {
+		pinctrl-single,pins = <
+			0x170 (PIN_INPUT_PULLUP | MUX_MODE0)	/* uart0_rxd.uart0_rxd */
+			0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0)		/* uart0_txd.uart0_txd */
+		>;
+	};
+
+	cpsw_default: cpsw_default {
+		pinctrl-single,pins = <
+			/* Slave 1 */
+			0x10c (PIN_INPUT_PULLDOWN | MUX_MODE1)       /* mii1_crs.rmii1_crs_dv */
+			0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE1)      /* mii1_tx_en.rmii1_txen */
+			0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE1)      /* mii1_txd1.rmii1_txd1 */
+			0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE1)      /* mii1_txd0.rmii1_txd0 */
+			0x13c (PIN_INPUT_PULLDOWN | MUX_MODE1)      /* mii1_rxd1.rmii1_rxd1 */
+			0x140 (PIN_INPUT_PULLDOWN | MUX_MODE1)      /* mii1_rxd0.rmii1_rxd0 */
+			0x144 (PIN_INPUT_PULLDOWN | MUX_MODE0)      /* rmii1_ref_clk.rmii1_refclk */
+
+
+			/* Slave 2 */
+			0x40 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a0.rgmii2_tctl */
+			0x44 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a1.rgmii2_rctl */
+			0x48 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a2.rgmii2_td3 */
+			0x4c (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a3.rgmii2_td2 */
+			0x50 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a4.rgmii2_td1 */
+			0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a5.rgmii2_td0 */
+			0x58 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a6.rgmii2_tclk */
+			0x5c (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a7.rgmii2_rclk */
+			0x60 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a8.rgmii2_rd3 */
+			0x64 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a9.rgmii2_rd2 */
+			0x68 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a10.rgmii2_rd1 */
+			0x6c (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a11.rgmii2_rd0 */
+		>;
+	};
+
+	cpsw_sleep: cpsw_sleep {
+		pinctrl-single,pins = <
+			/* Slave 1 reset value */
+			0x10c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x144 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+
+			/* Slave 2 reset value*/
+			0x40 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x44 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x48 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x4c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x50 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x54 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x58 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x5c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x60 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x64 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x68 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x6c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+		>;
+	};
+
+	davinci_mdio_default: davinci_mdio_default {
+		pinctrl-single,pins = <
+			/* MDIO */
+			0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)	/* mdio_data.mdio_data */
+			0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0)			/* mdio_clk.mdio_clk */
+		>;
+	};
+
+	davinci_mdio_sleep: davinci_mdio_sleep {
+		pinctrl-single,pins = <
+			/* MDIO reset value */
+			0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+			0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+		>;
+	};
+
+	nandflash_pins_s0: nandflash_pins_s0 {
+		pinctrl-single,pins = <
+			0x0 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad0.gpmc_ad0 */
+			0x4 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad1.gpmc_ad1 */
+			0x8 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad2.gpmc_ad2 */
+			0xc (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad3.gpmc_ad3 */
+			0x10 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad4.gpmc_ad4 */
+			0x14 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad5.gpmc_ad5 */
+			0x18 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad6.gpmc_ad6 */
+			0x1c (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad7.gpmc_ad7 */
+			0x70 (PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_wait0.gpmc_wait0 */
+			0x74 (PIN_INPUT_PULLUP | MUX_MODE7)	/* gpmc_wpn.gpio0_30 */
+			0x7c (PIN_OUTPUT | MUX_MODE0)		/* gpmc_csn0.gpmc_csn0  */
+			0x90 (PIN_OUTPUT | MUX_MODE0)		/* gpmc_advn_ale.gpmc_advn_ale */
+			0x94 (PIN_OUTPUT | MUX_MODE0)		/* gpmc_oen_ren.gpmc_oen_ren */
+			0x98 (PIN_OUTPUT | MUX_MODE0)		/* gpmc_wen.gpmc_wen */
+			0x9c (PIN_OUTPUT | MUX_MODE0)		/* gpmc_be0n_cle.gpmc_be0n_cle */
+		>;
+	};
+};
+
+&elm {
+	status = "okay";
+};
+
+&gpmc {
+	pinctrl-names = "default";
+	pinctrl-0 = <&nandflash_pins_s0>;
+	ranges = <0 0 0x08000000 0x10000000>;	/* CS0: NAND */
+	status = "okay";
+
+	nand@0,0 {
+		reg = <0 0 0>; /* CS0, offset 0 */
+		nand-bus-width = <8>;
+		ti,nand-ecc-opt = "bch8";
+		ti,nand-xfer-type = "polled";
+
+		gpmc,device-nand = "true";
+		gpmc,device-width = <1>;
+		gpmc,sync-clk-ps = <0>;
+		gpmc,cs-on-ns = <0>;
+		gpmc,cs-rd-off-ns = <44>;
+		gpmc,cs-wr-off-ns = <44>;
+		gpmc,adv-on-ns = <6>;
+		gpmc,adv-rd-off-ns = <34>;
+		gpmc,adv-wr-off-ns = <44>;
+		gpmc,we-on-ns = <0>;
+		gpmc,we-off-ns = <40>;
+		gpmc,oe-on-ns = <0>;
+		gpmc,oe-off-ns = <54>;
+		gpmc,access-ns = <64>;
+		gpmc,rd-cycle-ns = <82>;
+		gpmc,wr-cycle-ns = <82>;
+		gpmc,wait-on-read = "true";
+		gpmc,wait-on-write = "true";
+		gpmc,bus-turnaround-ns = <0>;
+		gpmc,cycle2cycle-delay-ns = <0>;
+		gpmc,clk-activation-ns = <0>;
+		gpmc,wait-monitoring-ns = <0>;
+		gpmc,wr-access-ns = <40>;
+		gpmc,wr-data-mux-bus-ns = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+		elm_id = <&elm>;
+
+		boot@0 {
+		       label = "SPL";
+		       reg = <0x0 0x20000>;
+		};
+		boot@20000{
+		       label = "SPL.backup1";
+		       reg = <0x20000 0x20000>;
+		};
+		boot@40000 {
+		       label = "SPL.backup2";
+		       reg = <0x40000 0x20000>;
+		};
+		boot@60000 {
+		       label = "SPL.backup3";
+		       reg = <0x60000 0x20000>;
+		};
+		boot@80000 {
+		       label = "u-boot";
+		       reg = <0x80000 0x1e0000>;
+		};
+		boot@260000 {
+		       label = "UBI";
+		       reg = <0x260000 0xfda0000>;
+		};
+	};
+};
+
+&uart0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart0_pins>;
+
+	status = "okay";
+};
+
+&i2c1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&i2c1_pins>;
+
+	status = "okay";
+	clock-frequency = <1000>;
+
+	tps: tps@2d {
+		reg = <0x2d>;
+		gpio-controller;
+		#gpio-cells = <2>;
+		interrupt-parent = <&gpio1>;
+		interrupts = <28 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&tps65910_pins>;
+	};
+
+	at24@50 {
+		compatible = "at24,24c02";
+		pagesize = <8>;
+		reg = <0x50>;
+	};
+
+	tca6416: gpio@20 {
+		compatible = "ti,tca6416";
+		reg = <0x20>;
+		gpio-controller;
+		#gpio-cells = <2>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <20 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&tca6416_pins>;
+	};
+};
+
+&usb {
+	status = "okay";
+};
+
+&usb_ctrl_mod {
+	status = "okay";
+};
+
+&usb0_phy {
+	status = "okay";
+};
+
+&usb1_phy {
+	status = "okay";
+};
+
+&usb0 {
+	status = "okay";
+	dr_mode = "host";
+};
+
+&usb1 {
+	status = "okay";
+	dr_mode = "host";
+};
+
+&cppi41dma  {
+	status = "okay";
+};
+
+/include/ "tps65910.dtsi"
+
+&tps {
+	vcc1-supply = <&vbat>;
+	vcc2-supply = <&vbat>;
+	vcc3-supply = <&vbat>;
+	vcc4-supply = <&vbat>;
+	vcc5-supply = <&vbat>;
+	vcc6-supply = <&vbat>;
+	vcc7-supply = <&vbat>;
+	vccio-supply = <&vbat>;
+
+	ti,en-ck32k-xtal = <1>;
+
+	regulators {
+		vrtc_reg: regulator@0 {
+			regulator-always-on;
+		};
+
+		vio_reg: regulator@1 {
+			regulator-always-on;
+		};
+
+		vdd1_reg: regulator@2 {
+			/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
+			regulator-name = "vdd_mpu";
+			regulator-min-microvolt = <912500>;
+			regulator-max-microvolt = <1312500>;
+			regulator-boot-on;
+			regulator-always-on;
+		};
+
+		vdd2_reg: regulator@3 {
+			/* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
+			regulator-name = "vdd_core";
+			regulator-min-microvolt = <912500>;
+			regulator-max-microvolt = <1150000>;
+			regulator-boot-on;
+			regulator-always-on;
+		};
+
+		vdd3_reg: regulator@4 {
+			regulator-always-on;
+		};
+
+		vdig1_reg: regulator@5 {
+			regulator-always-on;
+		};
+
+		vdig2_reg: regulator@6 {
+			regulator-always-on;
+		};
+
+		vpll_reg: regulator@7 {
+			regulator-always-on;
+		};
+
+		vdac_reg: regulator@8 {
+			regulator-always-on;
+		};
+
+		vaux1_reg: regulator@9 {
+			regulator-always-on;
+		};
+
+		vaux2_reg: regulator@10 {
+			regulator-always-on;
+		};
+
+		vaux33_reg: regulator@11 {
+			regulator-always-on;
+		};
+
+		vmmc_reg: regulator@12 {
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <3300000>;
+			regulator-always-on;
+		};
+	};
+};
+
+&mac {
+	pinctrl-names = "default", "sleep";
+	pinctrl-0 = <&cpsw_default>;
+	pinctrl-1 = <&cpsw_sleep>;
+	dual_emac = <1>;
+
+	status = "okay";
+};
+
+&davinci_mdio {
+	pinctrl-names = "default", "sleep";
+	pinctrl-0 = <&davinci_mdio_default>;
+	pinctrl-1 = <&davinci_mdio_sleep>;
+
+	status = "okay";
+};
+
+&cpsw_emac0 {
+	phy_id = <&davinci_mdio>, <0>;
+	phy-mode = "rmii";
+	dual_emac_res_vlan = <1>;
+};
+
+&cpsw_emac1 {
+	phy_id = <&davinci_mdio>, <7>;
+	phy-mode = "rgmii-txid";
+	dual_emac_res_vlan = <2>;
+};
+
+&phy_sel {
+	rmii-clock-ext = <1>;
+};
+
+&mmc1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&mmc1_pins>;
+	vmmc-supply = <&vmmc_reg>;
+	status = "okay";
+};
+
+&gpio0 {
+	ti,no-reset-on-init;
+};
diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
index d7c863c..a1bb8f0 100644
--- a/arch/arm/mach-omap/Kconfig
+++ b/arch/arm/mach-omap/Kconfig
@@ -184,6 +184,13 @@ config MACH_PHYTEC_SOM_AM335X
 	select ARCH_AM33XX
 	help
 	  Say Y here if you are using a am335x based Phytecs SOM
+
+config MACH_VSCOM_BALTOS
+	bool "VScom Baltos Devices"
+	select ARCH_AM33XX
+	help
+	  Say Y here if you are using a am335x based VScom Baltos devices
+
 endif
 
 choice
diff --git a/images/Makefile.am33xx b/images/Makefile.am33xx
index 8be78ef..8168fe4 100644
--- a/images/Makefile.am33xx
+++ b/images/Makefile.am33xx
@@ -135,6 +135,14 @@ pblx-$(CONFIG_MACH_BEAGLEBONE) += start_am33xx_beaglebone_sram
 FILE_barebox-am33xx-beaglebone-mlo.img = start_am33xx_beaglebone_sram.pblx.mlo
 am33xx-mlo-$(CONFIG_MACH_BEAGLEBONE) += barebox-am33xx-beaglebone-mlo.img
 
+pblx-$(CONFIG_MACH_VSCOM_BALTOS) += start_am33xx_baltos_sdram
+FILE_barebox-am33xx-baltos.img = start_am33xx_baltos_sdram.pblx
+am33xx-barebox-$(CONFIG_MACH_VSCOM_BALTOS) += barebox-am33xx-baltos.img
+
+pblx-$(CONFIG_MACH_VSCOM_BALTOS) += start_am33xx_baltos_sram
+FILE_barebox-am33xx-baltos-mlo.img = start_am33xx_baltos_sram.pblx.mlo
+am33xx-mlo-$(CONFIG_MACH_VSCOM_BALTOS) += barebox-am33xx-baltos-mlo.img
+
 ifdef CONFIG_OMAP_BUILD_IFT
 image-y += $(am33xx-mlo-y)
 else
-- 
2.1.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add support for Baltos systems
  2016-05-27 13:48 [PATCH] Add support for Baltos systems yegorslists
@ 2016-05-30  5:33 ` Sascha Hauer
  2016-05-30  9:46   ` Yegor Yefremov
  2016-05-31 18:46 ` Trent Piepho
  1 sibling, 1 reply; 7+ messages in thread
From: Sascha Hauer @ 2016-05-30  5:33 UTC (permalink / raw)
  To: yegorslists; +Cc: barebox

On Fri, May 27, 2016 at 03:48:55PM +0200, yegorslists@googlemail.com wrote:
> From: Yegor Yefremov <yegorslists@googlemail.com>
> 
> OnRISC Baltos devices are based on a am335x SoC and can be booted
> either from MMC or NAND.
> 
> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> ---

> +
> +typedef struct _BSP_VS_HWPARAM
> +{
> +        uint32_t Magic;
> +        uint32_t HwRev;
> +        uint32_t SerialNumber;
> +        char PrdDate[11];
> +        uint16_t SystemId;
> +        uint8_t MAC1[6];
> +        uint8_t MAC2[6];
> +        uint8_t MAC3[6];
> +} __attribute__ ((packed)) BSP_VS_HWPARAM;
> +
> +BSP_VS_HWPARAM hw_param;

No typedef for struct types please.

> +static void baltos_validate_eeprom(void)
> +{
> +	printf("Baltos: incorrect magic number (0x%x) in EEPROM\n",
> +			hw_param.Magic);
> +
> +	/* fill default values */
> +	hw_param.SystemId = 210;
> +
> +	hw_param.MAC1[0] = 0x00;
> +	hw_param.MAC1[1] = 0x00;
> +	hw_param.MAC1[2] = 0x00;
> +	hw_param.MAC1[3] = 0x00;
> +	hw_param.MAC1[4] = 0x00;
> +	hw_param.MAC1[5] = 0x01;
> +
> +	hw_param.MAC2[0] = 0x00;
> +	hw_param.MAC2[1] = 0x00;
> +	hw_param.MAC2[2] = 0x00;
> +	hw_param.MAC2[3] = 0x00;
> +	hw_param.MAC2[4] = 0x00;
> +	hw_param.MAC2[5] = 0x02;
> +
> +	hw_param.MAC3[0] = 0x00;
> +	hw_param.MAC3[1] = 0x00;
> +	hw_param.MAC3[2] = 0x00;
> +	hw_param.MAC3[3] = 0x00;
> +	hw_param.MAC3[4] = 0x00;
> +	hw_param.MAC3[5] = 0x03;
> +}
> +
> +static int baltos_read_eeprom(void)
> +{
> +	size_t size;
> +	char *buf, var_buf[32];
> +	int rc;
> +	unsigned char mac_addr[6];
> +
> +	rc = read_file_2("/dev/eeprom0", &size, (void *)&buf, sizeof(hw_param));
> +	if (rc && rc != -EFBIG) {
> +		return rc;
> +	}
> +
> +	memcpy(&hw_param, buf, sizeof(hw_param));
> +
> +	free(buf);
> +
> +	if (hw_param.Magic != 0xDEADBEEF) {

The magic for a valid EEPROM is 0xdeadbeef? What a poor choice, this
value is commonly used for *invalid* values.

> +		baltos_validate_eeprom();

When you can't find a valid MAC Address in the EEPROM then you should
just return here. barebox will then use a random MAC Address.

> +	}
> +
> +	sprintf(var_buf, "%d", hw_param.SystemId);
> +	globalvar_add_simple("board.id", var_buf);
> +
> +	/* setup MAC1 */
> +	mac_addr[0] = hw_param.MAC1[0];
> +	mac_addr[1] = hw_param.MAC1[1];
> +	mac_addr[2] = hw_param.MAC1[2];
> +	mac_addr[3] = hw_param.MAC1[3];
> +	mac_addr[4] = hw_param.MAC1[4];
> +	mac_addr[5] = hw_param.MAC1[5];
> +
> +	eth_register_ethaddr(0, mac_addr);
> +
> +	/* setup MAC2 */
> +	mac_addr[0] = hw_param.MAC2[0];
> +	mac_addr[1] = hw_param.MAC2[1];
> +	mac_addr[2] = hw_param.MAC2[2];
> +	mac_addr[3] = hw_param.MAC2[3];
> +	mac_addr[4] = hw_param.MAC2[4];
> +	mac_addr[5] = hw_param.MAC2[5];
> +
> +	eth_register_ethaddr(1, mac_addr);
> +
> +	return 0;
> +}

> +
> +&i2c1 {
> +	pinctrl-names = "default";
> +	pinctrl-0 = <&i2c1_pins>;
> +
> +	status = "okay";
> +	clock-frequency = <1000>;

1kHz? This looks suspicous. Shouldn't this be 100000 or 400000?


Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add support for Baltos systems
  2016-05-30  5:33 ` Sascha Hauer
@ 2016-05-30  9:46   ` Yegor Yefremov
  2016-05-31  7:01     ` Sascha Hauer
  0 siblings, 1 reply; 7+ messages in thread
From: Yegor Yefremov @ 2016-05-30  9:46 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox

On Mon, May 30, 2016 at 7:33 AM, Sascha Hauer <s.hauer@pengutronix.de> wrote:
> On Fri, May 27, 2016 at 03:48:55PM +0200, yegorslists@googlemail.com wrote:
>> From: Yegor Yefremov <yegorslists@googlemail.com>
>>
>> OnRISC Baltos devices are based on a am335x SoC and can be booted
>> either from MMC or NAND.
>>
>> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
>> ---
>
>> +
>> +typedef struct _BSP_VS_HWPARAM
>> +{
>> +        uint32_t Magic;
>> +        uint32_t HwRev;
>> +        uint32_t SerialNumber;
>> +        char PrdDate[11];
>> +        uint16_t SystemId;
>> +        uint8_t MAC1[6];
>> +        uint8_t MAC2[6];
>> +        uint8_t MAC3[6];
>> +} __attribute__ ((packed)) BSP_VS_HWPARAM;
>> +
>> +BSP_VS_HWPARAM hw_param;
>
> No typedef for struct types please.

Will remove.

>> +static void baltos_validate_eeprom(void)
>> +{
>> +     printf("Baltos: incorrect magic number (0x%x) in EEPROM\n",
>> +                     hw_param.Magic);
>> +
>> +     /* fill default values */
>> +     hw_param.SystemId = 210;
>> +
>> +     hw_param.MAC1[0] = 0x00;
>> +     hw_param.MAC1[1] = 0x00;
>> +     hw_param.MAC1[2] = 0x00;
>> +     hw_param.MAC1[3] = 0x00;
>> +     hw_param.MAC1[4] = 0x00;
>> +     hw_param.MAC1[5] = 0x01;
>> +
>> +     hw_param.MAC2[0] = 0x00;
>> +     hw_param.MAC2[1] = 0x00;
>> +     hw_param.MAC2[2] = 0x00;
>> +     hw_param.MAC2[3] = 0x00;
>> +     hw_param.MAC2[4] = 0x00;
>> +     hw_param.MAC2[5] = 0x02;
>> +
>> +     hw_param.MAC3[0] = 0x00;
>> +     hw_param.MAC3[1] = 0x00;
>> +     hw_param.MAC3[2] = 0x00;
>> +     hw_param.MAC3[3] = 0x00;
>> +     hw_param.MAC3[4] = 0x00;
>> +     hw_param.MAC3[5] = 0x03;
>> +}
>> +
>> +static int baltos_read_eeprom(void)
>> +{
>> +     size_t size;
>> +     char *buf, var_buf[32];
>> +     int rc;
>> +     unsigned char mac_addr[6];
>> +
>> +     rc = read_file_2("/dev/eeprom0", &size, (void *)&buf, sizeof(hw_param));
>> +     if (rc && rc != -EFBIG) {
>> +             return rc;
>> +     }
>> +
>> +     memcpy(&hw_param, buf, sizeof(hw_param));
>> +
>> +     free(buf);
>> +
>> +     if (hw_param.Magic != 0xDEADBEEF) {
>
> The magic for a valid EEPROM is 0xdeadbeef? What a poor choice, this
> value is commonly used for *invalid* values.

We use this scheme since years, so this cannot be changed now.

>> +             baltos_validate_eeprom();
>
> When you can't find a valid MAC Address in the EEPROM then you should
> just return here. barebox will then use a random MAC Address.

Will do.

>> +     }
>> +
>> +     sprintf(var_buf, "%d", hw_param.SystemId);
>> +     globalvar_add_simple("board.id", var_buf);
>> +
>> +     /* setup MAC1 */
>> +     mac_addr[0] = hw_param.MAC1[0];
>> +     mac_addr[1] = hw_param.MAC1[1];
>> +     mac_addr[2] = hw_param.MAC1[2];
>> +     mac_addr[3] = hw_param.MAC1[3];
>> +     mac_addr[4] = hw_param.MAC1[4];
>> +     mac_addr[5] = hw_param.MAC1[5];
>> +
>> +     eth_register_ethaddr(0, mac_addr);
>> +
>> +     /* setup MAC2 */
>> +     mac_addr[0] = hw_param.MAC2[0];
>> +     mac_addr[1] = hw_param.MAC2[1];
>> +     mac_addr[2] = hw_param.MAC2[2];
>> +     mac_addr[3] = hw_param.MAC2[3];
>> +     mac_addr[4] = hw_param.MAC2[4];
>> +     mac_addr[5] = hw_param.MAC2[5];
>> +
>> +     eth_register_ethaddr(1, mac_addr);
>> +
>> +     return 0;
>> +}
>
>> +
>> +&i2c1 {
>> +     pinctrl-names = "default";
>> +     pinctrl-0 = <&i2c1_pins>;
>> +
>> +     status = "okay";
>> +     clock-frequency = <1000>;
>
> 1kHz? This looks suspicous. Shouldn't this be 100000 or 400000?

First we used 100KHz, but under some circumstances it turned out, that
SoC <-> PMIC communication got stuck and as a result CPU was running
with lower frequency. So after more testing it turned out, that 1KHz
is the most "stable" frequency It is only important that these first
communication steps occur at 1KHz, after this any supported speed is
stable.

Yegor

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add support for Baltos systems
  2016-05-30  9:46   ` Yegor Yefremov
@ 2016-05-31  7:01     ` Sascha Hauer
  2016-05-31  7:08       ` Yegor Yefremov
  0 siblings, 1 reply; 7+ messages in thread
From: Sascha Hauer @ 2016-05-31  7:01 UTC (permalink / raw)
  To: Yegor Yefremov; +Cc: barebox

On Mon, May 30, 2016 at 11:46:12AM +0200, Yegor Yefremov wrote:
> On Mon, May 30, 2016 at 7:33 AM, Sascha Hauer <s.hauer@pengutronix.de> wrote:
> > On Fri, May 27, 2016 at 03:48:55PM +0200, yegorslists@googlemail.com wrote:
> >> From: Yegor Yefremov <yegorslists@googlemail.com>
> >>
> >> OnRISC Baltos devices are based on a am335x SoC and can be booted
> >> either from MMC or NAND.
> >>
> >> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> >> ---
> >
> >> +
> >> +typedef struct _BSP_VS_HWPARAM
> >> +{
> >> +        uint32_t Magic;
> >> +        uint32_t HwRev;
> >> +        uint32_t SerialNumber;
> >> +        char PrdDate[11];
> >> +        uint16_t SystemId;
> >> +        uint8_t MAC1[6];
> >> +        uint8_t MAC2[6];
> >> +        uint8_t MAC3[6];
> >> +} __attribute__ ((packed)) BSP_VS_HWPARAM;
> >> +
> >> +BSP_VS_HWPARAM hw_param;
> >
> > No typedef for struct types please.
> 
> Will remove.
> 
> >> +static void baltos_validate_eeprom(void)
> >> +{
> >> +     printf("Baltos: incorrect magic number (0x%x) in EEPROM\n",
> >> +                     hw_param.Magic);
> >> +
> >> +     /* fill default values */
> >> +     hw_param.SystemId = 210;
> >> +
> >> +     hw_param.MAC1[0] = 0x00;
> >> +     hw_param.MAC1[1] = 0x00;
> >> +     hw_param.MAC1[2] = 0x00;
> >> +     hw_param.MAC1[3] = 0x00;
> >> +     hw_param.MAC1[4] = 0x00;
> >> +     hw_param.MAC1[5] = 0x01;
> >> +
> >> +     hw_param.MAC2[0] = 0x00;
> >> +     hw_param.MAC2[1] = 0x00;
> >> +     hw_param.MAC2[2] = 0x00;
> >> +     hw_param.MAC2[3] = 0x00;
> >> +     hw_param.MAC2[4] = 0x00;
> >> +     hw_param.MAC2[5] = 0x02;
> >> +
> >> +     hw_param.MAC3[0] = 0x00;
> >> +     hw_param.MAC3[1] = 0x00;
> >> +     hw_param.MAC3[2] = 0x00;
> >> +     hw_param.MAC3[3] = 0x00;
> >> +     hw_param.MAC3[4] = 0x00;
> >> +     hw_param.MAC3[5] = 0x03;
> >> +}
> >> +
> >> +static int baltos_read_eeprom(void)
> >> +{
> >> +     size_t size;
> >> +     char *buf, var_buf[32];
> >> +     int rc;
> >> +     unsigned char mac_addr[6];
> >> +
> >> +     rc = read_file_2("/dev/eeprom0", &size, (void *)&buf, sizeof(hw_param));
> >> +     if (rc && rc != -EFBIG) {
> >> +             return rc;
> >> +     }
> >> +
> >> +     memcpy(&hw_param, buf, sizeof(hw_param));
> >> +
> >> +     free(buf);
> >> +
> >> +     if (hw_param.Magic != 0xDEADBEEF) {
> >
> > The magic for a valid EEPROM is 0xdeadbeef? What a poor choice, this
> > value is commonly used for *invalid* values.
> 
> We use this scheme since years, so this cannot be changed now.
> 
> >> +             baltos_validate_eeprom();
> >
> > When you can't find a valid MAC Address in the EEPROM then you should
> > just return here. barebox will then use a random MAC Address.
> 
> Will do.
> 
> >> +     }
> >> +
> >> +     sprintf(var_buf, "%d", hw_param.SystemId);
> >> +     globalvar_add_simple("board.id", var_buf);
> >> +
> >> +     /* setup MAC1 */
> >> +     mac_addr[0] = hw_param.MAC1[0];
> >> +     mac_addr[1] = hw_param.MAC1[1];
> >> +     mac_addr[2] = hw_param.MAC1[2];
> >> +     mac_addr[3] = hw_param.MAC1[3];
> >> +     mac_addr[4] = hw_param.MAC1[4];
> >> +     mac_addr[5] = hw_param.MAC1[5];
> >> +
> >> +     eth_register_ethaddr(0, mac_addr);
> >> +
> >> +     /* setup MAC2 */
> >> +     mac_addr[0] = hw_param.MAC2[0];
> >> +     mac_addr[1] = hw_param.MAC2[1];
> >> +     mac_addr[2] = hw_param.MAC2[2];
> >> +     mac_addr[3] = hw_param.MAC2[3];
> >> +     mac_addr[4] = hw_param.MAC2[4];
> >> +     mac_addr[5] = hw_param.MAC2[5];
> >> +
> >> +     eth_register_ethaddr(1, mac_addr);
> >> +
> >> +     return 0;
> >> +}
> >
> >> +
> >> +&i2c1 {
> >> +     pinctrl-names = "default";
> >> +     pinctrl-0 = <&i2c1_pins>;
> >> +
> >> +     status = "okay";
> >> +     clock-frequency = <1000>;
> >
> > 1kHz? This looks suspicous. Shouldn't this be 100000 or 400000?
> 
> First we used 100KHz, but under some circumstances it turned out, that
> SoC <-> PMIC communication got stuck and as a result CPU was running
> with lower frequency. So after more testing it turned out, that 1KHz
> is the most "stable" frequency It is only important that these first
> communication steps occur at 1KHz, after this any supported speed is
> stable.

Ok, so it's really 1000Hz. Note that if you start Linux with the barebox
device tree you will end up with 1000Hz under Linux aswell, so it might
be worth looking for another solution to this problem.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add support for Baltos systems
  2016-05-31  7:01     ` Sascha Hauer
@ 2016-05-31  7:08       ` Yegor Yefremov
  0 siblings, 0 replies; 7+ messages in thread
From: Yegor Yefremov @ 2016-05-31  7:08 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox

On Tue, May 31, 2016 at 9:01 AM, Sascha Hauer <s.hauer@pengutronix.de> wrote:
> On Mon, May 30, 2016 at 11:46:12AM +0200, Yegor Yefremov wrote:
>> On Mon, May 30, 2016 at 7:33 AM, Sascha Hauer <s.hauer@pengutronix.de> wrote:
>> > On Fri, May 27, 2016 at 03:48:55PM +0200, yegorslists@googlemail.com wrote:
>> >> From: Yegor Yefremov <yegorslists@googlemail.com>
>> >>
>> >> OnRISC Baltos devices are based on a am335x SoC and can be booted
>> >> either from MMC or NAND.
>> >>
>> >> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
>> >> ---
>> >
>> >> +
>> >> +typedef struct _BSP_VS_HWPARAM
>> >> +{
>> >> +        uint32_t Magic;
>> >> +        uint32_t HwRev;
>> >> +        uint32_t SerialNumber;
>> >> +        char PrdDate[11];
>> >> +        uint16_t SystemId;
>> >> +        uint8_t MAC1[6];
>> >> +        uint8_t MAC2[6];
>> >> +        uint8_t MAC3[6];
>> >> +} __attribute__ ((packed)) BSP_VS_HWPARAM;
>> >> +
>> >> +BSP_VS_HWPARAM hw_param;
>> >
>> > No typedef for struct types please.
>>
>> Will remove.
>>
>> >> +static void baltos_validate_eeprom(void)
>> >> +{
>> >> +     printf("Baltos: incorrect magic number (0x%x) in EEPROM\n",
>> >> +                     hw_param.Magic);
>> >> +
>> >> +     /* fill default values */
>> >> +     hw_param.SystemId = 210;
>> >> +
>> >> +     hw_param.MAC1[0] = 0x00;
>> >> +     hw_param.MAC1[1] = 0x00;
>> >> +     hw_param.MAC1[2] = 0x00;
>> >> +     hw_param.MAC1[3] = 0x00;
>> >> +     hw_param.MAC1[4] = 0x00;
>> >> +     hw_param.MAC1[5] = 0x01;
>> >> +
>> >> +     hw_param.MAC2[0] = 0x00;
>> >> +     hw_param.MAC2[1] = 0x00;
>> >> +     hw_param.MAC2[2] = 0x00;
>> >> +     hw_param.MAC2[3] = 0x00;
>> >> +     hw_param.MAC2[4] = 0x00;
>> >> +     hw_param.MAC2[5] = 0x02;
>> >> +
>> >> +     hw_param.MAC3[0] = 0x00;
>> >> +     hw_param.MAC3[1] = 0x00;
>> >> +     hw_param.MAC3[2] = 0x00;
>> >> +     hw_param.MAC3[3] = 0x00;
>> >> +     hw_param.MAC3[4] = 0x00;
>> >> +     hw_param.MAC3[5] = 0x03;
>> >> +}
>> >> +
>> >> +static int baltos_read_eeprom(void)
>> >> +{
>> >> +     size_t size;
>> >> +     char *buf, var_buf[32];
>> >> +     int rc;
>> >> +     unsigned char mac_addr[6];
>> >> +
>> >> +     rc = read_file_2("/dev/eeprom0", &size, (void *)&buf, sizeof(hw_param));
>> >> +     if (rc && rc != -EFBIG) {
>> >> +             return rc;
>> >> +     }
>> >> +
>> >> +     memcpy(&hw_param, buf, sizeof(hw_param));
>> >> +
>> >> +     free(buf);
>> >> +
>> >> +     if (hw_param.Magic != 0xDEADBEEF) {
>> >
>> > The magic for a valid EEPROM is 0xdeadbeef? What a poor choice, this
>> > value is commonly used for *invalid* values.
>>
>> We use this scheme since years, so this cannot be changed now.
>>
>> >> +             baltos_validate_eeprom();
>> >
>> > When you can't find a valid MAC Address in the EEPROM then you should
>> > just return here. barebox will then use a random MAC Address.
>>
>> Will do.
>>
>> >> +     }
>> >> +
>> >> +     sprintf(var_buf, "%d", hw_param.SystemId);
>> >> +     globalvar_add_simple("board.id", var_buf);
>> >> +
>> >> +     /* setup MAC1 */
>> >> +     mac_addr[0] = hw_param.MAC1[0];
>> >> +     mac_addr[1] = hw_param.MAC1[1];
>> >> +     mac_addr[2] = hw_param.MAC1[2];
>> >> +     mac_addr[3] = hw_param.MAC1[3];
>> >> +     mac_addr[4] = hw_param.MAC1[4];
>> >> +     mac_addr[5] = hw_param.MAC1[5];
>> >> +
>> >> +     eth_register_ethaddr(0, mac_addr);
>> >> +
>> >> +     /* setup MAC2 */
>> >> +     mac_addr[0] = hw_param.MAC2[0];
>> >> +     mac_addr[1] = hw_param.MAC2[1];
>> >> +     mac_addr[2] = hw_param.MAC2[2];
>> >> +     mac_addr[3] = hw_param.MAC2[3];
>> >> +     mac_addr[4] = hw_param.MAC2[4];
>> >> +     mac_addr[5] = hw_param.MAC2[5];
>> >> +
>> >> +     eth_register_ethaddr(1, mac_addr);
>> >> +
>> >> +     return 0;
>> >> +}
>> >
>> >> +
>> >> +&i2c1 {
>> >> +     pinctrl-names = "default";
>> >> +     pinctrl-0 = <&i2c1_pins>;
>> >> +
>> >> +     status = "okay";
>> >> +     clock-frequency = <1000>;
>> >
>> > 1kHz? This looks suspicous. Shouldn't this be 100000 or 400000?
>>
>> First we used 100KHz, but under some circumstances it turned out, that
>> SoC <-> PMIC communication got stuck and as a result CPU was running
>> with lower frequency. So after more testing it turned out, that 1KHz
>> is the most "stable" frequency It is only important that these first
>> communication steps occur at 1KHz, after this any supported speed is
>> stable.
>
> Ok, so it's really 1000Hz. Note that if you start Linux with the barebox
> device tree you will end up with 1000Hz under Linux aswell, so it might
> be worth looking for another solution to this problem.

We don't start Linux with barebox device tree. This is really only a
minimal configuration, that is needed to configure barebox itself. We
use a FIT image, that holds about 6 different full-featured DTBs.

Yegor

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add support for Baltos systems
  2016-05-27 13:48 [PATCH] Add support for Baltos systems yegorslists
  2016-05-30  5:33 ` Sascha Hauer
@ 2016-05-31 18:46 ` Trent Piepho
  2016-06-01  7:23   ` Sascha Hauer
  1 sibling, 1 reply; 7+ messages in thread
From: Trent Piepho @ 2016-05-31 18:46 UTC (permalink / raw)
  To: yegorslists; +Cc: barebox

On Fri, 2016-05-27 at 15:48 +0200, yegorslists@googlemail.com wrote:

> +typedef struct _BSP_VS_HWPARAM
> +{
> +        uint32_t Magic;
> +        uint32_t HwRev;
> +        uint32_t SerialNumber;
> +        char PrdDate[11];
> +        uint16_t SystemId;
> +        uint8_t MAC1[6];
> +        uint8_t MAC2[6];
> +        uint8_t MAC3[6];
> +} __attribute__ ((packed)) BSP_VS_HWPARAM;
> +
> +BSP_VS_HWPARAM hw_param;

It doesn't seem like this needs to be global.

> +
> +static void baltos_validate_eeprom(void)

Suggest naming this baltos_invalid_eeprom() or something like that.
validate would mean to check the eeprom, but that was already done
before this function is called, and so this appears to just handle the
invalid eeprom case.

> +{
> +	printf("Baltos: incorrect magic number (0x%x) in EEPROM\n",
> +			hw_param.Magic);
> +
> +	/* fill default values */
> +	hw_param.SystemId = 210;
> +
> +	hw_param.MAC1[0] = 0x00;
> +	hw_param.MAC1[1] = 0x00;
> +	hw_param.MAC1[2] = 0x00;
> +	hw_param.MAC1[3] = 0x00;
> +	hw_param.MAC1[4] = 0x00;
> +	hw_param.MAC1[5] = 0x01;
> +
> +	hw_param.MAC2[0] = 0x00;
> +	hw_param.MAC2[1] = 0x00;
> +	hw_param.MAC2[2] = 0x00;
> +	hw_param.MAC2[3] = 0x00;
> +	hw_param.MAC2[4] = 0x00;
> +	hw_param.MAC2[5] = 0x02;
> +
> +	hw_param.MAC3[0] = 0x00;
> +	hw_param.MAC3[1] = 0x00;
> +	hw_param.MAC3[2] = 0x00;
> +	hw_param.MAC3[3] = 0x00;
> +	hw_param.MAC3[4] = 0x00;
> +	hw_param.MAC3[5] = 0x03;
> +}
> +
> +static int baltos_read_eeprom(void)
> +{
> +	size_t size;
> +	char *buf, var_buf[32];
> +	int rc;
> +	unsigned char mac_addr[6];
> +
> +	rc = read_file_2("/dev/eeprom0", &size, (void *)&buf, sizeof(hw_param));
> +	if (rc && rc != -EFBIG) {
> +		return rc;
> +	}
> +
> +	memcpy(&hw_param, buf, sizeof(hw_param));
> +
> +	free(buf);
> +
> +	if (hw_param.Magic != 0xDEADBEEF) {
> +		baltos_validate_eeprom();
> +	}
> +
> +	sprintf(var_buf, "%d", hw_param.SystemId);
> +	globalvar_add_simple("board.id", var_buf);
> +
> +	/* setup MAC1 */
> +	mac_addr[0] = hw_param.MAC1[0];
> +	mac_addr[1] = hw_param.MAC1[1];
> +	mac_addr[2] = hw_param.MAC1[2];
> +	mac_addr[3] = hw_param.MAC1[3];
> +	mac_addr[4] = hw_param.MAC1[4];
> +	mac_addr[5] = hw_param.MAC1[5];
> +
> +	eth_register_ethaddr(0, mac_addr);
> +
> +	/* setup MAC2 */
> +	mac_addr[0] = hw_param.MAC2[0];
> +	mac_addr[1] = hw_param.MAC2[1];
> +	mac_addr[2] = hw_param.MAC2[2];
> +	mac_addr[3] = hw_param.MAC2[3];
> +	mac_addr[4] = hw_param.MAC2[4];
> +	mac_addr[5] = hw_param.MAC2[5];
> +
> +	eth_register_ethaddr(1, mac_addr);
> +
> +	return 0;
> +}
> +environment_initcall(baltos_read_eeprom);
> +
> +static int baltos_mem_init(void)
> +{
> +	uint32_t sdram_size;
> +
> +	if (!of_machine_is_compatible("vscom,onrisc"))
> +		return 0;
> +
> +	sdram_size = SZ_256M;
> +
> +	arm_add_mem_device("ram0", 0x80000000, sdram_size);
> +
> +	return 0;
> +}
> +mem_initcall(baltos_mem_init);
> +
> +static int baltos_devices_init(void)
> +{
> +	if (!of_machine_is_compatible("vscom,onrisc"))
> +		return 0;
> +
> +	globalvar_add_simple("board.variant", "baltos");
> +
> +	omap_set_barebox_part(&baltos_barebox_part);
> +
> +	if (IS_ENABLED(CONFIG_SHELL_NONE))
> +		return am33xx_of_register_bootdevice();
> +
> +	return 0;
> +}
> +coredevice_initcall(baltos_devices_init);
> diff --git a/arch/arm/boards/vscom-baltos/lowlevel.c b/arch/arm/boards/vscom-baltos/lowlevel.c
> new file mode 100644
> index 0000000..6acbdb9
> --- /dev/null
> +++ b/arch/arm/boards/vscom-baltos/lowlevel.c
> @@ -0,0 +1,116 @@
> +#include <init.h>
> +#include <linux/sizes.h>
> +#include <io.h>
> +#include <linux/string.h>
> +#include <debug_ll.h>
> +#include <asm/barebox-arm-head.h>
> +#include <asm/barebox-arm.h>
> +#include <mach/am33xx-silicon.h>
> +#include <mach/am33xx-clock.h>
> +#include <mach/generic.h>
> +#include <mach/sdrc.h>
> +#include <mach/sys_info.h>
> +#include <mach/syslib.h>
> +#include <mach/am33xx-mux.h>
> +#include <mach/am33xx-generic.h>
> +#include <mach/wdt.h>
> +
> +static const struct am33xx_ddr_data ddr3_data = {
> +	.rd_slave_ratio0        = 0x38,
> +	.wr_dqs_slave_ratio0    = 0x44,
> +	.fifo_we_slave_ratio0	= 0x94,
> +	.wr_slave_ratio0        = 0x7D,
> +	.use_rank0_delay	= 0x01,
> +	.dll_lock_diff0		= 0x0,
> +};
> +
> +static const struct am33xx_cmd_control ddr3_cmd_ctrl = {
> +	.slave_ratio0	= 0x80,
> +	.dll_lock_diff0	= 0x1,
> +	.invert_clkout0	= 0x0,
> +	.slave_ratio1	= 0x80,
> +	.dll_lock_diff1	= 0x1,
> +	.invert_clkout1	= 0x0,
> +	.slave_ratio2	= 0x80,
> +	.dll_lock_diff2	= 0x1,
> +	.invert_clkout2	= 0x0,
> +};
> +
> +static const struct am33xx_emif_regs ddr3_regs = {
> +	.emif_read_latency	= 0x100007,
> +	.emif_tim1		= 0x0AAAD4DB,
> +	.emif_tim2		= 0x266B7FDA,
> +	.emif_tim3		= 0x501F867F,
> +	.zq_config		= 0x50074BE4,
> +	.sdram_config		= 0x61C05332,
> +	.sdram_config2		= 0x0,
> +	.sdram_ref_ctrl		= 0xC30,
> +};
> +
> +extern char __dtb_am335x_baltos_minimal_start[];
> +
> +/**
> + * @brief The basic entry point for board initialization.
> + *
> + * This is called as part of machine init (after arch init).
> + * This is again called with stack in SRAM, so not too many
> + * constructs possible here.
> + *
> + * @return void
> + */

Does anyone (Sascha?) know why this is noline?  Obviously it is being
copied from the all the other boards that do this, and the only thing it
can be doing is preventing this from being inlined into the entry
function.  But why must this be prevented?

> +static noinline int baltos_sram_init(void)
> +{
> +	uint32_t sdram_size;
> +	void *fdt;
> +
> +	fdt = __dtb_am335x_baltos_minimal_start;
> +
> +	sdram_size = SZ_256M;

I wonder if there is a way to use the same definition here and in
baltos_mem_init() and in start_am33xx_baltos_sdram()?

> +
> +	/* WDT1 is already running when the bootloader gets control
> +	 * Disable it to avoid "random" resets
> +	 */
> +	__raw_writel(WDT_DISABLE_CODE1, AM33XX_WDT_REG(WSPR));
> +	while(__raw_readl(AM33XX_WDT_REG(WWPS)) != 0x0);
> +	__raw_writel(WDT_DISABLE_CODE2, AM33XX_WDT_REG(WSPR));
> +	while(__raw_readl(AM33XX_WDT_REG(WWPS)) != 0x0);
> +
> +	/* Setup the PLLs and the clocks for the peripherals */
> +	am33xx_pll_init(MPUPLL_M_500, DDRPLL_M_400);
> +	am335x_sdram_init(0x18B, &ddr3_cmd_ctrl, &ddr3_regs,
> +			&ddr3_data);
> +
> +	am33xx_uart_soft_reset((void *)AM33XX_UART0_BASE);
> +	am33xx_enable_uart0_pin_mux();
> +	omap_uart_lowlevel_init((void *)AM33XX_UART0_BASE);
> +	putc_ll('>');
> +
> +	barebox_arm_entry(0x80000000, sdram_size, fdt);
> +}
> +
> +ENTRY_FUNCTION(start_am33xx_baltos_sram, bootinfo, r1, r2)
> +{
> +	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();
> +
> +	baltos_sram_init();
> +}
> +
> +ENTRY_FUNCTION(start_am33xx_baltos_sdram, r0, r1, r2)
> +{
> +	uint32_t sdram_size;
> +	void *fdt;
> +
> +	sdram_size = SZ_256M;
> +	fdt = __dtb_am335x_baltos_minimal_start;
> +
> +	fdt -= get_runtime_offset();
> +
> +	barebox_arm_entry(0x80000000, sdram_size, fdt);
> +}

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add support for Baltos systems
  2016-05-31 18:46 ` Trent Piepho
@ 2016-06-01  7:23   ` Sascha Hauer
  0 siblings, 0 replies; 7+ messages in thread
From: Sascha Hauer @ 2016-06-01  7:23 UTC (permalink / raw)
  To: Trent Piepho; +Cc: barebox

On Tue, May 31, 2016 at 06:46:57PM +0000, Trent Piepho wrote:
> On Fri, 2016-05-27 at 15:48 +0200, yegorslists@googlemail.com wrote:
> 
> > +
> > +/**
> > + * @brief The basic entry point for board initialization.
> > + *
> > + * This is called as part of machine init (after arch init).
> > + * This is again called with stack in SRAM, so not too many
> > + * constructs possible here.
> > + *
> > + * @return void
> > + */
> 
> Does anyone (Sascha?) know why this is noline?  Obviously it is being
> copied from the all the other boards that do this, and the only thing it
> can be doing is preventing this from being inlined into the entry
> function.  But why must this be prevented?

Only after calling relocate_to_current_adr() / setup_c() the C
environment is correctly initialized. Before that for example pointers
to global variables are not valid. The following does not work:

ENTRY_FUNCTION(start_am33xx_baltos_sram, bootinfo, r1, r2)
{
	void *fdt = __dtb_am335x_baltos_minimal_start;

	relocate_to_current_adr();
	setup_c();

	barebox_arm_entry(0x80000000, sdram_size, fdt);
}

Wenn entering start_am33xx_baltos_sram() we do not run at the address we
are linked at, so *fdt will have the offset between link address and
actual runtime address in it. Basically we must make sure that *fdt is
initialized *after* calling relocate_to_current_adr()/setup_c(). The same
might happen when create an extra function but let the compiler inline it:

static inline void cont(void)
{
	void *fdt = __dtb_am335x_baltos_minimal_start;

	barebox_arm_entry(0x80000000, sdram_size, fdt);
}

ENTRY_FUNCTION(start_am33xx_baltos_sram, bootinfo, r1, r2)
{
	relocate_to_current_adr();
	setup_c();

	cont();
}

This doesn't happen when we explicitly noinline cont().

The compiler simply doesn't know about the dirty tricks we play in
relocate_to_current_adr() and setup_c().

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-06-01  7:23 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-27 13:48 [PATCH] Add support for Baltos systems yegorslists
2016-05-30  5:33 ` Sascha Hauer
2016-05-30  9:46   ` Yegor Yefremov
2016-05-31  7:01     ` Sascha Hauer
2016-05-31  7:08       ` Yegor Yefremov
2016-05-31 18:46 ` Trent Piepho
2016-06-01  7:23   ` Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox