mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-30 18:05:48 +01:00 
			
		
		
		
	mips: jz47xx: Add JZ4780 SoC support
Add initial support for the Ingenic JZ47xx MIPS SoC. Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> Signed-off-by: Paul Burton <paul.burton@imgtec.com> Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
		
				
					committed by
					
						 Daniel Schwierzeck
						Daniel Schwierzeck
					
				
			
			
				
	
			
			
			
						parent
						
							b325c4dcd7
						
					
				
				
					commit
					cd71b1d5d2
				
			| @@ -525,6 +525,11 @@ F:	board/mscc/ | ||||
| F:	configs/mscc* | ||||
| F:	include/configs/vcoreiii.h | ||||
|  | ||||
| MIPS JZ4780 | ||||
| M:	Ezequiel Garcia <ezequiel@collabora.com> | ||||
| S:	Maintained | ||||
| F:	arch/mips/mach-jz47xx/ | ||||
|  | ||||
| MMC | ||||
| M:	Jaehoon Chung <jh80.chung@samsung.com> | ||||
| S:	Maintained | ||||
|   | ||||
| @@ -93,6 +93,12 @@ config ARCH_MT7620 | ||||
| 	select SUPPORTS_LITTLE_ENDIAN | ||||
| 	select SYSRESET | ||||
|  | ||||
| config ARCH_JZ47XX | ||||
| 	bool "Support Ingenic JZ47xx" | ||||
| 	select SUPPORT_SPL | ||||
| 	select OF_CONTROL | ||||
| 	select DM | ||||
|  | ||||
| config MACH_PIC32 | ||||
| 	bool "Support Microchip PIC32" | ||||
| 	select DM | ||||
| @@ -145,6 +151,7 @@ source "board/qemu-mips/Kconfig" | ||||
| source "arch/mips/mach-ath79/Kconfig" | ||||
| source "arch/mips/mach-mscc/Kconfig" | ||||
| source "arch/mips/mach-bmips/Kconfig" | ||||
| source "arch/mips/mach-jz47xx/Kconfig" | ||||
| source "arch/mips/mach-pic32/Kconfig" | ||||
| source "arch/mips/mach-mt7620/Kconfig" | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,7 @@ libs-y += arch/mips/lib/ | ||||
|  | ||||
| machine-$(CONFIG_ARCH_ATH79) += ath79 | ||||
| machine-$(CONFIG_ARCH_BMIPS) += bmips | ||||
| machine-$(CONFIG_ARCH_JZ47XX) += jz47xx | ||||
| machine-$(CONFIG_MACH_PIC32) += pic32 | ||||
| machine-$(CONFIG_ARCH_MT7620) += mt7620 | ||||
| machine-$(CONFIG_ARCH_MSCC) += mscc | ||||
|   | ||||
							
								
								
									
										164
									
								
								arch/mips/dts/jz4780.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								arch/mips/dts/jz4780.dtsi
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
|  | ||||
| #include <dt-bindings/clock/jz4780-cgu.h> | ||||
|  | ||||
| / { | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 	compatible = "ingenic,jz4780"; | ||||
|  | ||||
| 	cpuintc: interrupt-controller { | ||||
| 		#address-cells = <0>; | ||||
| 		#interrupt-cells = <1>; | ||||
| 		interrupt-controller; | ||||
| 		compatible = "mti,cpu-interrupt-controller"; | ||||
| 	}; | ||||
|  | ||||
| 	intc: interrupt-controller@10001000 { | ||||
| 		compatible = "ingenic,jz4780-intc"; | ||||
| 		reg = <0x10001000 0x50>; | ||||
|  | ||||
| 		interrupt-controller; | ||||
| 		#interrupt-cells = <1>; | ||||
|  | ||||
| 		interrupt-parent = <&cpuintc>; | ||||
| 		interrupts = <2>; | ||||
| 	}; | ||||
|  | ||||
| 	ext: ext { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 	}; | ||||
|  | ||||
| 	rtc: rtc { | ||||
| 		compatible = "fixed-clock"; | ||||
| 		#clock-cells = <0>; | ||||
| 		clock-frequency = <32768>; | ||||
| 	}; | ||||
|  | ||||
| 	cgu: jz4780-cgu@10000000 { | ||||
| 		compatible = "ingenic,jz4780-cgu"; | ||||
| 		reg = <0x10000000 0x100>; | ||||
|  | ||||
| 		clocks = <&ext>, <&rtc>; | ||||
| 		clock-names = "ext", "rtc"; | ||||
|  | ||||
| 		#clock-cells = <1>; | ||||
| 	}; | ||||
|  | ||||
| 	mmc0: mmc@13450000 { | ||||
| 		compatible = "ingenic,jz4780-mmc"; | ||||
| 		reg = <0x13450000 0x1000>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
|  | ||||
| 		clocks = <&cgu JZ4780_CLK_MSC0>; | ||||
| 		clock-names = "mmc"; | ||||
| 	}; | ||||
|  | ||||
| 	mmc1: mmc@13460000 { | ||||
| 		compatible = "ingenic,jz4780-mmc"; | ||||
| 		reg = <0x13460000 0x1000>; | ||||
|  | ||||
| 		clocks = <&cgu JZ4780_CLK_MSC1>; | ||||
| 		clock-names = "mmc"; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	uart0: serial@10030000 { | ||||
| 		compatible = "ingenic,jz4780-uart"; | ||||
| 		reg = <0x10030000 0x100>; | ||||
| 		reg-shift = <2>; | ||||
|  | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		interrupts = <51>; | ||||
|  | ||||
| 		clocks = <&ext>, <&cgu JZ4780_CLK_UART0>; | ||||
| 		clock-names = "baud", "module"; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	uart1: serial@10031000 { | ||||
| 		compatible = "ingenic,jz4780-uart"; | ||||
| 		reg = <0x10031000 0x100>; | ||||
| 		reg-shift = <2>; | ||||
|  | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		interrupts = <50>; | ||||
|  | ||||
| 		clocks = <&ext>, <&cgu JZ4780_CLK_UART1>; | ||||
| 		clock-names = "baud", "module"; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	uart2: serial@10032000 { | ||||
| 		compatible = "ingenic,jz4780-uart"; | ||||
| 		reg = <0x10032000 0x100>; | ||||
| 		reg-shift = <2>; | ||||
|  | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		interrupts = <49>; | ||||
|  | ||||
| 		clocks = <&ext>, <&cgu JZ4780_CLK_UART2>; | ||||
| 		clock-names = "baud", "module"; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	uart3: serial@10033000 { | ||||
| 		compatible = "ingenic,jz4780-uart"; | ||||
| 		reg = <0x10033000 0x100>; | ||||
| 		reg-shift = <2>; | ||||
|  | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		interrupts = <48>; | ||||
|  | ||||
| 		clocks = <&ext>, <&cgu JZ4780_CLK_UART3>; | ||||
| 		clock-names = "baud", "module"; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	uart4: serial@10034000 { | ||||
| 		compatible = "ingenic,jz4780-uart"; | ||||
| 		reg = <0x10034000 0x100>; | ||||
| 		reg-shift = <2>; | ||||
|  | ||||
| 		interrupt-parent = <&intc>; | ||||
| 		interrupts = <34>; | ||||
|  | ||||
| 		clocks = <&ext>, <&cgu JZ4780_CLK_UART4>; | ||||
| 		clock-names = "baud", "module"; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	nemc: nemc@13410000 { | ||||
| 		compatible = "ingenic,jz4780-nemc"; | ||||
| 		reg = <0x13410000 0x10000>; | ||||
| 		#address-cells = <2>; | ||||
| 		#size-cells = <1>; | ||||
| 		ranges = <1 0 0x1b000000 0x1000000 | ||||
| 			  2 0 0x1a000000 0x1000000 | ||||
| 			  3 0 0x19000000 0x1000000 | ||||
| 			  4 0 0x18000000 0x1000000 | ||||
| 			  5 0 0x17000000 0x1000000 | ||||
| 			  6 0 0x16000000 0x1000000>; | ||||
|  | ||||
| 		clocks = <&cgu JZ4780_CLK_NEMC>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | ||||
| 	bch: bch@134d0000 { | ||||
| 		compatible = "ingenic,jz4780-bch"; | ||||
| 		reg = <0x134d0000 0x10000>; | ||||
|  | ||||
| 		clocks = <&cgu JZ4780_CLK_BCH>; | ||||
|  | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										15
									
								
								arch/mips/mach-jz47xx/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								arch/mips/mach-jz47xx/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| menu "Ingenic JZ47xx platforms" | ||||
| 	depends on ARCH_JZ47XX | ||||
|  | ||||
| config SYS_SOC | ||||
| 	default "jz47xx" | ||||
|  | ||||
| config SOC_JZ4780 | ||||
| 	bool | ||||
| 	select SUPPORTS_LITTLE_ENDIAN | ||||
| 	select SUPPORTS_CPU_MIPS32_R1 | ||||
| 	select SUPPORTS_CPU_MIPS32_R2 | ||||
| 	help | ||||
| 	  Support for Ingenic JZ4780 family SoCs. | ||||
|  | ||||
| endmenu | ||||
							
								
								
									
										5
									
								
								arch/mips/mach-jz47xx/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								arch/mips/mach-jz47xx/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0+ | ||||
|  | ||||
| extra-$(CONFIG_SPL_BUILD)	:= start.o | ||||
|  | ||||
| obj-$(CONFIG_SOC_JZ4780)	+= jz4780/ | ||||
							
								
								
									
										103
									
								
								arch/mips/mach-jz47xx/include/mach/jz4780.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								arch/mips/mach-jz47xx/include/mach/jz4780.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0+ */ | ||||
| /* | ||||
|  * JZ4780 definitions | ||||
|  * | ||||
|  * Copyright (c) 2013 Imagination Technologies | ||||
|  * Author: Paul Burton <paul.burton@imgtec.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef __JZ4780_H__ | ||||
| #define __JZ4780_H__ | ||||
|  | ||||
| /* AHB0 BUS Devices */ | ||||
| #define DDRC_BASE	0xb3010000 | ||||
|  | ||||
| /* AHB2 BUS Devices */ | ||||
| #define NEMC_BASE	0xb3410000 | ||||
| #define BCH_BASE	0xb34d0000 | ||||
|  | ||||
| /* APB BUS Devices */ | ||||
| #define CPM_BASE	0xb0000000 | ||||
| #define TCU_BASE	0xb0002000 | ||||
| #define WDT_BASE	0xb0002000 | ||||
| #define GPIO_BASE	0xb0010000 | ||||
| #define UART0_BASE	0xb0030000 | ||||
| #define UART1_BASE	0xb0031000 | ||||
| #define UART2_BASE	0xb0032000 | ||||
| #define UART3_BASE	0xb0033000 | ||||
| #define MSC0_BASE	0xb3450000 | ||||
| #define MSC1_BASE	0xb3460000 | ||||
| #define MSC2_BASE	0xb3470000 | ||||
|  | ||||
| /* | ||||
|  * GPIO | ||||
|  */ | ||||
| /* n = 0,1,2,3,4,5 */ | ||||
| #define GPIO_PXPIN(n)	(0x00 + (n) * 0x100) | ||||
| #define GPIO_PXINT(n)	(0x10 + (n) * 0x100) | ||||
| #define GPIO_PXINTS(n)	(0x14 + (n) * 0x100) | ||||
| #define GPIO_PXINTC(n)	(0x18 + (n) * 0x100) | ||||
| #define GPIO_PXMASK(n)	(0x20 + (n) * 0x100) | ||||
| #define GPIO_PXMASKS(n)	(0x24 + (n) * 0x100) | ||||
| #define GPIO_PXMASKC(n)	(0x28 + (n) * 0x100) | ||||
| #define GPIO_PXPAT1(n)	(0x30 + (n) * 0x100) | ||||
| #define GPIO_PXPAT1S(n)	(0x34 + (n) * 0x100) | ||||
| #define GPIO_PXPAT1C(n)	(0x38 + (n) * 0x100) | ||||
| #define GPIO_PXPAT0(n)	(0x40 + (n) * 0x100) | ||||
| #define GPIO_PXPAT0S(n)	(0x44 + (n) * 0x100) | ||||
| #define GPIO_PXPAT0C(n)	(0x48 + (n) * 0x100) | ||||
| #define GPIO_PXFLG(n)	(0x50 + (n) * 0x100) | ||||
| #define GPIO_PXFLGC(n)	(0x54 + (n) * 0x100) | ||||
| #define GPIO_PXOEN(n)	(0x60 + (n) * 0x100) | ||||
| #define GPIO_PXOENS(n)	(0x64 + (n) * 0x100) | ||||
| #define GPIO_PXOENC(n)	(0x68 + (n) * 0x100) | ||||
| #define GPIO_PXPEN(n)	(0x70 + (n) * 0x100) | ||||
| #define GPIO_PXPENS(n)	(0x74 + (n) * 0x100) | ||||
| #define GPIO_PXPENC(n)	(0x78 + (n) * 0x100) | ||||
| #define GPIO_PXDS(n)	(0x80 + (n) * 0x100) | ||||
| #define GPIO_PXDSS(n)	(0x84 + (n) * 0x100) | ||||
| #define GPIO_PXDSC(n)	(0x88 + (n) * 0x100) | ||||
|  | ||||
| /* PLL setup */ | ||||
| #define JZ4780_SYS_EXTAL	48000000 | ||||
| #define JZ4780_SYS_MEM_SPEED	(CONFIG_SYS_MHZ * 1000000) | ||||
| #define JZ4780_SYS_MEM_DIV	3 | ||||
| #define JZ4780_SYS_AUDIO_SPEED	(768 * 1000000) | ||||
|  | ||||
| #define JZ4780_APLL_M	1 | ||||
| #define JZ4780_APLL_N	1 | ||||
| #define JZ4780_APLL_OD	1 | ||||
|  | ||||
| #define JZ4780_MPLL_M	(JZ4780_SYS_MEM_SPEED / JZ4780_SYS_EXTAL * 2) | ||||
| #define JZ4780_MPLL_N	2 | ||||
| #define JZ4780_MPLL_OD	1 | ||||
|  | ||||
| #define JZ4780_EPLL_M	(JZ4780_SYS_AUDIO_SPEED * 2 / JZ4780_SYS_EXTAL) | ||||
| #define JZ4780_EPLL_N	1 | ||||
| #define JZ4780_EPLL_OD	2 | ||||
|  | ||||
| #define JZ4780_VPLL_M	((888 * 1000000) * 2 / JZ4780_SYS_EXTAL) | ||||
| #define JZ4780_VPLL_N	1 | ||||
| #define JZ4780_VPLL_OD	2 | ||||
|  | ||||
| #ifndef __ASSEMBLY__ | ||||
|  | ||||
| u32 sdram_size(int bank); | ||||
|  | ||||
| const u32 jz4780_clk_get_efuse_clk(void); | ||||
| void jz4780_clk_ungate_ethernet(void); | ||||
| void jz4780_clk_ungate_mmc(void); | ||||
| void jz4780_clk_ungate_uart(const unsigned int uart); | ||||
|  | ||||
| void jz4780_efuse_read(size_t addr, size_t count, u8 *buf); | ||||
| void jz4780_efuse_init(u32 ahb2_rate); | ||||
|  | ||||
| void jz4780_tcu_wdt_start(void); | ||||
|  | ||||
| #ifdef CONFIG_SPL_BUILD | ||||
| int jz_mmc_init(void __iomem *base); | ||||
| #endif | ||||
|  | ||||
| #endif /* __ASSEMBLY__ */ | ||||
|  | ||||
| #endif	/* __JZ4780_H__ */ | ||||
							
								
								
									
										456
									
								
								arch/mips/mach-jz47xx/include/mach/jz4780_dram.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										456
									
								
								arch/mips/mach-jz47xx/include/mach/jz4780_dram.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,456 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0+ */ | ||||
| /* | ||||
|  * JZ4780 DDR initialization - parameters definitions | ||||
|  * | ||||
|  * Copyright (c) 2015 Imagination Technologies | ||||
|  * Author: Matt Redfearn <matt.redfearn.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef __JZ4780_DRAM_H__ | ||||
| #define __JZ4780_DRAM_H__ | ||||
|  | ||||
| /* | ||||
|  * DDR | ||||
|  */ | ||||
| #define DDRC_ST				0x0 | ||||
| #define DDRC_CFG			0x4 | ||||
| #define DDRC_CTRL			0x8 | ||||
| #define DDRC_LMR			0xc | ||||
| #define DDRC_REFCNT			0x18 | ||||
| #define DDRC_DQS			0x1c | ||||
| #define DDRC_DQS_ADJ			0x20 | ||||
| #define DDRC_MMAP0			0x24 | ||||
| #define DDRC_MMAP1			0x28 | ||||
| #define DDRC_MDELAY			0x2c | ||||
| #define DDRC_CKEL			0x30 | ||||
| #define DDRC_PMEMCTRL0			0x54 | ||||
| #define DDRC_PMEMCTRL1			0x50 | ||||
| #define DDRC_PMEMCTRL2			0x58 | ||||
| #define DDRC_PMEMCTRL3			0x5c | ||||
|  | ||||
| #define DDRC_TIMING(n)			(0x60 + 4 * (n)) | ||||
| #define DDRC_REMMAP(n)			(0x9c + 4 * (n)) | ||||
|  | ||||
| /* | ||||
|  * DDR PHY | ||||
|  */ | ||||
| #define DDR_MEM_PHY_BASE		0x20000000 | ||||
| #define DDR_PHY_OFFSET			0x1000 | ||||
|  | ||||
| #define DDRP_PIR			0x4 | ||||
| #define DDRP_PGCR			0x8 | ||||
| #define DDRP_PGSR			0xc | ||||
|  | ||||
| #define DDRP_PTR0			0x18 | ||||
| #define DDRP_PTR1			0x1c | ||||
| #define DDRP_PTR2			0x20 | ||||
|  | ||||
| #define DDRP_ACIOCR			0x24 | ||||
| #define DDRP_DXCCR			0x28 | ||||
| #define DDRP_DSGCR			0x2c | ||||
| #define DDRP_DCR			0x30 | ||||
|  | ||||
| #define DDRP_DTPR0			0x34 | ||||
| #define DDRP_DTPR1			0x38 | ||||
| #define DDRP_DTPR2			0x3c | ||||
| #define DDRP_MR0			0x40 | ||||
| #define DDRP_MR1			0x44 | ||||
| #define DDRP_MR2			0x48 | ||||
| #define DDRP_MR3			0x4c | ||||
|  | ||||
| #define DDRP_ODTCR			0x50 | ||||
| #define DDRP_DTAR			0x54 | ||||
| #define DDRP_DTDR0			0x58 | ||||
| #define DDRP_DTDR1			0x5c | ||||
|  | ||||
| #define DDRP_DCUAR			0xc0 | ||||
| #define DDRP_DCUDR			0xc4 | ||||
| #define DDRP_DCURR			0xc8 | ||||
| #define DDRP_DCULR			0xcc | ||||
| #define DDRP_DCUGCR			0xd0 | ||||
| #define DDRP_DCUTPR			0xd4 | ||||
| #define DDRP_DCUSR0			0xd8 | ||||
| #define DDRP_DCUSR1			0xdc | ||||
|  | ||||
| #define DDRP_ZQXCR0(n)			(0x180 + ((n) * 0x10)) | ||||
| #define DDRP_ZQXCR1(n)			(0x184 + ((n) * 0x10)) | ||||
| #define DDRP_ZQXSR0(n)			(0x188 + ((n) * 0x10)) | ||||
| #define DDRP_ZQXSR1(n)			(0x18c + ((n) * 0x10)) | ||||
|  | ||||
| #define DDRP_DXGCR(n)			(0x1c0 + ((n) * 0x40)) | ||||
| #define DDRP_DXGSR0(n)			(0x1c4 + ((n) * 0x40)) | ||||
| #define DDRP_DXGSR1(n)			(0x1c8 + ((n) * 0x40)) | ||||
| #define DDRP_DXDQSTR(n)			(0x1d4 + ((n) * 0x40)) | ||||
|  | ||||
| /* DDRC Status Register */ | ||||
| #define DDRC_ST_ENDIAN			BIT(7) | ||||
| #define DDRC_ST_DPDN			BIT(5) | ||||
| #define DDRC_ST_PDN			BIT(4) | ||||
| #define DDRC_ST_AREF			BIT(3) | ||||
| #define DDRC_ST_SREF			BIT(2) | ||||
| #define DDRC_ST_CKE1			BIT(1) | ||||
| #define DDRC_ST_CKE0			BIT(0) | ||||
|  | ||||
| /* DDRC Configure Register */ | ||||
| #define DDRC_CFG_ROW1_BIT		27 | ||||
| #define DDRC_CFG_ROW1_MASK		(0x7 << DDRC_CFG_ROW1_BIT) | ||||
| #define DDRC_CFG_COL1_BIT		24 | ||||
| #define DDRC_CFG_COL1_MASK		(0x7 << DDRC_CFG_COL1_BIT) | ||||
| #define DDRC_CFG_BA1			BIT(23) | ||||
| #define DDRC_CFG_IMBA			BIT(22) | ||||
| #define DDRC_CFG_BL_8			BIT(21) | ||||
|  | ||||
| #define DDRC_CFG_TYPE_BIT		17 | ||||
| #define DDRC_CFG_TYPE_MASK		(0x7 << DDRC_CFG_TYPE_BIT) | ||||
| #define DDRC_CFG_TYPE_DDR1		(2 << DDRC_CFG_TYPE_BIT) | ||||
| #define DDRC_CFG_TYPE_MDDR		(3 << DDRC_CFG_TYPE_BIT) | ||||
| #define DDRC_CFG_TYPE_DDR2		(4 << DDRC_CFG_TYPE_BIT) | ||||
| #define DDRC_CFG_TYPE_LPDDR2		(5 << DDRC_CFG_TYPE_BIT) | ||||
| #define DDRC_CFG_TYPE_DDR3		(6 << DDRC_CFG_TYPE_BIT) | ||||
|  | ||||
| #define DDRC_CFG_ODT_EN			BIT(16) | ||||
|  | ||||
| #define DDRC_CFG_MPRT			BIT(15) | ||||
|  | ||||
| #define DDRC_CFG_ROW_BIT		11 | ||||
| #define DDRC_CFG_ROW_MASK		(0x7 << DDRC_CFG_ROW_BIT) | ||||
| #define DDRC_CFG_ROW_12			(0 << DDRC_CFG_ROW_BIT) | ||||
| #define DDRC_CFG_ROW_13			(1 << DDRC_CFG_ROW_BIT) | ||||
| #define DDRC_CFG_ROW_14			(2 << DDRC_CFG_ROW_BIT) | ||||
|  | ||||
| #define DDRC_CFG_COL_BIT		8 | ||||
| #define DDRC_CFG_COL_MASK		(0x7 << DDRC_CFG_COL_BIT) | ||||
| #define DDRC_CFG_COL_8			(0 << DDRC_CFG_COL_BIT) | ||||
| #define DDRC_CFG_COL_9			(1 << DDRC_CFG_COL_BIT) | ||||
| #define DDRC_CFG_COL_10			(2 << DDRC_CFG_COL_BIT) | ||||
| #define DDRC_CFG_COL_11			(3 << DDRC_CFG_COL_BIT) | ||||
|  | ||||
| #define DDRC_CFG_CS1EN			BIT(7) | ||||
| #define DDRC_CFG_CS0EN			BIT(6) | ||||
| #define DDRC_CFG_CL_BIT			2 | ||||
| #define DDRC_CFG_CL_MASK		(0xf << DDRC_CFG_CL_BIT) | ||||
| #define DDRC_CFG_CL_3			(0 << DDRC_CFG_CL_BIT) | ||||
| #define DDRC_CFG_CL_4			(1 << DDRC_CFG_CL_BIT) | ||||
| #define DDRC_CFG_CL_5			(2 << DDRC_CFG_CL_BIT) | ||||
| #define DDRC_CFG_CL_6			(3 << DDRC_CFG_CL_BIT) | ||||
|  | ||||
| #define DDRC_CFG_BA			BIT(1) | ||||
| #define DDRC_CFG_DW			BIT(0) | ||||
|  | ||||
| /* DDRC Control Register */ | ||||
| #define DDRC_CTRL_DFI_RST		BIT(23) | ||||
| #define DDRC_CTRL_DLL_RST		BIT(22) | ||||
| #define DDRC_CTRL_CTL_RST		BIT(21) | ||||
| #define DDRC_CTRL_CFG_RST		BIT(20) | ||||
| #define DDRC_CTRL_ACTPD			BIT(15) | ||||
| #define DDRC_CTRL_PDT_BIT		12 | ||||
| #define DDRC_CTRL_PDT_MASK		(0x7 << DDRC_CTRL_PDT_BIT) | ||||
| #define DDRC_CTRL_PDT_DIS		(0 << DDRC_CTRL_PDT_BIT) | ||||
| #define DDRC_CTRL_PDT_8			(1 << DDRC_CTRL_PDT_BIT) | ||||
| #define DDRC_CTRL_PDT_16		(2 << DDRC_CTRL_PDT_BIT) | ||||
| #define DDRC_CTRL_PDT_32		(3 << DDRC_CTRL_PDT_BIT) | ||||
| #define DDRC_CTRL_PDT_64		(4 << DDRC_CTRL_PDT_BIT) | ||||
| #define DDRC_CTRL_PDT_128		(5 << DDRC_CTRL_PDT_BIT) | ||||
|  | ||||
| #define DDRC_CTRL_PRET_BIT		8 | ||||
| #define DDRC_CTRL_PRET_MASK		(0x7 << DDRC_CTRL_PRET_BIT) | ||||
| #define DDRC_CTRL_PRET_DIS		(0 << DDRC_CTRL_PRET_BIT) | ||||
| #define DDRC_CTRL_PRET_8		(1 << DDRC_CTRL_PRET_BIT) | ||||
| #define DDRC_CTRL_PRET_16		(2 << DDRC_CTRL_PRET_BIT) | ||||
| #define DDRC_CTRL_PRET_32		(3 << DDRC_CTRL_PRET_BIT) | ||||
| #define DDRC_CTRL_PRET_64		(4 << DDRC_CTRL_PRET_BIT) | ||||
| #define DDRC_CTRL_PRET_128		(5 << DDRC_CTRL_PRET_BIT) | ||||
|  | ||||
| #define DDRC_CTRL_DPD			BIT(6) | ||||
| #define DDRC_CTRL_SR			BIT(5) | ||||
| #define DDRC_CTRL_UNALIGN		BIT(4) | ||||
| #define DDRC_CTRL_ALH			BIT(3) | ||||
| #define DDRC_CTRL_RDC			BIT(2) | ||||
| #define DDRC_CTRL_CKE			BIT(1) | ||||
| #define DDRC_CTRL_RESET			BIT(0) | ||||
|  | ||||
| /* DDRC Load-Mode-Register */ | ||||
| #define DDRC_LMR_DDR_ADDR_BIT		16 | ||||
| #define DDRC_LMR_DDR_ADDR_MASK		(0x3fff << DDRC_LMR_DDR_ADDR_BIT) | ||||
|  | ||||
| #define DDRC_LMR_BA_BIT			8 | ||||
| #define DDRC_LMR_BA_MASK		(0x7 << DDRC_LMR_BA_BIT) | ||||
| /* For DDR2 */ | ||||
| #define DDRC_LMR_BA_MRS			(0 << DDRC_LMR_BA_BIT) | ||||
| #define DDRC_LMR_BA_EMRS1		(1 << DDRC_LMR_BA_BIT) | ||||
| #define DDRC_LMR_BA_EMRS2		(2 << DDRC_LMR_BA_BIT) | ||||
| #define DDRC_LMR_BA_EMRS3		(3 << DDRC_LMR_BA_BIT) | ||||
| /* For mobile DDR */ | ||||
| #define DDRC_LMR_BA_M_MRS		(0 << DDRC_LMR_BA_BIT) | ||||
| #define DDRC_LMR_BA_M_EMRS		(2 << DDRC_LMR_BA_BIT) | ||||
| #define DDRC_LMR_BA_M_SR		(1 << DDRC_LMR_BA_BIT) | ||||
| /* For Normal DDR1 */ | ||||
| #define DDRC_LMR_BA_N_MRS		(0 << DDRC_LMR_BA_BIT) | ||||
| #define DDRC_LMR_BA_N_EMRS		(1 << DDRC_LMR_BA_BIT) | ||||
|  | ||||
| #define DDRC_LMR_CMD_BIT		4 | ||||
| #define DDRC_LMR_CMD_MASK		(0x3 << DDRC_LMR_CMD_BIT) | ||||
| #define DDRC_LMR_CMD_PREC		(0 << DDRC_LMR_CMD_BIT) | ||||
| #define DDRC_LMR_CMD_AUREF		(1 << DDRC_LMR_CMD_BIT) | ||||
| #define DDRC_LMR_CMD_LMR		(2 << DDRC_LMR_CMD_BIT) | ||||
|  | ||||
| #define DDRC_LMR_START			BIT(0) | ||||
|  | ||||
| /* DDRC Timing Config Register 1 */ | ||||
| #define DDRC_TIMING1_TRTP_BIT		24 | ||||
| #define DDRC_TIMING1_TRTP_MASK		(0x3f << DDRC_TIMING1_TRTP_BIT) | ||||
| #define DDRC_TIMING1_TWTR_BIT		16 | ||||
| #define DDRC_TIMING1_TWTR_MASK		(0x3f << DDRC_TIMING1_TWTR_BIT) | ||||
| #define DDRC_TIMING1_TWTR_1		(0 << DDRC_TIMING1_TWTR_BIT) | ||||
| #define DDRC_TIMING1_TWTR_2		(1 << DDRC_TIMING1_TWTR_BIT) | ||||
| #define DDRC_TIMING1_TWTR_3		(2 << DDRC_TIMING1_TWTR_BIT) | ||||
| #define DDRC_TIMING1_TWTR_4		(3 << DDRC_TIMING1_TWTR_BIT) | ||||
| #define DDRC_TIMING1_TWR_BIT		8 | ||||
| #define DDRC_TIMING1_TWR_MASK		(0x3f << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWR_1		(0 << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWR_2		(1 << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWR_3		(2 << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWR_4		(3 << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWR_5		(4 << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWR_6		(5 << DDRC_TIMING1_TWR_BIT) | ||||
| #define DDRC_TIMING1_TWL_BIT		0 | ||||
| #define DDRC_TIMING1_TWL_MASK		(0x3f << DDRC_TIMING1_TWL_BIT) | ||||
|  | ||||
| /* DDRC Timing Config Register 2 */ | ||||
| #define DDRC_TIMING2_TCCD_BIT		24 | ||||
| #define DDRC_TIMING2_TCCD_MASK		(0x3f << DDRC_TIMING2_TCCD_BIT) | ||||
| #define DDRC_TIMING2_TRAS_BIT		16 | ||||
| #define DDRC_TIMING2_TRAS_MASK		(0x3f << DDRC_TIMING2_TRAS_BIT) | ||||
| #define DDRC_TIMING2_TRCD_BIT		8 | ||||
| #define DDRC_TIMING2_TRCD_MASK		(0x3f << DDRC_TIMING2_TRCD_BIT) | ||||
| #define DDRC_TIMING2_TRL_BIT		0 | ||||
| #define DDRC_TIMING2_TRL_MASK		(0x3f << DDRC_TIMING2_TRL_BIT) | ||||
|  | ||||
| /* DDRC Timing Config Register 3 */ | ||||
| #define DDRC_TIMING3_ONUM		27 | ||||
| #define DDRC_TIMING3_TCKSRE_BIT		24 | ||||
| #define DDRC_TIMING3_TCKSRE_MASK	(0x3f << DDRC_TIMING3_TCKSRE_BIT) | ||||
| #define DDRC_TIMING3_TRP_BIT		16 | ||||
| #define DDRC_TIMING3_TRP_MASK		(0x3f << DDRC_TIMING3_TRP_BIT) | ||||
| #define DDRC_TIMING3_TRRD_BIT		8 | ||||
| #define DDRC_TIMING3_TRRD_MASK		(0x3f << DDRC_TIMING3_TRRD_BIT) | ||||
| #define DDRC_TIMING3_TRRD_DISABLE	(0 << DDRC_TIMING3_TRRD_BIT) | ||||
| #define DDRC_TIMING3_TRRD_2		(1 << DDRC_TIMING3_TRRD_BIT) | ||||
| #define DDRC_TIMING3_TRRD_3		(2 << DDRC_TIMING3_TRRD_BIT) | ||||
| #define DDRC_TIMING3_TRRD_4		(3 << DDRC_TIMING3_TRRD_BIT) | ||||
| #define DDRC_TIMING3_TRC_BIT		0 | ||||
| #define DDRC_TIMING3_TRC_MASK		(0x3f << DDRC_TIMING3_TRC_BIT) | ||||
|  | ||||
| /* DDRC Timing Config Register 4 */ | ||||
| #define DDRC_TIMING4_TRFC_BIT		24 | ||||
| #define DDRC_TIMING4_TRFC_MASK		(0x3f << DDRC_TIMING4_TRFC_BIT) | ||||
| #define DDRC_TIMING4_TEXTRW_BIT		21 | ||||
| #define DDRC_TIMING4_TEXTRW_MASK	(0x7 << DDRC_TIMING4_TEXTRW_BIT) | ||||
| #define DDRC_TIMING4_TRWCOV_BIT		19 | ||||
| #define DDRC_TIMING4_TRWCOV_MASK	(0x3 << DDRC_TIMING4_TRWCOV_BIT) | ||||
| #define DDRC_TIMING4_TCKE_BIT		16 | ||||
| #define DDRC_TIMING4_TCKE_MASK		(0x7 << DDRC_TIMING4_TCKE_BIT) | ||||
| #define DDRC_TIMING4_TMINSR_BIT		8 | ||||
| #define DDRC_TIMING4_TMINSR_MASK	(0xf << DDRC_TIMING4_TMINSR_BIT) | ||||
| #define DDRC_TIMING4_TXP_BIT		4 | ||||
| #define DDRC_TIMING4_TXP_MASK		(0x7 << DDRC_TIMING4_TXP_BIT) | ||||
| #define DDRC_TIMING4_TMRD_BIT		0 | ||||
| #define DDRC_TIMING4_TMRD_MASK		(0x3 << DDRC_TIMING4_TMRD_BIT) | ||||
|  | ||||
| /* DDRC Timing Config Register 5 */ | ||||
| #define DDRC_TIMING5_TCTLUPD_BIT	24 | ||||
| #define DDRC_TIMING4_TCTLUPD_MASK	(0x3f << DDRC_TIMING5_TCTLUDP_BIT) | ||||
| #define DDRC_TIMING5_TRTW_BIT		16 | ||||
| #define DDRC_TIMING5_TRTW_MASK		(0x3f << DDRC_TIMING5_TRTW_BIT) | ||||
| #define DDRC_TIMING5_TRDLAT_BIT		8 | ||||
| #define DDRC_TIMING5_TRDLAT_MASK	(0x3f << DDRC_TIMING5_TRDLAT_BIT) | ||||
| #define DDRC_TIMING5_TWDLAT_BIT		0 | ||||
| #define DDRC_TIMING5_TWDLAT_MASK	(0x3f << DDRC_TIMING5_TWDLAT_BIT) | ||||
|  | ||||
| /* DDRC Timing Config Register 6 */ | ||||
| #define DDRC_TIMING6_TXSRD_BIT		24 | ||||
| #define DDRC_TIMING6_TXSRD_MASK		(0x3f << DDRC_TIMING6_TXSRD_BIT) | ||||
| #define DDRC_TIMING6_TFAW_BIT		16 | ||||
| #define DDRC_TIMING6_TFAW_MASK		(0x3f << DDRC_TIMING6_TFAW_BIT) | ||||
| #define DDRC_TIMING6_TCFGW_BIT		8 | ||||
| #define DDRC_TIMING6_TCFGW_MASK		(0x3f << DDRC_TIMING6_TCFGW_BIT) | ||||
| #define DDRC_TIMING6_TCFGR_BIT		0 | ||||
| #define DDRC_TIMING6_TCFGR_MASK		(0x3f << DDRC_TIMING6_TCFGR_BIT) | ||||
|  | ||||
| /* DDRC  Auto-Refresh Counter */ | ||||
| #define DDRC_REFCNT_CON_BIT		16 | ||||
| #define DDRC_REFCNT_CON_MASK		(0xff << DDRC_REFCNT_CON_BIT) | ||||
| #define DDRC_REFCNT_CNT_BIT		8 | ||||
| #define DDRC_REFCNT_CNT_MASK		(0xff << DDRC_REFCNT_CNT_BIT) | ||||
| #define DDRC_REFCNT_CLKDIV_BIT		1 | ||||
| #define DDRC_REFCNT_CLKDIV_MASK		(0x7 << DDRC_REFCNT_CLKDIV_BIT) | ||||
| #define DDRC_REFCNT_REF_EN		BIT(0) | ||||
|  | ||||
| /* DDRC DQS Delay Control Register */ | ||||
| #define DDRC_DQS_ERROR			BIT(29) | ||||
| #define DDRC_DQS_READY			BIT(28) | ||||
| #define DDRC_DQS_AUTO			BIT(23) | ||||
| #define DDRC_DQS_DET			BIT(24) | ||||
| #define DDRC_DQS_SRDET			BIT(25) | ||||
| #define DDRC_DQS_CLKD_BIT		16 | ||||
| #define DDRC_DQS_CLKD_MASK		(0x3f << DDRC_DQS_CLKD_BIT) | ||||
| #define DDRC_DQS_WDQS_BIT		8 | ||||
| #define DDRC_DQS_WDQS_MASK		(0x3f << DDRC_DQS_WDQS_BIT) | ||||
| #define DDRC_DQS_RDQS_BIT		0 | ||||
| #define DDRC_DQS_RDQS_MASK		(0x3f << DDRC_DQS_RDQS_BIT) | ||||
|  | ||||
| /* DDRC DQS Delay Adjust Register */ | ||||
| #define DDRC_DQS_ADJWDQS_BIT		8 | ||||
| #define DDRC_DQS_ADJWDQS_MASK		(0x1f << DDRC_DQS_ADJWDQS_BIT) | ||||
| #define DDRC_DQS_ADJRDQS_BIT		0 | ||||
| #define DDRC_DQS_ADJRDQS_MASK		(0x1f << DDRC_DQS_ADJRDQS_BIT) | ||||
|  | ||||
| /* DDRC Memory Map Config Register */ | ||||
| #define DDRC_MMAP_BASE_BIT		8 | ||||
| #define DDRC_MMAP_BASE_MASK		(0xff << DDRC_MMAP_BASE_BIT) | ||||
| #define DDRC_MMAP_MASK_BIT		0 | ||||
| #define DDRC_MMAP_MASK_MASK		(0xff << DDRC_MMAP_MASK_BIT) | ||||
|  | ||||
| #define DDRC_MMAP0_BASE			(0x20 << DDRC_MMAP_BASE_BIT) | ||||
| #define DDRC_MMAP1_BASE_64M		(0x24 << DDRC_MMAP_BASE_BIT) | ||||
| #define DDRC_MMAP1_BASE_128M		(0x28 << DDRC_MMAP_BASE_BIT) | ||||
| #define DDRC_MMAP1_BASE_256M		(0x30 << DDRC_MMAP_BASE_BIT) | ||||
|  | ||||
| #define DDRC_MMAP_MASK_64_64		(0xfc << DDRC_MMAP_MASK_BIT) | ||||
| #define DDRC_MMAP_MASK_128_128		(0xf8 << DDRC_MMAP_MASK_BIT) | ||||
| #define DDRC_MMAP_MASK_256_256		(0xf0 << DDRC_MMAP_MASK_BIT) | ||||
|  | ||||
| /* DDRP PHY Initialization Register */ | ||||
| #define DDRP_PIR_INIT			BIT(0) | ||||
| #define DDRP_PIR_DLLSRST		BIT(1) | ||||
| #define DDRP_PIR_DLLLOCK		BIT(2) | ||||
| #define DDRP_PIR_ZCAL			BIT(3) | ||||
| #define DDRP_PIR_ITMSRST		BIT(4) | ||||
| #define DDRP_PIR_DRAMRST		BIT(5) | ||||
| #define DDRP_PIR_DRAMINT		BIT(6) | ||||
| #define DDRP_PIR_QSTRN			BIT(7) | ||||
| #define DDRP_PIR_EYETRN			BIT(8) | ||||
| #define DDRP_PIR_DLLBYP			BIT(17) | ||||
| /* DDRP PHY General Configurate Register */ | ||||
| #define DDRP_PGCR_ITMDMD		BIT(0) | ||||
| #define DDRP_PGCR_DQSCFG		BIT(1) | ||||
| #define DDRP_PGCR_DFTCMP		BIT(2) | ||||
| #define DDRP_PGCR_DFTLMT_BIT		3 | ||||
| #define DDRP_PGCR_DTOSEL_BIT		5 | ||||
| #define DDRP_PGCR_CKEN_BIT		9 | ||||
| #define DDRP_PGCR_CKDV_BIT		12 | ||||
| #define DDRP_PGCR_CKINV			BIT(14) | ||||
| #define DDRP_PGCR_RANKEN_BIT		18 | ||||
| #define DDRP_PGCR_ZCKSEL_32		(2 << 22) | ||||
| #define DDRP_PGCR_PDDISDX		BIT(24) | ||||
| /* DDRP PHY General Status Register */ | ||||
| #define DDRP_PGSR_IDONE			BIT(0) | ||||
| #define DDRP_PGSR_DLDONE		BIT(1) | ||||
| #define DDRP_PGSR_ZCDONE		BIT(2) | ||||
| #define DDRP_PGSR_DIDONE		BIT(3) | ||||
| #define DDRP_PGSR_DTDONE		BIT(4) | ||||
| #define DDRP_PGSR_DTERR			BIT(5) | ||||
| #define DDRP_PGSR_DTIERR		BIT(6) | ||||
| #define DDRP_PGSR_DFTEERR		BIT(7) | ||||
| /* DDRP DRAM Configuration Register */ | ||||
| #define DDRP_DCR_TYPE_BIT		0 | ||||
| #define DDRP_DCR_TYPE_MASK		(0x7 << DDRP_DCR_TYPE_BIT) | ||||
| #define DDRP_DCR_TYPE_MDDR		(0 << DDRP_DCR_TYPE_BIT) | ||||
| #define DDRP_DCR_TYPE_DDR		(1 << DDRP_DCR_TYPE_BIT) | ||||
| #define DDRP_DCR_TYPE_DDR2		(2 << DDRP_DCR_TYPE_BIT) | ||||
| #define DDRP_DCR_TYPE_DDR3		(3 << DDRP_DCR_TYPE_BIT) | ||||
| #define DDRP_DCR_TYPE_LPDDR2		(4 << DDRP_DCR_TYPE_BIT) | ||||
| #define DDRP_DCR_DDR8BNK_BIT		3 | ||||
| #define DDRP_DCR_DDR8BNK_MASK		(1 << DDRP_DCR_DDR8BNK_BIT) | ||||
| #define DDRP_DCR_DDR8BNK		(1 << DDRP_DCR_DDR8BNK_BIT) | ||||
| #define DDRP_DCR_DDR8BNK_DIS		(0 << DDRP_DCR_DDR8BNK_BIT) | ||||
|  | ||||
| #define DRP_DTRP1_RTODT			BIT(11) | ||||
|  | ||||
| #define DDRP_DXGCR_DXEN			BIT(0) | ||||
|  | ||||
| #define DDRP_ZQXCR_ZDEN_BIT		28 | ||||
| #define DDRP_ZQXCR_ZDEN			(1 << DDRP_ZQXCR_ZDEN_BIT) | ||||
| #define DDRP_ZQXCR_PULLUP_IMPE_BIT	5 | ||||
| #define DDRP_ZQXCR_PULLDOWN_IMPE_BIT	0 | ||||
|  | ||||
| /* DDR3 Mode Register Set */ | ||||
| #define DDR3_MR0_BL_BIT			0 | ||||
| #define DDR3_MR0_BL_MASK		(3 << DDR3_MR0_BL_BIT) | ||||
| #define DDR3_MR0_BL_8			(0 << DDR3_MR0_BL_BIT) | ||||
| #define DDR3_MR0_BL_fly			(1 << DDR3_MR0_BL_BIT) | ||||
| #define DDR3_MR0_BL_4			(2 << DDR3_MR0_BL_BIT) | ||||
| #define DDR3_MR0_BT_BIT			3 | ||||
| #define DDR3_MR0_BT_MASK		(1 << DDR3_MR0_BT_BIT) | ||||
| #define DDR3_MR0_BT_SEQ			(0 << DDR3_MR0_BT_BIT) | ||||
| #define DDR3_MR0_BT_INTER		(1 << DDR3_MR0_BT_BIT) | ||||
| #define DDR3_MR0_WR_BIT			9 | ||||
|  | ||||
| #define DDR3_MR1_DLL_DISABLE		1 | ||||
| #define DDR3_MR1_DIC_6			(0 << 5 | 0 << 1) | ||||
| #define DDR3_MR1_DIC_7			(0 << 5 | BIT(1)) | ||||
| #define DDR3_MR1_RTT_DIS		(0 << 9 | 0 << 6 | 0 << 2) | ||||
| #define DDR3_MR1_RTT_4			(0 << 9 | 0 << 6 | BIT(2)) | ||||
| #define DDR3_MR1_RTT_2			(0 << 9 | BIT(6) | 0 << 2) | ||||
| #define DDR3_MR1_RTT_6			(0 << 9 | BIT(6) | BIT(2)) | ||||
| #define DDR3_MR1_RTT_12			(BIT(9) | 0 << 6 | 0 << 2) | ||||
| #define DDR3_MR1_RTT_8			(BIT(9) | 0 << 6 | BIT(2)) | ||||
|  | ||||
| #define DDR3_MR2_CWL_BIT		3 | ||||
|  | ||||
| /* Parameters common to all RAM devices used */ | ||||
|  | ||||
| /* Chip Select */ | ||||
| /* CSEN : whether a ddr chip exists 0 - un-used, 1 - used */ | ||||
| #define DDR_CS0EN	1 | ||||
| /* CSEN : whether a ddr chip exists 0 - un-used, 1 - used */ | ||||
| #define DDR_CS1EN	0 | ||||
|  | ||||
| /* ROW : 12 to 18 row address, 1G only 512MB */ | ||||
| #define DDR_ROW		15 | ||||
| /* COL :  8 to 14 column address */ | ||||
| #define DDR_COL		10 | ||||
| /* Banks each chip: 0-4bank, 1-8bank */ | ||||
| #define DDR_BANK8	1 | ||||
| /* 0 - 16-bit data width, 1 - 32-bit data width */ | ||||
| #define DDR_DW32	1 | ||||
|  | ||||
| /* Refresh period: 64ms / 32768 = 1.95 us , 2 ^ 15 = 32768 */ | ||||
| #define DDR_tREFI	7800 | ||||
| /* Clock Divider */ | ||||
| #define DDR_CLK_DIV	1 | ||||
|  | ||||
| /* DDR3 Burst length: 0 - 8 burst, 2 - 4 burst , 1 - 4 or 8 (on the fly) */ | ||||
| #define DDR_BL		8 | ||||
|  | ||||
| /* CAS latency: 5 to 14, tCK */ | ||||
| #define DDR_CL		6 | ||||
| /* DDR3 only: CAS Write Latency, 5 to 8 */ | ||||
| #define DDR_tCWL	(DDR_CL - 1) | ||||
|  | ||||
| /* Structure representing per-RAM type configuration */ | ||||
|  | ||||
| struct jz4780_ddr_config { | ||||
| 	u32	timing[6];	/* Timing1..6 register value */ | ||||
|  | ||||
| 	/* DDR PHY control */ | ||||
| 	u16	mr0;	/* Mode Register 0 */ | ||||
| 	u16	mr1;	/* Mode Register 1 */ | ||||
|  | ||||
| 	u32	ptr0;	/* PHY Timing Register 0 */ | ||||
| 	u32	ptr1;	/* PHY Timing Register 1 */ | ||||
| 	u32	ptr2;	/* PHY Timing Register 1 */ | ||||
|  | ||||
| 	u32	dtpr0;	/* DRAM Timing Parameters Register 0 */ | ||||
| 	u32	dtpr1;	/* DRAM Timing Parameters Register 1 */ | ||||
| 	u32	dtpr2;	/* DRAM Timing Parameters Register 2 */ | ||||
|  | ||||
| 	u8	pullup;	/* PHY pullup impedance */ | ||||
| 	u8	pulldn;	/* PHY pulldown impedance */ | ||||
| }; | ||||
|  | ||||
| void pll_init(void); | ||||
| void sdram_init(void); | ||||
|  | ||||
| #endif	/* __JZ4780_DRAM_H__ */ | ||||
|  | ||||
							
								
								
									
										12
									
								
								arch/mips/mach-jz47xx/include/mach/jz4780_gpio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								arch/mips/mach-jz47xx/include/mach/jz4780_gpio.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0+ */ | ||||
|  | ||||
| #ifndef __JZ4780_GPIO_H__ | ||||
| #define __JZ4780_GPIO_H__ | ||||
|  | ||||
| #define JZ_GPIO(bank, pin) ((32 * (bank)) + (pin)) | ||||
|  | ||||
| int jz47xx_gpio_get_value(unsigned int gpio); | ||||
| void jz47xx_gpio_direction_input(unsigned int gpio); | ||||
| void jz47xx_gpio_direction_output(unsigned int gpio, int value); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										3
									
								
								arch/mips/mach-jz47xx/jz4780/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								arch/mips/mach-jz47xx/jz4780/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0+ | ||||
|  | ||||
| obj-y := gpio.o jz4780.o pll.o reset.o sdram.o timer.o | ||||
							
								
								
									
										4
									
								
								arch/mips/mach-jz47xx/jz4780/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								arch/mips/mach-jz47xx/jz4780/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| - dm gpio driver | ||||
| - ethernet driver for the dm9000 | ||||
| - reduce the hundreds of definitions of register addresses to the ones really needed in assembly or SPL. | ||||
| - define the remaining register base addresses as physical addresses and establish a mapping with ioremap_nocache() | ||||
							
								
								
									
										39
									
								
								arch/mips/mach-jz47xx/jz4780/gpio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								arch/mips/mach-jz47xx/jz4780/gpio.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
|  | ||||
| #include <config.h> | ||||
| #include <common.h> | ||||
| #include <asm/io.h> | ||||
| #include <mach/jz4780.h> | ||||
|  | ||||
| int jz47xx_gpio_get_value(unsigned int gpio) | ||||
| { | ||||
| 	void __iomem *gpio_regs = (void __iomem *)GPIO_BASE; | ||||
| 	int port = gpio / 32; | ||||
| 	int pin = gpio % 32; | ||||
|  | ||||
| 	return readl(gpio_regs + GPIO_PXPIN(port)) & BIT(pin); | ||||
| } | ||||
|  | ||||
| void jz47xx_gpio_direction_input(unsigned int gpio) | ||||
| { | ||||
| 	void __iomem *gpio_regs = (void __iomem *)GPIO_BASE; | ||||
| 	int port = gpio / 32; | ||||
| 	int pin = gpio % 32; | ||||
|  | ||||
| 	writel(BIT(pin), gpio_regs + GPIO_PXINTC(port)); | ||||
| 	writel(BIT(pin), gpio_regs + GPIO_PXMASKS(port)); | ||||
| 	writel(BIT(pin), gpio_regs + GPIO_PXPAT1S(port)); | ||||
| } | ||||
|  | ||||
| void jz47xx_gpio_direction_output(unsigned int gpio, int value) | ||||
| { | ||||
| 	void __iomem *gpio_regs = (void __iomem *)GPIO_BASE; | ||||
| 	int port = gpio / 32; | ||||
| 	int pin = gpio % 32; | ||||
|  | ||||
| 	writel(BIT(pin), gpio_regs + GPIO_PXINTC(port)); | ||||
| 	writel(BIT(pin), gpio_regs + GPIO_PXMASKS(port)); | ||||
| 	writel(BIT(pin), gpio_regs + GPIO_PXPAT1C(port)); | ||||
| 	writel(BIT(pin), gpio_regs + | ||||
| 			 (value ? GPIO_PXPAT0S(port) : GPIO_PXPAT0C(port))); | ||||
| } | ||||
							
								
								
									
										83
									
								
								arch/mips/mach-jz47xx/jz4780/jz4780.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								arch/mips/mach-jz47xx/jz4780/jz4780.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  * JZ4780 common routines | ||||
|  * | ||||
|  * Copyright (c) 2013 Imagination Technologies | ||||
|  * Author: Paul Burton <paul.burton@imgtec.com> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
| #include <common.h> | ||||
| #include <asm/io.h> | ||||
| #include <asm/sections.h> | ||||
| #include <mach/jz4780.h> | ||||
| #include <mach/jz4780_dram.h> | ||||
| #include <mmc.h> | ||||
| #include <spl.h> | ||||
|  | ||||
| #ifdef CONFIG_SPL_BUILD | ||||
| /* Pointer to the global data structure for SPL */ | ||||
| DECLARE_GLOBAL_DATA_PTR; | ||||
| gd_t gdata __attribute__ ((section(".bss"))); | ||||
|  | ||||
| void board_init_f(ulong dummy) | ||||
| { | ||||
| 	typedef void __noreturn (*image_entry_noargs_t)(void); | ||||
| 	struct mmc *mmc; | ||||
| 	unsigned long count; | ||||
| 	struct image_header *header; | ||||
| 	int ret; | ||||
|  | ||||
| 	/* Set global data pointer */ | ||||
| 	gd = &gdata; | ||||
|  | ||||
| 	timer_init(); | ||||
| 	pll_init(); | ||||
| 	sdram_init(); | ||||
| 	enable_caches(); | ||||
|  | ||||
| 	/* Clear the BSS */ | ||||
| 	memset(__bss_start, 0, (char *)&__bss_end - __bss_start); | ||||
|  | ||||
| 	gd->flags |= GD_FLG_SPL_INIT; | ||||
|  | ||||
| 	ret = mmc_initialize(NULL); | ||||
| 	if (ret) | ||||
| 		hang(); | ||||
|  | ||||
| 	mmc = find_mmc_device(BOOT_DEVICE_MMC1); | ||||
| 	if (ret) | ||||
| 		hang(); | ||||
|  | ||||
| 	ret = mmc_init(mmc); | ||||
| 	if (ret) | ||||
| 		hang(); | ||||
|  | ||||
| 	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - | ||||
| 					 sizeof(struct image_header)); | ||||
|  | ||||
| 	count = blk_dread(mmc_get_blk_desc(mmc), | ||||
| 			  CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR, | ||||
| 		0x800, header); | ||||
| 	if (count == 0) | ||||
| 		hang(); | ||||
|  | ||||
| 	image_entry_noargs_t image_entry = | ||||
| 		(image_entry_noargs_t)CONFIG_SYS_TEXT_BASE; | ||||
|  | ||||
| 	image_entry(); | ||||
|  | ||||
| 	hang(); | ||||
| } | ||||
| #endif /* CONFIG_SPL_BUILD */ | ||||
|  | ||||
| ulong board_get_usable_ram_top(ulong total_size) | ||||
| { | ||||
| 	return CONFIG_SYS_SDRAM_BASE + (256 * 1024 * 1024); | ||||
| } | ||||
|  | ||||
| int print_cpuinfo(void) | ||||
| { | ||||
| 	printf("CPU:   Ingenic JZ4780\n"); | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										530
									
								
								arch/mips/mach-jz47xx/jz4780/pll.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										530
									
								
								arch/mips/mach-jz47xx/jz4780/pll.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,530 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  * JZ4780 PLL setup | ||||
|  * | ||||
|  * Copyright (c) 2013 Imagination Technologies | ||||
|  * Author: Paul Burton <paul.burton@imgtec.com> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
| #include <common.h> | ||||
| #include <asm/io.h> | ||||
| #include <mach/jz4780.h> | ||||
|  | ||||
| #define CPM_CPCCR		0x00 | ||||
| #define CPM_LCR			0x04 | ||||
| #define CPM_RSR			0x08 | ||||
| #define CPM_CPPCR		0x0c | ||||
| #define CPM_CPAPCR		0x10 | ||||
| #define CPM_CPMPCR		0x14 | ||||
| #define CPM_CPEPCR		0x18 | ||||
| #define CPM_CPVPCR		0x1c | ||||
| #define CPM_CLKGR0		0x20 | ||||
| #define CPM_OPCR		0x24 | ||||
| #define CPM_CLKGR1		0x28 | ||||
| #define CPM_DDCDR		0x2c | ||||
| #define CPM_VPUCDR		0x30 | ||||
| #define CPM_CPSPR		0x34 | ||||
| #define CPM_CPSPPR		0x38 | ||||
| #define CPM_USBPCR		0x3c | ||||
| #define CPM_USBRDT		0x40 | ||||
| #define CPM_USBVBFIL		0x44 | ||||
| #define CPM_USBPCR1		0x48 | ||||
| #define CPM_USBCDR		0x50 | ||||
| #define CPM_LPCDR		0x54 | ||||
| #define CPM_I2SCDR		0x60 | ||||
| #define CPM_LPCDR1		0x64 | ||||
| #define CPM_MSCCDR		0x68 | ||||
| #define CPM_UHCCDR		0x6c | ||||
| #define CPM_SSICDR		0x74 | ||||
| #define CPM_CIMCDR		0x7c | ||||
| #define CPM_PCMCDR		0x84 | ||||
| #define CPM_GPUCDR		0x88 | ||||
| #define CPM_HDMICDR		0x8c | ||||
| #define CPM_I2S1CDR		0xa0 | ||||
| #define CPM_MSCCDR1		0xa4 | ||||
| #define CPM_MSCCDR2		0xa8 | ||||
| #define CPM_BCHCDR		0xac | ||||
| #define CPM_SPCR0		0xb8 | ||||
| #define CPM_SPCR1		0xbc | ||||
| #define CPM_CPCSR		0xd4 | ||||
| #define CPM_PSWCST(n)		((0x4 * (n)) + 0x90) | ||||
|  | ||||
| /* Clock control register */ | ||||
| #define CPM_CPCCR_SEL_SRC_BIT		30 | ||||
| #define CPM_CPCCR_SEL_SRC_MASK		(0x3 << CPM_CPCCR_SEL_SRC_BIT) | ||||
| #define CPM_SRC_SEL_STOP		0 | ||||
| #define CPM_SRC_SEL_APLL		1 | ||||
| #define CPM_SRC_SEL_EXCLK		2 | ||||
| #define CPM_SRC_SEL_RTCLK		3 | ||||
| #define CPM_CPCCR_SEL_CPLL_BIT		28 | ||||
| #define CPM_CPCCR_SEL_CPLL_MASK		(0x3 << CPM_CPCCR_SEL_CPLL_BIT) | ||||
| #define CPM_CPCCR_SEL_H0PLL_BIT		26 | ||||
| #define CPM_CPCCR_SEL_H0PLL_MASK	(0x3 << CPM_CPCCR_SEL_H0PLL_BIT) | ||||
| #define CPM_CPCCR_SEL_H2PLL_BIT		24 | ||||
| #define CPM_CPCCR_SEL_H2PLL_MASK	(0x3 << CPM_CPCCR_SEL_H2PLL_BIT) | ||||
| #define CPM_PLL_SEL_STOP		0 | ||||
| #define CPM_PLL_SEL_SRC			1 | ||||
| #define CPM_PLL_SEL_MPLL		2 | ||||
| #define CPM_PLL_SEL_EPLL		3 | ||||
| #define CPM_CPCCR_CE_CPU		(0x1 << 22) | ||||
| #define CPM_CPCCR_CE_AHB0		(0x1 << 21) | ||||
| #define CPM_CPCCR_CE_AHB2		(0x1 << 20) | ||||
| #define CPM_CPCCR_PDIV_BIT		16 | ||||
| #define CPM_CPCCR_PDIV_MASK		(0xf << CPM_CPCCR_PDIV_BIT) | ||||
| #define CPM_CPCCR_H2DIV_BIT		12 | ||||
| #define CPM_CPCCR_H2DIV_MASK		(0xf << CPM_CPCCR_H2DIV_BIT) | ||||
| #define CPM_CPCCR_H0DIV_BIT		8 | ||||
| #define CPM_CPCCR_H0DIV_MASK		(0x0f << CPM_CPCCR_H0DIV_BIT) | ||||
| #define CPM_CPCCR_L2DIV_BIT		4 | ||||
| #define CPM_CPCCR_L2DIV_MASK		(0x0f << CPM_CPCCR_L2DIV_BIT) | ||||
| #define CPM_CPCCR_CDIV_BIT		0 | ||||
| #define CPM_CPCCR_CDIV_MASK		(0x0f << CPM_CPCCR_CDIV_BIT) | ||||
|  | ||||
| /* Clock Status register */ | ||||
| #define CPM_CPCSR_H2DIV_BUSY		BIT(2) | ||||
| #define CPM_CPCSR_H0DIV_BUSY		BIT(1) | ||||
| #define CPM_CPCSR_CDIV_BUSY		BIT(0) | ||||
|  | ||||
| /* PLL control register */ | ||||
| #define CPM_CPPCR_PLLST_BIT		0 | ||||
| #define CPM_CPPCR_PLLST_MASK		(0xff << CPM_CPPCR_PLLST_BIT) | ||||
|  | ||||
| /* XPLL control register */ | ||||
| #define CPM_CPXPCR_XPLLM_BIT		19 | ||||
| #define CPM_CPXPCR_XPLLM_MASK		(0x1fff << CPM_CPXPCR_XPLLM_BIT) | ||||
| #define CPM_CPXPCR_XPLLN_BIT		13 | ||||
| #define CPM_CPXPCR_XPLLN_MASK		(0x3f << CPM_CPXPCR_XPLLN_BIT) | ||||
| #define CPM_CPXPCR_XPLLOD_BIT		9 | ||||
| #define CPM_CPXPCR_XPLLOD_MASK		(0xf << CPM_CPXPCR_XPLLOD_BIT) | ||||
| #define CPM_CPXPCR_XLOCK		BIT(6) | ||||
| #define CPM_CPXPCR_XPLL_ON		BIT(4) | ||||
| #define CPM_CPXPCR_XF_MODE		BIT(3) | ||||
| #define CPM_CPXPCR_XPLLBP		BIT(1) | ||||
| #define CPM_CPXPCR_XPLLEN		BIT(0) | ||||
|  | ||||
| /* CPM scratch protected register */ | ||||
| #define CPM_CPSPPR_BIT			0 | ||||
| #define CPM_CPSPPR_MASK			(0xffff << CPM_CPSPPR_BIT) | ||||
|  | ||||
| /* USB parameter control register */ | ||||
| #define CPM_USBPCR_USB_MODE		BIT(31)  /* 1: OTG, 0: UDC*/ | ||||
| #define CPM_USBPCR_AVLD_REG		BIT(30) | ||||
| #define CPM_USBPCR_IDPULLUP_MASK_BIT	28 | ||||
| #define CPM_USBPCR_IDPULLUP_MASK_MASK	(0x02 << IDPULLUP_MASK_BIT) | ||||
| #define CPM_USBPCR_INCR_MASK		BIT(27) | ||||
| #define CPM_USBPCR_CLK12_EN		BIT(26) | ||||
| #define CPM_USBPCR_COMMONONN		BIT(25) | ||||
| #define CPM_USBPCR_VBUSVLDEXT		BIT(24) | ||||
| #define CPM_USBPCR_VBUSVLDEXTSEL	BIT(23) | ||||
| #define CPM_USBPCR_POR			BIT(22) | ||||
| #define CPM_USBPCR_SIDDQ		BIT(21) | ||||
| #define CPM_USBPCR_OTG_DISABLE		BIT(20) | ||||
| #define CPM_USBPCR_COMPDISTUNE_BIT	17 | ||||
| #define CPM_USBPCR_COMPDISTUNE_MASK	(0x07 << COMPDISTUNE_BIT) | ||||
| #define CPM_USBPCR_OTGTUNE_BIT		14 | ||||
| #define CPM_USBPCR_OTGTUNE_MASK		(0x07 << OTGTUNE_BIT) | ||||
| #define CPM_USBPCR_SQRXTUNE_BIT		11 | ||||
| #define CPM_USBPCR_SQRXTUNE_MASK	(0x7x << SQRXTUNE_BIT) | ||||
| #define CPM_USBPCR_TXFSLSTUNE_BIT	7 | ||||
| #define CPM_USBPCR_TXFSLSTUNE_MASK	(0x0f << TXFSLSTUNE_BIT) | ||||
| #define CPM_USBPCR_TXPREEMPHTUNE	BIT(6) | ||||
| #define CPM_USBPCR_TXRISETUNE_BIT	4 | ||||
| #define CPM_USBPCR_TXRISETUNE_MASK	(0x03 << TXRISETUNE_BIT) | ||||
| #define CPM_USBPCR_TXVREFTUNE_BIT	0 | ||||
| #define CPM_USBPCR_TXVREFTUNE_MASK	(0x0f << TXVREFTUNE_BIT) | ||||
|  | ||||
| /* DDR memory clock divider register */ | ||||
| #define CPM_DDRCDR_DCS_BIT		30 | ||||
| #define CPM_DDRCDR_DCS_MASK		(0x3 << CPM_DDRCDR_DCS_BIT) | ||||
| #define CPM_DDRCDR_DCS_STOP		(0x0 << CPM_DDRCDR_DCS_BIT) | ||||
| #define CPM_DDRCDR_DCS_SRC		(0x1 << CPM_DDRCDR_DCS_BIT) | ||||
| #define CPM_DDRCDR_DCS_MPLL		(0x2 << CPM_DDRCDR_DCS_BIT) | ||||
| #define CPM_DDRCDR_CE_DDR		BIT(29) | ||||
| #define CPM_DDRCDR_DDR_BUSY		BIT(28) | ||||
| #define CPM_DDRCDR_DDR_STOP		BIT(27) | ||||
| #define CPM_DDRCDR_DDRDIV_BIT		0 | ||||
| #define CPM_DDRCDR_DDRDIV_MASK		(0xf << CPM_DDRCDR_DDRDIV_BIT) | ||||
|  | ||||
| /* USB reset detect timer register */ | ||||
| #define CPM_USBRDT_VBFIL_LD_EN		BIT(25) | ||||
| #define CPM_USBRDT_IDDIG_EN		BIT(24) | ||||
| #define CPM_USBRDT_IDDIG_REG		BIT(23) | ||||
| #define CPM_USBRDT_USBRDT_BIT		0 | ||||
| #define CPM_USBRDT_USBRDT_MASK		(0x7fffff << CPM_USBRDT_USBRDT_BIT) | ||||
|  | ||||
| /* USB OTG PHY clock divider register */ | ||||
| #define CPM_USBCDR_UCS			BIT(31) | ||||
| #define CPM_USBCDR_UPCS			BIT(30) | ||||
| #define CPM_USBCDR_CEUSB		BIT(29) | ||||
| #define CPM_USBCDR_USB_BUSY		BIT(28) | ||||
| #define CPM_USBCDR_OTGDIV_BIT		0 | ||||
| #define CPM_USBCDR_OTGDIV_MASK		(0xff << CPM_USBCDR_OTGDIV_BIT) | ||||
|  | ||||
| /* I2S device clock divider register */ | ||||
| #define CPM_I2SCDR_I2CS			BIT(31) | ||||
| #define CPM_I2SCDR_I2PCS		BIT(30) | ||||
| #define CPM_I2SCDR_I2SDIV_BIT		0 | ||||
| #define CPM_I2SCDR_I2SDIV_MASK		(0x1ff << CPM_I2SCDR_I2SDIV_BIT) | ||||
|  | ||||
| /* LCD0 pix clock divider register */ | ||||
| #define CPM_LPCDR_LPCS_BIT		30 | ||||
| #define CPM_LPCDR_LPCS_MASK		(0x3 << CPM_LPCDR_LPCS_BIT) | ||||
| #define CPM_LPCDR_CELCD			BIT(28) | ||||
| #define CPM_LPCDR_LCD_BUSY		BIT(27) | ||||
| #define CPM_LPCDR_LCD_STOP		BIT(26) | ||||
| #define CPM_LPCDR_PIXDIV_BIT		0 | ||||
| #define CPM_LPCDR_PIXDIV_MASK		(0xff << CPM_LPCDR_PIXDIV_BIT) | ||||
|  | ||||
| /* MSC clock divider register */ | ||||
| #define CPM_MSCCDR_MPCS_BIT		30 | ||||
| #define CPM_MSCCDR_MPCS_MASK		(3 << CPM_MSCCDR_MPCS_BIT) | ||||
| #define CPM_MSCCDR_MPCS_STOP		(0x0 << CPM_MSCCDR_MPCS_BIT) | ||||
| #define CPM_MSCCDR_MPCS_SRC		(0x1 << CPM_MSCCDR_MPCS_BIT) | ||||
| #define CPM_MSCCDR_MPCS_MPLL		(0x2 << CPM_MSCCDR_MPCS_BIT) | ||||
| #define CPM_MSCCDR_CE			BIT(29) | ||||
| #define CPM_MSCCDR_MSC_BUSY		BIT(28) | ||||
| #define CPM_MSCCDR_MSC_STOP		BIT(27) | ||||
| #define CPM_MSCCDR_MSC_CLK0_SEL		BIT(15) | ||||
| #define CPM_MSCCDR_MSCDIV_BIT		0 | ||||
| #define CPM_MSCCDR_MSCDIV_MASK		(0xff << CPM_MSCCDR_MSCDIV_BIT) | ||||
|  | ||||
| /* UHC 48M clock divider register */ | ||||
| #define CPM_UHCCDR_UHCS_BIT		30 | ||||
| #define CPM_UHCCDR_UHCS_MASK		(0x3 << CPM_UHCCDR_UHCS_BIT) | ||||
| #define CPM_UHCCDR_UHCS_SRC		(0x0 << CPM_UHCCDR_UHCS_BIT) | ||||
| #define CPM_UHCCDR_UHCS_MPLL		(0x1 << CPM_UHCCDR_UHCS_BIT) | ||||
| #define CPM_UHCCDR_UHCS_EPLL		(0x2 << CPM_UHCCDR_UHCS_BIT) | ||||
| #define CPM_UHCCDR_UHCS_OTG		(0x3 << CPM_UHCCDR_UHCS_BIT) | ||||
| #define CPM_UHCCDR_CE_UHC		BIT(29) | ||||
| #define CPM_UHCCDR_UHC_BUSY		BIT(28) | ||||
| #define CPM_UHCCDR_UHC_STOP		BIT(27) | ||||
| #define CPM_UHCCDR_UHCDIV_BIT		0 | ||||
| #define CPM_UHCCDR_UHCDIV_MASK		(0xff << CPM_UHCCDR_UHCDIV_BIT) | ||||
|  | ||||
| /* SSI clock divider register */ | ||||
| #define CPM_SSICDR_SCS			BIT(31) | ||||
| #define CPM_SSICDR_SSIDIV_BIT		0 | ||||
| #define CPM_SSICDR_SSIDIV_MASK		(0x3f << CPM_SSICDR_SSIDIV_BIT) | ||||
|  | ||||
| /* CIM MCLK clock divider register */ | ||||
| #define CPM_CIMCDR_CIMDIV_BIT		0 | ||||
| #define CPM_CIMCDR_CIMDIV_MASK		(0xff << CPM_CIMCDR_CIMDIV_BIT) | ||||
|  | ||||
| /* GPS clock divider register */ | ||||
| #define CPM_GPSCDR_GPCS			BIT(31) | ||||
| #define CPM_GPSCDR_GPSDIV_BIT		0 | ||||
| #define CPM_GSPCDR_GPSDIV_MASK		(0xf << CPM_GPSCDR_GPSDIV_BIT) | ||||
|  | ||||
| /* PCM device clock divider register */ | ||||
| #define CPM_PCMCDR_PCMS			BIT(31) | ||||
| #define CPM_PCMCDR_PCMPCS		BIT(30) | ||||
| #define CPM_PCMCDR_PCMDIV_BIT		0 | ||||
| #define CPM_PCMCDR_PCMDIV_MASK		(0x1ff << CPM_PCMCDR_PCMDIV_BIT) | ||||
|  | ||||
| /* GPU clock divider register */ | ||||
| #define CPM_GPUCDR_GPCS			BIT(31) | ||||
| #define CPM_GPUCDR_GPUDIV_BIT		0 | ||||
| #define CPM_GPUCDR_GPUDIV_MASK		(0x7 << CPM_GPUCDR_GPUDIV_BIT) | ||||
|  | ||||
| /* HDMI clock divider register */ | ||||
| #define CPM_HDMICDR_HPCS_BIT		30 | ||||
| #define CPM_HDMICDR_HPCS_MASK		(0x3 << CPM_HDMICDR_HPCS_BIT) | ||||
| #define CPM_HDMICDR_CEHDMI		BIT(29) | ||||
| #define CPM_HDMICDR_HDMI_BUSY		BIT(28) | ||||
| #define CPM_HDMICDR_HDMI_STOP		BIT(26) | ||||
| #define CPM_HDMICDR_HDMIDIV_BIT		0 | ||||
| #define CPM_HDMICDR_HDMIDIV_MASK	(0xff << CPM_HDMICDR_HDMIDIV_BIT) | ||||
|  | ||||
| /* Low Power Control Register */ | ||||
| #define CPM_LCR_PD_SCPU			BIT(31) | ||||
| #define CPM_LCR_PD_VPU			BIT(30) | ||||
| #define CPM_LCR_PD_GPU			BIT(29) | ||||
| #define CPM_LCR_PD_GPS			BIT(28) | ||||
| #define CPM_LCR_SCPUS			BIT(27) | ||||
| #define CPM_LCR_VPUS			BIT(26) | ||||
| #define CPM_LCR_GPUS			BIT(25) | ||||
| #define CPM_LCR_GPSS			BIT(24) | ||||
| #define CPM_LCR_GPU_IDLE		BIT(20) | ||||
| #define CPM_LCR_PST_BIT			8 | ||||
| #define CPM_LCR_PST_MASK		(0xfff << CPM_LCR_PST_BIT) | ||||
| #define CPM_LCR_DOZE_DUTY_BIT		3 | ||||
| #define CPM_LCR_DOZE_DUTY_MASK		(0x1f << CPM_LCR_DOZE_DUTY_BIT) | ||||
| #define CPM_LCR_DOZE_ON			BIT(2) | ||||
| #define CPM_LCR_LPM_BIT			0 | ||||
| #define CPM_LCR_LPM_MASK		(0x3 << CPM_LCR_LPM_BIT) | ||||
| #define CPM_LCR_LPM_IDLE		(0x0 << CPM_LCR_LPM_BIT) | ||||
| #define CPM_LCR_LPM_SLEEP		(0x1 << CPM_LCR_LPM_BIT) | ||||
|  | ||||
| /* Clock Gate Register0 */ | ||||
| #define CPM_CLKGR0_DDR1			BIT(31) | ||||
| #define CPM_CLKGR0_DDR0			BIT(30) | ||||
| #define CPM_CLKGR0_IPU			BIT(29) | ||||
| #define CPM_CLKGR0_LCD1			BIT(28) | ||||
| #define CPM_CLKGR0_LCD			BIT(27) | ||||
| #define CPM_CLKGR0_CIM			BIT(26) | ||||
| #define CPM_CLKGR0_I2C2			BIT(25) | ||||
| #define CPM_CLKGR0_UHC			BIT(24) | ||||
| #define CPM_CLKGR0_MAC			BIT(23) | ||||
| #define CPM_CLKGR0_GPS			BIT(22) | ||||
| #define CPM_CLKGR0_PDMAC		BIT(21) | ||||
| #define CPM_CLKGR0_SSI2			BIT(20) | ||||
| #define CPM_CLKGR0_SSI1			BIT(19) | ||||
| #define CPM_CLKGR0_UART3		BIT(18) | ||||
| #define CPM_CLKGR0_UART2		BIT(17) | ||||
| #define CPM_CLKGR0_UART1		BIT(16) | ||||
| #define CPM_CLKGR0_UART0		BIT(15) | ||||
| #define CPM_CLKGR0_SADC			BIT(14) | ||||
| #define CPM_CLKGR0_KBC			BIT(13) | ||||
| #define CPM_CLKGR0_MSC2			BIT(12) | ||||
| #define CPM_CLKGR0_MSC1			BIT(11) | ||||
| #define CPM_CLKGR0_OWI			BIT(10) | ||||
| #define CPM_CLKGR0_TSSI			BIT(9) | ||||
| #define CPM_CLKGR0_AIC			BIT(8) | ||||
| #define CPM_CLKGR0_SCC			BIT(7) | ||||
| #define CPM_CLKGR0_I2C1			BIT(6) | ||||
| #define CPM_CLKGR0_I2C0			BIT(5) | ||||
| #define CPM_CLKGR0_SSI0			BIT(4) | ||||
| #define CPM_CLKGR0_MSC0			BIT(3) | ||||
| #define CPM_CLKGR0_OTG			BIT(2) | ||||
| #define CPM_CLKGR0_BCH			BIT(1) | ||||
| #define CPM_CLKGR0_NEMC			BIT(0) | ||||
|  | ||||
| /* Clock Gate Register1 */ | ||||
| #define CPM_CLKGR1_P1			BIT(15) | ||||
| #define CPM_CLKGR1_X2D			BIT(14) | ||||
| #define CPM_CLKGR1_DES			BIT(13) | ||||
| #define CPM_CLKGR1_I2C4			BIT(12) | ||||
| #define CPM_CLKGR1_AHB			BIT(11) | ||||
| #define CPM_CLKGR1_UART4		BIT(10) | ||||
| #define CPM_CLKGR1_HDMI			BIT(9) | ||||
| #define CPM_CLKGR1_OTG1			BIT(8) | ||||
| #define CPM_CLKGR1_GPVLC		BIT(7) | ||||
| #define CPM_CLKGR1_AIC1			BIT(6) | ||||
| #define CPM_CLKGR1_COMPRES		BIT(5) | ||||
| #define CPM_CLKGR1_GPU			BIT(4) | ||||
| #define CPM_CLKGR1_PCM			BIT(3) | ||||
| #define CPM_CLKGR1_VPU			BIT(2) | ||||
| #define CPM_CLKGR1_TSSI1		BIT(1) | ||||
| #define CPM_CLKGR1_I2C3			BIT(0) | ||||
|  | ||||
| /* Oscillator and Power Control Register */ | ||||
| #define CPM_OPCR_O1ST_BIT		8 | ||||
| #define CPM_OPCR_O1ST_MASK		(0xff << CPM_OPCR_O1ST_BIT) | ||||
| #define CPM_OPCR_SPENDN			BIT(7) | ||||
| #define CPM_OPCR_GPSEN			BIT(6) | ||||
| #define CPM_OPCR_SPENDH			BIT(5) | ||||
| #define CPM_OPCR_O1SE			BIT(4) | ||||
| #define CPM_OPCR_ERCS			BIT(2) /* 0: select EXCLK/512 clock, 1: RTCLK clock */ | ||||
| #define CPM_OPCR_USBM			BIT(0) /* 0: select EXCLK/512 clock, 1: RTCLK clock */ | ||||
|  | ||||
| /* Reset Status Register */ | ||||
| #define CPM_RSR_P0R			BIT(2) | ||||
| #define CPM_RSR_WR			BIT(1) | ||||
| #define CPM_RSR_PR			BIT(0) | ||||
|  | ||||
| /* BCH clock divider register */ | ||||
| #define CPM_BCHCDR_BPCS_BIT		30 | ||||
| #define CPM_BCHCDR_BPCS_MASK		(0x3 << CPM_BCHCDR_BPCS_BIT) | ||||
| #define CPM_BCHCDR_BPCS_STOP		(0X0 << CPM_BCHCDR_BPCS_BIT) | ||||
| #define CPM_BCHCDR_BPCS_SRC_CLK		(0x1 << CPM_BCHCDR_BPCS_BIT) | ||||
| #define CPM_BCHCDR_BPCS_MPLL		(0x2 << CPM_BCHCDR_BPCS_BIT) | ||||
| #define CPM_BCHCDR_BPCS_EPLL		(0x3 << CPM_BCHCDR_BPCS_BIT) | ||||
| #define CPM_BCHCDR_CE_BCH		BIT(29) | ||||
| #define CPM_BCHCDR_BCH_BUSY		BIT(28) | ||||
| #define CPM_BCHCDR_BCH_STOP		BIT(27) | ||||
| #define CPM_BCHCDR_BCHCDR_BIT		0 | ||||
| #define CPM_BCHCDR_BCHCDR_MASK		(0x7 << CPM_BCHCDR_BCHCDR_BIT) | ||||
|  | ||||
| /* CPM scratch pad protected register(CPSPPR) */ | ||||
| #define CPSPPR_CPSPR_WRITABLE		0x00005a5a | ||||
| #define RECOVERY_SIGNATURE		0x1a1a	/* means "RECY" */ | ||||
| #define RECOVERY_SIGNATURE_SEC		0x800	/* means "RECY" */ | ||||
|  | ||||
| #define REBOOT_SIGNATURE		0x3535	/* means reboot */ | ||||
|  | ||||
| /* XPLL control register */ | ||||
| #define XLOCK		(1 << 6) | ||||
| #define XPLL_ON		(1 << 4) | ||||
| #define XF_MODE		(1 << 3) | ||||
| #define XPLLBP		(1 << 1) | ||||
| #define XPLLEN		(1 << 0) | ||||
|  | ||||
| enum PLLS { | ||||
| 	EXTCLK = 0, | ||||
| 	APLL, | ||||
| 	MPLL, | ||||
| 	EPLL, | ||||
| 	VPLL, | ||||
| }; | ||||
|  | ||||
| #define M_N_OD(m, n, od)		\ | ||||
| 		((((m) - 1) << 19) | (((n) - 1) << 13) | (((od) - 1) << 9)) | ||||
|  | ||||
| struct cgu_pll_select { | ||||
| 	u8	reg; | ||||
| 	u8	pll; | ||||
| 	u8	pll_shift; | ||||
| }; | ||||
|  | ||||
| static void pll_init_one(int pll, int m, int n, int od) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	void __iomem *pll_reg = cpm_regs + CPM_CPAPCR + ((pll - 1) * 4); | ||||
|  | ||||
| 	setbits_le32(pll_reg, M_N_OD(m, n, od) | XPLLEN); | ||||
|  | ||||
| 	/* FIXME */ | ||||
| 	while (!(readl(pll_reg) & XPLL_ON)) | ||||
| 		; | ||||
| } | ||||
|  | ||||
| static void cpu_mux_select(int pll) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	u32 clk_ctrl; | ||||
| 	unsigned int selectplls[] = { | ||||
| 		CPM_PLL_SEL_STOP, | ||||
| 		CPM_PLL_SEL_SRC, | ||||
| 		CPM_PLL_SEL_MPLL, | ||||
| 		CPM_PLL_SEL_EPLL | ||||
| 	}; | ||||
|  | ||||
| 	/* Init CPU, L2CACHE, AHB0, AHB2, APB clock */ | ||||
| 	clk_ctrl = CPM_CPCCR_CE_CPU | CPM_CPCCR_CE_AHB0 | CPM_CPCCR_CE_AHB2 | | ||||
| 			((6 - 1) << CPM_CPCCR_H2DIV_BIT) | | ||||
| 			((3 - 1) << CPM_CPCCR_H0DIV_BIT) | | ||||
| 			((2 - 1) << CPM_CPCCR_L2DIV_BIT) | | ||||
| 			((1 - 1) << CPM_CPCCR_CDIV_BIT); | ||||
|  | ||||
| 	if (CONFIG_SYS_MHZ >= 1000) | ||||
| 		clk_ctrl |= (12 - 1) << CPM_CPCCR_PDIV_BIT; | ||||
| 	else | ||||
| 		clk_ctrl |= (6 - 1) << CPM_CPCCR_PDIV_BIT; | ||||
|  | ||||
| 	clrsetbits_le32(cpm_regs + CPM_CPCCR, 0x00ffffff, clk_ctrl); | ||||
|  | ||||
| 	while (readl(cpm_regs + CPM_CPCSR) & (CPM_CPCSR_CDIV_BUSY | | ||||
| 	       CPM_CPCSR_H0DIV_BUSY | CPM_CPCSR_H2DIV_BUSY)) | ||||
| 		; | ||||
|  | ||||
| 	clk_ctrl = (selectplls[pll] << CPM_CPCCR_SEL_CPLL_BIT) | | ||||
| 		   (selectplls[MPLL] << CPM_CPCCR_SEL_H0PLL_BIT) | | ||||
| 		   (selectplls[MPLL] << CPM_CPCCR_SEL_H2PLL_BIT); | ||||
| 	if (pll == APLL) | ||||
| 		clk_ctrl |= CPM_PLL_SEL_SRC << CPM_CPCCR_SEL_SRC_BIT; | ||||
| 	else | ||||
| 		clk_ctrl |= CPM_SRC_SEL_EXCLK << CPM_CPCCR_SEL_SRC_BIT; | ||||
|  | ||||
| 	clrsetbits_le32(cpm_regs + CPM_CPCCR, 0xff << 24, clk_ctrl); | ||||
| } | ||||
|  | ||||
| static void ddr_mux_select(int pll) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	int selectplls[] = { CPM_DDRCDR_DCS_STOP, | ||||
| 			     CPM_DDRCDR_DCS_SRC, | ||||
| 			     CPM_DDRCDR_DCS_MPLL}; | ||||
|  | ||||
| 	writel(selectplls[pll] | CPM_DDRCDR_CE_DDR | (JZ4780_SYS_MEM_DIV - 1), | ||||
| 	       cpm_regs + CPM_DDCDR); | ||||
|  | ||||
| 	while (readl(cpm_regs + CPM_DDCDR) & CPM_DDRCDR_DDR_BUSY) | ||||
| 		; | ||||
|  | ||||
| 	clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_DDR0); | ||||
|  | ||||
| 	mdelay(200); | ||||
| } | ||||
|  | ||||
| static void cgu_mux_init(struct cgu_pll_select *cgu, unsigned int num) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	unsigned int selectplls[] = {0, 1, 2, 3, 2, 6}; | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; i < num; i++) | ||||
| 		writel(selectplls[cgu[i].pll] << cgu[i].pll_shift, | ||||
| 		       cpm_regs + cgu[i].reg); | ||||
| } | ||||
|  | ||||
| void pll_init(void) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	struct cgu_pll_select cgu_mux[] = { | ||||
| 		{ CPM_MSCCDR,  MPLL, 30 }, | ||||
| 		{ CPM_LPCDR,   VPLL, 30 }, | ||||
| 		{ CPM_LPCDR1,  VPLL, 30 }, | ||||
| 		{ CPM_GPUCDR,  MPLL, 30 }, | ||||
| 		{ CPM_HDMICDR, VPLL, 30 }, | ||||
| 		{ CPM_I2SCDR,  EPLL, 30 }, | ||||
| 		{ CPM_BCHCDR,  MPLL, 30 }, | ||||
| 		{ CPM_VPUCDR,  0x1,  30 }, | ||||
| 		{ CPM_UHCCDR,  0x3,  30 }, | ||||
| 		{ CPM_CIMCDR,  0x1,  31 }, | ||||
| 		{ CPM_PCMCDR,  0x5,  29 }, | ||||
| 		{ CPM_SSICDR,  0x3,  30 }, | ||||
| 	}; | ||||
|  | ||||
| 	/* PLL stable time set to default -- 1ms */ | ||||
| 	clrsetbits_le32(cpm_regs + CPM_CPPCR, 0xfffff, (16 << 8) | 0x20); | ||||
|  | ||||
| 	pll_init_one(APLL, JZ4780_APLL_M, JZ4780_APLL_N, JZ4780_APLL_OD); | ||||
| 	pll_init_one(MPLL, JZ4780_MPLL_M, JZ4780_MPLL_N, JZ4780_MPLL_OD); | ||||
| 	pll_init_one(VPLL, JZ4780_VPLL_M, JZ4780_VPLL_N, JZ4780_VPLL_OD); | ||||
| 	pll_init_one(EPLL, JZ4780_EPLL_M, JZ4780_EPLL_N, JZ4780_EPLL_OD); | ||||
|  | ||||
| 	cpu_mux_select(MPLL); | ||||
| 	ddr_mux_select(MPLL); | ||||
| 	cgu_mux_init(cgu_mux, ARRAY_SIZE(cgu_mux)); | ||||
| } | ||||
|  | ||||
| const u32 jz4780_clk_get_efuse_clk(void) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	u32 cpccr = readl(cpm_regs + CPM_CPCCR); | ||||
| 	u32 ahb2_div = ((cpccr & CPM_CPCCR_H2DIV_MASK) >> | ||||
| 			CPM_CPCCR_H2DIV_BIT) + 1; | ||||
| 	return JZ4780_SYS_MEM_SPEED / ahb2_div; | ||||
| } | ||||
|  | ||||
| void jz4780_clk_ungate_ethernet(void) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
|  | ||||
| 	clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_MAC); | ||||
| 	clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_NEMC); | ||||
| } | ||||
|  | ||||
| void jz4780_clk_ungate_mmc(void) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	u32 msc_cdr = JZ4780_SYS_MEM_SPEED / 24000000 / 2 - 1; | ||||
|  | ||||
| 	msc_cdr |= CPM_MSCCDR_MPCS_MPLL | CPM_MSCCDR_CE; | ||||
| 	writel(msc_cdr, cpm_regs + CPM_MSCCDR); | ||||
| 	writel(msc_cdr, cpm_regs + CPM_MSCCDR1); | ||||
| 	writel(msc_cdr, cpm_regs + CPM_MSCCDR2); | ||||
|  | ||||
| 	/* The wait_for_bit() won't fit, thus unbounded loop here. */ | ||||
| 	while (readl(cpm_regs + CPM_MSCCDR1) & CPM_MSCCDR_MSC_BUSY) | ||||
| 		; | ||||
| } | ||||
|  | ||||
| void jz4780_clk_ungate_uart(const unsigned int uart) | ||||
| { | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
|  | ||||
| 	if (uart == 0) | ||||
| 		clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_UART0); | ||||
| 	else if (uart == 1) | ||||
| 		clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_UART1); | ||||
| 	else if (uart == 2) | ||||
| 		clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_UART2); | ||||
| 	else if (uart == 3) | ||||
| 		clrbits_le32(cpm_regs + CPM_CLKGR0, CPM_CLKGR0_UART3); | ||||
| 	else if (uart == 4) | ||||
| 		clrbits_le32(cpm_regs + CPM_CLKGR1, CPM_CLKGR1_UART4); | ||||
| 	else | ||||
| 		printf("%s[%i]: Invalid UART %d\n", __func__, __LINE__, uart); | ||||
| } | ||||
							
								
								
									
										53
									
								
								arch/mips/mach-jz47xx/jz4780/reset.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								arch/mips/mach-jz47xx/jz4780/reset.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  * JZ4780 common routines | ||||
