Merge branch 'perf/urgent' into perf/core, to pick up fixes before applying new changes

Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Ingo Molnar 2015-09-18 09:24:01 +02:00
commit 02386c356a
139 changed files with 722 additions and 409 deletions

View File

@ -21,8 +21,8 @@ exact way to do it depends on the GPIO controller providing the GPIOs, see the
device tree bindings for your controller. device tree bindings for your controller.
GPIOs mappings are defined in the consumer device's node, in a property named GPIOs mappings are defined in the consumer device's node, in a property named
<function>-gpios, where <function> is the function the driver will request either <function>-gpios or <function>-gpio, where <function> is the function
through gpiod_get(). For example: the driver will request through gpiod_get(). For example:
foo_device { foo_device {
compatible = "acme,foo"; compatible = "acme,foo";
@ -31,7 +31,7 @@ through gpiod_get(). For example:
<&gpio 16 GPIO_ACTIVE_HIGH>, /* green */ <&gpio 16 GPIO_ACTIVE_HIGH>, /* green */
<&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */ <&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */
power-gpios = <&gpio 1 GPIO_ACTIVE_LOW>; power-gpio = <&gpio 1 GPIO_ACTIVE_LOW>;
}; };
This property will make GPIOs 15, 16 and 17 available to the driver under the This property will make GPIOs 15, 16 and 17 available to the driver under the
@ -39,15 +39,24 @@ This property will make GPIOs 15, 16 and 17 available to the driver under the
struct gpio_desc *red, *green, *blue, *power; struct gpio_desc *red, *green, *blue, *power;
red = gpiod_get_index(dev, "led", 0); red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = gpiod_get_index(dev, "led", 1); green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
blue = gpiod_get_index(dev, "led", 2); blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);
power = gpiod_get(dev, "power"); power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);
The led GPIOs will be active-high, while the power GPIO will be active-low (i.e. The led GPIOs will be active-high, while the power GPIO will be active-low (i.e.
gpiod_is_active_low(power) will be true). gpiod_is_active_low(power) will be true).
The second parameter of the gpiod_get() functions, the con_id string, has to be
the <function>-prefix of the GPIO suffixes ("gpios" or "gpio", automatically
looked up by the gpiod functions internally) used in the device tree. With above
"led-gpios" example, use the prefix without the "-" as con_id parameter: "led".
Internally, the GPIO subsystem prefixes the GPIO suffix ("gpios" or "gpio")
with the string passed in con_id to get the resulting string
(snprintf(... "%s-%s", con_id, gpio_suffixes[]).
ACPI ACPI
---- ----
ACPI also supports function names for GPIOs in a similar fashion to DT. ACPI also supports function names for GPIOs in a similar fashion to DT.
@ -142,13 +151,14 @@ The driver controlling "foo.0" will then be able to obtain its GPIOs as follows:
struct gpio_desc *red, *green, *blue, *power; struct gpio_desc *red, *green, *blue, *power;
red = gpiod_get_index(dev, "led", 0); red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = gpiod_get_index(dev, "led", 1); green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
blue = gpiod_get_index(dev, "led", 2); blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);
power = gpiod_get(dev, "power"); power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);
gpiod_direction_output(power, 1);
Since the "power" GPIO is mapped as active-low, its actual signal will be 0 Since the "led" GPIOs are mapped as active-high, this example will switch their
after this code. Contrary to the legacy integer GPIO interface, the active-low signals to 1, i.e. enabling the LEDs. And for the "power" GPIO, which is mapped
property is handled during mapping and is thus transparent to GPIO consumers. as active-low, its actual signal will be 0 after this code. Contrary to the legacy
integer GPIO interface, the active-low property is handled during mapping and is
thus transparent to GPIO consumers.

View File

@ -39,6 +39,9 @@ device that displays digits), an additional index argument can be specified:
const char *con_id, unsigned int idx, const char *con_id, unsigned int idx,
enum gpiod_flags flags) enum gpiod_flags flags)
For a more detailed description of the con_id parameter in the DeviceTree case
see Documentation/gpio/board.txt
The flags parameter is used to optionally specify a direction and initial value The flags parameter is used to optionally specify a direction and initial value
for the GPIO. Values can be: for the GPIO. Values can be:

View File

@ -32,6 +32,10 @@ Supported chips:
Prefix: 'nct6792' Prefix: 'nct6792'
Addresses scanned: ISA address retrieved from Super I/O registers Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: Available from Nuvoton upon request Datasheet: Available from Nuvoton upon request
* Nuvoton NCT6793D
Prefix: 'nct6793'
Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: Available from Nuvoton upon request
Authors: Authors:
Guenter Roeck <linux@roeck-us.net> Guenter Roeck <linux@roeck-us.net>

View File

@ -15,8 +15,8 @@ The updated API replacements are:
DEFINE_STATIC_KEY_TRUE(key); DEFINE_STATIC_KEY_TRUE(key);
DEFINE_STATIC_KEY_FALSE(key); DEFINE_STATIC_KEY_FALSE(key);
static_key_likely() static_branch_likely()
statick_key_unlikely() static_branch_unlikely()
0) Abstract 0) Abstract

View File

@ -6452,11 +6452,11 @@ F: drivers/hwmon/ltc4261.c
LTP (Linux Test Project) LTP (Linux Test Project)
M: Mike Frysinger <vapier@gentoo.org> M: Mike Frysinger <vapier@gentoo.org>
M: Cyril Hrubis <chrubis@suse.cz> M: Cyril Hrubis <chrubis@suse.cz>
M: Wanlong Gao <gaowanlong@cn.fujitsu.com> M: Wanlong Gao <wanlong.gao@gmail.com>
M: Jan Stancek <jstancek@redhat.com> M: Jan Stancek <jstancek@redhat.com>
M: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com> M: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
M: Alexey Kodanev <alexey.kodanev@oracle.com> M: Alexey Kodanev <alexey.kodanev@oracle.com>
L: ltp-list@lists.sourceforge.net (subscribers-only) L: ltp@lists.linux.it (subscribers-only)
W: http://linux-test-project.github.io/ W: http://linux-test-project.github.io/
T: git git://github.com/linux-test-project/ltp.git T: git git://github.com/linux-test-project/ltp.git
S: Maintained S: Maintained

View File

@ -297,7 +297,9 @@ static inline void __iomem * ioremap_nocache(unsigned long offset,
unsigned long size) unsigned long size)
{ {
return ioremap(offset, size); return ioremap(offset, size);
} }
#define ioremap_uc ioremap_nocache
static inline void iounmap(volatile void __iomem *addr) static inline void iounmap(volatile void __iomem *addr)
{ {

View File

@ -30,6 +30,7 @@ __delay(int loops)
" bgt %0,1b" " bgt %0,1b"
: "=&r" (tmp), "=r" (loops) : "1"(loops)); : "=&r" (tmp), "=r" (loops) : "1"(loops));
} }
EXPORT_SYMBOL(__delay);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
#define LPJ cpu_data[smp_processor_id()].loops_per_jiffy #define LPJ cpu_data[smp_processor_id()].loops_per_jiffy

View File

@ -54,6 +54,14 @@ AS += -EL
LD += -EL LD += -EL
endif endif
#
# The Scalar Replacement of Aggregates (SRA) optimization pass in GCC 4.9 and
# later may result in code being generated that handles signed short and signed
# char struct members incorrectly. So disable it.
# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65932)
#
KBUILD_CFLAGS += $(call cc-option,-fno-ipa-sra)
# This selects which instruction set is used. # This selects which instruction set is used.
# Note that GCC does not numerically define an architecture version # Note that GCC does not numerically define an architecture version
# macro, but instead defines a whole series of macros which makes # macro, but instead defines a whole series of macros which makes

View File

@ -491,11 +491,6 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
#endif #endif
.endm .endm
.macro uaccess_save_and_disable, tmp
uaccess_save \tmp
uaccess_disable \tmp
.endm
.irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo .irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo
.macro ret\c, reg .macro ret\c, reg
#if __LINUX_ARM_ARCH__ < 6 #if __LINUX_ARM_ARCH__ < 6

View File

@ -40,6 +40,7 @@ do { \
"2:\t.asciz " #__file "\n" \ "2:\t.asciz " #__file "\n" \
".popsection\n" \ ".popsection\n" \
".pushsection __bug_table,\"a\"\n" \ ".pushsection __bug_table,\"a\"\n" \
".align 2\n" \
"3:\t.word 1b, 2b\n" \ "3:\t.word 1b, 2b\n" \
"\t.hword " #__line ", 0\n" \ "\t.hword " #__line ", 0\n" \
".popsection"); \ ".popsection"); \

View File

