[U-Boot] [PATCH 7/8] mips: ath79: Add AR934x support

Marek Vasut marex at denx.de
Fri May 6 19:12:51 CEST 2016


On 05/06/2016 01:32 PM, Daniel Schwierzeck wrote:
> 
> 
> Am 05.05.2016 um 20:14 schrieb Marek Vasut:
>> Add support for the Atheros AR934x WiSoCs. This patchs adds complete
>> system init, including PLL and DRAM init, both of which happen from
>> full C environment, since the AR934x has proper SRAM.
>>
>> Signed-off-by: Marek Vasut <marex at denx.de>
>> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
>> Cc: Wills Wang <wills.wang at live.com>
>> ---
>>  arch/mips/dts/ar934x.dtsi                       |  94 +++++++
>>  arch/mips/mach-ath79/Kconfig                    |   9 +
>>  arch/mips/mach-ath79/Makefile                   |   3 +-
>>  arch/mips/mach-ath79/ar934x/Makefile            |   7 +
>>  arch/mips/mach-ath79/ar934x/clk.c               | 336 ++++++++++++++++++++++++
>>  arch/mips/mach-ath79/ar934x/cpu.c               |  10 +
>>  arch/mips/mach-ath79/ar934x/ddr.c               | 165 ++++++++++++
>>  arch/mips/mach-ath79/include/mach/ar71xx_regs.h |  43 +++
>>  arch/mips/mach-ath79/include/mach/ath79.h       |   3 +
>>  9 files changed, 669 insertions(+), 1 deletion(-)
>>  create mode 100644 arch/mips/dts/ar934x.dtsi
>>  create mode 100644 arch/mips/mach-ath79/ar934x/Makefile
>>  create mode 100644 arch/mips/mach-ath79/ar934x/clk.c
>>  create mode 100644 arch/mips/mach-ath79/ar934x/cpu.c
>>  create mode 100644 arch/mips/mach-ath79/ar934x/ddr.c
> 
> there are checkpatch.pl warnings:
> 
> warning: arch/mips/mach-ath79/ar934x/clk.c,151: line over 80 characters
> warning: arch/mips/mach-ath79/ar934x/clk.c,152: line over 80 characters
> warning: arch/mips/mach-ath79/ar934x/clk.c,158: line over 80 characters
> warning: arch/mips/mach-ath79/ar934x/clk.c,159: line over 80 characters
> warning: arch/mips/mach-ath79/ar934x/clk.c,323: line over 80 characters
> warning: arch/mips/mach-ath79/ar934x/ddr.c,141: line over 80 characters
> warning: arch/mips/mach-ath79/ar934x/ddr.c,142: line over 80 characters

Hm, I'm not fond of fixing lines which are 81 lines long and fixing them
makes the code only more cryptic, but fixed.

> error: arch/mips/mach-ath79/ar934x/ddr.c,158: do not use C99 // comments
> error: arch/mips/mach-ath79/ar934x/ddr.c,159: do not use C99 // comments
> error: arch/mips/mach-ath79/ar934x/ddr.c,160: do not use C99 // comments

Oops, these should really be removed. Thanks for spotting that.

