Skip to contentSkip to conversation

ARM: tegra: add Colibri T30 board support

PATCH New Stefan Agner 4 participants 13 messages Jul 31, 2014 – Aug 4, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

---
 arch/arm/Kconfig                                   |   4 +
 arch/arm/dts/Makefile                              |   1 +
 arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
 arch/arm/include/asm/mach-types.h                  |  13 +
 board/toradex/colibri_t30/Makefile                 |   6 +
 board/toradex/colibri_t30/colibri_t30.c            |  52 +++
 .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
 include/configs/colibri_t30.h                      |  73 +++++
 8 files changed, 593 insertions(+)
 create mode 100644 arch/arm/dts/tegra30-colibri.dts
 create mode 100644 board/toradex/colibri_t30/Makefile
 create mode 100644 board/toradex/colibri_t30/colibri_t30.c
 create mode 100644 board/toradex/colibri_t30/pinmux-config-colibri_t30.h
 create mode 100644 include/configs/colibri_t30.h
arch/arm/Kconfig +4 -0
index e385eda..dd987cc 100644
@@ -701,6 +701,9 @@ config TARGET_WHISTLER
 config TARGET_COLIBRI_T20_IRIS
 	bool "Support colibri_t20_iris"
 
+config TARGET_COLIBRI_T30
+	bool "Support Colibri T30"
+
 config TARGET_TEC_NG
 	bool "Support tec-ng"
 
@@ -989,6 +992,7 @@ source "board/timll/devkit3250/Kconfig"
 source "board/timll/devkit8000/Kconfig"
 source "board/toradex/colibri_pxa270/Kconfig"
 source "board/toradex/colibri_t20_iris/Kconfig"
+source "board/toradex/colibri_t30/Kconfig"
 source "board/trizepsiv/Kconfig"
 source "board/ttcontrol/vision2/Kconfig"
 source "board/udoo/Kconfig"
arch/arm/dts/Makefile +1 -0
index 6e2e313..c46b7be 100644
@@ -21,6 +21,7 @@ dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \
 	tegra20-colibri_t20_iris.dtb \
 	tegra30-beaver.dtb \
 	tegra30-cardhu.dtb \
+	tegra30-colibri.dtb \
 	tegra30-tec-ng.dtb \
 	tegra114-dalmore.dtb \
 	tegra124-jetson-tk1.dtb \
arch/arm/dts/tegra30-colibri.dts new file +84 -0

84 lines not on this page · raw message

arch/arm/include/asm/mach-types.h +13 -0
index 440b041..560924e 100644
@@ -1106,6 +1106,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_OMAP5_SEVM           3777
 #define MACH_TYPE_ARMADILLO_800EVA     3863
 #define MACH_TYPE_KZM9G                4140
+#define MACH_TYPE_COLIBRI_T30          4493
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -14235,6 +14236,18 @@ extern unsigned int __machine_arch_type;
 # define machine_is_kzm9g()	(0)
 #endif
 
+#ifdef CONFIG_MACH_COLIBRI_T30
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type	__machine_arch_type
+# else
+#  define machine_arch_type	MACH_TYPE_COLIBRI_T30
+# endif
+# define machine_is_colibri_t30()	(machine_arch_type == MACH_TYPE_COLIBRI_T30)
+#else
+# define machine_is_colibri_t30()	(0)
+#endif
+
 /*
  * These have not yet been registered
  */
board/toradex/colibri_t30/Makefile new file +6 -0
new file mode 100644
index 0000000..3d58a4b
@@ -0,0 +1,6 @@
+# Copyright (c) 2013-2014 Stefan Agner
+# SPDX-License-Identifier:      GPL-2.0+
+
+include $(srctree)/board/nvidia/common/common.mk
+
+obj-y	+= colibri_t30.o
board/toradex/colibri_t30/colibri_t30.c new file +52 -0

52 lines not on this page · raw message

board/toradex/colibri_t30/pinmux-config-colibri_t30.h new file +360 -0

360 lines not on this page · raw message

include/configs/colibri_t30.h new file +73 -0

73 lines not on this page · raw message

Signature · 1 line
2.0.3
#1 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Hi Stefan,

Quoted 3 lines · Stefan Agner

This adds board support for the Toradex Colibri T30 module.

A few quick questions below...

Quoted 165 lines

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

---
 arch/arm/Kconfig                                   |   4 +
 arch/arm/dts/Makefile                              |   1 +
 arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
 arch/arm/include/asm/mach-types.h                  |  13 +
 board/toradex/colibri_t30/Makefile                 |   6 +
 board/toradex/colibri_t30/colibri_t30.c            |  52 +++
 .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
 include/configs/colibri_t30.h                      |  73 +++++
 8 files changed, 593 insertions(+)
 create mode 100644 arch/arm/dts/tegra30-colibri.dts
 create mode 100644 board/toradex/colibri_t30/Makefile
 create mode 100644 board/toradex/colibri_t30/colibri_t30.c
 create mode 100644 board/toradex/colibri_t30/pinmux-config-colibri_t30.h
 create mode 100644 include/configs/colibri_t30.h
arch/arm/Kconfig +4 -0
index e385eda..dd987cc 100644
@@ -701,6 +701,9 @@ config TARGET_WHISTLER
 config TARGET_COLIBRI_T20_IRIS
        bool "Support colibri_t20_iris"
 
+config TARGET_COLIBRI_T30
+       bool "Support Colibri T30"
+
 config TARGET_TEC_NG
        bool "Support tec-ng"
 
@@ -989,6 +992,7 @@ source "board/timll/devkit3250/Kconfig"
 source "board/timll/devkit8000/Kconfig"
 source "board/toradex/colibri_pxa270/Kconfig"
 source "board/toradex/colibri_t20_iris/Kconfig"
+source "board/toradex/colibri_t30/Kconfig"
 source "board/trizepsiv/Kconfig"
 source "board/ttcontrol/vision2/Kconfig"
 source "board/udoo/Kconfig"
arch/arm/dts/Makefile +1 -0
index 6e2e313..c46b7be 100644
@@ -21,6 +21,7 @@ dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \
        tegra20-colibri_t20_iris.dtb \
        tegra30-beaver.dtb \
        tegra30-cardhu.dtb \
+       tegra30-colibri.dtb \
        tegra30-tec-ng.dtb \
        tegra114-dalmore.dtb \
        tegra124-jetson-tk1.dtb \
arch/arm/dts/tegra30-colibri.dts new file +84 -0
new file mode 100644
index 0000000..21d0311
@@ -0,0 +1,84 @@
+/dts-v1/;
+
+#include "tegra30.dtsi"
+
+/ {
+       model = "Toradex Colibri T30";
+       compatible = "toradex,colibri_t30", "nvidia,tegra30";
+
+       aliases {
+               i2c0 = "/i2c at 7000d000";
+               i2c1 = "/i2c at 7000c000";
+               i2c2 = "/i2c at 7000c700";
+               sdhci0 = "/sdhci at 78000600";
+               sdhci1 = "/sdhci at 78000200";
+               usb0 = "/usb at 7d000000";
+               usb1 = "/usb at 7d004000"; /* on module only, for ASIX */
+               usb2 = "/usb at 7d008000";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x80000000 0x40000000>;
+       };
+
+       /* GEN1_I2C: I2C_SDA/SCL on SODIMM pin 194/196 (e.g. RTC on carrier
+          board) */
+       i2c at 7000c000 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       /* GEN2_I2C: unused */
+
+       /* CAM_I2C: unused */
+
+       /* DDC_CLOCK/DATA on X3 pin 15/16 (e.g. display EDID) */
+       i2c at 7000c700 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       /* PWR_I2C: power I2C to audio codec, PMIC, temperature sensor and
+          touch screen controller */
+       i2c at 7000d000 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       /* SPI1: Colibri SSP */
+       spi at 7000d400 {
+               status = "okay";
+               spi-max-frequency = <25000000>;
+       };
+
+       sdhci at 78000200 {
+               status = "okay";
+               bus-width = <4>;
+               cd-gpios = <&gpio 23 1>; /* PC7, MMCD */
+       };
+
+       sdhci at 78000600 {
+               status = "okay";
+               bus-width = <8>;
+               non-removable;
+       };
+
+       /* EHCI instance 0: USB1_DP/N -> USBC_P/N */
+       usb at 7d000000 {
+               status = "okay";
+               dr_mode = "otg";
+       };
+
+       /* EHCI instance 1: USB2_DP/N -> AX88772B */
+       usb at 7d004000 {
+               status = "okay";
+               phy_type = "utmi";
+       };
+
+       /* EHCI instance 2: USB3_DP/N -> USBH_P/N */
+       usb at 7d008000 {
+               status = "okay";
+               nvidia,vbus-gpio = <&gpio 178 1>;       /* PW2, USBH_PEN */
+       };
+};
arch/arm/include/asm/mach-types.h +2 -0
index 440b041..560924e 100644
@@ -1106,6 +1106,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_OMAP5_SEVM           3777
 #define MACH_TYPE_ARMADILLO_800EVA     3863
 #define MACH_TYPE_KZM9G                4140
+#define MACH_TYPE_COLIBRI_T30          4493
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -14235,6 +14236,18 @@ extern unsigned int __machine_arch_type;
 # define machine_is_kzm9g()    (0)
 #endif
 
+#ifdef CONFIG_MACH_COLIBRI_T30

arch/arm/include/asm/mach-types.h extern unsigned int __machine_arch_type; · line 14249

Quoted 10 lines
arch/arm/include/asm/mach-types.h +10 -0
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type    __machine_arch_type
+# else
+#  define machine_arch_type    MACH_TYPE_COLIBRI_T30
+# endif
+# define machine_is_colibri_t30()      (machine_arch_type == MACH_TYPE_COLIBRI_T30)
+#else
+# define machine_is_colibri_t30()      (0)
+#endif

Do we actually need this machine type stuff anymore?

Quoted 29 lines
arch/arm/include/asm/mach-types.h +1 -0
+
 /*
  * These have not yet been registered
  */
board/toradex/colibri_t30/Makefile new file +6 -0
new file mode 100644
index 0000000..3d58a4b
@@ -0,0 +1,6 @@
+# Copyright (c) 2013-2014 Stefan Agner
+# SPDX-License-Identifier:      GPL-2.0+
+
+include $(srctree)/board/nvidia/common/common.mk
+
+obj-y  += colibri_t30.o
board/toradex/colibri_t30/colibri_t30.c new file +6 -0
new file mode 100644
index 0000000..6c7c62d
@@ -0,0 +1,52 @@
+/*
+ *  (C) Copyright 2014
+ *  Stefan Agner <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */

board/toradex/colibri_t30/colibri_t30.c line 16

Quoted 10 lines
board/toradex/colibri_t30/colibri_t30.c new file +10 -0
+
+#include <common.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/gp_padctrl.h>
+#include "pinmux-config-colibri_t30.h"
+#include <i2c.h>
+#include <asm/gpio.h>
+
+#define PMU_I2C_ADDRESS                0x2D
+#define MAX_I2C_RETRY          3

Are these used?

