arm64: mvebu: Add Armada 7K db-88f7040 development board support
authorStefan Roese <sr@denx.de>
Wed, 25 May 2016 06:21:21 +0000 (08:21 +0200)
committerStefan Roese <sr@denx.de>
Tue, 27 Sep 2016 15:29:54 +0000 (17:29 +0200)
This patch adds basic support for the Marvell Armada 7K DB-88F7040
development board. Supported are the following interfaces:
- UART
- SPI (incl. SPI NOR)
- I2C
- USB
- SATA / AHCI

Support for other interfaces will follow.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
arch/arm/mach-mvebu/Kconfig
board/Marvell/mvebu_db-88f7040/MAINTAINERS [new file with mode: 0644]
board/Marvell/mvebu_db-88f7040/Makefile [new file with mode: 0644]
board/Marvell/mvebu_db-88f7040/board.c [new file with mode: 0644]
configs/mvebu_db-88f7040_defconfig [new file with mode: 0644]
include/configs/mvebu_db-88f7040.h [new file with mode: 0644]

index 67178440b71b08ee429c594602c2d346e8200548..6e8026bde25308369a641aa6a57f96e7bcf8f458 100644 (file)
@@ -77,6 +77,10 @@ config TARGET_DB_88F6820_AMC
        bool "Support DB-88F6820-AMC"
        select 88F6820
 
+config TARGET_MVEBU_DB_88F7040
+       bool "Support DB-88F7040 Armada 7040"
+       select ARMADA_8K
+
 config TARGET_DB_MV784MP_GP
        bool "Support db-mv784mp-gp"
        select MV78460
@@ -101,6 +105,7 @@ config SYS_BOARD
        default "db-88f6720" if TARGET_DB_88F6720
        default "db-88f6820-gp" if TARGET_DB_88F6820_GP
        default "db-88f6820-amc" if TARGET_DB_88F6820_AMC
+       default "mvebu_db-88f7040" if TARGET_MVEBU_DB_88F7040
        default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
        default "ds414" if TARGET_DS414
        default "maxbcm" if TARGET_MAXBCM
@@ -112,6 +117,7 @@ config SYS_CONFIG_NAME
        default "db-88f6720" if TARGET_DB_88F6720
        default "db-88f6820-gp" if TARGET_DB_88F6820_GP
        default "db-88f6820-amc" if TARGET_DB_88F6820_AMC
+       default "mvebu_db-88f7040" if TARGET_MVEBU_DB_88F7040
        default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
        default "ds414" if TARGET_DS414
        default "maxbcm" if TARGET_MAXBCM
@@ -123,6 +129,7 @@ config SYS_VENDOR
        default "Marvell" if TARGET_DB_88F6720
        default "Marvell" if TARGET_DB_88F6820_GP
        default "Marvell" if TARGET_DB_88F6820_AMC
+       default "Marvell" if TARGET_MVEBU_DB_88F7040
        default "solidrun" if TARGET_CLEARFOG
        default "Synology" if TARGET_DS414
 
