forked from mirrors/linux
		
	ARM: cns3xxx: remove entire platform
cns3xxx was marked as unused a while ago, and gets removed entirely now. Acked-by: Krzysztof Hałasa <khalasa@piap.pl> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
		
							parent
							
								
									2b843f82a1
								
							
						
					
					
						commit
						e73307b9eb
					
				
					 17 changed files with 0 additions and 1973 deletions
				
			
		|  | @ -2048,11 +2048,6 @@ F:	arch/arm/boot/dts/ecx-*.dts* | ||||||
| F:	arch/arm/boot/dts/highbank.dts | F:	arch/arm/boot/dts/highbank.dts | ||||||
| F:	arch/arm/mach-highbank/ | F:	arch/arm/mach-highbank/ | ||||||
| 
 | 
 | ||||||
| ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT |  | ||||||
| M:	Krzysztof Halasa <khalasa@piap.pl> |  | ||||||
| S:	Maintained |  | ||||||
| F:	arch/arm/mach-cns3xxx/ |  | ||||||
| 
 |  | ||||||
| ARM/CAVIUM THUNDER NETWORK DRIVER | ARM/CAVIUM THUNDER NETWORK DRIVER | ||||||
| M:	Sunil Goutham <sgoutham@marvell.com> | M:	Sunil Goutham <sgoutham@marvell.com> | ||||||
| L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||||
|  |  | ||||||
|  | @ -438,8 +438,6 @@ source "arch/arm/mach-berlin/Kconfig" | ||||||
| 
 | 
 | ||||||
| source "arch/arm/mach-clps711x/Kconfig" | source "arch/arm/mach-clps711x/Kconfig" | ||||||
| 
 | 
 | ||||||
| source "arch/arm/mach-cns3xxx/Kconfig" |  | ||||||
| 
 |  | ||||||
| source "arch/arm/mach-davinci/Kconfig" | source "arch/arm/mach-davinci/Kconfig" | ||||||
| 
 | 
 | ||||||
| source "arch/arm/mach-digicolor/Kconfig" | source "arch/arm/mach-digicolor/Kconfig" | ||||||
|  |  | ||||||
|  | @ -307,14 +307,6 @@ choice | ||||||
| 		  Say Y here if you want the debug print routines to direct | 		  Say Y here if you want the debug print routines to direct | ||||||
| 		  their output to the second serial port on these devices. | 		  their output to the second serial port on these devices. | ||||||
| 
 | 
 | ||||||
| 	config DEBUG_CNS3XXX |  | ||||||
| 		bool "Kernel Kernel low-level debugging on Cavium Networks CNS3xxx" |  | ||||||
| 		depends on ARCH_CNS3XXX |  | ||||||
| 		select DEBUG_UART_8250 |  | ||||||
| 		help |  | ||||||
| 		  Say Y here if you want the debug print routines to direct |  | ||||||
|                   their output to the CNS3xxx UART0. |  | ||||||
| 
 |  | ||||||
| 	config DEBUG_DAVINCI_DA8XX_UART1 | 	config DEBUG_DAVINCI_DA8XX_UART1 | ||||||
| 		bool "Kernel low-level debugging on DaVinci DA8XX using UART1" | 		bool "Kernel low-level debugging on DaVinci DA8XX using UART1" | ||||||
| 		depends on ARCH_DAVINCI_DA8XX | 		depends on ARCH_DAVINCI_DA8XX | ||||||
|  | @ -1685,7 +1677,6 @@ config DEBUG_UART_PHYS | ||||||
| 				DEBUG_S3C2410_UART1) | 				DEBUG_S3C2410_UART1) | ||||||
| 	default 0x50008000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART2 || \ | 	default 0x50008000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART2 || \ | ||||||
| 				DEBUG_S3C2410_UART2) | 				DEBUG_S3C2410_UART2) | ||||||
| 	default 0x78000000 if DEBUG_CNS3XXX |  | ||||||
| 	default 0x7c0003f8 if DEBUG_FOOTBRIDGE_COM1 | 	default 0x7c0003f8 if DEBUG_FOOTBRIDGE_COM1 | ||||||
| 	default 0x7f005000 if DEBUG_S3C64XX_UART && DEBUG_S3C_UART0 | 	default 0x7f005000 if DEBUG_S3C64XX_UART && DEBUG_S3C_UART0 | ||||||
| 	default 0x7f005400 if DEBUG_S3C64XX_UART && DEBUG_S3C_UART1 | 	default 0x7f005400 if DEBUG_S3C64XX_UART && DEBUG_S3C_UART1 | ||||||
|  | @ -1818,7 +1809,6 @@ config DEBUG_UART_VIRT | ||||||
| 				DEBUG_OMAP4UART2 || DEBUG_OMAP5UART2 | 				DEBUG_OMAP4UART2 || DEBUG_OMAP5UART2 | ||||||
| 	default 0xfa06e000 if DEBUG_OMAP2UART3 || DEBUG_OMAP4UART4 | 	default 0xfa06e000 if DEBUG_OMAP2UART3 || DEBUG_OMAP4UART4 | ||||||
| 	default 0xfa71e000 if DEBUG_QCOM_UARTDM | 	default 0xfa71e000 if DEBUG_QCOM_UARTDM | ||||||
| 	default 0xfb002000 if DEBUG_CNS3XXX |  | ||||||
| 	default 0xfb009000 if DEBUG_REALVIEW_STD_PORT | 	default 0xfb009000 if DEBUG_REALVIEW_STD_PORT | ||||||
| 	default 0xfb00c000 if DEBUG_AT91_SAMA5D4_USART3 | 	default 0xfb00c000 if DEBUG_AT91_SAMA5D4_USART3 | ||||||
| 	default 0xfb020000 if DEBUG_OMAP3UART3 | 	default 0xfb020000 if DEBUG_OMAP3UART3 | ||||||
|  |  | ||||||
|  | @ -178,7 +178,6 @@ machine-$(CONFIG_ARCH_AXXIA)		+= axxia | ||||||
| machine-$(CONFIG_ARCH_BCM)		+= bcm | machine-$(CONFIG_ARCH_BCM)		+= bcm | ||||||
| machine-$(CONFIG_ARCH_BERLIN)		+= berlin | machine-$(CONFIG_ARCH_BERLIN)		+= berlin | ||||||
| machine-$(CONFIG_ARCH_CLPS711X)		+= clps711x | machine-$(CONFIG_ARCH_CLPS711X)		+= clps711x | ||||||
| machine-$(CONFIG_ARCH_CNS3XXX)		+= cns3xxx |  | ||||||
| machine-$(CONFIG_ARCH_DAVINCI)		+= davinci | machine-$(CONFIG_ARCH_DAVINCI)		+= davinci | ||||||
| machine-$(CONFIG_ARCH_DIGICOLOR)	+= digicolor | machine-$(CONFIG_ARCH_DIGICOLOR)	+= digicolor | ||||||
| machine-$(CONFIG_ARCH_DOVE)		+= dove | machine-$(CONFIG_ARCH_DOVE)		+= dove | ||||||
|  |  | ||||||
|  | @ -1,63 +0,0 @@ | ||||||
| # CONFIG_LOCALVERSION_AUTO is not set |  | ||||||
| CONFIG_SYSVIPC=y |  | ||||||
| CONFIG_IKCONFIG=y |  | ||||||
| CONFIG_IKCONFIG_PROC=y |  | ||||||
| CONFIG_LOG_BUF_SHIFT=14 |  | ||||||
| CONFIG_CGROUPS=y |  | ||||||
| CONFIG_SYSFS_DEPRECATED_V2=y |  | ||||||
| CONFIG_RELAY=y |  | ||||||
| CONFIG_BLK_DEV_INITRD=y |  | ||||||
| # CONFIG_PERF_EVENTS is not set |  | ||||||
| CONFIG_PROFILING=y |  | ||||||
| CONFIG_ARCH_MULTI_V6=y |  | ||||||
| CONFIG_ARCH_CNS3XXX=y |  | ||||||
| CONFIG_MACH_CNS3420VB=y |  | ||||||
| CONFIG_UNUSED_BOARD_FILES=y |  | ||||||
| CONFIG_CMDLINE="console=ttyS0,38400 mem=128M root=/dev/mmcblk0p1 ro rootwait" |  | ||||||
| CONFIG_MODULES=y |  | ||||||
| CONFIG_MODULE_UNLOAD=y |  | ||||||
| CONFIG_MODULE_FORCE_UNLOAD=y |  | ||||||
| CONFIG_MODVERSIONS=y |  | ||||||
| CONFIG_IOSCHED_BFQ=m |  | ||||||
| #CONFIG_ARCH_MULTI_V7 is not set |  | ||||||
| CONFIG_DEBUG_CNS3XXX=y |  | ||||||
| CONFIG_AEABI=y |  | ||||||
| # CONFIG_SWAP is not set |  | ||||||
| CONFIG_SLAB=y |  | ||||||
| CONFIG_MTD=y |  | ||||||
| CONFIG_MTD_CMDLINE_PARTS=y |  | ||||||
| CONFIG_MTD_BLOCK=y |  | ||||||
| CONFIG_MTD_CFI=y |  | ||||||
| CONFIG_MTD_CFI_AMDSTD=y |  | ||||||
| CONFIG_MTD_PHYSMAP=y |  | ||||||
| CONFIG_BLK_DEV_LOOP=y |  | ||||||
| CONFIG_BLK_DEV_RAM=y |  | ||||||
| CONFIG_BLK_DEV_RAM_SIZE=20000 |  | ||||||
| CONFIG_BLK_DEV_SD=y |  | ||||||
| # CONFIG_BLK_DEV_BSG is not set |  | ||||||
| CONFIG_ATA=y |  | ||||||
| # CONFIG_SATA_PMP is not set |  | ||||||
| # CONFIG_ATA_SFF is not set |  | ||||||
| # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |  | ||||||
| # CONFIG_INPUT_KEYBOARD is not set |  | ||||||
| # CONFIG_INPUT_MOUSE is not set |  | ||||||
| # CONFIG_SERIO is not set |  | ||||||
| CONFIG_LEGACY_PTY_COUNT=16 |  | ||||||
| CONFIG_SERIAL_8250=y |  | ||||||
| CONFIG_SERIAL_8250_CONSOLE=y |  | ||||||
| # CONFIG_HW_RANDOM is not set |  | ||||||
| # CONFIG_HWMON is not set |  | ||||||
| # CONFIG_VGA_CONSOLE is not set |  | ||||||
| # CONFIG_USB_SUPPORT is not set |  | ||||||
| CONFIG_MMC=y |  | ||||||
| CONFIG_MMC_SDHCI=y |  | ||||||
| CONFIG_MMC_SDHCI_PLTFM=y |  | ||||||
| CONFIG_EXT2_FS=y |  | ||||||
| CONFIG_EXT2_FS_XATTR=y |  | ||||||
| CONFIG_AUTOFS4_FS=y |  | ||||||
| CONFIG_FSCACHE=y |  | ||||||
| CONFIG_TMPFS=y |  | ||||||
| # CONFIG_ENABLE_MUST_CHECK is not set |  | ||||||
| # CONFIG_ARM_UNWIND is not set |  | ||||||
| CONFIG_CRC_CCITT=y |  | ||||||
| CONFIG_DEBUG_FS=y |  | ||||||
|  | @ -1,21 +0,0 @@ | ||||||
| # SPDX-License-Identifier: GPL-2.0 |  | ||||||
| menuconfig ARCH_CNS3XXX |  | ||||||
| 	bool "Cavium Networks CNS3XXX family" |  | ||||||
| 	depends on ARCH_MULTI_V6 |  | ||||||
| 	depends on ATAGS && UNUSED_BOARD_FILES |  | ||||||
| 	select ARM_GIC |  | ||||||
| 	help |  | ||||||
| 	  Support for Cavium Networks CNS3XXX platform. |  | ||||||
| 
 |  | ||||||
| if ARCH_CNS3XXX |  | ||||||
| 
 |  | ||||||
| config MACH_CNS3420VB |  | ||||||
| 	bool "Support for CNS3420 Validation Board" |  | ||||||
| 	depends on ATAGS |  | ||||||
| 	help |  | ||||||
| 	  Include support for the Cavium Networks CNS3420 MPCore Platform |  | ||||||
| 	  Baseboard. |  | ||||||
| 	  This is a platform with an on-board ARM11 MPCore and has support |  | ||||||
| 	  for USB, USB-OTG, MMC/SD/SDIO, SATA, PCI-E, etc. |  | ||||||
| 
 |  | ||||||
| endif |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| # SPDX-License-Identifier: GPL-2.0
 |  | ||||||
| obj-$(CONFIG_ARCH_CNS3XXX)		+= cns3xxx.o |  | ||||||
| cns3xxx-y				+= core.o pm.o |  | ||||||
| cns3xxx-$(CONFIG_ATAGS)			+= devices.o |  | ||||||
| cns3xxx-$(CONFIG_PCI)			+= pcie.o |  | ||||||
| cns3xxx-$(CONFIG_MACH_CNS3420VB)	+= cns3420vb.o |  | ||||||
|  | @ -1,252 +0,0 @@ | ||||||
| // SPDX-License-Identifier: GPL-2.0-only
 |  | ||||||
