mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	ARM updates for 5.12-rc1:
- Generalise byte swapping assembly - Update debug addresses for STI - Validate start of physical memory with DTB - Do not clear SCTLR.nTLSMD in decompressor - amba/locomo/sa1111 devices remove method return type is void - address markers for KASAN in page table dump -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEuNNh8scc2k/wOAE+9OeQG+StrGQFAmAzrfYACgkQ9OeQG+St rGTmRQ/+MG9BO1WahlXZ9eVx6n6KmtwlzAy5m4B24GomvcXsa+T2s0Vs43hAsOQ2 f/b6n1mPlwRjAvKW8IfO243HKDE6STGbtVPae6ts586QCODs8i3MQsq4SWmM/DMk TR87hTo1zd4baVT9tkM8/UdUwQjr0yRf4ZDhcCj09tMClnV/8ZAEE9/lLkBpDoer wcuPaDtRfJhN+Pqnm8ES8KPj15nVm/GFWBFoDWZIOCjyDnl8Y/1Bnz3NeqzfwM1o O0NS/9a1tMBn7TNGkkcJCimqOLZS2OgxLND8fie0rC5fmwzVomKXE24OdXpSQCps LiGJr+iQOaX6qNqJY2h1If8F+RPwKfh4Mrk12x0MWB6Ap2iKsQ6bmtUCNatmJ4PG 5iKV5zY0SwKRYXAkXcNosEPUJqZirFHJCzrQ8IBmiSJ1cahZykWFgorDnA97kNLR Wlp2Y/037ug7EGZ0YSaXvbpuMyyjDP4TBKqBiSl7a90QYoXQg2QgcrBO3kVlh/5H Dxq9URvIpDLIGo1EUBU90kB54TUeDhJVHJWDfXNwOp4dP1Xm6b2w+d86GnUQanlC sinRut1ULMyitmIzg9F74MZKaSJ65ffEP3nZKIAlSSISQL+/bXtMDVtakVGsv1k1 w4IdACf3GqbjHig4mOX0oW7IwtyfBY+0q3udY28ASW0ujsH9qHE= =BULT -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm Pull ARM updates from Russell King: - Generalise byte swapping assembly - Update debug addresses for STI - Validate start of physical memory with DTB - Do not clear SCTLR.nTLSMD in decompressor - amba/locomo/sa1111 devices remove method return type is void - address markers for KASAN in page table dump * tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm: ARM: 9065/1: OABI compat: fix build when EPOLL is not enabled ARM: 9055/1: mailbox: arm_mhuv2: make remove callback return void amba: Make use of bus_type functions amba: Make the remove callback return void vfio: platform: simplify device removal amba: reorder functions amba: Fix resource leak for drivers without .remove ARM: 9054/1: arch/arm/mm/mmu.c: Remove duplicate header ARM: 9053/1: arm/mm/ptdump:Add address markers for KASAN regions ARM: 9051/1: vdso: remove unneded extra-y addition ARM: 9050/1: Kconfig: Select ARCH_HAVE_NMI_SAFE_CMPXCHG where possible ARM: 9049/1: locomo: make locomo bus's remove callback return void ARM: 9048/1: sa1111: make sa1111 bus's remove callback return void ARM: 9047/1: smp: remove unused variable ARM: 9046/1: decompressor: Do not clear SCTLR.nTLSMD for ARMv7+ cores ARM: 9045/1: uncompress: Validate start of physical memory against passed DTB ARM: 9042/1: debug: no uncompress debugging while semihosting ARM: 9041/1: sti LL_UART: add STiH418 SBC UART0 support ARM: 9040/1: use DEBUG_UART_PHYS and DEBUG_UART_VIRT for sti LL_UART ARM: 9039/1: assembler: generalize byte swapping macro into rev_l
This commit is contained in:
		
						commit
						6ff6f86bc4
					
				
					 53 changed files with 418 additions and 285 deletions
				
			
		| 
						 | 
					@ -23,6 +23,7 @@ config ARM
 | 
				
			||||||
	select ARCH_HAS_TEARDOWN_DMA_OPS if MMU
 | 
						select ARCH_HAS_TEARDOWN_DMA_OPS if MMU
 | 
				
			||||||
	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 | 
						select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 | 
				
			||||||
	select ARCH_HAVE_CUSTOM_GPIO_H
 | 
						select ARCH_HAVE_CUSTOM_GPIO_H
 | 
				
			||||||
 | 
						select ARCH_HAVE_NMI_SAFE_CMPXCHG if CPU_V7 || CPU_V7M || CPU_V6K
 | 
				
			||||||
	select ARCH_HAS_GCOV_PROFILE_ALL
 | 
						select ARCH_HAS_GCOV_PROFILE_ALL
 | 
				
			||||||
	select ARCH_KEEP_MEMBLOCK
 | 
						select ARCH_KEEP_MEMBLOCK
 | 
				
			||||||
	select ARCH_MIGHT_HAVE_PC_PARPORT
 | 
						select ARCH_MIGHT_HAVE_PC_PARPORT
 | 
				
			||||||
| 
						 | 
					@ -1856,9 +1857,10 @@ config AUTO_ZRELADDR
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  ZRELADDR is the physical address where the decompressed kernel
 | 
						  ZRELADDR is the physical address where the decompressed kernel
 | 
				
			||||||
	  image will be placed. If AUTO_ZRELADDR is selected, the address
 | 
						  image will be placed. If AUTO_ZRELADDR is selected, the address
 | 
				
			||||||
	  will be determined at run-time by masking the current IP with
 | 
						  will be determined at run-time, either by masking the current IP
 | 
				
			||||||
	  0xf8000000. This assumes the zImage being placed in the first 128MB
 | 
						  with 0xf8000000, or, if invalid, from the DTB passed in r2.
 | 
				
			||||||
	  from start of memory.
 | 
						  This assumes the zImage being placed in the first 128MB from
 | 
				
			||||||
 | 
						  start of memory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config EFI_STUB
 | 
					config EFI_STUB
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1158,10 +1158,9 @@ choice
 | 
				
			||||||
		  Say Y here if you want kernel low-level debugging support
 | 
							  Say Y here if you want kernel low-level debugging support
 | 
				
			||||||
		  on ST SPEAr13xx based platforms.
 | 
							  on ST SPEAr13xx based platforms.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config STIH41X_DEBUG_ASC2
 | 
						config DEBUG_STIH41X_ASC2
 | 
				
			||||||
		bool "Use StiH415/416 ASC2 UART for low-level debug"
 | 
							bool "Use StiH415/416 ASC2 UART for low-level debug"
 | 
				
			||||||
		depends on ARCH_STI
 | 
							depends on ARCH_STI
 | 
				
			||||||
		select DEBUG_STI_UART
 | 
					 | 
				
			||||||
		help
 | 
							help
 | 
				
			||||||
		  Say Y here if you want kernel low-level debugging support
 | 
							  Say Y here if you want kernel low-level debugging support
 | 
				
			||||||
		  on STiH415/416 based platforms like b2000, which has
 | 
							  on STiH415/416 based platforms like b2000, which has
 | 
				
			||||||
| 
						 | 
					@ -1169,10 +1168,9 @@ choice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		  If unsure, say N.
 | 
							  If unsure, say N.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config STIH41X_DEBUG_SBC_ASC1
 | 
						config DEBUG_STIH41X_SBC_ASC1
 | 
				
			||||||
		bool "Use StiH415/416 SBC ASC1 UART for low-level debug"
 | 
							bool "Use StiH415/416 SBC ASC1 UART for low-level debug"
 | 
				
			||||||
		depends on ARCH_STI
 | 
							depends on ARCH_STI
 | 
				
			||||||
		select DEBUG_STI_UART
 | 
					 | 
				
			||||||
		help
 | 
							help
 | 
				
			||||||
		  Say Y here if you want kernel low-level debugging support
 | 
							  Say Y here if you want kernel low-level debugging support
 | 
				
			||||||
		  on STiH415/416 based platforms like b2020. which has
 | 
							  on STiH415/416 based platforms like b2020. which has
 | 
				
			||||||
| 
						 | 
					@ -1180,6 +1178,16 @@ choice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		  If unsure, say N.
 | 
							  If unsure, say N.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config DEBUG_STIH418_SBC_ASC0
 | 
				
			||||||
 | 
							bool "Use StiH418 SBC ASC0 UART for low-level debug"
 | 
				
			||||||
 | 
							depends on ARCH_STI
 | 
				
			||||||
 | 
							help
 | 
				
			||||||
 | 
							  Say Y here if you want kernel low-level debugging support
 | 
				
			||||||
 | 
							  on STiH418 based platforms which has default UART wired
 | 
				
			||||||
 | 
							  up to SBC ASC0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  If unsure, say N.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config STM32F4_DEBUG_UART
 | 
						config STM32F4_DEBUG_UART
 | 
				
			||||||
		bool "Use STM32F4 UART for low-level debug"
 | 
							bool "Use STM32F4 UART for low-level debug"
 | 
				
			||||||
		depends on MACH_STM32F429 || MACH_STM32F469
 | 
							depends on MACH_STM32F429 || MACH_STM32F469
 | 
				
			||||||
| 
						 | 
					@ -1484,10 +1492,6 @@ config DEBUG_TEGRA_UART
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
	depends on ARCH_TEGRA
 | 
						depends on ARCH_TEGRA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config DEBUG_STI_UART
 | 
					 | 
				
			||||||
	bool
 | 
					 | 
				
			||||||
	depends on ARCH_STI
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
config DEBUG_STM32_UART
 | 
					config DEBUG_STM32_UART
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
	depends on ARCH_STM32
 | 
						depends on ARCH_STM32
 | 
				
			||||||