diff --git a/board/Marvell/mvebu_db-88f7040/MAINTAINERS b/board/Marvell/mvebu_db-88f7040/MAINTAINERS
new file mode 100644 (file)
index 0000000..820461b
--- /dev/null
@@ -0,0 +1,6 @@
+MVEBU_DB_88F7040 BOARD
+M:     Stefan Roese <sr@denx.de>
+S:     Maintained
+F:     board/Marvell/mvebu_db-88f7040/
+F:     include/configs/mvebu_db-88f7040.h
+F:     configs/mvebu_db-88f7040_defconfig
diff --git a/board/Marvell/mvebu_db-88f7040/Makefile b/board/Marvell/mvebu_db-88f7040/Makefile
new file mode 100644 (file)
index 0000000..ed39738
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2016 Stefan Roese <sr@denx.de>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := board.o
diff --git a/board/Marvell/mvebu_db-88f7040/board.c b/board/Marvell/mvebu_db-88f7040/board.c
new file mode 100644 (file)
index 0000000..48bd55c
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* IO expander I2C device */
+#define I2C_IO_EXP_ADDR                0x21
+#define I2C_IO_CFG_REG_0       0x6
+#define I2C_IO_DATA_OUT_REG_0  0x2
+/* VBus enable */
+#define I2C_IO_REG_0_USB_H0_OFF        0
+#define I2C_IO_REG_0_USB_H1_OFF        1
+#define I2C_IO_REG_VBUS                ((1 << I2C_IO_REG_0_USB_H0_OFF) | \
+                                (1 << I2C_IO_REG_0_USB_H1_OFF))
+/* Current limit */
+#define I2C_IO_REG_0_USB_H0_CL 4
+#define I2C_IO_REG_0_USB_H1_CL 5
+#define I2C_IO_REG_CL          ((1 << I2C_IO_REG_0_USB_H0_CL) | \
+                                (1 << I2C_IO_REG_0_USB_H1_CL))
+
+static int usb_enabled = 0;
+
+/* Board specific xHCI dis-/enable code */
+
+/*
+ * Set USB VBUS signals (via I2C IO expander/GPIO) as output and set
+ * output value as disabled
+ *
+ * Set USB Current Limit signals (via I2C IO expander/GPIO) as output
+ * and set output value as enabled
+ */
+int board_xhci_config(void)
+{
+       struct udevice *dev;
+       int ret;
+       u8 buf[8];
+
+       /* Configure IO exander PCA9555: 7bit address 0x21 */
+       ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+       if (ret) {
+               printf("Cannot find PCA9555: %d\n", ret);
+               return 0;
+       }
+
+       /*
+        * Read configuration (direction) and set VBUS pin as output
+        * (reset pin = output)
+        */
+       ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
+       if (ret) {
+               printf("Failed to read IO expander value via I2C\n");
+               return -EIO;
+       }
+       buf[0] &= ~I2C_IO_REG_VBUS;
+       buf[0] &= ~I2C_IO_REG_CL;
+       ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
+       if (ret) {
+               printf("Failed to set IO expander via I2C\n");
+               return -EIO;
+       }
+
+       /* Read output value and configure it */
+       ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+       if (ret) {
+               printf("Failed to read IO expander value via I2C\n");
+               return -EIO;
+       }
+       buf[0] &= ~I2C_IO_REG_VBUS;
+       buf[0] |= I2C_IO_REG_CL;
+       ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+       if (ret) {
+               printf("Failed to set IO expander via I2C\n");
+               return -EIO;
+       }
+
+       mdelay(500); /* required delay to let output value settle */
+
+       return 0;
+}
+
+int board_xhci_enable(void)
+{
+       struct udevice *dev;
+       int ret;
+       u8 buf[8];
+
+       /*
+        * This function enables all USB ports simultaniously,
+        * it only needs to get called once
+        */
+       if (usb_enabled)
+               return 0;
+
+       /* Configure IO exander PCA9555: 7bit address 0x21 */
+       ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+       if (ret) {
+               printf("Cannot find PCA9555: %d\n", ret);
+               return 0;
+       }
+
+       /* Read VBUS output value */
+       ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+       if (ret) {
+               printf("Failed to read IO expander value via I2C\n");
+               return -EIO;
+       }
+
+       /* Enable VBUS power: Set output value of VBUS pin as enabled */
+       buf[0] |= I2C_IO_REG_VBUS;
+       ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+       if (ret) {
+               printf("Failed to set IO expander via I2C\n");
+               return -EIO;
+       }
+
+       mdelay(500); /* required delay to let output value settle */
+       usb_enabled = 1;
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       /* Nothing to do (yet), perhaps later some pin-muxing etc */
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+       return 0;
+}
+
+int board_late_init(void)
+{
+       /* Pre-configure the USB ports (overcurrent, VBus) */
+       board_xhci_config();
+
+       return 0;
+}
diff --git a/configs/mvebu_db-88f7040_defconfig b/configs/mvebu_db-88f7040_defconfig
new file mode 100644 (file)
index 0000000..4d68bdc
--- /dev/null
@@ -0,0 +1,47 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MVEBU=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_MVEBU_DB_88F7040=y
+CONFIG_DEFAULT_DEVICE_TREE="armada-7040-db"
+CONFIG_AHCI=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_BLOCK_CACHE=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MVTWSI=y
+CONFIG_MISC=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_PHYLIB=y
+CONFIG_MVEBU_COMPHY_SUPPORT=y
+# CONFIG_SPL_SERIAL_PRESENT is not set
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_BASE=0xf0512000
+CONFIG_DEBUG_UART_CLOCK=200000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_STORAGE=y
diff --git a/include/configs/mvebu_db-88f7040.h b/include/configs/mvebu_db-88f7040.h
new file mode 100644 (file)
index 0000000..cfb0191
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _CONFIG_MVEBU_DB_88F7040_H
+#define _CONFIG_MVEBU_DB_88F7040_H
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+#define CONFIG_SYS_TCLK                250000000       /* 250MHz */
+
+#define CONFIG_DISPLAY_BOARDINFO_LATE
+#define CONFIG_ARCH_EARLY_INIT_R
+#define CONFIG_BOARD_LATE_INIT
+
+#define        CONFIG_SYS_TEXT_BASE    0x00000000
+
+/* additions for new ARM relocation support */
+#define CONFIG_SYS_SDRAM_BASE  0x00000000
+
+#define CONFIG_NR_DRAM_BANKS   1
+
+/* auto boot */
+#define CONFIG_PREBOOT
+
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, \
+                                         115200, 230400, 460800, 921600 }
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CONFIG_CMDLINE_TAG             /* enable passing of ATAGs  */
+#define CONFIG_INITRD_TAG              /* enable INITRD tag */
+#define CONFIG_SETUP_MEMORY_TAGS       /* enable memory tag */
+
+#define        CONFIG_SYS_CBSIZE       1024    /* Console I/O Buff Size */
+#define        CONFIG_SYS_PBSIZE       (CONFIG_SYS_CBSIZE \
+               +sizeof(CONFIG_SYS_PROMPT) + 16)        /* Print Buff */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN  (4 << 20) /* 4MiB for malloc() */
+
+/*
+ * Other required minimal configurations
+ */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_CONSOLE_INFO_QUIET      /* some code reduction */
+#define CONFIG_ARCH_CPU_INIT           /* call arch_cpu_init() */
+#define CONFIG_BOARD_EARLY_INIT_F      /* call board_init_f for early inits */
+#define CONFIG_SYS_LOAD_ADDR   0x00800000      /* default load adr- 8M */
+#define CONFIG_SYS_MEMTEST_START 0x00800000    /* 8M */
+#define CONFIG_SYS_MEMTEST_END 0x00ffffff      /*(_16M -1) */
+#define CONFIG_SYS_RESET_ADDRESS 0xffff0000    /* Rst Vector Adr */
+#define CONFIG_SYS_MAXARGS     32      /* max number of command args */
+
+#define CONFIG_SYS_CONSOLE_INFO_QUIET  /* don't print console @ startup */
+#define CONFIG_SYS_ALT_MEMTEST
+
+/* End of 16M scrubbed by training in bootrom */
+#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_TEXT_BASE + 0xFF0000)
+
+/*
+ * SPI Flash configuration
+ */
+#define CONFIG_KIRKWOOD_SPI
+#define CONFIG_ENV_SPI_BUS             0
+#define CONFIG_ENV_SPI_CS              0
+
+/* SPI NOR flash default params, used by sf commands */
+#define CONFIG_SF_DEFAULT_SPEED                1000000
+#define CONFIG_SF_DEFAULT_MODE         SPI_MODE_0
+#define CONFIG_ENV_SPI_MODE            CONFIG_SF_DEFAULT_MODE
+
+/* Environment in SPI NOR flash */
+#define CONFIG_SYS_NO_FLASH            /* Declare no flash (NOR/SPI) */
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET              0x180000 /* as Marvell U-Boot version */
+#define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
+#define CONFIG_ENV_SECT_SIZE           (64 << 10) /* 64KiB sectors */
+
+/* USB 2.0 */
+#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 3
+
+/* USB 3.0 */
+#define CONFIG_SYS_USB_XHCI_MAX_ROOT_PORTS 3
+
+#define CONFIG_USB_MAX_CONTROLLER_COUNT (CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS + \
+                                        CONFIG_SYS_USB_XHCI_MAX_ROOT_PORTS)
+
+/* USB ethernet */
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+#define CONFIG_USB_ETHER_MCS7830
+#define CONFIG_USB_ETHER_RTL8152
+#define CONFIG_USB_ETHER_SMSC95XX
+
+/*
+ * SATA/SCSI/AHCI configuration
+ */
+#define CONFIG_SCSI
+#define CONFIG_SCSI_AHCI
+#define CONFIG_SCSI_AHCI_PLAT
+#define CONFIG_LIBATA
+#define CONFIG_LBA48
+#define CONFIG_SYS_64BIT_LBA
+
+#define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
+#define CONFIG_SYS_SCSI_MAX_LUN                1
+#define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
+                                        CONFIG_SYS_SCSI_MAX_LUN)
+
+#define CONFIG_SUPPORT_VFAT
+
+/* DISK Partition support */
+#define CONFIG_EFI_PARTITION
+#define CONFIG_DOS_PARTITION
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ISO_PARTITION           /* Experimental */
+
+#define CONFIG_CMD_PART
+#define CONFIG_PARTITION_UUIDS
+
+#endif /* _CONFIG_MVEBU_DB_88F7040_H */