> checkpatch.pl found 3 error(s), 8 warning(s), 0 checks(s)
> 
> 
>>
>> diff --git a/arch/mips/dts/ar934x.dtsi b/arch/mips/dts/ar934x.dtsi
>> new file mode 100644
>> index 0000000..d62c447
>> --- /dev/null
>> +++ b/arch/mips/dts/ar934x.dtsi
>> @@ -0,0 +1,94 @@
>> +/*
>> + * Copyright (C) 2016 Marek Vasut <marex at denx.de>
>> + *
>> + * SPDX-License-Identifier: GPL-2.0+
>> + */
>> +
>> +#include "skeleton.dtsi"
>> +
>> +/ {
>> +	compatible = "qca,ar934x";
>> +
>> +	#address-cells = <1>;
>> +	#size-cells = <1>;
>> +
>> +	cpus {
>> +		#address-cells = <1>;
>> +		#size-cells = <0>;
>> +
>> +		cpu at 0 {
>> +			device_type = "cpu";
>> +			compatible = "mips,mips74Kc";
>> +			reg = <0>;
>> +		};
>> +	};
>> +
>> +	clocks {
>> +		#address-cells = <1>;
>> +		#size-cells = <1>;
>> +		ranges;
>> +
>> +		xtal: xtal {
>> +			#clock-cells = <0>;
>> +			compatible = "fixed-clock";
>> +			clock-output-names = "xtal";
>> +		};
>> +	};
>> +
>> +	ahb {
>> +		compatible = "simple-bus";
>> +		ranges;
>> +
>> +		#address-cells = <1>;
>> +		#size-cells = <1>;
>> +
>> +		apb {
>> +			compatible = "simple-bus";
>> +			ranges;
>> +
>> +			#address-cells = <1>;
>> +			#size-cells = <1>;
>> +
>> +			ehci0: ehci at 1b000100 {
>> +				compatible = "generic-ehci";
>> +				reg = <0x1b000100 0x100>;
>> +
>> +				status = "disabled";
>> +			};
>> +
>> +			uart0: uart at 18020000 {
>> +				compatible = "ns16550";
>> +				reg = <0x18020000 0x20>;
>> +				reg-shift = <2>;
>> +
>> +				status = "disabled";
>> +			};
>> +
>> +			gmac0: eth at 0x19000000 {
>> +				compatible = "qca,ag934x-mac";
>> +				reg = <0x19000000 0x200>;
>> +				phy-mode = "rgmii";
>> +
>> +				status = "disabled";
>> +			};
>> +
>> +			gmac1: eth at 0x1a000000 {
>> +				compatible = "qca,ag934x-mac";
>> +				reg = <0x1a000000 0x200>;
>> +				phy-mode = "rgmii";
>> +
>> +				status = "disabled";
>> +			};
>> +		};
>> +
>> +		spi0: spi at 1f000000 {
>> +			compatible = "qca,ar7100-spi";
>> +			reg = <0x1f000000 0x10>;
>> +
>> +			status = "disabled";
>> +
>> +			#address-cells = <1>;
>> +			#size-cells = <0>;
>> +		};
>> +	};
>> +};
>> diff --git a/arch/mips/mach-ath79/Kconfig b/arch/mips/mach-ath79/Kconfig
>> index f45403b..527960f 100644
>> --- a/arch/mips/mach-ath79/Kconfig
>> +++ b/arch/mips/mach-ath79/Kconfig
>> @@ -13,6 +13,15 @@ config SOC_AR933X
>>  	help
>>  	  This supports QCA/Atheros ar933x family SOCs.
>>  
>> +config SOC_AR934X
>> +	bool
>> +	select SUPPORTS_BIG_ENDIAN
>> +	select SUPPORTS_CPU_MIPS32_R1
>> +	select SUPPORTS_CPU_MIPS32_R2
>> +	select MIPS_TUNE_74KC
> 
> MIPS_TUNE_74KC doesn't exist yet in arch/mips/Makefile and
> arch/mips/Kconfig. You should add it with an extra patch.

Done

