All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
@ 2016-03-16  8:59 ` Wills Wang
  2016-03-16 21:35   ` Marek Vasut
  2016-04-10 18:35   ` Daniel Schwierzeck
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs Wills Wang
                   ` (7 subsequent siblings)
  8 siblings, 2 replies; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This patch add some common code for QCA/Atheros ath79 SOCs such as
DDR tuning, chip reset and CPU detection.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Use setbits_be32
- Use lookup-table instead of big switch statement for CPU detection

Changes in v7:
- Use setbits_32
- Fix include path for SoC specific headers

Changes in v6:
- Move ar933x as separate patch
- Add get_bootstrap in reset.c
- Use map_physmem instead of KSEG1ADDR
- Add arch_cpu_init for detect SOC type for early

Changes in v5:
- Add independent Kconfig
- Use SRAM for initial stack
- Move DDR initialization into board_early_init_f
- Convert DDR tap tunning code to C
- Save SOC's version into arch_global_data

Changes in v4:
- Use global_data to save CPU/DDR/AHB clock
- Use arch_global_data to save SOC's type, revison and id

Changes in v3:
- Move SoC specific header files into arch/mips/mach-ath79/include/mach
- Optimize assembly code
- Same code style convertion

Changes in v2:
- Move all SoC specific header files into arch/mips/include/asm/arch-ath79
- Check SOC type and extract common code into arch/mips/mach-ath79

 arch/mips/Kconfig                               |    6 +
 arch/mips/Makefile                              |    1 +
 arch/mips/include/asm/global_data.h             |    6 +
 arch/mips/mach-ath79/Kconfig                    |    7 +
 arch/mips/mach-ath79/Makefile                   |    7 +
 arch/mips/mach-ath79/cpu.c                      |  142 +++
 arch/mips/mach-ath79/dram.c                     |   16 +
 arch/mips/mach-ath79/include/mach/ar71xx_regs.h | 1184 +++++++++++++++++++++++
 arch/mips/mach-ath79/include/mach/ath79.h       |  143 +++
 arch/mips/mach-ath79/include/mach/ddr.h         |   13 +
 arch/mips/mach-ath79/include/mach/reset.h       |   14 +
 arch/mips/mach-ath79/reset.c                    |   71 ++
 12 files changed, 1610 insertions(+)
 create mode 100644 arch/mips/mach-ath79/Kconfig
 create mode 100644 arch/mips/mach-ath79/Makefile
 create mode 100644 arch/mips/mach-ath79/cpu.c
 create mode 100644 arch/mips/mach-ath79/dram.c
 create mode 100644 arch/mips/mach-ath79/include/mach/ar71xx_regs.h
 create mode 100644 arch/mips/mach-ath79/include/mach/ath79.h
 create mode 100644 arch/mips/mach-ath79/include/mach/ddr.h
 create mode 100644 arch/mips/mach-ath79/include/mach/reset.h
 create mode 100644 arch/mips/mach-ath79/reset.c

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index f852a1f..fbedb29 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -55,6 +55,11 @@ config TARGET_PB1X00
 	select SYS_MIPS_CACHE_INIT_RAM_LOAD
 	select MIPS_TUNE_4KC
 
+config ARCH_ATH79
+	bool "Support QCA/Atheros ath79"
+	select OF_CONTROL
+	select DM
+
 config MACH_PIC32
 	bool "Support Microchip PIC32"
 	select OF_CONTROL
@@ -67,6 +72,7 @@ source "board/imgtec/malta/Kconfig"
 source "board/micronas/vct/Kconfig"
 source "board/pb1x00/Kconfig"
 source "board/qemu-mips/Kconfig"
+source "arch/mips/mach-ath79/Kconfig"
 source "arch/mips/mach-pic32/Kconfig"
 
 if MIPS
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index aec5a15..7a82316 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -8,6 +8,7 @@ libs-y += arch/mips/cpu/
 libs-y += arch/mips/lib/
 
 machine-$(CONFIG_SOC_AU1X00) += au1x00
+machine-$(CONFIG_ARCH_ATH79) += ath79
 machine-$(CONFIG_MACH_PIC32) += pic32
 
 machdirs := $(patsubst %,arch/mips/mach-%/,$(machine-y))
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index a1ca257..3f230b0 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -23,6 +23,12 @@ struct arch_global_data {
 	unsigned long tbl;
 	unsigned long lastinc;
 #endif
+#ifdef CONFIG_ARCH_ATH79
+	unsigned long id;
+	unsigned long soc;
+	unsigned long rev;
+	unsigned long ver;
+#endif
 };
 
 #include <asm-generic/global_data.h>
diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
new file mode 100644
index 0000000..7d8ce09
--- /dev/null
+++ b/arch/mips/mach-ath79/Kconfig
@@ -0,0 +1,7 @@
+menu "QCA/Atheros 7xxx/9xxx platforms"
+	depends on ARCH_ATH79
+
+config SYS_SOC
+	default "ath79"
+
+endmenu
diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile
new file mode 100644
index 0000000..6203cf0
--- /dev/null
+++ b/arch/mips/mach-ath79/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += reset.o
+obj-y += cpu.o
+obj-y += dram.o
diff --git a/arch/mips/mach-ath79/cpu.c b/arch/mips/mach-ath79/cpu.c
new file mode 100644
index 0000000..c6122f2
--- /dev/null
+++ b/arch/mips/mach-ath79/cpu.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ath79.h>
+#include <mach/ar71xx_regs.h>
+
+struct ath79_soc_desc {
+	enum ath79_soc_type soc;
+	const char *chip;
+	int major;
+	int minor;
+};
+
+static struct ath79_soc_desc desc[] = {
+	{ATH79_SOC_AR7130,      "7130",
+	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7130},
+	{ATH79_SOC_AR7141,      "7141",
+	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7141},
+	{ATH79_SOC_AR7161,      "7161",
+	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7161},
+	{ATH79_SOC_AR7240,      "7240", REV_ID_MAJOR_AR7240,    0},
+	{ATH79_SOC_AR7241,      "7241", REV_ID_MAJOR_AR7241,    0},
+	{ATH79_SOC_AR7242,      "7242", REV_ID_MAJOR_AR7242,    0},
+	{ATH79_SOC_AR9130,      "9130",
+	 REV_ID_MAJOR_AR913X,   AR913X_REV_ID_MINOR_AR9130},
+	{ATH79_SOC_AR9132,      "9132",
+	 REV_ID_MAJOR_AR913X,   AR913X_REV_ID_MINOR_AR9132},
+	{ATH79_SOC_AR9330,      "9330", REV_ID_MAJOR_AR9330,    0},
+	{ATH79_SOC_AR9331,      "9331", REV_ID_MAJOR_AR9331,    0},
+	{ATH79_SOC_AR9341,      "9341", REV_ID_MAJOR_AR9341,    0},
+	{ATH79_SOC_AR9342,      "9342", REV_ID_MAJOR_AR9342,    0},
+	{ATH79_SOC_AR9344,      "9344", REV_ID_MAJOR_AR9344,    0},
+	{ATH79_SOC_QCA9533,     "9533", REV_ID_MAJOR_QCA9533,   0},
+	{ATH79_SOC_QCA9533,     "9533",
+	 REV_ID_MAJOR_QCA9533_V2,       0},
+	{ATH79_SOC_QCA9556,     "9556", REV_ID_MAJOR_QCA9556,   0},
+	{ATH79_SOC_QCA9558,     "9558", REV_ID_MAJOR_QCA9558,   0},
+	{ATH79_SOC_TP9343,      "9343", REV_ID_MAJOR_TP9343,    0},
+	{ATH79_SOC_QCA9561,     "9561", REV_ID_MAJOR_QCA9561,   0},
+};
+
+int arch_cpu_init(void)
+{
+	void __iomem *base;
+	enum ath79_soc_type soc = ATH79_SOC_UNKNOWN;
+	u32 id, major, minor = 0;
+	u32 rev = 0, ver = 1;
+	int i;
+
+	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+			   MAP_NOCACHE);
+
+	id = readl(base + AR71XX_RESET_REG_REV_ID);
+	major = id & REV_ID_MAJOR_MASK;
+	switch (major) {
+	case REV_ID_MAJOR_AR71XX:
+	case REV_ID_MAJOR_AR913X:
+		minor = id & AR71XX_REV_ID_MINOR_MASK;
+		rev = id >> AR71XX_REV_ID_REVISION_SHIFT;
+		rev &= AR71XX_REV_ID_REVISION_MASK;
+		break;
+
+	case REV_ID_MAJOR_QCA9533_V2:
+		ver = 2;
+		/* drop through */
+
+	case REV_ID_MAJOR_AR9341:
+	case REV_ID_MAJOR_AR9342:
+	case REV_ID_MAJOR_AR9344:
+	case REV_ID_MAJOR_QCA9533:
+	case REV_ID_MAJOR_QCA9556:
+	case REV_ID_MAJOR_QCA9558:
+	case REV_ID_MAJOR_TP9343:
+	case REV_ID_MAJOR_QCA9561:
+		rev = id & AR71XX_REV_ID_REVISION2_MASK;
+		break;
+	default:
+		rev = id & AR71XX_REV_ID_REVISION_MASK;
+		break;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(desc); i++) {
+		if ((desc[i].major == major) &&
+		    (desc[i].minor == minor)) {
+			soc = desc[i].soc;
+			break;
+		}
+	}
+
+	gd->arch.id = id;
+	gd->arch.soc = soc;
+	gd->arch.rev = rev;
+	gd->arch.ver = ver;
+	return 0;
+}
+
+int print_cpuinfo(void)
+{
+	enum ath79_soc_type soc = ATH79_SOC_UNKNOWN;
+	const char *chip = "????";
+	u32 id, rev, ver;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(desc); i++) {
+		if (desc[i].soc == gd->arch.soc) {
+			chip = desc[i].chip;
+			soc = desc[i].soc;
+			break;
+		}
+	}
+
+	id = gd->arch.id;
+	rev = gd->arch.rev;
+	ver = gd->arch.ver;
+
+	switch (soc) {
+	case ATH79_SOC_QCA9533:
+	case ATH79_SOC_QCA9556:
+	case ATH79_SOC_QCA9558:
+	case ATH79_SOC_QCA9561:
+		printf("Qualcomm Atheros QCA%s ver %u rev %u\n", chip,
+		       ver, rev);
+		break;
+	case ATH79_SOC_TP9343:
+		printf("Qualcomm Atheros TP%s rev %u\n", chip, rev);
+		break;
+	case ATH79_SOC_UNKNOWN:
+		printf("ATH79: unknown SoC, id:0x%08x", id);
+		break;
+	default:
+		printf("Atheros AR%s rev %u\n", chip, rev);
+	}
+
+	return 0;
+}
diff --git a/arch/mips/mach-ath79/dram.c b/arch/mips/mach-ath79/dram.c
new file mode 100644
index 0000000..c29e98c
--- /dev/null
+++ b/arch/mips/mach-ath79/dram.c
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <linux/sizes.h>
+#include <asm/addrspace.h>
+#include <mach/ddr.h>
+
+phys_size_t initdram(int board_type)
+{
+	ddr_tap_tuning();
+	return get_ram_size((void *)KSEG1, SZ_256M);
+}
diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
new file mode 100644
index 0000000..893dedc
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
@@ -0,0 +1,1184 @@
+/*
+ * Atheros AR71XX/AR724X/AR913X SoC register definitions
+ *
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
+ * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_AR71XX_REGS_H
+#define __ASM_MACH_AR71XX_REGS_H
+
+#ifndef __ASSEMBLY__
+#include <linux/bitops.h>
+#else
+#ifndef BIT
+#define BIT(nr)                 (1 << (nr))
+#endif
+#endif
+
+#define AR71XX_APB_BASE                 0x18000000
+#define AR71XX_GE0_BASE                 0x19000000
+#define AR71XX_GE0_SIZE                 0x10000
+#define AR71XX_GE1_BASE                 0x1a000000
+#define AR71XX_GE1_SIZE                 0x10000
+#define AR71XX_EHCI_BASE                0x1b000000
+#define AR71XX_EHCI_SIZE                0x1000
+#define AR71XX_OHCI_BASE                0x1c000000
+#define AR71XX_OHCI_SIZE                0x1000
+#define AR71XX_SPI_BASE                 0x1f000000
+#define AR71XX_SPI_SIZE                 0x01000000
+
+#define AR71XX_DDR_CTRL_BASE            (AR71XX_APB_BASE + 0x00000000)
+#define AR71XX_DDR_CTRL_SIZE            0x100
+#define AR71XX_UART_BASE                (AR71XX_APB_BASE + 0x00020000)
+#define AR71XX_UART_SIZE                0x100
+#define AR71XX_USB_CTRL_BASE            (AR71XX_APB_BASE + 0x00030000)
+#define AR71XX_USB_CTRL_SIZE            0x100
+#define AR71XX_GPIO_BASE                (AR71XX_APB_BASE + 0x00040000)
+#define AR71XX_GPIO_SIZE                0x100
+#define AR71XX_PLL_BASE                 (AR71XX_APB_BASE + 0x00050000)
+#define AR71XX_PLL_SIZE                 0x100
+#define AR71XX_RESET_BASE               (AR71XX_APB_BASE + 0x00060000)
+#define AR71XX_RESET_SIZE               0x100
+#define AR71XX_MII_BASE                 (AR71XX_APB_BASE + 0x00070000)
+#define AR71XX_MII_SIZE                 0x100
+
+#define AR71XX_PCI_MEM_BASE             0x10000000
+#define AR71XX_PCI_MEM_SIZE             0x07000000
+
+#define AR71XX_PCI_WIN0_OFFS            0x10000000
+#define AR71XX_PCI_WIN1_OFFS            0x11000000
+#define AR71XX_PCI_WIN2_OFFS            0x12000000
+#define AR71XX_PCI_WIN3_OFFS            0x13000000
+#define AR71XX_PCI_WIN4_OFFS            0x14000000
+#define AR71XX_PCI_WIN5_OFFS            0x15000000
+#define AR71XX_PCI_WIN6_OFFS            0x16000000
+#define AR71XX_PCI_WIN7_OFFS            0x07000000
+
+#define AR71XX_PCI_CFG_BASE \
+	(AR71XX_PCI_MEM_BASE + AR71XX_PCI_WIN7_OFFS + 0x10000)
+#define AR71XX_PCI_CFG_SIZE             0x100
+
+#define AR7240_USB_CTRL_BASE            (AR71XX_APB_BASE + 0x00030000)
+#define AR7240_USB_CTRL_SIZE            0x100
+#define AR7240_OHCI_BASE                0x1b000000
+#define AR7240_OHCI_SIZE                0x1000
+
+#define AR724X_PCI_MEM_BASE             0x10000000
+#define AR724X_PCI_MEM_SIZE             0x04000000
+
+#define AR724X_PCI_CFG_BASE             0x14000000
+#define AR724X_PCI_CFG_SIZE             0x1000
+#define AR724X_PCI_CRP_BASE             (AR71XX_APB_BASE + 0x000c0000)
+#define AR724X_PCI_CRP_SIZE             0x1000
+#define AR724X_PCI_CTRL_BASE            (AR71XX_APB_BASE + 0x000f0000)
+#define AR724X_PCI_CTRL_SIZE            0x100
+
+#define AR724X_EHCI_BASE                0x1b000000
+#define AR724X_EHCI_SIZE                0x1000
+
+#define AR913X_EHCI_BASE                0x1b000000
+#define AR913X_EHCI_SIZE                0x1000
+#define AR913X_WMAC_BASE                (AR71XX_APB_BASE + 0x000C0000)
+#define AR913X_WMAC_SIZE                0x30000
+
+#define AR933X_UART_BASE                (AR71XX_APB_BASE + 0x00020000)
+#define AR933X_UART_SIZE                0x14
+#define AR933X_GMAC_BASE                (AR71XX_APB_BASE + 0x00070000)
+#define AR933X_GMAC_SIZE                0x04
+#define AR933X_WMAC_BASE                (AR71XX_APB_BASE + 0x00100000)
+#define AR933X_WMAC_SIZE                0x20000
+#define AR933X_RTC_BASE                 (AR71XX_APB_BASE + 0x00107000)
+#define AR933X_RTC_SIZE                 0x1000
+#define AR933X_EHCI_BASE                0x1b000000
+#define AR933X_EHCI_SIZE                0x1000
+#define AR933X_SRIF_BASE                (AR71XX_APB_BASE + 0x00116000)
+#define AR933X_SRIF_SIZE                0x1000
+
+#define AR934X_GMAC_BASE                (AR71XX_APB_BASE + 0x00070000)
+#define AR934X_GMAC_SIZE                0x14
+#define AR934X_WMAC_BASE                (AR71XX_APB_BASE + 0x00100000)
+#define AR934X_WMAC_SIZE                0x20000
+#define AR934X_EHCI_BASE                0x1b000000
+#define AR934X_EHCI_SIZE                0x200
+#define AR934X_NFC_BASE                 0x1b000200
+#define AR934X_NFC_SIZE                 0xb8
+#define AR934X_SRIF_BASE                (AR71XX_APB_BASE + 0x00116000)
+#define AR934X_SRIF_SIZE                0x1000
+
+#define QCA953X_GMAC_BASE               (AR71XX_APB_BASE + 0x00070000)
+#define QCA953X_GMAC_SIZE               0x14
+#define QCA953X_WMAC_BASE               (AR71XX_APB_BASE + 0x00100000)
+#define QCA953X_WMAC_SIZE               0x20000
+#define QCA953X_RTC_BASE                (AR71XX_APB_BASE + 0x00107000)
+#define QCA953X_RTC_SIZE                0x1000
+#define QCA953X_EHCI_BASE               0x1b000000
+#define QCA953X_EHCI_SIZE               0x200
+#define QCA953X_SRIF_BASE               (AR71XX_APB_BASE + 0x00116000)
+#define QCA953X_SRIF_SIZE               0x1000
+
+#define QCA953X_PCI_CFG_BASE0           0x14000000
+#define QCA953X_PCI_CTRL_BASE0          (AR71XX_APB_BASE + 0x000f0000)
+#define QCA953X_PCI_CRP_BASE0           (AR71XX_APB_BASE + 0x000c0000)
+#define QCA953X_PCI_MEM_BASE0           0x10000000
+#define QCA953X_PCI_MEM_SIZE            0x02000000
+
+#define QCA955X_PCI_MEM_BASE0           0x10000000
+#define QCA955X_PCI_MEM_BASE1           0x12000000
+#define QCA955X_PCI_MEM_SIZE            0x02000000
+#define QCA955X_PCI_CFG_BASE0           0x14000000
+#define QCA955X_PCI_CFG_BASE1           0x16000000
+#define QCA955X_PCI_CFG_SIZE            0x1000
+#define QCA955X_PCI_CRP_BASE0           (AR71XX_APB_BASE + 0x000c0000)
+#define QCA955X_PCI_CRP_BASE1           (AR71XX_APB_BASE + 0x00250000)
+#define QCA955X_PCI_CRP_SIZE            0x1000
+#define QCA955X_PCI_CTRL_BASE0          (AR71XX_APB_BASE + 0x000f0000)
+#define QCA955X_PCI_CTRL_BASE1          (AR71XX_APB_BASE + 0x00280000)
+#define QCA955X_PCI_CTRL_SIZE           0x100
+
+#define QCA955X_GMAC_BASE               (AR71XX_APB_BASE + 0x00070000)
+#define QCA955X_GMAC_SIZE               0x40
+#define QCA955X_WMAC_BASE               (AR71XX_APB_BASE + 0x00100000)
+#define QCA955X_WMAC_SIZE               0x20000
+#define QCA955X_EHCI0_BASE              0x1b000000
+#define QCA955X_EHCI1_BASE              0x1b400000
+#define QCA955X_EHCI_SIZE               0x1000
+#define QCA955X_NFC_BASE                0x1b800200
+#define QCA955X_NFC_SIZE                0xb8
+
+#define QCA956X_PCI_MEM_BASE1           0x12000000
+#define QCA956X_PCI_MEM_SIZE            0x02000000
+#define QCA956X_PCI_CFG_BASE1           0x16000000
+#define QCA956X_PCI_CFG_SIZE            0x1000
+#define QCA956X_PCI_CRP_BASE1           (AR71XX_APB_BASE + 0x00250000)
+#define QCA956X_PCI_CRP_SIZE            0x1000
+#define QCA956X_PCI_CTRL_BASE1          (AR71XX_APB_BASE + 0x00280000)
+#define QCA956X_PCI_CTRL_SIZE           0x100
+
+#define QCA956X_WMAC_BASE               (AR71XX_APB_BASE + 0x00100000)
+#define QCA956X_WMAC_SIZE               0x20000
+#define QCA956X_EHCI0_BASE              0x1b000000
+#define QCA956X_EHCI1_BASE              0x1b400000
+#define QCA956X_EHCI_SIZE               0x200
+#define QCA956X_GMAC_BASE               (AR71XX_APB_BASE + 0x00070000)
+#define QCA956X_GMAC_SIZE               0x64
+
+/*
+ * DDR_CTRL block
+ */
+#define AR71XX_DDR_REG_CONFIG                           0x00
+#define AR71XX_DDR_REG_CONFIG2                          0x04
+#define AR71XX_DDR_REG_MODE                             0x08
+#define AR71XX_DDR_REG_EMR                              0x0c
+#define AR71XX_DDR_REG_CONTROL                          0x10
+#define AR71XX_DDR_REG_REFRESH                          0x14
+#define AR71XX_DDR_REG_RD_CYCLE                         0x18
+#define AR71XX_DDR_REG_TAP_CTRL0                        0x1c
+#define AR71XX_DDR_REG_TAP_CTRL1                        0x20
+
+#define AR71XX_DDR_REG_PCI_WIN0                         0x7c
+#define AR71XX_DDR_REG_PCI_WIN1                         0x80
+#define AR71XX_DDR_REG_PCI_WIN2                         0x84
+#define AR71XX_DDR_REG_PCI_WIN3                         0x88
+#define AR71XX_DDR_REG_PCI_WIN4                         0x8c
+#define AR71XX_DDR_REG_PCI_WIN5                         0x90
+#define AR71XX_DDR_REG_PCI_WIN6                         0x94
+#define AR71XX_DDR_REG_PCI_WIN7                         0x98
+#define AR71XX_DDR_REG_FLUSH_GE0                        0x9c
+#define AR71XX_DDR_REG_FLUSH_GE1                        0xa0
+#define AR71XX_DDR_REG_FLUSH_USB                        0xa4
+#define AR71XX_DDR_REG_FLUSH_PCI                        0xa8
+
+#define AR724X_DDR_REG_FLUSH_GE0                        0x7c
+#define AR724X_DDR_REG_FLUSH_GE1                        0x80
+#define AR724X_DDR_REG_FLUSH_USB                        0x84
+#define AR724X_DDR_REG_FLUSH_PCIE                       0x88
+
+#define AR913X_DDR_REG_FLUSH_GE0                        0x7c
+#define AR913X_DDR_REG_FLUSH_GE1                        0x80
+#define AR913X_DDR_REG_FLUSH_USB                        0x84
+#define AR913X_DDR_REG_FLUSH_WMAC                       0x88
+
+#define AR933X_DDR_REG_FLUSH_GE0                        0x7c
+#define AR933X_DDR_REG_FLUSH_GE1                        0x80
+#define AR933X_DDR_REG_FLUSH_USB                        0x84
+#define AR933X_DDR_REG_FLUSH_WMAC                       0x88
+#define AR933X_DDR_REG_DDR2_CONFIG                      0x8c
+#define AR933X_DDR_REG_EMR2                             0x90
+#define AR933X_DDR_REG_EMR3                             0x94
+#define AR933X_DDR_REG_BURST                            0x98
+#define AR933X_DDR_REG_TIMEOUT_MAX                      0x9c
+#define AR933X_DDR_REG_TIMEOUT_CNT                      0x9c
+#define AR933X_DDR_REG_TIMEOUT_ADDR                     0x9c
+
+#define AR934X_DDR_REG_FLUSH_GE0                        0x9c
+#define AR934X_DDR_REG_FLUSH_GE1                        0xa0
+#define AR934X_DDR_REG_FLUSH_USB                        0xa4
+#define AR934X_DDR_REG_FLUSH_PCIE                       0xa8
+#define AR934X_DDR_REG_FLUSH_WMAC                       0xac
+
+#define QCA953X_DDR_REG_FLUSH_GE0                       0x9c
+#define QCA953X_DDR_REG_FLUSH_GE1                       0xa0
+#define QCA953X_DDR_REG_FLUSH_USB                       0xa4
+#define QCA953X_DDR_REG_FLUSH_PCIE                      0xa8
+#define QCA953X_DDR_REG_FLUSH_WMAC                      0xac
+#define QCA953X_DDR_REG_DDR2_CONFIG                     0xb8
+#define QCA953X_DDR_REG_BURST                           0xc4
+#define QCA953X_DDR_REG_BURST2                          0xc8
+#define QCA953X_DDR_REG_TIMEOUT_MAX                     0xcc
+#define QCA953X_DDR_REG_CTL_CONF                        0x108
+#define QCA953X_DDR_REG_CONFIG3                         0x15c
+
+/*
+ * PLL block
+ */
+#define AR71XX_PLL_REG_CPU_CONFIG                       0x00
+#define AR71XX_PLL_REG_SEC_CONFIG                       0x04
+#define AR71XX_PLL_REG_ETH0_INT_CLOCK                   0x10
+#define AR71XX_PLL_REG_ETH1_INT_CLOCK                   0x14
+
+#define AR71XX_PLL_DIV_SHIFT                            3
+#define AR71XX_PLL_DIV_MASK                             0x1f
+#define AR71XX_CPU_DIV_SHIFT                            16
+#define AR71XX_CPU_DIV_MASK                             0x3
+#define AR71XX_DDR_DIV_SHIFT                            18
+#define AR71XX_DDR_DIV_MASK                             0x3
+#define AR71XX_AHB_DIV_SHIFT                            20
+#define AR71XX_AHB_DIV_MASK                             0x7
+
+#define AR71XX_ETH0_PLL_SHIFT                           17
+#define AR71XX_ETH1_PLL_SHIFT                           19
+
+#define AR724X_PLL_REG_CPU_CONFIG                       0x00
+#define AR724X_PLL_REG_PCIE_CONFIG                      0x18
+
+#define AR724X_PLL_DIV_SHIFT                            0
+#define AR724X_PLL_DIV_MASK                             0x3ff
+#define AR724X_PLL_REF_DIV_SHIFT                        10
+#define AR724X_PLL_REF_DIV_MASK                         0xf
+#define AR724X_AHB_DIV_SHIFT                            19
+#define AR724X_AHB_DIV_MASK                             0x1
+#define AR724X_DDR_DIV_SHIFT                            22
+#define AR724X_DDR_DIV_MASK                             0x3
+
+#define AR7242_PLL_REG_ETH0_INT_CLOCK                   0x2c
+
+#define AR913X_PLL_REG_CPU_CONFIG                       0x00
+#define AR913X_PLL_REG_ETH_CONFIG                       0x04
+#define AR913X_PLL_REG_ETH0_INT_CLOCK                   0x14
+#define AR913X_PLL_REG_ETH1_INT_CLOCK                   0x18
+
+#define AR913X_PLL_DIV_SHIFT                            0
+#define AR913X_PLL_DIV_MASK                             0x3ff
+#define AR913X_DDR_DIV_SHIFT                            22
+#define AR913X_DDR_DIV_MASK                             0x3
+#define AR913X_AHB_DIV_SHIFT                            19
+#define AR913X_AHB_DIV_MASK                             0x1
+
+#define AR913X_ETH0_PLL_SHIFT                           20
+#define AR913X_ETH1_PLL_SHIFT                           22
+
+#define AR933X_PLL_CPU_CONFIG_REG                       0x00
+#define AR933X_PLL_CLK_CTRL_REG                         0x08
+#define AR933X_PLL_DITHER_FRAC_REG                      0x10
+
+#define AR933X_PLL_CPU_CONFIG_NINT_SHIFT                10
+#define AR933X_PLL_CPU_CONFIG_NINT_MASK                 0x3f
+#define AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT              16
+#define AR933X_PLL_CPU_CONFIG_REFDIV_MASK               0x1f
+#define AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT              23
+#define AR933X_PLL_CPU_CONFIG_OUTDIV_MASK               0x7
+
+#define AR933X_PLL_CLK_CTRL_BYPASS                      BIT(2)
+#define AR933X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT          5
+#define AR933X_PLL_CLK_CTRL_CPU_POST_DIV_MASK           0x3
+#define AR933X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT          10
+#define AR933X_PLL_CLK_CTRL_DDR_POST_DIV_MASK           0x3
+#define AR933X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT          15
+#define AR933X_PLL_CLK_CTRL_AHB_POST_DIV_MASK           0x7
+
+#define AR934X_PLL_CPU_CONFIG_REG                       0x00
+#define AR934X_PLL_DDR_CONFIG_REG                       0x04
+#define AR934X_PLL_CPU_DDR_CLK_CTRL_REG                 0x08
+#define AR934X_PLL_SWITCH_CLOCK_CONTROL_REG             0x24
+#define AR934X_PLL_ETH_XMII_CONTROL_REG                 0x2c
+
+#define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT               0
+#define AR934X_PLL_CPU_CONFIG_NFRAC_MASK                0x3f
+#define AR934X_PLL_CPU_CONFIG_NINT_SHIFT                6
+#define AR934X_PLL_CPU_CONFIG_NINT_MASK                 0x3f
+#define AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT              12
+#define AR934X_PLL_CPU_CONFIG_REFDIV_MASK               0x1f
+#define AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT              19
+#define AR934X_PLL_CPU_CONFIG_OUTDIV_MASK               0x3
+
+#define AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT               0
+#define AR934X_PLL_DDR_CONFIG_NFRAC_MASK                0x3ff
+#define AR934X_PLL_DDR_CONFIG_NINT_SHIFT                10
+#define AR934X_PLL_DDR_CONFIG_NINT_MASK                 0x3f
+#define AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT              16
+#define AR934X_PLL_DDR_CONFIG_REFDIV_MASK               0x1f
+#define AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT              23
+#define AR934X_PLL_DDR_CONFIG_OUTDIV_MASK               0x7
+
+#define AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS              BIT(2)
+#define AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS              BIT(3)
+#define AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS              BIT(4)
+#define AR934X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT          5
+#define AR934X_PLL_CLK_CTRL_CPU_POST_DIV_MASK           0x1f
+#define AR934X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT          10
+#define AR934X_PLL_CLK_CTRL_DDR_POST_DIV_MASK           0x1f
+#define AR934X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT          15
+#define AR934X_PLL_CLK_CTRL_AHB_POST_DIV_MASK           0x1f
+#define AR934X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL          BIT(20)
+#define AR934X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL          BIT(21)
+#define AR934X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL          BIT(24)
+
+#define AR934X_PLL_SWITCH_CLK_CTRL_MDIO_CLK_SEL         BIT(6)
+
+#define QCA953X_PLL_CPU_CONFIG_REG                      0x00
+#define QCA953X_PLL_DDR_CONFIG_REG                      0x04
+#define QCA953X_PLL_CLK_CTRL_REG                        0x08
+#define QCA953X_PLL_SWITCH_CLOCK_CONTROL_REG            0x24
+#define QCA953X_PLL_ETH_XMII_CONTROL_REG                0x2c
+#define QCA953X_PLL_DDR_DIT_FRAC_REG                    0x44
+#define QCA953X_PLL_CPU_DIT_FRAC_REG                    0x48
+
+#define QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT              0
+#define QCA953X_PLL_CPU_CONFIG_NFRAC_MASK               0x3f
+#define QCA953X_PLL_CPU_CONFIG_NINT_SHIFT               6
+#define QCA953X_PLL_CPU_CONFIG_NINT_MASK                0x3f
+#define QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT             12
+#define QCA953X_PLL_CPU_CONFIG_REFDIV_MASK              0x1f
+#define QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT             19
+#define QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK              0x7
+
+#define QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT              0
+#define QCA953X_PLL_DDR_CONFIG_NFRAC_MASK               0x3ff
+#define QCA953X_PLL_DDR_CONFIG_NINT_SHIFT               10
+#define QCA953X_PLL_DDR_CONFIG_NINT_MASK                0x3f
+#define QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT             16
+#define QCA953X_PLL_DDR_CONFIG_REFDIV_MASK              0x1f
+#define QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT             23
+#define QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK              0x7
+
+#define QCA953X_PLL_CONFIG_PWD                          BIT(30)
+
+#define QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS             BIT(2)
+#define QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS             BIT(3)
+#define QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS             BIT(4)
+#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT         5
+#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK          0x1f
+#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT         10
+#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK          0x1f
+#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT         15
+#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK          0x1f
+#define QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL         BIT(20)
+#define QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL         BIT(21)
+#define QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL         BIT(24)
+
+#define QCA953X_PLL_CPU_DIT_FRAC_MAX_SHIFT              0
+#define QCA953X_PLL_CPU_DIT_FRAC_MAX_MASK               0x3f
+#define QCA953X_PLL_CPU_DIT_FRAC_MIN_SHIFT              6
+#define QCA953X_PLL_CPU_DIT_FRAC_MIN_MASK               0x3f
+#define QCA953X_PLL_CPU_DIT_FRAC_STEP_SHIFT             12
+#define QCA953X_PLL_CPU_DIT_FRAC_STEP_MASK              0x3f
+#define QCA953X_PLL_CPU_DIT_UPD_CNT_SHIFT               18
+#define QCA953X_PLL_CPU_DIT_UPD_CNT_MASK                0x3f
+
+#define QCA953X_PLL_DDR_DIT_FRAC_MAX_SHIFT              0
+#define QCA953X_PLL_DDR_DIT_FRAC_MAX_MASK               0x3ff
+#define QCA953X_PLL_DDR_DIT_FRAC_MIN_SHIFT              9
+#define QCA953X_PLL_DDR_DIT_FRAC_MIN_MASK               0x3ff
+#define QCA953X_PLL_DDR_DIT_FRAC_STEP_SHIFT             20
+#define QCA953X_PLL_DDR_DIT_FRAC_STEP_MASK              0x3f
+#define QCA953X_PLL_DDR_DIT_UPD_CNT_SHIFT               27
+#define QCA953X_PLL_DDR_DIT_UPD_CNT_MASK                0x3f
+
+#define QCA953X_PLL_DIT_FRAC_EN                         BIT(31)
+
+#define QCA955X_PLL_CPU_CONFIG_REG                      0x00
+#define QCA955X_PLL_DDR_CONFIG_REG                      0x04
+#define QCA955X_PLL_CLK_CTRL_REG                        0x08
+#define QCA955X_PLL_ETH_XMII_CONTROL_REG                0x28
+#define QCA955X_PLL_ETH_SGMII_CONTROL_REG               0x48
+
+#define QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT              0
+#define QCA955X_PLL_CPU_CONFIG_NFRAC_MASK               0x3f
+#define QCA955X_PLL_CPU_CONFIG_NINT_SHIFT               6
+#define QCA955X_PLL_CPU_CONFIG_NINT_MASK                0x3f
+#define QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT             12
+#define QCA955X_PLL_CPU_CONFIG_REFDIV_MASK              0x1f
+#define QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT             19
+#define QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK              0x3
+
+#define QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT              0
+#define QCA955X_PLL_DDR_CONFIG_NFRAC_MASK               0x3ff
+#define QCA955X_PLL_DDR_CONFIG_NINT_SHIFT               10
+#define QCA955X_PLL_DDR_CONFIG_NINT_MASK                0x3f
+#define QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT             16
+#define QCA955X_PLL_DDR_CONFIG_REFDIV_MASK              0x1f
+#define QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT             23
+#define QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK              0x7
+
+#define QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS             BIT(2)
+#define QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS             BIT(3)
+#define QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS             BIT(4)
+#define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT         5
+#define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK          0x1f
+#define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT         10
+#define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK          0x1f
+#define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT         15
+#define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK          0x1f
+#define QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL         BIT(20)
+#define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL         BIT(21)
+#define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL         BIT(24)
+
+#define QCA956X_PLL_CPU_CONFIG_REG                      0x00
+#define QCA956X_PLL_CPU_CONFIG1_REG                     0x04
+#define QCA956X_PLL_DDR_CONFIG_REG                      0x08
+#define QCA956X_PLL_DDR_CONFIG1_REG                     0x0c
+#define QCA956X_PLL_CLK_CTRL_REG                        0x10
+
+#define QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT             12
+#define QCA956X_PLL_CPU_CONFIG_REFDIV_MASK              0x1f
+#define QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT             19
+#define QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK              0x7
+
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT           0
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK            0x1f
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT           5
+#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK            0x3fff
+#define QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT              18
+#define QCA956X_PLL_CPU_CONFIG1_NINT_MASK               0x1ff
+
+#define QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT             16
+#define QCA956X_PLL_DDR_CONFIG_REFDIV_MASK              0x1f
+#define QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT             23
+#define QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK              0x7
+
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT           0
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK            0x1f
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT           5
+#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK            0x3fff
+#define QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT              18
+#define QCA956X_PLL_DDR_CONFIG1_NINT_MASK               0x1ff
+
+#define QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS             BIT(2)
+#define QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS             BIT(3)
+#define QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS             BIT(4)
+#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT         5
+#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK          0x1f
+#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT         10
+#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK          0x1f
+#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT         15
+#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK          0x1f
+#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL     BIT(20)
+#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL     BIT(21)
+#define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL         BIT(24)
+
+/*
+ * USB_CONFIG block
+ */
+#define AR71XX_USB_CTRL_REG_FLADJ                       0x00
+#define AR71XX_USB_CTRL_REG_CONFIG                      0x04
+
+/*
+ * RESET block
+ */
+#define AR71XX_RESET_REG_TIMER                          0x00
+#define AR71XX_RESET_REG_TIMER_RELOAD                   0x04
+#define AR71XX_RESET_REG_WDOG_CTRL                      0x08
+#define AR71XX_RESET_REG_WDOG                           0x0c
+#define AR71XX_RESET_REG_MISC_INT_STATUS                0x10
+#define AR71XX_RESET_REG_MISC_INT_ENABLE                0x14
+#define AR71XX_RESET_REG_PCI_INT_STATUS                 0x18
+#define AR71XX_RESET_REG_PCI_INT_ENABLE                 0x1c
+#define AR71XX_RESET_REG_GLOBAL_INT_STATUS              0x20
+#define AR71XX_RESET_REG_RESET_MODULE                   0x24
+#define AR71XX_RESET_REG_PERFC_CTRL                     0x2c
+#define AR71XX_RESET_REG_PERFC0                         0x30
+#define AR71XX_RESET_REG_PERFC1                         0x34
+#define AR71XX_RESET_REG_REV_ID                         0x90
+
+#define AR913X_RESET_REG_GLOBAL_INT_STATUS              0x18
+#define AR913X_RESET_REG_RESET_MODULE                   0x1c
+#define AR913X_RESET_REG_PERF_CTRL                      0x20
+#define AR913X_RESET_REG_PERFC0                         0x24
+#define AR913X_RESET_REG_PERFC1                         0x28
+
+#define AR724X_RESET_REG_RESET_MODULE                   0x1c
+
+#define AR933X_RESET_REG_RESET_MODULE                   0x1c
+#define AR933X_RESET_REG_BOOTSTRAP                      0xac
+
+#define AR934X_RESET_REG_RESET_MODULE                   0x1c
+#define AR934X_RESET_REG_BOOTSTRAP                      0xb0
+#define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS           0xac
+
+#define QCA953X_RESET_REG_RESET_MODULE                  0x1c
+#define QCA953X_RESET_REG_BOOTSTRAP                     0xb0
+#define QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS          0xac
+
+#define QCA955X_RESET_REG_RESET_MODULE                  0x1c
+#define QCA955X_RESET_REG_BOOTSTRAP                     0xb0
+#define QCA955X_RESET_REG_EXT_INT_STATUS                0xac
+
+#define QCA956X_RESET_REG_RESET_MODULE                  0x1c
+#define QCA956X_RESET_REG_BOOTSTRAP                     0xb0
+#define QCA956X_RESET_REG_EXT_INT_STATUS                0xac
+
+#define MISC_INT_MIPS_SI_TIMERINT_MASK                  BIT(28)
+#define MISC_INT_ETHSW                                  BIT(12)
+#define MISC_INT_TIMER4                                 BIT(10)
+#define MISC_INT_TIMER3                                 BIT(9)
+#define MISC_INT_TIMER2                                 BIT(8)
+#define MISC_INT_DMA                                    BIT(7)
+#define MISC_INT_OHCI                                   BIT(6)
+#define MISC_INT_PERFC                                  BIT(5)
+#define MISC_INT_WDOG                                   BIT(4)
+#define MISC_INT_UART                                   BIT(3)
+#define MISC_INT_GPIO                                   BIT(2)
+#define MISC_INT_ERROR                                  BIT(1)
+#define MISC_INT_TIMER                                  BIT(0)
+
+#define AR71XX_RESET_EXTERNAL                           BIT(28)
+#define AR71XX_RESET_FULL_CHIP                          BIT(24)
+#define AR71XX_RESET_CPU_NMI                            BIT(21)
+#define AR71XX_RESET_CPU_COLD                           BIT(20)
+#define AR71XX_RESET_DMA                                BIT(19)
+#define AR71XX_RESET_SLIC                               BIT(18)
+#define AR71XX_RESET_STEREO                             BIT(17)
+#define AR71XX_RESET_DDR                                BIT(16)
+#define AR71XX_RESET_GE1_MAC                            BIT(13)
+#define AR71XX_RESET_GE1_PHY                            BIT(12)
+#define AR71XX_RESET_USBSUS_OVERRIDE                    BIT(10)
+#define AR71XX_RESET_GE0_MAC                            BIT(9)
+#define AR71XX_RESET_GE0_PHY                            BIT(8)
+#define AR71XX_RESET_USB_OHCI_DLL                       BIT(6)
+#define AR71XX_RESET_USB_HOST                           BIT(5)
+#define AR71XX_RESET_USB_PHY                            BIT(4)
+#define AR71XX_RESET_PCI_BUS                            BIT(1)
+#define AR71XX_RESET_PCI_CORE                           BIT(0)
+
+#define AR7240_RESET_USB_HOST                           BIT(5)
+#define AR7240_RESET_OHCI_DLL                           BIT(3)
+
+#define AR724X_RESET_GE1_MDIO                           BIT(23)
+#define AR724X_RESET_GE0_MDIO                           BIT(22)
+#define AR724X_RESET_PCIE_PHY_SERIAL                    BIT(10)
+#define AR724X_RESET_PCIE_PHY                           BIT(7)
+#define AR724X_RESET_PCIE                               BIT(6)
+#define AR724X_RESET_USB_HOST                           BIT(5)
+#define AR724X_RESET_USB_PHY                            BIT(4)
+#define AR724X_RESET_USBSUS_OVERRIDE                    BIT(3)
+
+#define AR913X_RESET_AMBA2WMAC                          BIT(22)
+#define AR913X_RESET_USBSUS_OVERRIDE                    BIT(10)
+#define AR913X_RESET_USB_HOST                           BIT(5)
+#define AR913X_RESET_USB_PHY                            BIT(4)
+
+#define AR933X_RESET_GE1_MDIO                           BIT(23)
+#define AR933X_RESET_GE0_MDIO                           BIT(22)
+#define AR933X_RESET_GE1_MAC                            BIT(13)
+#define AR933X_RESET_WMAC                               BIT(11)
+#define AR933X_RESET_GE0_MAC                            BIT(9)
+#define AR933X_RESET_USB_HOST                           BIT(5)
+#define AR933X_RESET_USB_PHY                            BIT(4)
+#define AR933X_RESET_USBSUS_OVERRIDE                    BIT(3)
+
+#define AR934X_RESET_HOST                               BIT(31)
+#define AR934X_RESET_SLIC                               BIT(30)
+#define AR934X_RESET_HDMA                               BIT(29)
+#define AR934X_RESET_EXTERNAL                           BIT(28)
+#define AR934X_RESET_RTC                                BIT(27)
+#define AR934X_RESET_PCIE_EP_INT                        BIT(26)
+#define AR934X_RESET_CHKSUM_ACC                         BIT(25)
+#define AR934X_RESET_FULL_CHIP                          BIT(24)
+#define AR934X_RESET_GE1_MDIO                           BIT(23)
+#define AR934X_RESET_GE0_MDIO                           BIT(22)
+#define AR934X_RESET_CPU_NMI                            BIT(21)
+#define AR934X_RESET_CPU_COLD                           BIT(20)
+#define AR934X_RESET_HOST_RESET_INT                     BIT(19)
+#define AR934X_RESET_PCIE_EP                            BIT(18)
+#define AR934X_RESET_UART1                              BIT(17)
+#define AR934X_RESET_DDR                                BIT(16)
+#define AR934X_RESET_USB_PHY_PLL_PWD_EXT                BIT(15)
+#define AR934X_RESET_NANDF                              BIT(14)
+#define AR934X_RESET_GE1_MAC                            BIT(13)
+#define AR934X_RESET_ETH_SWITCH_ANALOG                  BIT(12)
+#define AR934X_RESET_USB_PHY_ANALOG                     BIT(11)
+#define AR934X_RESET_HOST_DMA_INT                       BIT(10)
+#define AR934X_RESET_GE0_MAC                            BIT(9)
+#define AR934X_RESET_ETH_SWITCH                         BIT(8)
+#define AR934X_RESET_PCIE_PHY                           BIT(7)
+#define AR934X_RESET_PCIE                               BIT(6)
+#define AR934X_RESET_USB_HOST                           BIT(5)
+#define AR934X_RESET_USB_PHY                            BIT(4)
+#define AR934X_RESET_USBSUS_OVERRIDE                    BIT(3)
+#define AR934X_RESET_LUT                                BIT(2)
+#define AR934X_RESET_MBOX                               BIT(1)
+#define AR934X_RESET_I2S                                BIT(0)
+
+#define QCA953X_RESET_USB_EXT_PWR                       BIT(29)
+#define QCA953X_RESET_EXTERNAL                          BIT(28)
+#define QCA953X_RESET_RTC                               BIT(27)
+#define QCA953X_RESET_FULL_CHIP                         BIT(24)
+#define QCA953X_RESET_GE1_MDIO                          BIT(23)
+#define QCA953X_RESET_GE0_MDIO                          BIT(22)
+#define QCA953X_RESET_CPU_NMI                           BIT(21)
+#define QCA953X_RESET_CPU_COLD                          BIT(20)
+#define QCA953X_RESET_DDR                               BIT(16)
+#define QCA953X_RESET_USB_PHY_PLL_PWD_EXT               BIT(15)
+#define QCA953X_RESET_GE1_MAC                           BIT(13)
+#define QCA953X_RESET_ETH_SWITCH_ANALOG                 BIT(12)
+#define QCA953X_RESET_USB_PHY_ANALOG                    BIT(11)
+#define QCA953X_RESET_GE0_MAC                           BIT(9)
+#define QCA953X_RESET_ETH_SWITCH                        BIT(8)
+#define QCA953X_RESET_PCIE_PHY                          BIT(7)
+#define QCA953X_RESET_PCIE                              BIT(6)
+#define QCA953X_RESET_USB_HOST                          BIT(5)
+#define QCA953X_RESET_USB_PHY                           BIT(4)
+#define QCA953X_RESET_USBSUS_OVERRIDE                   BIT(3)
+
+#define QCA955X_RESET_HOST                              BIT(31)
+#define QCA955X_RESET_SLIC                              BIT(30)
+#define QCA955X_RESET_HDMA                              BIT(29)
+#define QCA955X_RESET_EXTERNAL                          BIT(28)
+#define QCA955X_RESET_RTC                               BIT(27)
+#define QCA955X_RESET_PCIE_EP_INT                       BIT(26)
+#define QCA955X_RESET_CHKSUM_ACC                        BIT(25)
+#define QCA955X_RESET_FULL_CHIP                         BIT(24)
+#define QCA955X_RESET_GE1_MDIO                          BIT(23)
+#define QCA955X_RESET_GE0_MDIO                          BIT(22)
+#define QCA955X_RESET_CPU_NMI                           BIT(21)
+#define QCA955X_RESET_CPU_COLD                          BIT(20)
+#define QCA955X_RESET_HOST_RESET_INT                    BIT(19)
+#define QCA955X_RESET_PCIE_EP                           BIT(18)
+#define QCA955X_RESET_UART1                             BIT(17)
+#define QCA955X_RESET_DDR                               BIT(16)
+#define QCA955X_RESET_USB_PHY_PLL_PWD_EXT               BIT(15)
+#define QCA955X_RESET_NANDF                             BIT(14)
+#define QCA955X_RESET_GE1_MAC                           BIT(13)
+#define QCA955X_RESET_SGMII_ANALOG                      BIT(12)
+#define QCA955X_RESET_USB_PHY_ANALOG                    BIT(11)
+#define QCA955X_RESET_HOST_DMA_INT                      BIT(10)
+#define QCA955X_RESET_GE0_MAC                           BIT(9)
+#define QCA955X_RESET_SGMII                             BIT(8)
+#define QCA955X_RESET_PCIE_PHY                          BIT(7)
+#define QCA955X_RESET_PCIE                              BIT(6)
+#define QCA955X_RESET_USB_HOST                          BIT(5)
+#define QCA955X_RESET_USB_PHY                           BIT(4)
+#define QCA955X_RESET_USBSUS_OVERRIDE                   BIT(3)
+#define QCA955X_RESET_LUT                               BIT(2)
+#define QCA955X_RESET_MBOX                              BIT(1)
+#define QCA955X_RESET_I2S                               BIT(0)
+
+#define AR933X_BOOTSTRAP_MDIO_GPIO_EN                   BIT(18)
+#define AR933X_BOOTSTRAP_DDR2                           BIT(13)
+#define AR933X_BOOTSTRAP_EEPBUSY                        BIT(4)
+#define AR933X_BOOTSTRAP_REF_CLK_40                     BIT(0)
+
+#define AR934X_BOOTSTRAP_SW_OPTION8                     BIT(23)
+#define AR934X_BOOTSTRAP_SW_OPTION7                     BIT(22)
+#define AR934X_BOOTSTRAP_SW_OPTION6                     BIT(21)
+#define AR934X_BOOTSTRAP_SW_OPTION5                     BIT(20)
+#define AR934X_BOOTSTRAP_SW_OPTION4                     BIT(19)
+#define AR934X_BOOTSTRAP_SW_OPTION3                     BIT(18)
+#define AR934X_BOOTSTRAP_SW_OPTION2                     BIT(17)
+#define AR934X_BOOTSTRAP_SW_OPTION1                     BIT(16)
+#define AR934X_BOOTSTRAP_USB_MODE_DEVICE                BIT(7)
+#define AR934X_BOOTSTRAP_PCIE_RC                        BIT(6)
+#define AR934X_BOOTSTRAP_EJTAG_MODE                     BIT(5)
+#define AR934X_BOOTSTRAP_REF_CLK_40                     BIT(4)
+#define AR934X_BOOTSTRAP_BOOT_FROM_SPI                  BIT(2)
+#define AR934X_BOOTSTRAP_SDRAM_DISABLED                 BIT(1)
+#define AR934X_BOOTSTRAP_DDR1                           BIT(0)
+
+#define QCA953X_BOOTSTRAP_SW_OPTION2                    BIT(12)
+#define QCA953X_BOOTSTRAP_SW_OPTION1                    BIT(11)
+#define QCA953X_BOOTSTRAP_EJTAG_MODE                    BIT(5)
+#define QCA953X_BOOTSTRAP_REF_CLK_40                    BIT(4)
+#define QCA953X_BOOTSTRAP_SDRAM_DISABLED                BIT(1)
+#define QCA953X_BOOTSTRAP_DDR1                          BIT(0)
+
+#define QCA955X_BOOTSTRAP_REF_CLK_40                    BIT(4)
+
+#define QCA956X_BOOTSTRAP_REF_CLK_40                    BIT(2)
+
+#define AR934X_PCIE_WMAC_INT_WMAC_MISC                  BIT(0)
+#define AR934X_PCIE_WMAC_INT_WMAC_TX                    BIT(1)
+#define AR934X_PCIE_WMAC_INT_WMAC_RXLP                  BIT(2)
+#define AR934X_PCIE_WMAC_INT_WMAC_RXHP                  BIT(3)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC                    BIT(4)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC0                   BIT(5)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC1                   BIT(6)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC2                   BIT(7)
+#define AR934X_PCIE_WMAC_INT_PCIE_RC3                   BIT(8)
+#define AR934X_PCIE_WMAC_INT_WMAC_ALL \
+	(AR934X_PCIE_WMAC_INT_WMAC_MISC | AR934X_PCIE_WMAC_INT_WMAC_TX | \
+	 AR934X_PCIE_WMAC_INT_WMAC_RXLP | AR934X_PCIE_WMAC_INT_WMAC_RXHP)
+
+#define AR934X_PCIE_WMAC_INT_PCIE_ALL \
+	(AR934X_PCIE_WMAC_INT_PCIE_RC | AR934X_PCIE_WMAC_INT_PCIE_RC0 | \
+	 AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \
+	 AR934X_PCIE_WMAC_INT_PCIE_RC3)
+
+#define QCA953X_PCIE_WMAC_INT_WMAC_MISC                 BIT(0)
+#define QCA953X_PCIE_WMAC_INT_WMAC_TX                   BIT(1)
+#define QCA953X_PCIE_WMAC_INT_WMAC_RXLP                 BIT(2)
+#define QCA953X_PCIE_WMAC_INT_WMAC_RXHP                 BIT(3)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC                   BIT(4)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC0                  BIT(5)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC1                  BIT(6)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC2                  BIT(7)
+#define QCA953X_PCIE_WMAC_INT_PCIE_RC3                  BIT(8)
+#define QCA953X_PCIE_WMAC_INT_WMAC_ALL \
+	(QCA953X_PCIE_WMAC_INT_WMAC_MISC | QCA953X_PCIE_WMAC_INT_WMAC_TX | \
+	 QCA953X_PCIE_WMAC_INT_WMAC_RXLP | QCA953X_PCIE_WMAC_INT_WMAC_RXHP)
+
+#define QCA953X_PCIE_WMAC_INT_PCIE_ALL \
+	(QCA953X_PCIE_WMAC_INT_PCIE_RC | QCA953X_PCIE_WMAC_INT_PCIE_RC0 | \
+	 QCA953X_PCIE_WMAC_INT_PCIE_RC1 | QCA953X_PCIE_WMAC_INT_PCIE_RC2 | \
+	 QCA953X_PCIE_WMAC_INT_PCIE_RC3)
+
+#define QCA955X_EXT_INT_WMAC_MISC                       BIT(0)
+#define QCA955X_EXT_INT_WMAC_TX                         BIT(1)
+#define QCA955X_EXT_INT_WMAC_RXLP                       BIT(2)
+#define QCA955X_EXT_INT_WMAC_RXHP                       BIT(3)
+#define QCA955X_EXT_INT_PCIE_RC1                        BIT(4)
+#define QCA955X_EXT_INT_PCIE_RC1_INT0                   BIT(5)
+#define QCA955X_EXT_INT_PCIE_RC1_INT1                   BIT(6)
+#define QCA955X_EXT_INT_PCIE_RC1_INT2                   BIT(7)
+#define QCA955X_EXT_INT_PCIE_RC1_INT3                   BIT(8)
+#define QCA955X_EXT_INT_PCIE_RC2                        BIT(12)
+#define QCA955X_EXT_INT_PCIE_RC2_INT0                   BIT(13)
+#define QCA955X_EXT_INT_PCIE_RC2_INT1                   BIT(14)
+#define QCA955X_EXT_INT_PCIE_RC2_INT2                   BIT(15)
+#define QCA955X_EXT_INT_PCIE_RC2_INT3                   BIT(16)
+#define QCA955X_EXT_INT_USB1                            BIT(24)
+#define QCA955X_EXT_INT_USB2                            BIT(28)
+
+#define QCA955X_EXT_INT_WMAC_ALL \
+	(QCA955X_EXT_INT_WMAC_MISC | QCA955X_EXT_INT_WMAC_TX | \
+	 QCA955X_EXT_INT_WMAC_RXLP | QCA955X_EXT_INT_WMAC_RXHP)
+
+#define QCA955X_EXT_INT_PCIE_RC1_ALL \
+	(QCA955X_EXT_INT_PCIE_RC1 | QCA955X_EXT_INT_PCIE_RC1_INT0 | \
+	 QCA955X_EXT_INT_PCIE_RC1_INT1 | QCA955X_EXT_INT_PCIE_RC1_INT2 | \
+	 QCA955X_EXT_INT_PCIE_RC1_INT3)
+
+#define QCA955X_EXT_INT_PCIE_RC2_ALL \
+	(QCA955X_EXT_INT_PCIE_RC2 | QCA955X_EXT_INT_PCIE_RC2_INT0 | \
+	 QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \
+	 QCA955X_EXT_INT_PCIE_RC2_INT3)
+
+#define QCA956X_EXT_INT_WMAC_MISC                       BIT(0)
+#define QCA956X_EXT_INT_WMAC_TX                         BIT(1)
+#define QCA956X_EXT_INT_WMAC_RXLP                       BIT(2)
+#define QCA956X_EXT_INT_WMAC_RXHP                       BIT(3)
+#define QCA956X_EXT_INT_PCIE_RC1                        BIT(4)
+#define QCA956X_EXT_INT_PCIE_RC1_INT0                   BIT(5)
+#define QCA956X_EXT_INT_PCIE_RC1_INT1                   BIT(6)
+#define QCA956X_EXT_INT_PCIE_RC1_INT2                   BIT(7)
+#define QCA956X_EXT_INT_PCIE_RC1_INT3                   BIT(8)
+#define QCA956X_EXT_INT_PCIE_RC2                        BIT(12)
+#define QCA956X_EXT_INT_PCIE_RC2_INT0                   BIT(13)
+#define QCA956X_EXT_INT_PCIE_RC2_INT1                   BIT(14)
+#define QCA956X_EXT_INT_PCIE_RC2_INT2                   BIT(15)
+#define QCA956X_EXT_INT_PCIE_RC2_INT3                   BIT(16)
+#define QCA956X_EXT_INT_USB1                            BIT(24)
+#define QCA956X_EXT_INT_USB2                            BIT(28)
+
+#define QCA956X_EXT_INT_WMAC_ALL \
+	(QCA956X_EXT_INT_WMAC_MISC | QCA956X_EXT_INT_WMAC_TX | \
+	 QCA956X_EXT_INT_WMAC_RXLP | QCA956X_EXT_INT_WMAC_RXHP)
+
+#define QCA956X_EXT_INT_PCIE_RC1_ALL \
+	(QCA956X_EXT_INT_PCIE_RC1 | QCA956X_EXT_INT_PCIE_RC1_INT0 | \
+	 QCA956X_EXT_INT_PCIE_RC1_INT1 | QCA956X_EXT_INT_PCIE_RC1_INT2 | \
+	 QCA956X_EXT_INT_PCIE_RC1_INT3)
+
+#define QCA956X_EXT_INT_PCIE_RC2_ALL \
+	(QCA956X_EXT_INT_PCIE_RC2 | QCA956X_EXT_INT_PCIE_RC2_INT0 | \
+	 QCA956X_EXT_INT_PCIE_RC2_INT1 | QCA956X_EXT_INT_PCIE_RC2_INT2 | \
+	 QCA956X_EXT_INT_PCIE_RC2_INT3)
+
+#define REV_ID_MAJOR_MASK                               0xfff0
+#define REV_ID_MAJOR_AR71XX                             0x00a0
+#define REV_ID_MAJOR_AR913X                             0x00b0
+#define REV_ID_MAJOR_AR7240                             0x00c0
+#define REV_ID_MAJOR_AR7241                             0x0100
+#define REV_ID_MAJOR_AR7242                             0x1100
+#define REV_ID_MAJOR_AR9330                             0x0110
+#define REV_ID_MAJOR_AR9331                             0x1110
+#define REV_ID_MAJOR_AR9341                             0x0120
+#define REV_ID_MAJOR_AR9342                             0x1120
+#define REV_ID_MAJOR_AR9344                             0x2120
+#define REV_ID_MAJOR_QCA9533                            0x0140
+#define REV_ID_MAJOR_QCA9533_V2                         0x0160
+#define REV_ID_MAJOR_QCA9556                            0x0130
+#define REV_ID_MAJOR_QCA9558                            0x1130
+#define REV_ID_MAJOR_TP9343                             0x0150
+#define REV_ID_MAJOR_QCA9561                            0x1150
+
+#define AR71XX_REV_ID_MINOR_MASK                        0x3
+#define AR71XX_REV_ID_MINOR_AR7130                      0x0
+#define AR71XX_REV_ID_MINOR_AR7141                      0x1
+#define AR71XX_REV_ID_MINOR_AR7161                      0x2
+#define AR913X_REV_ID_MINOR_AR9130                      0x0
+#define AR913X_REV_ID_MINOR_AR9132                      0x1
+
+#define AR71XX_REV_ID_REVISION_MASK                     0x3
+#define AR71XX_REV_ID_REVISION_SHIFT                    2
+#define AR71XX_REV_ID_REVISION2_MASK                    0xf
+
+/*
+ * RTC block
+ */
+#define AR933X_RTC_REG_RESET                            0x40
+#define AR933X_RTC_REG_STATUS                           0x44
+#define AR933X_RTC_REG_DERIVED                          0x48
+#define AR933X_RTC_REG_FORCE_WAKE                       0x4c
+#define AR933X_RTC_REG_INT_CAUSE                        0x50
+#define AR933X_RTC_REG_CAUSE_CLR                        0x50
+#define AR933X_RTC_REG_INT_ENABLE                       0x54
+#define AR933X_RTC_REG_INT_MASKE                        0x58
+
+#define QCA953X_RTC_REG_SYNC_RESET                      0x40
+#define QCA953X_RTC_REG_SYNC_STATUS                     0x44
+
+/*
+ * SPI block
+ */
+#define AR71XX_SPI_REG_FS                               0x00
+#define AR71XX_SPI_REG_CTRL                             0x04
+#define AR71XX_SPI_REG_IOC                              0x08
+#define AR71XX_SPI_REG_RDS                              0x0c
+
+#define AR71XX_SPI_FS_GPIO                              BIT(0)
+
+#define AR71XX_SPI_CTRL_RD                              BIT(6)
+#define AR71XX_SPI_CTRL_DIV_MASK                        0x3f
+
+#define AR71XX_SPI_IOC_DO                               BIT(0)
+#define AR71XX_SPI_IOC_CLK                              BIT(8)
+#define AR71XX_SPI_IOC_CS(n)                            BIT(16 + (n))
+#define AR71XX_SPI_IOC_CS0                      AR71XX_SPI_IOC_CS(0)
+#define AR71XX_SPI_IOC_CS1                      AR71XX_SPI_IOC_CS(1)
+#define AR71XX_SPI_IOC_CS2                      AR71XX_SPI_IOC_CS(2)
+#define AR71XX_SPI_IOC_CS_ALL \
+	(AR71XX_SPI_IOC_CS0 | AR71XX_SPI_IOC_CS1 | AR71XX_SPI_IOC_CS2)
+
+/*
+ * GPIO block
+ */
+#define AR71XX_GPIO_REG_OE                              0x00
+#define AR71XX_GPIO_REG_IN                              0x04
+#define AR71XX_GPIO_REG_OUT                             0x08
+#define AR71XX_GPIO_REG_SET                             0x0c
+#define AR71XX_GPIO_REG_CLEAR                           0x10
+#define AR71XX_GPIO_REG_INT_MODE                        0x14
+#define AR71XX_GPIO_REG_INT_TYPE                        0x18
+#define AR71XX_GPIO_REG_INT_POLARITY                    0x1c
+#define AR71XX_GPIO_REG_INT_PENDING                     0x20
+#define AR71XX_GPIO_REG_INT_ENABLE                      0x24
+#define AR71XX_GPIO_REG_FUNC                            0x28
+#define AR933X_GPIO_REG_FUNC                            0x30
+
+#define AR934X_GPIO_REG_OUT_FUNC0                       0x2c
+#define AR934X_GPIO_REG_OUT_FUNC1                       0x30
+#define AR934X_GPIO_REG_OUT_FUNC2                       0x34
+#define AR934X_GPIO_REG_OUT_FUNC3                       0x38
+#define AR934X_GPIO_REG_OUT_FUNC4                       0x3c
+#define AR934X_GPIO_REG_OUT_FUNC5                       0x40
+#define AR934X_GPIO_REG_FUNC                            0x6c
+
+#define QCA953X_GPIO_REG_OUT_FUNC0                      0x2c
+#define QCA953X_GPIO_REG_OUT_FUNC1                      0x30
+#define QCA953X_GPIO_REG_OUT_FUNC2                      0x34
+#define QCA953X_GPIO_REG_OUT_FUNC3                      0x38
+#define QCA953X_GPIO_REG_OUT_FUNC4                      0x3c
+#define QCA953X_GPIO_REG_IN_ENABLE0                     0x44
+#define QCA953X_GPIO_REG_FUNC                           0x6c
+
+#define QCA955X_GPIO_REG_OUT_FUNC0                      0x2c
+#define QCA955X_GPIO_REG_OUT_FUNC1                      0x30
+#define QCA955X_GPIO_REG_OUT_FUNC2                      0x34
+#define QCA955X_GPIO_REG_OUT_FUNC3                      0x38
+#define QCA955X_GPIO_REG_OUT_FUNC4                      0x3c
+#define QCA955X_GPIO_REG_OUT_FUNC5                      0x40
+#define QCA955X_GPIO_REG_FUNC                           0x6c
+
+#define QCA956X_GPIO_REG_OUT_FUNC0                      0x2c
+#define QCA956X_GPIO_REG_OUT_FUNC1                      0x30
+#define QCA956X_GPIO_REG_OUT_FUNC2                      0x34
+#define QCA956X_GPIO_REG_OUT_FUNC3                      0x38
+#define QCA956X_GPIO_REG_OUT_FUNC4                      0x3c
+#define QCA956X_GPIO_REG_OUT_FUNC5                      0x40
+#define QCA956X_GPIO_REG_IN_ENABLE0                     0x44
+#define QCA956X_GPIO_REG_IN_ENABLE3                     0x50
+#define QCA956X_GPIO_REG_FUNC                           0x6c
+
+#define AR71XX_GPIO_FUNC_STEREO_EN                      BIT(17)
+#define AR71XX_GPIO_FUNC_SLIC_EN                        BIT(16)
+#define AR71XX_GPIO_FUNC_SPI_CS2_EN                     BIT(13)
+#define AR71XX_GPIO_FUNC_SPI_CS1_EN                     BIT(12)
+#define AR71XX_GPIO_FUNC_UART_EN                        BIT(8)
+#define AR71XX_GPIO_FUNC_USB_OC_EN                      BIT(4)
+#define AR71XX_GPIO_FUNC_USB_CLK_EN                     BIT(0)
+
+#define AR724X_GPIO_FUNC_GE0_MII_CLK_EN                 BIT(19)
+#define AR724X_GPIO_FUNC_SPI_EN                         BIT(18)
+#define AR724X_GPIO_FUNC_SPI_CS_EN2                     BIT(14)
+#define AR724X_GPIO_FUNC_SPI_CS_EN1                     BIT(13)
+#define AR724X_GPIO_FUNC_CLK_OBS5_EN                    BIT(12)
+#define AR724X_GPIO_FUNC_CLK_OBS4_EN                    BIT(11)
+#define AR724X_GPIO_FUNC_CLK_OBS3_EN                    BIT(10)
+#define AR724X_GPIO_FUNC_CLK_OBS2_EN                    BIT(9)
+#define AR724X_GPIO_FUNC_CLK_OBS1_EN                    BIT(8)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN             BIT(7)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN             BIT(6)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN             BIT(5)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN             BIT(4)
+#define AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN             BIT(3)
+#define AR724X_GPIO_FUNC_UART_RTS_CTS_EN                BIT(2)
+#define AR724X_GPIO_FUNC_UART_EN                        BIT(1)
+#define AR724X_GPIO_FUNC_JTAG_DISABLE                   BIT(0)
+
+#define AR913X_GPIO_FUNC_WMAC_LED_EN                    BIT(22)
+#define AR913X_GPIO_FUNC_EXP_PORT_CS_EN                 BIT(21)
+#define AR913X_GPIO_FUNC_I2S_REFCLKEN                   BIT(20)
+#define AR913X_GPIO_FUNC_I2S_MCKEN                      BIT(19)
+#define AR913X_GPIO_FUNC_I2S1_EN                        BIT(18)
+#define AR913X_GPIO_FUNC_I2S0_EN                        BIT(17)
+#define AR913X_GPIO_FUNC_SLIC_EN                        BIT(16)
+#define AR913X_GPIO_FUNC_UART_RTSCTS_EN                 BIT(9)
+#define AR913X_GPIO_FUNC_UART_EN                        BIT(8)
+#define AR913X_GPIO_FUNC_USB_CLK_EN                     BIT(4)
+
+#define AR933X_GPIO(x)                                  BIT(x)
+#define AR933X_GPIO_FUNC_SPDIF2TCK                      BIT(31)
+#define AR933X_GPIO_FUNC_SPDIF_EN                       BIT(30)
+#define AR933X_GPIO_FUNC_I2SO_22_18_EN                  BIT(29)
+#define AR933X_GPIO_FUNC_I2S_MCK_EN                     BIT(27)
+#define AR933X_GPIO_FUNC_I2SO_EN                        BIT(26)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_DUPL            BIT(25)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_COLL            BIT(24)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_ACT             BIT(23)
+#define AR933X_GPIO_FUNC_SPI_EN                         BIT(18)
+#define AR933X_GPIO_FUNC_RES_TRUE                       BIT(15)
+#define AR933X_GPIO_FUNC_SPI_CS_EN2                     BIT(14)
+#define AR933X_GPIO_FUNC_SPI_CS_EN1                     BIT(13)
+#define AR933X_GPIO_FUNC_XLNA_EN                        BIT(12)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED4_EN             BIT(7)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED3_EN             BIT(6)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED2_EN             BIT(5)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED1_EN             BIT(4)
+#define AR933X_GPIO_FUNC_ETH_SWITCH_LED0_EN             BIT(3)
+#define AR933X_GPIO_FUNC_UART_RTS_CTS_EN                BIT(2)
+#define AR933X_GPIO_FUNC_UART_EN                        BIT(1)
+#define AR933X_GPIO_FUNC_JTAG_DISABLE                   BIT(0)
+
+#define AR934X_GPIO_FUNC_CLK_OBS7_EN                    BIT(9)
+#define AR934X_GPIO_FUNC_CLK_OBS6_EN                    BIT(8)
+#define AR934X_GPIO_FUNC_CLK_OBS5_EN                    BIT(7)
+#define AR934X_GPIO_FUNC_CLK_OBS4_EN                    BIT(6)
+#define AR934X_GPIO_FUNC_CLK_OBS3_EN                    BIT(5)
+#define AR934X_GPIO_FUNC_CLK_OBS2_EN                    BIT(4)
+#define AR934X_GPIO_FUNC_CLK_OBS1_EN                    BIT(3)
+#define AR934X_GPIO_FUNC_CLK_OBS0_EN                    BIT(2)
+#define AR934X_GPIO_FUNC_JTAG_DISABLE                   BIT(1)
+
+#define AR934X_GPIO_OUT_GPIO                            0
+#define AR934X_GPIO_OUT_SPI_CS1                         7
+#define AR934X_GPIO_OUT_LED_LINK0                       41
+#define AR934X_GPIO_OUT_LED_LINK1                       42
+#define AR934X_GPIO_OUT_LED_LINK2                       43
+#define AR934X_GPIO_OUT_LED_LINK3                       44
+#define AR934X_GPIO_OUT_LED_LINK4                       45
+#define AR934X_GPIO_OUT_EXT_LNA0                        46
+#define AR934X_GPIO_OUT_EXT_LNA1                        47
+
+#define QCA953X_GPIO(x)                                 BIT(x)
+#define QCA953X_GPIO_MUX_MASK(x)                        (0xff << (x))
+#define QCA953X_GPIO_OUT_MUX_SPI_CS1                    10
+#define QCA953X_GPIO_OUT_MUX_SPI_CS2                    11
+#define QCA953X_GPIO_OUT_MUX_SPI_CS0                    9
+#define QCA953X_GPIO_OUT_MUX_SPI_CLK                    8
+#define QCA953X_GPIO_OUT_MUX_SPI_MOSI                   12
+#define QCA953X_GPIO_OUT_MUX_UART0_SOUT                 22
+#define QCA953X_GPIO_OUT_MUX_LED_LINK1                  41
+#define QCA953X_GPIO_OUT_MUX_LED_LINK2                  42
+#define QCA953X_GPIO_OUT_MUX_LED_LINK3                  43
+#define QCA953X_GPIO_OUT_MUX_LED_LINK4                  44
+#define QCA953X_GPIO_OUT_MUX_LED_LINK5                  45
+
+#define QCA953X_GPIO_IN_MUX_UART0_SIN                   9
+#define QCA953X_GPIO_IN_MUX_SPI_DATA_IN                 8
+
+#define QCA956X_GPIO_OUT_MUX_GE0_MDO                    32
+#define QCA956X_GPIO_OUT_MUX_GE0_MDC                    33
+
+#define AR71XX_GPIO_COUNT                               16
+#define AR7240_GPIO_COUNT                               18
+#define AR7241_GPIO_COUNT                               20
+#define AR913X_GPIO_COUNT                               22
+#define AR933X_GPIO_COUNT                               30
+#define AR934X_GPIO_COUNT                               23
+#define QCA953X_GPIO_COUNT                              18
+#define QCA955X_GPIO_COUNT                              24
+#define QCA956X_GPIO_COUNT                              23
+
+/*
+ * SRIF block
+ */
+#define AR933X_SRIF_DDR_DPLL1_REG                       0x240
+#define AR933X_SRIF_DDR_DPLL2_REG                       0x244
+#define AR933X_SRIF_DDR_DPLL3_REG                       0x248
+#define AR933X_SRIF_DDR_DPLL4_REG                       0x24c
+
+#define AR934X_SRIF_CPU_DPLL1_REG                       0x1c0
+#define AR934X_SRIF_CPU_DPLL2_REG                       0x1c4
+#define AR934X_SRIF_CPU_DPLL3_REG                       0x1c8
+
+#define AR934X_SRIF_DDR_DPLL1_REG                       0x240
+#define AR934X_SRIF_DDR_DPLL2_REG                       0x244
+#define AR934X_SRIF_DDR_DPLL3_REG                       0x248
+
+#define AR934X_SRIF_DPLL1_REFDIV_SHIFT                  27
+#define AR934X_SRIF_DPLL1_REFDIV_MASK                   0x1f
+#define AR934X_SRIF_DPLL1_NINT_SHIFT                    18
+#define AR934X_SRIF_DPLL1_NINT_MASK                     0x1ff
+#define AR934X_SRIF_DPLL1_NFRAC_MASK                    0x0003ffff
+
+#define AR934X_SRIF_DPLL2_LOCAL_PLL                     BIT(30)
+#define AR934X_SRIF_DPLL2_OUTDIV_SHIFT                  13
+#define AR934X_SRIF_DPLL2_OUTDIV_MASK                   0x7
+
+#define QCA953X_SRIF_BB_DPLL1_REG                       0x180
+#define QCA953X_SRIF_BB_DPLL2_REG                       0x184
+#define QCA953X_SRIF_BB_DPLL3_REG                       0x188
+
+#define QCA953X_SRIF_CPU_DPLL1_REG                      0x1c0
+#define QCA953X_SRIF_CPU_DPLL2_REG                      0x1c4
+#define QCA953X_SRIF_CPU_DPLL3_REG                      0x1c8
+
+#define QCA953X_SRIF_DDR_DPLL1_REG                      0x240
+#define QCA953X_SRIF_DDR_DPLL2_REG                      0x244
+#define QCA953X_SRIF_DDR_DPLL3_REG                      0x248
+
+#define QCA953X_SRIF_PCIE_DPLL1_REG                     0xc00
+#define QCA953X_SRIF_PCIE_DPLL2_REG                     0xc04
+#define QCA953X_SRIF_PCIE_DPLL3_REG                     0xc08
+
+#define QCA953X_SRIF_PMU1_REG                           0xc40
+#define QCA953X_SRIF_PMU2_REG                           0xc44
+
+#define QCA953X_SRIF_DPLL1_REFDIV_SHIFT                 27
+#define QCA953X_SRIF_DPLL1_REFDIV_MASK                  0x1f
+
+#define QCA953X_SRIF_DPLL1_NINT_SHIFT                   18
+#define QCA953X_SRIF_DPLL1_NINT_MASK                    0x1ff
+#define QCA953X_SRIF_DPLL1_NFRAC_MASK                   0x0003ffff
+
+#define QCA953X_SRIF_DPLL2_LOCAL_PLL                    BIT(30)
+
+#define QCA953X_SRIF_DPLL2_KI_SHIFT                     29
+#define QCA953X_SRIF_DPLL2_KI_MASK                      0x3
+
+#define QCA953X_SRIF_DPLL2_KD_SHIFT                     25
+#define QCA953X_SRIF_DPLL2_KD_MASK                      0xf
+
+#define QCA953X_SRIF_DPLL2_PWD                          BIT(22)
+
+#define QCA953X_SRIF_DPLL2_OUTDIV_SHIFT                 13
+#define QCA953X_SRIF_DPLL2_OUTDIV_MASK                  0x7
+
+/*
+ * MII_CTRL block
+ */
+#define AR71XX_MII_REG_MII0_CTRL                        0x00
+#define AR71XX_MII_REG_MII1_CTRL                        0x04
+
+#define AR71XX_MII_CTRL_IF_MASK                         3
+#define AR71XX_MII_CTRL_SPEED_SHIFT                     4
+#define AR71XX_MII_CTRL_SPEED_MASK                      3
+#define AR71XX_MII_CTRL_SPEED_10                        0
+#define AR71XX_MII_CTRL_SPEED_100                       1
+#define AR71XX_MII_CTRL_SPEED_1000                      2
+
+#define AR71XX_MII0_CTRL_IF_GMII                        0
+#define AR71XX_MII0_CTRL_IF_MII                         1
+#define AR71XX_MII0_CTRL_IF_RGMII                       2
+#define AR71XX_MII0_CTRL_IF_RMII                        3
+
+#define AR71XX_MII1_CTRL_IF_RGMII                       0
+#define AR71XX_MII1_CTRL_IF_RMII                        1
+
+/*
+ * AR933X GMAC interface
+ */
+#define AR933X_GMAC_REG_ETH_CFG                         0x00
+
+#define AR933X_ETH_CFG_RGMII_GE0                        BIT(0)
+#define AR933X_ETH_CFG_MII_GE0                          BIT(1)
+#define AR933X_ETH_CFG_GMII_GE0                         BIT(2)
+#define AR933X_ETH_CFG_MII_GE0_MASTER                   BIT(3)
+#define AR933X_ETH_CFG_MII_GE0_SLAVE                    BIT(4)
+#define AR933X_ETH_CFG_MII_GE0_ERR_EN                   BIT(5)
+#define AR933X_ETH_CFG_SW_PHY_SWAP                      BIT(7)
+#define AR933X_ETH_CFG_SW_PHY_ADDR_SWAP                 BIT(8)
+#define AR933X_ETH_CFG_RMII_GE0                         BIT(9)
+#define AR933X_ETH_CFG_RMII_GE0_SPD_10                  0
+#define AR933X_ETH_CFG_RMII_GE0_SPD_100                 BIT(10)
+
+/*
+ * AR934X GMAC Interface
+ */
+#define AR934X_GMAC_REG_ETH_CFG                         0x00
+
+#define AR934X_ETH_CFG_RGMII_GMAC0                      BIT(0)
+#define AR934X_ETH_CFG_MII_GMAC0                        BIT(1)
+#define AR934X_ETH_CFG_GMII_GMAC0                       BIT(2)
+#define AR934X_ETH_CFG_MII_GMAC0_MASTER                 BIT(3)
+#define AR934X_ETH_CFG_MII_GMAC0_SLAVE                  BIT(4)
+#define AR934X_ETH_CFG_MII_GMAC0_ERR_EN                 BIT(5)
+#define AR934X_ETH_CFG_SW_ONLY_MODE                     BIT(6)
+#define AR934X_ETH_CFG_SW_PHY_SWAP                      BIT(7)
+#define AR934X_ETH_CFG_SW_APB_ACCESS                    BIT(9)
+#define AR934X_ETH_CFG_RMII_GMAC0                       BIT(10)
+#define AR933X_ETH_CFG_MII_CNTL_SPEED                   BIT(11)
+#define AR934X_ETH_CFG_RMII_GMAC0_MASTER                BIT(12)
+#define AR933X_ETH_CFG_SW_ACC_MSB_FIRST                 BIT(13)
+#define AR934X_ETH_CFG_RXD_DELAY                        BIT(14)
+#define AR934X_ETH_CFG_RXD_DELAY_MASK                   0x3
+#define AR934X_ETH_CFG_RXD_DELAY_SHIFT                  14
+#define AR934X_ETH_CFG_RDV_DELAY                        BIT(16)
+#define AR934X_ETH_CFG_RDV_DELAY_MASK                   0x3
+#define AR934X_ETH_CFG_RDV_DELAY_SHIFT                  16
+
+/*
+ * QCA953X GMAC Interface
+ */
+#define QCA953X_GMAC_REG_ETH_CFG                        0x00
+
+#define QCA953X_ETH_CFG_SW_ONLY_MODE                    BIT(6)
+#define QCA953X_ETH_CFG_SW_PHY_SWAP                     BIT(7)
+#define QCA953X_ETH_CFG_SW_APB_ACCESS                   BIT(9)
+#define QCA953X_ETH_CFG_SW_ACC_MSB_FIRST                BIT(13)
+
+/*
+ * QCA955X GMAC Interface
+ */
+
+#define QCA955X_GMAC_REG_ETH_CFG                        0x00
+
+#define QCA955X_ETH_CFG_RGMII_EN                        BIT(0)
+#define QCA955X_ETH_CFG_GE0_SGMII                       BIT(6)
+
+#endif /* __ASM_AR71XX_H */
diff --git a/arch/mips/mach-ath79/include/mach/ath79.h b/arch/mips/mach-ath79/include/mach/ath79.h
new file mode 100644
index 0000000..90d80b8
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/ath79.h
@@ -0,0 +1,143 @@
+/*
+ * Atheros AR71XX/AR724X/AR913X common definitions
+ *
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_ATH79_H
+#define __ASM_MACH_ATH79_H
+
+#include <linux/types.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum ath79_soc_type {
+	ATH79_SOC_UNKNOWN,
+	ATH79_SOC_AR7130,
+	ATH79_SOC_AR7141,
+	ATH79_SOC_AR7161,
+	ATH79_SOC_AR7240,
+	ATH79_SOC_AR7241,
+	ATH79_SOC_AR7242,
+	ATH79_SOC_AR9130,
+	ATH79_SOC_AR9132,
+	ATH79_SOC_AR9330,
+	ATH79_SOC_AR9331,
+	ATH79_SOC_AR9341,
+	ATH79_SOC_AR9342,
+	ATH79_SOC_AR9344,
+	ATH79_SOC_QCA9533,
+	ATH79_SOC_QCA9556,
+	ATH79_SOC_QCA9558,
+	ATH79_SOC_TP9343,
+	ATH79_SOC_QCA9561,
+};
+
+static inline int soc_is_ar71xx(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7130 ||
+		gd->arch.soc == ATH79_SOC_AR7141 ||
+		gd->arch.soc == ATH79_SOC_AR7161;
+}
+
+static inline int soc_is_ar724x(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7240 ||
+		gd->arch.soc == ATH79_SOC_AR7241 ||
+		gd->arch.soc == ATH79_SOC_AR7242;
+}
+
+static inline int soc_is_ar7240(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7240;
+}
+
+static inline int soc_is_ar7241(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7241;
+}
+
+static inline int soc_is_ar7242(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR7242;
+}
+
+static inline int soc_is_ar913x(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9130 ||
+		gd->arch.soc == ATH79_SOC_AR9132;
+}
+
+static inline int soc_is_ar933x(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9330 ||
+		gd->arch.soc == ATH79_SOC_AR9331;
+}
+
+static inline int soc_is_ar9341(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9341;
+}
+
+static inline int soc_is_ar9342(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9342;
+}
+
+static inline int soc_is_ar9344(void)
+{
+	return gd->arch.soc == ATH79_SOC_AR9344;
+}
+
+static inline int soc_is_ar934x(void)
+{
+	return soc_is_ar9341() ||
+		soc_is_ar9342() ||
+		soc_is_ar9344();
+}
+
+static inline int soc_is_qca9533(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9533;
+}
+
+static inline int soc_is_qca953x(void)
+{
+	return soc_is_qca9533();
+}
+
+static inline int soc_is_qca9556(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9556;
+}
+
+static inline int soc_is_qca9558(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9558;
+}
+
+static inline int soc_is_qca955x(void)
+{
+	return soc_is_qca9556() || soc_is_qca9558();
+}
+
+static inline int soc_is_tp9343(void)
+{
+	return gd->arch.soc == ATH79_SOC_TP9343;
+}
+
+static inline int soc_is_qca9561(void)
+{
+	return gd->arch.soc == ATH79_SOC_QCA9561;
+}
+
+static inline int soc_is_qca956x(void)
+{
+	return soc_is_tp9343() || soc_is_qca9561();
+}
+
+#endif /* __ASM_MACH_ATH79_H */
diff --git a/arch/mips/mach-ath79/include/mach/ddr.h b/arch/mips/mach-ath79/include/mach/ddr.h
new file mode 100644
index 0000000..181179a
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/ddr.h
@@ -0,0 +1,13 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_DDR_H
+#define __ASM_MACH_DDR_H
+
+void ddr_init(void);
+void ddr_tap_tuning(void);
+
+#endif /* __ASM_MACH_DDR_H */
diff --git a/arch/mips/mach-ath79/include/mach/reset.h b/arch/mips/mach-ath79/include/mach/reset.h
new file mode 100644
index 0000000..c383bfe
--- /dev/null
+++ b/arch/mips/mach-ath79/include/mach/reset.h
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __ASM_MACH_RESET_H
+#define __ASM_MACH_RESET_H
+
+#include <linux/types.h>
+
+u32 get_bootstrap(void);
+
+#endif /* __ASM_MACH_RESET_H */
diff --git a/arch/mips/mach-ath79/reset.c b/arch/mips/mach-ath79/reset.c
new file mode 100644
index 0000000..2ea2f8d
--- /dev/null
+++ b/arch/mips/mach-ath79/reset.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ath79.h>
+#include <mach/ar71xx_regs.h>
+
+void _machine_restart(void)
+{
+	void __iomem *base;
+	u32 reg = 0;
+
+	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+			   MAP_NOCACHE);
+	if (soc_is_ar71xx())
+		reg = AR71XX_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar724x())
+		reg = AR724X_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar913x())
+		reg = AR913X_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar933x())
+		reg = AR933X_RESET_REG_RESET_MODULE;
+	else if (soc_is_ar934x())
+		reg = AR934X_RESET_REG_RESET_MODULE;
+	else if (soc_is_qca953x())
+		reg = QCA953X_RESET_REG_RESET_MODULE;
+	else if (soc_is_qca955x())
+		reg = QCA955X_RESET_REG_RESET_MODULE;
+	else if (soc_is_qca956x())
+		reg = QCA956X_RESET_REG_RESET_MODULE;
+	else
+		puts("Reset register not defined for this SOC\n");
+
+	if (reg)
+		setbits_be32(base + reg, AR71XX_RESET_FULL_CHIP);
+
+	while (1)
+		/* NOP */;
+}
+
+u32 get_bootstrap(void)
+{
+	const void __iomem *base;
+	u32 reg = 0;
+
+	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
+			   MAP_NOCACHE);
+	if (soc_is_ar933x())
+		reg = AR933X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_ar934x())
+		reg = AR934X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_qca953x())
+		reg = QCA953X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_qca955x())
+		reg = QCA955X_RESET_REG_BOOTSTRAP;
+	else if (soc_is_qca956x())
+		reg = QCA956X_RESET_REG_BOOTSTRAP;
+	else
+		puts("Bootstrap register not defined for this SOC\n");
+
+	if (reg)
+		return readl(base + reg);
+
+	return 0;
+}
-- 
1.9.1

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

* [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-03-16 21:38   ` Marek Vasut
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs Wills Wang
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This patch enable work for ar933x SOC.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Fix multi-line comment for ar933x

Changes in v7:
- Use CKSEGxADDR instead of KSEGxADDR for ar933x

Changes in v6:
- Remove board.c
- Define magic value in ddr.c

Changes in v5:
- Add ddr.c for ar933x

Changes in v4:
- Add clk.c for ar933x

Changes in v3: None
Changes in v2: None

 arch/mips/mach-ath79/Kconfig                |   9 +
 arch/mips/mach-ath79/Makefile               |   2 +
 arch/mips/mach-ath79/ar933x/Makefile        |   7 +
 arch/mips/mach-ath79/ar933x/clk.c           |  89 ++++++++
 arch/mips/mach-ath79/ar933x/ddr.c           | 333 ++++++++++++++++++++++++++++
 arch/mips/mach-ath79/ar933x/lowlevel_init.S | 280 +++++++++++++++++++++++
 6 files changed, 720 insertions(+)
 create mode 100644 arch/mips/mach-ath79/ar933x/Makefile
 create mode 100644 arch/mips/mach-ath79/ar933x/clk.c
 create mode 100644 arch/mips/mach-ath79/ar933x/ddr.c
 create mode 100644 arch/mips/mach-ath79/ar933x/lowlevel_init.S

diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
index 7d8ce09..ab93d92 100644
--- a/arch/mips/mach-ath79/Kconfig
+++ b/arch/mips/mach-ath79/Kconfig
@@ -4,4 +4,13 @@ menu "QCA/Atheros 7xxx/9xxx platforms"
 config SYS_SOC
 	default "ath79"
 
+config SOC_AR933X
+	bool
+	select SUPPORTS_BIG_ENDIAN
+	select SUPPORTS_CPU_MIPS32_R1
+	select SUPPORTS_CPU_MIPS32_R2
+	select MIPS_TUNE_24KC
+	help
+	  This supports QCA/Atheros ar933x family SOCs.
+
 endmenu
diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile
index 6203cf0..9b9447e 100644
--- a/arch/mips/mach-ath79/Makefile
+++ b/arch/mips/mach-ath79/Makefile
@@ -5,3 +5,5 @@
 obj-y += reset.o
 obj-y += cpu.o
 obj-y += dram.o
+
+obj-$(CONFIG_SOC_AR933X)	+= ar933x/
\ No newline at end of file
diff --git a/arch/mips/mach-ath79/ar933x/Makefile b/arch/mips/mach-ath79/ar933x/Makefile
new file mode 100644
index 0000000..fd74f0c
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += clk.o
+obj-y += ddr.o
+obj-y += lowlevel_init.o
diff --git a/arch/mips/mach-ath79/ar933x/clk.c b/arch/mips/mach-ath79/ar933x/clk.c
new file mode 100644
index 0000000..9fcd496
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/clk.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static u32 ar933x_get_xtal(void)
+{
+	u32 val;
+
+	val = get_bootstrap();
+	if (val & AR933X_BOOTSTRAP_REF_CLK_40)
+		return 40000000;
+	else
+		return 25000000;
+}
+
+int get_serial_clock(void)
+{
+	return ar933x_get_xtal();
+}
+
+int get_clocks(void)
+{
+	void __iomem *regs;
+	u32 val, xtal, pll, div;
+
+	regs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+			   MAP_NOCACHE);
+	xtal = ar933x_get_xtal();
+	val = readl(regs + AR933X_PLL_CPU_CONFIG_REG);
+
+	/* VCOOUT = XTAL * DIV_INT */
+	div = (val >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT)
+			& AR933X_PLL_CPU_CONFIG_REFDIV_MASK;
+	pll = xtal / div;
+
+	/* PLLOUT = VCOOUT * (1/2^OUTDIV) */
+	div = (val >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT)
+			& AR933X_PLL_CPU_CONFIG_NINT_MASK;
+	pll *= div;
+	div = (val >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT)
+			& AR933X_PLL_CPU_CONFIG_OUTDIV_MASK;
+	if (!div)
+		div = 1;
+	pll >>= div;
+
+	val = readl(regs + AR933X_PLL_CLK_CTRL_REG);
+
+	/* CPU_CLK = PLLOUT / CPU_POST_DIV */
+	div = ((val >> AR933X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT)
+			& AR933X_PLL_CLK_CTRL_CPU_POST_DIV_MASK) + 1;
+	gd->cpu_clk = pll / div;
+
+	/* DDR_CLK = PLLOUT / DDR_POST_DIV */
+	div = ((val >> AR933X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT)
+			& AR933X_PLL_CLK_CTRL_DDR_POST_DIV_MASK) + 1;
+	gd->mem_clk = pll / div;
+
+	/* AHB_CLK = PLLOUT / AHB_POST_DIV */
+	div = ((val >> AR933X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT)
+			& AR933X_PLL_CLK_CTRL_AHB_POST_DIV_MASK) + 1;
+	gd->bus_clk = pll / div;
+
+	return 0;
+}
+
+ulong get_bus_freq(ulong dummy)
+{
+	if (!gd->bus_clk)
+		get_clocks();
+	return gd->bus_clk;
+}
+
+ulong get_ddr_freq(ulong dummy)
+{
+	if (!gd->mem_clk)
+		get_clocks();
+	return gd->mem_clk;
+}
diff --git a/arch/mips/mach-ath79/ar933x/ddr.c b/arch/mips/mach-ath79/ar933x/ddr.c
new file mode 100644
index 0000000..74e8e80
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/ddr.c
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DDR_CTRL_UPD_EMR3S      BIT(5)
+#define DDR_CTRL_UPD_EMR2S      BIT(4)
+#define DDR_CTRL_PRECHARGE      BIT(3)
+#define DDR_CTRL_AUTO_REFRESH   BIT(2)
+#define DDR_CTRL_UPD_EMRS       BIT(1)
+#define DDR_CTRL_UPD_MRS        BIT(0)
+
+#define DDR_REFRESH_EN          (1 << 14)
+#define DDR_REFRESH_M           0x3ff
+#define DDR_REFRESH(x)          ((x) & 0x3ff)
+#define DDR_REFRESH_VAL_25M     (DDR_REFRESH_EN | DDR_REFRESH(390))
+#define DDR_REFRESH_VAL_40M     (DDR_REFRESH_EN | DDR_REFRESH(624))
+
+#define DDR_TRAS_S              0
+#define DDR_TRAS_M              0x1f
+#define DDR_TRAS(x)             ((x) << DDR_TRAS_S)
+#define DDR_TRCD_M              0xf
+#define DDR_TRCD_S              5
+#define DDR_TRCD(x)             ((x) << DDR_TRCD_S)
+#define DDR_TRP_M               0xf
+#define DDR_TRP_S               9
+#define DDR_TRP(x)              ((x) << DDR_TRP_S)
+#define DDR_TRRD_M              0xf
+#define DDR_TRRD_S              13
+#define DDR_TRRD(x)             ((x) << DDR_TRRD_S)
+#define DDR_TRFC_M              0x7f
+#define DDR_TRFC_S              17
+#define DDR_TRFC(x)             ((x) << DDR_TRFC_S)
+#define DDR_TMRD_M              0xf
+#define DDR_TMRD_S              23
+#define DDR_TMRD(x)             ((x) << DDR_TMRD_S)
+#define DDR_CAS_L_M             0x17
+#define DDR_CAS_L_S             27
+#define DDR_CAS_L(x)            (((x) & DDR_CAS_L_M) << DDR_CAS_L_S)
+#define DDR_OPEN                (1 << 30)
+#define DDR_CONF_REG_VAL        (DDR_TRAS(16) | DDR_TRCD(6) | \
+				 DDR_TRP(6) | DDR_TRRD(4) | \
+				 DDR_TRFC(30) | DDR_TMRD(15) | \
+				 DDR_CAS_L(7) | DDR_OPEN)
+
+#define DDR_BURST_LEN_S         0
+#define DDR_BURST_LEN_M         0xf
+#define DDR_BURST_LEN(x)        ((x) << DDR_BURST_LEN_S)
+#define DDR_BURST_TYPE          (1 << 4)
+#define DDR_CNTL_OE_EN          (1 << 5)
+#define DDR_PHASE_SEL           (1 << 6)
+#define DDR_CKE                 (1 << 7)
+#define DDR_TWR_S               8
+#define DDR_TWR_M               0xf
+#define DDR_TWR(x)              ((x) << DDR_TWR_S)
+#define DDR_TRTW_S              12
+#define DDR_TRTW_M              0x1f
+#define DDR_TRTW(x)             ((x) << DDR_TRTW_S)
+#define DDR_TRTP_S              17
+#define DDR_TRTP_M              0xf
+#define DDR_TRTP(x)             ((x) << DDR_TRTP_S)
+#define DDR_TWTR_S              21
+#define DDR_TWTR_M              0x1f
+#define DDR_TWTR(x)             ((x) << DDR_TWTR_S)
+#define DDR_G_OPEN_L_S          26
+#define DDR_G_OPEN_L_M          0xf
+#define DDR_G_OPEN_L(x)         ((x) << DDR_G_OPEN_L_S)
+#define DDR_HALF_WIDTH_LOW      (1 << 31)
+#define DDR_CONF2_REG_VAL       (DDR_BURST_LEN(8) | DDR_CNTL_OE_EN | \
+				 DDR_CKE | DDR_TWR(6) | DDR_TRTW(14) | \
+				 DDR_TRTP(8) | DDR_TWTR(14) | \
+				 DDR_G_OPEN_L(7) | DDR_HALF_WIDTH_LOW)
+
+#define DDR2_CONF_TWL_S         10
+#define DDR2_CONF_TWL_M         0xf
+#define DDR2_CONF_TWL(x)        (((x) & DDR2_CONF_TWL_M) << DDR2_CONF_TWL_S)
+#define DDR2_CONF_ODT           BIT(9)
+#define DDR2_CONF_TFAW_S        2
+#define DDR2_CONF_TFAW_M        0x3f
+#define DDR2_CONF_TFAW(x)       (((x) & DDR2_CONF_TFAW_M) << DDR2_CONF_TFAW_S)
+#define DDR2_CONF_EN            BIT(0)
+#define DDR2_CONF_VAL           (DDR2_CONF_TWL(2) | DDR2_CONF_ODT | \
+				 DDR2_CONF_TFAW(22) | DDR2_CONF_EN)
+
+#define DDR1_EXT_MODE_VAL       0x02
+#define DDR2_EXT_MODE_VAL       0x402
+#define DDR2_EXT_MODE_OCD_VAL   0x382
+#define DDR1_MODE_DLL_VAL       0x133
+#define DDR2_MODE_DLL_VAL       0x100
+#define DDR1_MODE_VAL           0x33
+#define DDR2_MODE_VAL           0xa33
+#define DDR_TAP_VAL0            0x08
+#define DDR_TAP_VAL1            0x09
+
+void ddr_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+
+	writel(DDR_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
+	writel(DDR_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
+
+	val = get_bootstrap();
+	if (val & AR933X_BOOTSTRAP_DDR2) {
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + AR933X_DDR_REG_TIMEOUT_MAX);
+
+		/* Enable DDR2 */
+		writel(DDR2_CONF_VAL, regs + AR933X_DDR_REG_DDR2_CONFIG);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Disable High Temperature Self-Refresh, Full Array */
+		writel(0x00, regs + AR933X_DDR_REG_EMR2);
+
+		/* Extended Mode Register 2 Set (EMR2S) */
+		writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
+
+		writel(0x00, regs + AR933X_DDR_REG_EMR3);
+
+		/* Extended Mode Register 3 Set (EMR3S) */
+		writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Enable DLL,  Full strength, ODT Disabled */
+		writel(0x00, regs + AR71XX_DDR_REG_EMR);
+
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Reset DLL */
+		writel(DDR2_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Auto Refresh */
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Write recovery (WR) 6 clock, CAS Latency 3, Burst Length 8 */
+		writel(DDR2_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Enable OCD defaults, Enable DLL, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_OCD_VAL, regs + AR71XX_DDR_REG_EMR);
+
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* OCD exit, Enable DLL, Enable /DQS, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Refresh time control */
+		if (val & AR933X_BOOTSTRAP_REF_CLK_40)
+			writel(DDR_REFRESH_VAL_40M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+		else
+			writel(DDR_REFRESH_VAL_25M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+
+		/* DQS 0 Tap Control */
+		writel(DDR_TAP_VAL0, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR_TAP_VAL1, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		/* For 16-bit DDR */
+		writel(0xff, regs + AR71XX_DDR_REG_RD_CYCLE);
+	} else {
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + AR933X_DDR_REG_TIMEOUT_MAX);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Reset DLL, Burst Length 8, CAS Latency 3 */
+		writel(DDR1_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+
+		/* Forces an MRS update cycle in DDR */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Enable DLL, Full strength */
+		writel(DDR1_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+
+		/* Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Normal DLL, Burst Length 8, CAS Latency 3 */
+		writel(DDR1_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+
+		/* Refresh time control */
+		if (val & AR933X_BOOTSTRAP_REF_CLK_40)
+			writel(DDR_REFRESH_VAL_40M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+		else
+			writel(DDR_REFRESH_VAL_25M, regs +
+			       AR71XX_DDR_REG_REFRESH);
+
+		/* DQS 0 Tap Control */
+		writel(DDR_TAP_VAL0, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR_TAP_VAL1, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		/* For 16-bit DDR */
+		writel(0xff, regs + AR71XX_DDR_REG_RD_CYCLE);
+	}
+}
+
+void ddr_tap_tuning(void)
+{
+	void __iomem *regs;
+	u32 *addr_k0, *addr_k1, *addr;
+	u32 val, tap, upper, lower;
+	int i, j, dir, err, done;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+
+	/* Init memory pattern */
+	addr = (void *)CKSEG0ADDR(0x2000);
+	for (i = 0; i < 256; i++) {
+		val = 0;
+		for (j = 0; j < 8; j++) {
+			if (i & (1 << j)) {
+				if (j % 2)
+					val |= 0xffff0000;
+				else
+					val |= 0x0000ffff;
+			}
+
+			if (j % 2) {
+				*addr++ = val;
+				val = 0;
+			}
+		}
+	}
+
+	err = 0;
+	done = 0;
+	dir = 1;
+	tap = readl(regs + AR71XX_DDR_REG_TAP_CTRL0);
+	val = tap;
+	while (!done) {
+		err = 0;
+
+		/* Update new DDR tap value */
+		writel(val, regs + AR71XX_DDR_REG_TAP_CTRL0);
+		writel(val, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		/* Compare DDR with cache */
+		for (i = 0; i < 2; i++) {
+			addr_k1 = (void *)CKSEG1ADDR(0x2000);
+			addr_k0 = (void *)CKSEG0ADDR(0x2000);
+			addr = (void *)CKSEG0ADDR(0x3000);
+
+			while (addr_k0 < addr) {
+				if (*addr_k1++ != *addr_k0++) {
+					err = 1;
+					break;
+				}
+			}
+
+			if (err)
+				break;
+		}
+
+		if (err) {
+			/* Save upper/lower threshold if error  */
+			if (dir) {
+				dir = 0;
+				val--;
+				upper = val;
+				val = tap;
+			} else {
+				val++;
+				lower = val;
+				done = 1;
+			}
+		} else {
+			/* Try the next value until limitation */
+			if (dir) {
+				if (val < 0x20) {
+					val++;
+				} else {
+					dir = 0;
+					upper = val;
+					val = tap;
+				}
+			} else {
+				if (!val) {
+					lower = val;
+					done = 1;
+				} else {
+					val--;
+				}
+			}
+		}
+	}
+
+	/* compute an intermediate value and write back */
+	val = (upper + lower) / 2;
+	writel(val, regs + AR71XX_DDR_REG_TAP_CTRL0);
+	val++;
+	writel(val, regs + AR71XX_DDR_REG_TAP_CTRL1);
+}
diff --git a/arch/mips/mach-ath79/ar933x/lowlevel_init.S b/arch/mips/mach-ath79/ar933x/lowlevel_init.S
new file mode 100644
index 0000000..1b847f5
--- /dev/null
+++ b/arch/mips/mach-ath79/ar933x/lowlevel_init.S
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK and u-boot_mod project
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <asm/asm.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <mach/ar71xx_regs.h>
+
+#define SET_BIT(val, bit)   ((val) | (1 << (bit)))
+#define SET_PLL_PD(val)     SET_BIT(val, 30)
+#define AHB_DIV_TO_4(val)   SET_BIT(SET_BIT(val, 15), 16)
+#define PLL_BYPASS(val)     SET_BIT(val, 2)
+
+#define MK_PLL_CONF(divint, refdiv, range, outdiv) \
+     (((0x3F & divint) << 10) | \
+     ((0x1F & refdiv) << 16) | \
+     ((0x1 & range)   << 21) | \
+     ((0x7 & outdiv)  << 23) )
+
+#define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \
+    (((0x3 & (cpudiv - 1)) << 5)  | \
+    ((0x3 & (ddrdiv - 1)) << 10) | \
+    ((0x3 & (ahbdiv - 1)) << 15) )
+
+/*
+ * PLL_CPU_CONFIG_VAL
+ *
+ * Bit30 is set (CPU_PLLPWD = 1 -> power down control for CPU PLL)
+ * After PLL configuration we need to clear this bit
+ *
+ * Values written into CPU PLL Configuration (CPU_PLL_CONFIG)
+ *
+ * bits 10..15  (6bit)  DIV_INT (Integer part of the DIV to CPU PLL)
+ *                      =>  32  (0x20)  VCOOUT = XTAL * DIV_INT
+ * bits 16..20  (5bit)  REFDIV  (Reference clock divider)
+ *                      =>  1   (0x1)   [Must start at values 1]
+ * bits 21      (1bit)  RANGE   (VCO frequency range of the CPU PLL)
+ *                      =>  0   (0x0)   [Doesn't impact clock values]
+ * bits 23..25  (3bit)  OUTDIV  (Ratio between VCO and PLL output)
+ *                      =>  1   (0x1)   [0 is illegal!]
+ *                              PLLOUT = VCOOUT * (1/2^OUTDIV)
+ */
+/* DIV_INT=32 (25MHz*32/2=400MHz), REFDIV=1, RANGE=0, OUTDIV=1 */
+#define PLL_CPU_CONFIG_VAL_40M  MK_PLL_CONF(20, 1, 0, 1)
+/* DIV_INT=20 (40MHz*20/2=400MHz), REFDIV=1, RANGE=0, OUTDIV=1 */
+#define PLL_CPU_CONFIG_VAL_25M  MK_PLL_CONF(32, 1, 0, 1)
+
+/*
+ * PLL_CLK_CONTROL_VAL
+ *
+ * In PLL_CLK_CONTROL_VAL bit 2 is set (BYPASS = 1 -> bypass PLL)
+ * After PLL configuration we need to clear this bit
+ *
+ * Values written into CPU Clock Control Register CLOCK_CONTROL
+ *
+ * bits 2       (1bit)  BYPASS (Bypass PLL. This defaults to 1 for test.
+ *                      Software must enable the CPU PLL for normal and
+ *                      then set this bit to 0)
+ * bits 5..6    (2bit)  CPU_POST_DIV    =>  0   (DEFAULT, Ratio = 1)
+ *                      CPU_CLK = PLLOUT / CPU_POST_DIV
+ * bits 10..11  (2bit)  DDR_POST_DIV    =>  0   (DEFAULT, Ratio = 1)
+ *                      DDR_CLK = PLLOUT / DDR_POST_DIV
+ * bits 15..16  (2bit)  AHB_POST_DIV    =>  1   (DEFAULT, Ratio = 2)
+ *                      AHB_CLK = PLLOUT / AHB_POST_DIV
+ *
+ */
+#define PLL_CLK_CONTROL_VAL MK_CLK_CNTL(1, 1, 2)
+
+    .text
+    .set noreorder
+
+LEAF(lowlevel_init)
+	/* These three WLAN_RESET will avoid original issue */
+	li      t3, 0x03
+1:
+	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
+	lw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	ori     t1, t1, 0x0800
+	sw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	nop
+	lw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	li      t2, 0xfffff7ff
+	and     t1, t1, t2
+	sw      t1, AR933X_RESET_REG_RESET_MODULE(t0)
+	nop
+	addi    t3, t3, -1
+	bnez    t3, 1b
+	nop
+
+	li      t2, 0x20
+2:
+	beqz    t2, 1b
+	nop
+	addi    t2, t2, -1
+	lw      t5, AR933X_RESET_REG_BOOTSTRAP(t0)
+	andi    t1, t5, 0x10
+	bnez    t1, 2b
+	nop
+
+	li      t1, 0x02110E
+	sw      t1, AR933X_RESET_REG_BOOTSTRAP(t0)
+	nop
+
+	/* RTC Force Wake */
+	li      t0, CKSEG1ADDR(AR933X_RTC_BASE)
+	li      t1, 0x03
+	sw      t1, AR933X_RTC_REG_FORCE_WAKE(t0)
+	nop
+	nop
+
+	/* RTC Reset */
+	li      t1, 0x00
+	sw      t1, AR933X_RTC_REG_RESET(t0)
+	nop
+	nop
+
+	li      t1, 0x01
+	sw      t1, AR933X_RTC_REG_RESET(t0)
+	nop
+	nop
+
+	/* Wait for RTC in on state */
+1:
+	lw      t1, AR933X_RTC_REG_STATUS(t0)
+	andi    t1, t1, 0x02
+	beqz    t1, 1b
+	nop
+
+	/* Program ki/kd */
+	li      t0, CKSEG1ADDR(AR933X_SRIF_BASE)
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, 0x19e82f01
+	b       2f
+	nop
+1:
+	li      t1, 0x18e82f01
+2:
+	sw      t1, AR933X_SRIF_DDR_DPLL2_REG(t0)
+
+	/* Program phase shift */
+	lw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	li      t2, 0xc07fffff
+	and     t1, t1, t2
+	li      t2, 0x800000
+	or      t1, t1, t2
+	sw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	nop
+
+	/* in some cases, the SoC doesn't start with higher clock on AHB */
+	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
+	li      t1, AHB_DIV_TO_4(PLL_BYPASS(PLL_CLK_CONTROL_VAL))
+	sw      t1, AR933X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	/* Set SETTLE_TIME in CPU PLL */
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, 0x0352
+	b       2f
+	nop
+1:
+	li      t1, 0x0550
+2:
+	sw      t1, AR71XX_PLL_REG_SEC_CONFIG(t0)
+	nop
+
+	/* Set nint, frac, refdiv, outdiv, range according to xtal */
+0:
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, SET_PLL_PD(PLL_CPU_CONFIG_VAL_25M)
+	b       2f
+	nop
+1:
+	li      t1, SET_PLL_PD(PLL_CPU_CONFIG_VAL_40M)
+2:
+	sw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	nop
+1:
+	lw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	li      t2, 0x80000000
+	and     t1, t1, t2
+	bnez    t1, 1b
+	nop
+
+	/* Put frac bit19:10 configuration */
+	li      t1, 0x1003E8
+	sw      t1, AR933X_PLL_DITHER_FRAC_REG(t0)
+	nop
+
+	/* Clear PLL power down bit in CPU PLL configuration */
+	andi    t1, t5, 0x01            # t5 BOOT_STRAP
+	bnez    t1, 1f
+	nop
+	li      t1, PLL_CPU_CONFIG_VAL_25M
+	b       2f
+	nop
+1:
+	li      t1, PLL_CPU_CONFIG_VAL_40M
+2:
+	sw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	nop
+
+	/* Wait for PLL update -> bit 31 in CPU_PLL_CONFIG should be 0 */
+1:
+	lw      t1, AR933X_PLL_CPU_CONFIG_REG(t0)
+	li      t2, 0x80000000
+	and     t1, t1, t2
+	bnez    t1, 1b
+	nop
+
+	/* Confirm DDR PLL lock */
+	li      t3, 100
+	li      t4, 0
+
+2:
+	addi    t4, t4, 1
+	bgt     t4, t3, 0b
+	nop
+
+	li      t3, 5
+3:
+	/* Clear do_meas */
+	li      t0, CKSEG1ADDR(AR933X_SRIF_BASE)
+	lw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	li      t2, 0xBFFFFFFF
+	and     t1, t1, t2
+	sw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	nop
+
+	li      t2, 10
+1:
+	subu    t2, t2, 1
+	bnez    t2, 1b
+	nop
+
+	/* Set do_meas */
+	li      t2, 0x40000000
+	or      t1, t1, t2
+	sw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	nop
+
+	/* Check meas_done */
+1:
+	lw      t1, AR933X_SRIF_DDR_DPLL4_REG(t0)
+	andi    t1, t1, 0x8
+	beqz    t1, 1b
+	nop
+
+	lw      t1, AR933X_SRIF_DDR_DPLL3_REG(t0)
+	li      t2, 0x007FFFF8
+	and     t1, t1, t2
+	srl     t1, t1, 3
+	li      t2, 0x4000
+	bgt     t1, t2, 2b
+	nop
+	addi    t3, t3, -1
+	bnez    t3, 3b
+	nop
+
+	/* clear PLL bypass (bit 2) in CPU CLOCK CONTROL register */
+	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
+	li      t1, PLL_CLK_CONTROL_VAL
+	sw      t1, AR933X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	nop
+	jr ra
+	nop
+    END(lowlevel_init)
-- 
1.9.1

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

* [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs Wills Wang
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-03-16 21:39   ` Marek Vasut
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 4/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores ar933x Wills Wang
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This patch enable work for qca953x SOC.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Fix multi-line comment for qca953x

Changes in v7:
- Use CKSEGxADDR instead of KSEGxADDR for qca953x

Changes in v6:
- Initial support for qca953x

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/mips/mach-ath79/Kconfig                 |   9 +
 arch/mips/mach-ath79/Makefile                |   3 +-
 arch/mips/mach-ath79/qca953x/Makefile        |   7 +
 arch/mips/mach-ath79/qca953x/clk.c           | 111 +++++++
 arch/mips/mach-ath79/qca953x/ddr.c           | 472 +++++++++++++++++++++++++++
 arch/mips/mach-ath79/qca953x/lowlevel_init.S | 186 +++++++++++
 6 files changed, 787 insertions(+), 1 deletion(-)
 create mode 100644 arch/mips/mach-ath79/qca953x/Makefile
 create mode 100644 arch/mips/mach-ath79/qca953x/clk.c
 create mode 100644 arch/mips/mach-ath79/qca953x/ddr.c
 create mode 100644 arch/mips/mach-ath79/qca953x/lowlevel_init.S

diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
index ab93d92..e35f1b5 100644
--- a/arch/mips/mach-ath79/Kconfig
+++ b/arch/mips/mach-ath79/Kconfig
@@ -13,4 +13,13 @@ config SOC_AR933X
 	help
 	  This supports QCA/Atheros ar933x family SOCs.
 
+config SOC_QCA953X
+	bool
+	select SUPPORTS_BIG_ENDIAN
+	select SUPPORTS_CPU_MIPS32_R1
+	select SUPPORTS_CPU_MIPS32_R2
+	select MIPS_TUNE_24KC
+	help
+	  This supports QCA/Atheros qca953x family SOCs.
+
 endmenu
diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile
index 9b9447e..160dfaa 100644
--- a/arch/mips/mach-ath79/Makefile
+++ b/arch/mips/mach-ath79/Makefile
@@ -6,4 +6,5 @@ obj-y += reset.o
 obj-y += cpu.o
 obj-y += dram.o
 
-obj-$(CONFIG_SOC_AR933X)	+= ar933x/
\ No newline at end of file
+obj-$(CONFIG_SOC_AR933X)	+= ar933x/
+obj-$(CONFIG_SOC_QCA953X)	+= qca953x/
\ No newline at end of file
diff --git a/arch/mips/mach-ath79/qca953x/Makefile b/arch/mips/mach-ath79/qca953x/Makefile
new file mode 100644
index 0000000..fd74f0c
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += clk.o
+obj-y += ddr.o
+obj-y += lowlevel_init.o
diff --git a/arch/mips/mach-ath79/qca953x/clk.c b/arch/mips/mach-ath79/qca953x/clk.c
new file mode 100644
index 0000000..ef0a28e
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/clk.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static u32 qca953x_get_xtal(void)
+{
+	u32 val;
+
+	val = get_bootstrap();
+	if (val & QCA953X_BOOTSTRAP_REF_CLK_40)
+		return 40000000;
+	else
+		return 25000000;
+}
+
+int get_serial_clock(void)
+{
+	return qca953x_get_xtal();
+}
+
+int get_clocks(void)
+{
+	void __iomem *regs;
+	u32 val, ctrl, xtal, pll, div;
+
+	regs = map_physmem(AR71XX_PLL_BASE, AR71XX_PLL_SIZE,
+			   MAP_NOCACHE);
+
+	xtal = qca953x_get_xtal();
+	ctrl = readl(regs + QCA953X_PLL_CLK_CTRL_REG);
+	val = readl(regs + QCA953X_PLL_CPU_CONFIG_REG);
+
+	/* VCOOUT = XTAL * DIV_INT */
+	div = (val >> QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT)
+			& QCA953X_PLL_CPU_CONFIG_REFDIV_MASK;
+	pll = xtal / div;
+
+	/* PLLOUT = VCOOUT * (1/2^OUTDIV) */
+	div = (val >> QCA953X_PLL_CPU_CONFIG_NINT_SHIFT)
+			& QCA953X_PLL_CPU_CONFIG_NINT_MASK;
+	pll *= div;
+	div = (val >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT)
+			& QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK;
+	if (!div)
+		div = 1;
+	pll >>= div;
+
+	/* CPU_CLK = PLLOUT / CPU_POST_DIV */
+	div = ((ctrl >> QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT)
+			& QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK) + 1;
+	gd->cpu_clk = pll / div;
+
+
+	val = readl(regs + QCA953X_PLL_DDR_CONFIG_REG);
+	/* VCOOUT = XTAL * DIV_INT */
+	div = (val >> QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT)
+			& QCA953X_PLL_DDR_CONFIG_REFDIV_MASK;
+	pll = xtal / div;
+
+	/* PLLOUT = VCOOUT * (1/2^OUTDIV) */
+	div = (val >> QCA953X_PLL_DDR_CONFIG_NINT_SHIFT)
+			& QCA953X_PLL_DDR_CONFIG_NINT_MASK;
+	pll *= div;
+	div = (val >> QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT)
+			& QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK;
+	if (!div)
+		div = 1;
+	pll >>= div;
+
+	/* DDR_CLK = PLLOUT / DDR_POST_DIV */
+	div = ((ctrl >> QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT)
+			& QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK) + 1;
+	gd->mem_clk = pll / div;
+
+	div = ((ctrl >> QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT)
+			& QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK) + 1;
+	if (ctrl & QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL) {
+		/* AHB_CLK = DDR_CLK / AHB_POST_DIV */
+		gd->bus_clk = gd->mem_clk / (div + 1);
+	} else {
+		/* AHB_CLK = CPU_CLK / AHB_POST_DIV */
+		gd->bus_clk = gd->cpu_clk / (div + 1);
+	}
+
+	return 0;
+}
+
+ulong get_bus_freq(ulong dummy)
+{
+	if (!gd->bus_clk)
+		get_clocks();
+	return gd->bus_clk;
+}
+
+ulong get_ddr_freq(ulong dummy)
+{
+	if (!gd->mem_clk)
+		get_clocks();
+	return gd->mem_clk;
+}
diff --git a/arch/mips/mach-ath79/qca953x/ddr.c b/arch/mips/mach-ath79/qca953x/ddr.c
new file mode 100644
index 0000000..ac0130c
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/ddr.c
@@ -0,0 +1,472 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/reset.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DDR_CTRL_UPD_EMR3S      BIT(5)
+#define DDR_CTRL_UPD_EMR2S      BIT(4)
+#define DDR_CTRL_PRECHARGE      BIT(3)
+#define DDR_CTRL_AUTO_REFRESH   BIT(2)
+#define DDR_CTRL_UPD_EMRS       BIT(1)
+#define DDR_CTRL_UPD_MRS        BIT(0)
+
+#define DDR_REFRESH_EN          BIT(14)
+#define DDR_REFRESH_M           0x3ff
+#define DDR_REFRESH(x)          ((x) & DDR_REFRESH_M)
+#define DDR_REFRESH_VAL         (DDR_REFRESH_EN | DDR_REFRESH(312))
+
+#define DDR_TRAS_S              0
+#define DDR_TRAS_M              0x1f
+#define DDR_TRAS(x)             (((x) & DDR_TRAS_M) << DDR_TRAS_S)
+#define DDR_TRCD_M              0xf
+#define DDR_TRCD_S              5
+#define DDR_TRCD(x)             (((x) & DDR_TRCD_M) << DDR_TRCD_S)
+#define DDR_TRP_M               0xf
+#define DDR_TRP_S               9
+#define DDR_TRP(x)              (((x) & DDR_TRP_M) << DDR_TRP_S)
+#define DDR_TRRD_M              0xf
+#define DDR_TRRD_S              13
+#define DDR_TRRD(x)             (((x) & DDR_TRRD_M) << DDR_TRRD_S)
+#define DDR_TRFC_M              0x7f
+#define DDR_TRFC_S              17
+#define DDR_TRFC(x)             (((x) & DDR_TRFC_M) << DDR_TRFC_S)
+#define DDR_TMRD_M              0xf
+#define DDR_TMRD_S              23
+#define DDR_TMRD(x)             (((x) & DDR_TMRD_M) << DDR_TMRD_S)
+#define DDR_CAS_L_M             0x17
+#define DDR_CAS_L_S             27
+#define DDR_CAS_L(x)            (((x) & DDR_CAS_L_M) << DDR_CAS_L_S)
+#define DDR_OPEN                BIT(30)
+#define DDR1_CONF_REG_VAL       (DDR_TRAS(16) | DDR_TRCD(6) | \
+				 DDR_TRP(6) | DDR_TRRD(4) | \
+				 DDR_TRFC(7) | DDR_TMRD(5) | \
+				 DDR_CAS_L(7) | DDR_OPEN)
+#define DDR2_CONF_REG_VAL       (DDR_TRAS(27) | DDR_TRCD(9) | \
+				 DDR_TRP(9) | DDR_TRRD(7) | \
+				 DDR_TRFC(21) | DDR_TMRD(15) | \
+				 DDR_CAS_L(17) | DDR_OPEN)
+
+#define DDR_BURST_LEN_S         0
+#define DDR_BURST_LEN_M         0xf
+#define DDR_BURST_LEN(x)        ((x) << DDR_BURST_LEN_S)
+#define DDR_BURST_TYPE          BIT(4)
+#define DDR_CNTL_OE_EN          BIT(5)
+#define DDR_PHASE_SEL           BIT(6)
+#define DDR_CKE                 BIT(7)
+#define DDR_TWR_S               8
+#define DDR_TWR_M               0xf
+#define DDR_TWR(x)              (((x) & DDR_TWR_M) << DDR_TWR_S)
+#define DDR_TRTW_S              12
+#define DDR_TRTW_M              0x1f
+#define DDR_TRTW(x)             (((x) & DDR_TRTW_M) << DDR_TRTW_S)
+#define DDR_TRTP_S              17
+#define DDR_TRTP_M              0xf
+#define DDR_TRTP(x)             (((x) & DDR_TRTP_M) << DDR_TRTP_S)
+#define DDR_TWTR_S              21
+#define DDR_TWTR_M              0x1f
+#define DDR_TWTR(x)             (((x) & DDR_TWTR_M) << DDR_TWTR_S)
+#define DDR_G_OPEN_L_S          26
+#define DDR_G_OPEN_L_M          0xf
+#define DDR_G_OPEN_L(x)         ((x) << DDR_G_OPEN_L_S)
+#define DDR_HALF_WIDTH_LOW      BIT(31)
+#define DDR1_CONF2_REG_VAL      (DDR_BURST_LEN(8) | DDR_CNTL_OE_EN | \
+				 DDR_CKE | DDR_TWR(13) | DDR_TRTW(14) | \
+				 DDR_TRTP(8) | DDR_TWTR(14) | \
+				 DDR_G_OPEN_L(6) | DDR_HALF_WIDTH_LOW)
+#define DDR2_CONF2_REG_VAL      (DDR_BURST_LEN(8) | DDR_CNTL_OE_EN | \
+				 DDR_CKE | DDR_TWR(1) | DDR_TRTW(14) | \
+				 DDR_TRTP(9) | DDR_TWTR(21) | \
+				 DDR_G_OPEN_L(8) | DDR_HALF_WIDTH_LOW)
+
+#define DDR_TWR_MSB             BIT(3)
+#define DDR_TRAS_MSB            BIT(2)
+#define DDR_TRFC_MSB_M          0x3
+#define DDR_TRFC_MSB(x)         (x)
+#define DDR1_CONF3_REG_VAL      0
+#define DDR2_CONF3_REG_VAL      (DDR_TWR_MSB | DDR_TRFC_MSB(2))
+
+#define DDR_CTL_SRAM_TSEL       BIT(30)
+#define DDR_CTL_SRAM_GE0_SYNC   BIT(20)
+#define DDR_CTL_SRAM_GE1_SYNC   BIT(19)
+#define DDR_CTL_SRAM_USB_SYNC   BIT(18)
+#define DDR_CTL_SRAM_PCIE_SYNC  BIT(17)
+#define DDR_CTL_SRAM_WMAC_SYNC  BIT(16)
+#define DDR_CTL_SRAM_MISC1_SYNC BIT(15)
+#define DDR_CTL_SRAM_MISC2_SYNC BIT(14)
+#define DDR_CTL_PAD_DDR2_SEL    BIT(6)
+#define DDR_CTL_HALF_WIDTH      BIT(1)
+#define DDR_CTL_CONFIG_VAL      (DDR_CTL_SRAM_TSEL | \
+				 DDR_CTL_SRAM_GE0_SYNC | \
+				 DDR_CTL_SRAM_GE1_SYNC | \
+				 DDR_CTL_SRAM_USB_SYNC | \
+				 DDR_CTL_SRAM_PCIE_SYNC | \
+				 DDR_CTL_SRAM_WMAC_SYNC | \
+				 DDR_CTL_HALF_WIDTH)
+
+#define DDR_BURST_GE0_MAX_BL_S  0
+#define DDR_BURST_GE0_MAX_BL_M  0xf
+#define DDR_BURST_GE0_MAX_BL(x) \
+	(((x) & DDR_BURST_GE0_MAX_BL_M) << DDR_BURST_GE0_MAX_BL_S)
+#define DDR_BURST_GE1_MAX_BL_S  4
+#define DDR_BURST_GE1_MAX_BL_M  0xf
+#define DDR_BURST_GE1_MAX_BL(x) \
+	(((x) & DDR_BURST_GE1_MAX_BL_M) << DDR_BURST_GE1_MAX_BL_S)
+#define DDR_BURST_PCIE_MAX_BL_S 8
+#define DDR_BURST_PCIE_MAX_BL_M 0xf
+#define DDR_BURST_PCIE_MAX_BL(x) \
+	(((x) & DDR_BURST_PCIE_MAX_BL_M) << DDR_BURST_PCIE_MAX_BL_S)
+#define DDR_BURST_USB_MAX_BL_S  12
+#define DDR_BURST_USB_MAX_BL_M  0xf
+#define DDR_BURST_USB_MAX_BL(x) \
+	(((x) & DDR_BURST_USB_MAX_BL_M) << DDR_BURST_USB_MAX_BL_S)
+#define DDR_BURST_CPU_MAX_BL_S  16
+#define DDR_BURST_CPU_MAX_BL_M  0xf
+#define DDR_BURST_CPU_MAX_BL(x) \
+	(((x) & DDR_BURST_CPU_MAX_BL_M) << DDR_BURST_CPU_MAX_BL_S)
+#define DDR_BURST_RD_MAX_BL_S   20
+#define DDR_BURST_RD_MAX_BL_M   0xf
+#define DDR_BURST_RD_MAX_BL(x) \
+	(((x) & DDR_BURST_RD_MAX_BL_M) << DDR_BURST_RD_MAX_BL_S)
+#define DDR_BURST_WR_MAX_BL_S   24
+#define DDR_BURST_WR_MAX_BL_M   0xf
+#define DDR_BURST_WR_MAX_BL(x) \
+	(((x) & DDR_BURST_WR_MAX_BL_M) << DDR_BURST_WR_MAX_BL_S)
+#define DDR_BURST_RWP_MASK_EN_S 28
+#define DDR_BURST_RWP_MASK_EN_M 0x3
+#define DDR_BURST_RWP_MASK_EN(x) \
+	(((x) & DDR_BURST_RWP_MASK_EN_M) << DDR_BURST_RWP_MASK_EN_S)
+#define DDR_BURST_CPU_PRI_BE    BIT(30)
+#define DDR_BURST_CPU_PRI       BIT(31)
+#define DDR_BURST_VAL           (DDR_BURST_CPU_PRI_BE | \
+				 DDR_BURST_RWP_MASK_EN(3) | \
+				 DDR_BURST_WR_MAX_BL(4) | \
+				 DDR_BURST_RD_MAX_BL(4) | \
+				 DDR_BURST_CPU_MAX_BL(4) | \
+				 DDR_BURST_USB_MAX_BL(4) | \
+				 DDR_BURST_PCIE_MAX_BL(4) | \
+				 DDR_BURST_GE1_MAX_BL(4) | \
+				 DDR_BURST_GE0_MAX_BL(4))
+
+#define DDR_BURST_WMAC_MAX_BL_S 0
+#define DDR_BURST_WMAC_MAX_BL_M 0xf
+#define DDR_BURST_WMAC_MAX_BL(x) \
+	(((x) & DDR_BURST_WMAC_MAX_BL_M) << DDR_BURST_WMAC_MAX_BL_S)
+#define DDR_BURST2_VAL          DDR_BURST_WMAC_MAX_BL(4)
+
+#define DDR2_CONF_TWL_S         10
+#define DDR2_CONF_TWL_M         0xf
+#define DDR2_CONF_TWL(x) \
+	(((x) & DDR2_CONF_TWL_M) << DDR2_CONF_TWL_S)
+#define DDR2_CONF_ODT           BIT(9)
+#define DDR2_CONF_TFAW_S        2
+#define DDR2_CONF_TFAW_M        0x3f
+#define DDR2_CONF_TFAW(x) \
+	(((x) & DDR2_CONF_TFAW_M) << DDR2_CONF_TFAW_S)
+#define DDR2_CONF_EN            BIT(0)
+#define DDR2_CONF_VAL           (DDR2_CONF_TWL(5) | \
+				 DDR2_CONF_TFAW(31) | \
+				 DDR2_CONF_ODT | \
+				 DDR2_CONF_EN)
+
+#define DDR1_EXT_MODE_VAL       0
+#define DDR2_EXT_MODE_VAL       0x402
+#define DDR2_EXT_MODE_OCD_VAL   0x782
+#define DDR1_MODE_DLL_VAL       0x133
+#define DDR2_MODE_DLL_VAL       0x143
+#define DDR1_MODE_VAL           0x33
+#define DDR2_MODE_VAL           0x43
+#define DDR1_TAP_VAL            0x20
+#define DDR2_TAP_VAL            0x10
+
+#define DDR_REG_BIST_MASK_ADDR_0        0x2c
+#define DDR_REG_BIST_MASK_ADDR_1        0x30
+#define DDR_REG_BIST_MASK_AHB_GE0_0     0x34
+#define DDR_REG_BIST_COMP_AHB_GE0_0     0x38
+#define DDR_REG_BIST_MASK_AHB_GE1_0     0x3c
+#define DDR_REG_BIST_COMP_AHB_GE1_0     0x40
+#define DDR_REG_BIST_COMP_ADDR_0        0x64
+#define DDR_REG_BIST_COMP_ADDR_1        0x68
+#define DDR_REG_BIST_MASK_AHB_GE0_1     0x6c
+#define DDR_REG_BIST_COMP_AHB_GE0_1     0x70
+#define DDR_REG_BIST_MASK_AHB_GE1_1     0x74
+#define DDR_REG_BIST_COMP_AHB_GE1_1     0x78
+#define DDR_REG_BIST                    0x11c
+#define DDR_REG_BIST_STATUS             0x120
+
+#define DDR_BIST_COMP_CNT_S     1
+#define DDR_BIST_COMP_CNT_M     0xff
+#define DDR_BIST_COMP_CNT(x) \
+	(((x) & DDR_BIST_COMP_CNT_M) << DDR_BIST_COMP_CNT_S)
+#define DDR_BIST_COMP_CNT_MASK \
+	(DDR_BIST_COMP_CNT_M << DDR_BIST_COMP_CNT_S)
+#define DDR_BIST_TEST_START     BIT(0)
+#define DDR_BIST_STATUS_DONE    BIT(0)
+
+/* 4 Row Address Bits, 4 Column Address Bits, 2 BA bits */
+#define DDR_BIST_MASK_ADDR_VAL  0xfa5de83f
+
+#define DDR_TAP_MAGIC_VAL       0xaa55aa55
+#define DDR_TAP_MAX_VAL         0x40
+
+void ddr_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+	val = get_bootstrap();
+	if (val & QCA953X_BOOTSTRAP_DDR1) {
+		writel(DDR_CTL_CONFIG_VAL, regs + QCA953X_DDR_REG_CTL_CONF);
+		udelay(10);
+
+		/* For 16-bit DDR */
+		writel(0xffff, regs + AR71XX_DDR_REG_RD_CYCLE);
+		udelay(100);
+
+		/* Burst size */
+		writel(DDR_BURST_VAL, regs + QCA953X_DDR_REG_BURST);
+		udelay(100);
+		writel(DDR_BURST2_VAL, regs + QCA953X_DDR_REG_BURST2);
+		udelay(100);
+
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + QCA953X_DDR_REG_TIMEOUT_MAX);
+		udelay(100);
+
+		/* DRAM timing */
+		writel(DDR1_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
+		udelay(100);
+		writel(DDR1_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
+		udelay(100);
+		writel(DDR1_CONF3_REG_VAL, regs + QCA953X_DDR_REG_CONFIG3);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* ODT disable, Full strength, Enable DLL */
+		writel(DDR1_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Reset DLL, CAS Latency 3, Burst Length 8 */
+		writel(DDR1_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Update Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Auto Refresh */
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Normal DLL, CAS Latency 3, Burst Length 8 */
+		writel(DDR1_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Update Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Refresh time control */
+		writel(DDR_REFRESH_VAL, regs + AR71XX_DDR_REG_REFRESH);
+		udelay(100);
+
+		/* DQS 0 Tap Control */
+		writel(DDR1_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR1_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL1);
+	} else {
+		writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(10);
+		writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(10);
+		writel(DDR_CTL_CONFIG_VAL | DDR_CTL_PAD_DDR2_SEL,
+		       regs + QCA953X_DDR_REG_CTL_CONF);
+		udelay(10);
+
+		/* For 16-bit DDR */
+		writel(0xffff, regs + AR71XX_DDR_REG_RD_CYCLE);
+		udelay(100);
+
+		/* Burst size */
+		writel(DDR_BURST_VAL, regs + QCA953X_DDR_REG_BURST);
+		udelay(100);
+		writel(DDR_BURST2_VAL, regs + QCA953X_DDR_REG_BURST2);
+		udelay(100);
+
+		/* AHB maximum timeout */
+		writel(0xfffff, regs + QCA953X_DDR_REG_TIMEOUT_MAX);
+		udelay(100);
+
+		/* DRAM timing */
+		writel(DDR2_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
+		udelay(100);
+		writel(DDR2_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
+		udelay(100);
+		writel(DDR2_CONF3_REG_VAL, regs + QCA953X_DDR_REG_CONFIG3);
+		udelay(100);
+
+		/* Enable DDR2 */
+		writel(DDR2_CONF_VAL, regs + QCA953X_DDR_REG_DDR2_CONFIG);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Update Extended Mode Register 2 Set (EMR2S) */
+		writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Update Extended Mode Register 3 Set (EMR3S) */
+		writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* 150 ohm, Reduced strength, Enable DLL */
+		writel(DDR2_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Reset DLL, CAS Latency 4, Burst Length 8 */
+		writel(DDR2_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Update Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Precharge All */
+		writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Auto Refresh */
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+		writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Normal DLL, CAS Latency 4, Burst Length 8 */
+		writel(DDR2_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
+		udelay(100);
+
+		/* Mode Register Set (MRS) */
+		writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Enable OCD, Enable DLL, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_OCD_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* OCD diable, Enable DLL, Reduced Drive Strength */
+		writel(DDR2_EXT_MODE_VAL, regs + AR71XX_DDR_REG_EMR);
+		udelay(100);
+
+		/* Update Extended Mode Register Set (EMRS) */
+		writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
+		udelay(100);
+
+		/* Refresh time control */
+		writel(DDR_REFRESH_VAL, regs + AR71XX_DDR_REG_REFRESH);
+		udelay(100);
+
+		/* DQS 0 Tap Control */
+		writel(DDR2_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL0);
+
+		/* DQS 1 Tap Control */
+		writel(DDR2_TAP_VAL, regs + AR71XX_DDR_REG_TAP_CTRL1);
+	}
+}
+
+void ddr_tap_tuning(void)
+{
+	void __iomem *regs;
+	u32 val, pass, tap, cnt, tap_val, last, first;
+
+	regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
+			   MAP_NOCACHE);
+
+	tap_val = readl(regs + AR71XX_DDR_REG_TAP_CTRL0);
+	first = DDR_TAP_MAGIC_VAL;
+	last = 0;
+	cnt = 0;
+	tap = 0;
+
+	do {
+		writel(tap, regs + AR71XX_DDR_REG_TAP_CTRL0);
+		writel(tap, regs + AR71XX_DDR_REG_TAP_CTRL1);
+
+		writel(DDR_BIST_COMP_CNT(8), regs + DDR_REG_BIST_COMP_ADDR_1);
+		writel(DDR_BIST_MASK_ADDR_VAL, regs + DDR_REG_BIST_MASK_ADDR_0);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE0_1);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE1_0);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE1_1);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE0_0);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE0_1);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE1_0);
+		writel(0xffff, regs + DDR_REG_BIST_MASK_AHB_GE1_1);
+		writel(0xffff, regs + DDR_REG_BIST_COMP_AHB_GE0_0);
+
+		/* Start BIST test */
+		writel(DDR_BIST_TEST_START, regs + DDR_REG_BIST);
+
+		do {
+			val = readl(regs + DDR_REG_BIST_STATUS);
+		} while (!(val & DDR_BIST_STATUS_DONE));
+
+		/* Stop BIST test */
+		writel(0, regs + DDR_REG_BIST);
+
+		pass = val & DDR_BIST_COMP_CNT_MASK;
+		pass ^= DDR_BIST_COMP_CNT(8);
+		if (!pass) {
+			if (first != DDR_TAP_MAGIC_VAL) {
+				last = tap;
+			} else  {
+				first = tap;
+				last = tap;
+			}
+			cnt++;
+		}
+		tap++;
+	} while (tap < DDR_TAP_MAX_VAL);
+
+	if (cnt) {
+		tap_val = (first + last) / 2;
+		tap_val %= DDR_TAP_MAX_VAL;
+	}
+
+	writel(tap_val, regs + AR71XX_DDR_REG_TAP_CTRL0);
+	writel(tap_val, regs + AR71XX_DDR_REG_TAP_CTRL1);
+}
diff --git a/arch/mips/mach-ath79/qca953x/lowlevel_init.S b/arch/mips/mach-ath79/qca953x/lowlevel_init.S
new file mode 100644
index 0000000..d7038fa
--- /dev/null
+++ b/arch/mips/mach-ath79/qca953x/lowlevel_init.S
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ * Based on Atheros LSDK/QSDK
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <asm/asm.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <mach/ar71xx_regs.h>
+
+#define MK_PLL_CONF(divint, refdiv, range, outdiv) \
+     (((0x3F & divint) << 10) | \
+     ((0x1F & refdiv) << 16) | \
+     ((0x1 & range)   << 21) | \
+     ((0x7 & outdiv)  << 23) )
+
+#define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \
+    (((0x3 & (cpudiv - 1)) << 5)  | \
+    ((0x3 & (ddrdiv - 1)) << 10) | \
+    ((0x3 & (ahbdiv - 1)) << 15) )
+
+#define SET_FIELD(name, v)      (((v) & QCA953X_##name##_MASK) << \
+				 QCA953X_##name##_SHIFT)
+
+#define DPLL2_KI(v)             SET_FIELD(SRIF_DPLL2_KI, v)
+#define DPLL2_KD(v)             SET_FIELD(SRIF_DPLL2_KD, v)
+#define DPLL2_PWD               QCA953X_SRIF_DPLL2_PWD
+#define MK_DPLL2(ki, kd)        (DPLL2_KI(ki) | DPLL2_KD(kd) | DPLL2_PWD)
+
+#define PLL_CPU_NFRAC(v)        SET_FIELD(PLL_CPU_CONFIG_NFRAC, v)
+#define PLL_CPU_NINT(v)         SET_FIELD(PLL_CPU_CONFIG_NINT, v)
+#define PLL_CPU_REFDIV(v)       SET_FIELD(PLL_CPU_CONFIG_REFDIV, v)
+#define PLL_CPU_OUTDIV(v)       SET_FIELD(PLL_CPU_CONFIG_OUTDIV, v)
+#define MK_PLL_CPU_CONF(frac, nint, ref, outdiv) \
+				(PLL_CPU_NFRAC(frac) | \
+				 PLL_CPU_NINT(nint) | \
+				 PLL_CPU_REFDIV(ref) | \
+				 PLL_CPU_OUTDIV(outdiv))
+
+#define PLL_DDR_NFRAC(v)        SET_FIELD(PLL_DDR_CONFIG_NFRAC, v)
+#define PLL_DDR_NINT(v)         SET_FIELD(PLL_DDR_CONFIG_NINT, v)
+#define PLL_DDR_REFDIV(v)       SET_FIELD(PLL_DDR_CONFIG_REFDIV, v)
+#define PLL_DDR_OUTDIV(v)       SET_FIELD(PLL_DDR_CONFIG_OUTDIV, v)
+#define MK_PLL_DDR_CONF(frac, nint, ref, outdiv) \
+				(PLL_DDR_NFRAC(frac) | \
+				 PLL_DDR_REFDIV(ref) | \
+				 PLL_DDR_NINT(nint) | \
+				 PLL_DDR_OUTDIV(outdiv) | \
+				 QCA953X_PLL_CONFIG_PWD)
+
+#define PLL_CPU_CONF_VAL        MK_PLL_CPU_CONF(0, 26, 1, 0)
+#define PLL_DDR_CONF_VAL        MK_PLL_DDR_CONF(0, 15, 1, 0)
+
+#define PLL_CLK_CTRL_PLL_BYPASS (QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS | \
+				 QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS | \
+				 QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
+
+#define PLL_CLK_CTRL_CPU_DIV(v) SET_FIELD(PLL_CLK_CTRL_CPU_POST_DIV, v)
+#define PLL_CLK_CTRL_DDR_DIV(v) SET_FIELD(PLL_CLK_CTRL_DDR_POST_DIV, v)
+#define PLL_CLK_CTRL_AHB_DIV(v) SET_FIELD(PLL_CLK_CTRL_AHB_POST_DIV, v)
+#define MK_PLL_CLK_CTRL(cpu, ddr, ahb) \
+				(PLL_CLK_CTRL_CPU_DIV(cpu) | \
+				 PLL_CLK_CTRL_DDR_DIV(ddr) | \
+				 PLL_CLK_CTRL_AHB_DIV(ahb))
+#define PLL_CLK_CTRL_VAL    (MK_PLL_CLK_CTRL(0, 0, 2) | \
+			     PLL_CLK_CTRL_PLL_BYPASS | \
+			     QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL | \
+			     QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
+
+#define PLL_DDR_DIT_FRAC_MAX(v)     SET_FIELD(PLL_DDR_DIT_FRAC_MAX, v)
+#define PLL_DDR_DIT_FRAC_MIN(v)     SET_FIELD(PLL_DDR_DIT_FRAC_MIN, v)
+#define PLL_DDR_DIT_FRAC_STEP(v)    SET_FIELD(PLL_DDR_DIT_FRAC_STEP, v)
+#define PLL_DDR_DIT_UPD_CNT(v)      SET_FIELD(PLL_DDR_DIT_UPD_CNT, v)
+#define PLL_CPU_DIT_FRAC_MAX(v)     SET_FIELD(PLL_CPU_DIT_FRAC_MAX, v)
+#define PLL_CPU_DIT_FRAC_MIN(v)     SET_FIELD(PLL_CPU_DIT_FRAC_MIN, v)
+#define PLL_CPU_DIT_FRAC_STEP(v)    SET_FIELD(PLL_CPU_DIT_FRAC_STEP, v)
+#define PLL_CPU_DIT_UPD_CNT(v)      SET_FIELD(PLL_CPU_DIT_UPD_CNT, v)
+#define MK_PLL_DDR_DIT_FRAC(max, min, step, cnt) \
+				(QCA953X_PLL_DIT_FRAC_EN | \
+				 PLL_DDR_DIT_FRAC_MAX(max) | \
+				 PLL_DDR_DIT_FRAC_MIN(min) | \
+				 PLL_DDR_DIT_FRAC_STEP(step) | \
+				 PLL_DDR_DIT_UPD_CNT(cnt))
+#define MK_PLL_CPU_DIT_FRAC(max, min, step, cnt) \
+				(QCA953X_PLL_DIT_FRAC_EN | \
+				 PLL_CPU_DIT_FRAC_MAX(max) | \
+				 PLL_CPU_DIT_FRAC_MIN(min) | \
+				 PLL_CPU_DIT_FRAC_STEP(step) | \
+				 PLL_CPU_DIT_UPD_CNT(cnt))
+#define PLL_CPU_DIT_FRAC_VAL    MK_PLL_CPU_DIT_FRAC(63, 0, 1, 15)
+#define PLL_DDR_DIT_FRAC_VAL    MK_PLL_DDR_DIT_FRAC(763, 635, 1, 15)
+
+    .text
+    .set noreorder
+
+LEAF(lowlevel_init)
+	/* RTC Reset */
+	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
+	lw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	li      t2, 0x08000000
+	or      t1, t1, t2
+	sw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	nop
+	lw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	li      t2, 0xf7ffffff
+	and     t1, t1, t2
+	sw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
+	nop
+
+	/* RTC Force Wake */
+	li      t0, CKSEG1ADDR(QCA953X_RTC_BASE)
+	li      t1, 0x01
+	sw      t1, QCA953X_RTC_REG_SYNC_RESET(t0)
+	nop
+	nop
+
+	/* Wait for RTC in on state */
+1:
+	lw      t1, QCA953X_RTC_REG_SYNC_STATUS(t0)
+	andi    t1, t1, 0x02
+	beqz    t1, 1b
+	nop
+
+	li      t0, CKSEG1ADDR(QCA953X_SRIF_BASE)
+	li      t1, MK_DPLL2(2, 16)
+	sw      t1, QCA953X_SRIF_BB_DPLL2_REG(t0)
+	sw      t1, QCA953X_SRIF_PCIE_DPLL2_REG(t0)
+	sw      t1, QCA953X_SRIF_DDR_DPLL2_REG(t0)
+	sw      t1, QCA953X_SRIF_CPU_DPLL2_REG(t0)
+
+	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
+	lw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	ori     t1, PLL_CLK_CTRL_PLL_BYPASS
+	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	li      t1, PLL_CPU_CONF_VAL
+	sw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
+	nop
+
+	li      t1, PLL_DDR_CONF_VAL
+	sw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
+	nop
+
+	li      t1, PLL_CLK_CTRL_VAL
+	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	lw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
+	li      t2, ~QCA953X_PLL_CONFIG_PWD
+	and     t1, t1, t2
+	sw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
+	nop
+
+	lw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
+	li      t2, ~QCA953X_PLL_CONFIG_PWD
+	and     t1, t1, t2
+	sw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
+	nop
+
+	lw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	li      t2, ~PLL_CLK_CTRL_PLL_BYPASS
+	and     t1, t1, t2
+	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
+	nop
+
+	li      t1, PLL_DDR_DIT_FRAC_VAL
+	sw      t1, QCA953X_PLL_DDR_DIT_FRAC_REG(t0)
+	nop
+
+	li      t1, PLL_CPU_DIT_FRAC_VAL
+	sw      t1, QCA953X_PLL_CPU_DIT_FRAC_REG(t0)
+	nop
+
+	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
+	lui     t1, 0x03fc
+	sw      t1, 0xb4(t0)
+
+	nop
+	jr ra
+	 nop
+    END(lowlevel_init)
-- 
1.9.1

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

* [U-Boot] [PATCH v8 4/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores ar933x.
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
                   ` (2 preceding siblings ...)
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-04-09 18:34   ` Simon Glass
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 5/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores qca953x Wills Wang
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This is a simple pinctrl driver, it just support uart and spi pin-mux now.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/pinctrl/Kconfig                |   9 +++
 drivers/pinctrl/Makefile               |   1 +
 drivers/pinctrl/ath79/Makefile         |   5 ++
 drivers/pinctrl/ath79/pinctrl_ar933x.c | 136 +++++++++++++++++++++++++++++++++
 4 files changed, 151 insertions(+)
 create mode 100644 drivers/pinctrl/ath79/Makefile
 create mode 100644 drivers/pinctrl/ath79/pinctrl_ar933x.c

diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 2a69bab..854d5a5 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -105,6 +105,15 @@ config SPL_PINCONF
 
 if PINCTRL || SPL_PINCTRL
 
+config AR933X_PINCTRL
+	bool "QCA/Athores ar933x pin control driver"
+	depends on DM && SOC_AR933X
+	help
+	  Support pin multiplexing control on QCA/Athores ar933x SoCs.
+	  The driver is controlled by a device tree node which contains
+	  both the GPIO definitions and pin control functions for each
+	  available multiplex function.
+
 config ROCKCHIP_PINCTRL
 	bool "Rockchip pin control driver"
 	depends on DM
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index 37dc904..b99ed2f 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -6,6 +6,7 @@ obj-y					+= pinctrl-uclass.o
 obj-$(CONFIG_$(SPL_)PINCTRL_GENERIC)	+= pinctrl-generic.o
 
 obj-y					+= nxp/
+obj-$(CONFIG_ARCH_ATH79) += ath79/
 obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
 obj-$(CONFIG_PINCTRL_SANDBOX)	+= pinctrl-sandbox.o
 
diff --git a/drivers/pinctrl/ath79/Makefile b/drivers/pinctrl/ath79/Makefile
new file mode 100644
index 0000000..3fdcf6c
--- /dev/null
+++ b/drivers/pinctrl/ath79/Makefile
@@ -0,0 +1,5 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-$(CONFIG_AR933X_PINCTRL) += pinctrl_ar933x.o
diff --git a/drivers/pinctrl/ath79/pinctrl_ar933x.c b/drivers/pinctrl/ath79/pinctrl_ar933x.c
new file mode 100644
index 0000000..e3f64b6
--- /dev/null
+++ b/drivers/pinctrl/ath79/pinctrl_ar933x.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum periph_id {
+	PERIPH_ID_UART0,
+	PERIPH_ID_SPI0,
+	PERIPH_ID_NONE = -1,
+};
+
+struct ar933x_pinctrl_priv {
+	void __iomem *regs;
+};
+
+static void pinctrl_ar933x_spi_config(struct ar933x_pinctrl_priv *priv, int cs)
+{
+	switch (cs) {
+	case 0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				AR933X_GPIO(4), AR933X_GPIO(3) |
+				AR933X_GPIO(5) | AR933X_GPIO(2));
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_FUNC,
+			     AR933X_GPIO_FUNC_SPI_EN |
+			     AR933X_GPIO_FUNC_RES_TRUE);
+		break;
+	}
+}
+
+static void pinctrl_ar933x_uart_config(struct ar933x_pinctrl_priv *priv, int uart_id)
+{
+	switch (uart_id) {
+	case PERIPH_ID_UART0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				AR933X_GPIO(9), AR933X_GPIO(10));
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_FUNC,
+			     AR933X_GPIO_FUNC_UART_EN |
+			     AR933X_GPIO_FUNC_RES_TRUE);
+		break;
+	}
+}
+
+static int ar933x_pinctrl_request(struct udevice *dev, int func, int flags)
+{
+	struct ar933x_pinctrl_priv *priv = dev_get_priv(dev);
+
+	debug("%s: func=%x, flags=%x\n", __func__, func, flags);
+	switch (func) {
+	case PERIPH_ID_SPI0:
+		pinctrl_ar933x_spi_config(priv, flags);
+		break;
+	case PERIPH_ID_UART0:
+		pinctrl_ar933x_uart_config(priv, func);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int ar933x_pinctrl_get_periph_id(struct udevice *dev,
+					struct udevice *periph)
+{
+	u32 cell[2];
+	int ret;
+
+	ret = fdtdec_get_int_array(gd->fdt_blob, periph->of_offset,
+				   "interrupts", cell, ARRAY_SIZE(cell));
+	if (ret < 0)
+		return -EINVAL;
+
+	switch (cell[0]) {
+	case 128:
+		return PERIPH_ID_UART0;
+	case 129:
+		return PERIPH_ID_SPI0;
+	}
+	return -ENOENT;
+}
+
+static int ar933x_pinctrl_set_state_simple(struct udevice *dev,
+					   struct udevice *periph)
+{
+	int func;
+
+	func = ar933x_pinctrl_get_periph_id(dev, periph);
+	if (func < 0)
+		return func;
+	return ar933x_pinctrl_request(dev, func, 0);
+}
+
+static struct pinctrl_ops ar933x_pinctrl_ops = {
+	.set_state_simple	= ar933x_pinctrl_set_state_simple,
+	.request	= ar933x_pinctrl_request,
+	.get_periph_id	= ar933x_pinctrl_get_periph_id,
+};
+
+static int ar933x_pinctrl_probe(struct udevice *dev)
+{
+	struct ar933x_pinctrl_priv *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+
+	addr = dev_get_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR71XX_GPIO_SIZE,
+				 MAP_NOCACHE);
+	return 0;
+}
+
+static const struct udevice_id ar933x_pinctrl_ids[] = {
+	{ .compatible = "qca,ar933x-pinctrl" },
+	{ }
+};
+
+U_BOOT_DRIVER(pinctrl_ar933x) = {
+	.name		= "pinctrl_ar933x",
+	.id		= UCLASS_PINCTRL,
+	.of_match	= ar933x_pinctrl_ids,
+	.priv_auto_alloc_size = sizeof(struct ar933x_pinctrl_priv),
+	.ops		= &ar933x_pinctrl_ops,
+	.probe		= ar933x_pinctrl_probe,
+};
-- 
1.9.1

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

* [U-Boot] [PATCH v8 5/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores qca953x.
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
                   ` (3 preceding siblings ...)
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 4/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores ar933x Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-04-09 18:34   ` Simon Glass
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC Wills Wang
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This is a simple pinctrl driver, it just support uart and spi pin-mux now.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/pinctrl/Kconfig                 |   9 ++
 drivers/pinctrl/ath79/Makefile          |   1 +
 drivers/pinctrl/ath79/pinctrl_qca953x.c | 156 ++++++++++++++++++++++++++++++++
 3 files changed, 166 insertions(+)
 create mode 100644 drivers/pinctrl/ath79/pinctrl_qca953x.c

diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 854d5a5..567b766 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -114,6 +114,15 @@ config AR933X_PINCTRL
 	  both the GPIO definitions and pin control functions for each
 	  available multiplex function.
 
+config QCA953X_PINCTRL
+	bool "QCA/Athores qca953x pin control driver"
+	depends on DM && SOC_QCA953X
+	help
+	  Support pin multiplexing control on QCA/Athores qca953x SoCs.
+	  The driver is controlled by a device tree node which contains
+	  both the GPIO definitions and pin control functions for each
+	  available multiplex function.
+
 config ROCKCHIP_PINCTRL
 	bool "Rockchip pin control driver"
 	depends on DM
diff --git a/drivers/pinctrl/ath79/Makefile b/drivers/pinctrl/ath79/Makefile
index 3fdcf6c..dcea10a 100644
--- a/drivers/pinctrl/ath79/Makefile
+++ b/drivers/pinctrl/ath79/Makefile
@@ -3,3 +3,4 @@
 #
 
 obj-$(CONFIG_AR933X_PINCTRL) += pinctrl_ar933x.o
+obj-$(CONFIG_QCA953x_PINCTRL) += pinctrl_qca953x.o
diff --git a/drivers/pinctrl/ath79/pinctrl_qca953x.c b/drivers/pinctrl/ath79/pinctrl_qca953x.c
new file mode 100644
index 0000000..d02597e
--- /dev/null
+++ b/drivers/pinctrl/ath79/pinctrl_qca953x.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+enum periph_id {
+	PERIPH_ID_UART0,
+	PERIPH_ID_SPI0,
+	PERIPH_ID_NONE = -1,
+};
+
+struct qca953x_pinctrl_priv {
+	void __iomem *regs;
+};
+
+static void pinctrl_qca953x_spi_config(struct qca953x_pinctrl_priv *priv, int cs)
+{
+	switch (cs) {
+	case 0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				QCA953X_GPIO(5) | QCA953X_GPIO(6) |
+				QCA953X_GPIO(7), QCA953X_GPIO(8));
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_OUT_FUNC1,
+				QCA953X_GPIO_MUX_MASK(8) |
+				QCA953X_GPIO_MUX_MASK(16) |
+				QCA953X_GPIO_MUX_MASK(24),
+				(QCA953X_GPIO_OUT_MUX_SPI_CS0 << 8) |
+				(QCA953X_GPIO_OUT_MUX_SPI_CLK << 16) |
+				(QCA953X_GPIO_OUT_MUX_SPI_MOSI << 24));
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_IN_ENABLE0,
+				QCA953X_GPIO_MUX_MASK(0),
+				QCA953X_GPIO_IN_MUX_SPI_DATA_IN);
+
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_OUT,
+			     QCA953X_GPIO(8));
+		break;
+	}
+}
+
+static void pinctrl_qca953x_uart_config(struct qca953x_pinctrl_priv *priv, int uart_id)
+{
+	switch (uart_id) {
+	case PERIPH_ID_UART0:
+		clrsetbits_be32(priv->regs + AR71XX_GPIO_REG_OE,
+				QCA953X_GPIO(9), QCA953X_GPIO(10));
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_OUT_FUNC2,
+				QCA953X_GPIO_MUX_MASK(16),
+				QCA953X_GPIO_OUT_MUX_UART0_SOUT << 16);
+
+		clrsetbits_be32(priv->regs + QCA953X_GPIO_REG_IN_ENABLE0,
+				QCA953X_GPIO_MUX_MASK(8),
+				QCA953X_GPIO_IN_MUX_UART0_SIN << 8);
+
+		setbits_be32(priv->regs + AR71XX_GPIO_REG_OUT,
+			     QCA953X_GPIO(10));
+		break;
+	}
+}
+
+static int qca953x_pinctrl_request(struct udevice *dev, int func, int flags)
+{
+	struct qca953x_pinctrl_priv *priv = dev_get_priv(dev);
+
+	debug("%s: func=%x, flags=%x\n", __func__, func, flags);
+	switch (func) {
+	case PERIPH_ID_SPI0:
+		pinctrl_qca953x_spi_config(priv, flags);
+		break;
+	case PERIPH_ID_UART0:
+		pinctrl_qca953x_uart_config(priv, func);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int qca953x_pinctrl_get_periph_id(struct udevice *dev,
+					struct udevice *periph)
+{
+	u32 cell[2];
+	int ret;
+
+	ret = fdtdec_get_int_array(gd->fdt_blob, periph->of_offset,
+				   "interrupts", cell, ARRAY_SIZE(cell));
+	if (ret < 0)
+		return -EINVAL;
+
+	switch (cell[0]) {
+	case 128:
+		return PERIPH_ID_UART0;
+	case 129:
+		return PERIPH_ID_SPI0;
+	}
+	return -ENOENT;
+}
+
+static int qca953x_pinctrl_set_state_simple(struct udevice *dev,
+					   struct udevice *periph)
+{
+	int func;
+
+	func = qca953x_pinctrl_get_periph_id(dev, periph);
+	if (func < 0)
+		return func;
+	return qca953x_pinctrl_request(dev, func, 0);
+}
+
+static struct pinctrl_ops qca953x_pinctrl_ops = {
+	.set_state_simple	= qca953x_pinctrl_set_state_simple,
+	.request	= qca953x_pinctrl_request,
+	.get_periph_id	= qca953x_pinctrl_get_periph_id,
+};
+
+static int qca953x_pinctrl_probe(struct udevice *dev)
+{
+	struct qca953x_pinctrl_priv *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+
+	addr = dev_get_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR71XX_GPIO_SIZE,
+				 MAP_NOCACHE);
+	return 0;
+}
+
+static const struct udevice_id qca953x_pinctrl_ids[] = {
+	{ .compatible = "qca,qca953x-pinctrl" },
+	{ }
+};
+
+U_BOOT_DRIVER(pinctrl_qca953x) = {
+	.name		= "pinctrl_qca953x",
+	.id		= UCLASS_PINCTRL,
+	.of_match	= qca953x_pinctrl_ids,
+	.priv_auto_alloc_size = sizeof(struct qca953x_pinctrl_priv),
+	.ops		= &qca953x_pinctrl_ops,
+	.probe		= qca953x_pinctrl_probe,
+};
-- 
1.9.1

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

* [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
                   ` (4 preceding siblings ...)
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 5/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores qca953x Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-04-09 18:34   ` Simon Glass
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 7/9] drivers: spi: add spi support for QCA/Atheros ath79 SOCs Wills Wang
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This patch add support for ar933x serial.

Reviewed-by: Thomas Chou <thomas@wytron.com.tw>
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Remove ath79_serial_write/read
- Use pinctrl for serial
- Add Kconfig dependence for serial option

Changes in v7:
- remove map_physmem for debug port

Changes in v6:
- Remove wait loop in putc and getc
- Use map_physmem instead of KSEG1ADDR

Changes in v5:
- remove ar933x_serial_platdata
- Import document "qca,ar9330-uart.txt" from kernel
- Add support for debug UART

Changes in v4:
- Auto calculate baudrate for serial driver
- Move pinctrl code in serial driver into arch/mips/mach-ath79
- Use get_serial_clock to serial clock source

Changes in v3:
- Convert serial driver to driver model

Changes in v2:
- Move serial driver code into drivers/serial

 .../serial/qca,ar9330-uart.txt                     |  24 ++
 drivers/serial/Kconfig                             |  18 ++
 drivers/serial/Makefile                            |   1 +
 drivers/serial/serial_ar933x.c                     | 255 +++++++++++++++++++++
 4 files changed, 298 insertions(+)
 create mode 100644 doc/device-tree-bindings/serial/qca,ar9330-uart.txt
 create mode 100644 drivers/serial/serial_ar933x.c

diff --git a/doc/device-tree-bindings/serial/qca,ar9330-uart.txt b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
new file mode 100644
index 0000000..ec576a1
--- /dev/null
+++ b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
@@ -0,0 +1,24 @@
+* Qualcomm Atheros AR9330 High-Speed UART
+
+Required properties:
+
+- compatible: Must be "qca,ar9330-uart"
+
+- reg: Specifies the physical base address of the controller and
+  the length of the memory mapped region.
+
+Additional requirements:
+
+  Each UART port must have an alias correctly numbered in "aliases"
+  node.
+
+Example:
+
+	aliases {
+		serial0 = &uart0;
+	};
+
+	uart0: uart at 18020000 {
+		compatible = "qca,ar9330-uart";
+		reg = <0x18020000 0x14>;
+	};
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 92d4212..d451441 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -89,6 +89,15 @@ config DEBUG_UART_ALTERA_UART
 	  You will need to provide parameters to make this work. The driver will
 	  be available until the real driver model serial is running.
 
+config DEBUG_UART_AR933X
+	bool "QCA/Atheros ar933x"
+	depends on AR933X_UART
+	help
+	  Select this to enable a debug UART using the ar933x uart driver.
+	  You will need to provide parameters to make this work. The
+	  driver will be available until the real driver model serial is
+	  running.
+
 config DEBUG_UART_NS16550
 	bool "ns16550"
 	help
@@ -254,6 +263,15 @@ config ALTERA_UART
 	  Select this to enable an UART for Altera devices. Please find
 	  details on the "Embedded Peripherals IP User Guide" of Altera.
 
+config AR933X_UART
+	bool "QCA/Atheros ar933x UART support"
+	depends on DM_SERIAL && SOC_AR933X
+	help
+	  Select this to enable UART support for QCA/Atheros ar933x
+	  devices. This driver uses driver model and requires a device
+	  tree binding to operate, please refer to the document at
+	  doc/device-tree-bindings/serial/qca,ar9330-uart.txt.
+
 config FSL_LPUART
 	bool "Freescale LPUART support"
 	help
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 05bdf56..42e493a 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -17,6 +17,7 @@ endif
 
 obj-$(CONFIG_ALTERA_UART) += altera_uart.o
 obj-$(CONFIG_ALTERA_JTAG_UART) += altera_jtag_uart.o
+obj-$(CONFIG_AR933X_UART) += serial_ar933x.o
 obj-$(CONFIG_ARM_DCC) += arm_dcc.o
 obj-$(CONFIG_ATMEL_USART) += atmel_usart.o
 obj-$(CONFIG_EFI_APP) += serial_efi.o
diff --git a/drivers/serial/serial_ar933x.c b/drivers/serial/serial_ar933x.c
new file mode 100644
index 0000000..d43f9c9
--- /dev/null
+++ b/drivers/serial/serial_ar933x.c
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <div64.h>
+#include <errno.h>
+#include <serial.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+#define AR933X_UART_DATA_REG            0x00
+#define AR933X_UART_CS_REG              0x04
+#define AR933X_UART_CLK_REG             0x08
+
+#define AR933X_UART_DATA_TX_RX_MASK     0xff
+#define AR933X_UART_DATA_RX_CSR         BIT(8)
+#define AR933X_UART_DATA_TX_CSR         BIT(9)
+#define AR933X_UART_CS_IF_MODE_S        2
+#define AR933X_UART_CS_IF_MODE_M        0x3
+#define AR933X_UART_CS_IF_MODE_DTE      1
+#define AR933X_UART_CS_IF_MODE_DCE      2
+#define AR933X_UART_CS_TX_RDY_ORIDE     BIT(7)
+#define AR933X_UART_CS_RX_RDY_ORIDE     BIT(8)
+#define AR933X_UART_CLK_STEP_M          0xffff
+#define AR933X_UART_CLK_SCALE_M         0xfff
+#define AR933X_UART_CLK_SCALE_S         16
+#define AR933X_UART_CLK_STEP_S          0
+
+struct ar933x_serial_priv {
+	void __iomem *regs;
+};
+
+/*
+ * baudrate = (clk / (scale + 1)) * (step * (1 / 2^17))
+ */
+static u32 ar933x_serial_get_baud(u32 clk, u32 scale, u32 step)
+{
+	u64 t;
+	u32 div;
+
+	div = (2 << 16) * (scale + 1);
+	t = clk;
+	t *= step;
+	t += (div / 2);
+	do_div(t, div);
+
+	return t;
+}
+
+static void ar933x_serial_get_scale_step(u32 clk, u32 baud,
+					 u32 *scale, u32 *step)
+{
+	u32 tscale, baudrate;
+	long min_diff;
+
+	*scale = 0;
+	*step = 0;
+
+	min_diff = baud;
+	for (tscale = 0; tscale < AR933X_UART_CLK_SCALE_M; tscale++) {
+		u64 tstep;
+		int diff;
+
+		tstep = baud * (tscale + 1);
+		tstep *= (2 << 16);
+		do_div(tstep, clk);
+
+		if (tstep > AR933X_UART_CLK_STEP_M)
+			break;
+
+		baudrate = ar933x_serial_get_baud(clk, tscale, tstep);
+		diff = abs(baudrate - baud);
+		if (diff < min_diff) {
+			min_diff = diff;
+			*scale = tscale;
+			*step = tstep;
+		}
+	}
+}
+
+static int ar933x_serial_setbrg(struct udevice *dev, int baudrate)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 val, scale, step;
+
+	val = get_serial_clock();
+	ar933x_serial_get_scale_step(val, baudrate, &scale, &step);
+
+	val  = (scale & AR933X_UART_CLK_SCALE_M)
+			<< AR933X_UART_CLK_SCALE_S;
+	val |= (step & AR933X_UART_CLK_STEP_M)
+			<< AR933X_UART_CLK_STEP_S;
+	writel(val, priv->regs + AR933X_UART_CLK_REG);
+
+	return 0;
+}
+
+static int ar933x_serial_putc(struct udevice *dev, const char c)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 data;
+
+	data = readl(priv->regs + AR933X_UART_DATA_REG);
+	if (!(data & AR933X_UART_DATA_TX_CSR))
+		return -EAGAIN;
+
+	data  = (u32)c | AR933X_UART_DATA_TX_CSR;
+	writel(data, priv->regs + AR933X_UART_DATA_REG);
+
+	return 0;
+}
+
+static int ar933x_serial_getc(struct udevice *dev)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 data;
+
+	data = readl(priv->regs + AR933X_UART_DATA_REG);
+	if (!(data & AR933X_UART_DATA_RX_CSR))
+		return -EAGAIN;
+
+	writel(AR933X_UART_DATA_RX_CSR, priv->regs + AR933X_UART_DATA_REG);
+	return data & AR933X_UART_DATA_TX_RX_MASK;
+}
+
+static int ar933x_serial_pending(struct udevice *dev, bool input)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	u32 data;
+
+	data = readl(priv->regs + AR933X_UART_DATA_REG);
+	if (input)
+		return (data & AR933X_UART_DATA_RX_CSR) ? 1 : 0;
+	else
+		return (data & AR933X_UART_DATA_TX_CSR) ? 0 : 1;
+}
+
+static int ar933x_serial_probe(struct udevice *dev)
+{
+	struct ar933x_serial_priv *priv = dev_get_priv(dev);
+	struct udevice *pinctrl;
+	fdt_addr_t addr;
+	u32 val;
+	int ret;
+
+	ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
+	if (ret)
+		return ret;
+	ret = pinctrl_get_periph_id(pinctrl, dev);
+	if (ret < 0)
+		return ret;
+	ret = pinctrl_request(pinctrl, ret, 0);
+	if (ret < 0)
+		return ret;
+
+	addr = dev_get_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR933X_UART_SIZE,
+				 MAP_NOCACHE);
+
+	/*
+	 * UART controller configuration:
+	 * - no DMA
+	 * - no interrupt
+	 * - DCE mode
+	 * - no flow control
+	 * - set RX ready oride
+	 * - set TX ready oride
+	 */
+	val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
+	      AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
+	writel(val, priv->regs + AR933X_UART_CS_REG);
+	return 0;
+}
+
+static const struct dm_serial_ops ar933x_serial_ops = {
+	.putc = ar933x_serial_putc,
+	.pending = ar933x_serial_pending,
+	.getc = ar933x_serial_getc,
+	.setbrg = ar933x_serial_setbrg,
+};
+
+static const struct udevice_id ar933x_serial_ids[] = {
+	{ .compatible = "qca,ar9330-uart" },
+	{ }
+};
+
+U_BOOT_DRIVER(serial_ar933x) = {
+	.name   = "serial_ar933x",
+	.id = UCLASS_SERIAL,
+	.of_match = ar933x_serial_ids,
+	.priv_auto_alloc_size = sizeof(struct ar933x_serial_priv),
+	.probe = ar933x_serial_probe,
+	.ops    = &ar933x_serial_ops,
+	.flags = DM_FLAG_PRE_RELOC,
+};
+
+#ifdef CONFIG_DEBUG_UART_AR933X
+
+#include <debug_uart.h>
+
+static inline void _debug_uart_init(void)
+{
+	void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
+	u32 val, scale, step;
+
+	/*
+	 * UART controller configuration:
+	 * - no DMA
+	 * - no interrupt
+	 * - DCE mode
+	 * - no flow control
+	 * - set RX ready oride
+	 * - set TX ready oride
+	 */
+	val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
+	      AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
+	writel(val, regs + AR933X_UART_CS_REG);
+
+	ar933x_serial_get_scale_step(CONFIG_DEBUG_UART_CLOCK,
+				     CONFIG_BAUDRATE, &scale, &step);
+
+	val  = (scale & AR933X_UART_CLK_SCALE_M)
+			<< AR933X_UART_CLK_SCALE_S;
+	val |= (step & AR933X_UART_CLK_STEP_M)
+			<< AR933X_UART_CLK_STEP_S;
+	writel(val, regs + AR933X_UART_CLK_REG);
+}
+
+static inline void _debug_uart_putc(int c)
+{
+	void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
+	u32 data;
+
+	do {
+		data = readl(regs + AR933X_UART_DATA_REG);
+	} while (!(data & AR933X_UART_DATA_TX_CSR));
+
+	data  = (u32)c | AR933X_UART_DATA_TX_CSR;
+	writel(data, regs + AR933X_UART_DATA_REG);
+}
+
+DEBUG_UART_FUNCS
+
+#endif
-- 
1.9.1

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

* [U-Boot] [PATCH v8 7/9] drivers: spi: add spi support for QCA/Atheros ath79 SOCs
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
                   ` (5 preceding siblings ...)
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 8/9] mips: ath79: add AP121 reference board Wills Wang
  2016-03-16  9:00 ` [U-Boot] [PATCH v8 9/9] mips: ath79: add AP143 " Wills Wang
  8 siblings, 0 replies; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This patch add a compatible spi driver for ath79 series SOC.

Reviewed-by: Thomas Chou <thomas@wytron.com.tw>
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Remove ath79_spi_write/read
- Use pinctrl for spi
- Add Kconfig dependence for spi option
- Use dev_get_parent

Changes in v7:
- Define spi_cs_activate/spi_cs_deactivate
- Rename MHZ to ATH79_SPI_MHZ
- Use clrsetbits_32

Changes in v6:
- Add rrw_delay in ath79_spi_priv for more accurate timing
- Remove ath79_spi_delay
- Calculate delay in ath79_spi_set_speed

Changes in v5:
- remove ar933x_spi_platdata
- Import document "spi-ath79.txt" from kernel
- Add delay for bitbang operation

Changes in v4:
- Use get_bus_freq instead of hardcode in SPI driver

Changes in v3:
- Convert spi driver to driver model

Changes in v2:
- Add a compatible spi driver

 doc/device-tree-bindings/spi/spi-ath79.txt |  19 +++
 drivers/spi/Kconfig                        |   9 ++
 drivers/spi/Makefile                       |   1 +
 drivers/spi/ath79_spi.c                    | 240 +++++++++++++++++++++++++++++
 4 files changed, 269 insertions(+)
 create mode 100644 doc/device-tree-bindings/spi/spi-ath79.txt
 create mode 100644 drivers/spi/ath79_spi.c

diff --git a/doc/device-tree-bindings/spi/spi-ath79.txt b/doc/device-tree-bindings/spi/spi-ath79.txt
new file mode 100644
index 0000000..3fd9d67
--- /dev/null
+++ b/doc/device-tree-bindings/spi/spi-ath79.txt
@@ -0,0 +1,19 @@
+Binding for Qualcomm Atheros AR7xxx/AR9xxx SPI controller
+
+Required properties:
+- compatible: has to be "qca,<soc-type>-spi", "qca,ar7100-spi" as fallback.
+- reg: Base address and size of the controllers memory area
+- #address-cells: <1>, as required by generic SPI binding.
+- #size-cells: <0>, also as required by generic SPI binding.
+
+Child nodes as per the generic SPI binding.
+
+Example:
+
+	spi at 1f000000 {
+		compatible = "qca,ar9132-spi", "qca,ar7100-spi";
+		reg = <0x1f000000 0x10>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
index 2cdb110..c6662b3 100644
--- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig
@@ -23,6 +23,15 @@ config ALTERA_SPI
 	  IP core. Please find details on the "Embedded Peripherals IP
 	  User Guide" of Altera.
 
+config ATH79_SPI
+	bool "Atheros SPI driver"
+	depends on ARCH_ATH79
+	help
+	  Enable the Atheros ar7xxx/ar9xxx SoC SPI driver, it was used
+	  to access SPI NOR flash and other SPI peripherals. This driver
+	  uses driver model and requires a device tree binding to operate.
+	  please refer to doc/device-tree-bindings/spi/spi-ath79.txt.
+
 config CADENCE_QSPI
 	bool "Cadence QSPI driver"
 	help
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
index 3eca745..7fb2926 100644
--- a/drivers/spi/Makefile
+++ b/drivers/spi/Makefile
@@ -17,6 +17,7 @@ endif
 
 obj-$(CONFIG_ALTERA_SPI) += altera_spi.o
 obj-$(CONFIG_ARMADA100_SPI) += armada100_spi.o
+obj-$(CONFIG_ATH79_SPI) += ath79_spi.o
 obj-$(CONFIG_ATMEL_DATAFLASH_SPI) += atmel_dataflash_spi.o
 obj-$(CONFIG_ATMEL_SPI) += atmel_spi.o
 obj-$(CONFIG_BFIN_SPI) += bfin_spi.o
diff --git a/drivers/spi/ath79_spi.c b/drivers/spi/ath79_spi.c
new file mode 100644
index 0000000..0c1022d
--- /dev/null
+++ b/drivers/spi/ath79_spi.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <spi.h>
+#include <dm.h>
+#include <div64.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <dm/pinctrl.h>
+#include <mach/ar71xx_regs.h>
+
+/* CLOCK_DIVIDER = 3 (SPI clock = 200 / 8 ~ 25 MHz) */
+#define ATH79_SPI_CLK_DIV(x)           (((x) >> 1) - 1)
+#define ATH79_SPI_RRW_DELAY_FACTOR     12000
+#define ATH79_SPI_MHZ                  (1000 * 1000)
+
+struct ath79_spi_priv {
+	void __iomem *regs;
+	u32 rrw_delay;
+};
+
+static void spi_cs_activate(struct udevice *dev)
+{
+	struct udevice *bus = dev_get_parent(dev);
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+
+	writel(AR71XX_SPI_FS_GPIO, priv->regs + AR71XX_SPI_REG_FS);
+	writel(AR71XX_SPI_IOC_CS_ALL, priv->regs + AR71XX_SPI_REG_IOC);
+}
+
+static void spi_cs_deactivate(struct udevice *dev)
+{
+	struct udevice *bus = dev_get_parent(dev);
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+
+	writel(AR71XX_SPI_IOC_CS_ALL, priv->regs + AR71XX_SPI_REG_IOC);
+	writel(0, priv->regs + AR71XX_SPI_REG_FS);
+}
+
+static int ath79_spi_claim_bus(struct udevice *dev)
+{
+	return 0;
+}
+
+static int ath79_spi_release_bus(struct udevice *dev)
+{
+	return 0;
+}
+
+static int ath79_spi_xfer(struct udevice *dev, unsigned int bitlen,
+		const void *dout, void *din, unsigned long flags)
+{
+	struct udevice *bus = dev_get_parent(dev);
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+	struct dm_spi_slave_platdata *slave = dev_get_parent_platdata(dev);
+	u8 *rx = din;
+	const u8 *tx = dout;
+	u8 curbyte, curbitlen, restbits;
+	u32 bytes = bitlen / 8;
+	u32 out, in;
+	u64 tick;
+
+	if (flags & SPI_XFER_BEGIN)
+		spi_cs_activate(dev);
+
+	restbits = (bitlen % 8);
+	if (restbits)
+		bytes++;
+
+	out = AR71XX_SPI_IOC_CS_ALL & ~(AR71XX_SPI_IOC_CS(slave->cs));
+	while (bytes > 0) {
+		bytes--;
+		curbyte = 0;
+		if (tx)
+			curbyte = *tx++;
+
+		if (restbits && !bytes) {
+			curbitlen = restbits;
+			curbyte <<= 8 - restbits;
+		} else {
+			curbitlen = 8;
+		}
+
+		for (curbyte <<= (8 - curbitlen); curbitlen; curbitlen--) {
+			if (curbyte & 0x80)
+				out |= AR71XX_SPI_IOC_DO;
+			else
+				out &= ~(AR71XX_SPI_IOC_DO);
+
+			writel(out, priv->regs + AR71XX_SPI_REG_IOC);
+
+			/* delay for low level */
+			if (priv->rrw_delay) {
+				tick = get_ticks() + priv->rrw_delay;
+				while (get_ticks() < tick)
+					/*NOP*/;
+			}
+
+			writel(out | AR71XX_SPI_IOC_CLK,
+			       priv->regs + AR71XX_SPI_REG_IOC);
+
+			/* delay for high level */
+			if (priv->rrw_delay) {
+				tick = get_ticks() + priv->rrw_delay;
+				while (get_ticks() < tick)
+					/*NOP*/;
+			}
+
+			curbyte <<= 1;
+		}
+
+		if (!bytes)
+			writel(out, priv->regs + AR71XX_SPI_REG_IOC);
+
+		in = readl(priv->regs + AR71XX_SPI_REG_RDS);
+		if (rx) {
+			if (restbits && !bytes)
+				*rx++ = (in << (8 - restbits));
+			else
+				*rx++ = in;
+		}
+	}
+
+	if (flags & SPI_XFER_END)
+		spi_cs_deactivate(dev);
+
+	return 0;
+}
+
+
+static int ath79_spi_set_speed(struct udevice *bus, uint speed)
+{
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+	u32 val, div = 0;
+	u64 time;
+
+	if (speed)
+		div = get_bus_freq(0) / speed;
+
+	if (div > 63)
+		div = 63;
+
+	if (div < 5)
+		div = 5;
+
+	/* calculate delay */
+	time = get_tbclk();
+	do_div(time, speed / 2);
+	val = get_bus_freq(0) / ATH79_SPI_MHZ;
+	val = ATH79_SPI_RRW_DELAY_FACTOR / val;
+	if (time > val)
+		priv->rrw_delay = time - val + 1;
+	else
+		priv->rrw_delay = 0;
+
+	writel(AR71XX_SPI_FS_GPIO, priv->regs + AR71XX_SPI_REG_FS);
+	clrsetbits_be32(priv->regs + AR71XX_SPI_REG_CTRL,
+			AR71XX_SPI_CTRL_DIV_MASK,
+			ATH79_SPI_CLK_DIV(div));
+	writel(0, priv->regs + AR71XX_SPI_REG_FS);
+	return 0;
+}
+
+static int ath79_spi_set_mode(struct udevice *bus, uint mode)
+{
+	return 0;
+}
+
+static int ath79_spi_probe(struct udevice *bus)
+{
+	struct ath79_spi_priv *priv = dev_get_priv(bus);
+	struct udevice *pinctrl;
+	fdt_addr_t addr;
+	int ret;
+
+	ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
+	if (ret)
+		return ret;
+	ret = pinctrl_get_periph_id(pinctrl, bus);
+	if (ret < 0)
+		return ret;
+	ret = pinctrl_request(pinctrl, ret, 0);
+	if (ret < 0)
+		return ret;
+
+	addr = dev_get_addr(bus);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	priv->regs = map_physmem(addr,
+				 AR71XX_SPI_SIZE,
+				 MAP_NOCACHE);
+
+	/* Init SPI Hardware, disable remap, set clock */
+	writel(AR71XX_SPI_FS_GPIO, priv->regs + AR71XX_SPI_REG_FS);
+	writel(AR71XX_SPI_CTRL_RD | ATH79_SPI_CLK_DIV(8),
+	       priv->regs + AR71XX_SPI_REG_CTRL);
+	writel(0, priv->regs + AR71XX_SPI_REG_FS);
+
+	return 0;
+}
+
+static int ath79_cs_info(struct udevice *bus, uint cs,
+			   struct spi_cs_info *info)
+{
+	/* Always allow activity on CS 0/1/2 */
+	if (cs >= 3)
+		return -ENODEV;
+
+	return 0;
+}
+
+static const struct dm_spi_ops ath79_spi_ops = {
+	.claim_bus  = ath79_spi_claim_bus,
+	.release_bus    = ath79_spi_release_bus,
+	.xfer       = ath79_spi_xfer,
+	.set_speed  = ath79_spi_set_speed,
+	.set_mode   = ath79_spi_set_mode,
+	.cs_info    = ath79_cs_info,
+};
+
+static const struct udevice_id ath79_spi_ids[] = {
+	{ .compatible = "qca,ar7100-spi" },
+	{}
+};
+
+U_BOOT_DRIVER(ath79_spi) = {
+	.name   = "ath79_spi",
+	.id = UCLASS_SPI,
+	.of_match = ath79_spi_ids,
+	.ops    = &ath79_spi_ops,
+	.priv_auto_alloc_size = sizeof(struct ath79_spi_priv),
+	.probe  = ath79_spi_probe,
+};
-- 
1.9.1

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

* [U-Boot] [PATCH v8 8/9] mips: ath79: add AP121 reference board
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
                   ` (6 preceding siblings ...)
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 7/9] drivers: spi: add spi support for QCA/Atheros ath79 SOCs Wills Wang
@ 2016-03-16  8:59 ` Wills Wang
  2016-03-16  9:00 ` [U-Boot] [PATCH v8 9/9] mips: ath79: add AP143 " Wills Wang
  8 siblings, 0 replies; 30+ messages in thread
From: Wills Wang @ 2016-03-16  8:59 UTC (permalink / raw)
  To: u-boot

This patch add board-level code and base DT for AP121.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Move board/ath79/ap121 into board/qca/ap121
- Move SYS_VENDOR into board-level for ap121

Changes in v7:
- Use KSEG1 address for debug port in ap121

Changes in v6:
- Convert SZ_XXX into hex in ap121.h
- Remove useless CONFIG_SYS_INIT_SP_OFFSET in ap121.h
- Add board_early_init_f for DDR and pin initialization
- Select UART and SPI in ap121_defconfig

Changes in v5:
- Move CONFIG_SYS_TEXT_BASE into ap121.h, and remove config.mk
- Remove useless README file
- Remove useless checkboard function

Changes in v4: None
Changes in v3:
- Add support for device tree

Changes in v2:
- Add a reference board implemention

 arch/mips/dts/Makefile       |  1 +
 arch/mips/dts/ap121.dts      | 43 ++++++++++++++++++++++
 arch/mips/dts/ar933x.dtsi    | 82 +++++++++++++++++++++++++++++++++++++++++
 arch/mips/mach-ath79/Kconfig | 11 ++++++
 board/qca/ap121/Kconfig      | 12 ++++++
 board/qca/ap121/MAINTAINERS  |  6 +++
 board/qca/ap121/Makefile     |  5 +++
 board/qca/ap121/ap121.c      | 50 +++++++++++++++++++++++++
 configs/ap121_defconfig      | 46 +++++++++++++++++++++++
 include/configs/ap121.h      | 87 ++++++++++++++++++++++++++++++++++++++++++++
 10 files changed, 343 insertions(+)
 create mode 100644 arch/mips/dts/ap121.dts
 create mode 100644 arch/mips/dts/ar933x.dtsi
 create mode 100644 board/qca/ap121/Kconfig
 create mode 100644 board/qca/ap121/MAINTAINERS
 create mode 100644 board/qca/ap121/Makefile
 create mode 100644 board/qca/ap121/ap121.c
 create mode 100644 configs/ap121_defconfig
 create mode 100644 include/configs/ap121.h

diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile
index b513918..30e5c68 100644
--- a/arch/mips/dts/Makefile
+++ b/arch/mips/dts/Makefile
@@ -2,6 +2,7 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
+dtb-$(CONFIG_TARGET_AP121) += ap121.dtb
 dtb-$(CONFIG_TARGET_PIC32MZDASK) += pic32mzda_sk.dtb
 
 targets += $(dtb-y)
diff --git a/arch/mips/dts/ap121.dts b/arch/mips/dts/ap121.dts
new file mode 100644
index 0000000..e31f601
--- /dev/null
+++ b/arch/mips/dts/ap121.dts
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/dts-v1/;
+#include "ar933x.dtsi"
+
+/ {
+	model = "AP121 Reference Board";
+	compatible = "qca,ap121", "qca,ar933x";
+
+	aliases {
+		spi0 = &spi0;
+		serial0 = &uart0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+};
+
+&xtal {
+	clock-frequency = <25000000>;
+};
+
+&uart0 {
+	status = "okay";
+};
+
+&spi0 {
+	spi-max-frequency = <25000000>;
+	status = "okay";
+	spi-flash at 0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-flash";
+		memory-map = <0x9f000000 0x00800000>;
+		spi-max-frequency = <25000000>;
+		reg = <0>;
+	};
+};
diff --git a/arch/mips/dts/ar933x.dtsi b/arch/mips/dts/ar933x.dtsi
new file mode 100644
index 0000000..11f60a2
--- /dev/null
+++ b/arch/mips/dts/ar933x.dtsi
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "skeleton.dtsi"
+
+/ {
+	compatible = "qca,ar933x";
+
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu at 0 {
+			device_type = "cpu";
+			compatible = "mips,mips24Kc";
+			reg = <0>;
+		};
+	};
+
+	clocks {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		xtal: xtal {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-output-names = "xtal";
+		};
+	};
+
+	pinctrl {
+		u-boot,dm-pre-reloc;
+		compatible = "qca,ar933x-pinctrl";
+		ranges;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		reg = <0x18040000 0x100>;
+	};
+
+	ahb {
+		compatible = "simple-bus";
+		ranges;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		apb {
+			compatible = "simple-bus";
+			ranges;
+
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			uart0: uart at 18020000 {
+				compatible = "qca,ar9330-uart";
+				reg = <0x18020000 0x20>;
+				interrupts = <128 IRQ_TYPE_LEVEL_HIGH>;
+
+				status = "disabled";
+			};
+		};
+
+		spi0: spi at 1f000000 {
+			compatible = "qca,ar7100-spi";
+			reg = <0x1f000000 0x10>;
+			interrupts = <129 IRQ_TYPE_LEVEL_HIGH>;
+
+			status = "disabled";
+
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+	};
+};
diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
index e35f1b5..c3012f8 100644
--- a/arch/mips/mach-ath79/Kconfig
+++ b/arch/mips/mach-ath79/Kconfig
@@ -22,4 +22,15 @@ config SOC_QCA953X
 	help
 	  This supports QCA/Atheros qca953x family SOCs.
 
+choice
+	prompt "Board select"
+
+config TARGET_AP121
+	bool "AP121 Reference Board"
+	select SOC_AR933X
+
+endchoice
+
+source "board/qca/ap121/Kconfig"
+
 endmenu
diff --git a/board/qca/ap121/Kconfig b/board/qca/ap121/Kconfig
new file mode 100644
index 0000000..f7e768a
--- /dev/null
+++ b/board/qca/ap121/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_AP121
+
+config SYS_VENDOR
+	default "qca"
+
+config SYS_BOARD
+	default "ap121"
+
+config SYS_CONFIG_NAME
+	default "ap121"
+
+endif
diff --git a/board/qca/ap121/MAINTAINERS b/board/qca/ap121/MAINTAINERS
new file mode 100644
index 0000000..8b02988
--- /dev/null
+++ b/board/qca/ap121/MAINTAINERS
@@ -0,0 +1,6 @@
+AP121 BOARD
+M:	Wills Wang <wills.wang@live.com>
+S:	Maintained
+F:	board/qca/ap121/
+F:	include/configs/ap121.h
+F:	configs/ap121_defconfig
diff --git a/board/qca/ap121/Makefile b/board/qca/ap121/Makefile
new file mode 100644
index 0000000..ced5432
--- /dev/null
+++ b/board/qca/ap121/Makefile
@@ -0,0 +1,5 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	= ap121.o
diff --git a/board/qca/ap121/ap121.c b/board/qca/ap121/ap121.c
new file mode 100644
index 0000000..d6c60fe
--- /dev/null
+++ b/board/qca/ap121/ap121.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ddr.h>
+#include <debug_uart.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+void board_debug_uart_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+			   MAP_NOCACHE);
+
+	/*
+	 * GPIO9 as input, GPIO10 as output
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_OE);
+	val &= ~AR933X_GPIO(9);
+	val |= AR933X_GPIO(10);
+	writel(val, regs + AR71XX_GPIO_REG_OE);
+
+	/*
+	 * Enable UART, GPIO9 as UART_SI, GPIO10 as UART_SO
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_FUNC);
+	val |= AR933X_GPIO_FUNC_UART_EN | AR933X_GPIO_FUNC_RES_TRUE;
+	writel(val, regs + AR71XX_GPIO_REG_FUNC);
+}
+#endif
+
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
+	ddr_init();
+	return 0;
+}
diff --git a/configs/ap121_defconfig b/configs/ap121_defconfig
new file mode 100644
index 0000000..6ba1e29
--- /dev/null
+++ b/configs/ap121_defconfig
@@ -0,0 +1,46 @@
+CONFIG_MIPS=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_DM_SERIAL=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_ARCH_ATH79=y
+CONFIG_TARGET_AP121=y
+CONFIG_DEFAULT_DEVICE_TREE="ap121"
+CONFIG_SYS_PROMPT="ap121 # "
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_CRC32 is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_NET is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PINCTRL=y
+CONFIG_PINCONF=y
+CONFIG_AR933X_PINCTRL=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_AR933X=y
+CONFIG_DEBUG_UART_BASE=0xb8020000
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_AR933X_UART=y
+CONFIG_ATH79_SPI=y
diff --git a/include/configs/ap121.h b/include/configs/ap121.h
new file mode 100644
index 0000000..b06969b
--- /dev/null
+++ b/include/configs/ap121.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_SYS_TEXT_BASE            0x9f000000
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_SYS_HZ                   1000
+#define CONFIG_SYS_MHZ                  200
+#define CONFIG_SYS_MIPS_TIMER_FREQ      (CONFIG_SYS_MHZ * 1000000)
+
+/* Cache Configuration */
+#define CONFIG_SYS_DCACHE_SIZE          0x8000
+#define CONFIG_SYS_ICACHE_SIZE          0x10000
+#define CONFIG_SYS_CACHELINE_SIZE       32
+
+#define CONFIG_SYS_MONITOR_BASE         CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_MALLOC_LEN           0x40000
+#define CONFIG_SYS_BOOTPARAMS_LEN       0x20000
+
+#define CONFIG_SYS_SDRAM_BASE           0x80000000
+#define CONFIG_SYS_LOAD_ADDR            0x81000000
+
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0xbd000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x8000
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE - 1)
+
+#define CONFIG_BAUDRATE                 115200
+#define CONFIG_SYS_BAUDRATE_TABLE \
+	{9600, 19200, 38400, 57600, 115200}
+
+#define CONFIG_BOOTDELAY                3
+#define CONFIG_BOOTARGS                 "console=ttyS0,115200 " \
+					"root=/dev/mtdblock2 " \
+					"rootfstype=squashfs"
+#define CONFIG_BOOTCOMMAND              "sf probe;" \
+					"mtdparts default;" \
+					"bootm 0x9f300000"
+#define CONFIG_LZMA
+#define CONFIG_OF_LIBFDT
+
+#define MTDIDS_DEFAULT                  "nor0=spi-flash.0"
+#define MTDPARTS_DEFAULT                "mtdparts=spi-flash.0:" \
+					"256k(u-boot),64k(u-boot-env)," \
+					"2752k(rootfs),896k(uImage)," \
+					"64k(NVRAM),64k(ART)"
+
+#define CONFIG_ENV_SPI_MAX_HZ           25000000
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET               0x40000
+#define CONFIG_ENV_SECT_SIZE            0x10000
+#define CONFIG_ENV_SIZE                 0x10000
+
+/*
+ * Command
+ */
+#define CONFIG_CMD_MTDPARTS
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_CBSIZE               256
+#define CONFIG_SYS_MAXARGS              16
+#define CONFIG_SYS_PBSIZE               (CONFIG_SYS_CBSIZE + \
+					sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_AUTO_COMPLETE
+
+/*
+ * Diagnostics
+ */
+#define CONFIG_SYS_MEMTEST_START        0x80100000
+#define CONFIG_SYS_MEMTEST_END          0x83f00000
+#define CONFIG_CMD_MEMTEST
+
+#endif  /* __CONFIG_H */
-- 
1.9.1

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

* [U-Boot] [PATCH v8 9/9] mips: ath79: add AP143 reference board
       [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
                   ` (7 preceding siblings ...)
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 8/9] mips: ath79: add AP121 reference board Wills Wang
@ 2016-03-16  9:00 ` Wills Wang
  8 siblings, 0 replies; 30+ messages in thread
From: Wills Wang @ 2016-03-16  9:00 UTC (permalink / raw)
  To: u-boot

This patch add board-level code and base DT for AP143.

Signed-off-by: Wills Wang <wills.wang@live.com>
---

Changes in v8:
- Move board/ath79/ap143 into board/qca/ap143
- Move SYS_VENDOR into board-level for ap143

Changes in v7:
- Use KSEG1 address for debug port in ap143

Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/mips/dts/Makefile       |  1 +
 arch/mips/dts/ap143.dts      | 43 +++++++++++++++++++++
 arch/mips/dts/qca953x.dtsi   | 84 ++++++++++++++++++++++++++++++++++++++++
 arch/mips/mach-ath79/Kconfig |  5 +++
 board/qca/ap143/Kconfig      | 12 ++++++
 board/qca/ap143/MAINTAINERS  |  6 +++
 board/qca/ap143/Makefile     |  5 +++
 board/qca/ap143/ap143.c      | 66 ++++++++++++++++++++++++++++++++
 configs/ap143_defconfig      | 45 ++++++++++++++++++++++
 include/configs/ap143.h      | 91 ++++++++++++++++++++++++++++++++++++++++++++
 10 files changed, 358 insertions(+)
 create mode 100644 arch/mips/dts/ap143.dts
 create mode 100644 arch/mips/dts/qca953x.dtsi
 create mode 100644 board/qca/ap143/Kconfig
 create mode 100644 board/qca/ap143/MAINTAINERS
 create mode 100644 board/qca/ap143/Makefile
 create mode 100644 board/qca/ap143/ap143.c
 create mode 100644 configs/ap143_defconfig
 create mode 100644 include/configs/ap143.h

diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile
index 30e5c68..bd87ead 100644
--- a/arch/mips/dts/Makefile
+++ b/arch/mips/dts/Makefile
@@ -3,6 +3,7 @@
 #
 
 dtb-$(CONFIG_TARGET_AP121) += ap121.dtb
+dtb-$(CONFIG_TARGET_AP143) += ap143.dtb
 dtb-$(CONFIG_TARGET_PIC32MZDASK) += pic32mzda_sk.dtb
 
 targets += $(dtb-y)
diff --git a/arch/mips/dts/ap143.dts b/arch/mips/dts/ap143.dts
new file mode 100644
index 0000000..f53207e
--- /dev/null
+++ b/arch/mips/dts/ap143.dts
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/dts-v1/;
+#include "qca953x.dtsi"
+
+/ {
+	model = "AP143 Reference Board";
+	compatible = "qca,ap143", "qca,qca953x";
+
+	aliases {
+		spi0 = &spi0;
+		serial0 = &uart0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+};
+
+&xtal {
+	clock-frequency = <25000000>;
+};
+
+&uart0 {
+	status = "okay";
+};
+
+&spi0 {
+	spi-max-frequency = <25000000>;
+	status = "okay";
+	spi-flash at 0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-flash";
+		memory-map = <0x9f000000 0x00800000>;
+		spi-max-frequency = <25000000>;
+		reg = <0>;
+	};
+};
diff --git a/arch/mips/dts/qca953x.dtsi b/arch/mips/dts/qca953x.dtsi
new file mode 100644
index 0000000..870010f
--- /dev/null
+++ b/arch/mips/dts/qca953x.dtsi
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "skeleton.dtsi"
+
+/ {
+	compatible = "qca,qca953x";
+
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		cpu at 0 {
+			device_type = "cpu";
+			compatible = "mips,mips24Kc";
+			reg = <0>;
+		};
+	};
+
+	clocks {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		xtal: xtal {
+			#clock-cells = <0>;
+			compatible = "fixed-clock";
+			clock-output-names = "xtal";
+		};
+	};
+
+	pinctrl {
+		u-boot,dm-pre-reloc;
+		compatible = "qca,qca953x-pinctrl";
+		ranges;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		reg = <0x18040000 0x100>;
+	};
+
+	ahb {
+		compatible = "simple-bus";
+		ranges;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		apb {
+			compatible = "simple-bus";
+			ranges;
+
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			uart0: uart at 18020000 {
+				compatible = "ns16550";
+				reg = <0x18020000 0x20>;
+				reg-shift = <2>;
+				clock-frequency = <25000000>;
+				interrupts = <128 IRQ_TYPE_LEVEL_HIGH>;
+
+				status = "disabled";
+			};
+		};
+
+		spi0: spi at 1f000000 {
+			compatible = "qca,ar7100-spi";
+			reg = <0x1f000000 0x10>;
+			interrupts = <129 IRQ_TYPE_LEVEL_HIGH>;
+
+			status = "disabled";
+
+			#address-cells = <1>;
+			#size-cells = <0>;
+		};
+	};
+};
diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
index c3012f8..f45403b 100644
--- a/arch/mips/mach-ath79/Kconfig
+++ b/arch/mips/mach-ath79/Kconfig
@@ -29,8 +29,13 @@ config TARGET_AP121
 	bool "AP121 Reference Board"
 	select SOC_AR933X
 
+config TARGET_AP143
+	bool "AP143 Reference Board"
+	select SOC_QCA953X
+
 endchoice
 
 source "board/qca/ap121/Kconfig"
+source "board/qca/ap143/Kconfig"
 
 endmenu
diff --git a/board/qca/ap143/Kconfig b/board/qca/ap143/Kconfig
new file mode 100644
index 0000000..4cdac0d
--- /dev/null
+++ b/board/qca/ap143/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_AP143
+
+config SYS_VENDOR
+	default "qca"
+
+config SYS_BOARD
+	default "ap143"
+
+config SYS_CONFIG_NAME
+	default "ap143"
+
+endif
diff --git a/board/qca/ap143/MAINTAINERS b/board/qca/ap143/MAINTAINERS
new file mode 100644
index 0000000..11cb14f
--- /dev/null
+++ b/board/qca/ap143/MAINTAINERS
@@ -0,0 +1,6 @@
+AP143 BOARD
+M:	Wills Wang <wills.wang@live.com>
+S:	Maintained
+F:	board/qca/ap143/
+F:	include/configs/ap143.h
+F:	configs/ap143_defconfig
diff --git a/board/qca/ap143/Makefile b/board/qca/ap143/Makefile
new file mode 100644
index 0000000..00f7837
--- /dev/null
+++ b/board/qca/ap143/Makefile
@@ -0,0 +1,5 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	= ap143.o
diff --git a/board/qca/ap143/ap143.c b/board/qca/ap143/ap143.c
new file mode 100644
index 0000000..1572472
--- /dev/null
+++ b/board/qca/ap143/ap143.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/addrspace.h>
+#include <asm/types.h>
+#include <mach/ar71xx_regs.h>
+#include <mach/ddr.h>
+#include <debug_uart.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+void board_debug_uart_init(void)
+{
+	void __iomem *regs;
+	u32 val;
+
+	regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
+			   MAP_NOCACHE);
+
+	/*
+	 * GPIO9 as input, GPIO10 as output
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_OE);
+	val |= QCA953X_GPIO(9);
+	val &= ~QCA953X_GPIO(10);
+	writel(val, regs + AR71XX_GPIO_REG_OE);
+
+	/*
+	 * Enable GPIO10 as UART0_SOUT
+	 */
+	val = readl(regs + QCA953X_GPIO_REG_OUT_FUNC2);
+	val &= ~QCA953X_GPIO_MUX_MASK(16);
+	val |= QCA953X_GPIO_OUT_MUX_UART0_SOUT << 16;
+	writel(val, regs + QCA953X_GPIO_REG_OUT_FUNC2);
+
+	/*
+	 * Enable GPIO9 as UART0_SIN
+	 */
+	val = readl(regs + QCA953X_GPIO_REG_IN_ENABLE0);
+	val &= ~QCA953X_GPIO_MUX_MASK(8);
+	val |= QCA953X_GPIO_IN_MUX_UART0_SIN << 8;
+	writel(val, regs + QCA953X_GPIO_REG_IN_ENABLE0);
+
+	/*
+	 * Enable GPIO10 output
+	 */
+	val = readl(regs + AR71XX_GPIO_REG_OUT);
+	val |= QCA953X_GPIO(10);
+	writel(val, regs + AR71XX_GPIO_REG_OUT);
+}
+#endif
+
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
+	ddr_init();
+	return 0;
+}
diff --git a/configs/ap143_defconfig b/configs/ap143_defconfig
new file mode 100644
index 0000000..aa071be
--- /dev/null
+++ b/configs/ap143_defconfig
@@ -0,0 +1,45 @@
+CONFIG_MIPS=y
+CONFIG_SYS_MALLOC_F_LEN=0x800
+CONFIG_DM_SERIAL=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_ARCH_ATH79=y
+CONFIG_TARGET_AP143=y
+CONFIG_DEFAULT_DEVICE_TREE="ap143"
+CONFIG_SYS_PROMPT="ap143 # "
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_CRC32 is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_NET is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PINCTRL=y
+CONFIG_QCA953X_PINCTRL=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_BASE=0xb8020000
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_SYS_NS16550=y
+CONFIG_ATH79_SPI=y
diff --git a/include/configs/ap143.h b/include/configs/ap143.h
new file mode 100644
index 0000000..6940551
--- /dev/null
+++ b/include/configs/ap143.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_SYS_TEXT_BASE            0x9f000000
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_SYS_HZ                   1000
+#define CONFIG_SYS_MHZ                  325
+#define CONFIG_SYS_MIPS_TIMER_FREQ      (CONFIG_SYS_MHZ * 1000000)
+
+/* Cache Configuration */
+#define CONFIG_SYS_DCACHE_SIZE          0x8000
+#define CONFIG_SYS_ICACHE_SIZE          0x10000
+#define CONFIG_SYS_CACHELINE_SIZE       32
+
+#define CONFIG_SYS_MONITOR_BASE         CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SYS_MALLOC_LEN           0x40000
+#define CONFIG_SYS_BOOTPARAMS_LEN       0x20000
+
+#define CONFIG_SYS_SDRAM_BASE           0x80000000
+#define CONFIG_SYS_LOAD_ADDR            0x81000000
+
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0xbd000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x2000
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE - 1)
+
+/*
+ * Serial Port
+ */
+#define CONFIG_SYS_NS16550_CLK          25000000
+#define CONFIG_BAUDRATE                 115200
+#define CONFIG_SYS_BAUDRATE_TABLE \
+	{9600, 19200, 38400, 57600, 115200}
+
+#define CONFIG_BOOTDELAY                3
+#define CONFIG_BOOTARGS                 "console=ttyS0,115200 " \
+					"root=/dev/mtdblock2 " \
+					"rootfstype=squashfs"
+#define CONFIG_BOOTCOMMAND              "sf probe;" \
+					"mtdparts default;" \
+					"bootm 0x9f300000"
+#define CONFIG_LZMA
+#define CONFIG_OF_LIBFDT
+
+#define MTDIDS_DEFAULT                  "nor0=spi-flash.0"
+#define MTDPARTS_DEFAULT                "mtdparts=spi-flash.0:" \
+					"256k(u-boot),64k(u-boot-env)," \
+					"2752k(rootfs),896k(uImage)," \
+					"64k(NVRAM),64k(ART)"
+
+#define CONFIG_ENV_SPI_MAX_HZ           25000000
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET               0x40000
+#define CONFIG_ENV_SECT_SIZE            0x10000
+#define CONFIG_ENV_SIZE                 0x10000
+
+/*
+ * Command
+ */
+#define CONFIG_CMD_MTDPARTS
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_CBSIZE               256
+#define CONFIG_SYS_MAXARGS              16
+#define CONFIG_SYS_PBSIZE               (CONFIG_SYS_CBSIZE + \
+					sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_AUTO_COMPLETE
+
+/*
+ * Diagnostics
+ */
+#define CONFIG_SYS_MEMTEST_START        0x80100000
+#define CONFIG_SYS_MEMTEST_END          0x83f00000
+#define CONFIG_CMD_MEMTEST
+
+#endif  /* __CONFIG_H */
-- 
1.9.1

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs Wills Wang
@ 2016-03-16 21:35   ` Marek Vasut
  2016-03-17  3:39     ` Wills Wang
  2016-04-10 18:35   ` Daniel Schwierzeck
  1 sibling, 1 reply; 30+ messages in thread
From: Marek Vasut @ 2016-03-16 21:35 UTC (permalink / raw)
  To: u-boot

On 03/16/2016 09:59 AM, Wills Wang wrote:
> This patch add some common code for QCA/Atheros ath79 SOCs such as
> DDR tuning, chip reset and CPU detection.
> 
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---
> 
> Changes in v8:
> - Use setbits_be32
> - Use lookup-table instead of big switch statement for CPU detection
> 

Good stuff, minor nits below.

> +++ b/arch/mips/mach-ath79/cpu.c
> @@ -0,0 +1,142 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/addrspace.h>
> +#include <asm/types.h>
> +#include <mach/ath79.h>
> +#include <mach/ar71xx_regs.h>
> +
> +struct ath79_soc_desc {
> +	enum ath79_soc_type soc;
> +	const char *chip;
> +	int major;
> +	int minor;

All of this stuff can be const, no ?

> +};

[...]

> diff --git a/arch/mips/mach-ath79/dram.c b/arch/mips/mach-ath79/dram.c
> new file mode 100644
> index 0000000..c29e98c
> --- /dev/null
> +++ b/arch/mips/mach-ath79/dram.c
> @@ -0,0 +1,16 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <linux/sizes.h>
> +#include <asm/addrspace.h>
> +#include <mach/ddr.h>
> +
> +phys_size_t initdram(int board_type)
> +{
> +	ddr_tap_tuning();

Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?

> +	return get_ram_size((void *)KSEG1, SZ_256M);
> +}
> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
> new file mode 100644
> index 0000000..893dedc
> --- /dev/null
> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
> @@ -0,0 +1,1184 @@
> +/*
> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
> + *
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */
> +
> +#ifndef __ASM_MACH_AR71XX_REGS_H
> +#define __ASM_MACH_AR71XX_REGS_H
> +
> +#ifndef __ASSEMBLY__
> +#include <linux/bitops.h>
> +#else
> +#ifndef BIT
> +#define BIT(nr)                 (1 << (nr))

This should really go into some common header.

> +#endif
> +#endif
> +
> +#define AR71XX_APB_BASE                 0x18000000
> +#define AR71XX_GE0_BASE                 0x19000000
> +#define AR71XX_GE0_SIZE                 0x10000
> +#define AR71XX_GE1_BASE                 0x1a000000
> +#define AR71XX_GE1_SIZE                 0x10000
> +#define AR71XX_EHCI_BASE                0x1b000000
> +#define AR71XX_EHCI_SIZE                0x1000
> +#define AR71XX_OHCI_BASE                0x1c000000
> +#define AR71XX_OHCI_SIZE                0x1000
> +#define AR71XX_SPI_BASE                 0x1f000000
> +#define AR71XX_SPI_SIZE                 0x01000000

Indent the macro value with tabs in this file please.

[...]

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs Wills Wang
@ 2016-03-16 21:38   ` Marek Vasut
  2016-03-17  3:14     ` Wills Wang
  0 siblings, 1 reply; 30+ messages in thread
From: Marek Vasut @ 2016-03-16 21:38 UTC (permalink / raw)
  To: u-boot

On 03/16/2016 09:59 AM, Wills Wang wrote:
> This patch enable work for ar933x SOC.
> 
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---
> 
> Changes in v8:
> - Fix multi-line comment for ar933x
> 
> Changes in v7:
> - Use CKSEGxADDR instead of KSEGxADDR for ar933x
> 
> Changes in v6:
> - Remove board.c
> - Define magic value in ddr.c
> 
> Changes in v5:
> - Add ddr.c for ar933x
> 
> Changes in v4:
> - Add clk.c for ar933x
> 
> Changes in v3: None
> Changes in v2: None

[...]

> +#define DDR_REFRESH_EN          (1 << 14)
> +#define DDR_REFRESH_M           0x3ff
> +#define DDR_REFRESH(x)          ((x) & 0x3ff)
> +#define DDR_REFRESH_VAL_25M     (DDR_REFRESH_EN | DDR_REFRESH(390))
> +#define DDR_REFRESH_VAL_40M     (DDR_REFRESH_EN | DDR_REFRESH(624))
> +
> +#define DDR_TRAS_S              0
> +#define DDR_TRAS_M              0x1f
> +#define DDR_TRAS(x)             ((x) << DDR_TRAS_S)
> +#define DDR_TRCD_M              0xf
> +#define DDR_TRCD_S              5
> +#define DDR_TRCD(x)             ((x) << DDR_TRCD_S)
> +#define DDR_TRP_M               0xf
> +#define DDR_TRP_S               9
> +#define DDR_TRP(x)              ((x) << DDR_TRP_S)
> +#define DDR_TRRD_M              0xf
> +#define DDR_TRRD_S              13
> +#define DDR_TRRD(x)             ((x) << DDR_TRRD_S)
> +#define DDR_TRFC_M              0x7f
> +#define DDR_TRFC_S              17
> +#define DDR_TRFC(x)             ((x) << DDR_TRFC_S)
> +#define DDR_TMRD_M              0xf
> +#define DDR_TMRD_S              23
> +#define DDR_TMRD(x)             ((x) << DDR_TMRD_S)
> +#define DDR_CAS_L_M             0x17
> +#define DDR_CAS_L_S             27
> +#define DDR_CAS_L(x)            (((x) & DDR_CAS_L_M) << DDR_CAS_L_S)
> +#define DDR_OPEN                (1 << 30)

Use the BIT() macro consistently ;-)

> +#define DDR_CONF_REG_VAL        (DDR_TRAS(16) | DDR_TRCD(6) | \
> +				 DDR_TRP(6) | DDR_TRRD(4) | \
> +				 DDR_TRFC(30) | DDR_TMRD(15) | \
> +				 DDR_CAS_L(7) | DDR_OPEN)
> +

[...]

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs Wills Wang
@ 2016-03-16 21:39   ` Marek Vasut
  2016-03-17  3:14     ` Wills Wang
  0 siblings, 1 reply; 30+ messages in thread
From: Marek Vasut @ 2016-03-16 21:39 UTC (permalink / raw)
  To: u-boot

On 03/16/2016 09:59 AM, Wills Wang wrote:
> This patch enable work for qca953x SOC.
> 
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---
> 
> Changes in v8:
> - Fix multi-line comment for qca953x
> 
> Changes in v7:
> - Use CKSEGxADDR instead of KSEGxADDR for qca953x
> 
> Changes in v6:
> - Initial support for qca953x

Same comment about the BIT() macro as ar933x support. Did you ever test
the QCA953x ?

Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs
  2016-03-16 21:39   ` Marek Vasut
@ 2016-03-17  3:14     ` Wills Wang
  2016-03-17  3:27       ` Marek Vasut
  0 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-17  3:14 UTC (permalink / raw)
  To: u-boot



On Thursday, March 17, 2016 05:39 AM, Marek Vasut wrote:
> On 03/16/2016 09:59 AM, Wills Wang wrote:
>> This patch enable work for qca953x SOC.
>>
>> Signed-off-by: Wills Wang <wills.wang@live.com>
>> ---
>>
>> Changes in v8:
>> - Fix multi-line comment for qca953x
>>
>> Changes in v7:
>> - Use CKSEGxADDR instead of KSEGxADDR for qca953x
>>
>> Changes in v6:
>> - Initial support for qca953x
> Same comment about the BIT() macro as ar933x support. Did you ever test
> the QCA953x ?
Yes, i have a qca9531 board that is compatible with AP143.
> Best regards,
> Marek Vasut

-- 
Best Regards
Wills

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

* [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs
  2016-03-16 21:38   ` Marek Vasut
@ 2016-03-17  3:14     ` Wills Wang
  0 siblings, 0 replies; 30+ messages in thread
From: Wills Wang @ 2016-03-17  3:14 UTC (permalink / raw)
  To: u-boot



On Thursday, March 17, 2016 05:38 AM, Marek Vasut wrote:
> On 03/16/2016 09:59 AM, Wills Wang wrote:
>> This patch enable work for ar933x SOC.
>>
>> Signed-off-by: Wills Wang <wills.wang@live.com>
>> ---
>>
>> Changes in v8:
>> - Fix multi-line comment for ar933x
>>
>> Changes in v7:
>> - Use CKSEGxADDR instead of KSEGxADDR for ar933x
>>
>> Changes in v6:
>> - Remove board.c
>> - Define magic value in ddr.c
>>
>> Changes in v5:
>> - Add ddr.c for ar933x
>>
>> Changes in v4:
>> - Add clk.c for ar933x
>>
>> Changes in v3: None
>> Changes in v2: None
> [...]
>
>> +#define DDR_REFRESH_EN          (1 << 14)
>> +#define DDR_REFRESH_M           0x3ff
>> +#define DDR_REFRESH(x)          ((x) & 0x3ff)
>> +#define DDR_REFRESH_VAL_25M     (DDR_REFRESH_EN | DDR_REFRESH(390))
>> +#define DDR_REFRESH_VAL_40M     (DDR_REFRESH_EN | DDR_REFRESH(624))
>> +
>> +#define DDR_TRAS_S              0
>> +#define DDR_TRAS_M              0x1f
>> +#define DDR_TRAS(x)             ((x) << DDR_TRAS_S)
>> +#define DDR_TRCD_M              0xf
>> +#define DDR_TRCD_S              5
>> +#define DDR_TRCD(x)             ((x) << DDR_TRCD_S)
>> +#define DDR_TRP_M               0xf
>> +#define DDR_TRP_S               9
>> +#define DDR_TRP(x)              ((x) << DDR_TRP_S)
>> +#define DDR_TRRD_M              0xf
>> +#define DDR_TRRD_S              13
>> +#define DDR_TRRD(x)             ((x) << DDR_TRRD_S)
>> +#define DDR_TRFC_M              0x7f
>> +#define DDR_TRFC_S              17
>> +#define DDR_TRFC(x)             ((x) << DDR_TRFC_S)
>> +#define DDR_TMRD_M              0xf
>> +#define DDR_TMRD_S              23
>> +#define DDR_TMRD(x)             ((x) << DDR_TMRD_S)
>> +#define DDR_CAS_L_M             0x17
>> +#define DDR_CAS_L_S             27
>> +#define DDR_CAS_L(x)            (((x) & DDR_CAS_L_M) << DDR_CAS_L_S)
>> +#define DDR_OPEN                (1 << 30)
> Use the BIT() macro consistently ;-)
>
OK.
>> +#define DDR_CONF_REG_VAL        (DDR_TRAS(16) | DDR_TRCD(6) | \
>> +				 DDR_TRP(6) | DDR_TRRD(4) | \
>> +				 DDR_TRFC(30) | DDR_TMRD(15) | \
>> +				 DDR_CAS_L(7) | DDR_OPEN)
>> +
> [...]
>

-- 
Best Regards
Wills

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

* [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs
  2016-03-17  3:14     ` Wills Wang
@ 2016-03-17  3:27       ` Marek Vasut
  0 siblings, 0 replies; 30+ messages in thread
From: Marek Vasut @ 2016-03-17  3:27 UTC (permalink / raw)
  To: u-boot

On 03/17/2016 04:14 AM, Wills Wang wrote:
> 
> 
> On Thursday, March 17, 2016 05:39 AM, Marek Vasut wrote:
>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>> This patch enable work for qca953x SOC.
>>>
>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>> ---
>>>
>>> Changes in v8:
>>> - Fix multi-line comment for qca953x
>>>
>>> Changes in v7:
>>> - Use CKSEGxADDR instead of KSEGxADDR for qca953x
>>>
>>> Changes in v6:
>>> - Initial support for qca953x
>> Same comment about the BIT() macro as ar933x support. Did you ever test
>> the QCA953x ?
> Yes, i have a qca9531 board that is compatible with AP143.

Cool, thanks for confirming :-)

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-16 21:35   ` Marek Vasut
@ 2016-03-17  3:39     ` Wills Wang
  2016-03-17  3:44       ` Marek Vasut
  0 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-17  3:39 UTC (permalink / raw)
  To: u-boot



On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
> On 03/16/2016 09:59 AM, Wills Wang wrote:
>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>> DDR tuning, chip reset and CPU detection.
>>
>> Signed-off-by: Wills Wang <wills.wang@live.com>
>> ---
>>
>> Changes in v8:
>> - Use setbits_be32
>> - Use lookup-table instead of big switch statement for CPU detection
>>
> Good stuff, minor nits below.
>
>> +++ b/arch/mips/mach-ath79/cpu.c
>> @@ -0,0 +1,142 @@
>> +/*
>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>> + *
>> + * SPDX-License-Identifier: GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <asm/io.h>
>> +#include <asm/addrspace.h>
>> +#include <asm/types.h>
>> +#include <mach/ath79.h>
>> +#include <mach/ar71xx_regs.h>
>> +
>> +struct ath79_soc_desc {
>> +	enum ath79_soc_type soc;
>> +	const char *chip;
>> +	int major;
>> +	int minor;
> All of this stuff can be const, no ?
OK.
>
>> +};
> [...]
>
>> diff --git a/arch/mips/mach-ath79/dram.c b/arch/mips/mach-ath79/dram.c
>> new file mode 100644
>> index 0000000..c29e98c
>> --- /dev/null
>> +++ b/arch/mips/mach-ath79/dram.c
>> @@ -0,0 +1,16 @@
>> +/*
>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>> + *
>> + * SPDX-License-Identifier: GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <linux/sizes.h>
>> +#include <asm/addrspace.h>
>> +#include <mach/ddr.h>
>> +
>> +phys_size_t initdram(int board_type)
>> +{
>> +	ddr_tap_tuning();
> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
Yes, it's for optimizing DDR timing according to hardware.
Sometimes, the hard code value is not ideal.
>
>> +	return get_ram_size((void *)KSEG1, SZ_256M);
>> +}
>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>> new file mode 100644
>> index 0000000..893dedc
>> --- /dev/null
>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>> @@ -0,0 +1,1184 @@
>> +/*
>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>> + *
>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>> + *
>> + * SPDX-License-Identifier:     GPL-2.0+
>> + */
>> +
>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>> +#define __ASM_MACH_AR71XX_REGS_H
>> +
>> +#ifndef __ASSEMBLY__
>> +#include <linux/bitops.h>
>> +#else
>> +#ifndef BIT
>> +#define BIT(nr)                 (1 << (nr))
> This should really go into some common header.
This header is also included by some assembly code,
but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>> +#endif
>> +#endif
>> +
>> +#define AR71XX_APB_BASE                 0x18000000
>> +#define AR71XX_GE0_BASE                 0x19000000
>> +#define AR71XX_GE0_SIZE                 0x10000
>> +#define AR71XX_GE1_BASE                 0x1a000000
>> +#define AR71XX_GE1_SIZE                 0x10000
>> +#define AR71XX_EHCI_BASE                0x1b000000
>> +#define AR71XX_EHCI_SIZE                0x1000
>> +#define AR71XX_OHCI_BASE                0x1c000000
>> +#define AR71XX_OHCI_SIZE                0x1000
>> +#define AR71XX_SPI_BASE                 0x1f000000
>> +#define AR71XX_SPI_SIZE                 0x01000000
> Indent the macro value with tabs in this file please.
>
> [...]
>

-- 
Best Regards
Wills

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17  3:39     ` Wills Wang
@ 2016-03-17  3:44       ` Marek Vasut
  2016-03-17  4:02         ` Wills Wang
  0 siblings, 1 reply; 30+ messages in thread
From: Marek Vasut @ 2016-03-17  3:44 UTC (permalink / raw)
  To: u-boot

On 03/17/2016 04:39 AM, Wills Wang wrote:
> 
> 
> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>> DDR tuning, chip reset and CPU detection.
>>>
>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>> ---
>>>
>>> Changes in v8:
>>> - Use setbits_be32
>>> - Use lookup-table instead of big switch statement for CPU detection
>>>
>> Good stuff, minor nits below.

[...]

>>> +phys_size_t initdram(int board_type)
>>> +{
>>> +    ddr_tap_tuning();
>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
> Yes, it's for optimizing DDR timing according to hardware.
> Sometimes, the hard code value is not ideal.

AR934x doesn't seem to need this.

>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>> +}
>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>> new file mode 100644
>>> index 0000000..893dedc
>>> --- /dev/null
>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>> @@ -0,0 +1,1184 @@
>>> +/*
>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>> + *
>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>> + *
>>> + * SPDX-License-Identifier:     GPL-2.0+
>>> + */
>>> +
>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>> +#define __ASM_MACH_AR71XX_REGS_H
>>> +
>>> +#ifndef __ASSEMBLY__
>>> +#include <linux/bitops.h>
>>> +#else
>>> +#ifndef BIT
>>> +#define BIT(nr)                 (1 << (nr))
>> This should really go into some common header.
> This header is also included by some assembly code,
> but the BIT macro in linux/bitops.h isn't compatiable with assembler.

Because of the 1UL in it ?

[...]

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17  3:44       ` Marek Vasut
@ 2016-03-17  4:02         ` Wills Wang
  2016-03-17 12:20           ` Marek Vasut
  0 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-03-17  4:02 UTC (permalink / raw)
  To: u-boot



On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>
>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>> DDR tuning, chip reset and CPU detection.
>>>>
>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>> ---
>>>>
>>>> Changes in v8:
>>>> - Use setbits_be32
>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>
>>> Good stuff, minor nits below.
> [...]
>
>>>> +phys_size_t initdram(int board_type)
>>>> +{
>>>> +    ddr_tap_tuning();
>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>> Yes, it's for optimizing DDR timing according to hardware.
>> Sometimes, the hard code value is not ideal.
> AR934x doesn't seem to need this.
I seem the following code in u-boot from Atheros LSDK:
#ifdef CONFIG_AP123
     ath_ddr_tap_cal();

>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>> +}
>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>> new file mode 100644
>>>> index 0000000..893dedc
>>>> --- /dev/null
>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>> @@ -0,0 +1,1184 @@
>>>> +/*
>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>> + *
>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>> + *
>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>> + */
>>>> +
>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>> +
>>>> +#ifndef __ASSEMBLY__
>>>> +#include <linux/bitops.h>
>>>> +#else
>>>> +#ifndef BIT
>>>> +#define BIT(nr)                 (1 << (nr))
>>> This should really go into some common header.
>> This header is also included by some assembly code,
>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
> Because of the 1UL in it ?
Yes, there are also a few other C keywords and syntax, such as in-line 
function.
>
> [...]
>

-- 
Best Regards
Wills

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17  4:02         ` Wills Wang
@ 2016-03-17 12:20           ` Marek Vasut
  2016-03-17 12:35             ` Wills Wang
  2016-03-17 12:48             ` Daniel Schwierzeck
  0 siblings, 2 replies; 30+ messages in thread
From: Marek Vasut @ 2016-03-17 12:20 UTC (permalink / raw)
  To: u-boot

On 03/17/2016 05:02 AM, Wills Wang wrote:
> 
> 
> On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
>> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>>
>>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>>> DDR tuning, chip reset and CPU detection.
>>>>>
>>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>>> ---
>>>>>
>>>>> Changes in v8:
>>>>> - Use setbits_be32
>>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>>
>>>> Good stuff, minor nits below.
>> [...]
>>
>>>>> +phys_size_t initdram(int board_type)
>>>>> +{
>>>>> +    ddr_tap_tuning();
>>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>>> Yes, it's for optimizing DDR timing according to hardware.
>>> Sometimes, the hard code value is not ideal.
>> AR934x doesn't seem to need this.
> I seem the following code in u-boot from Atheros LSDK:
> #ifdef CONFIG_AP123
>     ath_ddr_tap_cal();

Where can I get the LSDK ? I'd like to take a look and add it into my
ar934x support patch.

>>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>>> +}
>>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>> new file mode 100644
>>>>> index 0000000..893dedc
>>>>> --- /dev/null
>>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>> @@ -0,0 +1,1184 @@
>>>>> +/*
>>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>>> + *
>>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan
>>>>> <jnarayanan@atheros.com>
>>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>>> + *
>>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>>> + */
>>>>> +
>>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>>> +
>>>>> +#ifndef __ASSEMBLY__
>>>>> +#include <linux/bitops.h>
>>>>> +#else
>>>>> +#ifndef BIT
>>>>> +#define BIT(nr)                 (1 << (nr))
>>>> This should really go into some common header.
>>> This header is also included by some assembly code,
>>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>> Because of the 1UL in it ?
> Yes, there are also a few other C keywords and syntax, such as in-line
> function.

Hmmmmm, it pains me to see such duplication, but I have no better idea
how to deal with it without introducing ifdefs.

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17 12:20           ` Marek Vasut
@ 2016-03-17 12:35             ` Wills Wang
  2016-03-17 12:37               ` Marek Vasut
  2016-04-02 22:51               ` Marek Vasut
  2016-03-17 12:48             ` Daniel Schwierzeck
  1 sibling, 2 replies; 30+ messages in thread
From: Wills Wang @ 2016-03-17 12:35 UTC (permalink / raw)
  To: u-boot



On Thursday, March 17, 2016 08:20 PM, Marek Vasut wrote:
> On 03/17/2016 05:02 AM, Wills Wang wrote:
>>
>> On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
>>> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>>>> DDR tuning, chip reset and CPU detection.
>>>>>>
>>>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>>>> ---
>>>>>>
>>>>>> Changes in v8:
>>>>>> - Use setbits_be32
>>>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>>>
>>>>> Good stuff, minor nits below.
>>> [...]
>>>
>>>>>> +phys_size_t initdram(int board_type)
>>>>>> +{
>>>>>> +    ddr_tap_tuning();
>>>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>>>> Yes, it's for optimizing DDR timing according to hardware.
>>>> Sometimes, the hard code value is not ideal.
>>> AR934x doesn't seem to need this.
>> I seem the following code in u-boot from Atheros LSDK:
>> #ifdef CONFIG_AP123
>>      ath_ddr_tap_cal();
> Where can I get the LSDK ? I'd like to take a look and add it into my
> ar934x support patch.
You can refer to u-boot from Atheros QSDK
https://us.codeaurora.org/cgit/quic/qsdk/oss/boot/u-boot-1.1.4/
It's almost same as u-boot from Atheros LSDK.
The above snippet can be found in
https://us.codeaurora.org/cgit/quic/qsdk/oss/boot/u-boot-1.1.4/tree/board/ar7240/ap123/ap123.c?h=1.1
>>>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>>>> +}
>>>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>> new file mode 100644
>>>>>> index 0000000..893dedc
>>>>>> --- /dev/null
>>>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>> @@ -0,0 +1,1184 @@
>>>>>> +/*
>>>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>>>> + *
>>>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan
>>>>>> <jnarayanan@atheros.com>
>>>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>>>> + *
>>>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>>>> + */
>>>>>> +
>>>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>>>> +
>>>>>> +#ifndef __ASSEMBLY__
>>>>>> +#include <linux/bitops.h>
>>>>>> +#else
>>>>>> +#ifndef BIT
>>>>>> +#define BIT(nr)                 (1 << (nr))
>>>>> This should really go into some common header.
>>>> This header is also included by some assembly code,
>>>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>>> Because of the 1UL in it ?
>> Yes, there are also a few other C keywords and syntax, such as in-line
>> function.
> Hmmmmm, it pains me to see such duplication, but I have no better idea
> how to deal with it without introducing ifdefs.
>

-- 
Best Regards
Wills

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17 12:35             ` Wills Wang
@ 2016-03-17 12:37               ` Marek Vasut
  2016-04-02 22:51               ` Marek Vasut
  1 sibling, 0 replies; 30+ messages in thread
From: Marek Vasut @ 2016-03-17 12:37 UTC (permalink / raw)
  To: u-boot

On 03/17/2016 01:35 PM, Wills Wang wrote:
> 
> 
> On Thursday, March 17, 2016 08:20 PM, Marek Vasut wrote:
>> On 03/17/2016 05:02 AM, Wills Wang wrote:
>>>
>>> On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
>>>> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>>>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>>>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>>>>> DDR tuning, chip reset and CPU detection.
>>>>>>>
>>>>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>>>>> ---
>>>>>>>
>>>>>>> Changes in v8:
>>>>>>> - Use setbits_be32
>>>>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>>>>
>>>>>> Good stuff, minor nits below.
>>>> [...]
>>>>
>>>>>>> +phys_size_t initdram(int board_type)
>>>>>>> +{
>>>>>>> +    ddr_tap_tuning();
>>>>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>>>>> Yes, it's for optimizing DDR timing according to hardware.
>>>>> Sometimes, the hard code value is not ideal.
>>>> AR934x doesn't seem to need this.
>>> I seem the following code in u-boot from Atheros LSDK:
>>> #ifdef CONFIG_AP123
>>>      ath_ddr_tap_cal();
>> Where can I get the LSDK ? I'd like to take a look and add it into my
>> ar934x support patch.
> You can refer to u-boot from Atheros QSDK
> https://us.codeaurora.org/cgit/quic/qsdk/oss/boot/u-boot-1.1.4/
> It's almost same as u-boot from Atheros LSDK.
> The above snippet can be found in
> https://us.codeaurora.org/cgit/quic/qsdk/oss/boot/u-boot-1.1.4/tree/board/ar7240/ap123/ap123.c?h=1.1

Thank you!

>>>>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>>>>> +}
>>>>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> new file mode 100644
>>>>>>> index 0000000..893dedc
>>>>>>> --- /dev/null
>>>>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> @@ -0,0 +1,1184 @@
>>>>>>> +/*
>>>>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>>>>> + *
>>>>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan
>>>>>>> <jnarayanan@atheros.com>
>>>>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>>>>> + *
>>>>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>>>>> + */
>>>>>>> +
>>>>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>>>>> +
>>>>>>> +#ifndef __ASSEMBLY__
>>>>>>> +#include <linux/bitops.h>
>>>>>>> +#else
>>>>>>> +#ifndef BIT
>>>>>>> +#define BIT(nr)                 (1 << (nr))
>>>>>> This should really go into some common header.
>>>>> This header is also included by some assembly code,
>>>>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>>>> Because of the 1UL in it ?
>>> Yes, there are also a few other C keywords and syntax, such as in-line
>>> function.
>> Hmmmmm, it pains me to see such duplication, but I have no better idea
>> how to deal with it without introducing ifdefs.
>>
> 


-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17 12:20           ` Marek Vasut
  2016-03-17 12:35             ` Wills Wang
@ 2016-03-17 12:48             ` Daniel Schwierzeck
  2016-03-17 12:51               ` Marek Vasut
  1 sibling, 1 reply; 30+ messages in thread
From: Daniel Schwierzeck @ 2016-03-17 12:48 UTC (permalink / raw)
  To: u-boot

2016-03-17 13:20 GMT+01:00 Marek Vasut <marex@denx.de>:
> On 03/17/2016 05:02 AM, Wills Wang wrote:
>>
>>
>> On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
>>> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>>>
>>>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>>>> DDR tuning, chip reset and CPU detection.
>>>>>>
>>>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>>>> ---
>>>>>>
>>>>>> Changes in v8:
>>>>>> - Use setbits_be32
>>>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>>>
>>>>> Good stuff, minor nits below.
>>> [...]
>>>
>>>>>> +phys_size_t initdram(int board_type)
>>>>>> +{
>>>>>> +    ddr_tap_tuning();
>>>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>>>> Yes, it's for optimizing DDR timing according to hardware.
>>>> Sometimes, the hard code value is not ideal.
>>> AR934x doesn't seem to need this.
>> I seem the following code in u-boot from Atheros LSDK:
>> #ifdef CONFIG_AP123
>>     ath_ddr_tap_cal();
>
> Where can I get the LSDK ? I'd like to take a look and add it into my
> ar934x support patch.
>
>>>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>>>> +}
>>>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>> new file mode 100644
>>>>>> index 0000000..893dedc
>>>>>> --- /dev/null
>>>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>> @@ -0,0 +1,1184 @@
>>>>>> +/*
>>>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>>>> + *
>>>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan
>>>>>> <jnarayanan@atheros.com>
>>>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>>>> + *
>>>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>>>> + */
>>>>>> +
>>>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>>>> +
>>>>>> +#ifndef __ASSEMBLY__
>>>>>> +#include <linux/bitops.h>
>>>>>> +#else
>>>>>> +#ifndef BIT
>>>>>> +#define BIT(nr)                 (1 << (nr))
>>>>> This should really go into some common header.
>>>> This header is also included by some assembly code,
>>>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>>> Because of the 1UL in it ?
>> Yes, there are also a few other C keywords and syntax, such as in-line
>> function.
>
> Hmmmmm, it pains me to see such duplication, but I have no better idea
> how to deal with it without introducing ifdefs.
>

actually such register definitions files are obsolete because register
base adresses and sizes are taken from device-tree. The only
exceptions are early startup or assembly code, but then you only need
to add the definitions whose are needed by a driver. Thus I suggest
you remove all the crap from this file you don't need.

-- 
- Daniel

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17 12:48             ` Daniel Schwierzeck
@ 2016-03-17 12:51               ` Marek Vasut
  0 siblings, 0 replies; 30+ messages in thread
From: Marek Vasut @ 2016-03-17 12:51 UTC (permalink / raw)
  To: u-boot

On 03/17/2016 01:48 PM, Daniel Schwierzeck wrote:
> 2016-03-17 13:20 GMT+01:00 Marek Vasut <marex@denx.de>:
>> On 03/17/2016 05:02 AM, Wills Wang wrote:
>>>
>>>
>>> On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
>>>> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>>>>
>>>>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>>>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>>>>> DDR tuning, chip reset and CPU detection.
>>>>>>>
>>>>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>>>>> ---
>>>>>>>
>>>>>>> Changes in v8:
>>>>>>> - Use setbits_be32
>>>>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>>>>
>>>>>> Good stuff, minor nits below.
>>>> [...]
>>>>
>>>>>>> +phys_size_t initdram(int board_type)
>>>>>>> +{
>>>>>>> +    ddr_tap_tuning();
>>>>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>>>>> Yes, it's for optimizing DDR timing according to hardware.
>>>>> Sometimes, the hard code value is not ideal.
>>>> AR934x doesn't seem to need this.
>>> I seem the following code in u-boot from Atheros LSDK:
>>> #ifdef CONFIG_AP123
>>>     ath_ddr_tap_cal();
>>
>> Where can I get the LSDK ? I'd like to take a look and add it into my
>> ar934x support patch.
>>
>>>>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>>>>> +}
>>>>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> new file mode 100644
>>>>>>> index 0000000..893dedc
>>>>>>> --- /dev/null
>>>>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> @@ -0,0 +1,1184 @@
>>>>>>> +/*
>>>>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>>>>> + *
>>>>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan
>>>>>>> <jnarayanan@atheros.com>
>>>>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>>>>> + *
>>>>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>>>>> + */
>>>>>>> +
>>>>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>>>>> +
>>>>>>> +#ifndef __ASSEMBLY__
>>>>>>> +#include <linux/bitops.h>
>>>>>>> +#else
>>>>>>> +#ifndef BIT
>>>>>>> +#define BIT(nr)                 (1 << (nr))
>>>>>> This should really go into some common header.
>>>>> This header is also included by some assembly code,
>>>>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>>>> Because of the 1UL in it ?
>>> Yes, there are also a few other C keywords and syntax, such as in-line
>>> function.
>>
>> Hmmmmm, it pains me to see such duplication, but I have no better idea
>> how to deal with it without introducing ifdefs.
>>
> 
> actually such register definitions files are obsolete because register
> base adresses and sizes are taken from device-tree. The only
> exceptions are early startup or assembly code, but then you only need
> to add the definitions whose are needed by a driver. Thus I suggest
> you remove all the crap from this file you don't need.

And put the remaining bits into drivers themselves , right ?

But still, this doesn't help us with the BIT() macro redefinition problem.

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-17 12:35             ` Wills Wang
  2016-03-17 12:37               ` Marek Vasut
@ 2016-04-02 22:51               ` Marek Vasut
  1 sibling, 0 replies; 30+ messages in thread
From: Marek Vasut @ 2016-04-02 22:51 UTC (permalink / raw)
  To: u-boot

On 03/17/2016 01:35 PM, Wills Wang wrote:
> 
> 
> On Thursday, March 17, 2016 08:20 PM, Marek Vasut wrote:
>> On 03/17/2016 05:02 AM, Wills Wang wrote:
>>>
>>> On Thursday, March 17, 2016 11:44 AM, Marek Vasut wrote:
>>>> On 03/17/2016 04:39 AM, Wills Wang wrote:
>>>>> On Thursday, March 17, 2016 05:35 AM, Marek Vasut wrote:
>>>>>> On 03/16/2016 09:59 AM, Wills Wang wrote:
>>>>>>> This patch add some common code for QCA/Atheros ath79 SOCs such as
>>>>>>> DDR tuning, chip reset and CPU detection.
>>>>>>>
>>>>>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>>>>>>> ---
>>>>>>>
>>>>>>> Changes in v8:
>>>>>>> - Use setbits_be32
>>>>>>> - Use lookup-table instead of big switch statement for CPU detection
>>>>>>>
>>>>>> Good stuff, minor nits below.
>>>> [...]
>>>>
>>>>>>> +phys_size_t initdram(int board_type)
>>>>>>> +{
>>>>>>> +    ddr_tap_tuning();
>>>>>> Is the DDR tap tuning needed on all AR7xxx/AR9xxx systems ?
>>>>> Yes, it's for optimizing DDR timing according to hardware.
>>>>> Sometimes, the hard code value is not ideal.
>>>> AR934x doesn't seem to need this.
>>> I seem the following code in u-boot from Atheros LSDK:
>>> #ifdef CONFIG_AP123
>>>      ath_ddr_tap_cal();
>> Where can I get the LSDK ? I'd like to take a look and add it into my
>> ar934x support patch.
> You can refer to u-boot from Atheros QSDK
> https://us.codeaurora.org/cgit/quic/qsdk/oss/boot/u-boot-1.1.4/
> It's almost same as u-boot from Atheros LSDK.
> The above snippet can be found in
> https://us.codeaurora.org/cgit/quic/qsdk/oss/boot/u-boot-1.1.4/tree/board/ar7240/ap123/ap123.c?h=1.1
> 
>>>>>>> +    return get_ram_size((void *)KSEG1, SZ_256M);
>>>>>>> +}
>>>>>>> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> new file mode 100644
>>>>>>> index 0000000..893dedc
>>>>>>> --- /dev/null
>>>>>>> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>>>>>>> @@ -0,0 +1,1184 @@
>>>>>>> +/*
>>>>>>> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
>>>>>>> + *
>>>>>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>>>>>> + * Copyright (C) 2010-2011 Jaiganesh Narayanan
>>>>>>> <jnarayanan@atheros.com>
>>>>>>> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
>>>>>>> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
>>>>>>> + *
>>>>>>> + * SPDX-License-Identifier:     GPL-2.0+
>>>>>>> + */
>>>>>>> +
>>>>>>> +#ifndef __ASM_MACH_AR71XX_REGS_H
>>>>>>> +#define __ASM_MACH_AR71XX_REGS_H
>>>>>>> +
>>>>>>> +#ifndef __ASSEMBLY__
>>>>>>> +#include <linux/bitops.h>
>>>>>>> +#else
>>>>>>> +#ifndef BIT
>>>>>>> +#define BIT(nr)                 (1 << (nr))
>>>>>> This should really go into some common header.
>>>>> This header is also included by some assembly code,
>>>>> but the BIT macro in linux/bitops.h isn't compatiable with assembler.
>>>> Because of the 1UL in it ?
>>> Yes, there are also a few other C keywords and syntax, such as in-line
>>> function.
>> Hmmmmm, it pains me to see such duplication, but I have no better idea
>> how to deal with it without introducing ifdefs.
>>
> 

Daniel, can we have this V8 applied, so I can start adding more stuff on
top of these patches into mainline ?

Thanks!

-- 
Best regards,
Marek Vasut

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

* [U-Boot] [PATCH v8 4/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores ar933x.
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 4/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores ar933x Wills Wang
@ 2016-04-09 18:34   ` Simon Glass
  0 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2016-04-09 18:34 UTC (permalink / raw)
  To: u-boot

On 16 March 2016 at 02:59, Wills Wang <wills.wang@live.com> wrote:
> This is a simple pinctrl driver, it just support uart and spi pin-mux now.
>
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---
>
> Changes in v8: None
> Changes in v7: None
> Changes in v6: None
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
>  drivers/pinctrl/Kconfig                |   9 +++
>  drivers/pinctrl/Makefile               |   1 +
>  drivers/pinctrl/ath79/Makefile         |   5 ++
>  drivers/pinctrl/ath79/pinctrl_ar933x.c | 136 +++++++++++++++++++++++++++++++++
>  4 files changed, 151 insertions(+)
>  create mode 100644 drivers/pinctrl/ath79/Makefile
>  create mode 100644 drivers/pinctrl/ath79/pinctrl_ar933x.c

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

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

* [U-Boot] [PATCH v8 5/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores qca953x.
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 5/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores qca953x Wills Wang
@ 2016-04-09 18:34   ` Simon Glass
  0 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2016-04-09 18:34 UTC (permalink / raw)
  To: u-boot

On 16 March 2016 at 02:59, Wills Wang <wills.wang@live.com> wrote:
> This is a simple pinctrl driver, it just support uart and spi pin-mux now.
>
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---
>
> Changes in v8: None
> Changes in v7: None
> Changes in v6: None
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
>  drivers/pinctrl/Kconfig                 |   9 ++
>  drivers/pinctrl/ath79/Makefile          |   1 +
>  drivers/pinctrl/ath79/pinctrl_qca953x.c | 156 ++++++++++++++++++++++++++++++++
>  3 files changed, 166 insertions(+)
>  create mode 100644 drivers/pinctrl/ath79/pinctrl_qca953x.c

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

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

* [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC Wills Wang
@ 2016-04-09 18:34   ` Simon Glass
  2016-04-11  7:57     ` Wills Wang
  0 siblings, 1 reply; 30+ messages in thread
From: Simon Glass @ 2016-04-09 18:34 UTC (permalink / raw)
  To: u-boot

Hi Wills,

On 16 March 2016 at 02:59, Wills Wang <wills.wang@live.com> wrote:
> This patch add support for ar933x serial.
>
> Reviewed-by: Thomas Chou <thomas@wytron.com.tw>
> Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> Signed-off-by: Wills Wang <wills.wang@live.com>

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

But please see a comment below.

> ---
>
> Changes in v8:
> - Remove ath79_serial_write/read
> - Use pinctrl for serial
> - Add Kconfig dependence for serial option
>
> Changes in v7:
> - remove map_physmem for debug port
>
> Changes in v6:
> - Remove wait loop in putc and getc
> - Use map_physmem instead of KSEG1ADDR
>
> Changes in v5:
> - remove ar933x_serial_platdata
> - Import document "qca,ar9330-uart.txt" from kernel
> - Add support for debug UART
>
> Changes in v4:
> - Auto calculate baudrate for serial driver
> - Move pinctrl code in serial driver into arch/mips/mach-ath79
> - Use get_serial_clock to serial clock source
>
> Changes in v3:
> - Convert serial driver to driver model
>
> Changes in v2:
> - Move serial driver code into drivers/serial
>
>  .../serial/qca,ar9330-uart.txt                     |  24 ++
>  drivers/serial/Kconfig                             |  18 ++
>  drivers/serial/Makefile                            |   1 +
>  drivers/serial/serial_ar933x.c                     | 255 +++++++++++++++++++++
>  4 files changed, 298 insertions(+)
>  create mode 100644 doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>  create mode 100644 drivers/serial/serial_ar933x.c
>
> diff --git a/doc/device-tree-bindings/serial/qca,ar9330-uart.txt b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
> new file mode 100644
> index 0000000..ec576a1
> --- /dev/null
> +++ b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
> @@ -0,0 +1,24 @@
> +* Qualcomm Atheros AR9330 High-Speed UART
> +
> +Required properties:
> +
> +- compatible: Must be "qca,ar9330-uart"
> +
> +- reg: Specifies the physical base address of the controller and
> +  the length of the memory mapped region.
> +
> +Additional requirements:
> +
> +  Each UART port must have an alias correctly numbered in "aliases"
> +  node.
> +
> +Example:
> +
> +       aliases {
> +               serial0 = &uart0;
> +       };
> +
> +       uart0: uart at 18020000 {
> +               compatible = "qca,ar9330-uart";
> +               reg = <0x18020000 0x14>;
> +       };
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index 92d4212..d451441 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -89,6 +89,15 @@ config DEBUG_UART_ALTERA_UART
>           You will need to provide parameters to make this work. The driver will
>           be available until the real driver model serial is running.
>
> +config DEBUG_UART_AR933X
> +       bool "QCA/Atheros ar933x"
> +       depends on AR933X_UART
> +       help
> +         Select this to enable a debug UART using the ar933x uart driver.
> +         You will need to provide parameters to make this work. The
> +         driver will be available until the real driver model serial is
> +         running.
> +
>  config DEBUG_UART_NS16550
>         bool "ns16550"
>         help
> @@ -254,6 +263,15 @@ config ALTERA_UART
>           Select this to enable an UART for Altera devices. Please find
>           details on the "Embedded Peripherals IP User Guide" of Altera.
>
> +config AR933X_UART
> +       bool "QCA/Atheros ar933x UART support"
> +       depends on DM_SERIAL && SOC_AR933X
> +       help
> +         Select this to enable UART support for QCA/Atheros ar933x
> +         devices. This driver uses driver model and requires a device
> +         tree binding to operate, please refer to the document at
> +         doc/device-tree-bindings/serial/qca,ar9330-uart.txt.
> +
>  config FSL_LPUART
>         bool "Freescale LPUART support"
>         help
> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
> index 05bdf56..42e493a 100644
> --- a/drivers/serial/Makefile
> +++ b/drivers/serial/Makefile
> @@ -17,6 +17,7 @@ endif
>
>  obj-$(CONFIG_ALTERA_UART) += altera_uart.o
>  obj-$(CONFIG_ALTERA_JTAG_UART) += altera_jtag_uart.o
> +obj-$(CONFIG_AR933X_UART) += serial_ar933x.o
>  obj-$(CONFIG_ARM_DCC) += arm_dcc.o
>  obj-$(CONFIG_ATMEL_USART) += atmel_usart.o
>  obj-$(CONFIG_EFI_APP) += serial_efi.o
> diff --git a/drivers/serial/serial_ar933x.c b/drivers/serial/serial_ar933x.c
> new file mode 100644
> index 0000000..d43f9c9
> --- /dev/null
> +++ b/drivers/serial/serial_ar933x.c
> @@ -0,0 +1,255 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <div64.h>
> +#include <errno.h>
> +#include <serial.h>
> +#include <asm/io.h>
> +#include <asm/addrspace.h>
> +#include <asm/types.h>
> +#include <dm/pinctrl.h>
> +#include <mach/ar71xx_regs.h>
> +
> +#define AR933X_UART_DATA_REG            0x00
> +#define AR933X_UART_CS_REG              0x04
> +#define AR933X_UART_CLK_REG             0x08
> +
> +#define AR933X_UART_DATA_TX_RX_MASK     0xff
> +#define AR933X_UART_DATA_RX_CSR         BIT(8)
> +#define AR933X_UART_DATA_TX_CSR         BIT(9)
> +#define AR933X_UART_CS_IF_MODE_S        2
> +#define AR933X_UART_CS_IF_MODE_M        0x3
> +#define AR933X_UART_CS_IF_MODE_DTE      1
> +#define AR933X_UART_CS_IF_MODE_DCE      2
> +#define AR933X_UART_CS_TX_RDY_ORIDE     BIT(7)
> +#define AR933X_UART_CS_RX_RDY_ORIDE     BIT(8)
> +#define AR933X_UART_CLK_STEP_M          0xffff
> +#define AR933X_UART_CLK_SCALE_M         0xfff
> +#define AR933X_UART_CLK_SCALE_S         16
> +#define AR933X_UART_CLK_STEP_S          0
> +
> +struct ar933x_serial_priv {
> +       void __iomem *regs;
> +};
> +
> +/*
> + * baudrate = (clk / (scale + 1)) * (step * (1 / 2^17))
> + */
> +static u32 ar933x_serial_get_baud(u32 clk, u32 scale, u32 step)
> +{
> +       u64 t;
> +       u32 div;
> +
> +       div = (2 << 16) * (scale + 1);
> +       t = clk;
> +       t *= step;
> +       t += (div / 2);
> +       do_div(t, div);
> +
> +       return t;
> +}
> +
> +static void ar933x_serial_get_scale_step(u32 clk, u32 baud,
> +                                        u32 *scale, u32 *step)
> +{
> +       u32 tscale, baudrate;
> +       long min_diff;
> +
> +       *scale = 0;
> +       *step = 0;
> +
> +       min_diff = baud;
> +       for (tscale = 0; tscale < AR933X_UART_CLK_SCALE_M; tscale++) {
> +               u64 tstep;
> +               int diff;
> +
> +               tstep = baud * (tscale + 1);
> +               tstep *= (2 << 16);
> +               do_div(tstep, clk);
> +
> +               if (tstep > AR933X_UART_CLK_STEP_M)
> +                       break;
> +
> +               baudrate = ar933x_serial_get_baud(clk, tscale, tstep);
> +               diff = abs(baudrate - baud);
> +               if (diff < min_diff) {
> +                       min_diff = diff;
> +                       *scale = tscale;
> +                       *step = tstep;
> +               }
> +       }
> +}
> +
> +static int ar933x_serial_setbrg(struct udevice *dev, int baudrate)
> +{
> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
> +       u32 val, scale, step;
> +
> +       val = get_serial_clock();
> +       ar933x_serial_get_scale_step(val, baudrate, &scale, &step);
> +
> +       val  = (scale & AR933X_UART_CLK_SCALE_M)
> +                       << AR933X_UART_CLK_SCALE_S;
> +       val |= (step & AR933X_UART_CLK_STEP_M)
> +                       << AR933X_UART_CLK_STEP_S;
> +       writel(val, priv->regs + AR933X_UART_CLK_REG);
> +
> +       return 0;
> +}
> +
> +static int ar933x_serial_putc(struct udevice *dev, const char c)
> +{
> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
> +       u32 data;
> +
> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
> +       if (!(data & AR933X_UART_DATA_TX_CSR))
> +               return -EAGAIN;
> +
> +       data  = (u32)c | AR933X_UART_DATA_TX_CSR;
> +       writel(data, priv->regs + AR933X_UART_DATA_REG);
> +
> +       return 0;
> +}
> +
> +static int ar933x_serial_getc(struct udevice *dev)
> +{
> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
> +       u32 data;
> +
> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
> +       if (!(data & AR933X_UART_DATA_RX_CSR))
> +               return -EAGAIN;
> +
> +       writel(AR933X_UART_DATA_RX_CSR, priv->regs + AR933X_UART_DATA_REG);
> +       return data & AR933X_UART_DATA_TX_RX_MASK;
> +}
> +
> +static int ar933x_serial_pending(struct udevice *dev, bool input)
> +{
> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
> +       u32 data;
> +
> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
> +       if (input)
> +               return (data & AR933X_UART_DATA_RX_CSR) ? 1 : 0;
> +       else
> +               return (data & AR933X_UART_DATA_TX_CSR) ? 0 : 1;
> +}
> +
> +static int ar933x_serial_probe(struct udevice *dev)
> +{
> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
> +       struct udevice *pinctrl;
> +       fdt_addr_t addr;
> +       u32 val;
> +       int ret;
> +
> +       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
> +       if (ret)
> +               return ret;
> +       ret = pinctrl_get_periph_id(pinctrl, dev);
> +       if (ret < 0)
> +               return ret;
> +       ret = pinctrl_request(pinctrl, ret, 0);
> +       if (ret < 0)
> +               return ret;

().Can you check if you need this? It should be called automatically
by device_probe() which calls pinctrl_select_state().

> +
> +       addr = dev_get_addr(dev);
> +       if (addr == FDT_ADDR_T_NONE)
> +               return -EINVAL;
> +
> +       priv->regs = map_physmem(addr,
> +                                AR933X_UART_SIZE,
> +                                MAP_NOCACHE);

can you fill this out to 80cols?

> +
> +       /*
> +        * UART controller configuration:
> +        * - no DMA
> +        * - no interrupt
> +        * - DCE mode
> +        * - no flow control
> +        * - set RX ready oride
> +        * - set TX ready oride
> +        */
> +       val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
> +             AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
> +       writel(val, priv->regs + AR933X_UART_CS_REG);
> +       return 0;
> +}
> +
> +static const struct dm_serial_ops ar933x_serial_ops = {
> +       .putc = ar933x_serial_putc,
> +       .pending = ar933x_serial_pending,
> +       .getc = ar933x_serial_getc,
> +       .setbrg = ar933x_serial_setbrg,
> +};
> +
> +static const struct udevice_id ar933x_serial_ids[] = {
> +       { .compatible = "qca,ar9330-uart" },
> +       { }
> +};
> +
> +U_BOOT_DRIVER(serial_ar933x) = {
> +       .name   = "serial_ar933x",
> +       .id = UCLASS_SERIAL,
> +       .of_match = ar933x_serial_ids,
> +       .priv_auto_alloc_size = sizeof(struct ar933x_serial_priv),
> +       .probe = ar933x_serial_probe,
> +       .ops    = &ar933x_serial_ops,
> +       .flags = DM_FLAG_PRE_RELOC,
> +};
> +
> +#ifdef CONFIG_DEBUG_UART_AR933X
> +
> +#include <debug_uart.h>
> +
> +static inline void _debug_uart_init(void)
> +{
> +       void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
> +       u32 val, scale, step;
> +
> +       /*
> +        * UART controller configuration:
> +        * - no DMA
> +        * - no interrupt
> +        * - DCE mode
> +        * - no flow control
> +        * - set RX ready oride
> +        * - set TX ready oride
> +        */
> +       val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
> +             AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
> +       writel(val, regs + AR933X_UART_CS_REG);
> +
> +       ar933x_serial_get_scale_step(CONFIG_DEBUG_UART_CLOCK,
> +                                    CONFIG_BAUDRATE, &scale, &step);
> +
> +       val  = (scale & AR933X_UART_CLK_SCALE_M)
> +                       << AR933X_UART_CLK_SCALE_S;
> +       val |= (step & AR933X_UART_CLK_STEP_M)
> +                       << AR933X_UART_CLK_STEP_S;
> +       writel(val, regs + AR933X_UART_CLK_REG);
> +}
> +
> +static inline void _debug_uart_putc(int c)
> +{
> +       void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
> +       u32 data;
> +
> +       do {
> +               data = readl(regs + AR933X_UART_DATA_REG);
> +       } while (!(data & AR933X_UART_DATA_TX_CSR));
> +
> +       data  = (u32)c | AR933X_UART_DATA_TX_CSR;
> +       writel(data, regs + AR933X_UART_DATA_REG);
> +}
> +
> +DEBUG_UART_FUNCS
> +
> +#endif
> --
> 1.9.1
>

Regards,
Simon

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

* [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs
  2016-03-16  8:59 ` [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs Wills Wang
  2016-03-16 21:35   ` Marek Vasut
@ 2016-04-10 18:35   ` Daniel Schwierzeck
  1 sibling, 0 replies; 30+ messages in thread
From: Daniel Schwierzeck @ 2016-04-10 18:35 UTC (permalink / raw)
  To: u-boot



Am 16.03.2016 um 09:59 schrieb Wills Wang:
> This patch add some common code for QCA/Atheros ath79 SOCs such as
> DDR tuning, chip reset and CPU detection.
> 
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---

all nine patches applied to u-boot-mips/next, thanks.

> 
> Changes in v8:
> - Use setbits_be32
> - Use lookup-table instead of big switch statement for CPU detection
> 
> Changes in v7:
> - Use setbits_32
> - Fix include path for SoC specific headers
> 
> Changes in v6:
> - Move ar933x as separate patch
> - Add get_bootstrap in reset.c
> - Use map_physmem instead of KSEG1ADDR
> - Add arch_cpu_init for detect SOC type for early
> 
> Changes in v5:
> - Add independent Kconfig
> - Use SRAM for initial stack
> - Move DDR initialization into board_early_init_f
> - Convert DDR tap tunning code to C
> - Save SOC's version into arch_global_data
> 
> Changes in v4:
> - Use global_data to save CPU/DDR/AHB clock
> - Use arch_global_data to save SOC's type, revison and id
> 
> Changes in v3:
> - Move SoC specific header files into arch/mips/mach-ath79/include/mach
> - Optimize assembly code
> - Same code style convertion
> 
> Changes in v2:
> - Move all SoC specific header files into arch/mips/include/asm/arch-ath79
> - Check SOC type and extract common code into arch/mips/mach-ath79
> 
>  arch/mips/Kconfig                               |    6 +
>  arch/mips/Makefile                              |    1 +
>  arch/mips/include/asm/global_data.h             |    6 +
>  arch/mips/mach-ath79/Kconfig                    |    7 +
>  arch/mips/mach-ath79/Makefile                   |    7 +
>  arch/mips/mach-ath79/cpu.c                      |  142 +++
>  arch/mips/mach-ath79/dram.c                     |   16 +
>  arch/mips/mach-ath79/include/mach/ar71xx_regs.h | 1184 +++++++++++++++++++++++
>  arch/mips/mach-ath79/include/mach/ath79.h       |  143 +++
>  arch/mips/mach-ath79/include/mach/ddr.h         |   13 +
>  arch/mips/mach-ath79/include/mach/reset.h       |   14 +
>  arch/mips/mach-ath79/reset.c                    |   71 ++
>  12 files changed, 1610 insertions(+)
>  create mode 100644 arch/mips/mach-ath79/Kconfig
>  create mode 100644 arch/mips/mach-ath79/Makefile
>  create mode 100644 arch/mips/mach-ath79/cpu.c
>  create mode 100644 arch/mips/mach-ath79/dram.c
>  create mode 100644 arch/mips/mach-ath79/include/mach/ar71xx_regs.h
>  create mode 100644 arch/mips/mach-ath79/include/mach/ath79.h
>  create mode 100644 arch/mips/mach-ath79/include/mach/ddr.h
>  create mode 100644 arch/mips/mach-ath79/include/mach/reset.h
>  create mode 100644 arch/mips/mach-ath79/reset.c
> 
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index f852a1f..fbedb29 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -55,6 +55,11 @@ config TARGET_PB1X00
>  	select SYS_MIPS_CACHE_INIT_RAM_LOAD
>  	select MIPS_TUNE_4KC
>  
> +config ARCH_ATH79
> +	bool "Support QCA/Atheros ath79"
> +	select OF_CONTROL
> +	select DM
> +
>  config MACH_PIC32
>  	bool "Support Microchip PIC32"
>  	select OF_CONTROL
> @@ -67,6 +72,7 @@ source "board/imgtec/malta/Kconfig"
>  source "board/micronas/vct/Kconfig"
>  source "board/pb1x00/Kconfig"
>  source "board/qemu-mips/Kconfig"
> +source "arch/mips/mach-ath79/Kconfig"
>  source "arch/mips/mach-pic32/Kconfig"
>  
>  if MIPS
> diff --git a/arch/mips/Makefile b/arch/mips/Makefile
> index aec5a15..7a82316 100644
> --- a/arch/mips/Makefile
> +++ b/arch/mips/Makefile
> @@ -8,6 +8,7 @@ libs-y += arch/mips/cpu/
>  libs-y += arch/mips/lib/
>  
>  machine-$(CONFIG_SOC_AU1X00) += au1x00
> +machine-$(CONFIG_ARCH_ATH79) += ath79
>  machine-$(CONFIG_MACH_PIC32) += pic32
>  
>  machdirs := $(patsubst %,arch/mips/mach-%/,$(machine-y))
> diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
> index a1ca257..3f230b0 100644
> --- a/arch/mips/include/asm/global_data.h
> +++ b/arch/mips/include/asm/global_data.h
> @@ -23,6 +23,12 @@ struct arch_global_data {
>  	unsigned long tbl;
>  	unsigned long lastinc;
>  #endif
> +#ifdef CONFIG_ARCH_ATH79
> +	unsigned long id;
> +	unsigned long soc;
> +	unsigned long rev;
> +	unsigned long ver;
> +#endif
>  };
>  
>  #include <asm-generic/global_data.h>
> diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
> new file mode 100644
> index 0000000..7d8ce09
> --- /dev/null
> +++ b/arch/mips/mach-ath79/Kconfig
> @@ -0,0 +1,7 @@
> +menu "QCA/Atheros 7xxx/9xxx platforms"
> +	depends on ARCH_ATH79
> +
> +config SYS_SOC
> +	default "ath79"
> +
> +endmenu
> diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile
> new file mode 100644
> index 0000000..6203cf0
> --- /dev/null
> +++ b/arch/mips/mach-ath79/Makefile
> @@ -0,0 +1,7 @@
> +#
> +# SPDX-License-Identifier:	GPL-2.0+
> +#
> +
> +obj-y += reset.o
> +obj-y += cpu.o
> +obj-y += dram.o
> diff --git a/arch/mips/mach-ath79/cpu.c b/arch/mips/mach-ath79/cpu.c
> new file mode 100644
> index 0000000..c6122f2
> --- /dev/null
> +++ b/arch/mips/mach-ath79/cpu.c
> @@ -0,0 +1,142 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/addrspace.h>
> +#include <asm/types.h>
> +#include <mach/ath79.h>
> +#include <mach/ar71xx_regs.h>
> +
> +struct ath79_soc_desc {
> +	enum ath79_soc_type soc;
> +	const char *chip;
> +	int major;
> +	int minor;
> +};
> +
> +static struct ath79_soc_desc desc[] = {
> +	{ATH79_SOC_AR7130,      "7130",
> +	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7130},
> +	{ATH79_SOC_AR7141,      "7141",
> +	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7141},
> +	{ATH79_SOC_AR7161,      "7161",
> +	 REV_ID_MAJOR_AR71XX,   AR71XX_REV_ID_MINOR_AR7161},
> +	{ATH79_SOC_AR7240,      "7240", REV_ID_MAJOR_AR7240,    0},
> +	{ATH79_SOC_AR7241,      "7241", REV_ID_MAJOR_AR7241,    0},
> +	{ATH79_SOC_AR7242,      "7242", REV_ID_MAJOR_AR7242,    0},
> +	{ATH79_SOC_AR9130,      "9130",
> +	 REV_ID_MAJOR_AR913X,   AR913X_REV_ID_MINOR_AR9130},
> +	{ATH79_SOC_AR9132,      "9132",
> +	 REV_ID_MAJOR_AR913X,   AR913X_REV_ID_MINOR_AR9132},
> +	{ATH79_SOC_AR9330,      "9330", REV_ID_MAJOR_AR9330,    0},
> +	{ATH79_SOC_AR9331,      "9331", REV_ID_MAJOR_AR9331,    0},
> +	{ATH79_SOC_AR9341,      "9341", REV_ID_MAJOR_AR9341,    0},
> +	{ATH79_SOC_AR9342,      "9342", REV_ID_MAJOR_AR9342,    0},
> +	{ATH79_SOC_AR9344,      "9344", REV_ID_MAJOR_AR9344,    0},
> +	{ATH79_SOC_QCA9533,     "9533", REV_ID_MAJOR_QCA9533,   0},
> +	{ATH79_SOC_QCA9533,     "9533",
> +	 REV_ID_MAJOR_QCA9533_V2,       0},
> +	{ATH79_SOC_QCA9556,     "9556", REV_ID_MAJOR_QCA9556,   0},
> +	{ATH79_SOC_QCA9558,     "9558", REV_ID_MAJOR_QCA9558,   0},
> +	{ATH79_SOC_TP9343,      "9343", REV_ID_MAJOR_TP9343,    0},
> +	{ATH79_SOC_QCA9561,     "9561", REV_ID_MAJOR_QCA9561,   0},
> +};
> +
> +int arch_cpu_init(void)
> +{
> +	void __iomem *base;
> +	enum ath79_soc_type soc = ATH79_SOC_UNKNOWN;
> +	u32 id, major, minor = 0;
> +	u32 rev = 0, ver = 1;
> +	int i;
> +
> +	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
> +			   MAP_NOCACHE);
> +
> +	id = readl(base + AR71XX_RESET_REG_REV_ID);
> +	major = id & REV_ID_MAJOR_MASK;
> +	switch (major) {
> +	case REV_ID_MAJOR_AR71XX:
> +	case REV_ID_MAJOR_AR913X:
> +		minor = id & AR71XX_REV_ID_MINOR_MASK;
> +		rev = id >> AR71XX_REV_ID_REVISION_SHIFT;
> +		rev &= AR71XX_REV_ID_REVISION_MASK;
> +		break;
> +
> +	case REV_ID_MAJOR_QCA9533_V2:
> +		ver = 2;
> +		/* drop through */
> +
> +	case REV_ID_MAJOR_AR9341:
> +	case REV_ID_MAJOR_AR9342:
> +	case REV_ID_MAJOR_AR9344:
> +	case REV_ID_MAJOR_QCA9533:
> +	case REV_ID_MAJOR_QCA9556:
> +	case REV_ID_MAJOR_QCA9558:
> +	case REV_ID_MAJOR_TP9343:
> +	case REV_ID_MAJOR_QCA9561:
> +		rev = id & AR71XX_REV_ID_REVISION2_MASK;
> +		break;
> +	default:
> +		rev = id & AR71XX_REV_ID_REVISION_MASK;
> +		break;
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(desc); i++) {
> +		if ((desc[i].major == major) &&
> +		    (desc[i].minor == minor)) {
> +			soc = desc[i].soc;
> +			break;
> +		}
> +	}
> +
> +	gd->arch.id = id;
> +	gd->arch.soc = soc;
> +	gd->arch.rev = rev;
> +	gd->arch.ver = ver;
> +	return 0;
> +}
> +
> +int print_cpuinfo(void)
> +{
> +	enum ath79_soc_type soc = ATH79_SOC_UNKNOWN;
> +	const char *chip = "????";
> +	u32 id, rev, ver;
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(desc); i++) {
> +		if (desc[i].soc == gd->arch.soc) {
> +			chip = desc[i].chip;
> +			soc = desc[i].soc;
> +			break;
> +		}
> +	}
> +
> +	id = gd->arch.id;
> +	rev = gd->arch.rev;
> +	ver = gd->arch.ver;
> +
> +	switch (soc) {
> +	case ATH79_SOC_QCA9533:
> +	case ATH79_SOC_QCA9556:
> +	case ATH79_SOC_QCA9558:
> +	case ATH79_SOC_QCA9561:
> +		printf("Qualcomm Atheros QCA%s ver %u rev %u\n", chip,
> +		       ver, rev);
> +		break;
> +	case ATH79_SOC_TP9343:
> +		printf("Qualcomm Atheros TP%s rev %u\n", chip, rev);
> +		break;
> +	case ATH79_SOC_UNKNOWN:
> +		printf("ATH79: unknown SoC, id:0x%08x", id);
> +		break;
> +	default:
> +		printf("Atheros AR%s rev %u\n", chip, rev);
> +	}
> +
> +	return 0;
> +}
> diff --git a/arch/mips/mach-ath79/dram.c b/arch/mips/mach-ath79/dram.c
> new file mode 100644
> index 0000000..c29e98c
> --- /dev/null
> +++ b/arch/mips/mach-ath79/dram.c
> @@ -0,0 +1,16 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <linux/sizes.h>
> +#include <asm/addrspace.h>
> +#include <mach/ddr.h>
> +
> +phys_size_t initdram(int board_type)
> +{
> +	ddr_tap_tuning();
> +	return get_ram_size((void *)KSEG1, SZ_256M);
> +}
> diff --git a/arch/mips/mach-ath79/include/mach/ar71xx_regs.h b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
> new file mode 100644
> index 0000000..893dedc
> --- /dev/null
> +++ b/arch/mips/mach-ath79/include/mach/ar71xx_regs.h
> @@ -0,0 +1,1184 @@
> +/*
> + * Atheros AR71XX/AR724X/AR913X SoC register definitions
> + *
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
> + * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */
> +
> +#ifndef __ASM_MACH_AR71XX_REGS_H
> +#define __ASM_MACH_AR71XX_REGS_H
> +
> +#ifndef __ASSEMBLY__
> +#include <linux/bitops.h>
> +#else
> +#ifndef BIT
> +#define BIT(nr)                 (1 << (nr))
> +#endif
> +#endif
> +
> +#define AR71XX_APB_BASE                 0x18000000
> +#define AR71XX_GE0_BASE                 0x19000000
> +#define AR71XX_GE0_SIZE                 0x10000
> +#define AR71XX_GE1_BASE                 0x1a000000
> +#define AR71XX_GE1_SIZE                 0x10000
> +#define AR71XX_EHCI_BASE                0x1b000000
> +#define AR71XX_EHCI_SIZE                0x1000
> +#define AR71XX_OHCI_BASE                0x1c000000
> +#define AR71XX_OHCI_SIZE                0x1000
> +#define AR71XX_SPI_BASE                 0x1f000000
> +#define AR71XX_SPI_SIZE                 0x01000000
> +
> +#define AR71XX_DDR_CTRL_BASE            (AR71XX_APB_BASE + 0x00000000)
> +#define AR71XX_DDR_CTRL_SIZE            0x100
> +#define AR71XX_UART_BASE                (AR71XX_APB_BASE + 0x00020000)
> +#define AR71XX_UART_SIZE                0x100
> +#define AR71XX_USB_CTRL_BASE            (AR71XX_APB_BASE + 0x00030000)
> +#define AR71XX_USB_CTRL_SIZE            0x100
> +#define AR71XX_GPIO_BASE                (AR71XX_APB_BASE + 0x00040000)
> +#define AR71XX_GPIO_SIZE                0x100
> +#define AR71XX_PLL_BASE                 (AR71XX_APB_BASE + 0x00050000)
> +#define AR71XX_PLL_SIZE                 0x100
> +#define AR71XX_RESET_BASE               (AR71XX_APB_BASE + 0x00060000)
> +#define AR71XX_RESET_SIZE               0x100
> +#define AR71XX_MII_BASE                 (AR71XX_APB_BASE + 0x00070000)
> +#define AR71XX_MII_SIZE                 0x100
> +
> +#define AR71XX_PCI_MEM_BASE             0x10000000
> +#define AR71XX_PCI_MEM_SIZE             0x07000000
> +
> +#define AR71XX_PCI_WIN0_OFFS            0x10000000
> +#define AR71XX_PCI_WIN1_OFFS            0x11000000
> +#define AR71XX_PCI_WIN2_OFFS            0x12000000
> +#define AR71XX_PCI_WIN3_OFFS            0x13000000
> +#define AR71XX_PCI_WIN4_OFFS            0x14000000
> +#define AR71XX_PCI_WIN5_OFFS            0x15000000
> +#define AR71XX_PCI_WIN6_OFFS            0x16000000
> +#define AR71XX_PCI_WIN7_OFFS            0x07000000
> +
> +#define AR71XX_PCI_CFG_BASE \
> +	(AR71XX_PCI_MEM_BASE + AR71XX_PCI_WIN7_OFFS + 0x10000)
> +#define AR71XX_PCI_CFG_SIZE             0x100
> +
> +#define AR7240_USB_CTRL_BASE            (AR71XX_APB_BASE + 0x00030000)
> +#define AR7240_USB_CTRL_SIZE            0x100
> +#define AR7240_OHCI_BASE                0x1b000000
> +#define AR7240_OHCI_SIZE                0x1000
> +
> +#define AR724X_PCI_MEM_BASE             0x10000000
> +#define AR724X_PCI_MEM_SIZE             0x04000000
> +
> +#define AR724X_PCI_CFG_BASE             0x14000000
> +#define AR724X_PCI_CFG_SIZE             0x1000
> +#define AR724X_PCI_CRP_BASE             (AR71XX_APB_BASE + 0x000c0000)
> +#define AR724X_PCI_CRP_SIZE             0x1000
> +#define AR724X_PCI_CTRL_BASE            (AR71XX_APB_BASE + 0x000f0000)
> +#define AR724X_PCI_CTRL_SIZE            0x100
> +
> +#define AR724X_EHCI_BASE                0x1b000000
> +#define AR724X_EHCI_SIZE                0x1000
> +
> +#define AR913X_EHCI_BASE                0x1b000000
> +#define AR913X_EHCI_SIZE                0x1000
> +#define AR913X_WMAC_BASE                (AR71XX_APB_BASE + 0x000C0000)
> +#define AR913X_WMAC_SIZE                0x30000
> +
> +#define AR933X_UART_BASE                (AR71XX_APB_BASE + 0x00020000)
> +#define AR933X_UART_SIZE                0x14
> +#define AR933X_GMAC_BASE                (AR71XX_APB_BASE + 0x00070000)
> +#define AR933X_GMAC_SIZE                0x04
> +#define AR933X_WMAC_BASE                (AR71XX_APB_BASE + 0x00100000)
> +#define AR933X_WMAC_SIZE                0x20000
> +#define AR933X_RTC_BASE                 (AR71XX_APB_BASE + 0x00107000)
> +#define AR933X_RTC_SIZE                 0x1000
> +#define AR933X_EHCI_BASE                0x1b000000
> +#define AR933X_EHCI_SIZE                0x1000
> +#define AR933X_SRIF_BASE                (AR71XX_APB_BASE + 0x00116000)
> +#define AR933X_SRIF_SIZE                0x1000
> +
> +#define AR934X_GMAC_BASE                (AR71XX_APB_BASE + 0x00070000)
> +#define AR934X_GMAC_SIZE                0x14
> +#define AR934X_WMAC_BASE                (AR71XX_APB_BASE + 0x00100000)
> +#define AR934X_WMAC_SIZE                0x20000
> +#define AR934X_EHCI_BASE                0x1b000000
> +#define AR934X_EHCI_SIZE                0x200
> +#define AR934X_NFC_BASE                 0x1b000200
> +#define AR934X_NFC_SIZE                 0xb8
> +#define AR934X_SRIF_BASE                (AR71XX_APB_BASE + 0x00116000)
> +#define AR934X_SRIF_SIZE                0x1000
> +
> +#define QCA953X_GMAC_BASE               (AR71XX_APB_BASE + 0x00070000)
> +#define QCA953X_GMAC_SIZE               0x14
> +#define QCA953X_WMAC_BASE               (AR71XX_APB_BASE + 0x00100000)
> +#define QCA953X_WMAC_SIZE               0x20000
> +#define QCA953X_RTC_BASE                (AR71XX_APB_BASE + 0x00107000)
> +#define QCA953X_RTC_SIZE                0x1000
> +#define QCA953X_EHCI_BASE               0x1b000000
> +#define QCA953X_EHCI_SIZE               0x200
> +#define QCA953X_SRIF_BASE               (AR71XX_APB_BASE + 0x00116000)
> +#define QCA953X_SRIF_SIZE               0x1000
> +
> +#define QCA953X_PCI_CFG_BASE0           0x14000000
> +#define QCA953X_PCI_CTRL_BASE0          (AR71XX_APB_BASE + 0x000f0000)
> +#define QCA953X_PCI_CRP_BASE0           (AR71XX_APB_BASE + 0x000c0000)
> +#define QCA953X_PCI_MEM_BASE0           0x10000000
> +#define QCA953X_PCI_MEM_SIZE            0x02000000
> +
> +#define QCA955X_PCI_MEM_BASE0           0x10000000
> +#define QCA955X_PCI_MEM_BASE1           0x12000000
> +#define QCA955X_PCI_MEM_SIZE            0x02000000
> +#define QCA955X_PCI_CFG_BASE0           0x14000000
> +#define QCA955X_PCI_CFG_BASE1           0x16000000
> +#define QCA955X_PCI_CFG_SIZE            0x1000
> +#define QCA955X_PCI_CRP_BASE0           (AR71XX_APB_BASE + 0x000c0000)
> +#define QCA955X_PCI_CRP_BASE1           (AR71XX_APB_BASE + 0x00250000)
> +#define QCA955X_PCI_CRP_SIZE            0x1000
> +#define QCA955X_PCI_CTRL_BASE0          (AR71XX_APB_BASE + 0x000f0000)
> +#define QCA955X_PCI_CTRL_BASE1          (AR71XX_APB_BASE + 0x00280000)
> +#define QCA955X_PCI_CTRL_SIZE           0x100
> +
> +#define QCA955X_GMAC_BASE               (AR71XX_APB_BASE + 0x00070000)
> +#define QCA955X_GMAC_SIZE               0x40
> +#define QCA955X_WMAC_BASE               (AR71XX_APB_BASE + 0x00100000)
> +#define QCA955X_WMAC_SIZE               0x20000
> +#define QCA955X_EHCI0_BASE              0x1b000000
> +#define QCA955X_EHCI1_BASE              0x1b400000
> +#define QCA955X_EHCI_SIZE               0x1000
> +#define QCA955X_NFC_BASE                0x1b800200
> +#define QCA955X_NFC_SIZE                0xb8
> +
> +#define QCA956X_PCI_MEM_BASE1           0x12000000
> +#define QCA956X_PCI_MEM_SIZE            0x02000000
> +#define QCA956X_PCI_CFG_BASE1           0x16000000
> +#define QCA956X_PCI_CFG_SIZE            0x1000
> +#define QCA956X_PCI_CRP_BASE1           (AR71XX_APB_BASE + 0x00250000)
> +#define QCA956X_PCI_CRP_SIZE            0x1000
> +#define QCA956X_PCI_CTRL_BASE1          (AR71XX_APB_BASE + 0x00280000)
> +#define QCA956X_PCI_CTRL_SIZE           0x100
> +
> +#define QCA956X_WMAC_BASE               (AR71XX_APB_BASE + 0x00100000)
> +#define QCA956X_WMAC_SIZE               0x20000
> +#define QCA956X_EHCI0_BASE              0x1b000000
> +#define QCA956X_EHCI1_BASE              0x1b400000
> +#define QCA956X_EHCI_SIZE               0x200
> +#define QCA956X_GMAC_BASE               (AR71XX_APB_BASE + 0x00070000)
> +#define QCA956X_GMAC_SIZE               0x64
> +
> +/*
> + * DDR_CTRL block
> + */
> +#define AR71XX_DDR_REG_CONFIG                           0x00
> +#define AR71XX_DDR_REG_CONFIG2                          0x04
> +#define AR71XX_DDR_REG_MODE                             0x08
> +#define AR71XX_DDR_REG_EMR                              0x0c
> +#define AR71XX_DDR_REG_CONTROL                          0x10
> +#define AR71XX_DDR_REG_REFRESH                          0x14
> +#define AR71XX_DDR_REG_RD_CYCLE                         0x18
> +#define AR71XX_DDR_REG_TAP_CTRL0                        0x1c
> +#define AR71XX_DDR_REG_TAP_CTRL1                        0x20
> +
> +#define AR71XX_DDR_REG_PCI_WIN0                         0x7c
> +#define AR71XX_DDR_REG_PCI_WIN1                         0x80
> +#define AR71XX_DDR_REG_PCI_WIN2                         0x84
> +#define AR71XX_DDR_REG_PCI_WIN3                         0x88
> +#define AR71XX_DDR_REG_PCI_WIN4                         0x8c
> +#define AR71XX_DDR_REG_PCI_WIN5                         0x90
> +#define AR71XX_DDR_REG_PCI_WIN6                         0x94
> +#define AR71XX_DDR_REG_PCI_WIN7                         0x98
> +#define AR71XX_DDR_REG_FLUSH_GE0                        0x9c
> +#define AR71XX_DDR_REG_FLUSH_GE1                        0xa0
> +#define AR71XX_DDR_REG_FLUSH_USB                        0xa4
> +#define AR71XX_DDR_REG_FLUSH_PCI                        0xa8
> +
> +#define AR724X_DDR_REG_FLUSH_GE0                        0x7c
> +#define AR724X_DDR_REG_FLUSH_GE1                        0x80
> +#define AR724X_DDR_REG_FLUSH_USB                        0x84
> +#define AR724X_DDR_REG_FLUSH_PCIE                       0x88
> +
> +#define AR913X_DDR_REG_FLUSH_GE0                        0x7c
> +#define AR913X_DDR_REG_FLUSH_GE1                        0x80
> +#define AR913X_DDR_REG_FLUSH_USB                        0x84
> +#define AR913X_DDR_REG_FLUSH_WMAC                       0x88
> +
> +#define AR933X_DDR_REG_FLUSH_GE0                        0x7c
> +#define AR933X_DDR_REG_FLUSH_GE1                        0x80
> +#define AR933X_DDR_REG_FLUSH_USB                        0x84
> +#define AR933X_DDR_REG_FLUSH_WMAC                       0x88
> +#define AR933X_DDR_REG_DDR2_CONFIG                      0x8c
> +#define AR933X_DDR_REG_EMR2                             0x90
> +#define AR933X_DDR_REG_EMR3                             0x94
> +#define AR933X_DDR_REG_BURST                            0x98
> +#define AR933X_DDR_REG_TIMEOUT_MAX                      0x9c
> +#define AR933X_DDR_REG_TIMEOUT_CNT                      0x9c
> +#define AR933X_DDR_REG_TIMEOUT_ADDR                     0x9c
> +
> +#define AR934X_DDR_REG_FLUSH_GE0                        0x9c
> +#define AR934X_DDR_REG_FLUSH_GE1                        0xa0
> +#define AR934X_DDR_REG_FLUSH_USB                        0xa4
> +#define AR934X_DDR_REG_FLUSH_PCIE                       0xa8
> +#define AR934X_DDR_REG_FLUSH_WMAC                       0xac
> +
> +#define QCA953X_DDR_REG_FLUSH_GE0                       0x9c
> +#define QCA953X_DDR_REG_FLUSH_GE1                       0xa0
> +#define QCA953X_DDR_REG_FLUSH_USB                       0xa4
> +#define QCA953X_DDR_REG_FLUSH_PCIE                      0xa8
> +#define QCA953X_DDR_REG_FLUSH_WMAC                      0xac
> +#define QCA953X_DDR_REG_DDR2_CONFIG                     0xb8
> +#define QCA953X_DDR_REG_BURST                           0xc4
> +#define QCA953X_DDR_REG_BURST2                          0xc8
> +#define QCA953X_DDR_REG_TIMEOUT_MAX                     0xcc
> +#define QCA953X_DDR_REG_CTL_CONF                        0x108
> +#define QCA953X_DDR_REG_CONFIG3                         0x15c
> +
> +/*
> + * PLL block
> + */
> +#define AR71XX_PLL_REG_CPU_CONFIG                       0x00
> +#define AR71XX_PLL_REG_SEC_CONFIG                       0x04
> +#define AR71XX_PLL_REG_ETH0_INT_CLOCK                   0x10
> +#define AR71XX_PLL_REG_ETH1_INT_CLOCK                   0x14
> +
> +#define AR71XX_PLL_DIV_SHIFT                            3
> +#define AR71XX_PLL_DIV_MASK                             0x1f
> +#define AR71XX_CPU_DIV_SHIFT                            16
> +#define AR71XX_CPU_DIV_MASK                             0x3
> +#define AR71XX_DDR_DIV_SHIFT                            18
> +#define AR71XX_DDR_DIV_MASK                             0x3
> +#define AR71XX_AHB_DIV_SHIFT                            20
> +#define AR71XX_AHB_DIV_MASK                             0x7
> +
> +#define AR71XX_ETH0_PLL_SHIFT                           17
> +#define AR71XX_ETH1_PLL_SHIFT                           19
> +
> +#define AR724X_PLL_REG_CPU_CONFIG                       0x00
> +#define AR724X_PLL_REG_PCIE_CONFIG                      0x18
> +
> +#define AR724X_PLL_DIV_SHIFT                            0
> +#define AR724X_PLL_DIV_MASK                             0x3ff
> +#define AR724X_PLL_REF_DIV_SHIFT                        10
> +#define AR724X_PLL_REF_DIV_MASK                         0xf
> +#define AR724X_AHB_DIV_SHIFT                            19
> +#define AR724X_AHB_DIV_MASK                             0x1
> +#define AR724X_DDR_DIV_SHIFT                            22
> +#define AR724X_DDR_DIV_MASK                             0x3
> +
> +#define AR7242_PLL_REG_ETH0_INT_CLOCK                   0x2c
> +
> +#define AR913X_PLL_REG_CPU_CONFIG                       0x00
> +#define AR913X_PLL_REG_ETH_CONFIG                       0x04
> +#define AR913X_PLL_REG_ETH0_INT_CLOCK                   0x14
> +#define AR913X_PLL_REG_ETH1_INT_CLOCK                   0x18
> +
> +#define AR913X_PLL_DIV_SHIFT                            0
> +#define AR913X_PLL_DIV_MASK                             0x3ff
> +#define AR913X_DDR_DIV_SHIFT                            22
> +#define AR913X_DDR_DIV_MASK                             0x3
> +#define AR913X_AHB_DIV_SHIFT                            19
> +#define AR913X_AHB_DIV_MASK                             0x1
> +
> +#define AR913X_ETH0_PLL_SHIFT                           20
> +#define AR913X_ETH1_PLL_SHIFT                           22
> +
> +#define AR933X_PLL_CPU_CONFIG_REG                       0x00
> +#define AR933X_PLL_CLK_CTRL_REG                         0x08
> +#define AR933X_PLL_DITHER_FRAC_REG                      0x10
> +
> +#define AR933X_PLL_CPU_CONFIG_NINT_SHIFT                10
> +#define AR933X_PLL_CPU_CONFIG_NINT_MASK                 0x3f
> +#define AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT              16
> +#define AR933X_PLL_CPU_CONFIG_REFDIV_MASK               0x1f
> +#define AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT              23
> +#define AR933X_PLL_CPU_CONFIG_OUTDIV_MASK               0x7
> +
> +#define AR933X_PLL_CLK_CTRL_BYPASS                      BIT(2)
> +#define AR933X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT          5
> +#define AR933X_PLL_CLK_CTRL_CPU_POST_DIV_MASK           0x3
> +#define AR933X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT          10
> +#define AR933X_PLL_CLK_CTRL_DDR_POST_DIV_MASK           0x3
> +#define AR933X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT          15
> +#define AR933X_PLL_CLK_CTRL_AHB_POST_DIV_MASK           0x7
> +
> +#define AR934X_PLL_CPU_CONFIG_REG                       0x00
> +#define AR934X_PLL_DDR_CONFIG_REG                       0x04
> +#define AR934X_PLL_CPU_DDR_CLK_CTRL_REG                 0x08
> +#define AR934X_PLL_SWITCH_CLOCK_CONTROL_REG             0x24
> +#define AR934X_PLL_ETH_XMII_CONTROL_REG                 0x2c
> +
> +#define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT               0
> +#define AR934X_PLL_CPU_CONFIG_NFRAC_MASK                0x3f
> +#define AR934X_PLL_CPU_CONFIG_NINT_SHIFT                6
> +#define AR934X_PLL_CPU_CONFIG_NINT_MASK                 0x3f
> +#define AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT              12
> +#define AR934X_PLL_CPU_CONFIG_REFDIV_MASK               0x1f
> +#define AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT              19
> +#define AR934X_PLL_CPU_CONFIG_OUTDIV_MASK               0x3
> +
> +#define AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT               0
> +#define AR934X_PLL_DDR_CONFIG_NFRAC_MASK                0x3ff
> +#define AR934X_PLL_DDR_CONFIG_NINT_SHIFT                10
> +#define AR934X_PLL_DDR_CONFIG_NINT_MASK                 0x3f
> +#define AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT              16
> +#define AR934X_PLL_DDR_CONFIG_REFDIV_MASK               0x1f
> +#define AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT              23
> +#define AR934X_PLL_DDR_CONFIG_OUTDIV_MASK               0x7
> +
> +#define AR934X_PLL_CLK_CTRL_CPU_PLL_BYPASS              BIT(2)
> +#define AR934X_PLL_CLK_CTRL_DDR_PLL_BYPASS              BIT(3)
> +#define AR934X_PLL_CLK_CTRL_AHB_PLL_BYPASS              BIT(4)
> +#define AR934X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT          5
> +#define AR934X_PLL_CLK_CTRL_CPU_POST_DIV_MASK           0x1f
> +#define AR934X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT          10
> +#define AR934X_PLL_CLK_CTRL_DDR_POST_DIV_MASK           0x1f
> +#define AR934X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT          15
> +#define AR934X_PLL_CLK_CTRL_AHB_POST_DIV_MASK           0x1f
> +#define AR934X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL          BIT(20)
> +#define AR934X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL          BIT(21)
> +#define AR934X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL          BIT(24)
> +
> +#define AR934X_PLL_SWITCH_CLK_CTRL_MDIO_CLK_SEL         BIT(6)
> +
> +#define QCA953X_PLL_CPU_CONFIG_REG                      0x00
> +#define QCA953X_PLL_DDR_CONFIG_REG                      0x04
> +#define QCA953X_PLL_CLK_CTRL_REG                        0x08
> +#define QCA953X_PLL_SWITCH_CLOCK_CONTROL_REG            0x24
> +#define QCA953X_PLL_ETH_XMII_CONTROL_REG                0x2c
> +#define QCA953X_PLL_DDR_DIT_FRAC_REG                    0x44
> +#define QCA953X_PLL_CPU_DIT_FRAC_REG                    0x48
> +
> +#define QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT              0
> +#define QCA953X_PLL_CPU_CONFIG_NFRAC_MASK               0x3f
> +#define QCA953X_PLL_CPU_CONFIG_NINT_SHIFT               6
> +#define QCA953X_PLL_CPU_CONFIG_NINT_MASK                0x3f
> +#define QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT             12
> +#define QCA953X_PLL_CPU_CONFIG_REFDIV_MASK              0x1f
> +#define QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT             19
> +#define QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK              0x7
> +
> +#define QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT              0
> +#define QCA953X_PLL_DDR_CONFIG_NFRAC_MASK               0x3ff
> +#define QCA953X_PLL_DDR_CONFIG_NINT_SHIFT               10
> +#define QCA953X_PLL_DDR_CONFIG_NINT_MASK                0x3f
> +#define QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT             16
> +#define QCA953X_PLL_DDR_CONFIG_REFDIV_MASK              0x1f
> +#define QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT             23
> +#define QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK              0x7
> +
> +#define QCA953X_PLL_CONFIG_PWD                          BIT(30)
> +
> +#define QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS             BIT(2)
> +#define QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS             BIT(3)
> +#define QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS             BIT(4)
> +#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT         5
> +#define QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK          0x1f
> +#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT         10
> +#define QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK          0x1f
> +#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT         15
> +#define QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK          0x1f
> +#define QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL         BIT(20)
> +#define QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL         BIT(21)
> +#define QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL         BIT(24)
> +
> +#define QCA953X_PLL_CPU_DIT_FRAC_MAX_SHIFT              0
> +#define QCA953X_PLL_CPU_DIT_FRAC_MAX_MASK               0x3f
> +#define QCA953X_PLL_CPU_DIT_FRAC_MIN_SHIFT              6
> +#define QCA953X_PLL_CPU_DIT_FRAC_MIN_MASK               0x3f
> +#define QCA953X_PLL_CPU_DIT_FRAC_STEP_SHIFT             12
> +#define QCA953X_PLL_CPU_DIT_FRAC_STEP_MASK              0x3f
> +#define QCA953X_PLL_CPU_DIT_UPD_CNT_SHIFT               18
> +#define QCA953X_PLL_CPU_DIT_UPD_CNT_MASK                0x3f
> +
> +#define QCA953X_PLL_DDR_DIT_FRAC_MAX_SHIFT              0
> +#define QCA953X_PLL_DDR_DIT_FRAC_MAX_MASK               0x3ff
> +#define QCA953X_PLL_DDR_DIT_FRAC_MIN_SHIFT              9
> +#define QCA953X_PLL_DDR_DIT_FRAC_MIN_MASK               0x3ff
> +#define QCA953X_PLL_DDR_DIT_FRAC_STEP_SHIFT             20
> +#define QCA953X_PLL_DDR_DIT_FRAC_STEP_MASK              0x3f
> +#define QCA953X_PLL_DDR_DIT_UPD_CNT_SHIFT               27
> +#define QCA953X_PLL_DDR_DIT_UPD_CNT_MASK                0x3f
> +
> +#define QCA953X_PLL_DIT_FRAC_EN                         BIT(31)
> +
> +#define QCA955X_PLL_CPU_CONFIG_REG                      0x00
> +#define QCA955X_PLL_DDR_CONFIG_REG                      0x04
> +#define QCA955X_PLL_CLK_CTRL_REG                        0x08
> +#define QCA955X_PLL_ETH_XMII_CONTROL_REG                0x28
> +#define QCA955X_PLL_ETH_SGMII_CONTROL_REG               0x48
> +
> +#define QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT              0
> +#define QCA955X_PLL_CPU_CONFIG_NFRAC_MASK               0x3f
> +#define QCA955X_PLL_CPU_CONFIG_NINT_SHIFT               6
> +#define QCA955X_PLL_CPU_CONFIG_NINT_MASK                0x3f
> +#define QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT             12
> +#define QCA955X_PLL_CPU_CONFIG_REFDIV_MASK              0x1f
> +#define QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT             19
> +#define QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK              0x3
> +
> +#define QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT              0
> +#define QCA955X_PLL_DDR_CONFIG_NFRAC_MASK               0x3ff
> +#define QCA955X_PLL_DDR_CONFIG_NINT_SHIFT               10
> +#define QCA955X_PLL_DDR_CONFIG_NINT_MASK                0x3f
> +#define QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT             16
> +#define QCA955X_PLL_DDR_CONFIG_REFDIV_MASK              0x1f
> +#define QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT             23
> +#define QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK              0x7
> +
> +#define QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS             BIT(2)
> +#define QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS             BIT(3)
> +#define QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS             BIT(4)
> +#define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT         5
> +#define QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK          0x1f
> +#define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT         10
> +#define QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK          0x1f
> +#define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT         15
> +#define QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK          0x1f
> +#define QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL         BIT(20)
> +#define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL         BIT(21)
> +#define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL         BIT(24)
> +
> +#define QCA956X_PLL_CPU_CONFIG_REG                      0x00
> +#define QCA956X_PLL_CPU_CONFIG1_REG                     0x04
> +#define QCA956X_PLL_DDR_CONFIG_REG                      0x08
> +#define QCA956X_PLL_DDR_CONFIG1_REG                     0x0c
> +#define QCA956X_PLL_CLK_CTRL_REG                        0x10
> +
> +#define QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT             12
> +#define QCA956X_PLL_CPU_CONFIG_REFDIV_MASK              0x1f
> +#define QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT             19
> +#define QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK              0x7
> +
> +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT           0
> +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK            0x1f
> +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT           5
> +#define QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK            0x3fff
> +#define QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT              18
> +#define QCA956X_PLL_CPU_CONFIG1_NINT_MASK               0x1ff
> +
> +#define QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT             16
> +#define QCA956X_PLL_DDR_CONFIG_REFDIV_MASK              0x1f
> +#define QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT             23
> +#define QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK              0x7
> +
> +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT           0
> +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK            0x1f
> +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT           5
> +#define QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK            0x3fff
> +#define QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT              18
> +#define QCA956X_PLL_DDR_CONFIG1_NINT_MASK               0x1ff
> +
> +#define QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS             BIT(2)
> +#define QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS             BIT(3)
> +#define QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS             BIT(4)
> +#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT         5
> +#define QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK          0x1f
> +#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT         10
> +#define QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK          0x1f
> +#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT         15
> +#define QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK          0x1f
> +#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL     BIT(20)
> +#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL     BIT(21)
> +#define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL         BIT(24)
> +
> +/*
> + * USB_CONFIG block
> + */
> +#define AR71XX_USB_CTRL_REG_FLADJ                       0x00
> +#define AR71XX_USB_CTRL_REG_CONFIG                      0x04
> +
> +/*
> + * RESET block
> + */
> +#define AR71XX_RESET_REG_TIMER                          0x00
> +#define AR71XX_RESET_REG_TIMER_RELOAD                   0x04
> +#define AR71XX_RESET_REG_WDOG_CTRL                      0x08
> +#define AR71XX_RESET_REG_WDOG                           0x0c
> +#define AR71XX_RESET_REG_MISC_INT_STATUS                0x10
> +#define AR71XX_RESET_REG_MISC_INT_ENABLE                0x14
> +#define AR71XX_RESET_REG_PCI_INT_STATUS                 0x18
> +#define AR71XX_RESET_REG_PCI_INT_ENABLE                 0x1c
> +#define AR71XX_RESET_REG_GLOBAL_INT_STATUS              0x20
> +#define AR71XX_RESET_REG_RESET_MODULE                   0x24
> +#define AR71XX_RESET_REG_PERFC_CTRL                     0x2c
> +#define AR71XX_RESET_REG_PERFC0                         0x30
> +#define AR71XX_RESET_REG_PERFC1                         0x34
> +#define AR71XX_RESET_REG_REV_ID                         0x90
> +
> +#define AR913X_RESET_REG_GLOBAL_INT_STATUS              0x18
> +#define AR913X_RESET_REG_RESET_MODULE                   0x1c
> +#define AR913X_RESET_REG_PERF_CTRL                      0x20
> +#define AR913X_RESET_REG_PERFC0                         0x24
> +#define AR913X_RESET_REG_PERFC1                         0x28
> +
> +#define AR724X_RESET_REG_RESET_MODULE                   0x1c
> +
> +#define AR933X_RESET_REG_RESET_MODULE                   0x1c
> +#define AR933X_RESET_REG_BOOTSTRAP                      0xac
> +
> +#define AR934X_RESET_REG_RESET_MODULE                   0x1c
> +#define AR934X_RESET_REG_BOOTSTRAP                      0xb0
> +#define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS           0xac
> +
> +#define QCA953X_RESET_REG_RESET_MODULE                  0x1c
> +#define QCA953X_RESET_REG_BOOTSTRAP                     0xb0
> +#define QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS          0xac
> +
> +#define QCA955X_RESET_REG_RESET_MODULE                  0x1c
> +#define QCA955X_RESET_REG_BOOTSTRAP                     0xb0
> +#define QCA955X_RESET_REG_EXT_INT_STATUS                0xac
> +
> +#define QCA956X_RESET_REG_RESET_MODULE                  0x1c
> +#define QCA956X_RESET_REG_BOOTSTRAP                     0xb0
> +#define QCA956X_RESET_REG_EXT_INT_STATUS                0xac
> +
> +#define MISC_INT_MIPS_SI_TIMERINT_MASK                  BIT(28)
> +#define MISC_INT_ETHSW                                  BIT(12)
> +#define MISC_INT_TIMER4                                 BIT(10)
> +#define MISC_INT_TIMER3                                 BIT(9)
> +#define MISC_INT_TIMER2                                 BIT(8)
> +#define MISC_INT_DMA                                    BIT(7)
> +#define MISC_INT_OHCI                                   BIT(6)
> +#define MISC_INT_PERFC                                  BIT(5)
> +#define MISC_INT_WDOG                                   BIT(4)
> +#define MISC_INT_UART                                   BIT(3)
> +#define MISC_INT_GPIO                                   BIT(2)
> +#define MISC_INT_ERROR                                  BIT(1)
> +#define MISC_INT_TIMER                                  BIT(0)
> +
> +#define AR71XX_RESET_EXTERNAL                           BIT(28)
> +#define AR71XX_RESET_FULL_CHIP                          BIT(24)
> +#define AR71XX_RESET_CPU_NMI                            BIT(21)
> +#define AR71XX_RESET_CPU_COLD                           BIT(20)
> +#define AR71XX_RESET_DMA                                BIT(19)
> +#define AR71XX_RESET_SLIC                               BIT(18)
> +#define AR71XX_RESET_STEREO                             BIT(17)
> +#define AR71XX_RESET_DDR                                BIT(16)
> +#define AR71XX_RESET_GE1_MAC                            BIT(13)
> +#define AR71XX_RESET_GE1_PHY                            BIT(12)
> +#define AR71XX_RESET_USBSUS_OVERRIDE                    BIT(10)
> +#define AR71XX_RESET_GE0_MAC                            BIT(9)
> +#define AR71XX_RESET_GE0_PHY                            BIT(8)
> +#define AR71XX_RESET_USB_OHCI_DLL                       BIT(6)
> +#define AR71XX_RESET_USB_HOST                           BIT(5)
> +#define AR71XX_RESET_USB_PHY                            BIT(4)
> +#define AR71XX_RESET_PCI_BUS                            BIT(1)
> +#define AR71XX_RESET_PCI_CORE                           BIT(0)
> +
> +#define AR7240_RESET_USB_HOST                           BIT(5)
> +#define AR7240_RESET_OHCI_DLL                           BIT(3)
> +
> +#define AR724X_RESET_GE1_MDIO                           BIT(23)
> +#define AR724X_RESET_GE0_MDIO                           BIT(22)
> +#define AR724X_RESET_PCIE_PHY_SERIAL                    BIT(10)
> +#define AR724X_RESET_PCIE_PHY                           BIT(7)
> +#define AR724X_RESET_PCIE                               BIT(6)
> +#define AR724X_RESET_USB_HOST                           BIT(5)
> +#define AR724X_RESET_USB_PHY                            BIT(4)
> +#define AR724X_RESET_USBSUS_OVERRIDE                    BIT(3)
> +
> +#define AR913X_RESET_AMBA2WMAC                          BIT(22)
> +#define AR913X_RESET_USBSUS_OVERRIDE                    BIT(10)
> +#define AR913X_RESET_USB_HOST                           BIT(5)
> +#define AR913X_RESET_USB_PHY                            BIT(4)
> +
> +#define AR933X_RESET_GE1_MDIO                           BIT(23)
> +#define AR933X_RESET_GE0_MDIO                           BIT(22)
> +#define AR933X_RESET_GE1_MAC                            BIT(13)
> +#define AR933X_RESET_WMAC                               BIT(11)
> +#define AR933X_RESET_GE0_MAC                            BIT(9)
> +#define AR933X_RESET_USB_HOST                           BIT(5)
> +#define AR933X_RESET_USB_PHY                            BIT(4)
> +#define AR933X_RESET_USBSUS_OVERRIDE                    BIT(3)
> +
> +#define AR934X_RESET_HOST                               BIT(31)
> +#define AR934X_RESET_SLIC                               BIT(30)
> +#define AR934X_RESET_HDMA                               BIT(29)
> +#define AR934X_RESET_EXTERNAL                           BIT(28)
> +#define AR934X_RESET_RTC                                BIT(27)
> +#define AR934X_RESET_PCIE_EP_INT                        BIT(26)
> +#define AR934X_RESET_CHKSUM_ACC                         BIT(25)
> +#define AR934X_RESET_FULL_CHIP                          BIT(24)
> +#define AR934X_RESET_GE1_MDIO                           BIT(23)
> +#define AR934X_RESET_GE0_MDIO                           BIT(22)
> +#define AR934X_RESET_CPU_NMI                            BIT(21)
> +#define AR934X_RESET_CPU_COLD                           BIT(20)
> +#define AR934X_RESET_HOST_RESET_INT                     BIT(19)
> +#define AR934X_RESET_PCIE_EP                            BIT(18)
> +#define AR934X_RESET_UART1                              BIT(17)
> +#define AR934X_RESET_DDR                                BIT(16)
> +#define AR934X_RESET_USB_PHY_PLL_PWD_EXT                BIT(15)
> +#define AR934X_RESET_NANDF                              BIT(14)
> +#define AR934X_RESET_GE1_MAC                            BIT(13)
> +#define AR934X_RESET_ETH_SWITCH_ANALOG                  BIT(12)
> +#define AR934X_RESET_USB_PHY_ANALOG                     BIT(11)
> +#define AR934X_RESET_HOST_DMA_INT                       BIT(10)
> +#define AR934X_RESET_GE0_MAC                            BIT(9)
> +#define AR934X_RESET_ETH_SWITCH                         BIT(8)
> +#define AR934X_RESET_PCIE_PHY                           BIT(7)
> +#define AR934X_RESET_PCIE                               BIT(6)
> +#define AR934X_RESET_USB_HOST                           BIT(5)
> +#define AR934X_RESET_USB_PHY                            BIT(4)
> +#define AR934X_RESET_USBSUS_OVERRIDE                    BIT(3)
> +#define AR934X_RESET_LUT                                BIT(2)
> +#define AR934X_RESET_MBOX                               BIT(1)
> +#define AR934X_RESET_I2S                                BIT(0)
> +
> +#define QCA953X_RESET_USB_EXT_PWR                       BIT(29)
> +#define QCA953X_RESET_EXTERNAL                          BIT(28)
> +#define QCA953X_RESET_RTC                               BIT(27)
> +#define QCA953X_RESET_FULL_CHIP                         BIT(24)
> +#define QCA953X_RESET_GE1_MDIO                          BIT(23)
> +#define QCA953X_RESET_GE0_MDIO                          BIT(22)
> +#define QCA953X_RESET_CPU_NMI                           BIT(21)
> +#define QCA953X_RESET_CPU_COLD                          BIT(20)
> +#define QCA953X_RESET_DDR                               BIT(16)
> +#define QCA953X_RESET_USB_PHY_PLL_PWD_EXT               BIT(15)
> +#define QCA953X_RESET_GE1_MAC                           BIT(13)
> +#define QCA953X_RESET_ETH_SWITCH_ANALOG                 BIT(12)
> +#define QCA953X_RESET_USB_PHY_ANALOG                    BIT(11)
> +#define QCA953X_RESET_GE0_MAC                           BIT(9)
> +#define QCA953X_RESET_ETH_SWITCH                        BIT(8)
> +#define QCA953X_RESET_PCIE_PHY                          BIT(7)
> +#define QCA953X_RESET_PCIE                              BIT(6)
> +#define QCA953X_RESET_USB_HOST                          BIT(5)
> +#define QCA953X_RESET_USB_PHY                           BIT(4)
> +#define QCA953X_RESET_USBSUS_OVERRIDE                   BIT(3)
> +
> +#define QCA955X_RESET_HOST                              BIT(31)
> +#define QCA955X_RESET_SLIC                              BIT(30)
> +#define QCA955X_RESET_HDMA                              BIT(29)
> +#define QCA955X_RESET_EXTERNAL                          BIT(28)
> +#define QCA955X_RESET_RTC                               BIT(27)
> +#define QCA955X_RESET_PCIE_EP_INT                       BIT(26)
> +#define QCA955X_RESET_CHKSUM_ACC                        BIT(25)
> +#define QCA955X_RESET_FULL_CHIP                         BIT(24)
> +#define QCA955X_RESET_GE1_MDIO                          BIT(23)
> +#define QCA955X_RESET_GE0_MDIO                          BIT(22)
> +#define QCA955X_RESET_CPU_NMI                           BIT(21)
> +#define QCA955X_RESET_CPU_COLD                          BIT(20)
> +#define QCA955X_RESET_HOST_RESET_INT                    BIT(19)
> +#define QCA955X_RESET_PCIE_EP                           BIT(18)
> +#define QCA955X_RESET_UART1                             BIT(17)
> +#define QCA955X_RESET_DDR                               BIT(16)
> +#define QCA955X_RESET_USB_PHY_PLL_PWD_EXT               BIT(15)
> +#define QCA955X_RESET_NANDF                             BIT(14)
> +#define QCA955X_RESET_GE1_MAC                           BIT(13)
> +#define QCA955X_RESET_SGMII_ANALOG                      BIT(12)
> +#define QCA955X_RESET_USB_PHY_ANALOG                    BIT(11)
> +#define QCA955X_RESET_HOST_DMA_INT                      BIT(10)
> +#define QCA955X_RESET_GE0_MAC                           BIT(9)
> +#define QCA955X_RESET_SGMII                             BIT(8)
> +#define QCA955X_RESET_PCIE_PHY                          BIT(7)
> +#define QCA955X_RESET_PCIE                              BIT(6)
> +#define QCA955X_RESET_USB_HOST                          BIT(5)
> +#define QCA955X_RESET_USB_PHY                           BIT(4)
> +#define QCA955X_RESET_USBSUS_OVERRIDE                   BIT(3)
> +#define QCA955X_RESET_LUT                               BIT(2)
> +#define QCA955X_RESET_MBOX                              BIT(1)
> +#define QCA955X_RESET_I2S                               BIT(0)
> +
> +#define AR933X_BOOTSTRAP_MDIO_GPIO_EN                   BIT(18)
> +#define AR933X_BOOTSTRAP_DDR2                           BIT(13)
> +#define AR933X_BOOTSTRAP_EEPBUSY                        BIT(4)
> +#define AR933X_BOOTSTRAP_REF_CLK_40                     BIT(0)
> +
> +#define AR934X_BOOTSTRAP_SW_OPTION8                     BIT(23)
> +#define AR934X_BOOTSTRAP_SW_OPTION7                     BIT(22)
> +#define AR934X_BOOTSTRAP_SW_OPTION6                     BIT(21)
> +#define AR934X_BOOTSTRAP_SW_OPTION5                     BIT(20)
> +#define AR934X_BOOTSTRAP_SW_OPTION4                     BIT(19)
> +#define AR934X_BOOTSTRAP_SW_OPTION3                     BIT(18)
> +#define AR934X_BOOTSTRAP_SW_OPTION2                     BIT(17)
> +#define AR934X_BOOTSTRAP_SW_OPTION1                     BIT(16)
> +#define AR934X_BOOTSTRAP_USB_MODE_DEVICE                BIT(7)
> +#define AR934X_BOOTSTRAP_PCIE_RC                        BIT(6)
> +#define AR934X_BOOTSTRAP_EJTAG_MODE                     BIT(5)
> +#define AR934X_BOOTSTRAP_REF_CLK_40                     BIT(4)
> +#define AR934X_BOOTSTRAP_BOOT_FROM_SPI                  BIT(2)
> +#define AR934X_BOOTSTRAP_SDRAM_DISABLED                 BIT(1)
> +#define AR934X_BOOTSTRAP_DDR1                           BIT(0)
> +
> +#define QCA953X_BOOTSTRAP_SW_OPTION2                    BIT(12)
> +#define QCA953X_BOOTSTRAP_SW_OPTION1                    BIT(11)
> +#define QCA953X_BOOTSTRAP_EJTAG_MODE                    BIT(5)
> +#define QCA953X_BOOTSTRAP_REF_CLK_40                    BIT(4)
> +#define QCA953X_BOOTSTRAP_SDRAM_DISABLED                BIT(1)
> +#define QCA953X_BOOTSTRAP_DDR1                          BIT(0)
> +
> +#define QCA955X_BOOTSTRAP_REF_CLK_40                    BIT(4)
> +
> +#define QCA956X_BOOTSTRAP_REF_CLK_40                    BIT(2)
> +
> +#define AR934X_PCIE_WMAC_INT_WMAC_MISC                  BIT(0)
> +#define AR934X_PCIE_WMAC_INT_WMAC_TX                    BIT(1)
> +#define AR934X_PCIE_WMAC_INT_WMAC_RXLP                  BIT(2)
> +#define AR934X_PCIE_WMAC_INT_WMAC_RXHP                  BIT(3)
> +#define AR934X_PCIE_WMAC_INT_PCIE_RC                    BIT(4)
> +#define AR934X_PCIE_WMAC_INT_PCIE_RC0                   BIT(5)
> +#define AR934X_PCIE_WMAC_INT_PCIE_RC1                   BIT(6)
> +#define AR934X_PCIE_WMAC_INT_PCIE_RC2                   BIT(7)
> +#define AR934X_PCIE_WMAC_INT_PCIE_RC3                   BIT(8)
> +#define AR934X_PCIE_WMAC_INT_WMAC_ALL \
> +	(AR934X_PCIE_WMAC_INT_WMAC_MISC | AR934X_PCIE_WMAC_INT_WMAC_TX | \
> +	 AR934X_PCIE_WMAC_INT_WMAC_RXLP | AR934X_PCIE_WMAC_INT_WMAC_RXHP)
> +
> +#define AR934X_PCIE_WMAC_INT_PCIE_ALL \
> +	(AR934X_PCIE_WMAC_INT_PCIE_RC | AR934X_PCIE_WMAC_INT_PCIE_RC0 | \
> +	 AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \
> +	 AR934X_PCIE_WMAC_INT_PCIE_RC3)
> +
> +#define QCA953X_PCIE_WMAC_INT_WMAC_MISC                 BIT(0)
> +#define QCA953X_PCIE_WMAC_INT_WMAC_TX                   BIT(1)
> +#define QCA953X_PCIE_WMAC_INT_WMAC_RXLP                 BIT(2)
> +#define QCA953X_PCIE_WMAC_INT_WMAC_RXHP                 BIT(3)
> +#define QCA953X_PCIE_WMAC_INT_PCIE_RC                   BIT(4)
> +#define QCA953X_PCIE_WMAC_INT_PCIE_RC0                  BIT(5)
> +#define QCA953X_PCIE_WMAC_INT_PCIE_RC1                  BIT(6)
> +#define QCA953X_PCIE_WMAC_INT_PCIE_RC2                  BIT(7)
> +#define QCA953X_PCIE_WMAC_INT_PCIE_RC3                  BIT(8)
> +#define QCA953X_PCIE_WMAC_INT_WMAC_ALL \
> +	(QCA953X_PCIE_WMAC_INT_WMAC_MISC | QCA953X_PCIE_WMAC_INT_WMAC_TX | \
> +	 QCA953X_PCIE_WMAC_INT_WMAC_RXLP | QCA953X_PCIE_WMAC_INT_WMAC_RXHP)
> +
> +#define QCA953X_PCIE_WMAC_INT_PCIE_ALL \
> +	(QCA953X_PCIE_WMAC_INT_PCIE_RC | QCA953X_PCIE_WMAC_INT_PCIE_RC0 | \
> +	 QCA953X_PCIE_WMAC_INT_PCIE_RC1 | QCA953X_PCIE_WMAC_INT_PCIE_RC2 | \
> +	 QCA953X_PCIE_WMAC_INT_PCIE_RC3)
> +
> +#define QCA955X_EXT_INT_WMAC_MISC                       BIT(0)
> +#define QCA955X_EXT_INT_WMAC_TX                         BIT(1)
> +#define QCA955X_EXT_INT_WMAC_RXLP                       BIT(2)
> +#define QCA955X_EXT_INT_WMAC_RXHP                       BIT(3)
> +#define QCA955X_EXT_INT_PCIE_RC1                        BIT(4)
> +#define QCA955X_EXT_INT_PCIE_RC1_INT0                   BIT(5)
> +#define QCA955X_EXT_INT_PCIE_RC1_INT1                   BIT(6)
> +#define QCA955X_EXT_INT_PCIE_RC1_INT2                   BIT(7)
> +#define QCA955X_EXT_INT_PCIE_RC1_INT3                   BIT(8)
> +#define QCA955X_EXT_INT_PCIE_RC2                        BIT(12)
> +#define QCA955X_EXT_INT_PCIE_RC2_INT0                   BIT(13)
> +#define QCA955X_EXT_INT_PCIE_RC2_INT1                   BIT(14)
> +#define QCA955X_EXT_INT_PCIE_RC2_INT2                   BIT(15)
> +#define QCA955X_EXT_INT_PCIE_RC2_INT3                   BIT(16)
> +#define QCA955X_EXT_INT_USB1                            BIT(24)
> +#define QCA955X_EXT_INT_USB2                            BIT(28)
> +
> +#define QCA955X_EXT_INT_WMAC_ALL \
> +	(QCA955X_EXT_INT_WMAC_MISC | QCA955X_EXT_INT_WMAC_TX | \
> +	 QCA955X_EXT_INT_WMAC_RXLP | QCA955X_EXT_INT_WMAC_RXHP)
> +
> +#define QCA955X_EXT_INT_PCIE_RC1_ALL \
> +	(QCA955X_EXT_INT_PCIE_RC1 | QCA955X_EXT_INT_PCIE_RC1_INT0 | \
> +	 QCA955X_EXT_INT_PCIE_RC1_INT1 | QCA955X_EXT_INT_PCIE_RC1_INT2 | \
> +	 QCA955X_EXT_INT_PCIE_RC1_INT3)
> +
> +#define QCA955X_EXT_INT_PCIE_RC2_ALL \
> +	(QCA955X_EXT_INT_PCIE_RC2 | QCA955X_EXT_INT_PCIE_RC2_INT0 | \
> +	 QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \
> +	 QCA955X_EXT_INT_PCIE_RC2_INT3)
> +
> +#define QCA956X_EXT_INT_WMAC_MISC                       BIT(0)
> +#define QCA956X_EXT_INT_WMAC_TX                         BIT(1)
> +#define QCA956X_EXT_INT_WMAC_RXLP                       BIT(2)
> +#define QCA956X_EXT_INT_WMAC_RXHP                       BIT(3)
> +#define QCA956X_EXT_INT_PCIE_RC1                        BIT(4)
> +#define QCA956X_EXT_INT_PCIE_RC1_INT0                   BIT(5)
> +#define QCA956X_EXT_INT_PCIE_RC1_INT1                   BIT(6)
> +#define QCA956X_EXT_INT_PCIE_RC1_INT2                   BIT(7)
> +#define QCA956X_EXT_INT_PCIE_RC1_INT3                   BIT(8)
> +#define QCA956X_EXT_INT_PCIE_RC2                        BIT(12)
> +#define QCA956X_EXT_INT_PCIE_RC2_INT0                   BIT(13)
> +#define QCA956X_EXT_INT_PCIE_RC2_INT1                   BIT(14)
> +#define QCA956X_EXT_INT_PCIE_RC2_INT2                   BIT(15)
> +#define QCA956X_EXT_INT_PCIE_RC2_INT3                   BIT(16)
> +#define QCA956X_EXT_INT_USB1                            BIT(24)
> +#define QCA956X_EXT_INT_USB2                            BIT(28)
> +
> +#define QCA956X_EXT_INT_WMAC_ALL \
> +	(QCA956X_EXT_INT_WMAC_MISC | QCA956X_EXT_INT_WMAC_TX | \
> +	 QCA956X_EXT_INT_WMAC_RXLP | QCA956X_EXT_INT_WMAC_RXHP)
> +
> +#define QCA956X_EXT_INT_PCIE_RC1_ALL \
> +	(QCA956X_EXT_INT_PCIE_RC1 | QCA956X_EXT_INT_PCIE_RC1_INT0 | \
> +	 QCA956X_EXT_INT_PCIE_RC1_INT1 | QCA956X_EXT_INT_PCIE_RC1_INT2 | \
> +	 QCA956X_EXT_INT_PCIE_RC1_INT3)
> +
> +#define QCA956X_EXT_INT_PCIE_RC2_ALL \
> +	(QCA956X_EXT_INT_PCIE_RC2 | QCA956X_EXT_INT_PCIE_RC2_INT0 | \
> +	 QCA956X_EXT_INT_PCIE_RC2_INT1 | QCA956X_EXT_INT_PCIE_RC2_INT2 | \
> +	 QCA956X_EXT_INT_PCIE_RC2_INT3)
> +
> +#define REV_ID_MAJOR_MASK                               0xfff0
> +#define REV_ID_MAJOR_AR71XX                             0x00a0
> +#define REV_ID_MAJOR_AR913X                             0x00b0
> +#define REV_ID_MAJOR_AR7240                             0x00c0
> +#define REV_ID_MAJOR_AR7241                             0x0100
> +#define REV_ID_MAJOR_AR7242                             0x1100
> +#define REV_ID_MAJOR_AR9330                             0x0110
> +#define REV_ID_MAJOR_AR9331                             0x1110
> +#define REV_ID_MAJOR_AR9341                             0x0120
> +#define REV_ID_MAJOR_AR9342                             0x1120
> +#define REV_ID_MAJOR_AR9344                             0x2120
> +#define REV_ID_MAJOR_QCA9533                            0x0140
> +#define REV_ID_MAJOR_QCA9533_V2                         0x0160
> +#define REV_ID_MAJOR_QCA9556                            0x0130
> +#define REV_ID_MAJOR_QCA9558                            0x1130
> +#define REV_ID_MAJOR_TP9343                             0x0150
> +#define REV_ID_MAJOR_QCA9561                            0x1150
> +
> +#define AR71XX_REV_ID_MINOR_MASK                        0x3
> +#define AR71XX_REV_ID_MINOR_AR7130                      0x0
> +#define AR71XX_REV_ID_MINOR_AR7141                      0x1
> +#define AR71XX_REV_ID_MINOR_AR7161                      0x2
> +#define AR913X_REV_ID_MINOR_AR9130                      0x0
> +#define AR913X_REV_ID_MINOR_AR9132                      0x1
> +
> +#define AR71XX_REV_ID_REVISION_MASK                     0x3
> +#define AR71XX_REV_ID_REVISION_SHIFT                    2
> +#define AR71XX_REV_ID_REVISION2_MASK                    0xf
> +
> +/*
> + * RTC block
> + */
> +#define AR933X_RTC_REG_RESET                            0x40
> +#define AR933X_RTC_REG_STATUS                           0x44
> +#define AR933X_RTC_REG_DERIVED                          0x48
> +#define AR933X_RTC_REG_FORCE_WAKE                       0x4c
> +#define AR933X_RTC_REG_INT_CAUSE                        0x50
> +#define AR933X_RTC_REG_CAUSE_CLR                        0x50
> +#define AR933X_RTC_REG_INT_ENABLE                       0x54
> +#define AR933X_RTC_REG_INT_MASKE                        0x58
> +
> +#define QCA953X_RTC_REG_SYNC_RESET                      0x40
> +#define QCA953X_RTC_REG_SYNC_STATUS                     0x44
> +
> +/*
> + * SPI block
> + */
> +#define AR71XX_SPI_REG_FS                               0x00
> +#define AR71XX_SPI_REG_CTRL                             0x04
> +#define AR71XX_SPI_REG_IOC                              0x08
> +#define AR71XX_SPI_REG_RDS                              0x0c
> +
> +#define AR71XX_SPI_FS_GPIO                              BIT(0)
> +
> +#define AR71XX_SPI_CTRL_RD                              BIT(6)
> +#define AR71XX_SPI_CTRL_DIV_MASK                        0x3f
> +
> +#define AR71XX_SPI_IOC_DO                               BIT(0)
> +#define AR71XX_SPI_IOC_CLK                              BIT(8)
> +#define AR71XX_SPI_IOC_CS(n)                            BIT(16 + (n))
> +#define AR71XX_SPI_IOC_CS0                      AR71XX_SPI_IOC_CS(0)
> +#define AR71XX_SPI_IOC_CS1                      AR71XX_SPI_IOC_CS(1)
> +#define AR71XX_SPI_IOC_CS2                      AR71XX_SPI_IOC_CS(2)
> +#define AR71XX_SPI_IOC_CS_ALL \
> +	(AR71XX_SPI_IOC_CS0 | AR71XX_SPI_IOC_CS1 | AR71XX_SPI_IOC_CS2)
> +
> +/*
> + * GPIO block
> + */
> +#define AR71XX_GPIO_REG_OE                              0x00
> +#define AR71XX_GPIO_REG_IN                              0x04
> +#define AR71XX_GPIO_REG_OUT                             0x08
> +#define AR71XX_GPIO_REG_SET                             0x0c
> +#define AR71XX_GPIO_REG_CLEAR                           0x10
> +#define AR71XX_GPIO_REG_INT_MODE                        0x14
> +#define AR71XX_GPIO_REG_INT_TYPE                        0x18
> +#define AR71XX_GPIO_REG_INT_POLARITY                    0x1c
> +#define AR71XX_GPIO_REG_INT_PENDING                     0x20
> +#define AR71XX_GPIO_REG_INT_ENABLE                      0x24
> +#define AR71XX_GPIO_REG_FUNC                            0x28
> +#define AR933X_GPIO_REG_FUNC                            0x30
> +
> +#define AR934X_GPIO_REG_OUT_FUNC0                       0x2c
> +#define AR934X_GPIO_REG_OUT_FUNC1                       0x30
> +#define AR934X_GPIO_REG_OUT_FUNC2                       0x34
> +#define AR934X_GPIO_REG_OUT_FUNC3                       0x38
> +#define AR934X_GPIO_REG_OUT_FUNC4                       0x3c
> +#define AR934X_GPIO_REG_OUT_FUNC5                       0x40
> +#define AR934X_GPIO_REG_FUNC                            0x6c
> +
> +#define QCA953X_GPIO_REG_OUT_FUNC0                      0x2c
> +#define QCA953X_GPIO_REG_OUT_FUNC1                      0x30
> +#define QCA953X_GPIO_REG_OUT_FUNC2                      0x34
> +#define QCA953X_GPIO_REG_OUT_FUNC3                      0x38
> +#define QCA953X_GPIO_REG_OUT_FUNC4                      0x3c
> +#define QCA953X_GPIO_REG_IN_ENABLE0                     0x44
> +#define QCA953X_GPIO_REG_FUNC                           0x6c
> +
> +#define QCA955X_GPIO_REG_OUT_FUNC0                      0x2c
> +#define QCA955X_GPIO_REG_OUT_FUNC1                      0x30
> +#define QCA955X_GPIO_REG_OUT_FUNC2                      0x34
> +#define QCA955X_GPIO_REG_OUT_FUNC3                      0x38
> +#define QCA955X_GPIO_REG_OUT_FUNC4                      0x3c
> +#define QCA955X_GPIO_REG_OUT_FUNC5                      0x40
> +#define QCA955X_GPIO_REG_FUNC                           0x6c
> +
> +#define QCA956X_GPIO_REG_OUT_FUNC0                      0x2c
> +#define QCA956X_GPIO_REG_OUT_FUNC1                      0x30
> +#define QCA956X_GPIO_REG_OUT_FUNC2                      0x34
> +#define QCA956X_GPIO_REG_OUT_FUNC3                      0x38
> +#define QCA956X_GPIO_REG_OUT_FUNC4                      0x3c
> +#define QCA956X_GPIO_REG_OUT_FUNC5                      0x40
> +#define QCA956X_GPIO_REG_IN_ENABLE0                     0x44
> +#define QCA956X_GPIO_REG_IN_ENABLE3                     0x50
> +#define QCA956X_GPIO_REG_FUNC                           0x6c
> +
> +#define AR71XX_GPIO_FUNC_STEREO_EN                      BIT(17)
> +#define AR71XX_GPIO_FUNC_SLIC_EN                        BIT(16)
> +#define AR71XX_GPIO_FUNC_SPI_CS2_EN                     BIT(13)
> +#define AR71XX_GPIO_FUNC_SPI_CS1_EN                     BIT(12)
> +#define AR71XX_GPIO_FUNC_UART_EN                        BIT(8)
> +#define AR71XX_GPIO_FUNC_USB_OC_EN                      BIT(4)
> +#define AR71XX_GPIO_FUNC_USB_CLK_EN                     BIT(0)
> +
> +#define AR724X_GPIO_FUNC_GE0_MII_CLK_EN                 BIT(19)
> +#define AR724X_GPIO_FUNC_SPI_EN                         BIT(18)
> +#define AR724X_GPIO_FUNC_SPI_CS_EN2                     BIT(14)
> +#define AR724X_GPIO_FUNC_SPI_CS_EN1                     BIT(13)
> +#define AR724X_GPIO_FUNC_CLK_OBS5_EN                    BIT(12)
> +#define AR724X_GPIO_FUNC_CLK_OBS4_EN                    BIT(11)
> +#define AR724X_GPIO_FUNC_CLK_OBS3_EN                    BIT(10)
> +#define AR724X_GPIO_FUNC_CLK_OBS2_EN                    BIT(9)
> +#define AR724X_GPIO_FUNC_CLK_OBS1_EN                    BIT(8)
> +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN             BIT(7)
> +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN             BIT(6)
> +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN             BIT(5)
> +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN             BIT(4)
> +#define AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN             BIT(3)
> +#define AR724X_GPIO_FUNC_UART_RTS_CTS_EN                BIT(2)
> +#define AR724X_GPIO_FUNC_UART_EN                        BIT(1)
> +#define AR724X_GPIO_FUNC_JTAG_DISABLE                   BIT(0)
> +
> +#define AR913X_GPIO_FUNC_WMAC_LED_EN                    BIT(22)
> +#define AR913X_GPIO_FUNC_EXP_PORT_CS_EN                 BIT(21)
> +#define AR913X_GPIO_FUNC_I2S_REFCLKEN                   BIT(20)
> +#define AR913X_GPIO_FUNC_I2S_MCKEN                      BIT(19)
> +#define AR913X_GPIO_FUNC_I2S1_EN                        BIT(18)
> +#define AR913X_GPIO_FUNC_I2S0_EN                        BIT(17)
> +#define AR913X_GPIO_FUNC_SLIC_EN                        BIT(16)
> +#define AR913X_GPIO_FUNC_UART_RTSCTS_EN                 BIT(9)
> +#define AR913X_GPIO_FUNC_UART_EN                        BIT(8)
> +#define AR913X_GPIO_FUNC_USB_CLK_EN                     BIT(4)
> +
> +#define AR933X_GPIO(x)                                  BIT(x)
> +#define AR933X_GPIO_FUNC_SPDIF2TCK                      BIT(31)
> +#define AR933X_GPIO_FUNC_SPDIF_EN                       BIT(30)
> +#define AR933X_GPIO_FUNC_I2SO_22_18_EN                  BIT(29)
> +#define AR933X_GPIO_FUNC_I2S_MCK_EN                     BIT(27)
> +#define AR933X_GPIO_FUNC_I2SO_EN                        BIT(26)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_DUPL            BIT(25)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_COLL            BIT(24)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED_ACT             BIT(23)
> +#define AR933X_GPIO_FUNC_SPI_EN                         BIT(18)
> +#define AR933X_GPIO_FUNC_RES_TRUE                       BIT(15)
> +#define AR933X_GPIO_FUNC_SPI_CS_EN2                     BIT(14)
> +#define AR933X_GPIO_FUNC_SPI_CS_EN1                     BIT(13)
> +#define AR933X_GPIO_FUNC_XLNA_EN                        BIT(12)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED4_EN             BIT(7)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED3_EN             BIT(6)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED2_EN             BIT(5)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED1_EN             BIT(4)
> +#define AR933X_GPIO_FUNC_ETH_SWITCH_LED0_EN             BIT(3)
> +#define AR933X_GPIO_FUNC_UART_RTS_CTS_EN                BIT(2)
> +#define AR933X_GPIO_FUNC_UART_EN                        BIT(1)
> +#define AR933X_GPIO_FUNC_JTAG_DISABLE                   BIT(0)
> +
> +#define AR934X_GPIO_FUNC_CLK_OBS7_EN                    BIT(9)
> +#define AR934X_GPIO_FUNC_CLK_OBS6_EN                    BIT(8)
> +#define AR934X_GPIO_FUNC_CLK_OBS5_EN                    BIT(7)
> +#define AR934X_GPIO_FUNC_CLK_OBS4_EN                    BIT(6)
> +#define AR934X_GPIO_FUNC_CLK_OBS3_EN                    BIT(5)
> +#define AR934X_GPIO_FUNC_CLK_OBS2_EN                    BIT(4)
> +#define AR934X_GPIO_FUNC_CLK_OBS1_EN                    BIT(3)
> +#define AR934X_GPIO_FUNC_CLK_OBS0_EN                    BIT(2)
> +#define AR934X_GPIO_FUNC_JTAG_DISABLE                   BIT(1)
> +
> +#define AR934X_GPIO_OUT_GPIO                            0
> +#define AR934X_GPIO_OUT_SPI_CS1                         7
> +#define AR934X_GPIO_OUT_LED_LINK0                       41
> +#define AR934X_GPIO_OUT_LED_LINK1                       42
> +#define AR934X_GPIO_OUT_LED_LINK2                       43
> +#define AR934X_GPIO_OUT_LED_LINK3                       44
> +#define AR934X_GPIO_OUT_LED_LINK4                       45
> +#define AR934X_GPIO_OUT_EXT_LNA0                        46
> +#define AR934X_GPIO_OUT_EXT_LNA1                        47
> +
> +#define QCA953X_GPIO(x)                                 BIT(x)
> +#define QCA953X_GPIO_MUX_MASK(x)                        (0xff << (x))
> +#define QCA953X_GPIO_OUT_MUX_SPI_CS1                    10
> +#define QCA953X_GPIO_OUT_MUX_SPI_CS2                    11
> +#define QCA953X_GPIO_OUT_MUX_SPI_CS0                    9
> +#define QCA953X_GPIO_OUT_MUX_SPI_CLK                    8
> +#define QCA953X_GPIO_OUT_MUX_SPI_MOSI                   12
> +#define QCA953X_GPIO_OUT_MUX_UART0_SOUT                 22
> +#define QCA953X_GPIO_OUT_MUX_LED_LINK1                  41
> +#define QCA953X_GPIO_OUT_MUX_LED_LINK2                  42
> +#define QCA953X_GPIO_OUT_MUX_LED_LINK3                  43
> +#define QCA953X_GPIO_OUT_MUX_LED_LINK4                  44
> +#define QCA953X_GPIO_OUT_MUX_LED_LINK5                  45
> +
> +#define QCA953X_GPIO_IN_MUX_UART0_SIN                   9
> +#define QCA953X_GPIO_IN_MUX_SPI_DATA_IN                 8
> +
> +#define QCA956X_GPIO_OUT_MUX_GE0_MDO                    32
> +#define QCA956X_GPIO_OUT_MUX_GE0_MDC                    33
> +
> +#define AR71XX_GPIO_COUNT                               16
> +#define AR7240_GPIO_COUNT                               18
> +#define AR7241_GPIO_COUNT                               20
> +#define AR913X_GPIO_COUNT                               22
> +#define AR933X_GPIO_COUNT                               30
> +#define AR934X_GPIO_COUNT                               23
> +#define QCA953X_GPIO_COUNT                              18
> +#define QCA955X_GPIO_COUNT                              24
> +#define QCA956X_GPIO_COUNT                              23
> +
> +/*
> + * SRIF block
> + */
> +#define AR933X_SRIF_DDR_DPLL1_REG                       0x240
> +#define AR933X_SRIF_DDR_DPLL2_REG                       0x244
> +#define AR933X_SRIF_DDR_DPLL3_REG                       0x248
> +#define AR933X_SRIF_DDR_DPLL4_REG                       0x24c
> +
> +#define AR934X_SRIF_CPU_DPLL1_REG                       0x1c0
> +#define AR934X_SRIF_CPU_DPLL2_REG                       0x1c4
> +#define AR934X_SRIF_CPU_DPLL3_REG                       0x1c8
> +
> +#define AR934X_SRIF_DDR_DPLL1_REG                       0x240
> +#define AR934X_SRIF_DDR_DPLL2_REG                       0x244
> +#define AR934X_SRIF_DDR_DPLL3_REG                       0x248
> +
> +#define AR934X_SRIF_DPLL1_REFDIV_SHIFT                  27
> +#define AR934X_SRIF_DPLL1_REFDIV_MASK                   0x1f
> +#define AR934X_SRIF_DPLL1_NINT_SHIFT                    18
> +#define AR934X_SRIF_DPLL1_NINT_MASK                     0x1ff
> +#define AR934X_SRIF_DPLL1_NFRAC_MASK                    0x0003ffff
> +
> +#define AR934X_SRIF_DPLL2_LOCAL_PLL                     BIT(30)
> +#define AR934X_SRIF_DPLL2_OUTDIV_SHIFT                  13
> +#define AR934X_SRIF_DPLL2_OUTDIV_MASK                   0x7
> +
> +#define QCA953X_SRIF_BB_DPLL1_REG                       0x180
> +#define QCA953X_SRIF_BB_DPLL2_REG                       0x184
> +#define QCA953X_SRIF_BB_DPLL3_REG                       0x188
> +
> +#define QCA953X_SRIF_CPU_DPLL1_REG                      0x1c0
> +#define QCA953X_SRIF_CPU_DPLL2_REG                      0x1c4
> +#define QCA953X_SRIF_CPU_DPLL3_REG                      0x1c8
> +
> +#define QCA953X_SRIF_DDR_DPLL1_REG                      0x240
> +#define QCA953X_SRIF_DDR_DPLL2_REG                      0x244
> +#define QCA953X_SRIF_DDR_DPLL3_REG                      0x248
> +
> +#define QCA953X_SRIF_PCIE_DPLL1_REG                     0xc00
> +#define QCA953X_SRIF_PCIE_DPLL2_REG                     0xc04
> +#define QCA953X_SRIF_PCIE_DPLL3_REG                     0xc08
> +
> +#define QCA953X_SRIF_PMU1_REG                           0xc40
> +#define QCA953X_SRIF_PMU2_REG                           0xc44
> +
> +#define QCA953X_SRIF_DPLL1_REFDIV_SHIFT                 27
> +#define QCA953X_SRIF_DPLL1_REFDIV_MASK                  0x1f
> +
> +#define QCA953X_SRIF_DPLL1_NINT_SHIFT                   18
> +#define QCA953X_SRIF_DPLL1_NINT_MASK                    0x1ff
> +#define QCA953X_SRIF_DPLL1_NFRAC_MASK                   0x0003ffff
> +
> +#define QCA953X_SRIF_DPLL2_LOCAL_PLL                    BIT(30)
> +
> +#define QCA953X_SRIF_DPLL2_KI_SHIFT                     29
> +#define QCA953X_SRIF_DPLL2_KI_MASK                      0x3
> +
> +#define QCA953X_SRIF_DPLL2_KD_SHIFT                     25
> +#define QCA953X_SRIF_DPLL2_KD_MASK                      0xf
> +
> +#define QCA953X_SRIF_DPLL2_PWD                          BIT(22)
> +
> +#define QCA953X_SRIF_DPLL2_OUTDIV_SHIFT                 13
> +#define QCA953X_SRIF_DPLL2_OUTDIV_MASK                  0x7
> +
> +/*
> + * MII_CTRL block
> + */
> +#define AR71XX_MII_REG_MII0_CTRL                        0x00
> +#define AR71XX_MII_REG_MII1_CTRL                        0x04
> +
> +#define AR71XX_MII_CTRL_IF_MASK                         3
> +#define AR71XX_MII_CTRL_SPEED_SHIFT                     4
> +#define AR71XX_MII_CTRL_SPEED_MASK                      3
> +#define AR71XX_MII_CTRL_SPEED_10                        0
> +#define AR71XX_MII_CTRL_SPEED_100                       1
> +#define AR71XX_MII_CTRL_SPEED_1000                      2
> +
> +#define AR71XX_MII0_CTRL_IF_GMII                        0
> +#define AR71XX_MII0_CTRL_IF_MII                         1
> +#define AR71XX_MII0_CTRL_IF_RGMII                       2
> +#define AR71XX_MII0_CTRL_IF_RMII                        3
> +
> +#define AR71XX_MII1_CTRL_IF_RGMII                       0
> +#define AR71XX_MII1_CTRL_IF_RMII                        1
> +
> +/*
> + * AR933X GMAC interface
> + */
> +#define AR933X_GMAC_REG_ETH_CFG                         0x00
> +
> +#define AR933X_ETH_CFG_RGMII_GE0                        BIT(0)
> +#define AR933X_ETH_CFG_MII_GE0                          BIT(1)
> +#define AR933X_ETH_CFG_GMII_GE0                         BIT(2)
> +#define AR933X_ETH_CFG_MII_GE0_MASTER                   BIT(3)
> +#define AR933X_ETH_CFG_MII_GE0_SLAVE                    BIT(4)
> +#define AR933X_ETH_CFG_MII_GE0_ERR_EN                   BIT(5)
> +#define AR933X_ETH_CFG_SW_PHY_SWAP                      BIT(7)
> +#define AR933X_ETH_CFG_SW_PHY_ADDR_SWAP                 BIT(8)
> +#define AR933X_ETH_CFG_RMII_GE0                         BIT(9)
> +#define AR933X_ETH_CFG_RMII_GE0_SPD_10                  0
> +#define AR933X_ETH_CFG_RMII_GE0_SPD_100                 BIT(10)
> +
> +/*
> + * AR934X GMAC Interface
> + */
> +#define AR934X_GMAC_REG_ETH_CFG                         0x00
> +
> +#define AR934X_ETH_CFG_RGMII_GMAC0                      BIT(0)
> +#define AR934X_ETH_CFG_MII_GMAC0                        BIT(1)
> +#define AR934X_ETH_CFG_GMII_GMAC0                       BIT(2)
> +#define AR934X_ETH_CFG_MII_GMAC0_MASTER                 BIT(3)
> +#define AR934X_ETH_CFG_MII_GMAC0_SLAVE                  BIT(4)
> +#define AR934X_ETH_CFG_MII_GMAC0_ERR_EN                 BIT(5)
> +#define AR934X_ETH_CFG_SW_ONLY_MODE                     BIT(6)
> +#define AR934X_ETH_CFG_SW_PHY_SWAP                      BIT(7)
> +#define AR934X_ETH_CFG_SW_APB_ACCESS                    BIT(9)
> +#define AR934X_ETH_CFG_RMII_GMAC0                       BIT(10)
> +#define AR933X_ETH_CFG_MII_CNTL_SPEED                   BIT(11)
> +#define AR934X_ETH_CFG_RMII_GMAC0_MASTER                BIT(12)
> +#define AR933X_ETH_CFG_SW_ACC_MSB_FIRST                 BIT(13)
> +#define AR934X_ETH_CFG_RXD_DELAY                        BIT(14)
> +#define AR934X_ETH_CFG_RXD_DELAY_MASK                   0x3
> +#define AR934X_ETH_CFG_RXD_DELAY_SHIFT                  14
> +#define AR934X_ETH_CFG_RDV_DELAY                        BIT(16)
> +#define AR934X_ETH_CFG_RDV_DELAY_MASK                   0x3
> +#define AR934X_ETH_CFG_RDV_DELAY_SHIFT                  16
> +
> +/*
> + * QCA953X GMAC Interface
> + */
> +#define QCA953X_GMAC_REG_ETH_CFG                        0x00
> +
> +#define QCA953X_ETH_CFG_SW_ONLY_MODE                    BIT(6)
> +#define QCA953X_ETH_CFG_SW_PHY_SWAP                     BIT(7)
> +#define QCA953X_ETH_CFG_SW_APB_ACCESS                   BIT(9)
> +#define QCA953X_ETH_CFG_SW_ACC_MSB_FIRST                BIT(13)
> +
> +/*
> + * QCA955X GMAC Interface
> + */
> +
> +#define QCA955X_GMAC_REG_ETH_CFG                        0x00
> +
> +#define QCA955X_ETH_CFG_RGMII_EN                        BIT(0)
> +#define QCA955X_ETH_CFG_GE0_SGMII                       BIT(6)
> +
> +#endif /* __ASM_AR71XX_H */
> diff --git a/arch/mips/mach-ath79/include/mach/ath79.h b/arch/mips/mach-ath79/include/mach/ath79.h
> new file mode 100644
> index 0000000..90d80b8
> --- /dev/null
> +++ b/arch/mips/mach-ath79/include/mach/ath79.h
> @@ -0,0 +1,143 @@
> +/*
> + * Atheros AR71XX/AR724X/AR913X common definitions
> + *
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
> + * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#ifndef __ASM_MACH_ATH79_H
> +#define __ASM_MACH_ATH79_H
> +
> +#include <linux/types.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +enum ath79_soc_type {
> +	ATH79_SOC_UNKNOWN,
> +	ATH79_SOC_AR7130,
> +	ATH79_SOC_AR7141,
> +	ATH79_SOC_AR7161,
> +	ATH79_SOC_AR7240,
> +	ATH79_SOC_AR7241,
> +	ATH79_SOC_AR7242,
> +	ATH79_SOC_AR9130,
> +	ATH79_SOC_AR9132,
> +	ATH79_SOC_AR9330,
> +	ATH79_SOC_AR9331,
> +	ATH79_SOC_AR9341,
> +	ATH79_SOC_AR9342,
> +	ATH79_SOC_AR9344,
> +	ATH79_SOC_QCA9533,
> +	ATH79_SOC_QCA9556,
> +	ATH79_SOC_QCA9558,
> +	ATH79_SOC_TP9343,
> +	ATH79_SOC_QCA9561,
> +};
> +
> +static inline int soc_is_ar71xx(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR7130 ||
> +		gd->arch.soc == ATH79_SOC_AR7141 ||
> +		gd->arch.soc == ATH79_SOC_AR7161;
> +}
> +
> +static inline int soc_is_ar724x(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR7240 ||
> +		gd->arch.soc == ATH79_SOC_AR7241 ||
> +		gd->arch.soc == ATH79_SOC_AR7242;
> +}
> +
> +static inline int soc_is_ar7240(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR7240;
> +}
> +
> +static inline int soc_is_ar7241(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR7241;
> +}
> +
> +static inline int soc_is_ar7242(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR7242;
> +}
> +
> +static inline int soc_is_ar913x(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR9130 ||
> +		gd->arch.soc == ATH79_SOC_AR9132;
> +}
> +
> +static inline int soc_is_ar933x(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR9330 ||
> +		gd->arch.soc == ATH79_SOC_AR9331;
> +}
> +
> +static inline int soc_is_ar9341(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR9341;
> +}
> +
> +static inline int soc_is_ar9342(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR9342;
> +}
> +
> +static inline int soc_is_ar9344(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_AR9344;
> +}
> +
> +static inline int soc_is_ar934x(void)
> +{
> +	return soc_is_ar9341() ||
> +		soc_is_ar9342() ||
> +		soc_is_ar9344();
> +}
> +
> +static inline int soc_is_qca9533(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_QCA9533;
> +}
> +
> +static inline int soc_is_qca953x(void)
> +{
> +	return soc_is_qca9533();
> +}
> +
> +static inline int soc_is_qca9556(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_QCA9556;
> +}
> +
> +static inline int soc_is_qca9558(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_QCA9558;
> +}
> +
> +static inline int soc_is_qca955x(void)
> +{
> +	return soc_is_qca9556() || soc_is_qca9558();
> +}
> +
> +static inline int soc_is_tp9343(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_TP9343;
> +}
> +
> +static inline int soc_is_qca9561(void)
> +{
> +	return gd->arch.soc == ATH79_SOC_QCA9561;
> +}
> +
> +static inline int soc_is_qca956x(void)
> +{
> +	return soc_is_tp9343() || soc_is_qca9561();
> +}
> +
> +#endif /* __ASM_MACH_ATH79_H */
> diff --git a/arch/mips/mach-ath79/include/mach/ddr.h b/arch/mips/mach-ath79/include/mach/ddr.h
> new file mode 100644
> index 0000000..181179a
> --- /dev/null
> +++ b/arch/mips/mach-ath79/include/mach/ddr.h
> @@ -0,0 +1,13 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#ifndef __ASM_MACH_DDR_H
> +#define __ASM_MACH_DDR_H
> +
> +void ddr_init(void);
> +void ddr_tap_tuning(void);
> +
> +#endif /* __ASM_MACH_DDR_H */
> diff --git a/arch/mips/mach-ath79/include/mach/reset.h b/arch/mips/mach-ath79/include/mach/reset.h
> new file mode 100644
> index 0000000..c383bfe
> --- /dev/null
> +++ b/arch/mips/mach-ath79/include/mach/reset.h
> @@ -0,0 +1,14 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#ifndef __ASM_MACH_RESET_H
> +#define __ASM_MACH_RESET_H
> +
> +#include <linux/types.h>
> +
> +u32 get_bootstrap(void);
> +
> +#endif /* __ASM_MACH_RESET_H */
> diff --git a/arch/mips/mach-ath79/reset.c b/arch/mips/mach-ath79/reset.c
> new file mode 100644
> index 0000000..2ea2f8d
> --- /dev/null
> +++ b/arch/mips/mach-ath79/reset.c
> @@ -0,0 +1,71 @@
> +/*
> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/addrspace.h>
> +#include <asm/types.h>
> +#include <mach/ath79.h>
> +#include <mach/ar71xx_regs.h>
> +
> +void _machine_restart(void)
> +{
> +	void __iomem *base;
> +	u32 reg = 0;
> +
> +	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
> +			   MAP_NOCACHE);
> +	if (soc_is_ar71xx())
> +		reg = AR71XX_RESET_REG_RESET_MODULE;
> +	else if (soc_is_ar724x())
> +		reg = AR724X_RESET_REG_RESET_MODULE;
> +	else if (soc_is_ar913x())
> +		reg = AR913X_RESET_REG_RESET_MODULE;
> +	else if (soc_is_ar933x())
> +		reg = AR933X_RESET_REG_RESET_MODULE;
> +	else if (soc_is_ar934x())
> +		reg = AR934X_RESET_REG_RESET_MODULE;
> +	else if (soc_is_qca953x())
> +		reg = QCA953X_RESET_REG_RESET_MODULE;
> +	else if (soc_is_qca955x())
> +		reg = QCA955X_RESET_REG_RESET_MODULE;
> +	else if (soc_is_qca956x())
> +		reg = QCA956X_RESET_REG_RESET_MODULE;
> +	else
> +		puts("Reset register not defined for this SOC\n");
> +
> +	if (reg)
> +		setbits_be32(base + reg, AR71XX_RESET_FULL_CHIP);
> +
> +	while (1)
> +		/* NOP */;
> +}
> +
> +u32 get_bootstrap(void)
> +{
> +	const void __iomem *base;
> +	u32 reg = 0;
> +
> +	base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE,
> +			   MAP_NOCACHE);
> +	if (soc_is_ar933x())
> +		reg = AR933X_RESET_REG_BOOTSTRAP;
> +	else if (soc_is_ar934x())
> +		reg = AR934X_RESET_REG_BOOTSTRAP;
> +	else if (soc_is_qca953x())
> +		reg = QCA953X_RESET_REG_BOOTSTRAP;
> +	else if (soc_is_qca955x())
> +		reg = QCA955X_RESET_REG_BOOTSTRAP;
> +	else if (soc_is_qca956x())
> +		reg = QCA956X_RESET_REG_BOOTSTRAP;
> +	else
> +		puts("Bootstrap register not defined for this SOC\n");
> +
> +	if (reg)
> +		return readl(base + reg);
> +
> +	return 0;
> +}
> 

-- 
- Daniel

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160410/4b6b48dd/attachment.sig>

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

* [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC
  2016-04-09 18:34   ` Simon Glass
@ 2016-04-11  7:57     ` Wills Wang
  2016-04-11 13:41       ` Marek Vasut
  0 siblings, 1 reply; 30+ messages in thread
From: Wills Wang @ 2016-04-11  7:57 UTC (permalink / raw)
  To: u-boot



On Sunday, April 10, 2016 02:34 AM, Simon Glass wrote:
> Hi Wills,
>
> On 16 March 2016 at 02:59, Wills Wang <wills.wang@live.com> wrote:
>> This patch add support for ar933x serial.
>>
>> Reviewed-by: Thomas Chou <thomas@wytron.com.tw>
>> Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>
>> Signed-off-by: Wills Wang <wills.wang@live.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> But please see a comment below.
>
>> ---
>>
>> Changes in v8:
>> - Remove ath79_serial_write/read
>> - Use pinctrl for serial
>> - Add Kconfig dependence for serial option
>>
>> Changes in v7:
>> - remove map_physmem for debug port
>>
>> Changes in v6:
>> - Remove wait loop in putc and getc
>> - Use map_physmem instead of KSEG1ADDR
>>
>> Changes in v5:
>> - remove ar933x_serial_platdata
>> - Import document "qca,ar9330-uart.txt" from kernel
>> - Add support for debug UART
>>
>> Changes in v4:
>> - Auto calculate baudrate for serial driver
>> - Move pinctrl code in serial driver into arch/mips/mach-ath79
>> - Use get_serial_clock to serial clock source
>>
>> Changes in v3:
>> - Convert serial driver to driver model
>>
>> Changes in v2:
>> - Move serial driver code into drivers/serial
>>
>>   .../serial/qca,ar9330-uart.txt                     |  24 ++
>>   drivers/serial/Kconfig                             |  18 ++
>>   drivers/serial/Makefile                            |   1 +
>>   drivers/serial/serial_ar933x.c                     | 255 +++++++++++++++++++++
>>   4 files changed, 298 insertions(+)
>>   create mode 100644 doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>>   create mode 100644 drivers/serial/serial_ar933x.c
>>
>> diff --git a/doc/device-tree-bindings/serial/qca,ar9330-uart.txt b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>> new file mode 100644
>> index 0000000..ec576a1
>> --- /dev/null
>> +++ b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>> @@ -0,0 +1,24 @@
>> +* Qualcomm Atheros AR9330 High-Speed UART
>> +
>> +Required properties:
>> +
>> +- compatible: Must be "qca,ar9330-uart"
>> +
>> +- reg: Specifies the physical base address of the controller and
>> +  the length of the memory mapped region.
>> +
>> +Additional requirements:
>> +
>> +  Each UART port must have an alias correctly numbered in "aliases"
>> +  node.
>> +
>> +Example:
>> +
>> +       aliases {
>> +               serial0 = &uart0;
>> +       };
>> +
>> +       uart0: uart at 18020000 {
>> +               compatible = "qca,ar9330-uart";
>> +               reg = <0x18020000 0x14>;
>> +       };
>> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
>> index 92d4212..d451441 100644
>> --- a/drivers/serial/Kconfig
>> +++ b/drivers/serial/Kconfig
>> @@ -89,6 +89,15 @@ config DEBUG_UART_ALTERA_UART
>>            You will need to provide parameters to make this work. The driver will
>>            be available until the real driver model serial is running.
>>
>> +config DEBUG_UART_AR933X
>> +       bool "QCA/Atheros ar933x"
>> +       depends on AR933X_UART
>> +       help
>> +         Select this to enable a debug UART using the ar933x uart driver.
>> +         You will need to provide parameters to make this work. The
>> +         driver will be available until the real driver model serial is
>> +         running.
>> +
>>   config DEBUG_UART_NS16550
>>          bool "ns16550"
>>          help
>> @@ -254,6 +263,15 @@ config ALTERA_UART
>>            Select this to enable an UART for Altera devices. Please find
>>            details on the "Embedded Peripherals IP User Guide" of Altera.
>>
>> +config AR933X_UART
>> +       bool "QCA/Atheros ar933x UART support"
>> +       depends on DM_SERIAL && SOC_AR933X
>> +       help
>> +         Select this to enable UART support for QCA/Atheros ar933x
>> +         devices. This driver uses driver model and requires a device
>> +         tree binding to operate, please refer to the document at
>> +         doc/device-tree-bindings/serial/qca,ar9330-uart.txt.
>> +
>>   config FSL_LPUART
>>          bool "Freescale LPUART support"
>>          help
>> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
>> index 05bdf56..42e493a 100644
>> --- a/drivers/serial/Makefile
>> +++ b/drivers/serial/Makefile
>> @@ -17,6 +17,7 @@ endif
>>
>>   obj-$(CONFIG_ALTERA_UART) += altera_uart.o
>>   obj-$(CONFIG_ALTERA_JTAG_UART) += altera_jtag_uart.o
>> +obj-$(CONFIG_AR933X_UART) += serial_ar933x.o
>>   obj-$(CONFIG_ARM_DCC) += arm_dcc.o
>>   obj-$(CONFIG_ATMEL_USART) += atmel_usart.o
>>   obj-$(CONFIG_EFI_APP) += serial_efi.o
>> diff --git a/drivers/serial/serial_ar933x.c b/drivers/serial/serial_ar933x.c
>> new file mode 100644
>> index 0000000..d43f9c9
>> --- /dev/null
>> +++ b/drivers/serial/serial_ar933x.c
>> @@ -0,0 +1,255 @@
>> +/*
>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>> + *
>> + * SPDX-License-Identifier: GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <div64.h>
>> +#include <errno.h>
>> +#include <serial.h>
>> +#include <asm/io.h>
>> +#include <asm/addrspace.h>
>> +#include <asm/types.h>
>> +#include <dm/pinctrl.h>
>> +#include <mach/ar71xx_regs.h>
>> +
>> +#define AR933X_UART_DATA_REG            0x00
>> +#define AR933X_UART_CS_REG              0x04
>> +#define AR933X_UART_CLK_REG             0x08
>> +
>> +#define AR933X_UART_DATA_TX_RX_MASK     0xff
>> +#define AR933X_UART_DATA_RX_CSR         BIT(8)
>> +#define AR933X_UART_DATA_TX_CSR         BIT(9)
>> +#define AR933X_UART_CS_IF_MODE_S        2
>> +#define AR933X_UART_CS_IF_MODE_M        0x3
>> +#define AR933X_UART_CS_IF_MODE_DTE      1
>> +#define AR933X_UART_CS_IF_MODE_DCE      2
>> +#define AR933X_UART_CS_TX_RDY_ORIDE     BIT(7)
>> +#define AR933X_UART_CS_RX_RDY_ORIDE     BIT(8)
>> +#define AR933X_UART_CLK_STEP_M          0xffff
>> +#define AR933X_UART_CLK_SCALE_M         0xfff
>> +#define AR933X_UART_CLK_SCALE_S         16
>> +#define AR933X_UART_CLK_STEP_S          0
>> +
>> +struct ar933x_serial_priv {
>> +       void __iomem *regs;
>> +};
>> +
>> +/*
>> + * baudrate = (clk / (scale + 1)) * (step * (1 / 2^17))
>> + */
>> +static u32 ar933x_serial_get_baud(u32 clk, u32 scale, u32 step)
>> +{
>> +       u64 t;
>> +       u32 div;
>> +
>> +       div = (2 << 16) * (scale + 1);
>> +       t = clk;
>> +       t *= step;
>> +       t += (div / 2);
>> +       do_div(t, div);
>> +
>> +       return t;
>> +}
>> +
>> +static void ar933x_serial_get_scale_step(u32 clk, u32 baud,
>> +                                        u32 *scale, u32 *step)
>> +{
>> +       u32 tscale, baudrate;
>> +       long min_diff;
>> +
>> +       *scale = 0;
>> +       *step = 0;
>> +
>> +       min_diff = baud;
>> +       for (tscale = 0; tscale < AR933X_UART_CLK_SCALE_M; tscale++) {
>> +               u64 tstep;
>> +               int diff;
>> +
>> +               tstep = baud * (tscale + 1);
>> +               tstep *= (2 << 16);
>> +               do_div(tstep, clk);
>> +
>> +               if (tstep > AR933X_UART_CLK_STEP_M)
>> +                       break;
>> +
>> +               baudrate = ar933x_serial_get_baud(clk, tscale, tstep);
>> +               diff = abs(baudrate - baud);
>> +               if (diff < min_diff) {
>> +                       min_diff = diff;
>> +                       *scale = tscale;
>> +                       *step = tstep;
>> +               }
>> +       }
>> +}
>> +
>> +static int ar933x_serial_setbrg(struct udevice *dev, int baudrate)
>> +{
>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>> +       u32 val, scale, step;
>> +
>> +       val = get_serial_clock();
>> +       ar933x_serial_get_scale_step(val, baudrate, &scale, &step);
>> +
>> +       val  = (scale & AR933X_UART_CLK_SCALE_M)
>> +                       << AR933X_UART_CLK_SCALE_S;
>> +       val |= (step & AR933X_UART_CLK_STEP_M)
>> +                       << AR933X_UART_CLK_STEP_S;
>> +       writel(val, priv->regs + AR933X_UART_CLK_REG);
>> +
>> +       return 0;
>> +}
>> +
>> +static int ar933x_serial_putc(struct udevice *dev, const char c)
>> +{
>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>> +       u32 data;
>> +
>> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
>> +       if (!(data & AR933X_UART_DATA_TX_CSR))
>> +               return -EAGAIN;
>> +
>> +       data  = (u32)c | AR933X_UART_DATA_TX_CSR;
>> +       writel(data, priv->regs + AR933X_UART_DATA_REG);
>> +
>> +       return 0;
>> +}
>> +
>> +static int ar933x_serial_getc(struct udevice *dev)
>> +{
>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>> +       u32 data;
>> +
>> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
>> +       if (!(data & AR933X_UART_DATA_RX_CSR))
>> +               return -EAGAIN;
>> +
>> +       writel(AR933X_UART_DATA_RX_CSR, priv->regs + AR933X_UART_DATA_REG);
>> +       return data & AR933X_UART_DATA_TX_RX_MASK;
>> +}
>> +
>> +static int ar933x_serial_pending(struct udevice *dev, bool input)
>> +{
>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>> +       u32 data;
>> +
>> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
>> +       if (input)
>> +               return (data & AR933X_UART_DATA_RX_CSR) ? 1 : 0;
>> +       else
>> +               return (data & AR933X_UART_DATA_TX_CSR) ? 0 : 1;
>> +}
>> +
>> +static int ar933x_serial_probe(struct udevice *dev)
>> +{
>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>> +       struct udevice *pinctrl;
>> +       fdt_addr_t addr;
>> +       u32 val;
>> +       int ret;
>> +
>> +       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
>> +       if (ret)
>> +               return ret;
>> +       ret = pinctrl_get_periph_id(pinctrl, dev);
>> +       if (ret < 0)
>> +               return ret;
>> +       ret = pinctrl_request(pinctrl, ret, 0);
>> +       if (ret < 0)
>> +               return ret;
> ().Can you check if you need this? It should be called automatically
> by device_probe() which calls pinctrl_select_state().
Ok, i will remove all explicit pinctrl setting from driver.
>> +
>> +       addr = dev_get_addr(dev);
>> +       if (addr == FDT_ADDR_T_NONE)
>> +               return -EINVAL;
>> +
>> +       priv->regs = map_physmem(addr,
>> +                                AR933X_UART_SIZE,
>> +                                MAP_NOCACHE);
> can you fill this out to 80cols?
Ok.
>> +
>> +       /*
>> +        * UART controller configuration:
>> +        * - no DMA
>> +        * - no interrupt
>> +        * - DCE mode
>> +        * - no flow control
>> +        * - set RX ready oride
>> +        * - set TX ready oride
>> +        */
>> +       val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
>> +             AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
>> +       writel(val, priv->regs + AR933X_UART_CS_REG);
>> +       return 0;
>> +}
>> +
>> +static const struct dm_serial_ops ar933x_serial_ops = {
>> +       .putc = ar933x_serial_putc,
>> +       .pending = ar933x_serial_pending,
>> +       .getc = ar933x_serial_getc,
>> +       .setbrg = ar933x_serial_setbrg,
>> +};
>> +
>> +static const struct udevice_id ar933x_serial_ids[] = {
>> +       { .compatible = "qca,ar9330-uart" },
>> +       { }
>> +};
>> +
>> +U_BOOT_DRIVER(serial_ar933x) = {
>> +       .name   = "serial_ar933x",
>> +       .id = UCLASS_SERIAL,
>> +       .of_match = ar933x_serial_ids,
>> +       .priv_auto_alloc_size = sizeof(struct ar933x_serial_priv),
>> +       .probe = ar933x_serial_probe,
>> +       .ops    = &ar933x_serial_ops,
>> +       .flags = DM_FLAG_PRE_RELOC,
>> +};
>> +
>> +#ifdef CONFIG_DEBUG_UART_AR933X
>> +
>> +#include <debug_uart.h>
>> +
>> +static inline void _debug_uart_init(void)
>> +{
>> +       void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
>> +       u32 val, scale, step;
>> +
>> +       /*
>> +        * UART controller configuration:
>> +        * - no DMA
>> +        * - no interrupt
>> +        * - DCE mode
>> +        * - no flow control
>> +        * - set RX ready oride
>> +        * - set TX ready oride
>> +        */
>> +       val = (AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S) |
>> +             AR933X_UART_CS_TX_RDY_ORIDE | AR933X_UART_CS_RX_RDY_ORIDE;
>> +       writel(val, regs + AR933X_UART_CS_REG);
>> +
>> +       ar933x_serial_get_scale_step(CONFIG_DEBUG_UART_CLOCK,
>> +                                    CONFIG_BAUDRATE, &scale, &step);
>> +
>> +       val  = (scale & AR933X_UART_CLK_SCALE_M)
>> +                       << AR933X_UART_CLK_SCALE_S;
>> +       val |= (step & AR933X_UART_CLK_STEP_M)
>> +                       << AR933X_UART_CLK_STEP_S;
>> +       writel(val, regs + AR933X_UART_CLK_REG);
>> +}
>> +
>> +static inline void _debug_uart_putc(int c)
>> +{
>> +       void __iomem *regs = (void *)CONFIG_DEBUG_UART_BASE;
>> +       u32 data;
>> +
>> +       do {
>> +               data = readl(regs + AR933X_UART_DATA_REG);
>> +       } while (!(data & AR933X_UART_DATA_TX_CSR));
>> +
>> +       data  = (u32)c | AR933X_UART_DATA_TX_CSR;
>> +       writel(data, regs + AR933X_UART_DATA_REG);
>> +}
>> +
>> +DEBUG_UART_FUNCS
>> +
>> +#endif
>> --
>> 1.9.1
>>
> Regards,
> Simon

-- 
Best Regards
Wills

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

* [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC
  2016-04-11  7:57     ` Wills Wang
@ 2016-04-11 13:41       ` Marek Vasut
  0 siblings, 0 replies; 30+ messages in thread
From: Marek Vasut @ 2016-04-11 13:41 UTC (permalink / raw)
  To: u-boot

On 04/11/2016 09:57 AM, Wills Wang wrote:
> 
> 
> On Sunday, April 10, 2016 02:34 AM, Simon Glass wrote:
>> Hi Wills,
>>
>> On 16 March 2016 at 02:59, Wills Wang <wills.wang@live.com> wrote:
>>> This patch add support for ar933x serial.
>>>
>>> Reviewed-by: Thomas Chou <thomas@wytron.com.tw>
>>> Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
>>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>>
>>> Signed-off-by: Wills Wang <wills.wang@live.com>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>
>> But please see a comment below.
>>
>>> ---
>>>
>>> Changes in v8:
>>> - Remove ath79_serial_write/read
>>> - Use pinctrl for serial
>>> - Add Kconfig dependence for serial option
>>>
>>> Changes in v7:
>>> - remove map_physmem for debug port
>>>
>>> Changes in v6:
>>> - Remove wait loop in putc and getc
>>> - Use map_physmem instead of KSEG1ADDR
>>>
>>> Changes in v5:
>>> - remove ar933x_serial_platdata
>>> - Import document "qca,ar9330-uart.txt" from kernel
>>> - Add support for debug UART
>>>
>>> Changes in v4:
>>> - Auto calculate baudrate for serial driver
>>> - Move pinctrl code in serial driver into arch/mips/mach-ath79
>>> - Use get_serial_clock to serial clock source
>>>
>>> Changes in v3:
>>> - Convert serial driver to driver model
>>>
>>> Changes in v2:
>>> - Move serial driver code into drivers/serial
>>>
>>>   .../serial/qca,ar9330-uart.txt                     |  24 ++
>>>   drivers/serial/Kconfig                             |  18 ++
>>>   drivers/serial/Makefile                            |   1 +
>>>   drivers/serial/serial_ar933x.c                     | 255
>>> +++++++++++++++++++++
>>>   4 files changed, 298 insertions(+)
>>>   create mode 100644 doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>>>   create mode 100644 drivers/serial/serial_ar933x.c
>>>
>>> diff --git a/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>>> b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>>> new file mode 100644
>>> index 0000000..ec576a1
>>> --- /dev/null
>>> +++ b/doc/device-tree-bindings/serial/qca,ar9330-uart.txt
>>> @@ -0,0 +1,24 @@
>>> +* Qualcomm Atheros AR9330 High-Speed UART
>>> +
>>> +Required properties:
>>> +
>>> +- compatible: Must be "qca,ar9330-uart"
>>> +
>>> +- reg: Specifies the physical base address of the controller and
>>> +  the length of the memory mapped region.
>>> +
>>> +Additional requirements:
>>> +
>>> +  Each UART port must have an alias correctly numbered in "aliases"
>>> +  node.
>>> +
>>> +Example:
>>> +
>>> +       aliases {
>>> +               serial0 = &uart0;
>>> +       };
>>> +
>>> +       uart0: uart at 18020000 {
>>> +               compatible = "qca,ar9330-uart";
>>> +               reg = <0x18020000 0x14>;
>>> +       };
>>> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
>>> index 92d4212..d451441 100644
>>> --- a/drivers/serial/Kconfig
>>> +++ b/drivers/serial/Kconfig
>>> @@ -89,6 +89,15 @@ config DEBUG_UART_ALTERA_UART
>>>            You will need to provide parameters to make this work. The
>>> driver will
>>>            be available until the real driver model serial is running.
>>>
>>> +config DEBUG_UART_AR933X
>>> +       bool "QCA/Atheros ar933x"
>>> +       depends on AR933X_UART
>>> +       help
>>> +         Select this to enable a debug UART using the ar933x uart
>>> driver.
>>> +         You will need to provide parameters to make this work. The
>>> +         driver will be available until the real driver model serial is
>>> +         running.
>>> +
>>>   config DEBUG_UART_NS16550
>>>          bool "ns16550"
>>>          help
>>> @@ -254,6 +263,15 @@ config ALTERA_UART
>>>            Select this to enable an UART for Altera devices. Please find
>>>            details on the "Embedded Peripherals IP User Guide" of
>>> Altera.
>>>
>>> +config AR933X_UART
>>> +       bool "QCA/Atheros ar933x UART support"
>>> +       depends on DM_SERIAL && SOC_AR933X
>>> +       help
>>> +         Select this to enable UART support for QCA/Atheros ar933x
>>> +         devices. This driver uses driver model and requires a device
>>> +         tree binding to operate, please refer to the document at
>>> +         doc/device-tree-bindings/serial/qca,ar9330-uart.txt.
>>> +
>>>   config FSL_LPUART
>>>          bool "Freescale LPUART support"
>>>          help
>>> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
>>> index 05bdf56..42e493a 100644
>>> --- a/drivers/serial/Makefile
>>> +++ b/drivers/serial/Makefile
>>> @@ -17,6 +17,7 @@ endif
>>>
>>>   obj-$(CONFIG_ALTERA_UART) += altera_uart.o
>>>   obj-$(CONFIG_ALTERA_JTAG_UART) += altera_jtag_uart.o
>>> +obj-$(CONFIG_AR933X_UART) += serial_ar933x.o
>>>   obj-$(CONFIG_ARM_DCC) += arm_dcc.o
>>>   obj-$(CONFIG_ATMEL_USART) += atmel_usart.o
>>>   obj-$(CONFIG_EFI_APP) += serial_efi.o
>>> diff --git a/drivers/serial/serial_ar933x.c
>>> b/drivers/serial/serial_ar933x.c
>>> new file mode 100644
>>> index 0000000..d43f9c9
>>> --- /dev/null
>>> +++ b/drivers/serial/serial_ar933x.c
>>> @@ -0,0 +1,255 @@
>>> +/*
>>> + * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
>>> + *
>>> + * SPDX-License-Identifier: GPL-2.0+
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <dm.h>
>>> +#include <div64.h>
>>> +#include <errno.h>
>>> +#include <serial.h>
>>> +#include <asm/io.h>
>>> +#include <asm/addrspace.h>
>>> +#include <asm/types.h>
>>> +#include <dm/pinctrl.h>
>>> +#include <mach/ar71xx_regs.h>
>>> +
>>> +#define AR933X_UART_DATA_REG            0x00
>>> +#define AR933X_UART_CS_REG              0x04
>>> +#define AR933X_UART_CLK_REG             0x08
>>> +
>>> +#define AR933X_UART_DATA_TX_RX_MASK     0xff
>>> +#define AR933X_UART_DATA_RX_CSR         BIT(8)
>>> +#define AR933X_UART_DATA_TX_CSR         BIT(9)
>>> +#define AR933X_UART_CS_IF_MODE_S        2
>>> +#define AR933X_UART_CS_IF_MODE_M        0x3
>>> +#define AR933X_UART_CS_IF_MODE_DTE      1
>>> +#define AR933X_UART_CS_IF_MODE_DCE      2
>>> +#define AR933X_UART_CS_TX_RDY_ORIDE     BIT(7)
>>> +#define AR933X_UART_CS_RX_RDY_ORIDE     BIT(8)
>>> +#define AR933X_UART_CLK_STEP_M          0xffff
>>> +#define AR933X_UART_CLK_SCALE_M         0xfff
>>> +#define AR933X_UART_CLK_SCALE_S         16
>>> +#define AR933X_UART_CLK_STEP_S          0
>>> +
>>> +struct ar933x_serial_priv {
>>> +       void __iomem *regs;
>>> +};
>>> +
>>> +/*
>>> + * baudrate = (clk / (scale + 1)) * (step * (1 / 2^17))
>>> + */
>>> +static u32 ar933x_serial_get_baud(u32 clk, u32 scale, u32 step)
>>> +{
>>> +       u64 t;
>>> +       u32 div;
>>> +
>>> +       div = (2 << 16) * (scale + 1);
>>> +       t = clk;
>>> +       t *= step;
>>> +       t += (div / 2);
>>> +       do_div(t, div);
>>> +
>>> +       return t;
>>> +}
>>> +
>>> +static void ar933x_serial_get_scale_step(u32 clk, u32 baud,
>>> +                                        u32 *scale, u32 *step)
>>> +{
>>> +       u32 tscale, baudrate;
>>> +       long min_diff;
>>> +
>>> +       *scale = 0;
>>> +       *step = 0;
>>> +
>>> +       min_diff = baud;
>>> +       for (tscale = 0; tscale < AR933X_UART_CLK_SCALE_M; tscale++) {
>>> +               u64 tstep;
>>> +               int diff;
>>> +
>>> +               tstep = baud * (tscale + 1);
>>> +               tstep *= (2 << 16);
>>> +               do_div(tstep, clk);
>>> +
>>> +               if (tstep > AR933X_UART_CLK_STEP_M)
>>> +                       break;
>>> +
>>> +               baudrate = ar933x_serial_get_baud(clk, tscale, tstep);
>>> +               diff = abs(baudrate - baud);
>>> +               if (diff < min_diff) {
>>> +                       min_diff = diff;
>>> +                       *scale = tscale;
>>> +                       *step = tstep;
>>> +               }
>>> +       }
>>> +}
>>> +
>>> +static int ar933x_serial_setbrg(struct udevice *dev, int baudrate)
>>> +{
>>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>>> +       u32 val, scale, step;
>>> +
>>> +       val = get_serial_clock();
>>> +       ar933x_serial_get_scale_step(val, baudrate, &scale, &step);
>>> +
>>> +       val  = (scale & AR933X_UART_CLK_SCALE_M)
>>> +                       << AR933X_UART_CLK_SCALE_S;
>>> +       val |= (step & AR933X_UART_CLK_STEP_M)
>>> +                       << AR933X_UART_CLK_STEP_S;
>>> +       writel(val, priv->regs + AR933X_UART_CLK_REG);
>>> +
>>> +       return 0;
>>> +}
>>> +
>>> +static int ar933x_serial_putc(struct udevice *dev, const char c)
>>> +{
>>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>>> +       u32 data;
>>> +
>>> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
>>> +       if (!(data & AR933X_UART_DATA_TX_CSR))
>>> +               return -EAGAIN;
>>> +
>>> +       data  = (u32)c | AR933X_UART_DATA_TX_CSR;
>>> +       writel(data, priv->regs + AR933X_UART_DATA_REG);
>>> +
>>> +       return 0;
>>> +}
>>> +
>>> +static int ar933x_serial_getc(struct udevice *dev)
>>> +{
>>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>>> +       u32 data;
>>> +
>>> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
>>> +       if (!(data & AR933X_UART_DATA_RX_CSR))
>>> +               return -EAGAIN;
>>> +
>>> +       writel(AR933X_UART_DATA_RX_CSR, priv->regs +
>>> AR933X_UART_DATA_REG);
>>> +       return data & AR933X_UART_DATA_TX_RX_MASK;
>>> +}
>>> +
>>> +static int ar933x_serial_pending(struct udevice *dev, bool input)
>>> +{
>>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>>> +       u32 data;
>>> +
>>> +       data = readl(priv->regs + AR933X_UART_DATA_REG);
>>> +       if (input)
>>> +               return (data & AR933X_UART_DATA_RX_CSR) ? 1 : 0;
>>> +       else
>>> +               return (data & AR933X_UART_DATA_TX_CSR) ? 0 : 1;
>>> +}
>>> +
>>> +static int ar933x_serial_probe(struct udevice *dev)
>>> +{
>>> +       struct ar933x_serial_priv *priv = dev_get_priv(dev);
>>> +       struct udevice *pinctrl;
>>> +       fdt_addr_t addr;
>>> +       u32 val;
>>> +       int ret;
>>> +
>>> +       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
>>> +       if (ret)
>>> +               return ret;
>>> +       ret = pinctrl_get_periph_id(pinctrl, dev);
>>> +       if (ret < 0)
>>> +               return ret;
>>> +       ret = pinctrl_request(pinctrl, ret, 0);
>>> +       if (ret < 0)
>>> +               return ret;
>> ().Can you check if you need this? It should be called automatically
>> by device_probe() which calls pinctrl_select_state().
> Ok, i will remove all explicit pinctrl setting from driver.
>>> +
>>> +       addr = dev_get_addr(dev);
>>> +       if (addr == FDT_ADDR_T_NONE)
>>> +               return -EINVAL;
>>> +
>>> +       priv->regs = map_physmem(addr,
>>> +                                AR933X_UART_SIZE,
>>> +                                MAP_NOCACHE);
>> can you fill this out to 80cols?
> Ok.

Please send subsequent patches on top of mips/next :)

http://git.denx.de/?p=u-boot/u-boot-mips.git;a=shortlog;h=refs/heads/next


-- 
Best regards,
Marek Vasut

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

end of thread, other threads:[~2016-04-11 13:41 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1458118800-23675-1-git-send-email-wills.wang@live.com>
2016-03-16  8:59 ` [U-Boot] [PATCH v8 1/9] mips: add base support for QCA/Atheros ath79 SOCs Wills Wang
2016-03-16 21:35   ` Marek Vasut
2016-03-17  3:39     ` Wills Wang
2016-03-17  3:44       ` Marek Vasut
2016-03-17  4:02         ` Wills Wang
2016-03-17 12:20           ` Marek Vasut
2016-03-17 12:35             ` Wills Wang
2016-03-17 12:37               ` Marek Vasut
2016-04-02 22:51               ` Marek Vasut
2016-03-17 12:48             ` Daniel Schwierzeck
2016-03-17 12:51               ` Marek Vasut
2016-04-10 18:35   ` Daniel Schwierzeck
2016-03-16  8:59 ` [U-Boot] [PATCH v8 2/9] mips: ath79: add support for AR933x SOCs Wills Wang
2016-03-16 21:38   ` Marek Vasut
2016-03-17  3:14     ` Wills Wang
2016-03-16  8:59 ` [U-Boot] [PATCH v8 3/9] mips: ath79: add support for QCA953x SOCs Wills Wang
2016-03-16 21:39   ` Marek Vasut
2016-03-17  3:14     ` Wills Wang
2016-03-17  3:27       ` Marek Vasut
2016-03-16  8:59 ` [U-Boot] [PATCH v8 4/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores ar933x Wills Wang
2016-04-09 18:34   ` Simon Glass
2016-03-16  8:59 ` [U-Boot] [PATCH v8 5/9] drivers: pinctrl: Add simple pinctrl driver for QCA/Athores qca953x Wills Wang
2016-04-09 18:34   ` Simon Glass
2016-03-16  8:59 ` [U-Boot] [PATCH v8 6/9] drivers: serial: add serial driver for ar933x SOC Wills Wang
2016-04-09 18:34   ` Simon Glass
2016-04-11  7:57     ` Wills Wang
2016-04-11 13:41       ` Marek Vasut
2016-03-16  8:59 ` [U-Boot] [PATCH v8 7/9] drivers: spi: add spi support for QCA/Atheros ath79 SOCs Wills Wang
2016-03-16  8:59 ` [U-Boot] [PATCH v8 8/9] mips: ath79: add AP121 reference board Wills Wang
2016-03-16  9:00 ` [U-Boot] [PATCH v8 9/9] mips: ath79: add AP143 " Wills Wang

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.