All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/3] Add support for the Boundary Devices Nitrogen6x board
@ 2012-10-04 19:49 Eric Nelson
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
                   ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-04 19:49 UTC (permalink / raw)
  To: u-boot

This series defines a board type for Nitrogen6X, an SBC from Boundary
Devices.

The board is closely related to the Freescale SABRE Lite board as
discussed in this document.
	http://boundarydevices.com/differences-sabre-lite-nitrogen6x-and-som/

Because of the similarity, a Nitrogen6X U-Boot image will run on the
SABRE Lite board, and auto-detection is included.

This patch set is broken up into three pieces to expose the functional
differences between the boards.

The first patch essentially copies board/freescale/mx6qsabrelite to
board/boundary/nitrogen6x but does alter the settings file 
include/configs/nitrogen6x to reflect boot-from-SPI and storage
of environment variables in SPI NOR. It also contains an updated
README describing the board's usage.

The second patch reflects the change in PHY reset, and the third
sets up the pads for the WL1271 Wi-Fi/Bluetooth option on a Nitrogen6x.

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-04 19:49 [U-Boot] [PATCH 0/3] Add support for the Boundary Devices Nitrogen6x board Eric Nelson
@ 2012-10-04 19:49 ` Eric Nelson
  2012-10-04 21:42   ` Sinan Akman
                     ` (3 more replies)
  2012-10-04 19:49 ` [U-Boot] [PATCH 2/3] nitrogen6x: configure and toggle PHY reset for Nitrogen6x Eric Nelson
  2012-10-04 19:49 ` [U-Boot] [PATCH 3/3] nitrogen6x: initialize WL12XX pads, use to determine board type Eric Nelson
  2 siblings, 4 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-04 19:49 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
---
 board/boundary/nitrogen6x/Makefile     |   41 ++
 board/boundary/nitrogen6x/README       |   77 +++
 board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
 boards.cfg                             |    1 +
 include/configs/nitrogen6x.h           |  242 +++++++++
 5 files changed, 1201 insertions(+), 0 deletions(-)
 create mode 100644 board/boundary/nitrogen6x/Makefile
 create mode 100644 board/boundary/nitrogen6x/README
 create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
 create mode 100644 include/configs/nitrogen6x.h

diff --git a/board/boundary/nitrogen6x/Makefile b/board/boundary/nitrogen6x/Makefile
new file mode 100644
index 0000000..63da7d0
--- /dev/null
+++ b/board/boundary/nitrogen6x/Makefile
@@ -0,0 +1,41 @@
+#
+# Copyright (C) 2012, Guennadi Liakhovetski <lg@denx.de>
+#
+# (C) Copyright 2012 Freescale Semiconductor, Inc.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := nitrogen6x.o
+
+SRCS   := $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/boundary/nitrogen6x/README b/board/boundary/nitrogen6x/README
new file mode 100644
index 0000000..d67cdf0
--- /dev/null
+++ b/board/boundary/nitrogen6x/README
@@ -0,0 +1,77 @@
+U-Boot for the Boundary Devices Nitrogen6X and
+Freescale i.MX6q SabreLite boards
+
+This file contains information for the port of 
+U-Boot to the Boundary Devices Nitrogen6X and
+Freescale i.MX6q SabreLite boards.
+
+1. Boot source, boot from SPI NOR
+---------------------------------
+The configuration in this directory supports both the
+Nitrogen6X and Freescale SabreLite board, but in a 
+different fashion from Freescale's implementation in 
+board/freescale/mx6qsabrelite.
+
+In particular, this image supports booting from SPI NOR
+and saving the environment to SPI NOR.
+
+It does not support 'boot from SD' at offset 0x400
+except through the 'bmode' command.
+	http://lists.denx.de/pipermail/u-boot/2012-August/131151.html
+
+2. Boots using 6q_bootscript on SATA or SD card
+-----------------------------------------------
+The default bootcmd for these boards is configured
+to look for and source a boot script named '6q_bootscript'
+in the root of the first partition of the following 
+devices:
+
+	sata 0
+	mmc 0
+	mmc 1
+
+They're searched in the order listed above, trying both the
+ext2 and fat filesystems.
+
+2. Maintaining the SPI NOR
+--------------------------
+A couple of convenience commands
+
+	clearenv - clear environment to factory default
+	upgradeu - look and source a boot script named
+		'6q_upgrade' to upgrade the U-Boot version 
+		in SPI NOR. The search is the same as for 
+		6q_bootscript described above.
+
+3. Display support
+------------------
+U-Boot support for the following displays is configured by 
+default:
+
+    HDMI           - 1024 x 768 for maximum compatibility
+    Hannstar-XGA   - 1024 x 768 LVDS (Freescale part number MCIMX-LVDS1)
+    wsvga-lvds     - 1024 x 600 LVDS (Boundary p/n Nit6X_1024x600)
+    wvga-rgb       - 800 x 480 RGB (Boundary p/n Nit6X_800x480)
+    
+Since the ipuv3_fb display driver currently supports only a single display,
+this code auto-detects panel by probing the HDMI Phy for Hot Plug Detect
+or the I2C touch controller of the LVDS and RGB displays in the priority
+listed above.
+    
+Setting 'panel' environment variable to one of the names above will
+override auto-detection and force activation of the specified panel.
+
+4. Building
+------------
+
+To build U-Boot for the Nitrogen6x or SabreLite board:
+
+	make nitrogen6x_config
+	make u-boot.imx
+
+If you place the u-boot.imx into a single-partition SD card
+along with a binary version of the boot script 6q_upgrade.txt,
+you can program it using 'upgradeu':
+
+	U-Boot> run upgradeu
+
diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c
new file mode 100644
index 0000000..e70871d
--- /dev/null
+++ b/board/boundary/nitrogen6x/nitrogen6x.c
@@ -0,0 +1,840 @@
+/*
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ *
+ * 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 <common.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6x_pins.h>
+#include <asm/errno.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/mxc_i2c.h>
+#include <asm/imx-common/boot_mode.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <micrel.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <linux/fb.h>
+#include <ipu_pixfmt.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/mxc_hdmi.h>
+#include <i2c.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |	       \
+       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |	       \
+       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |	       \
+       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |	       \
+       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED	  |		\
+	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+
+#define SPI_PAD_CTRL (PAD_CTL_HYS |				\
+	PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |		\
+	PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
+
+#define BUTTON_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |		\
+	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+
+#define I2C_PAD_CTRL	(PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |		\
+	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
+	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+       return 0;
+}
+
+iomux_v3_cfg_t const uart1_pads[] = {
+	MX6Q_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6Q_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const uart2_pads[] = {
+       MX6Q_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6Q_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
+
+/* I2C1, SGTL5000 */
+struct i2c_pads_info i2c_pad_info0 = {
+	.scl = {
+		.i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
+		.gpio_mode = MX6Q_PAD_EIM_D21__GPIO_3_21 | PC,
+		.gp = IMX_GPIO_NR(3, 21)
+	},
+	.sda = {
+		.i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
+		.gpio_mode = MX6Q_PAD_EIM_D28__GPIO_3_28 | PC,
+		.gp = IMX_GPIO_NR(3, 28)
+	}
+};
+
+/* I2C2 Camera, MIPI */
+struct i2c_pads_info i2c_pad_info1 = {
+	.scl = {
+		.i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
+		.gpio_mode = MX6Q_PAD_KEY_COL3__GPIO_4_12 | PC,
+		.gp = IMX_GPIO_NR(4, 12)
+	},
+	.sda = {
+		.i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
+		.gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO_4_13 | PC,
+		.gp = IMX_GPIO_NR(4, 13)
+	}
+};
+
+/* I2C3, J15 - RGB connector */
+struct i2c_pads_info i2c_pad_info2 = {
+	.scl = {
+		.i2c_mode = MX6Q_PAD_GPIO_5__I2C3_SCL | PC,
+		.gpio_mode = MX6Q_PAD_GPIO_5__GPIO_1_5 | PC,
+		.gp = IMX_GPIO_NR(1, 5)
+	},
+	.sda = {
+		.i2c_mode = MX6Q_PAD_GPIO_16__I2C3_SDA | PC,
+		.gpio_mode = MX6Q_PAD_GPIO_16__GPIO_7_11 | PC,
+		.gp = IMX_GPIO_NR(7, 11)
+	}
+};
+
+iomux_v3_cfg_t const usdhc3_pads[] = {
+       MX6Q_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD3_DAT5__GPIO_7_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+};
+
+iomux_v3_cfg_t const usdhc4_pads[] = {
+       MX6Q_PAD_SD4_CLK__USDHC4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD4_CMD__USDHC4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX6Q_PAD_NANDF_D6__GPIO_2_6    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
+};
+
+iomux_v3_cfg_t const enet_pads1[] = {
+	MX6Q_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	/* pin 35 - 1 (PHY_AD2) on reset */
+	MX6Q_PAD_RGMII_RXC__GPIO_6_30		| MUX_PAD_CTRL(NO_PAD_CTRL),
+	/* pin 32 - 1 - (MODE0) all */
+	MX6Q_PAD_RGMII_RD0__GPIO_6_25		| MUX_PAD_CTRL(NO_PAD_CTRL),
+	/* pin 31 - 1 - (MODE1) all */
+	MX6Q_PAD_RGMII_RD1__GPIO_6_27		| MUX_PAD_CTRL(NO_PAD_CTRL),
+	/* pin 28 - 1 - (MODE2) all */
+	MX6Q_PAD_RGMII_RD2__GPIO_6_28		| MUX_PAD_CTRL(NO_PAD_CTRL),
+	/* pin 27 - 1 - (MODE3) all */
+	MX6Q_PAD_RGMII_RD3__GPIO_6_29		| MUX_PAD_CTRL(NO_PAD_CTRL),
+	/* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
+	MX6Q_PAD_RGMII_RX_CTL__GPIO_6_24	| MUX_PAD_CTRL(NO_PAD_CTRL),
+	/* pin 42 PHY nRST */
+	MX6Q_PAD_EIM_D23__GPIO_3_23		| MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const enet_pads2[] = {
+	MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
+};
+
+/* Button assignments for J14 */
+static iomux_v3_cfg_t const button_pads[] = {
+	/* Menu */
+	MX6Q_PAD_NANDF_D1__GPIO_2_1	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+	/* Back */
+	MX6Q_PAD_NANDF_D2__GPIO_2_2	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+	/* Labelled Search (mapped to Power under Android) */
+	MX6Q_PAD_NANDF_D3__GPIO_2_3	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+	/* Home */
+	MX6Q_PAD_NANDF_D4__GPIO_2_4	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+	/* Volume Down */
+	MX6Q_PAD_GPIO_19__GPIO_4_5	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+	/* Volume Up */
+	MX6Q_PAD_GPIO_18__GPIO_7_13	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
+};
+
+static void setup_iomux_enet(void)
+{
+	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
+	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
+	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
+	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
+	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
+	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
+	imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
+	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
+
+	/* Need delay 10ms according to KSZ9021 spec */
+	udelay(1000 * 10);
+	gpio_set_value(IMX_GPIO_NR(3, 23), 1);
+
+	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
+}
+
+iomux_v3_cfg_t const usb_pads[] = {
+	MX6Q_PAD_GPIO_17__GPIO_7_12 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_iomux_uart(void)
+{
+	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+       imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
+}
+
+#ifdef CONFIG_USB_EHCI_MX6
+int board_ehci_hcd_init(int port)
+{
+	imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
+
+	/* Reset USB hub */
+	gpio_direction_output(IMX_GPIO_NR(7, 12), 0);
+	mdelay(2);
+	gpio_set_value(IMX_GPIO_NR(7, 12), 1);
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg usdhc_cfg[2] = {
+       {USDHC3_BASE_ADDR},
+       {USDHC4_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret;
+
+       if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
+		gpio_direction_input(IMX_GPIO_NR(7, 0));
+		ret = !gpio_get_value(IMX_GPIO_NR(7, 0));
+       } else {
+		gpio_direction_input(IMX_GPIO_NR(2, 6));
+		ret = !gpio_get_value(IMX_GPIO_NR(2, 6));
+       }
+
+       return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       s32 status = 0;
+       u32 index = 0;
+
+       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
+	       switch (index) {
+	       case 0:
+		       imx_iomux_v3_setup_multiple_pads(
+			       usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
+		       break;
+	       case 1:
+		       imx_iomux_v3_setup_multiple_pads(
+			       usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
+		       break;
+	       default:
+		       printf("Warning: you configured more USDHC controllers"
+			       "(%d) then supported by the board (%d)\n",
+			       index + 1, CONFIG_SYS_FSL_USDHC_NUM);
+		       return status;
+	       }
+
+	       status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
+       }
+
+       return status;
+}
+#endif
+
+u32 get_board_rev(void)
+{
+	return 0x63000 ;
+}
+
+#ifdef CONFIG_MXC_SPI
+iomux_v3_cfg_t const ecspi1_pads[] = {
+	/* SS1 */
+	MX6Q_PAD_EIM_D19__GPIO_3_19   | MUX_PAD_CTRL(SPI_PAD_CTRL),
+	MX6Q_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
+	MX6Q_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
+	MX6Q_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
+};
+
+void setup_spi(void)
+{
+	gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
+	imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
+					 ARRAY_SIZE(ecspi1_pads));
+}
+#endif
+
+int board_phy_config(struct phy_device *phydev)
+{
+	/* min rx data delay */
+	ksz9021_phy_extended_write(phydev,
+			MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x0);
+	/* min tx data delay */
+	ksz9021_phy_extended_write(phydev,
+			MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x0);
+	/* max rx/tx clock delay, min rx/tx control */
+	ksz9021_phy_extended_write(phydev,
+			MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf0f0);
+	if (phydev->drv->config)
+		phydev->drv->config(phydev);
+
+	return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+	int ret;
+
+	setup_iomux_enet();
+
+	ret = cpu_eth_init(bis);
+	if (ret)
+		printf("FEC MXC: %s:failed\n", __func__);
+
+	return 0;
+}
+
+static void setup_buttons(void)
+{
+	imx_iomux_v3_setup_multiple_pads(button_pads,
+					 ARRAY_SIZE(button_pads));
+}
+
+#ifdef CONFIG_CMD_SATA
+
+int setup_sata(void)
+{
+	struct iomuxc_base_regs *const iomuxc_regs
+		= (struct iomuxc_base_regs *) IOMUXC_BASE_ADDR;
+	int ret = enable_sata_clock();
+	if (ret)
+		return ret;
+
+	clrsetbits_le32(&iomuxc_regs->gpr[13],
+			IOMUXC_GPR13_SATA_MASK,
+			IOMUXC_GPR13_SATA_PHY_8_RXEQ_3P0DB
+			|IOMUXC_GPR13_SATA_PHY_7_SATA2M
+			|IOMUXC_GPR13_SATA_SPEED_3G
+			|(3<<IOMUXC_GPR13_SATA_PHY_6_SHIFT)
+			|IOMUXC_GPR13_SATA_SATA_PHY_5_SS_DISABLED
+			|IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_9_16
+			|IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P00_DB
+			|IOMUXC_GPR13_SATA_PHY_2_TX_1P104V
+			|IOMUXC_GPR13_SATA_PHY_1_SLOW);
+
+	return 0;
+}
+#endif
+
+#if defined(CONFIG_VIDEO_IPUV3)
+
+static iomux_v3_cfg_t const backlight_pads[] = {
+	/* Backlight on RGB connector: J15 */
+	MX6Q_PAD_SD1_DAT3__GPIO_1_21 | MUX_PAD_CTRL(NO_PAD_CTRL),
+#define RGB_BACKLIGHT_GP IMX_GPIO_NR(1, 21)
+
+	/* Backlight on LVDS connector: J6 */
+	MX6Q_PAD_SD1_CMD__GPIO_1_18 | MUX_PAD_CTRL(NO_PAD_CTRL),
+#define LVDS_BACKLIGHT_GP IMX_GPIO_NR(1, 18)
+};
+
+static iomux_v3_cfg_t const rgb_pads[] = {
+	MX6Q_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK,
+	MX6Q_PAD_DI0_PIN15__IPU1_DI0_PIN15,
+	MX6Q_PAD_DI0_PIN2__IPU1_DI0_PIN2,
+	MX6Q_PAD_DI0_PIN3__IPU1_DI0_PIN3,
+	MX6Q_PAD_DI0_PIN4__GPIO_4_20,
+	MX6Q_PAD_DISP0_DAT0__IPU1_DISP0_DAT_0,
+	MX6Q_PAD_DISP0_DAT1__IPU1_DISP0_DAT_1,
+	MX6Q_PAD_DISP0_DAT2__IPU1_DISP0_DAT_2,
+	MX6Q_PAD_DISP0_DAT3__IPU1_DISP0_DAT_3,
+	MX6Q_PAD_DISP0_DAT4__IPU1_DISP0_DAT_4,
+	MX6Q_PAD_DISP0_DAT5__IPU1_DISP0_DAT_5,
+	MX6Q_PAD_DISP0_DAT6__IPU1_DISP0_DAT_6,
+	MX6Q_PAD_DISP0_DAT7__IPU1_DISP0_DAT_7,
+	MX6Q_PAD_DISP0_DAT8__IPU1_DISP0_DAT_8,
+	MX6Q_PAD_DISP0_DAT9__IPU1_DISP0_DAT_9,
+	MX6Q_PAD_DISP0_DAT10__IPU1_DISP0_DAT_10,
+	MX6Q_PAD_DISP0_DAT11__IPU1_DISP0_DAT_11,
+	MX6Q_PAD_DISP0_DAT12__IPU1_DISP0_DAT_12,
+	MX6Q_PAD_DISP0_DAT13__IPU1_DISP0_DAT_13,
+	MX6Q_PAD_DISP0_DAT14__IPU1_DISP0_DAT_14,
+	MX6Q_PAD_DISP0_DAT15__IPU1_DISP0_DAT_15,
+	MX6Q_PAD_DISP0_DAT16__IPU1_DISP0_DAT_16,
+	MX6Q_PAD_DISP0_DAT17__IPU1_DISP0_DAT_17,
+	MX6Q_PAD_DISP0_DAT18__IPU1_DISP0_DAT_18,
+	MX6Q_PAD_DISP0_DAT19__IPU1_DISP0_DAT_19,
+	MX6Q_PAD_DISP0_DAT20__IPU1_DISP0_DAT_20,
+	MX6Q_PAD_DISP0_DAT21__IPU1_DISP0_DAT_21,
+	MX6Q_PAD_DISP0_DAT22__IPU1_DISP0_DAT_22,
+	MX6Q_PAD_DISP0_DAT23__IPU1_DISP0_DAT_23,
+};
+
+struct display_info_t {
+	int	bus;
+	int	addr;
+	int	pixfmt;
+	int	(*detect)(struct display_info_t const *dev);
+	void	(*enable)(struct display_info_t const *dev);
+	struct	fb_videomode mode;
+};
+
+
+static int detect_hdmi(struct display_info_t const *dev)
+{
+	return __raw_readb(HDMI_ARB_BASE_ADDR+HDMI_PHY_STAT0) & HDMI_PHY_HPD;
+}
+
+static void enable_hdmi(struct display_info_t const *dev)
+{
+	u8 reg;
+	printf("%s: setup HDMI monitor\n", __func__);
+	reg = __raw_readb(
+			HDMI_ARB_BASE_ADDR
+			+HDMI_PHY_CONF0);
+	reg |= HDMI_PHY_CONF0_PDZ_MASK;
+	__raw_writeb(reg,
+		     HDMI_ARB_BASE_ADDR
+			+HDMI_PHY_CONF0);
+	udelay(3000);
+	reg |= HDMI_PHY_CONF0_ENTMDS_MASK;
+	__raw_writeb(reg,
+		     HDMI_ARB_BASE_ADDR
+			+HDMI_PHY_CONF0);
+	udelay(3000);
+	reg |= HDMI_PHY_CONF0_GEN2_TXPWRON_MASK;
+	__raw_writeb(reg,
+		     HDMI_ARB_BASE_ADDR
+			+HDMI_PHY_CONF0);
+	__raw_writeb(HDMI_MC_PHYRSTZ_ASSERT,
+		     HDMI_ARB_BASE_ADDR+HDMI_MC_PHYRSTZ);
+}
+
+static int detect_i2c(struct display_info_t const *dev)
+{
+	return ((0 == i2c_set_bus_num(dev->bus))
+		&&
+		(0 == i2c_probe(dev->addr)));
+}
+
+static void enable_lvds(struct display_info_t const *dev)
+{
+	struct iomuxc *iomux = (struct iomuxc *)
+				IOMUXC_BASE_ADDR;
+	u32 reg = readl(&iomux->gpr[2]);
+	reg |= IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT;
+	writel(reg, &iomux->gpr[2]);
+	gpio_direction_output(LVDS_BACKLIGHT_GP, 1);
+}
+
+static void enable_rgb(struct display_info_t const *dev)
+{
+	imx_iomux_v3_setup_multiple_pads(
+		rgb_pads,
+		 ARRAY_SIZE(rgb_pads));
+	gpio_direction_output(RGB_BACKLIGHT_GP, 1);
+}
+
+static struct display_info_t const displays[] = {{
+	.bus	= -1,
+	.addr	= 0,
+	.pixfmt	= IPU_PIX_FMT_RGB24,
+	.detect	= detect_hdmi,
+	.enable	= enable_hdmi,
+	.mode	= {
+		.name           = "HDMI",
+		.refresh        = 60,
+		.xres           = 1024,
+		.yres           = 768,
+		.pixclock       = 15385,
+		.left_margin    = 220,
+		.right_margin   = 40,
+		.upper_margin   = 21,
+		.lower_margin   = 7,
+		.hsync_len      = 60,
+		.vsync_len      = 10,
+		.sync           = FB_SYNC_EXT,
+		.vmode          = FB_VMODE_NONINTERLACED
+} }, {
+	.bus	= 2,
+	.addr	= 0x4,
+	.pixfmt	= IPU_PIX_FMT_LVDS666,
+	.detect	= detect_i2c,
+	.enable	= enable_lvds,
+	.mode	= {
+		.name           = "Hannstar-XGA",
+		.refresh        = 60,
+		.xres           = 1024,
+		.yres           = 768,
+		.pixclock       = 15385,
+		.left_margin    = 220,
+		.right_margin   = 40,
+		.upper_margin   = 21,
+		.lower_margin   = 7,
+		.hsync_len      = 60,
+		.vsync_len      = 10,
+		.sync           = FB_SYNC_EXT,
+		.vmode          = FB_VMODE_NONINTERLACED
+} }, {
+	.bus	= 2,
+	.addr	= 0x38,
+	.pixfmt	= IPU_PIX_FMT_LVDS666,
+	.detect	= detect_i2c,
+	.enable	= enable_lvds,
+	.mode	= {
+		.name           = "wsvga-lvds",
+		.refresh        = 60,
+		.xres           = 1024,
+		.yres           = 600,
+		.pixclock       = 15385,
+		.left_margin    = 220,
+		.right_margin   = 40,
+		.upper_margin   = 21,
+		.lower_margin   = 7,
+		.hsync_len      = 60,
+		.vsync_len      = 10,
+		.sync           = FB_SYNC_EXT,
+		.vmode          = FB_VMODE_NONINTERLACED
+} }, {
+	.bus	= 2,
+	.addr	= 0x48,
+	.pixfmt	= IPU_PIX_FMT_RGB666,
+	.detect	= detect_i2c,
+	.enable	= enable_rgb,
+	.mode	= {
+		.name           = "wvga-rgb",
+		.refresh        = 57,
+		.xres           = 800,
+		.yres           = 480,
+		.pixclock       = 37037,
+		.left_margin    = 40,
+		.right_margin   = 60,
+		.upper_margin   = 10,
+		.lower_margin   = 10,
+		.hsync_len      = 20,
+		.vsync_len      = 10,
+		.sync           = 0,
+		.vmode          = FB_VMODE_NONINTERLACED
+} } };
+
+int board_video_skip(void)
+{
+	int i;
+	int ret;
+	char const *panel = getenv("panel");
+	if (!panel) {
+		for (i = 0; i < ARRAY_SIZE(displays); i++) {
+			struct display_info_t const *dev = displays+i;
+			if (dev->detect(dev)) {
+				panel = dev->mode.name;
+				printf("auto-detected panel %s\n", panel);
+				break;
+			}
+		}
+		if (!panel) {
+			panel = displays[0].mode.name;
+			printf("No panel detected: default to %s\n", panel);
+		}
+	} else {
+		for (i = 0; i < ARRAY_SIZE(displays); i++) {
+			if (!strcmp(panel, displays[i].mode.name))
+				break;
+		}
+	}
+	if (i < ARRAY_SIZE(displays)) {
+		ret = ipuv3_fb_init(&displays[i].mode, 0,
+				    displays[i].pixfmt);
+		if (!ret) {
+			displays[i].enable(displays+i);
+			printf("Display: %s (%ux%u)\n",
+			       displays[i].mode.name,
+			       displays[i].mode.xres,
+			       displays[i].mode.yres);
+		} else
+			printf("LCD %s cannot be configured: %d\n",
+			       displays[i].mode.name, ret);
+	} else {
+		printf("unsupported panel %s\n", panel);
+		ret = -EINVAL;
+	}
+	return (0 != ret);
+}
+
+static void setup_display(void)
+{
+	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
+	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+	int reg;
+
+	/* Turn on LDB0,IPU,IPU DI0 clocks */
+	reg = __raw_readl(&mxc_ccm->CCGR3);
+	reg |=   MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET
+		|MXC_CCM_CCGR3_LDB_DI0_MASK;
+	writel(reg, &mxc_ccm->CCGR3);
+
+	/* Turn on HDMI PHY clock */
+	reg = __raw_readl(&mxc_ccm->CCGR2);
+	reg |=  MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_MASK
+	       |MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_MASK;
+	writel(reg, &mxc_ccm->CCGR2);
+
+	/* clear HDMI PHY reset */
+	__raw_writeb(HDMI_MC_PHYRSTZ_DEASSERT,
+		     HDMI_ARB_BASE_ADDR+HDMI_MC_PHYRSTZ);
+
+	/* set PFD1_FRAC to 0x13 == 455 MHz (480*18)/0x13 */
+	writel(ANATOP_PFD_480_PFD1_FRAC_MASK, &anatop->pfd_480_clr);
+	writel(0x13<<ANATOP_PFD_480_PFD1_FRAC_SHIFT, &anatop->pfd_480_set);
+
+	/* set LDB0, LDB1 clk select to 011/011 */
+	reg = readl(&mxc_ccm->cs2cdr);
+	reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
+		 |MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
+	reg |= (3<<MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
+	      |(3<<MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
+	writel(reg, &mxc_ccm->cs2cdr);
+
+	reg = readl(&mxc_ccm->cscmr2);
+	reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
+	writel(reg, &mxc_ccm->cscmr2);
+
+	reg = readl(&mxc_ccm->chsccdr);
+	reg &= ~(MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK
+		|MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK
+		|MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK);
+	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
+		<<MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET)
+	      |(CHSCCDR_PODF_DIVIDE_BY_3
+		<<MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET)
+	      |(CHSCCDR_IPU_PRE_CLK_540M_PFD
+		<<MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
+	writel(reg, &mxc_ccm->chsccdr);
+
+	reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
+	     |IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_HIGH
+	     |IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
+	     |IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
+	     |IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
+	     |IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
+	     |IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
+	     |IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED
+	     |IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0;
+	writel(reg, &iomux->gpr[2]);
+
+	reg = readl(&iomux->gpr[3]);
+	reg = (reg & ~IOMUXC_GPR3_LVDS0_MUX_CTL_MASK)
+	    | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
+	       <<IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET);
+	writel(reg, &iomux->gpr[3]);
+
+	/* backlights off until needed */
+	imx_iomux_v3_setup_multiple_pads(backlight_pads,
+					 ARRAY_SIZE(backlight_pads));
+	gpio_direction_input(LVDS_BACKLIGHT_GP);
+	gpio_direction_input(RGB_BACKLIGHT_GP);
+}
+#endif
+
+int board_early_init_f(void)
+{
+	setup_iomux_uart();
+	setup_buttons();
+
+#if defined(CONFIG_VIDEO_IPUV3)
+	setup_display();
+#endif
+	return 0;
+}
+
+/*
+ * Do not overwrite the console
+ * Use always serial for U-Boot console
+ */
+int overwrite_console(void)
+{
+	return 1;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+#ifdef CONFIG_MXC_SPI
+	setup_spi();
+#endif
+	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
+	setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+	setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
+
+#ifdef CONFIG_CMD_SATA
+	setup_sata();
+#endif
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: Nitrogen6X or MX6Q-Sabre Lite\n");
+
+       return 0;
+}
+
+struct button_key {
+	char const	*name;
+	unsigned	gpnum;
+	char		ident;
+};
+
+static struct button_key const buttons[] = {
+	{"back",	IMX_GPIO_NR(2, 2),	'B'},
+	{"home",	IMX_GPIO_NR(2, 4),	'H'},
+	{"menu",	IMX_GPIO_NR(2, 1),	'M'},
+	{"search",	IMX_GPIO_NR(2, 3),	'S'},
+	{"volup",	IMX_GPIO_NR(7, 13),	'V'},
+	{"voldown",	IMX_GPIO_NR(4, 5),	'v'},
+};
+
+/*
+ * generate a null-terminated string containing the buttons pressed
+ * returns number of keys pressed
+ */
+static int read_keys(char *buf)
+{
+	int i, numpressed = 0;
+	for (i = 0; i < ARRAY_SIZE(buttons); i++) {
+		if (!gpio_get_value(buttons[i].gpnum))
+			buf[numpressed++] = buttons[i].ident;
+	}
+	buf[numpressed] = '\0';
+	return numpressed;
+}
+
+static int do_kbd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	char envvalue[ARRAY_SIZE(buttons)+1];
+	int numpressed = read_keys(envvalue);
+	setenv("keybd", envvalue);
+	return numpressed == 0;
+}
+
+U_BOOT_CMD(
+	kbd, 1, 1, do_kbd,
+	"Tests for keypresses, sets 'keybd' environment variable",
+	"Returns 0 (true) to shell if key is pressed."
+);
+
+#ifdef CONFIG_PREBOOT
+static char const kbd_magic_prefix[] = "key_magic";
+static char const kbd_command_prefix[] = "key_cmd";
+
+static void preboot_keys(void)
+{
+	int numpressed;
+	char keypress[ARRAY_SIZE(buttons)+1];
+	numpressed = read_keys(keypress);
+	if (numpressed) {
+		char *kbd_magic_keys = getenv("magic_keys");
+		char *suffix;
+		/*
+		 * loop over all magic keys
+		 */
+		for (suffix = kbd_magic_keys; *suffix; ++suffix) {
+			char *keys;
+			char magic[sizeof(kbd_magic_prefix) + 1];
+			sprintf(magic, "%s%c", kbd_magic_prefix, *suffix);
+			keys = getenv(magic);
+			if (keys) {
+				if (!strcmp(keys, keypress))
+					break;
+			}
+		}
+		if (*suffix) {
+			char cmd_name[sizeof(kbd_command_prefix) + 1];
+			char *cmd;
+			sprintf(cmd_name, "%s%c", kbd_command_prefix, *suffix);
+			cmd = getenv(cmd_name);
+			if (cmd) {
+				setenv("preboot", cmd);
+				return;
+			}
+		}
+	}
+}
+#endif
+
+#ifdef CONFIG_CMD_BMODE
+static const struct boot_mode board_boot_modes[] = {
+	/* 4 bit bus width */
+	{"mmc0",	MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
+	{"mmc1",	MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00)},
+	{NULL,		0},
+};
+#endif
+
+int misc_init_r(void)
+{
+#ifdef CONFIG_PREBOOT
+	preboot_keys();
+#endif
+
+#ifdef CONFIG_CMD_BMODE
+	add_board_boot_modes(board_boot_modes);
+#endif
+	return 0;
+}
diff --git a/boards.cfg b/boards.cfg
index e9e073e..ac8e39d 100644
--- a/boards.cfg
+++ b/boards.cfg
@@ -234,6 +234,7 @@ mx6qarm2                     arm         armv7       mx6qarm2            freesca
 mx6qsabreauto                arm         armv7       mx6qsabreauto       freescale      mx6		mx6qsabreauto:IMX_CONFIG=board/freescale/mx6qsabreauto/imximage.cfg
 mx6qsabrelite                arm         armv7       mx6qsabrelite       freescale      mx6		mx6qsabrelite:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
 mx6qsabresd                  arm         armv7       mx6qsabresd         freescale      mx6		mx6qsabresd:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
+nitrogen6x                   arm         armv7       nitrogen6x          boundary       mx6		nitrogen6x:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
 cm_t35                       arm         armv7       cm_t35              -              omap3
 omap3_overo                  arm         armv7       overo               -              omap3
 omap3_pandora                arm         armv7       pandora             -              omap3
diff --git a/include/configs/nitrogen6x.h b/include/configs/nitrogen6x.h
new file mode 100644
index 0000000..f0ecf72
--- /dev/null
+++ b/include/configs/nitrogen6x.h
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the Boundary Devices Nitrogen6X
+ * and Freescale i.MX6Q Sabre Lite boards.
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_MX6Q
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define CONFIG_MACH_TYPE	3769
+
+#include <asm/arch/imx-regs.h>
+#include <asm/imx-common/gpio.h>
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN		(10 * 1024 * 1024)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_MISC_INIT_R
+#define CONFIG_MXC_GPIO
+
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE	       UART2_BASE
+
+#define CONFIG_CMD_SF
+#ifdef CONFIG_CMD_SF
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_SST
+#define CONFIG_MXC_SPI
+#define CONFIG_SF_DEFAULT_BUS  0
+#define CONFIG_SF_DEFAULT_CS   (0|(IMX_GPIO_NR(3, 19)<<8))
+#define CONFIG_SF_DEFAULT_SPEED 25000000
+#define CONFIG_SF_DEFAULT_MODE (SPI_MODE_0)
+#endif
+
+/* I2C Configs */
+#define CONFIG_CMD_I2C
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_MXC
+#define CONFIG_SYS_I2C_SPEED		100000
+
+/* MMC Configs */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_USDHC_NUM       2
+
+#define CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_CMD_SATA
+/*
+ * SATA Configs
+ */
+#ifdef CONFIG_CMD_SATA
+#define CONFIG_DWC_AHSATA
+#define CONFIG_SYS_SATA_MAX_DEVICE	1
+#define CONFIG_DWC_AHSATA_PORT_ID	0
+#define CONFIG_DWC_AHSATA_BASE_ADDR	SATA_ARB_BASE_ADDR
+#define CONFIG_LBA48
+#define CONFIG_LIBATA
+#endif
+
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NET
+#define CONFIG_FEC_MXC
+#define CONFIG_MII
+#define IMX_FEC_BASE			ENET_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE		RGMII
+#define CONFIG_ETHPRIME			"FEC"
+#define CONFIG_FEC_MXC_PHYADDR		6
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+#define CONFIG_PHY_MICREL_KSZ9021
+
+/* USB Configs */
+#define CONFIG_CMD_USB
+#define CONFIG_CMD_FAT
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_MX6
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+#define CONFIG_USB_ETHER_SMSC95XX
+#define CONFIG_MXC_USB_PORT	1
+#define CONFIG_MXC_USB_PORTSC	(PORT_PTS_UTMI | PORT_PTS_PTW)
+#define CONFIG_MXC_USB_FLAGS	0
+
+/* Miscellaneous commands */
+#define CONFIG_CMD_BMODE
+#define CONFIG_CMD_SETEXPR
+
+/* Framebuffer and LCD */
+#define CONFIG_VIDEO
+#define CONFIG_VIDEO_IPUV3
+#define CONFIG_CFB_CONSOLE
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
+#define CONFIG_VIDEO_BMP_RLE8
+#define CONFIG_SPLASH_SCREEN
+#define CONFIG_BMP_16BPP
+#define CONFIG_VIDEO_LOGO
+#define CONFIG_IPUV3_CLK 260000000
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX	       1
+#define CONFIG_BAUDRATE			       115200
+
+/* Command definition */
+#include <config_cmd_default.h>
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_BOOTDELAY	       3
+
+#define CONFIG_PREBOOT                 ""
+
+#define CONFIG_LOADADDR			       0x10800000
+#define CONFIG_SYS_TEXT_BASE	       0x17800000
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	"console=ttymxc1\0" \
+	"clearenv=if sf probe || sf probe || sf probe 1 ; then sf erase 0xc0000 0x2000 && " \
+		"echo restored environment to factory default ; fi\0" \
+	"bootcmd=for dtype in sata mmc ; do " \
+		"for disk in 0 1 ; do ${dtype} dev ${disk} ;" \
+			"for fs in fat ext2 ; do " \
+				"${fs}load ${dtype} ${disk}:1 10008000 " \
+					"/6q_bootscript" \
+					"&& source 10008000 ; " \
+			"done ; " \
+		"done ; " \
+	"done\0" \
+	"upgradeu=for dtype in sata mmc ; do " \
+		"for disk in 0 1 ; do ${dtype} dev ${disk} ;" \
+		     "for fs in fat ext2 ; do " \
+				"${fs}load ${dtype} ${disk}:1 10008000 " \
+					"/6q_upgrade " \
+					"&& source 10008000 ; " \
+			"done ; " \
+		"done ; " \
+	"done\0" \
+
+#define CONFIG_ARP_TIMEOUT     200UL
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT	       "U-Boot > "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE	       256
+
+/* Print Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS	       16
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
+
+#define CONFIG_SYS_MEMTEST_START       0x10000000
+#define CONFIG_SYS_MEMTEST_END	       0x10010000
+
+#define CONFIG_SYS_LOAD_ADDR	       CONFIG_LOADADDR
+#define CONFIG_SYS_HZ		       1000
+
+#define CONFIG_CMDLINE_EDITING
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS	       1
+#define PHYS_SDRAM		       MMDC0_ARB_BASE_ADDR
+#define PHYS_SDRAM_SIZE			       (1u * 1024 * 1024 * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE	       PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+/* FLASH and environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_ENV_SIZE			(8 * 1024)
+
+/* #define CONFIG_ENV_IS_IN_MMC */
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+
+#if defined(CONFIG_ENV_IS_IN_MMC)
+#define CONFIG_ENV_OFFSET		(6 * 64 * 1024)
+#define CONFIG_SYS_MMC_ENV_DEV		0
+#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
+#define CONFIG_ENV_OFFSET		(768 * 1024)
+#define CONFIG_ENV_SECT_SIZE		(8 * 1024)
+#define CONFIG_ENV_SPI_BUS		CONFIG_SF_DEFAULT_BUS
+#define CONFIG_ENV_SPI_CS		CONFIG_SF_DEFAULT_CS
+#define CONFIG_ENV_SPI_MODE		CONFIG_SF_DEFAULT_MODE
+#define CONFIG_ENV_SPI_MAX_HZ		CONFIG_SF_DEFAULT_SPEED
+#endif
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#define CONFIG_SYS_DCACHE_OFF
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+#define CONFIG_CMD_CACHE
+#endif
+
+#endif			       /* __CONFIG_H */
-- 
1.7.9

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

* [U-Boot] [PATCH 2/3] nitrogen6x: configure and toggle PHY reset for Nitrogen6x
  2012-10-04 19:49 [U-Boot] [PATCH 0/3] Add support for the Boundary Devices Nitrogen6x board Eric Nelson
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
@ 2012-10-04 19:49 ` Eric Nelson
  2012-10-04 19:49 ` [U-Boot] [PATCH 3/3] nitrogen6x: initialize WL12XX pads, use to determine board type Eric Nelson
  2 siblings, 0 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-04 19:49 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
---
 board/boundary/nitrogen6x/nitrogen6x.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c
index e70871d..469a044 100644
--- a/board/boundary/nitrogen6x/nitrogen6x.c
+++ b/board/boundary/nitrogen6x/nitrogen6x.c
@@ -174,6 +174,7 @@ iomux_v3_cfg_t const enet_pads1[] = {
 	MX6Q_PAD_RGMII_RX_CTL__GPIO_6_24	| MUX_PAD_CTRL(NO_PAD_CTRL),
 	/* pin 42 PHY nRST */
 	MX6Q_PAD_EIM_D23__GPIO_3_23		| MUX_PAD_CTRL(NO_PAD_CTRL),
+	MX6Q_PAD_ENET_RXD0__GPIO_1_27		| MUX_PAD_CTRL(NO_PAD_CTRL),
 };
 
 iomux_v3_cfg_t const enet_pads2[] = {
@@ -203,7 +204,8 @@ static iomux_v3_cfg_t const button_pads[] = {
 
 static void setup_iomux_enet(void)
 {
-	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
+	gpio_direction_output(IMX_GPIO_NR(3, 23), 0); /* SABRE Lite PHY rst */
+	gpio_direction_output(IMX_GPIO_NR(1, 27), 0); /* Nitrogen6X PHY rst */
 	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
 	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
 	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
@@ -214,7 +216,8 @@ static void setup_iomux_enet(void)
 
 	/* Need delay 10ms according to KSZ9021 spec */
 	udelay(1000 * 10);
-	gpio_set_value(IMX_GPIO_NR(3, 23), 1);
+	gpio_set_value(IMX_GPIO_NR(3, 23), 1); /* SABRE Lite PHY reset */
+	gpio_set_value(IMX_GPIO_NR(1, 27), 1); /* Nitrogen6X PHY reset */
 
 	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
 }
-- 
1.7.9

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

* [U-Boot] [PATCH 3/3] nitrogen6x: initialize WL12XX pads, use to determine board type
  2012-10-04 19:49 [U-Boot] [PATCH 0/3] Add support for the Boundary Devices Nitrogen6x board Eric Nelson
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
  2012-10-04 19:49 ` [U-Boot] [PATCH 2/3] nitrogen6x: configure and toggle PHY reset for Nitrogen6x Eric Nelson