| /*
 |  | ||||||
|  * Cavium Networks CNS3420 Validation Board |  | ||||||
|  * |  | ||||||
|  * Copyright 2000 Deep Blue Solutions Ltd |  | ||||||
|  * Copyright 2008 ARM Limited |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  *		  Scott Shu |  | ||||||
|  * Copyright 2010 MontaVista Software, LLC. |  | ||||||
|  *		  Anton Vorontsov <avorontsov@mvista.com> |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <linux/init.h> |  | ||||||
| #include <linux/kernel.h> |  | ||||||
| #include <linux/compiler.h> |  | ||||||
| #include <linux/io.h> |  | ||||||
| #include <linux/dma-mapping.h> |  | ||||||
| #include <linux/serial_core.h> |  | ||||||
| #include <linux/serial_8250.h> |  | ||||||
| #include <linux/platform_device.h> |  | ||||||
| #include <linux/mtd/mtd.h> |  | ||||||
| #include <linux/mtd/physmap.h> |  | ||||||
| #include <linux/mtd/partitions.h> |  | ||||||
| #include <linux/usb/ehci_pdriver.h> |  | ||||||
| #include <linux/usb/ohci_pdriver.h> |  | ||||||
| #include <asm/setup.h> |  | ||||||
| #include <asm/mach-types.h> |  | ||||||
| #include <asm/mach/arch.h> |  | ||||||
| #include <asm/mach/map.h> |  | ||||||
| #include <asm/mach/time.h> |  | ||||||
| #include "cns3xxx.h" |  | ||||||
| #include "pm.h" |  | ||||||
| #include "core.h" |  | ||||||
| #include "devices.h" |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * NOR Flash |  | ||||||
|  */ |  | ||||||
| static struct mtd_partition cns3420_nor_partitions[] = { |  | ||||||
| 	{ |  | ||||||
| 		.name		= "uboot", |  | ||||||
| 		.size		= 0x00040000, |  | ||||||
| 		.offset		= 0, |  | ||||||
| 		.mask_flags	= MTD_WRITEABLE, |  | ||||||
| 	}, { |  | ||||||
| 		.name		= "kernel", |  | ||||||
| 		.size		= 0x004C0000, |  | ||||||
| 		.offset		= MTDPART_OFS_APPEND, |  | ||||||
| 	}, { |  | ||||||
| 		.name		= "filesystem", |  | ||||||
| 		.size		= 0x7000000, |  | ||||||
| 		.offset		= MTDPART_OFS_APPEND, |  | ||||||
| 	}, { |  | ||||||
| 		.name		= "filesystem2", |  | ||||||
| 		.size		= 0x0AE0000, |  | ||||||
| 		.offset		= MTDPART_OFS_APPEND, |  | ||||||
| 	}, { |  | ||||||
| 		.name		= "ubootenv", |  | ||||||
| 		.size		= MTDPART_SIZ_FULL, |  | ||||||
| 		.offset		= MTDPART_OFS_APPEND, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct physmap_flash_data cns3420_nor_pdata = { |  | ||||||
| 	.width = 2, |  | ||||||
| 	.parts = cns3420_nor_partitions, |  | ||||||
| 	.nr_parts = ARRAY_SIZE(cns3420_nor_partitions), |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct resource cns3420_nor_res = { |  | ||||||
| 	.start = CNS3XXX_FLASH_BASE, |  | ||||||
| 	.end = CNS3XXX_FLASH_BASE + SZ_128M - 1, |  | ||||||
| 	.flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct platform_device cns3420_nor_pdev = { |  | ||||||
| 	.name = "physmap-flash", |  | ||||||
| 	.id = 0, |  | ||||||
| 	.resource = &cns3420_nor_res, |  | ||||||
| 	.num_resources = 1, |  | ||||||
| 	.dev = { |  | ||||||
| 		.platform_data = &cns3420_nor_pdata, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * UART |  | ||||||
|  */ |  | ||||||
| static void __init cns3420_early_serial_setup(void) |  | ||||||
| { |  | ||||||
| #ifdef CONFIG_SERIAL_8250_CONSOLE |  | ||||||
| 	static struct uart_port cns3420_serial_port = { |  | ||||||
| 		.membase        = (void __iomem *)CNS3XXX_UART0_BASE_VIRT, |  | ||||||
| 		.mapbase        = CNS3XXX_UART0_BASE, |  | ||||||
| 		.irq            = IRQ_CNS3XXX_UART0, |  | ||||||
| 		.iotype         = UPIO_MEM, |  | ||||||
| 		.flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE, |  | ||||||
| 		.regshift       = 2, |  | ||||||
| 		.uartclk        = 24000000, |  | ||||||
| 		.line           = 0, |  | ||||||
| 		.type           = PORT_16550A, |  | ||||||
| 		.fifosize       = 16, |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	early_serial_setup(&cns3420_serial_port); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * USB |  | ||||||
|  */ |  | ||||||
| static struct resource cns3xxx_usb_ehci_resources[] = { |  | ||||||
| 	[0] = { |  | ||||||
| 		.start = CNS3XXX_USB_BASE, |  | ||||||
| 		.end   = CNS3XXX_USB_BASE + SZ_16M - 1, |  | ||||||
| 		.flags = IORESOURCE_MEM, |  | ||||||
| 	}, |  | ||||||
| 	[1] = { |  | ||||||
| 		.start = IRQ_CNS3XXX_USB_EHCI, |  | ||||||
| 		.flags = IORESOURCE_IRQ, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static u64 cns3xxx_usb_ehci_dma_mask = DMA_BIT_MASK(32); |  | ||||||
| 
 |  | ||||||
| static int csn3xxx_usb_power_on(struct platform_device *pdev) |  | ||||||
| { |  | ||||||
| 	/*
 |  | ||||||
| 	 * EHCI and OHCI share the same clock and power, |  | ||||||
| 	 * resetting twice would cause the 1st controller been reset. |  | ||||||
| 	 * Therefore only do power up  at the first up device, and |  | ||||||
| 	 * power down at the last down device. |  | ||||||
| 	 * |  | ||||||
| 	 * Set USB AHB INCR length to 16 |  | ||||||
| 	 */ |  | ||||||
| 	if (atomic_inc_return(&usb_pwr_ref) == 1) { |  | ||||||
| 		cns3xxx_pwr_power_up(1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB); |  | ||||||
| 		cns3xxx_pwr_clk_en(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); |  | ||||||
| 		cns3xxx_pwr_soft_rst(1 << PM_SOFT_RST_REG_OFFST_USB_HOST); |  | ||||||
| 		__raw_writel((__raw_readl(MISC_CHIP_CONFIG_REG) | (0X2 << 24)), |  | ||||||
| 			MISC_CHIP_CONFIG_REG); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void csn3xxx_usb_power_off(struct platform_device *pdev) |  | ||||||
| { |  | ||||||
| 	/*
 |  | ||||||
| 	 * EHCI and OHCI share the same clock and power, |  | ||||||
| 	 * resetting twice would cause the 1st controller been reset. |  | ||||||
| 	 * Therefore only do power up  at the first up device, and |  | ||||||
| 	 * power down at the last down device. |  | ||||||
| 	 */ |  | ||||||
| 	if (atomic_dec_return(&usb_pwr_ref) == 0) |  | ||||||
| 		cns3xxx_pwr_clk_dis(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = { |  | ||||||
| 	.power_on	= csn3xxx_usb_power_on, |  | ||||||
| 	.power_off	= csn3xxx_usb_power_off, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct platform_device cns3xxx_usb_ehci_device = { |  | ||||||
| 	.name          = "ehci-platform", |  | ||||||
| 	.num_resources = ARRAY_SIZE(cns3xxx_usb_ehci_resources), |  | ||||||
| 	.resource      = cns3xxx_usb_ehci_resources, |  | ||||||
| 	.dev           = { |  | ||||||
| 		.dma_mask          = &cns3xxx_usb_ehci_dma_mask, |  | ||||||
| 		.coherent_dma_mask = DMA_BIT_MASK(32), |  | ||||||
| 		.platform_data     = &cns3xxx_usb_ehci_pdata, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct resource cns3xxx_usb_ohci_resources[] = { |  | ||||||
| 	[0] = { |  | ||||||
| 		.start = CNS3XXX_USB_OHCI_BASE, |  | ||||||
| 		.end   = CNS3XXX_USB_OHCI_BASE + SZ_16M - 1, |  | ||||||
| 		.flags = IORESOURCE_MEM, |  | ||||||
| 	}, |  | ||||||
| 	[1] = { |  | ||||||
| 		.start = IRQ_CNS3XXX_USB_OHCI, |  | ||||||
| 		.flags = IORESOURCE_IRQ, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static u64 cns3xxx_usb_ohci_dma_mask = DMA_BIT_MASK(32); |  | ||||||
| 
 |  | ||||||
| static struct usb_ohci_pdata cns3xxx_usb_ohci_pdata = { |  | ||||||
| 	.num_ports	= 1, |  | ||||||
| 	.power_on	= csn3xxx_usb_power_on, |  | ||||||
| 	.power_off	= csn3xxx_usb_power_off, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct platform_device cns3xxx_usb_ohci_device = { |  | ||||||
| 	.name          = "ohci-platform", |  | ||||||
| 	.num_resources = ARRAY_SIZE(cns3xxx_usb_ohci_resources), |  | ||||||
| 	.resource      = cns3xxx_usb_ohci_resources, |  | ||||||
| 	.dev           = { |  | ||||||
| 		.dma_mask          = &cns3xxx_usb_ohci_dma_mask, |  | ||||||
| 		.coherent_dma_mask = DMA_BIT_MASK(32), |  | ||||||
| 		.platform_data	   = &cns3xxx_usb_ohci_pdata, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Initialization |  | ||||||
|  */ |  | ||||||
| static struct platform_device *cns3420_pdevs[] __initdata = { |  | ||||||
| 	&cns3420_nor_pdev, |  | ||||||
| 	&cns3xxx_usb_ehci_device, |  | ||||||
| 	&cns3xxx_usb_ohci_device, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void __init cns3420_init(void) |  | ||||||
| { |  | ||||||
| 	cns3xxx_l2x0_init(); |  | ||||||
| 
 |  | ||||||
| 	platform_add_devices(cns3420_pdevs, ARRAY_SIZE(cns3420_pdevs)); |  | ||||||
| 
 |  | ||||||
| 	cns3xxx_ahci_init(); |  | ||||||
| 	cns3xxx_sdhci_init(); |  | ||||||
| 
 |  | ||||||
| 	pm_power_off = cns3xxx_power_off; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct map_desc cns3420_io_desc[] __initdata = { |  | ||||||
| 	{ |  | ||||||
| 		.virtual	= CNS3XXX_UART0_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_UART0_BASE), |  | ||||||
| 		.length		= SZ_4K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void __init cns3420_map_io(void) |  | ||||||
| { |  | ||||||
| 	cns3xxx_map_io(); |  | ||||||
| 	iotable_init(cns3420_io_desc, ARRAY_SIZE(cns3420_io_desc)); |  | ||||||
| 
 |  | ||||||
| 	cns3420_early_serial_setup(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board") |  | ||||||
| 	.atag_offset	= 0x100, |  | ||||||
| 	.map_io		= cns3420_map_io, |  | ||||||
| 	.init_irq	= cns3xxx_init_irq, |  | ||||||
| 	.init_time	= cns3xxx_timer_init, |  | ||||||
| 	.init_machine	= cns3420_init, |  | ||||||
| 	.init_late      = cns3xxx_pcie_init_late, |  | ||||||
| 	.restart	= cns3xxx_restart, |  | ||||||
| MACHINE_END |  | ||||||
|  | @ -1,593 +0,0 @@ | ||||||
| /* SPDX-License-Identifier: GPL-2.0-only */ |  | ||||||
| /*
 |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef __MACH_BOARD_CNS3XXXH |  | ||||||
| #define __MACH_BOARD_CNS3XXXH |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Memory map |  | ||||||
|  */ |  | ||||||
| #define CNS3XXX_FLASH_BASE			0x10000000	/* Flash/SRAM Memory Bank 0 */ |  | ||||||
| #define CNS3XXX_FLASH_SIZE			SZ_256M |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_DDR2SDRAM_BASE			0x20000000	/* DDR2 SDRAM Memory */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_SPI_FLASH_BASE			0x60000000	/* SPI Serial Flash Memory */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_SWITCH_BASE			0x70000000	/* Switch and HNAT Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PPE_BASE			0x70001000	/* HANT	*/ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_EMBEDDED_SRAM_BASE		0x70002000	/* HANT Embedded SRAM */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_SSP_BASE			0x71000000	/* Synchronous Serial Port - SPI/PCM/I2C */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_DMC_BASE			0x72000000	/* DMC Control (DDR2 SDRAM) */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_SMC_BASE			0x73000000	/* SMC Control */ |  | ||||||
| 
 |  | ||||||
| #define SMC_MEMC_STATUS_OFFSET			0x000 |  | ||||||
| #define SMC_MEMIF_CFG_OFFSET			0x004 |  | ||||||
| #define SMC_MEMC_CFG_SET_OFFSET			0x008 |  | ||||||
| #define SMC_MEMC_CFG_CLR_OFFSET			0x00C |  | ||||||
| #define SMC_DIRECT_CMD_OFFSET			0x010 |  | ||||||
| #define SMC_SET_CYCLES_OFFSET			0x014 |  | ||||||
| #define SMC_SET_OPMODE_OFFSET			0x018 |  | ||||||
| #define SMC_REFRESH_PERIOD_0_OFFSET		0x020 |  | ||||||
| #define SMC_REFRESH_PERIOD_1_OFFSET		0x024 |  | ||||||
| #define SMC_SRAM_CYCLES0_0_OFFSET		0x100 |  | ||||||
| #define SMC_NAND_CYCLES0_0_OFFSET		0x100 |  | ||||||
| #define SMC_OPMODE0_0_OFFSET			0x104 |  | ||||||
| #define SMC_SRAM_CYCLES0_1_OFFSET		0x120 |  | ||||||
| #define SMC_NAND_CYCLES0_1_OFFSET		0x120 |  | ||||||
| #define SMC_OPMODE0_1_OFFSET			0x124 |  | ||||||
| #define SMC_USER_STATUS_OFFSET			0x200 |  | ||||||
| #define SMC_USER_CONFIG_OFFSET			0x204 |  | ||||||
| #define SMC_ECC_STATUS_OFFSET			0x300 |  | ||||||
| #define SMC_ECC_MEMCFG_OFFSET			0x304 |  | ||||||
| #define SMC_ECC_MEMCOMMAND1_OFFSET		0x308 |  | ||||||
| #define SMC_ECC_MEMCOMMAND2_OFFSET		0x30C |  | ||||||
| #define SMC_ECC_ADDR0_OFFSET			0x310 |  | ||||||
| #define SMC_ECC_ADDR1_OFFSET			0x314 |  | ||||||
| #define SMC_ECC_VALUE0_OFFSET			0x318 |  | ||||||
| #define SMC_ECC_VALUE1_OFFSET			0x31C |  | ||||||
| #define SMC_ECC_VALUE2_OFFSET			0x320 |  | ||||||
| #define SMC_ECC_VALUE3_OFFSET			0x324 |  | ||||||
| #define SMC_PERIPH_ID_0_OFFSET			0xFE0 |  | ||||||
| #define SMC_PERIPH_ID_1_OFFSET			0xFE4 |  | ||||||
| #define SMC_PERIPH_ID_2_OFFSET			0xFE8 |  | ||||||
| #define SMC_PERIPH_ID_3_OFFSET			0xFEC |  | ||||||
| #define SMC_PCELL_ID_0_OFFSET			0xFF0 |  | ||||||
| #define SMC_PCELL_ID_1_OFFSET			0xFF4 |  | ||||||
| #define SMC_PCELL_ID_2_OFFSET			0xFF8 |  | ||||||
| #define SMC_PCELL_ID_3_OFFSET			0xFFC |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_GPIOA_BASE			0x74000000	/* GPIO port A */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_GPIOB_BASE			0x74800000	/* GPIO port B */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_RTC_BASE			0x75000000	/* Real Time Clock */ |  | ||||||
| 
 |  | ||||||
| #define RTC_SEC_OFFSET				0x00 |  | ||||||
| #define RTC_MIN_OFFSET				0x04 |  | ||||||
| #define RTC_HOUR_OFFSET				0x08 |  | ||||||
| #define RTC_DAY_OFFSET				0x0C |  | ||||||
| #define RTC_SEC_ALM_OFFSET			0x10 |  | ||||||
| #define RTC_MIN_ALM_OFFSET			0x14 |  | ||||||
| #define RTC_HOUR_ALM_OFFSET			0x18 |  | ||||||
| #define RTC_REC_OFFSET				0x1C |  | ||||||
| #define RTC_CTRL_OFFSET				0x20 |  | ||||||
| #define RTC_INTR_STS_OFFSET			0x34 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_MISC_BASE			0x76000000	/* Misc Control */ |  | ||||||
| #define CNS3XXX_MISC_BASE_VIRT			0xFB000000	/* Misc Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PM_BASE				0x77000000	/* Power Management Control */ |  | ||||||
| #define CNS3XXX_PM_BASE_VIRT			0xFB001000 |  | ||||||
| 
 |  | ||||||
| #define PM_CLK_GATE_OFFSET			0x00 |  | ||||||
| #define PM_SOFT_RST_OFFSET			0x04 |  | ||||||
| #define PM_HS_CFG_OFFSET			0x08 |  | ||||||
| #define PM_CACTIVE_STA_OFFSET			0x0C |  | ||||||
| #define PM_PWR_STA_OFFSET			0x10 |  | ||||||
| #define PM_SYS_CLK_CTRL_OFFSET			0x14 |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_OFFSET		0x18 |  | ||||||
| #define PM_PLL_HM_PD_OFFSET			0x1C |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_UART0_BASE			0x78000000	/* UART 0 */ |  | ||||||
| #define CNS3XXX_UART0_BASE_VIRT			0xFB002000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_UART1_BASE			0x78400000	/* UART 1 */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_UART2_BASE			0x78800000	/* UART 2 */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_DMAC_BASE			0x79000000	/* Generic DMA Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_CORESIGHT_BASE			0x7A000000	/* CoreSight */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_CRYPTO_BASE			0x7B000000	/* Crypto */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_I2S_BASE			0x7C000000	/* I2S */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_TIMER1_2_3_BASE			0x7C800000	/* Timer */ |  | ||||||
| #define CNS3XXX_TIMER1_2_3_BASE_VIRT		0xFB003000 |  | ||||||
| 
 |  | ||||||
| #define TIMER1_COUNTER_OFFSET			0x00 |  | ||||||
| #define TIMER1_AUTO_RELOAD_OFFSET		0x04 |  | ||||||
| #define TIMER1_MATCH_V1_OFFSET			0x08 |  | ||||||
| #define TIMER1_MATCH_V2_OFFSET			0x0C |  | ||||||
| 
 |  | ||||||
| #define TIMER2_COUNTER_OFFSET			0x10 |  | ||||||
| #define TIMER2_AUTO_RELOAD_OFFSET		0x14 |  | ||||||
| #define TIMER2_MATCH_V1_OFFSET			0x18 |  | ||||||
| #define TIMER2_MATCH_V2_OFFSET			0x1C |  | ||||||
| 
 |  | ||||||
| #define TIMER1_2_CONTROL_OFFSET			0x30 |  | ||||||
| #define TIMER1_2_INTERRUPT_STATUS_OFFSET	0x34 |  | ||||||
| #define TIMER1_2_INTERRUPT_MASK_OFFSET		0x38 |  | ||||||
| 
 |  | ||||||
| #define TIMER_FREERUN_OFFSET			0x40 |  | ||||||
| #define TIMER_FREERUN_CONTROL_OFFSET		0x44 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_HCIE_BASE			0x7D000000	/* HCIE Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_RAID_BASE			0x7E000000	/* RAID Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_AXI_IXC_BASE			0x7F000000	/* AXI IXC */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_CLCD_BASE			0x80000000	/* LCD Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_USBOTG_BASE			0x81000000	/* USB OTG Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_USB_BASE			0x82000000	/* USB Host Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_SATA2_BASE			0x83000000	/* SATA */ |  | ||||||
| #define CNS3XXX_SATA2_SIZE			SZ_16M |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_CAMERA_BASE			0x84000000	/* Camera Interface */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_SDIO_BASE			0x85000000	/* SDIO */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_I2S_TDM_BASE			0x86000000	/* I2S TDM */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_2DG_BASE			0x87000000	/* 2D Graphic Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_USB_OHCI_BASE			0x88000000	/* USB OHCI */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_L2C_BASE			0x92000000	/* L2 Cache Control */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE0_MEM_BASE			0xA0000000	/* PCIe Port 0 IO/Memory Space */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE0_HOST_BASE			0xAB000000	/* PCIe Port 0 RC Base */ |  | ||||||
| #define CNS3XXX_PCIE0_HOST_BASE_VIRT		0xE1000000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE0_IO_BASE			0xAC000000	/* PCIe Port 0 */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE0_CFG0_BASE			0xAD000000	/* PCIe Port 0 CFG Type 0 */ |  | ||||||
| #define CNS3XXX_PCIE0_CFG0_BASE_VIRT		0xE3000000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE0_CFG1_BASE			0xAE000000	/* PCIe Port 0 CFG Type 1 */ |  | ||||||
| #define CNS3XXX_PCIE0_CFG1_BASE_VIRT		0xE4000000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE0_MSG_BASE			0xAF000000	/* PCIe Port 0 Message Space */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE1_MEM_BASE			0xB0000000	/* PCIe Port 1 IO/Memory Space */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE1_HOST_BASE			0xBB000000	/* PCIe Port 1 RC Base */ |  | ||||||
| #define CNS3XXX_PCIE1_HOST_BASE_VIRT		0xE9000000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE1_IO_BASE			0xBC000000	/* PCIe Port 1 */ |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE1_CFG0_BASE			0xBD000000	/* PCIe Port 1 CFG Type 0 */ |  | ||||||
| #define CNS3XXX_PCIE1_CFG0_BASE_VIRT		0xEB000000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE1_CFG1_BASE			0xBE000000	/* PCIe Port 1 CFG Type 1 */ |  | ||||||
| #define CNS3XXX_PCIE1_CFG1_BASE_VIRT		0xEC000000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PCIE1_MSG_BASE			0xBF000000	/* PCIe Port 1 Message Space */ |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Testchip peripheral and fpga gic regions |  | ||||||
|  */ |  | ||||||
| #define CNS3XXX_TC11MP_SCU_BASE			0x90000000	/* IRQ, Test chip */ |  | ||||||
| #define CNS3XXX_TC11MP_SCU_BASE_VIRT		0xFB004000 |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_TC11MP_GIC_CPU_BASE		0x90000100	/* Test chip interrupt controller CPU interface */ |  | ||||||
| #define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT	(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x100) |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_TC11MP_TWD_BASE			0x90000600 |  | ||||||
| #define CNS3XXX_TC11MP_TWD_BASE_VIRT		(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x600) |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_TC11MP_GIC_DIST_BASE		0x90001000	/* Test chip interrupt controller distributor */ |  | ||||||
| #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT	(CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000) |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_TC11MP_L220_BASE		0x92002000	/* L220 registers */ |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Misc block |  | ||||||
|  */ |  | ||||||
| #define MISC_MEM_MAP(offs) (void __iomem *)(CNS3XXX_MISC_BASE_VIRT + (offs)) |  | ||||||
| 
 |  | ||||||
| #define MISC_MEMORY_REMAP_REG			MISC_MEM_MAP(0x00) |  | ||||||
| #define MISC_CHIP_CONFIG_REG			MISC_MEM_MAP(0x04) |  | ||||||
| #define MISC_DEBUG_PROBE_DATA_REG		MISC_MEM_MAP(0x08) |  | ||||||
| #define MISC_DEBUG_PROBE_SELECTION_REG		MISC_MEM_MAP(0x0C) |  | ||||||
| #define MISC_IO_PIN_FUNC_SELECTION_REG		MISC_MEM_MAP(0x10) |  | ||||||
| #define MISC_GPIOA_PIN_ENABLE_REG		MISC_MEM_MAP(0x14) |  | ||||||
| #define MISC_GPIOB_PIN_ENABLE_REG		MISC_MEM_MAP(0x18) |  | ||||||
| #define MISC_IO_PAD_DRIVE_STRENGTH_CTRL_A	MISC_MEM_MAP(0x1C) |  | ||||||
| #define MISC_IO_PAD_DRIVE_STRENGTH_CTRL_B	MISC_MEM_MAP(0x20) |  | ||||||
| #define MISC_GPIOA_15_0_PULL_CTRL_REG		MISC_MEM_MAP(0x24) |  | ||||||
| #define MISC_GPIOA_16_31_PULL_CTRL_REG		MISC_MEM_MAP(0x28) |  | ||||||
| #define MISC_GPIOB_15_0_PULL_CTRL_REG		MISC_MEM_MAP(0x2C) |  | ||||||
| #define MISC_GPIOB_16_31_PULL_CTRL_REG		MISC_MEM_MAP(0x30) |  | ||||||
| #define MISC_IO_PULL_CTRL_REG			MISC_MEM_MAP(0x34) |  | ||||||
| #define MISC_E_FUSE_31_0_REG			MISC_MEM_MAP(0x40) |  | ||||||
| #define MISC_E_FUSE_63_32_REG			MISC_MEM_MAP(0x44) |  | ||||||
| #define MISC_E_FUSE_95_64_REG			MISC_MEM_MAP(0x48) |  | ||||||
| #define MISC_E_FUSE_127_96_REG			MISC_MEM_MAP(0x4C) |  | ||||||
| #define MISC_SOFTWARE_TEST_1_REG		MISC_MEM_MAP(0x50) |  | ||||||
| #define MISC_SOFTWARE_TEST_2_REG		MISC_MEM_MAP(0x54) |  | ||||||
| 
 |  | ||||||
| #define MISC_SATA_POWER_MODE			MISC_MEM_MAP(0x310) |  | ||||||
| 
 |  | ||||||
| #define MISC_USB_CFG_REG			MISC_MEM_MAP(0x800) |  | ||||||
| #define MISC_USB_STS_REG			MISC_MEM_MAP(0x804) |  | ||||||
| #define MISC_USBPHY00_CFG_REG			MISC_MEM_MAP(0x808) |  | ||||||
| #define MISC_USBPHY01_CFG_REG			MISC_MEM_MAP(0x80c) |  | ||||||
| #define MISC_USBPHY10_CFG_REG			MISC_MEM_MAP(0x810) |  | ||||||
| #define MISC_USBPHY11_CFG_REG			MISC_MEM_MAP(0x814) |  | ||||||
| 
 |  | ||||||
| #define MISC_PCIEPHY_CMCTL(x)			MISC_MEM_MAP(0x900 + (x) * 0x004) |  | ||||||
| #define MISC_PCIEPHY_CTL(x)			MISC_MEM_MAP(0x940 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_AXIS_AWMISC(x)		MISC_MEM_MAP(0x944 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_AXIS_ARMISC(x)		MISC_MEM_MAP(0x948 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_AXIS_RMISC(x)			MISC_MEM_MAP(0x94C + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_AXIS_BMISC(x)			MISC_MEM_MAP(0x950 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_AXIM_RMISC(x)			MISC_MEM_MAP(0x954 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_AXIM_BMISC(x)			MISC_MEM_MAP(0x958 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_CTRL(x)			MISC_MEM_MAP(0x95C + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_PM_DEBUG(x)			MISC_MEM_MAP(0x960 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_RFC_DEBUG(x)			MISC_MEM_MAP(0x964 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_CXPL_DEBUGL(x)		MISC_MEM_MAP(0x968 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_CXPL_DEBUGH(x)		MISC_MEM_MAP(0x96C + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_DIAG_DEBUGH(x)		MISC_MEM_MAP(0x970 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_W1CLR(x)			MISC_MEM_MAP(0x974 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_INT_MASK(x)			MISC_MEM_MAP(0x978 + (x) * 0x100) |  | ||||||
| #define MISC_PCIE_INT_STATUS(x)			MISC_MEM_MAP(0x97C + (x) * 0x100) |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Power management and clock control |  | ||||||
|  */ |  | ||||||
| #define PMU_MEM_MAP(offs) (void __iomem *)(CNS3XXX_PM_BASE_VIRT + (offs)) |  | ||||||
| 
 |  | ||||||
| #define PM_CLK_GATE_REG					PMU_MEM_MAP(0x000) |  | ||||||
| #define PM_SOFT_RST_REG					PMU_MEM_MAP(0x004) |  | ||||||
| #define PM_HS_CFG_REG					PMU_MEM_MAP(0x008) |  | ||||||
| #define PM_CACTIVE_STA_REG				PMU_MEM_MAP(0x00C) |  | ||||||
| #define PM_PWR_STA_REG					PMU_MEM_MAP(0x010) |  | ||||||
| #define PM_CLK_CTRL_REG					PMU_MEM_MAP(0x014) |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_REG				PMU_MEM_MAP(0x018) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG				PMU_MEM_MAP(0x01C) |  | ||||||
| #define PM_REGULAT_CTRL_REG				PMU_MEM_MAP(0x020) |  | ||||||
| #define PM_WDT_CTRL_REG					PMU_MEM_MAP(0x024) |  | ||||||
| #define PM_WU_CTRL0_REG					PMU_MEM_MAP(0x028) |  | ||||||
| #define PM_WU_CTRL1_REG					PMU_MEM_MAP(0x02C) |  | ||||||
| #define PM_CSR_REG					PMU_MEM_MAP(0x030) |  | ||||||
| 
 |  | ||||||
| /* PM_CLK_GATE_REG */ |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_SDIO			(25) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_GPU			(24) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_CIM			(23) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_LCDC			(22) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_I2S			(21) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_RAID			(20) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_SATA			(19) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_PCIE(x)			(17 + (x)) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_USB_HOST			(16) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_USB_OTG			(15) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_TIMER			(14) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_CRYPTO			(13) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_HCIE			(12) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_SWITCH			(11) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_GPIO			(10) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_UART3			(9) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_UART2			(8) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_UART1			(7) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_RTC			(5) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_GDMA			(4) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_SPI_PCM_I2C		(3) |  | ||||||
| #define PM_CLK_GATE_REG_OFFSET_SMC_NFI			(1) |  | ||||||
| #define PM_CLK_GATE_REG_MASK				(0x03FFFFBA) |  | ||||||
| 
 |  | ||||||
| /* PM_SOFT_RST_REG */ |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_WARM_RST_FLAG		(31) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_CPU1			(29) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_CPU0			(28) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_SDIO			(25) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_GPU			(24) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_CIM			(23) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_LCDC			(22) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_I2S			(21) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_RAID			(20) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_SATA			(19) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_PCIE(x)			(17 + (x)) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_USB_HOST			(16) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_USB_OTG			(15) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_TIMER			(14) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_CRYPTO			(13) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_HCIE			(12) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_SWITCH			(11) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_GPIO			(10) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_UART3			(9) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_UART2			(8) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_UART1			(7) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_RTC			(5) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_GDMA			(4) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_SPI_PCM_I2C		(3) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_DMC			(2) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_SMC_NFI			(1) |  | ||||||
| #define PM_SOFT_RST_REG_OFFST_GLOBAL			(0) |  | ||||||
| #define PM_SOFT_RST_REG_MASK				(0xF3FFFFBF) |  | ||||||
| 
 |  | ||||||
| /* PMHS_CFG_REG */ |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_SDIO			(25) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_GPU			(24) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_CIM			(23) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_LCDC			(22) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_I2S			(21) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_RAID			(20) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_SATA			(19) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_PCIE1			(18) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_PCIE0			(17) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_USB_HOST			(16) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_USB_OTG			(15) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_TIMER			(14) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_CRYPTO			(13) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_HCIE			(12) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_SWITCH			(11) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_GPIO			(10) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_UART3			(9) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_UART2			(8) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_UART1			(7) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_RTC			(5) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_GDMA			(4) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_SPI_PCM_I2S		(3) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_DMC			(2) |  | ||||||
| #define PM_HS_CFG_REG_OFFSET_SMC_NFI			(1) |  | ||||||
| #define PM_HS_CFG_REG_MASK				(0x03FFFFBE) |  | ||||||
| #define PM_HS_CFG_REG_MASK_SUPPORT			(0x01100806) |  | ||||||
| 
 |  | ||||||
| /* PM_CACTIVE_STA_REG */ |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_SDIO			(25) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_GPU			(24) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_CIM			(23) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_LCDC			(22) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_I2S			(21) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_RAID			(20) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_SATA			(19) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_PCIE1			(18) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_PCIE0			(17) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_USB_HOST		(16) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_USB_OTG		(15) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_TIMER			(14) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_CRYPTO		(13) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_HCIE			(12) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_SWITCH		(11) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_GPIO			(10) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_UART3			(9) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_UART2			(8) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_UART1			(7) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_RTC			(5) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_GDMA			(4) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_SPI_PCM_I2S		(3) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_DMC			(2) |  | ||||||
| #define PM_CACTIVE_STA_REG_OFFSET_SMC_NFI		(1) |  | ||||||
| #define PM_CACTIVE_STA_REG_MASK				(0x03FFFFBE) |  | ||||||
| 
 |  | ||||||
| /* PM_PWR_STA_REG */ |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_SDIO			(25) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_GPU			(24) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_CIM			(23) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_LCDC			(22) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_I2S			(21) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_RAID			(20) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_SATA			(19) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_PCIE1			(18) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_PCIE0			(17) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_USB_HOST		(16) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_USB_OTG		(15) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_TIMER			(14) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_CRYPTO		(13) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_HCIE			(12) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_SWITCH		(11) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_GPIO			(10) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_UART3			(9) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_UART2			(8) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_UART1			(7) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_RTC			(5) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_GDMA			(4) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_SPI_PCM_I2S		(3) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_DMC			(2) |  | ||||||
| #define PM_PWR_STA_REG_REG_OFFSET_SMC_NFI		(1) |  | ||||||
| #define PM_PWR_STA_REG_REG_MASK				(0x03FFFFBE) |  | ||||||
| 
 |  | ||||||
| /* PM_CLK_CTRL_REG */ |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_I2S_MCLK			(31) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_DDR2_CHG_EN		(30) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_PCIE_REF1_EN		(29) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_PCIE_REF0_EN		(28) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_TIMER_SIM_MODE		(27) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_I2SCLK_DIV		(24) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_I2SCLK_SEL		(22) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_CLKOUT_DIV		(20) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_CLKOUT_SEL		(16) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_MDC_DIV			(14) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_CRYPTO_CLK_SEL		(12) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_CPU_PWR_MODE		(9) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_PLL_DDR2_SEL		(7) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_DIV_IMMEDIATE		(6) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV		(4) |  | ||||||
| #define PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL		(0) |  | ||||||
| 
 |  | ||||||
| #define PM_CPU_CLK_DIV(DIV) { \ |  | ||||||
| 	PM_CLK_CTRL_REG &= ~((0x3) << PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV); \ |  | ||||||
| 	PM_CLK_CTRL_REG |= (((DIV)&0x3) << PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV); \ |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #define PM_PLL_CPU_SEL(CPU) { \ |  | ||||||
| 	PM_CLK_CTRL_REG &= ~((0xF) << PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL); \ |  | ||||||
| 	PM_CLK_CTRL_REG |= (((CPU)&0xF) << PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL); \ |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* PM_PLL_LCD_I2S_CTRL_REG */ |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_MCLK_SMC_DIV	(22) |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_R_SEL		(17) |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_PLL_LCD_P	(11) |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_PLL_LCD_M	(3) |  | ||||||
| #define PM_PLL_LCD_I2S_CTRL_REG_OFFSET_PLL_LCD_S	(0) |  | ||||||
| 
 |  | ||||||
| /* PM_PLL_HM_PD_CTRL_REG */ |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY1		(11) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY0		(10) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_I2SCD		(6) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_I2S		(5) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_LCD		(4) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB		(3) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_RGMII		(2) |  | ||||||
| #define PM_PLL_HM_PD_CTRL_REG_MASK			(0x00000C7C) |  | ||||||
| 
 |  | ||||||
| /* PM_WDT_CTRL_REG */ |  | ||||||
| #define PM_WDT_CTRL_REG_OFFSET_RESET_CPU_ONLY		(0) |  | ||||||
| 
 |  | ||||||
| /* PM_CSR_REG - Clock Scaling Register*/ |  | ||||||
| #define PM_CSR_REG_OFFSET_CSR_EN			(30) |  | ||||||
| #define PM_CSR_REG_OFFSET_CSR_NUM			(0) |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PWR_CLK_EN(BLOCK) (0x1<<PM_CLK_GATE_REG_OFFSET_##BLOCK) |  | ||||||
| 
 |  | ||||||
| /* Software reset*/ |  | ||||||
| #define CNS3XXX_PWR_SOFTWARE_RST(BLOCK) (0x1<<PM_SOFT_RST_REG_OFFST_##BLOCK) |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * CNS3XXX support several power saving mode as following, |  | ||||||
|  * DFS, IDLE, HALT, DOZE, SLEEP, Hibernate |  | ||||||
|  */ |  | ||||||
| #define CNS3XXX_PWR_CPU_MODE_DFS			(0) |  | ||||||
| #define CNS3XXX_PWR_CPU_MODE_IDLE			(1) |  | ||||||
| #define CNS3XXX_PWR_CPU_MODE_HALT			(2) |  | ||||||
| #define CNS3XXX_PWR_CPU_MODE_DOZE			(3) |  | ||||||
| #define CNS3XXX_PWR_CPU_MODE_SLEEP			(4) |  | ||||||
| #define CNS3XXX_PWR_CPU_MODE_HIBERNATE			(5) |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PWR_PLL(BLOCK)	(0x1<<PM_PLL_HM_PD_CTRL_REG_OFFSET_##BLOCK) |  | ||||||
| #define CNS3XXX_PWR_PLL_ALL	PM_PLL_HM_PD_CTRL_REG_MASK |  | ||||||
| 
 |  | ||||||
| /* Change CPU frequency and divider */ |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_300MHZ			(0) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_333MHZ			(1) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_366MHZ			(2) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_400MHZ			(3) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_433MHZ			(4) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_466MHZ			(5) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_500MHZ			(6) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_533MHZ			(7) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_566MHZ			(8) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_600MHZ			(9) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_633MHZ			(10) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_666MHZ			(11) |  | ||||||
| #define CNS3XXX_PWR_PLL_CPU_700MHZ			(12) |  | ||||||
| 
 |  | ||||||
| #define CNS3XXX_PWR_CPU_CLK_DIV_BY1			(0) |  | ||||||
| #define CNS3XXX_PWR_CPU_CLK_DIV_BY2			(1) |  | ||||||
| #define CNS3XXX_PWR_CPU_CLK_DIV_BY4			(2) |  | ||||||
| 
 |  | ||||||
| /* Change DDR2 frequency */ |  | ||||||
| #define CNS3XXX_PWR_PLL_DDR2_200MHZ			(0) |  | ||||||
| #define CNS3XXX_PWR_PLL_DDR2_266MHZ			(1) |  | ||||||
| #define CNS3XXX_PWR_PLL_DDR2_333MHZ			(2) |  | ||||||
| #define CNS3XXX_PWR_PLL_DDR2_400MHZ			(3) |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_soft_rst(unsigned int block); |  | ||||||
| void cns3xxx_pwr_clk_en(unsigned int block); |  | ||||||
| int cns3xxx_cpu_clock(void); |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * ARM11 MPCore interrupt sources (primary GIC) |  | ||||||
|  */ |  | ||||||
| #define IRQ_TC11MP_GIC_START	32 |  | ||||||
| 
 |  | ||||||
| #define IRQ_CNS3XXX_PMU			(IRQ_TC11MP_GIC_START + 0) |  | ||||||
| #define IRQ_CNS3XXX_SDIO		(IRQ_TC11MP_GIC_START + 1) |  | ||||||
| #define IRQ_CNS3XXX_L2CC		(IRQ_TC11MP_GIC_START + 2) |  | ||||||
| #define IRQ_CNS3XXX_RTC			(IRQ_TC11MP_GIC_START + 3) |  | ||||||
| #define IRQ_CNS3XXX_I2S			(IRQ_TC11MP_GIC_START + 4) |  | ||||||
| #define IRQ_CNS3XXX_PCM			(IRQ_TC11MP_GIC_START + 5) |  | ||||||
| #define IRQ_CNS3XXX_SPI			(IRQ_TC11MP_GIC_START + 6) |  | ||||||
| #define IRQ_CNS3XXX_I2C			(IRQ_TC11MP_GIC_START + 7) |  | ||||||
| #define IRQ_CNS3XXX_CIM			(IRQ_TC11MP_GIC_START + 8) |  | ||||||
| #define IRQ_CNS3XXX_GPU			(IRQ_TC11MP_GIC_START + 9) |  | ||||||
| #define IRQ_CNS3XXX_LCD			(IRQ_TC11MP_GIC_START + 10) |  | ||||||
| #define IRQ_CNS3XXX_GPIOA		(IRQ_TC11MP_GIC_START + 11) |  | ||||||
| #define IRQ_CNS3XXX_GPIOB		(IRQ_TC11MP_GIC_START + 12) |  | ||||||
| #define IRQ_CNS3XXX_UART0		(IRQ_TC11MP_GIC_START + 13) |  | ||||||
| #define IRQ_CNS3XXX_UART1		(IRQ_TC11MP_GIC_START + 14) |  | ||||||
| #define IRQ_CNS3XXX_UART2		(IRQ_TC11MP_GIC_START + 15) |  | ||||||
| #define IRQ_CNS3XXX_ARM11		(IRQ_TC11MP_GIC_START + 16) |  | ||||||
| 
 |  | ||||||
| #define IRQ_CNS3XXX_SW_STATUS		(IRQ_TC11MP_GIC_START + 17) |  | ||||||
| #define IRQ_CNS3XXX_SW_R0TXC		(IRQ_TC11MP_GIC_START + 18) |  | ||||||
| #define IRQ_CNS3XXX_SW_R0RXC		(IRQ_TC11MP_GIC_START + 19) |  | ||||||
| #define IRQ_CNS3XXX_SW_R0QE		(IRQ_TC11MP_GIC_START + 20) |  | ||||||
| #define IRQ_CNS3XXX_SW_R0QF		(IRQ_TC11MP_GIC_START + 21) |  | ||||||
| #define IRQ_CNS3XXX_SW_R1TXC		(IRQ_TC11MP_GIC_START + 22) |  | ||||||
| #define IRQ_CNS3XXX_SW_R1RXC		(IRQ_TC11MP_GIC_START + 23) |  | ||||||
| #define IRQ_CNS3XXX_SW_R1QE		(IRQ_TC11MP_GIC_START + 24) |  | ||||||
| #define IRQ_CNS3XXX_SW_R1QF		(IRQ_TC11MP_GIC_START + 25) |  | ||||||
| #define IRQ_CNS3XXX_SW_PPE		(IRQ_TC11MP_GIC_START + 26) |  | ||||||
| 
 |  | ||||||
| #define IRQ_CNS3XXX_CRYPTO		(IRQ_TC11MP_GIC_START + 27) |  | ||||||
| #define IRQ_CNS3XXX_HCIE		(IRQ_TC11MP_GIC_START + 28) |  | ||||||
| #define IRQ_CNS3XXX_PCIE0_DEVICE	(IRQ_TC11MP_GIC_START + 29) |  | ||||||
| #define IRQ_CNS3XXX_PCIE1_DEVICE	(IRQ_TC11MP_GIC_START + 30) |  | ||||||
| #define IRQ_CNS3XXX_USB_OTG		(IRQ_TC11MP_GIC_START + 31) |  | ||||||
| #define IRQ_CNS3XXX_USB_EHCI		(IRQ_TC11MP_GIC_START + 32) |  | ||||||
| #define IRQ_CNS3XXX_SATA		(IRQ_TC11MP_GIC_START + 33) |  | ||||||
| #define IRQ_CNS3XXX_RAID		(IRQ_TC11MP_GIC_START + 34) |  | ||||||
| #define IRQ_CNS3XXX_SMC			(IRQ_TC11MP_GIC_START + 35) |  | ||||||
| 
 |  | ||||||
| #define IRQ_CNS3XXX_DMAC_ABORT		(IRQ_TC11MP_GIC_START + 36) |  | ||||||
| #define IRQ_CNS3XXX_DMAC0		(IRQ_TC11MP_GIC_START + 37) |  | ||||||
| #define IRQ_CNS3XXX_DMAC1		(IRQ_TC11MP_GIC_START + 38) |  | ||||||
| #define IRQ_CNS3XXX_DMAC2		(IRQ_TC11MP_GIC_START + 39) |  | ||||||
| #define IRQ_CNS3XXX_DMAC3		(IRQ_TC11MP_GIC_START + 40) |  | ||||||
| #define IRQ_CNS3XXX_DMAC4		(IRQ_TC11MP_GIC_START + 41) |  | ||||||
| #define IRQ_CNS3XXX_DMAC5		(IRQ_TC11MP_GIC_START + 42) |  | ||||||
| #define IRQ_CNS3XXX_DMAC6		(IRQ_TC11MP_GIC_START + 43) |  | ||||||
| #define IRQ_CNS3XXX_DMAC7		(IRQ_TC11MP_GIC_START + 44) |  | ||||||
| #define IRQ_CNS3XXX_DMAC8		(IRQ_TC11MP_GIC_START + 45) |  | ||||||
| #define IRQ_CNS3XXX_DMAC9		(IRQ_TC11MP_GIC_START + 46) |  | ||||||
| #define IRQ_CNS3XXX_DMAC10		(IRQ_TC11MP_GIC_START + 47) |  | ||||||
| #define IRQ_CNS3XXX_DMAC11		(IRQ_TC11MP_GIC_START + 48) |  | ||||||
| #define IRQ_CNS3XXX_DMAC12		(IRQ_TC11MP_GIC_START + 49) |  | ||||||
| #define IRQ_CNS3XXX_DMAC13		(IRQ_TC11MP_GIC_START + 50) |  | ||||||
| #define IRQ_CNS3XXX_DMAC14		(IRQ_TC11MP_GIC_START + 51) |  | ||||||
| #define IRQ_CNS3XXX_DMAC15		(IRQ_TC11MP_GIC_START + 52) |  | ||||||
| #define IRQ_CNS3XXX_DMAC16		(IRQ_TC11MP_GIC_START + 53) |  | ||||||
| #define IRQ_CNS3XXX_DMAC17		(IRQ_TC11MP_GIC_START + 54) |  | ||||||
| 
 |  | ||||||
| #define IRQ_CNS3XXX_PCIE0_RC		(IRQ_TC11MP_GIC_START + 55) |  | ||||||
| #define IRQ_CNS3XXX_PCIE1_RC		(IRQ_TC11MP_GIC_START + 56) |  | ||||||
| #define IRQ_CNS3XXX_TIMER0		(IRQ_TC11MP_GIC_START + 57) |  | ||||||
| #define IRQ_CNS3XXX_TIMER1		(IRQ_TC11MP_GIC_START + 58) |  | ||||||
| #define IRQ_CNS3XXX_USB_OHCI		(IRQ_TC11MP_GIC_START + 59) |  | ||||||
| #define IRQ_CNS3XXX_TIMER2		(IRQ_TC11MP_GIC_START + 60) |  | ||||||
| #define IRQ_CNS3XXX_EXTERNAL_PIN0	(IRQ_TC11MP_GIC_START + 61) |  | ||||||
| #define IRQ_CNS3XXX_EXTERNAL_PIN1	(IRQ_TC11MP_GIC_START + 62) |  | ||||||
| #define IRQ_CNS3XXX_EXTERNAL_PIN2	(IRQ_TC11MP_GIC_START + 63) |  | ||||||
| 
 |  | ||||||
| #define NR_IRQS_CNS3XXX			(IRQ_TC11MP_GIC_START + 64) |  | ||||||
| 
 |  | ||||||
| #endif	/* __MACH_BOARD_CNS3XXX_H */ |  | ||||||
|  | @ -1,410 +0,0 @@ | ||||||
| // SPDX-License-Identifier: GPL-2.0-only
 |  | ||||||
| /*
 |  | ||||||
|  * Copyright 1999 - 2003 ARM Limited |  | ||||||
|  * Copyright 2000 Deep Blue Solutions Ltd |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <linux/init.h> |  | ||||||
| #include <linux/interrupt.h> |  | ||||||
| #include <linux/clockchips.h> |  | ||||||
| #include <linux/io.h> |  | ||||||
| #include <linux/irqchip/arm-gic.h> |  | ||||||
| #include <linux/of_platform.h> |  | ||||||
| #include <linux/platform_device.h> |  | ||||||
| #include <linux/usb/ehci_pdriver.h> |  | ||||||
| #include <linux/usb/ohci_pdriver.h> |  | ||||||
| #include <asm/mach/arch.h> |  | ||||||
| #include <asm/mach/map.h> |  | ||||||
| #include <asm/mach/time.h> |  | ||||||
| #include <asm/mach/irq.h> |  | ||||||
| #include <asm/hardware/cache-l2x0.h> |  | ||||||
| #include "cns3xxx.h" |  | ||||||
| #include "core.h" |  | ||||||
| #include "pm.h" |  | ||||||
| 
 |  | ||||||
| static struct map_desc cns3xxx_io_desc[] __initdata = { |  | ||||||
| 	{ |  | ||||||
| 		.virtual	= CNS3XXX_TC11MP_SCU_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_TC11MP_SCU_BASE), |  | ||||||
| 		.length		= SZ_8K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_TIMER1_2_3_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_TIMER1_2_3_BASE), |  | ||||||
| 		.length		= SZ_4K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_MISC_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_MISC_BASE), |  | ||||||
| 		.length		= SZ_4K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PM_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PM_BASE), |  | ||||||
| 		.length		= SZ_4K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| #ifdef CONFIG_PCI |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PCIE0_HOST_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PCIE0_HOST_BASE), |  | ||||||
| 		.length		= SZ_4K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PCIE0_CFG0_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PCIE0_CFG0_BASE), |  | ||||||
| 		.length		= SZ_64K, /* really 4 KiB at offset 32 KiB */ |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PCIE0_CFG1_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PCIE0_CFG1_BASE), |  | ||||||
| 		.length		= SZ_16M, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PCIE1_HOST_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PCIE1_HOST_BASE), |  | ||||||
| 		.length		= SZ_4K, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PCIE1_CFG0_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PCIE1_CFG0_BASE), |  | ||||||
| 		.length		= SZ_64K, /* really 4 KiB at offset 32 KiB */ |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| 	}, { |  | ||||||
| 		.virtual	= CNS3XXX_PCIE1_CFG1_BASE_VIRT, |  | ||||||
| 		.pfn		= __phys_to_pfn(CNS3XXX_PCIE1_CFG1_BASE), |  | ||||||
| 		.length		= SZ_16M, |  | ||||||
| 		.type		= MT_DEVICE, |  | ||||||
| #endif |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_map_io(void) |  | ||||||
| { |  | ||||||
| 	iotable_init(cns3xxx_io_desc, ARRAY_SIZE(cns3xxx_io_desc)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* used by entry-macro.S */ |  | ||||||
| void __init cns3xxx_init_irq(void) |  | ||||||
| { |  | ||||||
| 	gic_init(IOMEM(CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT), |  | ||||||
| 		 IOMEM(CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void cns3xxx_power_off(void) |  | ||||||
| { |  | ||||||
| 	u32 __iomem *pm_base = IOMEM(CNS3XXX_PM_BASE_VIRT); |  | ||||||
| 	u32 clkctrl; |  | ||||||
| 
 |  | ||||||
| 	printk(KERN_INFO "powering system down...\n"); |  | ||||||
| 
 |  | ||||||
| 	clkctrl = readl(pm_base + PM_SYS_CLK_CTRL_OFFSET); |  | ||||||
| 	clkctrl &= 0xfffff1ff; |  | ||||||
| 	clkctrl |= (0x5 << 9);		/* Hibernate */ |  | ||||||
| 	writel(clkctrl, pm_base + PM_SYS_CLK_CTRL_OFFSET); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Timer |  | ||||||
|  */ |  | ||||||
| static void __iomem *cns3xxx_tmr1; |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_shutdown(struct clock_event_device *clk) |  | ||||||
| { |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_set_oneshot(struct clock_event_device *clk) |  | ||||||
| { |  | ||||||
| 	unsigned long ctrl = readl(cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* period set, and timer enabled in 'next_event' hook */ |  | ||||||
| 	ctrl |= (1 << 2) | (1 << 9); |  | ||||||
| 	writel(ctrl, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_set_periodic(struct clock_event_device *clk) |  | ||||||
| { |  | ||||||
| 	unsigned long ctrl = readl(cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	int pclk = cns3xxx_cpu_clock() / 8; |  | ||||||
| 	int reload; |  | ||||||
| 
 |  | ||||||
| 	reload = pclk * 20 / (3 * HZ) * 0x25000; |  | ||||||
| 	writel(reload, cns3xxx_tmr1 + TIMER1_AUTO_RELOAD_OFFSET); |  | ||||||
| 	ctrl |= (1 << 0) | (1 << 2) | (1 << 9); |  | ||||||
| 	writel(ctrl, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_timer_set_next_event(unsigned long evt, |  | ||||||
| 					struct clock_event_device *unused) |  | ||||||
| { |  | ||||||
| 	unsigned long ctrl = readl(cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	writel(evt, cns3xxx_tmr1 + TIMER1_AUTO_RELOAD_OFFSET); |  | ||||||
| 	writel(ctrl | (1 << 0), cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct clock_event_device cns3xxx_tmr1_clockevent = { |  | ||||||
| 	.name			= "cns3xxx timer1", |  | ||||||
| 	.features		= CLOCK_EVT_FEAT_PERIODIC | |  | ||||||
| 				  CLOCK_EVT_FEAT_ONESHOT, |  | ||||||
| 	.set_state_shutdown	= cns3xxx_shutdown, |  | ||||||
| 	.set_state_periodic	= cns3xxx_set_periodic, |  | ||||||
| 	.set_state_oneshot	= cns3xxx_set_oneshot, |  | ||||||
| 	.tick_resume		= cns3xxx_shutdown, |  | ||||||
| 	.set_next_event		= cns3xxx_timer_set_next_event, |  | ||||||
| 	.rating			= 350, |  | ||||||
| 	.cpumask		= cpu_all_mask, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void __init cns3xxx_clockevents_init(unsigned int timer_irq) |  | ||||||
| { |  | ||||||
| 	cns3xxx_tmr1_clockevent.irq = timer_irq; |  | ||||||
| 	clockevents_config_and_register(&cns3xxx_tmr1_clockevent, |  | ||||||
| 					(cns3xxx_cpu_clock() >> 3) * 1000000, |  | ||||||
| 					0xf, 0xffffffff); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * IRQ handler for the timer |  | ||||||
|  */ |  | ||||||
| static irqreturn_t cns3xxx_timer_interrupt(int irq, void *dev_id) |  | ||||||
| { |  | ||||||
| 	struct clock_event_device *evt = &cns3xxx_tmr1_clockevent; |  | ||||||
| 	u32 __iomem *stat = cns3xxx_tmr1 + TIMER1_2_INTERRUPT_STATUS_OFFSET; |  | ||||||
| 	u32 val; |  | ||||||
| 
 |  | ||||||
| 	/* Clear the interrupt */ |  | ||||||
| 	val = readl(stat); |  | ||||||
| 	writel(val & ~(1 << 2), stat); |  | ||||||
| 
 |  | ||||||
| 	evt->event_handler(evt); |  | ||||||
| 
 |  | ||||||
| 	return IRQ_HANDLED; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Set up the clock source and clock events devices |  | ||||||
|  */ |  | ||||||
| static void __init __cns3xxx_timer_init(unsigned int timer_irq) |  | ||||||
| { |  | ||||||
| 	u32 val; |  | ||||||
| 	u32 irq_mask; |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Initialise to a known state (all timers off) |  | ||||||
| 	 */ |  | ||||||
| 
 |  | ||||||
| 	/* disable timer1 and timer2 */ |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	/* stop free running timer3 */ |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER_FREERUN_CONTROL_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* timer1 */ |  | ||||||
| 	writel(0x5C800, cns3xxx_tmr1 + TIMER1_COUNTER_OFFSET); |  | ||||||
| 	writel(0x5C800, cns3xxx_tmr1 + TIMER1_AUTO_RELOAD_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER1_MATCH_V1_OFFSET); |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER1_MATCH_V2_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* mask irq, non-mask timer1 overflow */ |  | ||||||
| 	irq_mask = readl(cns3xxx_tmr1 + TIMER1_2_INTERRUPT_MASK_OFFSET); |  | ||||||
| 	irq_mask &= ~(1 << 2); |  | ||||||
| 	irq_mask |= 0x03; |  | ||||||
| 	writel(irq_mask, cns3xxx_tmr1 + TIMER1_2_INTERRUPT_MASK_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* down counter */ |  | ||||||
| 	val = readl(cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	val |= (1 << 9); |  | ||||||
| 	writel(val, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* timer2 */ |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER2_MATCH_V1_OFFSET); |  | ||||||
| 	writel(0, cns3xxx_tmr1 + TIMER2_MATCH_V2_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* mask irq */ |  | ||||||
| 	irq_mask = readl(cns3xxx_tmr1 + TIMER1_2_INTERRUPT_MASK_OFFSET); |  | ||||||
| 	irq_mask |= ((1 << 3) | (1 << 4) | (1 << 5)); |  | ||||||
| 	writel(irq_mask, cns3xxx_tmr1 + TIMER1_2_INTERRUPT_MASK_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* down counter */ |  | ||||||
| 	val = readl(cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 	val |= (1 << 10); |  | ||||||
| 	writel(val, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); |  | ||||||
| 
 |  | ||||||
| 	/* Make irqs happen for the system timer */ |  | ||||||
| 	if (request_irq(timer_irq, cns3xxx_timer_interrupt, |  | ||||||
| 			IRQF_TIMER | IRQF_IRQPOLL, "timer", NULL)) |  | ||||||
| 		pr_err("Failed to request irq %d (timer)\n", timer_irq); |  | ||||||
| 
 |  | ||||||
| 	cns3xxx_clockevents_init(timer_irq); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_timer_init(void) |  | ||||||
| { |  | ||||||
| 	cns3xxx_tmr1 = IOMEM(CNS3XXX_TIMER1_2_3_BASE_VIRT); |  | ||||||
| 
 |  | ||||||
| 	__cns3xxx_timer_init(IRQ_CNS3XXX_TIMER0); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_CACHE_L2X0 |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_l2x0_init(void) |  | ||||||
| { |  | ||||||
| 	void __iomem *base = ioremap(CNS3XXX_L2C_BASE, SZ_4K); |  | ||||||
| 	u32 val; |  | ||||||
| 
 |  | ||||||
| 	if (WARN_ON(!base)) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Tag RAM Control register |  | ||||||
| 	 * |  | ||||||
| 	 * bit[10:8]	- 1 cycle of write accesses latency |  | ||||||
| 	 * bit[6:4]	- 1 cycle of read accesses latency |  | ||||||
| 	 * bit[3:0]	- 1 cycle of setup latency |  | ||||||
| 	 * |  | ||||||
| 	 * 1 cycle of latency for setup, read and write accesses |  | ||||||
| 	 */ |  | ||||||
| 	val = readl(base + L310_TAG_LATENCY_CTRL); |  | ||||||
| 	val &= 0xfffff888; |  | ||||||
| 	writel(val, base + L310_TAG_LATENCY_CTRL); |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Data RAM Control register |  | ||||||
| 	 * |  | ||||||
| 	 * bit[10:8]	- 1 cycles of write accesses latency |  | ||||||
| 	 * bit[6:4]	- 1 cycles of read accesses latency |  | ||||||
| 	 * bit[3:0]	- 1 cycle of setup latency |  | ||||||
| 	 * |  | ||||||
| 	 * 1 cycle of latency for setup, read and write accesses |  | ||||||
| 	 */ |  | ||||||
| 	val = readl(base + L310_DATA_LATENCY_CTRL); |  | ||||||
| 	val &= 0xfffff888; |  | ||||||
| 	writel(val, base + L310_DATA_LATENCY_CTRL); |  | ||||||
| 
 |  | ||||||
| 	/* 32 KiB, 8-way, parity disable */ |  | ||||||
| 	l2x0_init(base, 0x00500000, 0xfe0f0fff); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #endif /* CONFIG_CACHE_L2X0 */ |  | ||||||
| 
 |  | ||||||
| static int csn3xxx_usb_power_on(struct platform_device *pdev) |  | ||||||
| { |  | ||||||
| 	/*
 |  | ||||||
| 	 * EHCI and OHCI share the same clock and power, |  | ||||||
| 	 * resetting twice would cause the 1st controller been reset. |  | ||||||
| 	 * Therefore only do power up  at the first up device, and |  | ||||||
| 	 * power down at the last down device. |  | ||||||
| 	 * |  | ||||||
| 	 * Set USB AHB INCR length to 16 |  | ||||||
| 	 */ |  | ||||||
| 	if (atomic_inc_return(&usb_pwr_ref) == 1) { |  | ||||||
| 		cns3xxx_pwr_power_up(1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB); |  | ||||||
| 		cns3xxx_pwr_clk_en(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); |  | ||||||
| 		cns3xxx_pwr_soft_rst(1 << PM_SOFT_RST_REG_OFFST_USB_HOST); |  | ||||||
| 		__raw_writel((__raw_readl(MISC_CHIP_CONFIG_REG) | (0X2 << 24)), |  | ||||||
| 			MISC_CHIP_CONFIG_REG); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void csn3xxx_usb_power_off(struct platform_device *pdev) |  | ||||||
| { |  | ||||||
| 	/*
 |  | ||||||
| 	 * EHCI and OHCI share the same clock and power, |  | ||||||
| 	 * resetting twice would cause the 1st controller been reset. |  | ||||||
| 	 * Therefore only do power up  at the first up device, and |  | ||||||
| 	 * power down at the last down device. |  | ||||||
| 	 */ |  | ||||||
| 	if (atomic_dec_return(&usb_pwr_ref) == 0) |  | ||||||
| 		cns3xxx_pwr_clk_dis(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = { |  | ||||||
| 	.power_on	= csn3xxx_usb_power_on, |  | ||||||
| 	.power_off	= csn3xxx_usb_power_off, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct usb_ohci_pdata cns3xxx_usb_ohci_pdata = { |  | ||||||
| 	.num_ports	= 1, |  | ||||||
| 	.power_on	= csn3xxx_usb_power_on, |  | ||||||
| 	.power_off	= csn3xxx_usb_power_off, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static const struct of_dev_auxdata cns3xxx_auxdata[] __initconst = { |  | ||||||
| 	{ "intel,usb-ehci", CNS3XXX_USB_BASE, "ehci-platform", &cns3xxx_usb_ehci_pdata }, |  | ||||||
| 	{ "intel,usb-ohci", CNS3XXX_USB_OHCI_BASE, "ohci-platform", &cns3xxx_usb_ohci_pdata }, |  | ||||||
| 	{ "cavium,cns3420-ahci", CNS3XXX_SATA2_BASE, "ahci", NULL }, |  | ||||||
| 	{ "cavium,cns3420-sdhci", CNS3XXX_SDIO_BASE, "ahci", NULL }, |  | ||||||
| 	{}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void __init cns3xxx_init(void) |  | ||||||
| { |  | ||||||
| 	struct device_node *dn; |  | ||||||
| 
 |  | ||||||
| 	cns3xxx_l2x0_init(); |  | ||||||
| 
 |  | ||||||
| 	dn = of_find_compatible_node(NULL, NULL, "cavium,cns3420-ahci"); |  | ||||||
| 	if (of_device_is_available(dn)) { |  | ||||||
| 		u32 tmp; |  | ||||||
| 	 |  | ||||||
| 		tmp = __raw_readl(MISC_SATA_POWER_MODE); |  | ||||||
| 		tmp |= 0x1 << 16; /* Disable SATA PHY 0 from SLUMBER Mode */ |  | ||||||
| 		tmp |= 0x1 << 17; /* Disable SATA PHY 1 from SLUMBER Mode */ |  | ||||||
| 		__raw_writel(tmp, MISC_SATA_POWER_MODE); |  | ||||||
| 	 |  | ||||||
| 		/* Enable SATA PHY */ |  | ||||||
| 		cns3xxx_pwr_power_up(0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY0); |  | ||||||
| 		cns3xxx_pwr_power_up(0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY1); |  | ||||||
| 	 |  | ||||||
| 		/* Enable SATA Clock */ |  | ||||||
| 		cns3xxx_pwr_clk_en(0x1 << PM_CLK_GATE_REG_OFFSET_SATA); |  | ||||||
| 	 |  | ||||||
| 		/* De-Asscer SATA Reset */ |  | ||||||
| 		cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SATA)); |  | ||||||
| 	} |  | ||||||
| 	of_node_put(dn); |  | ||||||
| 
 |  | ||||||
| 	dn = of_find_compatible_node(NULL, NULL, "cavium,cns3420-sdhci"); |  | ||||||
| 	if (of_device_is_available(dn)) { |  | ||||||
| 		u32 __iomem *gpioa = IOMEM(CNS3XXX_MISC_BASE_VIRT + 0x0014); |  | ||||||
| 		u32 gpioa_pins = __raw_readl(gpioa); |  | ||||||
| 	 |  | ||||||
| 		/* MMC/SD pins share with GPIOA */ |  | ||||||
| 		gpioa_pins |= 0x1fff0004; |  | ||||||
| 		__raw_writel(gpioa_pins, gpioa); |  | ||||||
| 	 |  | ||||||
| 		cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(SDIO)); |  | ||||||
| 		cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO)); |  | ||||||
| 	} |  | ||||||
| 	of_node_put(dn); |  | ||||||
| 
 |  | ||||||
| 	pm_power_off = cns3xxx_power_off; |  | ||||||
| 
 |  | ||||||
| 	of_platform_default_populate(NULL, cns3xxx_auxdata, NULL); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static const char *const cns3xxx_dt_compat[] __initconst = { |  | ||||||
| 	"cavium,cns3410", |  | ||||||
| 	"cavium,cns3420", |  | ||||||
| 	NULL, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| DT_MACHINE_START(CNS3XXX_DT, "Cavium Networks CNS3xxx") |  | ||||||
| 	.dt_compat	= cns3xxx_dt_compat, |  | ||||||
| 	.map_io		= cns3xxx_map_io, |  | ||||||
| 	.init_irq	= cns3xxx_init_irq, |  | ||||||
| 	.init_time	= cns3xxx_timer_init, |  | ||||||
| 	.init_machine	= cns3xxx_init, |  | ||||||
| 	.init_late	= cns3xxx_pcie_init_late, |  | ||||||
| 	.restart	= cns3xxx_restart, |  | ||||||
| MACHINE_END |  | ||||||
|  | @ -1,32 +0,0 @@ | ||||||
| /* SPDX-License-Identifier: GPL-2.0-only */ |  | ||||||
| /*
 |  | ||||||
|  * Copyright 2000 Deep Blue Solutions Ltd |  | ||||||
|  * Copyright 2004 ARM Limited |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef __CNS3XXX_CORE_H |  | ||||||
| #define __CNS3XXX_CORE_H |  | ||||||
| 
 |  | ||||||
| #include <linux/reboot.h> |  | ||||||
| 
 |  | ||||||
| extern void cns3xxx_timer_init(void); |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_CACHE_L2X0 |  | ||||||
| void __init cns3xxx_l2x0_init(void); |  | ||||||
| #else |  | ||||||
| static inline void cns3xxx_l2x0_init(void) {} |  | ||||||
| #endif /* CONFIG_CACHE_L2X0 */ |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_PCI |  | ||||||
| extern void __init cns3xxx_pcie_init_late(void); |  | ||||||
| #else |  | ||||||
| static inline void __init cns3xxx_pcie_init_late(void) {} |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_map_io(void); |  | ||||||
| void __init cns3xxx_init_irq(void); |  | ||||||
| void cns3xxx_power_off(void); |  | ||||||
| void cns3xxx_restart(enum reboot_mode, const char *); |  | ||||||
| 
 |  | ||||||
| #endif /* __CNS3XXX_CORE_H */ |  | ||||||
|  | @ -1,108 +0,0 @@ | ||||||
| // SPDX-License-Identifier: GPL-2.0-only
 |  | ||||||
| /*
 |  | ||||||
|  * CNS3xxx common devices |  | ||||||
|  * |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  *		  Scott Shu |  | ||||||
|  * Copyright 2010 MontaVista Software, LLC. |  | ||||||
|  *		  Anton Vorontsov <avorontsov@mvista.com> |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <linux/io.h> |  | ||||||
| #include <linux/init.h> |  | ||||||
| #include <linux/compiler.h> |  | ||||||
| #include <linux/dma-mapping.h> |  | ||||||
| #include <linux/platform_device.h> |  | ||||||
| #include "cns3xxx.h" |  | ||||||
| #include "pm.h" |  | ||||||
| #include "core.h" |  | ||||||
| #include "devices.h" |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * AHCI |  | ||||||
|  */ |  | ||||||
| static struct resource cns3xxx_ahci_resource[] = { |  | ||||||
| 	[0] = { |  | ||||||
| 		.start	= CNS3XXX_SATA2_BASE, |  | ||||||
| 		.end	= CNS3XXX_SATA2_BASE + CNS3XXX_SATA2_SIZE - 1, |  | ||||||
| 		.flags	= IORESOURCE_MEM, |  | ||||||
| 	}, |  | ||||||
| 	[1] = { |  | ||||||
| 		.start	= IRQ_CNS3XXX_SATA, |  | ||||||
| 		.end	= IRQ_CNS3XXX_SATA, |  | ||||||
| 		.flags	= IORESOURCE_IRQ, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static u64 cns3xxx_ahci_dmamask = DMA_BIT_MASK(32); |  | ||||||
| 
 |  | ||||||
| static struct platform_device cns3xxx_ahci_pdev = { |  | ||||||
| 	.name		= "ahci", |  | ||||||
| 	.id		= 0, |  | ||||||
| 	.resource	= cns3xxx_ahci_resource, |  | ||||||
| 	.num_resources	= ARRAY_SIZE(cns3xxx_ahci_resource), |  | ||||||
| 	.dev		= { |  | ||||||
| 		.dma_mask		= &cns3xxx_ahci_dmamask, |  | ||||||
| 		.coherent_dma_mask	= DMA_BIT_MASK(32), |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_ahci_init(void) |  | ||||||
| { |  | ||||||
| 	u32 tmp; |  | ||||||
| 
 |  | ||||||
| 	tmp = __raw_readl(MISC_SATA_POWER_MODE); |  | ||||||
| 	tmp |= 0x1 << 16; /* Disable SATA PHY 0 from SLUMBER Mode */ |  | ||||||
| 	tmp |= 0x1 << 17; /* Disable SATA PHY 1 from SLUMBER Mode */ |  | ||||||
| 	__raw_writel(tmp, MISC_SATA_POWER_MODE); |  | ||||||
| 
 |  | ||||||
| 	/* Enable SATA PHY */ |  | ||||||
| 	cns3xxx_pwr_power_up(0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY0); |  | ||||||
| 	cns3xxx_pwr_power_up(0x1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_SATA_PHY1); |  | ||||||
| 
 |  | ||||||
| 	/* Enable SATA Clock */ |  | ||||||
| 	cns3xxx_pwr_clk_en(0x1 << PM_CLK_GATE_REG_OFFSET_SATA); |  | ||||||
| 
 |  | ||||||
| 	/* De-Asscer SATA Reset */ |  | ||||||
| 	cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SATA)); |  | ||||||
| 
 |  | ||||||
| 	platform_device_register(&cns3xxx_ahci_pdev); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * SDHCI |  | ||||||
|  */ |  | ||||||
| static struct resource cns3xxx_sdhci_resources[] = { |  | ||||||
| 	[0] = { |  | ||||||
| 		.start = CNS3XXX_SDIO_BASE, |  | ||||||
| 		.end   = CNS3XXX_SDIO_BASE + SZ_4K - 1, |  | ||||||
| 		.flags = IORESOURCE_MEM, |  | ||||||
| 	}, |  | ||||||
| 	[1] = { |  | ||||||
| 		.start = IRQ_CNS3XXX_SDIO, |  | ||||||
| 		.end   = IRQ_CNS3XXX_SDIO, |  | ||||||
| 		.flags = IORESOURCE_IRQ, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct platform_device cns3xxx_sdhci_pdev = { |  | ||||||
| 	.name		= "sdhci-cns3xxx", |  | ||||||
| 	.id		= 0, |  | ||||||
| 	.num_resources	= ARRAY_SIZE(cns3xxx_sdhci_resources), |  | ||||||
| 	.resource	= cns3xxx_sdhci_resources, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_sdhci_init(void) |  | ||||||
| { |  | ||||||
| 	u32 __iomem *gpioa = IOMEM(CNS3XXX_MISC_BASE_VIRT + 0x0014); |  | ||||||
| 	u32 gpioa_pins = __raw_readl(gpioa); |  | ||||||
| 
 |  | ||||||
| 	/* MMC/SD pins share with GPIOA */ |  | ||||||
| 	gpioa_pins |= 0x1fff0004; |  | ||||||
| 	__raw_writel(gpioa_pins, gpioa); |  | ||||||
| 
 |  | ||||||
| 	cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(SDIO)); |  | ||||||
| 	cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO)); |  | ||||||
| 
 |  | ||||||
| 	platform_device_register(&cns3xxx_sdhci_pdev); |  | ||||||
| } |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| /* SPDX-License-Identifier: GPL-2.0-only */ |  | ||||||
| /*
 |  | ||||||
|  * CNS3xxx common devices |  | ||||||
|  * |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  *		  Scott Shu |  | ||||||
|  * Copyright 2010 MontaVista Software, LLC. |  | ||||||
|  *		  Anton Vorontsov <avorontsov@mvista.com> |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef __CNS3XXX_DEVICES_H_ |  | ||||||
| #define __CNS3XXX_DEVICES_H_ |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_ahci_init(void); |  | ||||||
| void __init cns3xxx_sdhci_init(void); |  | ||||||
| 
 |  | ||||||
| #endif /* __CNS3XXX_DEVICES_H_ */ |  | ||||||
|  | @ -1,290 +0,0 @@ | ||||||
| // SPDX-License-Identifier: GPL-2.0-only
 |  | ||||||
| /*
 |  | ||||||
|  * PCI-E support for CNS3xxx |  | ||||||
|  * |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  *		  Richard Liu <richard.liu@caviumnetworks.com> |  | ||||||
|  * Copyright 2010 MontaVista Software, LLC. |  | ||||||
|  *		  Anton Vorontsov <avorontsov@mvista.com> |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <linux/init.h> |  | ||||||
| #include <linux/kernel.h> |  | ||||||
| #include <linux/bug.h> |  | ||||||
| #include <linux/pci.h> |  | ||||||
| #include <linux/io.h> |  | ||||||
| #include <linux/ioport.h> |  | ||||||
| #include <linux/interrupt.h> |  | ||||||
| #include <linux/ptrace.h> |  | ||||||
| #include <asm/mach/map.h> |  | ||||||
| #include "cns3xxx.h" |  | ||||||
| #include "core.h" |  | ||||||
| 
 |  | ||||||
| struct cns3xxx_pcie { |  | ||||||
| 	void __iomem *host_regs; /* PCI config registers for host bridge */ |  | ||||||
| 	void __iomem *cfg0_regs; /* PCI Type 0 config registers */ |  | ||||||
| 	void __iomem *cfg1_regs; /* PCI Type 1 config registers */ |  | ||||||
| 	unsigned int irqs[2]; |  | ||||||
| 	struct resource res_io; |  | ||||||
| 	struct resource res_mem; |  | ||||||
| 	int port; |  | ||||||
| 	bool linked; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct cns3xxx_pcie *sysdata_to_cnspci(void *sysdata) |  | ||||||
| { |  | ||||||
| 	struct pci_sys_data *root = sysdata; |  | ||||||
| 
 |  | ||||||
| 	return root->private_data; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct cns3xxx_pcie *pdev_to_cnspci(const struct pci_dev *dev) |  | ||||||
| { |  | ||||||
| 	return sysdata_to_cnspci(dev->sysdata); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct cns3xxx_pcie *pbus_to_cnspci(struct pci_bus *bus) |  | ||||||
| { |  | ||||||
| 	return sysdata_to_cnspci(bus->sysdata); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void __iomem *cns3xxx_pci_map_bus(struct pci_bus *bus, |  | ||||||
| 					 unsigned int devfn, int where) |  | ||||||
| { |  | ||||||
| 	struct cns3xxx_pcie *cnspci = pbus_to_cnspci(bus); |  | ||||||
| 	int busno = bus->number; |  | ||||||
| 	int slot = PCI_SLOT(devfn); |  | ||||||
| 	void __iomem *base; |  | ||||||
| 
 |  | ||||||
| 	/* If there is no link, just show the CNS PCI bridge. */ |  | ||||||
| 	if (!cnspci->linked && busno > 0) |  | ||||||
| 		return NULL; |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * The CNS PCI bridge doesn't fit into the PCI hierarchy, though |  | ||||||
| 	 * we still want to access it. |  | ||||||
| 	 * We place the host bridge on bus 0, and the directly connected |  | ||||||
| 	 * device on bus 1, slot 0. |  | ||||||
| 	 */ |  | ||||||
| 	if (busno == 0) { /* internal PCIe bus, host bridge device */ |  | ||||||
| 		if (devfn == 0) /* device# and function# are ignored by hw */ |  | ||||||
| 			base = cnspci->host_regs; |  | ||||||
| 		else |  | ||||||
| 			return NULL; /* no such device */ |  | ||||||
| 
 |  | ||||||
| 	} else if (busno == 1) { /* directly connected PCIe device */ |  | ||||||
| 		if (slot == 0) /* device# is ignored by hw */ |  | ||||||
| 			base = cnspci->cfg0_regs; |  | ||||||
| 		else |  | ||||||
| 			return NULL; /* no such device */ |  | ||||||
| 	} else /* remote PCI bus */ |  | ||||||
| 		base = cnspci->cfg1_regs + ((busno & 0xf) << 20); |  | ||||||
| 
 |  | ||||||
| 	return base + where + (devfn << 12); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_pci_read_config(struct pci_bus *bus, unsigned int devfn, |  | ||||||
| 				   int where, int size, u32 *val) |  | ||||||
| { |  | ||||||
| 	int ret; |  | ||||||
| 	u32 mask = (0x1ull << (size * 8)) - 1; |  | ||||||
| 	int shift = (where % 4) * 8; |  | ||||||
| 
 |  | ||||||
| 	ret = pci_generic_config_read(bus, devfn, where, size, val); |  | ||||||
| 
 |  | ||||||
| 	if (ret == PCIBIOS_SUCCESSFUL && !bus->number && !devfn && |  | ||||||
| 	    (where & 0xffc) == PCI_CLASS_REVISION) |  | ||||||
| 		/*
 |  | ||||||
| 		 * RC's class is 0xb, but Linux PCI driver needs 0x604 |  | ||||||
| 		 * for a PCIe bridge. So we must fixup the class code |  | ||||||
| 		 * to 0x604 here. |  | ||||||
| 		 */ |  | ||||||
| 		*val = ((((*val << shift) & 0xff) | (0x604 << 16)) >> shift) & mask; |  | ||||||
| 
 |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_pci_setup(int nr, struct pci_sys_data *sys) |  | ||||||
| { |  | ||||||
| 	struct cns3xxx_pcie *cnspci = sysdata_to_cnspci(sys); |  | ||||||
| 	struct resource *res_io = &cnspci->res_io; |  | ||||||
| 	struct resource *res_mem = &cnspci->res_mem; |  | ||||||
| 
 |  | ||||||
| 	BUG_ON(request_resource(&iomem_resource, res_io) || |  | ||||||
| 	       request_resource(&iomem_resource, res_mem)); |  | ||||||
| 
 |  | ||||||
| 	pci_add_resource_offset(&sys->resources, res_io, sys->io_offset); |  | ||||||
| 	pci_add_resource_offset(&sys->resources, res_mem, sys->mem_offset); |  | ||||||
| 
 |  | ||||||
| 	return 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct pci_ops cns3xxx_pcie_ops = { |  | ||||||
| 	.map_bus = cns3xxx_pci_map_bus, |  | ||||||
| 	.read = cns3xxx_pci_read_config, |  | ||||||
| 	.write = pci_generic_config_write, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) |  | ||||||
| { |  | ||||||
| 	struct cns3xxx_pcie *cnspci = pdev_to_cnspci(dev); |  | ||||||
| 	int irq = cnspci->irqs[!!dev->bus->number]; |  | ||||||
| 
 |  | ||||||
| 	pr_info("PCIe map irq: %04d:%02x:%02x.%02x slot %d, pin %d, irq: %d\n", |  | ||||||
| 		pci_domain_nr(dev->bus), dev->bus->number, PCI_SLOT(dev->devfn), |  | ||||||
| 		PCI_FUNC(dev->devfn), slot, pin, irq); |  | ||||||
| 
 |  | ||||||
| 	return irq; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct cns3xxx_pcie cns3xxx_pcie[] = { |  | ||||||
| 	[0] = { |  | ||||||
| 		.host_regs = (void __iomem *)CNS3XXX_PCIE0_HOST_BASE_VIRT, |  | ||||||
| 		.cfg0_regs = (void __iomem *)CNS3XXX_PCIE0_CFG0_BASE_VIRT, |  | ||||||
| 		.cfg1_regs = (void __iomem *)CNS3XXX_PCIE0_CFG1_BASE_VIRT, |  | ||||||
| 		.res_io = { |  | ||||||
| 			.name = "PCIe0 I/O space", |  | ||||||
| 			.start = CNS3XXX_PCIE0_IO_BASE, |  | ||||||
| 			.end = CNS3XXX_PCIE0_CFG0_BASE - 1, /* 16 MiB */ |  | ||||||
| 			.flags = IORESOURCE_IO, |  | ||||||
| 		}, |  | ||||||
| 		.res_mem = { |  | ||||||
| 			.name = "PCIe0 non-prefetchable", |  | ||||||
| 			.start = CNS3XXX_PCIE0_MEM_BASE, |  | ||||||
| 			.end = CNS3XXX_PCIE0_HOST_BASE - 1, /* 176 MiB */ |  | ||||||
| 			.flags = IORESOURCE_MEM, |  | ||||||
| 		}, |  | ||||||
| 		.irqs = { IRQ_CNS3XXX_PCIE0_RC, IRQ_CNS3XXX_PCIE0_DEVICE, }, |  | ||||||
| 		.port = 0, |  | ||||||
| 	}, |  | ||||||
| 	[1] = { |  | ||||||
| 		.host_regs = (void __iomem *)CNS3XXX_PCIE1_HOST_BASE_VIRT, |  | ||||||
| 		.cfg0_regs = (void __iomem *)CNS3XXX_PCIE1_CFG0_BASE_VIRT, |  | ||||||
| 		.cfg1_regs = (void __iomem *)CNS3XXX_PCIE1_CFG1_BASE_VIRT, |  | ||||||
| 		.res_io = { |  | ||||||
| 			.name = "PCIe1 I/O space", |  | ||||||
| 			.start = CNS3XXX_PCIE1_IO_BASE, |  | ||||||
| 			.end = CNS3XXX_PCIE1_CFG0_BASE - 1, /* 16 MiB */ |  | ||||||
| 			.flags = IORESOURCE_IO, |  | ||||||
| 		}, |  | ||||||
| 		.res_mem = { |  | ||||||
| 			.name = "PCIe1 non-prefetchable", |  | ||||||
| 			.start = CNS3XXX_PCIE1_MEM_BASE, |  | ||||||
| 			.end = CNS3XXX_PCIE1_HOST_BASE - 1, /* 176 MiB */ |  | ||||||
| 			.flags = IORESOURCE_MEM, |  | ||||||
| 		}, |  | ||||||
| 		.irqs = { IRQ_CNS3XXX_PCIE1_RC, IRQ_CNS3XXX_PCIE1_DEVICE, }, |  | ||||||
| 		.port = 1, |  | ||||||
| 	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static void __init cns3xxx_pcie_check_link(struct cns3xxx_pcie *cnspci) |  | ||||||
| { |  | ||||||
| 	int port = cnspci->port; |  | ||||||
| 	u32 reg; |  | ||||||
| 	unsigned long time; |  | ||||||
| 
 |  | ||||||
| 	reg = __raw_readl(MISC_PCIE_CTRL(port)); |  | ||||||
| 	/*
 |  | ||||||
| 	 * Enable Application Request to 1, it will exit L1 automatically, |  | ||||||
| 	 * but when chip back, it will use another clock, still can use 0x1. |  | ||||||
| 	 */ |  | ||||||
| 	reg |= 0x3; |  | ||||||
| 	__raw_writel(reg, MISC_PCIE_CTRL(port)); |  | ||||||
| 
 |  | ||||||
| 	pr_info("PCIe: Port[%d] Enable PCIe LTSSM\n", port); |  | ||||||
| 	pr_info("PCIe: Port[%d] Check data link layer...", port); |  | ||||||
| 
 |  | ||||||
| 	time = jiffies; |  | ||||||
| 	while (1) { |  | ||||||
| 		reg = __raw_readl(MISC_PCIE_PM_DEBUG(port)); |  | ||||||
| 		if (reg & 0x1) { |  | ||||||
| 			pr_info("Link up.\n"); |  | ||||||
| 			cnspci->linked = 1; |  | ||||||
| 			break; |  | ||||||
| 		} else if (time_after(jiffies, time + 50)) { |  | ||||||
| 			pr_info("Device not found.\n"); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void cns3xxx_write_config(struct cns3xxx_pcie *cnspci, |  | ||||||
| 					 int where, int size, u32 val) |  | ||||||
| { |  | ||||||
| 	void __iomem *base = cnspci->host_regs + (where & 0xffc); |  | ||||||
| 	u32 v; |  | ||||||
| 	u32 mask = (0x1ull << (size * 8)) - 1; |  | ||||||
| 	int shift = (where % 4) * 8; |  | ||||||
| 
 |  | ||||||
| 	v = readl_relaxed(base); |  | ||||||
| 
 |  | ||||||
| 	v &= ~(mask << shift); |  | ||||||
| 	v |= (val & mask) << shift; |  | ||||||
| 
 |  | ||||||
| 	writel_relaxed(v, base); |  | ||||||
| 	readl_relaxed(base); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void __init cns3xxx_pcie_hw_init(struct cns3xxx_pcie *cnspci) |  | ||||||
| { |  | ||||||
| 	u16 mem_base  = cnspci->res_mem.start >> 16; |  | ||||||
| 	u16 mem_limit = cnspci->res_mem.end   >> 16; |  | ||||||
| 	u16 io_base   = cnspci->res_io.start  >> 16; |  | ||||||
| 	u16 io_limit  = cnspci->res_io.end    >> 16; |  | ||||||
| 
 |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_PRIMARY_BUS, 1, 0); |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_SECONDARY_BUS, 1, 1); |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_SUBORDINATE_BUS, 1, 1); |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_MEMORY_BASE, 2, mem_base); |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_MEMORY_LIMIT, 2, mem_limit); |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_IO_BASE_UPPER16, 2, io_base); |  | ||||||
| 	cns3xxx_write_config(cnspci, PCI_IO_LIMIT_UPPER16, 2, io_limit); |  | ||||||
| 
 |  | ||||||
| 	if (!cnspci->linked) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	/* Set Device Max_Read_Request_Size to 128 byte */ |  | ||||||
| 	pcie_bus_config = PCIE_BUS_PEER2PEER; |  | ||||||
| 
 |  | ||||||
| 	/* Disable PCIe0 Interrupt Mask INTA to INTD */ |  | ||||||
| 	__raw_writel(~0x3FFF, MISC_PCIE_INT_MASK(cnspci->port)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int cns3xxx_pcie_abort_handler(unsigned long addr, unsigned int fsr, |  | ||||||
| 				      struct pt_regs *regs) |  | ||||||
| { |  | ||||||
| 	if (fsr & (1 << 10)) |  | ||||||
| 		regs->ARM_pc += 4; |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void __init cns3xxx_pcie_init_late(void) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 	void *private_data; |  | ||||||
| 	struct hw_pci hw_pci = { |  | ||||||
| 	       .nr_controllers = 1, |  | ||||||
| 	       .ops = &cns3xxx_pcie_ops, |  | ||||||
| 	       .setup = cns3xxx_pci_setup, |  | ||||||
| 	       .map_irq = cns3xxx_pcie_map_irq, |  | ||||||
| 	       .private_data = &private_data, |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	pcibios_min_io = 0; |  | ||||||
| 	pcibios_min_mem = 0; |  | ||||||
| 
 |  | ||||||
| 	hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS, 0, |  | ||||||
| 			"imprecise external abort"); |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; i < ARRAY_SIZE(cns3xxx_pcie); i++) { |  | ||||||
| 		cns3xxx_pwr_clk_en(0x1 << PM_CLK_GATE_REG_OFFSET_PCIE(i)); |  | ||||||
| 		cns3xxx_pwr_soft_rst(0x1 << PM_SOFT_RST_REG_OFFST_PCIE(i)); |  | ||||||
| 		cns3xxx_pcie_check_link(&cns3xxx_pcie[i]); |  | ||||||
| 		cns3xxx_pcie_hw_init(&cns3xxx_pcie[i]); |  | ||||||
| 		private_data = &cns3xxx_pcie[i]; |  | ||||||
| 		pci_common_init(&hw_pci); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	pci_assign_unassigned_resources(); |  | ||||||
| } |  | ||||||
|  | @ -1,120 +0,0 @@ | ||||||
| // SPDX-License-Identifier: GPL-2.0-only
 |  | ||||||
| /*
 |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <linux/init.h> |  | ||||||
| #include <linux/module.h> |  | ||||||
| #include <linux/io.h> |  | ||||||
| #include <linux/delay.h> |  | ||||||
| #include <linux/atomic.h> |  | ||||||
| #include "cns3xxx.h" |  | ||||||
| #include "pm.h" |  | ||||||
| #include "core.h" |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_clk_en(unsigned int block) |  | ||||||
| { |  | ||||||
| 	u32 reg = __raw_readl(PM_CLK_GATE_REG); |  | ||||||
| 
 |  | ||||||
| 	reg |= (block & PM_CLK_GATE_REG_MASK); |  | ||||||
| 	__raw_writel(reg, PM_CLK_GATE_REG); |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(cns3xxx_pwr_clk_en); |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_clk_dis(unsigned int block) |  | ||||||
| { |  | ||||||
| 	u32 reg = __raw_readl(PM_CLK_GATE_REG); |  | ||||||
| 
 |  | ||||||
| 	reg &= ~(block & PM_CLK_GATE_REG_MASK); |  | ||||||
| 	__raw_writel(reg, PM_CLK_GATE_REG); |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(cns3xxx_pwr_clk_dis); |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_power_up(unsigned int block) |  | ||||||
| { |  | ||||||
| 	u32 reg = __raw_readl(PM_PLL_HM_PD_CTRL_REG); |  | ||||||
| 
 |  | ||||||
| 	reg &= ~(block & CNS3XXX_PWR_PLL_ALL); |  | ||||||
| 	__raw_writel(reg, PM_PLL_HM_PD_CTRL_REG); |  | ||||||
| 
 |  | ||||||
| 	/* Wait for 300us for the PLL output clock locked. */ |  | ||||||
| 	udelay(300); |  | ||||||
| }; |  | ||||||
| EXPORT_SYMBOL(cns3xxx_pwr_power_up); |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_power_down(unsigned int block) |  | ||||||
| { |  | ||||||
| 	u32 reg = __raw_readl(PM_PLL_HM_PD_CTRL_REG); |  | ||||||
| 
 |  | ||||||
| 	/* write '1' to power down */ |  | ||||||
| 	reg |= (block & CNS3XXX_PWR_PLL_ALL); |  | ||||||
| 	__raw_writel(reg, PM_PLL_HM_PD_CTRL_REG); |  | ||||||
| }; |  | ||||||
| EXPORT_SYMBOL(cns3xxx_pwr_power_down); |  | ||||||
| 
 |  | ||||||
| static void cns3xxx_pwr_soft_rst_force(unsigned int block) |  | ||||||
| { |  | ||||||
| 	u32 reg = __raw_readl(PM_SOFT_RST_REG); |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * bit 0, 28, 29 => program low to reset, |  | ||||||
| 	 * the other else program low and then high |  | ||||||
| 	 */ |  | ||||||
| 	if (block & 0x30000001) { |  | ||||||
| 		reg &= ~(block & PM_SOFT_RST_REG_MASK); |  | ||||||
| 	} else { |  | ||||||
| 		reg &= ~(block & PM_SOFT_RST_REG_MASK); |  | ||||||
| 		__raw_writel(reg, PM_SOFT_RST_REG); |  | ||||||
| 		reg |= (block & PM_SOFT_RST_REG_MASK); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	__raw_writel(reg, PM_SOFT_RST_REG); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_soft_rst(unsigned int block) |  | ||||||
| { |  | ||||||
| 	static unsigned int soft_reset; |  | ||||||
| 
 |  | ||||||
| 	if (soft_reset & block) { |  | ||||||
| 		/* SPI/I2C/GPIO use the same block, reset once. */ |  | ||||||
| 		return; |  | ||||||
| 	} else { |  | ||||||
| 		soft_reset |= block; |  | ||||||
| 	} |  | ||||||
| 	cns3xxx_pwr_soft_rst_force(block); |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(cns3xxx_pwr_soft_rst); |  | ||||||
| 
 |  | ||||||
| void cns3xxx_restart(enum reboot_mode mode, const char *cmd) |  | ||||||
| { |  | ||||||
| 	/*
 |  | ||||||
| 	 * To reset, we hit the on-board reset register |  | ||||||
| 	 * in the system FPGA. |  | ||||||
| 	 */ |  | ||||||
| 	cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(GLOBAL)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * cns3xxx_cpu_clock - return CPU/L2 clock |  | ||||||
|  *  aclk: cpu clock/2 |  | ||||||
|  *  hclk: cpu clock/4 |  | ||||||
|  *  pclk: cpu clock/8 |  | ||||||
|  */ |  | ||||||
| int cns3xxx_cpu_clock(void) |  | ||||||
| { |  | ||||||
| 	u32 reg = __raw_readl(PM_CLK_CTRL_REG); |  | ||||||
| 	int cpu; |  | ||||||
| 	int cpu_sel; |  | ||||||
| 	int div_sel; |  | ||||||
| 
 |  | ||||||
| 	cpu_sel = (reg >> PM_CLK_CTRL_REG_OFFSET_PLL_CPU_SEL) & 0xf; |  | ||||||
| 	div_sel = (reg >> PM_CLK_CTRL_REG_OFFSET_CPU_CLK_DIV) & 0x3; |  | ||||||
| 
 |  | ||||||
| 	cpu = (300 + ((cpu_sel / 3) * 100) + ((cpu_sel % 3) * 33)) >> div_sel; |  | ||||||
| 
 |  | ||||||
| 	return cpu; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(cns3xxx_cpu_clock); |  | ||||||
| 
 |  | ||||||
| atomic_t usb_pwr_ref = ATOMIC_INIT(0); |  | ||||||
| EXPORT_SYMBOL(usb_pwr_ref); |  | ||||||
|  | @ -1,20 +0,0 @@ | ||||||
| /* SPDX-License-Identifier: GPL-2.0-only */ |  | ||||||
| /*
 |  | ||||||
|  * Copyright 2000 Deep Blue Solutions Ltd |  | ||||||
|  * Copyright 2004 ARM Limited |  | ||||||
|  * Copyright 2008 Cavium Networks |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef __CNS3XXX_PM_H |  | ||||||
| #define __CNS3XXX_PM_H |  | ||||||
| 
 |  | ||||||
| #include <linux/atomic.h> |  | ||||||
| 
 |  | ||||||
| void cns3xxx_pwr_clk_en(unsigned int block); |  | ||||||
| void cns3xxx_pwr_clk_dis(unsigned int block); |  | ||||||
| void cns3xxx_pwr_power_up(unsigned int block); |  | ||||||
| void cns3xxx_pwr_power_down(unsigned int block); |  | ||||||
| 
 |  | ||||||
| extern atomic_t usb_pwr_ref; |  | ||||||
| 
 |  | ||||||
| #endif /* __CNS3XXX_PM_H */ |  | ||||||
|  | @ -316,18 +316,6 @@ config USB_OCTEON_HCD | ||||||
| 	  To compile this driver as a module, choose M here. The module | 	  To compile this driver as a module, choose M here. The module | ||||||
| 	  will be called octeon-hcd. | 	  will be called octeon-hcd. | ||||||
| 
 | 
 | ||||||
| config USB_CNS3XXX_EHCI |  | ||||||
| 	bool "Cavium CNS3XXX EHCI Module (DEPRECATED)" |  | ||||||
| 	depends on ARCH_CNS3XXX || COMPILE_TEST |  | ||||||
| 	select USB_EHCI_HCD_PLATFORM |  | ||||||
| 	help |  | ||||||
| 	  This option is deprecated now and the driver was removed, use |  | ||||||
| 	  USB_EHCI_HCD_PLATFORM instead. |  | ||||||
| 
 |  | ||||||
| 	  Enable support for the CNS3XXX SOC's on-chip EHCI controller. |  | ||||||
| 	  It is needed for high-speed (480Mbit/sec) USB 2.0 device |  | ||||||
| 	  support. |  | ||||||
| 
 |  | ||||||
| config USB_EHCI_HCD_PLATFORM | config USB_EHCI_HCD_PLATFORM | ||||||
| 	tristate "Generic EHCI driver for a platform device" | 	tristate "Generic EHCI driver for a platform device" | ||||||
| 	help | 	help | ||||||
|  | @ -566,17 +554,6 @@ config USB_OHCI_EXYNOS | ||||||
| 	  Enable support for the Samsung S5Pv210 and Exynos SOC's on-chip OHCI | 	  Enable support for the Samsung S5Pv210 and Exynos SOC's on-chip OHCI | ||||||
| 	  controller. | 	  controller. | ||||||
| 
 | 
 | ||||||
| config USB_CNS3XXX_OHCI |  | ||||||
| 	bool "Cavium CNS3XXX OHCI Module (DEPRECATED)" |  | ||||||
| 	depends on ARCH_CNS3XXX || COMPILE_TEST |  | ||||||
| 	select USB_OHCI_HCD_PLATFORM |  | ||||||
| 	help |  | ||||||
| 	  This option is deprecated now and the driver was removed, use |  | ||||||
| 	  USB_OHCI_HCD_PLATFORM instead. |  | ||||||
| 
 |  | ||||||
| 	  Enable support for the CNS3XXX SOC's on-chip OHCI controller. |  | ||||||
| 	  It is needed for low-speed USB 1.0 device support. |  | ||||||
| 
 |  | ||||||
| config USB_OHCI_HCD_PLATFORM | config USB_OHCI_HCD_PLATFORM | ||||||
| 	tristate "Generic OHCI driver for a platform device" | 	tristate "Generic OHCI driver for a platform device" | ||||||
| 	help | 	help | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Arnd Bergmann
						Arnd Bergmann