@ -12,6 +12,7 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/barrier.h> #include <asm/barrier.h>
#include <asm/thread_info.h>
#endif #endif
/* /*
@ -89,7 +90,8 @@ static inline unsigned int get_domain(void)
asm( asm(
"mrc p15, 0, %0, c3, c0 @ get domain" "mrc p15, 0, %0, c3, c0 @ get domain"
: "=r" (domain)); : "=r" (domain)
: "m" (current_thread_info()->cpu_domain));
return domain; return domain;
} }
@ -98,7 +100,7 @@ static inline void set_domain(unsigned val)
{ {
asm volatile( asm volatile(
"mcr p15, 0, %0, c3, c0 @ set domain" "mcr p15, 0, %0, c3, c0 @ set domain"
: : "r" (val)); : : "r" (val) : "memory");
isb(); isb();
} }

View File

@ -25,7 +25,6 @@
struct task_struct; struct task_struct;
#include <asm/types.h> #include <asm/types.h>
#include <asm/domain.h>
typedef unsigned long mm_segment_t; typedef unsigned long mm_segment_t;

View File

@ -226,6 +226,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save));
#ifdef CONFIG_CPU_USE_DOMAINS
/* /*
* Copy the initial value of the domain access control register * Copy the initial value of the domain access control register
* from the current thread: thread->addr_limit will have been * from the current thread: thread->addr_limit will have been
@ -233,6 +234,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
* kernel/fork.c * kernel/fork.c
*/ */
thread->cpu_domain = get_domain(); thread->cpu_domain = get_domain();
#endif
if (likely(!(p->flags & PF_KTHREAD))) { if (likely(!(p->flags & PF_KTHREAD))) {
*childregs = *current_pt_regs(); *childregs = *current_pt_regs();

View File

@ -95,9 +95,10 @@ emulate:
reteq r4 @ no, return failure reteq r4 @ no, return failure
next: next:
uaccess_enable r3
.Lx1: ldrt r6, [r5], #4 @ get the next instruction and .Lx1: ldrt r6, [r5], #4 @ get the next instruction and
@ increment PC @ increment PC
uaccess_disable r3
and r2, r6, #0x0F000000 @ test for FP insns and r2, r6, #0x0F000000 @ test for FP insns
teq r2, #0x0C000000 teq r2, #0x0C000000
teqne r2, #0x0D000000 teqne r2, #0x0D000000

View File

@ -98,8 +98,23 @@ ENTRY(privcmd_call)
mov r1, r2 mov r1, r2
mov r2, r3 mov r2, r3
ldr r3, [sp, #8] ldr r3, [sp, #8]
/*
* Privcmd calls are issued by the userspace. We need to allow the
* kernel to access the userspace memory before issuing the hypercall.
*/
uaccess_enable r4
/* r4 is loaded now as we use it as scratch register before */
ldr r4, [sp, #4] ldr r4, [sp, #4]
__HVC(XEN_IMM) __HVC(XEN_IMM)
/*
* Disable userspace access from kernel. This is fine to do it
* unconditionally as no set_fs(KERNEL_DS)/set_fs(get_ds()) is
* called before.
*/
uaccess_disable r4
ldm sp!, {r4} ldm sp!, {r4}
ret lr ret lr
ENDPROC(privcmd_call); ENDPROC(privcmd_call);

View File

@ -32,6 +32,7 @@ config ARM64
select GENERIC_CLOCKEVENTS_BROADCAST select GENERIC_CLOCKEVENTS_BROADCAST
select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_AUTOPROBE
select GENERIC_EARLY_IOREMAP select GENERIC_EARLY_IOREMAP
select GENERIC_IDLE_POLL_SETUP
select GENERIC_IRQ_PROBE select GENERIC_IRQ_PROBE
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_IRQ_SHOW_LEVEL select GENERIC_IRQ_SHOW_LEVEL
@ -331,6 +332,22 @@ config ARM64_ERRATUM_845719
If unsure, say Y. If unsure, say Y.
config ARM64_ERRATUM_843419
bool "Cortex-A53: 843419: A load or store might access an incorrect address"
depends on MODULES
default y
help
This option builds kernel modules using the large memory model in
order to avoid the use of the ADRP instruction, which can cause
a subsequent memory access to use an incorrect address on Cortex-A53
parts up to r0p4.
Note that the kernel itself must be linked with a version of ld
which fixes potentially affected ADRP instructions through the
use of veneers.
If unsure, say Y.
endmenu endmenu

View File

@ -41,6 +41,10 @@ endif
CHECKFLAGS += -D__aarch64__ CHECKFLAGS += -D__aarch64__
ifeq ($(CONFIG_ARM64_ERRATUM_843419), y)
CFLAGS_MODULE += -mcmodel=large
endif
# Default value # Default value
head-y := arch/arm64/kernel/head.o head-y := arch/arm64/kernel/head.o

View File

@ -26,13 +26,9 @@
* Software defined PTE bits definition. * Software defined PTE bits definition.
*/ */
#define PTE_VALID (_AT(pteval_t, 1) << 0) #define PTE_VALID (_AT(pteval_t, 1) << 0)
#define PTE_WRITE (PTE_DBM) /* same as DBM (51) */
#define PTE_DIRTY (_AT(pteval_t, 1) << 55) #define PTE_DIRTY (_AT(pteval_t, 1) << 55)
#define PTE_SPECIAL (_AT(pteval_t, 1) << 56) #define PTE_SPECIAL (_AT(pteval_t, 1) << 56)
#ifdef CONFIG_ARM64_HW_AFDBM
#define PTE_WRITE (PTE_DBM) /* same as DBM */
#else
#define PTE_WRITE (_AT(pteval_t, 1) << 57)
#endif
#define PTE_PROT_NONE (_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */ #define PTE_PROT_NONE (_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */
/* /*
@ -146,7 +142,7 @@ extern struct page *empty_zero_page;
#define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN))
#ifdef CONFIG_ARM64_HW_AFDBM #ifdef CONFIG_ARM64_HW_AFDBM
#define pte_hw_dirty(pte) (!(pte_val(pte) & PTE_RDONLY)) #define pte_hw_dirty(pte) (pte_write(pte) && !(pte_val(pte) & PTE_RDONLY))
#else #else
#define pte_hw_dirty(pte) (0) #define pte_hw_dirty(pte) (0)
#endif #endif
@ -238,7 +234,7 @@ extern void __sync_icache_dcache(pte_t pteval, unsigned long addr);
* When hardware DBM is not present, the sofware PTE_DIRTY bit is updated via * When hardware DBM is not present, the sofware PTE_DIRTY bit is updated via
* the page fault mechanism. Checking the dirty status of a pte becomes: * the page fault mechanism. Checking the dirty status of a pte becomes:
* *
* PTE_DIRTY || !PTE_RDONLY * PTE_DIRTY || (PTE_WRITE && !PTE_RDONLY)
*/ */
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pte) pte_t *ptep, pte_t pte)
@ -503,7 +499,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
PTE_PROT_NONE | PTE_WRITE | PTE_TYPE_MASK; PTE_PROT_NONE | PTE_WRITE | PTE_TYPE_MASK;
/* preserve the hardware dirty information */ /* preserve the hardware dirty information */
if (pte_hw_dirty(pte)) if (pte_hw_dirty(pte))
newprot |= PTE_DIRTY; pte = pte_mkdirty(pte);
pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
return pte; return pte;
} }

View File

@ -134,7 +134,7 @@ static int os_lock_notify(struct notifier_block *self,
unsigned long action, void *data) unsigned long action, void *data)
{ {
int cpu = (unsigned long)data; int cpu = (unsigned long)data;
if (action == CPU_ONLINE) if ((action & ~CPU_TASKS_FROZEN) == CPU_ONLINE)
smp_call_function_single(cpu, clear_os_lock, NULL, 1); smp_call_function_single(cpu, clear_os_lock, NULL, 1);
return NOTIFY_OK; return NOTIFY_OK;
} }

View File

@ -523,6 +523,11 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems
msr hstr_el2, xzr // Disable CP15 traps to EL2 msr hstr_el2, xzr // Disable CP15 traps to EL2
#endif #endif
/* EL2 debug */
mrs x0, pmcr_el0 // Disable debug access traps
ubfx x0, x0, #11, #5 // to EL2 and allow access to
msr mdcr_el2, x0 // all PMU counters from EL1
/* Stage-2 translation */ /* Stage-2 translation */
msr vttbr_el2, xzr msr vttbr_el2, xzr

View File

@ -872,7 +872,7 @@ static int hw_breakpoint_reset_notify(struct notifier_block *self,
void *hcpu) void *hcpu)
{ {
int cpu = (long)hcpu; int cpu = (long)hcpu;
if (action == CPU_ONLINE) if ((action & ~CPU_TASKS_FROZEN) == CPU_ONLINE)
smp_call_function_single(cpu, hw_breakpoint_reset, NULL, 1); smp_call_function_single(cpu, hw_breakpoint_reset, NULL, 1);
return NOTIFY_OK; return NOTIFY_OK;
} }

View File

@ -332,12 +332,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 0, 21, ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 0, 21,
AARCH64_INSN_IMM_ADR); AARCH64_INSN_IMM_ADR);
break; break;
#ifndef CONFIG_ARM64_ERRATUM_843419
case R_AARCH64_ADR_PREL_PG_HI21_NC: case R_AARCH64_ADR_PREL_PG_HI21_NC:
overflow_check = false; overflow_check = false;
case R_AARCH64_ADR_PREL_PG_HI21: case R_AARCH64_ADR_PREL_PG_HI21:
ovf = reloc_insn_imm(RELOC_OP_PAGE, loc, val, 12, 21, ovf = reloc_insn_imm(RELOC_OP_PAGE, loc, val, 12, 21,
AARCH64_INSN_IMM_ADR); AARCH64_INSN_IMM_ADR);
break; break;
#endif
case R_AARCH64_ADD_ABS_LO12_NC: case R_AARCH64_ADD_ABS_LO12_NC:
case R_AARCH64_LDST8_ABS_LO12_NC: case R_AARCH64_LDST8_ABS_LO12_NC:
overflow_check = false; overflow_check = false;

View File

@ -212,14 +212,32 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
/* /*
* VFP save/restore code. * VFP save/restore code.
*
* We have to be careful with endianness, since the fpsimd context-switch
* code operates on 128-bit (Q) register values whereas the compat ABI
* uses an array of 64-bit (D) registers. Consequently, we need to swap
* the two halves of each Q register when running on a big-endian CPU.
*/ */
union __fpsimd_vreg {
__uint128_t raw;
struct {
#ifdef __AARCH64EB__
u64 hi;
u64 lo;
#else
u64 lo;
u64 hi;
#endif
};
};
static int compat_preserve_vfp_context(struct compat_vfp_sigframe __user *frame) static int compat_preserve_vfp_context(struct compat_vfp_sigframe __user *frame)
{ {
struct fpsimd_state *fpsimd = &current->thread.fpsimd_state; struct fpsimd_state *fpsimd = &current->thread.fpsimd_state;
compat_ulong_t magic = VFP_MAGIC; compat_ulong_t magic = VFP_MAGIC;
compat_ulong_t size = VFP_STORAGE_SIZE; compat_ulong_t size = VFP_STORAGE_SIZE;
compat_ulong_t fpscr, fpexc; compat_ulong_t fpscr, fpexc;
int err = 0; int i, err = 0;
/* /*
* Save the hardware registers to the fpsimd_state structure. * Save the hardware registers to the fpsimd_state structure.
@ -235,10 +253,15 @@ static int compat_preserve_vfp_context(struct compat_vfp_sigframe __user *frame)
/* /*
* Now copy the FP registers. Since the registers are packed, * Now copy the FP registers. Since the registers are packed,
* we can copy the prefix we want (V0-V15) as it is. * we can copy the prefix we want (V0-V15) as it is.
* FIXME: Won't work if big endian.
*/ */
err |= __copy_to_user(&frame->ufp.fpregs, fpsimd->vregs, for (i = 0; i < ARRAY_SIZE(frame->ufp.fpregs); i += 2) {
sizeof(frame->ufp.fpregs)); union __fpsimd_vreg vreg = {
.raw = fpsimd->vregs[i >> 1],
};
__put_user_error(vreg.lo, &frame->ufp.fpregs[i], err);
__put_user_error(vreg.hi, &frame->ufp.fpregs[i + 1], err);
}
/* Create an AArch32 fpscr from the fpsr and the fpcr. */ /* Create an AArch32 fpscr from the fpsr and the fpcr. */
fpscr = (fpsimd->fpsr & VFP_FPSCR_STAT_MASK) | fpscr = (fpsimd->fpsr & VFP_FPSCR_STAT_MASK) |
@ -263,7 +286,7 @@ static int compat_restore_vfp_context(struct compat_vfp_sigframe __user *frame)
compat_ulong_t magic = VFP_MAGIC; compat_ulong_t magic = VFP_MAGIC;
compat_ulong_t size = VFP_STORAGE_SIZE; compat_ulong_t size = VFP_STORAGE_SIZE;
compat_ulong_t fpscr; compat_ulong_t fpscr;
int err = 0; int i, err = 0;
__get_user_error(magic, &frame->magic, err); __get_user_error(magic, &frame->magic, err);
__get_user_error(size, &frame->size, err); __get_user_error(size, &frame->size, err);
@ -273,12 +296,14 @@ static int compat_restore_vfp_context(struct compat_vfp_sigframe __user *frame)
if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE) if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)
return -EINVAL; return -EINVAL;
/* /* Copy the FP registers into the start of the fpsimd_state. */
* Copy the FP registers into the start of the fpsimd_state. for (i = 0; i < ARRAY_SIZE(frame->ufp.fpregs); i += 2) {
* FIXME: Won't work if big endian. union __fpsimd_vreg vreg;
*/
err |= __copy_from_user(fpsimd.vregs, frame->ufp.fpregs, __get_user_error(vreg.lo, &frame->ufp.fpregs[i], err);
sizeof(frame->ufp.fpregs)); __get_user_error(vreg.hi, &frame->ufp.fpregs[i + 1], err);
fpsimd.vregs[i >> 1] = vreg.raw;
}
/* Extract the fpsr and the fpcr from the fpscr */ /* Extract the fpsr and the fpcr from the fpscr */
__get_user_error(fpscr, &frame->ufp.fpscr, err); __get_user_error(fpscr, &frame->ufp.fpscr, err);

