Merge branch 'linus' into locking/core, to pick up fixes before applying new changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
d6a367853b
|
@ -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.
|
||||
|
||||
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
|
||||
through gpiod_get(). For example:
|
||||
either <function>-gpios or <function>-gpio, where <function> is the function
|
||||
the driver will request through gpiod_get(). For example:
|
||||
|
||||
foo_device {
|
||||
compatible = "acme,foo";
|
||||
|
@ -31,7 +31,7 @@ through gpiod_get(). For example:
|
|||
<&gpio 16 GPIO_ACTIVE_HIGH>, /* green */
|
||||
<&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
|
||||
|
@ -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;
|
||||
|
||||
red = gpiod_get_index(dev, "led", 0);
|
||||
green = gpiod_get_index(dev, "led", 1);
|
||||
blue = gpiod_get_index(dev, "led", 2);
|
||||
red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
|
||||
green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
|
||||
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.
|
||||
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 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;
|
||||
|
||||
red = gpiod_get_index(dev, "led", 0);
|
||||
green = gpiod_get_index(dev, "led", 1);
|
||||
blue = gpiod_get_index(dev, "led", 2);
|
||||
red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
|
||||
green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
|
||||
blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);
|
||||
|
||||
power = gpiod_get(dev, "power");
|
||||
gpiod_direction_output(power, 1);
|
||||
power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);
|
||||
|
||||
Since the "power" GPIO is mapped 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.
|
||||
Since the "led" GPIOs are mapped as active-high, this example will switch their
|
||||
signals to 1, i.e. enabling the LEDs. And for the "power" GPIO, which is mapped
|
||||
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.
|
||||
|
|
|
@ -39,6 +39,9 @@ device that displays digits), an additional index argument can be specified:
|
|||
const char *con_id, unsigned int idx,
|
||||
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
|
||||
for the GPIO. Values can be:
|
||||
|
||||
|
|
|
@ -32,6 +32,10 @@ Supported chips:
|
|||
Prefix: 'nct6792'
|
||||
Addresses scanned: ISA address retrieved from Super I/O registers
|
||||
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:
|
||||
Guenter Roeck <linux@roeck-us.net>
|
||||
|
|
|
@ -15,8 +15,8 @@ The updated API replacements are:
|
|||
|
||||
DEFINE_STATIC_KEY_TRUE(key);
|
||||
DEFINE_STATIC_KEY_FALSE(key);
|
||||
static_key_likely()
|
||||
static_key_unlikely()
|
||||
static_branch_likely()
|
||||
static_branch_unlikely()
|
||||
|
||||
0) Abstract
|
||||
|
||||
|
|
|
@ -6452,11 +6452,11 @@ F: drivers/hwmon/ltc4261.c
|
|||
LTP (Linux Test Project)
|
||||
M: Mike Frysinger <vapier@gentoo.org>
|
||||
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: Stanislav Kholmanskikh <stanislav.kholmanskikh@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/
|
||||
T: git git://github.com/linux-test-project/ltp.git
|
||||
S: Maintained
|
||||
|
|
|
@ -297,7 +297,9 @@ static inline void __iomem * ioremap_nocache(unsigned long offset,
|
|||
unsigned long size)
|
||||
{
|
||||
return ioremap(offset, size);
|
||||
}
|
||||
}
|
||||
|
||||
#define ioremap_uc ioremap_nocache
|
||||
|
||||
static inline void iounmap(volatile void __iomem *addr)
|
||||
{
|
||||
|
|
|
@ -30,6 +30,7 @@ __delay(int loops)
|
|||
" bgt %0,1b"
|
||||
: "=&r" (tmp), "=r" (loops) : "1"(loops));
|
||||
}
|
||||
EXPORT_SYMBOL(__delay);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define LPJ cpu_data[smp_processor_id()].loops_per_jiffy
|
||||
|
|
|
@ -54,6 +54,14 @@ AS += -EL
|
|||
LD += -EL
|
||||
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.
|
||||
# Note that GCC does not numerically define an architecture version
|
||||
# macro, but instead defines a whole series of macros which makes
|
||||
|
|
|
@ -491,11 +491,6 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||
#endif
|
||||
.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
|
||||
.macro ret\c, reg
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
|
|
|
@ -40,6 +40,7 @@ do { \
|
|||
"2:\t.asciz " #__file "\n" \
|
||||
".popsection\n" \
|
||||
".pushsection __bug_table,\"a\"\n" \
|
||||
".align 2\n" \
|
||||
"3:\t.word 1b, 2b\n" \
|
||||
"\t.hword " #__line ", 0\n" \
|
||||
".popsection"); \
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/thread_info.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -89,7 +90,8 @@ static inline unsigned int get_domain(void)
|
|||
|
||||
asm(
|
||||
"mrc p15, 0, %0, c3, c0 @ get domain"
|
||||
: "=r" (domain));
|
||||
: "=r" (domain)
|
||||
: "m" (current_thread_info()->cpu_domain));
|
||||
|
||||
return domain;
|
||||
}
|
||||
|
@ -98,7 +100,7 @@ static inline void set_domain(unsigned val)
|
|||
{
|
||||
asm volatile(
|
||||
"mcr p15, 0, %0, c3, c0 @ set domain"
|
||||
: : "r" (val));
|
||||
: : "r" (val) : "memory");
|
||||
isb();
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
struct task_struct;
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/domain.h>
|
||||
|
||||
typedef unsigned long mm_segment_t;
|
||||
|
||||
|
|
|
@ -226,6 +226,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
|||
|
||||
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
|
||||
* 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
|
||||
*/
|
||||
thread->cpu_domain = get_domain();
|
||||
#endif
|
||||
|
||||
if (likely(!(p->flags & PF_KTHREAD))) {
|
||||
*childregs = *current_pt_regs();
|
||||
|
|
|
@ -95,9 +95,10 @@ emulate:
|
|||
reteq r4 @ no, return failure
|
||||
|
||||
next:
|
||||
uaccess_enable r3
|
||||
.Lx1: ldrt r6, [r5], #4 @ get the next instruction and
|
||||
@ increment PC
|
||||
|
||||
uaccess_disable r3
|
||||
and r2, r6, #0x0F000000 @ test for FP insns
|
||||
teq r2, #0x0C000000
|
||||
teqne r2, #0x0D000000
|
||||
|
|
|
@ -98,8 +98,23 @@ ENTRY(privcmd_call)
|
|||
mov r1, r2
|
||||
mov r2, r3
|
||||
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]
|
||||
__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}
|
||||
ret lr
|
||||
ENDPROC(privcmd_call);
|
||||
|
|
|
@ -32,6 +32,7 @@ config ARM64
|
|||
select GENERIC_CLOCKEVENTS_BROADCAST
|
||||
select GENERIC_CPU_AUTOPROBE
|
||||
select GENERIC_EARLY_IOREMAP
|
||||
select GENERIC_IDLE_POLL_SETUP
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IRQ_SHOW_LEVEL
|
||||
|
@ -331,6 +332,22 @@ config ARM64_ERRATUM_845719
|
|||
|
||||
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
|
||||
|
||||
|
||||
|
|
|
@ -41,6 +41,10 @@ endif
|
|||
|
||||
CHECKFLAGS += -D__aarch64__
|
||||
|
||||
ifeq ($(CONFIG_ARM64_ERRATUM_843419), y)
|
||||
CFLAGS_MODULE += -mcmodel=large
|
||||
endif
|
||||
|
||||
# Default value
|
||||
head-y := arch/arm64/kernel/head.o
|
||||
|
||||
|
|
|
@ -26,13 +26,9 @@
|
|||
* Software defined PTE bits definition.
|
||||
*/
|
||||
#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_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 */
|
||||
|
||||
/*
|
||||
|
@ -146,7 +142,7 @@ extern struct page *empty_zero_page;
|
|||
#define pte_exec(pte) (!(pte_val(pte) & PTE_UXN))
|
||||
|
||||
#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
|
||||
#define pte_hw_dirty(pte) (0)
|
||||
#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
|
||||
* 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,
|
||||
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;
|
||||
/* preserve the hardware dirty information */
|
||||
if (pte_hw_dirty(pte))
|
||||
newprot |= PTE_DIRTY;
|
||||
pte = pte_mkdirty(pte);
|
||||
pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
|
||||
return pte;
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@ static int os_lock_notify(struct notifier_block *self,
|
|||
unsigned long action, void *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);
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
#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 */
|
||||
msr vttbr_el2, xzr
|
||||
|
||||
|
|
|
@ -872,7 +872,7 @@ static int hw_breakpoint_reset_notify(struct notifier_block *self,
|
|||
void *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);
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
|
|
@ -332,12 +332,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
|||
ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 0, 21,
|
||||
AARCH64_INSN_IMM_ADR);
|
||||
break;
|
||||
#ifndef CONFIG_ARM64_ERRATUM_843419
|
||||
case R_AARCH64_ADR_PREL_PG_HI21_NC:
|
||||
overflow_check = false;
|
||||
case R_AARCH64_ADR_PREL_PG_HI21:
|
||||
ovf = reloc_insn_imm(RELOC_OP_PAGE, loc, val, 12, 21,
|
||||
AARCH64_INSN_IMM_ADR);
|
||||
break;
|
||||
#endif
|
||||
case R_AARCH64_ADD_ABS_LO12_NC:
|
||||
case R_AARCH64_LDST8_ABS_LO12_NC:
|
||||
overflow_check = false;
|
||||
|
|
|
@ -212,14 +212,32 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
|
|||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
struct fpsimd_state *fpsimd = ¤t->thread.fpsimd_state;
|
||||
compat_ulong_t magic = VFP_MAGIC;
|
||||
compat_ulong_t size = VFP_STORAGE_SIZE;
|
||||
compat_ulong_t fpscr, fpexc;
|
||||
int err = 0;
|
||||
int i, err = 0;
|
||||
|
||||
/*
|
||||
* 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,
|
||||
* 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,
|
||||
sizeof(frame->ufp.fpregs));
|
||||
for (i = 0; i < ARRAY_SIZE(frame->ufp.fpregs); i += 2) {
|
||||
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. */
|
||||
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 size = VFP_STORAGE_SIZE;
|
||||
compat_ulong_t fpscr;
|
||||
int err = 0;
|
||||
int i, err = 0;
|
||||
|
||||
__get_user_error(magic, &frame->magic, 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)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Copy the FP registers into the start of the fpsimd_state.
|
||||
* FIXME: Won't work if big endian.
|
||||
*/
|
||||
err |= __copy_from_user(fpsimd.vregs, frame->ufp.fpregs,
|
||||
sizeof(frame->ufp.fpregs));
|
||||
/* Copy the FP registers into the start of the fpsimd_state. */
|
||||
for (i = 0; i < ARRAY_SIZE(frame->ufp.fpregs); i += 2) {
|
||||
union __fpsimd_vreg vreg;
|
||||
|
||||
__get_user_error(vreg.lo, &frame->ufp.fpregs[i], err);
|
||||
__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 */
|
||||
__get_user_error(fpscr, &frame->ufp.fpscr, err);
|
||||
|
|
|
@ -100,7 +100,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
|
|||
if (IS_ENABLED(CONFIG_ZONE_DMA) &&
|
||||
dev->coherent_dma_mask <= DMA_BIT_MASK(32))
|
||||
flags |= GFP_DMA;
|
||||
if (IS_ENABLED(CONFIG_DMA_CMA) && (flags & __GFP_WAIT)) {
|
||||
if (dev_get_cma_area(dev) && (flags & __GFP_WAIT)) {
|
||||
struct page *page;
|
||||
void *addr;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -332,5 +332,7 @@
|
|||
#define __NR_memfd_create 1340
|
||||
#define __NR_bpf 1341
|
||||
#define __NR_execveat 1342
|
||||
#define __NR_userfaultfd 1343
|
||||
#define __NR_membarrier 1344
|
||||
|
||||
#endif /* _UAPI_ASM_IA64_UNISTD_H */
|
||||
|
|
|
@ -1768,5 +1768,7 @@ sys_call_table:
|
|||
data8 sys_memfd_create // 1340
|
||||
data8 sys_bpf
|
||||
data8 sys_execveat
|
||||
data8 sys_userfaultfd
|
||||
data8 sys_membarrier
|
||||
|
||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||
|
|
|
@ -1006,7 +1006,7 @@ config X86_THERMAL_VECTOR
|
|||
depends on X86_MCE_INTEL
|
||||
|
||||
config X86_LEGACY_VM86
|
||||
bool "Legacy VM86 support (obsolete)"
|
||||
bool "Legacy VM86 support"
|
||||
default n
|
||||
depends on X86_32
|
||||
---help---
|
||||
|
@ -1018,19 +1018,20 @@ config X86_LEGACY_VM86
|
|||
available to accelerate real mode DOS programs. However, any
|
||||
recent version of DOSEMU, X, or vbetool should be fully
|
||||
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
|
||||
this option, as 64-bit kernels don't, and can't, support V8086
|
||||
mode. This option is also unrelated to 16-bit protected mode
|
||||
and is not needed to run most 16-bit programs under Wine.
|
||||
Note that any app that works on a 64-bit kernel is unlikely to
|
||||
need this option, as 64-bit kernels don't, and can't, support
|
||||
V8086 mode. This option is also unrelated to 16-bit protected
|
||||
mode and is not needed to run most 16-bit programs under Wine.
|
||||
|
||||
Enabling this option adds considerable attack surface to the
|
||||
kernel and slows down system calls and exception handling.
|
||||
Enabling this option increases the complexity of the kernel
|
||||
and slows down exception handling a tiny bit.
|
||||
|
||||
Unless you use very old userspace or need the last drop of
|
||||
performance in your real mode DOS games and can't use KVM,
|
||||
say N here.
|
||||
If unsure, say N here.
|
||||
|
||||
config VM86
|
||||
bool
|
||||
|
|
|
@ -241,6 +241,7 @@
|
|||
#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_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 */
|
||||
#define X86_FEATURE_XSAVEOPT (10*32+ 0) /* XSAVEOPT */
|
||||
|
|
|
@ -97,7 +97,6 @@ struct pv_lazy_ops {
|
|||
struct pv_time_ops {
|
||||
unsigned long long (*sched_clock)(void);
|
||||
unsigned long long (*steal_clock)(int cpu);
|
||||
unsigned long (*get_tsc_khz)(void);
|
||||
};
|
||||
|
||||
struct pv_cpu_ops {
|
||||
|
|
|
@ -338,10 +338,15 @@ done:
|
|||
|
||||
static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (instr[0] != 0x90)
|
||||
return;
|
||||
|
||||
local_irq_save(flags);
|
||||
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: ",
|
||||
instr, a->instrlen - a->padlen, a->padlen);
|
||||
|
|
|
@ -336,6 +336,13 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
|
|||
apic_write(APIC_LVTT, lvtt_value);
|
||||
|
||||
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");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -2522,6 +2522,7 @@ void __init setup_ioapic_dest(void)
|
|||
int pin, ioapic, irq, irq_entry;
|
||||
const struct cpumask *mask;
|
||||
struct irq_data *idata;
|
||||
struct irq_chip *chip;
|
||||
|
||||
if (skip_ioapic_setup == 1)
|
||||
return;
|
||||
|
@ -2545,9 +2546,9 @@ void __init setup_ioapic_dest(void)
|
|||
else
|
||||
mask = apic->target_cpus();
|
||||
|
||||
irq_set_affinity(irq, mask);
|
||||
chip = irq_data_get_irq_chip(idata);
|
||||
chip->irq_set_affinity(idata, mask, false);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1110,10 +1110,10 @@ void print_cpu_info(struct cpuinfo_x86 *c)
|
|||
else
|
||||
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)
|
||||
printk(KERN_CONT ", stepping: %02x)\n", c->x86_mask);
|
||||
printk(KERN_CONT ", stepping: 0x%x)\n", c->x86_mask);
|
||||
else
|
||||
printk(KERN_CONT ")\n");
|
||||
|
||||
|
|
|
@ -2316,9 +2316,12 @@ static struct event_constraint *
|
|||
intel_get_event_constraints(struct cpu_hw_events *cpuc, int idx,
|
||||
struct perf_event *event)
|
||||
{
|
||||
struct event_constraint *c1 = cpuc->event_constraint[idx];
|
||||
struct event_constraint *c1 = NULL;
|
||||
struct event_constraint *c2;
|
||||
|
||||
if (idx >= 0) /* fake does < 0 */
|
||||
c1 = cpuc->event_constraint[idx];
|
||||
|
||||
/*
|
||||
* first time only
|
||||
* - static constraint: no change across incremental scheduling calls
|
||||
|
|
|
@ -222,6 +222,7 @@ static void __bts_event_start(struct perf_event *event)
|
|||
if (!buf || bts_buffer_is_full(buf, bts))
|
||||
return;
|
||||
|
||||
event->hw.itrace_started = 1;
|
||||
event->hw.state = 0;
|
||||
|
||||
if (!buf->snapshot)
|
||||
|
|
|
@ -58,7 +58,7 @@ static struct ldt_struct *alloc_ldt_struct(int size)
|
|||
if (alloc_size > PAGE_SIZE)
|
||||
new_ldt->entries = vzalloc(alloc_size);
|
||||
else
|
||||
new_ldt->entries = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
new_ldt->entries = (void *)get_zeroed_page(GFP_KERNEL);
|
||||
|
||||
if (!new_ldt->entries) {
|
||||
kfree(new_ldt);
|
||||
|
@ -95,7 +95,7 @@ static void free_ldt_struct(struct ldt_struct *ldt)
|
|||
if (ldt->size * LDT_ENTRY_SIZE > PAGE_SIZE)
|
||||
vfree(ldt->entries);
|
||||
else
|
||||
kfree(ldt->entries);
|
||||
free_page((unsigned long)ldt->entries);
|
||||
kfree(ldt);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <asm/hypervisor.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/x86_init.h>
|
||||
#include <asm/geode.h>
|
||||
|
||||
unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */
|
||||
EXPORT_SYMBOL(cpu_khz);
|
||||
|
@ -1013,15 +1014,17 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable);
|
|||
|
||||
static void __init check_system_tsc_reliable(void)
|
||||
{
|
||||
#ifdef CONFIG_MGEODE_LX
|
||||
/* RTSC counts during suspend */
|
||||
#if defined(CONFIG_MGEODEGX1) || defined(CONFIG_MGEODE_LX) || defined(CONFIG_X86_GENERIC)
|
||||
if (is_geode_lx()) {
|
||||
/* RTSC counts during suspend */
|
||||
#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);
|
||||
/* Geode_LX - the OLPC CPU has a very reliable TSC */
|
||||
if (res_low & RTSC_SUSP)
|
||||
tsc_clocksource_reliable = 1;
|
||||
rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
|
||||
/* Geode_LX - the OLPC CPU has a very reliable TSC */
|
||||
if (res_low & RTSC_SUSP)
|
||||
tsc_clocksource_reliable = 1;
|
||||
}
|
||||
#endif
|
||||
if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
|
||||
tsc_clocksource_reliable = 1;
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include <linux/audit.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
#include <asm/uaccess.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();
|
||||
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 = kzalloc(sizeof(*vm86), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -192,10 +192,11 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
|
|||
|
||||
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,
|
||||
(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. */
|
||||
if (hotpluggable && memblock_mark_hotplug(start, ma->length))
|
||||
|
|
|
@ -940,6 +940,7 @@ static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
|
|||
char *xbuf[XBUFSIZE];
|
||||
char *xoutbuf[XBUFSIZE];
|
||||
int ret = -ENOMEM;
|
||||
unsigned int ivsize = crypto_skcipher_ivsize(tfm);
|
||||
|
||||
if (testmgr_alloc_buf(xbuf))
|
||||
goto out_nobuf;
|
||||
|
@ -975,7 +976,7 @@ static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
|
|||
continue;
|
||||
|
||||
if (template[i].iv)
|
||||
memcpy(iv, template[i].iv, MAX_IVLEN);
|
||||
memcpy(iv, template[i].iv, ivsize);
|
||||
else
|
||||
memset(iv, 0, MAX_IVLEN);
|
||||
|
||||
|
@ -1051,7 +1052,7 @@ static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
|
|||
continue;
|
||||
|
||||
if (template[i].iv)
|
||||
memcpy(iv, template[i].iv, MAX_IVLEN);
|
||||
memcpy(iv, template[i].iv, ivsize);
|
||||
else
|
||||
memset(iv, 0, MAX_IVLEN);
|
||||
|
||||
|
|
|
@ -330,12 +330,14 @@ void zcomp_destroy(struct zcomp *comp)
|
|||
* allocate new zcomp and initialize it. return compressing
|
||||
* backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL)
|
||||
* 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 *comp;
|
||||
struct zcomp_backend *backend;
|
||||
int error;
|
||||
|
||||
backend = find_backend(compress);
|
||||
if (!backend)
|
||||
|
@ -347,12 +349,12 @@ struct zcomp *zcomp_create(const char *compress, int max_strm)
|
|||
|
||||
comp->backend = backend;
|
||||
if (max_strm > 1)
|
||||
zcomp_strm_multi_create(comp, max_strm);
|
||||
error = zcomp_strm_multi_create(comp, max_strm);
|
||||
else
|
||||
zcomp_strm_single_create(comp);
|
||||
if (!comp->stream) {
|
||||
error = zcomp_strm_single_create(comp);
|
||||
if (error) {
|
||||
kfree(comp);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
return comp;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
static DEFINE_SPINLOCK(clklock);
|
||||
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
config COMMON_CLK_HI6220
|
||||
bool "Hi6220 Clock Driver"
|
||||
depends on (ARCH_HISI || COMPILE_TEST) && MAILBOX
|
||||
depends on ARCH_HISI || COMPILE_TEST
|
||||
default ARCH_HISI
|
||||
help
|
||||
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.
|
||||
|
|
|
@ -7,4 +7,5 @@ obj-y += clk.o clkgate-separated.o clkdivider-hi6220.o
|
|||
obj-$(CONFIG_ARCH_HI3xxx) += clk-hi3620.o
|
||||
obj-$(CONFIG_ARCH_HIP04) += clk-hip04.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
|
||||
|
|
|
@ -716,6 +716,8 @@ static const char *const rk3188_critical_clocks[] __initconst = {
|
|||
"aclk_cpu",
|
||||
"aclk_peri",
|
||||
"hclk_peri",
|
||||
"pclk_cpu",
|
||||
"pclk_peri",
|
||||
};
|
||||
|
||||
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,
|
||||
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_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),
|
||||
&rk3066_cpuclk_data, 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);
|
||||
|
||||
|
@ -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",
|
||||
__func__);
|
||||
}
|
||||
|
||||
rockchip_clk_protect_critical(rk3188_critical_clocks,
|
||||
ARRAY_SIZE(rk3188_critical_clocks));
|
||||
}
|
||||
CLK_OF_DECLARE(rk3188a_cru, "rockchip,rk3188a-cru", rk3188a_clk_init);
|
||||
|
||||
|
|
|
@ -461,7 +461,7 @@ config CRYPTO_DEV_QCE
|
|||
|
||||
config CRYPTO_DEV_VMX
|
||||
bool "Support for VMX cryptographic acceleration instructions"
|
||||
depends on PPC64
|
||||
depends on PPC64 && VSX
|
||||
help
|
||||
Support for VMX cryptographic acceleration instructions.
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ static int sun4i_ss_opti_poll(struct ablkcipher_request *areq)
|
|||
sg_miter_next(&mo);
|
||||
oo = 0;
|
||||
}
|
||||
} while (mo.length > 0);
|
||||
} while (oleft > 0);
|
||||
|
||||
if (areq->info) {
|
||||
for (i = 0; i < 4 && i < ivsize / 4; i++) {
|
||||
|
|
|
@ -356,7 +356,7 @@ config GPIO_PXA
|
|||
|
||||
config GPIO_RCAR
|
||||
tristate "Renesas R-Car GPIO"
|
||||
depends on ARM && (ARCH_SHMOBILE || COMPILE_TEST)
|
||||
depends on ARCH_SHMOBILE || COMPILE_TEST
|
||||
select GPIOLIB_IRQCHIP
|
||||
help
|
||||
Say yes here to support GPIO on Renesas R-Car SoCs.
|
||||
|
|
|
@ -339,13 +339,15 @@ static int gpio_set_wake_irq(struct irq_data *d, u32 enable)
|
|||
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_type *ct;
|
||||
|
||||
gc = irq_alloc_generic_chip("gpio-mxc", 1, irq_base,
|
||||
port->base, handle_level_irq);
|
||||
if (!gc)
|
||||
return -ENOMEM;
|
||||
gc->private = port;
|
||||
|
||||
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_NOREQUEST, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 */
|
||||
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);
|
||||
|
||||
return 0;
|
||||
|
||||
out_irqdomain_remove:
|
||||
irq_domain_remove(port->domain);
|
||||
out_irqdesc_free:
|
||||
irq_free_descs(irq_base, 32);
|
||||
out_gpiochip_remove:
|
||||
|
|
|
@ -196,13 +196,16 @@ static int mxs_gpio_set_wake_irq(struct irq_data *d, unsigned int enable)
|
|||
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_type *ct;
|
||||
|
||||
gc = irq_alloc_generic_chip("gpio-mxs", 1, irq_base,
|
||||
port->base, handle_level_irq);
|
||||
if (!gc)
|
||||
return -ENOMEM;
|
||||
|
||||
gc->private = port;
|
||||
|
||||
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_NOREQUEST, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 */
|
||||
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 */
|
||||
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:
|
||||
bgpio_remove(&port->bgc);
|
||||
out_irqdomain_remove:
|
||||
irq_domain_remove(port->domain);
|
||||
out_irqdesc_free:
|
||||
irq_free_descs(irq_base, 32);
|
||||
return err;
|
||||
|
|
|
@ -1098,7 +1098,6 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
|
|||
} else {
|
||||
bank->chip.label = "gpio";
|
||||
bank->chip.base = gpio;
|
||||
gpio += 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;
|
||||
}
|
||||
|
||||
if (!bank->is_mpuio)
|
||||
gpio += bank->width;
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP1
|
||||
/*
|
||||
* 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);
|
||||
|
||||
ret = omap_gpio_chip_init(bank, irqc);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
pm_runtime_put_sync(bank->dev);
|
||||
pm_runtime_disable(bank->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
omap_gpio_show_rev(bank);
|
||||
|
||||
|
|
|
@ -706,4 +706,3 @@ module_exit(sx150x_exit);
|
|||
MODULE_AUTHOR("Gregory Bean <gbean@codeaurora.org>");
|
||||
MODULE_DESCRIPTION("Driver for Semtech SX150X I2C GPIO Expanders");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("i2c:sx150x");
|
||||
|
|
|
@ -1174,15 +1174,16 @@ EXPORT_SYMBOL_GPL(gpiod_is_active_low);
|
|||
* 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;
|
||||
bool value;
|
||||
int offset;
|
||||
int value;
|
||||
|
||||
chip = desc->chip;
|
||||
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);
|
||||
return value;
|
||||
}
|
||||
|
@ -1192,7 +1193,7 @@ static bool _gpiod_get_raw_value(const struct gpio_desc *desc)
|
|||
* @desc: gpio whose value will be returned
|
||||
*
|
||||
* 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
|
||||
* 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
|
||||
*
|
||||
* 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
|
||||
* 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);
|
||||
|
||||
value = _gpiod_get_raw_value(desc);
|
||||
if (value < 0)
|
||||
return value;
|
||||
|
||||
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
||||
value = !value;
|
||||
|
||||
|
@ -1548,7 +1552,7 @@ EXPORT_SYMBOL_GPL(gpiochip_unlock_as_irq);
|
|||
* @desc: gpio whose value will be returned
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
@ -1566,7 +1570,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_value_cansleep);
|
|||
* @desc: gpio whose value will be returned
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
@ -1579,6 +1583,9 @@ int gpiod_get_value_cansleep(const struct gpio_desc *desc)
|
|||
return 0;
|
||||
|
||||
value = _gpiod_get_raw_value(desc);
|
||||
if (value < 0)
|
||||
return value;
|
||||
|
||||
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
||||
value = !value;
|
||||
|
||||
|
|
|
@ -1140,8 +1140,8 @@ config SENSORS_NCT6775
|
|||
help
|
||||
If you say yes here you get support for the hardware monitoring
|
||||
functionality of the Nuvoton NCT6106D, NCT6775F, NCT6776F, NCT6779D,
|
||||
NCT6791D, NCT6792D and compatible Super-I/O chips. This driver
|
||||
replaces the w83627ehf driver for NCT6775F and NCT6776F.
|
||||
NCT6791D, NCT6792D, NCT6793D, and compatible Super-I/O chips. This
|
||||
driver replaces the w83627ehf driver for NCT6775F and NCT6776F.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nct6775.
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
* nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3
|
||||
* nct6791d 15 6 6 2+6 0xc800 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
|
||||
* the number of directly connectable temperature sensors (second value).
|
||||
|
@ -63,7 +64,7 @@
|
|||
|
||||
#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] */
|
||||
static const char * const nct6775_device_names[] = {
|
||||
|
@ -73,6 +74,17 @@ static const char * const nct6775_device_names[] = {
|
|||
"nct6779",
|
||||
"nct6791",
|
||||
"nct6792",
|
||||
"nct6793",
|
||||
};
|
||||
|
||||
static const char * const nct6775_sio_names[] __initconst = {
|
||||
"NCT6106D",
|
||||
"NCT6775F",
|
||||
"NCT6776D/F",
|
||||
"NCT6779D",
|
||||
"NCT6791D",
|
||||
"NCT6792D",
|
||||
"NCT6793D",
|
||||
};
|
||||
|
||||
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_NCT6791_ID 0xc800
|
||||
#define SIO_NCT6792_ID 0xc910
|
||||
#define SIO_NCT6793_ID 0xd120
|
||||
#define SIO_ID_MASK 0xFFF0
|
||||
|
||||
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 */
|
||||
|
||||
/* 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[] = {
|
||||
0, 1, 2, 3, 8, 21, 20, 16, /* in0.. in7 */
|
||||
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 */
|
||||
12, 9 }; /* intrusion0, intrusion1 */
|
||||
|
||||
/* NCT6792 specific data */
|
||||
/* NCT6792/NCT6793 specific data */
|
||||
|
||||
static const u16 NCT6792_REG_TEMP_MON[] = {
|
||||
0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
|
||||
|
@ -1056,6 +1073,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
|
|||
case nct6779:
|
||||
case nct6791:
|
||||
case nct6792:
|
||||
case nct6793:
|
||||
return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
|
||||
((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) ||
|
||||
reg == 0x402 ||
|
||||
|
@ -1407,6 +1425,7 @@ static void nct6775_update_pwm_limits(struct device *dev)
|
|||
case nct6779:
|
||||
case nct6791:
|
||||
case nct6792:
|
||||
case nct6793:
|
||||
reg = nct6775_read_value(data,
|
||||
data->REG_CRITICAL_PWM_ENABLE[i]);
|
||||
if (reg & data->CRITICAL_PWM_ENABLE_MASK)
|
||||
|
@ -2822,6 +2841,7 @@ store_auto_pwm(struct device *dev, struct device_attribute *attr,
|
|||
case nct6779:
|
||||
case nct6791:
|
||||
case nct6792:
|
||||
case nct6793:
|
||||
nct6775_write_value(data, data->REG_CRITICAL_PWM[nr],
|
||||
val);
|
||||
reg = nct6775_read_value(data,
|
||||
|
@ -3256,7 +3276,7 @@ nct6775_check_fan_inputs(struct nct6775_data *data)
|
|||
pwm4pin = false;
|
||||
pwm5pin = false;
|
||||
pwm6pin = false;
|
||||
} else { /* NCT6779D, NCT6791D, or NCT6792D */
|
||||
} else { /* NCT6779D, NCT6791D, NCT6792D, or NCT6793D */
|
||||
regval = superio_inb(sioreg, 0x1c);
|
||||
|
||||
fan3pin = !(regval & (1 << 5));
|
||||
|
@ -3269,7 +3289,8 @@ nct6775_check_fan_inputs(struct nct6775_data *data)
|
|||
|
||||
fan4min = fan4pin;
|
||||
|
||||
if (data->kind == nct6791 || data->kind == nct6792) {
|
||||
if (data->kind == nct6791 || data->kind == nct6792 ||
|
||||
data->kind == nct6793) {
|
||||
regval = superio_inb(sioreg, 0x2d);
|
||||
fan6pin = (regval & (1 << 1));
|
||||
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->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
|
||||
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[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
|
||||
data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
|
||||
data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
|
||||
data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
|
||||
data->REG_PWM[0] = NCT6775_REG_PWM;
|
||||
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->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
|
||||
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[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
|
||||
data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
|
||||
data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
|
||||
data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
|
||||
data->REG_PWM[0] = NCT6775_REG_PWM;
|
||||
data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
|
||||
|
@ -3643,6 +3664,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
break;
|
||||
case nct6791:
|
||||
case nct6792:
|
||||
case nct6793:
|
||||
data->in_num = 15;
|
||||
data->pwm_num = 6;
|
||||
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->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
|
||||
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[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
|
||||
data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
|
||||
data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
|
||||
data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
|
||||
data->REG_PWM[0] = NCT6775_REG_PWM;
|
||||
data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
|
||||
|
@ -3918,6 +3940,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
case nct6779:
|
||||
case nct6791:
|
||||
case nct6792:
|
||||
case nct6793:
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -3950,6 +3973,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
break;
|
||||
case nct6791:
|
||||
case nct6792:
|
||||
case nct6793:
|
||||
tmp |= 0x7e;
|
||||
break;
|
||||
}
|
||||
|
@ -4047,7 +4071,8 @@ static int __maybe_unused nct6775_resume(struct device *dev)
|
|||
if (reg != 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);
|
||||
|
||||
superio_exit(sioreg);
|
||||
|
@ -4106,15 +4131,6 @@ static struct platform_driver nct6775_driver = {
|
|||
.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 */
|
||||
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:
|
||||
sio_data->kind = nct6792;
|
||||
break;
|
||||
case SIO_NCT6793_ID:
|
||||
sio_data->kind = nct6793;
|
||||
break;
|
||||
default:
|
||||
if (val != 0xffff)
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
superio_exit(sioaddr);
|
||||
|
@ -4285,7 +4305,7 @@ static void __exit sensors_nct6775_exit(void)
|
|||
}
|
||||
|
||||
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_init(sensors_nct6775_init);
|
||||
|
|
|
@ -56,7 +56,6 @@ config INFINIBAND_ADDR_TRANS
|
|||
|
||||
source "drivers/infiniband/hw/mthca/Kconfig"
|
||||
source "drivers/infiniband/hw/qib/Kconfig"
|
||||
source "drivers/infiniband/hw/ehca/Kconfig"
|
||||
source "drivers/infiniband/hw/cxgb3/Kconfig"
|
||||
source "drivers/infiniband/hw/cxgb4/Kconfig"
|
||||
source "drivers/infiniband/hw/mlx4/Kconfig"
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
obj-$(CONFIG_INFINIBAND_MTHCA) += mthca/
|
||||
obj-$(CONFIG_INFINIBAND_QIB) += qib/
|
||||
obj-$(CONFIG_INFINIBAND_EHCA) += ehca/
|
||||
obj-$(CONFIG_INFINIBAND_CXGB3) += cxgb3/
|
||||
obj-$(CONFIG_INFINIBAND_CXGB4) += cxgb4/
|
||||
obj-$(CONFIG_MLX4_INFINIBAND) += mlx4/
|
||||
|
|
|
@ -349,6 +349,9 @@ static bool pinctrl_ready_for_gpio_range(unsigned gpio)
|
|||
struct pinctrl_gpio_range *range = NULL;
|
||||
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);
|
||||
|
||||
/* Loop over the pin controllers */
|
||||
|
|
|
@ -337,9 +337,9 @@ static int dc_pinctrl_probe(struct platform_device *pdev)
|
|||
pmap->dev = &pdev->dev;
|
||||
|
||||
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");
|
||||
return -EINVAL;
|
||||
return PTR_ERR(pmap->pctl);
|
||||
}
|
||||
|
||||
ret = dc_gpiochip_add(pmap, pdev->dev.of_node);
|
||||
|
|
|
@ -313,8 +313,7 @@ static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev,
|
|||
|
||||
/* See if this pctldev has this function */
|
||||
while (selector < nfuncs) {
|
||||
const char *fname = ops->get_function_name(pctldev,
|
||||
selector);
|
||||
const char *fname = ops->get_function_name(pctldev, selector);
|
||||
|
||||
if (!strcmp(function, fname))
|
||||
return selector;
|
||||
|
|
|
@ -723,9 +723,9 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev)
|
|||
#endif
|
||||
|
||||
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");
|
||||
return -ENODEV;
|
||||
return PTR_ERR(pctrl->pctrl);
|
||||
}
|
||||
|
||||
pctrl->chip = pm8xxx_gpio_template;
|
||||
|
|
|
@ -814,9 +814,9 @@ static int pm8xxx_mpp_probe(struct platform_device *pdev)
|
|||
#endif
|
||||
|
||||
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");
|
||||
return -ENODEV;
|
||||
return PTR_ERR(pctrl->pctrl);
|
||||
}
|
||||
|
||||
pctrl->chip = pm8xxx_mpp_template;
|
||||
|
|
|
@ -361,7 +361,7 @@ static inline void s3c24xx_demux_eint(struct irq_desc *desc,
|
|||
u32 offset, u32 range)
|
||||
{
|
||||
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;
|
||||
unsigned int pend, mask;
|
||||
|
||||
|
|
|
@ -126,6 +126,24 @@ static const struct dmi_system_id asus_quirks[] = {
|
|||
},
|
||||
.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,
|
||||
.ident = "ASUSTeK COMPUTER INC. X501U",
|
||||
|
|
|
@ -54,8 +54,9 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
|
|||
#define HPWMI_HARDWARE_QUERY 0x4
|
||||
#define HPWMI_WIRELESS_QUERY 0x5
|
||||
#define HPWMI_BIOS_QUERY 0x9
|
||||
#define HPWMI_FEATURE_QUERY 0xb
|
||||
#define HPWMI_HOTKEY_QUERY 0xc
|
||||
#define HPWMI_FEATURE_QUERY 0xd
|
||||
#define HPWMI_FEATURE2_QUERY 0xd
|
||||
#define HPWMI_WIRELESS2_QUERY 0x1b
|
||||
#define HPWMI_POSTCODEERROR_QUERY 0x2a
|
||||
|
||||
|
@ -295,25 +296,33 @@ static int hp_wmi_tablet_state(void)
|
|||
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 ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state,
|
||||
sizeof(state), sizeof(state));
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!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 query = 0x6e;
|
||||
int state = 0;
|
||||
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),
|
||||
0);
|
||||
return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO;
|
||||
}
|
||||
|
||||
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)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
|
@ -663,7 +672,7 @@ static int __init hp_wmi_input_setup(void)
|
|||
hp_wmi_tablet_state());
|
||||
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();
|
||||
|
||||
status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL);
|
||||
|
|
|
@ -938,7 +938,7 @@ static int toshiba_usb_sleep_music_get(struct toshiba_acpi_dev *dev, u32 *state)
|
|||
else if (result == TOS_NOT_SUPPORTED)
|
||||
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)
|
||||
|
@ -2398,11 +2398,9 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
error = toshiba_hotkey_event_type_get(dev, &events_type);
|
||||
if (error) {
|
||||
pr_err("Unable to query Hotkey Event Type\n");
|
||||
return error;
|
||||
}
|
||||
if (toshiba_hotkey_event_type_get(dev, &events_type))
|
||||
pr_notice("Unable to query Hotkey Event Type\n");
|
||||
|
||||
dev->hotkey_event_type = events_type;
|
||||
|
||||
dev->hotkey_dev = input_allocate_device();
|
||||
|
|
|
@ -194,34 +194,6 @@ static bool wmi_parse_guid(const u8 *src, u8 *dest)
|
|||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
char guid_string[37];
|
||||
|
||||
wmi_gtoa(g->guid, guid_string);
|
||||
|
||||
pr_info("%s:\n", guid_string);
|
||||
pr_info("%pUL:\n", g->guid);
|
||||
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("\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,
|
||||
char *buf)
|
||||
{
|
||||
char guid_string[37];
|
||||
struct wmi_block *wblock;
|
||||
|
||||
wblock = dev_get_drvdata(dev);
|
||||
|
@ -670,9 +637,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
|||
return strlen(buf);
|
||||
}
|
||||
|
||||
wmi_gtoa(wblock->gblock.guid, guid_string);
|
||||
|
||||
return sprintf(buf, "wmi:%s\n", guid_string);
|
||||
return sprintf(buf, "wmi:%pUL\n", wblock->gblock.guid);
|
||||
}
|
||||
static DEVICE_ATTR_RO(modalias);
|
||||
|
||||
|
@ -695,7 +660,7 @@ static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
if (!wblock)
|
||||
return -ENOMEM;
|
||||
|
||||
wmi_gtoa(wblock->gblock.guid, guid_string);
|
||||
sprintf(guid_string, "%pUL", wblock->gblock.guid);
|
||||
|
||||
strcpy(&env->buf[env->buflen - 1], "wmi:");
|
||||
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,
|
||||
struct wmi_block *wblock, acpi_handle handle)
|
||||
{
|
||||
char guid_string[37];
|
||||
|
||||
wblock->dev.class = &wmi_class;
|
||||
|
||||
wmi_gtoa(gblock->guid, guid_string);
|
||||
dev_set_name(&wblock->dev, "%s", guid_string);
|
||||
dev_set_name(&wblock->dev, "%pUL", gblock->guid);
|
||||
|
||||
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 wmi_block *wblock;
|
||||
struct list_head *p;
|
||||
char guid_string[37];
|
||||
|
||||
list_for_each(p, &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)
|
||||
wblock->handler(event, wblock->handler_data);
|
||||
if (debug_event) {
|
||||
wmi_gtoa(wblock->gblock.guid, guid_string);
|
||||
pr_info("DEBUG Event GUID: %s\n", guid_string);
|
||||
pr_info("DEBUG Event GUID: %pUL\n",
|
||||
wblock->gblock.guid);
|
||||
}
|
||||
|
||||
acpi_bus_generate_netlink_event(
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
#define TWL4030_MSTATEC_COMPLETE1 0x0b
|
||||
#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)
|
||||
* 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,
|
||||
NULL, "ti,twl4030-usb");
|
||||
if (phynode) {
|
||||
if (phynode)
|
||||
bci->transceiver = devm_usb_get_phy_by_node(
|
||||
bci->dev, phynode, &bci->usb_nb);
|
||||
if (IS_ERR(bci->transceiver) &&
|
||||
PTR_ERR(bci->transceiver) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable interrupts now. */
|
||||
|
|
|
@ -24,6 +24,8 @@ if STAGING_RDMA
|
|||
|
||||
source "drivers/staging/rdma/amso1100/Kconfig"
|
||||
|
||||
source "drivers/staging/rdma/ehca/Kconfig"
|
||||
|
||||
source "drivers/staging/rdma/hfi1/Kconfig"
|
||||
|
||||
source "drivers/staging/rdma/ipath/Kconfig"
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# Entries for RDMA_STAGING tree
|
||||
obj-$(CONFIG_INFINIBAND_AMSO1100) += amso1100/
|
||||
obj-$(CONFIG_INFINIBAND_EHCA) += ehca/
|
||||
obj-$(CONFIG_INFINIBAND_HFI1) += hfi1/
|
||||
obj-$(CONFIG_INFINIBAND_IPATH) += ipath/
|
||||
|
|
|
@ -2,7 +2,8 @@ config INFINIBAND_EHCA
|
|||
tristate "eHCA support"
|
||||
depends on IBMEBUS
|
||||
---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
|
||||
will be called ib_ehca.
|
4
drivers/staging/rdma/ehca/TODO
Normal file
4
drivers/staging/rdma/ehca/TODO
Normal 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
Loading…
Reference in a new issue