| 
						 | 
					@ -1546,7 +1550,9 @@ config DEBUG_LL_INCLUDE
 | 
				
			||||||
	default "debug/renesas-scif.S" if DEBUG_RMOBILE_SCIFA4
 | 
						default "debug/renesas-scif.S" if DEBUG_RMOBILE_SCIFA4
 | 
				
			||||||
	default "debug/s3c24xx.S" if DEBUG_S3C24XX_UART || DEBUG_S3C64XX_UART
 | 
						default "debug/s3c24xx.S" if DEBUG_S3C24XX_UART || DEBUG_S3C64XX_UART
 | 
				
			||||||
	default "debug/s5pv210.S" if DEBUG_S5PV210_UART
 | 
						default "debug/s5pv210.S" if DEBUG_S5PV210_UART
 | 
				
			||||||
	default "debug/sti.S" if DEBUG_STI_UART
 | 
						default "debug/sti.S" if DEBUG_STIH41X_ASC2
 | 
				
			||||||
 | 
						default "debug/sti.S" if DEBUG_STIH41X_SBC_ASC1
 | 
				
			||||||
 | 
						default "debug/sti.S" if DEBUG_STIH418_SBC_ASC0
 | 
				
			||||||
	default "debug/stm32.S" if DEBUG_STM32_UART
 | 
						default "debug/stm32.S" if DEBUG_STM32_UART
 | 
				
			||||||
	default "debug/tegra.S" if DEBUG_TEGRA_UART
 | 
						default "debug/tegra.S" if DEBUG_TEGRA_UART
 | 
				
			||||||
	default "debug/ux500.S" if DEBUG_UX500_UART
 | 
						default "debug/ux500.S" if DEBUG_UX500_UART
 | 
				
			||||||
| 
						 | 
					@ -1579,6 +1585,7 @@ config DEBUG_UART_PHYS
 | 
				
			||||||
	default 0x02531000 if DEBUG_KEYSTONE_UART1
 | 
						default 0x02531000 if DEBUG_KEYSTONE_UART1
 | 
				
			||||||
	default 0x03010fe0 if ARCH_RPC
 | 
						default 0x03010fe0 if ARCH_RPC
 | 
				
			||||||
	default 0x07000000 if DEBUG_SUN9I_UART0
 | 
						default 0x07000000 if DEBUG_SUN9I_UART0
 | 
				
			||||||
 | 
						default 0x09530000 if DEBUG_STIH418_SBC_ASC0
 | 
				
			||||||
	default 0x10009000 if DEBUG_REALVIEW_STD_PORT || \
 | 
						default 0x10009000 if DEBUG_REALVIEW_STD_PORT || \
 | 
				
			||||||
				DEBUG_VEXPRESS_UART0_CA9
 | 
									DEBUG_VEXPRESS_UART0_CA9
 | 
				
			||||||
	default 0x1010c000 if DEBUG_REALVIEW_PB1176_PORT
 | 
						default 0x1010c000 if DEBUG_REALVIEW_PB1176_PORT
 | 
				
			||||||
| 
						 | 
					@ -1671,7 +1678,9 @@ config DEBUG_UART_PHYS
 | 
				
			||||||
	default 0xfc00c000 if DEBUG_AT91_SAMA5D4_USART3
 | 
						default 0xfc00c000 if DEBUG_AT91_SAMA5D4_USART3
 | 
				
			||||||
	default 0xfcb00000 if DEBUG_HI3620_UART
 | 
						default 0xfcb00000 if DEBUG_HI3620_UART
 | 
				
			||||||
	default 0xfd883000 if DEBUG_ALPINE_UART0
 | 
						default 0xfd883000 if DEBUG_ALPINE_UART0
 | 
				
			||||||
 | 
						default 0xfe531000 if DEBUG_STIH41X_SBC_ASC1
 | 
				
			||||||
	default 0xfe800000 if ARCH_IOP32X
 | 
						default 0xfe800000 if ARCH_IOP32X
 | 
				
			||||||
 | 
						default 0xfed32000 if DEBUG_STIH41X_ASC2
 | 
				
			||||||
	default 0xff690000 if DEBUG_RK32_UART2
 | 
						default 0xff690000 if DEBUG_RK32_UART2
 | 
				
			||||||
	default 0xffc02000 if DEBUG_SOCFPGA_UART0
 | 
						default 0xffc02000 if DEBUG_SOCFPGA_UART0
 | 
				
			||||||
	default 0xffc02100 if DEBUG_SOCFPGA_ARRIA10_UART1
 | 
						default 0xffc02100 if DEBUG_SOCFPGA_ARRIA10_UART1
 | 
				
			||||||
| 
						 | 
					@ -1699,7 +1708,9 @@ config DEBUG_UART_PHYS
 | 
				
			||||||
		DEBUG_S3C64XX_UART || \
 | 
							DEBUG_S3C64XX_UART || \
 | 
				
			||||||
		DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
 | 
							DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
 | 
				
			||||||
		DEBUG_DIGICOLOR_UA0 || \
 | 
							DEBUG_DIGICOLOR_UA0 || \
 | 
				
			||||||
		DEBUG_AT91_UART || DEBUG_STM32_UART
 | 
							DEBUG_AT91_UART || DEBUG_STM32_UART || \
 | 
				
			||||||
 | 
							DEBUG_STIH41X_ASC2 || DEBUG_STIH41X_SBC_ASC1 || \
 | 
				
			||||||
 | 
							DEBUG_STIH418_SBC_ASC0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config DEBUG_UART_VIRT
 | 
					config DEBUG_UART_VIRT
 | 
				
			||||||
	hex "Virtual base address of debug UART"
 | 
						hex "Virtual base address of debug UART"
 | 
				
			||||||
| 
						 | 
					@ -1744,6 +1755,7 @@ config DEBUG_UART_VIRT
 | 
				
			||||||
	default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
 | 
						default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
 | 
				
			||||||
	default 0xf8ffee00 if DEBUG_AT91_SAM9263_DBGU
 | 
						default 0xf8ffee00 if DEBUG_AT91_SAM9263_DBGU
 | 
				
			||||||
	default 0xf8fff200 if DEBUG_AT91_RM9200_DBGU
 | 
						default 0xf8fff200 if DEBUG_AT91_RM9200_DBGU
 | 
				
			||||||
 | 
						default 0xf9530000 if DEBUG_STIH418_SBC_ASC0
 | 
				
			||||||
	default 0xf9e09000 if DEBUG_AM33XXUART1
 | 
						default 0xf9e09000 if DEBUG_AM33XXUART1
 | 
				
			||||||
	default 0xfa020000 if DEBUG_OMAP4UART3 || DEBUG_TI81XXUART1
 | 
						default 0xfa020000 if DEBUG_OMAP4UART3 || DEBUG_TI81XXUART1
 | 
				
			||||||
	default 0xfa022000 if DEBUG_TI81XXUART2
 | 
						default 0xfa022000 if DEBUG_TI81XXUART2
 | 
				
			||||||
| 
						 | 
					@ -1762,7 +1774,9 @@ config DEBUG_UART_VIRT
 | 
				
			||||||
	default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
 | 
						default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
 | 
				
			||||||
	default 0xfcfe8600 if DEBUG_BCM63XX_UART
 | 
						default 0xfcfe8600 if DEBUG_BCM63XX_UART
 | 
				
			||||||
	default 0xfd000000 if DEBUG_SPEAR3XX || DEBUG_SPEAR13XX
 | 
						default 0xfd000000 if DEBUG_SPEAR3XX || DEBUG_SPEAR13XX
 | 
				
			||||||
 | 
						default 0xfd531000 if DEBUG_STIH41X_SBC_ASC1
 | 
				
			||||||
	default 0xfd883000 if DEBUG_ALPINE_UART0
 | 
						default 0xfd883000 if DEBUG_ALPINE_UART0
 | 
				
			||||||
 | 
						default 0xfdd32000 if DEBUG_STIH41X_ASC2
 | 
				
			||||||
	default 0xfe010000 if STM32MP1_DEBUG_UART
 | 
						default 0xfe010000 if STM32MP1_DEBUG_UART
 | 
				
			||||||
	default 0xfe017000 if DEBUG_MMP_UART2
 | 
						default 0xfe017000 if DEBUG_MMP_UART2
 | 
				
			||||||
	default 0xfe018000 if DEBUG_MMP_UART3
 | 
						default 0xfe018000 if DEBUG_MMP_UART3
 | 
				
			||||||
| 
						 | 
					@ -1803,7 +1817,9 @@ config DEBUG_UART_VIRT
 | 
				
			||||||
		DEBUG_S3C64XX_UART || \
 | 
							DEBUG_S3C64XX_UART || \
 | 
				
			||||||
		DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
 | 
							DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
 | 
				
			||||||
		DEBUG_DIGICOLOR_UA0 || \
 | 
							DEBUG_DIGICOLOR_UA0 || \
 | 
				
			||||||
		DEBUG_AT91_UART || DEBUG_STM32_UART
 | 
							DEBUG_AT91_UART || DEBUG_STM32_UART || \
 | 
				
			||||||
 | 
							DEBUG_STIH41X_ASC2 || DEBUG_STIH41X_SBC_ASC1 || \
 | 
				
			||||||
 | 
							DEBUG_STIH418_SBC_ASC0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config DEBUG_UART_8250_SHIFT
 | 
					config DEBUG_UART_8250_SHIFT
 | 
				
			||||||
	int "Register offset shift for the 8250 debug UART"
 | 
						int "Register offset shift for the 8250 debug UART"
 | 
				
			||||||