View File

@ -100,7 +100,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
if (IS_ENABLED(CONFIG_ZONE_DMA) && if (IS_ENABLED(CONFIG_ZONE_DMA) &&
dev->coherent_dma_mask <= DMA_BIT_MASK(32)) dev->coherent_dma_mask <= DMA_BIT_MASK(32))
flags |= GFP_DMA; flags |= GFP_DMA;
if (IS_ENABLED(CONFIG_DMA_CMA) && (flags & __GFP_WAIT)) { if (dev_get_cma_area(dev) && (flags & __GFP_WAIT)) {
struct page *page; struct page *page;
void *addr; void *addr;

View File

@ -11,7 +11,7 @@
#define NR_syscalls 319 /* length of syscall table */ #define NR_syscalls 321 /* length of syscall table */
/* /*
* The following defines stop scripts/checksyscalls.sh from complaining about * The following defines stop scripts/checksyscalls.sh from complaining about

View File

@ -332,5 +332,7 @@
#define __NR_memfd_create 1340 #define __NR_memfd_create 1340
#define __NR_bpf 1341 #define __NR_bpf 1341
#define __NR_execveat 1342 #define __NR_execveat 1342
#define __NR_userfaultfd 1343
#define __NR_membarrier 1344
#endif /* _UAPI_ASM_IA64_UNISTD_H */ #endif /* _UAPI_ASM_IA64_UNISTD_H */

View File

@ -1768,5 +1768,7 @@ sys_call_table:
data8 sys_memfd_create // 1340 data8 sys_memfd_create // 1340
data8 sys_bpf data8 sys_bpf
data8 sys_execveat data8 sys_execveat
data8 sys_userfaultfd
data8 sys_membarrier
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls

View File

@ -1006,7 +1006,7 @@ config X86_THERMAL_VECTOR
depends on X86_MCE_INTEL depends on X86_MCE_INTEL
config X86_LEGACY_VM86 config X86_LEGACY_VM86
bool "Legacy VM86 support (obsolete)" bool "Legacy VM86 support"
default n default n
depends on X86_32 depends on X86_32
---help--- ---help---
@ -1018,19 +1018,20 @@ config X86_LEGACY_VM86
available to accelerate real mode DOS programs. However, any available to accelerate real mode DOS programs. However, any
recent version of DOSEMU, X, or vbetool should be fully recent version of DOSEMU, X, or vbetool should be fully
functional even without kernel VM86 support, as they will all functional even without kernel VM86 support, as they will all
fall back to (pretty well performing) software emulation. fall back to software emulation. Nevertheless, if you are using
a 16-bit DOS program where 16-bit performance matters, vm86
mode might be faster than emulation and you might want to
enable this option.
Anything that works on a 64-bit kernel is unlikely to need Note that any app that works on a 64-bit kernel is unlikely to
this option, as 64-bit kernels don't, and can't, support V8086 need this option, as 64-bit kernels don't, and can't, support
mode. This option is also unrelated to 16-bit protected mode V8086 mode. This option is also unrelated to 16-bit protected
and is not needed to run most 16-bit programs under Wine. mode and is not needed to run most 16-bit programs under Wine.
Enabling this option adds considerable attack surface to the Enabling this option increases the complexity of the kernel
kernel and slows down system calls and exception handling. and slows down exception handling a tiny bit.
Unless you use very old userspace or need the last drop of If unsure, say N here.
performance in your real mode DOS games and can't use KVM,
say N here.
config VM86 config VM86
bool bool

View File

@ -241,6 +241,7 @@
#define X86_FEATURE_AVX512PF ( 9*32+26) /* AVX-512 Prefetch */ #define X86_FEATURE_AVX512PF ( 9*32+26) /* AVX-512 Prefetch */
#define X86_FEATURE_AVX512ER ( 9*32+27) /* AVX-512 Exponential and Reciprocal */ #define X86_FEATURE_AVX512ER ( 9*32+27) /* AVX-512 Exponential and Reciprocal */
#define X86_FEATURE_AVX512CD ( 9*32+28) /* AVX-512 Conflict Detection */ #define X86_FEATURE_AVX512CD ( 9*32+28) /* AVX-512 Conflict Detection */
#define X86_FEATURE_SHA_NI ( 9*32+29) /* SHA1/SHA256 Instruction Extensions */
/* Extended state features, CPUID level 0x0000000d:1 (eax), word 10 */ /* Extended state features, CPUID level 0x0000000d:1 (eax), word 10 */
#define X86_FEATURE_XSAVEOPT (10*32+ 0) /* XSAVEOPT */ #define X86_FEATURE_XSAVEOPT (10*32+ 0) /* XSAVEOPT */

View File

@ -141,6 +141,8 @@
#define DEBUGCTLMSR_BTS_OFF_USR (1UL << 10) #define DEBUGCTLMSR_BTS_OFF_USR (1UL << 10)
#define DEBUGCTLMSR_FREEZE_LBRS_ON_PMI (1UL << 11) #define DEBUGCTLMSR_FREEZE_LBRS_ON_PMI (1UL << 11)
#define MSR_PEBS_FRONTEND 0x000003f7
#define MSR_IA32_POWER_CTL 0x000001fc #define MSR_IA32_POWER_CTL 0x000001fc
#define MSR_IA32_MC0_CTL 0x00000400 #define MSR_IA32_MC0_CTL 0x00000400

View File

@ -97,7 +97,6 @@ struct pv_lazy_ops {
struct pv_time_ops { struct pv_time_ops {
unsigned long long (*sched_clock)(void); unsigned long long (*sched_clock)(void);
unsigned long long (*steal_clock)(int cpu); unsigned long long (*steal_clock)(int cpu);
unsigned long (*get_tsc_khz)(void);
}; };
struct pv_cpu_ops { struct pv_cpu_ops {

View File

@ -39,18 +39,27 @@ static inline void queued_spin_unlock(struct qspinlock *lock)
} }
#endif #endif
#define virt_queued_spin_lock virt_queued_spin_lock #ifdef CONFIG_PARAVIRT
#define virt_spin_lock virt_spin_lock
static inline bool virt_queued_spin_lock(struct qspinlock *lock) static inline bool virt_spin_lock(struct qspinlock *lock)
{ {
if (!static_cpu_has(X86_FEATURE_HYPERVISOR)) if (!static_cpu_has(X86_FEATURE_HYPERVISOR))
return false; return false;
while (atomic_cmpxchg(&lock->val, 0, _Q_LOCKED_VAL) != 0) /*
cpu_relax(); * On hypervisors without PARAVIRT_SPINLOCKS support we fall
* back to a Test-and-Set spinlock, because fair locks have
* horrible lock 'holder' preemption issues.
*/
do {
while (atomic_read(&lock->val) != 0)
cpu_relax();
} while (atomic_cmpxchg(&lock->val, 0, _Q_LOCKED_VAL) != 0);
return true; return true;
} }
#endif /* CONFIG_PARAVIRT */
#include <asm-generic/qspinlock.h> #include <asm-generic/qspinlock.h>

View File

@ -338,10 +338,15 @@ done:
static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr) static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr)
{ {
unsigned long flags;
if (instr[0] != 0x90) if (instr[0] != 0x90)
return; return;
local_irq_save(flags);
add_nops(instr + (a->instrlen - a->padlen), a->padlen); add_nops(instr + (a->instrlen - a->padlen), a->padlen);
sync_core();
local_irq_restore(flags);
DUMP_BYTES(instr, a->instrlen, "%p: [%d:%d) optimized NOPs: ", DUMP_BYTES(instr, a->instrlen, "%p: [%d:%d) optimized NOPs: ",
instr, a->instrlen - a->padlen, a->padlen); instr, a->instrlen - a->padlen, a->padlen);

View File

@ -336,6 +336,13 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
apic_write(APIC_LVTT, lvtt_value); apic_write(APIC_LVTT, lvtt_value);
if (lvtt_value & APIC_LVT_TIMER_TSCDEADLINE) { if (lvtt_value & APIC_LVT_TIMER_TSCDEADLINE) {
/*
* See Intel SDM: TSC-Deadline Mode chapter. In xAPIC mode,
* writing to the APIC LVTT and TSC_DEADLINE MSR isn't serialized.
* According to Intel, MFENCE can do the serialization here.
*/
asm volatile("mfence" : : : "memory");
printk_once(KERN_DEBUG "TSC deadline timer enabled\n"); printk_once(KERN_DEBUG "TSC deadline timer enabled\n");
return; return;
} }

View File

@ -2522,6 +2522,7 @@ void __init setup_ioapic_dest(void)
int pin, ioapic, irq, irq_entry; int pin, ioapic, irq, irq_entry;
const struct cpumask *mask; const struct cpumask *mask;
struct irq_data *idata; struct irq_data *idata;
struct irq_chip *chip;
if (skip_ioapic_setup == 1) if (skip_ioapic_setup == 1)
return; return;
@ -2545,9 +2546,9 @@ void __init setup_ioapic_dest(void)
else else
mask = apic->target_cpus(); mask = apic->target_cpus();
irq_set_affinity(irq, mask); chip = irq_data_get_irq_chip(idata);
chip->irq_set_affinity(idata, mask, false);
} }
} }
#endif #endif

View File

@ -1110,10 +1110,10 @@ void print_cpu_info(struct cpuinfo_x86 *c)
else else
printk(KERN_CONT "%d86", c->x86); printk(KERN_CONT "%d86", c->x86);
printk(KERN_CONT " (fam: %02x, model: %02x", c->x86, c->x86_model); printk(KERN_CONT " (family: 0x%x, model: 0x%x", c->x86, c->x86_model);
if (c->x86_mask || c->cpuid_level >= 0) if (c->x86_mask || c->cpuid_level >= 0)
printk(KERN_CONT ", stepping: %02x)\n", c->x86_mask); printk(KERN_CONT ", stepping: 0x%x)\n", c->x86_mask);
else else
printk(KERN_CONT ")\n"); printk(KERN_CONT ")\n");