@ 2012-10-04 19:49 ` Eric Nelson
  2012-10-08 12:32   ` Stefano Babic
  2 siblings, 1 reply; 22+ messages in thread
From: Eric Nelson @ 2012-10-04 19:49 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
---
 board/boundary/nitrogen6x/nitrogen6x.c |   34 +++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c
index 469a044..16469b7 100644
--- a/board/boundary/nitrogen6x/nitrogen6x.c
+++ b/board/boundary/nitrogen6x/nitrogen6x.c
@@ -69,6 +69,18 @@ DECLARE_GLOBAL_DATA_PTR;
 	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
 	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
 
+#define WEAK_PULLUP	(PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |		\
+	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
+	PAD_CTL_SRE_SLOW)
+
+#define WEAK_PULLDOWN	(PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |		\
+	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
+	PAD_CTL_SRE_SLOW)
+
+#define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
+
 int dram_init(void)
 {
        gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
@@ -186,6 +198,16 @@ iomux_v3_cfg_t const enet_pads2[] = {
 	MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
 };
 
+/* wl1271 pads on nitrogen6x */
+iomux_v3_cfg_t const wl12xx_pads[] = {
+	(MX6Q_PAD_NANDF_CS1__GPIO_6_14 & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(WEAK_PULLDOWN),
+	(MX6Q_PAD_NANDF_CS2__GPIO_6_15 & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(OUTPUT_40OHM),
+	(MX6Q_PAD_NANDF_CS3__GPIO_6_16 & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(OUTPUT_40OHM),
+};
+#define WL12XX_WL_IRQ_GP	IMX_GPIO_NR(6,14)
+#define WL12XX_WL_ENABLE_GP	IMX_GPIO_NR(6,15)
+#define WL12XX_BT_ENABLE_GP	IMX_GPIO_NR(6,16)
+
 /* Button assignments for J14 */
 static iomux_v3_cfg_t const button_pads[] = {
 	/* Menu */
@@ -695,6 +717,13 @@ static void setup_display(void)
 int board_early_init_f(void)
 {
 	setup_iomux_uart();
+
+	/* Disable wl1271 For Nitrogen6w */
+	gpio_direction_input(WL12XX_WL_IRQ_GP);
+	gpio_direction_output(WL12XX_WL_ENABLE_GP,0);
+	gpio_direction_output(WL12XX_BT_ENABLE_GP,0);
+
+	imx_iomux_v3_setup_multiple_pads(wl12xx_pads, ARRAY_SIZE(wl12xx_pads));
 	setup_buttons();
 
 #if defined(CONFIG_VIDEO_IPUV3)
@@ -733,7 +762,10 @@ int board_init(void)
 
 int checkboard(void)
 {
-       puts("Board: Nitrogen6X or MX6Q-Sabre Lite\n");
+	if (gpio_get_value(WL12XX_WL_IRQ_GP)) {
+		puts("Board: Nitrogen6X\n");
+	} else
+		puts("Board: SABRE Lite\n");
 
        return 0;
 }
-- 
1.7.9

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
@ 2012-10-04 21:42   ` Sinan Akman
  2012-10-04 21:51     ` Sinan Akman
  2012-10-04 21:56   ` Fabio Estevam
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 22+ messages in thread
From: Sinan Akman @ 2012-10-04 21:42 UTC (permalink / raw)
  To: u-boot

On 10/04/2012 03:49 PM, Eric Nelson wrote:
[..]
> +
> +static void setup_iomux_enet(void)
> +{
> +	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
> +	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
> +	imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
> +	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
> +
> +	/* Need delay 10ms according to KSZ9021 spec */
> +	udelay(1000 * 10);
> +	gpio_set_value(IMX_GPIO_NR(3, 23), 1);

	Don't you need a

	gpio_set_value(IMX_GPIO_NR(1, 27), 1);

	here for Nitrogen6x ?

> +
> +	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
> +}
> [...]

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-04 21:42   ` Sinan Akman
@ 2012-10-04 21:51     ` Sinan Akman
  0 siblings, 0 replies; 22+ messages in thread
From: Sinan Akman @ 2012-10-04 21:51 UTC (permalink / raw)
  To: u-boot

On 10/04/2012 05:42 PM, Sinan Akman wrote:
> On 10/04/2012 03:49 PM, Eric Nelson wrote:
> [..]
>> +    gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
>> +
>> +    /* Need delay 10ms according to KSZ9021 spec */
>> +    udelay(1000 * 10);
>> +    gpio_set_value(IMX_GPIO_NR(3, 23), 1);
>
>      Don't you need a
>
>      gpio_set_value(IMX_GPIO_NR(1, 27), 1);
>
>      here for Nitrogen6x ?
>

Never mind, I just saw that this is in a separate patch. Sorry
for the noise.

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
  2012-10-04 21:42   ` Sinan Akman
@ 2012-10-04 21:56   ` Fabio Estevam
  2012-10-05 17:24   ` Albert ARIBAUD
  2012-10-08 12:28   ` Stefano Babic
  3 siblings, 0 replies; 22+ messages in thread
From: Fabio Estevam @ 2012-10-04 21:56 UTC (permalink / raw)
  To: u-boot

On Thu, Oct 4, 2012 at 4:49 PM, Eric Nelson
<eric.nelson@boundarydevices.com> wrote:
> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> ---
>  board/boundary/nitrogen6x/Makefile     |   41 ++
>  board/boundary/nitrogen6x/README       |   77 +++
>  board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
>  boards.cfg                             |    1 +
>  include/configs/nitrogen6x.h           |  242 +++++++++
>  5 files changed, 1201 insertions(+), 0 deletions(-)
>  create mode 100644 board/boundary/nitrogen6x/Makefile
>  create mode 100644 board/boundary/nitrogen6x/README
>  create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>  create mode 100644 include/configs/nitrogen6x.h

You missed an entry to MAINTAINERS file.

Regards,

Fabio Estevam

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
  2012-10-04 21:42   ` Sinan Akman
  2012-10-04 21:56   ` Fabio Estevam
@ 2012-10-05 17:24   ` Albert ARIBAUD
  2012-10-05 18:42     ` Eric Nelson
  2012-10-08 12:28   ` Stefano Babic
  3 siblings, 1 reply; 22+ messages in thread
From: Albert ARIBAUD @ 2012-10-05 17:24 UTC (permalink / raw)
  To: u-boot

Hi Eric,

On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
<eric.nelson@boundarydevices.com> wrote:

> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> ---
>  board/boundary/nitrogen6x/Makefile     |   41 ++
>  board/boundary/nitrogen6x/README       |   77 +++
>  board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
>  boards.cfg                             |    1 +
>  include/configs/nitrogen6x.h           |  242 +++++++++
>  5 files changed, 1201 insertions(+), 0 deletions(-)
>  create mode 100644 board/boundary/nitrogen6x/Makefile
>  create mode 100644 board/boundary/nitrogen6x/README
>  create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>  create mode 100644 include/configs/nitrogen6x.h

If this is essentially a copy of sabrelite, I am surprised that git
does not report any copies. Did you use -C with git format-patch ?

Amicalement,
-- 
Albert.

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 17:24   ` Albert ARIBAUD
@ 2012-10-05 18:42     ` Eric Nelson
  2012-10-05 19:00       ` Tom Rini
  2012-10-05 19:29       ` Albert ARIBAUD
  0 siblings, 2 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-05 18:42 UTC (permalink / raw)
  To: u-boot

On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
> Hi Eric,
>
> On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
> <eric.nelson@boundarydevices.com>  wrote:
>
>> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
>> ---
>>   board/boundary/nitrogen6x/Makefile     |   41 ++
>>   board/boundary/nitrogen6x/README       |   77 +++
>>   board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
>>   boards.cfg                             |    1 +
>>   include/configs/nitrogen6x.h           |  242 +++++++++
>>   5 files changed, 1201 insertions(+), 0 deletions(-)
>>   create mode 100644 board/boundary/nitrogen6x/Makefile
>>   create mode 100644 board/boundary/nitrogen6x/README
>>   create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>>   create mode 100644 include/configs/nitrogen6x.h
>
> If this is essentially a copy of sabrelite, I am surprised that git
> does not report any copies. Did you use -C with git format-patch ?
>

Hi Albert,

I didn't use '-C' (didn't know about it: thanks for the tip!).

It wouldn't have detected copies though, because I made slight
changes in each of these files, replacing the board names and
file names in board/boundary/ and altering the default environment
(policy bits) in nitrogen6x.h.

Regards,


Eric

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 18:42     ` Eric Nelson
@ 2012-10-05 19:00       ` Tom Rini
  2012-10-05 20:03         ` Eric Nelson
  2012-10-05 19:29       ` Albert ARIBAUD
  1 sibling, 1 reply; 22+ messages in thread
From: Tom Rini @ 2012-10-05 19:00 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 05, 2012 at 11:42:19AM -0700, Eric Nelson wrote:
> On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
> >Hi Eric,
> >
> >On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
> ><eric.nelson@boundarydevices.com>  wrote:
> >
> >>Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
> >>---
> >>  board/boundary/nitrogen6x/Makefile     |   41 ++
> >>  board/boundary/nitrogen6x/README       |   77 +++
> >>  board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
> >>  boards.cfg                             |    1 +
> >>  include/configs/nitrogen6x.h           |  242 +++++++++
> >>  5 files changed, 1201 insertions(+), 0 deletions(-)
> >>  create mode 100644 board/boundary/nitrogen6x/Makefile
> >>  create mode 100644 board/boundary/nitrogen6x/README
> >>  create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
> >>  create mode 100644 include/configs/nitrogen6x.h
> >
> >If this is essentially a copy of sabrelite, I am surprised that git
> >does not report any copies. Did you use -C with git format-patch ?
> >
> 
> Hi Albert,
> 
> I didn't use '-C' (didn't know about it: thanks for the tip!).
> 
> It wouldn't have detected copies though, because I made slight
> changes in each of these files, replacing the board names and
> file names in board/boundary/ and altering the default environment
> (policy bits) in nitrogen6x.h.

And we can't deal with this by factoring the code differently?

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121005/2a5db59e/attachment.pgp>

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 18:42     ` Eric Nelson
  2012-10-05 19:00       ` Tom Rini
@ 2012-10-05 19:29       ` Albert ARIBAUD
  2012-10-06  0:23         ` Eric Nelson
  1 sibling, 1 reply; 22+ messages in thread
From: Albert ARIBAUD @ 2012-10-05 19:29 UTC (permalink / raw)
  To: u-boot

Hi Eric,

On Fri, 05 Oct 2012 11:42:19 -0700, Eric Nelson
<eric.nelson@boundarydevices.com> wrote:

> On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
> > Hi Eric,
> >
> > On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
> > <eric.nelson@boundarydevices.com>  wrote:
> >
> >> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
> >> ---
> >>   board/boundary/nitrogen6x/Makefile     |   41 ++
> >>   board/boundary/nitrogen6x/README       |   77 +++
> >>   board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
> >>   boards.cfg                             |    1 +
> >>   include/configs/nitrogen6x.h           |  242 +++++++++
> >>   5 files changed, 1201 insertions(+), 0 deletions(-)
> >>   create mode 100644 board/boundary/nitrogen6x/Makefile
> >>   create mode 100644 board/boundary/nitrogen6x/README
> >>   create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
> >>   create mode 100644 include/configs/nitrogen6x.h
> >
> > If this is essentially a copy of sabrelite, I am surprised that git
> > does not report any copies. Did you use -C with git format-patch ?
> >
> 
> Hi Albert,
> 
> I didn't use '-C' (didn't know about it: thanks for the tip!).
> 
> It wouldn't have detected copies though, because I made slight
> changes in each of these files, replacing the board names and
> file names in board/boundary/ and altering the default environment
> (policy bits) in nitrogen6x.h.

You should try -C. It does actually handle well 'imperfect' copies with
slight, or not so light changes.

> Regards,
> 
> Eric

Amicalement,
-- 
Albert.

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 19:00       ` Tom Rini
@ 2012-10-05 20:03         ` Eric Nelson
  2012-10-05 22:46           ` Tom Rini
  2012-10-08 12:54           ` Stefano Babic
  0 siblings, 2 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-05 20:03 UTC (permalink / raw)
  To: u-boot

On 10/05/2012 12:00 PM, Tom Rini wrote:
> On Fri, Oct 05, 2012 at 11:42:19AM -0700, Eric Nelson wrote:
>> On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
>>> Hi Eric,
>>>
>>> On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
>>> <eric.nelson@boundarydevices.com>   wrote:
>>>
>>>> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
>>>> ---
>>>>   board/boundary/nitrogen6x/Makefile     |   41 ++
>>>>   board/boundary/nitrogen6x/README       |   77 +++
>>>>   board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
>>>>   boards.cfg                             |    1 +
>>>>   include/configs/nitrogen6x.h           |  242 +++++++++
>>>>   5 files changed, 1201 insertions(+), 0 deletions(-)
>>>>   create mode 100644 board/boundary/nitrogen6x/Makefile
>>>>   create mode 100644 board/boundary/nitrogen6x/README
>>>>   create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>>>>   create mode 100644 include/configs/nitrogen6x.h
>>>
>>> If this is essentially a copy of sabrelite, I am surprised that git
>>> does not report any copies. Did you use -C with git format-patch ?
>>>
>>
>> Hi Albert,
>>
>> I didn't use '-C' (didn't know about it: thanks for the tip!).
>>
>> It wouldn't have detected copies though, because I made slight
>> changes in each of these files, replacing the board names and
>> file names in board/boundary/ and altering the default environment
>> (policy bits) in nitrogen6x.h.
>
> And we can't deal with this by factoring the code differently?
>
Hi Tom,

There are two bits to this question:
	- Can we represent the policy differences outside of a
	board structure? These differences are all inside of
	include/configs/nitrogen6x.

	I'm not certain how, but I suspect that we can get
	a different _config to work for this.

	- Can we represent the board differences without a
	board structure? This is a bit harder, since the
	boards are slightly different. The Nitrogen6X has
	a different ethernet PHY reset pin and an optional
	SDIO Wi-Fi module.

	We could add code to SABRE Lite to accommodate these,
	but it seems that sets a bad precedent. Would this
	be done for every vendor that bases a design on
	SABRE Lite?

The precise diffs for the configs and sources is attached for
reference.

I've also been pondering how to simply re-use the code within
the board setup file (mx6qsabrelite.c), but I haven't figured
anything out. Clearly a lot of the code is duplicated, but at
the same time it's board-specific.

For example, we could create a common module that sets up
the SD card pads "like SABRE Lite", and a similar one to
configure ethernet pads. Since SABRE Lite is a reference design,
perhaps that makes sense.

Does anybody have thoughts about how and where this might be
sliced?


Regards,


Eric
-------------- next part --------------
A non-text attachment was scrubbed...
Name: config-diffs.patch
Type: text/x-patch
Size: 3444 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121005/7299194e/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: board-diffs.patch
Type: text/x-patch
Size: 3044 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121005/7299194e/attachment-0001.bin>

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 20:03         ` Eric Nelson
@ 2012-10-05 22:46           ` Tom Rini
  2012-10-08 12:54           ` Stefano Babic
  1 sibling, 0 replies; 22+ messages in thread
From: Tom Rini @ 2012-10-05 22:46 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 05, 2012 at 01:03:10PM -0700, Eric Nelson wrote:
> On 10/05/2012 12:00 PM, Tom Rini wrote:
[snip]
> >And we can't deal with this by factoring the code differently?
> >
> Hi Tom,
> 
> There are two bits to this question:
> 	- Can we represent the policy differences outside of a
> 	board structure? These differences are all inside of
> 	include/configs/nitrogen6x.
> 
> 	I'm not certain how, but I suspect that we can get
> 	a different _config to work for this.
> 
> 	- Can we represent the board differences without a
> 	board structure? This is a bit harder, since the
> 	boards are slightly different. The Nitrogen6X has
> 	a different ethernet PHY reset pin and an optional
> 	SDIO Wi-Fi module.
> 
> 	We could add code to SABRE Lite to accommodate these,
> 	but it seems that sets a bad precedent. Would this
> 	be done for every vendor that bases a design on
> 	SABRE Lite?
> 
> The precise diffs for the configs and sources is attached for
> reference.
> 
> I've also been pondering how to simply re-use the code within
> the board setup file (mx6qsabrelite.c), but I haven't figured
> anything out. Clearly a lot of the code is duplicated, but at
> the same time it's board-specific.
> 
> For example, we could create a common module that sets up
> the SD card pads "like SABRE Lite", and a similar one to
> configure ethernet pads. Since SABRE Lite is a reference design,
> perhaps that makes sense.
> 
> Does anybody have thoughts about how and where this might be
> sliced?

Dice some bits of board/freescale/mx6qsabrelite/mx6qsabrelite.c into
arch/arm/cpu/armv7/mx6/board.c (or some other filename in mx6/) ?  This
is what we do on the various OMAP families, and use a few hooks for "let
the board fill in this part of setup".  Possibly re-use and update
mx6/soc.c even.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121005/9a785189/attachment.pgp>

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 19:29       ` Albert ARIBAUD
@ 2012-10-06  0:23         ` Eric Nelson
  0 siblings, 0 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-06  0:23 UTC (permalink / raw)
  To: u-boot

On 10/05/2012 12:29 PM, Albert ARIBAUD wrote:
> Hi Eric,
>
> On Fri, 05 Oct 2012 11:42:19 -0700, Eric Nelson
> <eric.nelson@boundarydevices.com>  wrote:
>
>> On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
>>> Hi Eric,
>>>
>>> On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
>>> <eric.nelson@boundarydevices.com>   wrote:
>>>
>>>> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
>>>> ---
>>>>    board/boundary/nitrogen6x/Makefile     |   41 ++
>>>>    board/boundary/nitrogen6x/README       |   77 +++
>>>>    board/boundary/nitrogen6x/nitrogen6x.c |  840 ++++++++++++++++++++++++++++++++
>>>>    boards.cfg                             |    1 +
>>>>    include/configs/nitrogen6x.h           |  242 +++++++++
>>>>    5 files changed, 1201 insertions(+), 0 deletions(-)
>>>>    create mode 100644 board/boundary/nitrogen6x/Makefile
>>>>    create mode 100644 board/boundary/nitrogen6x/README
>>>>    create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>>>>    create mode 100644 include/configs/nitrogen6x.h
>>>
>>> If this is essentially a copy of sabrelite, I am surprised that git
>>> does not report any copies. Did you use -C with git format-patch ?
>>>
>>
>> Hi Albert,
>>
>> I didn't use '-C' (didn't know about it: thanks for the tip!).
>>
>> It wouldn't have detected copies though, because I made slight
>> changes in each of these files, replacing the board names and
>> file names in board/boundary/ and altering the default environment
>> (policy bits) in nitrogen6x.h.
>
> You should try -C. It does actually handle well 'imperfect' copies with
> slight, or not so light changes.
>

Thanks again for the tip Albert. I'll use this for V2 (and knowing my
history, probably V3...).

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
                     ` (2 preceding siblings ...)
  2012-10-05 17:24   ` Albert ARIBAUD
@ 2012-10-08 12:28   ` Stefano Babic
  2012-10-08 16:05     ` Eric Nelson
  3 siblings, 1 reply; 22+ messages in thread
From: Stefano Babic @ 2012-10-08 12:28 UTC (permalink / raw)
  To: u-boot

On 04/10/2012 21:49, Eric Nelson wrote:
> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> ---

Hi Eric,


> diff --git a/board/boundary/nitrogen6x/README b/board/boundary/nitrogen6x/README
> new file mode 100644
> index 0000000..d67cdf0
> --- /dev/null
> +++ b/board/boundary/nitrogen6x/README
> @@ -0,0 +1,77 @@
> +U-Boot for the Boundary Devices Nitrogen6X and
> +Freescale i.MX6q SabreLite boards
> +
> +This file contains information for the port of 
> +U-Boot to the Boundary Devices Nitrogen6X and
> +Freescale i.MX6q SabreLite boards.
> +
> +1. Boot source, boot from SPI NOR
> +---------------------------------
> +The configuration in this directory supports both the
> +Nitrogen6X and Freescale SabreLite board, but in a 
> +different fashion from Freescale's implementation in 
> +board/freescale/mx6qsabrelite.
> +
> +In particular, this image supports booting from SPI NOR
> +and saving the environment to SPI NOR.
> +
> +It does not support 'boot from SD' at offset 0x400
> +except through the 'bmode' command.
> +	http://lists.denx.de/pipermail/u-boot/2012-August/131151.html

bmode is mainline. You can drop the link.

> +
> +2. Boots using 6q_bootscript on SATA or SD card
> +-----------------------------------------------
> +The default bootcmd for these boards is configured
> +to look for and source a boot script named '6q_bootscript'
> +in the root of the first partition of the following 
> +devices:
> +
> +	sata 0
> +	mmc 0
> +	mmc 1
> +
> +They're searched in the order listed above, trying both the
> +ext2 and fat filesystems.

Really the script search also for "sata 1", even if it does not exist.

> +2. Maintaining the SPI NOR
> +--------------------------
> +A couple of convenience commands
> +
> +	clearenv - clear environment to factory default
> +	upgradeu - look and source a boot script named
> +		'6q_upgrade' to upgrade the U-Boot version 
> +		in SPI NOR. The search is the same as for 
> +		6q_bootscript described above.

This is your decision. But I think it can make some confusion for users
that expects that everything is contained in u-boot. 6q_upgrade is not
included here and it remains obscured how the update is done. Is there
good reason why do you not add a script for updating u-boot directly to
CONFIG_EXTRA_ENV_SETTINGS ?

> +
> +3. Display support
> +------------------
> +U-Boot support for the following displays is configured by 
> +default:
> +
> +    HDMI           - 1024 x 768 for maximum compatibility
> +    Hannstar-XGA   - 1024 x 768 LVDS (Freescale part number MCIMX-LVDS1)
> +    wsvga-lvds     - 1024 x 600 LVDS (Boundary p/n Nit6X_1024x600)
> +    wvga-rgb       - 800 x 480 RGB (Boundary p/n Nit6X_800x480)
> +    
> +Since the ipuv3_fb display driver currently supports only a single display,
> +this code auto-detects panel by probing the HDMI Phy for Hot Plug Detect
> +or the I2C touch controller of the LVDS and RGB displays in the priority
> +listed above.
> +    
> +Setting 'panel' environment variable to one of the names above will
> +override auto-detection and force activation of the specified panel.
> +
> +4. Building
> +------------
> +
> +To build U-Boot for the Nitrogen6x or SabreLite board:
> +
> +	make nitrogen6x_config
> +	make u-boot.imx

I think the second one is superfluous, and simply "make" generates th
eu-boot.imx binary.

> +
> +If you place the u-boot.imx into a single-partition SD card
> +along with a binary version of the boot script 6q_upgrade.txt,
> +you can program it using 'upgradeu':

Right, but  6q_upgrade.txt is not included. The u-boot documentation
should be self explained: I mean, all ode should be provided (scripts
included) or there are some links for users to inform what they can find
what is missing.

> diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c
> new file mode 100644
> index 0000000..e70871d
> --- /dev/null
> +++ b/board/boundary/nitrogen6x/nitrogen6x.c
> @@ -0,0 +1,840 @@
> +/*
> + * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
> + *
> + * 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 <common.h>
> +#include <asm/io.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/imx-regs.h>
> +#include <asm/arch/iomux.h>
> +#include <asm/arch/mx6x_pins.h>
> +#include <asm/errno.h>
> +#include <asm/gpio.h>
> +#include <asm/imx-common/iomux-v3.h>
> +#include <asm/imx-common/mxc_i2c.h>
> +#include <asm/imx-common/boot_mode.h>
> +#include <mmc.h>
> +#include <fsl_esdhc.h>
> +#include <micrel.h>
> +#include <miiphy.h>
> +#include <netdev.h>
> +#include <linux/fb.h>
> +#include <ipu_pixfmt.h>
> +#include <asm/arch/crm_regs.h>
> +#include <asm/arch/mxc_hdmi.h>
> +#include <i2c.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |	       \
> +       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |	       \
> +       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
> +
> +#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |	       \
> +       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |	       \
> +       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
> +
> +#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED	  |		\
> +	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
> +
> +#define SPI_PAD_CTRL (PAD_CTL_HYS |				\
> +	PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |		\
> +	PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
> +
> +#define BUTTON_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |		\
> +	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
> +
> +#define I2C_PAD_CTRL	(PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |		\
> +	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
> +	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
> +
> +int dram_init(void)
> +{
> +       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> +
> +       return 0;
> +}

I will come later to this point when I will test the imx image changes.
Troy introduced a imx_ddr_size() - I will send my comment for that. I
have supposed that you needed here.

> +
> +iomux_v3_cfg_t const uart1_pads[] = {
> +	MX6Q_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6Q_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
> +};
> +
> +iomux_v3_cfg_t const uart2_pads[] = {
> +       MX6Q_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
> +       MX6Q_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
> +};
> +
> +#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
> +
> +/* I2C1, SGTL5000 */
> +struct i2c_pads_info i2c_pad_info0 = {
> +	.scl = {
> +		.i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
> +		.gpio_mode = MX6Q_PAD_EIM_D21__GPIO_3_21 | PC,
> +		.gp = IMX_GPIO_NR(3, 21)
> +	},
> +	.sda = {
> +		.i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
> +		.gpio_mode = MX6Q_PAD_EIM_D28__GPIO_3_28 | PC,
> +		.gp = IMX_GPIO_NR(3, 28)
> +	}
> +};
> +
> +/* I2C2 Camera, MIPI */
> +struct i2c_pads_info i2c_pad_info1 = {
> +	.scl = {
> +		.i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
> +		.gpio_mode = MX6Q_PAD_KEY_COL3__GPIO_4_12 | PC,
> +		.gp = IMX_GPIO_NR(4, 12)
> +	},
> +	.sda = {
> +		.i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
> +		.gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO_4_13 | PC,
> +		.gp = IMX_GPIO_NR(4, 13)
> +	}
> +};
> +
> +/* I2C3, J15 - RGB connector */
> +struct i2c_pads_info i2c_pad_info2 = {
> +	.scl = {
> +		.i2c_mode = MX6Q_PAD_GPIO_5__I2C3_SCL | PC,
> +		.gpio_mode = MX6Q_PAD_GPIO_5__GPIO_1_5 | PC,
> +		.gp = IMX_GPIO_NR(1, 5)
> +	},
> +	.sda = {
> +		.i2c_mode = MX6Q_PAD_GPIO_16__I2C3_SDA | PC,
> +		.gpio_mode = MX6Q_PAD_GPIO_16__GPIO_7_11 | PC,
> +		.gp = IMX_GPIO_NR(7, 11)
> +	}
> +};
> +
> +iomux_v3_cfg_t const usdhc3_pads[] = {
> +       MX6Q_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD3_DAT5__GPIO_7_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
> +};
> +
> +iomux_v3_cfg_t const usdhc4_pads[] = {
> +       MX6Q_PAD_SD4_CLK__USDHC4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD4_CMD__USDHC4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +       MX6Q_PAD_NANDF_D6__GPIO_2_6    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
> +};
> +
> +iomux_v3_cfg_t const enet_pads1[] = {
> +	MX6Q_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	/* pin 35 - 1 (PHY_AD2) on reset */
> +	MX6Q_PAD_RGMII_RXC__GPIO_6_30		| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	/* pin 32 - 1 - (MODE0) all */
> +	MX6Q_PAD_RGMII_RD0__GPIO_6_25		| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	/* pin 31 - 1 - (MODE1) all */
> +	MX6Q_PAD_RGMII_RD1__GPIO_6_27		| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	/* pin 28 - 1 - (MODE2) all */
> +	MX6Q_PAD_RGMII_RD2__GPIO_6_28		| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	/* pin 27 - 1 - (MODE3) all */
> +	MX6Q_PAD_RGMII_RD3__GPIO_6_29		| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	/* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
> +	MX6Q_PAD_RGMII_RX_CTL__GPIO_6_24	| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	/* pin 42 PHY nRST */
> +	MX6Q_PAD_EIM_D23__GPIO_3_23		| MUX_PAD_CTRL(NO_PAD_CTRL),
> +};
> +
> +iomux_v3_cfg_t const enet_pads2[] = {
> +	MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> +};
> +
> +/* Button assignments for J14 */
> +static iomux_v3_cfg_t const button_pads[] = {
> +	/* Menu */
> +	MX6Q_PAD_NANDF_D1__GPIO_2_1	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Back */
> +	MX6Q_PAD_NANDF_D2__GPIO_2_2	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Labelled Search (mapped to Power under Android) */
> +	MX6Q_PAD_NANDF_D3__GPIO_2_3	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Home */
> +	MX6Q_PAD_NANDF_D4__GPIO_2_4	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Volume Down */
> +	MX6Q_PAD_GPIO_19__GPIO_4_5	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Volume Up */
> +	MX6Q_PAD_GPIO_18__GPIO_7_13	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +};
> +
> +static void setup_iomux_enet(void)
> +{
> +	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
> +	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
> +	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
> +	imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
> +	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
> +
> +	/* Need delay 10ms according to KSZ9021 spec */
> +	udelay(1000 * 10);
> +	gpio_set_value(IMX_GPIO_NR(3, 23), 1);
> +
> +	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
> +}
> +
> +iomux_v3_cfg_t const usb_pads[] = {
> +	MX6Q_PAD_GPIO_17__GPIO_7_12 | MUX_PAD_CTRL(NO_PAD_CTRL),
> +};
> +
> +static void setup_iomux_uart(void)
> +{
> +	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
> +       imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));

Are there some spaces instead of tab ?

> +}
> +
> +#ifdef CONFIG_USB_EHCI_MX6
> +int board_ehci_hcd_init(int port)
> +{
> +	imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
> +
> +	/* Reset USB hub */
> +	gpio_direction_output(IMX_GPIO_NR(7, 12), 0);
> +	mdelay(2);
> +	gpio_set_value(IMX_GPIO_NR(7, 12), 1);
> +
> +	return 0;
> +}
> +#endif
> +
> +#ifdef CONFIG_FSL_ESDHC
> +struct fsl_esdhc_cfg usdhc_cfg[2] = {
> +       {USDHC3_BASE_ADDR},
> +       {USDHC4_BASE_ADDR},
> +};
> +
> +int board_mmc_getcd(struct mmc *mmc)
> +{
> +       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
> +       int ret;
> +
> +       if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
> +		gpio_direction_input(IMX_GPIO_NR(7, 0));
> +		ret = !gpio_get_value(IMX_GPIO_NR(7, 0));
> +       } else {
> +		gpio_direction_input(IMX_GPIO_NR(2, 6));
> +		ret = !gpio_get_value(IMX_GPIO_NR(2, 6));
> +       }
> +
> +       return ret;
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> +       s32 status = 0;
> +       u32 index = 0;
> +
> +       for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
> +	       switch (index) {
> +	       case 0:
> +		       imx_iomux_v3_setup_multiple_pads(
> +			       usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
> +		       break;
> +	       case 1:
> +		       imx_iomux_v3_setup_multiple_pads(
> +			       usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
> +		       break;
> +	       default:
> +		       printf("Warning: you configured more USDHC controllers"
> +			       "(%d) then supported by the board (%d)\n",
> +			       index + 1, CONFIG_SYS_FSL_USDHC_NUM);
> +		       return status;
> +	       }
> +
> +	       status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
> +       }
> +
> +       return status;
> +}
> +#endif
> +
> +u32 get_board_rev(void)
> +{
> +	return 0x63000 ;
> +}
> +
> +#ifdef CONFIG_MXC_SPI
> +iomux_v3_cfg_t const ecspi1_pads[] = {
> +	/* SS1 */
> +	MX6Q_PAD_EIM_D19__GPIO_3_19   | MUX_PAD_CTRL(SPI_PAD_CTRL),
> +	MX6Q_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
> +	MX6Q_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
> +	MX6Q_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
> +};
> +
> +void setup_spi(void)
> +{
> +	gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
> +	imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
> +					 ARRAY_SIZE(ecspi1_pads));
> +}
> +#endif
> +
> +int board_phy_config(struct phy_device *phydev)
> +{
> +	/* min rx data delay */
> +	ksz9021_phy_extended_write(phydev,
> +			MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x0);
> +	/* min tx data delay */
> +	ksz9021_phy_extended_write(phydev,
> +			MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x0);
> +	/* max rx/tx clock delay, min rx/tx control */
> +	ksz9021_phy_extended_write(phydev,
> +			MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf0f0);
> +	if (phydev->drv->config)
> +		phydev->drv->config(phydev);
> +
> +	return 0;
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> +	int ret;
> +
> +	setup_iomux_enet();
> +
> +	ret = cpu_eth_init(bis);
> +	if (ret)
> +		printf("FEC MXC: %s:failed\n", __func__);
> +
> +	return 0;
> +}

Maybe you can move setup_iomux_enet() in another board function and drop
board_eth_init(). cpu_eth_init() is called then in general code.

> +
> +static void setup_buttons(void)
> +{
> +	imx_iomux_v3_setup_multiple_pads(button_pads,
> +					 ARRAY_SIZE(button_pads));
> +}
> +
> +#ifdef CONFIG_CMD_SATA
> +
> +int setup_sata(void)
> +{
> +	struct iomuxc_base_regs *const iomuxc_regs
> +		= (struct iomuxc_base_regs *) IOMUXC_BASE_ADDR;
> +	int ret = enable_sata_clock();
> +	if (ret)
> +		return ret;
> +
> +	clrsetbits_le32(&iomuxc_regs->gpr[13],
> +			IOMUXC_GPR13_SATA_MASK,
> +			IOMUXC_GPR13_SATA_PHY_8_RXEQ_3P0DB
> +			|IOMUXC_GPR13_SATA_PHY_7_SATA2M
> +			|IOMUXC_GPR13_SATA_SPEED_3G
> +			|(3<<IOMUXC_GPR13_SATA_PHY_6_SHIFT)
> +			|IOMUXC_GPR13_SATA_SATA_PHY_5_SS_DISABLED
> +			|IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_9_16
> +			|IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P00_DB
> +			|IOMUXC_GPR13_SATA_PHY_2_TX_1P104V
> +			|IOMUXC_GPR13_SATA_PHY_1_SLOW);
> +
> +	return 0;
> +}
> +#endif
> +
> +#if defined(CONFIG_VIDEO_IPUV3)
> +
> +static iomux_v3_cfg_t const backlight_pads[] = {
> +	/* Backlight on RGB connector: J15 */
> +	MX6Q_PAD_SD1_DAT3__GPIO_1_21 | MUX_PAD_CTRL(NO_PAD_CTRL),
> +#define RGB_BACKLIGHT_GP IMX_GPIO_NR(1, 21)
> +
> +	/* Backlight on LVDS connector: J6 */
> +	MX6Q_PAD_SD1_CMD__GPIO_1_18 | MUX_PAD_CTRL(NO_PAD_CTRL),
> +#define LVDS_BACKLIGHT_GP IMX_GPIO_NR(1, 18)
> +};
> +
> +static iomux_v3_cfg_t const rgb_pads[] = {
> +	MX6Q_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK,
> +	MX6Q_PAD_DI0_PIN15__IPU1_DI0_PIN15,
> +	MX6Q_PAD_DI0_PIN2__IPU1_DI0_PIN2,
> +	MX6Q_PAD_DI0_PIN3__IPU1_DI0_PIN3,
> +	MX6Q_PAD_DI0_PIN4__GPIO_4_20,
> +	MX6Q_PAD_DISP0_DAT0__IPU1_DISP0_DAT_0,
> +	MX6Q_PAD_DISP0_DAT1__IPU1_DISP0_DAT_1,
> +	MX6Q_PAD_DISP0_DAT2__IPU1_DISP0_DAT_2,
> +	MX6Q_PAD_DISP0_DAT3__IPU1_DISP0_DAT_3,
> +	MX6Q_PAD_DISP0_DAT4__IPU1_DISP0_DAT_4,
> +	MX6Q_PAD_DISP0_DAT5__IPU1_DISP0_DAT_5,
> +	MX6Q_PAD_DISP0_DAT6__IPU1_DISP0_DAT_6,
> +	MX6Q_PAD_DISP0_DAT7__IPU1_DISP0_DAT_7,
> +	MX6Q_PAD_DISP0_DAT8__IPU1_DISP0_DAT_8,
> +	MX6Q_PAD_DISP0_DAT9__IPU1_DISP0_DAT_9,
> +	MX6Q_PAD_DISP0_DAT10__IPU1_DISP0_DAT_10,
> +	MX6Q_PAD_DISP0_DAT11__IPU1_DISP0_DAT_11,
> +	MX6Q_PAD_DISP0_DAT12__IPU1_DISP0_DAT_12,
> +	MX6Q_PAD_DISP0_DAT13__IPU1_DISP0_DAT_13,
> +	MX6Q_PAD_DISP0_DAT14__IPU1_DISP0_DAT_14,
> +	MX6Q_PAD_DISP0_DAT15__IPU1_DISP0_DAT_15,
> +	MX6Q_PAD_DISP0_DAT16__IPU1_DISP0_DAT_16,
> +	MX6Q_PAD_DISP0_DAT17__IPU1_DISP0_DAT_17,
> +	MX6Q_PAD_DISP0_DAT18__IPU1_DISP0_DAT_18,
> +	MX6Q_PAD_DISP0_DAT19__IPU1_DISP0_DAT_19,
> +	MX6Q_PAD_DISP0_DAT20__IPU1_DISP0_DAT_20,
> +	MX6Q_PAD_DISP0_DAT21__IPU1_DISP0_DAT_21,
> +	MX6Q_PAD_DISP0_DAT22__IPU1_DISP0_DAT_22,
> +	MX6Q_PAD_DISP0_DAT23__IPU1_DISP0_DAT_23,
> +};
> +
> +struct display_info_t {
> +	int	bus;
> +	int	addr;
> +	int	pixfmt;
> +	int	(*detect)(struct display_info_t const *dev);
> +	void	(*enable)(struct display_info_t const *dev);
> +	struct	fb_videomode mode;
> +};
> +
> +
> +static int detect_hdmi(struct display_info_t const *dev)
> +{
> +	return __raw_readb(HDMI_ARB_BASE_ADDR+HDMI_PHY_STAT0) & HDMI_PHY_HPD;
> +}
> +
> +static void enable_hdmi(struct display_info_t const *dev)
> +{
> +	u8 reg;
> +	printf("%s: setup HDMI monitor\n", __func__);
> +	reg = __raw_readb(
> +			HDMI_ARB_BASE_ADDR
> +			+HDMI_PHY_CONF0);

Accesses with base + offset are forbidden in u-boot. Please add
structures for this.

> +
> +static int detect_i2c(struct display_info_t const *dev)
> +{
> +	return ((0 == i2c_set_bus_num(dev->bus))
> +		&&
> +		(0 == i2c_probe(dev->addr)));
> +}

This is an original form of if (!i2c_set_bus_num() &&
!i2c_probe(dev->addr))...

> +
> +static void enable_lvds(struct display_info_t const *dev)
> +{
> +	struct iomuxc *iomux = (struct iomuxc *)
> +				IOMUXC_BASE_ADDR;
> +	u32 reg = readl(&iomux->gpr[2]);
> +	reg |= IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT;
> +	writel(reg, &iomux->gpr[2]);
> +	gpio_direction_output(LVDS_BACKLIGHT_GP, 1);
> +}
> +
> +static void enable_rgb(struct display_info_t const *dev)
> +{
> +	imx_iomux_v3_setup_multiple_pads(
> +		rgb_pads,
> +		 ARRAY_SIZE(rgb_pads));
> +	gpio_direction_output(RGB_BACKLIGHT_GP, 1);
> +}
> +
> +static struct display_info_t const displays[] = {{
> +	.bus	= -1,
> +	.addr	= 0,
> +	.pixfmt	= IPU_PIX_FMT_RGB24,
> +	.detect	= detect_hdmi,
> +	.enable	= enable_hdmi,
> +	.mode	= {
> +		.name           = "HDMI",
> +		.refresh        = 60,
> +		.xres           = 1024,
> +		.yres           = 768,
> +		.pixclock       = 15385,
> +		.left_margin    = 220,
> +		.right_margin   = 40,
> +		.upper_margin   = 21,
> +		.lower_margin   = 7,
> +		.hsync_len      = 60,
> +		.vsync_len      = 10,
> +		.sync           = FB_SYNC_EXT,
> +		.vmode          = FB_VMODE_NONINTERLACED
> +} }, {
> +	.bus	= 2,
> +	.addr	= 0x4,
> +	.pixfmt	= IPU_PIX_FMT_LVDS666,
> +	.detect	= detect_i2c,
> +	.enable	= enable_lvds,
> +	.mode	= {
> +		.name           = "Hannstar-XGA",
> +		.refresh        = 60,
> +		.xres           = 1024,
> +		.yres           = 768,
> +		.pixclock       = 15385,
> +		.left_margin    = 220,
> +		.right_margin   = 40,
> +		.upper_margin   = 21,
> +		.lower_margin   = 7,
> +		.hsync_len      = 60,
> +		.vsync_len      = 10,
> +		.sync           = FB_SYNC_EXT,
> +		.vmode          = FB_VMODE_NONINTERLACED
> +} }, {
> +	.bus	= 2,
> +	.addr	= 0x38,
> +	.pixfmt	= IPU_PIX_FMT_LVDS666,
> +	.detect	= detect_i2c,
> +	.enable	= enable_lvds,
> +	.mode	= {
> +		.name           = "wsvga-lvds",
> +		.refresh        = 60,
> +		.xres           = 1024,
> +		.yres           = 600,
> +		.pixclock       = 15385,
> +		.left_margin    = 220,
> +		.right_margin   = 40,
> +		.upper_margin   = 21,
> +		.lower_margin   = 7,
> +		.hsync_len      = 60,
> +		.vsync_len      = 10,
> +		.sync           = FB_SYNC_EXT,
> +		.vmode          = FB_VMODE_NONINTERLACED
> +} }, {
> +	.bus	= 2,
> +	.addr	= 0x48,
> +	.pixfmt	= IPU_PIX_FMT_RGB666,
> +	.detect	= detect_i2c,
> +	.enable	= enable_rgb,
> +	.mode	= {
> +		.name           = "wvga-rgb",
> +		.refresh        = 57,
> +		.xres           = 800,
> +		.yres           = 480,
> +		.pixclock       = 37037,
> +		.left_margin    = 40,
> +		.right_margin   = 60,
> +		.upper_margin   = 10,
> +		.lower_margin   = 10,
> +		.hsync_len      = 20,
> +		.vsync_len      = 10,
> +		.sync           = 0,
> +		.vmode          = FB_VMODE_NONINTERLACED
> +} } };
> +
> +int board_video_skip(void)
> +{
> +	int i;
> +	int ret;
> +	char const *panel = getenv("panel");
> +	if (!panel) {
> +		for (i = 0; i < ARRAY_SIZE(displays); i++) {
> +			struct display_info_t const *dev = displays+i;
> +			if (dev->detect(dev)) {
> +				panel = dev->mode.name;
> +				printf("auto-detected panel %s\n", panel);
> +				break;
> +			}
> +		}
> +		if (!panel) {
> +			panel = displays[0].mode.name;
> +			printf("No panel detected: default to %s\n", panel);
> +		}
> +	} else {
> +		for (i = 0; i < ARRAY_SIZE(displays); i++) {
> +			if (!strcmp(panel, displays[i].mode.name))
> +				break;
> +		}
> +	}
> +	if (i < ARRAY_SIZE(displays)) {
> +		ret = ipuv3_fb_init(&displays[i].mode, 0,
> +				    displays[i].pixfmt);
> +		if (!ret) {
> +			displays[i].enable(displays+i);
> +			printf("Display: %s (%ux%u)\n",
> +			       displays[i].mode.name,
> +			       displays[i].mode.xres,
> +			       displays[i].mode.yres);
> +		} else
> +			printf("LCD %s cannot be configured: %d\n",
> +			       displays[i].mode.name, ret);
> +	} else {
> +		printf("unsupported panel %s\n", panel);
> +		ret = -EINVAL;
> +	}
> +	return (0 != ret);
> +}
> +
> +static void setup_display(void)
> +{
> +	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
> +	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
> +	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
> +
> +	int reg;
> +
> +	/* Turn on LDB0,IPU,IPU DI0 clocks */
> +	reg = __raw_readl(&mxc_ccm->CCGR3);
> +	reg |=   MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET
> +		|MXC_CCM_CCGR3_LDB_DI0_MASK;
> +	writel(reg, &mxc_ccm->CCGR3);
> +
> +	/* Turn on HDMI PHY clock */
> +	reg = __raw_readl(&mxc_ccm->CCGR2);
> +	reg |=  MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_MASK
> +	       |MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_MASK;
> +	writel(reg, &mxc_ccm->CCGR2);
> +
> +	/* clear HDMI PHY reset */
> +	__raw_writeb(HDMI_MC_PHYRSTZ_DEASSERT,
> +		     HDMI_ARB_BASE_ADDR+HDMI_MC_PHYRSTZ);
> +
> +	/* set PFD1_FRAC to 0x13 == 455 MHz (480*18)/0x13 */
> +	writel(ANATOP_PFD_480_PFD1_FRAC_MASK, &anatop->pfd_480_clr);
> +	writel(0x13<<ANATOP_PFD_480_PFD1_FRAC_SHIFT, &anatop->pfd_480_set);
> +
> +	/* set LDB0, LDB1 clk select to 011/011 */
> +	reg = readl(&mxc_ccm->cs2cdr);
> +	reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
> +		 |MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
> +	reg |= (3<<MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
> +	      |(3<<MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
> +	writel(reg, &mxc_ccm->cs2cdr);
> +
> +	reg = readl(&mxc_ccm->cscmr2);
> +	reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
> +	writel(reg, &mxc_ccm->cscmr2);
> +
> +	reg = readl(&mxc_ccm->chsccdr);
> +	reg &= ~(MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK
> +		|MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK
> +		|MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK);
> +	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
> +		<<MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET)
> +	      |(CHSCCDR_PODF_DIVIDE_BY_3
> +		<<MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET)
> +	      |(CHSCCDR_IPU_PRE_CLK_540M_PFD
> +		<<MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
> +	writel(reg, &mxc_ccm->chsccdr);
> +
> +	reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
> +	     |IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_HIGH
> +	     |IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
> +	     |IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
> +	     |IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
> +	     |IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
> +	     |IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
> +	     |IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED
> +	     |IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0;
> +	writel(reg, &iomux->gpr[2]);
> +
> +	reg = readl(&iomux->gpr[3]);
> +	reg = (reg & ~IOMUXC_GPR3_LVDS0_MUX_CTL_MASK)
> +	    | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
> +	       <<IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET);
> +	writel(reg, &iomux->gpr[3]);
> +
> +	/* backlights off until needed */
> +	imx_iomux_v3_setup_multiple_pads(backlight_pads,
> +					 ARRAY_SIZE(backlight_pads));
> +	gpio_direction_input(LVDS_BACKLIGHT_GP);
> +	gpio_direction_input(RGB_BACKLIGHT_GP);
> +}
> +#endif
> +
> +int board_early_init_f(void)
> +{
> +	setup_iomux_uart();
> +	setup_buttons();
> +
> +#if defined(CONFIG_VIDEO_IPUV3)
> +	setup_display();
> +#endif
> +	return 0;
> +}
> +
> +/*
> + * Do not overwrite the console
> + * Use always serial for U-Boot console
> + */
> +int overwrite_console(void)
> +{
> +	return 1;
> +}
> +
> +int board_init(void)
> +{
> +       /* address of boot parameters */
> +       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
> +
> +#ifdef CONFIG_MXC_SPI
> +	setup_spi();
> +#endif
> +	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
> +	setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
> +	setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
> +
> +#ifdef CONFIG_CMD_SATA
> +	setup_sata();
> +#endif

Maybe also setup_display should be called here to make things more
consistent.

> +
> +       return 0;
> +}
> +
> +int checkboard(void)
> +{
> +       puts("Board: Nitrogen6X or MX6Q-Sabre Lite\n");

I have understood that this porting is for the NitroGen board. Even if
this u-boot can run on a SabreLite, it is quite confusing this output.
IMHO only NitroGen should be printed.

> +struct button_key {
> +	char const	*name;
> +	unsigned	gpnum;
> +	char		ident;
> +};
> +
> +static struct button_key const buttons[] = {
> +	{"back",	IMX_GPIO_NR(2, 2),	'B'},
> +	{"home",	IMX_GPIO_NR(2, 4),	'H'},
> +	{"menu",	IMX_GPIO_NR(2, 1),	'M'},
> +	{"search",	IMX_GPIO_NR(2, 3),	'S'},
> +	{"volup",	IMX_GPIO_NR(7, 13),	'V'},
> +	{"voldown",	IMX_GPIO_NR(4, 5),	'v'},
> +};
> +
> +/*
> + * generate a null-terminated string containing the buttons pressed
> + * returns number of keys pressed
> + */
> +static int read_keys(char *buf)
> +{
> +	int i, numpressed = 0;
> +	for (i = 0; i < ARRAY_SIZE(buttons); i++) {
> +		if (!gpio_get_value(buttons[i].gpnum))
> +			buf[numpressed++] = buttons[i].ident;
> +	}
> +	buf[numpressed] = '\0';
> +	return numpressed;
> +}
> +
> +static int do_kbd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> +	char envvalue[ARRAY_SIZE(buttons)+1];
> +	int numpressed = read_keys(envvalue);
> +	setenv("keybd", envvalue);
> +	return numpressed == 0;
> +}

What about to factorize this stuff ? This is not strictly related to
your board. What is needed here is a the array with the key definitions.
This stuff is in much more as in a couple of boards. It is contained
also in board/r360mpi/r360mpi.c and lwmon.

Let away the old boards. However, if we hide these function in board
code, it is quite probable we see the same functionality implemented
another time.

What about to move into drivers/input ? It seems to me the right place
for it.

> +
> +U_BOOT_CMD(
> +	kbd, 1, 1, do_kbd,
> +	"Tests for keypresses, sets 'keybd' environment variable",
> +	"Returns 0 (true) to shell if key is pressed."
> +);
> +
> +#ifdef CONFIG_PREBOOT
> +static char const kbd_magic_prefix[] = "key_magic";
> +static char const kbd_command_prefix[] = "key_cmd";
> +
> +static void preboot_keys(void)
> +{
> +	int numpressed;
> +	char keypress[ARRAY_SIZE(buttons)+1];
> +	numpressed = read_keys(keypress);
> +	if (numpressed) {
> +		char *kbd_magic_keys = getenv("magic_keys");
> +		char *suffix;
> +		/*
> +		 * loop over all magic keys
> +		 */
> +		for (suffix = kbd_magic_keys; *suffix; ++suffix) {
> +			char *keys;
> +			char magic[sizeof(kbd_magic_prefix) + 1];
> +			sprintf(magic, "%s%c", kbd_magic_prefix, *suffix);
> +			keys = getenv(magic);
> +			if (keys) {
> +				if (!strcmp(keys, keypress))
> +					break;
> +			}
> +		}
> +		if (*suffix) {
> +			char cmd_name[sizeof(kbd_command_prefix) + 1];
> +			char *cmd;
> +			sprintf(cmd_name, "%s%c", kbd_command_prefix, *suffix);
> +			cmd = getenv(cmd_name);
> +			if (cmd) {
> +				setenv("preboot", cmd);

IMHO it should be always possible for the user to explicitely set the
"preboot" variable. In your implementation, it is always overwritten. I
would add a check for "preboot", setting it only in case it is not yet set.

> +				return;
> +			}
> +		}
> +	}
> +}


Also preboot_keys() can be useful for other boards, not only for
sabrelite and nitrogen.


> +#endif
> +
> +#ifdef CONFIG_CMD_BMODE
> +static const struct boot_mode board_boot_modes[] = {
> +	/* 4 bit bus width */
> +	{"mmc0",	MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
> +	{"mmc1",	MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00)},
> +	{NULL,		0},
> +};
> +#endif
> +
> +int misc_init_r(void)
> +{
> +#ifdef CONFIG_PREBOOT
> +	preboot_keys();
> +#endif
> +
> +#ifdef CONFIG_CMD_BMODE
> +	add_board_boot_modes(board_boot_modes);
> +#endif
> +	return 0;
> +}
> diff --git a/boards.cfg b/boards.cfg
> index e9e073e..ac8e39d 100644
> --- a/boards.cfg
> +++ b/boards.cfg
> @@ -234,6 +234,7 @@ mx6qarm2                     arm         armv7       mx6qarm2            freesca
>  mx6qsabreauto                arm         armv7       mx6qsabreauto       freescale      mx6		mx6qsabreauto:IMX_CONFIG=board/freescale/mx6qsabreauto/imximage.cfg
>  mx6qsabrelite                arm         armv7       mx6qsabrelite       freescale      mx6		mx6qsabrelite:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
>  mx6qsabresd                  arm         armv7       mx6qsabresd         freescale      mx6		mx6qsabresd:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
> +nitrogen6x                   arm         armv7       nitrogen6x          boundary       mx6		nitrogen6x:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
>  cm_t35                       arm         armv7       cm_t35              -              omap3
>  omap3_overo                  arm         armv7       overo               -              omap3
>  omap3_pandora                arm         armv7       pandora             -              omap3
> diff --git a/include/configs/nitrogen6x.h b/include/configs/nitrogen6x.h
> new file mode 100644
> index 0000000..f0ecf72
> --- /dev/null
> +++ b/include/configs/nitrogen6x.h
> @@ -0,0 +1,242 @@
> +/*
> + * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
> + *
> + * Configuration settings for the Boundary Devices Nitrogen6X
> + * and Freescale i.MX6Q Sabre Lite boards.
> + *
> + * 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
> + */
> +
> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#define CONFIG_MX6Q
> +#define CONFIG_DISPLAY_CPUINFO
> +#define CONFIG_DISPLAY_BOARDINFO
> +
> +#define CONFIG_MACH_TYPE	3769
> +
> +#include <asm/arch/imx-regs.h>
> +#include <asm/imx-common/gpio.h>
> +
> +#define CONFIG_CMDLINE_TAG
> +#define CONFIG_SETUP_MEMORY_TAGS
> +#define CONFIG_INITRD_TAG
> +#define CONFIG_REVISION_TAG
> +
> +/* Size of malloc() pool */
> +#define CONFIG_SYS_MALLOC_LEN		(10 * 1024 * 1024)
> +
> +#define CONFIG_BOARD_EARLY_INIT_F
> +#define CONFIG_MISC_INIT_R
> +#define CONFIG_MXC_GPIO
> +
> +#define CONFIG_MXC_UART
> +#define CONFIG_MXC_UART_BASE	       UART2_BASE
> +
> +#define CONFIG_CMD_SF
> +#ifdef CONFIG_CMD_SF
> +#define CONFIG_SPI_FLASH
> +#define CONFIG_SPI_FLASH_SST
> +#define CONFIG_MXC_SPI
> +#define CONFIG_SF_DEFAULT_BUS  0
> +#define CONFIG_SF_DEFAULT_CS   (0|(IMX_GPIO_NR(3, 19)<<8))
> +#define CONFIG_SF_DEFAULT_SPEED 25000000
> +#define CONFIG_SF_DEFAULT_MODE (SPI_MODE_0)
> +#endif
> +
> +/* I2C Configs */
> +#define CONFIG_CMD_I2C
> +#define CONFIG_I2C_MULTI_BUS
> +#define CONFIG_I2C_MXC
> +#define CONFIG_SYS_I2C_SPEED		100000
> +
> +/* MMC Configs */
> +#define CONFIG_FSL_ESDHC
> +#define CONFIG_FSL_USDHC
> +#define CONFIG_SYS_FSL_ESDHC_ADDR      0
> +#define CONFIG_SYS_FSL_USDHC_NUM       2
> +
> +#define CONFIG_MMC
> +#define CONFIG_CMD_MMC
> +#define CONFIG_GENERIC_MMC
> +#define CONFIG_CMD_EXT2
> +#define CONFIG_CMD_FAT
> +#define CONFIG_DOS_PARTITION
> +
> +#define CONFIG_CMD_SATA
> +/*
> + * SATA Configs
> + */
> +#ifdef CONFIG_CMD_SATA
> +#define CONFIG_DWC_AHSATA
> +#define CONFIG_SYS_SATA_MAX_DEVICE	1
> +#define CONFIG_DWC_AHSATA_PORT_ID	0
> +#define CONFIG_DWC_AHSATA_BASE_ADDR	SATA_ARB_BASE_ADDR
> +#define CONFIG_LBA48
> +#define CONFIG_LIBATA
> +#endif
> +
> +#define CONFIG_CMD_PING
> +#define CONFIG_CMD_DHCP
> +#define CONFIG_CMD_MII
> +#define CONFIG_CMD_NET
> +#define CONFIG_FEC_MXC
> +#define CONFIG_MII
> +#define IMX_FEC_BASE			ENET_BASE_ADDR
> +#define CONFIG_FEC_XCV_TYPE		RGMII
> +#define CONFIG_ETHPRIME			"FEC"
> +#define CONFIG_FEC_MXC_PHYADDR		6
> +#define CONFIG_PHYLIB
> +#define CONFIG_PHY_MICREL
> +#define CONFIG_PHY_MICREL_KSZ9021
> +
> +/* USB Configs */
> +#define CONFIG_CMD_USB
> +#define CONFIG_CMD_FAT
> +#define CONFIG_USB_EHCI
> +#define CONFIG_USB_EHCI_MX6
> +#define CONFIG_USB_STORAGE
> +#define CONFIG_USB_HOST_ETHER
> +#define CONFIG_USB_ETHER_ASIX
> +#define CONFIG_USB_ETHER_SMSC95XX
> +#define CONFIG_MXC_USB_PORT	1
> +#define CONFIG_MXC_USB_PORTSC	(PORT_PTS_UTMI | PORT_PTS_PTW)
> +#define CONFIG_MXC_USB_FLAGS	0
> +
> +/* Miscellaneous commands */
> +#define CONFIG_CMD_BMODE
> +#define CONFIG_CMD_SETEXPR
> +
> +/* Framebuffer and LCD */
> +#define CONFIG_VIDEO
> +#define CONFIG_VIDEO_IPUV3
> +#define CONFIG_CFB_CONSOLE
> +#define CONFIG_VGA_AS_SINGLE_DEVICE
> +#define CONFIG_SYS_CONSOLE_IS_IN_ENV
> +#define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
> +#define CONFIG_VIDEO_BMP_RLE8
> +#define CONFIG_SPLASH_SCREEN
> +#define CONFIG_BMP_16BPP
> +#define CONFIG_VIDEO_LOGO
> +#define CONFIG_IPUV3_CLK 260000000
> +
> +/* allow to overwrite serial and ethaddr */
> +#define CONFIG_ENV_OVERWRITE
> +#define CONFIG_CONS_INDEX	       1
> +#define CONFIG_BAUDRATE			       115200
> +
> +/* Command definition */
> +#include <config_cmd_default.h>

Move CONFIG_CMD_BMODE and CONFIG_CMD_SETEXPR here.

> +
> +#undef CONFIG_CMD_IMLS
> +
> +#define CONFIG_BOOTDELAY	       3
> +
> +#define CONFIG_PREBOOT                 ""
> +
> +#define CONFIG_LOADADDR			       0x10800000
> +#define CONFIG_SYS_TEXT_BASE	       0x17800000
> +
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> +	"console=ttymxc1\0" \
> +	"clearenv=if sf probe || sf probe || sf probe 1 ; then sf erase 0xc0000 0x2000 && " \
> +		"echo restored environment to factory default ; fi\0" \
> +	"bootcmd=for dtype in sata mmc ; do " \
> +		"for disk in 0 1 ; do ${dtype} dev ${disk} ;" \
> +			"for fs in fat ext2 ; do " \
> +				"${fs}load ${dtype} ${disk}:1 10008000 " \
> +					"/6q_bootscript" \
> +					"&& source 10008000 ; " \
> +			"done ; " \
> +		"done ; " \
> +	"done\0" \
> +	"upgradeu=for dtype in sata mmc ; do " \
> +		"for disk in 0 1 ; do ${dtype} dev ${disk} ;" \
> +		     "for fs in fat ext2 ; do " \
> +				"${fs}load ${dtype} ${disk}:1 10008000 " \
> +					"/6q_upgrade " \
> +					"&& source 10008000 ; " \
> +			"done ; " \
> +		"done ; " \
> +	"done\0" \
> +
> +#define CONFIG_ARP_TIMEOUT     200UL
> +
> +/* Miscellaneous configurable options */
> +#define CONFIG_SYS_LONGHELP
> +#define CONFIG_SYS_HUSH_PARSER
> +#define CONFIG_SYS_PROMPT	       "U-Boot > "
> +#define CONFIG_AUTO_COMPLETE
> +#define CONFIG_SYS_CBSIZE	       256
> +
> +/* Print Buffer Size */
> +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
> +#define CONFIG_SYS_MAXARGS	       16
> +#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
> +
> +#define CONFIG_SYS_MEMTEST_START       0x10000000
> +#define CONFIG_SYS_MEMTEST_END	       0x10010000
> +
> +#define CONFIG_SYS_LOAD_ADDR	       CONFIG_LOADADDR
> +#define CONFIG_SYS_HZ		       1000
> +
> +#define CONFIG_CMDLINE_EDITING
> +
> +/* Physical Memory Map */
> +#define CONFIG_NR_DRAM_BANKS	       1
> +#define PHYS_SDRAM		       MMDC0_ARB_BASE_ADDR
> +#define PHYS_SDRAM_SIZE			       (1u * 1024 * 1024 * 1024)
> +
> +#define CONFIG_SYS_SDRAM_BASE	       PHYS_SDRAM
> +#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
> +#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
> +
> +#define CONFIG_SYS_INIT_SP_OFFSET \
> +       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
> +#define CONFIG_SYS_INIT_SP_ADDR \
> +       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
> +
> +/* FLASH and environment organization */
> +#define CONFIG_SYS_NO_FLASH
> +
> +#define CONFIG_ENV_SIZE			(8 * 1024)
> +
> +/* #define CONFIG_ENV_IS_IN_MMC */
> +#define CONFIG_ENV_IS_IN_SPI_FLASH
> +
> +#if defined(CONFIG_ENV_IS_IN_MMC)
> +#define CONFIG_ENV_OFFSET		(6 * 64 * 1024)
> +#define CONFIG_SYS_MMC_ENV_DEV		0
> +#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
> +#define CONFIG_ENV_OFFSET		(768 * 1024)
> +#define CONFIG_ENV_SECT_SIZE		(8 * 1024)
> +#define CONFIG_ENV_SPI_BUS		CONFIG_SF_DEFAULT_BUS
> +#define CONFIG_ENV_SPI_CS		CONFIG_SF_DEFAULT_CS
> +#define CONFIG_ENV_SPI_MODE		CONFIG_SF_DEFAULT_MODE
> +#define CONFIG_ENV_SPI_MAX_HZ		CONFIG_SF_DEFAULT_SPEED
> +#endif
> +
> +#define CONFIG_OF_LIBFDT
> +#define CONFIG_CMD_BOOTZ
> +
> +#define CONFIG_SYS_DCACHE_OFF
> +
> +#ifndef CONFIG_SYS_DCACHE_OFF
> +#define CONFIG_CMD_CACHE
> +#endif
> +
> +#endif			       /* __CONFIG_H */
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH 3/3] nitrogen6x: initialize WL12XX pads, use to determine board type
  2012-10-04 19:49 ` [U-Boot] [PATCH 3/3] nitrogen6x: initialize WL12XX pads, use to determine board type Eric Nelson
@ 2012-10-08 12:32   ` Stefano Babic
  0 siblings, 0 replies; 22+ messages in thread
From: Stefano Babic @ 2012-10-08 12:32 UTC (permalink / raw)
  To: u-boot

On 04/10/2012 21:49, Eric Nelson wrote:
> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> ---
>  board/boundary/nitrogen6x/nitrogen6x.c |   34 +++++++++++++++++++++++++++++++-
>  1 files changed, 33 insertions(+), 1 deletions(-)
> 
> diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c
> index 469a044..16469b7 100644
> --- a/board/boundary/nitrogen6x/nitrogen6x.c
> +++ b/board/boundary/nitrogen6x/nitrogen6x.c
> @@ -69,6 +69,18 @@ DECLARE_GLOBAL_DATA_PTR;
>  	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
>  	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
>  
> +#define WEAK_PULLUP	(PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |		\
> +	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
> +	PAD_CTL_SRE_SLOW)
> +
> +#define WEAK_PULLDOWN	(PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |		\
> +	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
> +	PAD_CTL_SRE_SLOW)
> +
> +#define OUTPUT_40OHM (PAD_CTL_SPEED_MED|PAD_CTL_DSE_40ohm)
> +
>  int dram_init(void)
>  {
>         gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> @@ -186,6 +198,16 @@ iomux_v3_cfg_t const enet_pads2[] = {
>  	MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>  };
>  
> +/* wl1271 pads on nitrogen6x */
> +iomux_v3_cfg_t const wl12xx_pads[] = {
> +	(MX6Q_PAD_NANDF_CS1__GPIO_6_14 & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(WEAK_PULLDOWN),
> +	(MX6Q_PAD_NANDF_CS2__GPIO_6_15 & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(OUTPUT_40OHM),
> +	(MX6Q_PAD_NANDF_CS3__GPIO_6_16 & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(OUTPUT_40OHM),
> +};
> +#define WL12XX_WL_IRQ_GP	IMX_GPIO_NR(6,14)
> +#define WL12XX_WL_ENABLE_GP	IMX_GPIO_NR(6,15)
> +#define WL12XX_BT_ENABLE_GP	IMX_GPIO_NR(6,16)
> +
>  /* Button assignments for J14 */
>  static iomux_v3_cfg_t const button_pads[] = {
>  	/* Menu */
> @@ -695,6 +717,13 @@ static void setup_display(void)
>  int board_early_init_f(void)
>  {
>  	setup_iomux_uart();
> +
> +	/* Disable wl1271 For Nitrogen6w */
> +	gpio_direction_input(WL12XX_WL_IRQ_GP);
> +	gpio_direction_output(WL12XX_WL_ENABLE_GP,0);
> +	gpio_direction_output(WL12XX_BT_ENABLE_GP,0);
> +
> +	imx_iomux_v3_setup_multiple_pads(wl12xx_pads, ARRAY_SIZE(wl12xx_pads));
>  	setup_buttons();
>  
>  #if defined(CONFIG_VIDEO_IPUV3)
> @@ -733,7 +762,10 @@ int board_init(void)
>  
>  int checkboard(void)
>  {
> -       puts("Board: Nitrogen6X or MX6Q-Sabre Lite\n");
> +	if (gpio_get_value(WL12XX_WL_IRQ_GP)) {
> +		puts("Board: Nitrogen6X\n");
> +	} else
> +		puts("Board: SABRE Lite\n");

This answer a comment of mine for PATCH1/3. Anyway, I think it is better
to squash the three patches together. This avoid you push in the same
patchset new code in one patch and you modify in the next one.

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-05 20:03         ` Eric Nelson
  2012-10-05 22:46           ` Tom Rini
@ 2012-10-08 12:54           ` Stefano Babic
  2012-10-08 17:24             ` Eric Nelson
  1 sibling, 1 reply; 22+ messages in thread
From: Stefano Babic @ 2012-10-08 12:54 UTC (permalink / raw)
  To: u-boot

On 05/10/2012 22:03, Eric Nelson wrote:
> On 10/05/2012 12:00 PM, Tom Rini wrote:
>> On Fri, Oct 05, 2012 at 11:42:19AM -0700, Eric Nelson wrote:
>>> On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
>>>> Hi Eric,
>>>>
>>>> On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
>>>> <eric.nelson@boundarydevices.com>   wrote:
>>>>
>>>>> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
>>>>> ---
>>>>>   board/boundary/nitrogen6x/Makefile     |   41 ++
>>>>>   board/boundary/nitrogen6x/README       |   77 +++
>>>>>   board/boundary/nitrogen6x/nitrogen6x.c |  840
>>>>> ++++++++++++++++++++++++++++++++
>>>>>   boards.cfg                             |    1 +
>>>>>   include/configs/nitrogen6x.h           |  242 +++++++++
>>>>>   5 files changed, 1201 insertions(+), 0 deletions(-)
>>>>>   create mode 100644 board/boundary/nitrogen6x/Makefile
>>>>>   create mode 100644 board/boundary/nitrogen6x/README
>>>>>   create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>>>>>   create mode 100644 include/configs/nitrogen6x.h
>>>>
>>>> If this is essentially a copy of sabrelite, I am surprised that git
>>>> does not report any copies. Did you use -C with git format-patch ?
>>>>
>>>
>>> Hi Albert,
>>>
>>> I didn't use '-C' (didn't know about it: thanks for the tip!).
>>>
>>> It wouldn't have detected copies though, because I made slight
>>> changes in each of these files, replacing the board names and
>>> file names in board/boundary/ and altering the default environment
>>> (policy bits) in nitrogen6x.h.
>>
>> And we can't deal with this by factoring the code differently?
>>
> Hi Tom,
> 
> There are two bits to this question:
>     - Can we represent the policy differences outside of a
>     board structure? These differences are all inside of
>     include/configs/nitrogen6x.
> 

What we have already done is to set a common config header that is
included by both include/configs/nitrogen6x and include/configs/sabrelite.
See for example mx6qsabre_common.h, with the boards mx6qsabresd and
mx6qsabreauto.

>     - Can we represent the board differences without a
>     board structure? This is a bit harder, since the
>     boards are slightly different. The Nitrogen6X has
>     a different ethernet PHY reset pin and an optional
>     SDIO Wi-Fi module.

Ona major point is *how* you want to represent your board into U-boot,
even if it is derived from a Freescale's evaluation board. In many case
a vendor directory is desired (freescale vs boundary).

> 
>     We could add code to SABRE Lite to accommodate these,
>     but it seems that sets a bad precedent. Would this
>     be done for every vendor that bases a design on
>     SABRE Lite?

I am afraid that it is easy to reach the case when changes for a vendor
will break other boards, and getting all in sync can be problematic.

> 
> The precise diffs for the configs and sources is attached for
> reference.
> 
> I've also been pondering how to simply re-use the code within
> the board setup file (mx6qsabrelite.c), but I haven't figured
> anything out. Clearly a lot of the code is duplicated, but at
> the same time it's board-specific.
> 
> For example, we could create a common module that sets up
> the SD card pads "like SABRE Lite", and a similar one to
> configure ethernet pads. Since SABRE Lite is a reference design,
> perhaps that makes sense.

I think that another example in u-boot doing this is for davinci (8xx)
boards, At least three boards share the same board structure, see
board/davinci/da8xxevm/Makefile.

Very board related functions are compiled using CONFIG_MACH:

COBJS-$(CONFIG_MACH_DAVINCI_DA830_EVM)  += da830evm.o
COBJS-$(CONFIG_MACH_DAVINCI_DA850_EVM)  += da850evm.o
COBJS-$(CONFIG_MACH_DAVINCI_HAWK)       += hawkboard.o

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-08 12:28   ` Stefano Babic
@ 2012-10-08 16:05     ` Eric Nelson
  2012-10-08 20:30       ` Troy Kisky
  0 siblings, 1 reply; 22+ messages in thread
From: Eric Nelson @ 2012-10-08 16:05 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

On 10/08/2012 05:28 AM, Stefano Babic wrote:
> On 04/10/2012 21:49, Eric Nelson wrote:
>> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
>> ---
>
> Hi Eric,
>
>
>> diff --git a/board/boundary/nitrogen6x/README b/board/boundary/nitrogen6x/README
>> new file mode 100644
>> index 0000000..d67cdf0
>> --- /dev/null
>> +++ b/board/boundary/nitrogen6x/README
>> @@ -0,0 +1,77 @@
>> +U-Boot for the Boundary Devices Nitrogen6X and
>> +Freescale i.MX6q SabreLite boards
>> +
>> +This file contains information for the port of
>> +U-Boot to the Boundary Devices Nitrogen6X and
>> +Freescale i.MX6q SabreLite boards.
>> +
>> +1. Boot source, boot from SPI NOR
>> +---------------------------------
>> +The configuration in this directory supports both the
>> +Nitrogen6X and Freescale SabreLite board, but in a
>> +different fashion from Freescale's implementation in
>> +board/freescale/mx6qsabrelite.
>> +
>> +In particular, this image supports booting from SPI NOR
>> +and saving the environment to SPI NOR.
>> +
>> +It does not support 'boot from SD' at offset 0x400
>> +except through the 'bmode' command.
>> +	http://lists.denx.de/pipermail/u-boot/2012-August/131151.html
>
> bmode is mainline. You can drop the link.
>

Ok.

>> +
>> +2. Boots using 6q_bootscript on SATA or SD card
>> +-----------------------------------------------
>> +The default bootcmd for these boards is configured
>> +to look for and source a boot script named '6q_bootscript'
>> +in the root of the first partition of the following
>> +devices:
>> +
>> +	sata 0
>> +	mmc 0
>> +	mmc 1
>> +
>> +They're searched in the order listed above, trying both the
>> +ext2 and fat filesystems.
>
> Really the script search also for "sata 1", even if it does not exist.
>

Yep. And of course it will fail.

What we really need to implement "boot anything" is a
foreach(blockdev) construct.

I saw some patches on the list a short while ago that seemed
to be heading in that direction, but haven't chased down the
details.

>> +2. Maintaining the SPI NOR
>> +--------------------------
>> +A couple of convenience commands
>> +
>> +	clearenv - clear environment to factory default
>> +	upgradeu - look and source a boot script named
>> +		'6q_upgrade' to upgrade the U-Boot version
>> +		in SPI NOR. The search is the same as for
>> +		6q_bootscript described above.
>
> This is your decision. But I think it can make some confusion for users
> that expects that everything is contained in u-boot. 6q_upgrade is not
> included here and it remains obscured how the update is done. Is there
> good reason why do you not add a script for updating u-boot directly to
> CONFIG_EXTRA_ENV_SETTINGS ?
>

The 'load /6q_upgrade' is what's present in 2009.08, so this
will make the transition easier.

For the time being, while there are feature gaps between the two,
I'd like to make it easy to swap between the two if possible.

I'm not sure how easy that will be, because there will be differences
in the boot scripts.

>> +
>> +3. Display support
>> +------------------
>> +U-Boot support for the following displays is configured by
>> +default:
>> +
>> +    HDMI           - 1024 x 768 for maximum compatibility
>> +    Hannstar-XGA   - 1024 x 768 LVDS (Freescale part number MCIMX-LVDS1)
>> +    wsvga-lvds     - 1024 x 600 LVDS (Boundary p/n Nit6X_1024x600)
>> +    wvga-rgb       - 800 x 480 RGB (Boundary p/n Nit6X_800x480)
>> +
>> +Since the ipuv3_fb display driver currently supports only a single display,
>> +this code auto-detects panel by probing the HDMI Phy for Hot Plug Detect
>> +or the I2C touch controller of the LVDS and RGB displays in the priority
>> +listed above.
>> +
>> +Setting 'panel' environment variable to one of the names above will
>> +override auto-detection and force activation of the specified panel.
>> +
>> +4. Building
>> +------------
>> +
>> +To build U-Boot for the Nitrogen6x or SabreLite board:
>> +
>> +	make nitrogen6x_config
>> +	make u-boot.imx
>
> I think the second one is superfluous, and simply "make" generates th
> eu-boot.imx binary.
>

It's odd that I didn't know this...

>> +
>> +If you place the u-boot.imx into a single-partition SD card
>> +along with a binary version of the boot script 6q_upgrade.txt,
>> +you can program it using 'upgradeu':
>
> Right, but  6q_upgrade.txt is not included. The u-boot documentation
> should be self explained: I mean, all ode should be provided (scripts
> included) or there are some links for users to inform what they can find
> what is missing.
>

I'd actually like to place 6q_upgrade.txt within the source tree,
even though it's not directly used.

I also have a couple of other patches done after submitting the
prelimary Nitrogen6X support.

In particular, note the url display at the tail-end of this patch:
	https://github.com/boundarydevices/u-boot-imx6/commit/9ea546f3848799bc24fbc29a53b7bf293773a5f5

I hope our aim is clear here: "do the right thing". We have a lot
of users who are relative newbies to U-Boot and we hope to ease
their transition.

>> diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c
>> new file mode 100644
>> index 0000000..e70871d
>> --- /dev/null
>> +++ b/board/boundary/nitrogen6x/nitrogen6x.c
>> @@ -0,0 +1,840 @@
>> +/*
>> + * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
>> + *
>> + * 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<common.h>
>> +#include<asm/io.h>
>> +#include<asm/arch/clock.h>
>> +#include<asm/arch/imx-regs.h>
>> +#include<asm/arch/iomux.h>
>> +#include<asm/arch/mx6x_pins.h>
>> +#include<asm/errno.h>
>> +#include<asm/gpio.h>
>> +#include<asm/imx-common/iomux-v3.h>
>> +#include<asm/imx-common/mxc_i2c.h>
>> +#include<asm/imx-common/boot_mode.h>
>> +#include<mmc.h>
>> +#include<fsl_esdhc.h>
>> +#include<micrel.h>
>> +#include<miiphy.h>
>> +#include<netdev.h>
>> +#include<linux/fb.h>
>> +#include<ipu_pixfmt.h>
>> +#include<asm/arch/crm_regs.h>
>> +#include<asm/arch/mxc_hdmi.h>
>> +#include<i2c.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |	       \
>> +       PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |	       \
>> +       PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
>> +
>> +#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |	       \
>> +       PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |	       \
>> +       PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
>> +
>> +#define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |		\
>> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED	  |		\
>> +	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
>> +
>> +#define SPI_PAD_CTRL (PAD_CTL_HYS |				\
>> +	PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |		\
>> +	PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
>> +
>> +#define BUTTON_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
>> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |		\
>> +	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
>> +
>> +#define I2C_PAD_CTRL	(PAD_CTL_PKE | PAD_CTL_PUE |		\
>> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |		\
>> +	PAD_CTL_DSE_40ohm | PAD_CTL_HYS |			\
>> +	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
>> +
>> +int dram_init(void)
>> +{
>> +       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
>> +
>> +       return 0;
>> +}
>
> I will come later to this point when I will test the imx image changes.
> Troy introduced a imx_ddr_size() - I will send my comment for that. I
> have supposed that you needed here.
>
>> +
>> +iomux_v3_cfg_t const uart1_pads[] = {
>> +	MX6Q_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +	MX6Q_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +};
>> +
>> +iomux_v3_cfg_t const uart2_pads[] = {
>> +       MX6Q_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +       MX6Q_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +};
>> +
>> +#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
>> +
>> +/* I2C1, SGTL5000 */
>> +struct i2c_pads_info i2c_pad_info0 = {
>> +	.scl = {
>> +		.i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
>> +		.gpio_mode = MX6Q_PAD_EIM_D21__GPIO_3_21 | PC,
>> +		.gp = IMX_GPIO_NR(3, 21)
>> +	},
>> +	.sda = {
>> +		.i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
>> +		.gpio_mode = MX6Q_PAD_EIM_D28__GPIO_3_28 | PC,
>> +		.gp = IMX_GPIO_NR(3, 28)
>> +	}
>> +};
>> +
>> +/* I2C2 Camera, MIPI */
>> +struct i2c_pads_info i2c_pad_info1 = {
>> +	.scl = {
>> +		.i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
>> +		.gpio_mode = MX6Q_PAD_KEY_COL3__GPIO_4_12 | PC,
>> +		.gp = IMX_GPIO_NR(4, 12)
>> +	},
>> +	.sda = {
>> +		.i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
>> +		.gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO_4_13 | PC,
>> +		.gp = IMX_GPIO_NR(4, 13)
>> +	}
>> +};
>> +
>> +/* I2C3, J15 - RGB connector */
>> +struct i2c_pads_info i2c_pad_info2 = {
>> +	.scl = {
>> +		.i2c_mode = MX6Q_PAD_GPIO_5__I2C3_SCL | PC,
>> +		.gpio_mode = MX6Q_PAD_GPIO_5__GPIO_1_5 | PC,
>> +		.gp = IMX_GPIO_NR(1, 5)
>> +	},
>> +	.sda = {
>> +		.i2c_mode = MX6Q_PAD_GPIO_16__I2C3_SDA | PC,
>> +		.gpio_mode = MX6Q_PAD_GPIO_16__GPIO_7_11 | PC,
>> +		.gp = IMX_GPIO_NR(7, 11)
>> +	}
>> +};
>> +
>> +iomux_v3_cfg_t const usdhc3_pads[] = {
>> +       MX6Q_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD3_DAT5__GPIO_7_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
>> +};
>> +
>> +iomux_v3_cfg_t const usdhc4_pads[] = {
>> +       MX6Q_PAD_SD4_CLK__USDHC4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD4_CMD__USDHC4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +       MX6Q_PAD_NANDF_D6__GPIO_2_6    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
>> +};
>> +
>> +iomux_v3_cfg_t const enet_pads1[] = {
>> +	MX6Q_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	/* pin 35 - 1 (PHY_AD2) on reset */
>> +	MX6Q_PAD_RGMII_RXC__GPIO_6_30		| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +	/* pin 32 - 1 - (MODE0) all */
>> +	MX6Q_PAD_RGMII_RD0__GPIO_6_25		| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +	/* pin 31 - 1 - (MODE1) all */
>> +	MX6Q_PAD_RGMII_RD1__GPIO_6_27		| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +	/* pin 28 - 1 - (MODE2) all */
>> +	MX6Q_PAD_RGMII_RD2__GPIO_6_28		| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +	/* pin 27 - 1 - (MODE3) all */
>> +	MX6Q_PAD_RGMII_RD3__GPIO_6_29		| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +	/* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
>> +	MX6Q_PAD_RGMII_RX_CTL__GPIO_6_24	| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +	/* pin 42 PHY nRST */
>> +	MX6Q_PAD_EIM_D23__GPIO_3_23		| MUX_PAD_CTRL(NO_PAD_CTRL),
>> +};
>> +
>> +iomux_v3_cfg_t const enet_pads2[] = {
>> +	MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +	MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +};
>> +
>> +/* Button assignments for J14 */
>> +static iomux_v3_cfg_t const button_pads[] = {
>> +	/* Menu */
>> +	MX6Q_PAD_NANDF_D1__GPIO_2_1	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
>> +	/* Back */
>> +	MX6Q_PAD_NANDF_D2__GPIO_2_2	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
>> +	/* Labelled Search (mapped to Power under Android) */
>> +	MX6Q_PAD_NANDF_D3__GPIO_2_3	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
>> +	/* Home */
>> +	MX6Q_PAD_NANDF_D4__GPIO_2_4	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
>> +	/* Volume Down */
>> +	MX6Q_PAD_GPIO_19__GPIO_4_5	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
>> +	/* Volume Up */
>> +	MX6Q_PAD_GPIO_18__GPIO_7_13	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
>> +};
>> +
>> +static void setup_iomux_enet(void)
>> +{
>> +	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
>> +	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
>> +	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
>> +	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
>> +	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
>> +	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
>> +	imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
>> +	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
>> +
>> +	/* Need delay 10ms according to KSZ9021 spec */
>> +	udelay(1000 * 10);
>> +	gpio_set_value(IMX_GPIO_NR(3, 23), 1);
>> +
>> +	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
>> +}
>> +
>> +iomux_v3_cfg_t const usb_pads[] = {
>> +	MX6Q_PAD_GPIO_17__GPIO_7_12 | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +};
>> +
>> +static void setup_iomux_uart(void)
>> +{
>> +	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
>> +       imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
>
> Are there some spaces instead of tab ?
>

Yes. They're currently present in main-line.

>> +}
>> +
>> +#ifdef CONFIG_USB_EHCI_MX6
>> +int board_ehci_hcd_init(int port)
>> +{
>> +	imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
>> +
>> +	/* Reset USB hub */
>> +	gpio_direction_output(IMX_GPIO_NR(7, 12), 0);
>> +	mdelay(2);
>> +	gpio_set_value(IMX_GPIO_NR(7, 12), 1);
>> +
>> +	return 0;
>> +}
>> +#endif
>> +
>> +#ifdef CONFIG_FSL_ESDHC
>> +struct fsl_esdhc_cfg usdhc_cfg[2] = {
>> +       {USDHC3_BASE_ADDR},
>> +       {USDHC4_BASE_ADDR},
>> +};
>> +
>> +int board_mmc_getcd(struct mmc *mmc)
>> +{
>> +       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
>> +       int ret;
>> +
>> +       if (cfg->esdhc_base == USDHC3_BASE_ADDR) {
>> +		gpio_direction_input(IMX_GPIO_NR(7, 0));
>> +		ret = !gpio_get_value(IMX_GPIO_NR(7, 0));
>> +       } else {
>> +		gpio_direction_input(IMX_GPIO_NR(2, 6));
>> +		ret = !gpio_get_value(IMX_GPIO_NR(2, 6));
>> +       }
>> +
>> +       return ret;
>> +}
>> +
>> +int board_mmc_init(bd_t *bis)
>> +{
>> +       s32 status = 0;
>> +       u32 index = 0;
>> +
>> +       for (index = 0; index<  CONFIG_SYS_FSL_USDHC_NUM; ++index) {
>> +	       switch (index) {
>> +	       case 0:
>> +		       imx_iomux_v3_setup_multiple_pads(
>> +			       usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
>> +		       break;
>> +	       case 1:
>> +		       imx_iomux_v3_setup_multiple_pads(
>> +			       usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
>> +		       break;
>> +	       default:
>> +		       printf("Warning: you configured more USDHC controllers"
>> +			       "(%d) then supported by the board (%d)\n",
>> +			       index + 1, CONFIG_SYS_FSL_USDHC_NUM);
>> +		       return status;
>> +	       }
>> +
>> +	       status |= fsl_esdhc_initialize(bis,&usdhc_cfg[index]);
>> +       }
>> +
>> +       return status;
>> +}
>> +#endif
>> +
>> +u32 get_board_rev(void)
>> +{
>> +	return 0x63000 ;
>> +}
>> +
>> +#ifdef CONFIG_MXC_SPI
>> +iomux_v3_cfg_t const ecspi1_pads[] = {
>> +	/* SS1 */
>> +	MX6Q_PAD_EIM_D19__GPIO_3_19   | MUX_PAD_CTRL(SPI_PAD_CTRL),
>> +	MX6Q_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
>> +	MX6Q_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
>> +	MX6Q_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
>> +};
>> +
>> +void setup_spi(void)
>> +{
>> +	gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
>> +	imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
>> +					 ARRAY_SIZE(ecspi1_pads));
>> +}
>> +#endif
>> +
>> +int board_phy_config(struct phy_device *phydev)
>> +{
>> +	/* min rx data delay */
>> +	ksz9021_phy_extended_write(phydev,
>> +			MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x0);
>> +	/* min tx data delay */
>> +	ksz9021_phy_extended_write(phydev,
>> +			MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x0);
>> +	/* max rx/tx clock delay, min rx/tx control */
>> +	ksz9021_phy_extended_write(phydev,
>> +			MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf0f0);
>> +	if (phydev->drv->config)
>> +		phydev->drv->config(phydev);
>> +
>> +	return 0;
>> +}
>> +
>> +int board_eth_init(bd_t *bis)
>> +{
>> +	int ret;
>> +
>> +	setup_iomux_enet();
>> +
>> +	ret = cpu_eth_init(bis);
>> +	if (ret)
>> +		printf("FEC MXC: %s:failed\n", __func__);
>> +
>> +	return 0;
>> +}
>
> Maybe you can move setup_iomux_enet() in another board function and drop
> board_eth_init(). cpu_eth_init() is called then in general code.
>

I'll respond to this in a separate thread related to Tom's comment about
re-factoring.

>> +
>> +static void setup_buttons(void)
>> +{
>> +	imx_iomux_v3_setup_multiple_pads(button_pads,
>> +					 ARRAY_SIZE(button_pads));
>> +}
>> +
>> +#ifdef CONFIG_CMD_SATA
>> +
>> +int setup_sata(void)
>> +{
>> +	struct iomuxc_base_regs *const iomuxc_regs
>> +		= (struct iomuxc_base_regs *) IOMUXC_BASE_ADDR;
>> +	int ret = enable_sata_clock();
>> +	if (ret)
>> +		return ret;
>> +
>> +	clrsetbits_le32(&iomuxc_regs->gpr[13],
>> +			IOMUXC_GPR13_SATA_MASK,
>> +			IOMUXC_GPR13_SATA_PHY_8_RXEQ_3P0DB
>> +			|IOMUXC_GPR13_SATA_PHY_7_SATA2M
>> +			|IOMUXC_GPR13_SATA_SPEED_3G
>> +			|(3<<IOMUXC_GPR13_SATA_PHY_6_SHIFT)
>> +			|IOMUXC_GPR13_SATA_SATA_PHY_5_SS_DISABLED
>> +			|IOMUXC_GPR13_SATA_SATA_PHY_4_ATTEN_9_16
>> +			|IOMUXC_GPR13_SATA_PHY_3_TXBOOST_0P00_DB
>> +			|IOMUXC_GPR13_SATA_PHY_2_TX_1P104V
>> +			|IOMUXC_GPR13_SATA_PHY_1_SLOW);
>> +
>> +	return 0;
>> +}
>> +#endif
>> +
>> +#if defined(CONFIG_VIDEO_IPUV3)
>> +
>> +static iomux_v3_cfg_t const backlight_pads[] = {
>> +	/* Backlight on RGB connector: J15 */
>> +	MX6Q_PAD_SD1_DAT3__GPIO_1_21 | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +#define RGB_BACKLIGHT_GP IMX_GPIO_NR(1, 21)
>> +
>> +	/* Backlight on LVDS connector: J6 */
>> +	MX6Q_PAD_SD1_CMD__GPIO_1_18 | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +#define LVDS_BACKLIGHT_GP IMX_GPIO_NR(1, 18)
>> +};
>> +
>> +static iomux_v3_cfg_t const rgb_pads[] = {
>> +	MX6Q_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK,
>> +	MX6Q_PAD_DI0_PIN15__IPU1_DI0_PIN15,
>> +	MX6Q_PAD_DI0_PIN2__IPU1_DI0_PIN2,
>> +	MX6Q_PAD_DI0_PIN3__IPU1_DI0_PIN3,
>> +	MX6Q_PAD_DI0_PIN4__GPIO_4_20,
>> +	MX6Q_PAD_DISP0_DAT0__IPU1_DISP0_DAT_0,
>> +	MX6Q_PAD_DISP0_DAT1__IPU1_DISP0_DAT_1,
>> +	MX6Q_PAD_DISP0_DAT2__IPU1_DISP0_DAT_2,
>> +	MX6Q_PAD_DISP0_DAT3__IPU1_DISP0_DAT_3,
>> +	MX6Q_PAD_DISP0_DAT4__IPU1_DISP0_DAT_4,
>> +	MX6Q_PAD_DISP0_DAT5__IPU1_DISP0_DAT_5,
>> +	MX6Q_PAD_DISP0_DAT6__IPU1_DISP0_DAT_6,
>> +	MX6Q_PAD_DISP0_DAT7__IPU1_DISP0_DAT_7,
>> +	MX6Q_PAD_DISP0_DAT8__IPU1_DISP0_DAT_8,
>> +	MX6Q_PAD_DISP0_DAT9__IPU1_DISP0_DAT_9,
>> +	MX6Q_PAD_DISP0_DAT10__IPU1_DISP0_DAT_10,
>> +	MX6Q_PAD_DISP0_DAT11__IPU1_DISP0_DAT_11,
>> +	MX6Q_PAD_DISP0_DAT12__IPU1_DISP0_DAT_12,
>> +	MX6Q_PAD_DISP0_DAT13__IPU1_DISP0_DAT_13,
>> +	MX6Q_PAD_DISP0_DAT14__IPU1_DISP0_DAT_14,
>> +	MX6Q_PAD_DISP0_DAT15__IPU1_DISP0_DAT_15,
>> +	MX6Q_PAD_DISP0_DAT16__IPU1_DISP0_DAT_16,
>> +	MX6Q_PAD_DISP0_DAT17__IPU1_DISP0_DAT_17,
>> +	MX6Q_PAD_DISP0_DAT18__IPU1_DISP0_DAT_18,
>> +	MX6Q_PAD_DISP0_DAT19__IPU1_DISP0_DAT_19,
>> +	MX6Q_PAD_DISP0_DAT20__IPU1_DISP0_DAT_20,
>> +	MX6Q_PAD_DISP0_DAT21__IPU1_DISP0_DAT_21,
>> +	MX6Q_PAD_DISP0_DAT22__IPU1_DISP0_DAT_22,
>> +	MX6Q_PAD_DISP0_DAT23__IPU1_DISP0_DAT_23,
>> +};
>> +
>> +struct display_info_t {
>> +	int	bus;
>> +	int	addr;
>> +	int	pixfmt;
>> +	int	(*detect)(struct display_info_t const *dev);
>> +	void	(*enable)(struct display_info_t const *dev);
>> +	struct	fb_videomode mode;
>> +};
>> +
>> +
>> +static int detect_hdmi(struct display_info_t const *dev)
>> +{
>> +	return __raw_readb(HDMI_ARB_BASE_ADDR+HDMI_PHY_STAT0)&  HDMI_PHY_HPD;
>> +}
>> +
>> +static void enable_hdmi(struct display_info_t const *dev)
>> +{
>> +	u8 reg;
>> +	printf("%s: setup HDMI monitor\n", __func__);
>> +	reg = __raw_readb(
>> +			HDMI_ARB_BASE_ADDR
>> +			+HDMI_PHY_CONF0);
>
> Accesses with base + offset are forbidden in u-boot. Please add
> structures for this.
>

Ok. This comment really applies to the display support patch.

>> +
>> +static int detect_i2c(struct display_info_t const *dev)
>> +{
>> +	return ((0 == i2c_set_bus_num(dev->bus))
>> +		&&
>> +		(0 == i2c_probe(dev->addr)));
>> +}
>
> This is an original form of if (!i2c_set_bus_num()&&
> !i2c_probe(dev->addr))...
>

Sorry. I have a hard time with the use of ! here since
there's a lot of software that returns true for success.

I always find comparison against the success value to be
clearer, but I can certainly change it.

Muscle-memory is hard to fight.

I'm sure Marek will also have a problem with the Yoda test.

>> +
>> +static void enable_lvds(struct display_info_t const *dev)
>> +{
>> +	struct iomuxc *iomux = (struct iomuxc *)
>> +				IOMUXC_BASE_ADDR;
>> +	u32 reg = readl(&iomux->gpr[2]);
>> +	reg |= IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT;
>> +	writel(reg,&iomux->gpr[2]);
>> +	gpio_direction_output(LVDS_BACKLIGHT_GP, 1);
>> +}
>> +
>> +static void enable_rgb(struct display_info_t const *dev)
>> +{
>> +	imx_iomux_v3_setup_multiple_pads(
>> +		rgb_pads,
>> +		 ARRAY_SIZE(rgb_pads));
>> +	gpio_direction_output(RGB_BACKLIGHT_GP, 1);
>> +}
>> +
>> +static struct display_info_t const displays[] = {{
>> +	.bus	= -1,
>> +	.addr	= 0,
>> +	.pixfmt	= IPU_PIX_FMT_RGB24,
>> +	.detect	= detect_hdmi,
>> +	.enable	= enable_hdmi,
>> +	.mode	= {
>> +		.name           = "HDMI",
>> +		.refresh        = 60,
>> +		.xres           = 1024,
>> +		.yres           = 768,
>> +		.pixclock       = 15385,
>> +		.left_margin    = 220,
>> +		.right_margin   = 40,
>> +		.upper_margin   = 21,
>> +		.lower_margin   = 7,
>> +		.hsync_len      = 60,
>> +		.vsync_len      = 10,
>> +		.sync           = FB_SYNC_EXT,
>> +		.vmode          = FB_VMODE_NONINTERLACED
>> +} }, {
>> +	.bus	= 2,
>> +	.addr	= 0x4,
>> +	.pixfmt	= IPU_PIX_FMT_LVDS666,
>> +	.detect	= detect_i2c,
>> +	.enable	= enable_lvds,
>> +	.mode	= {
>> +		.name           = "Hannstar-XGA",
>> +		.refresh        = 60,
>> +		.xres           = 1024,
>> +		.yres           = 768,
>> +		.pixclock       = 15385,
>> +		.left_margin    = 220,
>> +		.right_margin   = 40,
>> +		.upper_margin   = 21,
>> +		.lower_margin   = 7,
>> +		.hsync_len      = 60,
>> +		.vsync_len      = 10,
>> +		.sync           = FB_SYNC_EXT,
>> +		.vmode          = FB_VMODE_NONINTERLACED
>> +} }, {
>> +	.bus	= 2,
>> +	.addr	= 0x38,
>> +	.pixfmt	= IPU_PIX_FMT_LVDS666,
>> +	.detect	= detect_i2c,
>> +	.enable	= enable_lvds,
>> +	.mode	= {
>> +		.name           = "wsvga-lvds",
>> +		.refresh        = 60,
>> +		.xres           = 1024,
>> +		.yres           = 600,
>> +		.pixclock       = 15385,
>> +		.left_margin    = 220,
>> +		.right_margin   = 40,
>> +		.upper_margin   = 21,
>> +		.lower_margin   = 7,
>> +		.hsync_len      = 60,
>> +		.vsync_len      = 10,
>> +		.sync           = FB_SYNC_EXT,
>> +		.vmode          = FB_VMODE_NONINTERLACED
>> +} }, {
>> +	.bus	= 2,
>> +	.addr	= 0x48,
>> +	.pixfmt	= IPU_PIX_FMT_RGB666,
>> +	.detect	= detect_i2c,
>> +	.enable	= enable_rgb,
>> +	.mode	= {
>> +		.name           = "wvga-rgb",
>> +		.refresh        = 57,
>> +		.xres           = 800,
>> +		.yres           = 480,
>> +		.pixclock       = 37037,
>> +		.left_margin    = 40,
>> +		.right_margin   = 60,
>> +		.upper_margin   = 10,
>> +		.lower_margin   = 10,
>> +		.hsync_len      = 20,
>> +		.vsync_len      = 10,
>> +		.sync           = 0,
>> +		.vmode          = FB_VMODE_NONINTERLACED
>> +} } };
>> +
>> +int board_video_skip(void)
>> +{
>> +	int i;
>> +	int ret;
>> +	char const *panel = getenv("panel");
>> +	if (!panel) {
>> +		for (i = 0; i<  ARRAY_SIZE(displays); i++) {
>> +			struct display_info_t const *dev = displays+i;
>> +			if (dev->detect(dev)) {
>> +				panel = dev->mode.name;
>> +				printf("auto-detected panel %s\n", panel);
>> +				break;
>> +			}
>> +		}
>> +		if (!panel) {
>> +			panel = displays[0].mode.name;
>> +			printf("No panel detected: default to %s\n", panel);
>> +		}
>> +	} else {
>> +		for (i = 0; i<  ARRAY_SIZE(displays); i++) {
>> +			if (!strcmp(panel, displays[i].mode.name))
>> +				break;
>> +		}
>> +	}
>> +	if (i<  ARRAY_SIZE(displays)) {
>> +		ret = ipuv3_fb_init(&displays[i].mode, 0,
>> +				    displays[i].pixfmt);
>> +		if (!ret) {
>> +			displays[i].enable(displays+i);
>> +			printf("Display: %s (%ux%u)\n",
>> +			       displays[i].mode.name,
>> +			       displays[i].mode.xres,
>> +			       displays[i].mode.yres);
>> +		} else
>> +			printf("LCD %s cannot be configured: %d\n",
>> +			       displays[i].mode.name, ret);
>> +	} else {
>> +		printf("unsupported panel %s\n", panel);
>> +		ret = -EINVAL;
>> +	}
>> +	return (0 != ret);
>> +}
>> +
>> +static void setup_display(void)
>> +{
>> +	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
>> +	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
>> +	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
>> +
>> +	int reg;
>> +
>> +	/* Turn on LDB0,IPU,IPU DI0 clocks */
>> +	reg = __raw_readl(&mxc_ccm->CCGR3);
>> +	reg |=   MXC_CCM_CCGR3_IPU1_IPU_DI0_OFFSET
>> +		|MXC_CCM_CCGR3_LDB_DI0_MASK;
>> +	writel(reg,&mxc_ccm->CCGR3);
>> +
>> +	/* Turn on HDMI PHY clock */
>> +	reg = __raw_readl(&mxc_ccm->CCGR2);
>> +	reg |=  MXC_CCM_CCGR2_HDMI_TX_IAHBCLK_MASK
>> +	       |MXC_CCM_CCGR2_HDMI_TX_ISFRCLK_MASK;
>> +	writel(reg,&mxc_ccm->CCGR2);
>> +
>> +	/* clear HDMI PHY reset */
>> +	__raw_writeb(HDMI_MC_PHYRSTZ_DEASSERT,
>> +		     HDMI_ARB_BASE_ADDR+HDMI_MC_PHYRSTZ);
>> +
>> +	/* set PFD1_FRAC to 0x13 == 455 MHz (480*18)/0x13 */
>> +	writel(ANATOP_PFD_480_PFD1_FRAC_MASK,&anatop->pfd_480_clr);
>> +	writel(0x13<<ANATOP_PFD_480_PFD1_FRAC_SHIFT,&anatop->pfd_480_set);
>> +
>> +	/* set LDB0, LDB1 clk select to 011/011 */
>> +	reg = readl(&mxc_ccm->cs2cdr);
>> +	reg&= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
>> +		 |MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
>> +	reg |= (3<<MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
>> +	      |(3<<MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
>> +	writel(reg,&mxc_ccm->cs2cdr);
>> +
>> +	reg = readl(&mxc_ccm->cscmr2);
>> +	reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
>> +	writel(reg,&mxc_ccm->cscmr2);
>> +
>> +	reg = readl(&mxc_ccm->chsccdr);
>> +	reg&= ~(MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK
>> +		|MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK
>> +		|MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK);
>> +	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
>> +		<<MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET)
>> +	      |(CHSCCDR_PODF_DIVIDE_BY_3
>> +		<<MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET)
>> +	      |(CHSCCDR_IPU_PRE_CLK_540M_PFD
>> +		<<MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
>> +	writel(reg,&mxc_ccm->chsccdr);
>> +
>> +	reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
>> +	     |IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_HIGH
>> +	     |IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
>> +	     |IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
>> +	     |IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
>> +	     |IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
>> +	     |IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
>> +	     |IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED
>> +	     |IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0;
>> +	writel(reg,&iomux->gpr[2]);
>> +
>> +	reg = readl(&iomux->gpr[3]);
>> +	reg = (reg&  ~IOMUXC_GPR3_LVDS0_MUX_CTL_MASK)
>> +	    | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
>> +	<<IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET);
>> +	writel(reg,&iomux->gpr[3]);
>> +
>> +	/* backlights off until needed */
>> +	imx_iomux_v3_setup_multiple_pads(backlight_pads,
>> +					 ARRAY_SIZE(backlight_pads));
>> +	gpio_direction_input(LVDS_BACKLIGHT_GP);
>> +	gpio_direction_input(RGB_BACKLIGHT_GP);
>> +}
>> +#endif
>> +
>> +int board_early_init_f(void)
>> +{
>> +	setup_iomux_uart();
>> +	setup_buttons();
>> +
>> +#if defined(CONFIG_VIDEO_IPUV3)
>> +	setup_display();
>> +#endif
>> +	return 0;
>> +}
>> +
>> +/*
>> + * Do not overwrite the console
>> + * Use always serial for U-Boot console
>> + */
>> +int overwrite_console(void)
>> +{
>> +	return 1;
>> +}
>> +
>> +int board_init(void)
>> +{
>> +       /* address of boot parameters */
>> +       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
>> +
>> +#ifdef CONFIG_MXC_SPI
>> +	setup_spi();
>> +#endif
>> +	setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f,&i2c_pad_info0);
>> +	setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f,&i2c_pad_info1);
>> +	setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f,&i2c_pad_info2);
>> +
>> +#ifdef CONFIG_CMD_SATA
>> +	setup_sata();
>> +#endif
>
> Maybe also setup_display should be called here to make things more
> consistent.
>

This comment also applies to the display support patch.

I thought that setup_display needs to be in board_early_init to
allow a vga console, but I'll look again.

>> +
>> +       return 0;
>> +}
>> +
>> +int checkboard(void)
>> +{
>> +       puts("Board: Nitrogen6X or MX6Q-Sabre Lite\n");
>
> I have understood that this porting is for the NitroGen board. Even if
> this u-boot can run on a SabreLite, it is quite confusing this output.
> IMHO only NitroGen should be printed.
>

I think this is covered in the comment to the second patch.
Auto-detection requires setup of the SDIO pads.

>> +struct button_key {
>> +	char const	*name;
>> +	unsigned	gpnum;
>> +	char		ident;
>> +};
>> +
>> +static struct button_key const buttons[] = {
>> +	{"back",	IMX_GPIO_NR(2, 2),	'B'},
>> +	{"home",	IMX_GPIO_NR(2, 4),	'H'},
>> +	{"menu",	IMX_GPIO_NR(2, 1),	'M'},
>> +	{"search",	IMX_GPIO_NR(2, 3),	'S'},
>> +	{"volup",	IMX_GPIO_NR(7, 13),	'V'},
>> +	{"voldown",	IMX_GPIO_NR(4, 5),	'v'},
>> +};
>> +
>> +/*
>> + * generate a null-terminated string containing the buttons pressed
>> + * returns number of keys pressed
>> + */
>> +static int read_keys(char *buf)
>> +{
>> +	int i, numpressed = 0;
>> +	for (i = 0; i<  ARRAY_SIZE(buttons); i++) {
>> +		if (!gpio_get_value(buttons[i].gpnum))
>> +			buf[numpressed++] = buttons[i].ident;
>> +	}
>> +	buf[numpressed] = '\0';
>> +	return numpressed;
>> +}
>> +
>> +static int do_kbd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>> +{
>> +	char envvalue[ARRAY_SIZE(buttons)+1];
>> +	int numpressed = read_keys(envvalue);
>> +	setenv("keybd", envvalue);
>> +	return numpressed == 0;
>> +}
>
> What about to factorize this stuff ? This is not strictly related to
> your board. What is needed here is a the array with the key definitions.
> This stuff is in much more as in a couple of boards. It is contained
> also in board/r360mpi/r360mpi.c and lwmon.
>
> Let away the old boards. However, if we hide these function in board
> code, it is quite probable we see the same functionality implemented
> another time.
>
> What about to move into drivers/input ? It seems to me the right place
> for it.
>

As discussed in another thread, a **lot** of re-factoring could
be done, especially as it relates to SABRE Lite and Nitrogen6x.

I'll see what can be done here. You're right that there isn't
anything board-specific here except the pads and key assignments.
... and perhaps the polarities of the GPIOs.

>> +
>> +U_BOOT_CMD(
>> +	kbd, 1, 1, do_kbd,
>> +	"Tests for keypresses, sets 'keybd' environment variable",
>> +	"Returns 0 (true) to shell if key is pressed."
>> +);
>> +
>> +#ifdef CONFIG_PREBOOT
>> +static char const kbd_magic_prefix[] = "key_magic";
>> +static char const kbd_command_prefix[] = "key_cmd";
>> +
>> +static void preboot_keys(void)
>> +{
>> +	int numpressed;
>> +	char keypress[ARRAY_SIZE(buttons)+1];
>> +	numpressed = read_keys(keypress);
>> +	if (numpressed) {
>> +		char *kbd_magic_keys = getenv("magic_keys");
>> +		char *suffix;
>> +		/*
>> +		 * loop over all magic keys
>> +		 */
>> +		for (suffix = kbd_magic_keys; *suffix; ++suffix) {
>> +			char *keys;
>> +			char magic[sizeof(kbd_magic_prefix) + 1];
>> +			sprintf(magic, "%s%c", kbd_magic_prefix, *suffix);
>> +			keys = getenv(magic);
>> +			if (keys) {
>> +				if (!strcmp(keys, keypress))
>> +					break;
>> +			}
>> +		}
>> +		if (*suffix) {
>> +			char cmd_name[sizeof(kbd_command_prefix) + 1];
>> +			char *cmd;
>> +			sprintf(cmd_name, "%s%c", kbd_command_prefix, *suffix);
>> +			cmd = getenv(cmd_name);
>> +			if (cmd) {
>> +				setenv("preboot", cmd);
>
> IMHO it should be always possible for the user to explicitely set the
> "preboot" variable. In your implementation, it is always overwritten. I
> would add a check for "preboot", setting it only in case it is not yet set.
>

Good catch. I hadn't noticed that.

This really does apply to a previous patch adding keyboard support though.

>> +				return;
>> +			}
>> +		}
>> +	}
>> +}
>
>
> Also preboot_keys() can be useful for other boards, not only for
> sabrelite and nitrogen.
>

Absolutely.

>> +#endif
>> +
>> +#ifdef CONFIG_CMD_BMODE
>> +static const struct boot_mode board_boot_modes[] = {
>> +	/* 4 bit bus width */
>> +	{"mmc0",	MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
>> +	{"mmc1",	MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00)},
>> +	{NULL,		0},
>> +};
>> +#endif
>> +
>> +int misc_init_r(void)
>> +{
>> +#ifdef CONFIG_PREBOOT
>> +	preboot_keys();
>> +#endif
>> +
>> +#ifdef CONFIG_CMD_BMODE
>> +	add_board_boot_modes(board_boot_modes);
>> +#endif
>> +	return 0;
>> +}
>> diff --git a/boards.cfg b/boards.cfg
>> index e9e073e..ac8e39d 100644
>> --- a/boards.cfg
>> +++ b/boards.cfg
>> @@ -234,6 +234,7 @@ mx6qarm2                     arm         armv7       mx6qarm2            freesca
>>   mx6qsabreauto                arm         armv7       mx6qsabreauto       freescale      mx6		mx6qsabreauto:IMX_CONFIG=board/freescale/mx6qsabreauto/imximage.cfg
>>   mx6qsabrelite                arm         armv7       mx6qsabrelite       freescale      mx6		mx6qsabrelite:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
>>   mx6qsabresd                  arm         armv7       mx6qsabresd         freescale      mx6		mx6qsabresd:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
>> +nitrogen6x                   arm         armv7       nitrogen6x          boundary       mx6		nitrogen6x:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
>>   cm_t35                       arm         armv7       cm_t35              -              omap3
>>   omap3_overo                  arm         armv7       overo               -              omap3
>>   omap3_pandora                arm         armv7       pandora             -              omap3
>> diff --git a/include/configs/nitrogen6x.h b/include/configs/nitrogen6x.h
>> new file mode 100644
>> index 0000000..f0ecf72
>> --- /dev/null
>> +++ b/include/configs/nitrogen6x.h
>> @@ -0,0 +1,242 @@
>> +/*
>> + * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
>> + *
>> + * Configuration settings for the Boundary Devices Nitrogen6X
>> + * and Freescale i.MX6Q Sabre Lite boards.
>> + *
>> + * 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
>> + */
>> +
>> +#ifndef __CONFIG_H
>> +#define __CONFIG_H
>> +
>> +#define CONFIG_MX6Q
>> +#define CONFIG_DISPLAY_CPUINFO
>> +#define CONFIG_DISPLAY_BOARDINFO
>> +
>> +#define CONFIG_MACH_TYPE	3769
>> +
>> +#include<asm/arch/imx-regs.h>
>> +#include<asm/imx-common/gpio.h>
>> +
>> +#define CONFIG_CMDLINE_TAG
>> +#define CONFIG_SETUP_MEMORY_TAGS
>> +#define CONFIG_INITRD_TAG
>> +#define CONFIG_REVISION_TAG
>> +
>> +/* Size of malloc() pool */
>> +#define CONFIG_SYS_MALLOC_LEN		(10 * 1024 * 1024)
>> +
>> +#define CONFIG_BOARD_EARLY_INIT_F
>> +#define CONFIG_MISC_INIT_R
>> +#define CONFIG_MXC_GPIO
>> +
>> +#define CONFIG_MXC_UART
>> +#define CONFIG_MXC_UART_BASE	       UART2_BASE
>> +
>> +#define CONFIG_CMD_SF
>> +#ifdef CONFIG_CMD_SF
>> +#define CONFIG_SPI_FLASH
>> +#define CONFIG_SPI_FLASH_SST
>> +#define CONFIG_MXC_SPI
>> +#define CONFIG_SF_DEFAULT_BUS  0
>> +#define CONFIG_SF_DEFAULT_CS   (0|(IMX_GPIO_NR(3, 19)<<8))
>> +#define CONFIG_SF_DEFAULT_SPEED 25000000
>> +#define CONFIG_SF_DEFAULT_MODE (SPI_MODE_0)
>> +#endif
>> +
>> +/* I2C Configs */
>> +#define CONFIG_CMD_I2C
>> +#define CONFIG_I2C_MULTI_BUS
>> +#define CONFIG_I2C_MXC
>> +#define CONFIG_SYS_I2C_SPEED		100000
>> +
>> +/* MMC Configs */
>> +#define CONFIG_FSL_ESDHC
>> +#define CONFIG_FSL_USDHC
>> +#define CONFIG_SYS_FSL_ESDHC_ADDR      0
>> +#define CONFIG_SYS_FSL_USDHC_NUM       2
>> +
>> +#define CONFIG_MMC
>> +#define CONFIG_CMD_MMC
>> +#define CONFIG_GENERIC_MMC
>> +#define CONFIG_CMD_EXT2
>> +#define CONFIG_CMD_FAT
>> +#define CONFIG_DOS_PARTITION
>> +
>> +#define CONFIG_CMD_SATA
>> +/*
>> + * SATA Configs
>> + */
>> +#ifdef CONFIG_CMD_SATA
>> +#define CONFIG_DWC_AHSATA
>> +#define CONFIG_SYS_SATA_MAX_DEVICE	1
>> +#define CONFIG_DWC_AHSATA_PORT_ID	0
>> +#define CONFIG_DWC_AHSATA_BASE_ADDR	SATA_ARB_BASE_ADDR
>> +#define CONFIG_LBA48
>> +#define CONFIG_LIBATA
>> +#endif
>> +
>> +#define CONFIG_CMD_PING
>> +#define CONFIG_CMD_DHCP
>> +#define CONFIG_CMD_MII
>> +#define CONFIG_CMD_NET
>> +#define CONFIG_FEC_MXC
>> +#define CONFIG_MII
>> +#define IMX_FEC_BASE			ENET_BASE_ADDR
>> +#define CONFIG_FEC_XCV_TYPE		RGMII
>> +#define CONFIG_ETHPRIME			"FEC"
>> +#define CONFIG_FEC_MXC_PHYADDR		6
>> +#define CONFIG_PHYLIB
>> +#define CONFIG_PHY_MICREL
>> +#define CONFIG_PHY_MICREL_KSZ9021
>> +
>> +/* USB Configs */
>> +#define CONFIG_CMD_USB
>> +#define CONFIG_CMD_FAT
>> +#define CONFIG_USB_EHCI
>> +#define CONFIG_USB_EHCI_MX6
>> +#define CONFIG_USB_STORAGE
>> +#define CONFIG_USB_HOST_ETHER
>> +#define CONFIG_USB_ETHER_ASIX
>> +#define CONFIG_USB_ETHER_SMSC95XX
>> +#define CONFIG_MXC_USB_PORT	1
>> +#define CONFIG_MXC_USB_PORTSC	(PORT_PTS_UTMI | PORT_PTS_PTW)
>> +#define CONFIG_MXC_USB_FLAGS	0
>> +
>> +/* Miscellaneous commands */
>> +#define CONFIG_CMD_BMODE
>> +#define CONFIG_CMD_SETEXPR
>> +
>> +/* Framebuffer and LCD */
>> +#define CONFIG_VIDEO
>> +#define CONFIG_VIDEO_IPUV3
>> +#define CONFIG_CFB_CONSOLE
>> +#define CONFIG_VGA_AS_SINGLE_DEVICE
>> +#define CONFIG_SYS_CONSOLE_IS_IN_ENV
>> +#define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
>> +#define CONFIG_VIDEO_BMP_RLE8
>> +#define CONFIG_SPLASH_SCREEN
>> +#define CONFIG_BMP_16BPP
>> +#define CONFIG_VIDEO_LOGO
>> +#define CONFIG_IPUV3_CLK 260000000
>> +
>> +/* allow to overwrite serial and ethaddr */
>> +#define CONFIG_ENV_OVERWRITE
>> +#define CONFIG_CONS_INDEX	       1
>> +#define CONFIG_BAUDRATE			       115200
>> +
>> +/* Command definition */
>> +#include<config_cmd_default.h>
>
> Move CONFIG_CMD_BMODE and CONFIG_CMD_SETEXPR here.
>

That makes perfect sense.

>> +
>> +#undef CONFIG_CMD_IMLS
>> +
>> +#define CONFIG_BOOTDELAY	       3
>> +
>> +#define CONFIG_PREBOOT                 ""
>> +
>> +#define CONFIG_LOADADDR			       0x10800000
>> +#define CONFIG_SYS_TEXT_BASE	       0x17800000
>> +
>> +#define CONFIG_EXTRA_ENV_SETTINGS \
>> +	"console=ttymxc1\0" \
>> +	"clearenv=if sf probe || sf probe || sf probe 1 ; then sf erase 0xc0000 0x2000&&  " \
>> +		"echo restored environment to factory default ; fi\0" \
>> +	"bootcmd=for dtype in sata mmc ; do " \
>> +		"for disk in 0 1 ; do ${dtype} dev ${disk} ;" \
>> +			"for fs in fat ext2 ; do " \
>> +				"${fs}load ${dtype} ${disk}:1 10008000 " \
>> +					"/6q_bootscript" \
>> +					"&&  source 10008000 ; " \
>> +			"done ; " \
>> +		"done ; " \
>> +	"done\0" \
>> +	"upgradeu=for dtype in sata mmc ; do " \
>> +		"for disk in 0 1 ; do ${dtype} dev ${disk} ;" \
>> +		     "for fs in fat ext2 ; do " \
>> +				"${fs}load ${dtype} ${disk}:1 10008000 " \
>> +					"/6q_upgrade " \
>> +					"&&  source 10008000 ; " \
>> +			"done ; " \
>> +		"done ; " \
>> +	"done\0" \
>> +
>> +#define CONFIG_ARP_TIMEOUT     200UL
>> +
>> +/* Miscellaneous configurable options */
>> +#define CONFIG_SYS_LONGHELP
>> +#define CONFIG_SYS_HUSH_PARSER
>> +#define CONFIG_SYS_PROMPT	       "U-Boot>  "
>> +#define CONFIG_AUTO_COMPLETE
>> +#define CONFIG_SYS_CBSIZE	       256
>> +
>> +/* Print Buffer Size */
>> +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
>> +#define CONFIG_SYS_MAXARGS	       16
>> +#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
>> +
>> +#define CONFIG_SYS_MEMTEST_START       0x10000000
>> +#define CONFIG_SYS_MEMTEST_END	       0x10010000
>> +
>> +#define CONFIG_SYS_LOAD_ADDR	       CONFIG_LOADADDR
>> +#define CONFIG_SYS_HZ		       1000
>> +
>> +#define CONFIG_CMDLINE_EDITING
>> +
>> +/* Physical Memory Map */
>> +#define CONFIG_NR_DRAM_BANKS	       1
>> +#define PHYS_SDRAM		       MMDC0_ARB_BASE_ADDR
>> +#define PHYS_SDRAM_SIZE			       (1u * 1024 * 1024 * 1024)
>> +
>> +#define CONFIG_SYS_SDRAM_BASE	       PHYS_SDRAM
>> +#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
>> +#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
>> +
>> +#define CONFIG_SYS_INIT_SP_OFFSET \
>> +       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
>> +#define CONFIG_SYS_INIT_SP_ADDR \
>> +       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
>> +
>> +/* FLASH and environment organization */
>> +#define CONFIG_SYS_NO_FLASH
>> +
>> +#define CONFIG_ENV_SIZE			(8 * 1024)
>> +
>> +/* #define CONFIG_ENV_IS_IN_MMC */
>> +#define CONFIG_ENV_IS_IN_SPI_FLASH
>> +
>> +#if defined(CONFIG_ENV_IS_IN_MMC)
>> +#define CONFIG_ENV_OFFSET		(6 * 64 * 1024)
>> +#define CONFIG_SYS_MMC_ENV_DEV		0
>> +#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
>> +#define CONFIG_ENV_OFFSET		(768 * 1024)
>> +#define CONFIG_ENV_SECT_SIZE		(8 * 1024)
>> +#define CONFIG_ENV_SPI_BUS		CONFIG_SF_DEFAULT_BUS
>> +#define CONFIG_ENV_SPI_CS		CONFIG_SF_DEFAULT_CS
>> +#define CONFIG_ENV_SPI_MODE		CONFIG_SF_DEFAULT_MODE
>> +#define CONFIG_ENV_SPI_MAX_HZ		CONFIG_SF_DEFAULT_SPEED
>> +#endif
>> +
>> +#define CONFIG_OF_LIBFDT
>> +#define CONFIG_CMD_BOOTZ
>> +
>> +#define CONFIG_SYS_DCACHE_OFF
>> +
>> +#ifndef CONFIG_SYS_DCACHE_OFF
>> +#define CONFIG_CMD_CACHE
>> +#endif
>> +
>> +#endif			       /* __CONFIG_H */
>>
>
> Best regards,
> Stefano Babic
>

Thanks for the thorough and thoughtful review.

Regards,


Eric

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-08 12:54           ` Stefano Babic
@ 2012-10-08 17:24             ` Eric Nelson
  0 siblings, 0 replies; 22+ messages in thread
From: Eric Nelson @ 2012-10-08 17:24 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

On 10/08/2012 05:54 AM, Stefano Babic wrote:
> On 05/10/2012 22:03, Eric Nelson wrote:
>> On 10/05/2012 12:00 PM, Tom Rini wrote:
>>> On Fri, Oct 05, 2012 at 11:42:19AM -0700, Eric Nelson wrote:
>>>> On 10/05/2012 10:24 AM, Albert ARIBAUD wrote:
>>>>> Hi Eric,
>>>>>
>>>>> On Thu,  4 Oct 2012 12:49:07 -0700, Eric Nelson
>>>>> <eric.nelson@boundarydevices.com>    wrote:
>>>>>
>>>>>> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
>>>>>> ---
>>>>>>    board/boundary/nitrogen6x/Makefile     |   41 ++
>>>>>>    board/boundary/nitrogen6x/README       |   77 +++
>>>>>>    board/boundary/nitrogen6x/nitrogen6x.c |  840
>>>>>> ++++++++++++++++++++++++++++++++
>>>>>>    boards.cfg                             |    1 +
>>>>>>    include/configs/nitrogen6x.h           |  242 +++++++++
>>>>>>    5 files changed, 1201 insertions(+), 0 deletions(-)
>>>>>>    create mode 100644 board/boundary/nitrogen6x/Makefile
>>>>>>    create mode 100644 board/boundary/nitrogen6x/README
>>>>>>    create mode 100644 board/boundary/nitrogen6x/nitrogen6x.c
>>>>>>    create mode 100644 include/configs/nitrogen6x.h
>>>>>
>>>>> If this is essentially a copy of sabrelite, I am surprised that git
>>>>> does not report any copies. Did you use -C with git format-patch ?
>>>>>
>>>>
>>>> Hi Albert,
>>>>
>>>> I didn't use '-C' (didn't know about it: thanks for the tip!).
>>>>
>>>> It wouldn't have detected copies though, because I made slight
>>>> changes in each of these files, replacing the board names and
>>>> file names in board/boundary/ and altering the default environment
>>>> (policy bits) in nitrogen6x.h.
>>>
>>> And we can't deal with this by factoring the code differently?
>>>
>> Hi Tom,
>>
>> There are two bits to this question:
>>      - Can we represent the policy differences outside of a
>>      board structure? These differences are all inside of
>>      include/configs/nitrogen6x.
>>
>
> What we have already done is to set a common config header that is
> included by both include/configs/nitrogen6x and include/configs/sabrelite.
> See for example mx6qsabre_common.h, with the boards mx6qsabresd and
> mx6qsabreauto.
>

The question I have is "what is common?". Looking at mx6qsabre_common.h,
it seems that there's a mixture of things that might be common to
all i.MX6-based boards (inclusion of imx-regs is the clear example),
but most of this header file is enforcing policy like
	#define CONFIG_CMDLINE_EDITING
and
	#define CONFIG_ENV_IS_IN_MMC

>>      - Can we represent the board differences without a
>>      board structure? This is a bit harder, since the
>>      boards are slightly different. The Nitrogen6X has
>>      a different ethernet PHY reset pin and an optional
>>      SDIO Wi-Fi module.
>
> Ona major point is *how* you want to represent your board into U-boot,
> even if it is derived from a Freescale's evaluation board. In many case
> a vendor directory is desired (freescale vs boundary).
>

It's nice to have some brand exposure, but mostly we just want
to make things simple to define and maintain so we can help
get products to market.

>>
>>      We could add code to SABRE Lite to accommodate these,
>>      but it seems that sets a bad precedent. Would this
>>      be done for every vendor that bases a design on
>>      SABRE Lite?
>
> I am afraid that it is easy to reach the case when changes for a vendor
> will break other boards, and getting all in sync can be problematic.
>

I agree. That, and the question of policy are the primary
drivers for the separate board directory.

>>
>> The precise diffs for the configs and sources is attached for
>> reference.
>>
>> I've also been pondering how to simply re-use the code within
>> the board setup file (mx6qsabrelite.c), but I haven't figured
>> anything out. Clearly a lot of the code is duplicated, but at
>> the same time it's board-specific.
>>
>> For example, we could create a common module that sets up
>> the SD card pads "like SABRE Lite", and a similar one to
>> configure ethernet pads. Since SABRE Lite is a reference design,
>> perhaps that makes sense.
>
> I think that another example in u-boot doing this is for davinci (8xx)
> boards, At least three boards share the same board structure, see
> board/davinci/da8xxevm/Makefile.
>
> Very board related functions are compiled using CONFIG_MACH:
>
> COBJS-$(CONFIG_MACH_DAVINCI_DA830_EVM)  += da830evm.o
> COBJS-$(CONFIG_MACH_DAVINCI_DA850_EVM)  += da850evm.o
> COBJS-$(CONFIG_MACH_DAVINCI_HAWK)       += hawkboard.o
>

Thanks for the pointers. I was about to ask Tom whether he
could point me at specific cases to help illustrate what he's
thinking.

That said, I'm not quite grokking how the commonality of these
boards is expressed.

In some ways, I think Nitrogen6X is a case study in how a
board derived from a reference design can be supported and
maintained in U-Boot, either in the main-line tree or off-line
as many vendors do.

-- The schematics are almost identical, so 99% of the pad settings
are the same.

-- The native peripheral set for Nitrogen6X is a superset of those on
Sabre Lite.

-- The set of accessories supplied for both is the same (Android
button board, LVDS and RGB displays).

It seems a useful exercise at least to look at what can be done
to express this in a useful and scalable way.

Board designers often cut & paste big hunks of schematic when
building a custom board based on a reference design. For example,
the mx6qsabreauto design also seems to have DISP0 mapped to a
40-pin parallel display connector with the same I2C interface
as SABRE Lite and Nitrogen6x.

For our part, we actively encourage that for our Nitrogen6X
SOM customers to help speed them to market.

I think there's a way of mapping these decisions through to
board-specific files.

Because talking about in the abstract is difficult, I took a
stab at coding this over the weekend and found that the easiest
bits to express are the pad/pinmux settings.

This also has the biggest impact.

I'd like to propose that we place something like this
in a common header corresponding to the reference design:

	#define SABRELITE_RGB_PADS \
		MX6Q_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK,	\
		MX6Q_PAD_DI0_PIN15__IPU1_DI0_PIN15,		\
		...

Then, in board-specific file, the implementer could re-use
them like so:
	static iomux_v3_cfg_t const rgb_pads[] = {
	        SABRELITE_RGB_PADS
	};

To follow through, if a board designer uses the Atheros ethernet
PHY, they might use bits from the SABREAUTO design:

	iomux_v3_cfg_t const enet_pads[] = {
		SABREAUTO_ENET_PADS
	};

If another board really does require different muxing or
pad setup, there's nothing precluding cut & paste.

As much as I dislike excessive macro-fu, using macros rather
than external data declarations will avoid any symbol name
conflicts or data segment bloat for unused bits.

If changes are needed, it should also be simple to grep for
boards using, say "SABRELITE_RGB_PADS" if an when an
update is needed. For example, it's possible that the
choice of 120 ohm drive strength is sub-optimal. If we
determine that 80 ohms is better in the general case,
we could change it in one place, but a board could
easily override it if they have a particular panel
that needs something else.

As Stefano pointed out, other bits of re-factoring of the
SABRE Lite code are possible and appropriate. In particular:

	- keyboard handling via GPIOs could go into drivers/input
	as a proper "gpio_keyboard" driver or somesuch.

	- some parts of display support could be moved into
	separate modules (though I'm not yet sure where all
	of the dividing lines should go).

If this is done, it seems that very little is left.

For example, is there a way to meaningfully make this bit of
common code between SABRE Lite and Nitrogen6X modular?

	int misc_init_r(void)
	{
	#ifdef CONFIG_PREBOOT
		preboot_keys();
	#endif

	#ifdef CONFIG_CMD_BMODE
		add_board_boot_modes(board_boot_modes);
	#endif
		return 0;
	}

If so, is there a point? I'm not sure.

As always, let me know your thoughts.

Clearly, all of this needs feedback from Fabio and Jason.

Regards,


Eric

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-08 16:05     ` Eric Nelson
@ 2012-10-08 20:30       ` Troy Kisky
  2012-10-08 21:03         ` Stefano Babic
  0 siblings, 1 reply; 22+ messages in thread
From: Troy Kisky @ 2012-10-08 20:30 UTC (permalink / raw)
  To: u-boot

On 10/8/2012 9:05 AM, Eric Nelson wrote:
> Hi Stefano,
>
> On 10/08/2012 05:28 AM, Stefano Babic wrote: +
>>> +/* Command definition */
>>> +#include<config_cmd_default.h>
>>
>> Move CONFIG_CMD_BMODE and CONFIG_CMD_SETEXPR here.
>>
>
> That makes perfect sense.
>
Moving CONFIG_CMD_BMODE may break MX51 boards.
Only mx6 and mx53 define boot_mode_apply function in soc.c

Troy

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-08 20:30       ` Troy Kisky
@ 2012-10-08 21:03         ` Stefano Babic
  2012-10-08 21:24           ` Troy Kisky
  0 siblings, 1 reply; 22+ messages in thread
From: Stefano Babic @ 2012-10-08 21:03 UTC (permalink / raw)
  To: u-boot

On 08/10/2012 22:30, Troy Kisky wrote:
> On 10/8/2012 9:05 AM, Eric Nelson wrote:
>> Hi Stefano,
>>
>> On 10/08/2012 05:28 AM, Stefano Babic wrote: +
>>>> +/* Command definition */
>>>> +#include<config_cmd_default.h>
>>>
>>> Move CONFIG_CMD_BMODE and CONFIG_CMD_SETEXPR here.
>>>
>>
>> That makes perfect sense.
>>
> Moving CONFIG_CMD_BMODE may break MX51 boards.
> Only mx6 and mx53 define boot_mode_apply function in soc.c
> 

???

My proposal is to move the two defines after including cmd_default.h,
but still in nitrogen6x.h. It is not possible to break mx51 boards.

Regards,
Stefano

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH 1/3] Add nitrogen6x board
  2012-10-08 21:03         ` Stefano Babic
@ 2012-10-08 21:24           ` Troy Kisky
  0 siblings, 0 replies; 22+ messages in thread
From: Troy Kisky @ 2012-10-08 21:24 UTC (permalink / raw)
  To: u-boot

On 10/8/2012 2:03 PM, Stefano Babic wrote:
> On 08/10/2012 22:30, Troy Kisky wrote:
>> On 10/8/2012 9:05 AM, Eric Nelson wrote:
>>> Hi Stefano,
>>>
>>> On 10/08/2012 05:28 AM, Stefano Babic wrote: +
>>>>> +/* Command definition */
>>>>> +#include<config_cmd_default.h>
>>>> Move CONFIG_CMD_BMODE and CONFIG_CMD_SETEXPR here.
>>>>
>>> That makes perfect sense.
>>>
>> Moving CONFIG_CMD_BMODE may break MX51 boards.
>> Only mx6 and mx53 define boot_mode_apply function in soc.c
>>
> ???
>
> My proposal is to move the two defines after including cmd_default.h,
> but still in nitrogen6x.h. It is not possible to break mx51 boards.
>
> Regards,
> Stefano
>

Ah. That makes more sense. I thought you were suggesting moving them inside

config_cmd_default.h

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

end of thread, other threads:[~2012-10-08 21:24 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-04 19:49 [U-Boot] [PATCH 0/3] Add support for the Boundary Devices Nitrogen6x board Eric Nelson
2012-10-04 19:49 ` [U-Boot] [PATCH 1/3] Add nitrogen6x board Eric Nelson
2012-10-04 21:42   ` Sinan Akman
2012-10-04 21:51     ` Sinan Akman
2012-10-04 21:56   ` Fabio Estevam
2012-10-05 17:24   ` Albert ARIBAUD
2012-10-05 18:42     ` Eric Nelson
2012-10-05 19:00       ` Tom Rini
2012-10-05 20:03         ` Eric Nelson
2012-10-05 22:46           ` Tom Rini
2012-10-08 12:54           ` Stefano Babic
2012-10-08 17:24             ` Eric Nelson
2012-10-05 19:29       ` Albert ARIBAUD
2012-10-06  0:23         ` Eric Nelson
2012-10-08 12:28   ` Stefano Babic
2012-10-08 16:05     ` Eric Nelson
2012-10-08 20:30       ` Troy Kisky
2012-10-08 21:03         ` Stefano Babic
2012-10-08 21:24           ` Troy Kisky
2012-10-04 19:49 ` [U-Boot] [PATCH 2/3] nitrogen6x: configure and toggle PHY reset for Nitrogen6x Eric Nelson
2012-10-04 19:49 ` [U-Boot] [PATCH 3/3] nitrogen6x: initialize WL12XX pads, use to determine board type Eric Nelson
2012-10-08 12:32   ` Stefano Babic

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.