All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board.
@ 2015-07-08 15:57 Peter Griffin
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver Peter Griffin
                   ` (5 more replies)
  0 siblings, 6 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

Hi Folks,

This series adds support for the first 96boards consumer edition HiKey board.

More information can be found about this board at the following link
https://www.96boards.org/products/hikey/.

This initial port adds support for: -
1) Serial 
2) eMMC and sd card
3) USB
4) GPIO

It has been tested with Arm Trusted Firmware running u-boot as the BL33 executable.

Some instructions on exactly how to compile everything (l-loader, 
with Arm Trusted Firmware, which then loads u-boot) is documented in the README found
in the board/hisilicon/hikey directory.
 
A basic SoC datasheet can be found here: -
https://github.com/96boards/documentation/blob/master/hikey/
Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
    
Board schematic can be found here: -
https://github.com/96boards/documentation/blob/master/hikey/
96Boards-Hikey-Rev-A1.pdf

A rather pleasant side effect of rebasing to v2015.07-rc2 is that the two main bugs
with the v1 series (that I new about at least) are resolved. DHCP now works correctly,
and USB mass storage devices are also enumerated).

I had a quick look at migrating the gpio driver over to DT like Simon suggested.
Currently there is a bug in fdtdec_get_addr() for 64bit platforms which I ran into.
See patch from Thierry here http://permalink.gmane.org/gmane.comp.boot-loaders.u-boot/215346

Also I'm not sure on the protocol here, but the DT nodes for the gpio controller aren't
yet present in upstream Linux kernel, so I think it would be better to wait until they are,
so that u-boot and kernel DT don't diverge. Migrating over to DT at that point should
then be fairly trivial.

Changes since v1:
- Rename vendor to hisilicon not 96boards (Rob)
- Get rid of aemv8a vexpress leftover (Rob)
- Remove __weak on misc_init_r (Rob)
- Remove unnecessary LINUX_BOOT_PARAM_ADDR (Rob)
- COUNTER_FREQUENCY in decimal to avoid comment (Rob)
- Remove leftover V2M* from vexpress (Rob)
- Migrate configs/hikey.h over to use config_distro_defaults.h (Rob)
- Remove custom u-boot prompt (Rob)
- Enable icache
- Remove custom delay function, as mdelay/udelay work fine (Rob)
- Update CONFIG_SYS_LOAD_ADDR to 0x80000 (Rob)

- Use suggested macro for declaring gpio addresses (Marek)
- Zap dead Macros (Marek)
- Use calloc instead of malloc (Marek)

- Reduce PHYS_RAM by 16Mb to accomodate OPTEE in latest ATF code (Peter)
- Rebase on v2015.07-rc2 (Peter)
- Add CONFIG_NET=y so that env callbacks work (Peter)

- Add a README on how to build / flash u-boot (Simon)


kind regards,

Peter.

Peter Griffin (6):
  dm: gpio: hi6220: Add a hi6220 GPIO driver model driver.
  ARM: hi6220: Add register and bitfield definition header files.
  hi6553: Add register definition and bitfield header for 6553 pmic
  mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller.
  ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey
    board.
  ARM64: hikey: Add a README for this board.

 arch/arm/Kconfig                                   |   8 +
 arch/arm/include/asm/arch-hi6220/dwmmc.h           |   8 +
 arch/arm/include/asm/arch-hi6220/gpio.h            |  29 ++
 arch/arm/include/asm/arch-hi6220/hi6220.h          | 324 ++++++++++++++++
 .../include/asm/arch-hi6220/hi6220_regs_alwayson.h | 349 +++++++++++++++++
 arch/arm/include/asm/arch-hi6220/hi6553.h          |  75 ++++
 board/hisilicon/hikey/Kconfig                      |  15 +
 board/hisilicon/hikey/Makefile                     |   8 +
 board/hisilicon/hikey/README                       | 160 ++++++++
 board/hisilicon/hikey/hikey.c                      | 415 +++++++++++++++++++++
 configs/hikey_defconfig                            |   5 +
 drivers/gpio/Makefile                              |   2 +
 drivers/gpio/hi6220_gpio.c                         |  95 +++++
 drivers/mmc/Makefile                               |   1 +
 drivers/mmc/hi6220_dw_mmc.c                        |  56 +++
 include/configs/hikey.h                            | 168 +++++++++
 16 files changed, 1718 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-hi6220/dwmmc.h
 create mode 100644 arch/arm/include/asm/arch-hi6220/gpio.h
 create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220.h
 create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h
 create mode 100644 arch/arm/include/asm/arch-hi6220/hi6553.h
 create mode 100644 board/hisilicon/hikey/Kconfig
 create mode 100644 board/hisilicon/hikey/Makefile
 create mode 100644 board/hisilicon/hikey/README
 create mode 100644 board/hisilicon/hikey/hikey.c
 create mode 100644 configs/hikey_defconfig
 create mode 100644 drivers/gpio/hi6220_gpio.c
 create mode 100644 drivers/mmc/hi6220_dw_mmc.c
 create mode 100644 include/configs/hikey.h

-- 
1.9.1

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

* [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver.
  2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
@ 2015-07-08 15:57 ` Peter Griffin
  2015-07-18 14:37   ` Simon Glass
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files Peter Griffin
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

This patch adds support for the GPIO perif found on hi6220
SoC.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 arch/arm/include/asm/arch-hi6220/gpio.h | 29 ++++++++++
 drivers/gpio/Makefile                   |  2 +
 drivers/gpio/hi6220_gpio.c              | 95 +++++++++++++++++++++++++++++++++
 3 files changed, 126 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-hi6220/gpio.h
 create mode 100644 drivers/gpio/hi6220_gpio.c

diff --git a/arch/arm/include/asm/arch-hi6220/gpio.h b/arch/arm/include/asm/arch-hi6220/gpio.h
new file mode 100644
index 0000000..98122a2
--- /dev/null
+++ b/arch/arm/include/asm/arch-hi6220/gpio.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _HI6220_GPIO_H_
+#define _HI6220_GPIO_H_
+
+#define HI6220_GPIO_BASE(bank)	(((bank < 4) ? 0xf8011000 : \
+				0xf7020000 - 0x4000) + (0x1000 * bank))
+
+#define BIT(x)			(1 << (x))
+
+#define HI6220_GPIO_PER_BANK	8
+#define HI6220_GPIO_DIR		0x400
+
+struct gpio_bank {
+	u8 *base;	/* address of registers in physical memory */
+};
+
+/* Information about a GPIO bank */
+struct hikey_gpio_platdata {
+	int bank_index;
+	unsigned int base;     /* address of registers in physical memory */
+};
+
+#endif /* _HI6220_GPIO_H_ */
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 5864850..b470bab 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -46,3 +46,5 @@ obj-$(CONFIG_LPC32XX_GPIO)	+= lpc32xx_gpio.o
 obj-$(CONFIG_STM32_GPIO)	+= stm32_gpio.o
 obj-$(CONFIG_ZYNQ_GPIO)		+= zynq_gpio.o
 obj-$(CONFIG_VYBRID_GPIO)	+= vybrid_gpio.o
+obj-$(CONFIG_HIKEY_GPIO)	+= hi6220_gpio.o
+
diff --git a/drivers/gpio/hi6220_gpio.c b/drivers/gpio/hi6220_gpio.c
new file mode 100644
index 0000000..3f41bff
--- /dev/null
+++ b/drivers/gpio/hi6220_gpio.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include <errno.h>
+
+static int hi6220_gpio_direction_input(struct udevice *dev, unsigned int gpio)
+{
+	struct gpio_bank *bank = dev_get_priv(dev);
+	u8 data;
+
+	data = readb(bank->base + HI6220_GPIO_DIR);
+	data &= ~(1 << gpio);
+	writeb(data, bank->base + HI6220_GPIO_DIR);
+
+	return 0;
+}
+
+static int hi6220_gpio_set_value(struct udevice *dev, unsigned gpio,
+				  int value)
+{
+	struct gpio_bank *bank = dev_get_priv(dev);
+
+	writeb(!!value << gpio, bank->base + (BIT(gpio + 2)));
+	return 0;
+}
+
+static int hi6220_gpio_direction_output(struct udevice *dev, unsigned gpio,
+					int value)
+{
+	struct gpio_bank *bank = dev_get_priv(dev);
+	u8 data;
+
+	data = readb(bank->base + HI6220_GPIO_DIR);
+	data |= 1 << gpio;
+	writeb(data, bank->base + HI6220_GPIO_DIR);
+
+	hi6220_gpio_set_value(dev, gpio, value);
+
+	return 0;
+}
+
+static int hi6220_gpio_get_value(struct udevice *dev, unsigned gpio)
+{
+	struct gpio_bank *bank = dev_get_priv(dev);
+
+	return !!readb(bank->base + (BIT(gpio + 2)));
+}
+
+
+
+static const struct dm_gpio_ops gpio_hi6220_ops = {
+	.direction_input	= hi6220_gpio_direction_input,
+	.direction_output	= hi6220_gpio_direction_output,
+	.get_value		= hi6220_gpio_get_value,
+	.set_value		= hi6220_gpio_set_value,
+};
+
+static int hi6220_gpio_probe(struct udevice *dev)
+{
+	struct gpio_bank *bank = dev_get_priv(dev);
+	struct hikey_gpio_platdata *plat = dev_get_platdata(dev);
+	struct gpio_dev_priv *uc_priv = dev->uclass_priv;
+	char name[18], *str;
+
+	sprintf(name, "GPIO%d_", plat->bank_index);
+
+	str = strdup(name);
+	if (!str)
+		return -ENOMEM;
+
+	uc_priv->bank_name = str;
+	uc_priv->gpio_count = HI6220_GPIO_PER_BANK;
+
+	bank->base = (u8 *)plat->base;
+
+	return 0;
+}
+
+U_BOOT_DRIVER(gpio_hi6220) = {
+	.name	= "gpio_hi6220",
+	.id	= UCLASS_GPIO,
+	.ops	= &gpio_hi6220_ops,
+	.probe	= hi6220_gpio_probe,
+	.priv_auto_alloc_size = sizeof(struct gpio_bank),
+};
+
+
-- 
1.9.1

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

* [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files.
  2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver Peter Griffin
@ 2015-07-08 15:57 ` Peter Griffin
  2015-07-18 14:37   ` Simon Glass
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic Peter Griffin
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

This patch adds the header files which will be used in the subsquent
board / drivers to enable support for hi6220 hikey board.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 arch/arm/include/asm/arch-hi6220/hi6220.h          | 324 +++++++++++++++++++
 .../include/asm/arch-hi6220/hi6220_regs_alwayson.h | 349 +++++++++++++++++++++
 2 files changed, 673 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220.h
 create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h

diff --git a/arch/arm/include/asm/arch-hi6220/hi6220.h b/arch/arm/include/asm/arch-hi6220/hi6220.h
new file mode 100644
index 0000000..3ddec91
--- /dev/null
+++ b/arch/arm/include/asm/arch-hi6220/hi6220.h
@@ -0,0 +1,324 @@
+/*
+ * (C) Copyright 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __HI6220_H__
+#define __HI6220_H__
+
+#include "hi6220_regs_alwayson.h"
+
+#define HI6220_MMC0_BASE			0xF723D000
+#define HI6220_MMC1_BASE			0xF723E000
+
+#define HI6220_PMUSSI_BASE			0xF8000000
+
+#define HI6220_PERI_BASE			0xF7030000
+
+#define PERI_SC_PERIPH_CTRL1			(HI6220_PERI_BASE + 0x000)
+
+#define PERI_CTRL1_ETR_AXI_CSYSREQ_N			(1 << 0)
+#define PERI_CTRL1_HIFI_INT_MASK			(1 << 1)
+#define PERI_CTRL1_HIFI_ALL_INT_MASK			(1 << 2)
+#define PERI_CTRL1_ETR_AXI_CSYSREQ_N_MSK		(1 << 16)
+#define PERI_CTRL1_HIFI_INT_MASK_MSK			(1 << 17)
+#define PERI_CTRL1_HIFI_ALL_INT_MASK_MSK		(1 << 18)
+
+
+#define PERI_SC_PERIPH_CTRL2			(HI6220_PERI_BASE + 0x004)
+
+#define PERI_CTRL2_MMC_CLK_PHASE_BYPASS_EN_MMC0		(1 << 0)
+#define PERI_CTRL2_MMC_CLK_PHASE_BYPASS_EN_MMC1		(1 << 2)
+#define PERI_CTRL2_NAND_SYS_MEM_SEL			(1 << 6)
+#define PERI_CTRL2_G3D_DDRT_AXI_SEL			(1 << 7)
+#define PERI_CTRL2_GU_MDM_BBP_TESTPIN_SEL		(1 << 8)
+#define PERI_CTRL2_CODEC_SSI_MASTER_CHECK		(1 << 9)
+#define PERI_CTRL2_FUNC_TEST_SOFT			(1 << 12)
+#define PERI_CTRL2_CSSYS_TS_ENABLE			(1 << 15)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_EMA			(1 << 16)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_EMAW			(1 << 20)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_EMAS			(1 << 22)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_RET1N			(1 << 26)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_RET2N			(1 << 27)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_PGEN			(1 << 28)
+
+#define PERI_SC_PERIPH_CTRL3			(HI6220_PERI_BASE + 0x008)
+
+#define PERI_CTRL3_HIFI_DDR_HARQMEM_ADDR		(1 << 0)
+#define PERI_CTRL3_HIFI_HARQMEMRMP_EN			(1 << 12)
+#define PERI_CTRL3_HARQMEM_SYS_MED_SEL			(1 << 13)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP1			(1 << 14)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP2			(1 << 16)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP3			(1 << 18)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP4			(1 << 20)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP5			(1 << 22)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP6			(1 << 24)
+
+#define PERI_SC_PERIPH_CTRL4			(HI6220_PERI_BASE + 0x00c)
+
+#define PERI_CTRL4_PICO_FSELV				(1 << 0)
+#define PERI_CTRL4_FPGA_EXT_PHY_SEL			(1 << 3)
+#define PERI_CTRL4_PICO_REFCLKSEL			(1 << 4)
+#define PERI_CTRL4_PICO_SIDDQ				(1 << 6)
+#define PERI_CTRL4_PICO_SUSPENDM_SLEEPM			(1 << 7)
+#define PERI_CTRL4_PICO_OGDISABLE			(1 << 8)
+#define PERI_CTRL4_PICO_COMMONONN			(1 << 9)
+#define PERI_CTRL4_PICO_VBUSVLDEXT			(1 << 10)
+#define PERI_CTRL4_PICO_VBUSVLDEXTSEL			(1 << 11)
+#define PERI_CTRL4_PICO_VATESTENB			(1 << 12)
+#define PERI_CTRL4_PICO_SUSPENDM			(1 << 14)
+#define PERI_CTRL4_PICO_SLEEPM				(1 << 15)
+#define PERI_CTRL4_BC11_C				(1 << 16)
+#define PERI_CTRL4_BC11_B				(1 << 17)
+#define PERI_CTRL4_BC11_A				(1 << 18)
+#define PERI_CTRL4_BC11_GND				(1 << 19)
+#define PERI_CTRL4_BC11_FLOAT				(1 << 20)
+#define PERI_CTRL4_OTG_PHY_SEL				(1 << 21)
+#define PERI_CTRL4_USB_OTG_SS_SCALEDOWN_MODE		(1 << 22)
+#define PERI_CTRL4_OTG_DM_PULLDOWN			(1 << 24)
+#define PERI_CTRL4_OTG_DP_PULLDOWN			(1 << 25)
+#define PERI_CTRL4_OTG_IDPULLUP				(1 << 26)
+#define PERI_CTRL4_OTG_DRVBUS				(1 << 27)
+#define PERI_CTRL4_OTG_SESSEND				(1 << 28)
+#define PERI_CTRL4_OTG_BVALID				(1 << 29)
+#define PERI_CTRL4_OTG_AVALID				(1 << 30)
+#define PERI_CTRL4_OTG_VBUSVALID			(1 << 31)
+
+#define PERI_SC_PERIPH_CTRL5			(HI6220_PERI_BASE + 0x010)
+
+#define PERI_CTRL5_USBOTG_RES_SEL			(1 << 3)
+#define PERI_CTRL5_PICOPHY_ACAENB			(1 << 4)
+#define PERI_CTRL5_PICOPHY_BC_MODE			(1 << 5)
+#define PERI_CTRL5_PICOPHY_CHRGSEL			(1 << 6)
+#define PERI_CTRL5_PICOPHY_VDATSRCEND			(1 << 7)
+#define PERI_CTRL5_PICOPHY_VDATDETENB			(1 << 8)
+#define PERI_CTRL5_PICOPHY_DCDENB			(1 << 9)
+#define PERI_CTRL5_PICOPHY_IDDIG			(1 << 10)
+#define PERI_CTRL5_DBG_MUX				(1 << 11)
+
+#define PERI_SC_PERIPH_CTRL6			(HI6220_PERI_BASE + 0x014)
+
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_EMA		(1 << 0)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_EMAW		(1 << 4)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_EMAS		(1 << 6)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_RET1N		(1 << 10)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_RET2N		(1 << 11)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_PGEN		(1 << 12)
+
+#define PERI_SC_PERIPH_CTRL8			(HI6220_PERI_BASE + 0x018)
+
+#define PERI_CTRL8_PICOPHY_TXRISETUNE0			(1 << 0)
+#define PERI_CTRL8_PICOPHY_TXPREEMPAMPTUNE0		(1 << 2)
+#define PERI_CTRL8_PICOPHY_TXRESTUNE0			(1 << 4)
+#define PERI_CTRL8_PICOPHY_TXHSSVTUNE0			(1 << 6)
+#define PERI_CTRL8_PICOPHY_COMPDISTUNE0			(1 << 8)
+#define PERI_CTRL8_PICOPHY_TXPREEMPPULSETUNE0		(1 << 11)
+#define PERI_CTRL8_PICOPHY_OTGTUNE0			(1 << 12)
+#define PERI_CTRL8_PICOPHY_SQRXTUNE0			(1 << 16)
+#define PERI_CTRL8_PICOPHY_TXVREFTUNE0			(1 << 20)
+#define PERI_CTRL8_PICOPHY_TXFSLSTUNE0			(1 << 28)
+
+#define PERI_SC_PERIPH_CTRL9			(HI6220_PERI_BASE + 0x01c)
+
+#define PERI_CTRL9_PICOPLY_TESTCLKEN			(1 << 0)
+#define PERI_CTRL9_PICOPLY_TESTDATAOUTSEL		(1 << 1)
+#define PERI_CTRL9_PICOPLY_TESTADDR			(1 << 4)
+#define PERI_CTRL9_PICOPLY_TESTDATAIN			(1 << 8)
+
+#define PERI_SC_PERIPH_CTRL10			(HI6220_PERI_BASE + 0x020)
+#define PERI_SC_PERIPH_CTRL12			(HI6220_PERI_BASE + 0x024)
+#define PERI_SC_PERIPH_CTRL13			(HI6220_PERI_BASE + 0x028)
+#define PERI_SC_PERIPH_CTRL14			(HI6220_PERI_BASE + 0x02c)
+
+#define PERI_SC_DDR_CTRL0			(HI6220_PERI_BASE + 0x050)
+#define PERI_SC_PERIPH_STAT1			(HI6220_PERI_BASE + 0x094)
+
+#define PERI_SC_PERIPH_CLK0_EN			(HI6220_PERI_BASE + 0x200)
+#define PERI_SC_PERIPH_CLK0_DIS			(HI6220_PERI_BASE + 0x204)
+#define PERI_SC_PERIPH_CLK0_STAT		(HI6220_PERI_BASE + 0x208)
+
+#define PERI_CLK0_MMC0					(1 << 0)
+#define PERI_CLK0_MMC1					(1 << 1)
+#define PERI_CLK0_MMC2					(1 << 2)
+#define PERI_CLK0_NANDC					(1 << 3)
+#define PERI_CLK0_USBOTG				(1 << 4)
+#define PERI_CLK0_PICOPHY				(1 << 5)
+#define PERI_CLK0_PLL					(1 << 6)
+
+#define PERI_SC_PERIPH_CLK1_EN			(HI6220_PERI_BASE + 0x210)
+#define PERI_SC_PERIPH_CLK1_DIS			(HI6220_PERI_BASE + 0x214)
+#define PERI_SC_PERIPH_CLK1_STAT		(HI6220_PERI_BASE + 0x218)
+
+#define PERI_CLK1_HIFI					(1 << 0)
+#define PERI_CLK1_DIGACODEC				(1 << 5)
+
+
+#define PERI_SC_PERIPH_CLK2_EN			(HI6220_PERI_BASE + 0x220)
+#define PERI_SC_PERIPH_CLK2_DIS			(HI6220_PERI_BASE + 0x224)
+#define PERI_SC_PERIPH_CLK2_STAT		(HI6220_PERI_BASE + 0x228)
+
+#define PERI_CLK2_IPF					(1 << 0)
+#define PERI_CLK2_SOCP					(1 << 1)
+#define PERI_CLK2_DMAC					(1 << 2)
+#define PERI_CLK2_SECENG				(1 << 3)
+#define PERI_CLK2_HPM0					(1 << 5)
+#define PERI_CLK2_HPM1					(1 << 6)
+#define PERI_CLK2_HPM2					(1 << 7)
+#define PERI_CLK2_HPM3					(1 << 8)
+
+
+#define PERI_SC_PERIPH_CLK3_EN			(HI6220_PERI_BASE + 0x230)
+#define PERI_SC_PERIPH_CLK3_DIS			(HI6220_PERI_BASE + 0x234)
+#define PERI_SC_PERIPH_CLK3_STAT		(HI6220_PERI_BASE + 0x238)
+
+
+
+
+#define PERI_SC_PERIPH_CLK8_EN			(HI6220_PERI_BASE + 0x240)
+#define PERI_SC_PERIPH_CLK8_DIS			(HI6220_PERI_BASE + 0x244)
+#define PERI_SC_PERIPH_CLK8_STAT		(HI6220_PERI_BASE + 0x248)
+
+#define PERI_CLK8_RS0					(1 << 0)
+#define PERI_CLK8_RS2					(1 << 1)
+#define PERI_CLK8_RS3					(1 << 2)
+#define PERI_CLK8_MS0					(1 << 3)
+#define PERI_CLK8_MS2					(1 << 5)
+#define PERI_CLK8_XG2RAM0				(1 << 6)
+#define PERI_CLK8_X2SRAM				(1 << 7)
+#define PERI_CLK8_SRAM					(1 << 8)
+#define PERI_CLK8_ROM					(1 << 9)
+#define PERI_CLK8_HARQ					(1 << 10)
+#define PERI_CLK8_MMU					(1 << 11)
+#define PERI_CLK8_DDRC					(1 << 12)
+#define PERI_CLK8_DDRPHY				(1 << 13)
+#define PERI_CLK8_DDRPHY_REF				(1 << 14)
+#define PERI_CLK8_X2X_SYSNOC				(1 << 15)
+#define PERI_CLK8_X2X_CCPU				(1 << 16)
+#define PERI_CLK8_DDRT					(1 << 17)
+#define PERI_CLK8_DDRPACK_RS				(1 << 18)
+
+
+#define PERI_SC_PERIPH_CLK9_EN			(HI6220_PERI_BASE + 0x250)
+#define PERI_SC_PERIPH_CLK9_DIS			(HI6220_PERI_BASE + 0x254)
+#define PERI_SC_PERIPH_CLK9_STAT		(HI6220_PERI_BASE + 0x258)
+
+#define PERI_CLK9_CARM_DAP				(1 << 0)
+#define PERI_CLK9_CARM_ATB				(1 << 1)
+#define PERI_CLK9_CARM_LBUS				(1 << 2)
+#define PERI_CLK9_CARM_KERNEL				(1 << 3)
+
+
+#define PERI_SC_PERIPH_CLK10_EN			(HI6220_PERI_BASE + 0x260)
+#define PERI_SC_PERIPH_CLK10_DIS		(HI6220_PERI_BASE + 0x264)
+#define PERI_SC_PERIPH_CLK10_STAT		(HI6220_PERI_BASE + 0x268)
+
+#define PERI_CLK10_IPF_CCPU				(1 << 0)
+#define PERI_CLK10_SOCP_CCPU				(1 << 1)
+#define PERI_CLK10_SECENG_CCPU				(1 << 2)
+#define PERI_CLK10_HARQ_CCPU				(1 << 3)
+#define PERI_CLK10_IPF_MCU				(1 << 16)
+#define PERI_CLK10_SOCP_MCU				(1 << 17)
+#define PERI_CLK10_SECENG_MCU				(1 << 18)
+#define PERI_CLK10_HARQ_MCU				(1 << 19)
+
+#define PERI_SC_PERIPH_CLK12_EN			(HI6220_PERI_BASE + 0x270)
+#define PERI_SC_PERIPH_CLK12_DIS		(HI6220_PERI_BASE + 0x274)
+#define PERI_SC_PERIPH_CLK12_STAT		(HI6220_PERI_BASE + 0x278)
+
+#define PERI_CLK12_HIFI_SRC				(1 << 0)
+#define PERI_CLK12_MMC0_SRC				(1 << 1)
+#define PERI_CLK12_MMC1_SRC				(1 << 2)
+#define PERI_CLK12_MMC2_SRC				(1 << 3)
+#define PERI_CLK12_SYSPLL_DIV				(1 << 4)
+#define PERI_CLK12_TPIU_SRC				(1 << 5)
+#define PERI_CLK12_MMC0_HF				(1 << 6)
+#define PERI_CLK12_MMC1_HF				(1 << 7)
+#define PERI_CLK12_PLL_TEST_SRC				(1 << 8)
+#define PERI_CLK12_CODEC_SOC				(1 << 9)
+#define PERI_CLK12_MEDIA				(1 << 10)
+
+#define PERI_SC_PERIPH_RST0_EN			(HI6220_PERI_BASE + 0x300)
+#define PERI_SC_PERIPH_RST0_DIS			(HI6220_PERI_BASE + 0x304)
+#define PERI_SC_PERIPH_RST0_STAT		(HI6220_PERI_BASE + 0x308)
+
+#define PERI_RST0_MMC0					(1 << 0)
+#define PERI_RST0_MMC1					(1 << 1)
+#define PERI_RST0_MMC2					(1 << 2)
+#define PERI_RST0_NANDC					(1 << 3)
+#define PERI_RST0_USBOTG_BUS				(1 << 4)
+#define PERI_RST0_POR_PICOPHY				(1 << 5)
+#define PERI_RST0_USBOTG				(1 << 6)
+#define PERI_RST0_USBOTG_32K				(1 << 7)
+
+
+#define PERI_SC_PERIPH_RST1_EN			(HI6220_PERI_BASE + 0x310)
+#define PERI_SC_PERIPH_RST1_DIS			(HI6220_PERI_BASE + 0x314)
+#define PERI_SC_PERIPH_RST1_STAT		(HI6220_PERI_BASE + 0x318)
+
+#define PERI_RST1_HIFI					(1 << 0)
+#define PERI_RST1_DIGACODEC				(1 << 5)
+
+
+#define PERI_SC_PERIPH_RST2_EN			(HI6220_PERI_BASE + 0x320)
+#define PERI_SC_PERIPH_RST2_DIS			(HI6220_PERI_BASE + 0x324)
+#define PERI_SC_PERIPH_RST2_STAT		(HI6220_PERI_BASE + 0x328)
+
+#define PERI_RST2_IPF					(1 << 0)
+#define PERI_RST2_SOCP					(1 << 1)
+#define PERI_RST2_DMAC					(1 << 2)
+#define PERI_RST2_SECENG				(1 << 3)
+#define PERI_RST2_ABB					(1 << 4)
+#define PERI_RST2_HPM0					(1 << 5)
+#define PERI_RST2_HPM1					(1 << 6)
+#define PERI_RST2_HPM2					(1 << 7)
+#define PERI_RST2_HPM3					(1 << 8)
+
+
+#define PERI_SC_PERIPH_RST3_EN			(HI6220_PERI_BASE + 0x330)
+#define PERI_SC_PERIPH_RST3_DIS			(HI6220_PERI_BASE + 0x334)
+#define PERI_SC_PERIPH_RST3_STAT		(HI6220_PERI_BASE + 0x338)
+
+#define PERI_RST3_CSSYS					(1 << 0)
+#define PERI_RST3_I2C0					(1 << 1)
+#define PERI_RST3_I2C1					(1 << 2)
+#define PERI_RST3_I2C2					(1 << 3)
+#define PERI_RST3_I2C3					(1 << 4)
+#define PERI_RST3_UART1					(1 << 5)
+#define PERI_RST3_UART2					(1 << 6)
+#define PERI_RST3_UART3					(1 << 7)
+#define PERI_RST3_UART4					(1 << 8)
+#define PERI_RST3_SSP					(1 << 9)
+#define PERI_RST3_PWM					(1 << 10)
+#define PERI_RST3_BLPWM					(1 << 11)
+#define PERI_RST3_TSENSOR				(1 << 12)
+#define PERI_RST3_DAPB					(1 << 18)
+#define PERI_RST3_HKADC					(1 << 19)
+#define PERI_RST3_CODEC					(1 << 20)
+
+
+#define PERI_SC_PERIPH_RST8_EN			(HI6220_PERI_BASE + 0x340)
+#define PERI_SC_PERIPH_RST8_DIS			(HI6220_PERI_BASE + 0x344)
+#define PERI_SC_PERIPH_RST8_STAT		(HI6220_PERI_BASE + 0x338)
+
+#define PERI_RST8_RS0					(1 << 0)
+#define PERI_RST8_RS2					(1 << 1)
+#define PERI_RST8_RS3					(1 << 2)
+#define PERI_RST8_MS0					(1 << 3)
+#define PERI_RST8_MS2					(1 << 5)
+#define PERI_RST8_XG2RAM0				(1 << 6)
+#define PERI_RST8_X2SRAM_TZMA				(1 << 7)
+#define PERI_RST8_SRAM					(1 << 8)
+#define PERI_RST8_HARQ					(1 << 10)
+#define PERI_RST8_DDRC					(1 << 12)
+#define PERI_RST8_DDRC_APB				(1 << 13)
+#define PERI_RST8_DDRPACK_APB				(1 << 14)
+#define PERI_RST8_DDRT					(1 << 17)
+
+#define PERI_SC_CLK0_SEL			(HI6220_PERI_BASE + 0x400)
+#define PERI_SC_CLKCFG8BIT1			(HI6220_PERI_BASE + 0x494)
+#define PERI_SC_CLKCFG8BIT2			(HI6220_PERI_BASE + 0x498)
+#define PERI_SC_RESERVED8_ADDR			(HI6220_PERI_BASE + 0xd04)
+
+#endif /*__HI62220_H__*/
diff --git a/arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h b/arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h
new file mode 100644
index 0000000..3f0205a
--- /dev/null
+++ b/arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h
@@ -0,0 +1,349 @@
+/*
+ * (C) Copyright 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __HI6220_ALWAYSON_H__
+#define __HI6220_ALWAYSON_H__
+
+#define ALWAYSON_CTRL_BASE			0xF7800000
+
+#define ALWAYSON_SC_SYS_CTRL0			(ALWAYSON_CTRL_BASE + 0x000)
+
+#define ALWAYSON_SC_SYS_CTRL0_MODE_NORMAL			0x004
+#define ALWAYSON_SC_SYS_CTRL0_MODE_MASK				0x007
+
+#define ALWAYSON_SC_SYS_CTRL1			(ALWAYSON_CTRL_BASE + 0x004)
+
+#define ALWAYSON_SC_SYS_CTRL1_AARM_WD_RST_CFG			(1 << 0)
+#define ALWAYSON_SC_SYS_CTRL1_REMAP_SRAM_AARM			(1 << 1)
+#define ALWAYSON_SC_SYS_CTRL1_EFUSEC_REMAP			(1 << 2)
+#define ALWAYSON_SC_SYS_CTRL1_EXT_PLL_SEL			(1 << 3)
+#define ALWAYSON_SC_SYS_CTRL1_MCU_WDG0_RSTMCU_CFG		(1 << 4)
+#define ALWAYSON_SC_SYS_CTRL1_USIM0_HPD_DE_BOUNCE_CFG		(1 << 6)
+#define ALWAYSON_SC_SYS_CTRL1_USIM0_HPD_OE_CFG			(1 << 7)
+#define ALWAYSON_SC_SYS_CTRL1_USIM1_HPD_DE_BOUNCE_CFG		(1 << 8)
+#define ALWAYSON_SC_SYS_CTRL1_USIM1_HPD_OE_CFG			(1 << 9)
+#define ALWAYSON_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG		(1 << 10)
+#define ALWAYSON_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG1		(1 << 11)
+#define ALWAYSON_SC_SYS_CTRL1_USIM0_HPD_OE_SFT			(1 << 12)
+#define ALWAYSON_SC_SYS_CTRL1_USIM1_HPD_OE_SFT			(1 << 13)
+#define ALWAYSON_SC_SYS_CTRL1_MCU_CLKEN_HARDCFG			(1 << 15)
+#define ALWAYSON_SC_SYS_CTRL1_AARM_WD_RST_CFG_MSK		(1 << 16)
+#define ALWAYSON_SC_SYS_CTRL1_REMAP_SRAM_AARM_MSK		(1 << 17)
+#define ALWAYSON_SC_SYS_CTRL1_EFUSEC_REMAP_MSK			(1 << 18)
+#define ALWAYSON_SC_SYS_CTRL1_EXT_PLL_SEL_MSK			(1 << 19)
+#define ALWAYSON_SC_SYS_CTRL1_MCU_WDG0_RSTMCU_CFG_MSK		(1 << 20)
+#define ALWAYSON_SC_SYS_CTRL1_USIM0_HPD_DE_BOUNCE_CFG_MSK	(1 << 22)
+#define ALWAYSON_SC_SYS_CTRL1_USIM0_HPD_OE_CFG_MSK		(1 << 23)
+#define ALWAYSON_SC_SYS_CTRL1_USIM1_HPD_DE_BOUNCE_CFG_MSK	(1 << 24)
+#define ALWAYSON_SC_SYS_CTRL1_USIM1_HPD_OE_CFG_MSK		(1 << 25)
+#define ALWAYSON_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG_MSK		(1 << 26)
+#define ALWAYSON_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG1_MSK		(1 << 27)
+#define ALWAYSON_SC_SYS_CTRL1_USIM0_HPD_OE_SFT_MSK		(1 << 28)
+#define ALWAYSON_SC_SYS_CTRL1_USIM1_HPD_OE_SFT_MSK		(1 << 29)
+#define ALWAYSON_SC_SYS_CTRL1_MCU_CLKEN_HARDCFG_MSK		(1 << 31)
+
+#define ALWAYSON_SC_SYS_CTRL2			(ALWAYSON_CTRL_BASE + 0x008)
+
+#define ALWAYSON_SC_SYS_CTRL2_MCU_SFT_RST_STAT_CLEAR		(1 << 26)
+#define ALWAYSON_SC_SYS_CTRL2_MCU_WDG0_RST_STAT_CLEAR		(1 << 27)
+#define ALWAYSON_SC_SYS_CTRL2_TSENSOR_RST_STAT_CLEAR		(1 << 28)
+#define ALWAYSON_SC_SYS_CTRL2_ACPU_WDG_RST_STAT_CLEAR		(1 << 29)
+#define ALWAYSON_SC_SYS_CTRL2_MCU_WDG1_RST_STAT_CLEAR		(1 << 30)
+#define ALWAYSON_SC_SYS_CTRL2_GLB_SRST_STAT_CLEAR		(1 << 31)
+
+#define ALWAYSON_SC_SYS_STAT0			(ALWAYSON_CTRL_BASE + 0x010)
+
+#define ALWAYSON_SC_SYS_STAT0_MCU_RST_STAT			(1 << 25)
+#define ALWAYSON_SC_SYS_STAT0_MCU_SOFTRST_STAT			(1 << 26)
+#define ALWAYSON_SC_SYS_STAT0_MCU_WDGRST_STAT			(1 << 27)
+#define ALWAYSON_SC_SYS_STAT0_TSENSOR_HARDRST_STAT		(1 << 28)
+#define ALWAYSON_SC_SYS_STAT0_ACPU_WD_GLB_RST_STAT		(1 << 29)
+#define ALWAYSON_SC_SYS_STAT0_CM3_WDG1_RST_STAT			(1 << 30)
+#define ALWAYSON_SC_SYS_STAT0_GLB_SRST_STAT			(1 << 31)
+
+#define ALWAYSON_SC_SYS_STAT1			(ALWAYSON_CTRL_BASE + 0x014)
+
+#define ALWAYSON_SC_SYS_STAT1_MODE_STATUS			(1 << 0)
+#define ALWAYSON_SC_SYS_STAT1_BOOT_SEL_LOCK			(1 << 16)
+#define ALWAYSON_SC_SYS_STAT1_FUNC_MODE_LOCK			(1 << 17)
+#define ALWAYSON_SC_SYS_STAT1_BOOT_MODE_LOCK			(1 << 19)
+#define ALWAYSON_SC_SYS_STAT1_FUN_JTAG_MODE_OUT			(1 << 20)
+#define ALWAYSON_SC_SYS_STAT1_SECURITY_BOOT_FLG			(1 << 27)
+#define ALWAYSON_SC_SYS_STAT1_EFUSE_NANDBOOT_MSK		(1 << 28)
+#define ALWAYSON_SC_SYS_STAT1_EFUSE_NAND_BITWIDE		(1 << 29)
+
+#define ALWAYSON_SC_MCU_IMCTRL			(ALWAYSON_CTRL_BASE + 0x018)
+#define ALWAYSON_SC_MCU_IMSTAT			(ALWAYSON_CTRL_BASE + 0x01C)
+#define ALWAYSON_SC_SECONDRY_INT_EN0		(ALWAYSON_CTRL_BASE + 0x044)
+#define ALWAYSON_SC_SECONDRY_INT_STATR0		(ALWAYSON_CTRL_BASE + 0x048)
+#define ALWAYSON_SC_SECONDRY_INT_STATM0		(ALWAYSON_CTRL_BASE + 0x04C)
+#define ALWAYSON_SC_MCU_WKUP_INT_EN6		(ALWAYSON_CTRL_BASE + 0x054)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATR6		(ALWAYSON_CTRL_BASE + 0x058)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATM6		(ALWAYSON_CTRL_BASE + 0x05C)
+#define ALWAYSON_SC_MCU_WKUP_INT_EN5		(ALWAYSON_CTRL_BASE + 0x064)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATR5		(ALWAYSON_CTRL_BASE + 0x068)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATM5		(ALWAYSON_CTRL_BASE + 0x06C)
+#define ALWAYSON_SC_MCU_WKUP_INT_EN4		(ALWAYSON_CTRL_BASE + 0x094)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATR4		(ALWAYSON_CTRL_BASE + 0x098)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATM4		(ALWAYSON_CTRL_BASE + 0x09C)
+#define ALWAYSON_SC_MCU_WKUP_INT_EN0		(ALWAYSON_CTRL_BASE + 0x0A8)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATR0		(ALWAYSON_CTRL_BASE + 0x0AC)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATM0		(ALWAYSON_CTRL_BASE + 0x0B0)
+#define ALWAYSON_SC_MCU_WKUP_INT_EN1		(ALWAYSON_CTRL_BASE + 0x0B4)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATR1		(ALWAYSON_CTRL_BASE + 0x0B8)
+#define ALWAYSON_SC_MCU_WKUP_INT_STATM1		(ALWAYSON_CTRL_BASE + 0x0BC)
+#define ALWAYSON_SC_INT_STATR			(ALWAYSON_CTRL_BASE + 0x0C4)
+#define ALWAYSON_SC_INT_STATM			(ALWAYSON_CTRL_BASE + 0x0C8)
+#define ALWAYSON_SC_INT_CLEAR			(ALWAYSON_CTRL_BASE + 0x0CC)
+#define ALWAYSON_SC_INT_EN_SET			(ALWAYSON_CTRL_BASE + 0x0D0)
+#define ALWAYSON_SC_INT_EN_DIS			(ALWAYSON_CTRL_BASE + 0x0D4)
+#define ALWAYSON_SC_INT_EN_STAT			(ALWAYSON_CTRL_BASE + 0x0D8)
+#define ALWAYSON_SC_INT_STATR1			(ALWAYSON_CTRL_BASE + 0x0E4)
+#define ALWAYSON_SC_INT_STATM1			(ALWAYSON_CTRL_BASE + 0x0E8)
+#define ALWAYSON_SC_INT_CLEAR1			(ALWAYSON_CTRL_BASE + 0x0EC)
+#define ALWAYSON_SC_INT_EN_SET1			(ALWAYSON_CTRL_BASE + 0x0F0)
+#define ALWAYSON_SC_INT_EN_DIS1			(ALWAYSON_CTRL_BASE + 0x0F4)
+#define ALWAYSON_SC_INT_EN_STAT1		(ALWAYSON_CTRL_BASE + 0x0F8)
+#define ALWAYSON_SC_TIMER_EN0			(ALWAYSON_CTRL_BASE + 0x1D0)
+#define ALWAYSON_SC_TIMER_EN1			(ALWAYSON_CTRL_BASE + 0x1D4)
+#define ALWAYSON_SC_TIMER_EN4			(ALWAYSON_CTRL_BASE + 0x1F0)
+#define ALWAYSON_SC_TIMER_EN5			(ALWAYSON_CTRL_BASE + 0x1F4)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL0		(ALWAYSON_CTRL_BASE + 0x400)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL1		(ALWAYSON_CTRL_BASE + 0x404)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL2		(ALWAYSON_CTRL_BASE + 0x408)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3		(ALWAYSON_CTRL_BASE + 0x40C)
+
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_3			0x003
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_MASK			0x007
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_CSSYS_CTRL_PROT		(1 << 3)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_TCXO_AFC_OEN_CRG		(1 << 4)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_AOB_IO_SEL18_USIM1		(1 << 8)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_AOB_IO_SEL18_USIM0		(1 << 9)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_AOB_IO_SEL18_SD		(1 << 10)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL3_MCU_SUBSYS_CTRL3_RESERVED	(1 << 11)
+
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL4		(ALWAYSON_CTRL_BASE + 0x410)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL5		(ALWAYSON_CTRL_BASE + 0x414)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL6		(ALWAYSON_CTRL_BASE + 0x418)
+#define ALWAYSON_SC_MCU_SUBSYS_CTRL7		(ALWAYSON_CTRL_BASE + 0x41C)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT0		(ALWAYSON_CTRL_BASE + 0x440)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT1		(ALWAYSON_CTRL_BASE + 0x444)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT2		(ALWAYSON_CTRL_BASE + 0x448)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT3		(ALWAYSON_CTRL_BASE + 0x44C)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT4		(ALWAYSON_CTRL_BASE + 0x450)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT5		(ALWAYSON_CTRL_BASE + 0x454)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT6		(ALWAYSON_CTRL_BASE + 0x458)
+#define ALWAYSON_SC_MCU_SUBSYS_STAT7		(ALWAYSON_CTRL_BASE + 0x45C)
+
+#define ALWAYSON_SC_PERIPH_CLK4_EN		(ALWAYSON_CTRL_BASE + 0x630)
+
+#define ALWAYSON_SC_PERIPH_CLK4_EN_HCLK_MCU			(1 << 0)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_MCU_DAP			(1 << 3)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_CM3_TIMER0		(1 << 4)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_CM3_TIMER1		(1 << 5)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_CM3_WDT0		(1 << 6)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_CM3_WDT1		(1 << 7)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_HCLK_IPC_S			(1 << 8)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_HCLK_IPC_NS			(1 << 9)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_EFUSEC			(1 << 10)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TZPC			(1 << 11)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_WDT0			(1 << 12)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_WDT1			(1 << 13)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_WDT2			(1 << 14)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER0			(1 << 15)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER1			(1 << 16)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER2			(1 << 17)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER3			(1 << 18)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER4			(1 << 19)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER5			(1 << 20)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER6			(1 << 21)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER7			(1 << 22)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_TIMER8			(1 << 23)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_UART0			(1 << 24)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_RTC0			(1 << 25)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_RTC1			(1 << 26)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_PMUSSI			(1 << 27)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_JTAG_AUTH		(1 << 28)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_CS_DAPB_ON		(1 << 29)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_PDM			(1 << 30)
+#define ALWAYSON_SC_PERIPH_CLK4_EN_CLK_SSI_PAD			(1 << 31)
+
+#define ALWAYSON_SC_PERIPH_CLK4_DIS		(ALWAYSON_CTRL_BASE + 0x634)
+#define ALWAYSON_SC_PERIPH_CLK4_STAT		(ALWAYSON_CTRL_BASE + 0x638)
+
+#define ALWAYSON_SC_PERIPH_CLK5_EN		(ALWAYSON_CTRL_BASE + 0x63C)
+
+#define ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_CCPU		(1 << 0)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_EFUSEC_CCPU		(1 << 1)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_HCLK_IPC_CCPU		(1 << 2)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_HCLK_IPC_NS_CCPU		(1 << 3)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_MCU		(1 << 16)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_EFUSEC_MCU		(1 << 17)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_HCLK_IPC_MCU			(1 << 18)
+#define ALWAYSON_SC_PERIPH_CLK5_EN_HCLK_IPC_NS_MCU		(1 << 19)
+
+#define ALWAYSON_SC_PERIPH_CLK5_DIS		(ALWAYSON_CTRL_BASE + 0x640)
+#define ALWAYSON_SC_PERIPH_CLK5_STAT		(ALWAYSON_CTRL_BASE + 0x644)
+
+#define ALWAYSON_SC_PERIPH_RST4_EN		(ALWAYSON_CTRL_BASE + 0x6F0)
+#define ALWAYSON_SC_PERIPH_RST4_DIS		(ALWAYSON_CTRL_BASE + 0x6F4)
+
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_MCU_ECTR_N		(1 << 0)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_MCU_SYS_N		(1 << 1)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_MCU_POR_N		(1 << 2)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_MCU_DAP_N		(1 << 3)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_CM3_TIMER0_N		(1 << 4)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_CM3_TIMER1_N		(1 << 5)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_CM3_WDT0_N		(1 << 6)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_CM3_WDT1_N		(1 << 7)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_HRESET_IPC_S_N		(1 << 8)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_HRESET_IPC_NS_N		(1 << 9)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_EFUSEC_N		(1 << 10)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_WDT0_N		(1 << 12)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_WDT1_N		(1 << 13)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_WDT2_N		(1 << 14)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER0_N		(1 << 15)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER1_N		(1 << 16)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER2_N		(1 << 17)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER3_N		(1 << 18)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER4_N		(1 << 19)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER5_N		(1 << 20)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER6_N		(1 << 21)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER7_N		(1 << 22)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_TIMER8_N		(1 << 23)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_UART0_N		(1 << 24)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_RTC0_N		(1 << 25)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_RTC1_N		(1 << 26)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N		(1 << 27)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_JTAG_AUTH_N		(1 << 28)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_RESET_CS_DAPB_ON_N		(1 << 29)
+#define ALWAYSON_SC_PERIPH_RST4_DIS_MDM_SUBSYS_GLB		(1 << 30)
+
+#define ALWAYSON_SC_PERIPH_RST4_STAT		(ALWAYSON_CTRL_BASE + 0x6F8)
+
+#define ALWAYSON_SC_PERIPH_RST5_EN		(ALWAYSON_CTRL_BASE + 0x6FC)
+#define ALWAYSON_SC_PERIPH_RST5_DIS		(ALWAYSON_CTRL_BASE + 0x700)
+#define ALWAYSON_SC_PERIPH_RST5_STAT		(ALWAYSON_CTRL_BASE + 0x704)
+
+#define ALWAYSON_SC_PW_CLK0_EN			(ALWAYSON_CTRL_BASE + 0x800)
+#define ALWAYSON_SC_PW_CLK0_DIS			(ALWAYSON_CTRL_BASE + 0x804)
+#define ALWAYSON_SC_PW_CLK0_STAT		(ALWAYSON_CTRL_BASE + 0x808)
+
+#define ALWAYSON_SC_PW_RST0_EN			(ALWAYSON_CTRL_BASE + 0x810)
+#define ALWAYSON_SC_PW_RST0_DIS			(ALWAYSON_CTRL_BASE + 0x814)
+#define ALWAYSON_SC_PW_RST0_STAT0		(ALWAYSON_CTRL_BASE + 0x818)
+
+#define ALWAYSON_SC_PW_ISOEN0			(ALWAYSON_CTRL_BASE + 0x820)
+#define ALWAYSON_SC_PW_ISODIS0			(ALWAYSON_CTRL_BASE + 0x824)
+#define ALWAYSON_SC_PW_ISO_STAT0		(ALWAYSON_CTRL_BASE + 0x828)
+#define ALWAYSON_SC_PW_MTCMOS_EN0		(ALWAYSON_CTRL_BASE + 0x830)
+#define ALWAYSON_SC_PW_MTCMOS_DIS0		(ALWAYSON_CTRL_BASE + 0x834)
+#define ALWAYSON_SC_PW_MTCMOS_STAT0		(ALWAYSON_CTRL_BASE + 0x838)
+#define ALWAYSON_SC_PW_MTCMOS_ACK_STAT0		(ALWAYSON_CTRL_BASE + 0x83C)
+#define ALWAYSON_SC_PW_MTCMOS_TIMEOUT_STAT0	(ALWAYSON_CTRL_BASE + 0x840)
+#define ALWAYSON_SC_PW_STAT0			(ALWAYSON_CTRL_BASE + 0x850)
+#define ALWAYSON_SC_PW_STAT1			(ALWAYSON_CTRL_BASE + 0x854)
+#define ALWAYSON_SC_SYSTEST_STAT		(ALWAYSON_CTRL_BASE + 0x880)
+#define ALWAYSON_SC_SYSTEST_SLICER_CNT0		(ALWAYSON_CTRL_BASE + 0x890)
+#define ALWAYSON_SC_SYSTEST_SLICER_CNT1		(ALWAYSON_CTRL_BASE + 0x894)
+#define ALWAYSON_SC_PW_CTRL1			(ALWAYSON_CTRL_BASE + 0x8C8)
+#define ALWAYSON_SC_PW_CTRL			(ALWAYSON_CTRL_BASE + 0x8CC)
+#define ALWAYSON_SC_MCPU_VOTEEN			(ALWAYSON_CTRL_BASE + 0x8D0)
+#define ALWAYSON_SC_MCPU_VOTEDIS		(ALWAYSON_CTRL_BASE + 0x8D4)
+#define ALWAYSON_SC_MCPU_VOTESTAT		(ALWAYSON_CTRL_BASE + 0x8D8)
+#define ALWAYSON_SC_MCPU_VOTE_MSK0		(ALWAYSON_CTRL_BASE + 0x8E0)
+#define ALWAYSON_SC_MCPU_VOTE_MSK1		(ALWAYSON_CTRL_BASE + 0x8E4)
+#define ALWAYSON_SC_MCPU_VOTESTAT0_MSK		(ALWAYSON_CTRL_BASE + 0x8E8)
+#define ALWAYSON_SC_MCPU_VOTESTAT1_MSK		(ALWAYSON_CTRL_BASE + 0x8EC)
+#define ALWAYSON_SC_PERI_VOTEEN			(ALWAYSON_CTRL_BASE + 0x8F0)
+#define ALWAYSON_SC_PERI_VOTEDIS		(ALWAYSON_CTRL_BASE + 0x8F4)
+#define ALWAYSON_SC_PERI_VOTESTAT		(ALWAYSON_CTRL_BASE + 0x8F8)
+#define ALWAYSON_SC_PERI_VOTE_MSK0		(ALWAYSON_CTRL_BASE + 0x900)
+#define ALWAYSON_SC_PERI_VOTE_MSK1		(ALWAYSON_CTRL_BASE + 0x904)
+#define ALWAYSON_SC_PERI_VOTESTAT0_MSK		(ALWAYSON_CTRL_BASE + 0x908)
+#define ALWAYSON_SC_PERI_VOTESTAT1_MSK		(ALWAYSON_CTRL_BASE + 0x90C)
+#define ALWAYSON_SC_ACPU_VOTEEN			(ALWAYSON_CTRL_BASE + 0x910)
+#define ALWAYSON_SC_ACPU_VOTEDIS		(ALWAYSON_CTRL_BASE + 0x914)
+#define ALWAYSON_SC_ACPU_VOTESTAT		(ALWAYSON_CTRL_BASE + 0x918)
+#define ALWAYSON_SC_ACPU_VOTE_MSK0		(ALWAYSON_CTRL_BASE + 0x920)
+#define ALWAYSON_SC_ACPU_VOTE_MSK1		(ALWAYSON_CTRL_BASE + 0x924)
+#define ALWAYSON_SC_ACPU_VOTESTAT0_MSK		(ALWAYSON_CTRL_BASE + 0x928)
+#define ALWAYSON_SC_ACPU_VOTESTAT1_MSK		(ALWAYSON_CTRL_BASE + 0x92C)
+#define ALWAYSON_SC_MCU_VOTEEN			(ALWAYSON_CTRL_BASE + 0x930)
+#define ALWAYSON_SC_MCU_VOTEDIS			(ALWAYSON_CTRL_BASE + 0x934)
+#define ALWAYSON_SC_MCU_VOTESTAT		(ALWAYSON_CTRL_BASE + 0x938)
+#define ALWAYSON_SC_MCU_VOTE_MSK0		(ALWAYSON_CTRL_BASE + 0x940)
+#define ALWAYSON_SC_MCU_VOTE_MSK1		(ALWAYSON_CTRL_BASE + 0x944)
+#define ALWAYSON_SC_MCU_VOTESTAT0_MSK		(ALWAYSON_CTRL_BASE + 0x948)
+#define ALWAYSON_SC_MCU_VOTESTAT1_MSK		(ALWAYSON_CTRL_BASE + 0x94C)
+#define ALWAYSON_SC_MCU_VOTE1EN			(ALWAYSON_CTRL_BASE + 0x960)
+#define ALWAYSON_SC_MCU_VOTE1DIS		(ALWAYSON_CTRL_BASE + 0x964)
+#define ALWAYSON_SC_MCU_VOTE1STAT		(ALWAYSON_CTRL_BASE + 0x968)
+#define ALWAYSON_SC_MCU_VOTE1_MSK0		(ALWAYSON_CTRL_BASE + 0x970)
+#define ALWAYSON_SC_MCU_VOTE1_MSK1		(ALWAYSON_CTRL_BASE + 0x974)
+#define ALWAYSON_SC_MCU_VOTE1STAT0_MSK		(ALWAYSON_CTRL_BASE + 0x978)
+#define ALWAYSON_SC_MCU_VOTE1STAT1_MSK		(ALWAYSON_CTRL_BASE + 0x97C)
+#define ALWAYSON_SC_MCU_VOTE2EN			(ALWAYSON_CTRL_BASE + 0x980)
+#define ALWAYSON_SC_MCU_VOTE2DIS		(ALWAYSON_CTRL_BASE + 0x984)
+#define ALWAYSON_SC_MCU_VOTE2STAT		(ALWAYSON_CTRL_BASE + 0x988)
+#define ALWAYSON_SC_MCU_VOTE2_MSK0		(ALWAYSON_CTRL_BASE + 0x990)
+#define ALWAYSON_SC_MCU_VOTE2_MSK1		(ALWAYSON_CTRL_BASE + 0x994)
+#define ALWAYSON_SC_MCU_VOTE2STAT0_MSK		(ALWAYSON_CTRL_BASE + 0x998)
+#define ALWAYSON_SC_MCU_VOTE2STAT1_MSK		(ALWAYSON_CTRL_BASE + 0x99C)
+#define ALWAYSON_SC_VOTE_CTRL			(ALWAYSON_CTRL_BASE + 0x9A0)
+#define ALWAYSON_SC_VOTE_STAT			(ALWAYSON_CTRL_BASE + 0x9A4)
+#define ALWAYSON_SC_ECONUM			(ALWAYSON_CTRL_BASE + 0xF00)
+#define ALWAYSON_SCCHIPID			(ALWAYSON_CTRL_BASE + 0xF10)
+#define ALWAYSON_SCSOCID			(ALWAYSON_CTRL_BASE + 0xF1C)
+#define ALWAYSON_SC_SOC_FPGA_RTL_DEF		(ALWAYSON_CTRL_BASE + 0xFE0)
+#define ALWAYSON_SC_SOC_FPGA_PR_DEF		(ALWAYSON_CTRL_BASE + 0xFE4)
+#define ALWAYSON_SC_SOC_FPGA_RES_DEF0		(ALWAYSON_CTRL_BASE + 0xFE8)
+#define ALWAYSON_SC_SOC_FPGA_RES_DEF1		(ALWAYSON_CTRL_BASE + 0xFEC)
+#define ALWAYSON_SC_XTAL_CTRL0			(ALWAYSON_CTRL_BASE + 0x102)
+#define ALWAYSON_SC_XTAL_CTRL1			(ALWAYSON_CTRL_BASE + 0x102)
+#define ALWAYSON_SC_XTAL_CTRL3			(ALWAYSON_CTRL_BASE + 0x103)
+#define ALWAYSON_SC_XTAL_CTRL5			(ALWAYSON_CTRL_BASE + 0x103)
+#define ALWAYSON_SC_XTAL_STAT0			(ALWAYSON_CTRL_BASE + 0x106)
+#define ALWAYSON_SC_XTAL_STAT1			(ALWAYSON_CTRL_BASE + 0x107)
+#define ALWAYSON_SC_EFUSE_CHIPID0		(ALWAYSON_CTRL_BASE + 0x108)
+#define ALWAYSON_SC_EFUSE_CHIPID1		(ALWAYSON_CTRL_BASE + 0x108)
+#define ALWAYSON_SC_EFUSE_SYS_CTRL		(ALWAYSON_CTRL_BASE + 0x108)
+#define ALWAYSON_SC_DEBUG_CTRL1			(ALWAYSON_CTRL_BASE + 0x128)
+#define ALWAYSON_SC_DBG_STAT			(ALWAYSON_CTRL_BASE + 0x12B)
+#define ALWAYSON_SC_ARM_DBG_KEY0		(ALWAYSON_CTRL_BASE + 0x12B)
+#define ALWAYSON_SC_RESERVED31			(ALWAYSON_CTRL_BASE + 0x13A)
+#define ALWAYSON_SC_RESERVED32			(ALWAYSON_CTRL_BASE + 0x13A)
+#define ALWAYSON_SC_RESERVED33			(ALWAYSON_CTRL_BASE + 0x13A)
+#define ALWAYSON_SC_RESERVED34			(ALWAYSON_CTRL_BASE + 0x13A)
+#define ALWAYSON_SC_RESERVED35			(ALWAYSON_CTRL_BASE + 0x13B)
+#define ALWAYSON_SC_RESERVED36			(ALWAYSON_CTRL_BASE + 0x13B)
+#define ALWAYSON_SC_RESERVED37			(ALWAYSON_CTRL_BASE + 0x13B)
+#define ALWAYSON_SC_RESERVED38			(ALWAYSON_CTRL_BASE + 0x13B)
+#define ALWAYSON_SC_ALWAYSON_SYS_CTRL0		(ALWAYSON_CTRL_BASE + 0x148)
+#define ALWAYSON_SC_ALWAYSON_SYS_CTRL1		(ALWAYSON_CTRL_BASE + 0x148)
+#define ALWAYSON_SC_ALWAYSON_SYS_CTRL2		(ALWAYSON_CTRL_BASE + 0x148)
+#define ALWAYSON_SC_ALWAYSON_SYS_CTRL3		(ALWAYSON_CTRL_BASE + 0x148)
+#define ALWAYSON_SC_ALWAYSON_SYS_CTRL10		(ALWAYSON_CTRL_BASE + 0x14A)
+#define ALWAYSON_SC_ALWAYSON_SYS_CTRL11		(ALWAYSON_CTRL_BASE + 0x14A)
+#define ALWAYSON_SC_ALWAYSON_SYS_STAT0		(ALWAYSON_CTRL_BASE + 0x14C)
+#define ALWAYSON_SC_ALWAYSON_SYS_STAT1		(ALWAYSON_CTRL_BASE + 0x14C)
+#define ALWAYSON_SC_ALWAYSON_SYS_STAT2		(ALWAYSON_CTRL_BASE + 0x14C)
+#define ALWAYSON_SC_ALWAYSON_SYS_STAT3		(ALWAYSON_CTRL_BASE + 0x14C)
+#define ALWAYSON_SC_PWUP_TIME0			(ALWAYSON_CTRL_BASE + 0x188)
+#define ALWAYSON_SC_PWUP_TIME1			(ALWAYSON_CTRL_BASE + 0x188)
+#define ALWAYSON_SC_PWUP_TIME2			(ALWAYSON_CTRL_BASE + 0x188)
+#define ALWAYSON_SC_PWUP_TIME3			(ALWAYSON_CTRL_BASE + 0x188)
+#define ALWAYSON_SC_PWUP_TIME4			(ALWAYSON_CTRL_BASE + 0x189)
+#define ALWAYSON_SC_PWUP_TIME5			(ALWAYSON_CTRL_BASE + 0x189)
+#define ALWAYSON_SC_PWUP_TIME6			(ALWAYSON_CTRL_BASE + 0x189)
+#define ALWAYSON_SC_PWUP_TIME7			(ALWAYSON_CTRL_BASE + 0x189)
+#define ALWAYSON_SC_SECURITY_CTRL1		(ALWAYSON_CTRL_BASE + 0x1C0)
+
+#define PCLK_TIMER1						(1 << 16)
+#define PCLK_TIMER0						(1 << 15)
+
+#endif /* __HI6220_ALWAYSON_H__ */
-- 
1.9.1

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

* [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic
  2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver Peter Griffin
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files Peter Griffin
@ 2015-07-08 15:57 ` Peter Griffin
  2015-07-18 14:37   ` Simon Glass
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller Peter Griffin
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

This pmic is used on the 96boards consumer edition HiKey board.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 arch/arm/include/asm/arch-hi6220/hi6553.h | 75 +++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-hi6220/hi6553.h

diff --git a/arch/arm/include/asm/arch-hi6220/hi6553.h b/arch/arm/include/asm/arch-hi6220/hi6553.h
new file mode 100644
index 0000000..d0770e1
--- /dev/null
+++ b/arch/arm/include/asm/arch-hi6220/hi6553.h
@@ -0,0 +1,75 @@
+/*
+ * (C) Copyright 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __HI6553_PMIC_H__
+#define __HI6553_PMIC_H__
+
+#define HI6553_DISABLE6_XO_CLK			0x036
+
+#define HI6553_DISABLE6_XO_CLK_BB		(1 << 0)
+#define HI6553_DISABLE6_XO_CLK_CONN		(1 << 1)
+#define HI6553_DISABLE6_XO_CLK_NFC		(1 << 2)
+#define HI6553_DISABLE6_XO_CLK_RF1		(1 << 3)
+#define HI6553_DISABLE6_XO_CLK_RF2		(1 << 4)
+
+#define HI6553_VERSION_REG			0x000
+#define HI6553_ENABLE2_LDO1_8			0x029
+#define HI6553_DISABLE2_LDO1_8			0x02a
+#define HI6553_ONOFF_STATUS2_LDO1_8		0x02b
+#define HI6553_ENABLE3_LDO9_16			0x02c
+#define HI6553_DISABLE3_LDO9_16			0x02d
+#define HI6553_ONOFF_STATUS3_LDO9_16		0x02e
+#define HI6553_PERI_EN_MARK			0x040
+#define HI6553_BUCK2_REG1			0x04a
+#define HI6553_BUCK2_REG5			0x04e
+#define HI6553_BUCK2_REG6			0x04f
+#define HI6553_BUCK3_REG3			0x054
+#define HI6553_BUCK3_REG5			0x056
+#define HI6553_BUCK3_REG6			0x057
+#define HI6553_BUCK4_REG2			0x05b
+#define HI6553_BUCK4_REG5			0x05e
+#define HI6553_BUCK4_REG6			0x05f
+#define HI6553_CLK_TOP0				0x063
+#define HI6553_CLK_TOP3				0x066
+#define HI6553_CLK_TOP4				0x067
+#define HI6553_VSET_BUCK2_ADJ			0x06d
+#define HI6553_VSET_BUCK3_ADJ			0x06e
+#define HI6553_LDO7_REG_ADJ			0x078
+#define HI6553_LDO10_REG_ADJ			0x07b
+#define HI6553_LDO19_REG_ADJ			0x084
+#define HI6553_LDO20_REG_ADJ			0x085
+#define HI6553_DR_LED_CTRL			0x098
+#define HI6553_DR_OUT_CTRL			0x099
+#define HI6553_DR3_ISET				0x09a
+#define HI6553_DR3_START_DEL			0x09b
+#define HI6553_DR4_ISET				0x09c
+#define HI6553_DR4_START_DEL			0x09d
+#define HI6553_DR345_TIM_CONF0			0x0a0
+#define HI6553_NP_REG_ADJ1			0x0be
+#define HI6553_NP_REG_CHG			0x0c0
+#define HI6553_BUCK01_CTRL2			0x0d9
+#define HI6553_BUCK0_CTRL1			0x0dd
+#define HI6553_BUCK0_CTRL5			0x0e1
+#define HI6553_BUCK0_CTRL7			0x0e3
+#define HI6553_BUCK1_CTRL1			0x0e8
+#define HI6553_BUCK1_CTRL5			0x0ec
+#define HI6553_BUCK1_CTRL7			0x0ef
+#define HI6553_CLK19M2_600_586_EN		0x0fe
+
+#define HI6553_LED_START_DELAY_TIME		0x00
+#define HI6553_LED_ELEC_VALUE			0x07
+#define HI6553_LED_LIGHT_TIME			0xf0
+#define HI6553_LED_GREEN_ENABLE			(1 << 1)
+#define HI6553_LED_OUT_CTRL			0x00
+
+#define HI6553_PMU_V300				0x30
+#define HI6553_PMU_V310				0x31
+
+unsigned char hi6553_read_8(unsigned int offset);
+void hi6553_write_8(unsigned int offset, unsigned char value);
+
+#endif	/* __HI6553_PMIC_H__ */
-- 
1.9.1

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

* [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller.
  2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
                   ` (2 preceding siblings ...)
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic Peter Griffin
@ 2015-07-08 15:57 ` Peter Griffin
  2015-07-09  4:30   ` Jaehoon Chung
  2015-07-18 14:38   ` Simon Glass
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board Peter Griffin
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 6/6] ARM64: hikey: Add a README for this board Peter Griffin
  5 siblings, 2 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

This patch adds the glue code for hi6220 SoC which has 2x synopsis
dw_mmc controllers. This will be used by the hikey board support
in subsequent patches.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 arch/arm/include/asm/arch-hi6220/dwmmc.h |  8 +++++
 drivers/mmc/Makefile                     |  1 +
 drivers/mmc/hi6220_dw_mmc.c              | 56 ++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-hi6220/dwmmc.h
 create mode 100644 drivers/mmc/hi6220_dw_mmc.c

diff --git a/arch/arm/include/asm/arch-hi6220/dwmmc.h b/arch/arm/include/asm/arch-hi6220/dwmmc.h
new file mode 100644
index 0000000..c747383
--- /dev/null
+++ b/arch/arm/include/asm/arch-hi6220/dwmmc.h
@@ -0,0 +1,8 @@
+/*
+ * (C) Copyright 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width);
diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
index ed73687..81a1a8f 100644
--- a/drivers/mmc/Makefile
+++ b/drivers/mmc/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_BFIN_SDH) += bfin_sdh.o
 obj-$(CONFIG_DAVINCI_MMC) += davinci_mmc.o
 obj-$(CONFIG_DWMMC) += dw_mmc.o
 obj-$(CONFIG_EXYNOS_DWMMC) += exynos_dw_mmc.o
+obj-$(CONFIG_HIKEY_DWMMC) += hi6220_dw_mmc.o
 obj-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o
 obj-$(CONFIG_FTSDC010) += ftsdc010_mci.o
 obj-$(CONFIG_FTSDC021) += ftsdc021_sdhci.o
diff --git a/drivers/mmc/hi6220_dw_mmc.c b/drivers/mmc/hi6220_dw_mmc.c
new file mode 100644
index 0000000..106f673
--- /dev/null
+++ b/drivers/mmc/hi6220_dw_mmc.c
@@ -0,0 +1,56 @@
+/*
+ * (C) Copyright 2015 Linaro
+ * peter.griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dwmmc.h>
+#include <malloc.h>
+#include <asm-generic/errno.h>
+
+#define	DWMMC_MAX_CH_NUM		4
+
+#define	DWMMC_MAX_FREQ			50000000
+#define	DWMMC_MIN_FREQ			378000
+
+/* Source clock is configured to 100Mhz by ATF bl1*/
+#define MMC0_DEFAULT_FREQ		100000000
+
+static int hi6220_dwmci_core_init(struct dwmci_host *host, int index)
+{
+	host->name = "HiKey DWMMC";
+
+	host->dev_index = index;
+
+	/* Add the mmc channel to be registered with mmc core */
+	if (add_dwmci(host, DWMMC_MAX_FREQ, DWMMC_MIN_FREQ)) {
+		printf("DWMMC%d registration failed\n", index);
+		return -1;
+	}
+	return 0;
+}
+
+/*
+ * This function adds the mmc channel to be registered with mmc core.
+ * index -	mmc channel number.
+ * regbase -	register base address of mmc channel specified in 'index'.
+ * bus_width -	operating bus width of mmc channel specified in 'index'.
+ */
+int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width)
+{
+	struct dwmci_host *host = NULL;
+
+	host = calloc(1, sizeof(struct dwmci_host));
+	if (!host) {
+		error("dwmci_host malloc fail!\n");
+		return -ENOMEM;
+	}
+
+	host->ioaddr = (void *)regbase;
+	host->buswidth = bus_width;
+	host->bus_hz = MMC0_DEFAULT_FREQ;
+
+	return hi6220_dwmci_core_init(host, index);
+}
-- 
1.9.1

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
                   ` (3 preceding siblings ...)
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller Peter Griffin
@ 2015-07-08 15:57 ` Peter Griffin
  2015-07-10 18:36   ` Rob Herring
  2015-07-18 14:38   ` Simon Glass
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 6/6] ARM64: hikey: Add a README for this board Peter Griffin
  5 siblings, 2 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

HiKey is the first 96boards consumer edition compliant board. It features a hi6220
SoC which has eight ARM A53 cpu's.

This initial port adds support for: -
1) Serial
2) eMMC / sd card
3) USB
4) GPIO

It has been tested with Arm Trusted Firmware running u-boot as the BL33 executable.

Notes:

eMMC has been tested with basic reading of eMMC partition intto DDR. I have not
tested writing / erasing. Due to lack of clock control it won't be
running in the most performant high speed mode.

SD card slot has been tested for reading and booting kernels into DDR.
It is also currently used for saving the u-boot enviroment.

USB has been tested with ASIX networking adapter to tftpboot kernels
into DDR. On v2015.07-rc2 dhcp now works, and also usb mass storage
is enumerated correctly.

GPIO has been tested using gpio toggle GPIO4_1-3 to flash LEDs.

Basic SoC datasheet can be found here: -
https://github.com/96boards/documentation/blob/master/hikey/
Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf

Board schematic can be found here: -
https://github.com/96boards/documentation/blob/master/hikey/
96Boards-Hikey-Rev-A1.pdf

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 arch/arm/Kconfig               |   8 +
 board/hisilicon/hikey/Kconfig  |  15 ++
 board/hisilicon/hikey/Makefile |   8 +
 board/hisilicon/hikey/hikey.c  | 415 +++++++++++++++++++++++++++++++++++++++++
 configs/hikey_defconfig        |   5 +
 include/configs/hikey.h        | 168 +++++++++++++++++
 6 files changed, 619 insertions(+)
 create mode 100644 board/hisilicon/hikey/Kconfig
 create mode 100644 board/hisilicon/hikey/Makefile
 create mode 100644 board/hisilicon/hikey/hikey.c
 create mode 100644 configs/hikey_defconfig
 create mode 100644 include/configs/hikey.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 2985e6e..d0b7939 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -721,6 +721,13 @@ config TARGET_LS2085ARDB
 	  development platform that supports the QorIQ LS2085A
 	  Layerscape Architecture processor.
 
+config TARGET_HIKEY
+	bool "Support HiKey 96boards Consumer Edition Platform"
+	select ARM64
+	  help
+	  Support for HiKey 96boards platform. It features a HI6220
+	  SoC, with 8xA53 CPU, mali450 gpu, and 1GB RAM.
+
 config TARGET_LS1021AQDS
 	bool "Support ls1021aqds"
 	select CPU_V7
@@ -865,6 +872,7 @@ source "board/Marvell/gplugd/Kconfig"
 source "board/armadeus/apf27/Kconfig"
 source "board/armltd/vexpress/Kconfig"
 source "board/armltd/vexpress64/Kconfig"
+source "board/hisilicon/hikey/Kconfig"
 source "board/bachmann/ot1200/Kconfig"
 source "board/balloon3/Kconfig"
 source "board/barco/platinum/Kconfig"
diff --git a/board/hisilicon/hikey/Kconfig b/board/hisilicon/hikey/Kconfig
new file mode 100644
index 0000000..f7f1055
--- /dev/null
+++ b/board/hisilicon/hikey/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_HIKEY
+
+config SYS_BOARD
+	default "hikey"
+
+config SYS_VENDOR
+	default "hisilicon"
+
+config SYS_SOC
+	default "hi6220"
+
+config SYS_CONFIG_NAME
+	default "hikey"
+
+endif
diff --git a/board/hisilicon/hikey/Makefile b/board/hisilicon/hikey/Makefile
new file mode 100644
index 0000000..d4ec8c7
--- /dev/null
+++ b/board/hisilicon/hikey/Makefile
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	:= hikey.o
diff --git a/board/hisilicon/hikey/hikey.c b/board/hisilicon/hikey/hikey.c
new file mode 100644
index 0000000..bd5c409
--- /dev/null
+++ b/board/hisilicon/hikey/hikey.c
@@ -0,0 +1,415 @@
+/*
+ * (C) Copyright 2015 Linaro
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+#include <common.h>
+#include <dm.h>
+#include <malloc.h>
+#include <errno.h>
+#include <netdev.h>
+#include <asm/io.h>
+#include <asm-generic/gpio.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/dwmmc.h>
+#include <asm/arch/hi6220.h>
+#include <asm/arch/hi6553.h>
+
+#ifdef CONFIG_DM_GPIO
+static const struct hikey_gpio_platdata hi6220_gpio[] = {
+	{ 0, HI6220_GPIO_BASE(0)},
+	{ 1, HI6220_GPIO_BASE(1)},
+	{ 2, HI6220_GPIO_BASE(2)},
+	{ 3, HI6220_GPIO_BASE(3)},
+	{ 4, HI6220_GPIO_BASE(4)},
+	{ 5, HI6220_GPIO_BASE(5)},
+	{ 6, HI6220_GPIO_BASE(6)},
+	{ 7, HI6220_GPIO_BASE(7)},
+	{ 8, HI6220_GPIO_BASE(8)},
+	{ 9, HI6220_GPIO_BASE(9)},
+	{ 10, HI6220_GPIO_BASE(10)},
+	{ 11, HI6220_GPIO_BASE(11)},
+	{ 12, HI6220_GPIO_BASE(12)},
+	{ 13, HI6220_GPIO_BASE(13)},
+	{ 14, HI6220_GPIO_BASE(14)},
+	{ 15, HI6220_GPIO_BASE(15)},
+	{ 16, HI6220_GPIO_BASE(16)},
+	{ 17, HI6220_GPIO_BASE(17)},
+	{ 18, HI6220_GPIO_BASE(18)},
+	{ 19, HI6220_GPIO_BASE(19)},
+
+};
+
+U_BOOT_DEVICES(hi6220_gpios) = {
+	{ "gpio_hi6220", &hi6220_gpio[0] },
+	{ "gpio_hi6220", &hi6220_gpio[1] },
+	{ "gpio_hi6220", &hi6220_gpio[2] },
+	{ "gpio_hi6220", &hi6220_gpio[3] },
+	{ "gpio_hi6220", &hi6220_gpio[4] },
+	{ "gpio_hi6220", &hi6220_gpio[5] },
+	{ "gpio_hi6220", &hi6220_gpio[6] },
+	{ "gpio_hi6220", &hi6220_gpio[7] },
+	{ "gpio_hi6220", &hi6220_gpio[8] },
+	{ "gpio_hi6220", &hi6220_gpio[9] },
+	{ "gpio_hi6220", &hi6220_gpio[10] },
+	{ "gpio_hi6220", &hi6220_gpio[11] },
+	{ "gpio_hi6220", &hi6220_gpio[12] },
+	{ "gpio_hi6220", &hi6220_gpio[13] },
+	{ "gpio_hi6220", &hi6220_gpio[14] },
+	{ "gpio_hi6220", &hi6220_gpio[15] },
+	{ "gpio_hi6220", &hi6220_gpio[16] },
+	{ "gpio_hi6220", &hi6220_gpio[17] },
+	{ "gpio_hi6220", &hi6220_gpio[18] },
+	{ "gpio_hi6220", &hi6220_gpio[19] },
+};
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define EYE_PATTERN	0x70533483
+
+static void init_usb_and_picophy(void)
+{
+	unsigned int data;
+
+	/* enable USB clock */
+	writel(PERI_CLK0_USBOTG, PERI_SC_PERIPH_CLK0_EN);
+	do {
+		data = readl(PERI_SC_PERIPH_CLK0_STAT);
+	} while ((data & PERI_CLK0_USBOTG) == 0);
+
+	/* take usb IPs out of reset */
+	writel(PERI_RST0_USBOTG_BUS | PERI_RST0_POR_PICOPHY |
+		PERI_RST0_USBOTG | PERI_RST0_USBOTG_32K,
+		PERI_SC_PERIPH_RST0_DIS);
+	do {
+		data = readl(PERI_SC_PERIPH_RST0_STAT);
+		data &= PERI_RST0_USBOTG_BUS | PERI_RST0_POR_PICOPHY |
+			PERI_RST0_USBOTG | PERI_RST0_USBOTG_32K;
+	} while (data);
+
+	/*CTRL 5*/
+	data = readl(PERI_SC_PERIPH_CTRL5);
+	data &= ~PERI_CTRL5_PICOPHY_BC_MODE;
+	data |= PERI_CTRL5_USBOTG_RES_SEL | PERI_CTRL5_PICOPHY_ACAENB;
+	data |= 0x300;
+	writel(data, PERI_SC_PERIPH_CTRL5);
+
+	/*CTRL 4*/
+
+	/* configure USB PHY */
+	data = readl(PERI_SC_PERIPH_CTRL4);
+
+	/* make PHY out of low power mode */
+	data &= ~PERI_CTRL4_PICO_SIDDQ;
+	data &= ~PERI_CTRL4_PICO_OGDISABLE;
+	data |= PERI_CTRL4_PICO_VBUSVLDEXTSEL | PERI_CTRL4_PICO_VBUSVLDEXT;
+	writel(data, PERI_SC_PERIPH_CTRL4);
+
+	writel(EYE_PATTERN, PERI_SC_PERIPH_CTRL8);
+
+	mdelay(5);
+}
+
+static int sd_card_detect(void)
+{
+	int ret;
+
+	/* configure GPIO8 as nopull */
+	writel(0, 0xf8001830);
+
+	gpio_request(8, "SD CD");
+
+	gpio_direction_input(8);
+	ret = gpio_get_value(8);
+
+	if (!ret) {
+		printf("%s: SD card present\n", __func__);
+		return 1;
+	}
+
+	printf("%s: SD card not present\n", __func__);
+	return 0;
+}
+
+static void mmc1_setup_pinmux(void)
+{
+	/* switch pinmux to SD */
+	writel(0, 0xf701000c);
+	writel(0, 0xf7010010);
+	writel(0, 0xf7010014);
+	writel(0, 0xf7010018);
+	writel(0, 0xf701001c);
+	writel(0, 0xf7010020);
+
+	/* input, 16mA or 12mA */
+	writel(0x64, 0xf701080c);
+	writel(0x54, 0xf7010810);
+	writel(0x54, 0xf7010814);
+	writel(0x54, 0xf7010818);
+	writel(0x54, 0xf701081c);
+	writel(0x54, 0xf7010820);
+
+	sd_card_detect();
+}
+
+static void mmc1_init_pll(void)
+{
+	uint32_t data;
+
+	/* select SYSPLL as the source of MMC1 */
+	/* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
+	writel(1 << 11 | 1 << 27, PERI_SC_CLK0_SEL);
+	do {
+		data = readl(PERI_SC_CLK0_SEL);
+	} while (!(data & (1 << 11)));
+
+	/* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
+	writel(1 << 30, PERI_SC_CLK0_SEL);
+	do {
+		data = readl(PERI_SC_CLK0_SEL);
+	} while (data & (1 << 14));
+
+	writel((1 << 1), PERI_SC_PERIPH_CLK0_EN);
+	do {
+		data = readl(PERI_SC_PERIPH_CLK0_STAT);
+	} while (!(data & (1 << 1)));
+
+	data = readl(PERI_SC_PERIPH_CLK12_EN);
+	data |= 1 << 2;
+	writel(data, PERI_SC_PERIPH_CLK12_EN);
+
+	do {
+		/* 1.2GHz / 50 = 24MHz */
+		writel(0x31 | (1 << 7), PERI_SC_CLKCFG8BIT2);
+		data = readl(PERI_SC_CLKCFG8BIT2);
+	} while ((data & 0x31) != 0x31);
+}
+
+static void mmc1_reset_clk(void)
+{
+	unsigned int data;
+
+	/* disable mmc1 bus clock */
+	writel(PERI_CLK0_MMC1, PERI_SC_PERIPH_CLK0_DIS);
+	do {
+		data = readl(PERI_SC_PERIPH_CLK0_STAT);
+	} while (data & PERI_CLK0_MMC1);
+
+	/* enable mmc1 bus clock */
+	writel(PERI_CLK0_MMC1, PERI_SC_PERIPH_CLK0_EN);
+	do {
+		data = readl(PERI_SC_PERIPH_CLK0_STAT);
+	} while (!(data & PERI_CLK0_MMC1));
+
+	/* reset mmc1 clock domain */
+	writel(PERI_RST0_MMC1, PERI_SC_PERIPH_RST0_EN);
+
+	/* bypass mmc1 clock phase */
+	data = readl(PERI_SC_PERIPH_CTRL2);
+	data |= 3 << 2;
+	writel(data, PERI_SC_PERIPH_CTRL2);
+
+	/* disable low power */
+	data = readl(PERI_SC_PERIPH_CTRL13);
+	data |= 1 << 4;
+	writel(data, PERI_SC_PERIPH_CTRL13);
+	do {
+		data = readl(PERI_SC_PERIPH_RST0_STAT);
+	} while (!(data & PERI_RST0_MMC1));
+
+	/* unreset mmc0 clock domain */
+	writel(PERI_RST0_MMC1, PERI_SC_PERIPH_RST0_DIS);
+	do {
+		data = readl(PERI_SC_PERIPH_RST0_STAT);
+	} while (data & PERI_RST0_MMC1);
+}
+
+/* PMU SSI is the IP that maps the external PMU hi6553 registers as IO */
+static void hi6220_pmussi_init(void)
+{
+	uint32_t data;
+
+	/* Take PMUSSI out of reset */
+	writel(ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N,
+	       ALWAYSON_SC_PERIPH_RST4_DIS);
+	do {
+		data = readl(ALWAYSON_SC_PERIPH_RST4_STAT);
+	} while (data & ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N);
+
+	/* set PMU SSI clock latency for read operation */
+	data = readl(ALWAYSON_SC_MCU_SUBSYS_CTRL3);
+	data &= ~ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_MASK;
+	data |= ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_3;
+	writel(data, ALWAYSON_SC_MCU_SUBSYS_CTRL3);
+
+	/* enable PMUSSI clock */
+	data = ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_CCPU |
+	       ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_MCU;
+	writel(data, ALWAYSON_SC_PERIPH_CLK5_EN);
+	data = ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_PMUSSI;
+	writel(data, ALWAYSON_SC_PERIPH_CLK4_EN);
+
+	/* Output high to PMIC on PWR_HOLD_GPIO0_0 */
+	gpio_request(0, "PWR_HOLD_GPIO0_0");
+	gpio_direction_output(0, 1);
+}
+
+uint8_t hi6553_readb(unsigned int offset)
+{
+	return readb((u8 *)(unsigned long)HI6220_PMUSSI_BASE + (offset << 2));
+}
+
+void hi6553_writeb(unsigned int offset, uint8_t value)
+{
+	writeb(value, (u8 *)(unsigned long)HI6220_PMUSSI_BASE + (offset << 2));
+}
+
+static void hikey_hi6553_init(void)
+{
+	int data;
+
+	hi6553_writeb(HI6553_PERI_EN_MARK, 0x1e);
+	hi6553_writeb(HI6553_NP_REG_ADJ1, 0);
+	data = HI6553_DISABLE6_XO_CLK_CONN | HI6553_DISABLE6_XO_CLK_NFC |
+		HI6553_DISABLE6_XO_CLK_RF1 | HI6553_DISABLE6_XO_CLK_RF2;
+	hi6553_writeb(HI6553_DISABLE6_XO_CLK, data);
+
+	/* configure BUCK0 & BUCK1 */
+	hi6553_writeb(HI6553_BUCK01_CTRL2, 0x5e);
+	hi6553_writeb(HI6553_BUCK0_CTRL7, 0x10);
+	hi6553_writeb(HI6553_BUCK1_CTRL7, 0x10);
+	hi6553_writeb(HI6553_BUCK0_CTRL5, 0x1e);
+	hi6553_writeb(HI6553_BUCK1_CTRL5, 0x1e);
+	hi6553_writeb(HI6553_BUCK0_CTRL1, 0xfc);
+	hi6553_writeb(HI6553_BUCK1_CTRL1, 0xfc);
+
+	/* configure BUCK2 */
+	hi6553_writeb(HI6553_BUCK2_REG1, 0x4f);
+	hi6553_writeb(HI6553_BUCK2_REG5, 0x99);
+	hi6553_writeb(HI6553_BUCK2_REG6, 0x45);
+	mdelay(1);
+	hi6553_writeb(HI6553_VSET_BUCK2_ADJ, 0x22);
+	mdelay(1);
+
+	/* configure BUCK3 */
+	hi6553_writeb(HI6553_BUCK3_REG3, 0x02);
+	hi6553_writeb(HI6553_BUCK3_REG5, 0x99);
+	hi6553_writeb(HI6553_BUCK3_REG6, 0x41);
+	hi6553_writeb(HI6553_VSET_BUCK3_ADJ, 0x02);
+	mdelay(1);
+
+	/* configure BUCK4 */
+	hi6553_writeb(HI6553_BUCK4_REG2, 0x9a);
+	hi6553_writeb(HI6553_BUCK4_REG5, 0x99);
+	hi6553_writeb(HI6553_BUCK4_REG6, 0x45);
+
+	/* configure LDO20 */
+	hi6553_writeb(HI6553_LDO20_REG_ADJ, 0x50);
+
+	hi6553_writeb(HI6553_NP_REG_CHG, 0x0f);
+	hi6553_writeb(HI6553_CLK_TOP0, 0x06);
+	hi6553_writeb(HI6553_CLK_TOP3, 0xc0);
+	hi6553_writeb(HI6553_CLK_TOP4, 0x00);
+
+	/* configure LDO7 & LDO10 for SD slot */
+	data = hi6553_readb(HI6553_LDO7_REG_ADJ);
+	data = (data & 0xf8) | 0x2;
+	hi6553_writeb(HI6553_LDO7_REG_ADJ, data);
+	mdelay(5);
+	/* enable LDO7 */
+	hi6553_writeb(HI6553_ENABLE2_LDO1_8, 1 << 6);
+	mdelay(5);
+	data = hi6553_readb(HI6553_LDO10_REG_ADJ);
+	data = (data & 0xf8) | 0x5;
+	hi6553_writeb(HI6553_LDO10_REG_ADJ, data);
+	mdelay(5);
+	/* enable LDO10 */
+	hi6553_writeb(HI6553_ENABLE3_LDO9_16, 1 << 1);
+	mdelay(5);
+
+	/* select 32.764KHz */
+	hi6553_writeb(HI6553_CLK19M2_600_586_EN, 0x01);
+}
+
+int misc_init_r(void)
+{
+	init_usb_and_picophy();
+
+	return 0;
+}
+
+int board_init(void)
+{
+	gd->flags = 0;
+
+	icache_enable();
+
+	return 0;
+}
+
+#ifdef CONFIG_GENERIC_MMC
+
+static int init_dwmmc(void)
+{
+	int ret;
+
+#ifdef CONFIG_DWMMC
+	/* mmc0 pinmux and clocks are already configured by ATF */
+	ret = hi6220_dwmci_add_port(0, HI6220_MMC0_BASE, 8);
+
+	if (ret)
+		printf("%s: Error adding eMMC port\n", __func__);
+
+	/* take mmc1 (sd slot) out of reset, configure clocks and pinmuxing */
+
+	mmc1_init_pll();
+	mmc1_reset_clk();
+	mmc1_setup_pinmux();
+
+	ret |= hi6220_dwmci_add_port(1, HI6220_MMC1_BASE, 4);
+
+	if (ret)
+		printf("%s: Error adding SD port\n", __func__);
+#endif
+	return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+	int ret;
+
+	/* init the pmussi ip */
+	hi6220_pmussi_init();
+
+	/* init the hi6553 pmic */
+	hikey_hi6553_init();
+
+	/* add the eMMC and sd ports */
+	ret = init_dwmmc();
+
+	if (ret)
+		debug("init_dwmmc failed\n");
+
+	return ret;
+}
+#endif
+
+int dram_init(void)
+{
+	gd->ram_size = PHYS_SDRAM_1_SIZE;
+	return 0;
+}
+
+void dram_init_banksize(void)
+{
+	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+}
+
+/* Use the Watchdog to cause reset */
+void reset_cpu(ulong addr)
+{
+	/* TODO program the watchdog */
+}
diff --git a/configs/hikey_defconfig b/configs/hikey_defconfig
new file mode 100644
index 0000000..50baf22
--- /dev/null
+++ b/configs/hikey_defconfig
@@ -0,0 +1,5 @@
+# 96boards HiKey
+CONFIG_ARM=y
+CONFIG_TARGET_HIKEY=y
+CONFIG_SHOW_BOOT_PROGRESS=y
+CONFIG_NET=y
diff --git a/include/configs/hikey.h b/include/configs/hikey.h
new file mode 100644
index 0000000..303b857
--- /dev/null
+++ b/include/configs/hikey.h
@@ -0,0 +1,168 @@
+/*
+ * (C) Copyright 2015 Linaro
+ *
+ * Peter Griffin <peter.griffin@linaro.org>
+ *
+ * Configuration for HiKey 96boards CE. Parts were derived from other ARM
+ * configurations.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __HIKEY_AEMV8A_H
+#define __HIKEY_AEMV8A_H
+
+/* We use generic board for hikey */
+#define CONFIG_SYS_GENERIC_BOARD
+
+#define CONFIG_REMAKE_ELF
+
+#define CONFIG_SUPPORT_RAW_INITRD
+
+/* Cache Definitions */
+#define CONFIG_SYS_DCACHE_OFF
+
+#define CONFIG_IDENT_STRING		"hikey"
+
+/* Flat Device Tree Definitions */
+#define CONFIG_OF_LIBFDT
+
+/* Physical Memory Map */
+
+/* CONFIG_SYS_TEXT_BASE needs to align with where ATF loads bl33.bin */
+#define CONFIG_SYS_TEXT_BASE		0x35000000
+
+#define CONFIG_NR_DRAM_BANKS		1
+#define PHYS_SDRAM_1			0x00000000
+
+/* 1008 MB (the last 16Mb are secured for TrustZone by ATF*/
+#define PHYS_SDRAM_1_SIZE		0x3f000000
+#define CONFIG_SYS_SDRAM_BASE		PHYS_SDRAM_1
+
+#define CONFIG_SYS_INIT_RAM_SIZE	0x1000
+
+#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE + 0x7fff0)
+
+#define CONFIG_SYS_LOAD_ADDR		(CONFIG_SYS_SDRAM_BASE + 0x80000)
+
+/* Generic Timer Definitions */
+#define COUNTER_FREQUENCY              (19000000)
+
+/* Generic Interrupt Controller Definitions */
+#define GICD_BASE			(0xf6801000)
+#define GICC_BASE			(0xf6802000)
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN		(CONFIG_ENV_SIZE + (8 << 20))
+
+/* PL011 Serial Configuration */
+#define CONFIG_PL011_SERIAL
+
+#define CONFIG_PL011_CLOCK		19200000
+#define CONFIG_PL01x_PORTS		{(void *)CONFIG_SYS_SERIAL0}
+#define CONFIG_CONS_INDEX		0
+
+#define CONFIG_BAUDRATE			115200
+#define CONFIG_SYS_SERIAL0		0xF8015000
+
+#define CONFIG_CMD_USB
+#ifdef CONFIG_CMD_USB
+#define CONFIG_USB_DWC2
+#define CONFIG_USB_DWC2_REG_ADDR 0xF72C0000
+/*#define CONFIG_DWC2_DFLT_SPEED_FULL*/
+#define CONFIG_DWC2_ENABLE_DYNAMIC_FIFO
+
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_SMSC95XX
+#define CONFIG_USB_ETHER_ASIX
+#define CONFIG_MISC_INIT_R
+#endif
+
+#define CONFIG_HIKEY_GPIO
+#define CONFIG_DM_GPIO
+#define CONFIG_CMD_GPIO
+#define CONFIG_DM
+
+/* SD/MMC configuration */
+#define CONFIG_GENERIC_MMC
+#define CONFIG_MMC
+#define CONFIG_DWMMC
+#define CONFIG_HIKEY_DWMMC
+#define CONFIG_BOUNCE_BUFFER
+#define CONFIG_CMD_MMC
+
+#define CONFIG_FS_EXT4
+#define CONFIG_FS_FAT
+
+/* Command line configuration */
+#define CONFIG_MENU
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_BDI
+#define CONFIG_CMD_UNZIP
+#define CONFIG_CMD_PXE
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_IMI
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_BOOTD
+#define CONFIG_CMD_ECHO
+#define CONFIG_CMD_SOURCE
+
+#define CONFIG_MAC_PARTITION
+#define CONFIG_MTD_PARTITIONS
+
+/* BOOTP options */
+#define CONFIG_BOOTP_BOOTFILESIZE
+
+#define CONFIG_CMD_NET
+
+#include <config_distro_defaults.h>
+
+/* Initial environment variables */
+
+/*
+ * Defines where the kernel and FDT exist in NOR flash and where it will
+ * be copied into DRAM
+ */
+#define CONFIG_EXTRA_ENV_SETTINGS	\
+				"kernel_name=Image\0"	\
+				"kernel_addr=0x0000000\0" \
+				"fdt_name=hi6220-hikey.dtb\0" \
+				"fdt_addr=0x0300000\0" \
+				"max_fdt=0x100000\0" \
+				"fdt_high=0xffffffffffffffff\0" \
+				"initrd_high=0xffffffffffffffff\0" \
+
+/* Assume we boot with root on the first partition of a USB stick */
+#define CONFIG_BOOTARGS		"console=ttyAMA0,115200n8 /dev/mmcblk0p7 rw "
+
+/* Copy the kernel and FDT to DRAM memory and boot */
+#define CONFIG_BOOTCOMMAND	"booti $kernel_addr_r - $fdt_addr_r"
+
+#define CONFIG_BOOTDELAY		2
+
+/* Preserve enviroment onto sd card */
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_SYS_MMC_ENV_DEV		1
+#define CONFIG_SYS_MMC_ENV_PART		0
+#define CONFIG_ENV_OFFSET               0x0
+#define CONFIG_ENV_SIZE			0x1000
+#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
+#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
+
+/* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE		512	/* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE		(CONFIG_SYS_CBSIZE + \
+					sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_BARGSIZE		CONFIG_SYS_CBSIZE
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_MAXARGS		64	/* max command args */
+
+#define CONFIG_SYS_NO_FLASH
+
+#endif /* __HIKEY_AEMV8A_H */
-- 
1.9.1

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

* [U-Boot] [PATCH v2 6/6] ARM64: hikey: Add a README for this board.
  2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
                   ` (4 preceding siblings ...)
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board Peter Griffin
@ 2015-07-08 15:57 ` Peter Griffin
  5 siblings, 0 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-08 15:57 UTC (permalink / raw)
  To: u-boot

To help others with compiling and flashing ATF and u-boot add
a README for this board.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
---
 board/hisilicon/hikey/README | 160 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 160 insertions(+)
 create mode 100644 board/hisilicon/hikey/README

diff --git a/board/hisilicon/hikey/README b/board/hisilicon/hikey/README
new file mode 100644
index 0000000..25c8143
--- /dev/null
+++ b/board/hisilicon/hikey/README
@@ -0,0 +1,160 @@
+Introduction
+============
+
+HiKey is the first certified 96Boards Consumer Edition board. The board/SoC has: -
+* HiSilicon Kirin 6220 eight-core ARM Cortex-A53 64-bit SoC running at 1.2GHz.
+* ARM Mali 450-MP4 GPU
+* 1GB 800MHz LPDDR3 DRAM
+* 4GB eMMC Flash Storage
+* microSD
+* 802.11a/b/g/n WiFi, Bluetooth
+
+The HiKey schematic can be found here: -
+https://github.com/96boards/documentation/blob/master/hikey/96Boards-Hikey-Rev-A1.pdf
+
+A SoC datasheet can be found here: -
+https://github.com/96boards/documentation/blob/master/hikey/
+Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
+
+Currently the u-boot port supports: -
+* USB
+* eMMC
+* SD card
+* GPIO
+
+Compile u-boot
+==============
+
+make CROSS_COMPILE=aarch64-linux-gnu- hikey_config
+make CROSS_COMPILE=aarch64-linux-gnu-
+
+ARM Trusted Firmware (ATF) & l-loader
+=====================================
+
+This u-boot port has been tested with l-loader, booting ATF, which then boots
+u-boot as the bl33.bin executable.
+
+1. Get ATF source code
+git clone https://github.com/96boards/arm-trusted-firmware.git
+
+2. Compile ATF I use the makefile here
+http://people.linaro.org/~peter.griffin/hikey/hikey-u-boot-release_r1/build-tf.mak
+
+3. Get l-loader
+git clone https://github.com/96boards/l-loader.git
+
+4. Make sym links to ATF bip / fip binaries
+ln -s /home/griffinp/aarch64/bl1-hikey.bin bl1.bin
+ln -s /home/griffinp/aarch64/fip-hikey.bin fip.bin
+
+arm-linux-gnueabihf-gcc -c -o start.o start.S
+arm-linux-gnueabihf-gcc -c -o debug.o debug.S
+arm-linux-gnueabihf-ld -Bstatic -Tl-loader.lds -Ttext 0xf9800800 start.o debug.o -o loader
+arm-linux-gnueabihf-objcopy -O binary loader temp
+
+python gen_loader.py -o l-loader.bin --img_loader=temp --img_bl1=bl1.bin
+sudo bash -x generate_ptable.sh
+python gen_loader.py -o ptable.img --img_prm_ptable=prm_ptable.img --img_sec_ptable=sec_ptable.img
+
+These instructions are adapted from
+https://github.com/96boards/documentation/wiki/HiKeyUEFI
+
+FLASHING
+========
+
+1. Connect jumper J2 to go into recovery mode and flash l-loader.bin with
+   fastboot using the hisi-idt.py utility
+
+> git clone https://github.com/96boards/burn-boot.git
+> sudo python /home/griffinp/Software/hikey/burn-boot/hisi-idt.py -d /dev/ttyUSB0 --img1=/tmp/l-loader.bin
+
+2. Once LED 0 comes on solid, it should be detected as a fastboot device
+   (on some boards I've found this to be unreliable)
+
+sudo fastboot devices
+
+3. Flash the images
+wget https://builds.96boards.org/releases/hikey/nvme.img
+sudo fastboot flash ptable ptable.img
+sudo fastboot flash fastboot fip.bin
+sudo fastboot flash nvme nvme.img
+
+4. Disconnect jumper J2, and reset the board and you will now (hopefully)
+   have ATF, booting u-boot from eMMC. On 'new' boards I've had to do the
+   flashing twice in the past to avoid an ATF error.
+
+See working boot trace below: -
+
+debug EMMC boot: print init OK
+debug EMMC boot: send RST_N .
+debug EMMC boot: start eMMC boot......
+load fastboot1!
+Switch to aarch64 mode. CPU0 executes at 0xf9801000!
+NOTICE:  Booting Trusted Firmware
+NOTICE:  BL1: v1.1(release):a0c0399
+NOTICE:  BL1: Built : 13:23:48, May 22 2015
+NOTICE:  succeed to init lpddr3 rank0 dram phy
+INFO:    lpddr3_freq_init, set ddrc 533mhz
+INFO:    init ddr3 rank0
+INFO:    ddr3 rank1 init pass
+INFO:    lpddr3_freq_init, set ddrc 800mhz
+INFO:    init ddr3 rank0
+INFO:    ddr3 rank1 init pass
+INFO:    Elpida DDR
+NOTICE:  BL1: Booting BL2
+INFO:    [BDID] [fff91c18] midr: 0x410fd033
+INFO:    [BDID] [fff91c1c] board type: 0
+INFO:    [BDID] [fff91c20] board id: 0x2b
+INFO:    init_acpu_dvfs: pmic version 17
+INFO:    init_acpu_dvfs: ACPU_CHIP_MAX_FREQ=0x186a00.
+INFO:    acpu_dvfs_volt_init: success!
+INFO:    acpu_dvfs_set_freq: support freq num is 5
+INFO:    acpu_dvfs_set_freq: start prof is 0x4
+INFO:    acpu_dvfs_set_freq: magic is 0x5a5ac5c5
+INFO:    acpu_dvfs_set_freq: voltage:
+INFO:      - 0: 0x3a
+INFO:      - 1: 0x3a
+INFO:      - 2: 0x4a
+INFO:      - 3: 0x5b
+INFO:      - 4: 0x6b
+NOTICE:  acpu_dvfs_set_freq: set acpu freq success!NOTICE:  BL2: v1.1(debug):a0c0399
+NOTICE:  BL2: Built : 10:19:28, May 27 2015
+INFO:    BL2: Loading BL3-0
+INFO:    Using FIP
+WARNING: Failed to access image 'bl30.bin' (-1)
+ERROR:   Failed to load BL3-0 (-1)
+ERROR:   Please burn mcu image:
+ERROR:     sudo fastboot flash mcuimage mcuimage.bin
+INFO:    BL2: TrustZone: protecting 16777216 bytes of memory at 0x3f000000
+INFO:    BL2: Loading BL3-1
+INFO:    Using FIP
+INFO:    Loading file 'bl31.bin' at address 0xf9858000
+INFO:    File 'bl31.bin' loaded: 0xf9858000 - 0xf9860010
+INFO:    BL2: Loading BL3-2
+INFO:    Using FIP
+WARNING: Failed to access image 'bl32.bin' (-1)
+WARNING: Failed to load BL3-2 (-1)
+INFO:    BL2: Loading BL3-3
+INFO:    Using FIP
+INFO:    Loading file 'bl33.bin' at address 0x35000000
+INFO:    File 'bl33.bin' loaded: 0x35000000 - 0x35042938
+NOTICE:  BL1: Booting BL3-1
+NOTICE:  BL3-1: v1.1(debug):a0c0399
+NOTICE:  BL3-1: Built : 10:19:31, May 27 2015
+INFO:    BL3-1: Initializing runtime services
+INFO:    BL3-1: Preparing for EL3 exit to normal world
+INFO:    BL3-1: Next image address = 0x35000000
+INFO:    BL3-1: Next image spsr = 0x3c9
+
+
+U-Boot 2015.04-00007-g1b3d379-dirty (May 27 2015 - 10:18:16) hikey
+
+DRAM:  1008 MiB
+MMC:   sd_card_detect: SD card present
+HiKey DWMMC: 0, HiKey DWMMC: 1
+In:    serial
+Out:   serial
+Err:   serial
+Net:   Net Initialization Skipped
+No ethernet found.
+Hit any key to stop autoboot:  0
-- 
1.9.1

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

* [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller.
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller Peter Griffin
@ 2015-07-09  4:30   ` Jaehoon Chung
  2015-07-18 14:38   ` Simon Glass
  1 sibling, 0 replies; 23+ messages in thread
From: Jaehoon Chung @ 2015-07-09  4:30 UTC (permalink / raw)
  To: u-boot

On 07/09/2015 12:57 AM, Peter Griffin wrote:
> This patch adds the glue code for hi6220 SoC which has 2x synopsis
> dw_mmc controllers. This will be used by the hikey board support
> in subsequent patches.
> 
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---
>  arch/arm/include/asm/arch-hi6220/dwmmc.h |  8 +++++
>  drivers/mmc/Makefile                     |  1 +
>  drivers/mmc/hi6220_dw_mmc.c              | 56 ++++++++++++++++++++++++++++++++
>  3 files changed, 65 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-hi6220/dwmmc.h
>  create mode 100644 drivers/mmc/hi6220_dw_mmc.c
> 
> diff --git a/arch/arm/include/asm/arch-hi6220/dwmmc.h b/arch/arm/include/asm/arch-hi6220/dwmmc.h
> new file mode 100644
> index 0000000..c747383
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-hi6220/dwmmc.h
> @@ -0,0 +1,8 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width);
> diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
> index ed73687..81a1a8f 100644
> --- a/drivers/mmc/Makefile
> +++ b/drivers/mmc/Makefile
> @@ -11,6 +11,7 @@ obj-$(CONFIG_BFIN_SDH) += bfin_sdh.o
>  obj-$(CONFIG_DAVINCI_MMC) += davinci_mmc.o
>  obj-$(CONFIG_DWMMC) += dw_mmc.o
>  obj-$(CONFIG_EXYNOS_DWMMC) += exynos_dw_mmc.o
> +obj-$(CONFIG_HIKEY_DWMMC) += hi6220_dw_mmc.o
>  obj-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o
>  obj-$(CONFIG_FTSDC010) += ftsdc010_mci.o
>  obj-$(CONFIG_FTSDC021) += ftsdc021_sdhci.o
> diff --git a/drivers/mmc/hi6220_dw_mmc.c b/drivers/mmc/hi6220_dw_mmc.c
> new file mode 100644
> index 0000000..106f673
> --- /dev/null
> +++ b/drivers/mmc/hi6220_dw_mmc.c
> @@ -0,0 +1,56 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * peter.griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dwmmc.h>
> +#include <malloc.h>
> +#include <asm-generic/errno.h>
> +
> +#define	DWMMC_MAX_CH_NUM		4
> +
> +#define	DWMMC_MAX_FREQ			50000000
> +#define	DWMMC_MIN_FREQ			378000

Is there any reason for using 378000 instead of 400K?

> +
> +/* Source clock is configured to 100Mhz by ATF bl1*/
> +#define MMC0_DEFAULT_FREQ		100000000

Always configured to 100Mhz? Is there no method to get clock value?

> +
> +static int hi6220_dwmci_core_init(struct dwmci_host *host, int index)
> +{
> +	host->name = "HiKey DWMMC";
> +
> +	host->dev_index = index;
> +
> +	/* Add the mmc channel to be registered with mmc core */
> +	if (add_dwmci(host, DWMMC_MAX_FREQ, DWMMC_MIN_FREQ)) {
> +		printf("DWMMC%d registration failed\n", index);
> +		return -1;
> +	}
> +	return 0;
> +}
> +
> +/*
> + * This function adds the mmc channel to be registered with mmc core.
> + * index -	mmc channel number.
> + * regbase -	register base address of mmc channel specified in 'index'.
> + * bus_width -	operating bus width of mmc channel specified in 'index'.
> + */
> +int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width)
> +{
> +	struct dwmci_host *host = NULL;
> +
> +	host = calloc(1, sizeof(struct dwmci_host));
> +	if (!host) {
> +		error("dwmci_host malloc fail!\n");

malloc -> calloc?

Best Regards,
Jaehoon Chung

> +		return -ENOMEM;
> +	}
> +
> +	host->ioaddr = (void *)regbase;
> +	host->buswidth = bus_width;
> +	host->bus_hz = MMC0_DEFAULT_FREQ;
> +
> +	return hi6220_dwmci_core_init(host, index);
> +}
> 

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board Peter Griffin
@ 2015-07-10 18:36   ` Rob Herring
  2015-07-16  0:41     ` Peter Griffin
  2015-07-18 14:38   ` Simon Glass
  1 sibling, 1 reply; 23+ messages in thread