View File

@ -47,6 +47,7 @@ enum extra_reg_type {
EXTRA_REG_RSP_1 = 1, /* offcore_response_1 */ EXTRA_REG_RSP_1 = 1, /* offcore_response_1 */
EXTRA_REG_LBR = 2, /* lbr_select */ EXTRA_REG_LBR = 2, /* lbr_select */
EXTRA_REG_LDLAT = 3, /* ld_lat_threshold */ EXTRA_REG_LDLAT = 3, /* ld_lat_threshold */
EXTRA_REG_FE = 4, /* fe_* */
EXTRA_REG_MAX /* number of entries needed */ EXTRA_REG_MAX /* number of entries needed */
}; };

View File

@ -205,6 +205,11 @@ static struct extra_reg intel_skl_extra_regs[] __read_mostly = {
INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0), INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0),
INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1), INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1),
INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd),
/*
* Note the low 8 bits eventsel code is not a continuous field, containing
* some #GPing bits. These are masked out.
*/
INTEL_UEVENT_EXTRA_REG(0x01c6, MSR_PEBS_FRONTEND, 0x7fff17, FE),
EVENT_EXTRA_END EVENT_EXTRA_END
}; };
@ -250,7 +255,7 @@ struct event_constraint intel_bdw_event_constraints[] = {
FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */ FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
INTEL_UEVENT_CONSTRAINT(0x148, 0x4), /* L1D_PEND_MISS.PENDING */ INTEL_UEVENT_CONSTRAINT(0x148, 0x4), /* L1D_PEND_MISS.PENDING */
INTEL_EVENT_CONSTRAINT(0xa3, 0x4), /* CYCLE_ACTIVITY.* */ INTEL_UEVENT_CONSTRAINT(0x8a3, 0x4), /* CYCLE_ACTIVITY.CYCLES_L1D_MISS */
EVENT_CONSTRAINT_END EVENT_CONSTRAINT_END
}; };
@ -2891,6 +2896,8 @@ PMU_FORMAT_ATTR(offcore_rsp, "config1:0-63");
PMU_FORMAT_ATTR(ldlat, "config1:0-15"); PMU_FORMAT_ATTR(ldlat, "config1:0-15");
PMU_FORMAT_ATTR(frontend, "config1:0-23");
static struct attribute *intel_arch3_formats_attr[] = { static struct attribute *intel_arch3_formats_attr[] = {
&format_attr_event.attr, &format_attr_event.attr,
&format_attr_umask.attr, &format_attr_umask.attr,
@ -2907,6 +2914,11 @@ static struct attribute *intel_arch3_formats_attr[] = {
NULL, NULL,
}; };
static struct attribute *skl_format_attr[] = {
&format_attr_frontend.attr,
NULL,
};
static __initconst const struct x86_pmu core_pmu = { static __initconst const struct x86_pmu core_pmu = {
.name = "core", .name = "core",
.handle_irq = x86_pmu_handle_irq, .handle_irq = x86_pmu_handle_irq,
@ -3516,7 +3528,8 @@ __init int intel_pmu_init(void)
x86_pmu.hw_config = hsw_hw_config; x86_pmu.hw_config = hsw_hw_config;
x86_pmu.get_event_constraints = hsw_get_event_constraints; x86_pmu.get_event_constraints = hsw_get_event_constraints;
x86_pmu.cpu_events = hsw_events_attrs; x86_pmu.format_attrs = merge_attr(intel_arch3_formats_attr,
skl_format_attr);
WARN_ON(!x86_pmu.format_attrs); WARN_ON(!x86_pmu.format_attrs);
x86_pmu.cpu_events = hsw_events_attrs; x86_pmu.cpu_events = hsw_events_attrs;
pr_cont("Skylake events, "); pr_cont("Skylake events, ");

View File

@ -58,7 +58,7 @@ static struct ldt_struct *alloc_ldt_struct(int size)
if (alloc_size > PAGE_SIZE) if (alloc_size > PAGE_SIZE)
new_ldt->entries = vzalloc(alloc_size); new_ldt->entries = vzalloc(alloc_size);
else else
new_ldt->entries = kzalloc(PAGE_SIZE, GFP_KERNEL); new_ldt->entries = (void *)get_zeroed_page(GFP_KERNEL);
if (!new_ldt->entries) { if (!new_ldt->entries) {
kfree(new_ldt); kfree(new_ldt);
@ -95,7 +95,7 @@ static void free_ldt_struct(struct ldt_struct *ldt)
if (ldt->size * LDT_ENTRY_SIZE > PAGE_SIZE) if (ldt->size * LDT_ENTRY_SIZE > PAGE_SIZE)
vfree(ldt->entries); vfree(ldt->entries);
else else
kfree(ldt->entries); free_page((unsigned long)ldt->entries);
kfree(ldt); kfree(ldt);
} }

View File

@ -21,6 +21,7 @@
#include <asm/hypervisor.h> #include <asm/hypervisor.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/x86_init.h> #include <asm/x86_init.h>
#include <asm/geode.h>
unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */ unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */
EXPORT_SYMBOL(cpu_khz); EXPORT_SYMBOL(cpu_khz);
@ -1011,15 +1012,17 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable);
static void __init check_system_tsc_reliable(void) static void __init check_system_tsc_reliable(void)
{ {
#ifdef CONFIG_MGEODE_LX #if defined(CONFIG_MGEODEGX1) || defined(CONFIG_MGEODE_LX) || defined(CONFIG_X86_GENERIC)
/* RTSC counts during suspend */ if (is_geode_lx()) {
/* RTSC counts during suspend */
#define RTSC_SUSP 0x100 #define RTSC_SUSP 0x100
unsigned long res_low, res_high; unsigned long res_low, res_high;
rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high); rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
/* Geode_LX - the OLPC CPU has a very reliable TSC */ /* Geode_LX - the OLPC CPU has a very reliable TSC */
if (res_low & RTSC_SUSP) if (res_low & RTSC_SUSP)
tsc_clocksource_reliable = 1; tsc_clocksource_reliable = 1;
}
#endif #endif
if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
tsc_clocksource_reliable = 1; tsc_clocksource_reliable = 1;

View File

@ -45,6 +45,7 @@
#include <linux/audit.h> #include <linux/audit.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/security.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
@ -232,6 +233,32 @@ static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus)
struct pt_regs *regs = current_pt_regs(); struct pt_regs *regs = current_pt_regs();
unsigned long err = 0; unsigned long err = 0;
err = security_mmap_addr(0);
if (err) {
/*
* vm86 cannot virtualize the address space, so vm86 users
* need to manage the low 1MB themselves using mmap. Given
* that BIOS places important data in the first page, vm86
* is essentially useless if mmap_min_addr != 0. DOSEMU,
* for example, won't even bother trying to use vm86 if it
* can't map a page at virtual address 0.
*
* To reduce the available kernel attack surface, simply
* disallow vm86(old) for users who cannot mmap at va 0.
*
* The implementation of security_mmap_addr will allow
* suitably privileged users to map va 0 even if
* vm.mmap_min_addr is set above 0, and we want this
* behavior for vm86 as well, as it ensures that legacy
* tools like vbetool will not fail just because of
* vm.mmap_min_addr.
*/
pr_info_once("Denied a call to vm86(old) from %s[%d] (uid: %d). Set the vm.mmap_min_addr sysctl to 0 and/or adjust LSM mmap_min_addr policy to enable vm86 if you are using a vm86-based DOS emulator.\n",
current->comm, task_pid_nr(current),
from_kuid_munged(&init_user_ns, current_uid()));
return -EPERM;
}
if (!vm86) { if (!vm86) {
if (!(vm86 = kzalloc(sizeof(*vm86), GFP_KERNEL))) if (!(vm86 = kzalloc(sizeof(*vm86), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;

View File

@ -192,10 +192,11 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
node_set(node, numa_nodes_parsed); node_set(node, numa_nodes_parsed);
pr_info("SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]%s\n", pr_info("SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]%s%s\n",
node, pxm, node, pxm,
(unsigned long long) start, (unsigned long long) end - 1, (unsigned long long) start, (unsigned long long) end - 1,
hotpluggable ? " hotplug" : ""); hotpluggable ? " hotplug" : "",
ma->flags & ACPI_SRAT_MEM_NON_VOLATILE ? " non-volatile" : "");
/* Mark hotplug range in memblock. */ /* Mark hotplug range in memblock. */
if (hotpluggable && memblock_mark_hotplug(start, ma->length)) if (hotpluggable && memblock_mark_hotplug(start, ma->length))

View File

@ -940,6 +940,7 @@ static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
char *xbuf[XBUFSIZE]; char *xbuf[XBUFSIZE];
char *xoutbuf[XBUFSIZE]; char *xoutbuf[XBUFSIZE];
int ret = -ENOMEM; int ret = -ENOMEM;
unsigned int ivsize = crypto_skcipher_ivsize(tfm);
if (testmgr_alloc_buf(xbuf)) if (testmgr_alloc_buf(xbuf))
goto out_nobuf; goto out_nobuf;
@ -975,7 +976,7 @@ static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
continue; continue;
if (template[i].iv) if (template[i].iv)
memcpy(iv, template[i].iv, MAX_IVLEN); memcpy(iv, template[i].iv, ivsize);
else else
memset(iv, 0, MAX_IVLEN); memset(iv, 0, MAX_IVLEN);
@ -1051,7 +1052,7 @@ static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
continue; continue;
if (template[i].iv) if (template[i].iv)
memcpy(iv, template[i].iv, MAX_IVLEN); memcpy(iv, template[i].iv, ivsize);
else else
memset(iv, 0, MAX_IVLEN); memset(iv, 0, MAX_IVLEN);

View File

@ -330,12 +330,14 @@ void zcomp_destroy(struct zcomp *comp)
* allocate new zcomp and initialize it. return compressing * allocate new zcomp and initialize it. return compressing
* backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL) * backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL)
* if requested algorithm is not supported, ERR_PTR(-ENOMEM) in * if requested algorithm is not supported, ERR_PTR(-ENOMEM) in
* case of allocation error. * case of allocation error, or any other error potentially
* returned by functions zcomp_strm_{multi,single}_create.
*/ */
struct zcomp *zcomp_create(const char *compress, int max_strm) struct zcomp *zcomp_create(const char *compress, int max_strm)
{ {
struct zcomp *comp; struct zcomp *comp;
struct zcomp_backend *backend; struct zcomp_backend *backend;
int error;
backend = find_backend(compress); backend = find_backend(compress);
if (!backend) if (!backend)
@ -347,12 +349,12 @@ struct zcomp *zcomp_create(const char *compress, int max_strm)
comp->backend = backend; comp->backend = backend;
if (max_strm > 1) if (max_strm > 1)
zcomp_strm_multi_create(comp, max_strm); error = zcomp_strm_multi_create(comp, max_strm);
else else
zcomp_strm_single_create(comp); error = zcomp_strm_single_create(comp);
if (!comp->stream) { if (error) {
kfree(comp); kfree(comp);
return ERR_PTR(-ENOMEM); return ERR_PTR(error);
} }
return comp; return comp;
} }

View File

@ -8,6 +8,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/slab.h>
static DEFINE_SPINLOCK(clklock); static DEFINE_SPINLOCK(clklock);

View File

@ -1,6 +1,12 @@
config COMMON_CLK_HI6220 config COMMON_CLK_HI6220
bool "Hi6220 Clock Driver" bool "Hi6220 Clock Driver"
depends on (ARCH_HISI || COMPILE_TEST) && MAILBOX depends on ARCH_HISI || COMPILE_TEST
default ARCH_HISI default ARCH_HISI
help help
Build the Hisilicon Hi6220 clock driver based on the common clock framework. Build the Hisilicon Hi6220 clock driver based on the common clock framework.
config STUB_CLK_HI6220
bool "Hi6220 Stub Clock Driver"
depends on COMMON_CLK_HI6220 && MAILBOX
help
Build the Hisilicon Hi6220 stub clock driver.

View File

@ -7,4 +7,5 @@ obj-y += clk.o clkgate-separated.o clkdivider-hi6220.o
obj-$(CONFIG_ARCH_HI3xxx) += clk-hi3620.o obj-$(CONFIG_ARCH_HI3xxx) += clk-hi3620.o
obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o
obj-$(CONFIG_ARCH_HIX5HD2) += clk-hix5hd2.o obj-$(CONFIG_ARCH_HIX5HD2) += clk-hix5hd2.o
obj-$(CONFIG_COMMON_CLK_HI6220) += clk-hi6220.o clk-hi6220-stub.o obj-$(CONFIG_COMMON_CLK_HI6220) += clk-hi6220.o
obj-$(CONFIG_STUB_CLK_HI6220) += clk-hi6220-stub.o

View File

@ -716,6 +716,8 @@ static const char *const rk3188_critical_clocks[] __initconst = {
"aclk_cpu", "aclk_cpu",
"aclk_peri", "aclk_peri",
"hclk_peri", "hclk_peri",
"pclk_cpu",
"pclk_peri",
}; };
static void __init rk3188_common_clk_init(struct device_node *np) static void __init rk3188_common_clk_init(struct device_node *np)
@ -744,8 +746,6 @@ static void __init rk3188_common_clk_init(struct device_node *np)
rockchip_clk_register_branches(common_clk_branches, rockchip_clk_register_branches(common_clk_branches,
ARRAY_SIZE(common_clk_branches)); ARRAY_SIZE(common_clk_branches));
rockchip_clk_protect_critical(rk3188_critical_clocks,
ARRAY_SIZE(rk3188_critical_clocks));
rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0), rockchip_register_softrst(np, 9, reg_base + RK2928_SOFTRST_CON(0),
ROCKCHIP_SOFTRST_HIWORD_MASK); ROCKCHIP_SOFTRST_HIWORD_MASK);
@ -765,6 +765,8 @@ static void __init rk3066a_clk_init(struct device_node *np)
mux_armclk_p, ARRAY_SIZE(mux_armclk_p), mux_armclk_p, ARRAY_SIZE(mux_armclk_p),
&rk3066_cpuclk_data, rk3066_cpuclk_rates, &rk3066_cpuclk_data, rk3066_cpuclk_rates,
ARRAY_SIZE(rk3066_cpuclk_rates)); ARRAY_SIZE(rk3066_cpuclk_rates));
rockchip_clk_protect_critical(rk3188_critical_clocks,
ARRAY_SIZE(rk3188_critical_clocks));
} }
CLK_OF_DECLARE(rk3066a_cru, "rockchip,rk3066a-cru", rk3066a_clk_init); CLK_OF_DECLARE(rk3066a_cru, "rockchip,rk3066a-cru", rk3066a_clk_init);
@ -801,6 +803,9 @@ static void __init rk3188a_clk_init(struct device_node *np)
pr_warn("%s: missing clocks to reparent aclk_cpu_pre to gpll\n", pr_warn("%s: missing clocks to reparent aclk_cpu_pre to gpll\n",
__func__); __func__);
} }
rockchip_clk_protect_critical(rk3188_critical_clocks,
ARRAY_SIZE(rk3188_critical_clocks));
} }
CLK_OF_DECLARE(rk3188a_cru, "rockchip,rk3188a-cru", rk3188a_clk_init); CLK_OF_DECLARE(rk3188a_cru, "rockchip,rk3188a-cru", rk3188a_clk_init);

View File

@ -461,7 +461,7 @@ config CRYPTO_DEV_QCE
config CRYPTO_DEV_VMX config CRYPTO_DEV_VMX
bool "Support for VMX cryptographic acceleration instructions" bool "Support for VMX cryptographic acceleration instructions"
depends on PPC64 depends on PPC64 && VSX
help help
Support for VMX cryptographic acceleration instructions. Support for VMX cryptographic acceleration instructions.

View File

@ -104,7 +104,7 @@ static int sun4i_ss_opti_poll(struct ablkcipher_request *areq)
sg_miter_next(&mo); sg_miter_next(&mo);
oo = 0; oo = 0;
} }
} while (mo.length > 0); } while (oleft > 0);
if (areq->info) { if (areq->info) {
for (i = 0; i < 4 && i < ivsize / 4; i++) { for (i = 0; i < 4 && i < ivsize / 4; i++) {

View File

@ -356,7 +356,7 @@ config GPIO_PXA
config GPIO_RCAR config GPIO_RCAR
tristate "Renesas R-Car GPIO" tristate "Renesas R-Car GPIO"
depends on ARM && (ARCH_SHMOBILE || COMPILE_TEST) depends on ARCH_SHMOBILE || COMPILE_TEST
select GPIOLIB_IRQCHIP select GPIOLIB_IRQCHIP
help help
Say yes here to support GPIO on Renesas R-Car SoCs. Say yes here to support GPIO on Renesas R-Car SoCs.

View File

@ -339,13 +339,15 @@ static int gpio_set_wake_irq(struct irq_data *d, u32 enable)
return 0; return 0;
} }
static void mxc_gpio_init_gc(struct mxc_gpio_port *port, int irq_base) static int mxc_gpio_init_gc(struct mxc_gpio_port *port, int irq_base)
{ {
struct irq_chip_generic *gc; struct irq_chip_generic *gc;
struct irq_chip_type *ct; struct irq_chip_type *ct;
gc = irq_alloc_generic_chip("gpio-mxc", 1, irq_base, gc = irq_alloc_generic_chip("gpio-mxc", 1, irq_base,
port->base, handle_level_irq); port->base, handle_level_irq);
if (!gc)
return -ENOMEM;
gc->private = port; gc->private = port;
ct = gc->chip_types; ct = gc->chip_types;
@ -360,6 +362,8 @@ static void mxc_gpio_init_gc(struct mxc_gpio_port *port, int irq_base)
irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK, irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK,
IRQ_NOREQUEST, 0); IRQ_NOREQUEST, 0);
return 0;
} }
static void mxc_gpio_get_hw(struct platform_device *pdev) static void mxc_gpio_get_hw(struct platform_device *pdev)
@ -477,12 +481,16 @@ static int mxc_gpio_probe(struct platform_device *pdev)
} }
/* gpio-mxc can be a generic irq chip */ /* gpio-mxc can be a generic irq chip */
mxc_gpio_init_gc(port, irq_base); err = mxc_gpio_init_gc(port, irq_base);
if (err < 0)
goto out_irqdomain_remove;
list_add_tail(&port->node, &mxc_gpio_ports); list_add_tail(&port->node, &mxc_gpio_ports);
return 0; return 0;
out_irqdomain_remove:
irq_domain_remove(port->domain);
out_irqdesc_free: out_irqdesc_free:
irq_free_descs(irq_base, 32); irq_free_descs(irq_base, 32);
out_gpiochip_remove: out_gpiochip_remove:

View File

@ -196,13 +196,16 @@ static int mxs_gpio_set_wake_irq(struct irq_data *d, unsigned int enable)
return 0; return 0;
} }
static void __init mxs_gpio_init_gc(struct mxs_gpio_port *port, int irq_base) static int __init mxs_gpio_init_gc(struct mxs_gpio_port *port, int irq_base)
{ {
struct irq_chip_generic *gc; struct irq_chip_generic *gc;
struct irq_chip_type *ct; struct irq_chip_type *ct;
gc = irq_alloc_generic_chip("gpio-mxs", 1, irq_base, gc = irq_alloc_generic_chip("gpio-mxs", 1, irq_base,
port->base, handle_level_irq); port->base, handle_level_irq);
if (!gc)
return -ENOMEM;
gc->private = port; gc->private = port;
ct = gc->chip_types; ct = gc->chip_types;
@ -216,6 +219,8 @@ static void __init mxs_gpio_init_gc(struct mxs_gpio_port *port, int irq_base)
irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK, irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK,
IRQ_NOREQUEST, 0); IRQ_NOREQUEST, 0);
return 0;
} }
static int mxs_gpio_to_irq(struct gpio_chip *gc, unsigned offset) static int mxs_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
@ -317,7 +322,9 @@ static int mxs_gpio_probe(struct platform_device *pdev)
} }
/* gpio-mxs can be a generic irq chip */ /* gpio-mxs can be a generic irq chip */
mxs_gpio_init_gc(port, irq_base); err = mxs_gpio_init_gc(port, irq_base);
if (err < 0)
goto out_irqdomain_remove;
/* setup one handler for each entry */ /* setup one handler for each entry */
irq_set_chained_handler_and_data(port->irq, mxs_gpio_irq_handler, irq_set_chained_handler_and_data(port->irq, mxs_gpio_irq_handler,
@ -343,6 +350,8 @@ static int mxs_gpio_probe(struct platform_device *pdev)
out_bgpio_remove: out_bgpio_remove:
bgpio_remove(&port->bgc); bgpio_remove(&port->bgc);
out_irqdomain_remove:
irq_domain_remove(port->domain);
out_irqdesc_free: out_irqdesc_free:
irq_free_descs(irq_base, 32); irq_free_descs(irq_base, 32);
return err; return err;

View File

@ -1098,7 +1098,6 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
} else { } else {
bank->chip.label = "gpio"; bank->chip.label = "gpio";
bank->chip.base = gpio; bank->chip.base = gpio;
gpio += bank->width;
} }
bank->chip.ngpio = bank->width; bank->chip.ngpio = bank->width;
@ -1108,6 +1107,9 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
return ret; return ret;
} }
if (!bank->is_mpuio)
gpio += bank->width;
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
/* /*
* REVISIT: Once we have OMAP1 supporting SPARSE_IRQ, we can drop * REVISIT: Once we have OMAP1 supporting SPARSE_IRQ, we can drop
@ -1253,8 +1255,11 @@ static int omap_gpio_probe(struct platform_device *pdev)
omap_gpio_mod_init(bank); omap_gpio_mod_init(bank);
ret = omap_gpio_chip_init(bank, irqc); ret = omap_gpio_chip_init(bank, irqc);
if (ret) if (ret) {
pm_runtime_put_sync(bank->dev);
pm_runtime_disable(bank->dev);
return ret; return ret;
}
omap_gpio_show_rev(bank); omap_gpio_show_rev(bank);

View File

@ -706,4 +706,3 @@ module_exit(sx150x_exit);
MODULE_AUTHOR("Gregory Bean <gbean@codeaurora.org>"); MODULE_AUTHOR("Gregory Bean <gbean@codeaurora.org>");
MODULE_DESCRIPTION("Driver for Semtech SX150X I2C GPIO Expanders"); MODULE_DESCRIPTION("Driver for Semtech SX150X I2C GPIO Expanders");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS("i2c:sx150x");

View File

@ -1174,15 +1174,16 @@ EXPORT_SYMBOL_GPL(gpiod_is_active_low);
* that the GPIO was actually requested. * that the GPIO was actually requested.
*/ */
static bool _gpiod_get_raw_value(const struct gpio_desc *desc) static int _gpiod_get_raw_value(const struct gpio_desc *desc)
{ {
struct gpio_chip *chip; struct gpio_chip *chip;
bool value;
int offset; int offset;
int value;
chip = desc->chip; chip = desc->chip;
offset = gpio_chip_hwgpio(desc); offset = gpio_chip_hwgpio(desc);
value = chip->get ? chip->get(chip, offset) : false; value = chip->get ? chip->get(chip, offset) : -EIO;
value = value < 0 ? value : !!value;
trace_gpio_value(desc_to_gpio(desc), 1, value); trace_gpio_value(desc_to_gpio(desc), 1, value);
return value; return value;
} }
@ -1192,7 +1193,7 @@ static bool _gpiod_get_raw_value(const struct gpio_desc *desc)
* @desc: gpio whose value will be returned * @desc: gpio whose value will be returned
* *
* Return the GPIO's raw value, i.e. the value of the physical line disregarding * Return the GPIO's raw value, i.e. the value of the physical line disregarding
* its ACTIVE_LOW status. * its ACTIVE_LOW status, or negative errno on failure.
* *
* This function should be called from contexts where we cannot sleep, and will * This function should be called from contexts where we cannot sleep, and will
* complain if the GPIO chip functions potentially sleep. * complain if the GPIO chip functions potentially sleep.
@ -1212,7 +1213,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_value);
* @desc: gpio whose value will be returned * @desc: gpio whose value will be returned
* *
* Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into * Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
* account. * account, or negative errno on failure.
* *
* This function should be called from contexts where we cannot sleep, and will * This function should be called from contexts where we cannot sleep, and will
* complain if the GPIO chip functions potentially sleep. * complain if the GPIO chip functions potentially sleep.
@ -1226,6 +1227,9 @@ int gpiod_get_value(const struct gpio_desc *desc)
WARN_ON(desc->chip->can_sleep); WARN_ON(desc->chip->can_sleep);
value = _gpiod_get_raw_value(desc); value = _gpiod_get_raw_value(desc);
if (value < 0)
return value;
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
value = !value; value = !value;
@ -1548,7 +1552,7 @@ EXPORT_SYMBOL_GPL(gpiochip_unlock_as_irq);
* @desc: gpio whose value will be returned * @desc: gpio whose value will be returned
* *
* Return the GPIO's raw value, i.e. the value of the physical line disregarding * Return the GPIO's raw value, i.e. the value of the physical line disregarding
* its ACTIVE_LOW status. * its ACTIVE_LOW status, or negative errno on failure.
* *
* This function is to be called from contexts that can sleep. * This function is to be called from contexts that can sleep.
*/ */
@ -1566,7 +1570,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_value_cansleep);
* @desc: gpio whose value will be returned * @desc: gpio whose value will be returned
* *
* Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into * Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
* account. * account, or negative errno on failure.
* *
* This function is to be called from contexts that can sleep. * This function is to be called from contexts that can sleep.
*/ */
@ -1579,6 +1583,9 @@ int gpiod_get_value_cansleep(const struct gpio_desc *desc)
return 0; return 0;
value = _gpiod_get_raw_value(desc); value = _gpiod_get_raw_value(desc);
if (value < 0)
return value;
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
value = !value; value = !value;

View File

@ -1140,8 +1140,8 @@ config SENSORS_NCT6775
help help
If you say yes here you get support for the hardware monitoring If you say yes here you get support for the hardware monitoring
functionality of the Nuvoton NCT6106D, NCT6775F, NCT6776F, NCT6779D, functionality of the Nuvoton NCT6106D, NCT6775F, NCT6776F, NCT6779D,
NCT6791D, NCT6792D and compatible Super-I/O chips. This driver NCT6791D, NCT6792D, NCT6793D, and compatible Super-I/O chips. This
replaces the w83627ehf driver for NCT6775F and NCT6776F. driver replaces the w83627ehf driver for NCT6775F and NCT6776F.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called nct6775. will be called nct6775.

View File

@ -39,6 +39,7 @@
* nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3 * nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3
* nct6791d 15 6 6 2+6 0xc800 0xc1 0x5ca3 * nct6791d 15 6 6 2+6 0xc800 0xc1 0x5ca3
* nct6792d 15 6 6 2+6 0xc910 0xc1 0x5ca3 * nct6792d 15 6 6 2+6 0xc910 0xc1 0x5ca3
* nct6793d 15 6 6 2+6 0xd120 0xc1 0x5ca3
* *
* #temp lists the number of monitored temperature sources (first value) plus * #temp lists the number of monitored temperature sources (first value) plus
* the number of directly connectable temperature sensors (second value). * the number of directly connectable temperature sensors (second value).
@ -63,7 +64,7 @@
#define USE_ALTERNATE #define USE_ALTERNATE
enum kinds { nct6106, nct6775, nct6776, nct6779, nct6791, nct6792 }; enum kinds { nct6106, nct6775, nct6776, nct6779, nct6791, nct6792, nct6793 };
/* used to set data->name = nct6775_device_names[data->sio_kind] */ /* used to set data->name = nct6775_device_names[data->sio_kind] */
static const char * const nct6775_device_names[] = { static const char * const nct6775_device_names[] = {
@ -73,6 +74,17 @@ static const char * const nct6775_device_names[] = {
"nct6779", "nct6779",
"nct6791", "nct6791",
"nct6792", "nct6792",
"nct6793",
};
static const char * const nct6775_sio_names[] __initconst = {
"NCT6106D",
"NCT6775F",
"NCT6776D/F",
"NCT6779D",
"NCT6791D",
"NCT6792D",
"NCT6793D",
}; };
static unsigned short force_id; static unsigned short force_id;
@ -104,6 +116,7 @@ MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
#define SIO_NCT6779_ID 0xc560 #define SIO_NCT6779_ID 0xc560
#define SIO_NCT6791_ID 0xc800 #define SIO_NCT6791_ID 0xc800
#define SIO_NCT6792_ID 0xc910 #define SIO_NCT6792_ID 0xc910
#define SIO_NCT6793_ID 0xd120
#define SIO_ID_MASK 0xFFF0 #define SIO_ID_MASK 0xFFF0
enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 }; enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 };
@ -354,6 +367,10 @@ static const u16 NCT6775_REG_TEMP_CRIT[ARRAY_SIZE(nct6775_temp_label) - 1]
/* NCT6776 specific data */ /* NCT6776 specific data */
/* STEP_UP_TIME and STEP_DOWN_TIME regs are swapped for all chips but NCT6775 */
#define NCT6776_REG_FAN_STEP_UP_TIME NCT6775_REG_FAN_STEP_DOWN_TIME
#define NCT6776_REG_FAN_STEP_DOWN_TIME NCT6775_REG_FAN_STEP_UP_TIME
static const s8 NCT6776_ALARM_BITS[] = { static const s8 NCT6776_ALARM_BITS[] = {
0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */ 0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */
17, -1, -1, -1, -1, -1, -1, /* in8..in14 */ 17, -1, -1, -1, -1, -1, -1, /* in8..in14 */
@ -533,7 +550,7 @@ static const s8 NCT6791_ALARM_BITS[] = {
4, 5, 13, -1, -1, -1, /* temp1..temp6 */ 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
12, 9 }; /* intrusion0, intrusion1 */ 12, 9 }; /* intrusion0, intrusion1 */
/* NCT6792 specific data */ /* NCT6792/NCT6793 specific data */
static const u16 NCT6792_REG_TEMP_MON[] = { static const u16 NCT6792_REG_TEMP_MON[] = {
0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d }; 0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
@ -1056,6 +1073,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
case nct6779: case nct6779:
case nct6791: case nct6791:
case nct6792: case nct6792:
case nct6793:
return reg == 0x150 || reg == 0x153 || reg == 0x155 || return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) || ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) ||
reg == 0x402 || reg == 0x402 ||
@ -1407,6 +1425,7 @@ static void nct6775_update_pwm_limits(struct device *dev)
case nct6779: case nct6779:
case nct6791: case nct6791:
case nct6792: case nct6792:
case nct6793:
reg = nct6775_read_value(data, reg = nct6775_read_value(data,
data->REG_CRITICAL_PWM_ENABLE[i]); data->REG_CRITICAL_PWM_ENABLE[i]);
if (reg & data->CRITICAL_PWM_ENABLE_MASK) if (reg & data->CRITICAL_PWM_ENABLE_MASK)
@ -2822,6 +2841,7 @@ store_auto_pwm(struct device *dev, struct device_attribute *attr,
case nct6779: case nct6779:
case nct6791: case nct6791:
case nct6792: case nct6792:
case nct6793:
nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], nct6775_write_value(data, data->REG_CRITICAL_PWM[nr],
val); val);
reg = nct6775_read_value(data, reg = nct6775_read_value(data,
@ -3256,7 +3276,7 @@ nct6775_check_fan_inputs(struct nct6775_data *data)
pwm4pin = false; pwm4pin = false;
pwm5pin = false; pwm5pin = false;
pwm6pin = false; pwm6pin = false;
} else { /* NCT6779D, NCT6791D, or NCT6792D */ } else { /* NCT6779D, NCT6791D, NCT6792D, or NCT6793D */
regval = superio_inb(sioreg, 0x1c); regval = superio_inb(sioreg, 0x1c);
fan3pin = !(regval & (1 << 5)); fan3pin = !(regval & (1 << 5));
@ -3269,7 +3289,8 @@ nct6775_check_fan_inputs(struct nct6775_data *data)
fan4min = fan4pin; fan4min = fan4pin;
if (data->kind == nct6791 || data->kind == nct6792) { if (data->kind == nct6791 || data->kind == nct6792 ||
data->kind == nct6793) {
regval = superio_inb(sioreg, 0x2d); regval = superio_inb(sioreg, 0x2d);
fan6pin = (regval & (1 << 1)); fan6pin = (regval & (1 << 1));
pwm6pin = (regval & (1 << 0)); pwm6pin = (regval & (1 << 0));
@ -3528,8 +3549,8 @@ static int nct6775_probe(struct platform_device *pdev)
data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES;
data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
data->REG_PWM[0] = NCT6775_REG_PWM; data->REG_PWM[0] = NCT6775_REG_PWM;
data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
@ -3600,8 +3621,8 @@ static int nct6775_probe(struct platform_device *pdev)
data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
data->REG_PWM[0] = NCT6775_REG_PWM; data->REG_PWM[0] = NCT6775_REG_PWM;
data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
@ -3643,6 +3664,7 @@ static int nct6775_probe(struct platform_device *pdev)
break; break;
case nct6791: case nct6791:
case nct6792: case nct6792:
case nct6793:
data->in_num = 15; data->in_num = 15;
data->pwm_num = 6; data->pwm_num = 6;
data->auto_pwm_num = 4; data->auto_pwm_num = 4;
@ -3677,8 +3699,8 @@ static int nct6775_probe(struct platform_device *pdev)
data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
data->REG_PWM[0] = NCT6775_REG_PWM; data->REG_PWM[0] = NCT6775_REG_PWM;
data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
@ -3918,6 +3940,7 @@ static int nct6775_probe(struct platform_device *pdev)
case nct6779: case nct6779:
case nct6791: case nct6791:
case nct6792: case nct6792:
case nct6793:
break; break;
} }
@ -3950,6 +3973,7 @@ static int nct6775_probe(struct platform_device *pdev)
break; break;
case nct6791: case nct6791:
case nct6792: case nct6792:
case nct6793:
tmp |= 0x7e; tmp |= 0x7e;
break; break;
} }
@ -4047,7 +4071,8 @@ static int __maybe_unused nct6775_resume(struct device *dev)
if (reg != data->sio_reg_enable) if (reg != data->sio_reg_enable)
superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable); superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable);
if (data->kind == nct6791 || data->kind == nct6792) if (data->kind == nct6791 || data->kind == nct6792 ||
data->kind == nct6793)
nct6791_enable_io_mapping(sioreg); nct6791_enable_io_mapping(sioreg);
superio_exit(sioreg); superio_exit(sioreg);
@ -4106,15 +4131,6 @@ static struct platform_driver nct6775_driver = {
.probe = nct6775_probe, .probe = nct6775_probe,
}; };
static const char * const nct6775_sio_names[] __initconst = {
"NCT6106D",
"NCT6775F",
"NCT6776D/F",
"NCT6779D",
"NCT6791D",
"NCT6792D",
};
/* nct6775_find() looks for a '627 in the Super-I/O config space */ /* nct6775_find() looks for a '627 in the Super-I/O config space */
static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data) static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
{ {
@ -4150,6 +4166,9 @@ static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
case SIO_NCT6792_ID: case SIO_NCT6792_ID:
sio_data->kind = nct6792; sio_data->kind = nct6792;
break; break;
case SIO_NCT6793_ID:
sio_data->kind = nct6793;
break;
default: default:
if (val != 0xffff) if (val != 0xffff)
pr_debug("unsupported chip ID: 0x%04x\n", val); pr_debug("unsupported chip ID: 0x%04x\n", val);
@ -4175,7 +4194,8 @@ static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01); superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
} }
if (sio_data->kind == nct6791 || sio_data->kind == nct6792) if (sio_data->kind == nct6791 || sio_data->kind == nct6792 ||
sio_data->kind == nct6793)
nct6791_enable_io_mapping(sioaddr); nct6791_enable_io_mapping(sioaddr);
superio_exit(sioaddr); superio_exit(sioaddr);
@ -4285,7 +4305,7 @@ static void __exit sensors_nct6775_exit(void)
} }
MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>"); MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
MODULE_DESCRIPTION("NCT6106D/NCT6775F/NCT6776F/NCT6779D/NCT6791D/NCT6792D driver"); MODULE_DESCRIPTION("Driver for NCT6775F and compatible chips");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(sensors_nct6775_init); module_init(sensors_nct6775_init);

