Merge branch 'linus' into perf/core, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
3782746a08
10
MAINTAINERS
10
MAINTAINERS
@ -77,6 +77,7 @@ Descriptions of section entries:
|
||||
Q: Patchwork web based patch tracking system site
|
||||
T: SCM tree type and location.
|
||||
Type is one of: git, hg, quilt, stgit, topgit
|
||||
B: Bug tracking system location.
|
||||
S: Status, one of the following:
|
||||
Supported: Someone is actually paid to look after this.
|
||||
Maintained: Someone actually looks after it.
|
||||
@ -281,6 +282,7 @@ L: linux-acpi@vger.kernel.org
|
||||
W: https://01.org/linux-acpi
|
||||
Q: https://patchwork.kernel.org/project/linux-acpi/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: drivers/acpi/
|
||||
F: drivers/pnp/pnpacpi/
|
||||
@ -304,6 +306,8 @@ W: https://acpica.org/
|
||||
W: https://github.com/acpica/acpica/
|
||||
Q: https://patchwork.kernel.org/project/linux-acpi/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
||||
B: https://bugzilla.kernel.org
|
||||
B: https://bugs.acpica.org
|
||||
S: Supported
|
||||
F: drivers/acpi/acpica/
|
||||
F: include/acpi/
|
||||
@ -313,6 +317,7 @@ ACPI FAN DRIVER
|
||||
M: Zhang Rui <rui.zhang@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: https://01.org/linux-acpi
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: drivers/acpi/fan.c
|
||||
|
||||
@ -328,6 +333,7 @@ ACPI THERMAL DRIVER
|
||||
M: Zhang Rui <rui.zhang@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: https://01.org/linux-acpi
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: drivers/acpi/*thermal*
|
||||
|
||||
@ -335,6 +341,7 @@ ACPI VIDEO DRIVER
|
||||
M: Zhang Rui <rui.zhang@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: https://01.org/linux-acpi
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: drivers/acpi/acpi_video.c
|
||||
|
||||
@ -5663,6 +5670,7 @@ HIBERNATION (aka Software Suspend, aka swsusp)
|
||||
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
L: linux-pm@vger.kernel.org
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: arch/x86/power/
|
||||
F: drivers/base/power/
|
||||
@ -9624,6 +9632,7 @@ POWER MANAGEMENT CORE
|
||||
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
L: linux-pm@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: drivers/base/power/
|
||||
F: include/linux/pm.h
|
||||
@ -11613,6 +11622,7 @@ M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
M: Len Brown <len.brown@intel.com>
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
L: linux-pm@vger.kernel.org
|
||||
B: https://bugzilla.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/power/
|
||||
F: arch/x86/kernel/acpi/
|
||||
|
4
Makefile
4
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Psychotic Stoned Sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -1019,8 +1019,6 @@ prepare2: prepare3 prepare-compiler-check outputmakefile asm-generic
|
||||
prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
|
||||
include/config/auto.conf
|
||||
$(cmd_crmodverdir)
|
||||
$(Q)test -e include/generated/autoksyms.h || \
|
||||
touch include/generated/autoksyms.h
|
||||
|
||||
archprepare: archheaders archscripts prepare1 scripts_basic
|
||||
|
||||
|
@ -22,10 +22,11 @@
|
||||
static inline void __delay(unsigned long loops)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
" lp 1f \n"
|
||||
" nop \n"
|
||||
"1: \n"
|
||||
: "+l"(loops));
|
||||
" mov lp_count, %0 \n"
|
||||
" lp 1f \n"
|
||||
" nop \n"
|
||||
"1: \n"
|
||||
: : "r"(loops));
|
||||
}
|
||||
|
||||
extern void __bad_udelay(void);
|
||||
|
@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
|
||||
|
||||
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
||||
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
||||
#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
|
||||
#define pfn_pte(pfn, prot) __pte(__pfn_to_phys(pfn) | pgprot_val(prot))
|
||||
|
||||
/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
|
||||
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
static int l2_line_sz;
|
||||
static int ioc_exists;
|
||||
int slc_enable = 1, ioc_enable = 1;
|
||||
int slc_enable = 1, ioc_enable = 0;
|
||||
unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
|
||||
unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
|
||||
|
||||
|
@ -8,7 +8,6 @@ generic-y += early_ioremap.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += export.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += irq_regs.h
|
||||
|
@ -33,7 +33,7 @@ endif
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
||||
obj-$(CONFIG_FIQ) += fiq.o fiqasm.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_MODULES) += armksyms.o module.o
|
||||
obj-$(CONFIG_ARM_MODULE_PLTS) += module-plts.o
|
||||
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
||||
obj-$(CONFIG_PCI) += bios32.o isa.o
|
||||
|
183
arch/arm/kernel/armksyms.c
Normal file
183
arch/arm/kernel/armksyms.c
Normal file
@ -0,0 +1,183 @@
|
||||
/*
|
||||
* linux/arch/arm/kernel/armksyms.c
|
||||
*
|
||||
* Copyright (C) 2000 Russell King
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/cryptohash.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/arm-smccc.h>
|
||||
|
||||
#include <asm/checksum.h>
|
||||
#include <asm/ftrace.h>
|
||||
|
||||
/*
|
||||
* libgcc functions - functions that are used internally by the
|
||||
* compiler... (prototypes are not correct though, but that
|
||||
* doesn't really matter since they're not versioned).
|
||||
*/
|
||||
extern void __ashldi3(void);
|
||||
extern void __ashrdi3(void);
|
||||
extern void __divsi3(void);
|
||||
extern void __lshrdi3(void);
|
||||
extern void __modsi3(void);
|
||||
extern void __muldi3(void);
|
||||
extern void __ucmpdi2(void);
|
||||
extern void __udivsi3(void);
|
||||
extern void __umodsi3(void);
|
||||
extern void __do_div64(void);
|
||||
extern void __bswapsi2(void);
|
||||
extern void __bswapdi2(void);
|
||||
|
||||
extern void __aeabi_idiv(void);
|
||||
extern void __aeabi_idivmod(void);
|
||||
extern void __aeabi_lasr(void);
|
||||
extern void __aeabi_llsl(void);
|
||||
extern void __aeabi_llsr(void);
|
||||
extern void __aeabi_lmul(void);
|
||||
extern void __aeabi_uidiv(void);
|
||||
extern void __aeabi_uidivmod(void);
|
||||
extern void __aeabi_ulcmp(void);
|
||||
|
||||
extern void fpundefinstr(void);
|
||||
|
||||
void mmioset(void *, unsigned int, size_t);
|
||||
void mmiocpy(void *, const void *, size_t);
|
||||
|
||||
/* platform dependent support */
|
||||
EXPORT_SYMBOL(arm_delay_ops);
|
||||
|
||||
/* networking */
|
||||
EXPORT_SYMBOL(csum_partial);
|
||||
EXPORT_SYMBOL(csum_partial_copy_from_user);
|
||||
EXPORT_SYMBOL(csum_partial_copy_nocheck);
|
||||
EXPORT_SYMBOL(__csum_ipv6_magic);
|
||||
|
||||
/* io */
|
||||
#ifndef __raw_readsb
|
||||
EXPORT_SYMBOL(__raw_readsb);
|
||||
#endif
|
||||
#ifndef __raw_readsw
|
||||
EXPORT_SYMBOL(__raw_readsw);
|
||||
#endif
|
||||
#ifndef __raw_readsl
|
||||
EXPORT_SYMBOL(__raw_readsl);
|
||||
#endif
|
||||
#ifndef __raw_writesb
|
||||
EXPORT_SYMBOL(__raw_writesb);
|
||||
#endif
|
||||
#ifndef __raw_writesw
|
||||
EXPORT_SYMBOL(__raw_writesw);
|
||||
#endif
|
||||
#ifndef __raw_writesl
|
||||
EXPORT_SYMBOL(__raw_writesl);
|
||||
#endif
|
||||
|
||||
/* string / mem functions */
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(memmove);
|
||||
EXPORT_SYMBOL(memchr);
|
||||
EXPORT_SYMBOL(__memzero);
|
||||
|
||||
EXPORT_SYMBOL(mmioset);
|
||||
EXPORT_SYMBOL(mmiocpy);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
EXPORT_SYMBOL(arm_copy_from_user);
|
||||
EXPORT_SYMBOL(arm_copy_to_user);
|
||||
EXPORT_SYMBOL(arm_clear_user);
|
||||
|
||||
EXPORT_SYMBOL(__get_user_1);
|
||||
EXPORT_SYMBOL(__get_user_2);
|
||||
EXPORT_SYMBOL(__get_user_4);
|
||||
EXPORT_SYMBOL(__get_user_8);
|
||||
|
||||
#ifdef __ARMEB__
|
||||
EXPORT_SYMBOL(__get_user_64t_1);
|
||||
EXPORT_SYMBOL(__get_user_64t_2);
|
||||
EXPORT_SYMBOL(__get_user_64t_4);
|
||||
EXPORT_SYMBOL(__get_user_32t_8);
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(__put_user_1);
|
||||
EXPORT_SYMBOL(__put_user_2);
|
||||
EXPORT_SYMBOL(__put_user_4);
|
||||
EXPORT_SYMBOL(__put_user_8);
|
||||
#endif
|
||||
|
||||
/* gcc lib functions */
|
||||
EXPORT_SYMBOL(__ashldi3);
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
||||
EXPORT_SYMBOL(__divsi3);
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
||||
EXPORT_SYMBOL(__modsi3);
|
||||
EXPORT_SYMBOL(__muldi3);
|
||||
EXPORT_SYMBOL(__ucmpdi2);
|
||||
EXPORT_SYMBOL(__udivsi3);
|
||||
EXPORT_SYMBOL(__umodsi3);
|
||||
EXPORT_SYMBOL(__do_div64);
|
||||
EXPORT_SYMBOL(__bswapsi2);
|
||||
EXPORT_SYMBOL(__bswapdi2);
|
||||
|
||||
#ifdef CONFIG_AEABI
|
||||
EXPORT_SYMBOL(__aeabi_idiv);
|
||||
EXPORT_SYMBOL(__aeabi_idivmod);
|
||||
EXPORT_SYMBOL(__aeabi_lasr);
|
||||
EXPORT_SYMBOL(__aeabi_llsl);
|
||||
EXPORT_SYMBOL(__aeabi_llsr);
|
||||
EXPORT_SYMBOL(__aeabi_lmul);
|
||||
EXPORT_SYMBOL(__aeabi_uidiv);
|
||||
EXPORT_SYMBOL(__aeabi_uidivmod);
|
||||
EXPORT_SYMBOL(__aeabi_ulcmp);
|
||||
#endif
|
||||
|
||||
/* bitops */
|
||||
EXPORT_SYMBOL(_set_bit);
|
||||
EXPORT_SYMBOL(_test_and_set_bit);
|
||||
EXPORT_SYMBOL(_clear_bit);
|
||||
EXPORT_SYMBOL(_test_and_clear_bit);
|
||||
EXPORT_SYMBOL(_change_bit);
|
||||
EXPORT_SYMBOL(_test_and_change_bit);
|
||||
EXPORT_SYMBOL(_find_first_zero_bit_le);
|
||||
EXPORT_SYMBOL(_find_next_zero_bit_le);
|
||||
EXPORT_SYMBOL(_find_first_bit_le);
|
||||
EXPORT_SYMBOL(_find_next_bit_le);
|
||||
|
||||
#ifdef __ARMEB__
|
||||
EXPORT_SYMBOL(_find_first_zero_bit_be);
|
||||
EXPORT_SYMBOL(_find_next_zero_bit_be);
|
||||
EXPORT_SYMBOL(_find_first_bit_be);
|
||||
EXPORT_SYMBOL(_find_next_bit_be);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#ifdef CONFIG_OLD_MCOUNT
|
||||
EXPORT_SYMBOL(mcount);
|
||||
#endif
|
||||
EXPORT_SYMBOL(__gnu_mcount_nc);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
|
||||
EXPORT_SYMBOL(__pv_phys_pfn_offset);
|
||||
EXPORT_SYMBOL(__pv_offset);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HAVE_ARM_SMCCC
|
||||
EXPORT_SYMBOL(arm_smccc_smc);
|
||||
EXPORT_SYMBOL(arm_smccc_hvc);
|
||||
#endif
|
@ -7,7 +7,6 @@
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#include "entry-header.S"
|
||||
|
||||
@ -154,7 +153,6 @@ ENTRY(mcount)
|
||||
__mcount _old
|
||||
#endif
|
||||
ENDPROC(mcount)
|
||||
EXPORT_SYMBOL(mcount)
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
ENTRY(ftrace_caller_old)
|
||||
@ -207,7 +205,6 @@ UNWIND(.fnstart)
|
||||
#endif
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__gnu_mcount_nc)
|
||||
EXPORT_SYMBOL(__gnu_mcount_nc)
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
ENTRY(ftrace_caller)
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <asm/memory.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_SEMIHOSTING)
|
||||
#include CONFIG_DEBUG_LL_INCLUDE
|
||||
@ -728,8 +727,6 @@ __pv_phys_pfn_offset:
|
||||
__pv_offset:
|
||||
.quad 0
|
||||
.size __pv_offset, . -__pv_offset
|
||||
EXPORT_SYMBOL(__pv_phys_pfn_offset)
|
||||
EXPORT_SYMBOL(__pv_offset)
|
||||
#endif
|
||||
|
||||
#include "head-common.S"
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include <asm/opcodes-sec.h>
|
||||
#include <asm/opcodes-virt.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
/*
|
||||
* Wrap c macros in asm macros to delay expansion until after the
|
||||
@ -52,7 +51,6 @@ UNWIND( .fnend)
|
||||
ENTRY(arm_smccc_smc)
|
||||
SMCCC SMCCC_SMC
|
||||
ENDPROC(arm_smccc_smc)
|
||||
EXPORT_SYMBOL(arm_smccc_smc)
|
||||
|
||||
/*
|
||||
* void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
|
||||
@ -62,4 +60,3 @@ EXPORT_SYMBOL(arm_smccc_smc)
|
||||
ENTRY(arm_smccc_hvc)
|
||||
SMCCC SMCCC_HVC
|
||||
ENDPROC(arm_smccc_hvc)
|
||||
EXPORT_SYMBOL(arm_smccc_hvc)
|
||||
|
@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define al r1
|
||||
@ -53,5 +52,3 @@ ENTRY(__aeabi_llsl)
|
||||
|
||||
ENDPROC(__ashldi3)
|
||||
ENDPROC(__aeabi_llsl)
|
||||
EXPORT_SYMBOL(__ashldi3)
|
||||
EXPORT_SYMBOL(__aeabi_llsl)
|
||||
|
@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define al r1
|
||||
@ -53,5 +52,3 @@ ENTRY(__aeabi_lasr)
|
||||
|
||||
ENDPROC(__ashrdi3)
|
||||
ENDPROC(__aeabi_lasr)
|
||||
EXPORT_SYMBOL(__ashrdi3)
|
||||
EXPORT_SYMBOL(__aeabi_lasr)
|
||||
|
@ -1,6 +1,5 @@
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
.macro bitop, name, instr
|
||||
@ -26,7 +25,6 @@ UNWIND( .fnstart )
|
||||
bx lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
EXPORT_SYMBOL(\name )
|
||||
.endm
|
||||
|
||||
.macro testop, name, instr, store
|
||||
@ -57,7 +55,6 @@ UNWIND( .fnstart )
|
||||
2: bx lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
EXPORT_SYMBOL(\name )
|
||||
.endm
|
||||
#else
|
||||
.macro bitop, name, instr
|
||||
@ -77,7 +74,6 @@ UNWIND( .fnstart )
|
||||
ret lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
EXPORT_SYMBOL(\name )
|
||||
.endm
|
||||
|
||||
/**
|
||||
@ -106,6 +102,5 @@ UNWIND( .fnstart )
|
||||
ret lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
EXPORT_SYMBOL(\name )
|
||||
.endm
|
||||
#endif
|
||||
|
@ -1,6 +1,5 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
ENTRY(__bswapsi2)
|
||||
@ -36,5 +35,3 @@ ENTRY(__bswapdi2)
|
||||
ret lr
|
||||
ENDPROC(__bswapdi2)
|
||||
#endif
|
||||
EXPORT_SYMBOL(__bswapsi2)
|
||||
EXPORT_SYMBOL(__bswapdi2)
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
|
||||
@ -51,9 +50,6 @@ USER( strnebt r2, [r0])
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(arm_clear_user)
|
||||
ENDPROC(__clear_user_std)
|
||||
#ifndef CONFIG_UACCESS_WITH_MEMCPY
|
||||
EXPORT_SYMBOL(arm_clear_user)
|
||||
#endif
|
||||
|
||||
.pushsection .text.fixup,"ax"
|
||||
.align 0
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
/*
|
||||
* Prototype:
|
||||
@ -95,7 +94,6 @@ ENTRY(arm_copy_from_user)
|
||||
#include "copy_template.S"
|
||||
|
||||
ENDPROC(arm_copy_from_user)
|
||||
EXPORT_SYMBOL(arm_copy_from_user)
|
||||
|
||||
.pushsection .fixup,"ax"
|
||||
.align 0
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 ))
|
||||
|
||||
@ -46,4 +45,3 @@ ENTRY(copy_page)
|
||||
PLD( beq 2b )
|
||||
ldmfd sp!, {r4, pc} @ 3
|
||||
ENDPROC(copy_page)
|
||||
EXPORT_SYMBOL(copy_page)
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
/*
|
||||
* Prototype:
|
||||
@ -100,9 +99,6 @@ WEAK(arm_copy_to_user)
|
||||
|
||||
ENDPROC(arm_copy_to_user)
|
||||
ENDPROC(__copy_to_user_std)
|
||||
#ifndef CONFIG_UACCESS_WITH_MEMCPY
|
||||
EXPORT_SYMBOL(arm_copy_to_user)
|
||||
#endif
|
||||
|
||||
.pushsection .text.fixup,"ax"
|
||||
.align 0
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
|
||||
@ -31,4 +30,4 @@ ENTRY(__csum_ipv6_magic)
|
||||
adcs r0, r0, #0
|
||||
ldmfd sp!, {pc}
|
||||
ENDPROC(__csum_ipv6_magic)
|
||||
EXPORT_SYMBOL(__csum_ipv6_magic)
|
||||
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
|
||||
@ -141,4 +140,3 @@ ENTRY(csum_partial)
|
||||
bne 4b
|
||||
b .Lless4
|
||||
ENDPROC(csum_partial)
|
||||
EXPORT_SYMBOL(csum_partial)
|
||||
|
@ -49,6 +49,5 @@
|
||||
|
||||
#define FN_ENTRY ENTRY(csum_partial_copy_nocheck)
|
||||
#define FN_EXIT ENDPROC(csum_partial_copy_nocheck)
|
||||
#define FN_EXPORT EXPORT_SYMBOL(csum_partial_copy_nocheck)
|
||||
|
||||
#include "csumpartialcopygeneric.S"
|
||||
|
@ -8,7 +8,6 @@
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
/*
|
||||
* unsigned int
|
||||
@ -332,4 +331,3 @@ FN_ENTRY
|
||||
mov r5, r4, get_byte_1
|
||||
b .Lexit
|
||||
FN_EXIT
|
||||
FN_EXPORT
|
||||
|
@ -73,7 +73,6 @@
|
||||
|
||||
#define FN_ENTRY ENTRY(csum_partial_copy_from_user)
|
||||
#define FN_EXIT ENDPROC(csum_partial_copy_from_user)
|
||||
#define FN_EXPORT EXPORT_SYMBOL(csum_partial_copy_from_user)
|
||||
|
||||
#include "csumpartialcopygeneric.S"
|
||||
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/timex.h>
|
||||
|
||||
/*
|
||||
@ -35,7 +34,6 @@ struct arm_delay_ops arm_delay_ops __ro_after_init = {
|
||||
.const_udelay = __loop_const_udelay,
|
||||
.udelay = __loop_udelay,
|
||||
};
|
||||
EXPORT_SYMBOL(arm_delay_ops);
|
||||
|
||||
static const struct delay_timer *delay_timer;
|
||||
static bool delay_calibrated;
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define xh r0
|
||||
@ -211,4 +210,3 @@ Ldiv0_64:
|
||||
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__do_div64)
|
||||
EXPORT_SYMBOL(__do_div64)
|
||||
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
.text
|
||||
|
||||
/*
|
||||
@ -38,7 +37,6 @@ ENTRY(_find_first_zero_bit_le)
|
||||
3: mov r0, r1 @ no free bits
|
||||
ret lr
|
||||
ENDPROC(_find_first_zero_bit_le)
|
||||
EXPORT_SYMBOL(_find_first_zero_bit_le)
|
||||
|
||||
/*
|
||||
* Purpose : Find next 'zero' bit
|
||||
@ -59,7 +57,6 @@ ENTRY(_find_next_zero_bit_le)
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
ENDPROC(_find_next_zero_bit_le)
|
||||
EXPORT_SYMBOL(_find_next_zero_bit_le)
|
||||
|
||||
/*
|
||||
* Purpose : Find a 'one' bit
|
||||
@ -81,7 +78,6 @@ ENTRY(_find_first_bit_le)
|
||||
3: mov r0, r1 @ no free bits
|
||||
ret lr
|
||||
ENDPROC(_find_first_bit_le)
|
||||
EXPORT_SYMBOL(_find_first_bit_le)
|
||||
|
||||
/*
|
||||
* Purpose : Find next 'one' bit
|
||||
@ -101,7 +97,6 @@ ENTRY(_find_next_bit_le)
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
ENDPROC(_find_next_bit_le)
|
||||
EXPORT_SYMBOL(_find_next_bit_le)
|
||||
|
||||
#ifdef __ARMEB__
|
||||
|
||||
@ -121,7 +116,6 @@ ENTRY(_find_first_zero_bit_be)
|
||||
3: mov r0, r1 @ no free bits
|
||||
ret lr
|
||||
ENDPROC(_find_first_zero_bit_be)
|
||||
EXPORT_SYMBOL(_find_first_zero_bit_be)
|
||||
|
||||
ENTRY(_find_next_zero_bit_be)
|
||||
teq r1, #0
|
||||
@ -139,7 +133,6 @@ ENTRY(_find_next_zero_bit_be)
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
ENDPROC(_find_next_zero_bit_be)
|
||||
EXPORT_SYMBOL(_find_next_zero_bit_be)
|
||||
|
||||
ENTRY(_find_first_bit_be)
|
||||
teq r1, #0
|
||||
@ -157,7 +150,6 @@ ENTRY(_find_first_bit_be)
|
||||
3: mov r0, r1 @ no free bits
|
||||
ret lr
|
||||
ENDPROC(_find_first_bit_be)
|
||||
EXPORT_SYMBOL(_find_first_bit_be)
|
||||
|
||||
ENTRY(_find_next_bit_be)
|
||||
teq r1, #0
|
||||
@ -174,7 +166,6 @@ ENTRY(_find_next_bit_be)
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
ENDPROC(_find_next_bit_be)
|
||||
EXPORT_SYMBOL(_find_next_bit_be)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/domain.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
ENTRY(__get_user_1)
|
||||
check_uaccess r0, 1, r1, r2, __get_user_bad
|
||||
@ -39,7 +38,6 @@ ENTRY(__get_user_1)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_1)
|
||||
EXPORT_SYMBOL(__get_user_1)
|
||||
|
||||
ENTRY(__get_user_2)
|
||||
check_uaccess r0, 2, r1, r2, __get_user_bad
|
||||
@ -60,7 +58,6 @@ rb .req r0
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_2)
|
||||
EXPORT_SYMBOL(__get_user_2)
|
||||
|
||||
ENTRY(__get_user_4)
|
||||
check_uaccess r0, 4, r1, r2, __get_user_bad
|
||||
@ -68,7 +65,6 @@ ENTRY(__get_user_4)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_4)
|
||||
EXPORT_SYMBOL(__get_user_4)
|
||||
|
||||
ENTRY(__get_user_8)
|
||||
check_uaccess r0, 8, r1, r2, __get_user_bad
|
||||
@ -82,7 +78,6 @@ ENTRY(__get_user_8)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_8)
|
||||
EXPORT_SYMBOL(__get_user_8)
|
||||
|
||||
#ifdef __ARMEB__
|
||||
ENTRY(__get_user_32t_8)
|
||||
@ -96,7 +91,6 @@ ENTRY(__get_user_32t_8)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_32t_8)
|
||||
EXPORT_SYMBOL(__get_user_32t_8)
|
||||
|
||||
ENTRY(__get_user_64t_1)
|
||||
check_uaccess r0, 1, r1, r2, __get_user_bad8
|
||||
@ -104,7 +98,6 @@ ENTRY(__get_user_64t_1)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_64t_1)
|
||||
EXPORT_SYMBOL(__get_user_64t_1)
|
||||
|
||||
ENTRY(__get_user_64t_2)
|
||||
check_uaccess r0, 2, r1, r2, __get_user_bad8
|
||||
@ -121,7 +114,6 @@ rb .req r0
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_64t_2)
|
||||
EXPORT_SYMBOL(__get_user_64t_2)
|
||||
|
||||
ENTRY(__get_user_64t_4)
|
||||
check_uaccess r0, 4, r1, r2, __get_user_bad8
|
||||
@ -129,7 +121,6 @@ ENTRY(__get_user_64t_4)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__get_user_64t_4)
|
||||
EXPORT_SYMBOL(__get_user_64t_4)
|
||||
#endif
|
||||
|
||||
__get_user_bad8:
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.Linsb_align: rsb ip, ip, #4
|
||||
cmp ip, r2
|
||||
@ -122,4 +121,3 @@ ENTRY(__raw_readsb)
|
||||
|
||||
ldmfd sp!, {r4 - r6, pc}
|
||||
ENDPROC(__raw_readsb)
|
||||
EXPORT_SYMBOL(__raw_readsb)
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
ENTRY(__raw_readsl)
|
||||
teq r2, #0 @ do we have to check for the zero len?
|
||||
@ -78,4 +77,3 @@ ENTRY(__raw_readsl)
|
||||
strb r3, [r1, #0]
|
||||
ret lr
|
||||
ENDPROC(__raw_readsl)
|
||||
EXPORT_SYMBOL(__raw_readsl)
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.Linsw_bad_alignment:
|
||||
adr r0, .Linsw_bad_align_msg
|
||||
@ -104,4 +103,4 @@ ENTRY(__raw_readsw)
|
||||
|
||||
ldmfd sp!, {r4, r5, r6, pc}
|
||||
|
||||
EXPORT_SYMBOL(__raw_readsw)
|
||||
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.macro pack, rd, hw1, hw2
|
||||
#ifndef __ARMEB__
|
||||
@ -130,4 +129,3 @@ ENTRY(__raw_readsw)
|
||||
strneb ip, [r1]
|
||||
ldmfd sp!, {r4, pc}
|
||||
ENDPROC(__raw_readsw)
|
||||
EXPORT_SYMBOL(__raw_readsw)
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.macro outword, rd
|
||||
#ifndef __ARMEB__
|
||||
@ -93,4 +92,3 @@ ENTRY(__raw_writesb)
|
||||
|
||||
ldmfd sp!, {r4, r5, pc}
|
||||
ENDPROC(__raw_writesb)
|
||||
EXPORT_SYMBOL(__raw_writesb)
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
ENTRY(__raw_writesl)
|
||||
teq r2, #0 @ do we have to check for the zero len?
|
||||
@ -66,4 +65,3 @@ ENTRY(__raw_writesl)
|
||||
bne 6b
|
||||
ret lr
|
||||
ENDPROC(__raw_writesl)
|
||||
EXPORT_SYMBOL(__raw_writesl)
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.Loutsw_bad_alignment:
|
||||
adr r0, .Loutsw_bad_align_msg
|
||||
@ -125,4 +124,3 @@ ENTRY(__raw_writesw)
|
||||
strne ip, [r0]
|
||||
|
||||
ldmfd sp!, {r4, r5, r6, pc}
|
||||
EXPORT_SYMBOL(__raw_writesw)
|
||||
|
@ -9,7 +9,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.macro outword, rd
|
||||
#ifndef __ARMEB__
|
||||
@ -99,4 +98,3 @@ ENTRY(__raw_writesw)
|
||||
strneh ip, [r0]
|
||||
ret lr
|
||||
ENDPROC(__raw_writesw)
|
||||
EXPORT_SYMBOL(__raw_writesw)
|
||||
|
@ -36,7 +36,6 @@ Boston, MA 02111-1307, USA. */
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
||||
|
||||
@ -239,8 +238,6 @@ UNWIND(.fnstart)
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__udivsi3)
|
||||
ENDPROC(__aeabi_uidiv)
|
||||
EXPORT_SYMBOL(__udivsi3)
|
||||
EXPORT_SYMBOL(__aeabi_uidiv)
|
||||
|
||||
ENTRY(__umodsi3)
|
||||
UNWIND(.fnstart)
|
||||
@ -259,7 +256,6 @@ UNWIND(.fnstart)
|
||||
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__umodsi3)
|
||||
EXPORT_SYMBOL(__umodsi3)
|
||||
|
||||
#ifdef CONFIG_ARM_PATCH_IDIV
|
||||
.align 3
|
||||
@ -307,8 +303,6 @@ UNWIND(.fnstart)
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__divsi3)
|
||||
ENDPROC(__aeabi_idiv)
|
||||
EXPORT_SYMBOL(__divsi3)
|
||||
EXPORT_SYMBOL(__aeabi_idiv)
|
||||
|
||||
ENTRY(__modsi3)
|
||||
UNWIND(.fnstart)
|
||||
@ -333,7 +327,6 @@ UNWIND(.fnstart)
|
||||
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__modsi3)
|
||||
EXPORT_SYMBOL(__modsi3)
|
||||
|
||||
#ifdef CONFIG_AEABI
|
||||
|
||||
@ -350,7 +343,6 @@ UNWIND(.save {r0, r1, ip, lr} )
|
||||
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__aeabi_uidivmod)
|
||||
EXPORT_SYMBOL(__aeabi_uidivmod)
|
||||
|
||||
ENTRY(__aeabi_idivmod)
|
||||
UNWIND(.fnstart)
|
||||
@ -364,7 +356,6 @@ UNWIND(.save {r0, r1, ip, lr} )
|
||||
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(__aeabi_idivmod)
|
||||
EXPORT_SYMBOL(__aeabi_idivmod)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define al r1
|
||||
@ -53,5 +52,3 @@ ENTRY(__aeabi_llsr)
|
||||
|
||||
ENDPROC(__lshrdi3)
|
||||
ENDPROC(__aeabi_llsr)
|
||||
EXPORT_SYMBOL(__lshrdi3)
|
||||
EXPORT_SYMBOL(__aeabi_llsr)
|
||||
|
@ -11,7 +11,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
.align 5
|
||||
@ -25,4 +24,3 @@ ENTRY(memchr)
|
||||
2: movne r0, #0
|
||||
ret lr
|
||||
ENDPROC(memchr)
|
||||
EXPORT_SYMBOL(memchr)
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#define LDR1W_SHIFT 0
|
||||
#define STR1W_SHIFT 0
|
||||
@ -69,5 +68,3 @@ ENTRY(memcpy)
|
||||
|
||||
ENDPROC(memcpy)
|
||||
ENDPROC(mmiocpy)
|
||||
EXPORT_SYMBOL(memcpy)
|
||||
EXPORT_SYMBOL(mmiocpy)
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
|
||||
@ -226,4 +225,3 @@ ENTRY(memmove)
|
||||
18: backward_copy_shift push=24 pull=8
|
||||
|
||||
ENDPROC(memmove)
|
||||
EXPORT_SYMBOL(memmove)
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
.align 5
|
||||
@ -136,5 +135,3 @@ UNWIND( .fnstart )
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(memset)
|
||||
ENDPROC(mmioset)
|
||||
EXPORT_SYMBOL(memset)
|
||||
EXPORT_SYMBOL(mmioset)
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
.align 5
|
||||
@ -136,4 +135,3 @@ UNWIND( .fnstart )
|
||||
ret lr @ 1
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(__memzero)
|
||||
EXPORT_SYMBOL(__memzero)
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define xh r0
|
||||
@ -47,5 +46,3 @@ ENTRY(__aeabi_lmul)
|
||||
|
||||
ENDPROC(__muldi3)
|
||||
ENDPROC(__aeabi_lmul)
|
||||
EXPORT_SYMBOL(__muldi3)
|
||||
EXPORT_SYMBOL(__aeabi_lmul)
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/domain.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
ENTRY(__put_user_1)
|
||||
check_uaccess r0, 1, r1, ip, __put_user_bad
|
||||
@ -39,7 +38,6 @@ ENTRY(__put_user_1)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__put_user_1)
|
||||
EXPORT_SYMBOL(__put_user_1)
|
||||
|
||||
ENTRY(__put_user_2)
|
||||
check_uaccess r0, 2, r1, ip, __put_user_bad
|
||||
@ -64,7 +62,6 @@ ENTRY(__put_user_2)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__put_user_2)
|
||||
EXPORT_SYMBOL(__put_user_2)
|
||||
|
||||
ENTRY(__put_user_4)
|
||||
check_uaccess r0, 4, r1, ip, __put_user_bad
|
||||
@ -72,7 +69,6 @@ ENTRY(__put_user_4)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__put_user_4)
|
||||
EXPORT_SYMBOL(__put_user_4)
|
||||
|
||||
ENTRY(__put_user_8)
|
||||
check_uaccess r0, 8, r1, ip, __put_user_bad
|
||||
@ -86,7 +82,6 @@ ENTRY(__put_user_8)
|
||||
mov r0, #0
|
||||
ret lr
|
||||
ENDPROC(__put_user_8)
|
||||
EXPORT_SYMBOL(__put_user_8)
|
||||
|
||||
__put_user_bad:
|
||||
mov r0, #-EFAULT
|
||||
|
@ -11,7 +11,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
.align 5
|
||||
@ -26,4 +25,3 @@ ENTRY(strchr)
|
||||
subeq r0, r0, #1
|
||||
ret lr
|
||||
ENDPROC(strchr)
|
||||
EXPORT_SYMBOL(strchr)
|
||||
|
@ -11,7 +11,6 @@
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
.text
|
||||
.align 5
|
||||
@ -25,4 +24,3 @@ ENTRY(strrchr)
|
||||
mov r0, r3
|
||||
ret lr
|
||||
ENDPROC(strrchr)
|
||||
EXPORT_SYMBOL(strrchr)
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
@ -157,7 +156,6 @@ arm_copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
}
|
||||
return n;
|
||||
}
|
||||
EXPORT_SYMBOL(arm_copy_to_user);
|
||||
|
||||
static unsigned long noinline
|
||||
__clear_user_memset(void __user *addr, unsigned long n)
|
||||
@ -215,7 +213,6 @@ unsigned long arm_clear_user(void __user *addr, unsigned long n)
|
||||
}
|
||||
return n;
|
||||
}
|
||||
EXPORT_SYMBOL(arm_clear_user);
|
||||
|
||||
#if 0
|
||||
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define xh r0
|
||||
@ -36,7 +35,6 @@ ENTRY(__ucmpdi2)
|
||||
ret lr
|
||||
|
||||
ENDPROC(__ucmpdi2)
|
||||
EXPORT_SYMBOL(__ucmpdi2)
|
||||
|
||||
#ifdef CONFIG_AEABI
|
||||
|
||||
@ -50,7 +48,6 @@ ENTRY(__aeabi_ulcmp)
|
||||
ret lr
|
||||
|
||||
ENDPROC(__aeabi_ulcmp)
|
||||
EXPORT_SYMBOL(__aeabi_ulcmp)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -32,6 +32,7 @@ endif
|
||||
|
||||
ifdef CONFIG_SND_IMX_SOC
|
||||
obj-y += ssi-fiq.o
|
||||
obj-y += ssi-fiq-ksym.o
|
||||
endif
|
||||
|
||||
# i.MX21 based machines
|
||||
|
20
arch/arm/mach-imx/ssi-fiq-ksym.c
Normal file
20
arch/arm/mach-imx/ssi-fiq-ksym.c
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Exported ksyms for the SSI FIQ handler
|
||||
*
|
||||
* Copyright (C) 2009, Sascha Hauer <s.hauer@pengutronix.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/platform_data/asoc-imx-ssi.h>
|
||||
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_tx_buffer);
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_rx_buffer);
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_start);
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_end);
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_base);
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/export.h>
|
||||
|
||||
/*
|
||||
* r8 = bit 0-15: tx offset, bit 16-31: tx buffer size
|
||||
@ -145,8 +144,4 @@ imx_ssi_fiq_tx_buffer:
|
||||
.word 0x0
|
||||
.L_imx_ssi_fiq_end:
|
||||
imx_ssi_fiq_end:
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_tx_buffer)
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_rx_buffer)
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_start)
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_end)
|
||||
EXPORT_SYMBOL(imx_ssi_fiq_base)
|
||||
|
||||
|
@ -214,6 +214,12 @@
|
||||
#error Bad page size configuration for hugetlbfs!
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Wired register bits
|
||||
*/
|
||||
#define MIPSR6_WIRED_LIMIT (_ULCAST_(0xffff) << 16)
|
||||
#define MIPSR6_WIRED_WIRED (_ULCAST_(0xffff) << 0)
|
||||
|
||||
/*
|
||||
* Values used for computation of new tlb entries
|
||||
*/
|
||||
|
@ -1,6 +1,9 @@
|
||||
#ifndef __ASM_TLB_H
|
||||
#define __ASM_TLB_H
|
||||
|
||||
#include <asm/cpu-features.h>
|
||||
#include <asm/mipsregs.h>
|
||||
|
||||
/*
|
||||
* MIPS doesn't need any special per-pte or per-vma handling, except
|
||||
* we need to flush cache for area to be unmapped.
|
||||
@ -22,6 +25,16 @@
|
||||
((CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | \
|
||||
(cpu_has_tlbinv ? MIPS_ENTRYHI_EHINV : 0))
|
||||
|
||||
static inline unsigned int num_wired_entries(void)
|
||||
{
|
||||
unsigned int wired = read_c0_wired();
|
||||
|
||||
if (cpu_has_mips_r6)
|
||||
wired &= MIPSR6_WIRED_WIRED;
|
||||
|
||||
return wired;
|
||||
}
|
||||
|
||||
#include <asm-generic/tlb.h>
|
||||
|
||||
#endif /* __ASM_TLB_H */
|
||||
|
@ -209,17 +209,18 @@ bad_area_nosemaphore:
|
||||
if (show_unhandled_signals &&
|
||||
unhandled_signal(tsk, SIGSEGV) &&
|
||||
__ratelimit(&ratelimit_state)) {
|
||||
pr_info("\ndo_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx",
|
||||
pr_info("do_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx\n",
|
||||
tsk->comm,
|
||||
write ? "write access to" : "read access from",
|
||||
field, address);
|
||||
pr_info("epc = %0*lx in", field,
|
||||
(unsigned long) regs->cp0_epc);
|
||||
print_vma_addr(" ", regs->cp0_epc);
|
||||
print_vma_addr(KERN_CONT " ", regs->cp0_epc);
|
||||
pr_cont("\n");
|
||||
pr_info("ra = %0*lx in", field,
|
||||
(unsigned long) regs->regs[31]);
|
||||
print_vma_addr(" ", regs->regs[31]);
|
||||
pr_info("\n");
|
||||
print_vma_addr(KERN_CONT " ", regs->regs[31]);
|
||||
pr_cont("\n");
|
||||
}
|
||||
current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f;
|
||||
info.si_signo = SIGSEGV;
|
||||
|
@ -118,7 +118,7 @@ static void *__kmap_pgprot(struct page *page, unsigned long addr, pgprot_t prot)
|
||||
writex_c0_entrylo1(entrylo);
|
||||
}
|
||||
#endif
|
||||
tlbidx = read_c0_wired();
|
||||
tlbidx = num_wired_entries();
|
||||
write_c0_wired(tlbidx + 1);
|
||||
write_c0_index(tlbidx);
|
||||
mtc0_tlbw_hazard();
|
||||
@ -147,7 +147,7 @@ void kunmap_coherent(void)
|
||||
|
||||
local_irq_save(flags);
|
||||
old_ctx = read_c0_entryhi();
|
||||
wired = read_c0_wired() - 1;
|
||||
wired = num_wired_entries() - 1;
|
||||
write_c0_wired(wired);
|
||||
write_c0_index(wired);
|
||||
write_c0_entryhi(UNIQUE_ENTRYHI(wired));
|
||||
|
@ -65,7 +65,7 @@ void local_flush_tlb_all(void)
|
||||
write_c0_entrylo0(0);
|
||||
write_c0_entrylo1(0);
|
||||
|
||||
entry = read_c0_wired();
|
||||
entry = num_wired_entries();
|
||||
|
||||
/*
|
||||
* Blast 'em all away.
|
||||
@ -385,7 +385,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||
old_ctx = read_c0_entryhi();
|
||||
htw_stop();
|
||||
old_pagemask = read_c0_pagemask();
|
||||
wired = read_c0_wired();
|
||||
wired = num_wired_entries();
|
||||
write_c0_wired(wired + 1);
|
||||
write_c0_index(wired);
|
||||
tlbw_use_hazard(); /* What is the hazard here? */
|
||||
@ -449,7 +449,7 @@ __init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||
htw_stop();
|
||||
old_ctx = read_c0_entryhi();
|
||||
old_pagemask = read_c0_pagemask();
|
||||
wired = read_c0_wired();
|
||||
wired = num_wired_entries();
|
||||
if (--temp_tlb_entry < wired) {
|
||||
printk(KERN_WARNING
|
||||
"No TLB space left for add_temporary_entry\n");
|
||||
|
@ -34,7 +34,9 @@ config PARISC
|
||||
select HAVE_ARCH_HASH
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK if (SMP || !64BIT)
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK if SMP
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select ARCH_NO_COHERENT_DMA_MMAP
|
||||
select CPU_NO_EFFICIENT_FFS
|
||||
|
||||
|
@ -369,6 +369,7 @@ void __init parisc_setup_cache_timing(void)
|
||||
{
|
||||
unsigned long rangetime, alltime;
|
||||
unsigned long size, start;
|
||||
unsigned long threshold;
|
||||
|
||||
alltime = mfctl(16);
|
||||
flush_data_cache();
|
||||
@ -382,17 +383,12 @@ void __init parisc_setup_cache_timing(void)
|
||||
printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n",
|
||||
alltime, size, rangetime);
|
||||
|
||||
/* Racy, but if we see an intermediate value, it's ok too... */
|
||||
parisc_cache_flush_threshold = size * alltime / rangetime;
|
||||
|
||||
parisc_cache_flush_threshold = L1_CACHE_ALIGN(parisc_cache_flush_threshold);
|
||||
if (!parisc_cache_flush_threshold)
|
||||
parisc_cache_flush_threshold = FLUSH_THRESHOLD;
|
||||
|
||||
if (parisc_cache_flush_threshold > cache_info.dc_size)
|
||||
parisc_cache_flush_threshold = cache_info.dc_size;
|
||||
|
||||
printk(KERN_INFO "Setting cache flush threshold to %lu kB\n",
|
||||
threshold = L1_CACHE_ALIGN(size * alltime / rangetime);
|
||||
if (threshold > cache_info.dc_size)
|
||||
threshold = cache_info.dc_size;
|
||||
if (threshold)
|
||||
parisc_cache_flush_threshold = threshold;
|
||||
printk(KERN_INFO "Cache flush threshold set to %lu KiB\n",
|
||||
parisc_cache_flush_threshold/1024);
|
||||
|
||||
/* calculate TLB flush threshold */
|
||||
@ -401,7 +397,7 @@ void __init parisc_setup_cache_timing(void)
|
||||
flush_tlb_all();
|
||||
alltime = mfctl(16) - alltime;
|
||||
|
||||
size = PAGE_SIZE;
|
||||
size = 0;
|
||||
start = (unsigned long) _text;
|
||||
rangetime = mfctl(16);
|
||||
while (start < (unsigned long) _end) {
|
||||
@ -414,13 +410,10 @@ void __init parisc_setup_cache_timing(void)
|
||||
printk(KERN_DEBUG "Whole TLB flush %lu cycles, flushing %lu bytes %lu cycles\n",
|
||||
alltime, size, rangetime);
|
||||
|
||||
parisc_tlb_flush_threshold = size * alltime / rangetime;
|
||||
parisc_tlb_flush_threshold *= num_online_cpus();
|
||||
parisc_tlb_flush_threshold = PAGE_ALIGN(parisc_tlb_flush_threshold);
|
||||
if (!parisc_tlb_flush_threshold)
|
||||
parisc_tlb_flush_threshold = FLUSH_TLB_THRESHOLD;
|
||||
|
||||
printk(KERN_INFO "Setting TLB flush threshold to %lu kB\n",
|
||||
threshold = PAGE_ALIGN(num_online_cpus() * size * alltime / rangetime);
|
||||
if (threshold)
|
||||
parisc_tlb_flush_threshold = threshold;
|
||||
printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
|
||||
parisc_tlb_flush_threshold/1024);
|
||||
}
|
||||
|
||||
|
@ -58,7 +58,7 @@ void __init setup_pdc(void)
|
||||
status = pdc_system_map_find_mods(&module_result, &module_path, 0);
|
||||
if (status == PDC_OK) {
|
||||
pdc_type = PDC_TYPE_SYSTEM_MAP;
|
||||
printk("System Map.\n");
|
||||
pr_cont("System Map.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ void __init setup_pdc(void)
|
||||
status = pdc_pat_cell_get_number(&cell_info);
|
||||
if (status == PDC_OK) {
|
||||
pdc_type = PDC_TYPE_PAT;
|
||||
printk("64 bit PAT.\n");
|
||||
pr_cont("64 bit PAT.\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
@ -97,12 +97,12 @@ void __init setup_pdc(void)
|
||||
case 0xC: /* 715/64, at least */
|
||||
|
||||
pdc_type = PDC_TYPE_SNAKE;
|
||||
printk("Snake.\n");
|
||||
pr_cont("Snake.\n");
|
||||
return;
|
||||
|
||||
default: /* Everything else */
|
||||
|
||||
printk("Unsupported.\n");
|
||||
pr_cont("Unsupported.\n");
|
||||
panic("If this is a 64-bit machine, please try a 64-bit kernel.\n");
|
||||
}
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ fitmanyloop: /* Loop if LOOP >= 2 */
|
||||
|
||||
fitmanymiddle: /* Loop if LOOP >= 2 */
|
||||
addib,COND(>) -1, %r31, fitmanymiddle /* Adjusted inner loop decr */
|
||||
pitlbe 0(%sr1, %r28)
|
||||
pitlbe %r0(%sr1, %r28)
|
||||
pitlbe,m %arg1(%sr1, %r28) /* Last pitlbe and addr adjust */
|
||||
addib,COND(>) -1, %r29, fitmanymiddle /* Middle loop decr */
|
||||
copy %arg3, %r31 /* Re-init inner loop count */
|
||||
@ -139,7 +139,7 @@ fdtmanyloop: /* Loop if LOOP >= 2 */
|
||||
|
||||
fdtmanymiddle: /* Loop if LOOP >= 2 */
|
||||
addib,COND(>) -1, %r31, fdtmanymiddle /* Adjusted inner loop decr */
|
||||
pdtlbe 0(%sr1, %r28)
|
||||
pdtlbe %r0(%sr1, %r28)
|
||||
pdtlbe,m %arg1(%sr1, %r28) /* Last pdtlbe and addr adjust */
|
||||
addib,COND(>) -1, %r29, fdtmanymiddle /* Middle loop decr */
|
||||
copy %arg3, %r31 /* Re-init inner loop count */
|
||||
@ -626,12 +626,12 @@ ENTRY_CFI(copy_user_page_asm)
|
||||
/* Purge any old translations */
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l 0(%r28)
|
||||
pdtlb,l 0(%r29)
|
||||
pdtlb,l %r0(%r28)
|
||||
pdtlb,l %r0(%r29)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pdtlb 0(%r28)
|
||||
pdtlb 0(%r29)
|
||||
pdtlb %r0(%r28)
|
||||
pdtlb %r0(%r29)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
@ -774,10 +774,10 @@ ENTRY_CFI(clear_user_page_asm)
|
||||
/* Purge any old translation */
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l 0(%r28)
|
||||
pdtlb,l %r0(%r28)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pdtlb 0(%r28)
|
||||
pdtlb %r0(%r28)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
@ -858,10 +858,10 @@ ENTRY_CFI(flush_dcache_page_asm)
|
||||
/* Purge any old translation */
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l 0(%r28)
|
||||
pdtlb,l %r0(%r28)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pdtlb 0(%r28)
|
||||
pdtlb %r0(%r28)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
@ -898,10 +898,10 @@ ENTRY_CFI(flush_dcache_page_asm)
|
||||
sync
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l 0(%r25)
|
||||
pdtlb,l %r0(%r25)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pdtlb 0(%r25)
|
||||
pdtlb %r0(%r25)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
@ -931,13 +931,18 @@ ENTRY_CFI(flush_icache_page_asm)
|
||||
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
|
||||
#endif
|
||||
|
||||
/* Purge any old translation */
|
||||
/* Purge any old translation. Note that the FIC instruction
|
||||
* may use either the instruction or data TLB. Given that we
|
||||
* have a flat address space, it's not clear which TLB will be
|
||||
* used. So, we purge both entries. */
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l %r0(%r28)
|
||||
pitlb,l %r0(%sr4,%r28)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pitlb (%sr4,%r28)
|
||||
pdtlb %r0(%r28)
|
||||
pitlb %r0(%sr4,%r28)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
@ -976,10 +981,12 @@ ENTRY_CFI(flush_icache_page_asm)
|
||||
sync
|
||||
|
||||
#ifdef CONFIG_PA20
|
||||
pdtlb,l %r0(%r28)
|
||||
pitlb,l %r0(%sr4,%r25)
|
||||
#else
|
||||
tlb_lock %r20,%r21,%r22
|
||||
pitlb (%sr4,%r25)
|
||||
pdtlb %r0(%r28)
|
||||
pitlb %r0(%sr4,%r25)
|
||||
tlb_unlock %r20,%r21,%r22
|
||||
#endif
|
||||
|
||||
|
@ -95,8 +95,8 @@ static inline int map_pte_uncached(pte_t * pte,
|
||||
|
||||
if (!pte_none(*pte))
|
||||
printk(KERN_ERR "map_pte_uncached: page already exists\n");
|
||||
set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
|
||||
purge_tlb_start(flags);
|
||||
set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
|
||||
pdtlb_kernel(orig_vaddr);
|
||||
purge_tlb_end(flags);
|
||||
vaddr += PAGE_SIZE;
|
||||
|
@ -334,6 +334,10 @@ static int __init parisc_init(void)
|
||||
/* tell PDC we're Linux. Nevermind failure. */
|
||||
pdc_stable_write(0x40, &osid, sizeof(osid));
|
||||
|
||||
/* start with known state */
|
||||
flush_cache_all_local();
|
||||
flush_tlb_all_local(NULL);
|
||||
|
||||
processor_init();
|
||||
#ifdef CONFIG_SMP
|
||||
pr_info("CPU(s): %d out of %d %s at %d.%06d MHz online\n",
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched_clock.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/string.h>
|
||||
@ -39,18 +40,6 @@
|
||||
|
||||
static unsigned long clocktick __read_mostly; /* timer cycles per tick */
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
/*
|
||||
* The processor-internal cycle counter (Control Register 16) is used as time
|
||||
* source for the sched_clock() function. This register is 64bit wide on a
|
||||
* 64-bit kernel and 32bit on a 32-bit kernel. Since sched_clock() always
|
||||
* requires a 64bit counter we emulate on the 32-bit kernel the higher 32bits
|
||||
* with a per-cpu variable which we increase every time the counter
|
||||
* wraps-around (which happens every ~4 secounds).
|
||||
*/
|
||||
static DEFINE_PER_CPU(unsigned long, cr16_high_32_bits);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We keep time on PA-RISC Linux by using the Interval Timer which is
|
||||
* a pair of registers; one is read-only and one is write-only; both
|
||||
@ -121,12 +110,6 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id)
|
||||
*/
|
||||
mtctl(next_tick, 16);
|
||||
|
||||
#if !defined(CONFIG_64BIT)
|
||||
/* check for overflow on a 32bit kernel (every ~4 seconds). */
|
||||
if (unlikely(next_tick < now))
|
||||
this_cpu_inc(cr16_high_32_bits);
|
||||
#endif
|
||||
|
||||
/* Skip one clocktick on purpose if we missed next_tick.
|
||||
* The new CR16 must be "later" than current CR16 otherwise
|
||||
* itimer would not fire until CR16 wrapped - e.g 4 seconds
|
||||
@ -208,7 +191,7 @@ EXPORT_SYMBOL(profile_pc);
|
||||
|
||||
/* clock source code */
|
||||
|
||||
static cycle_t read_cr16(struct clocksource *cs)
|
||||
static cycle_t notrace read_cr16(struct clocksource *cs)
|
||||
{
|
||||
return get_cycles();
|
||||
}
|
||||
@ -287,26 +270,9 @@ void read_persistent_clock(struct timespec *ts)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sched_clock() framework
|
||||
*/
|
||||
|
||||
static u32 cyc2ns_mul __read_mostly;
|
||||
static u32 cyc2ns_shift __read_mostly;
|
||||
|
||||
u64 sched_clock(void)
|
||||
static u64 notrace read_cr16_sched_clock(void)
|
||||
{
|
||||
u64 now;
|
||||
|
||||
/* Get current cycle counter (Control Register 16). */
|
||||
#ifdef CONFIG_64BIT
|
||||
now = mfctl(16);
|
||||
#else
|
||||
now = mfctl(16) + (((u64) this_cpu_read(cr16_high_32_bits)) << 32);
|
||||
#endif
|
||||
|
||||
/* return the value in ns (cycles_2_ns) */
|
||||
return mul_u64_u32_shr(now, cyc2ns_mul, cyc2ns_shift);
|
||||
return get_cycles();
|
||||
}
|
||||
|
||||
|
||||
@ -316,17 +282,16 @@ u64 sched_clock(void)
|
||||
|
||||
void __init time_init(void)
|
||||
{
|
||||
unsigned long current_cr16_khz;
|
||||
unsigned long cr16_hz;
|
||||
|
||||
current_cr16_khz = PAGE0->mem_10msec/10; /* kHz */
|
||||
clocktick = (100 * PAGE0->mem_10msec) / HZ;
|
||||
|
||||
/* calculate mult/shift values for cr16 */
|
||||
clocks_calc_mult_shift(&cyc2ns_mul, &cyc2ns_shift, current_cr16_khz,
|
||||
NSEC_PER_MSEC, 0);
|
||||
|
||||
start_cpu_itimer(); /* get CPU 0 started */
|
||||
|
||||
cr16_hz = 100 * PAGE0->mem_10msec; /* Hz */
|
||||
|
||||
/* register at clocksource framework */
|
||||
clocksource_register_khz(&clocksource_cr16, current_cr16_khz);
|
||||
clocksource_register_hz(&clocksource_cr16, cr16_hz);
|
||||
|
||||
/* register as sched_clock source */
|
||||
sched_clock_register(read_cr16_sched_clock, BITS_PER_LONG, cr16_hz);
|
||||
}
|
||||
|
@ -232,8 +232,12 @@ void start(void)
|
||||
console_ops.close();
|
||||
|
||||
kentry = (kernel_entry_t) vmlinux.addr;
|
||||
if (ft_addr)
|
||||
kentry(ft_addr, 0, NULL);
|
||||
if (ft_addr) {
|
||||
if(platform_ops.kentry)
|
||||
platform_ops.kentry(ft_addr, vmlinux.addr);
|
||||
else
|
||||
kentry(ft_addr, 0, NULL);
|
||||
}
|
||||
else
|
||||
kentry((unsigned long)initrd.addr, initrd.size,
|
||||
loader_info.promptr);
|
||||
|
@ -12,6 +12,19 @@
|
||||
|
||||
.text
|
||||
|
||||
.globl opal_kentry
|
||||
opal_kentry:
|
||||
/* r3 is the fdt ptr */
|
||||
mtctr r4
|
||||
li r4, 0
|
||||
li r5, 0
|
||||
li r6, 0
|
||||
li r7, 0
|
||||
ld r11,opal@got(r2)
|
||||
ld r8,0(r11)
|
||||
ld r9,8(r11)
|
||||
bctr
|
||||
|
||||
#define OPAL_CALL(name, token) \
|
||||
.globl name; \
|
||||
name: \
|
||||
|
@ -23,14 +23,25 @@ struct opal {
|
||||
|
||||
static u32 opal_con_id;
|
||||
|
||||
/* see opal-wrappers.S */
|
||||
int64_t opal_console_write(int64_t term_number, u64 *length, const u8 *buffer);
|
||||
int64_t opal_console_read(int64_t term_number, uint64_t *length, u8 *buffer);
|
||||
int64_t opal_console_write_buffer_space(uint64_t term_number, uint64_t *length);
|
||||
int64_t opal_console_flush(uint64_t term_number);
|
||||
int64_t opal_poll_events(uint64_t *outstanding_event_mask);
|
||||
|
||||
void opal_kentry(unsigned long fdt_addr, void *vmlinux_addr);
|
||||
|
||||
static int opal_con_open(void)
|
||||
{
|
||||
/*
|
||||
* When OPAL loads the boot kernel it stashes the OPAL base and entry
|
||||
* address in r8 and r9 so the kernel can use the OPAL console
|
||||
* before unflattening the devicetree. While executing the wrapper will
|
||||
* probably trash r8 and r9 so this kentry hook restores them before
|
||||
* entering the decompressed kernel.
|
||||
*/
|
||||
platform_ops.kentry = opal_kentry;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ struct platform_ops {
|
||||
void * (*realloc)(void *ptr, unsigned long size);
|
||||
void (*exit)(void);
|
||||
void * (*vmlinux_alloc)(unsigned long size);
|
||||
void (*kentry)(unsigned long fdt_addr, void *vmlinux_addr);
|
||||
};
|
||||
extern struct platform_ops platform_ops;
|
||||
|
||||
|
@ -14,6 +14,10 @@
|
||||
|
||||
#include <linux/threads.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/checksum.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/epapr_hcalls.h>
|
||||
|
||||
#include <uapi/asm/ucontext.h>
|
||||
|
||||
@ -109,4 +113,12 @@ void early_setup_secondary(void);
|
||||
/* time */
|
||||
void accumulate_stolen_time(void);
|
||||
|
||||
/* misc runtime */
|
||||
extern u64 __bswapdi2(u64);
|
||||
extern s64 __lshrdi3(s64, int);
|
||||
extern s64 __ashldi3(s64, int);
|
||||
extern s64 __ashrdi3(s64, int);
|
||||
extern int __cmpdi2(s64, s64);
|
||||
extern int __ucmpdi2(u64, u64);
|
||||
|
||||
#endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */
|
||||
|
@ -28,6 +28,12 @@
|
||||
* Individual features below.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Kernel read only support.
|
||||
* We added the ppp value 0b110 in ISA 2.04.
|
||||
*/
|
||||
#define MMU_FTR_KERNEL_RO ASM_CONST(0x00004000)
|
||||
|
||||
/*
|
||||
* We need to clear top 16bits of va (from the remaining 64 bits )in
|
||||
* tlbie* instructions
|
||||
@ -103,10 +109,10 @@
|
||||
#define MMU_FTRS_POWER4 MMU_FTRS_DEFAULT_HPTE_ARCH_V2
|
||||
#define MMU_FTRS_PPC970 MMU_FTRS_POWER4 | MMU_FTR_TLBIE_CROP_VA
|
||||
#define MMU_FTRS_POWER5 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
|
||||
#define MMU_FTRS_POWER6 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
|
||||
#define MMU_FTRS_POWER7 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
|
||||
#define MMU_FTRS_POWER8 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
|
||||
#define MMU_FTRS_POWER9 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
|
||||
#define MMU_FTRS_POWER6 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
|
||||
#define MMU_FTRS_POWER7 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
|
||||
#define MMU_FTRS_POWER8 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
|
||||
#define MMU_FTRS_POWER9 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
|
||||
#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
|
||||
MMU_FTR_CI_LARGE_PAGE
|
||||
#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
|
||||
|
@ -355,6 +355,7 @@
|
||||
#define LPCR_PECE0 ASM_CONST(0x0000000000004000) /* ext. exceptions can cause exit */
|
||||
#define LPCR_PECE1 ASM_CONST(0x0000000000002000) /* decrementer can cause exit */
|
||||
#define LPCR_PECE2 ASM_CONST(0x0000000000001000) /* machine check etc can cause exit */
|
||||
#define LPCR_PECE_HVEE ASM_CONST(0x0000400000000000) /* P9 Wakeup on HV interrupts */
|
||||
#define LPCR_MER ASM_CONST(0x0000000000000800) /* Mediated External Exception */
|
||||
#define LPCR_MER_SH 11
|
||||
#define LPCR_TC ASM_CONST(0x0000000000000200) /* Translation control */
|
||||
|
@ -98,8 +98,8 @@ _GLOBAL(__setup_cpu_power9)
|
||||
li r0,0
|
||||
mtspr SPRN_LPID,r0
|
||||
mfspr r3,SPRN_LPCR
|
||||
ori r3, r3, LPCR_PECEDH
|
||||
ori r3, r3, LPCR_HVICE
|
||||
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
|
||||
or r3, r3, r4
|
||||
bl __init_LPCR
|
||||
bl __init_HFSCR
|
||||
bl __init_tlb_power9
|
||||
@ -118,8 +118,8 @@ _GLOBAL(__restore_cpu_power9)
|
||||
li r0,0
|
||||
mtspr SPRN_LPID,r0
|
||||
mfspr r3,SPRN_LPCR
|
||||
ori r3, r3, LPCR_PECEDH
|
||||
ori r3, r3, LPCR_HVICE
|
||||
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
|
||||
or r3, r3, r4
|
||||
bl __init_LPCR
|
||||
bl __init_HFSCR
|
||||
bl __init_tlb_power9
|
||||
|
@ -193,8 +193,12 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
|
||||
/*
|
||||
* Kernel read only mapped with ppp bits 0b110
|
||||
*/
|
||||
if (!(pteflags & _PAGE_WRITE))
|
||||
rflags |= (HPTE_R_PP0 | 0x2);
|
||||
if (!(pteflags & _PAGE_WRITE)) {
|
||||
if (mmu_has_feature(MMU_FTR_KERNEL_RO))
|
||||
rflags |= (HPTE_R_PP0 | 0x2);
|
||||
else
|
||||
rflags |= 0x3;
|
||||
}
|
||||
} else {
|
||||
if (pteflags & _PAGE_RWX)
|
||||
rflags |= 0x2;
|
||||
|
@ -2105,16 +2105,10 @@ static int em_iret(struct x86_emulate_ctxt *ctxt)
|
||||
static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
|
||||
{
|
||||
int rc;
|
||||
unsigned short sel, old_sel;
|
||||
struct desc_struct old_desc, new_desc;
|
||||
const struct x86_emulate_ops *ops = ctxt->ops;
|
||||
unsigned short sel;
|
||||
struct desc_struct new_desc;
|
||||
u8 cpl = ctxt->ops->cpl(ctxt);
|
||||
|
||||
/* Assignment of RIP may only fail in 64-bit mode */
|
||||
if (ctxt->mode == X86EMUL_MODE_PROT64)
|
||||
ops->get_segment(ctxt, &old_sel, &old_desc, NULL,
|
||||
VCPU_SREG_CS);
|
||||
|
||||
memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2);
|
||||
|
||||
rc = __load_segment_descriptor(ctxt, sel, VCPU_SREG_CS, cpl,
|
||||
@ -2124,12 +2118,10 @@ static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
|
||||
return rc;
|
||||
|
||||
rc = assign_eip_far(ctxt, ctxt->src.val, &new_desc);
|
||||
if (rc != X86EMUL_CONTINUE) {
|
||||
WARN_ON(ctxt->mode != X86EMUL_MODE_PROT64);
|
||||
/* assigning eip failed; restore the old cs */
|
||||
ops->set_segment(ctxt, old_sel, &old_desc, 0, VCPU_SREG_CS);
|
||||
return rc;
|
||||
}
|
||||
/* Error handling is not implemented. */
|
||||
if (rc != X86EMUL_CONTINUE)
|
||||
return X86EMUL_UNHANDLEABLE;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -2189,14 +2181,8 @@ static int em_ret_far(struct x86_emulate_ctxt *ctxt)
|
||||
{
|
||||
int rc;
|
||||
unsigned long eip, cs;
|
||||
u16 old_cs;
|
||||
int cpl = ctxt->ops->cpl(ctxt);
|
||||
struct desc_struct old_desc, new_desc;
|
||||
const struct x86_emulate_ops *ops = ctxt->ops;
|
||||
|
||||
if (ctxt->mode == X86EMUL_MODE_PROT64)
|
||||
ops->get_segment(ctxt, &old_cs, &old_desc, NULL,
|
||||
VCPU_SREG_CS);
|
||||
struct desc_struct new_desc;
|
||||
|
||||
rc = emulate_pop(ctxt, &eip, ctxt->op_bytes);
|
||||
if (rc != X86EMUL_CONTINUE)
|
||||
@ -2213,10 +2199,10 @@ static int em_ret_far(struct x86_emulate_ctxt *ctxt)
|
||||
if (rc != X86EMUL_CONTINUE)
|
||||
return rc;
|
||||
rc = assign_eip_far(ctxt, eip, &new_desc);
|
||||
if (rc != X86EMUL_CONTINUE) {
|
||||
WARN_ON(ctxt->mode != X86EMUL_MODE_PROT64);
|
||||
ops->set_segment(ctxt, old_cs, &old_desc, 0, VCPU_SREG_CS);
|
||||
}
|
||||
/* Error handling is not implemented. */
|
||||
if (rc != X86EMUL_CONTINUE)
|
||||
return X86EMUL_UNHANDLEABLE;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -94,7 +94,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,
|
||||
static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
|
||||
{
|
||||
ioapic->rtc_status.pending_eoi = 0;
|
||||
bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPUS);
|
||||
bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID);
|
||||
}
|
||||
|
||||
static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);
|
||||
|
@ -42,13 +42,13 @@ struct kvm_vcpu;
|
||||
|
||||
struct dest_map {
|
||||
/* vcpu bitmap where IRQ has been sent */
|
||||
DECLARE_BITMAP(map, KVM_MAX_VCPUS);
|
||||
DECLARE_BITMAP(map, KVM_MAX_VCPU_ID);
|
||||
|
||||
/*
|
||||
* Vector sent to a given vcpu, only valid when
|
||||
* the vcpu's bit in map is set
|
||||
*/
|
||||
u8 vectors[KVM_MAX_VCPUS];
|
||||
u8 vectors[KVM_MAX_VCPU_ID];
|
||||
};
|
||||
|
||||
|
||||
|
@ -41,6 +41,15 @@ static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e,
|
||||
bool line_status)
|
||||
{
|
||||
struct kvm_pic *pic = pic_irqchip(kvm);
|
||||
|
||||
/*
|
||||
* XXX: rejecting pic routes when pic isn't in use would be better,
|
||||
* but the default routing table is installed while kvm->arch.vpic is
|
||||
* NULL and KVM_CREATE_IRQCHIP can race with KVM_IRQ_LINE.
|
||||
*/
|
||||
if (!pic)
|
||||
return -1;
|
||||
|
||||
return kvm_pic_set_irq(pic, e->irqchip.pin, irq_source_id, level);
|
||||
}
|
||||
|
||||
@ -49,6 +58,10 @@ static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e,
|
||||
bool line_status)
|
||||
{
|
||||
struct kvm_ioapic *ioapic = kvm->arch.vioapic;
|
||||
|
||||
if (!ioapic)
|
||||
return -1;
|
||||
|
||||
return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, irq_source_id, level,
|
||||
line_status);
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
|
||||
*mask = dest_id & 0xff;
|
||||
return true;
|
||||
case KVM_APIC_MODE_XAPIC_CLUSTER:
|
||||
*cluster = map->xapic_cluster_map[dest_id >> 4];
|
||||
*cluster = map->xapic_cluster_map[(dest_id >> 4) & 0xf];
|
||||
*mask = dest_id & 0xf;
|
||||
return true;
|
||||
default:
|
||||
|
@ -133,7 +133,6 @@ struct x509_certificate *x509_cert_parse(const void *data, size_t datalen)
|
||||
return cert;
|
||||
|
||||
error_decode:
|
||||
kfree(cert->pub->key);
|
||||
kfree(ctx);
|
||||
error_no_ctx:
|
||||
x509_free_certificate(cert);
|
||||
|
@ -47,32 +47,15 @@ static void acpi_sleep_tts_switch(u32 acpi_state)
|
||||
}
|
||||
}
|
||||
|
||||
static void acpi_sleep_pts_switch(u32 acpi_state)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_execute_simple_method(NULL, "\\_PTS", acpi_state);
|
||||
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
||||
/*
|
||||
* OS can't evaluate the _PTS object correctly. Some warning
|
||||
* message will be printed. But it won't break anything.
|
||||
*/
|
||||
printk(KERN_NOTICE "Failure in evaluating _PTS object\n");
|
||||
}
|
||||
}
|
||||
|
||||
static int sleep_notify_reboot(struct notifier_block *this,
|
||||
static int tts_notify_reboot(struct notifier_block *this,
|
||||
unsigned long code, void *x)
|
||||
{
|
||||
acpi_sleep_tts_switch(ACPI_STATE_S5);
|
||||
|
||||
acpi_sleep_pts_switch(ACPI_STATE_S5);
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block sleep_notifier = {
|
||||
.notifier_call = sleep_notify_reboot,
|
||||
static struct notifier_block tts_notifier = {
|
||||
.notifier_call = tts_notify_reboot,
|
||||
.next = NULL,
|
||||
.priority = 0,
|
||||
};
|
||||
@ -916,9 +899,9 @@ int __init acpi_sleep_init(void)
|
||||
pr_info(PREFIX "(supports%s)\n", supported);
|
||||
|
||||
/*
|
||||
* Register the sleep_notifier to reboot notifier list so that the _TTS
|
||||
* and _PTS object can also be evaluated when the system enters S5.
|
||||
* Register the tts_notifier to reboot notifier list so that the _TTS
|
||||
* object can also be evaluated when the system enters S5.
|
||||
*/
|
||||
register_reboot_notifier(&sleep_notifier);
|
||||
register_reboot_notifier(&tts_notifier);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1436,13 +1436,6 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
|
||||
"ahci: MRSM is on, fallback to single MSI\n");
|
||||
pci_free_irq_vectors(pdev);
|
||||
}
|
||||
|
||||
/*
|
||||
* -ENOSPC indicated we don't have enough vectors. Don't bother
|
||||
* trying a single vectors for any other error:
|
||||
*/
|
||||
if (nvec < 0 && nvec != -ENOSPC)
|
||||
return nvec;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1088,7 +1088,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
|
||||
desc[1] = tf->command; /* status */
|
||||
desc[2] = tf->device;
|
||||
desc[3] = tf->nsect;
|
||||
desc[0] = 0;
|
||||
desc[7] = 0;
|
||||
if (tf->flags & ATA_TFLAG_LBA48) {
|
||||
desc[8] |= 0x80;
|
||||
if (tf->hob_nsect)
|
||||
|
@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct class *class,
|
||||
zram = idr_find(&zram_index_idr, dev_id);
|
||||
if (zram) {
|
||||
ret = zram_remove(zram);
|
||||
idr_remove(&zram_index_idr, dev_id);
|
||||
if (!ret)
|
||||
idr_remove(&zram_index_idr, dev_id);
|
||||
} else {
|
||||
ret = -ENODEV;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ config CLK_BCM_KONA
|
||||
|
||||
config COMMON_CLK_IPROC
|
||||
bool "Broadcom iProc clock support"
|
||||
depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||
depends on ARCH_BCM_IPROC || ARCH_BCM_63XX || COMPILE_TEST
|
||||
depends on COMMON_CLK
|
||||
default ARCH_BCM_IPROC
|
||||
help
|
||||
|
@ -143,7 +143,7 @@ static SUNXI_CCU_NKM_WITH_MUX_GATE_LOCK(pll_mipi_clk, "pll-mipi",
|
||||
4, 2, /* K */
|
||||
0, 4, /* M */
|
||||
21, 0, /* mux */
|
||||
BIT(31), /* gate */
|
||||
BIT(31) | BIT(23) | BIT(22), /* gate */
|
||||
BIT(28), /* lock */
|
||||
CLK_SET_RATE_UNGATE);
|
||||
|
||||
|
@ -131,7 +131,7 @@ static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_mipi_clk, "pll-mipi",
|
||||
8, 4, /* N */
|
||||
4, 2, /* K */
|
||||
0, 4, /* M */
|
||||
BIT(31), /* gate */
|
||||
BIT(31) | BIT(23) | BIT(22), /* gate */
|
||||
BIT(28), /* lock */
|
||||
CLK_SET_RATE_UNGATE);
|
||||
|
||||
|
@ -270,8 +270,8 @@ static int check_vma(struct dax_dev *dax_dev, struct vm_area_struct *vma,
|
||||
if (!dax_dev->alive)
|
||||
return -ENXIO;
|
||||
|
||||
/* prevent private / writable mappings from being established */
|
||||
if ((vma->vm_flags & (VM_NORESERVE|VM_SHARED|VM_WRITE)) == VM_WRITE) {
|
||||
/* prevent private mappings from being established */
|
||||
if ((vma->vm_flags & VM_SHARED) != VM_SHARED) {
|
||||
dev_info(dev, "%s: %s: fail, attempted private mapping\n",
|
||||
current->comm, func);
|
||||
return -EINVAL;
|
||||
|
@ -78,7 +78,9 @@ static int dax_pmem_probe(struct device *dev)
|
||||
nsio = to_nd_namespace_io(&ndns->dev);
|
||||
|
||||
/* parse the 'pfn' info block via ->rw_bytes */
|
||||
devm_nsio_enable(dev, nsio);
|
||||
rc = devm_nsio_enable(dev, nsio);
|
||||
if (rc)
|
||||
return rc;
|
||||
altmap = nvdimm_setup_pfn(nd_pfn, &res, &__altmap);
|
||||
if (IS_ERR(altmap))
|
||||
return PTR_ERR(altmap);
|
||||
|
@ -34,6 +34,7 @@ struct amdgpu_atpx {
|
||||
|
||||
static struct amdgpu_atpx_priv {
|
||||
bool atpx_detected;
|
||||
bool bridge_pm_usable;
|
||||
/* handle for device - and atpx */
|
||||
acpi_handle dhandle;
|
||||
acpi_handle other_handle;
|
||||
@ -205,7 +206,11 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
|
||||
atpx->is_hybrid = false;
|
||||
if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
|
||||
printk("ATPX Hybrid Graphics\n");
|
||||
atpx->functions.power_cntl = false;
|
||||
/*
|
||||
* Disable legacy PM methods only when pcie port PM is usable,
|
||||
* otherwise the device might fail to power off or power on.
|
||||
*/
|
||||
atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable;
|
||||
atpx->is_hybrid = true;
|
||||
}
|
||||
|
||||
@ -480,6 +485,7 @@ static int amdgpu_atpx_power_state(enum vga_switcheroo_client_id id,
|
||||
*/
|
||||
static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
|
||||
acpi_handle dhandle, atpx_handle;
|
||||
acpi_status status;
|
||||
|
||||
@ -494,6 +500,7 @@ static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||
}
|
||||
amdgpu_atpx_priv.dhandle = dhandle;
|
||||
amdgpu_atpx_priv.atpx.handle = atpx_handle;
|
||||
amdgpu_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2984,19 +2984,19 @@ static int smu7_get_pp_table_entry_callback_func_v0(struct pp_hwmgr *hwmgr,
|
||||
if (!(data->mc_micro_code_feature & DISABLE_MC_LOADMICROCODE) && memory_clock > data->highest_mclk)
|
||||
data->highest_mclk = memory_clock;
|
||||
|
||||
performance_level = &(ps->performance_levels
|
||||
[ps->performance_level_count++]);
|
||||
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(ps->performance_level_count < smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_GRAPHICS)),
|
||||
"Performance levels exceeds SMC limit!",
|
||||
return -EINVAL);
|
||||
|
||||
PP_ASSERT_WITH_CODE(
|
||||
(ps->performance_level_count <=
|
||||
(ps->performance_level_count <
|
||||
hwmgr->platform_descriptor.hardwareActivityPerformanceLevels),
|
||||
"Performance levels exceeds Driver limit!",
|
||||
return -EINVAL);
|
||||
"Performance levels exceeds Driver limit, Skip!",
|
||||
return 0);
|
||||
|
||||
performance_level = &(ps->performance_levels
|
||||
[ps->performance_level_count++]);
|
||||
|
||||
/* Performance levels are arranged from low to high. */
|
||||
performance_level->memory_clock = memory_clock;
|
||||
|
@ -150,15 +150,14 @@ static void hdlcd_crtc_enable(struct drm_crtc *crtc)
|
||||
clk_prepare_enable(hdlcd->clk);
|
||||
hdlcd_crtc_mode_set_nofb(crtc);
|
||||
hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1);
|
||||
drm_crtc_vblank_on(crtc);
|
||||
}
|
||||
|
||||
static void hdlcd_crtc_disable(struct drm_crtc *crtc)
|
||||
{
|
||||
struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
|
||||
|
||||
if (!crtc->state->active)
|
||||
return;
|
||||
|
||||
drm_crtc_vblank_off(crtc);
|
||||
hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0);
|
||||
clk_disable_unprepare(hdlcd->clk);
|
||||
}
|
||||
|
@ -1907,6 +1907,8 @@ err_disable_pm_runtime:
|
||||
err_hdmiphy:
|
||||
if (hdata->hdmiphy_port)
|
||||
put_device(&hdata->hdmiphy_port->dev);
|
||||
if (hdata->regs_hdmiphy)
|
||||
iounmap(hdata->regs_hdmiphy);
|
||||
err_ddc:
|
||||
put_device(&hdata->ddc_adpt->dev);
|
||||
|
||||
@ -1929,6 +1931,9 @@ static int hdmi_remove(struct platform_device *pdev)
|
||||
if (hdata->hdmiphy_port)
|
||||
put_device(&hdata->hdmiphy_port->dev);
|
||||
|
||||
if (hdata->regs_hdmiphy)
|
||||
iounmap(hdata->regs_hdmiphy);
|
||||
|
||||
put_device(&hdata->ddc_adpt->dev);
|
||||
|
||||
return 0;
|
||||
|
@ -251,13 +251,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
|
||||
IRQF_TRIGGER_NONE, dev_name(dev), priv);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL);
|
||||
if (comp_id < 0) {
|
||||
dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
|
||||
@ -273,6 +266,13 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
|
||||
ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
|
||||
IRQF_TRIGGER_NONE, dev_name(dev), priv);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = component_add(dev, &mtk_disp_ovl_component_ops);
|
||||
if (ret)
|
||||
dev_err(dev, "Failed to add component: %d\n", ret);
|
||||
|
@ -123,7 +123,7 @@ static void mtk_od_config(struct mtk_ddp_comp *comp, unsigned int w,
|
||||
unsigned int bpc)
|
||||
{
|
||||
writel(w << 16 | h, comp->regs + DISP_OD_SIZE);
|
||||
writel(OD_RELAYMODE, comp->regs + OD_RELAYMODE);
|
||||
writel(OD_RELAYMODE, comp->regs + DISP_OD_CFG);
|
||||
mtk_dither_set(comp, bpc, DISP_OD_CFG);
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@
|
||||
|
||||
#define DSI_PHY_TIMECON0 0x110
|
||||
#define LPX (0xff << 0)
|
||||
#define HS_PRPR (0xff << 8)
|
||||
#define HS_PREP (0xff << 8)
|
||||
#define HS_ZERO (0xff << 16)
|
||||
#define HS_TRAIL (0xff << 24)
|
||||
|
||||
@ -102,10 +102,16 @@
|
||||
#define CLK_TRAIL (0xff << 24)
|
||||
|
||||
#define DSI_PHY_TIMECON3 0x11c
|
||||
#define CLK_HS_PRPR (0xff << 0)
|
||||
#define CLK_HS_PREP (0xff << 0)
|
||||
#define CLK_HS_POST (0xff << 8)
|
||||
#define CLK_HS_EXIT (0xff << 16)
|
||||
|
||||
#define T_LPX 5
|
||||
#define T_HS_PREP 6
|
||||
#define T_HS_TRAIL 8
|
||||
#define T_HS_EXIT 7
|
||||
#define T_HS_ZERO 10
|
||||
|
||||
#define NS_TO_CYCLE(n, c) ((n) / (c) + (((n) % (c)) ? 1 : 0))
|
||||
|
||||
struct phy;
|
||||
@ -161,20 +167,18 @@ static void mtk_dsi_mask(struct mtk_dsi *dsi, u32 offset, u32 mask, u32 data)
|
||||
static void dsi_phy_timconfig(struct mtk_dsi *dsi)
|
||||
{
|
||||
u32 timcon0, timcon1, timcon2, timcon3;
|
||||
unsigned int ui, cycle_time;
|
||||
unsigned int lpx;
|
||||
u32 ui, cycle_time;
|
||||
|
||||
ui = 1000 / dsi->data_rate + 0x01;
|
||||
cycle_time = 8000 / dsi->data_rate + 0x01;
|
||||
lpx = 5;
|
||||
|
||||
timcon0 = (8 << 24) | (0xa << 16) | (0x6 << 8) | lpx;
|
||||
timcon1 = (7 << 24) | (5 * lpx << 16) | ((3 * lpx) / 2) << 8 |
|
||||
(4 * lpx);
|
||||
timcon0 = T_LPX | T_HS_PREP << 8 | T_HS_ZERO << 16 | T_HS_TRAIL << 24;
|
||||
timcon1 = 4 * T_LPX | (3 * T_LPX / 2) << 8 | 5 * T_LPX << 16 |
|
||||
T_HS_EXIT << 24;
|
||||
timcon2 = ((NS_TO_CYCLE(0x64, cycle_time) + 0xa) << 24) |
|
||||
(NS_TO_CYCLE(0x150, cycle_time) << 16);
|
||||
timcon3 = (2 * lpx) << 16 | NS_TO_CYCLE(80 + 52 * ui, cycle_time) << 8 |
|
||||
NS_TO_CYCLE(0x40, cycle_time);
|
||||
timcon3 = NS_TO_CYCLE(0x40, cycle_time) | (2 * T_LPX) << 16 |
|
||||
NS_TO_CYCLE(80 + 52 * ui, cycle_time) << 8;
|
||||
|
||||
writel(timcon0, dsi->regs + DSI_PHY_TIMECON0);
|
||||
writel(timcon1, dsi->regs + DSI_PHY_TIMECON1);
|
||||
@ -202,19 +206,47 @@ static int mtk_dsi_poweron(struct mtk_dsi *dsi)
|
||||
{
|
||||
struct device *dev = dsi->dev;
|
||||
int ret;
|
||||
u64 pixel_clock, total_bits;
|
||||
u32 htotal, htotal_bits, bit_per_pixel, overhead_cycles, overhead_bits;
|
||||
|
||||
if (++dsi->refcount != 1)
|
||||
return 0;
|
||||
|
||||
/**
|
||||
* data_rate = (pixel_clock / 1000) * pixel_dipth * mipi_ratio;
|
||||
* pixel_clock unit is Khz, data_rata unit is MHz, so need divide 1000.
|
||||
* mipi_ratio is mipi clk coefficient for balance the pixel clk in mipi.
|
||||
* we set mipi_ratio is 1.05.
|
||||
*/
|
||||
dsi->data_rate = dsi->vm.pixelclock * 3 * 21 / (1 * 1000 * 10);
|
||||
switch (dsi->format) {
|
||||
case MIPI_DSI_FMT_RGB565:
|
||||
bit_per_pixel = 16;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB666_PACKED:
|
||||
bit_per_pixel = 18;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB666:
|
||||
case MIPI_DSI_FMT_RGB888:
|
||||
default:
|
||||
bit_per_pixel = 24;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = clk_set_rate(dsi->hs_clk, dsi->data_rate * 1000000);
|
||||
/**
|
||||
* vm.pixelclock is in kHz, pixel_clock unit is Hz, so multiply by 1000
|
||||
* htotal_time = htotal * byte_per_pixel / num_lanes
|
||||
* overhead_time = lpx + hs_prepare + hs_zero + hs_trail + hs_exit
|
||||
* mipi_ratio = (htotal_time + overhead_time) / htotal_time
|
||||
* data_rate = pixel_clock * bit_per_pixel * mipi_ratio / num_lanes;
|
||||
*/
|
||||
pixel_clock = dsi->vm.pixelclock * 1000;
|
||||
htotal = dsi->vm.hactive + dsi->vm.hback_porch + dsi->vm.hfront_porch +
|
||||
dsi->vm.hsync_len;
|
||||
htotal_bits = htotal * bit_per_pixel;
|
||||
|
||||
overhead_cycles = T_LPX + T_HS_PREP + T_HS_ZERO + T_HS_TRAIL +
|
||||
T_HS_EXIT;
|
||||
overhead_bits = overhead_cycles * dsi->lanes * 8;
|
||||
total_bits = htotal_bits + overhead_bits;
|
||||
|
||||
dsi->data_rate = DIV_ROUND_UP_ULL(pixel_clock * total_bits,
|
||||
htotal * dsi->lanes);
|
||||
|
||||
ret = clk_set_rate(dsi->hs_clk, dsi->data_rate);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to set data rate: %d\n", ret);
|
||||
goto err_refcount;
|
||||
|
@ -34,6 +34,7 @@ struct radeon_atpx {
|
||||
|
||||
static struct radeon_atpx_priv {
|
||||
bool atpx_detected;
|
||||
bool bridge_pm_usable;
|
||||
/* handle for device - and atpx */
|
||||
acpi_handle dhandle;
|
||||
struct radeon_atpx atpx;
|
||||
@ -203,7 +204,11 @@ static int radeon_atpx_validate(struct radeon_atpx *atpx)
|
||||
atpx->is_hybrid = false;
|
||||
if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
|
||||
printk("ATPX Hybrid Graphics\n");
|
||||
atpx->functions.power_cntl = false;
|
||||
/*
|
||||
* Disable legacy PM methods only when pcie port PM is usable,
|
||||
* otherwise the device might fail to power off or power on.
|
||||
*/
|
||||
atpx->functions.power_cntl = !radeon_atpx_priv.bridge_pm_usable;
|
||||
atpx->is_hybrid = true;
|
||||
}
|
||||
|
||||
@ -474,6 +479,7 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id,
|
||||
*/
|
||||
static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
|
||||
acpi_handle dhandle, atpx_handle;
|
||||
acpi_status status;
|
||||
|
||||
@ -487,6 +493,7 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||
|
||||
radeon_atpx_priv.dhandle = dhandle;
|
||||
radeon_atpx_priv.atpx.handle = atpx_handle;
|
||||
radeon_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,11 @@
|
||||
#include <linux/usb/ch9.h>
|
||||
#include "hid-ids.h"
|
||||
|
||||
#define CP2112_REPORT_MAX_LENGTH 64
|
||||
#define CP2112_GPIO_CONFIG_LENGTH 5
|
||||
#define CP2112_GPIO_GET_LENGTH 2
|
||||
#define CP2112_GPIO_SET_LENGTH 3
|
||||
|
||||
enum {
|
||||
CP2112_GPIO_CONFIG = 0x02,
|
||||
CP2112_GPIO_GET = 0x03,
|
||||
@ -161,6 +166,8 @@ struct cp2112_device {
|
||||
atomic_t read_avail;
|
||||
atomic_t xfer_avail;
|
||||
struct gpio_chip gc;
|
||||
u8 *in_out_buffer;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
static int gpio_push_pull = 0xFF;
|
||||
@ -171,62 +178,86 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct cp2112_device *dev = gpiochip_get_data(chip);
|
||||
struct hid_device *hdev = dev->hdev;
|
||||
u8 buf[5];
|
||||
u8 *buf = dev->in_out_buffer;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
|
||||
sizeof(buf), HID_FEATURE_REPORT,
|
||||
HID_REQ_GET_REPORT);
|
||||
if (ret != sizeof(buf)) {
|
||||
CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
|
||||
HID_REQ_GET_REPORT);
|
||||
if (ret != CP2112_GPIO_CONFIG_LENGTH) {
|
||||
hid_err(hdev, "error requesting GPIO config: %d\n", ret);
|
||||
return ret;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
buf[1] &= ~(1 << offset);
|
||||
buf[2] = gpio_push_pull;
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, sizeof(buf),
|
||||
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
|
||||
CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
|
||||
HID_REQ_SET_REPORT);
|
||||
if (ret < 0) {
|
||||
hid_err(hdev, "error setting GPIO config: %d\n", ret);
|
||||
return ret;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
|
||||
exit:
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
return ret <= 0 ? ret : -EIO;
|
||||
}
|
||||
|
||||
static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct cp2112_device *dev = gpiochip_get_data(chip);
|
||||
struct hid_device *hdev = dev->hdev;
|
||||
u8 buf[3];
|
||||
u8 *buf = dev->in_out_buffer;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
|
||||
buf[0] = CP2112_GPIO_SET;
|
||||
buf[1] = value ? 0xff : 0;
|
||||
buf[2] = 1 << offset;
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf, sizeof(buf),
|
||||
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
|
||||
CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
|
||||
HID_REQ_SET_REPORT);
|
||||
if (ret < 0)
|
||||
hid_err(hdev, "error setting GPIO values: %d\n", ret);
|
||||
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
}
|
||||
|
||||
static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct cp2112_device *dev = gpiochip_get_data(chip);
|
||||
struct hid_device *hdev = dev->hdev;
|
||||
u8 buf[2];
|
||||
u8 *buf = dev->in_out_buffer;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf, sizeof(buf),
|
||||
HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
|
||||
if (ret != sizeof(buf)) {
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf,
|
||||
CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT,
|
||||
HID_REQ_GET_REPORT);
|
||||
if (ret != CP2112_GPIO_GET_LENGTH) {
|
||||
hid_err(hdev, "error requesting GPIO values: %d\n", ret);
|
||||
return ret;
|
||||
ret = ret < 0 ? ret : -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
return (buf[1] >> offset) & 1;
|
||||
ret = (buf[1] >> offset) & 1;
|
||||
|
||||
exit:
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cp2112_gpio_direction_output(struct gpio_chip *chip,
|
||||
@ -234,27 +265,33 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
|
||||
{
|
||||
struct cp2112_device *dev = gpiochip_get_data(chip);
|
||||
struct hid_device *hdev = dev->hdev;
|
||||
u8 buf[5];
|
||||
u8 *buf = dev->in_out_buffer;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
|
||||
sizeof(buf), HID_FEATURE_REPORT,
|
||||
HID_REQ_GET_REPORT);
|
||||
if (ret != sizeof(buf)) {
|
||||
CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
|
||||
HID_REQ_GET_REPORT);
|
||||
if (ret != CP2112_GPIO_CONFIG_LENGTH) {
|
||||
hid_err(hdev, "error requesting GPIO config: %d\n", ret);
|
||||
return ret;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
buf[1] |= 1 << offset;
|
||||
buf[2] = gpio_push_pull;
|
||||
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, sizeof(buf),
|
||||
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
|
||||
CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
|
||||
HID_REQ_SET_REPORT);
|
||||
if (ret < 0) {
|
||||
hid_err(hdev, "error setting GPIO config: %d\n", ret);
|
||||
return ret;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
|
||||
/*
|
||||
* Set gpio value when output direction is already set,
|
||||
* as specified in AN495, Rev. 0.2, cpt. 4.4
|
||||
@ -262,6 +299,10 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
|
||||
cp2112_gpio_set(chip, offset, value);
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
return ret < 0 ? ret : -EIO;
|
||||
}
|
||||
|
||||
static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
|
||||
@ -1007,6 +1048,17 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
struct cp2112_smbus_config_report config;
|
||||
int ret;
|
||||
|
||||
dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->in_out_buffer = devm_kzalloc(&hdev->dev, CP2112_REPORT_MAX_LENGTH,
|
||||
GFP_KERNEL);
|
||||
if (!dev->in_out_buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&dev->lock);
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
@ -1063,12 +1115,6 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
goto err_power_normal;
|
||||
}
|
||||
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
ret = -ENOMEM;
|
||||
goto err_power_normal;
|
||||
}
|
||||
|
||||
hid_set_drvdata(hdev, (void *)dev);
|
||||
dev->hdev = hdev;
|
||||
dev->adap.owner = THIS_MODULE;
|
||||
@ -1087,7 +1133,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
|
||||
if (ret) {
|
||||
hid_err(hdev, "error registering i2c adapter\n");
|
||||
goto err_free_dev;
|
||||
goto err_power_normal;
|
||||
}
|
||||
|
||||
hid_dbg(hdev, "adapter registered\n");
|
||||
@ -1123,8 +1169,6 @@ err_gpiochip_remove:
|
||||
gpiochip_remove(&dev->gc);
|
||||
err_free_i2c:
|
||||
i2c_del_adapter(&dev->adap);
|
||||
err_free_dev:
|
||||
kfree(dev);
|
||||
err_power_normal:
|
||||
hid_hw_power(hdev, PM_HINT_NORMAL);
|
||||
err_hid_close:
|
||||
@ -1149,7 +1193,6 @@ static void cp2112_remove(struct hid_device *hdev)
|
||||
*/
|
||||
hid_hw_close(hdev);
|
||||
hid_hw_stop(hdev);
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
static int cp2112_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
|
@ -756,11 +756,16 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
|
||||
/* Setup wireless link with Logitech Wii wheel */
|
||||
if (hdev->product == USB_DEVICE_ID_LOGITECH_WII_WHEEL) {
|
||||
unsigned char buf[] = { 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
const unsigned char cbuf[] = { 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
u8 *buf = kmemdup(cbuf, sizeof(cbuf), GFP_KERNEL);
|
||||
|
||||
ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
|
||||
if (!buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf),
|
||||
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
|
||||
if (ret >= 0) {
|
||||
/* insert a little delay of 10 jiffies ~ 40ms */
|
||||
wait_queue_head_t wait;
|
||||
@ -772,9 +777,10 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
buf[1] = 0xB2;
|
||||
get_random_bytes(&buf[2], 2);
|
||||
|
||||
ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
|
||||
ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf),
|
||||
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
}
|
||||
kfree(buf);
|
||||
}
|
||||
|
||||
if (drv_data->quirks & LG_FF)
|
||||
|
@ -493,7 +493,8 @@ static int magicmouse_input_configured(struct hid_device *hdev,
|
||||
static int magicmouse_probe(struct hid_device *hdev,
|
||||
const struct hid_device_id *id)
|
||||
{
|
||||
__u8 feature[] = { 0xd7, 0x01 };
|
||||
const u8 feature[] = { 0xd7, 0x01 };
|
||||
u8 *buf;
|
||||
struct magicmouse_sc *msc;
|
||||
struct hid_report *report;
|
||||
int ret;
|
||||
@ -544,6 +545,12 @@ static int magicmouse_probe(struct hid_device *hdev,
|
||||
}
|
||||
report->size = 6;
|
||||
|
||||
buf = kmemdup(feature, sizeof(feature), GFP_KERNEL);
|
||||
if (!buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_stop_hw;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some devices repond with 'invalid report id' when feature
|
||||
* report switching it into multitouch mode is sent to it.
|
||||
@ -552,8 +559,9 @@ static int magicmouse_probe(struct hid_device *hdev,
|
||||
* but there seems to be no other way of switching the mode.
|
||||
* Thus the super-ugly hacky success check below.
|
||||
*/
|
||||
ret = hid_hw_raw_request(hdev, feature[0], feature, sizeof(feature),
|
||||
ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(feature),
|
||||
HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
kfree(buf);
|
||||
if (ret != -EIO && ret != sizeof(feature)) {
|
||||
hid_err(hdev, "unable to request touch data (%d)\n", ret);
|
||||
goto err_stop_hw;
|
||||
|
@ -188,10 +188,16 @@ static int rmi_set_page(struct hid_device *hdev, u8 page)
|
||||
static int rmi_set_mode(struct hid_device *hdev, u8 mode)
|
||||
{
|
||||
int ret;
|
||||
u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode};
|
||||
const u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode};
|
||||
u8 *buf;
|
||||
|
||||
ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, txbuf,
|
||||
buf = kmemdup(txbuf, sizeof(txbuf), GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, buf,
|
||||
sizeof(txbuf), HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
|
||||
kfree(buf);
|
||||
if (ret < 0) {
|
||||
dev_err(&hdev->dev, "unable to set rmi mode to %d (%d)\n", mode,
|
||||
ret);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user