From: Rob Herring @ 2015-07-10 18:36 UTC (permalink / raw)
  To: u-boot

On Wed, Jul 8, 2015 at 10:57 AM, Peter Griffin <peter.griffin@linaro.org> wrote:
> HiKey is the first 96boards consumer edition compliant board. It features a hi6220
> SoC which has eight ARM A53 cpu's.
>
> This initial port adds support for: -
> 1) Serial
> 2) eMMC / sd card

s/sd/SD/

> 3) USB
> 4) GPIO
>
> It has been tested with Arm Trusted Firmware running u-boot as the BL33 executable.
>
> Notes:
>
> eMMC has been tested with basic reading of eMMC partition intto DDR. I have not

s/intto/into/

> tested writing / erasing. Due to lack of clock control it won't be
> running in the most performant high speed mode.
>
> SD card slot has been tested for reading and booting kernels into DDR.
> It is also currently used for saving the u-boot enviroment.

s/enviroment/environment/

> USB has been tested with ASIX networking adapter to tftpboot kernels
> into DDR. On v2015.07-rc2 dhcp now works, and also usb mass storage

s/usb/USB/

> is enumerated correctly.
>
> GPIO has been tested using gpio toggle GPIO4_1-3 to flash LEDs.
>
> Basic SoC datasheet can be found here: -
> https://github.com/96boards/documentation/blob/master/hikey/
> Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
>
> Board schematic can be found here: -
> https://github.com/96boards/documentation/blob/master/hikey/
> 96Boards-Hikey-Rev-A1.pdf
>
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---
>  arch/arm/Kconfig               |   8 +
>  board/hisilicon/hikey/Kconfig  |  15 ++
>  board/hisilicon/hikey/Makefile |   8 +
>  board/hisilicon/hikey/hikey.c  | 415 +++++++++++++++++++++++++++++++++++++++++
>  configs/hikey_defconfig        |   5 +
>  include/configs/hikey.h        | 168 +++++++++++++++++
>  6 files changed, 619 insertions(+)
>  create mode 100644 board/hisilicon/hikey/Kconfig
>  create mode 100644 board/hisilicon/hikey/Makefile
>  create mode 100644 board/hisilicon/hikey/hikey.c
>  create mode 100644 configs/hikey_defconfig
>  create mode 100644 include/configs/hikey.h