View File

@ -56,7 +56,6 @@ config INFINIBAND_ADDR_TRANS
source "drivers/infiniband/hw/mthca/Kconfig" source "drivers/infiniband/hw/mthca/Kconfig"
source "drivers/infiniband/hw/qib/Kconfig" source "drivers/infiniband/hw/qib/Kconfig"
source "drivers/infiniband/hw/ehca/Kconfig"
source "drivers/infiniband/hw/cxgb3/Kconfig" source "drivers/infiniband/hw/cxgb3/Kconfig"
source "drivers/infiniband/hw/cxgb4/Kconfig" source "drivers/infiniband/hw/cxgb4/Kconfig"
source "drivers/infiniband/hw/mlx4/Kconfig" source "drivers/infiniband/hw/mlx4/Kconfig"

View File

@ -1,6 +1,5 @@
obj-$(CONFIG_INFINIBAND_MTHCA) += mthca/ obj-$(CONFIG_INFINIBAND_MTHCA) += mthca/
obj-$(CONFIG_INFINIBAND_QIB) += qib/ obj-$(CONFIG_INFINIBAND_QIB) += qib/
obj-$(CONFIG_INFINIBAND_EHCA) += ehca/
obj-$(CONFIG_INFINIBAND_CXGB3) += cxgb3/ obj-$(CONFIG_INFINIBAND_CXGB3) += cxgb3/
obj-$(CONFIG_INFINIBAND_CXGB4) += cxgb4/ obj-$(CONFIG_INFINIBAND_CXGB4) += cxgb4/
obj-$(CONFIG_MLX4_INFINIBAND) += mlx4/ obj-$(CONFIG_MLX4_INFINIBAND) += mlx4/

View File

@ -349,6 +349,9 @@ static bool pinctrl_ready_for_gpio_range(unsigned gpio)
struct pinctrl_gpio_range *range = NULL; struct pinctrl_gpio_range *range = NULL;
struct gpio_chip *chip = gpio_to_chip(gpio); struct gpio_chip *chip = gpio_to_chip(gpio);
if (WARN(!chip, "no gpio_chip for gpio%i?", gpio))
return false;
mutex_lock(&pinctrldev_list_mutex); mutex_lock(&pinctrldev_list_mutex);
/* Loop over the pin controllers */ /* Loop over the pin controllers */

View File

@ -337,9 +337,9 @@ static int dc_pinctrl_probe(struct platform_device *pdev)
pmap->dev = &pdev->dev; pmap->dev = &pdev->dev;
pmap->pctl = pinctrl_register(pctl_desc, &pdev->dev, pmap); pmap->pctl = pinctrl_register(pctl_desc, &pdev->dev, pmap);
if (!pmap->pctl) { if (IS_ERR(pmap->pctl)) {
dev_err(&pdev->dev, "pinctrl driver registration failed\n"); dev_err(&pdev->dev, "pinctrl driver registration failed\n");
return -EINVAL; return PTR_ERR(pmap->pctl);
} }
ret = dc_gpiochip_add(pmap, pdev->dev.of_node); ret = dc_gpiochip_add(pmap, pdev->dev.of_node);

View File

@ -313,8 +313,7 @@ static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev,
/* See if this pctldev has this function */ /* See if this pctldev has this function */
while (selector < nfuncs) { while (selector < nfuncs) {
const char *fname = ops->get_function_name(pctldev, const char *fname = ops->get_function_name(pctldev, selector);
selector);
if (!strcmp(function, fname)) if (!strcmp(function, fname))
return selector; return selector;

View File

@ -723,9 +723,9 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev)
#endif #endif
pctrl->pctrl = pinctrl_register(&pctrl->desc, &pdev->dev, pctrl); pctrl->pctrl = pinctrl_register(&pctrl->desc, &pdev->dev, pctrl);
if (!pctrl->pctrl) { if (IS_ERR(pctrl->pctrl)) {
dev_err(&pdev->dev, "couldn't register pm8xxx gpio driver\n"); dev_err(&pdev->dev, "couldn't register pm8xxx gpio driver\n");
return -ENODEV; return PTR_ERR(pctrl->pctrl);
} }
pctrl->chip = pm8xxx_gpio_template; pctrl->chip = pm8xxx_gpio_template;

View File

@ -814,9 +814,9 @@ static int pm8xxx_mpp_probe(struct platform_device *pdev)
#endif #endif
pctrl->pctrl = pinctrl_register(&pctrl->desc, &pdev->dev, pctrl); pctrl->pctrl = pinctrl_register(&pctrl->desc, &pdev->dev, pctrl);
if (!pctrl->pctrl) { if (IS_ERR(pctrl->pctrl)) {
dev_err(&pdev->dev, "couldn't register pm8xxx mpp driver\n"); dev_err(&pdev->dev, "couldn't register pm8xxx mpp driver\n");
return -ENODEV; return PTR_ERR(pctrl->pctrl);
} }
pctrl->chip = pm8xxx_mpp_template; pctrl->chip = pm8xxx_mpp_template;

View File

@ -361,7 +361,7 @@ static inline void s3c24xx_demux_eint(struct irq_desc *desc,
u32 offset, u32 range) u32 offset, u32 range)
{ {
struct s3c24xx_eint_data *data = irq_desc_get_handler_data(desc); struct s3c24xx_eint_data *data = irq_desc_get_handler_data(desc);
struct irq_chip *chip = irq_desc_get_irq_chip(desc); struct irq_chip *chip = irq_desc_get_chip(desc);
struct samsung_pinctrl_drv_data *d = data->drvdata; struct samsung_pinctrl_drv_data *d = data->drvdata;
unsigned int pend, mask; unsigned int pend, mask;

View File

@ -126,6 +126,24 @@ static const struct dmi_system_id asus_quirks[] = {
}, },
.driver_data = &quirk_asus_wapf4, .driver_data = &quirk_asus_wapf4,
}, },
{
.callback = dmi_matched,
.ident = "ASUSTeK COMPUTER INC. X456UA",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "X456UA"),
},
.driver_data = &quirk_asus_wapf4,
},
{
.callback = dmi_matched,
.ident = "ASUSTeK COMPUTER INC. X456UF",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "X456UF"),
},
.driver_data = &quirk_asus_wapf4,
},
{ {
.callback = dmi_matched, .callback = dmi_matched,
.ident = "ASUSTeK COMPUTER INC. X501U", .ident = "ASUSTeK COMPUTER INC. X501U",

View File

@ -54,8 +54,9 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
#define HPWMI_HARDWARE_QUERY 0x4 #define HPWMI_HARDWARE_QUERY 0x4
#define HPWMI_WIRELESS_QUERY 0x5 #define HPWMI_WIRELESS_QUERY 0x5
#define HPWMI_BIOS_QUERY 0x9 #define HPWMI_BIOS_QUERY 0x9
#define HPWMI_FEATURE_QUERY 0xb
#define HPWMI_HOTKEY_QUERY 0xc #define HPWMI_HOTKEY_QUERY 0xc
#define HPWMI_FEATURE_QUERY 0xd #define HPWMI_FEATURE2_QUERY 0xd
#define HPWMI_WIRELESS2_QUERY 0x1b #define HPWMI_WIRELESS2_QUERY 0x1b
#define HPWMI_POSTCODEERROR_QUERY 0x2a #define HPWMI_POSTCODEERROR_QUERY 0x2a
@ -295,25 +296,33 @@ static int hp_wmi_tablet_state(void)
return (state & 0x4) ? 1 : 0; return (state & 0x4) ? 1 : 0;
} }
static int __init hp_wmi_bios_2009_later(void) static int __init hp_wmi_bios_2008_later(void)
{ {
int state = 0; int state = 0;
int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state, int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state,
sizeof(state), sizeof(state)); sizeof(state), sizeof(state));
if (ret) if (!ret)
return ret; return 1;
return (state & 0x10) ? 1 : 0; return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO;
} }
static int hp_wmi_enable_hotkeys(void) static int __init hp_wmi_bios_2009_later(void)
{ {
int ret; int state = 0;
int query = 0x6e; int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, 0, &state,
sizeof(state), sizeof(state));
if (!ret)
return 1;
ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query), return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO;
0); }
static int __init hp_wmi_enable_hotkeys(void)
{
int value = 0x6e;
int ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &value,
sizeof(value), 0);
if (ret) if (ret)
return -EINVAL; return -EINVAL;
return 0; return 0;
@ -663,7 +672,7 @@ static int __init hp_wmi_input_setup(void)
hp_wmi_tablet_state()); hp_wmi_tablet_state());
input_sync(hp_wmi_input_dev); input_sync(hp_wmi_input_dev);
if (hp_wmi_bios_2009_later() == 4) if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later())
hp_wmi_enable_hotkeys(); hp_wmi_enable_hotkeys();
status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL); status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL);