| 
						 | 
					@ -1837,7 +1853,7 @@ config DEBUG_UNCOMPRESS
 | 
				
			||||||
	depends on ARCH_MULTIPLATFORM || PLAT_SAMSUNG || ARM_SINGLE_ARMV7M
 | 
						depends on ARCH_MULTIPLATFORM || PLAT_SAMSUNG || ARM_SINGLE_ARMV7M
 | 
				
			||||||
	depends on DEBUG_LL && !DEBUG_OMAP2PLUS_UART && \
 | 
						depends on DEBUG_LL && !DEBUG_OMAP2PLUS_UART && \
 | 
				
			||||||
		     (!DEBUG_TEGRA_UART || !ZBOOT_ROM) && \
 | 
							     (!DEBUG_TEGRA_UART || !ZBOOT_ROM) && \
 | 
				
			||||||
		     !DEBUG_BRCMSTB_UART
 | 
							     !DEBUG_BRCMSTB_UART && !DEBUG_SEMIHOSTING
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  This option influences the normal decompressor output for
 | 
						  This option influences the normal decompressor output for
 | 
				
			||||||
	  multiplatform kernels.  Normally, multiplatform kernels disable
 | 
						  multiplatform kernels.  Normally, multiplatform kernels disable
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,10 +87,13 @@ libfdt_objs := fdt_rw.o fdt_ro.o fdt_wip.o fdt.o
 | 
				
			||||||
ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y)
 | 
					ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y)
 | 
				
			||||||
OBJS	+= $(libfdt_objs) atags_to_fdt.o
 | 
					OBJS	+= $(libfdt_objs) atags_to_fdt.o
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_USE_OF),y)
 | 
				
			||||||
 | 
					OBJS	+= $(libfdt_objs) fdt_check_mem_start.o
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -fstack-protector-strong triggers protection checks in this code,
 | 
					# -fstack-protector-strong triggers protection checks in this code,
 | 
				
			||||||
# but it is being used too early to link to meaningful stack_chk logic.
 | 
					# but it is being used too early to link to meaningful stack_chk logic.
 | 
				
			||||||