[...]

> +
> +int misc_init_r(void)
> +{
> +       init_usb_and_picophy();

Can board_usb_init or usb_lowlevel_init be used here?

> +
> +       return 0;
> +}
> +
> +int board_init(void)
> +{
> +       gd->flags = 0;
> +
> +       icache_enable();

The enable_caches call in board_r.c should do this for you.

> +
> +       return 0;
> +}
> +
> +#ifdef CONFIG_GENERIC_MMC
> +
> +static int init_dwmmc(void)
> +{
> +       int ret;
> +
> +#ifdef CONFIG_DWMMC
> +       /* mmc0 pinmux and clocks are already configured by ATF */
> +       ret = hi6220_dwmci_add_port(0, HI6220_MMC0_BASE, 8);
> +
> +       if (ret)
> +               printf("%s: Error adding eMMC port\n", __func__);
> +
> +       /* take mmc1 (sd slot) out of reset, configure clocks and pinmuxing */
> +
> +       mmc1_init_pll();
> +       mmc1_reset_clk();
> +       mmc1_setup_pinmux();
> +
> +       ret |= hi6220_dwmci_add_port(1, HI6220_MMC1_BASE, 4);
> +
> +       if (ret)
> +               printf("%s: Error adding SD port\n", __func__);
> +#endif
> +       return ret;
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> +       int ret;
> +
> +       /* init the pmussi ip */
> +       hi6220_pmussi_init();
> +
> +       /* init the hi6553 pmic */
> +       hikey_hi6553_init();
> +
> +       /* add the eMMC and sd ports */
> +       ret = init_dwmmc();
> +
> +       if (ret)
> +               debug("init_dwmmc failed\n");
> +
> +       return ret;
> +}
> +#endif
> +
> +int dram_init(void)
> +{
> +       gd->ram_size = PHYS_SDRAM_1_SIZE;
> +       return 0;
> +}
> +
> +void dram_init_banksize(void)
> +{
> +       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> +       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> +}
> +
> +/* Use the Watchdog to cause reset */
> +void reset_cpu(ulong addr)
> +{
> +       /* TODO program the watchdog */
> +}
> diff --git a/configs/hikey_defconfig b/configs/hikey_defconfig
> new file mode 100644
> index 0000000..50baf22
> --- /dev/null
> +++ b/configs/hikey_defconfig
> @@ -0,0 +1,5 @@
> +# 96boards HiKey
> +CONFIG_ARM=y
> +CONFIG_TARGET_HIKEY=y
> +CONFIG_SHOW_BOOT_PROGRESS=y
> +CONFIG_NET=y
> diff --git a/include/configs/hikey.h b/include/configs/hikey.h
> new file mode 100644
> index 0000000..303b857
> --- /dev/null
> +++ b/include/configs/hikey.h
> @@ -0,0 +1,168 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + *
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * Configuration for HiKey 96boards CE. Parts were derived from other ARM
> + * configurations.
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __HIKEY_AEMV8A_H
> +#define __HIKEY_AEMV8A_H

Drop the AEMV8A.

> +
> +/* We use generic board for hikey */
> +#define CONFIG_SYS_GENERIC_BOARD
> +
> +#define CONFIG_REMAKE_ELF
> +
> +#define CONFIG_SUPPORT_RAW_INITRD
> +
> +/* Cache Definitions */
> +#define CONFIG_SYS_DCACHE_OFF
> +
> +#define CONFIG_IDENT_STRING            "hikey"
> +
> +/* Flat Device Tree Definitions */
> +#define CONFIG_OF_LIBFDT
> +
> +/* Physical Memory Map */
> +
> +/* CONFIG_SYS_TEXT_BASE needs to align with where ATF loads bl33.bin */
> +#define CONFIG_SYS_TEXT_BASE           0x35000000
> +
> +#define CONFIG_NR_DRAM_BANKS           1
> +#define PHYS_SDRAM_1                   0x00000000
> +
> +/* 1008 MB (the last 16Mb are secured for TrustZone by ATF*/
> +#define PHYS_SDRAM_1_SIZE              0x3f000000
> +#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
> +
> +#define CONFIG_SYS_INIT_RAM_SIZE       0x1000
> +
> +#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE + 0x7fff0)
> +
> +#define CONFIG_SYS_LOAD_ADDR           (CONFIG_SYS_SDRAM_BASE + 0x80000)
> +
> +/* Generic Timer Definitions */
> +#define COUNTER_FREQUENCY              (19000000)
> +
> +/* Generic Interrupt Controller Definitions */
> +#define GICD_BASE                      (0xf6801000)
> +#define GICC_BASE                      (0xf6802000)
> +
> +/* Size of malloc() pool */
> +#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (8 << 20))
> +
> +/* PL011 Serial Configuration */
> +#define CONFIG_PL011_SERIAL
> +
> +#define CONFIG_PL011_CLOCK             19200000
> +#define CONFIG_PL01x_PORTS             {(void *)CONFIG_SYS_SERIAL0}
> +#define CONFIG_CONS_INDEX              0
> +
> +#define CONFIG_BAUDRATE                        115200
> +#define CONFIG_SYS_SERIAL0             0xF8015000

Just do:

#define CONFIG_PL01x_PORTS             {(void *)0xf8015000}

You are probably going to want to setup multiple serial consoles
(debug + LS header). That can come later, but I've figured out how to
enable that if you are interested.

> +
> +#define CONFIG_CMD_USB
> +#ifdef CONFIG_CMD_USB
> +#define CONFIG_USB_DWC2
> +#define CONFIG_USB_DWC2_REG_ADDR 0xF72C0000
> +/*#define CONFIG_DWC2_DFLT_SPEED_FULL*/
> +#define CONFIG_DWC2_ENABLE_DYNAMIC_FIFO
> +
> +#define CONFIG_USB_STORAGE
> +#define CONFIG_USB_HOST_ETHER
> +#define CONFIG_USB_ETHER_SMSC95XX
> +#define CONFIG_USB_ETHER_ASIX
> +#define CONFIG_MISC_INIT_R
> +#endif
> +
> +#define CONFIG_HIKEY_GPIO
> +#define CONFIG_DM_GPIO
> +#define CONFIG_CMD_GPIO
> +#define CONFIG_DM
> +
> +/* SD/MMC configuration */
> +#define CONFIG_GENERIC_MMC
> +#define CONFIG_MMC
> +#define CONFIG_DWMMC
> +#define CONFIG_HIKEY_DWMMC
> +#define CONFIG_BOUNCE_BUFFER
> +#define CONFIG_CMD_MMC
> +
> +#define CONFIG_FS_EXT4
> +#define CONFIG_FS_FAT

distro config should set this.

> +
> +/* Command line configuration */
> +#define CONFIG_MENU
> +#define CONFIG_CMD_CACHE
> +#define CONFIG_CMD_BDI
> +#define CONFIG_CMD_UNZIP
> +#define CONFIG_CMD_PXE

and this.

> +#define CONFIG_CMD_ENV
> +#define CONFIG_CMD_IMI
> +#define CONFIG_CMD_LOADB
> +#define CONFIG_CMD_MEMORY
> +#define CONFIG_CMD_SAVEENV
> +#define CONFIG_CMD_RUN
> +#define CONFIG_CMD_BOOTD
> +#define CONFIG_CMD_ECHO
> +#define CONFIG_CMD_SOURCE
> +
> +#define CONFIG_MAC_PARTITION

Supporting Mac partitions, really?

> +#define CONFIG_MTD_PARTITIONS

On what MTD device?

> +
> +/* BOOTP options */
> +#define CONFIG_BOOTP_BOOTFILESIZE
> +
> +#define CONFIG_CMD_NET
> +
> +#include <config_distro_defaults.h>
> +
> +/* Initial environment variables */
> +
> +/*
> + * Defines where the kernel and FDT exist in NOR flash and where it will
> + * be copied into DRAM
> + */
> +#define CONFIG_EXTRA_ENV_SETTINGS      \
> +                               "kernel_name=Image\0"   \
> +                               "kernel_addr=0x0000000\0" \

Shouldn't this be 0x80000 to avoid copying from 0x0 to 0x80000.

> +                               "fdt_name=hi6220-hikey.dtb\0" \
> +                               "fdt_addr=0x0300000\0" \
> +                               "max_fdt=0x100000\0" \

I don't think this is needed.

> +                               "fdt_high=0xffffffffffffffff\0" \
> +                               "initrd_high=0xffffffffffffffff\0" \
> +
> +/* Assume we boot with root on the first partition of a USB stick */
> +#define CONFIG_BOOTARGS                "console=ttyAMA0,115200n8 /dev/mmcblk0p7 rw "

/dev/mmcblk0p7 doesn't look right. You mean "root=/dev/..."?

> +
> +/* Copy the kernel and FDT to DRAM memory and boot */
> +#define CONFIG_BOOTCOMMAND     "booti $kernel_addr_r - $fdt_addr_r"

Don't you need to set these variables?

Also, don't you need to load the kernel and dtb first?

> +
> +#define CONFIG_BOOTDELAY               2
> +
> +/* Preserve enviroment onto sd card */
> +#define CONFIG_ENV_IS_IN_MMC
> +#define CONFIG_SYS_MMC_ENV_DEV         1
> +#define CONFIG_SYS_MMC_ENV_PART                0

Don't you have these reversed? The first MMC device is 0 and I think
partition numbering starts at 1.

> +#define CONFIG_ENV_OFFSET               0x0
> +#define CONFIG_ENV_SIZE                        0x1000
> +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
> +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT

Is redundant env necessary? It seems like this was more for raw NAND
and shouldn't really be needed for MMC.

Rob

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-10 18:36   ` Rob Herring
@ 2015-07-16  0:41     ` Peter Griffin
  2015-07-16 13:28       ` Rob Herring
  0 siblings, 1 reply; 23+ messages in thread
From: Peter Griffin @ 2015-07-16  0:41 UTC (permalink / raw)
  To: u-boot

Hi Rob,

On Fri, 10 Jul 2015, Rob Herring wrote:

> On Wed, Jul 8, 2015 at 10:57 AM, Peter Griffin <peter.griffin@linaro.org> wrote:
> > HiKey is the first 96boards consumer edition compliant board. It features a hi6220
> > SoC which has eight ARM A53 cpu's.
> >
> > This initial port adds support for: -
> > 1) Serial
> > 2) eMMC / sd card
> 
> s/sd/SD/

Will fix in v3

> 
> > 3) USB
> > 4) GPIO
> >
> > It has been tested with Arm Trusted Firmware running u-boot as the BL33 executable.
> >
> > Notes:
> >
> > eMMC has been tested with basic reading of eMMC partition intto DDR. I have not
> 
> s/intto/into/

Will fix in v3

> 
> > tested writing / erasing. Due to lack of clock control it won't be
> > running in the most performant high speed mode.
> >
> > SD card slot has been tested for reading and booting kernels into DDR.
> > It is also currently used for saving the u-boot enviroment.
> 
> s/enviroment/environment/

Will fix in v3.

> 
> > USB has been tested with ASIX networking adapter to tftpboot kernels
> > into DDR. On v2015.07-rc2 dhcp now works, and also usb mass storage
> 
> s/usb/USB/

Will fix in v3
> 
> > is enumerated correctly.
> >
> > GPIO has been tested using gpio toggle GPIO4_1-3 to flash LEDs.
> >
> > Basic SoC datasheet can be found here: -
> > https://github.com/96boards/documentation/blob/master/hikey/
> > Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
> >
> > Board schematic can be found here: -
> > https://github.com/96boards/documentation/blob/master/hikey/
> > 96Boards-Hikey-Rev-A1.pdf
> >
> > Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> > ---
> >  arch/arm/Kconfig               |   8 +
> >  board/hisilicon/hikey/Kconfig  |  15 ++
> >  board/hisilicon/hikey/Makefile |   8 +
> >  board/hisilicon/hikey/hikey.c  | 415 +++++++++++++++++++++++++++++++++++++++++
> >  configs/hikey_defconfig        |   5 +
> >  include/configs/hikey.h        | 168 +++++++++++++++++
> >  6 files changed, 619 insertions(+)
> >  create mode 100644 board/hisilicon/hikey/Kconfig
> >  create mode 100644 board/hisilicon/hikey/Makefile
> >  create mode 100644 board/hisilicon/hikey/hikey.c
> >  create mode 100644 configs/hikey_defconfig
> >  create mode 100644 include/configs/hikey.h
> 
> [...]
> 
> > +
> > +int misc_init_r(void)
> > +{
> > +       init_usb_and_picophy();
> 
> Can board_usb_init or usb_lowlevel_init be used here?

Umm I wasn't aware of those functions. It looks like usb_lowlevel_init() is used 
by the host controller driver. Other host controllers like ohci / ehci and xhci call
board_usb_init() from their usb_lowlevel_init function, but not dwc2.

So I can make use of board_usb_init() if I update dwc2.c generic code to call it
from usb_lowlevel_init(). I'll do this in V3 and hopefully nobody has any objections.

> 
> > +
> > +       return 0;
> > +}
> > +
> > +int board_init(void)
> > +{
> > +       gd->flags = 0;
> > +
> > +       icache_enable();
> 
> The enable_caches call in board_r.c should do this for you.

Ok, will remove in v3.

> 
> > +
> > +       return 0;
> > +}
> > +
> > +#ifdef CONFIG_GENERIC_MMC
> > +
> > +static int init_dwmmc(void)
> > +{
> > +       int ret;
> > +
> > +#ifdef CONFIG_DWMMC
> > +       /* mmc0 pinmux and clocks are already configured by ATF */
> > +       ret = hi6220_dwmci_add_port(0, HI6220_MMC0_BASE, 8);
> > +
> > +       if (ret)
> > +               printf("%s: Error adding eMMC port\n", __func__);
> > +
> > +       /* take mmc1 (sd slot) out of reset, configure clocks and pinmuxing */
> > +
> > +       mmc1_init_pll();
> > +       mmc1_reset_clk();
> > +       mmc1_setup_pinmux();
> > +
> > +       ret |= hi6220_dwmci_add_port(1, HI6220_MMC1_BASE, 4);
> > +
> > +       if (ret)
> > +               printf("%s: Error adding SD port\n", __func__);
> > +#endif
> > +       return ret;
> > +}
> > +
> > +int board_mmc_init(bd_t *bis)
> > +{
> > +       int ret;
> > +
> > +       /* init the pmussi ip */
> > +       hi6220_pmussi_init();
> > +
> > +       /* init the hi6553 pmic */
> > +       hikey_hi6553_init();
> > +
> > +       /* add the eMMC and sd ports */
> > +       ret = init_dwmmc();
> > +
> > +       if (ret)
> > +               debug("init_dwmmc failed\n");
> > +
> > +       return ret;
> > +}
> > +#endif
> > +
> > +int dram_init(void)
> > +{
> > +       gd->ram_size = PHYS_SDRAM_1_SIZE;
> > +       return 0;
> > +}
> > +
> > +void dram_init_banksize(void)
> > +{
> > +       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> > +       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> > +}
> > +
> > +/* Use the Watchdog to cause reset */
> > +void reset_cpu(ulong addr)
> > +{
> > +       /* TODO program the watchdog */
> > +}
> > diff --git a/configs/hikey_defconfig b/configs/hikey_defconfig
> > new file mode 100644
> > index 0000000..50baf22
> > --- /dev/null
> > +++ b/configs/hikey_defconfig
> > @@ -0,0 +1,5 @@
> > +# 96boards HiKey
> > +CONFIG_ARM=y
> > +CONFIG_TARGET_HIKEY=y
> > +CONFIG_SHOW_BOOT_PROGRESS=y
> > +CONFIG_NET=y
> > diff --git a/include/configs/hikey.h b/include/configs/hikey.h
> > new file mode 100644
> > index 0000000..303b857
> > --- /dev/null
> > +++ b/include/configs/hikey.h
> > @@ -0,0 +1,168 @@
> > +/*
> > + * (C) Copyright 2015 Linaro
> > + *
> > + * Peter Griffin <peter.griffin@linaro.org>
> > + *
> > + * Configuration for HiKey 96boards CE. Parts were derived from other ARM
> > + * configurations.
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +
> > +#ifndef __HIKEY_AEMV8A_H
> > +#define __HIKEY_AEMV8A_H
> 
> Drop the AEMV8A.

Ah, I thought I'd got rid of all that, but cleary missed this one.
Will remove in V3

> 
> > +
> > +/* We use generic board for hikey */
> > +#define CONFIG_SYS_GENERIC_BOARD
> > +
> > +#define CONFIG_REMAKE_ELF
> > +
> > +#define CONFIG_SUPPORT_RAW_INITRD
> > +
> > +/* Cache Definitions */
> > +#define CONFIG_SYS_DCACHE_OFF
> > +
> > +#define CONFIG_IDENT_STRING            "hikey"
> > +
> > +/* Flat Device Tree Definitions */
> > +#define CONFIG_OF_LIBFDT
> > +
> > +/* Physical Memory Map */
> > +
> > +/* CONFIG_SYS_TEXT_BASE needs to align with where ATF loads bl33.bin */
> > +#define CONFIG_SYS_TEXT_BASE           0x35000000
> > +
> > +#define CONFIG_NR_DRAM_BANKS           1
> > +#define PHYS_SDRAM_1                   0x00000000
> > +
> > +/* 1008 MB (the last 16Mb are secured for TrustZone by ATF*/
> > +#define PHYS_SDRAM_1_SIZE              0x3f000000
> > +#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
> > +
> > +#define CONFIG_SYS_INIT_RAM_SIZE       0x1000
> > +
> > +#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE + 0x7fff0)
> > +
> > +#define CONFIG_SYS_LOAD_ADDR           (CONFIG_SYS_SDRAM_BASE + 0x80000)
> > +
> > +/* Generic Timer Definitions */
> > +#define COUNTER_FREQUENCY              (19000000)
> > +
> > +/* Generic Interrupt Controller Definitions */
> > +#define GICD_BASE                      (0xf6801000)
> > +#define GICC_BASE                      (0xf6802000)
> > +
> > +/* Size of malloc() pool */
> > +#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (8 << 20))
> > +
> > +/* PL011 Serial Configuration */
> > +#define CONFIG_PL011_SERIAL
> > +
> > +#define CONFIG_PL011_CLOCK             19200000
> > +#define CONFIG_PL01x_PORTS             {(void *)CONFIG_SYS_SERIAL0}
> > +#define CONFIG_CONS_INDEX              0
> > +
> > +#define CONFIG_BAUDRATE                        115200
> > +#define CONFIG_SYS_SERIAL0             0xF8015000
> 
> Just do:
> 
> #define CONFIG_PL01x_PORTS             {(void *)0xf8015000}

Ok, fixed in V3

> 
> You are probably going to want to setup multiple serial consoles
> (debug + LS header). That can come later, but I've figured out how to
> enable that if you are interested.

Yes I'm interested, please do let me know :)

> 
> > +
> > +#define CONFIG_CMD_USB
> > +#ifdef CONFIG_CMD_USB
> > +#define CONFIG_USB_DWC2
> > +#define CONFIG_USB_DWC2_REG_ADDR 0xF72C0000
> > +/*#define CONFIG_DWC2_DFLT_SPEED_FULL*/
> > +#define CONFIG_DWC2_ENABLE_DYNAMIC_FIFO
> > +
> > +#define CONFIG_USB_STORAGE
> > +#define CONFIG_USB_HOST_ETHER
> > +#define CONFIG_USB_ETHER_SMSC95XX
> > +#define CONFIG_USB_ETHER_ASIX
> > +#define CONFIG_MISC_INIT_R
> > +#endif
> > +
> > +#define CONFIG_HIKEY_GPIO
> > +#define CONFIG_DM_GPIO
> > +#define CONFIG_CMD_GPIO
> > +#define CONFIG_DM
> > +
> > +/* SD/MMC configuration */
> > +#define CONFIG_GENERIC_MMC
> > +#define CONFIG_MMC
> > +#define CONFIG_DWMMC
> > +#define CONFIG_HIKEY_DWMMC
> > +#define CONFIG_BOUNCE_BUFFER
> > +#define CONFIG_CMD_MMC
> > +
> > +#define CONFIG_FS_EXT4
> > +#define CONFIG_FS_FAT
> 
> distro config should set this.

Ah ok, indirectly yes, as distro_config sets CONFIG_CMD_FAT, and if that is set
config_fallbacks.h will enable CONFIG_FS_FAT.

I've removed both CONFIG_FS_FAT and CONFIG_FS_EXT4 in v3

> 
> > +
> > +/* Command line configuration */
> > +#define CONFIG_MENU
> > +#define CONFIG_CMD_CACHE
> > +#define CONFIG_CMD_BDI
> > +#define CONFIG_CMD_UNZIP
> > +#define CONFIG_CMD_PXE
> 
> and this.

Whoops, missed this one. I've removed in V3

> 
> > +#define CONFIG_CMD_ENV
> > +#define CONFIG_CMD_IMI
> > +#define CONFIG_CMD_LOADB
> > +#define CONFIG_CMD_MEMORY
> > +#define CONFIG_CMD_SAVEENV
> > +#define CONFIG_CMD_RUN
> > +#define CONFIG_CMD_BOOTD
> > +#define CONFIG_CMD_ECHO
> > +#define CONFIG_CMD_SOURCE
> > +
> > +#define CONFIG_MAC_PARTITION
> 
> Supporting Mac partitions, really?

Will remove in V3. It doesn't look like I can blame that on
vexpress either, so I must have thought it was a good idea ;)

 
> > +#define CONFIG_MTD_PARTITIONS
> 
> On what MTD device?

Good point, Will remove in v3.

> 
> > +
> > +/* BOOTP options */
> > +#define CONFIG_BOOTP_BOOTFILESIZE
> > +
> > +#define CONFIG_CMD_NET
> > +
> > +#include <config_distro_defaults.h>
> > +
> > +/* Initial environment variables */
> > +
> > +/*
> > + * Defines where the kernel and FDT exist in NOR flash and where it will
> > + * be copied into DRAM
> > + */
> > +#define CONFIG_EXTRA_ENV_SETTINGS      \
> > +                               "kernel_name=Image\0"   \
> > +                               "kernel_addr=0x0000000\0" \
> 
> Shouldn't this be 0x80000 to avoid copying from 0x0 to 0x80000.

I've updated this. Kernel boot time is much reduced with this and also the
icache being enabled.

> 
> > +                               "fdt_name=hi6220-hikey.dtb\0" \
> > +                               "fdt_addr=0x0300000\0" \
> > +                               "max_fdt=0x100000\0" \
> 
> I don't think this is needed.

Removed in V3
> 
> > +                               "fdt_high=0xffffffffffffffff\0" \
> > +                               "initrd_high=0xffffffffffffffff\0" \
> > +
> > +/* Assume we boot with root on the first partition of a USB stick */
> > +#define CONFIG_BOOTARGS                "console=ttyAMA0,115200n8 /dev/mmcblk0p7 rw "
> 
> /dev/mmcblk0p7 doesn't look right. You mean "root=/dev/..."?

Good spot, yes your right. Plus now you highlight it the comment above also needs updating.

Will fix in V3.

> 
> > +
> > +/* Copy the kernel and FDT to DRAM memory and boot */
> > +#define CONFIG_BOOTCOMMAND     "booti $kernel_addr_r - $fdt_addr_r"
> 
> Don't you need to set these variables?
> 
> Also, don't you need to load the kernel and dtb first?

Yes, but I'm not sure quite what to make the default here. My personal
workflow is: -

 "usb start; dhcp; tftp $kernel_addr $kernel_name; tftp $fdt_addr $fdt_name;
   booti $kernel_addr - $fdt_addr"

So I could use that unless you have a better idea?

> 
> > +
> > +#define CONFIG_BOOTDELAY               2
> > +
> > +/* Preserve enviroment onto sd card */
> > +#define CONFIG_ENV_IS_IN_MMC
> > +#define CONFIG_SYS_MMC_ENV_DEV         1
> > +#define CONFIG_SYS_MMC_ENV_PART                0
> 
> Don't you have these reversed? The first MMC device is 0 and I think
> partition numbering starts at 1.

Having CONFIG_SYS_MMC_ENV_DEV 1 was deliberate, as the first device is eMMC, and 
I don't have a "official" partition to save the u-boot enviroment in.
So as not to corrupt anything folks may have flashed into eMMC from the official
builds I opted to save the u-boot env to SD card which is device 1.

However that seems to have been working by luck with ENC_PART being 0, and it was
actually corrupting the partition table of the SD card. Looking more closely I think
what I should of used is 

#define CONFIG_ENV_IS_IN_FAT
#define FAT_ENV_INTERFACE               "mmc"
#define FAT_ENV_DEVICE_AND_PART         "1:1"
#define FAT_ENV_FILE                    "uboot.env"

This then saves the enviroment on a fat formatted SD card with the filename
u-boot.env. This is what I plan on using for v3.

Maybe I should additionally request some space in the official eMMC parition 
table and then we could switch over to using that.

> 
> > +#define CONFIG_ENV_OFFSET               0x0
> > +#define CONFIG_ENV_SIZE                        0x1000
> > +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
> > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
> 
> Is redundant env necessary? It seems like this was more for raw NAND
> and shouldn't really be needed for MMC.

README file documents it as being valid for CONFIG_ENV_IS_IN_MMC, and a bunch of boards
declare it with their CONFIG_ENV_IS_IN_MMC such as omap5_uevm.h, dra7xx_evm.h,
am335x_evm.h. Whilst using managed NAND should be more reliable, I think it
is still used in case there is a power failure whilst issuing 'saveenv'.

Anyways with moving to CONFIG_ENV_IS_IN_FAT I won't need it anymore so it will be
removed in V3.

Many thanks for your thorough reviews, you've spotted some really good stuff
that has meant boot time is now a lot quicker, and I will no longer be crapping
over peoples SD card partition table :)

kind regards,

Peter.

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-16  0:41     ` Peter Griffin
@ 2015-07-16 13:28       ` Rob Herring
  2015-07-16 13:39         ` Tom Rini
  2015-07-29 20:59         ` Peter Griffin
  0 siblings, 2 replies; 23+ messages in thread
From: Rob Herring @ 2015-07-16 13:28 UTC (permalink / raw)
  To: u-boot

On Wed, Jul 15, 2015 at 7:41 PM, Peter Griffin <peter.griffin@linaro.org> wrote:
> Hi Rob,
>
> On Fri, 10 Jul 2015, Rob Herring wrote:
>
>> On Wed, Jul 8, 2015 at 10:57 AM, Peter Griffin <peter.griffin@linaro.org> wrote:
>> > HiKey is the first 96boards consumer edition compliant board. It features a hi6220
>> > SoC which has eight ARM A53 cpu's.
>> >

[...]

>> > +#define CONFIG_BAUDRATE                        115200
>> > +#define CONFIG_SYS_SERIAL0             0xF8015000
>>
>> Just do:
>>
>> #define CONFIG_PL01x_PORTS             {(void *)0xf8015000}
>
> Ok, fixed in V3
>
>>
>> You are probably going to want to setup multiple serial consoles
>> (debug + LS header). That can come later, but I've figured out how to
>> enable that if you are interested.
>
> Yes I'm interested, please do let me know :)

See this commit:

https://git.linaro.org/people/rob.herring/u-boot.git/commitdiff/f1d0aef06ae7fe09793d46589bd94fa36c45bbc0

This may be 8250 specific and require more work for pl011 driver. The
mixture of 0 and 1 based indexing makes it fun too.


>> > +#define CONFIG_EXTRA_ENV_SETTINGS      \
>> > +                               "kernel_name=Image\0"   \
>> > +                               "kernel_addr=0x0000000\0" \
>>
>> Shouldn't this be 0x80000 to avoid copying from 0x0 to 0x80000.
>
> I've updated this. Kernel boot time is much reduced with this and also the
> icache being enabled.

Also, this should be kernel_addr_r

>
>>
>> > +                               "fdt_name=hi6220-hikey.dtb\0" \
>> > +                               "fdt_addr=0x0300000\0" \

and fdt_addr_r

>> > +                               "max_fdt=0x100000\0" \
>>
>> I don't think this is needed.
>
> Removed in V3
>>
>> > +                               "fdt_high=0xffffffffffffffff\0" \
>> > +                               "initrd_high=0xffffffffffffffff\0" \
>> > +
>> > +/* Assume we boot with root on the first partition of a USB stick */
>> > +#define CONFIG_BOOTARGS                "console=ttyAMA0,115200n8 /dev/mmcblk0p7 rw "
>>
>> /dev/mmcblk0p7 doesn't look right. You mean "root=/dev/..."?
>
> Good spot, yes your right. Plus now you highlight it the comment above also needs updating.
>
> Will fix in V3.
>
>>
>> > +
>> > +/* Copy the kernel and FDT to DRAM memory and boot */
>> > +#define CONFIG_BOOTCOMMAND     "booti $kernel_addr_r - $fdt_addr_r"
>>
>> Don't you need to set these variables?
>>
>> Also, don't you need to load the kernel and dtb first?
>
> Yes, but I'm not sure quite what to make the default here. My personal
> workflow is: -
>
>  "usb start; dhcp; tftp $kernel_addr $kernel_name; tftp $fdt_addr $fdt_name;
>    booti $kernel_addr - $fdt_addr"
>
> So I could use that unless you have a better idea?

Not really as everyone has their own preferences. I have some thing like this:

#define CONFIG_BOOTCOMMAND \
"while true; do " \
"mmc read ${fdt_addr_r} 0x10000 0x1000; " \
"fastboot; " \
"mmc read ${fdt_addr_r} 0x10000 0x1000; " \
"mmc read ${kernel_addr_r} 0x8000 0x8000 && " \
"bootm ${kernel_addr_r} ${kernel_addr_r} ${fdt_addr_r};" \
"done"

This relies on fastboot doing USB cable detection and it exits if no
USB connection.

USB ethernet is as good a default as any. Otherwise reading Image and
dtb from the 1st or bootable partition (the default) would be
reasonable.


>> > +/* Preserve enviroment onto sd card */
>> > +#define CONFIG_ENV_IS_IN_MMC
>> > +#define CONFIG_SYS_MMC_ENV_DEV         1
>> > +#define CONFIG_SYS_MMC_ENV_PART                0
>>
>> Don't you have these reversed? The first MMC device is 0 and I think
>> partition numbering starts at 1.
>
> Having CONFIG_SYS_MMC_ENV_DEV 1 was deliberate, as the first device is eMMC, and
> I don't have a "official" partition to save the u-boot enviroment in.
> So as not to corrupt anything folks may have flashed into eMMC from the official
> builds I opted to save the u-boot env to SD card which is device 1.

Okay, but don't you have spare space in the partition with u-boot? I
have a single bootloader partition 1MB in size and the last 8? KB is
the env.

> However that seems to have been working by luck with ENC_PART being 0, and it was
> actually corrupting the partition table of the SD card. Looking more closely I think
> what I should of used is
>
> #define CONFIG_ENV_IS_IN_FAT
> #define FAT_ENV_INTERFACE               "mmc"
> #define FAT_ENV_DEVICE_AND_PART         "1:1"
> #define FAT_ENV_FILE                    "uboot.env"
>
> This then saves the enviroment on a fat formatted SD card with the filename
> u-boot.env. This is what I plan on using for v3.
>
> Maybe I should additionally request some space in the official eMMC parition
> table and then we could switch over to using that.
>
>>
>> > +#define CONFIG_ENV_OFFSET               0x0
>> > +#define CONFIG_ENV_SIZE                        0x1000
>> > +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
>> > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
>>
>> Is redundant env necessary? It seems like this was more for raw NAND
>> and shouldn't really be needed for MMC.
>
> README file documents it as being valid for CONFIG_ENV_IS_IN_MMC, and a bunch of boards
> declare it with their CONFIG_ENV_IS_IN_MMC such as omap5_uevm.h, dra7xx_evm.h,
> am335x_evm.h. Whilst using managed NAND should be more reliable, I think it
> is still used in case there is a power failure whilst issuing 'saveenv'.

Perhaps a bunch of cut and paste. I'd guess there are many more
platforms that use MMC and don't enable redundant.

> Anyways with moving to CONFIG_ENV_IS_IN_FAT I won't need it anymore so it will be
> removed in V3.

Storing in FAT probably only increases your chance of failure from
power failure. :)

Rob

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-16 13:28       ` Rob Herring
@ 2015-07-16 13:39         ` Tom Rini
  2015-07-29 20:59         ` Peter Griffin
  1 sibling, 0 replies; 23+ messages in thread
From: Tom Rini @ 2015-07-16 13:39 UTC (permalink / raw)
  To: u-boot

On Thu, Jul 16, 2015 at 08:28:03AM -0500, Rob Herring wrote:
> On Wed, Jul 15, 2015 at 7:41 PM, Peter Griffin <peter.griffin@linaro.org> wrote:
[snip]
> >> > +#define CONFIG_ENV_OFFSET               0x0
> >> > +#define CONFIG_ENV_SIZE                        0x1000
> >> > +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
> >> > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
> >>
> >> Is redundant env necessary? It seems like this was more for raw NAND
> >> and shouldn't really be needed for MMC.
> >
> > README file documents it as being valid for CONFIG_ENV_IS_IN_MMC, and a bunch of boards
> > declare it with their CONFIG_ENV_IS_IN_MMC such as omap5_uevm.h, dra7xx_evm.h,
> > am335x_evm.h. Whilst using managed NAND should be more reliable, I think it
> > is still used in case there is a power failure whilst issuing 'saveenv'.
> 
> Perhaps a bunch of cut and paste. I'd guess there are many more
> platforms that use MMC and don't enable redundant.

No, we turn it on, on purpose, out of a certain level of paranoia (and
for ref boards like those, showing everything one could do, let $company
and their experts argue of which failure possibilities are the important
ones).

> > Anyways with moving to CONFIG_ENV_IS_IN_FAT I won't need it anymore so it will be
> > removed in V3.
> 
> Storing in FAT probably only increases your chance of failure from
> power failure. :)

True but IMHO env in FAT is the most friendly option for a community
board. "Broke your ENV?  Stick the SD card in your PC, delete .." "Here,
take a look at my env, copy this file ..." and all that.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20150716/14efecdc/attachment.sig>

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

* [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver.
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver Peter Griffin
@ 2015-07-18 14:37   ` Simon Glass
  0 siblings, 0 replies; 23+ messages in thread
From: Simon Glass @ 2015-07-18 14:37 UTC (permalink / raw)
  To: u-boot

Hi Peter,

On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> This patch adds support for the GPIO perif found on hi6220
> SoC.
>
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---
>  arch/arm/include/asm/arch-hi6220/gpio.h | 29 ++++++++++
>  drivers/gpio/Makefile                   |  2 +
>  drivers/gpio/hi6220_gpio.c              | 95 +++++++++++++++++++++++++++++++++
>  3 files changed, 126 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-hi6220/gpio.h
>  create mode 100644 drivers/gpio/hi6220_gpio.c
>
> diff --git a/arch/arm/include/asm/arch-hi6220/gpio.h b/arch/arm/include/asm/arch-hi6220/gpio.h
> new file mode 100644
> index 0000000..98122a2
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-hi6220/gpio.h
> @@ -0,0 +1,29 @@
> +/*
> + * Copyright (C) 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef _HI6220_GPIO_H_
> +#define _HI6220_GPIO_H_
> +
> +#define HI6220_GPIO_BASE(bank) (((bank < 4) ? 0xf8011000 : \
> +                               0xf7020000 - 0x4000) + (0x1000 * bank))
> +
> +#define BIT(x)                 (1 << (x))

I thought we had this in U-Boot now but cannot find it.

> +
> +#define HI6220_GPIO_PER_BANK   8
> +#define HI6220_GPIO_DIR                0x400
> +
> +struct gpio_bank {
> +       u8 *base;       /* address of registers in physical memory */
> +};

We should use a C struct to access registers. See here:

http://www.denx.de/wiki/U-Boot/CodingStyle

> +
> +/* Information about a GPIO bank */
> +struct hikey_gpio_platdata {
> +       int bank_index;
> +       unsigned int base;     /* address of registers in physical memory */
> +};
> +
> +#endif /* _HI6220_GPIO_H_ */
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index 5864850..b470bab 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -46,3 +46,5 @@ obj-$(CONFIG_LPC32XX_GPIO)    += lpc32xx_gpio.o
>  obj-$(CONFIG_STM32_GPIO)       += stm32_gpio.o
>  obj-$(CONFIG_ZYNQ_GPIO)                += zynq_gpio.o
>  obj-$(CONFIG_VYBRID_GPIO)      += vybrid_gpio.o
> +obj-$(CONFIG_HIKEY_GPIO)       += hi6220_gpio.o
> +
> diff --git a/drivers/gpio/hi6220_gpio.c b/drivers/gpio/hi6220_gpio.c
> new file mode 100644
> index 0000000..3f41bff
> --- /dev/null
> +++ b/drivers/gpio/hi6220_gpio.c
> @@ -0,0 +1,95 @@
> +/*
> + * Copyright (C) 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <asm/gpio.h>
> +#include <asm/io.h>
> +#include <errno.h>
> +
> +static int hi6220_gpio_direction_input(struct udevice *dev, unsigned int gpio)
> +{
> +       struct gpio_bank *bank = dev_get_priv(dev);
> +       u8 data;
> +
> +       data = readb(bank->base + HI6220_GPIO_DIR);
> +       data &= ~(1 << gpio);
> +       writeb(data, bank->base + HI6220_GPIO_DIR);

Something like this:

clrbits_8(&regs->gpio_dir, 1 << gpio)

> +
> +       return 0;
> +}
> +
> +static int hi6220_gpio_set_value(struct udevice *dev, unsigned gpio,
> +                                 int value)
> +{
> +       struct gpio_bank *bank = dev_get_priv(dev);
> +
> +       writeb(!!value << gpio, bank->base + (BIT(gpio + 2)));

Ick, use struct access.

> +       return 0;
> +}
> +
> +static int hi6220_gpio_direction_output(struct udevice *dev, unsigned gpio,
> +                                       int value)
> +{
> +       struct gpio_bank *bank = dev_get_priv(dev);
> +       u8 data;
> +
> +       data = readb(bank->base + HI6220_GPIO_DIR);
> +       data |= 1 << gpio;
> +       writeb(data, bank->base + HI6220_GPIO_DIR);
> +
> +       hi6220_gpio_set_value(dev, gpio, value);
> +
> +       return 0;
> +}
> +
> +static int hi6220_gpio_get_value(struct udevice *dev, unsigned gpio)
> +{
> +       struct gpio_bank *bank = dev_get_priv(dev);
> +
> +       return !!readb(bank->base + (BIT(gpio + 2)));
> +}
> +
> +
> +
> +static const struct dm_gpio_ops gpio_hi6220_ops = {
> +       .direction_input        = hi6220_gpio_direction_input,
> +       .direction_output       = hi6220_gpio_direction_output,
> +       .get_value              = hi6220_gpio_get_value,
> +       .set_value              = hi6220_gpio_set_value,
> +};
> +
> +static int hi6220_gpio_probe(struct udevice *dev)
> +{
> +       struct gpio_bank *bank = dev_get_priv(dev);
> +       struct hikey_gpio_platdata *plat = dev_get_platdata(dev);
> +       struct gpio_dev_priv *uc_priv = dev->uclass_priv;
> +       char name[18], *str;
> +
> +       sprintf(name, "GPIO%d_", plat->bank_index);

Could use just use 'GP' or 'P'? This seems quite long as a name. Also
I don't think you want the %d.
> +
> +       str = strdup(name);
> +       if (!str)
> +               return -ENOMEM;
> +
> +       uc_priv->bank_name = str;
> +       uc_priv->gpio_count = HI6220_GPIO_PER_BANK;
> +
> +       bank->base = (u8 *)plat->base;
> +
> +       return 0;
> +}
> +
> +U_BOOT_DRIVER(gpio_hi6220) = {
> +       .name   = "gpio_hi6220",
> +       .id     = UCLASS_GPIO,
> +       .ops    = &gpio_hi6220_ops,
> +       .probe  = hi6220_gpio_probe,
> +       .priv_auto_alloc_size = sizeof(struct gpio_bank),
> +};
> +
> +
> --
> 1.9.1
>

Regards,
Simon

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

* [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files.
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files Peter Griffin
@ 2015-07-18 14:37   ` Simon Glass
  2015-07-29 21:07     ` Peter Griffin
  0 siblings, 1 reply; 23+ messages in thread
From: Simon Glass @ 2015-07-18 14:37 UTC (permalink / raw)
  To: u-boot

Hi Peter,

On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> This patch adds the header files which will be used in the subsquent
> board / drivers to enable support for hi6220 hikey board.
>
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---
>  arch/arm/include/asm/arch-hi6220/hi6220.h          | 324 +++++++++++++++++++
>  .../include/asm/arch-hi6220/hi6220_regs_alwayson.h | 349 +++++++++++++++++++++
>  2 files changed, 673 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220.h
>  create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h
>
> diff --git a/arch/arm/include/asm/arch-hi6220/hi6220.h b/arch/arm/include/asm/arch-hi6220/hi6220.h
> new file mode 100644
> index 0000000..3ddec91
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-hi6220/hi6220.h
> @@ -0,0 +1,324 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __HI6220_H__
> +#define __HI6220_H__
> +
> +#include "hi6220_regs_alwayson.h"
> +
> +#define HI6220_MMC0_BASE                       0xF723D000
> +#define HI6220_MMC1_BASE                       0xF723E000
> +
> +#define HI6220_PMUSSI_BASE                     0xF8000000
> +
> +#define HI6220_PERI_BASE                       0xF7030000
> +
> +#define PERI_SC_PERIPH_CTRL1                   (HI6220_PERI_BASE + 0x000)
> +

I think you should have:

struct peri_sc_regs {
   u32 ctrl1;
   u32 ctrl2;
...
};

U-Boot uses structs for I/O access.

> +#define PERI_CTRL1_ETR_AXI_CSYSREQ_N                   (1 << 0)
> +#define PERI_CTRL1_HIFI_INT_MASK                       (1 << 1)
> +#define PERI_CTRL1_HIFI_ALL_INT_MASK                   (1 << 2)
> +#define PERI_CTRL1_ETR_AXI_CSYSREQ_N_MSK               (1 << 16)
> +#define PERI_CTRL1_HIFI_INT_MASK_MSK                   (1 << 17)
> +#define PERI_CTRL1_HIFI_ALL_INT_MASK_MSK               (1 << 18)
> +
> +
> +#define PERI_SC_PERIPH_CTRL2                   (HI6220_PERI_BASE + 0x004)
> +
> +#define PERI_CTRL2_MMC_CLK_PHASE_BYPASS_EN_MMC0                (1 << 0)
> +#define PERI_CTRL2_MMC_CLK_PHASE_BYPASS_EN_MMC1                (1 << 2)
> +#define PERI_CTRL2_NAND_SYS_MEM_SEL                    (1 << 6)
> +#define PERI_CTRL2_G3D_DDRT_AXI_SEL                    (1 << 7)
> +#define PERI_CTRL2_GU_MDM_BBP_TESTPIN_SEL              (1 << 8)
> +#define PERI_CTRL2_CODEC_SSI_MASTER_CHECK              (1 << 9)
> +#define PERI_CTRL2_FUNC_TEST_SOFT                      (1 << 12)
> +#define PERI_CTRL2_CSSYS_TS_ENABLE                     (1 << 15)
> +#define PERI_CTRL2_HIFI_RAMCTRL_S_EMA                  (1 << 16)
> +#define PERI_CTRL2_HIFI_RAMCTRL_S_EMAW                 (1 << 20)
> +#define PERI_CTRL2_HIFI_RAMCTRL_S_EMAS                 (1 << 22)
> +#define PERI_CTRL2_HIFI_RAMCTRL_S_RET1N                        (1 << 26)
> +#define PERI_CTRL2_HIFI_RAMCTRL_S_RET2N                        (1 << 27)
> +#define PERI_CTRL2_HIFI_RAMCTRL_S_PGEN                 (1 << 28)
> +
> +#define PERI_SC_PERIPH_CTRL3                   (HI6220_PERI_BASE + 0x008)
> +
> +#define PERI_CTRL3_HIFI_DDR_HARQMEM_ADDR               (1 << 0)
> +#define PERI_CTRL3_HIFI_HARQMEMRMP_EN                  (1 << 12)
> +#define PERI_CTRL3_HARQMEM_SYS_MED_SEL                 (1 << 13)
> +#define PERI_CTRL3_SOC_AP_OCCUPY_GRP1                  (1 << 14)
> +#define PERI_CTRL3_SOC_AP_OCCUPY_GRP2                  (1 << 16)
> +#define PERI_CTRL3_SOC_AP_OCCUPY_GRP3                  (1 << 18)
> +#define PERI_CTRL3_SOC_AP_OCCUPY_GRP4                  (1 << 20)
> +#define PERI_CTRL3_SOC_AP_OCCUPY_GRP5                  (1 << 22)
> +#define PERI_CTRL3_SOC_AP_OCCUPY_GRP6                  (1 << 24)
> +
> +#define PERI_SC_PERIPH_CTRL4                   (HI6220_PERI_BASE + 0x00c)

[snip]

Regards,
Simon

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

* [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic Peter Griffin
@ 2015-07-18 14:37   ` Simon Glass
  2015-07-29 21:04     ` Peter Griffin
  0 siblings, 1 reply; 23+ messages in thread
From: Simon Glass @ 2015-07-18 14:37 UTC (permalink / raw)
  To: u-boot

Hi Peter,

On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> This pmic is used on the 96boards consumer edition HiKey board.
>
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---
>  arch/arm/include/asm/arch-hi6220/hi6553.h | 75 +++++++++++++++++++++++++++++++
>  1 file changed, 75 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-hi6220/hi6553.h

Should be in drivers/power/pmic I think. Also use struct for reg
access. Should probably use the new PMIC uclass (we can convert it
later if you don't have a device tree yet).

>
> diff --git a/arch/arm/include/asm/arch-hi6220/hi6553.h b/arch/arm/include/asm/arch-hi6220/hi6553.h
> new file mode 100644
> index 0000000..d0770e1
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-hi6220/hi6553.h
> @@ -0,0 +1,75 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __HI6553_PMIC_H__
> +#define __HI6553_PMIC_H__
> +
> +#define HI6553_DISABLE6_XO_CLK                 0x036
> +
> +#define HI6553_DISABLE6_XO_CLK_BB              (1 << 0)
> +#define HI6553_DISABLE6_XO_CLK_CONN            (1 << 1)
> +#define HI6553_DISABLE6_XO_CLK_NFC             (1 << 2)
> +#define HI6553_DISABLE6_XO_CLK_RF1             (1 << 3)
> +#define HI6553_DISABLE6_XO_CLK_RF2             (1 << 4)
> +
> +#define HI6553_VERSION_REG                     0x000
> +#define HI6553_ENABLE2_LDO1_8                  0x029
> +#define HI6553_DISABLE2_LDO1_8                 0x02a
> +#define HI6553_ONOFF_STATUS2_LDO1_8            0x02b
> +#define HI6553_ENABLE3_LDO9_16                 0x02c
> +#define HI6553_DISABLE3_LDO9_16                        0x02d
> +#define HI6553_ONOFF_STATUS3_LDO9_16           0x02e
> +#define HI6553_PERI_EN_MARK                    0x040
> +#define HI6553_BUCK2_REG1                      0x04a
> +#define HI6553_BUCK2_REG5                      0x04e
> +#define HI6553_BUCK2_REG6                      0x04f
> +#define HI6553_BUCK3_REG3                      0x054
> +#define HI6553_BUCK3_REG5                      0x056
> +#define HI6553_BUCK3_REG6                      0x057
> +#define HI6553_BUCK4_REG2                      0x05b
> +#define HI6553_BUCK4_REG5                      0x05e
> +#define HI6553_BUCK4_REG6                      0x05f
> +#define HI6553_CLK_TOP0                                0x063
> +#define HI6553_CLK_TOP3                                0x066
> +#define HI6553_CLK_TOP4                                0x067
> +#define HI6553_VSET_BUCK2_ADJ                  0x06d
> +#define HI6553_VSET_BUCK3_ADJ                  0x06e
> +#define HI6553_LDO7_REG_ADJ                    0x078
> +#define HI6553_LDO10_REG_ADJ                   0x07b
> +#define HI6553_LDO19_REG_ADJ                   0x084
> +#define HI6553_LDO20_REG_ADJ                   0x085
> +#define HI6553_DR_LED_CTRL                     0x098
> +#define HI6553_DR_OUT_CTRL                     0x099
> +#define HI6553_DR3_ISET                                0x09a
> +#define HI6553_DR3_START_DEL                   0x09b
> +#define HI6553_DR4_ISET                                0x09c
> +#define HI6553_DR4_START_DEL                   0x09d
> +#define HI6553_DR345_TIM_CONF0                 0x0a0
> +#define HI6553_NP_REG_ADJ1                     0x0be
> +#define HI6553_NP_REG_CHG                      0x0c0
> +#define HI6553_BUCK01_CTRL2                    0x0d9
> +#define HI6553_BUCK0_CTRL1                     0x0dd
> +#define HI6553_BUCK0_CTRL5                     0x0e1
> +#define HI6553_BUCK0_CTRL7                     0x0e3
> +#define HI6553_BUCK1_CTRL1                     0x0e8
> +#define HI6553_BUCK1_CTRL5                     0x0ec
> +#define HI6553_BUCK1_CTRL7                     0x0ef
> +#define HI6553_CLK19M2_600_586_EN              0x0fe
> +
> +#define HI6553_LED_START_DELAY_TIME            0x00
> +#define HI6553_LED_ELEC_VALUE                  0x07
> +#define HI6553_LED_LIGHT_TIME                  0xf0
> +#define HI6553_LED_GREEN_ENABLE                        (1 << 1)
> +#define HI6553_LED_OUT_CTRL                    0x00
> +
> +#define HI6553_PMU_V300                                0x30
> +#define HI6553_PMU_V310                                0x31
> +
> +unsigned char hi6553_read_8(unsigned int offset);
> +void hi6553_write_8(unsigned int offset, unsigned char value);
> +
> +#endif /* __HI6553_PMIC_H__ */
> --
> 1.9.1
>

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

* [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller.
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller Peter Griffin
  2015-07-09  4:30   ` Jaehoon Chung
@ 2015-07-18 14:38   ` Simon Glass
  2015-07-19  9:39     ` Peter Griffin
  1 sibling, 1 reply; 23+ messages in thread
From: Simon Glass @ 2015-07-18 14:38 UTC (permalink / raw)
  To: u-boot

Hi Peter,

On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> This patch adds the glue code for hi6220 SoC which has 2x synopsis
> dw_mmc controllers. This will be used by the hikey board support
> in subsequent patches.
>
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---

Reviewed-by: Simon Glass <sjg@chromium.org>

(see nit below - this could be moved to device tree once you have it)

>  arch/arm/include/asm/arch-hi6220/dwmmc.h |  8 +++++
>  drivers/mmc/Makefile                     |  1 +
>  drivers/mmc/hi6220_dw_mmc.c              | 56 ++++++++++++++++++++++++++++++++
>  3 files changed, 65 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-hi6220/dwmmc.h
>  create mode 100644 drivers/mmc/hi6220_dw_mmc.c
>
> diff --git a/arch/arm/include/asm/arch-hi6220/dwmmc.h b/arch/arm/include/asm/arch-hi6220/dwmmc.h
> new file mode 100644
> index 0000000..c747383
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-hi6220/dwmmc.h
> @@ -0,0 +1,8 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width);
> diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
> index ed73687..81a1a8f 100644
> --- a/drivers/mmc/Makefile
> +++ b/drivers/mmc/Makefile
> @@ -11,6 +11,7 @@ obj-$(CONFIG_BFIN_SDH) += bfin_sdh.o
>  obj-$(CONFIG_DAVINCI_MMC) += davinci_mmc.o
>  obj-$(CONFIG_DWMMC) += dw_mmc.o
>  obj-$(CONFIG_EXYNOS_DWMMC) += exynos_dw_mmc.o
> +obj-$(CONFIG_HIKEY_DWMMC) += hi6220_dw_mmc.o
>  obj-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o
>  obj-$(CONFIG_FTSDC010) += ftsdc010_mci.o
>  obj-$(CONFIG_FTSDC021) += ftsdc021_sdhci.o
> diff --git a/drivers/mmc/hi6220_dw_mmc.c b/drivers/mmc/hi6220_dw_mmc.c
> new file mode 100644
> index 0000000..106f673
> --- /dev/null
> +++ b/drivers/mmc/hi6220_dw_mmc.c
> @@ -0,0 +1,56 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * peter.griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dwmmc.h>
> +#include <malloc.h>
> +#include <asm-generic/errno.h>
> +
> +#define        DWMMC_MAX_CH_NUM                4
> +
> +#define        DWMMC_MAX_FREQ                  50000000
> +#define        DWMMC_MIN_FREQ                  378000
> +
> +/* Source clock is configured to 100Mhz by ATF bl1*/

nit: MHz

> +#define MMC0_DEFAULT_FREQ              100000000
> +
> +static int hi6220_dwmci_core_init(struct dwmci_host *host, int index)
> +{
> +       host->name = "HiKey DWMMC";
> +
> +       host->dev_index = index;
> +
> +       /* Add the mmc channel to be registered with mmc core */
> +       if (add_dwmci(host, DWMMC_MAX_FREQ, DWMMC_MIN_FREQ)) {
> +               printf("DWMMC%d registration failed\n", index);
> +               return -1;
> +       }
> +       return 0;
> +}
> +
> +/*
> + * This function adds the mmc channel to be registered with mmc core.
> + * index -     mmc channel number.
> + * regbase -   register base address of mmc channel specified in 'index'.
> + * bus_width - operating bus width of mmc channel specified in 'index'.
> + */
> +int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width)
> +{
> +       struct dwmci_host *host = NULL;
> +
> +       host = calloc(1, sizeof(struct dwmci_host));
> +       if (!host) {
> +               error("dwmci_host malloc fail!\n");
> +               return -ENOMEM;
> +       }
> +
> +       host->ioaddr = (void *)regbase;
> +       host->buswidth = bus_width;
> +       host->bus_hz = MMC0_DEFAULT_FREQ;
> +
> +       return hi6220_dwmci_core_init(host, index);
> +}
> --
> 1.9.1
>

Regards,
Simon

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-08 15:57 ` [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board Peter Griffin
  2015-07-10 18:36   ` Rob Herring
@ 2015-07-18 14:38   ` Simon Glass
  2015-07-28 17:37     ` Peter Griffin
  1 sibling, 1 reply; 23+ messages in thread
From: Simon Glass @ 2015-07-18 14:38 UTC (permalink / raw)
  To: u-boot

Hi Peter,

On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> HiKey is the first 96boards consumer edition compliant board. It features a hi6220
> SoC which has eight ARM A53 cpu's.
>
> This initial port adds support for: -
> 1) Serial
> 2) eMMC / sd card
> 3) USB
> 4) GPIO
>
> It has been tested with Arm Trusted Firmware running u-boot as the BL33 executable.
>
> Notes:
>
> eMMC has been tested with basic reading of eMMC partition intto DDR. I have not
> tested writing / erasing. Due to lack of clock control it won't be
> running in the most performant high speed mode.
>
> SD card slot has been tested for reading and booting kernels into DDR.
> It is also currently used for saving the u-boot enviroment.
>
> USB has been tested with ASIX networking adapter to tftpboot kernels
> into DDR. On v2015.07-rc2 dhcp now works, and also usb mass storage
> is enumerated correctly.
>
> GPIO has been tested using gpio toggle GPIO4_1-3 to flash LEDs.
>
> Basic SoC datasheet can be found here: -
> https://github.com/96boards/documentation/blob/master/hikey/
> Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
>
> Board schematic can be found here: -
> https://github.com/96boards/documentation/blob/master/hikey/
> 96Boards-Hikey-Rev-A1.pdf
>
> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> ---
>  arch/arm/Kconfig               |   8 +
>  board/hisilicon/hikey/Kconfig  |  15 ++
>  board/hisilicon/hikey/Makefile |   8 +
>  board/hisilicon/hikey/hikey.c  | 415 +++++++++++++++++++++++++++++++++++++++++
>  configs/hikey_defconfig        |   5 +
>  include/configs/hikey.h        | 168 +++++++++++++++++
>  6 files changed, 619 insertions(+)
>  create mode 100644 board/hisilicon/hikey/Kconfig
>  create mode 100644 board/hisilicon/hikey/Makefile
>  create mode 100644 board/hisilicon/hikey/hikey.c
>  create mode 100644 configs/hikey_defconfig
>  create mode 100644 include/configs/hikey.h
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 2985e6e..d0b7939 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -721,6 +721,13 @@ config TARGET_LS2085ARDB
>           development platform that supports the QorIQ LS2085A
>           Layerscape Architecture processor.
>
> +config TARGET_HIKEY
> +       bool "Support HiKey 96boards Consumer Edition Platform"
> +       select ARM64
> +         help
> +         Support for HiKey 96boards platform. It features a HI6220
> +         SoC, with 8xA53 CPU, mali450 gpu, and 1GB RAM.
> +
>  config TARGET_LS1021AQDS
>         bool "Support ls1021aqds"
>         select CPU_V7
> @@ -865,6 +872,7 @@ source "board/Marvell/gplugd/Kconfig"
>  source "board/armadeus/apf27/Kconfig"
>  source "board/armltd/vexpress/Kconfig"
>  source "board/armltd/vexpress64/Kconfig"
> +source "board/hisilicon/hikey/Kconfig"
>  source "board/bachmann/ot1200/Kconfig"
>  source "board/balloon3/Kconfig"
>  source "board/barco/platinum/Kconfig"
> diff --git a/board/hisilicon/hikey/Kconfig b/board/hisilicon/hikey/Kconfig
> new file mode 100644
> index 0000000..f7f1055
> --- /dev/null
> +++ b/board/hisilicon/hikey/Kconfig
> @@ -0,0 +1,15 @@
> +if TARGET_HIKEY
> +
> +config SYS_BOARD
> +       default "hikey"
> +
> +config SYS_VENDOR
> +       default "hisilicon"
> +
> +config SYS_SOC
> +       default "hi6220"
> +
> +config SYS_CONFIG_NAME
> +       default "hikey"
> +
> +endif
> diff --git a/board/hisilicon/hikey/Makefile b/board/hisilicon/hikey/Makefile
> new file mode 100644
> index 0000000..d4ec8c7
> --- /dev/null
> +++ b/board/hisilicon/hikey/Makefile
> @@ -0,0 +1,8 @@
> +#
> +# (C) Copyright 2000-2004
> +# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +obj-y  := hikey.o
> diff --git a/board/hisilicon/hikey/hikey.c b/board/hisilicon/hikey/hikey.c
> new file mode 100644
> index 0000000..bd5c409
> --- /dev/null
> +++ b/board/hisilicon/hikey/hikey.c
> @@ -0,0 +1,415 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +#include <common.h>
> +#include <dm.h>
> +#include <malloc.h>
> +#include <errno.h>

nit: errno.h should go above malloc.h

> +#include <netdev.h>
> +#include <asm/io.h>
> +#include <asm-generic/gpio.h>
> +#include <asm/arch/gpio.h>
> +#include <asm/arch/dwmmc.h>
> +#include <asm/arch/hi6220.h>
> +#include <asm/arch/hi6553.h>
> +
> +#ifdef CONFIG_DM_GPIO

Isn't that always defined? Probably don't need this #ifdef. Also can
you add a TODO to drop this table in favour of device tree?

> +static const struct hikey_gpio_platdata hi6220_gpio[] = {
> +       { 0, HI6220_GPIO_BASE(0)},
> +       { 1, HI6220_GPIO_BASE(1)},
> +       { 2, HI6220_GPIO_BASE(2)},
> +       { 3, HI6220_GPIO_BASE(3)},
> +       { 4, HI6220_GPIO_BASE(4)},
> +       { 5, HI6220_GPIO_BASE(5)},
> +       { 6, HI6220_GPIO_BASE(6)},
> +       { 7, HI6220_GPIO_BASE(7)},
> +       { 8, HI6220_GPIO_BASE(8)},
> +       { 9, HI6220_GPIO_BASE(9)},
> +       { 10, HI6220_GPIO_BASE(10)},
> +       { 11, HI6220_GPIO_BASE(11)},
> +       { 12, HI6220_GPIO_BASE(12)},
> +       { 13, HI6220_GPIO_BASE(13)},
> +       { 14, HI6220_GPIO_BASE(14)},
> +       { 15, HI6220_GPIO_BASE(15)},
> +       { 16, HI6220_GPIO_BASE(16)},
> +       { 17, HI6220_GPIO_BASE(17)},
> +       { 18, HI6220_GPIO_BASE(18)},
> +       { 19, HI6220_GPIO_BASE(19)},
> +
> +};
> +
> +U_BOOT_DEVICES(hi6220_gpios) = {
> +       { "gpio_hi6220", &hi6220_gpio[0] },
> +       { "gpio_hi6220", &hi6220_gpio[1] },
> +       { "gpio_hi6220", &hi6220_gpio[2] },
> +       { "gpio_hi6220", &hi6220_gpio[3] },
> +       { "gpio_hi6220", &hi6220_gpio[4] },
> +       { "gpio_hi6220", &hi6220_gpio[5] },
> +       { "gpio_hi6220", &hi6220_gpio[6] },
> +       { "gpio_hi6220", &hi6220_gpio[7] },
> +       { "gpio_hi6220", &hi6220_gpio[8] },
> +       { "gpio_hi6220", &hi6220_gpio[9] },
> +       { "gpio_hi6220", &hi6220_gpio[10] },
> +       { "gpio_hi6220", &hi6220_gpio[11] },
> +       { "gpio_hi6220", &hi6220_gpio[12] },
> +       { "gpio_hi6220", &hi6220_gpio[13] },
> +       { "gpio_hi6220", &hi6220_gpio[14] },
> +       { "gpio_hi6220", &hi6220_gpio[15] },
> +       { "gpio_hi6220", &hi6220_gpio[16] },
> +       { "gpio_hi6220", &hi6220_gpio[17] },
> +       { "gpio_hi6220", &hi6220_gpio[18] },
> +       { "gpio_hi6220", &hi6220_gpio[19] },
> +};
> +#endif
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define EYE_PATTERN    0x70533483
> +
> +static void init_usb_and_picophy(void)
> +{
> +       unsigned int data;
> +
> +       /* enable USB clock */
> +       writel(PERI_CLK0_USBOTG, PERI_SC_PERIPH_CLK0_EN);
> +       do {
> +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> +       } while ((data & PERI_CLK0_USBOTG) == 0);
> +
> +       /* take usb IPs out of reset */
> +       writel(PERI_RST0_USBOTG_BUS | PERI_RST0_POR_PICOPHY |
> +               PERI_RST0_USBOTG | PERI_RST0_USBOTG_32K,
> +               PERI_SC_PERIPH_RST0_DIS);
> +       do {
> +               data = readl(PERI_SC_PERIPH_RST0_STAT);
> +               data &= PERI_RST0_USBOTG_BUS | PERI_RST0_POR_PICOPHY |
> +                       PERI_RST0_USBOTG | PERI_RST0_USBOTG_32K;
> +       } while (data);
> +
> +       /*CTRL 5*/
> +       data = readl(PERI_SC_PERIPH_CTRL5);
> +       data &= ~PERI_CTRL5_PICOPHY_BC_MODE;
> +       data |= PERI_CTRL5_USBOTG_RES_SEL | PERI_CTRL5_PICOPHY_ACAENB;
> +       data |= 0x300;
> +       writel(data, PERI_SC_PERIPH_CTRL5);
> +
> +       /*CTRL 4*/
> +
> +       /* configure USB PHY */
> +       data = readl(PERI_SC_PERIPH_CTRL4);
> +
> +       /* make PHY out of low power mode */
> +       data &= ~PERI_CTRL4_PICO_SIDDQ;
> +       data &= ~PERI_CTRL4_PICO_OGDISABLE;
> +       data |= PERI_CTRL4_PICO_VBUSVLDEXTSEL | PERI_CTRL4_PICO_VBUSVLDEXT;
> +       writel(data, PERI_SC_PERIPH_CTRL4);
> +
> +       writel(EYE_PATTERN, PERI_SC_PERIPH_CTRL8);
> +
> +       mdelay(5);
> +}
> +
> +static int sd_card_detect(void)
> +{
> +       int ret;
> +
> +       /* configure GPIO8 as nopull */
> +       writel(0, 0xf8001830);
> +
> +       gpio_request(8, "SD CD");
> +
> +       gpio_direction_input(8);
> +       ret = gpio_get_value(8);
> +
> +       if (!ret) {
> +               printf("%s: SD card present\n", __func__);
> +               return 1;
> +       }
> +
> +       printf("%s: SD card not present\n", __func__);
> +       return 0;
> +}
> +
> +static void mmc1_setup_pinmux(void)
> +{
> +       /* switch pinmux to SD */
> +       writel(0, 0xf701000c);
> +       writel(0, 0xf7010010);
> +       writel(0, 0xf7010014);
> +       writel(0, 0xf7010018);
> +       writel(0, 0xf701001c);
> +       writel(0, 0xf7010020);
> +
> +       /* input, 16mA or 12mA */
> +       writel(0x64, 0xf701080c);
> +       writel(0x54, 0xf7010810);
> +       writel(0x54, 0xf7010814);
> +       writel(0x54, 0xf7010818);
> +       writel(0x54, 0xf701081c);
> +       writel(0x54, 0xf7010820);

Should define a struct for this peripheral.

> +
> +       sd_card_detect();
> +}
> +
> +static void mmc1_init_pll(void)
> +{
> +       uint32_t data;
> +
> +       /* select SYSPLL as the source of MMC1 */
> +       /* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
> +       writel(1 << 11 | 1 << 27, PERI_SC_CLK0_SEL);

What are 11 and 27? Should they have an enum?

> +       do {
> +               data = readl(PERI_SC_CLK0_SEL);
> +       } while (!(data & (1 << 11)));
> +
> +       /* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
> +       writel(1 << 30, PERI_SC_CLK0_SEL);
> +       do {
> +               data = readl(PERI_SC_CLK0_SEL);
> +       } while (data & (1 << 14));

Repeating code here and below - how about a function to enable a given clock?

> +
> +       writel((1 << 1), PERI_SC_PERIPH_CLK0_EN);
> +       do {
> +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> +       } while (!(data & (1 << 1)));
> +
> +       data = readl(PERI_SC_PERIPH_CLK12_EN);
> +       data |= 1 << 2;
> +       writel(data, PERI_SC_PERIPH_CLK12_EN);
> +
> +       do {
> +               /* 1.2GHz / 50 = 24MHz */
> +               writel(0x31 | (1 << 7), PERI_SC_CLKCFG8BIT2);
> +               data = readl(PERI_SC_CLKCFG8BIT2);
> +       } while ((data & 0x31) != 0x31);
> +}
> +
> +static void mmc1_reset_clk(void)
> +{
> +       unsigned int data;
> +
> +       /* disable mmc1 bus clock */
> +       writel(PERI_CLK0_MMC1, PERI_SC_PERIPH_CLK0_DIS);
> +       do {
> +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> +       } while (data & PERI_CLK0_MMC1);
> +
> +       /* enable mmc1 bus clock */
> +       writel(PERI_CLK0_MMC1, PERI_SC_PERIPH_CLK0_EN);
> +       do {
> +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> +       } while (!(data & PERI_CLK0_MMC1));
> +
> +       /* reset mmc1 clock domain */
> +       writel(PERI_RST0_MMC1, PERI_SC_PERIPH_RST0_EN);
> +
> +       /* bypass mmc1 clock phase */
> +       data = readl(PERI_SC_PERIPH_CTRL2);
> +       data |= 3 << 2;
> +       writel(data, PERI_SC_PERIPH_CTRL2);
> +
> +       /* disable low power */
> +       data = readl(PERI_SC_PERIPH_CTRL13);
> +       data |= 1 << 4;
> +       writel(data, PERI_SC_PERIPH_CTRL13);
> +       do {
> +               data = readl(PERI_SC_PERIPH_RST0_STAT);
> +       } while (!(data & PERI_RST0_MMC1));
> +
> +       /* unreset mmc0 clock domain */
> +       writel(PERI_RST0_MMC1, PERI_SC_PERIPH_RST0_DIS);
> +       do {
> +               data = readl(PERI_SC_PERIPH_RST0_STAT);
> +       } while (data & PERI_RST0_MMC1);
> +}
> +
> +/* PMU SSI is the IP that maps the external PMU hi6553 registers as IO */
> +static void hi6220_pmussi_init(void)
> +{
> +       uint32_t data;
> +
> +       /* Take PMUSSI out of reset */
> +       writel(ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N,
> +              ALWAYSON_SC_PERIPH_RST4_DIS);
> +       do {
> +               data = readl(ALWAYSON_SC_PERIPH_RST4_STAT);
> +       } while (data & ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N);
> +
> +       /* set PMU SSI clock latency for read operation */
> +       data = readl(ALWAYSON_SC_MCU_SUBSYS_CTRL3);
> +       data &= ~ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_MASK;
> +       data |= ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_3;
> +       writel(data, ALWAYSON_SC_MCU_SUBSYS_CTRL3);
> +
> +       /* enable PMUSSI clock */
> +       data = ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_CCPU |
> +              ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_MCU;
> +       writel(data, ALWAYSON_SC_PERIPH_CLK5_EN);
> +       data = ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_PMUSSI;
> +       writel(data, ALWAYSON_SC_PERIPH_CLK4_EN);
> +
> +       /* Output high to PMIC on PWR_HOLD_GPIO0_0 */
> +       gpio_request(0, "PWR_HOLD_GPIO0_0");
> +       gpio_direction_output(0, 1);
> +}
> +
> +uint8_t hi6553_readb(unsigned int offset)
> +{
> +       return readb((u8 *)(unsigned long)HI6220_PMUSSI_BASE + (offset << 2));
> +}
> +
> +void hi6553_writeb(unsigned int offset, uint8_t value)
> +{
> +       writeb(value, (u8 *)(unsigned long)HI6220_PMUSSI_BASE + (offset << 2));
> +}
> +
> +static void hikey_hi6553_init(void)
> +{
> +       int data;
> +
> +       hi6553_writeb(HI6553_PERI_EN_MARK, 0x1e);
> +       hi6553_writeb(HI6553_NP_REG_ADJ1, 0);
> +       data = HI6553_DISABLE6_XO_CLK_CONN | HI6553_DISABLE6_XO_CLK_NFC |
> +               HI6553_DISABLE6_XO_CLK_RF1 | HI6553_DISABLE6_XO_CLK_RF2;
> +       hi6553_writeb(HI6553_DISABLE6_XO_CLK, data);
> +
> +       /* configure BUCK0 & BUCK1 */
> +       hi6553_writeb(HI6553_BUCK01_CTRL2, 0x5e);
> +       hi6553_writeb(HI6553_BUCK0_CTRL7, 0x10);
> +       hi6553_writeb(HI6553_BUCK1_CTRL7, 0x10);
> +       hi6553_writeb(HI6553_BUCK0_CTRL5, 0x1e);
> +       hi6553_writeb(HI6553_BUCK1_CTRL5, 0x1e);
> +       hi6553_writeb(HI6553_BUCK0_CTRL1, 0xfc);
> +       hi6553_writeb(HI6553_BUCK1_CTRL1, 0xfc);
> +
> +       /* configure BUCK2 */
> +       hi6553_writeb(HI6553_BUCK2_REG1, 0x4f);
> +       hi6553_writeb(HI6553_BUCK2_REG5, 0x99);
> +       hi6553_writeb(HI6553_BUCK2_REG6, 0x45);
> +       mdelay(1);
> +       hi6553_writeb(HI6553_VSET_BUCK2_ADJ, 0x22);
> +       mdelay(1);
> +
> +       /* configure BUCK3 */
> +       hi6553_writeb(HI6553_BUCK3_REG3, 0x02);
> +       hi6553_writeb(HI6553_BUCK3_REG5, 0x99);
> +       hi6553_writeb(HI6553_BUCK3_REG6, 0x41);
> +       hi6553_writeb(HI6553_VSET_BUCK3_ADJ, 0x02);
> +       mdelay(1);
> +
> +       /* configure BUCK4 */
> +       hi6553_writeb(HI6553_BUCK4_REG2, 0x9a);
> +       hi6553_writeb(HI6553_BUCK4_REG5, 0x99);
> +       hi6553_writeb(HI6553_BUCK4_REG6, 0x45);
> +
> +       /* configure LDO20 */
> +       hi6553_writeb(HI6553_LDO20_REG_ADJ, 0x50);
> +
> +       hi6553_writeb(HI6553_NP_REG_CHG, 0x0f);
> +       hi6553_writeb(HI6553_CLK_TOP0, 0x06);
> +       hi6553_writeb(HI6553_CLK_TOP3, 0xc0);
> +       hi6553_writeb(HI6553_CLK_TOP4, 0x00);
> +
> +       /* configure LDO7 & LDO10 for SD slot */
> +       data = hi6553_readb(HI6553_LDO7_REG_ADJ);
> +       data = (data & 0xf8) | 0x2;
> +       hi6553_writeb(HI6553_LDO7_REG_ADJ, data);
> +       mdelay(5);
> +       /* enable LDO7 */
> +       hi6553_writeb(HI6553_ENABLE2_LDO1_8, 1 << 6);
> +       mdelay(5);
> +       data = hi6553_readb(HI6553_LDO10_REG_ADJ);
> +       data = (data & 0xf8) | 0x5;
> +       hi6553_writeb(HI6553_LDO10_REG_ADJ, data);
> +       mdelay(5);
> +       /* enable LDO10 */
> +       hi6553_writeb(HI6553_ENABLE3_LDO9_16, 1 << 1);
> +       mdelay(5);
> +
> +       /* select 32.764KHz */
> +       hi6553_writeb(HI6553_CLK19M2_600_586_EN, 0x01);

This should go in a PMIC driver. Ideally most of this would happen
automatically if the voltages are in the device tree, but since you
don't have one, I suggest just moving this code into the driver.

> +}
> +
> +int misc_init_r(void)
> +{
> +       init_usb_and_picophy();
> +
> +       return 0;
> +}
> +
> +int board_init(void)
> +{
> +       gd->flags = 0;

Drop that.

> +
> +       icache_enable();

Should happen in generic ARM code at start-up?

> +
> +       return 0;
> +}
> +
> +#ifdef CONFIG_GENERIC_MMC
> +
> +static int init_dwmmc(void)
> +{
> +       int ret;
> +
> +#ifdef CONFIG_DWMMC
> +       /* mmc0 pinmux and clocks are already configured by ATF */
> +       ret = hi6220_dwmci_add_port(0, HI6220_MMC0_BASE, 8);
> +
> +       if (ret)
> +               printf("%s: Error adding eMMC port\n", __func__);
> +
> +       /* take mmc1 (sd slot) out of reset, configure clocks and pinmuxing */
> +
> +       mmc1_init_pll();
> +       mmc1_reset_clk();
> +       mmc1_setup_pinmux();
> +
> +       ret |= hi6220_dwmci_add_port(1, HI6220_MMC1_BASE, 4);
> +
> +       if (ret)
> +               printf("%s: Error adding SD port\n", __func__);
> +#endif
> +       return ret;
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> +       int ret;
> +
> +       /* init the pmussi ip */
> +       hi6220_pmussi_init();
> +
> +       /* init the hi6553 pmic */
> +       hikey_hi6553_init();
> +
> +       /* add the eMMC and sd ports */
> +       ret = init_dwmmc();
> +
> +       if (ret)
> +               debug("init_dwmmc failed\n");
> +
> +       return ret;
> +}
> +#endif
> +
> +int dram_init(void)
> +{
> +       gd->ram_size = PHYS_SDRAM_1_SIZE;
> +       return 0;
> +}
> +
> +void dram_init_banksize(void)
> +{
> +       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> +       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> +}
> +
> +/* Use the Watchdog to cause reset */
> +void reset_cpu(ulong addr)
> +{
> +       /* TODO program the watchdog */
> +}
> diff --git a/configs/hikey_defconfig b/configs/hikey_defconfig
> new file mode 100644
> index 0000000..50baf22
> --- /dev/null
> +++ b/configs/hikey_defconfig
> @@ -0,0 +1,5 @@
> +# 96boards HiKey
> +CONFIG_ARM=y
> +CONFIG_TARGET_HIKEY=y
> +CONFIG_SHOW_BOOT_PROGRESS=y

