mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-08 07:38:10 +00: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 @@ out_clk:
|
||||||
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 @@ probe_err2:
|
||||||
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 @@ dev_put:
|
||||||
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 @@ out:
|
||||||
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 @@ err:
|
||||||
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 @@ err_misc_register:
|
||||||
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 @@ stm_unregister:
|
||||||
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 @@ out:
|
||||||
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 @@ err_clk_enable:
|
||||||
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 @@ out_clk_dis_aper:
|
||||||
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 @@ err:
|
||||||
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…
Add table
Reference in a new issue