Quoted 25 lines
board/toradex/colibri_t30/colibri_t30.c new file +24 -0
+
+/*
+ * Routine: pinmux_init
+ * Description: Do individual peripheral pinmux configs
+ */
+void pinmux_init(void)
+{
+       pinmux_config_pingrp_table(tegra3_pinmux_common,
+                                  ARRAY_SIZE(tegra3_pinmux_common));
+
+       pinmux_config_pingrp_table(unused_pins_lowpower,
+                                  ARRAY_SIZE(unused_pins_lowpower));
+
+       /* Initialize any non-default pad configs (APB_MISC_GP regs) */
+       pinmux_config_drvgrp_table(colibri_t30_padctrl,
+                                  ARRAY_SIZE(colibri_t30_padctrl));
+}
+
+/*
+ * Enable AX88772B USB to LAN controller
+ */
+void pin_mux_usb(void)
+{
+       /* Enable LAN_VBUS */

board/toradex/colibri_t30/colibri_t30.c line 50

Quoted 10 lines
board/toradex/colibri_t30/colibri_t30.c new file +10 -0
+       gpio_request(GPIO_PDD2, NULL);
+       gpio_direction_output(GPIO_PDD2, 1);
+
+       /* Reset ASIX using LAN_RESET */
+       gpio_request(GPIO_PDD0, NULL);
+       gpio_direction_output(GPIO_PDD0, 0);
+
+       udelay(5);
+
+       gpio_set_value(GPIO_PDD0, 1);

You are using device tree for sdhci - shouldn't we use it for USB also?

Quoted 449 lines
board/toradex/colibri_t30/colibri_t30.c new file +2 -0
+}
+
board/toradex/colibri_t30/pinmux-config-colibri_t30.h new file +360 -0
new file mode 100644
index 0000000..4e73c07
@@ -0,0 +1,360 @@
+/*
+ * Copyright (c) 2013-2014, Stefan Agner
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _PINMUX_CONFIG_COLIBRI_T30_H_
+#define _PINMUX_CONFIG_COLIBRI_T30_H_
+
+#define DEFAULT_PINMUX(_pingrp, _mux, _pull, _tri, _io)                \
+       {                                                       \
+               .pingrp         = PMUX_PINGRP_##_pingrp,        \
+               .func           = PMUX_FUNC_##_mux,             \
+               .pull           = PMUX_PULL_##_pull,            \
+               .tristate       = PMUX_TRI_##_tri,              \
+               .io             = PMUX_PIN_##_io,               \
+               .lock           = PMUX_PIN_LOCK_DEFAULT,        \
+               .od             = PMUX_PIN_OD_DEFAULT,          \
+               .ioreset        = PMUX_PIN_IO_RESET_DEFAULT,    \
+       }
+
+#define I2C_PINMUX(_pingrp, _mux, _pull, _tri, _io, _lock, _od)        \
+       {                                                       \
+               .pingrp         = PMUX_PINGRP_##_pingrp,        \
+               .func           = PMUX_FUNC_##_mux,             \
+               .pull           = PMUX_PULL_##_pull,            \
+               .tristate       = PMUX_TRI_##_tri,              \
+               .io             = PMUX_PIN_##_io,               \
+               .lock           = PMUX_PIN_LOCK_##_lock,        \
+               .od             = PMUX_PIN_OD_##_od,            \
+               .ioreset        = PMUX_PIN_IO_RESET_DEFAULT,    \
+       }
+
+#define LV_PINMUX(_pingrp, _mux, _pull, _tri, _io, _lock, _ioreset) \
+       {                                                       \
+               .pingrp         = PMUX_PINGRP_##_pingrp,        \
+               .func           = PMUX_FUNC_##_mux,             \
+               .pull           = PMUX_PULL_##_pull,            \
+               .tristate       = PMUX_TRI_##_tri,              \
+               .io             = PMUX_PIN_##_io,               \
+               .lock           = PMUX_PIN_LOCK_##_lock,        \
+               .od             = PMUX_PIN_OD_DEFAULT,          \
+               .ioreset        = PMUX_PIN_IO_RESET_##_ioreset  \
+       }
+
+#define DEFAULT_PADCFG(_drvgrp, _slwf, _slwr, _drvup, _drvdn, _lpmd, _schmt, _hsm) \
+       {                                                       \
+               .drvgrp         = PMUX_DRVGRP_##_drvgrp,        \
+               .slwf           = _slwf,                        \
+               .slwr           = _slwr,                        \
+               .drvup          = _drvup,                       \
+               .drvdn          = _drvdn,                       \
+               .lpmd           = PMUX_LPMD_##_lpmd,            \
+               .schmt          = PMUX_SCHMT_##_schmt,          \
+               .hsm            = PMUX_HSM_##_hsm,              \
+       }
+
+static struct pmux_pingrp_config tegra3_pinmux_common[] = {
+       /* SDMMC1 disabled */
+       DEFAULT_PINMUX(SDMMC1_CLK_PZ0, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_CMD_PZ1, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT3_PY4, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT2_PY5, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT1_PY6, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT0_PY7, RSVD1, NORMAL, NORMAL, INPUT),
+
+       /* SDMMC3 pinmux */
+       DEFAULT_PINMUX(SDMMC3_CLK_PA6, SDMMC3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_CMD_PA7, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT0_PB7, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT1_PB6, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT2_PB5, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT3_PB4, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT6_PD3, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT7_PD4, RSVD1, NORMAL, NORMAL, INPUT),
+
+       /* SDMMC4 pinmux (eMMC) */
+       LV_PINMUX(SDMMC4_CLK_PCC4, SDMMC4, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_CMD_PT7, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT0_PAA0, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT1_PAA1, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT2_PAA2, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT3_PAA3, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT4_PAA4, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT5_PAA5, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT6_PAA6, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT7_PAA7, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_RST_N_PCC3, RSVD1, DOWN, NORMAL, INPUT, DISABLE, DISABLE),
+
+       /* I2C1 pinmux */
+       I2C_PINMUX(GEN1_I2C_SCL_PC4, I2C1, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(GEN1_I2C_SDA_PC5, I2C1, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+
+       /* I2C2 pinmux */
+       DEFAULT_PINMUX(GEN2_I2C_SCL_PT5, I2C2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GEN2_I2C_SDA_PT6, I2C2, NORMAL, NORMAL, INPUT),
+
+       /* I2C3 pinmux, muliplexed with KB_ROW13/KB_ROW14 */
+       I2C_PINMUX(CAM_I2C_SCL_PBB1, I2C3, NORMAL, TRISTATE, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(CAM_I2C_SDA_PBB2, I2C3, NORMAL, TRISTATE, INPUT, DISABLE, ENABLE),
+
+       /* I2C4 pinmux */
+       I2C_PINMUX(DDC_SCL_PV4, I2C4, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(DDC_SDA_PV5, I2C4, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+
+       /* Power I2C pinmux */
+       I2C_PINMUX(PWR_I2C_SCL_PZ6, I2CPWR, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(PWR_I2C_SDA_PZ7, I2CPWR, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+
+       DEFAULT_PINMUX(ULPI_DATA0_PO1, UARTA, NORMAL, NORMAL, OUTPUT),
+       /* UARTA RX, make sure we don't get input form a floating Pin */
+       DEFAULT_PINMUX(ULPI_DATA1_PO2, UARTA, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA2_PO3, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA3_PO4, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA4_PO5, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA5_PO6, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA6_PO7, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA7_PO0, UARTA, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(ULPI_CLK_PY0, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DIR_PY1, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_NXT_PY2, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_STP_PY3, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_FS_PP0, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_DIN_PP1, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_DOUT_PP2, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_SCLK_PP3, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PV2, OWR, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PV3, RSVD1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(CLK2_OUT_PW5, EXTPERIPH2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK2_REQ_PCC5, DAP, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PWR1_PC1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PWR2_PC6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_SDIN_PZ2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_SDOUT_PN5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_WR_N_PZ3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_CS0_N_PN4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_DC0_PN6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_SCK_PZ4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PWR0_PB2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PCLK_PB3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_DE_PJ1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_HSYNC_PJ3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_VSYNC_PJ4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D0_PE0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D1_PE1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D2_PE2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D3_PE3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D4_PE4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D5_PE5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D6_PE6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D7_PE7, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D8_PF0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D9_PF1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D10_PF2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D11_PF3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D12_PF4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D13_PF5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D14_PF6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D15_PF7, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D16_PM0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D17_PM1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D18_PM2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D19_PM3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D20_PM4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D21_PM5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D22_PM6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D23_PM7, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_CS1_N_PW0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_M1_PW1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_DC1_PD2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CRT_HSYNC_PV6, CRT, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(CRT_VSYNC_PV7, CRT, NORMAL, NORMAL, OUTPUT),
+       LV_PINMUX(VI_D0_PT4, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D1_PD5, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D2_PL0, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D3_PL1, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D4_PL2, VI, NORMAL, NORMAL, OUTPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D5_PL3, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D7_PL5, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D10_PT2, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_MCLK_PT1, VI, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       DEFAULT_PINMUX(UART2_RXD_PC3, UARTB, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART2_TXD_PC2, UARTB, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(UART2_RTS_N_PJ6, UARTB, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(UART2_CTS_N_PJ5, UARTB, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART3_TXD_PW6, UARTC, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(UART3_RXD_PW7, UARTC, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART3_CTS_N_PA1, UARTC, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART3_RTS_N_PC0, UARTC, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU0, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PU1, RSVD1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU2, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PU3, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PU4, PWM1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU5, PWM2, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU6, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_FS_PP4, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_DIN_PP5, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_DOUT_PP6, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_SCLK_PP7, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK3_OUT_PEE0, EXTPERIPH3, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(CLK3_REQ_PEE1, DEV3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_WP_N_PC7, GMI, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_CS2_N_PK3, RSVD1, UP, NORMAL, INPUT), /* EN_VDD_BL1 */
+       DEFAULT_PINMUX(GMI_AD8_PH0, PWM0, NORMAL, NORMAL, OUTPUT), /* LCD1_BL_PWM */
+       DEFAULT_PINMUX(GMI_AD10_PH2, NAND, NORMAL, NORMAL, OUTPUT), /* LCD1_BL_EN */
+       DEFAULT_PINMUX(GMI_A16_PJ7, UARTD, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_A17_PB0, UARTD, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_A18_PB1, UARTD, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_A19_PK7, UARTD, NORMAL, NORMAL, INPUT),
+
+
+       /* Multiplexed with KB_ROW10/KB_ROW11/KB_ROW12/KB_ROW15 */
+       DEFAULT_PINMUX(CAM_MCLK_PCC0, VI_ALT2, UP, TRISTATE, INPUT),
+       DEFAULT_PINMUX(PCC1, RSVD1, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(PBB0, RSVD1, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(PBB3, VGP3, NORMAL, TRISTATE, INPUT),
+
+       DEFAULT_PINMUX(PBB5, VGP5, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PBB6, VGP6, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PBB7, I2S4, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PCC2, I2S4, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(JTAG_RTCK_PU7, RTCK, NORMAL, NORMAL, OUTPUT),
+
+       /* KBC keys */
+       DEFAULT_PINMUX(KB_ROW0_PR0, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW1_PR1, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW2_PR2, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW3_PR3, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW4_PR4, RSVD3, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW5_PR5, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW6_PR6, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW7_PR7, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW8_PS0, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW9_PS1, KBC, NORMAL, TRISTATE, INPUT),
+
+       /* SDMMC2 pinmux */
+       DEFAULT_PINMUX(KB_ROW10_PS2, SDMMC2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW11_PS3, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW12_PS4, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW13_PS5, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW14_PS6, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW15_PS7, SDMMC2, UP, NORMAL, INPUT),
+
+       DEFAULT_PINMUX(KB_COL0_PQ0, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL1_PQ1, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL2_PQ2, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL3_PQ3, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL4_PQ4, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL5_PQ5, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL6_PQ6, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL7_PQ7, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(PV0, RSVD1, UP, NORMAL, INPUT),
+
+       DEFAULT_PINMUX(CLK_32K_OUT_PA0, BLINK, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(SYS_CLK_REQ_PZ5, SYSCLK, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(OWR, OWR, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_FS_PN0, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_DIN_PN1, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_DOUT_PN2, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_SCLK_PN3, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK1_REQ_PEE2, DAP, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK1_OUT_PW4, EXTPERIPH1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPDIF_IN_PK6, SPDIF, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPDIF_OUT_PK5, SPDIF, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(DAP2_FS_PA2, I2S1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP2_DIN_PA4, I2S1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP2_DOUT_PA5, I2S1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP2_SCLK_PA3, I2S1, NORMAL, NORMAL, INPUT),
+
+       DEFAULT_PINMUX(SPI2_CS1_N_PW2, SPI2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_MOSI_PX4, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_SCK_PX5, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_CS0_N_PX6, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_MISO_PX7, SPI1, NORMAL, NORMAL, INPUT),
+
+       /* LAN_RESET */
+       DEFAULT_PINMUX(PEX_L0_PRSNT_N_PDD0, RSVD2, NORMAL, NORMAL, OUTPUT),
+
+       DEFAULT_PINMUX(PEX_L0_RST_N_PDD1, PCIE, NORMAL, NORMAL, OUTPUT),
+
+       /* LAN_VBUS */
+       DEFAULT_PINMUX(PEX_L0_CLKREQ_N_PDD2, RSVD2, NORMAL, NORMAL, OUTPUT),
+
+       DEFAULT_PINMUX(PEX_WAKE_N_PDD3, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L1_PRSNT_N_PDD4, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L1_RST_N_PDD5, PCIE, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PEX_L1_CLKREQ_N_PDD6, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L2_PRSNT_N_PDD7, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L2_RST_N_PCC6, PCIE, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PEX_L2_CLKREQ_N_PCC7, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(HDMI_CEC_PEE3, CEC, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(HDMI_INT_PN7, RSVD1, NORMAL, TRISTATE, INPUT),
+
+       /* GPIOs */
+       /* SDMMC1 CD gpio */
+       DEFAULT_PINMUX(GMI_IORDY_PI5, RSVD1, UP, NORMAL, INPUT),
+       /* SDMMC1 WP gpio */
+       LV_PINMUX(VI_D11_PT3, RSVD1, UP, NORMAL, INPUT, DISABLE, DISABLE),
+
+       /* Touch panel GPIO */
+       /* Touch IRQ */
+       DEFAULT_PINMUX(GMI_AD12_PH4, NAND, UP, NORMAL, INPUT),
+
+       /* Touch RESET */
+       DEFAULT_PINMUX(GMI_AD14_PH6, NAND, NORMAL, NORMAL, OUTPUT),
+
+       /* Power rails GPIO */
+       DEFAULT_PINMUX(SPI2_SCK_PX2, GMI, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PBB4, VGP4, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW8_PS0, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT5_PD0, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT4_PD1, SDMMC3, UP, NORMAL, INPUT),
+
+       LV_PINMUX(VI_D6_PL4, VI, NORMAL, NORMAL, OUTPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D8_PL6, VI, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D9_PL7, VI, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_PCLK_PT0, RSVD1, UP, TRISTATE, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_HSYNC_PD7, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_VSYNC_PD6, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+};
+
+static struct pmux_pingrp_config unused_pins_lowpower[] = {
+       DEFAULT_PINMUX(GMI_WAIT_PI7, NAND, UP, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_ADV_N_PK0, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_CLK_PK1, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_CS3_N_PK4, NAND, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(GMI_CS7_N_PI6, NAND, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_AD0_PG0, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD1_PG1, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD2_PG2, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD3_PG3, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD4_PG4, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD5_PG5, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD6_PG6, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD7_PG7, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD9_PH1, PWM1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD11_PH3, NAND, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD13_PH5, NAND, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_WR_N_PI0, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_OE_N_PI1, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_DQS_PI2, NAND, NORMAL, TRISTATE, OUTPUT),
+};
+
+static struct pmux_drvgrp_config colibri_t30_padctrl[] = {
+       /* (_drvgrp, _slwf, _slwr, _drvup, _drvdn, _lpmd, _schmt, _hsm) */
+       DEFAULT_PADCFG(SDIO1, SDIOCFG_DRVUP_SLWF, SDIOCFG_DRVDN_SLWR, \
+               SDIOCFG_DRVUP, SDIOCFG_DRVDN, NONE, DISABLE, DISABLE),
+};
+#endif /* _PINMUX_CONFIG_COLIBRI_T30_H_ */
include/configs/colibri_t30.h new file +73 -1
new file mode 100644
index 0000000..92eaec8
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2013-2014 Stefan Agner
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <linux/sizes.h>
+
+#include "tegra30-common.h"
+
+#define CONFIG_DEFAULT_DEVICE_TREE     tegra30-colibri
+#define CONFIG_OF_CONTROL
+#define CONFIG_OF_SEPARATE
+
+#define V_PROMPT                       "Colibri T30 # "
+#define CONFIG_TEGRA_BOARD_STRING      "Toradex Colibri T30"
+
+/* Board-specific config */
+#define CONFIG_SERIAL_MULTI
+#define CONFIG_TEGRA_ENABLE_UARTA
+#define CONFIG_SYS_NS16550_COM1                NV_PA_APB_UARTA_BASE
+
+#define CONFIG_MACH_TYPE               MACH_TYPE_COLIBRI_T30
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+/* I2C */
+#define CONFIG_SYS_I2C_TEGRA
+#define CONFIG_SYS_I2C_INIT_BOARD
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_SYS_MAX_I2C_BUS         TEGRA_I2C_NUM_CONTROLLERS
+#define CONFIG_SYS_I2C_SPEED           100000
+#define CONFIG_CMD_I2C
+#define CONFIG_SYS_I2C
+
+/* SD/MMC */
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_TEGRA_MMC
+#define CONFIG_CMD_MMC
+
+/* Environment in eMMC, at the end of 2nd "boot sector" */
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_ENV_OFFSET              (-CONFIG_ENV_SIZE)
+#define CONFIG_SYS_MMC_ENV_DEV         0
+#define CONFIG_SYS_MMC_ENV_PART                2
+
+#define BOARD_EXTRA_ENV_SETTINGS \
+       "board_name=colibri-eval-v3\0" \
+       "fdtfile=tegra30-colibri-eval-v3.dtb\0"
+
+/* USB Host support */
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_TEGRA
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 3
+#define CONFIG_CMD_USB
+
+/* USB networking support */
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+
+/* General networking support */
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_DHCP
+
+#include "tegra-common-ums.h"
+#include "tegra-common-post.h"
+
+#endif /* __CONFIG_H */
--
Quoted 2 lines

2.0.3

Regards,
Simon

#2 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Hi Simon,

Am 2014-07-31 19:41, schrieb Simon Glass:

Quoted 174 lines

Hi Stefan,

Quoted 3 lines · Stefan Agner

This adds board support for the Toradex Colibri T30 module.

A few quick questions below...

Quoted 164 lines

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

---
 arch/arm/Kconfig                                   |   4 +
 arch/arm/dts/Makefile                              |   1 +
 arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
 arch/arm/include/asm/mach-types.h                  |  13 +
 board/toradex/colibri_t30/Makefile                 |   6 +
 board/toradex/colibri_t30/colibri_t30.c            |  52 +++
 .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
 include/configs/colibri_t30.h                      |  73 +++++
 8 files changed, 593 insertions(+)
 create mode 100644 arch/arm/dts/tegra30-colibri.dts
 create mode 100644 board/toradex/colibri_t30/Makefile
 create mode 100644 board/toradex/colibri_t30/colibri_t30.c
 create mode 100644 board/toradex/colibri_t30/pinmux-config-colibri_t30.h
 create mode 100644 include/configs/colibri_t30.h
arch/arm/Kconfig +4 -0
index e385eda..dd987cc 100644
@@ -701,6 +701,9 @@ config TARGET_WHISTLER
 config TARGET_COLIBRI_T20_IRIS
        bool "Support colibri_t20_iris"
 
+config TARGET_COLIBRI_T30
+       bool "Support Colibri T30"
+
 config TARGET_TEC_NG
        bool "Support tec-ng"
 
@@ -989,6 +992,7 @@ source "board/timll/devkit3250/Kconfig"
 source "board/timll/devkit8000/Kconfig"
 source "board/toradex/colibri_pxa270/Kconfig"
 source "board/toradex/colibri_t20_iris/Kconfig"
+source "board/toradex/colibri_t30/Kconfig"
 source "board/trizepsiv/Kconfig"
 source "board/ttcontrol/vision2/Kconfig"
 source "board/udoo/Kconfig"
arch/arm/dts/Makefile +1 -0
index 6e2e313..c46b7be 100644
@@ -21,6 +21,7 @@ dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \
        tegra20-colibri_t20_iris.dtb \
        tegra30-beaver.dtb \
        tegra30-cardhu.dtb \
+       tegra30-colibri.dtb \
        tegra30-tec-ng.dtb \
        tegra114-dalmore.dtb \
        tegra124-jetson-tk1.dtb \
arch/arm/dts/tegra30-colibri.dts new file +84 -0
new file mode 100644
index 0000000..21d0311
@@ -0,0 +1,84 @@
+/dts-v1/;
+
+#include "tegra30.dtsi"
+
+/ {
+       model = "Toradex Colibri T30";
+       compatible = "toradex,colibri_t30", "nvidia,tegra30";
+
+       aliases {
+               i2c0 = "/i2c at 7000d000";
+               i2c1 = "/i2c at 7000c000";
+               i2c2 = "/i2c at 7000c700";
+               sdhci0 = "/sdhci at 78000600";
+               sdhci1 = "/sdhci at 78000200";
+               usb0 = "/usb at 7d000000";
+               usb1 = "/usb at 7d004000"; /* on module only, for ASIX */
+               usb2 = "/usb at 7d008000";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x80000000 0x40000000>;
+       };
+
+       /* GEN1_I2C: I2C_SDA/SCL on SODIMM pin 194/196 (e.g. RTC on carrier
+          board) */
+       i2c at 7000c000 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       /* GEN2_I2C: unused */
+
+       /* CAM_I2C: unused */
+
+       /* DDC_CLOCK/DATA on X3 pin 15/16 (e.g. display EDID) */
+       i2c at 7000c700 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       /* PWR_I2C: power I2C to audio codec, PMIC, temperature sensor and
+          touch screen controller */
+       i2c at 7000d000 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       /* SPI1: Colibri SSP */
+       spi at 7000d400 {
+               status = "okay";
+               spi-max-frequency = <25000000>;
+       };
+
+       sdhci at 78000200 {
+               status = "okay";
+               bus-width = <4>;
+               cd-gpios = <&gpio 23 1>; /* PC7, MMCD */
+       };
+
+       sdhci at 78000600 {
+               status = "okay";
+               bus-width = <8>;
+               non-removable;
+       };
+
+       /* EHCI instance 0: USB1_DP/N -> USBC_P/N */
+       usb at 7d000000 {
+               status = "okay";
+               dr_mode = "otg";
+       };
+
+       /* EHCI instance 1: USB2_DP/N -> AX88772B */
+       usb at 7d004000 {
+               status = "okay";
+               phy_type = "utmi";
+       };
+
+       /* EHCI instance 2: USB3_DP/N -> USBH_P/N */
+       usb at 7d008000 {
+               status = "okay";
+               nvidia,vbus-gpio = <&gpio 178 1>;       /* PW2, USBH_PEN */
+       };
+};
arch/arm/include/asm/mach-types.h +1 -0
index 440b041..560924e 100644
@@ -1106,6 +1106,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_OMAP5_SEVM           3777
 #define MACH_TYPE_ARMADILLO_800EVA     3863
 #define MACH_TYPE_KZM9G                4140
+#define MACH_TYPE_COLIBRI_T30          4493
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -14235,6 +14236,18 @@ extern unsigned int __machine_arch_type;
 # define machine_is_kzm9g()    (0)
 #endif
 
Quoted 15 lines

arch/arm/include/asm/mach-types.h extern unsigned int __machine_arch_type; · line 14249

Quoted 11 lines
arch/arm/include/asm/mach-types.h +11 -0
+#ifdef CONFIG_MACH_COLIBRI_T30
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type    __machine_arch_type
+# else
+#  define machine_arch_type    MACH_TYPE_COLIBRI_T30
+# endif
+# define machine_is_colibri_t30()      (machine_arch_type == MACH_TYPE_COLIBRI_T30)
+#else
+# define machine_is_colibri_t30()      (0)
+#endif

Do we actually need this machine type stuff anymore?

That way we can also boot the 3.1 L4T Kernel, since this is the (probably last) one where we get supported binary drivers for the graphics part.

Quoted 34 lines
Quoted 34 lines
arch/arm/include/asm/mach-types.h +1 -0
+
 /*
  * These have not yet been registered
  */
board/toradex/colibri_t30/Makefile new file +6 -0
new file mode 100644
index 0000000..3d58a4b
@@ -0,0 +1,6 @@
+# Copyright (c) 2013-2014 Stefan Agner
+# SPDX-License-Identifier:      GPL-2.0+
+
+include $(srctree)/board/nvidia/common/common.mk
+
+obj-y  += colibri_t30.o
board/toradex/colibri_t30/colibri_t30.c new file +11 -0
new file mode 100644
index 0000000..6c7c62d
@@ -0,0 +1,52 @@
+/*
+ *  (C) Copyright 2014
+ *  Stefan Agner <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/gp_padctrl.h>
+#include "pinmux-config-colibri_t30.h"
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 16

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+#include <i2c.h>
+#include <asm/gpio.h>
+
+#define PMU_I2C_ADDRESS                0x2D
+#define MAX_I2C_RETRY          3

Are these used?

The address is correct, but not used right now. Should I remove?

Quoted 30 lines
Quoted 30 lines
board/toradex/colibri_t30/colibri_t30.c new file +29 -0
+
+/*
+ * Routine: pinmux_init
+ * Description: Do individual peripheral pinmux configs
+ */
+void pinmux_init(void)
+{
+       pinmux_config_pingrp_table(tegra3_pinmux_common,
+                                  ARRAY_SIZE(tegra3_pinmux_common));
+
+       pinmux_config_pingrp_table(unused_pins_lowpower,
+                                  ARRAY_SIZE(unused_pins_lowpower));
+
+       /* Initialize any non-default pad configs (APB_MISC_GP regs) */
+       pinmux_config_drvgrp_table(colibri_t30_padctrl,
+                                  ARRAY_SIZE(colibri_t30_padctrl));
+}
+
+/*
+ * Enable AX88772B USB to LAN controller
+ */
+void pin_mux_usb(void)
+{
+       /* Enable LAN_VBUS */
+       gpio_request(GPIO_PDD2, NULL);
+       gpio_direction_output(GPIO_PDD2, 1);
+
+       /* Reset ASIX using LAN_RESET */
+       gpio_request(GPIO_PDD0, NULL);
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 50

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+       gpio_direction_output(GPIO_PDD0, 0);
+
+       udelay(5);
+
+       gpio_set_value(GPIO_PDD0, 1);

You are using device tree for sdhci - shouldn't we use it for USB also?

The Colibri T30 has a ASIX USB to Ethernet chip on its board. We reset/power the ASIX here. It is a very board specific reset/powering, hence I put it in here.

In my initial patches I had it in the nvidia,phy-reset-gpio and nvidia,vbus-gpio properties. Technically, it would work to have this GPIOs in the device tree as USB properties, but I think this would be logically wrong...

Quoted 445 lines
Quoted 445 lines
board/toradex/colibri_t30/colibri_t30.c new file +2 -0
+}
+
board/toradex/colibri_t30/pinmux-config-colibri_t30.h new file +360 -0
new file mode 100644
index 0000000..4e73c07
@@ -0,0 +1,360 @@
+/*
+ * Copyright (c) 2013-2014, Stefan Agner
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _PINMUX_CONFIG_COLIBRI_T30_H_
+#define _PINMUX_CONFIG_COLIBRI_T30_H_
+
+#define DEFAULT_PINMUX(_pingrp, _mux, _pull, _tri, _io)                \
+       {                                                       \
+               .pingrp         = PMUX_PINGRP_##_pingrp,        \
+               .func           = PMUX_FUNC_##_mux,             \
+               .pull           = PMUX_PULL_##_pull,            \
+               .tristate       = PMUX_TRI_##_tri,              \
+               .io             = PMUX_PIN_##_io,               \
+               .lock           = PMUX_PIN_LOCK_DEFAULT,        \
+               .od             = PMUX_PIN_OD_DEFAULT,          \
+               .ioreset        = PMUX_PIN_IO_RESET_DEFAULT,    \
+       }
+
+#define I2C_PINMUX(_pingrp, _mux, _pull, _tri, _io, _lock, _od)        \
+       {                                                       \
+               .pingrp         = PMUX_PINGRP_##_pingrp,        \
+               .func           = PMUX_FUNC_##_mux,             \
+               .pull           = PMUX_PULL_##_pull,            \
+               .tristate       = PMUX_TRI_##_tri,              \
+               .io             = PMUX_PIN_##_io,               \
+               .lock           = PMUX_PIN_LOCK_##_lock,        \
+               .od             = PMUX_PIN_OD_##_od,            \
+               .ioreset        = PMUX_PIN_IO_RESET_DEFAULT,    \
+       }
+
+#define LV_PINMUX(_pingrp, _mux, _pull, _tri, _io, _lock, _ioreset) \
+       {                                                       \
+               .pingrp         = PMUX_PINGRP_##_pingrp,        \
+               .func           = PMUX_FUNC_##_mux,             \
+               .pull           = PMUX_PULL_##_pull,            \
+               .tristate       = PMUX_TRI_##_tri,              \
+               .io             = PMUX_PIN_##_io,               \
+               .lock           = PMUX_PIN_LOCK_##_lock,        \
+               .od             = PMUX_PIN_OD_DEFAULT,          \
+               .ioreset        = PMUX_PIN_IO_RESET_##_ioreset  \
+       }
+
+#define DEFAULT_PADCFG(_drvgrp, _slwf, _slwr, _drvup, _drvdn, _lpmd, _schmt, _hsm) \
+       {                                                       \
+               .drvgrp         = PMUX_DRVGRP_##_drvgrp,        \
+               .slwf           = _slwf,                        \
+               .slwr           = _slwr,                        \
+               .drvup          = _drvup,                       \
+               .drvdn          = _drvdn,                       \
+               .lpmd           = PMUX_LPMD_##_lpmd,            \
+               .schmt          = PMUX_SCHMT_##_schmt,          \
+               .hsm            = PMUX_HSM_##_hsm,              \
+       }
+
+static struct pmux_pingrp_config tegra3_pinmux_common[] = {
+       /* SDMMC1 disabled */
+       DEFAULT_PINMUX(SDMMC1_CLK_PZ0, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_CMD_PZ1, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT3_PY4, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT2_PY5, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT1_PY6, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC1_DAT0_PY7, RSVD1, NORMAL, NORMAL, INPUT),
+
+       /* SDMMC3 pinmux */
+       DEFAULT_PINMUX(SDMMC3_CLK_PA6, SDMMC3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_CMD_PA7, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT0_PB7, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT1_PB6, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT2_PB5, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT3_PB4, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT6_PD3, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT7_PD4, RSVD1, NORMAL, NORMAL, INPUT),
+
+       /* SDMMC4 pinmux (eMMC) */
+       LV_PINMUX(SDMMC4_CLK_PCC4, SDMMC4, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_CMD_PT7, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT0_PAA0, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT1_PAA1, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT2_PAA2, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT3_PAA3, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT4_PAA4, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT5_PAA5, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT6_PAA6, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_DAT7_PAA7, SDMMC4, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(SDMMC4_RST_N_PCC3, RSVD1, DOWN, NORMAL, INPUT, DISABLE, DISABLE),
+
+       /* I2C1 pinmux */
+       I2C_PINMUX(GEN1_I2C_SCL_PC4, I2C1, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(GEN1_I2C_SDA_PC5, I2C1, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+
+       /* I2C2 pinmux */
+       DEFAULT_PINMUX(GEN2_I2C_SCL_PT5, I2C2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GEN2_I2C_SDA_PT6, I2C2, NORMAL, NORMAL, INPUT),
+
+       /* I2C3 pinmux, muliplexed with KB_ROW13/KB_ROW14 */
+       I2C_PINMUX(CAM_I2C_SCL_PBB1, I2C3, NORMAL, TRISTATE, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(CAM_I2C_SDA_PBB2, I2C3, NORMAL, TRISTATE, INPUT, DISABLE, ENABLE),
+
+       /* I2C4 pinmux */
+       I2C_PINMUX(DDC_SCL_PV4, I2C4, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(DDC_SDA_PV5, I2C4, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+
+       /* Power I2C pinmux */
+       I2C_PINMUX(PWR_I2C_SCL_PZ6, I2CPWR, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+       I2C_PINMUX(PWR_I2C_SDA_PZ7, I2CPWR, NORMAL, NORMAL, INPUT, DISABLE, ENABLE),
+
+       DEFAULT_PINMUX(ULPI_DATA0_PO1, UARTA, NORMAL, NORMAL, OUTPUT),
+       /* UARTA RX, make sure we don't get input form a floating Pin */
+       DEFAULT_PINMUX(ULPI_DATA1_PO2, UARTA, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA2_PO3, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA3_PO4, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA4_PO5, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA5_PO6, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA6_PO7, UARTA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DATA7_PO0, UARTA, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(ULPI_CLK_PY0, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_DIR_PY1, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_NXT_PY2, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(ULPI_STP_PY3, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_FS_PP0, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_DIN_PP1, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_DOUT_PP2, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP3_SCLK_PP3, I2S2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PV2, OWR, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PV3, RSVD1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(CLK2_OUT_PW5, EXTPERIPH2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK2_REQ_PCC5, DAP, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PWR1_PC1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PWR2_PC6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_SDIN_PZ2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_SDOUT_PN5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_WR_N_PZ3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_CS0_N_PN4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_DC0_PN6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_SCK_PZ4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PWR0_PB2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_PCLK_PB3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_DE_PJ1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_HSYNC_PJ3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_VSYNC_PJ4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D0_PE0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D1_PE1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D2_PE2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D3_PE3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D4_PE4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D5_PE5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D6_PE6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D7_PE7, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D8_PF0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D9_PF1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D10_PF2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D11_PF3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D12_PF4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D13_PF5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D14_PF6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D15_PF7, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D16_PM0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D17_PM1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D18_PM2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D19_PM3, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D20_PM4, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D21_PM5, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D22_PM6, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_D23_PM7, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_CS1_N_PW0, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_M1_PW1, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(LCD_DC1_PD2, DISPLAYA, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CRT_HSYNC_PV6, CRT, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(CRT_VSYNC_PV7, CRT, NORMAL, NORMAL, OUTPUT),
+       LV_PINMUX(VI_D0_PT4, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D1_PD5, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D2_PL0, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D3_PL1, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D4_PL2, VI, NORMAL, NORMAL, OUTPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D5_PL3, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D7_PL5, SDMMC2, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D10_PT2, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_MCLK_PT1, VI, UP, NORMAL, INPUT, DISABLE, DISABLE),
+       DEFAULT_PINMUX(UART2_RXD_PC3, UARTB, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART2_TXD_PC2, UARTB, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(UART2_RTS_N_PJ6, UARTB, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(UART2_CTS_N_PJ5, UARTB, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART3_TXD_PW6, UARTC, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(UART3_RXD_PW7, UARTC, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART3_CTS_N_PA1, UARTC, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(UART3_RTS_N_PC0, UARTC, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU0, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PU1, RSVD1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU2, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PU3, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PU4, PWM1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU5, PWM2, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PU6, RSVD1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_FS_PP4, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_DIN_PP5, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_DOUT_PP6, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP4_SCLK_PP7, I2S3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK3_OUT_PEE0, EXTPERIPH3, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(CLK3_REQ_PEE1, DEV3, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_WP_N_PC7, GMI, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_CS2_N_PK3, RSVD1, UP, NORMAL, INPUT), /* EN_VDD_BL1 */
+       DEFAULT_PINMUX(GMI_AD8_PH0, PWM0, NORMAL, NORMAL, OUTPUT), /* LCD1_BL_PWM */
+       DEFAULT_PINMUX(GMI_AD10_PH2, NAND, NORMAL, NORMAL, OUTPUT), /* LCD1_BL_EN */
+       DEFAULT_PINMUX(GMI_A16_PJ7, UARTD, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_A17_PB0, UARTD, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_A18_PB1, UARTD, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_A19_PK7, UARTD, NORMAL, NORMAL, INPUT),
+
+
+       /* Multiplexed with KB_ROW10/KB_ROW11/KB_ROW12/KB_ROW15 */
+       DEFAULT_PINMUX(CAM_MCLK_PCC0, VI_ALT2, UP, TRISTATE, INPUT),
+       DEFAULT_PINMUX(PCC1, RSVD1, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(PBB0, RSVD1, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(PBB3, VGP3, NORMAL, TRISTATE, INPUT),
+
+       DEFAULT_PINMUX(PBB5, VGP5, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PBB6, VGP6, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PBB7, I2S4, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PCC2, I2S4, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(JTAG_RTCK_PU7, RTCK, NORMAL, NORMAL, OUTPUT),
+
+       /* KBC keys */
+       DEFAULT_PINMUX(KB_ROW0_PR0, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW1_PR1, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW2_PR2, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW3_PR3, RSVD2, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW4_PR4, RSVD3, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW5_PR5, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW6_PR6, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW7_PR7, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW8_PS0, KBC, NORMAL, TRISTATE, INPUT),
+       DEFAULT_PINMUX(KB_ROW9_PS1, KBC, NORMAL, TRISTATE, INPUT),
+
+       /* SDMMC2 pinmux */
+       DEFAULT_PINMUX(KB_ROW10_PS2, SDMMC2, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW11_PS3, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW12_PS4, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW13_PS5, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW14_PS6, SDMMC2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW15_PS7, SDMMC2, UP, NORMAL, INPUT),
+
+       DEFAULT_PINMUX(KB_COL0_PQ0, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL1_PQ1, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL2_PQ2, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL3_PQ3, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL4_PQ4, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL5_PQ5, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL6_PQ6, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_COL7_PQ7, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(PV0, RSVD1, UP, NORMAL, INPUT),
+
+       DEFAULT_PINMUX(CLK_32K_OUT_PA0, BLINK, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(SYS_CLK_REQ_PZ5, SYSCLK, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(OWR, OWR, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_FS_PN0, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_DIN_PN1, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_DOUT_PN2, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP1_SCLK_PN3, I2S0, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK1_REQ_PEE2, DAP, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(CLK1_OUT_PW4, EXTPERIPH1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPDIF_IN_PK6, SPDIF, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPDIF_OUT_PK5, SPDIF, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(DAP2_FS_PA2, I2S1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP2_DIN_PA4, I2S1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP2_DOUT_PA5, I2S1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(DAP2_SCLK_PA3, I2S1, NORMAL, NORMAL, INPUT),
+
+       DEFAULT_PINMUX(SPI2_CS1_N_PW2, SPI2, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_MOSI_PX4, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_SCK_PX5, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_CS0_N_PX6, SPI1, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(SPI1_MISO_PX7, SPI1, NORMAL, NORMAL, INPUT),
+
+       /* LAN_RESET */
+       DEFAULT_PINMUX(PEX_L0_PRSNT_N_PDD0, RSVD2, NORMAL, NORMAL, OUTPUT),
+
+       DEFAULT_PINMUX(PEX_L0_RST_N_PDD1, PCIE, NORMAL, NORMAL, OUTPUT),
+
+       /* LAN_VBUS */
+       DEFAULT_PINMUX(PEX_L0_CLKREQ_N_PDD2, RSVD2, NORMAL, NORMAL, OUTPUT),
+
+       DEFAULT_PINMUX(PEX_WAKE_N_PDD3, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L1_PRSNT_N_PDD4, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L1_RST_N_PDD5, PCIE, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PEX_L1_CLKREQ_N_PDD6, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L2_PRSNT_N_PDD7, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PEX_L2_RST_N_PCC6, PCIE, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(PEX_L2_CLKREQ_N_PCC7, PCIE, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(HDMI_CEC_PEE3, CEC, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(HDMI_INT_PN7, RSVD1, NORMAL, TRISTATE, INPUT),
+
+       /* GPIOs */
+       /* SDMMC1 CD gpio */
+       DEFAULT_PINMUX(GMI_IORDY_PI5, RSVD1, UP, NORMAL, INPUT),
+       /* SDMMC1 WP gpio */
+       LV_PINMUX(VI_D11_PT3, RSVD1, UP, NORMAL, INPUT, DISABLE, DISABLE),
+
+       /* Touch panel GPIO */
+       /* Touch IRQ */
+       DEFAULT_PINMUX(GMI_AD12_PH4, NAND, UP, NORMAL, INPUT),
+
+       /* Touch RESET */
+       DEFAULT_PINMUX(GMI_AD14_PH6, NAND, NORMAL, NORMAL, OUTPUT),
+
+       /* Power rails GPIO */
+       DEFAULT_PINMUX(SPI2_SCK_PX2, GMI, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(PBB4, VGP4, NORMAL, NORMAL, INPUT),
+       DEFAULT_PINMUX(KB_ROW8_PS0, KBC, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT5_PD0, SDMMC3, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT4_PD1, SDMMC3, UP, NORMAL, INPUT),
+
+       LV_PINMUX(VI_D6_PL4, VI, NORMAL, NORMAL, OUTPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D8_PL6, VI, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_D9_PL7, VI, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_PCLK_PT0, RSVD1, UP, TRISTATE, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_HSYNC_PD7, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+       LV_PINMUX(VI_VSYNC_PD6, RSVD1, NORMAL, NORMAL, INPUT, DISABLE, DISABLE),
+};
+
+static struct pmux_pingrp_config unused_pins_lowpower[] = {
+       DEFAULT_PINMUX(GMI_WAIT_PI7, NAND, UP, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_ADV_N_PK0, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_CLK_PK1, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_CS3_N_PK4, NAND, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(GMI_CS7_N_PI6, NAND, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_AD0_PG0, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD1_PG1, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD2_PG2, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD3_PG3, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD4_PG4, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD5_PG5, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD6_PG6, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD7_PG7, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD9_PH1, PWM1, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD11_PH3, NAND, NORMAL, NORMAL, OUTPUT),
+       DEFAULT_PINMUX(GMI_AD13_PH5, NAND, UP, NORMAL, INPUT),
+       DEFAULT_PINMUX(GMI_WR_N_PI0, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_OE_N_PI1, NAND, NORMAL, TRISTATE, OUTPUT),
+       DEFAULT_PINMUX(GMI_DQS_PI2, NAND, NORMAL, TRISTATE, OUTPUT),
+};
+
+static struct pmux_drvgrp_config colibri_t30_padctrl[] = {
+       /* (_drvgrp, _slwf, _slwr, _drvup, _drvdn, _lpmd, _schmt, _hsm) */
+       DEFAULT_PADCFG(SDIO1, SDIOCFG_DRVUP_SLWF, SDIOCFG_DRVDN_SLWR, \
+               SDIOCFG_DRVUP, SDIOCFG_DRVDN, NONE, DISABLE, DISABLE),
+};
+#endif /* _PINMUX_CONFIG_COLIBRI_T30_H_ */
include/configs/colibri_t30.h new file +70 -0
new file mode 100644
index 0000000..92eaec8
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2013-2014 Stefan Agner
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <linux/sizes.h>
+
+#include "tegra30-common.h"
+
+#define CONFIG_DEFAULT_DEVICE_TREE     tegra30-colibri
+#define CONFIG_OF_CONTROL
+#define CONFIG_OF_SEPARATE
+
+#define V_PROMPT                       "Colibri T30 # "
+#define CONFIG_TEGRA_BOARD_STRING      "Toradex Colibri T30"
+
+/* Board-specific config */
+#define CONFIG_SERIAL_MULTI
+#define CONFIG_TEGRA_ENABLE_UARTA
+#define CONFIG_SYS_NS16550_COM1                NV_PA_APB_UARTA_BASE
+
+#define CONFIG_MACH_TYPE               MACH_TYPE_COLIBRI_T30
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+/* I2C */
+#define CONFIG_SYS_I2C_TEGRA
+#define CONFIG_SYS_I2C_INIT_BOARD
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_SYS_MAX_I2C_BUS         TEGRA_I2C_NUM_CONTROLLERS
+#define CONFIG_SYS_I2C_SPEED           100000
+#define CONFIG_CMD_I2C
+#define CONFIG_SYS_I2C
+
+/* SD/MMC */
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_TEGRA_MMC
+#define CONFIG_CMD_MMC
+
+/* Environment in eMMC, at the end of 2nd "boot sector" */
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_ENV_OFFSET              (-CONFIG_ENV_SIZE)
+#define CONFIG_SYS_MMC_ENV_DEV         0
+#define CONFIG_SYS_MMC_ENV_PART                2
+
+#define BOARD_EXTRA_ENV_SETTINGS \
+       "board_name=colibri-eval-v3\0" \
+       "fdtfile=tegra30-colibri-eval-v3.dtb\0"
+
+/* USB Host support */
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_TEGRA
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 3
+#define CONFIG_CMD_USB
+
+/* USB networking support */
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+
+/* General networking support */
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_DHCP
+
+#include "tegra-common-ums.h"
Quoted 8 lines
Quoted 6 lines
include/configs/colibri_t30.h new file +3 -1
+#include "tegra-common-post.h"
+
+#endif /* __CONFIG_H */
--

2.0.3

Regards,
Simon

--
Stefan

#3 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Hi Stefan,

Quoted 37 lines · Stefan Agner

Hi Simon,

Am 2014-07-31 19:41, schrieb Simon Glass:

Quoted 34 lines

Hi Stefan,

Quoted 3 lines · Stefan Agner

This adds board support for the Toradex Colibri T30 module.

A few quick questions below...

Quoted 24 lines

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

---
 arch/arm/Kconfig                                   |   4 +
 arch/arm/dts/Makefile                              |   1 +
 arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
 arch/arm/include/asm/mach-types.h                  |  13 +
 board/toradex/colibri_t30/Makefile                 |   6 +
 board/toradex/colibri_t30/colibri_t30.c            |  52 +++
 .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
 include/configs/colibri_t30.h                      |  73 +++++
 8 files changed, 593 insertions(+)
 create mode 100644 arch/arm/dts/tegra30-colibri.dts
 create mode 100644 board/toradex/colibri_t30/Makefile
 create mode 100644 board/toradex/colibri_t30/colibri_t30.c
 create mode 100644 board/toradex/colibri_t30/pinmux-config-colibri_t30.h
 create mode 100644 include/configs/colibri_t30.h

...

Quoted 32 lines
Quoted 16 lines
Quoted 16 lines
arch/arm/include/asm/mach-types.h +1 -0
index 440b041..560924e 100644
@@ -1106,6 +1106,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_OMAP5_SEVM           3777
 #define MACH_TYPE_ARMADILLO_800EVA     3863
 #define MACH_TYPE_KZM9G                4140
+#define MACH_TYPE_COLIBRI_T30          4493
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -14235,6 +14236,18 @@ extern unsigned int __machine_arch_type;
 # define machine_is_kzm9g()    (0)
 #endif
 
Quoted 15 lines

arch/arm/include/asm/mach-types.h extern unsigned int __machine_arch_type; · line 14249

Quoted 11 lines
arch/arm/include/asm/mach-types.h +11 -0
+#ifdef CONFIG_MACH_COLIBRI_T30
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type    __machine_arch_type
+# else
+#  define machine_arch_type    MACH_TYPE_COLIBRI_T30
+# endif
+# define machine_is_colibri_t30()      (machine_arch_type == MACH_TYPE_COLIBRI_T30)
+#else
+# define machine_is_colibri_t30()      (0)
+#endif

Do we actually need this machine type stuff anymore?

Quoted 3 lines

That way we can also boot the 3.1 L4T Kernel, since this is the (probably last) one where we get supported binary drivers for the graphics part.

OK I see.

Quoted 45 lines
Quoted 35 lines
Quoted 35 lines
arch/arm/include/asm/mach-types.h +1 -0
+
 /*
  * These have not yet been registered
  */
board/toradex/colibri_t30/Makefile new file +6 -0
new file mode 100644
index 0000000..3d58a4b
@@ -0,0 +1,6 @@
+# Copyright (c) 2013-2014 Stefan Agner
+# SPDX-License-Identifier:      GPL-2.0+
+
+include $(srctree)/board/nvidia/common/common.mk
+
+obj-y  += colibri_t30.o
board/toradex/colibri_t30/colibri_t30.c new file +11 -0
new file mode 100644
index 0000000..6c7c62d
@@ -0,0 +1,52 @@
+/*
+ *  (C) Copyright 2014
+ *  Stefan Agner <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/gp_padctrl.h>
+#include "pinmux-config-colibri_t30.h"
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 16

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+#include <i2c.h>
+#include <asm/gpio.h>
+
+#define PMU_I2C_ADDRESS                0x2D
+#define MAX_I2C_RETRY          3

Are these used?

Quoted 1 line

The address is correct, but not used right now. Should I remove?

I think so.

Quoted 41 lines
Quoted 31 lines
Quoted 31 lines
board/toradex/colibri_t30/colibri_t30.c new file +29 -0
+
+/*
+ * Routine: pinmux_init
+ * Description: Do individual peripheral pinmux configs
+ */
+void pinmux_init(void)
+{
+       pinmux_config_pingrp_table(tegra3_pinmux_common,
+                                  ARRAY_SIZE(tegra3_pinmux_common));
+
+       pinmux_config_pingrp_table(unused_pins_lowpower,
+                                  ARRAY_SIZE(unused_pins_lowpower));
+
+       /* Initialize any non-default pad configs (APB_MISC_GP regs) */
+       pinmux_config_drvgrp_table(colibri_t30_padctrl,
+                                  ARRAY_SIZE(colibri_t30_padctrl));
+}
+
+/*
+ * Enable AX88772B USB to LAN controller
+ */
+void pin_mux_usb(void)
+{
+       /* Enable LAN_VBUS */
+       gpio_request(GPIO_PDD2, NULL);
+       gpio_direction_output(GPIO_PDD2, 1);
+
+       /* Reset ASIX using LAN_RESET */
+       gpio_request(GPIO_PDD0, NULL);
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 50

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+       gpio_direction_output(GPIO_PDD0, 0);
+
+       udelay(5);
+
+       gpio_set_value(GPIO_PDD0, 1);

You are using device tree for sdhci - shouldn't we use it for USB also?

Quoted 8 lines

The Colibri T30 has a ASIX USB to Ethernet chip on its board. We reset/power the ASIX here. It is a very board specific reset/powering, hence I put it in here.

In my initial patches I had it in the nvidia,phy-reset-gpio and nvidia,vbus-gpio properties. Technically, it would work to have this GPIOs in the device tree as USB properties, but I think this would be logically wrong...

For VBUS I think it would be correct to put it in the USB. For the reset, I'm not sure - it looks like a separate pin so putting it in the device tree for USB would be wrong I think.

What does the kernel do for these?
...

Regards,
Simon

#4 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Quoted 36 lines · Simon Glass
Quoted 26 lines · Stefan Agner

Am 2014-07-31 19:41, schrieb Simon Glass:

Quoted 15 lines · Stefan Agner
Quoted 14 lines

This adds board support for the Toradex Colibri T30 module.

board/toradex/colibri_t30/colibri_t30.c new file +11 -0
+/*
+ * Enable AX88772B USB to LAN controller
+ */
+void pin_mux_usb(void)
+{
+       /* Enable LAN_VBUS */
+       gpio_request(GPIO_PDD2, NULL);
+       gpio_direction_output(GPIO_PDD2, 1);
+
+       /* Reset ASIX using LAN_RESET */
+       gpio_request(GPIO_PDD0, NULL);
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 50

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+       gpio_direction_output(GPIO_PDD0, 0);
+
+       udelay(5);
+
+       gpio_set_value(GPIO_PDD0, 1);

You are using device tree for sdhci - shouldn't we use it for USB also?

Quoted 8 lines

The Colibri T30 has a ASIX USB to Ethernet chip on its board. We reset/power the ASIX here. It is a very board specific reset/powering, hence I put it in here.

In my initial patches I had it in the nvidia,phy-reset-gpio and nvidia,vbus-gpio properties. Technically, it would work to have this GPIOs in the device tree as USB properties, but I think this would be logically wrong...

Quoted 5 lines

For VBUS I think it would be correct to put it in the USB. For the reset, I'm not sure - it looks like a separate pin so putting it in the device tree for USB would be wrong I think.

What does the kernel do for these?

The kernel doesn't yet have a good answer to things like this, i.e. data that's not directly driven by the requirements of a controller or protocol, but rather the custom/out-of-band aspects of the device that's connected to the controller.

So, a GPIO for VBUS is something very closely tied to the USB specification, and basically any USB controller needs to represent and handle it in the same way.

However, a GPIO to reset/enable a USB device is something completely outside the scope of the USB specification, and is very device specific, and there's currently no good answer re: how to handle it.

There have been various attempts to solve it such as a generic "power sequences" DT binding, various proposals for a "slot" or "connector" or "target device" binding, or even explicitly defining the attached device in DT (even though it can be probed) and having the driver for that handle all the HW-specific details. However these threads have unfortunately all languished.

#5 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

In reply to Simon Glass

Am 2014-07-31 23:55, schrieb Simon Glass:

Quoted 178 lines

Hi Stefan,

Quoted 37 lines · Stefan Agner

Hi Simon,

Am 2014-07-31 19:41, schrieb Simon Glass:

Quoted 34 lines

Hi Stefan,

Quoted 3 lines · Stefan Agner

This adds board support for the Toradex Colibri T30 module.

A few quick questions below...

Quoted 24 lines

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

---
 arch/arm/Kconfig                                   |   4 +
 arch/arm/dts/Makefile                              |   1 +
 arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
 arch/arm/include/asm/mach-types.h                  |  13 +
 board/toradex/colibri_t30/Makefile                 |   6 +
 board/toradex/colibri_t30/colibri_t30.c            |  52 +++
 .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
 include/configs/colibri_t30.h                      |  73 +++++
 8 files changed, 593 insertions(+)
 create mode 100644 arch/arm/dts/tegra30-colibri.dts
 create mode 100644 board/toradex/colibri_t30/Makefile
 create mode 100644 board/toradex/colibri_t30/colibri_t30.c
 create mode 100644 board/toradex/colibri_t30/pinmux-config-colibri_t30.h
 create mode 100644 include/configs/colibri_t30.h

...

Quoted 32 lines
Quoted 16 lines
Quoted 16 lines
arch/arm/include/asm/mach-types.h +1 -0
index 440b041..560924e 100644
@@ -1106,6 +1106,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_OMAP5_SEVM           3777
 #define MACH_TYPE_ARMADILLO_800EVA     3863
 #define MACH_TYPE_KZM9G                4140
+#define MACH_TYPE_COLIBRI_T30          4493
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -14235,6 +14236,18 @@ extern unsigned int __machine_arch_type;
 # define machine_is_kzm9g()    (0)
 #endif
 
Quoted 15 lines

arch/arm/include/asm/mach-types.h extern unsigned int __machine_arch_type; · line 14249

Quoted 11 lines
arch/arm/include/asm/mach-types.h +11 -0
+#ifdef CONFIG_MACH_COLIBRI_T30
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type    __machine_arch_type
+# else
+#  define machine_arch_type    MACH_TYPE_COLIBRI_T30
+# endif
+# define machine_is_colibri_t30()      (machine_arch_type == MACH_TYPE_COLIBRI_T30)
+#else
+# define machine_is_colibri_t30()      (0)
+#endif

Do we actually need this machine type stuff anymore?

Quoted 3 lines

That way we can also boot the 3.1 L4T Kernel, since this is the (probably last) one where we get supported binary drivers for the graphics part.

OK I see.

Quoted 45 lines
Quoted 35 lines
Quoted 35 lines
arch/arm/include/asm/mach-types.h +1 -0
+
 /*
  * These have not yet been registered
  */
board/toradex/colibri_t30/Makefile new file +6 -0
new file mode 100644
index 0000000..3d58a4b
@@ -0,0 +1,6 @@
+# Copyright (c) 2013-2014 Stefan Agner
+# SPDX-License-Identifier:      GPL-2.0+
+
+include $(srctree)/board/nvidia/common/common.mk
+
+obj-y  += colibri_t30.o
board/toradex/colibri_t30/colibri_t30.c new file +11 -0
new file mode 100644
index 0000000..6c7c62d
@@ -0,0 +1,52 @@
+/*
+ *  (C) Copyright 2014
+ *  Stefan Agner <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/gp_padctrl.h>
+#include "pinmux-config-colibri_t30.h"
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 16

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+#include <i2c.h>
+#include <asm/gpio.h>
+
+#define PMU_I2C_ADDRESS                0x2D
+#define MAX_I2C_RETRY          3

Are these used?

Quoted 1 line

The address is correct, but not used right now. Should I remove?

I think so.

Quoted 41 lines
Quoted 31 lines
Quoted 31 lines
board/toradex/colibri_t30/colibri_t30.c new file +29 -0
+
+/*
+ * Routine: pinmux_init
+ * Description: Do individual peripheral pinmux configs
+ */
+void pinmux_init(void)
+{
+       pinmux_config_pingrp_table(tegra3_pinmux_common,
+                                  ARRAY_SIZE(tegra3_pinmux_common));
+
+       pinmux_config_pingrp_table(unused_pins_lowpower,
+                                  ARRAY_SIZE(unused_pins_lowpower));
+
+       /* Initialize any non-default pad configs (APB_MISC_GP regs) */
+       pinmux_config_drvgrp_table(colibri_t30_padctrl,
+                                  ARRAY_SIZE(colibri_t30_padctrl));
+}
+
+/*
+ * Enable AX88772B USB to LAN controller
+ */
+void pin_mux_usb(void)
+{
+       /* Enable LAN_VBUS */
+       gpio_request(GPIO_PDD2, NULL);
+       gpio_direction_output(GPIO_PDD2, 1);
+
+       /* Reset ASIX using LAN_RESET */
+       gpio_request(GPIO_PDD0, NULL);
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 50

Quoted 5 lines
board/toradex/colibri_t30/colibri_t30.c new file +5 -0
+       gpio_direction_output(GPIO_PDD0, 0);
+
+       udelay(5);
+
+       gpio_set_value(GPIO_PDD0, 1);

You are using device tree for sdhci - shouldn't we use it for USB also?

Quoted 8 lines

The Colibri T30 has a ASIX USB to Ethernet chip on its board. We reset/power the ASIX here. It is a very board specific reset/powering, hence I put it in here.

In my initial patches I had it in the nvidia,phy-reset-gpio and nvidia,vbus-gpio properties. Technically, it would work to have this GPIOs in the device tree as USB properties, but I think this would be logically wrong...

Quoted 6 lines

For VBUS I think it would be correct to put it in the USB. For the reset, I'm not sure - it looks like a separate pin so putting it in the device tree for USB would be wrong I think.

What does the kernel do for these?
...

Right now, the Kernel does not touch the reset signal on that device. I'm not sure what happens if we go in suspend mode, need to check that on the kernel side once.

Ok, when I think about it again, it totally make sense to use the VBUS property since this GPIO is really connected to the VBUS pin of that USB device...

--
Stefan

#6 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

In reply to Stefan Agner
Quoted 8 lines · Stefan Agner

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 8 lines
  arch/arm/Kconfig                                   |   4 +
  arch/arm/dts/Makefile                              |   1 +
  arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
  arch/arm/include/asm/mach-types.h                  |  13 +
  board/toradex/colibri_t30/Makefile                 |   6 +
  board/toradex/colibri_t30/colibri_t30.c            |  52 +++
  .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
  include/configs/colibri_t30.h                      |  73 +++++

I think in latest u-boot/master, you'll also need to add configs/colibri_t30_defconfig.

arch/arm/dts/tegra30-colibri.dts line 71

Quoted 7 lines
arch/arm/dts/tegra30-colibri.dts +5 -0
 
+	/* EHCI instance 0: USB1_DP/N -> USBC_P/N */
+	usb at 7d000000 {
+		status = "okay";
+		dr_mode = "otg";
+	};

For OTG support, VBUS needs to be able to be turned on/off. Should this port be host-mode, or a VBUS GPIO defined?

Quoted 6 lines
board/toradex/colibri_t30/colibri_t30.c +4 -0
 
+void pin_mux_usb(void)
+{
+	/* Enable LAN_VBUS */
+	gpio_request(GPIO_PDD2, NULL);

board/toradex/colibri_t30/colibri_t30.c line 51

Quoted 10 lines
board/toradex/colibri_t30/colibri_t30.c +10 -0
+	gpio_direction_output(GPIO_PDD2, 1);
+
+	/* Reset ASIX using LAN_RESET */
+	gpio_request(GPIO_PDD0, NULL);
+	gpio_direction_output(GPIO_PDD0, 0);
+
+	udelay(5);
+
+	gpio_set_value(GPIO_PDD0, 1);
+}

It might be nice to remove the blank lines around the udelay() call; I initially didn't notice that GOPIO_PDD0 was manipulated by the code both before and after the udelay() and hence there was already a comment saying what GPIO_PDD0 controlled. Nestling the lines together would make this more obvious.

include/configs/colibri_t30.h line 34

Quoted 4 lines
include/configs/colibri_t30.h +2 -0
 
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_SYS_MAX_I2C_BUS		TEGRA_I2C_NUM_CONTROLLERS

Are those needed? They aren't defined in e.g. the Beaver config header.

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

Quoted 1 line

+#include "tegra-common-ums.h"

Did you test this? I mostly developed the USB device mode support on Tegra124. While at some point I did test it on Beaver/Tegra30, it was early on and not very extensive. I'd love to hear that it works well for you too:-)

(BTW, I sent a patch to rename that file to tegra-common-usb-gadget.h, since I added DFU support too, so depending on what order TomW applies our patches, one of us will need to rebase)

#7 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Am 2014-07-31 20:21, schrieb Stephen Warren:

Quoted 18 lines · Stefan Agner
Quoted 8 lines

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 8 lines
  arch/arm/Kconfig                                   |   4 +
  arch/arm/dts/Makefile                              |   1 +
  arch/arm/dts/tegra30-colibri.dts                   |  84 +++++
  arch/arm/include/asm/mach-types.h                  |  13 +
  board/toradex/colibri_t30/Makefile                 |   6 +
  board/toradex/colibri_t30/colibri_t30.c            |  52 +++
  .../colibri_t30/pinmux-config-colibri_t30.h        | 360 +++++++++++++++++++++
  include/configs/colibri_t30.h                      |  73 +++++
Quoted 3 lines

I think in latest u-boot/master, you'll also need to add configs/colibri_t30_defconfig.

I actually created them but forgot the git add... Next version will contain those files too:

board/toradex/colibri_t30/Kconfig
board/toradex/colibri_t30/MAINTAINERS
configs/colibri_t30_defconfig

Quoted 11 lines

arch/arm/dts/tegra30-colibri.dts line 71

Quoted 7 lines
arch/arm/dts/tegra30-colibri.dts +5 -0
 
+	/* EHCI instance 0: USB1_DP/N -> USBC_P/N */
+	usb at 7d000000 {
+		status = "okay";
+		dr_mode = "otg";
+	};

For OTG support, VBUS needs to be able to be turned on/off. Should this port be host-mode, or a VBUS GPIO defined?

This port is actually ment to be client by default, I will change dr_mode to "peripheral" in the next patch.

We do not have real OTG support on that port since the ID-Pin is not connected (the Colibri standard has all pins 3.3V level only, hence we cannot connect the ID-Pin). This port is more a dual-role port. On the Evaluation Board, we have a pin connected to allow automatic switching between the two roles, while the VBUS stuff is handled by hardware (using the ID-Pin). However, this automatic switching is currently not implemented. Hence I would like to have that port as peripheral by default while having the other as host.

Quoted 14 lines
Quoted 14 lines
board/toradex/colibri_t30/colibri_t30.c +12 -0
 
+void pin_mux_usb(void)
+{
+	/* Enable LAN_VBUS */
+	gpio_request(GPIO_PDD2, NULL);
+	gpio_direction_output(GPIO_PDD2, 1);
+
+	/* Reset ASIX using LAN_RESET */
+	gpio_request(GPIO_PDD0, NULL);
+	gpio_direction_output(GPIO_PDD0, 0);
+
+	udelay(5);
+
Quoted 9 lines

board/toradex/colibri_t30/colibri_t30.c line 51

Quoted 2 lines
board/toradex/colibri_t30/colibri_t30.c +2 -0
+	gpio_set_value(GPIO_PDD0, 1);
+}

It might be nice to remove the blank lines around the udelay() call; I initially didn't notice that GOPIO_PDD0 was manipulated by the code both before and after the udelay() and hence there was already a comment saying what GPIO_PDD0 controlled. Nestling the lines together would make this more obvious.

Agreed.

Quoted 7 lines

include/configs/colibri_t30.h line 34

Quoted 4 lines
include/configs/colibri_t30.h +2 -0
 
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_SYS_MAX_I2C_BUS		TEGRA_I2C_NUM_CONTROLLERS

Are those needed? They aren't defined in e.g. the Beaver config header.

Since we do not need to configure the PMIC, its not required no. I will remove them.

Quoted 7 lines

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

This is a somewhat complicated topic in our case. Our products are named:

"Colibri T20"
"Colibri T30"
"Apalis T30"

Since quite a long time, we use those names, except replacing the space by an underline character and preferable use small caps. Hence e.g. the U-Boot configurations in the downstream tree:

colibri_t20_config
colibri_t30_config
apalis_t30_config

However, in the kernel world, since device tree was introduced there is this reverse notation, SoC-board.dts... e.g. tegra30-colibri_t30.dts. We descided to drop that t30, since its somewhat duplicated. Not sure this was the right description, but its in the kernel that way right now.

Additionally, this whole carrier board (Evaluation Board v3)/module (Colibri T30) relation is also taken into account at kernel side, hence the full name today
tegra30-colibri-eval-v3.dts

Ok, because we don't have the unique board names as the other Tegra devices have, we cannot just call the board in U-Boot as we did for the
kernel: "colibri" or "colibri-eval-v3" would be used twice, for the T20 and T30. To solve that, we could change tegra30-colibri-eval-v3.dts to tegra30-colibri_t30-eval-v3.dts...

Also, since most customers never change the boot loader for their board design, I would like to avoid to have the carrier board in the boot loaders board name. Frankly, quite a lot even don't change the kernel, since they use the default pin assignment. Also we use the same boot loader configuration for our three own Carrier Boards. (Btw. currently, this is not the case for the Colibri T20. Lucas, in CC now, added back then a similar Carrier Board/Module relation we have in the kernel. I would actually prefer to squash this together the way this patch does it for the Colibri T30.)

Hence we are not synchronized between the kernel dtb and the U-Boot board name anyway...

So the name scheme I see would be U-Boot:
colibri_t20
colibri_t30
apalis_t30

Kernel:
tegra20-colibri.dtsi (in case we can detect the RAM size) tegra20-colibri-iris.dts tegra20-colibri-eval-v3.dts
tegra30-colibri.dtsi
tegra30-colibri-iris.dts tegra30-colibri-eval-v3.dts
tegra30-apalis.dtsi
tegra30-apalis-ixora.dts tegra30-apalis-eval-v1.dts

What do you think? I could also agree to add the T30 again for the kernel, hence tegra30-colibri_t30.dtsi and tegra30-colibri_t30-eval-v3.dts. But I don't like the idea to have the carrier board in the U-Boot name. In the end, everybody would use the one colibri_t30_eval_v3 config...

Quoted 10 lines
Quoted 1 line

+#include "tegra-common-ums.h"

Did you test this? I mostly developed the USB device mode support on Tegra124. While at some point I did test it on Beaver/Tegra30, it was early on and not very extensive. I'd love to hear that it works well for you too:-)

(BTW, I sent a patch to rename that file to tegra-common-usb-gadget.h, since I added DFU support too, so depending on what order TomW applies our patches, one of us will need to rebase)

Yes I tested this, and it works great! It's really a very nice way to deploy the root file system. Create the partition table easily from your desktop PC, format the partition, and just untar whatever distribution you want. Slick!

Does DFU support NAND/and or eMMC? AFAIK it was designed more for NAND devices wasn't it? If NAND is supported, we would even have a nice solution for the Tegra 2 now.

--
Stefan

#8 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Quoted 42 lines · Stefan Agner

Am 2014-07-31 20:21, schrieb Stephen Warren:

Quoted 9 lines · Stefan Agner
Quoted 7 lines

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 7 lines

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h new file +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

This is a somewhat complicated topic in our case. Our products are named:

"Colibri T20"
"Colibri T30"
"Apalis T30"

Since quite a long time, we use those names, except replacing the space by an underline character and preferable use small caps. Hence e.g. the U-Boot configurations in the downstream tree:

colibri_t20_config
colibri_t30_config
apalis_t30_config

However, in the kernel world, since device tree was introduced there is this reverse notation, SoC-board.dts... e.g. tegra30-colibri_t30.dts. We descided to drop that t30, since its somewhat duplicated. Not sure this was the right description, but its in the kernel that way right now.

Additionally, this whole carrier board (Evaluation Board v3)/module (Colibri T30) relation is also taken into account at kernel side, hence the full name today
tegra30-colibri-eval-v3.dts

...

Quoted 2 lines

Also we use the same boot
loader configuration for our three own Carrier Boards.

OK, it mostly makes sense to have U-Boot configuration names that only mention the CPU module and not the carrier board in that case.

However, if the U-Boot default environment defines the full kernel DTB name, then that isn't possible. A U-Boot board will be tied to a particular carrier-board configuration that way.

Perhaps remove the DT filename from the default environment, and require the user or flashing process to set the correct value?

Alternatively, perhaps add the core U-Boot support under one (primary configuration and board directory) name, and add additional entry to boards.cfg/Kconfig to override that one fdtfile value in the environment? I see quite a few other boards do so something similar, albeit likely for larger variations than just one environment variable:-)

#9 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Quoted 50 lines · Stephen Warren
Quoted 42 lines · Stefan Agner

Am 2014-07-31 20:21, schrieb Stephen Warren:

Quoted 9 lines · Stefan Agner
Quoted 7 lines

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 7 lines

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h new file +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

This is a somewhat complicated topic in our case. Our products are named:

"Colibri T20"
"Colibri T30"
"Apalis T30"

Since quite a long time, we use those names, except replacing the space by an underline character and preferable use small caps. Hence e.g. the U-Boot configurations in the downstream tree:

colibri_t20_config
colibri_t30_config
apalis_t30_config

However, in the kernel world, since device tree was introduced there is this reverse notation, SoC-board.dts... e.g. tegra30-colibri_t30.dts. We descided to drop that t30, since its somewhat duplicated. Not sure this was the right description, but its in the kernel that way right now.

Additionally, this whole carrier board (Evaluation Board v3)/module (Colibri T30) relation is also taken into account at kernel side, hence the full name today
tegra30-colibri-eval-v3.dts

...

Quoted 2 lines

Also we use the same boot
loader configuration for our three own Carrier Boards.

OK, it mostly makes sense to have U-Boot configuration names that only mention the CPU module and not the carrier board in that case.

Quoted 6 lines

However, if the U-Boot default environment defines the full kernel DTB name, then that isn't possible. A U-Boot board will be tied to a particular carrier-board configuration that way.

Perhaps remove the DT filename from the default environment, and require the user or flashing process to set the correct value?

Is there a run-time way to discover what board (or perhaps rather, what DT we would want to load) we're on? That's how we solve this on various TI platforms.

Quoted 6 lines

Alternatively, perhaps add the core U-Boot support under one (primary configuration and board directory) name, and add additional entry to boards.cfg/Kconfig to override that one fdtfile value in the environment? I see quite a few other boards do so something similar, albeit likely for larger variations than just one environment variable:-)

But yes, we'll need to sort out a way to setup the default environment, with some this-that-or-something-else tweaks in any case.

Signature · 8 lines
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/20140804/fd50636d/attachment.pgp>
#10 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Am 2014-08-04 19:16, schrieb Tom Rini:

Quoted 55 lines · Stephen Warren
Quoted 54 lines · Stefan Agner
Quoted 42 lines

Am 2014-07-31 20:21, schrieb Stephen Warren:

Quoted 9 lines · Stefan Agner
Quoted 7 lines

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 7 lines

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h new file +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

This is a somewhat complicated topic in our case. Our products are named:

"Colibri T20"
"Colibri T30"
"Apalis T30"

Since quite a long time, we use those names, except replacing the space by an underline character and preferable use small caps. Hence e.g. the U-Boot configurations in the downstream tree:

colibri_t20_config
colibri_t30_config
apalis_t30_config

However, in the kernel world, since device tree was introduced there is this reverse notation, SoC-board.dts... e.g. tegra30-colibri_t30.dts. We descided to drop that t30, since its somewhat duplicated. Not sure this was the right description, but its in the kernel that way right now.

Additionally, this whole carrier board (Evaluation Board v3)/module (Colibri T30) relation is also taken into account at kernel side, hence the full name today
tegra30-colibri-eval-v3.dts

...

Quoted 2 lines

Also we use the same boot
loader configuration for our three own Carrier Boards.

OK, it mostly makes sense to have U-Boot configuration names that only mention the CPU module and not the carrier board in that case.

However, if the U-Boot default environment defines the full kernel DTB name, then that isn't possible. A U-Boot board will be tied to a particular carrier-board configuration that way.

Quoted 7 lines
Quoted 2 lines

Perhaps remove the DT filename from the default environment, and require the user or flashing process to set the correct value?

Is there a run-time way to discover what board (or perhaps rather, what DT we would want to load) we're on? That's how we solve this on various TI platforms.

No there is no standardized way to detect the carrier board.

Quoted 9 lines
Quoted 6 lines

Alternatively, perhaps add the core U-Boot support under one (primary configuration and board directory) name, and add additional entry to boards.cfg/Kconfig to override that one fdtfile value in the environment? I see quite a few other boards do so something similar, albeit likely for larger variations than just one environment variable:-)

But yes, we'll need to sort out a way to setup the default environment, with some this-that-or-something-else tweaks in any case.

--
Stefan

#11 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

In reply to Stephen Warren

Am 2014-08-04 19:02, schrieb Stephen Warren:

Quoted 50 lines · Stefan Agner
Quoted 42 lines

Am 2014-07-31 20:21, schrieb Stephen Warren:

Quoted 9 lines · Stefan Agner
Quoted 7 lines

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 7 lines

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h new file +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

This is a somewhat complicated topic in our case. Our products are named:

"Colibri T20"
"Colibri T30"
"Apalis T30"

Since quite a long time, we use those names, except replacing the space by an underline character and preferable use small caps. Hence e.g. the U-Boot configurations in the downstream tree:

colibri_t20_config
colibri_t30_config
apalis_t30_config

However, in the kernel world, since device tree was introduced there is this reverse notation, SoC-board.dts... e.g. tegra30-colibri_t30.dts. We descided to drop that t30, since its somewhat duplicated. Not sure this was the right description, but its in the kernel that way right now.

Additionally, this whole carrier board (Evaluation Board v3)/module (Colibri T30) relation is also taken into account at kernel side, hence the full name today
tegra30-colibri-eval-v3.dts

...

Quoted 2 lines

Also we use the same boot
loader configuration for our three own Carrier Boards.

OK, it mostly makes sense to have U-Boot configuration names that only mention the CPU module and not the carrier board in that case.

Quoted 7 lines

However, if the U-Boot default environment defines the full kernel DTB name, then that isn't possible. A U-Boot board will be tied to a particular carrier-board configuration that way.

Perhaps remove the DT filename from the default environment, and require the user or flashing process to set the correct value?

Since a lot of people use the bootloader binaries unmodified, such a solution would be preferable. I guess I could use fdtput or even extend the existing tegra-uboot-flasher for this purpose.

Quoted 6 lines

Alternatively, perhaps add the core U-Boot support under one (primary configuration and board directory) name, and add additional entry to boards.cfg/Kconfig to override that one fdtfile value in the environment? I see quite a few other boards do so something similar, albeit likely for larger variations than just one environment variable:-)

Yes, such a lightweight carrier board/module support would be maintainable too I guess.

I will try to implement the first approach first. One way would be setting the board_name by overriding boardcmd. Or maybe a bit more problem specific, getting the fdtfile/board_name from dts /config/fdtfile node...

--
Stefan

#12 lore raw

PATCH 1/1 ARM: tegra: add Colibri T30 board support

Quoted 55 lines · Stefan Agner

Am 2014-08-04 19:02, schrieb Stephen Warren:

Quoted 54 lines · Stefan Agner
Quoted 42 lines

Am 2014-07-31 20:21, schrieb Stephen Warren:

Quoted 9 lines · Stefan Agner
Quoted 7 lines

This adds board support for the Toradex Colibri T30 module.

Working functions:
- SD card boot
- eMMC environment and boot
- USB host/USB client (on the dual role port)
- Network (via ASIX USB)

Quoted 7 lines

include/configs/colibri_t30.h line 53

Quoted 3 lines
include/configs/colibri_t30.h new file +3 -0
+#define BOARD_EXTRA_ENV_SETTINGS \
+	"board_name=colibri-eval-v3\0" \
+	"fdtfile=tegra30-colibri-eval-v3.dtb\0"

It'd be nice to name the board the same in U-Boot as the kernel DT filename. Then you wouldn't need to manually override the default values here.

This is a somewhat complicated topic in our case. Our products are named:

"Colibri T20"
"Colibri T30"
"Apalis T30"

Since quite a long time, we use those names, except replacing the space by an underline character and preferable use small caps. Hence e.g. the U-Boot configurations in the downstream tree:

colibri_t20_config
colibri_t30_config
apalis_t30_config

However, in the kernel world, since device tree was introduced there is this reverse notation, SoC-board.dts... e.g. tegra30-colibri_t30.dts. We descided to drop that t30, since its somewhat duplicated. Not sure this was the right description, but its in the kernel that way right now.

Additionally, this whole carrier board (Evaluation Board v3)/module (Colibri T30) relation is also taken into account at kernel side, hence the full name today
tegra30-colibri-eval-v3.dts

...

Quoted 2 lines

Also we use the same boot
loader configuration for our three own Carrier Boards.

OK, it mostly makes sense to have U-Boot configuration names that only mention the CPU module and not the carrier board in that case.

However, if the U-Boot default environment defines the full kernel DTB name, then that isn't possible. A U-Boot board will be tied to a particular carrier-board configuration that way.

Quoted 7 lines
Quoted 3 lines

Perhaps remove the DT filename from the default environment, and require the user or flashing process to set the correct value?

Since a lot of people use the bootloader binaries unmodified, such a solution would be preferable. I guess I could use fdtput or even extend the existing tegra-uboot-flasher for this purpose.

There's already the --env command-line option which allows you to do this.

If necessary, it probably wouldn't be hard to add the ability for a particular tegra-uboot-flasher config file to automatically add the relevant --env option when run in flashing mode.