I don't think this works yet - there is no Kconfig for it. You can put
it in your hikey.h file.

> +CONFIG_NET=y
> diff --git a/include/configs/hikey.h b/include/configs/hikey.h
> new file mode 100644
> index 0000000..303b857
> --- /dev/null
> +++ b/include/configs/hikey.h
> @@ -0,0 +1,168 @@
> +/*
> + * (C) Copyright 2015 Linaro
> + *
> + * Peter Griffin <peter.griffin@linaro.org>
> + *
> + * Configuration for HiKey 96boards CE. Parts were derived from other ARM
> + * configurations.
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __HIKEY_AEMV8A_H
> +#define __HIKEY_AEMV8A_H
> +
> +/* We use generic board for hikey */
> +#define CONFIG_SYS_GENERIC_BOARD
> +
> +#define CONFIG_REMAKE_ELF
> +
> +#define CONFIG_SUPPORT_RAW_INITRD
> +
> +/* Cache Definitions */
> +#define CONFIG_SYS_DCACHE_OFF
> +
> +#define CONFIG_IDENT_STRING            "hikey"
> +
> +/* Flat Device Tree Definitions */
> +#define CONFIG_OF_LIBFDT
> +
> +/* Physical Memory Map */
> +
> +/* CONFIG_SYS_TEXT_BASE needs to align with where ATF loads bl33.bin */
> +#define CONFIG_SYS_TEXT_BASE           0x35000000
> +
> +#define CONFIG_NR_DRAM_BANKS           1
> +#define PHYS_SDRAM_1                   0x00000000
> +
> +/* 1008 MB (the last 16Mb are secured for TrustZone by ATF*/
> +#define PHYS_SDRAM_1_SIZE              0x3f000000
> +#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
> +
> +#define CONFIG_SYS_INIT_RAM_SIZE       0x1000
> +
> +#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE + 0x7fff0)
> +
> +#define CONFIG_SYS_LOAD_ADDR           (CONFIG_SYS_SDRAM_BASE + 0x80000)
> +
> +/* Generic Timer Definitions */
> +#define COUNTER_FREQUENCY              (19000000)
> +
> +/* Generic Interrupt Controller Definitions */
> +#define GICD_BASE                      (0xf6801000)

Don't need () around simple constants

> +#define GICC_BASE                      (0xf6802000)
> +
> +/* Size of malloc() pool */
> +#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (8 << 20))
> +
> +/* PL011 Serial Configuration */
> +#define CONFIG_PL011_SERIAL
> +
> +#define CONFIG_PL011_CLOCK             19200000
> +#define CONFIG_PL01x_PORTS             {(void *)CONFIG_SYS_SERIAL0}
> +#define CONFIG_CONS_INDEX              0

Again this need to be device tree soon.

> +
> +#define CONFIG_BAUDRATE                        115200
> +#define CONFIG_SYS_SERIAL0             0xF8015000
> +
> +#define CONFIG_CMD_USB
> +#ifdef CONFIG_CMD_USB
> +#define CONFIG_USB_DWC2
> +#define CONFIG_USB_DWC2_REG_ADDR 0xF72C0000
> +/*#define CONFIG_DWC2_DFLT_SPEED_FULL*/
> +#define CONFIG_DWC2_ENABLE_DYNAMIC_FIFO
> +
> +#define CONFIG_USB_STORAGE
> +#define CONFIG_USB_HOST_ETHER
> +#define CONFIG_USB_ETHER_SMSC95XX
> +#define CONFIG_USB_ETHER_ASIX
> +#define CONFIG_MISC_INIT_R
> +#endif
> +
> +#define CONFIG_HIKEY_GPIO
> +#define CONFIG_DM_GPIO
> +#define CONFIG_CMD_GPIO
> +#define CONFIG_DM
> +
> +/* SD/MMC configuration */
> +#define CONFIG_GENERIC_MMC
> +#define CONFIG_MMC
> +#define CONFIG_DWMMC
> +#define CONFIG_HIKEY_DWMMC
> +#define CONFIG_BOUNCE_BUFFER
> +#define CONFIG_CMD_MMC
> +
> +#define CONFIG_FS_EXT4
> +#define CONFIG_FS_FAT
> +
> +/* Command line configuration */
> +#define CONFIG_MENU
> +#define CONFIG_CMD_CACHE
> +#define CONFIG_CMD_BDI
> +#define CONFIG_CMD_UNZIP
> +#define CONFIG_CMD_PXE
> +#define CONFIG_CMD_ENV
> +#define CONFIG_CMD_IMI
> +#define CONFIG_CMD_LOADB
> +#define CONFIG_CMD_MEMORY
> +#define CONFIG_CMD_SAVEENV
> +#define CONFIG_CMD_RUN
> +#define CONFIG_CMD_BOOTD
> +#define CONFIG_CMD_ECHO
> +#define CONFIG_CMD_SOURCE
> +
> +#define CONFIG_MAC_PARTITION
> +#define CONFIG_MTD_PARTITIONS
> +
> +/* BOOTP options */
> +#define CONFIG_BOOTP_BOOTFILESIZE
> +
> +#define CONFIG_CMD_NET
> +
> +#include <config_distro_defaults.h>
> +
> +/* Initial environment variables */
> +
> +/*
> + * Defines where the kernel and FDT exist in NOR flash and where it will
> + * be copied into DRAM
> + */
> +#define CONFIG_EXTRA_ENV_SETTINGS      \
> +                               "kernel_name=Image\0"   \
> +                               "kernel_addr=0x0000000\0" \
> +                               "fdt_name=hi6220-hikey.dtb\0" \
> +                               "fdt_addr=0x0300000\0" \
> +                               "max_fdt=0x100000\0" \
> +                               "fdt_high=0xffffffffffffffff\0" \
> +                               "initrd_high=0xffffffffffffffff\0" \
> +
> +/* Assume we boot with root on the first partition of a USB stick */
> +#define CONFIG_BOOTARGS                "console=ttyAMA0,115200n8 /dev/mmcblk0p7 rw "
> +
> +/* Copy the kernel and FDT to DRAM memory and boot */
> +#define CONFIG_BOOTCOMMAND     "booti $kernel_addr_r - $fdt_addr_r"
> +
> +#define CONFIG_BOOTDELAY               2
> +
> +/* Preserve enviroment onto sd card */
> +#define CONFIG_ENV_IS_IN_MMC
> +#define CONFIG_SYS_MMC_ENV_DEV         1
> +#define CONFIG_SYS_MMC_ENV_PART                0
> +#define CONFIG_ENV_OFFSET               0x0
> +#define CONFIG_ENV_SIZE                        0x1000
> +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
> +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
> +
> +/* Monitor Command Prompt */
> +#define CONFIG_SYS_CBSIZE              512     /* Console I/O Buffer Size */
> +#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
> +                                       sizeof(CONFIG_SYS_PROMPT) + 16)
> +#define CONFIG_SYS_HUSH_PARSER
> +#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
> +#define CONFIG_SYS_LONGHELP
> +#define CONFIG_CMDLINE_EDITING
> +#define CONFIG_SYS_MAXARGS             64      /* max command args */
> +
> +#define CONFIG_SYS_NO_FLASH
> +
> +#endif /* __HIKEY_AEMV8A_H */
> --
> 1.9.1
>

Regards,
Simon

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

* [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller.
  2015-07-18 14:38   ` Simon Glass
@ 2015-07-19  9:39     ` Peter Griffin
  2015-07-20  2:17       ` Simon Glass
  0 siblings, 1 reply; 23+ messages in thread
From: Peter Griffin @ 2015-07-19  9:39 UTC (permalink / raw)
  To: u-boot

Hi Simon,


On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> > This patch adds the glue code for hi6220 SoC which has 2x synopsis
> > dw_mmc controllers. This will be used by the hikey board support
> > in subsequent patches.
> >
> > Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> > ---
>
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> (see nit below - this could be moved to device tree once you have it)
>

Thanks for reviewing :)

My plan regarding DT was to wait for it to land in the kernel, and then
convert
over to using it in u-boot.

I saw some of your patches converting Raspberry Pi to DM and DT which
should make migrating HiKey board fairly straight forward, as it shares the
same Synopsis IP for MMC and USB :)


> >  arch/arm/include/asm/arch-hi6220/dwmmc.h |  8 +++++
> >  drivers/mmc/Makefile                     |  1 +
> >  drivers/mmc/hi6220_dw_mmc.c              | 56
> ++++++++++++++++++++++++++++++++
> >  3 files changed, 65 insertions(+)
> >  create mode 100644 arch/arm/include/asm/arch-hi6220/dwmmc.h
> >  create mode 100644 drivers/mmc/hi6220_dw_mmc.c
> >
> > diff --git a/arch/arm/include/asm/arch-hi6220/dwmmc.h
> b/arch/arm/include/asm/arch-hi6220/dwmmc.h
> > new file mode 100644
> > index 0000000..c747383
> > --- /dev/null
> > +++ b/arch/arm/include/asm/arch-hi6220/dwmmc.h
> > @@ -0,0 +1,8 @@
> > +/*
> > + * (C) Copyright 2015 Linaro
> > + * Peter Griffin <peter.griffin@linaro.org>
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +
> > +int hi6220_dwmci_add_port(int index, u32 regbase, int bus_width);
> > diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
> > index ed73687..81a1a8f 100644
> > --- a/drivers/mmc/Makefile
> > +++ b/drivers/mmc/Makefile
> > @@ -11,6 +11,7 @@ obj-$(CONFIG_BFIN_SDH) += bfin_sdh.o
> >  obj-$(CONFIG_DAVINCI_MMC) += davinci_mmc.o
> >  obj-$(CONFIG_DWMMC) += dw_mmc.o
> >  obj-$(CONFIG_EXYNOS_DWMMC) += exynos_dw_mmc.o
> > +obj-$(CONFIG_HIKEY_DWMMC) += hi6220_dw_mmc.o
> >  obj-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o
> >  obj-$(CONFIG_FTSDC010) += ftsdc010_mci.o
> >  obj-$(CONFIG_FTSDC021) += ftsdc021_sdhci.o
> > diff --git a/drivers/mmc/hi6220_dw_mmc.c b/drivers/mmc/hi6220_dw_mmc.c
> > new file mode 100644
> > index 0000000..106f673
> > --- /dev/null
> > +++ b/drivers/mmc/hi6220_dw_mmc.c
> > @@ -0,0 +1,56 @@
> > +/*
> > + * (C) Copyright 2015 Linaro
> > + * peter.griffin <peter.griffin@linaro.org>
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <dwmmc.h>
> > +#include <malloc.h>
> > +#include <asm-generic/errno.h>
> > +
> > +#define        DWMMC_MAX_CH_NUM                4
> > +
> > +#define        DWMMC_MAX_FREQ                  50000000
> > +#define        DWMMC_MIN_FREQ                  378000
> > +
> > +/* Source clock is configured to 100Mhz by ATF bl1*/
>
> nit: MHz
>

Fixed in v3.

regards,

Peter.

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

* [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller.
  2015-07-19  9:39     ` Peter Griffin
@ 2015-07-20  2:17       ` Simon Glass
  0 siblings, 0 replies; 23+ messages in thread
From: Simon Glass @ 2015-07-20  2:17 UTC (permalink / raw)
  To: u-boot

Hi Peter,

On 19 July 2015 at 03:39, Peter Griffin <peter.griffin@linaro.org> wrote:
> Hi Simon,
>
>
>> On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
>> > This patch adds the glue code for hi6220 SoC which has 2x synopsis
>> > dw_mmc controllers. This will be used by the hikey board support
>> > in subsequent patches.
>> >
>> > Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
>> > ---
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>
>> (see nit below - this could be moved to device tree once you have it)
>
>
> Thanks for reviewing :)
>
> My plan regarding DT was to wait for it to land in the kernel, and then
> convert
> over to using it in u-boot.
>
> I saw some of your patches converting Raspberry Pi to DM and DT which
> should make migrating HiKey board fairly straight forward, as it shares the
> same Synopsis IP for MMC and USB :)

OK good. For MMC I sent something with the Rockchip series but have
not applied it yet. But yes it will be easier.

I'm looking forward to trying out your series, soon.

[snip]

Regards,
Simon

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-18 14:38   ` Simon Glass
@ 2015-07-28 17:37     ` Peter Griffin
  0 siblings, 0 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-28 17:37 UTC (permalink / raw)
  To: u-boot

Hi Simon,

Thanks for reviewing.

On 18 July 2015 at 15:38, Simon Glass <sjg@chromium.org> wrote:

> Hi Peter,
>
> On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> > HiKey is the first 96boards consumer edition compliant board. It
> features a hi6220
> > SoC which has eight ARM A53 cpu's.
> >
> > This initial port adds support for: -
> > 1) Serial
> > 2) eMMC / sd card
> > 3) USB
> > 4) GPIO
> >
> > It has been tested with Arm Trusted Firmware running u-boot as the BL33
> executable.
> >
> > Notes:
> >
> > eMMC has been tested with basic reading of eMMC partition intto DDR. I
> have not
> > tested writing / erasing. Due to lack of clock control it won't be
> > running in the most performant high speed mode.
> >
> > SD card slot has been tested for reading and booting kernels into DDR.
> > It is also currently used for saving the u-boot enviroment.
> >
> > USB has been tested with ASIX networking adapter to tftpboot kernels
> > into DDR. On v2015.07-rc2 dhcp now works, and also usb mass storage
> > is enumerated correctly.
> >
> > GPIO has been tested using gpio toggle GPIO4_1-3 to flash LEDs.
> >
> > Basic SoC datasheet can be found here: -
> > https://github.com/96boards/documentation/blob/master/hikey/
> > Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf
> >
> > Board schematic can be found here: -
> > https://github.com/96boards/documentation/blob/master/hikey/
> > 96Boards-Hikey-Rev-A1.pdf
> >
> > Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> > ---
> >  arch/arm/Kconfig               |   8 +
> >  board/hisilicon/hikey/Kconfig  |  15 ++
> >  board/hisilicon/hikey/Makefile |   8 +
> >  board/hisilicon/hikey/hikey.c  | 415
> +++++++++++++++++++++++++++++++++++++++++
> >  configs/hikey_defconfig        |   5 +
> >  include/configs/hikey.h        | 168 +++++++++++++++++
> >  6 files changed, 619 insertions(+)
> >  create mode 100644 board/hisilicon/hikey/Kconfig
> >  create mode 100644 board/hisilicon/hikey/Makefile
> >  create mode 100644 board/hisilicon/hikey/hikey.c
> >  create mode 100644 configs/hikey_defconfig
> >  create mode 100644 include/configs/hikey.h
> >
> > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> > index 2985e6e..d0b7939 100644
> > --- a/arch/arm/Kconfig
> > +++ b/arch/arm/Kconfig
> > @@ -721,6 +721,13 @@ config TARGET_LS2085ARDB
> >           development platform that supports the QorIQ LS2085A
> >           Layerscape Architecture processor.
> >
> > +config TARGET_HIKEY
> > +       bool "Support HiKey 96boards Consumer Edition Platform"
> > +       select ARM64
> > +         help
> > +         Support for HiKey 96boards platform. It features a HI6220
> > +         SoC, with 8xA53 CPU, mali450 gpu, and 1GB RAM.
> > +
> >  config TARGET_LS1021AQDS
> >         bool "Support ls1021aqds"
> >         select CPU_V7
> > @@ -865,6 +872,7 @@ source "board/Marvell/gplugd/Kconfig"
> >  source "board/armadeus/apf27/Kconfig"
> >  source "board/armltd/vexpress/Kconfig"
> >  source "board/armltd/vexpress64/Kconfig"
> > +source "board/hisilicon/hikey/Kconfig"
> >  source "board/bachmann/ot1200/Kconfig"
> >  source "board/balloon3/Kconfig"
> >  source "board/barco/platinum/Kconfig"
> > diff --git a/board/hisilicon/hikey/Kconfig
> b/board/hisilicon/hikey/Kconfig
> > new file mode 100644
> > index 0000000..f7f1055
> > --- /dev/null
> > +++ b/board/hisilicon/hikey/Kconfig
> > @@ -0,0 +1,15 @@
> > +if TARGET_HIKEY
> > +
> > +config SYS_BOARD
> > +       default "hikey"
> > +
> > +config SYS_VENDOR
> > +       default "hisilicon"
> > +
> > +config SYS_SOC
> > +       default "hi6220"
> > +
> > +config SYS_CONFIG_NAME
> > +       default "hikey"
> > +
> > +endif
> > diff --git a/board/hisilicon/hikey/Makefile
> b/board/hisilicon/hikey/Makefile
> > new file mode 100644
> > index 0000000..d4ec8c7
> > --- /dev/null
> > +++ b/board/hisilicon/hikey/Makefile
> > @@ -0,0 +1,8 @@
> > +#
> > +# (C) Copyright 2000-2004
> > +# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> > +#
> > +# SPDX-License-Identifier:     GPL-2.0+
> > +#
> > +
> > +obj-y  := hikey.o
> > diff --git a/board/hisilicon/hikey/hikey.c
> b/board/hisilicon/hikey/hikey.c
> > new file mode 100644
> > index 0000000..bd5c409
> > --- /dev/null
> > +++ b/board/hisilicon/hikey/hikey.c
> > @@ -0,0 +1,415 @@
> > +/*
> > + * (C) Copyright 2015 Linaro
> > + * Peter Griffin <peter.griffin@linaro.org>
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +#include <common.h>
> > +#include <dm.h>
> > +#include <malloc.h>
> > +#include <errno.h>
>
> nit: errno.h should go above malloc.h
>

Fixed in v3


>
> > +#include <netdev.h>
> > +#include <asm/io.h>
> > +#include <asm-generic/gpio.h>
> > +#include <asm/arch/gpio.h>
> > +#include <asm/arch/dwmmc.h>
> > +#include <asm/arch/hi6220.h>
> > +#include <asm/arch/hi6553.h>
> > +
> > +#ifdef CONFIG_DM_GPIO
>
> Isn't that always defined? Probably don't need this #ifdef. Also can
> you add a TODO to drop this table in favour of device tree?
>

#ifdef removed and TODO added in v3


>
> > +static const struct hikey_gpio_platdata hi6220_gpio[] = {
> > +       { 0, HI6220_GPIO_BASE(0)},
> > +       { 1, HI6220_GPIO_BASE(1)},
> > +       { 2, HI6220_GPIO_BASE(2)},
> > +       { 3, HI6220_GPIO_BASE(3)},
> > +       { 4, HI6220_GPIO_BASE(4)},
> > +       { 5, HI6220_GPIO_BASE(5)},
> > +       { 6, HI6220_GPIO_BASE(6)},
> > +       { 7, HI6220_GPIO_BASE(7)},
> > +       { 8, HI6220_GPIO_BASE(8)},
> > +       { 9, HI6220_GPIO_BASE(9)},
> > +       { 10, HI6220_GPIO_BASE(10)},
> > +       { 11, HI6220_GPIO_BASE(11)},
> > +       { 12, HI6220_GPIO_BASE(12)},
> > +       { 13, HI6220_GPIO_BASE(13)},
> > +       { 14, HI6220_GPIO_BASE(14)},
> > +       { 15, HI6220_GPIO_BASE(15)},
> > +       { 16, HI6220_GPIO_BASE(16)},
> > +       { 17, HI6220_GPIO_BASE(17)},
> > +       { 18, HI6220_GPIO_BASE(18)},
> > +       { 19, HI6220_GPIO_BASE(19)},
> > +
> > +};
> > +
> > +U_BOOT_DEVICES(hi6220_gpios) = {
> > +       { "gpio_hi6220", &hi6220_gpio[0] },
> > +       { "gpio_hi6220", &hi6220_gpio[1] },
> > +       { "gpio_hi6220", &hi6220_gpio[2] },
> > +       { "gpio_hi6220", &hi6220_gpio[3] },
> > +       { "gpio_hi6220", &hi6220_gpio[4] },
> > +       { "gpio_hi6220", &hi6220_gpio[5] },
> > +       { "gpio_hi6220", &hi6220_gpio[6] },
> > +       { "gpio_hi6220", &hi6220_gpio[7] },
> > +       { "gpio_hi6220", &hi6220_gpio[8] },
> > +       { "gpio_hi6220", &hi6220_gpio[9] },
> > +       { "gpio_hi6220", &hi6220_gpio[10] },
> > +       { "gpio_hi6220", &hi6220_gpio[11] },
> > +       { "gpio_hi6220", &hi6220_gpio[12] },
> > +       { "gpio_hi6220", &hi6220_gpio[13] },
> > +       { "gpio_hi6220", &hi6220_gpio[14] },
> > +       { "gpio_hi6220", &hi6220_gpio[15] },
> > +       { "gpio_hi6220", &hi6220_gpio[16] },
> > +       { "gpio_hi6220", &hi6220_gpio[17] },
> > +       { "gpio_hi6220", &hi6220_gpio[18] },
> > +       { "gpio_hi6220", &hi6220_gpio[19] },
> > +};
> > +#endif
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +#define EYE_PATTERN    0x70533483
> > +
> > +static void init_usb_and_picophy(void)
> > +{
> > +       unsigned int data;
> > +
> > +       /* enable USB clock */
> > +       writel(PERI_CLK0_USBOTG, PERI_SC_PERIPH_CLK0_EN);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> > +       } while ((data & PERI_CLK0_USBOTG) == 0);
> > +
> > +       /* take usb IPs out of reset */
> > +       writel(PERI_RST0_USBOTG_BUS | PERI_RST0_POR_PICOPHY |
> > +               PERI_RST0_USBOTG | PERI_RST0_USBOTG_32K,
> > +               PERI_SC_PERIPH_RST0_DIS);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_RST0_STAT);
> > +               data &= PERI_RST0_USBOTG_BUS | PERI_RST0_POR_PICOPHY |
> > +                       PERI_RST0_USBOTG | PERI_RST0_USBOTG_32K;
> > +       } while (data);
> > +
> > +       /*CTRL 5*/
> > +       data = readl(PERI_SC_PERIPH_CTRL5);
> > +       data &= ~PERI_CTRL5_PICOPHY_BC_MODE;
> > +       data |= PERI_CTRL5_USBOTG_RES_SEL | PERI_CTRL5_PICOPHY_ACAENB;
> > +       data |= 0x300;
> > +       writel(data, PERI_SC_PERIPH_CTRL5);
> > +
> > +       /*CTRL 4*/
> > +
> > +       /* configure USB PHY */
> > +       data = readl(PERI_SC_PERIPH_CTRL4);
> > +
> > +       /* make PHY out of low power mode */
> > +       data &= ~PERI_CTRL4_PICO_SIDDQ;
> > +       data &= ~PERI_CTRL4_PICO_OGDISABLE;
> > +       data |= PERI_CTRL4_PICO_VBUSVLDEXTSEL |
> PERI_CTRL4_PICO_VBUSVLDEXT;
> > +       writel(data, PERI_SC_PERIPH_CTRL4);
> > +
> > +       writel(EYE_PATTERN, PERI_SC_PERIPH_CTRL8);
> > +
> > +       mdelay(5);
> > +}
> > +
> > +static int sd_card_detect(void)
> > +{
> > +       int ret;
> > +
> > +       /* configure GPIO8 as nopull */
> > +       writel(0, 0xf8001830);
> > +
> > +       gpio_request(8, "SD CD");
> > +
> > +       gpio_direction_input(8);
> > +       ret = gpio_get_value(8);
> > +
> > +       if (!ret) {
> > +               printf("%s: SD card present\n", __func__);
> > +               return 1;
> > +       }
> > +
> > +       printf("%s: SD card not present\n", __func__);
> > +       return 0;
> > +}
> > +
> > +static void mmc1_setup_pinmux(void)
> > +{
> > +       /* switch pinmux to SD */
> > +       writel(0, 0xf701000c);
> > +       writel(0, 0xf7010010);
> > +       writel(0, 0xf7010014);
> > +       writel(0, 0xf7010018);
> > +       writel(0, 0xf701001c);
> > +       writel(0, 0xf7010020);
> > +
> > +       /* input, 16mA or 12mA */
> > +       writel(0x64, 0xf701080c);
> > +       writel(0x54, 0xf7010810);
> > +       writel(0x54, 0xf7010814);
> > +       writel(0x54, 0xf7010818);
> > +       writel(0x54, 0xf701081c);
> > +       writel(0x54, 0xf7010820);
>
> Should define a struct for this peripheral.
>

In v3 I've added a minimal pinmux driver  which I've reverse engineered
by looking at the Linux code.

Sadly the Linux pinctrl settings don't actually work for the sd card slot
and
it hangs the board. I've debugged this to not setting BIT(2) on the pull
down/up/drive registers.

I don't have any documentation on the register bit fields only the
the existing code which makes things difficult :(


>
> > +
> > +       sd_card_detect();
> > +}
> > +
> > +static void mmc1_init_pll(void)
> > +{
> > +       uint32_t data;
> > +
> > +       /* select SYSPLL as the source of MMC1 */
> > +       /* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
> > +       writel(1 << 11 | 1 << 27, PERI_SC_CLK0_SEL);
>
> What are 11 and 27? Should they have an enum?
>

Ideally yes, but unfortunately I don't have any documentation for the
register.
All I know for sure is it doesn't work without it!


>
> > +       do {
> > +               data = readl(PERI_SC_CLK0_SEL);
> > +       } while (!(data & (1 << 11)));
> > +
> > +       /* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
> > +       writel(1 << 30, PERI_SC_CLK0_SEL);
> > +       do {
> > +               data = readl(PERI_SC_CLK0_SEL);
> > +       } while (data & (1 << 14));
>
> Repeating code here and below - how about a function to enable a given
> clock?
>

I've added a clock_enable and clock_disable function in V3 and removed this
code
duplication.


> > +
> > +       writel((1 << 1), PERI_SC_PERIPH_CLK0_EN);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> > +       } while (!(data & (1 << 1)));
> > +
> > +       data = readl(PERI_SC_PERIPH_CLK12_EN);
> > +       data |= 1 << 2;
> > +       writel(data, PERI_SC_PERIPH_CLK12_EN);
> > +
> > +       do {
> > +               /* 1.2GHz / 50 = 24MHz */
> > +               writel(0x31 | (1 << 7), PERI_SC_CLKCFG8BIT2);
> > +               data = readl(PERI_SC_CLKCFG8BIT2);
> > +       } while ((data & 0x31) != 0x31);
> > +}
> > +
> > +static void mmc1_reset_clk(void)
> > +{
> > +       unsigned int data;
> > +
> > +       /* disable mmc1 bus clock */
> > +       writel(PERI_CLK0_MMC1, PERI_SC_PERIPH_CLK0_DIS);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> > +       } while (data & PERI_CLK0_MMC1);
> > +
> > +       /* enable mmc1 bus clock */
> > +       writel(PERI_CLK0_MMC1, PERI_SC_PERIPH_CLK0_EN);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_CLK0_STAT);
> > +       } while (!(data & PERI_CLK0_MMC1));
> > +
> > +       /* reset mmc1 clock domain */
> > +       writel(PERI_RST0_MMC1, PERI_SC_PERIPH_RST0_EN);
> > +
> > +       /* bypass mmc1 clock phase */
> > +       data = readl(PERI_SC_PERIPH_CTRL2);
> > +       data |= 3 << 2;
> > +       writel(data, PERI_SC_PERIPH_CTRL2);
> > +
> > +       /* disable low power */
> > +       data = readl(PERI_SC_PERIPH_CTRL13);
> > +       data |= 1 << 4;
> > +       writel(data, PERI_SC_PERIPH_CTRL13);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_RST0_STAT);
> > +       } while (!(data & PERI_RST0_MMC1));
> > +
> > +       /* unreset mmc0 clock domain */
> > +       writel(PERI_RST0_MMC1, PERI_SC_PERIPH_RST0_DIS);
> > +       do {
> > +               data = readl(PERI_SC_PERIPH_RST0_STAT);
> > +       } while (data & PERI_RST0_MMC1);
> > +}
> > +
> > +/* PMU SSI is the IP that maps the external PMU hi6553 registers as IO
> */
> > +static void hi6220_pmussi_init(void)
> > +{
> > +       uint32_t data;
> > +
> > +       /* Take PMUSSI out of reset */
> > +       writel(ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N,
> > +              ALWAYSON_SC_PERIPH_RST4_DIS);
> > +       do {
> > +               data = readl(ALWAYSON_SC_PERIPH_RST4_STAT);
> > +       } while (data & ALWAYSON_SC_PERIPH_RST4_DIS_PRESET_PMUSSI_N);
> > +
> > +       /* set PMU SSI clock latency for read operation */
> > +       data = readl(ALWAYSON_SC_MCU_SUBSYS_CTRL3);
> > +       data &= ~ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_MASK;
> > +       data |= ALWAYSON_SC_MCU_SUBSYS_CTRL3_RCLK_3;
> > +       writel(data, ALWAYSON_SC_MCU_SUBSYS_CTRL3);
> > +
> > +       /* enable PMUSSI clock */
> > +       data = ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_CCPU |
> > +              ALWAYSON_SC_PERIPH_CLK5_EN_PCLK_PMUSSI_MCU;
> > +       writel(data, ALWAYSON_SC_PERIPH_CLK5_EN);
> > +       data = ALWAYSON_SC_PERIPH_CLK4_EN_PCLK_PMUSSI;
> > +       writel(data, ALWAYSON_SC_PERIPH_CLK4_EN);
> > +
> > +       /* Output high to PMIC on PWR_HOLD_GPIO0_0 */
> > +       gpio_request(0, "PWR_HOLD_GPIO0_0");
> > +       gpio_direction_output(0, 1);
> > +}
> > +
> > +uint8_t hi6553_readb(unsigned int offset)
> > +{
> > +       return readb((u8 *)(unsigned long)HI6220_PMUSSI_BASE + (offset
> << 2));
> > +}
> > +
> > +void hi6553_writeb(unsigned int offset, uint8_t value)
> > +{
> > +       writeb(value, (u8 *)(unsigned long)HI6220_PMUSSI_BASE + (offset
> << 2));
> > +}
> > +
> > +static void hikey_hi6553_init(void)
> > +{
> > +       int data;
> > +
> > +       hi6553_writeb(HI6553_PERI_EN_MARK, 0x1e);
> > +       hi6553_writeb(HI6553_NP_REG_ADJ1, 0);
> > +       data = HI6553_DISABLE6_XO_CLK_CONN | HI6553_DISABLE6_XO_CLK_NFC |
> > +               HI6553_DISABLE6_XO_CLK_RF1 | HI6553_DISABLE6_XO_CLK_RF2;
> > +       hi6553_writeb(HI6553_DISABLE6_XO_CLK, data);
> > +
> > +       /* configure BUCK0 & BUCK1 */
> > +       hi6553_writeb(HI6553_BUCK01_CTRL2, 0x5e);
> > +       hi6553_writeb(HI6553_BUCK0_CTRL7, 0x10);
> > +       hi6553_writeb(HI6553_BUCK1_CTRL7, 0x10);
> > +       hi6553_writeb(HI6553_BUCK0_CTRL5, 0x1e);
> > +       hi6553_writeb(HI6553_BUCK1_CTRL5, 0x1e);
> > +       hi6553_writeb(HI6553_BUCK0_CTRL1, 0xfc);
> > +       hi6553_writeb(HI6553_BUCK1_CTRL1, 0xfc);
> > +
> > +       /* configure BUCK2 */
> > +       hi6553_writeb(HI6553_BUCK2_REG1, 0x4f);
> > +       hi6553_writeb(HI6553_BUCK2_REG5, 0x99);
> > +       hi6553_writeb(HI6553_BUCK2_REG6, 0x45);
> > +       mdelay(1);
> > +       hi6553_writeb(HI6553_VSET_BUCK2_ADJ, 0x22);
> > +       mdelay(1);
> > +
> > +       /* configure BUCK3 */
> > +       hi6553_writeb(HI6553_BUCK3_REG3, 0x02);
> > +       hi6553_writeb(HI6553_BUCK3_REG5, 0x99);
> > +       hi6553_writeb(HI6553_BUCK3_REG6, 0x41);
> > +       hi6553_writeb(HI6553_VSET_BUCK3_ADJ, 0x02);
> > +       mdelay(1);
> > +
> > +       /* configure BUCK4 */
> > +       hi6553_writeb(HI6553_BUCK4_REG2, 0x9a);
> > +       hi6553_writeb(HI6553_BUCK4_REG5, 0x99);
> > +       hi6553_writeb(HI6553_BUCK4_REG6, 0x45);
> > +
> > +       /* configure LDO20 */
> > +       hi6553_writeb(HI6553_LDO20_REG_ADJ, 0x50);
> > +
> > +       hi6553_writeb(HI6553_NP_REG_CHG, 0x0f);
> > +       hi6553_writeb(HI6553_CLK_TOP0, 0x06);
> > +       hi6553_writeb(HI6553_CLK_TOP3, 0xc0);
> > +       hi6553_writeb(HI6553_CLK_TOP4, 0x00);
> > +
> > +       /* configure LDO7 & LDO10 for SD slot */
> > +       data = hi6553_readb(HI6553_LDO7_REG_ADJ);
> > +       data = (data & 0xf8) | 0x2;
> > +       hi6553_writeb(HI6553_LDO7_REG_ADJ, data);
> > +       mdelay(5);
> > +       /* enable LDO7 */
> > +       hi6553_writeb(HI6553_ENABLE2_LDO1_8, 1 << 6);
> > +       mdelay(5);
> > +       data = hi6553_readb(HI6553_LDO10_REG_ADJ);
> > +       data = (data & 0xf8) | 0x5;
> > +       hi6553_writeb(HI6553_LDO10_REG_ADJ, data);
> > +       mdelay(5);
> > +       /* enable LDO10 */
> > +       hi6553_writeb(HI6553_ENABLE3_LDO9_16, 1 << 1);
> > +       mdelay(5);
> > +
> > +       /* select 32.764KHz */
> > +       hi6553_writeb(HI6553_CLK19M2_600_586_EN, 0x01);
>
> This should go in a PMIC driver. Ideally most of this would happen
> automatically if the voltages are in the device tree, but since you
> don't have one, I suggest just moving this code into the driver.
>

Ok I've done as you suggested and added a simple simple pmic driver
in v3. From a practical PoV this means you can now dump the pmic
regs using the pmic * commands, which might be helpful to somebody.


> > +}
> > +
> > +int misc_init_r(void)
> > +{
> > +       init_usb_and_picophy();
> > +
> > +       return 0;
> > +}
> > +
> > +int board_init(void)
> > +{
> > +       gd->flags = 0;
>
> Drop that.
>

Fixed in v3

>
> > +
> > +       icache_enable();
>
> Should happen in generic ARM code at start-up?
>

Yes Rob also pointed this out, I've removed it in V3.

>
> > +
> > +       return 0;
> > +}
> > +
> > +#ifdef CONFIG_GENERIC_MMC
> > +
> > +static int init_dwmmc(void)
> > +{
> > +       int ret;
> > +
> > +#ifdef CONFIG_DWMMC
> > +       /* mmc0 pinmux and clocks are already configured by ATF */
> > +       ret = hi6220_dwmci_add_port(0, HI6220_MMC0_BASE, 8);
> > +
> > +       if (ret)
> > +               printf("%s: Error adding eMMC port\n", __func__);
> > +
> > +       /* take mmc1 (sd slot) out of reset, configure clocks and
> pinmuxing */
> > +
> > +       mmc1_init_pll();
> > +       mmc1_reset_clk();
> > +       mmc1_setup_pinmux();
> > +
> > +       ret |= hi6220_dwmci_add_port(1, HI6220_MMC1_BASE, 4);
> > +
> > +       if (ret)
> > +               printf("%s: Error adding SD port\n", __func__);
> > +#endif
> > +       return ret;
> > +}
> > +
> > +int board_mmc_init(bd_t *bis)
> > +{
> > +       int ret;
> > +
> > +       /* init the pmussi ip */
> > +       hi6220_pmussi_init();
> > +
> > +       /* init the hi6553 pmic */
> > +       hikey_hi6553_init();
> > +
> > +       /* add the eMMC and sd ports */
> > +       ret = init_dwmmc();
> > +
> > +       if (ret)
> > +               debug("init_dwmmc failed\n");
> > +
> > +       return ret;
> > +}
> > +#endif
> > +
> > +int dram_init(void)
> > +{
> > +       gd->ram_size = PHYS_SDRAM_1_SIZE;
> > +       return 0;
> > +}
> > +
> > +void dram_init_banksize(void)
> > +{
> > +       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> > +       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> > +}
> > +
> > +/* Use the Watchdog to cause reset */
> > +void reset_cpu(ulong addr)
> > +{
> > +       /* TODO program the watchdog */
> > +}
> > diff --git a/configs/hikey_defconfig b/configs/hikey_defconfig
> > new file mode 100644
> > index 0000000..50baf22
> > --- /dev/null
> > +++ b/configs/hikey_defconfig
> > @@ -0,0 +1,5 @@
> > +# 96boards HiKey
> > +CONFIG_ARM=y
> > +CONFIG_TARGET_HIKEY=y
> > +CONFIG_SHOW_BOOT_PROGRESS=y
>
> I don't think this works yet - there is no Kconfig for it. You can put
> it in your hikey.h file.
>

Ok, I've removed in V3, as not much use if it doesn't work.


>
> > +CONFIG_NET=y
> > diff --git a/include/configs/hikey.h b/include/configs/hikey.h
> > new file mode 100644
> > index 0000000..303b857
> > --- /dev/null
> > +++ b/include/configs/hikey.h
> > @@ -0,0 +1,168 @@
> > +/*
> > + * (C) Copyright 2015 Linaro
> > + *
> > + * Peter Griffin <peter.griffin@linaro.org>
> > + *
> > + * Configuration for HiKey 96boards CE. Parts were derived from other
> ARM
> > + * configurations.
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +
> > +#ifndef __HIKEY_AEMV8A_H
> > +#define __HIKEY_AEMV8A_H
> > +
> > +/* We use generic board for hikey */
> > +#define CONFIG_SYS_GENERIC_BOARD
> > +
> > +#define CONFIG_REMAKE_ELF
> > +
> > +#define CONFIG_SUPPORT_RAW_INITRD
> > +
> > +/* Cache Definitions */
> > +#define CONFIG_SYS_DCACHE_OFF
> > +
> > +#define CONFIG_IDENT_STRING            "hikey"
> > +
> > +/* Flat Device Tree Definitions */
> > +#define CONFIG_OF_LIBFDT
> > +
> > +/* Physical Memory Map */
> > +
> > +/* CONFIG_SYS_TEXT_BASE needs to align with where ATF loads bl33.bin */
> > +#define CONFIG_SYS_TEXT_BASE           0x35000000
> > +
> > +#define CONFIG_NR_DRAM_BANKS           1
> > +#define PHYS_SDRAM_1                   0x00000000
> > +
> > +/* 1008 MB (the last 16Mb are secured for TrustZone by ATF*/
> > +#define PHYS_SDRAM_1_SIZE              0x3f000000
> > +#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
> > +
> > +#define CONFIG_SYS_INIT_RAM_SIZE       0x1000
> > +
> > +#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE +
> 0x7fff0)
> > +
> > +#define CONFIG_SYS_LOAD_ADDR           (CONFIG_SYS_SDRAM_BASE + 0x80000)
> > +
> > +/* Generic Timer Definitions */
> > +#define COUNTER_FREQUENCY              (19000000)
> > +
> > +/* Generic Interrupt Controller Definitions */
> > +#define GICD_BASE                      (0xf6801000)
>
> Don't need () around simple constants
>

Fixed in V3


>
> > +#define GICC_BASE                      (0xf6802000)
> > +
> > +/* Size of malloc() pool */
> > +#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (8 << 20))
> > +
> > +/* PL011 Serial Configuration */
> > +#define CONFIG_PL011_SERIAL
> > +
> > +#define CONFIG_PL011_CLOCK             19200000
> > +#define CONFIG_PL01x_PORTS             {(void *)CONFIG_SYS_SERIAL0}
> > +#define CONFIG_CONS_INDEX              0
>
> Again this need to be device tree soon.
>

Yes ok. Also we wish to enable additional UARTS on the low speed connector.
In v3 in the pinmux driver I've added code for the additional UARTs.

I'm also being sent an expansion board which brings out the UARTs on the
lowspeed
connector, so I can test this :)


>
> > +
> > +#define CONFIG_BAUDRATE                        115200
> > +#define CONFIG_SYS_SERIAL0             0xF8015000
> > +
> > +#define CONFIG_CMD_USB
> > +#ifdef CONFIG_CMD_USB
> > +#define CONFIG_USB_DWC2
> > +#define CONFIG_USB_DWC2_REG_ADDR 0xF72C0000
> > +/*#define CONFIG_DWC2_DFLT_SPEED_FULL*/
> > +#define CONFIG_DWC2_ENABLE_DYNAMIC_FIFO
> > +
> > +#define CONFIG_USB_STORAGE
> > +#define CONFIG_USB_HOST_ETHER
> > +#define CONFIG_USB_ETHER_SMSC95XX
> > +#define CONFIG_USB_ETHER_ASIX
> > +#define CONFIG_MISC_INIT_R
> > +#endif
> > +
> > +#define CONFIG_HIKEY_GPIO
> > +#define CONFIG_DM_GPIO
> > +#define CONFIG_CMD_GPIO
> > +#define CONFIG_DM
> > +
> > +/* SD/MMC configuration */
> > +#define CONFIG_GENERIC_MMC
> > +#define CONFIG_MMC
> > +#define CONFIG_DWMMC
> > +#define CONFIG_HIKEY_DWMMC
> > +#define CONFIG_BOUNCE_BUFFER
> > +#define CONFIG_CMD_MMC
> > +
> > +#define CONFIG_FS_EXT4
> > +#define CONFIG_FS_FAT
> > +
> > +/* Command line configuration */
> > +#define CONFIG_MENU
> > +#define CONFIG_CMD_CACHE
> > +#define CONFIG_CMD_BDI
> > +#define CONFIG_CMD_UNZIP
> > +#define CONFIG_CMD_PXE
> > +#define CONFIG_CMD_ENV
> > +#define CONFIG_CMD_IMI
> > +#define CONFIG_CMD_LOADB
> > +#define CONFIG_CMD_MEMORY
> > +#define CONFIG_CMD_SAVEENV
> > +#define CONFIG_CMD_RUN
> > +#define CONFIG_CMD_BOOTD
> > +#define CONFIG_CMD_ECHO
> > +#define CONFIG_CMD_SOURCE
> > +
> > +#define CONFIG_MAC_PARTITION
> > +#define CONFIG_MTD_PARTITIONS
> > +
> > +/* BOOTP options */
> > +#define CONFIG_BOOTP_BOOTFILESIZE
> > +
> > +#define CONFIG_CMD_NET
> > +
> > +#include <config_distro_defaults.h>
> > +
> > +/* Initial environment variables */
> > +
> > +/*
> > + * Defines where the kernel and FDT exist in NOR flash and where it will
> > + * be copied into DRAM
> > + */
> > +#define CONFIG_EXTRA_ENV_SETTINGS      \
> > +                               "kernel_name=Image\0"   \
> > +                               "kernel_addr=0x0000000\0" \
> > +                               "fdt_name=hi6220-hikey.dtb\0" \
> > +                               "fdt_addr=0x0300000\0" \
> > +                               "max_fdt=0x100000\0" \
> > +                               "fdt_high=0xffffffffffffffff\0" \
> > +                               "initrd_high=0xffffffffffffffff\0" \
> > +
> > +/* Assume we boot with root on the first partition of a USB stick */
> > +#define CONFIG_BOOTARGS                "console=ttyAMA0,115200n8
> /dev/mmcblk0p7 rw "
> > +
> > +/* Copy the kernel and FDT to DRAM memory and boot */
> > +#define CONFIG_BOOTCOMMAND     "booti $kernel_addr_r - $fdt_addr_r"
> > +
> > +#define CONFIG_BOOTDELAY               2
> > +
> > +/* Preserve enviroment onto sd card */
> > +#define CONFIG_ENV_IS_IN_MMC
> > +#define CONFIG_SYS_MMC_ENV_DEV         1
> > +#define CONFIG_SYS_MMC_ENV_PART                0
> > +#define CONFIG_ENV_OFFSET               0x0
> > +#define CONFIG_ENV_SIZE                        0x1000
> > +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET +
> CONFIG_ENV_SIZE)
> > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
> > +
> > +/* Monitor Command Prompt */
> > +#define CONFIG_SYS_CBSIZE              512     /* Console I/O Buffer
> Size */
> > +#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
> > +                                       sizeof(CONFIG_SYS_PROMPT) + 16)
> > +#define CONFIG_SYS_HUSH_PARSER
> > +#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
> > +#define CONFIG_SYS_LONGHELP
> > +#define CONFIG_CMDLINE_EDITING
> > +#define CONFIG_SYS_MAXARGS             64      /* max command args */
> > +
> > +#define CONFIG_SYS_NO_FLASH
> > +
> > +#endif /* __HIKEY_AEMV8A_H */
> > --
> > 1.9.1
> >
>
> Regards,
> Simon
>

regards,

Peter.

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

* [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board.
  2015-07-16 13:28       ` Rob Herring
  2015-07-16 13:39         ` Tom Rini
@ 2015-07-29 20:59         ` Peter Griffin
  1 sibling, 0 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-29 20:59 UTC (permalink / raw)
  To: u-boot

Hi Rob,

On 16 July 2015 at 14:28, Rob Herring <robherring2@gmail.com> wrote:

> On Wed, Jul 15, 2015 at 7:41 PM, Peter Griffin <peter.griffin@linaro.org>
> wrote:
> > Hi Rob,
> >
> > On Fri, 10 Jul 2015, Rob Herring wrote:
> >
> >> On Wed, Jul 8, 2015 at 10:57 AM, Peter Griffin <
> peter.griffin at linaro.org> wrote:
> >> > HiKey is the first 96boards consumer edition compliant board. It
> features a hi6220
> >> > SoC which has eight ARM A53 cpu's.
> >> >
>
> [...]
>

<snip>


> >> You are probably going to want to setup multiple serial consoles
> >> (debug + LS header). That can come later, but I've figured out how to
> >> enable that if you are interested.
> >
> > Yes I'm interested, please do let me know :)
>
> See this commit:
>
>
> https://git.linaro.org/people/rob.herring/u-boot.git/commitdiff/f1d0aef06ae7fe09793d46589bd94fa36c45bbc0
>
> This may be 8250 specific and require more work for pl011 driver. The
> mixture of 0 and 1 based indexing makes it fun too.
>

OK thanks for the pointer :) I'm waiting for one of Grants expansion boards
to be sent to me, so will try it out when it arrives.