|  * | ||||
|  * Copyright (c) 2013 Imagination Technologies | ||||
|  * Author: Paul Burton <paul.burton@imgtec.com> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
| #include <common.h> | ||||
| #include <asm/io.h> | ||||
| #include <mach/jz4780.h> | ||||
|  | ||||
| /* WDT */ | ||||
| #define WDT_TDR		0x00 | ||||
| #define WDT_TCER	0x04 | ||||
| #define WDT_TCNT	0x08 | ||||
| #define WDT_TCSR	0x0C | ||||
|  | ||||
| /* Register definition */ | ||||
| #define WDT_TCSR_PRESCALE_BIT	3 | ||||
| #define WDT_TCSR_PRESCALE_MASK	(0x7 << WDT_TCSR_PRESCALE_BIT) | ||||
|   #define WDT_TCSR_PRESCALE1	(0x0 << WDT_TCSR_PRESCALE_BIT) | ||||
|   #define WDT_TCSR_PRESCALE4	(0x1 << WDT_TCSR_PRESCALE_BIT) | ||||
|   #define WDT_TCSR_PRESCALE16	(0x2 << WDT_TCSR_PRESCALE_BIT) | ||||
|   #define WDT_TCSR_PRESCALE64	(0x3 << WDT_TCSR_PRESCALE_BIT) | ||||
|   #define WDT_TCSR_PRESCALE256	(0x4 << WDT_TCSR_PRESCALE_BIT) | ||||
|   #define WDT_TCSR_PRESCALE1024	(0x5 << WDT_TCSR_PRESCALE_BIT) | ||||
| #define WDT_TCSR_EXT_EN		BIT(2) | ||||
| #define WDT_TCSR_RTC_EN		BIT(1) | ||||
| #define WDT_TCSR_PCK_EN		BIT(0) | ||||
|  | ||||
| #define WDT_TCER_TCEN		BIT(0) | ||||
|  | ||||
| void _machine_restart(void) | ||||
| { | ||||
| 	void __iomem *wdt_regs = (void __iomem *)WDT_BASE; | ||||
|  | ||||
| 	/* EXTAL as the timer clock input. */ | ||||
| 	writew(WDT_TCSR_PRESCALE1 | WDT_TCSR_EXT_EN, wdt_regs + WDT_TCSR); | ||||
|  | ||||
| 	/* Reset the WDT counter and timeout. */ | ||||
| 	writew(0, wdt_regs + WDT_TCNT); | ||||
| 	writew(0, wdt_regs + WDT_TDR); | ||||
|  | ||||
| 	jz4780_tcu_wdt_start(); | ||||
|  | ||||
| 	/* WDT start */ | ||||
| 	writeb(WDT_TCER_TCEN, wdt_regs + WDT_TCER); | ||||
|  | ||||
| 	for (;;) | ||||
| 		; | ||||
| } | ||||
							
								
								
									
										270
									
								
								arch/mips/mach-jz47xx/jz4780/sdram.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								arch/mips/mach-jz47xx/jz4780/sdram.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  * JZ4780 DDR initialization | ||||
|  * | ||||
|  * Copyright (c) 2013 Imagination Technologies | ||||
|  * Author: Paul Burton <paul.burton@imgtec.com> | ||||
|  * | ||||
|  * Based on spl/common/{jz4780_ddr,jz_ddr3_init}.c from X-Boot | ||||
|  * Copyright (c) 2006-2013 Ingenic Semiconductor | ||||
|  */ | ||||
|  | ||||
| #include <common.h> | ||||
| #include <asm/io.h> | ||||
| #include <mach/jz4780.h> | ||||
| #include <mach/jz4780_dram.h> | ||||
|  | ||||
| static const u32 get_mem_clk(void) | ||||
| { | ||||
| 	const u32 mpll_out = ((u64)JZ4780_SYS_EXTAL * JZ4780_MPLL_M) / | ||||
| 			     (JZ4780_MPLL_N * JZ4780_MPLL_OD); | ||||
| 	return mpll_out / JZ4780_SYS_MEM_DIV; | ||||
| } | ||||
|  | ||||
| u32 sdram_size(int cs) | ||||
| { | ||||
| 	u32 dw = DDR_DW32 ? 4 : 2; | ||||
| 	u32 banks = DDR_BANK8 ? 8 : 4; | ||||
| 	u32 size = 0; | ||||
|  | ||||
| 	if ((cs == 0) && DDR_CS0EN) { | ||||
| 		size = (1 << (DDR_ROW + DDR_COL)) * dw * banks; | ||||
| 		if (DDR_CS1EN && (size > 0x20000000)) | ||||
| 			size = 0x20000000; | ||||
| 	} else if ((cs == 1) && DDR_CS1EN) { | ||||
| 		size = (1 << (DDR_ROW + DDR_COL)) * dw * banks; | ||||
| 	} | ||||
|  | ||||
| 	return size; | ||||
| } | ||||
|  | ||||
| static void ddr_cfg_init(void) | ||||
| { | ||||
| 	void __iomem *ddr_ctl_regs = (void __iomem *)DDRC_BASE; | ||||
| 	u32 ddrc_cfg, tmp; | ||||
|  | ||||
| 	tmp = DDR_CL; | ||||
| 	if (tmp) | ||||
| 		tmp--; | ||||
| 	if (tmp > 4) | ||||
| 		tmp = 4; | ||||
|  | ||||
| 	ddrc_cfg = DDRC_CFG_TYPE_DDR3 | DDRC_CFG_IMBA | | ||||
| 		   DDR_DW32 | DDRC_CFG_MPRT | ((tmp | 0x8) << 2) | | ||||
| 		   ((DDR_ROW - 12) << 11) | ((DDR_COL - 8) << 8) | | ||||
| 		   (DDR_CS0EN << 6) | (DDR_BANK8 << 1) | | ||||
| 		   ((DDR_ROW - 12) << 27) | ((DDR_COL - 8) << 24) | | ||||
| 		   (DDR_CS1EN << 7) | (DDR_BANK8 << 23); | ||||
|  | ||||
| 	if (DDR_BL > 4) | ||||
| 		ddrc_cfg |= BIT(21); | ||||
|  | ||||
| 	writel(ddrc_cfg, ddr_ctl_regs + DDRC_CFG); | ||||
| } | ||||
|  | ||||
| static void ddr_phy_init(const struct jz4780_ddr_config *ddr_config) | ||||
| { | ||||
| 	void __iomem *ddr_ctl_regs = (void __iomem *)DDRC_BASE; | ||||
| 	void __iomem *ddr_phy_regs = ddr_ctl_regs + DDR_PHY_OFFSET; | ||||
| 	unsigned int count = 0, i; | ||||
| 	u32 reg, mask; | ||||
|  | ||||
| 	writel(DDRP_DCR_TYPE_DDR3 | (DDR_BANK8 << 3), ddr_phy_regs + DDRP_DCR); | ||||
|  | ||||
| 	writel(ddr_config->mr0, ddr_phy_regs + DDRP_MR0); | ||||
| 	writel(ddr_config->mr1, ddr_phy_regs + DDRP_MR1); | ||||
| 	writel(0, ddr_phy_regs + DDRP_ODTCR); | ||||
| 	writel(0, ddr_phy_regs + DDRP_MR2); | ||||
|  | ||||
| 	writel(ddr_config->ptr0, ddr_phy_regs + DDRP_PTR0); | ||||
| 	writel(ddr_config->ptr1, ddr_phy_regs + DDRP_PTR1); | ||||
| 	writel(ddr_config->ptr2, ddr_phy_regs + DDRP_PTR2); | ||||
|  | ||||
| 	writel(ddr_config->dtpr0, ddr_phy_regs + DDRP_DTPR0); | ||||
| 	writel(ddr_config->dtpr1, ddr_phy_regs + DDRP_DTPR1); | ||||
| 	writel(ddr_config->dtpr2, ddr_phy_regs + DDRP_DTPR2); | ||||
|  | ||||
| 	writel(DDRP_PGCR_DQSCFG | (7 << DDRP_PGCR_CKEN_BIT) | | ||||
| 	       (2 << DDRP_PGCR_CKDV_BIT) | | ||||
| 	       (DDR_CS0EN | (DDR_CS1EN << 1)) << DDRP_PGCR_RANKEN_BIT | | ||||
| 	       DDRP_PGCR_ZCKSEL_32 | DDRP_PGCR_PDDISDX, | ||||
| 	       ddr_phy_regs + DDRP_PGCR); | ||||
|  | ||||
| 	for (i = 0; i < 8; i++) | ||||
| 		clrbits_le32(ddr_phy_regs + DDRP_DXGCR(i), 0x3 << 9); | ||||
|  | ||||
| 	count = 0; | ||||
| 	mask = DDRP_PGSR_IDONE | DDRP_PGSR_DLDONE | DDRP_PGSR_ZCDONE; | ||||
| 	for (;;) { | ||||
| 		reg = readl(ddr_phy_regs + DDRP_PGSR); | ||||
| 		if ((reg == mask) || (reg == 0x1f)) | ||||
| 			break; | ||||
| 		if (count++ == 10000) | ||||
| 			hang(); | ||||
| 	} | ||||
|  | ||||
| 	/* DQS extension and early set to 1 */ | ||||
| 	clrsetbits_le32(ddr_phy_regs + DDRP_DSGCR, 0x7E << 4, 0x12 << 4); | ||||
|  | ||||
| 	/* 500 pull up and 500 pull down */ | ||||
| 	clrsetbits_le32(ddr_phy_regs + DDRP_DXCCR, 0xFF << 4, 0xC4 << 4); | ||||
|  | ||||
| 	/* Initialise phy */ | ||||
| 	writel(DDRP_PIR_INIT | DDRP_PIR_DRAMINT | DDRP_PIR_DRAMRST, | ||||
| 	       ddr_phy_regs + DDRP_PIR); | ||||
|  | ||||
| 	count = 0; | ||||
| 	mask |= DDRP_PGSR_DIDONE; | ||||
| 	for (;;) { | ||||
| 		reg = readl(ddr_phy_regs + DDRP_PGSR); | ||||
| 		if ((reg == mask) || (reg == 0x1f)) | ||||
| 			break; | ||||
| 		if (count++ == 20000) | ||||
| 			hang(); | ||||
| 	} | ||||
|  | ||||
| 	writel(DDRP_PIR_INIT | DDRP_PIR_QSTRN, ddr_phy_regs + DDRP_PIR); | ||||
|  | ||||
| 	count = 0; | ||||
| 	mask |= DDRP_PGSR_DTDONE; | ||||
| 	for (;;) { | ||||
| 		reg = readl(ddr_phy_regs + DDRP_PGSR); | ||||
| 		if (reg == mask) | ||||
| 			break; | ||||
| 		if (count++ != 50000) | ||||
| 			continue; | ||||
| 		reg &= DDRP_PGSR_DTDONE | DDRP_PGSR_DTERR | DDRP_PGSR_DTIERR; | ||||
| 		if (reg) | ||||
| 			hang(); | ||||
| 		count = 0; | ||||
| 	} | ||||
|  | ||||
| 	/* Override impedance */ | ||||
| 	clrsetbits_le32(ddr_phy_regs + DDRP_ZQXCR0(0), 0x3ff, | ||||
| 		((ddr_config->pullup & 0x1f) << DDRP_ZQXCR_PULLUP_IMPE_BIT) | | ||||
| 		((ddr_config->pulldn & 0x1f) << DDRP_ZQXCR_PULLDOWN_IMPE_BIT) | | ||||
| 		DDRP_ZQXCR_ZDEN); | ||||
| } | ||||
|  | ||||
| #define JZBIT(bit) ((bit % 4) * 8) | ||||
| #define JZMASK(bit) (0x1f << JZBIT(bit)) | ||||
|  | ||||
| static void remap_swap(int a, int b) | ||||
| { | ||||
| 	void __iomem *ddr_ctl_regs = (void __iomem *)DDRC_BASE; | ||||
| 	u32 remmap[2], tmp[2]; | ||||
|  | ||||
| 	remmap[0] = readl(ddr_ctl_regs + DDRC_REMMAP(a / 4)); | ||||
| 	remmap[1] = readl(ddr_ctl_regs + DDRC_REMMAP(b / 4)); | ||||
|  | ||||
| 	tmp[0] = (remmap[0] & JZMASK(a)) >> JZBIT(a); | ||||
| 	tmp[1] = (remmap[1] & JZMASK(b)) >> JZBIT(b); | ||||
|  | ||||
| 	remmap[0] &= ~JZMASK(a); | ||||
| 	remmap[1] &= ~JZMASK(b); | ||||
|  | ||||
| 	writel(remmap[0] | (tmp[1] << JZBIT(a)), | ||||
| 	       ddr_ctl_regs + DDRC_REMMAP(a / 4)); | ||||
| 	writel(remmap[1] | (tmp[0] << JZBIT(b)), | ||||
| 	       ddr_ctl_regs + DDRC_REMMAP(b / 4)); | ||||
| } | ||||
|  | ||||
| static void mem_remap(void) | ||||
| { | ||||
| 	u32 start = (DDR_ROW + DDR_COL + (DDR_DW32 ? 4 : 2) / 2) - 12; | ||||
| 	u32 num = DDR_BANK8 ? 3 : 2; | ||||
|  | ||||
| 	if (DDR_CS0EN && DDR_CS1EN) | ||||
| 		num++; | ||||
|  | ||||
| 	for (; num > 0; num--) | ||||
| 		remap_swap(0 + num - 1, start + num - 1); | ||||
| } | ||||
|  | ||||
| /* Fetch DRAM config from board file */ | ||||
| __weak const struct jz4780_ddr_config *jz4780_get_ddr_config(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| void sdram_init(void) | ||||
| { | ||||
| 	const struct jz4780_ddr_config *ddr_config = jz4780_get_ddr_config(); | ||||
| 	void __iomem *ddr_ctl_regs = (void __iomem *)DDRC_BASE; | ||||
| 	void __iomem *ddr_phy_regs = ddr_ctl_regs + DDR_PHY_OFFSET; | ||||
| 	void __iomem *cpm_regs = (void __iomem *)CPM_BASE; | ||||
| 	u32 mem_clk, tmp, i; | ||||
| 	u32 mem_base0, mem_base1; | ||||
| 	u32 mem_mask0, mem_mask1; | ||||
| 	u32 mem_size0, mem_size1; | ||||
|  | ||||
| 	if (!ddr_config) | ||||
| 		hang(); | ||||
|  | ||||
| 	/* Reset DLL in DDR PHY */ | ||||
| 	writel(0x3, cpm_regs + 0xd0); | ||||
| 	mdelay(400); | ||||
| 	writel(0x1, cpm_regs + 0xd0); | ||||
| 	mdelay(400); | ||||
|  | ||||
| 	/* Enter reset */ | ||||
| 	writel(0xf << 20, ddr_ctl_regs + DDRC_CTRL); | ||||
|  | ||||
| 	mem_clk = get_mem_clk(); | ||||
|  | ||||
| 	tmp = 1000000000 / mem_clk; | ||||
| 	if (1000000000 % mem_clk) | ||||
| 		tmp++; | ||||
| 	tmp = DDR_tREFI / tmp; | ||||
| 	tmp = tmp / (16 * (1 << DDR_CLK_DIV)) - 1; | ||||
| 	if (tmp > 0xff) | ||||
| 		tmp = 0xff; | ||||
| 	if (tmp < 1) | ||||
| 		tmp = 1; | ||||
|  | ||||
| 	writel(0x0, ddr_ctl_regs + DDRC_CTRL); | ||||
|  | ||||
| 	writel(0x150000, ddr_phy_regs + DDRP_DTAR); | ||||
| 	ddr_phy_init(ddr_config); | ||||
|  | ||||
| 	writel(DDRC_CTRL_CKE | DDRC_CTRL_ALH, ddr_ctl_regs + DDRC_CTRL); | ||||
| 	writel(0x0, ddr_ctl_regs + DDRC_CTRL); | ||||
|  | ||||
| 	ddr_cfg_init(); | ||||
|  | ||||
| 	for (i = 0; i < 6; i++) | ||||
| 		writel(ddr_config->timing[i], ddr_ctl_regs + DDRC_TIMING(i)); | ||||
|  | ||||
| 	mem_size0 = sdram_size(0); | ||||
| 	mem_size1 = sdram_size(1); | ||||
|  | ||||
| 	if (!mem_size1 && mem_size0 > 0x20000000) { | ||||
| 		mem_base0 = 0x0; | ||||
| 		mem_mask0 = ~(((mem_size0 * 2) >> 24) - 1) & DDRC_MMAP_MASK_MASK; | ||||
| 	} else { | ||||
| 		mem_base0 = (DDR_MEM_PHY_BASE >> 24) & 0xff; | ||||
| 		mem_mask0 = ~((mem_size0 >> 24) - 1) & DDRC_MMAP_MASK_MASK; | ||||
| 	} | ||||
|  | ||||
| 	if (mem_size1) { | ||||
| 		mem_mask1 = ~((mem_size1 >> 24) - 1) & DDRC_MMAP_MASK_MASK; | ||||
| 		mem_base1 = ((DDR_MEM_PHY_BASE + mem_size0) >> 24) & 0xff; | ||||
| 	} else { | ||||
| 		mem_mask1 = 0; | ||||
| 		mem_base1 = 0xff; | ||||
| 	} | ||||
|  | ||||
| 	writel(mem_base0 << DDRC_MMAP_BASE_BIT | mem_mask0, | ||||
| 	       ddr_ctl_regs + DDRC_MMAP0); | ||||
| 	writel(mem_base1 << DDRC_MMAP_BASE_BIT | mem_mask1, | ||||
| 	       ddr_ctl_regs + DDRC_MMAP1); | ||||
| 	writel(DDRC_CTRL_CKE | DDRC_CTRL_ALH, ddr_ctl_regs + DDRC_CTRL); | ||||
| 	writel((DDR_CLK_DIV << 1) | DDRC_REFCNT_REF_EN | | ||||
| 	       (tmp << DDRC_REFCNT_CON_BIT), | ||||
| 	       ddr_ctl_regs + DDRC_REFCNT); | ||||
| 	writel((1 << 15) | (4 << 12) | (1 << 11) | (1 << 8) | (0 << 6) | | ||||
| 	       (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1), | ||||
| 	       ddr_ctl_regs + DDRC_CTRL); | ||||
| 	mem_remap(); | ||||
| 	clrbits_le32(ddr_ctl_regs + DDRC_ST, 0x40); | ||||
| } | ||||
							
								
								
									
										239
									
								
								arch/mips/mach-jz47xx/jz4780/timer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								arch/mips/mach-jz47xx/jz4780/timer.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  * JZ4780 timer | ||||
|  * | ||||
|  * Copyright (c) 2013 Imagination Technologies | ||||
|  * Author: Paul Burton <paul.burton@imgtec.com> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
| #include <common.h> | ||||
| #include <div64.h> | ||||
| #include <asm/io.h> | ||||
| #include <asm/mipsregs.h> | ||||
| #include <mach/jz4780.h> | ||||
|  | ||||
| #define TCU_TSR		0x1C	/* Timer Stop Register */ | ||||
| #define TCU_TSSR	0x2C	/* Timer Stop Set Register */ | ||||
| #define TCU_TSCR	0x3C	/* Timer Stop Clear Register */ | ||||
| #define TCU_TER		0x10	/* Timer Counter Enable Register */ | ||||
| #define TCU_TESR	0x14	/* Timer Counter Enable Set Register */ | ||||
| #define TCU_TECR	0x18	/* Timer Counter Enable Clear Register */ | ||||
| #define TCU_TFR		0x20	/* Timer Flag Register */ | ||||
| #define TCU_TFSR	0x24	/* Timer Flag Set Register */ | ||||
| #define TCU_TFCR	0x28	/* Timer Flag Clear Register */ | ||||
| #define TCU_TMR		0x30	/* Timer Mask Register */ | ||||
| #define TCU_TMSR	0x34	/* Timer Mask Set Register */ | ||||
| #define TCU_TMCR	0x38	/* Timer Mask Clear Register */ | ||||
| /* n = 0,1,2,3,4,5 */ | ||||
| #define TCU_TDFR(n)	(0x40 + (n) * 0x10)	/* Timer Data Full Reg */ | ||||
| #define TCU_TDHR(n)	(0x44 + (n) * 0x10)	/* Timer Data Half Reg */ | ||||
| #define TCU_TCNT(n)	(0x48 + (n) * 0x10)	/* Timer Counter Reg */ | ||||
| #define TCU_TCSR(n)	(0x4C + (n) * 0x10)	/* Timer Control Reg */ | ||||
|  | ||||
| #define TCU_OSTCNTL	0xe4 | ||||
| #define TCU_OSTCNTH	0xe8 | ||||
| #define TCU_OSTCSR	0xec | ||||
| #define TCU_OSTCNTHBUF	0xfc | ||||
|  | ||||
| /* Register definitions */ | ||||
| #define TCU_TCSR_PWM_SD		BIT(9) | ||||
| #define TCU_TCSR_PWM_INITL_HIGH	BIT(8) | ||||
| #define TCU_TCSR_PWM_EN		BIT(7) | ||||
| #define TCU_TCSR_PRESCALE_BIT	3 | ||||
| #define TCU_TCSR_PRESCALE_MASK	(0x7 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_PRESCALE1	(0x0 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_PRESCALE4	(0x1 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_PRESCALE16	(0x2 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_PRESCALE64	(0x3 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_PRESCALE256	(0x4 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_PRESCALE1024	(0x5 << TCU_TCSR_PRESCALE_BIT) | ||||
| #define TCU_TCSR_EXT_EN		BIT(2) | ||||
| #define TCU_TCSR_RTC_EN		BIT(1) | ||||
| #define TCU_TCSR_PCK_EN		BIT(0) | ||||
|  | ||||
| #define TCU_TER_TCEN5		BIT(5) | ||||
| #define TCU_TER_TCEN4		BIT(4) | ||||
| #define TCU_TER_TCEN3		BIT(3) | ||||
| #define TCU_TER_TCEN2		BIT(2) | ||||
| #define TCU_TER_TCEN1		BIT(1) | ||||
| #define TCU_TER_TCEN0		BIT(0) | ||||
|  | ||||
| #define TCU_TESR_TCST5		BIT(5) | ||||
| #define TCU_TESR_TCST4		BIT(4) | ||||
| #define TCU_TESR_TCST3		BIT(3) | ||||
| #define TCU_TESR_TCST2		BIT(2) | ||||
| #define TCU_TESR_TCST1		BIT(1) | ||||
| #define TCU_TESR_TCST0		BIT(0) | ||||
|  | ||||
| #define TCU_TECR_TCCL5		BIT(5) | ||||
| #define TCU_TECR_TCCL4		BIT(4) | ||||
| #define TCU_TECR_TCCL3		BIT(3) | ||||
| #define TCU_TECR_TCCL2		BIT(2) | ||||
| #define TCU_TECR_TCCL1		BIT(1) | ||||
| #define TCU_TECR_TCCL0		BIT(0) | ||||
|  | ||||
| #define TCU_TFR_HFLAG5		BIT(21) | ||||
| #define TCU_TFR_HFLAG4		BIT(20) | ||||
| #define TCU_TFR_HFLAG3		BIT(19) | ||||
| #define TCU_TFR_HFLAG2		BIT(18) | ||||
| #define TCU_TFR_HFLAG1		BIT(17) | ||||
| #define TCU_TFR_HFLAG0		BIT(16) | ||||
| #define TCU_TFR_FFLAG5		BIT(5) | ||||
| #define TCU_TFR_FFLAG4		BIT(4) | ||||
| #define TCU_TFR_FFLAG3		BIT(3) | ||||
| #define TCU_TFR_FFLAG2		BIT(2) | ||||
| #define TCU_TFR_FFLAG1		BIT(1) | ||||
| #define TCU_TFR_FFLAG0		BIT(0) | ||||
|  | ||||
| #define TCU_TFSR_HFLAG5		BIT(21) | ||||
| #define TCU_TFSR_HFLAG4		BIT(20) | ||||
| #define TCU_TFSR_HFLAG3		BIT(19) | ||||
| #define TCU_TFSR_HFLAG2		BIT(18) | ||||
| #define TCU_TFSR_HFLAG1		BIT(17) | ||||
| #define TCU_TFSR_HFLAG0		BIT(16) | ||||
| #define TCU_TFSR_FFLAG5		BIT(5) | ||||
| #define TCU_TFSR_FFLAG4		BIT(4) | ||||
| #define TCU_TFSR_FFLAG3		BIT(3) | ||||
| #define TCU_TFSR_FFLAG2		BIT(2) | ||||
| #define TCU_TFSR_FFLAG1		BIT(1) | ||||
| #define TCU_TFSR_FFLAG0		BIT(0) | ||||
|  | ||||
| #define TCU_TFCR_HFLAG5		BIT(21) | ||||
| #define TCU_TFCR_HFLAG4		BIT(20) | ||||
| #define TCU_TFCR_HFLAG3		BIT(19) | ||||
| #define TCU_TFCR_HFLAG2		BIT(18) | ||||
| #define TCU_TFCR_HFLAG1		BIT(17) | ||||
| #define TCU_TFCR_HFLAG0		BIT(16) | ||||
| #define TCU_TFCR_FFLAG5		BIT(5) | ||||
| #define TCU_TFCR_FFLAG4		BIT(4) | ||||
| #define TCU_TFCR_FFLAG3		BIT(3) | ||||
| #define TCU_TFCR_FFLAG2		BIT(2) | ||||
| #define TCU_TFCR_FFLAG1		BIT(1) | ||||
| #define TCU_TFCR_FFLAG0		BIT(0) | ||||
|  | ||||
| #define TCU_TMR_HMASK5		BIT(21) | ||||
| #define TCU_TMR_HMASK4		BIT(20) | ||||
| #define TCU_TMR_HMASK3		BIT(19) | ||||
| #define TCU_TMR_HMASK2		BIT(18) | ||||
| #define TCU_TMR_HMASK1		BIT(17) | ||||
| #define TCU_TMR_HMASK0		BIT(16) | ||||
| #define TCU_TMR_FMASK5		BIT(5) | ||||
| #define TCU_TMR_FMASK4		BIT(4) | ||||
| #define TCU_TMR_FMASK3		BIT(3) | ||||
| #define TCU_TMR_FMASK2		BIT(2) | ||||
| #define TCU_TMR_FMASK1		BIT(1) | ||||
| #define TCU_TMR_FMASK0		BIT(0) | ||||
|  | ||||
| #define TCU_TMSR_HMST5		BIT(21) | ||||
| #define TCU_TMSR_HMST4		BIT(20) | ||||
| #define TCU_TMSR_HMST3		BIT(19) | ||||
| #define TCU_TMSR_HMST2		BIT(18) | ||||
| #define TCU_TMSR_HMST1		BIT(17) | ||||
| #define TCU_TMSR_HMST0		BIT(16) | ||||
| #define TCU_TMSR_FMST5		BIT(5) | ||||
| #define TCU_TMSR_FMST4		BIT(4) | ||||
| #define TCU_TMSR_FMST3		BIT(3) | ||||
| #define TCU_TMSR_FMST2		BIT(2) | ||||
| #define TCU_TMSR_FMST1		BIT(1) | ||||
| #define TCU_TMSR_FMST0		BIT(0) | ||||
|  | ||||
| #define TCU_TMCR_HMCL5		BIT(21) | ||||
| #define TCU_TMCR_HMCL4		BIT(20) | ||||
| #define TCU_TMCR_HMCL3		BIT(19) | ||||
| #define TCU_TMCR_HMCL2		BIT(18) | ||||
| #define TCU_TMCR_HMCL1		BIT(17) | ||||
| #define TCU_TMCR_HMCL0		BIT(16) | ||||
| #define TCU_TMCR_FMCL5		BIT(5) | ||||
| #define TCU_TMCR_FMCL4		BIT(4) | ||||
| #define TCU_TMCR_FMCL3		BIT(3) | ||||
| #define TCU_TMCR_FMCL2		BIT(2) | ||||
| #define TCU_TMCR_FMCL1		BIT(1) | ||||
| #define TCU_TMCR_FMCL0		BIT(0) | ||||
|  | ||||
| #define TCU_TSR_WDTS		BIT(16) | ||||
| #define TCU_TSR_STOP5		BIT(5) | ||||
| #define TCU_TSR_STOP4		BIT(4) | ||||
| #define TCU_TSR_STOP3		BIT(3) | ||||
| #define TCU_TSR_STOP2		BIT(2) | ||||
| #define TCU_TSR_STOP1		BIT(1) | ||||
| #define TCU_TSR_STOP0		BIT(0) | ||||
|  | ||||
| #define TCU_TSSR_WDTSS		BIT(16) | ||||
| #define TCU_TSSR_STPS5		BIT(5) | ||||
| #define TCU_TSSR_STPS4		BIT(4) | ||||
| #define TCU_TSSR_STPS3		BIT(3) | ||||
| #define TCU_TSSR_STPS2		BIT(2) | ||||
| #define TCU_TSSR_STPS1		BIT(1) | ||||
| #define TCU_TSSR_STPS0		BIT(0) | ||||
|  | ||||
| #define TCU_TSSR_WDTSC		BIT(16) | ||||
| #define TCU_TSSR_STPC5		BIT(5) | ||||
| #define TCU_TSSR_STPC4		BIT(4) | ||||
| #define TCU_TSSR_STPC3		BIT(3) | ||||
| #define TCU_TSSR_STPC2		BIT(2) | ||||
| #define TCU_TSSR_STPC1		BIT(1) | ||||
| #define TCU_TSSR_STPC0		BIT(0) | ||||
|  | ||||
| #define TER_OSTEN		BIT(15) | ||||
|  | ||||
| #define OSTCSR_CNT_MD		BIT(15) | ||||
| #define OSTCSR_SD		BIT(9) | ||||
| #define OSTCSR_PRESCALE_16	(0x2 << 3) | ||||
| #define OSTCSR_EXT_EN		BIT(2) | ||||
|  | ||||
| int timer_init(void) | ||||
| { | ||||
| 	void __iomem *regs = (void __iomem *)TCU_BASE; | ||||
|  | ||||
| 	writel(OSTCSR_SD, regs + TCU_OSTCSR); | ||||
| 	reset_timer(); | ||||
| 	writel(OSTCSR_CNT_MD | OSTCSR_EXT_EN | OSTCSR_PRESCALE_16, | ||||
| 	       regs + TCU_OSTCSR); | ||||
| 	writew(TER_OSTEN, regs + TCU_TESR); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void reset_timer(void) | ||||
| { | ||||
| 	void __iomem *regs = (void __iomem *)TCU_BASE; | ||||
|  | ||||
| 	writel(0, regs + TCU_OSTCNTH); | ||||
| 	writel(0, regs + TCU_OSTCNTL); | ||||
| } | ||||
|  | ||||
| static u64 get_timer64(void) | ||||
| { | ||||
| 	void __iomem *regs = (void __iomem *)TCU_BASE; | ||||
| 	u32 low = readl(regs + TCU_OSTCNTL); | ||||
| 	u32 high = readl(regs + TCU_OSTCNTHBUF); | ||||
|  | ||||
| 	return ((u64)high << 32) | low; | ||||
| } | ||||
|  | ||||
| ulong get_timer(ulong base) | ||||
| { | ||||
| 	return lldiv(get_timer64(), 3000) - base; | ||||
| } | ||||
|  | ||||
| void __udelay(unsigned long usec) | ||||
| { | ||||
| 	/* OST count increments at 3MHz */ | ||||
| 	u64 end = get_timer64() + ((u64)usec * 3); | ||||
|  | ||||
| 	while (get_timer64() < end) | ||||
| 		; | ||||
| } | ||||
|  | ||||
| unsigned long long get_ticks(void) | ||||
| { | ||||
| 	return get_timer64(); | ||||
| } | ||||
|  | ||||
| void jz4780_tcu_wdt_start(void) | ||||
| { | ||||
| 	void __iomem *tcu_regs = (void __iomem *)TCU_BASE; | ||||
|  | ||||
| 	/* Enable WDT clock */ | ||||
| 	writel(TCU_TSSR_WDTSC, tcu_regs + TCU_TSCR); | ||||
| } | ||||
							
								
								
									
										50
									
								
								arch/mips/mach-jz47xx/jz4780/u-boot-spl.lds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								arch/mips/mach-jz47xx/jz4780/u-boot-spl.lds
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0+ */ | ||||
|  | ||||
| MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,\ | ||||
| 		LENGTH = CONFIG_SPL_MAX_SIZE } | ||||
| MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, \ | ||||
| 		LENGTH = CONFIG_SPL_BSS_MAX_SIZE } | ||||
|  | ||||
| OUTPUT_ARCH(mips) | ||||
| ENTRY(_start) | ||||
| SECTIONS | ||||
| { | ||||
| 	.text : | ||||
| 	{ | ||||
| 		__image_copy_start = .; | ||||
| 		arch/mips/mach-jz47xx/start.o	(.text*) | ||||
| 		*(.text*) | ||||
| 	} >.sram | ||||
|  | ||||
| 	. = ALIGN(4); | ||||
| 	.rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } >.sram | ||||
|  | ||||
| 	. = ALIGN(4); | ||||
| 	.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram | ||||
|  | ||||
| 	. = ALIGN(4); | ||||
| 	__image_copy_end = .; | ||||
|  | ||||
| 	.bss : { | ||||
| 		. = ALIGN(4); | ||||
| 		__bss_start = .; | ||||
| 		*(.sbss.*) | ||||
| 		*(.bss.*) | ||||
| 		*(COMMON) | ||||
| 		. = ALIGN(4); | ||||
| 		__bss_end = .; | ||||
| 	} >.sdram | ||||
|  | ||||
| 	/DISCARD/ : { | ||||
| 		*(.dynbss) | ||||
| 		*(.dynstr) | ||||
| 		*(.dynamic) | ||||
| 		*(.interp) | ||||
| 		*(.hash) | ||||
| 		*(.gnu.*) | ||||
| 		*(.plt) | ||||
| 		*(.got.plt) | ||||
| 		*(.rel.plt) | ||||
| 		*(.rel.dyn) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										98
									
								
								arch/mips/mach-jz47xx/start.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								arch/mips/mach-jz47xx/start.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  *  Startup Code for MIPS32 XBURST CPU-core | ||||
|  * | ||||
|  *  Copyright (c) 2010 Xiangfu Liu <xiangfu@sharism.cc> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
| #include <asm/regdef.h> | ||||
| #include <asm/mipsregs.h> | ||||
| #include <asm/addrspace.h> | ||||
| #include <asm/cacheops.h> | ||||
| #include <asm/cache.h> | ||||
| #include <mach/jz4780.h> | ||||
|  | ||||
| 	.set noreorder | ||||
|  | ||||
| 	.globl _start | ||||
| 	.text | ||||
| _start: | ||||
| #ifdef CONFIG_SPL_BUILD | ||||
|  | ||||
| 	/* magic value ("MSPL") */ | ||||
| 	.word 0x4d53504c | ||||
|  | ||||
| 	/* Invalidate BTB */ | ||||
| 	mfc0	t0, CP0_CONFIG, 7 | ||||
| 	nop | ||||
| 	ori	t0, 2 | ||||
| 	mtc0	t0, CP0_CONFIG, 7 | ||||
| 	nop | ||||
|  | ||||
| 	/* | ||||
| 	 * CU0=UM=EXL=IE=0, BEV=ERL=1, IP2~7=1 | ||||
| 	 */ | ||||
| 	li	t0, 0x0040FC04 | ||||
| 	mtc0	t0, CP0_STATUS | ||||
|  | ||||
| 	/* CAUSE register */ | ||||
| 	/* IV=1, use the specical interrupt vector (0x200) */ | ||||
| 	li	t1, 0x00800000 | ||||
| 	mtc0	t1, CP0_CAUSE | ||||
|  | ||||
| #ifdef CONFIG_SOC_JZ4780 | ||||
| 	/* enable bridge radical mode */ | ||||
| 	la	t0, CPM_BASE | ||||
| 	lw	t1, 0x24(t0) | ||||
| 	ori	t1, t1, 0x22 | ||||
| 	sw	t1, 0x24(t0) | ||||
| #endif | ||||
|  | ||||
| 	/* Set up stack */ | ||||
| 	li	sp, CONFIG_SPL_STACK | ||||
|  | ||||
| 	b		board_init_f | ||||
| 	 nop | ||||
|  | ||||
| #ifdef CONFIG_SOC_JZ4780 | ||||
|  | ||||
| 	.globl enable_caches | ||||
| 	.ent enable_caches | ||||
| enable_caches: | ||||
| 	mtc0	zero, CP0_TAGLO | ||||
| 	mtc0	zero, CP0_TAGHI | ||||
|  | ||||
| 	li	t0, KSEG0 | ||||
| 	addu	t1, t0, CONFIG_SYS_DCACHE_SIZE | ||||
| 1: | ||||
| 	cache	INDEX_STORE_TAG_D, 0(t0) | ||||
| 	bne	t0, t1, 1b | ||||
| 	addiu	t0, t0, CONFIG_SYS_CACHELINE_SIZE | ||||
|  | ||||
| 	li	t0, KSEG0 | ||||
| 	addu	t1, t0, CONFIG_SYS_ICACHE_SIZE | ||||
| 2: | ||||
| 	cache	INDEX_STORE_TAG_I, 0(t0) | ||||
| 	bne	t0, t1, 2b | ||||
| 	addiu	t0, t0, CONFIG_SYS_CACHELINE_SIZE | ||||
|  | ||||
| 	/* Invalidate BTB */ | ||||
| 	mfc0	t0, CP0_CONFIG, 7 | ||||
| 	nop | ||||
| 	ori	t0, 2 | ||||
| 	mtc0	t0, CP0_CONFIG, 7 | ||||
| 	nop | ||||
|  | ||||
| 	/* Enable caches */ | ||||
| 	li	t0, CONF_CM_CACHABLE_NONCOHERENT | ||||
| 	mtc0	t0, CP0_CONFIG | ||||
| 	nop | ||||
|  | ||||
| 	jr	ra | ||||
| 	 nop | ||||
|  | ||||
| 	.end enable_caches | ||||
|  | ||||
| #endif /* CONFIG_SOC_JZ4780 */ | ||||
| #endif /* !CONFIG_SPL_BUILD */ | ||||
							
								
								
									
										89
									
								
								include/dt-bindings/clock/jz4780-cgu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								include/dt-bindings/clock/jz4780-cgu.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0+ */ | ||||
| /* | ||||
|  * This header provides clock numbers for the ingenic,jz4780-cgu DT binding. | ||||
|  * | ||||
|  * They are roughly ordered as: | ||||
|  *   - external clocks | ||||
|  *   - PLLs | ||||
|  *   - muxes/dividers in the order they appear in the jz4780 programmers manual | ||||
|  *   - gates in order of their bit in the CLKGR* registers | ||||
|  */ | ||||
|  | ||||
| #ifndef __DT_BINDINGS_CLOCK_JZ4780_CGU_H__ | ||||
| #define __DT_BINDINGS_CLOCK_JZ4780_CGU_H__ | ||||
|  | ||||
| #define JZ4780_CLK_EXCLK	0 | ||||
| #define JZ4780_CLK_RTCLK	1 | ||||
| #define JZ4780_CLK_APLL		2 | ||||
| #define JZ4780_CLK_MPLL		3 | ||||
| #define JZ4780_CLK_EPLL		4 | ||||
| #define JZ4780_CLK_VPLL		5 | ||||
| #define JZ4780_CLK_OTGPHY	6 | ||||
| #define JZ4780_CLK_SCLKA	7 | ||||
| #define JZ4780_CLK_CPUMUX	8 | ||||
| #define JZ4780_CLK_CPU		9 | ||||
| #define JZ4780_CLK_L2CACHE	10 | ||||
| #define JZ4780_CLK_AHB0		11 | ||||
| #define JZ4780_CLK_AHB2PMUX	12 | ||||
| #define JZ4780_CLK_AHB2		13 | ||||
| #define JZ4780_CLK_PCLK		14 | ||||
| #define JZ4780_CLK_DDR		15 | ||||
| #define JZ4780_CLK_VPU		16 | ||||
| #define JZ4780_CLK_I2SPLL	17 | ||||
| #define JZ4780_CLK_I2S		18 | ||||
| #define JZ4780_CLK_LCD0PIXCLK	19 | ||||
| #define JZ4780_CLK_LCD1PIXCLK	20 | ||||
| #define JZ4780_CLK_MSCMUX	21 | ||||
| #define JZ4780_CLK_MSC0		22 | ||||
| #define JZ4780_CLK_MSC1		23 | ||||
| #define JZ4780_CLK_MSC2		24 | ||||
| #define JZ4780_CLK_UHC		25 | ||||
| #define JZ4780_CLK_SSIPLL	26 | ||||
| #define JZ4780_CLK_SSI		27 | ||||
| #define JZ4780_CLK_CIMMCLK	28 | ||||
| #define JZ4780_CLK_PCMPLL	29 | ||||
| #define JZ4780_CLK_PCM		30 | ||||
| #define JZ4780_CLK_GPU		31 | ||||
| #define JZ4780_CLK_HDMI		32 | ||||
| #define JZ4780_CLK_BCH		33 | ||||
| #define JZ4780_CLK_NEMC		34 | ||||
| #define JZ4780_CLK_OTG0		35 | ||||
| #define JZ4780_CLK_SSI0		36 | ||||
| #define JZ4780_CLK_SMB0		37 | ||||
| #define JZ4780_CLK_SMB1		38 | ||||
| #define JZ4780_CLK_SCC		39 | ||||
| #define JZ4780_CLK_AIC		40 | ||||
| #define JZ4780_CLK_TSSI0	41 | ||||
| #define JZ4780_CLK_OWI		42 | ||||
| #define JZ4780_CLK_KBC		43 | ||||
| #define JZ4780_CLK_SADC		44 | ||||
| #define JZ4780_CLK_UART0	45 | ||||
| #define JZ4780_CLK_UART1	46 | ||||
| #define JZ4780_CLK_UART2	47 | ||||
| #define JZ4780_CLK_UART3	48 | ||||
| #define JZ4780_CLK_SSI1		49 | ||||
| #define JZ4780_CLK_SSI2		50 | ||||
| #define JZ4780_CLK_PDMA		51 | ||||
| #define JZ4780_CLK_GPS		52 | ||||
| #define JZ4780_CLK_MAC		53 | ||||
| #define JZ4780_CLK_SMB2		54 | ||||
| #define JZ4780_CLK_CIM		55 | ||||
| #define JZ4780_CLK_LCD		56 | ||||
| #define JZ4780_CLK_TVE		57 | ||||
| #define JZ4780_CLK_IPU		58 | ||||
| #define JZ4780_CLK_DDR0		59 | ||||
| #define JZ4780_CLK_DDR1		60 | ||||
| #define JZ4780_CLK_SMB3		61 | ||||
| #define JZ4780_CLK_TSSI1	62 | ||||
| #define JZ4780_CLK_COMPRESS	63 | ||||
| #define JZ4780_CLK_AIC1		64 | ||||
| #define JZ4780_CLK_GPVLC	65 | ||||
| #define JZ4780_CLK_OTG1		66 | ||||
| #define JZ4780_CLK_UART4	67 | ||||
| #define JZ4780_CLK_AHBMON	68 | ||||
| #define JZ4780_CLK_SMB4		69 | ||||
| #define JZ4780_CLK_DES		70 | ||||
| #define JZ4780_CLK_X2D		71 | ||||
| #define JZ4780_CLK_CORE1	72 | ||||
|  | ||||
| #endif /* __DT_BINDINGS_CLOCK_JZ4780_CGU_H__ */ | ||||
		Reference in New Issue
	
	Block a user