View File

@ -938,7 +938,7 @@ static int toshiba_usb_sleep_music_get(struct toshiba_acpi_dev *dev, u32 *state)
else if (result == TOS_NOT_SUPPORTED) else if (result == TOS_NOT_SUPPORTED)
return -ENODEV; return -ENODEV;
return result = TOS_SUCCESS ? 0 : -EIO; return result == TOS_SUCCESS ? 0 : -EIO;
} }
static int toshiba_usb_sleep_music_set(struct toshiba_acpi_dev *dev, u32 state) static int toshiba_usb_sleep_music_set(struct toshiba_acpi_dev *dev, u32 state)
@ -2398,11 +2398,9 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
if (error) if (error)
return error; return error;
error = toshiba_hotkey_event_type_get(dev, &events_type); if (toshiba_hotkey_event_type_get(dev, &events_type))
if (error) { pr_notice("Unable to query Hotkey Event Type\n");
pr_err("Unable to query Hotkey Event Type\n");
return error;
}
dev->hotkey_event_type = events_type; dev->hotkey_event_type = events_type;
dev->hotkey_dev = input_allocate_device(); dev->hotkey_dev = input_allocate_device();

View File

@ -194,34 +194,6 @@ static bool wmi_parse_guid(const u8 *src, u8 *dest)
return true; return true;
} }
/*
* Convert a raw GUID to the ACII string representation
*/
static int wmi_gtoa(const char *in, char *out)
{
int i;
for (i = 3; i >= 0; i--)
out += sprintf(out, "%02X", in[i] & 0xFF);
out += sprintf(out, "-");
out += sprintf(out, "%02X", in[5] & 0xFF);
out += sprintf(out, "%02X", in[4] & 0xFF);
out += sprintf(out, "-");
out += sprintf(out, "%02X", in[7] & 0xFF);
out += sprintf(out, "%02X", in[6] & 0xFF);
out += sprintf(out, "-");
out += sprintf(out, "%02X", in[8] & 0xFF);
out += sprintf(out, "%02X", in[9] & 0xFF);
out += sprintf(out, "-");
for (i = 10; i <= 15; i++)
out += sprintf(out, "%02X", in[i] & 0xFF);
*out = '\0';
return 0;
}
static bool find_guid(const char *guid_string, struct wmi_block **out) static bool find_guid(const char *guid_string, struct wmi_block **out)
{ {
char tmp[16], guid_input[16]; char tmp[16], guid_input[16];
@ -457,11 +429,7 @@ EXPORT_SYMBOL_GPL(wmi_set_block);
static void wmi_dump_wdg(const struct guid_block *g) static void wmi_dump_wdg(const struct guid_block *g)
{ {
char guid_string[37]; pr_info("%pUL:\n", g->guid);
wmi_gtoa(g->guid, guid_string);
pr_info("%s:\n", guid_string);
pr_info("\tobject_id: %c%c\n", g->object_id[0], g->object_id[1]); pr_info("\tobject_id: %c%c\n", g->object_id[0], g->object_id[1]);
pr_info("\tnotify_id: %02X\n", g->notify_id); pr_info("\tnotify_id: %02X\n", g->notify_id);
pr_info("\treserved: %02X\n", g->reserved); pr_info("\treserved: %02X\n", g->reserved);
@ -661,7 +629,6 @@ EXPORT_SYMBOL_GPL(wmi_has_guid);
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
char guid_string[37];
struct wmi_block *wblock; struct wmi_block *wblock;
wblock = dev_get_drvdata(dev); wblock = dev_get_drvdata(dev);
@ -670,9 +637,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
return strlen(buf); return strlen(buf);
} }
wmi_gtoa(wblock->gblock.guid, guid_string); return sprintf(buf, "wmi:%pUL\n", wblock->gblock.guid);
return sprintf(buf, "wmi:%s\n", guid_string);
} }
static DEVICE_ATTR_RO(modalias); static DEVICE_ATTR_RO(modalias);
@ -695,7 +660,7 @@ static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
if (!wblock) if (!wblock)
return -ENOMEM; return -ENOMEM;
wmi_gtoa(wblock->gblock.guid, guid_string); sprintf(guid_string, "%pUL", wblock->gblock.guid);
strcpy(&env->buf[env->buflen - 1], "wmi:"); strcpy(&env->buf[env->buflen - 1], "wmi:");
memcpy(&env->buf[env->buflen - 1 + 4], guid_string, 36); memcpy(&env->buf[env->buflen - 1 + 4], guid_string, 36);
@ -721,12 +686,9 @@ static struct class wmi_class = {
static int wmi_create_device(const struct guid_block *gblock, static int wmi_create_device(const struct guid_block *gblock,
struct wmi_block *wblock, acpi_handle handle) struct wmi_block *wblock, acpi_handle handle)
{ {
char guid_string[37];
wblock->dev.class = &wmi_class; wblock->dev.class = &wmi_class;
wmi_gtoa(gblock->guid, guid_string); dev_set_name(&wblock->dev, "%pUL", gblock->guid);
dev_set_name(&wblock->dev, "%s", guid_string);
dev_set_drvdata(&wblock->dev, wblock); dev_set_drvdata(&wblock->dev, wblock);
@ -877,7 +839,6 @@ static void acpi_wmi_notify(struct acpi_device *device, u32 event)
struct guid_block *block; struct guid_block *block;
struct wmi_block *wblock; struct wmi_block *wblock;
struct list_head *p; struct list_head *p;
char guid_string[37];
list_for_each(p, &wmi_block_list) { list_for_each(p, &wmi_block_list) {
wblock = list_entry(p, struct wmi_block, list); wblock = list_entry(p, struct wmi_block, list);
@ -888,8 +849,8 @@ static void acpi_wmi_notify(struct acpi_device *device, u32 event)
if (wblock->handler) if (wblock->handler)
wblock->handler(event, wblock->handler_data); wblock->handler(event, wblock->handler_data);
if (debug_event) { if (debug_event) {
wmi_gtoa(wblock->gblock.guid, guid_string); pr_info("DEBUG Event GUID: %pUL\n",
pr_info("DEBUG Event GUID: %s\n", guid_string); wblock->gblock.guid);
} }
acpi_bus_generate_netlink_event( acpi_bus_generate_netlink_event(

View File

@ -91,7 +91,7 @@
#define TWL4030_MSTATEC_COMPLETE1 0x0b #define TWL4030_MSTATEC_COMPLETE1 0x0b
#define TWL4030_MSTATEC_COMPLETE4 0x0e #define TWL4030_MSTATEC_COMPLETE4 0x0e
#if IS_ENABLED(CONFIG_TWL4030_MADC) #if IS_REACHABLE(CONFIG_TWL4030_MADC)
/* /*
* If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11) * If AC (Accessory Charger) voltage exceeds 4.5V (MADC 11)
* then AC is available. * then AC is available.
@ -1057,13 +1057,9 @@ static int twl4030_bci_probe(struct platform_device *pdev)
phynode = of_find_compatible_node(bci->dev->of_node->parent, phynode = of_find_compatible_node(bci->dev->of_node->parent,
NULL, "ti,twl4030-usb"); NULL, "ti,twl4030-usb");
if (phynode) { if (phynode)
bci->transceiver = devm_usb_get_phy_by_node( bci->transceiver = devm_usb_get_phy_by_node(
bci->dev, phynode, &bci->usb_nb); bci->dev, phynode, &bci->usb_nb);
if (IS_ERR(bci->transceiver) &&
PTR_ERR(bci->transceiver) == -EPROBE_DEFER)
return -EPROBE_DEFER;
}
} }
/* Enable interrupts now. */ /* Enable interrupts now. */

View File

@ -24,6 +24,8 @@ if STAGING_RDMA
source "drivers/staging/rdma/amso1100/Kconfig" source "drivers/staging/rdma/amso1100/Kconfig"
source "drivers/staging/rdma/ehca/Kconfig"
source "drivers/staging/rdma/hfi1/Kconfig" source "drivers/staging/rdma/hfi1/Kconfig"
source "drivers/staging/rdma/ipath/Kconfig" source "drivers/staging/rdma/ipath/Kconfig"

View File

@ -1,4 +1,5 @@
# Entries for RDMA_STAGING tree # Entries for RDMA_STAGING tree
obj-$(CONFIG_INFINIBAND_AMSO1100) += amso1100/ obj-$(CONFIG_INFINIBAND_AMSO1100) += amso1100/
obj-$(CONFIG_INFINIBAND_EHCA) += ehca/
obj-$(CONFIG_INFINIBAND_HFI1) += hfi1/ obj-$(CONFIG_INFINIBAND_HFI1) += hfi1/
obj-$(CONFIG_INFINIBAND_IPATH) += ipath/ obj-$(CONFIG_INFINIBAND_IPATH) += ipath/

View File

@ -2,7 +2,8 @@ config INFINIBAND_EHCA
tristate "eHCA support" tristate "eHCA support"
depends on IBMEBUS depends on IBMEBUS
---help--- ---help---
This driver supports the IBM pSeries eHCA InfiniBand adapter. This driver supports the deprecated IBM pSeries eHCA InfiniBand
adapter.
To compile the driver as a module, choose M here. The module To compile the driver as a module, choose M here. The module
will be called ib_ehca. will be called ib_ehca.

View File

@ -0,0 +1,4 @@
9/2015
The ehca driver has been deprecated and moved to drivers/staging/rdma.
It will be removed in the 4.6 merge window.

Some files were not shown because too many files have changed in this diff Show More