> >> > +#define CONFIG_EXTRA_ENV_SETTINGS      \
> >> > +                               "kernel_name=Image\0"   \
> >> > +                               "kernel_addr=0x0000000\0" \
> >>
> >> Shouldn't this be 0x80000 to avoid copying from 0x0 to 0x80000.
> >
> > I've updated this. Kernel boot time is much reduced with this and also
> the
> > icache being enabled.
>
> Also, this should be kernel_addr_r
>

Fixed in v3


>
> >
> >>
> >> > +                               "fdt_name=hi6220-hikey.dtb\0" \
> >> > +                               "fdt_addr=0x0300000\0" \
>
> and fdt_addr_r
>

Fixed in v3


>
> >> > +                               "max_fdt=0x100000\0" \
> >>
> >> I don't think this is needed.
> >
> > Removed in V3
> >>
> >> > +                               "fdt_high=0xffffffffffffffff\0" \
> >> > +                               "initrd_high=0xffffffffffffffff\0" \
> >> > +
> >> > +/* Assume we boot with root on the first partition of a USB stick */
> >> > +#define CONFIG_BOOTARGS                "console=ttyAMA0,115200n8
> /dev/mmcblk0p7 rw "
> >>
> >> /dev/mmcblk0p7 doesn't look right. You mean "root=/dev/..."?
> >
> > Good spot, yes your right. Plus now you highlight it the comment above
> also needs updating.
> >
> > Will fix in V3.
> >
> >>
> >> > +
> >> > +/* Copy the kernel and FDT to DRAM memory and boot */
> >> > +#define CONFIG_BOOTCOMMAND     "booti $kernel_addr_r - $fdt_addr_r"
> >>
> >> Don't you need to set these variables?
> >>
> >> Also, don't you need to load the kernel and dtb first?
> >
> > Yes, but I'm not sure quite what to make the default here. My personal
> > workflow is: -
> >
> >  "usb start; dhcp; tftp $kernel_addr $kernel_name; tftp $fdt_addr
> $fdt_name;
> >    booti $kernel_addr - $fdt_addr"
> >
> > So I could use that unless you have a better idea?
>
> Not really as everyone has their own preferences. I have some thing like
> this:
>
> #define CONFIG_BOOTCOMMAND \
> "while true; do " \
> "mmc read ${fdt_addr_r} 0x10000 0x1000; " \
> "fastboot; " \
> "mmc read ${fdt_addr_r} 0x10000 0x1000; " \
> "mmc read ${kernel_addr_r} 0x8000 0x8000 && " \
> "bootm ${kernel_addr_r} ${kernel_addr_r} ${fdt_addr_r};" \
> "done"
>
> This relies on fastboot doing USB cable detection and it exits if no
> USB connection.
>
> USB ethernet is as good a default as any. Otherwise reading Image and
> dtb from the 1st or bootable partition (the default) would be
> reasonable.
>

Thanks for sharing your setup, I've updated the bootcmd to be the USB
ethernet by default in the V3 patches.


>> > +/* Preserve enviroment onto sd card */
> >> > +#define CONFIG_ENV_IS_IN_MMC
> >> > +#define CONFIG_SYS_MMC_ENV_DEV         1
> >> > +#define CONFIG_SYS_MMC_ENV_PART                0
> >>
> >> Don't you have these reversed? The first MMC device is 0 and I think
> >> partition numbering starts at 1.
> >
> > Having CONFIG_SYS_MMC_ENV_DEV 1 was deliberate, as the first device is
> eMMC, and
> > I don't have a "official" partition to save the u-boot enviroment in.
> > So as not to corrupt anything folks may have flashed into eMMC from the
> official
> > builds I opted to save the u-boot env to SD card which is device 1.
>
> Okay, but don't you have spare space in the partition with u-boot? I
> have a single bootloader partition 1MB in size and the last 8? KB is
> the env.
>

Good idea, I'd not thought of that and we could most likely do that if we
wanted. However I plan on sticking with u-boot env on the sd card for the
moment
as Tom pointed out it can be a bit more user friendly for a community board.


>
> > However that seems to have been working by luck with ENC_PART being 0,
> and it was
> > actually corrupting the partition table of the SD card. Looking more
> closely I think
> > what I should of used is
> >
> > #define CONFIG_ENV_IS_IN_FAT
> > #define FAT_ENV_INTERFACE               "mmc"
> > #define FAT_ENV_DEVICE_AND_PART         "1:1"
> > #define FAT_ENV_FILE                    "uboot.env"
> >
> > This then saves the enviroment on a fat formatted SD card with the
> filename
> > u-boot.env. This is what I plan on using for v3.
> >
> > Maybe I should additionally request some space in the official eMMC
> parition
> > table and then we could switch over to using that.
> >
> >>
> >> > +#define CONFIG_ENV_OFFSET               0x0
> >> > +#define CONFIG_ENV_SIZE                        0x1000
> >> > +#define CONFIG_ENV_OFFSET_REDUND        (CONFIG_ENV_OFFSET +
> CONFIG_ENV_SIZE)
> >> > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT
> >>
> >> Is redundant env necessary? It seems like this was more for raw NAND
> >> and shouldn't really be needed for MMC.
> >
> > README file documents it as being valid for CONFIG_ENV_IS_IN_MMC, and a
> bunch of boards
> > declare it with their CONFIG_ENV_IS_IN_MMC such as omap5_uevm.h,
> dra7xx_evm.h,
> > am335x_evm.h. Whilst using managed NAND should be more reliable, I think
> it
> > is still used in case there is a power failure whilst issuing 'saveenv'.
>
> Perhaps a bunch of cut and paste. I'd guess there are many more
> platforms that use MMC and don't enable redundant.
>

Tom answered this one already.


>
> > Anyways with moving to CONFIG_ENV_IS_IN_FAT I won't need it anymore so
> it will be
> > removed in V3.
>
> Storing in FAT probably only increases your chance of failure from
> power failure. :)
>
> Ha, yes maybe :)

regards,

Peter.

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

* [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic
  2015-07-18 14:37   ` Simon Glass
@ 2015-07-29 21:04     ` Peter Griffin
  0 siblings, 0 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-29 21:04 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 18 July 2015 at 15:37, Simon Glass <sjg@chromium.org> wrote:

> Hi Peter,
>
> On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> > This pmic is used on the 96boards consumer edition HiKey board.
> >
> > Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> > ---
> >  arch/arm/include/asm/arch-hi6220/hi6553.h | 75
> +++++++++++++++++++++++++++++++
> >  1 file changed, 75 insertions(+)
> >  create mode 100644 arch/arm/include/asm/arch-hi6220/hi6553.h
>
> Should be in drivers/power/pmic I think. Also use struct for reg
> access. Should probably use the new PMIC uclass (we can convert it
> later if you don't have a device tree yet).
>

OK I've converted it to a simple pmic driver in v3 patches.

<snip>

regards,

Peter

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

* [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files.
  2015-07-18 14:37   ` Simon Glass
@ 2015-07-29 21:07     ` Peter Griffin
  0 siblings, 0 replies; 23+ messages in thread
From: Peter Griffin @ 2015-07-29 21:07 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 18 July 2015 at 15:37, Simon Glass <sjg@chromium.org> wrote:

> Hi Peter,
>
> On 8 July 2015 at 09:57, Peter Griffin <peter.griffin@linaro.org> wrote:
> > This patch adds the header files which will be used in the subsquent
> > board / drivers to enable support for hi6220 hikey board.
> >
> > Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
> > ---
> >  arch/arm/include/asm/arch-hi6220/hi6220.h          | 324
> +++++++++++++++++++
> >  .../include/asm/arch-hi6220/hi6220_regs_alwayson.h | 349
> +++++++++++++++++++++
> >  2 files changed, 673 insertions(+)
> >  create mode 100644 arch/arm/include/asm/arch-hi6220/hi6220.h
> >  create mode 100644
> arch/arm/include/asm/arch-hi6220/hi6220_regs_alwayson.h
> >
> > diff --git a/arch/arm/include/asm/arch-hi6220/hi6220.h
> b/arch/arm/include/asm/arch-hi6220/hi6220.h
> > new file mode 100644
> > index 0000000..3ddec91
> > --- /dev/null
> > +++ b/arch/arm/include/asm/arch-hi6220/hi6220.h
> > @@ -0,0 +1,324 @@
> > +/*
> > + * (C) Copyright 2015 Linaro
> > + * Peter Griffin <peter.griffin@linaro.org>
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +
> > +#ifndef __HI6220_H__
> > +#define __HI6220_H__
> > +
> > +#include "hi6220_regs_alwayson.h"
> > +
> > +#define HI6220_MMC0_BASE                       0xF723D000
> > +#define HI6220_MMC1_BASE                       0xF723E000
> > +
> > +#define HI6220_PMUSSI_BASE                     0xF8000000
> > +
> > +#define HI6220_PERI_BASE                       0xF7030000
> > +
> > +#define PERI_SC_PERIPH_CTRL1                   (HI6220_PERI_BASE +
> 0x000)
> > +
>
> I think you should have:
>
> struct peri_sc_regs {
>    u32 ctrl1;
>    u32 ctrl2;
> ...
> };
>
> U-Boot uses structs for I/O access.
>

Phew...I've converted it over to structs for register access.
It actually took quite a long time to do, but it all works again now :)

So it will be using structs for I/O access in V3.

regards,

Peter.

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

end of thread, other threads:[~2015-07-29 21:07 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-08 15:57 [U-Boot] [PATCH v2 0/6] Add support for hi6220 SoC and HiKey 96boards CE board Peter Griffin
2015-07-08 15:57 ` [U-Boot] [PATCH v2 1/6] dm: gpio: hi6220: Add a hi6220 GPIO driver model driver Peter Griffin
2015-07-18 14:37   ` Simon Glass
2015-07-08 15:57 ` [U-Boot] [PATCH v2 2/6] ARM: hi6220: Add register and bitfield definition header files Peter Griffin
2015-07-18 14:37   ` Simon Glass
2015-07-29 21:07     ` Peter Griffin
2015-07-08 15:57 ` [U-Boot] [PATCH v2 3/6] hi6553: Add register definition and bitfield header for 6553 pmic Peter Griffin
2015-07-18 14:37   ` Simon Glass
2015-07-29 21:04     ` Peter Griffin
2015-07-08 15:57 ` [U-Boot] [PATCH v2 4/6] mmc: hi6220_dw_mmc: Add hi6220 glue code for dw_mmc controller Peter Griffin
2015-07-09  4:30   ` Jaehoon Chung
2015-07-18 14:38   ` Simon Glass
2015-07-19  9:39     ` Peter Griffin
2015-07-20  2:17       ` Simon Glass
2015-07-08 15:57 ` [U-Boot] [PATCH v2 5/6] ARM64: hikey: hi6220: Add u-boot support for the 96boards CE HiKey board Peter Griffin
2015-07-10 18:36   ` Rob Herring
2015-07-16  0:41     ` Peter Griffin
2015-07-16 13:28       ` Rob Herring
2015-07-16 13:39         ` Tom Rini
2015-07-29 20:59         ` Peter Griffin
2015-07-18 14:38   ` Simon Glass
2015-07-28 17:37     ` Peter Griffin
2015-07-08 15:57 ` [U-Boot] [PATCH v2 6/6] ARM64: hikey: Add a README for this board Peter Griffin

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