>> +	help
>> +	  This supports QCA/Atheros ar934x family SOCs.
>> +
>>  config SOC_QCA953X
>>  	bool
>>  	select SUPPORTS_BIG_ENDIAN
>> diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile
>> index 160dfaa..d7e2666 100644
>> --- a/arch/mips/mach-ath79/Makefile
>> +++ b/arch/mips/mach-ath79/Makefile
>> @@ -7,4 +7,5 @@ obj-y += cpu.o
>>  obj-y += dram.o
>>  
>>  obj-$(CONFIG_SOC_AR933X)	+= ar933x/
>> -obj-$(CONFIG_SOC_QCA953X)	+= qca953x/
>> \ No newline at end of file
>> +obj-$(CONFIG_SOC_AR934X)	+= ar934x/
>> +obj-$(CONFIG_SOC_QCA953X)	+= qca953x/
>> diff --git a/arch/mips/mach-ath79/ar934x/Makefile b/arch/mips/mach-ath79/ar934x/Makefile
>> new file mode 100644
>> index 0000000..348c65b
>> --- /dev/null
>> +++ b/arch/mips/mach-ath79/ar934x/Makefile
>> @@ -0,0 +1,7 @@
>> +#
>> +# SPDX-License-Identifier:	GPL-2.0+
>> +#
>> +
>> +obj-y += cpu.o
>> +obj-y += clk.o
>> +obj-y += ddr.o
>> diff --git a/arch/mips/mach-ath79/ar934x/clk.c b/arch/mips/mach-ath79/ar934x/clk.c
>> new file mode 100644
>> index 0000000..6611b8d
>> --- /dev/null
>> +++ b/arch/mips/mach-ath79/ar934x/clk.c
>> @@ -0,0 +1,336 @@
>> +/*
>> + * Copyright (C) 2016 Marek Vasut <marex at denx.de>
>> + *
>> + * 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>
>> +#include <wait_bit.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +/*
>> + * The math for calculating PLL:
>> + *                                       NFRAC * 2^8
>> + *                               NINT + -------------
>> + *                XTAL [MHz]              2^(18 - 1)
>> + *   PLL [MHz] = ------------ * ----------------------
>> + *                  REFDIV              2^OUTDIV
>> + *
>> + * Unfortunatelly, there is no way to reliably compute the variables.
>> + * The vendor U-Boot port contains macros for various combinations of
>> + * CPU PLL / DDR PLL / AHB bus speed and there is no obvious pattern
>> + * in those numbers.
>> + */
>> +struct ar934x_pll_config {
>> +	u8	range;
>> +	u8	refdiv;
>> +	u8	outdiv;
>> +	/* Index 0 is for XTAL=25MHz , Index 1 is for XTAL=40MHz */
>> +	u8	nint[2];
>> +};
>> +
>> +struct ar934x_clock_config {
>> +	u16				cpu_freq;
>> +	u16				ddr_freq;
>> +	u16				ahb_freq;
>> +
>> +	struct ar934x_pll_config	cpu_pll;
>> +	struct ar934x_pll_config	ddr_pll;
>> +};
>> +
>> +static const struct ar934x_clock_config ar934x_clock_config[] = {
>> +	{ 300, 300, 150, { 1, 1, 1, { 24, 15 } }, { 1, 1, 1, { 24, 15 } } },
>> +	{ 400, 200, 200, { 1, 1, 1, { 32, 20 } }, { 1, 1, 2, { 32, 20 } } },
>> +	{ 400, 400, 200, { 0, 1, 1, { 32, 20 } }, { 0, 1, 1, { 32, 20 } } },
>> +	{ 500, 400, 200, { 1, 1, 0, { 20, 12 } }, { 0, 1, 1, { 32, 20 } } },
>> +	{ 533, 400, 200, { 1, 1, 0, { 21, 13 } }, { 0, 1, 1, { 32, 20 } } },
>> +	{ 533, 500, 250, { 1, 1, 0, { 21, 13 } }, { 0, 1, 0, { 20, 12 } } },
>> +	{ 560, 480, 240, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 19, 12 } } },
>> +	{ 566, 400, 200, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 16, 10 } } },
>> +	{ 566, 450, 225, { 1, 1, 0, { 22, 14 } }, { 0, 1, 1, { 36, 22 } } },
>> +	{ 566, 475, 237, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 19, 11 } } },
>> +	{ 566, 500, 250, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 20, 12 } } },
>> +	{ 566, 525, 262, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 21, 13 } } },
>> +	{ 566, 550, 275, { 1, 1, 0, { 22, 14 } }, { 1, 1, 0, { 22, 13 } } },
>> +	{ 600, 266, 133, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 21, 16 } } },
>> +	{ 600, 266, 200, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 21, 16 } } },
>> +	{ 600, 300, 150, { 0, 1, 0, { 24, 15 } }, { 0, 1, 1, { 24, 15 } } },
>> +	{ 600, 332, 166, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 26, 16 } } },
>> +	{ 600, 332, 200, { 0, 1, 0, { 24, 15 } }, { 1, 1, 1, { 26, 16 } } },
>> +	{ 600, 400, 200, { 0, 1, 0, { 24, 15 } }, { 0, 1, 1, { 32, 20 } } },
>> +	{ 600, 450, 200, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 18, 20 } } },
>> +	{ 600, 500, 250, { 0, 1, 0, { 24, 15 } }, { 1, 1, 0, { 20, 12 } } },
>> +	{ 600, 525, 262, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 21, 20 } } },
>> +	{ 600, 550, 275, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 22, 20 } } },
>> +	{ 600, 575, 287, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 23, 14 } } },
>> +	{ 600, 600, 300, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 24, 20 } } },
>> +	{ 600, 650, 325, { 0, 1, 0, { 24, 15 } }, { 0, 1, 0, { 26, 20 } } },
>> +	{ 650, 600, 300, { 0, 1, 0, { 26, 15 } }, { 0, 1, 0, { 24, 20 } } },
>> +	{ 700, 400, 200, { 3, 1, 0, { 28, 17 } }, { 0, 1, 1, { 32, 20 } } },
>> +};
>> +
>> +static void ar934x_srif_pll_cfg(void __iomem *pll_reg_base, const u32 srif_val)
>> +{
>> +	u32 reg;
>> +	do {
>> +		writel(0x10810f00, pll_reg_base + 0x4);
>> +		writel(srif_val, pll_reg_base + 0x0);
>> +		writel(0xd0810f00, pll_reg_base + 0x4);
>> +		writel(0x03000000, pll_reg_base + 0x8);
>> +		writel(0xd0800f00, pll_reg_base + 0x4);
>> +
>> +		clrbits_be32(pll_reg_base + 0x8, BIT(30));
>> +		udelay(5);
>> +		setbits_be32(pll_reg_base + 0x8, BIT(30));
>> +		udelay(5);
>> +
>> +		wait_for_bit("clk", pll_reg_base + 0xc, BIT(3), 1, 10, 0);
>> +
>> +		clrbits_be32(pll_reg_base + 0x8, BIT(30));
>> +		udelay(5);
>> +
>> +		/* Check if CPU SRIF PLL locked. */
>> +		reg = readl(pll_reg_base + 0x8);
>> +		reg = (reg & 0x7ffff8) >> 3;
>> +	} while (reg >= 0x40000);
>> +}
>> +
>> +void ar934x_pll_init(const u16 cpu_mhz, const u16 ddr_mhz, const u16 ahb_mhz)
>> +{
>> +	void __iomem *srif_regs = map_physmem(AR934X_SRIF_BASE,
>> +					      AR934X_SRIF_SIZE, MAP_NOCACHE);
>> +	void __iomem *reset_regs = map_physmem(AR71XX_RESET_BASE,
>> +					       AR71XX_RESET_SIZE, MAP_NOCACHE);
>> +	void __iomem *pll_regs = map_physmem(AR71XX_PLL_BASE,
>> +					     AR71XX_PLL_SIZE, MAP_NOCACHE);
>> +	const struct ar934x_pll_config *pll_cfg;
>> +	int i, xtal_40 = 0;
>> +	u32 reg, cpu_pll, cpu_srif, ddr_pll, ddr_srif;
>> +
>> +	/* Register remap failed, hang. */
>> +	if (!srif_regs || !reset_regs || !pll_regs)
>> +		hang();
> 
> map_physmem() is never NULL unless you implement plat_ioremap(). Thus
> those checks aren't necessary.

Removed

[...]

Thanks!
Best regards,
Marek Vasut


More information about the U-Boot mailing list