$(foreach o, $(libfdt_objs) atags_to_fdt.o, \
 | 
					$(foreach o, $(libfdt_objs) atags_to_fdt.o fdt_check_mem_start.o, \
 | 
				
			||||||
	$(eval CFLAGS_$(o) := -I $(srctree)/scripts/dtc/libfdt -fno-stack-protector))
 | 
						$(eval CFLAGS_$(o) := -I $(srctree)/scripts/dtc/libfdt -fno-stack-protector))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# These were previously generated C files. When you are building the kernel
 | 
					# These were previously generated C files. When you are building the kernel
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										131
									
								
								arch/arm/boot/compressed/fdt_check_mem_start.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								arch/arm/boot/compressed/fdt_check_mem_start.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,131 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0-only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/kernel.h>
 | 
				
			||||||
 | 
					#include <linux/libfdt.h>
 | 
				
			||||||
 | 
					#include <linux/sizes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const void *get_prop(const void *fdt, const char *node_path,
 | 
				
			||||||
 | 
								    const char *property, int minlen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const void *prop;
 | 
				
			||||||
 | 
						int offset, len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						offset = fdt_path_offset(fdt, node_path);
 | 
				
			||||||
 | 
						if (offset < 0)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						prop = fdt_getprop(fdt, offset, property, &len);
 | 
				
			||||||
 | 
						if (!prop || len < minlen)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return prop;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t get_cells(const void *fdt, const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const fdt32_t *prop = get_prop(fdt, "/", name, sizeof(fdt32_t));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!prop) {
 | 
				
			||||||
 | 
							/* default */
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return fdt32_ld(prop);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint64_t get_val(const fdt32_t *cells, uint32_t ncells)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint64_t r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r = fdt32_ld(cells);
 | 
				
			||||||
 | 
						if (ncells > 1)
 | 
				
			||||||
 | 
							r = (r << 32) | fdt32_ld(cells + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Check the start of physical memory
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Traditionally, the start address of physical memory is obtained by masking
 | 
				
			||||||
 | 
					 * the program counter.  However, this does require that this address is a
 | 
				
			||||||
 | 
					 * multiple of 128 MiB, precluding booting Linux on platforms where this
 | 
				
			||||||
 | 
					 * requirement is not fulfilled.
 | 
				
			||||||
 | 
					 * Hence validate the calculated address against the memory information in the
 | 
				
			||||||
 | 
					 * DTB, and, if out-of-range, replace it by the real start address.
 | 
				
			||||||
 | 
					 * To preserve backwards compatibility (systems reserving a block of memory
 | 
				
			||||||
 | 
					 * at the start of physical memory, kdump, ...), the traditional method is
 | 
				
			||||||
 | 
					 * always used if it yields a valid address.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return value: start address of physical memory to use
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t addr_cells, size_cells, base;
 | 
				
			||||||
 | 
						uint32_t fdt_mem_start = 0xffffffff;
 | 
				
			||||||
 | 
						const fdt32_t *reg, *endp;
 | 
				
			||||||
 | 
						uint64_t size, end;
 | 
				
			||||||
 | 
						const char *type;
 | 
				
			||||||
 | 
						int offset, len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!fdt)
 | 
				
			||||||
 | 
							return mem_start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (fdt_magic(fdt) != FDT_MAGIC)
 | 
				
			||||||
 | 
							return mem_start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* There may be multiple cells on LPAE platforms */
 | 
				
			||||||
 | 
						addr_cells = get_cells(fdt, "#address-cells");
 | 
				
			||||||
 | 
						size_cells = get_cells(fdt, "#size-cells");
 | 
				
			||||||
 | 
						if (addr_cells > 2 || size_cells > 2)
 | 
				
			||||||
 | 
							return mem_start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Walk all memory nodes and regions */
 | 
				
			||||||
 | 
						for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0;
 | 
				
			||||||
 | 
						     offset = fdt_next_node(fdt, offset, NULL)) {
 | 
				
			||||||
 | 
							type = fdt_getprop(fdt, offset, "device_type", NULL);
 | 
				
			||||||
 | 
							if (!type || strcmp(type, "memory"))
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							reg = fdt_getprop(fdt, offset, "linux,usable-memory", &len);
 | 
				
			||||||
 | 
							if (!reg)
 | 
				
			||||||
 | 
								reg = fdt_getprop(fdt, offset, "reg", &len);
 | 
				
			||||||
 | 
							if (!reg)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (endp = reg + (len / sizeof(fdt32_t));
 | 
				
			||||||
 | 
							     endp - reg >= addr_cells + size_cells;
 | 
				
			||||||
 | 
							     reg += addr_cells + size_cells) {
 | 
				
			||||||
 | 
								size = get_val(reg + addr_cells, size_cells);
 | 
				
			||||||
 | 
								if (!size)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (addr_cells > 1 && fdt32_ld(reg)) {
 | 
				
			||||||
 | 
									/* Outside 32-bit address space, skipping */
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								base = fdt32_ld(reg + addr_cells - 1);
 | 
				
			||||||
 | 
								end = base + size;
 | 
				
			||||||
 | 
								if (mem_start >= base && mem_start < end) {
 | 
				
			||||||
 | 
									/* Calculated address is valid, use it */
 | 
				
			||||||
 | 
									return mem_start;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (base < fdt_mem_start)
 | 
				
			||||||
 | 
									fdt_mem_start = base;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (fdt_mem_start == 0xffffffff) {
 | 
				
			||||||
 | 
							/* No usable memory found, falling back to default */
 | 
				
			||||||
 | 
							return mem_start;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * The calculated address is not usable.
 | 
				
			||||||
 | 
						 * Use the lowest usable physical memory address from the DTB instead,
 | 
				
			||||||
 | 
						 * and make sure this is a multiple of 2 MiB for phys/virt patching.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						return round_up(fdt_mem_start, SZ_2M);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -174,10 +174,7 @@
 | 
				
			||||||
		.macro	be32tocpu, val, tmp
 | 
							.macro	be32tocpu, val, tmp
 | 
				
			||||||
#ifndef __ARMEB__
 | 
					#ifndef __ARMEB__
 | 
				
			||||||
		/* convert to little endian */
 | 
							/* convert to little endian */
 | 
				
			||||||
		eor	\tmp, \val, \val, ror #16
 | 
							rev_l	\val, \tmp
 | 
				
			||||||
		bic	\tmp, \tmp, #0x00ff0000
 | 
					 | 
				
			||||||
		mov	\val, \val, ror #8
 | 
					 | 
				
			||||||
		eor	\val, \val, \tmp, lsr #8
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		.endm
 | 
							.endm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -282,10 +279,40 @@ not_angel:
 | 
				
			||||||
		 * are already placing their zImage in (eg) the top 64MB
 | 
							 * are already placing their zImage in (eg) the top 64MB
 | 
				
			||||||
		 * of this range.
 | 
							 * of this range.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		mov	r4, pc
 | 
							mov	r0, pc
 | 
				
			||||||
		and	r4, r4, #0xf8000000
 | 
							and	r0, r0, #0xf8000000
 | 
				
			||||||
 | 
					#ifdef CONFIG_USE_OF
 | 
				
			||||||
 | 
							adr	r1, LC1
 | 
				
			||||||
 | 
					#ifdef CONFIG_ARM_APPENDED_DTB
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Look for an appended DTB.  If found, we cannot use it to
 | 
				
			||||||
 | 
							 * validate the calculated start of physical memory, as its
 | 
				
			||||||
 | 
							 * memory nodes may need to be augmented by ATAGS stored at
 | 
				
			||||||
 | 
							 * an offset from the same start of physical memory.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							ldr	r2, [r1, #4]	@ get &_edata
 | 
				
			||||||
 | 
							add	r2, r2, r1	@ relocate it
 | 
				
			||||||
 | 
							ldr	r2, [r2]	@ get DTB signature
 | 
				
			||||||
 | 
							ldr	r3, =OF_DT_MAGIC
 | 
				
			||||||
 | 
							cmp	r2, r3		@ do we have a DTB there?
 | 
				
			||||||
 | 
							beq	1f		@ if yes, skip validation
 | 
				
			||||||
 | 
					#endif /* CONFIG_ARM_APPENDED_DTB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Make sure we have some stack before calling C code.
 | 
				
			||||||
 | 
							 * No GOT fixup has occurred yet, but none of the code we're
 | 
				
			||||||
 | 
							 * about to call uses any global variables.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							ldr	sp, [r1]	@ get stack location
 | 
				
			||||||
 | 
							add	sp, sp, r1	@ apply relocation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Validate calculated start against passed DTB */
 | 
				
			||||||
 | 
							mov	r1, r8
 | 
				
			||||||
 | 
							bl	fdt_check_mem_start
 | 
				
			||||||
 | 
					1:
 | 
				
			||||||
 | 
					#endif /* CONFIG_USE_OF */
 | 
				
			||||||
		/* Determine final kernel image address. */
 | 
							/* Determine final kernel image address. */
 | 
				
			||||||
		add	r4, r4, #TEXT_OFFSET
 | 
							add	r4, r0, #TEXT_OFFSET
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
		ldr	r4, =zreladdr
 | 
							ldr	r4, =zreladdr
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -1164,9 +1191,9 @@ __armv4_mmu_cache_off:
 | 
				
			||||||
__armv7_mmu_cache_off:
 | 
					__armv7_mmu_cache_off:
 | 
				
			||||||
		mrc	p15, 0, r0, c1, c0
 | 
							mrc	p15, 0, r0, c1, c0
 | 
				
			||||||
#ifdef CONFIG_MMU
 | 
					#ifdef CONFIG_MMU
 | 
				
			||||||
		bic	r0, r0, #0x000d
 | 
							bic	r0, r0, #0x0005
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
		bic	r0, r0, #0x000c
 | 
							bic	r0, r0, #0x0004
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		mcr	p15, 0, r0, c1, c0	@ turn MMU and cache off
 | 
							mcr	p15, 0, r0, c1, c0	@ turn MMU and cache off
 | 
				
			||||||
		mov	r0, #0
 | 
							mov	r0, #0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -838,11 +838,10 @@ static int locomo_bus_remove(struct device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct locomo_dev *ldev = LOCOMO_DEV(dev);
 | 
						struct locomo_dev *ldev = LOCOMO_DEV(dev);
 | 
				
			||||||
	struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
 | 
						struct locomo_driver *drv = LOCOMO_DRV(dev->driver);
 | 
				
			||||||
	int ret = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drv->remove)
 | 
						if (drv->remove)
 | 
				
			||||||
		ret = drv->remove(ldev);
 | 
							drv->remove(ldev);
 | 
				
			||||||
	return ret;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct bus_type locomo_bus_type = {
 | 
					struct bus_type locomo_bus_type = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1368,11 +1368,11 @@ static int sa1111_bus_remove(struct device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sa1111_dev *sadev = to_sa1111_device(dev);
 | 
						struct sa1111_dev *sadev = to_sa1111_device(dev);
 | 
				
			||||||
	struct sa1111_driver *drv = SA1111_DRV(dev->driver);
 | 
						struct sa1111_driver *drv = SA1111_DRV(dev->driver);
 | 
				
			||||||
	int ret = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drv->remove)
 | 
						if (drv->remove)
 | 
				
			||||||
		ret = drv->remove(sadev);
 | 
							drv->remove(sadev);
 | 
				
			||||||
	return ret;
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct bus_type sa1111_bus_type = {
 | 
					struct bus_type sa1111_bus_type = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -578,4 +578,21 @@ THUMB(	orr	\reg , \reg , #PSR_T_BIT	)
 | 
				
			||||||
	__adldst_l	str, \src, \sym, \tmp, \cond
 | 
						__adldst_l	str, \src, \sym, \tmp, \cond
 | 
				
			||||||
	.endm
 | 
						.endm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * rev_l - byte-swap a 32-bit value
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @val: source/destination register
 | 
				
			||||||
 | 
						 * @tmp: scratch register
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						.macro		rev_l, val:req, tmp:req
 | 
				
			||||||
 | 
						.if		__LINUX_ARM_ARCH__ < 6
 | 
				
			||||||
 | 
						eor		\tmp, \val, \val, ror #16
 | 
				
			||||||
 | 
						bic		\tmp, \tmp, #0x00ff0000
 | 
				
			||||||
 | 
						mov		\val, \val, ror #8
 | 
				
			||||||
 | 
						eor		\val, \val, \tmp, lsr #8
 | 
				
			||||||
 | 
						.else
 | 
				
			||||||
 | 
						rev		\val, \val
 | 
				
			||||||
 | 
						.endif
 | 
				
			||||||
 | 
						.endm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_ASSEMBLER_H__ */
 | 
					#endif /* __ASM_ASSEMBLER_H__ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -188,7 +188,7 @@ struct locomo_driver {
 | 
				
			||||||
	struct device_driver	drv;
 | 
						struct device_driver	drv;
 | 
				
			||||||
	unsigned int		devid;
 | 
						unsigned int		devid;
 | 
				
			||||||
	int (*probe)(struct locomo_dev *);
 | 
						int (*probe)(struct locomo_dev *);
 | 
				
			||||||
	int (*remove)(struct locomo_dev *);
 | 
						void (*remove)(struct locomo_dev *);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LOCOMO_DRV(_d)	container_of((_d), struct locomo_driver, drv)
 | 
					#define LOCOMO_DRV(_d)	container_of((_d), struct locomo_driver, drv)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -403,7 +403,7 @@ struct sa1111_driver {
 | 
				
			||||||
	struct device_driver	drv;
 | 
						struct device_driver	drv;
 | 
				
			||||||
	unsigned int		devid;
 | 
						unsigned int		devid;
 | 
				
			||||||
	int (*probe)(struct sa1111_dev *);
 | 
						int (*probe)(struct sa1111_dev *);
 | 
				
			||||||
	int (*remove)(struct sa1111_dev *);
 | 
						void (*remove)(struct sa1111_dev *);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SA1111_DRV(_d)	container_of((_d), struct sa1111_driver, drv)
 | 
					#define SA1111_DRV(_d)	container_of((_d), struct sa1111_driver, drv)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,28 +6,6 @@
 | 
				
			||||||
 * Copyright (C) 2013 STMicroelectronics (R&D) Limited.
 | 
					 * Copyright (C) 2013 STMicroelectronics (R&D) Limited.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define STIH41X_COMMS_BASE              0xfed00000
 | 
					 | 
				
			||||||
#define STIH41X_ASC2_BASE               (STIH41X_COMMS_BASE+0x32000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define STIH41X_SBC_LPM_BASE            0xfe400000
 | 
					 | 
				
			||||||
#define STIH41X_SBC_COMMS_BASE          (STIH41X_SBC_LPM_BASE + 0x100000)
 | 
					 | 
				
			||||||
#define STIH41X_SBC_ASC1_BASE           (STIH41X_SBC_COMMS_BASE + 0x31000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define VIRT_ADDRESS(x)		(x - 0x1000000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if IS_ENABLED(CONFIG_STIH41X_DEBUG_ASC2)
 | 
					 | 
				
			||||||
#define DEBUG_LL_UART_BASE	STIH41X_ASC2_BASE
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if IS_ENABLED(CONFIG_STIH41X_DEBUG_SBC_ASC1)
 | 
					 | 
				
			||||||
#define DEBUG_LL_UART_BASE	STIH41X_SBC_ASC1_BASE
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef DEBUG_LL_UART_BASE
 | 
					 | 
				
			||||||
#error "DEBUG UART is not Configured"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define ASC_TX_BUF_OFF  0x04
 | 
					#define ASC_TX_BUF_OFF  0x04
 | 
				
			||||||
#define ASC_CTRL_OFF    0x0c
 | 
					#define ASC_CTRL_OFF    0x0c
 | 
				
			||||||
#define ASC_STA_OFF     0x14
 | 
					#define ASC_STA_OFF     0x14
 | 
				
			||||||
| 
						 | 
					@ -37,8 +15,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		.macro	addruart, rp, rv, tmp
 | 
							.macro	addruart, rp, rv, tmp
 | 
				
			||||||
		ldr	\rp,      =DEBUG_LL_UART_BASE	@ physical base
 | 
							ldr	\rp,      =CONFIG_DEBUG_UART_PHYS	@ physical base
 | 
				
			||||||
		ldr	\rv,      =VIRT_ADDRESS(DEBUG_LL_UART_BASE) @ virt base
 | 
							ldr	\rv,      =CONFIG_DEBUG_UART_VIRT	@ virt base
 | 
				
			||||||
		.endm
 | 
							.endm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                .macro  senduart,rd,rx
 | 
					                .macro  senduart,rd,rx
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -540,12 +540,9 @@ void show_ipi_list(struct seq_file *p, int prec)
 | 
				
			||||||
	unsigned int cpu, i;
 | 
						unsigned int cpu, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < NR_IPI; i++) {
 | 
						for (i = 0; i < NR_IPI; i++) {
 | 
				
			||||||
		unsigned int irq;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!ipi_desc[i])
 | 
							if (!ipi_desc[i])
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		irq = irq_desc_get_irq(ipi_desc[i]);
 | 
					 | 
				
			||||||
		seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);
 | 
							seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for_each_online_cpu(cpu)
 | 
							for_each_online_cpu(cpu)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,6 +248,7 @@ struct oabi_epoll_event {
 | 
				
			||||||
	__u64 data;
 | 
						__u64 data;
 | 
				
			||||||
} __attribute__ ((packed,aligned(4)));
 | 
					} __attribute__ ((packed,aligned(4)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_EPOLL
 | 
				
			||||||
asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd,
 | 
					asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd,
 | 
				
			||||||
				   struct oabi_epoll_event __user *event)
 | 
									   struct oabi_epoll_event __user *event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -298,6 +299,20 @@ asmlinkage long sys_oabi_epoll_wait(int epfd,
 | 
				
			||||||
	kfree(kbuf);
 | 
						kfree(kbuf);
 | 
				
			||||||
	return err ? -EFAULT : ret;
 | 
						return err ? -EFAULT : ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd,
 | 
				
			||||||
 | 
									   struct oabi_epoll_event __user *event)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return -EINVAL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					asmlinkage long sys_oabi_epoll_wait(int epfd,
 | 
				
			||||||
 | 
									    struct oabi_epoll_event __user *events,
 | 
				
			||||||
 | 
									    int maxevents, int timeout)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return -EINVAL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct oabi_sembuf {
 | 
					struct oabi_sembuf {
 | 
				
			||||||
	unsigned short	sem_num;
 | 
						unsigned short	sem_num;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -224,18 +224,12 @@ static int collie_uart_probe(struct locomo_dev *dev)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int collie_uart_remove(struct locomo_dev *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static struct locomo_driver collie_uart_driver = {
 | 
					static struct locomo_driver collie_uart_driver = {
 | 
				
			||||||
	.drv = {
 | 
						.drv = {
 | 
				
			||||||
		.name = "collie_uart",
 | 
							.name = "collie_uart",
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	.devid	= LOCOMO_DEVID_UART,
 | 
						.devid	= LOCOMO_DEVID_UART,
 | 
				
			||||||
	.probe	= collie_uart_probe,
 | 
						.probe	= collie_uart_probe,
 | 
				
			||||||
	.remove	= collie_uart_remove,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __init collie_uart_init(void)
 | 
					static int __init collie_uart_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,10 @@
 | 
				
			||||||
#include <asm/ptdump.h>
 | 
					#include <asm/ptdump.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct addr_marker address_markers[] = {
 | 
					static struct addr_marker address_markers[] = {
 | 
				
			||||||
 | 
					#ifdef CONFIG_KASAN
 | 
				
			||||||
 | 
						{ KASAN_SHADOW_START,	"Kasan shadow start"},
 | 
				
			||||||
 | 
						{ KASAN_SHADOW_END,	"Kasan shadow end"},
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	{ MODULES_VADDR,	"Modules" },
 | 
						{ MODULES_VADDR,	"Modules" },
 | 
				
			||||||
	{ PAGE_OFFSET,		"Kernel Mapping" },
 | 
						{ PAGE_OFFSET,		"Kernel Mapping" },
 | 
				
			||||||
	{ 0,			"vmalloc() Area" },
 | 
						{ 0,			"vmalloc() Area" },
 | 
				
			||||||
| 
						 | 
					@ -429,8 +433,11 @@ static void ptdump_initialize(void)
 | 
				
			||||||
				if (pg_level[i].bits[j].nx_bit)
 | 
									if (pg_level[i].bits[j].nx_bit)
 | 
				
			||||||
					pg_level[i].nx_bit = &pg_level[i].bits[j];
 | 
										pg_level[i].nx_bit = &pg_level[i].bits[j];
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					#ifdef CONFIG_KASAN
 | 
				
			||||||
 | 
						address_markers[4].start_address = VMALLOC_START;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
	address_markers[2].start_address = VMALLOC_START;
 | 
						address_markers[2].start_address = VMALLOC_START;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct ptdump_info kernel_ptdump_info = {
 | 
					static struct ptdump_info kernel_ptdump_info = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,6 @@
 | 
				
			||||||
#include <asm/cp15.h>
 | 
					#include <asm/cp15.h>
 | 
				
			||||||
#include <asm/cputype.h>
 | 
					#include <asm/cputype.h>
 | 
				
			||||||
#include <asm/cachetype.h>
 | 
					#include <asm/cachetype.h>
 | 
				
			||||||
#include <asm/fixmap.h>
 | 
					 | 
				
			||||||
#include <asm/sections.h>
 | 
					#include <asm/sections.h>
 | 
				
			||||||
#include <asm/setup.h>
 | 
					#include <asm/setup.h>
 | 
				
			||||||
#include <asm/smp_plat.h>
 | 
					#include <asm/smp_plat.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,6 @@ ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
 | 
				
			||||||
	    -T
 | 
						    -T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
obj-$(CONFIG_VDSO) += vdso.o
 | 
					obj-$(CONFIG_VDSO) += vdso.o
 | 
				
			||||||
extra-$(CONFIG_VDSO) += vdso.lds
 | 
					 | 
				
			||||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
 | 
					CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CFLAGS_REMOVE_vdso.o = -pg
 | 
					CFLAGS_REMOVE_vdso.o = -pg
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,31 +56,28 @@ amba_lookup(const struct amba_id *table, struct amba_device *dev)
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int amba_match(struct device *dev, struct device_driver *drv)
 | 
					static int amba_get_enable_pclk(struct amba_device *pcdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct amba_device *pcdev = to_amba_device(dev);
 | 
						int ret;
 | 
				
			||||||
	struct amba_driver *pcdrv = to_amba_driver(drv);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* When driver_override is set, only bind to the matching driver */
 | 
						pcdev->pclk = clk_get(&pcdev->dev, "apb_pclk");
 | 
				
			||||||
	if (pcdev->driver_override)
 | 
						if (IS_ERR(pcdev->pclk))
 | 
				
			||||||
		return !strcmp(pcdev->driver_override, drv->name);
 | 
							return PTR_ERR(pcdev->pclk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return amba_lookup(pcdrv->id_table, pcdev) != NULL;
 | 
						ret = clk_prepare_enable(pcdev->pclk);
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
							clk_put(pcdev->pclk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
 | 
					static void amba_put_disable_pclk(struct amba_device *pcdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct amba_device *pcdev = to_amba_device(dev);
 | 
						clk_disable_unprepare(pcdev->pclk);
 | 
				
			||||||
	int retval = 0;
 | 
						clk_put(pcdev->pclk);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid);
 | 
					 | 
				
			||||||
	if (retval)
 | 
					 | 
				
			||||||
		return retval;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	retval = add_uevent_var(env, "MODALIAS=amba:d%08X", pcdev->periphid);
 | 
					 | 
				
			||||||
	return retval;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t driver_override_show(struct device *_dev,
 | 
					static ssize_t driver_override_show(struct device *_dev,
 | 
				
			||||||
				    struct device_attribute *attr, char *buf)
 | 
									    struct device_attribute *attr, char *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -152,6 +149,109 @@ static struct attribute *amba_dev_attrs[] = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
ATTRIBUTE_GROUPS(amba_dev);
 | 
					ATTRIBUTE_GROUPS(amba_dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int amba_match(struct device *dev, struct device_driver *drv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct amba_device *pcdev = to_amba_device(dev);
 | 
				
			||||||
 | 
						struct amba_driver *pcdrv = to_amba_driver(drv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* When driver_override is set, only bind to the matching driver */
 | 
				
			||||||
 | 
						if (pcdev->driver_override)
 | 
				
			||||||
 | 
							return !strcmp(pcdev->driver_override, drv->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return amba_lookup(pcdrv->id_table, pcdev) != NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct amba_device *pcdev = to_amba_device(dev);
 | 
				
			||||||
 | 
						int retval = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid);
 | 
				
			||||||
 | 
						if (retval)
 | 
				
			||||||
 | 
							return retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						retval = add_uevent_var(env, "MODALIAS=amba:d%08X", pcdev->periphid);
 | 
				
			||||||
 | 
						return retval;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * These are the device model conversion veneers; they convert the
 | 
				
			||||||
 | 
					 * device model structures to our more specific structures.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static int amba_probe(struct device *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct amba_device *pcdev = to_amba_device(dev);
 | 
				
			||||||
 | 
						struct amba_driver *pcdrv = to_amba_driver(dev->driver);
 | 
				
			||||||
 | 
						const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev);
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do {
 | 
				
			||||||
 | 
							ret = of_clk_set_defaults(dev->of_node, false);
 | 
				
			||||||
 | 
							if (ret < 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = dev_pm_domain_attach(dev, true);
 | 
				
			||||||
 | 
							if (ret)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = amba_get_enable_pclk(pcdev);
 | 
				
			||||||
 | 
							if (ret) {
 | 
				
			||||||
 | 
								dev_pm_domain_detach(dev, true);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pm_runtime_get_noresume(dev);
 | 
				
			||||||
 | 
							pm_runtime_set_active(dev);
 | 
				
			||||||
 | 
							pm_runtime_enable(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = pcdrv->probe(pcdev, id);
 | 
				
			||||||
 | 
							if (ret == 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pm_runtime_disable(dev);
 | 
				
			||||||
 | 
							pm_runtime_set_suspended(dev);
 | 
				
			||||||
 | 
							pm_runtime_put_noidle(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							amba_put_disable_pclk(pcdev);
 | 
				
			||||||
 | 
							dev_pm_domain_detach(dev, true);
 | 
				
			||||||
 | 
						} while (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int amba_remove(struct device *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct amba_device *pcdev = to_amba_device(dev);
 | 
				
			||||||
 | 
						struct amba_driver *drv = to_amba_driver(dev->driver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pm_runtime_get_sync(dev);
 | 
				
			||||||
 | 
						if (drv->remove)
 | 
				
			||||||
 | 
							drv->remove(pcdev);
 | 
				
			||||||
 | 
						pm_runtime_put_noidle(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Undo the runtime PM settings in amba_probe() */
 | 
				
			||||||
 | 
						pm_runtime_disable(dev);
 | 
				
			||||||
 | 
						pm_runtime_set_suspended(dev);
 | 
				
			||||||
 | 
						pm_runtime_put_noidle(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						amba_put_disable_pclk(pcdev);
 | 
				
			||||||
 | 
						dev_pm_domain_detach(dev, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void amba_shutdown(struct device *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct amba_driver *drv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!dev->driver)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						drv = to_amba_driver(dev->driver);
 | 
				
			||||||
 | 
						if (drv->shutdown)
 | 
				
			||||||
 | 
							drv->shutdown(to_amba_device(dev));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Hooks to provide runtime PM of the pclk (bus clock).  It is safe to
 | 
					 * Hooks to provide runtime PM of the pclk (bus clock).  It is safe to
 | 
				
			||||||
| 
						 | 
					@ -217,6 +317,9 @@ struct bus_type amba_bustype = {
 | 
				
			||||||
	.dev_groups	= amba_dev_groups,
 | 
						.dev_groups	= amba_dev_groups,
 | 
				
			||||||
	.match		= amba_match,
 | 
						.match		= amba_match,
 | 
				
			||||||
	.uevent		= amba_uevent,
 | 
						.uevent		= amba_uevent,
 | 
				
			||||||
 | 
						.probe		= amba_probe,
 | 
				
			||||||
 | 
						.remove		= amba_remove,
 | 
				
			||||||
 | 
						.shutdown	= amba_shutdown,
 | 
				
			||||||
	.dma_configure	= platform_dma_configure,
 | 
						.dma_configure	= platform_dma_configure,
 | 
				
			||||||
	.pm		= &amba_pm,
 | 
						.pm		= &amba_pm,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -229,99 +332,6 @@ static int __init amba_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
postcore_initcall(amba_init);
 | 
					postcore_initcall(amba_init);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int amba_get_enable_pclk(struct amba_device *pcdev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pcdev->pclk = clk_get(&pcdev->dev, "apb_pclk");
 | 
					 | 
				
			||||||
	if (IS_ERR(pcdev->pclk))
 | 
					 | 
				
			||||||
		return PTR_ERR(pcdev->pclk);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret = clk_prepare_enable(pcdev->pclk);
 | 
					 | 
				
			||||||
	if (ret)
 | 
					 | 
				
			||||||
		clk_put(pcdev->pclk);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void amba_put_disable_pclk(struct amba_device *pcdev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	clk_disable_unprepare(pcdev->pclk);
 | 
					 | 
				
			||||||
	clk_put(pcdev->pclk);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * These are the device model conversion veneers; they convert the
 | 
					 | 
				
			||||||
 * device model structures to our more specific structures.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int amba_probe(struct device *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct amba_device *pcdev = to_amba_device(dev);
 | 
					 | 
				
			||||||
	struct amba_driver *pcdrv = to_amba_driver(dev->driver);
 | 
					 | 
				
			||||||
	const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev);
 | 
					 | 
				
			||||||
	int ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	do {
 | 
					 | 
				
			||||||
		ret = of_clk_set_defaults(dev->of_node, false);
 | 
					 | 
				
			||||||
		if (ret < 0)
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ret = dev_pm_domain_attach(dev, true);
 | 
					 | 
				
			||||||
		if (ret)
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ret = amba_get_enable_pclk(pcdev);
 | 
					 | 
				
			||||||
		if (ret) {
 | 
					 | 
				
			||||||
			dev_pm_domain_detach(dev, true);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		pm_runtime_get_noresume(dev);
 | 
					 | 
				
			||||||
		pm_runtime_set_active(dev);
 | 
					 | 
				
			||||||
		pm_runtime_enable(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ret = pcdrv->probe(pcdev, id);
 | 
					 | 
				
			||||||
		if (ret == 0)
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		pm_runtime_disable(dev);
 | 
					 | 
				
			||||||
		pm_runtime_set_suspended(dev);
 | 
					 | 
				
			||||||
		pm_runtime_put_noidle(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		amba_put_disable_pclk(pcdev);
 | 
					 | 
				
			||||||
		dev_pm_domain_detach(dev, true);
 | 
					 | 
				
			||||||
	} while (0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int amba_remove(struct device *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct amba_device *pcdev = to_amba_device(dev);
 | 
					 | 
				
			||||||
	struct amba_driver *drv = to_amba_driver(dev->driver);
 | 
					 | 
				
			||||||
	int ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pm_runtime_get_sync(dev);
 | 
					 | 
				
			||||||
	ret = drv->remove(pcdev);
 | 
					 | 
				
			||||||
	pm_runtime_put_noidle(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Undo the runtime PM settings in amba_probe() */
 | 
					 | 
				
			||||||
	pm_runtime_disable(dev);
 | 
					 | 
				
			||||||
	pm_runtime_set_suspended(dev);
 | 
					 | 
				
			||||||
	pm_runtime_put_noidle(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	amba_put_disable_pclk(pcdev);
 | 
					 | 
				
			||||||
	dev_pm_domain_detach(dev, true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void amba_shutdown(struct device *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct amba_driver *drv = to_amba_driver(dev->driver);
 | 
					 | 
				
			||||||
	drv->shutdown(to_amba_device(dev));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 *	amba_driver_register - register an AMBA device driver
 | 
					 *	amba_driver_register - register an AMBA device driver
 | 
				
			||||||
 *	@drv: amba device driver structure
 | 
					 *	@drv: amba device driver structure
 | 
				
			||||||
| 
						 | 
					@ -332,12 +342,10 @@ static void amba_shutdown(struct device *dev)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int amba_driver_register(struct amba_driver *drv)
 | 
					int amba_driver_register(struct amba_driver *drv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	drv->drv.bus = &amba_bustype;
 | 
						if (!drv->probe)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SETFN(fn)	if (drv->fn) drv->drv.fn = amba_##fn
 | 
						drv->drv.bus = &amba_bustype;
 | 
				
			||||||
	SETFN(probe);
 | 
					 | 
				
			||||||
	SETFN(remove);
 | 
					 | 
				
			||||||
	SETFN(shutdown);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return driver_register(&drv->drv);
 | 
						return driver_register(&drv->drv);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,11 +69,10 @@ static int nmk_rng_probe(struct amba_device *dev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int nmk_rng_remove(struct amba_device *dev)
 | 
					static void nmk_rng_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	amba_release_regions(dev);
 | 
						amba_release_regions(dev);
 | 
				
			||||||
	clk_disable(rng_clk);
 | 
						clk_disable(rng_clk);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id nmk_rng_ids[] = {
 | 
					static const struct amba_id nmk_rng_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3195,7 +3195,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl330_remove(struct amba_device *adev)
 | 
					static void pl330_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl330_dmac *pl330 = amba_get_drvdata(adev);
 | 
						struct pl330_dmac *pl330 = amba_get_drvdata(adev);
 | 
				
			||||||
	struct dma_pl330_chan *pch, *_p;
 | 
						struct dma_pl330_chan *pch, *_p;
 | 
				
			||||||
| 
						 | 
					@ -3235,7 +3235,6 @@ static int pl330_remove(struct amba_device *adev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pl330->rstc)
 | 
						if (pl330->rstc)
 | 
				
			||||||
		reset_control_assert(pl330->rstc);
 | 
							reset_control_assert(pl330->rstc);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id pl330_ids[] = {
 | 
					static const struct amba_id pl330_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -320,7 +320,7 @@ static int pl111_amba_probe(struct amba_device *amba_dev,
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl111_amba_remove(struct amba_device *amba_dev)
 | 
					static void pl111_amba_remove(struct amba_device *amba_dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct device *dev = &amba_dev->dev;
 | 
						struct device *dev = &amba_dev->dev;
 | 
				
			||||||
	struct drm_device *drm = amba_get_drvdata(amba_dev);
 | 
						struct drm_device *drm = amba_get_drvdata(amba_dev);
 | 
				
			||||||
| 
						 | 
					@ -331,8 +331,6 @@ static int pl111_amba_remove(struct amba_device *amba_dev)
 | 
				
			||||||
		drm_panel_bridge_remove(priv->bridge);
 | 
							drm_panel_bridge_remove(priv->bridge);
 | 
				
			||||||
	drm_dev_put(drm);
 | 
						drm_dev_put(drm);
 | 
				
			||||||
	of_reserved_mem_device_release(dev);
 | 
						of_reserved_mem_device_release(dev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -567,12 +567,11 @@ static int catu_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int catu_remove(struct amba_device *adev)
 | 
					static void catu_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct catu_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct catu_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct amba_id catu_ids[] = {
 | 
					static struct amba_id catu_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -627,7 +627,7 @@ static int debug_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int debug_remove(struct amba_device *adev)
 | 
					static void debug_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct device *dev = &adev->dev;
 | 
						struct device *dev = &adev->dev;
 | 
				
			||||||
	struct debug_drvdata *drvdata = amba_get_drvdata(adev);
 | 
						struct debug_drvdata *drvdata = amba_get_drvdata(adev);
 | 
				
			||||||
| 
						 | 
					@ -642,8 +642,6 @@ static int debug_remove(struct amba_device *adev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!--debug_count)
 | 
						if (!--debug_count)
 | 
				
			||||||
		debug_func_exit();
 | 
							debug_func_exit();
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_cs_uci_id uci_id_debug[] = {
 | 
					static const struct amba_cs_uci_id uci_id_debug[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -836,7 +836,7 @@ static void cti_device_release(struct device *dev)
 | 
				
			||||||
	if (drvdata->csdev_release)
 | 
						if (drvdata->csdev_release)
 | 
				
			||||||
		drvdata->csdev_release(dev);
 | 
							drvdata->csdev_release(dev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static int cti_remove(struct amba_device *adev)
 | 
					static void cti_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct cti_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct cti_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -845,8 +845,6 @@ static int cti_remove(struct amba_device *adev)
 | 
				
			||||||
	mutex_unlock(&ect_mutex);
 | 
						mutex_unlock(&ect_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int cti_probe(struct amba_device *adev, const struct amba_id *id)
 | 
					static int cti_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -803,7 +803,7 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int etb_remove(struct amba_device *adev)
 | 
					static void etb_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct etb_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct etb_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -814,8 +814,6 @@ static int etb_remove(struct amba_device *adev)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	misc_deregister(&drvdata->miscdev);
 | 
						misc_deregister(&drvdata->miscdev);
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -909,7 +909,7 @@ static void clear_etmdrvdata(void *info)
 | 
				
			||||||
	etmdrvdata[cpu] = NULL;
 | 
						etmdrvdata[cpu] = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int etm_remove(struct amba_device *adev)
 | 
					static void etm_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct etm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct etm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -932,8 +932,6 @@ static int etm_remove(struct amba_device *adev)
 | 
				
			||||||
	cpus_read_unlock();
 | 
						cpus_read_unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1680,7 +1680,7 @@ static void clear_etmdrvdata(void *info)
 | 
				
			||||||
	etmdrvdata[cpu] = NULL;
 | 
						etmdrvdata[cpu] = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int etm4_remove(struct amba_device *adev)
 | 
					static void etm4_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct etmv4_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1703,8 +1703,6 @@ static int etm4_remove(struct amba_device *adev)
 | 
				
			||||||
	cpus_read_unlock();
 | 
						cpus_read_unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id etm4_ids[] = {
 | 
					static const struct amba_id etm4_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -370,9 +370,9 @@ static int dynamic_funnel_probe(struct amba_device *adev,
 | 
				
			||||||
	return funnel_probe(&adev->dev, &adev->res);
 | 
						return funnel_probe(&adev->dev, &adev->res);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int dynamic_funnel_remove(struct amba_device *adev)
 | 
					static void dynamic_funnel_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return funnel_remove(&adev->dev);
 | 
						funnel_remove(&adev->dev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id dynamic_funnel_ids[] = {
 | 
					static const struct amba_id dynamic_funnel_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -388,9 +388,9 @@ static int dynamic_replicator_probe(struct amba_device *adev,
 | 
				
			||||||
	return replicator_probe(&adev->dev, &adev->res);
 | 
						return replicator_probe(&adev->dev, &adev->res);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int dynamic_replicator_remove(struct amba_device *adev)
 | 
					static void dynamic_replicator_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return replicator_remove(&adev->dev);
 | 
						replicator_remove(&adev->dev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id dynamic_replicator_ids[] = {
 | 
					static const struct amba_id dynamic_replicator_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -951,15 +951,13 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int stm_remove(struct amba_device *adev)
 | 
					static void stm_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct stm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stm_unregister_device(&drvdata->stm);
 | 
						stm_unregister_device(&drvdata->stm);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -559,7 +559,7 @@ static void tmc_shutdown(struct amba_device *adev)
 | 
				
			||||||
	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 | 
						spin_unlock_irqrestore(&drvdata->spinlock, flags);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tmc_remove(struct amba_device *adev)
 | 
					static void tmc_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tmc_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct tmc_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -570,8 +570,6 @@ static int tmc_remove(struct amba_device *adev)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	misc_deregister(&drvdata->miscdev);
 | 
						misc_deregister(&drvdata->miscdev);
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id tmc_ids[] = {
 | 
					static const struct amba_id tmc_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,13 +173,11 @@ static int tpiu_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return PTR_ERR(drvdata->csdev);
 | 
						return PTR_ERR(drvdata->csdev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tpiu_remove(struct amba_device *adev)
 | 
					static void tpiu_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tpiu_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
						struct tpiu_drvdata *drvdata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	coresight_unregister(drvdata->csdev);
 | 
						coresight_unregister(drvdata->csdev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1055,7 +1055,7 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int nmk_i2c_remove(struct amba_device *adev)
 | 
					static void nmk_i2c_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct resource *res = &adev->res;
 | 
						struct resource *res = &adev->res;
 | 
				
			||||||
	struct nmk_i2c_dev *dev = amba_get_drvdata(adev);
 | 
						struct nmk_i2c_dev *dev = amba_get_drvdata(adev);
 | 
				
			||||||
| 
						 | 
					@ -1068,8 +1068,6 @@ static int nmk_i2c_remove(struct amba_device *adev)
 | 
				
			||||||
	i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE);
 | 
						i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE);
 | 
				
			||||||
	clk_disable_unprepare(dev->clk);
 | 
						clk_disable_unprepare(dev->clk);
 | 
				
			||||||
	release_mem_region(res->start, resource_size(res));
 | 
						release_mem_region(res->start, resource_size(res));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct i2c_vendor_data vendor_stn8815 = {
 | 
					static struct i2c_vendor_data vendor_stn8815 = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -304,7 +304,7 @@ static int locomokbd_probe(struct locomo_dev *dev)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int locomokbd_remove(struct locomo_dev *dev)
 | 
					static void locomokbd_remove(struct locomo_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct locomokbd *locomokbd = locomo_get_drvdata(dev);
 | 
						struct locomokbd *locomokbd = locomo_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -318,8 +318,6 @@ static int locomokbd_remove(struct locomo_dev *dev)
 | 
				
			||||||
	release_mem_region((unsigned long) dev->mapbase, dev->length);
 | 
						release_mem_region((unsigned long) dev->mapbase, dev->length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kfree(locomokbd);
 | 
						kfree(locomokbd);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct locomo_driver keyboard_driver = {
 | 
					static struct locomo_driver keyboard_driver = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,7 +159,7 @@ static int amba_kmi_probe(struct amba_device *dev,
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int amba_kmi_remove(struct amba_device *dev)
 | 
					static void amba_kmi_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct amba_kmi_port *kmi = amba_get_drvdata(dev);
 | 
						struct amba_kmi_port *kmi = amba_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -168,7 +168,6 @@ static int amba_kmi_remove(struct amba_device *dev)
 | 
				
			||||||
	iounmap(kmi->base);
 | 
						iounmap(kmi->base);
 | 
				
			||||||
	kfree(kmi);
 | 
						kfree(kmi);
 | 
				
			||||||
	amba_release_regions(dev);
 | 
						amba_release_regions(dev);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __maybe_unused amba_kmi_resume(struct device *dev)
 | 
					static int __maybe_unused amba_kmi_resume(struct device *dev)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -344,7 +344,7 @@ static int ps2_probe(struct sa1111_dev *dev)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Remove one device from this driver.
 | 
					 * Remove one device from this driver.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int ps2_remove(struct sa1111_dev *dev)
 | 
					static void ps2_remove(struct sa1111_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ps2if *ps2if = sa1111_get_drvdata(dev);
 | 
						struct ps2if *ps2if = sa1111_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -353,8 +353,6 @@ static int ps2_remove(struct sa1111_dev *dev)
 | 
				
			||||||
	sa1111_set_drvdata(dev, NULL);
 | 
						sa1111_set_drvdata(dev, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kfree(ps2if);
 | 
						kfree(ps2if);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1095,14 +1095,12 @@ static int mhuv2_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int mhuv2_remove(struct amba_device *adev)
 | 
					static void mhuv2_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mhuv2 *mhu = amba_get_drvdata(adev);
 | 
						struct mhuv2 *mhu = amba_get_drvdata(adev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (mhu->frame == SENDER_FRAME)
 | 
						if (mhu->frame == SENDER_FRAME)
 | 
				
			||||||
		writel_relaxed(0x0, &mhu->send->access_request);
 | 
							writel_relaxed(0x0, &mhu->send->access_request);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct amba_id mhuv2_ids[] = {
 | 
					static struct amba_id mhuv2_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -273,14 +273,12 @@ static int pl172_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl172_remove(struct amba_device *adev)
 | 
					static void pl172_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl172_data *pl172 = amba_get_drvdata(adev);
 | 
						struct pl172_data *pl172 = amba_get_drvdata(adev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_disable_unprepare(pl172->clk);
 | 
						clk_disable_unprepare(pl172->clk);
 | 
				
			||||||
	amba_release_regions(adev);
 | 
						amba_release_regions(adev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id pl172_ids[] = {
 | 
					static const struct amba_id pl172_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -426,14 +426,12 @@ static int pl353_smc_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl353_smc_remove(struct amba_device *adev)
 | 
					static void pl353_smc_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl353_smc_data *pl353_smc = amba_get_drvdata(adev);
 | 
						struct pl353_smc_data *pl353_smc = amba_get_drvdata(adev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_disable_unprepare(pl353_smc->memclk);
 | 
						clk_disable_unprepare(pl353_smc->memclk);
 | 
				
			||||||
	clk_disable_unprepare(pl353_smc->aclk);
 | 
						clk_disable_unprepare(pl353_smc->aclk);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id pl353_ids[] = {
 | 
					static const struct amba_id pl353_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2255,7 +2255,7 @@ static int mmci_probe(struct amba_device *dev,
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int mmci_remove(struct amba_device *dev)
 | 
					static void mmci_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mmc_host *mmc = amba_get_drvdata(dev);
 | 
						struct mmc_host *mmc = amba_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2283,8 +2283,6 @@ static int mmci_remove(struct amba_device *dev)
 | 
				
			||||||
		clk_disable_unprepare(host->clk);
 | 
							clk_disable_unprepare(host->clk);
 | 
				
			||||||
		mmc_free_host(mmc);
 | 
							mmc_free_host(mmc);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -238,7 +238,7 @@ static int pcmcia_probe(struct sa1111_dev *dev)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pcmcia_remove(struct sa1111_dev *dev)
 | 
					static void pcmcia_remove(struct sa1111_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sa1111_pcmcia_socket *next, *s = dev_get_drvdata(&dev->dev);
 | 
						struct sa1111_pcmcia_socket *next, *s = dev_get_drvdata(&dev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -252,7 +252,6 @@ static int pcmcia_remove(struct sa1111_dev *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	release_mem_region(dev->res.start, 512);
 | 
						release_mem_region(dev->res.start, 512);
 | 
				
			||||||
	sa1111_disable_device(dev);
 | 
						sa1111_disable_device(dev);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct sa1111_driver pcmcia_driver = {
 | 
					static struct sa1111_driver pcmcia_driver = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,7 +137,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl030_remove(struct amba_device *dev)
 | 
					static void pl030_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl030_rtc *rtc = amba_get_drvdata(dev);
 | 
						struct pl030_rtc *rtc = amba_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -146,8 +146,6 @@ static int pl030_remove(struct amba_device *dev)
 | 
				
			||||||
	free_irq(dev->irq[0], rtc);
 | 
						free_irq(dev->irq[0], rtc);
 | 
				
			||||||
	iounmap(rtc->base);
 | 
						iounmap(rtc->base);
 | 
				
			||||||
	amba_release_regions(dev);
 | 
						amba_release_regions(dev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct amba_id pl030_ids[] = {
 | 
					static struct amba_id pl030_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -280,7 +280,7 @@ static int pl031_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl031_remove(struct amba_device *adev)
 | 
					static void pl031_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl031_local *ldata = dev_get_drvdata(&adev->dev);
 | 
						struct pl031_local *ldata = dev_get_drvdata(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -289,8 +289,6 @@ static int pl031_remove(struct amba_device *adev)
 | 
				
			||||||
	if (adev->irq[0])
 | 
						if (adev->irq[0])
 | 
				
			||||||
		free_irq(adev->irq[0], ldata);
 | 
							free_irq(adev->irq[0], ldata);
 | 
				
			||||||
	amba_release_regions(adev);
 | 
						amba_release_regions(adev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
 | 
					static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2314,13 +2314,13 @@ static int pl022_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return status;
 | 
						return status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static void
 | 
				
			||||||
pl022_remove(struct amba_device *adev)
 | 
					pl022_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pl022 *pl022 = amba_get_drvdata(adev);
 | 
						struct pl022 *pl022 = amba_get_drvdata(adev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!pl022)
 | 
						if (!pl022)
 | 
				
			||||||
		return 0;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * undo pm_runtime_put() in probe.  I assume that we're not
 | 
						 * undo pm_runtime_put() in probe.  I assume that we're not
 | 
				
			||||||
| 
						 | 
					@ -2335,7 +2335,6 @@ pl022_remove(struct amba_device *adev)
 | 
				
			||||||
	clk_disable_unprepare(pl022->clk);
 | 
						clk_disable_unprepare(pl022->clk);
 | 
				
			||||||
	amba_release_regions(adev);
 | 
						amba_release_regions(adev);
 | 
				
			||||||
	tasklet_disable(&pl022->pump_transfers);
 | 
						tasklet_disable(&pl022->pump_transfers);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM_SLEEP
 | 
					#ifdef CONFIG_PM_SLEEP
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -754,7 +754,7 @@ static int pl010_probe(struct amba_device *dev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl010_remove(struct amba_device *dev)
 | 
					static void pl010_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct uart_amba_port *uap = amba_get_drvdata(dev);
 | 
						struct uart_amba_port *uap = amba_get_drvdata(dev);
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
| 
						 | 
					@ -770,8 +770,6 @@ static int pl010_remove(struct amba_device *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!busy)
 | 
						if (!busy)
 | 
				
			||||||
		uart_unregister_driver(&amba_reg);
 | 
							uart_unregister_driver(&amba_reg);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM_SLEEP
 | 
					#ifdef CONFIG_PM_SLEEP
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2679,13 +2679,12 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
 | 
				
			||||||
	return pl011_register_port(uap);
 | 
						return pl011_register_port(uap);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pl011_remove(struct amba_device *dev)
 | 
					static void pl011_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct uart_amba_port *uap = amba_get_drvdata(dev);
 | 
						struct uart_amba_port *uap = amba_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uart_remove_one_port(&amba_reg, &uap->port);
 | 
						uart_remove_one_port(&amba_reg, &uap->port);
 | 
				
			||||||
	pl011_unregister_port(uap);
 | 
						pl011_unregister_port(uap);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM_SLEEP
 | 
					#ifdef CONFIG_PM_SLEEP
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -236,7 +236,7 @@ static int ohci_hcd_sa1111_probe(struct sa1111_dev *dev)
 | 
				
			||||||
 * Reverses the effect of ohci_hcd_sa1111_probe(), first invoking
 | 
					 * Reverses the effect of ohci_hcd_sa1111_probe(), first invoking
 | 
				
			||||||
 * the HCD's stop() method.
 | 
					 * the HCD's stop() method.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int ohci_hcd_sa1111_remove(struct sa1111_dev *dev)
 | 
					static void ohci_hcd_sa1111_remove(struct sa1111_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct usb_hcd *hcd = sa1111_get_drvdata(dev);
 | 
						struct usb_hcd *hcd = sa1111_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -244,8 +244,6 @@ static int ohci_hcd_sa1111_remove(struct sa1111_dev *dev)
 | 
				
			||||||
	sa1111_stop_hc(dev);
 | 
						sa1111_stop_hc(dev);
 | 
				
			||||||
	release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
 | 
						release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
 | 
				
			||||||
	usb_put_hcd(hcd);
 | 
						usb_put_hcd(hcd);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ohci_hcd_sa1111_shutdown(struct device *_dev)
 | 
					static void ohci_hcd_sa1111_shutdown(struct device *_dev)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,18 +71,13 @@ static int vfio_amba_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int vfio_amba_remove(struct amba_device *adev)
 | 
					static void vfio_amba_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct vfio_platform_device *vdev;
 | 
						struct vfio_platform_device *vdev =
 | 
				
			||||||
 | 
							vfio_platform_remove_common(&adev->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vdev = vfio_platform_remove_common(&adev->dev);
 | 
					 | 
				
			||||||
	if (vdev) {
 | 
					 | 
				
			||||||
	kfree(vdev->name);
 | 
						kfree(vdev->name);
 | 
				
			||||||
	kfree(vdev);
 | 
						kfree(vdev);
 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return -EINVAL;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id pl330_ids[] = {
 | 
					static const struct amba_id pl330_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -208,7 +208,7 @@ static int locomolcd_probe(struct locomo_dev *ldev)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int locomolcd_remove(struct locomo_dev *dev)
 | 
					static void locomolcd_remove(struct locomo_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,7 +220,6 @@ static int locomolcd_remove(struct locomo_dev *dev)
 | 
				
			||||||
	local_irq_save(flags);
 | 
						local_irq_save(flags);
 | 
				
			||||||
	locomolcd_dev = NULL;
 | 
						locomolcd_dev = NULL;
 | 
				
			||||||
	local_irq_restore(flags);
 | 
						local_irq_restore(flags);
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct locomo_driver poodle_lcd_driver = {
 | 
					static struct locomo_driver poodle_lcd_driver = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -925,7 +925,7 @@ static int clcdfb_probe(struct amba_device *dev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int clcdfb_remove(struct amba_device *dev)
 | 
					static void clcdfb_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct clcd_fb *fb = amba_get_drvdata(dev);
 | 
						struct clcd_fb *fb = amba_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -942,8 +942,6 @@ static int clcdfb_remove(struct amba_device *dev)
 | 
				
			||||||
	kfree(fb);
 | 
						kfree(fb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	amba_release_regions(dev);
 | 
						amba_release_regions(dev);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct amba_id clcdfb_id_table[] = {
 | 
					static const struct amba_id clcdfb_id_table[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,14 +305,12 @@ sp805_wdt_probe(struct amba_device *adev, const struct amba_id *id)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int sp805_wdt_remove(struct amba_device *adev)
 | 
					static void sp805_wdt_remove(struct amba_device *adev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sp805_wdt *wdt = amba_get_drvdata(adev);
 | 
						struct sp805_wdt *wdt = amba_get_drvdata(adev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	watchdog_unregister_device(&wdt->wdd);
 | 
						watchdog_unregister_device(&wdt->wdd);
 | 
				
			||||||
	watchdog_set_drvdata(&wdt->wdd, NULL);
 | 
						watchdog_set_drvdata(&wdt->wdd, NULL);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __maybe_unused sp805_wdt_suspend(struct device *dev)
 | 
					static int __maybe_unused sp805_wdt_suspend(struct device *dev)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@ struct amba_device {
 | 
				
			||||||
struct amba_driver {
 | 
					struct amba_driver {
 | 
				
			||||||
	struct device_driver	drv;
 | 
						struct device_driver	drv;
 | 
				
			||||||
	int			(*probe)(struct amba_device *, const struct amba_id *);
 | 
						int			(*probe)(struct amba_device *, const struct amba_id *);
 | 
				
			||||||
	int			(*remove)(struct amba_device *);
 | 
						void			(*remove)(struct amba_device *);
 | 
				
			||||||
	void			(*shutdown)(struct amba_device *);
 | 
						void			(*shutdown)(struct amba_device *);
 | 
				
			||||||
	const struct amba_id	*id_table;
 | 
						const struct amba_id	*id_table;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1055,7 +1055,7 @@ static int aaci_probe(struct amba_device *dev,
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int aaci_remove(struct amba_device *dev)
 | 
					static void aaci_remove(struct amba_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct snd_card *card = amba_get_drvdata(dev);
 | 
						struct snd_card *card = amba_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1066,8 +1066,6 @@ static int aaci_remove(struct amba_device *dev)
 | 
				
			||||||
		snd_card_free(card);
 | 
							snd_card_free(card);
 | 
				
			||||||
		amba_release_regions(dev);
 | 
							amba_release_regions(dev);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct amba_id aaci_ids[] = {
 | 
					static struct amba_id aaci_ids[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue