Merge "Merge android-4.4.165 (f34ff9e
) into msm-4.4"
This commit is contained in:
commit
0b402f74a0
186 changed files with 1321 additions and 511 deletions
27
Makefile
27
Makefile
|
@ -1,6 +1,6 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 4
|
PATCHLEVEL = 4
|
||||||
SUBLEVEL = 163
|
SUBLEVEL = 165
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Blurry Fish Butt
|
NAME = Blurry Fish Butt
|
||||||
|
|
||||||
|
@ -306,11 +306,6 @@ HOSTCXX = g++
|
||||||
HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
||||||
HOSTCXXFLAGS = -O2
|
HOSTCXXFLAGS = -O2
|
||||||
|
|
||||||
ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
|
|
||||||
HOSTCFLAGS += -Wno-unused-value -Wno-unused-parameter \
|
|
||||||
-Wno-missing-field-initializers -fno-delete-null-pointer-checks
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Decide whether to build built-in, modular, or both.
|
# Decide whether to build built-in, modular, or both.
|
||||||
# Normally, just do built-in.
|
# Normally, just do built-in.
|
||||||
|
|
||||||
|
@ -620,6 +615,22 @@ endif # $(dot-config)
|
||||||
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||||
all: vmlinux
|
all: vmlinux
|
||||||
|
|
||||||
|
ifeq ($(cc-name),clang)
|
||||||
|
ifneq ($(CROSS_COMPILE),)
|
||||||
|
CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%))
|
||||||
|
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
|
||||||
|
CLANG_PREFIX := --prefix=$(GCC_TOOLCHAIN_DIR)
|
||||||
|
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
||||||
|
endif
|
||||||
|
ifneq ($(GCC_TOOLCHAIN),)
|
||||||
|
CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||||
|
endif
|
||||||
|
KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
|
||||||
|
KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
|
||||||
|
KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
|
||||||
|
KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
||||||
|
endif
|
||||||
|
|
||||||
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
||||||
# values of the respective KBUILD_* variables
|
# values of the respective KBUILD_* variables
|
||||||
ARCH_CPPFLAGS :=
|
ARCH_CPPFLAGS :=
|
||||||
|
@ -742,11 +753,11 @@ KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
||||||
else
|
else
|
||||||
|
|
||||||
# These warnings generated too much noise in a regular build.
|
# These warnings generated too much noise in a regular build.
|
||||||
# Use make W=1 to enable them (see scripts/Makefile.build)
|
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
|
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
|
||||||
ifdef CONFIG_FRAME_POINTER
|
ifdef CONFIG_FRAME_POINTER
|
||||||
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
||||||
else
|
else
|
||||||
|
|
|
@ -72,9 +72,15 @@
|
||||||
})
|
})
|
||||||
|
|
||||||
#define user_termios_to_kernel_termios(k, u) \
|
#define user_termios_to_kernel_termios(k, u) \
|
||||||
copy_from_user(k, u, sizeof(struct termios))
|
copy_from_user(k, u, sizeof(struct termios2))
|
||||||
|
|
||||||
#define kernel_termios_to_user_termios(u, k) \
|
#define kernel_termios_to_user_termios(u, k) \
|
||||||
|
copy_to_user(u, k, sizeof(struct termios2))
|
||||||
|
|
||||||
|
#define user_termios_to_kernel_termios_1(k, u) \
|
||||||
|
copy_from_user(k, u, sizeof(struct termios))
|
||||||
|
|
||||||
|
#define kernel_termios_to_user_termios_1(u, k) \
|
||||||
copy_to_user(u, k, sizeof(struct termios))
|
copy_to_user(u, k, sizeof(struct termios))
|
||||||
|
|
||||||
#endif /* _ALPHA_TERMIOS_H */
|
#endif /* _ALPHA_TERMIOS_H */
|
||||||
|
|
|
@ -31,6 +31,11 @@
|
||||||
#define TCXONC _IO('t', 30)
|
#define TCXONC _IO('t', 30)
|
||||||
#define TCFLSH _IO('t', 31)
|
#define TCFLSH _IO('t', 31)
|
||||||
|
|
||||||
|
#define TCGETS2 _IOR('T', 42, struct termios2)
|
||||||
|
#define TCSETS2 _IOW('T', 43, struct termios2)
|
||||||
|
#define TCSETSW2 _IOW('T', 44, struct termios2)
|
||||||
|
#define TCSETSF2 _IOW('T', 45, struct termios2)
|
||||||
|
|
||||||
#define TIOCSWINSZ _IOW('t', 103, struct winsize)
|
#define TIOCSWINSZ _IOW('t', 103, struct winsize)
|
||||||
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
||||||
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
||||||
|
|
|
@ -25,6 +25,19 @@ struct termios {
|
||||||
speed_t c_ospeed; /* output speed */
|
speed_t c_ospeed; /* output speed */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Alpha has identical termios and termios2 */
|
||||||
|
|
||||||
|
struct termios2 {
|
||||||
|
tcflag_t c_iflag; /* input mode flags */
|
||||||
|
tcflag_t c_oflag; /* output mode flags */
|
||||||
|
tcflag_t c_cflag; /* control mode flags */
|
||||||
|
tcflag_t c_lflag; /* local mode flags */
|
||||||
|
cc_t c_cc[NCCS]; /* control characters */
|
||||||
|
cc_t c_line; /* line discipline (== c_cc[19]) */
|
||||||
|
speed_t c_ispeed; /* input speed */
|
||||||
|
speed_t c_ospeed; /* output speed */
|
||||||
|
};
|
||||||
|
|
||||||
/* Alpha has matching termios and ktermios */
|
/* Alpha has matching termios and ktermios */
|
||||||
|
|
||||||
struct ktermios {
|
struct ktermios {
|
||||||
|
@ -147,6 +160,7 @@ struct ktermios {
|
||||||
#define B3000000 00034
|
#define B3000000 00034
|
||||||
#define B3500000 00035
|
#define B3500000 00035
|
||||||
#define B4000000 00036
|
#define B4000000 00036
|
||||||
|
#define BOTHER 00037
|
||||||
|
|
||||||
#define CSIZE 00001400
|
#define CSIZE 00001400
|
||||||
#define CS5 00000000
|
#define CS5 00000000
|
||||||
|
@ -164,6 +178,9 @@ struct ktermios {
|
||||||
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
||||||
#define CRTSCTS 020000000000 /* flow control */
|
#define CRTSCTS 020000000000 /* flow control */
|
||||||
|
|
||||||
|
#define CIBAUD 07600000
|
||||||
|
#define IBSHIFT 16
|
||||||
|
|
||||||
/* c_lflag bits */
|
/* c_lflag bits */
|
||||||
#define ISIG 0x00000080
|
#define ISIG 0x00000080
|
||||||
#define ICANON 0x00000100
|
#define ICANON 0x00000100
|
||||||
|
|
|
@ -249,7 +249,7 @@
|
||||||
|
|
||||||
sysmgr: sysmgr@ffd12000 {
|
sysmgr: sysmgr@ffd12000 {
|
||||||
compatible = "altr,sys-mgr", "syscon";
|
compatible = "altr,sys-mgr", "syscon";
|
||||||
reg = <0xffd12000 0x1000>;
|
reg = <0xffd12000 0x228>;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Local timer */
|
/* Local timer */
|
||||||
|
|
|
@ -86,6 +86,7 @@ static inline unsigned long __percpu_##op(void *ptr, \
|
||||||
: [val] "Ir" (val)); \
|
: [val] "Ir" (val)); \
|
||||||
break; \
|
break; \
|
||||||
default: \
|
default: \
|
||||||
|
ret = 0; \
|
||||||
BUILD_BUG(); \
|
BUILD_BUG(); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
@ -115,6 +116,7 @@ static inline unsigned long __percpu_read(void *ptr, int size)
|
||||||
ret = ACCESS_ONCE(*(u64 *)ptr);
|
ret = ACCESS_ONCE(*(u64 *)ptr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
ret = 0;
|
||||||
BUILD_BUG();
|
BUILD_BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,6 +186,7 @@ static inline unsigned long __percpu_xchg(void *ptr, unsigned long val,
|
||||||
: [val] "r" (val));
|
: [val] "r" (val));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
ret = 0;
|
||||||
BUILD_BUG();
|
BUILD_BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ void (*cvmx_override_pko_queue_priority) (int pko_port,
|
||||||
void (*cvmx_override_ipd_port_setup) (int ipd_port);
|
void (*cvmx_override_ipd_port_setup) (int ipd_port);
|
||||||
|
|
||||||
/* Port count per interface */
|
/* Port count per interface */
|
||||||
static int interface_port_count[5];
|
static int interface_port_count[9];
|
||||||
|
|
||||||
/* Port last configured link info index by IPD/PKO port */
|
/* Port last configured link info index by IPD/PKO port */
|
||||||
static cvmx_helper_link_info_t
|
static cvmx_helper_link_info_t
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#define MIPS_CPU_IRQ_BASE 56
|
#define MIPS_CPU_IRQ_BASE 56
|
||||||
|
|
||||||
#define LOONGSON_UART_IRQ (MIPS_CPU_IRQ_BASE + 2) /* UART */
|
#define LOONGSON_UART_IRQ (MIPS_CPU_IRQ_BASE + 2) /* UART */
|
||||||
#define LOONGSON_HT1_IRQ (MIPS_CPU_IRQ_BASE + 3) /* HT1 */
|
#define LOONGSON_BRIDGE_IRQ (MIPS_CPU_IRQ_BASE + 3) /* CASCADE */
|
||||||
#define LOONGSON_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7) /* CPU Timer */
|
#define LOONGSON_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7) /* CPU Timer */
|
||||||
|
|
||||||
#define LOONGSON_HT1_CFG_BASE loongson_sysconf.ht_control_base
|
#define LOONGSON_HT1_CFG_BASE loongson_sysconf.ht_control_base
|
||||||
|
|
|
@ -34,6 +34,9 @@ static void crash_shutdown_secondary(void *passed_regs)
|
||||||
if (!cpu_online(cpu))
|
if (!cpu_online(cpu))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* We won't be sent IPIs any more. */
|
||||||
|
set_cpu_online(cpu, false);
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
if (!cpumask_test_cpu(cpu, &cpus_in_crash))
|
if (!cpumask_test_cpu(cpu, &cpus_in_crash))
|
||||||
crash_save_cpu(regs, cpu);
|
crash_save_cpu(regs, cpu);
|
||||||
|
|
|
@ -95,6 +95,9 @@ machine_kexec(struct kimage *image)
|
||||||
*ptr = (unsigned long) phys_to_virt(*ptr);
|
*ptr = (unsigned long) phys_to_virt(*ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mark offline BEFORE disabling local irq. */
|
||||||
|
set_cpu_online(smp_processor_id(), false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we do not want to be bothered.
|
* we do not want to be bothered.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -42,51 +42,8 @@ void mach_irq_dispatch(unsigned int pending)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqaction cascade_irqaction = {
|
static inline void mask_loongson_irq(struct irq_data *d) { }
|
||||||
.handler = no_action,
|
static inline void unmask_loongson_irq(struct irq_data *d) { }
|
||||||
.flags = IRQF_NO_SUSPEND,
|
|
||||||
.name = "cascade",
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void mask_loongson_irq(struct irq_data *d)
|
|
||||||
{
|
|
||||||
clear_c0_status(0x100 << (d->irq - MIPS_CPU_IRQ_BASE));
|
|
||||||
irq_disable_hazard();
|
|
||||||
|
|
||||||
/* Workaround: UART IRQ may deliver to any core */
|
|
||||||
if (d->irq == LOONGSON_UART_IRQ) {
|
|
||||||
int cpu = smp_processor_id();
|
|
||||||
int node_id = cpu_logical_map(cpu) / loongson_sysconf.cores_per_node;
|
|
||||||
int core_id = cpu_logical_map(cpu) % loongson_sysconf.cores_per_node;
|
|
||||||
u64 intenclr_addr = smp_group[node_id] |
|
|
||||||
(u64)(&LOONGSON_INT_ROUTER_INTENCLR);
|
|
||||||
u64 introuter_lpc_addr = smp_group[node_id] |
|
|
||||||
(u64)(&LOONGSON_INT_ROUTER_LPC);
|
|
||||||
|
|
||||||
*(volatile u32 *)intenclr_addr = 1 << 10;
|
|
||||||
*(volatile u8 *)introuter_lpc_addr = 0x10 + (1<<core_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void unmask_loongson_irq(struct irq_data *d)
|
|
||||||
{
|
|
||||||
/* Workaround: UART IRQ may deliver to any core */
|
|
||||||
if (d->irq == LOONGSON_UART_IRQ) {
|
|
||||||
int cpu = smp_processor_id();
|
|
||||||
int node_id = cpu_logical_map(cpu) / loongson_sysconf.cores_per_node;
|
|
||||||
int core_id = cpu_logical_map(cpu) % loongson_sysconf.cores_per_node;
|
|
||||||
u64 intenset_addr = smp_group[node_id] |
|
|
||||||
(u64)(&LOONGSON_INT_ROUTER_INTENSET);
|
|
||||||
u64 introuter_lpc_addr = smp_group[node_id] |
|
|
||||||
(u64)(&LOONGSON_INT_ROUTER_LPC);
|
|
||||||
|
|
||||||
*(volatile u32 *)intenset_addr = 1 << 10;
|
|
||||||
*(volatile u8 *)introuter_lpc_addr = 0x10 + (1<<core_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
set_c0_status(0x100 << (d->irq - MIPS_CPU_IRQ_BASE));
|
|
||||||
irq_enable_hazard();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For MIPS IRQs which shared by all cores */
|
/* For MIPS IRQs which shared by all cores */
|
||||||
static struct irq_chip loongson_irq_chip = {
|
static struct irq_chip loongson_irq_chip = {
|
||||||
|
@ -124,12 +81,11 @@ void __init mach_init_irq(void)
|
||||||
mips_cpu_irq_init();
|
mips_cpu_irq_init();
|
||||||
init_i8259_irqs();
|
init_i8259_irqs();
|
||||||
irq_set_chip_and_handler(LOONGSON_UART_IRQ,
|
irq_set_chip_and_handler(LOONGSON_UART_IRQ,
|
||||||
&loongson_irq_chip, handle_level_irq);
|
&loongson_irq_chip, handle_percpu_irq);
|
||||||
|
irq_set_chip_and_handler(LOONGSON_BRIDGE_IRQ,
|
||||||
|
&loongson_irq_chip, handle_percpu_irq);
|
||||||
|
|
||||||
/* setup HT1 irq */
|
set_c0_status(STATUSF_IP2 | STATUSF_IP3 | STATUSF_IP6);
|
||||||
setup_irq(LOONGSON_HT1_IRQ, &cascade_irqaction);
|
|
||||||
|
|
||||||
set_c0_status(STATUSF_IP2 | STATUSF_IP6);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
|
|
@ -185,7 +185,7 @@
|
||||||
bv,n 0(%r3)
|
bv,n 0(%r3)
|
||||||
nop
|
nop
|
||||||
.word 0 /* checksum (will be patched) */
|
.word 0 /* checksum (will be patched) */
|
||||||
.word PA(os_hpmc) /* address of handler */
|
.word 0 /* address of handler */
|
||||||
.word 0 /* length of handler */
|
.word 0 /* length of handler */
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
|
@ -829,7 +829,8 @@ void __init initialize_ivt(const void *iva)
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
*ivap++ = 0;
|
*ivap++ = 0;
|
||||||
|
|
||||||
/* Compute Checksum for HPMC handler */
|
/* Setup IVA and compute checksum for HPMC handler */
|
||||||
|
ivap[6] = (u32)__pa(os_hpmc);
|
||||||
length = os_hpmc_size;
|
length = os_hpmc_size;
|
||||||
ivap[7] = length;
|
ivap[7] = length;
|
||||||
|
|
||||||
|
|
|
@ -491,12 +491,8 @@ static void __init map_pages(unsigned long start_vaddr,
|
||||||
pte = pte_mkhuge(pte);
|
pte = pte_mkhuge(pte);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (address >= end_paddr) {
|
if (address >= end_paddr)
|
||||||
if (force)
|
|
||||||
break;
|
break;
|
||||||
else
|
|
||||||
pte_val(pte) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_pte(pg_table, pte);
|
set_pte(pg_table, pte);
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,10 @@ p_end: .long _end
|
||||||
p_pstack: .long _platform_stack_top
|
p_pstack: .long _platform_stack_top
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.weak _zimage_start
|
|
||||||
.globl _zimage_start
|
.globl _zimage_start
|
||||||
|
/* Clang appears to require the .weak directive to be after the symbol
|
||||||
|
* is defined. See https://bugs.llvm.org/show_bug.cgi?id=38921 */
|
||||||
|
.weak _zimage_start
|
||||||
_zimage_start:
|
_zimage_start:
|
||||||
.globl _zimage_start_lib
|
.globl _zimage_start_lib
|
||||||
_zimage_start_lib:
|
_zimage_start_lib:
|
||||||
|
|
|
@ -392,7 +392,14 @@ extern struct bus_type mpic_subsys;
|
||||||
#define MPIC_REGSET_TSI108 MPIC_REGSET(1) /* Tsi108/109 PIC */
|
#define MPIC_REGSET_TSI108 MPIC_REGSET(1) /* Tsi108/109 PIC */
|
||||||
|
|
||||||
/* Get the version of primary MPIC */
|
/* Get the version of primary MPIC */
|
||||||
|
#ifdef CONFIG_MPIC
|
||||||
extern u32 fsl_mpic_primary_get_version(void);
|
extern u32 fsl_mpic_primary_get_version(void);
|
||||||
|
#else
|
||||||
|
static inline u32 fsl_mpic_primary_get_version(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Allocate the controller structure and setup the linux irq descs
|
/* Allocate the controller structure and setup the linux irq descs
|
||||||
* for the range if interrupts passed in. No HW initialization is
|
* for the range if interrupts passed in. No HW initialization is
|
||||||
|
|
|
@ -487,6 +487,9 @@ static void setup_page_sizes(void)
|
||||||
for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
|
for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
|
||||||
struct mmu_psize_def *def = &mmu_psize_defs[psize];
|
struct mmu_psize_def *def = &mmu_psize_defs[psize];
|
||||||
|
|
||||||
|
if (!def->shift)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (tlb1ps & (1U << (def->shift - 10))) {
|
if (tlb1ps & (1U << (def->shift - 10))) {
|
||||||
def->flags |= MMU_PAGE_SIZE_DIRECT;
|
def->flags |= MMU_PAGE_SIZE_DIRECT;
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ GCOV_PROFILE := n
|
||||||
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
||||||
|
|
||||||
# link rule for the .so file, .lds has to be first
|
# link rule for the .so file, .lds has to be first
|
||||||
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32)
|
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE
|
||||||
$(call if_changed,vdso32ld)
|
$(call if_changed,vdso32ld)
|
||||||
|
|
||||||
# strip rule for the .so file
|
# strip rule for the .so file
|
||||||
|
@ -38,12 +38,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
# assembly rules for the .S files
|
# assembly rules for the .S files
|
||||||
$(obj-vdso32): %.o: %.S
|
$(obj-vdso32): %.o: %.S FORCE
|
||||||
$(call if_changed_dep,vdso32as)
|
$(call if_changed_dep,vdso32as)
|
||||||
|
|
||||||
# actual build commands
|
# actual build commands
|
||||||
quiet_cmd_vdso32ld = VDSO32L $@
|
quiet_cmd_vdso32ld = VDSO32L $@
|
||||||
cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
|
||||||
quiet_cmd_vdso32as = VDSO32A $@
|
quiet_cmd_vdso32as = VDSO32A $@
|
||||||
cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
|
cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ GCOV_PROFILE := n
|
||||||
$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
|
$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
|
||||||
|
|
||||||
# link rule for the .so file, .lds has to be first
|
# link rule for the .so file, .lds has to be first
|
||||||
$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64)
|
$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE
|
||||||
$(call if_changed,vdso64ld)
|
$(call if_changed,vdso64ld)
|
||||||
|
|
||||||
# strip rule for the .so file
|
# strip rule for the .so file
|
||||||
|
@ -38,12 +38,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
# assembly rules for the .S files
|
# assembly rules for the .S files
|
||||||
$(obj-vdso64): %.o: %.S
|
$(obj-vdso64): %.o: %.S FORCE
|
||||||
$(call if_changed_dep,vdso64as)
|
$(call if_changed_dep,vdso64as)
|
||||||
|
|
||||||
# actual build commands
|
# actual build commands
|
||||||
quiet_cmd_vdso64ld = VDSO64L $@
|
quiet_cmd_vdso64ld = VDSO64L $@
|
||||||
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
|
||||||
quiet_cmd_vdso64as = VDSO64A $@
|
quiet_cmd_vdso64as = VDSO64A $@
|
||||||
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ int __node_distance(int a, int b)
|
||||||
{
|
{
|
||||||
return mode->distance ? mode->distance(a, b) : 0;
|
return mode->distance ? mode->distance(a, b) : 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(__node_distance);
|
||||||
|
|
||||||
int numa_debug_enabled;
|
int numa_debug_enabled;
|
||||||
|
|
||||||
|
|
|
@ -926,6 +926,8 @@ static void read_in_all_counters(struct cpu_hw_events *cpuc)
|
||||||
sparc_perf_event_update(cp, &cp->hw,
|
sparc_perf_event_update(cp, &cp->hw,
|
||||||
cpuc->current_idx[i]);
|
cpuc->current_idx[i]);
|
||||||
cpuc->current_idx[i] = PIC_NO_INDEX;
|
cpuc->current_idx[i] = PIC_NO_INDEX;
|
||||||
|
if (cp->hw.state & PERF_HES_STOPPED)
|
||||||
|
cp->hw.state |= PERF_HES_ARCH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -958,10 +960,12 @@ static void calculate_single_pcr(struct cpu_hw_events *cpuc)
|
||||||
|
|
||||||
enc = perf_event_get_enc(cpuc->events[i]);
|
enc = perf_event_get_enc(cpuc->events[i]);
|
||||||
cpuc->pcr[0] &= ~mask_for_index(idx);
|
cpuc->pcr[0] &= ~mask_for_index(idx);
|
||||||
if (hwc->state & PERF_HES_STOPPED)
|
if (hwc->state & PERF_HES_ARCH) {
|
||||||
cpuc->pcr[0] |= nop_for_index(idx);
|
cpuc->pcr[0] |= nop_for_index(idx);
|
||||||
else
|
} else {
|
||||||
cpuc->pcr[0] |= event_encoding(enc, idx);
|
cpuc->pcr[0] |= event_encoding(enc, idx);
|
||||||
|
hwc->state = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
|
cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
|
||||||
|
@ -987,6 +991,9 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)
|
||||||
|
|
||||||
cpuc->current_idx[i] = idx;
|
cpuc->current_idx[i] = idx;
|
||||||
|
|
||||||
|
if (cp->hw.state & PERF_HES_ARCH)
|
||||||
|
continue;
|
||||||
|
|
||||||
sparc_pmu_start(cp, PERF_EF_RELOAD);
|
sparc_pmu_start(cp, PERF_EF_RELOAD);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
@ -1078,6 +1085,8 @@ static void sparc_pmu_start(struct perf_event *event, int flags)
|
||||||
event->hw.state = 0;
|
event->hw.state = 0;
|
||||||
|
|
||||||
sparc_pmu_enable_event(cpuc, &event->hw, idx);
|
sparc_pmu_enable_event(cpuc, &event->hw, idx);
|
||||||
|
|
||||||
|
perf_event_update_userpage(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sparc_pmu_stop(struct perf_event *event, int flags)
|
static void sparc_pmu_stop(struct perf_event *event, int flags)
|
||||||
|
@ -1370,9 +1379,9 @@ static int sparc_pmu_add(struct perf_event *event, int ef_flags)
|
||||||
cpuc->events[n0] = event->hw.event_base;
|
cpuc->events[n0] = event->hw.event_base;
|
||||||
cpuc->current_idx[n0] = PIC_NO_INDEX;
|
cpuc->current_idx[n0] = PIC_NO_INDEX;
|
||||||
|
|
||||||
event->hw.state = PERF_HES_UPTODATE;
|
event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
|
||||||
if (!(ef_flags & PERF_EF_START))
|
if (!(ef_flags & PERF_EF_START))
|
||||||
event->hw.state |= PERF_HES_STOPPED;
|
event->hw.state |= PERF_HES_ARCH;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If group events scheduling transaction was started,
|
* If group events scheduling transaction was started,
|
||||||
|
|
|
@ -586,6 +586,9 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
||||||
}
|
}
|
||||||
longjmp(*switch_buf, 1);
|
longjmp(*switch_buf, 1);
|
||||||
|
|
||||||
|
/* unreachable */
|
||||||
|
printk(UM_KERN_ERR "impossible long jump!");
|
||||||
|
fatal_sigsegv();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,6 @@ config X86
|
||||||
select ARCH_USE_BUILTIN_BSWAP
|
select ARCH_USE_BUILTIN_BSWAP
|
||||||
select ARCH_USE_CMPXCHG_LOCKREF if X86_64
|
select ARCH_USE_CMPXCHG_LOCKREF if X86_64
|
||||||
select ARCH_USE_QUEUED_RWLOCKS
|
select ARCH_USE_QUEUED_RWLOCKS
|
||||||
select ARCH_USE_QUEUED_SPINLOCKS
|
|
||||||
select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
|
select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
|
||||||
select ARCH_WANTS_DYNAMIC_TASK_STRUCT
|
select ARCH_WANTS_DYNAMIC_TASK_STRUCT
|
||||||
select ARCH_WANT_FRAME_POINTERS
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
|
#include <asm/asm.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/archrandom.h>
|
#include <asm/archrandom.h>
|
||||||
#include <asm/e820.h>
|
#include <asm/e820.h>
|
||||||
|
|
|
@ -391,6 +391,13 @@ int main(int argc, char ** argv)
|
||||||
die("Unable to mmap '%s': %m", argv[2]);
|
die("Unable to mmap '%s': %m", argv[2]);
|
||||||
/* Number of 16-byte paragraphs, including space for a 4-byte CRC */
|
/* Number of 16-byte paragraphs, including space for a 4-byte CRC */
|
||||||
sys_size = (sz + 15 + 4) / 16;
|
sys_size = (sz + 15 + 4) / 16;
|
||||||
|
#ifdef CONFIG_EFI_STUB
|
||||||
|
/*
|
||||||
|
* COFF requires minimum 32-byte alignment of sections, and
|
||||||
|
* adding a signature is problematic without that alignment.
|
||||||
|
*/
|
||||||
|
sys_size = (sys_size + 1) & ~1;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Patch the setup code with the appropriate size parameters */
|
/* Patch the setup code with the appropriate size parameters */
|
||||||
buf[0x1f1] = setup_sectors-1;
|
buf[0x1f1] = setup_sectors-1;
|
||||||
|
|
|
@ -30,6 +30,11 @@ static __init int set_corruption_check(char *arg)
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
pr_err("memory_corruption_check config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = kstrtoul(arg, 10, &val);
|
ret = kstrtoul(arg, 10, &val);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -44,6 +49,11 @@ static __init int set_corruption_check_period(char *arg)
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
pr_err("memory_corruption_check_period config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = kstrtoul(arg, 10, &val);
|
ret = kstrtoul(arg, 10, &val);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -58,6 +68,11 @@ static __init int set_corruption_check_size(char *arg)
|
||||||
char *end;
|
char *end;
|
||||||
unsigned size;
|
unsigned size;
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
pr_err("memory_corruption_check_size config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
size = memparse(arg, &end);
|
size = memparse(arg, &end);
|
||||||
|
|
||||||
if (*end == '\0')
|
if (*end == '\0')
|
||||||
|
|
|
@ -294,7 +294,6 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
||||||
* thread's fpu state, reconstruct fxstate from the fsave
|
* thread's fpu state, reconstruct fxstate from the fsave
|
||||||
* header. Sanitize the copied state etc.
|
* header. Sanitize the copied state etc.
|
||||||
*/
|
*/
|
||||||
struct fpu *fpu = &tsk->thread.fpu;
|
|
||||||
struct user_i387_ia32_struct env;
|
struct user_i387_ia32_struct env;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/atomic.h>
|
||||||
|
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@
|
||||||
|
|
||||||
static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
|
static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
|
||||||
static DEFINE_PER_CPU(char *, irq_name);
|
static DEFINE_PER_CPU(char *, irq_name);
|
||||||
|
static DEFINE_PER_CPU(atomic_t, xen_qlock_wait_nest);
|
||||||
static bool xen_pvspin = true;
|
static bool xen_pvspin = true;
|
||||||
|
|
||||||
#ifdef CONFIG_QUEUED_SPINLOCKS
|
#ifdef CONFIG_QUEUED_SPINLOCKS
|
||||||
|
@ -42,35 +44,26 @@ static void xen_qlock_kick(int cpu)
|
||||||
static void xen_qlock_wait(u8 *byte, u8 val)
|
static void xen_qlock_wait(u8 *byte, u8 val)
|
||||||
{
|
{
|
||||||
int irq = __this_cpu_read(lock_kicker_irq);
|
int irq = __this_cpu_read(lock_kicker_irq);
|
||||||
|
atomic_t *nest_cnt = this_cpu_ptr(&xen_qlock_wait_nest);
|
||||||
|
|
||||||
/* If kicker interrupts not initialized yet, just spin */
|
/* If kicker interrupts not initialized yet, just spin */
|
||||||
if (irq == -1)
|
if (irq == -1 || in_nmi())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* clear pending */
|
/* Detect reentry. */
|
||||||
|
atomic_inc(nest_cnt);
|
||||||
|
|
||||||
|
/* If irq pending already and no nested call clear it. */
|
||||||
|
if (atomic_read(nest_cnt) == 1 && xen_test_irq_pending(irq)) {
|
||||||
xen_clear_irq_pending(irq);
|
xen_clear_irq_pending(irq);
|
||||||
barrier();
|
} else if (READ_ONCE(*byte) == val) {
|
||||||
|
/* Block until irq becomes pending (or a spurious wakeup) */
|
||||||
/*
|
|
||||||
* We check the byte value after clearing pending IRQ to make sure
|
|
||||||
* that we won't miss a wakeup event because of the clearing.
|
|
||||||
*
|
|
||||||
* The sync_clear_bit() call in xen_clear_irq_pending() is atomic.
|
|
||||||
* So it is effectively a memory barrier for x86.
|
|
||||||
*/
|
|
||||||
if (READ_ONCE(*byte) != val)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If an interrupt happens here, it will leave the wakeup irq
|
|
||||||
* pending, which will cause xen_poll_irq() to return
|
|
||||||
* immediately.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Block until irq becomes pending (or perhaps a spurious wakeup) */
|
|
||||||
xen_poll_irq(irq);
|
xen_poll_irq(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
atomic_dec(nest_cnt);
|
||||||
|
}
|
||||||
|
|
||||||
#else /* CONFIG_QUEUED_SPINLOCKS */
|
#else /* CONFIG_QUEUED_SPINLOCKS */
|
||||||
|
|
||||||
enum xen_contention_stat {
|
enum xen_contention_stat {
|
||||||
|
|
|
@ -31,7 +31,7 @@ $(bootdir-y): $(addprefix $(obj)/,$(subdir-y)) \
|
||||||
$(addprefix $(obj)/,$(host-progs))
|
$(addprefix $(obj)/,$(host-progs))
|
||||||
$(Q)$(MAKE) $(build)=$(obj)/$@ $(MAKECMDGOALS)
|
$(Q)$(MAKE) $(build)=$(obj)/$@ $(MAKECMDGOALS)
|
||||||
|
|
||||||
OBJCOPYFLAGS = --strip-all -R .comment -R .note.gnu.build-id -O binary
|
OBJCOPYFLAGS = --strip-all -R .comment -R .notes -O binary
|
||||||
|
|
||||||
vmlinux.bin: vmlinux FORCE
|
vmlinux.bin: vmlinux FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
|
@ -24,7 +24,11 @@
|
||||||
# error Linux requires the Xtensa Windowed Registers Option.
|
# error Linux requires the Xtensa Windowed Registers Option.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ARCH_SLAB_MINALIGN XCHAL_DATA_WIDTH
|
/* Xtensa ABI requires stack alignment to be at least 16 */
|
||||||
|
|
||||||
|
#define STACK_ALIGN (XCHAL_DATA_WIDTH > 16 ? XCHAL_DATA_WIDTH : 16)
|
||||||
|
|
||||||
|
#define ARCH_SLAB_MINALIGN STACK_ALIGN
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* User space process size: 1 GB.
|
* User space process size: 1 GB.
|
||||||
|
|
|
@ -88,9 +88,12 @@ _SetupMMU:
|
||||||
initialize_mmu
|
initialize_mmu
|
||||||
#if defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
|
#if defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
|
||||||
rsr a2, excsave1
|
rsr a2, excsave1
|
||||||
movi a3, 0x08000000
|
movi a3, XCHAL_KSEG_PADDR
|
||||||
|
bltu a2, a3, 1f
|
||||||
|
sub a2, a2, a3
|
||||||
|
movi a3, XCHAL_KSEG_SIZE
|
||||||
bgeu a2, a3, 1f
|
bgeu a2, a3, 1f
|
||||||
movi a3, 0xd0000000
|
movi a3, XCHAL_KSEG_CACHED_VADDR
|
||||||
add a2, a2, a3
|
add a2, a2, a3
|
||||||
wsr a2, excsave1
|
wsr a2, excsave1
|
||||||
1:
|
1:
|
||||||
|
|
|
@ -110,6 +110,7 @@ SECTIONS
|
||||||
.fixup : { *(.fixup) }
|
.fixup : { *(.fixup) }
|
||||||
|
|
||||||
EXCEPTION_TABLE(16)
|
EXCEPTION_TABLE(16)
|
||||||
|
NOTES
|
||||||
/* Data section */
|
/* Data section */
|
||||||
|
|
||||||
_sdata = .;
|
_sdata = .;
|
||||||
|
|
|
@ -132,7 +132,12 @@ static inline int get_index128(be128 *block)
|
||||||
return x + ffz(val);
|
return x + ffz(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
return x;
|
/*
|
||||||
|
* If we get here, then x == 128 and we are incrementing the counter
|
||||||
|
* from all ones to all zeros. This means we must return index 127, i.e.
|
||||||
|
* the one corresponding to key2*{ 1,...,1 }.
|
||||||
|
*/
|
||||||
|
return 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int crypt(struct blkcipher_desc *d,
|
static int crypt(struct blkcipher_desc *d,
|
||||||
|
|
|
@ -235,9 +235,11 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = {
|
||||||
{ "INT33FC", },
|
{ "INT33FC", },
|
||||||
|
|
||||||
/* Braswell LPSS devices */
|
/* Braswell LPSS devices */
|
||||||
|
{ "80862286", LPSS_ADDR(lpss_dma_desc) },
|
||||||
{ "80862288", LPSS_ADDR(bsw_pwm_dev_desc) },
|
{ "80862288", LPSS_ADDR(bsw_pwm_dev_desc) },
|
||||||
{ "8086228A", LPSS_ADDR(bsw_uart_dev_desc) },
|
{ "8086228A", LPSS_ADDR(bsw_uart_dev_desc) },
|
||||||
{ "8086228E", LPSS_ADDR(bsw_spi_dev_desc) },
|
{ "8086228E", LPSS_ADDR(bsw_spi_dev_desc) },
|
||||||
|
{ "808622C0", LPSS_ADDR(lpss_dma_desc) },
|
||||||
{ "808622C1", LPSS_ADDR(bsw_i2c_dev_desc) },
|
{ "808622C1", LPSS_ADDR(bsw_i2c_dev_desc) },
|
||||||
|
|
||||||
/* Broadwell LPSS devices */
|
/* Broadwell LPSS devices */
|
||||||
|
|
|
@ -29,6 +29,7 @@ static const struct acpi_device_id forbidden_id_list[] = {
|
||||||
{"PNP0200", 0}, /* AT DMA Controller */
|
{"PNP0200", 0}, /* AT DMA Controller */
|
||||||
{"ACPI0009", 0}, /* IOxAPIC */
|
{"ACPI0009", 0}, /* IOxAPIC */
|
||||||
{"ACPI000A", 0}, /* IOAPIC */
|
{"ACPI000A", 0}, /* IOAPIC */
|
||||||
|
{"SMB0001", 0}, /* ACPI SMBUS virtual device */
|
||||||
{"", 0},
|
{"", 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1933,6 +1933,11 @@ static int __init atari_floppy_init (void)
|
||||||
unit[i].disk = alloc_disk(1);
|
unit[i].disk = alloc_disk(1);
|
||||||
if (!unit[i].disk)
|
if (!unit[i].disk)
|
||||||
goto Enomem;
|
goto Enomem;
|
||||||
|
|
||||||
|
unit[i].disk->queue = blk_init_queue(do_fd_request,
|
||||||
|
&ataflop_lock);
|
||||||
|
if (!unit[i].disk->queue)
|
||||||
|
goto Enomem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UseTrackbuffer < 0)
|
if (UseTrackbuffer < 0)
|
||||||
|
@ -1964,10 +1969,6 @@ static int __init atari_floppy_init (void)
|
||||||
sprintf(unit[i].disk->disk_name, "fd%d", i);
|
sprintf(unit[i].disk->disk_name, "fd%d", i);
|
||||||
unit[i].disk->fops = &floppy_fops;
|
unit[i].disk->fops = &floppy_fops;
|
||||||
unit[i].disk->private_data = &unit[i];
|
unit[i].disk->private_data = &unit[i];
|
||||||
unit[i].disk->queue = blk_init_queue(do_fd_request,
|
|
||||||
&ataflop_lock);
|
|
||||||
if (!unit[i].disk->queue)
|
|
||||||
goto Enomem;
|
|
||||||
set_capacity(unit[i].disk, MAX_DISK_SIZE * 2);
|
set_capacity(unit[i].disk, MAX_DISK_SIZE * 2);
|
||||||
add_disk(unit[i].disk);
|
add_disk(unit[i].disk);
|
||||||
}
|
}
|
||||||
|
@ -1982,13 +1983,17 @@ static int __init atari_floppy_init (void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
Enomem:
|
Enomem:
|
||||||
while (i--) {
|
do {
|
||||||
struct request_queue *q = unit[i].disk->queue;
|
struct gendisk *disk = unit[i].disk;
|
||||||
|
|
||||||
put_disk(unit[i].disk);
|
if (disk) {
|
||||||
if (q)
|
if (disk->queue) {
|
||||||
blk_cleanup_queue(q);
|
blk_cleanup_queue(disk->queue);
|
||||||
|
disk->queue = NULL;
|
||||||
}
|
}
|
||||||
|
put_disk(unit[i].disk);
|
||||||
|
}
|
||||||
|
} while (i--);
|
||||||
|
|
||||||
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -868,8 +868,17 @@ static int swim_floppy_init(struct swim_priv *swd)
|
||||||
|
|
||||||
exit_put_disks:
|
exit_put_disks:
|
||||||
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
||||||
while (drive--)
|
do {
|
||||||
put_disk(swd->unit[drive].disk);
|
struct gendisk *disk = swd->unit[drive].disk;
|
||||||
|
|
||||||
|
if (disk) {
|
||||||
|
if (disk->queue) {
|
||||||
|
blk_cleanup_queue(disk->queue);
|
||||||
|
disk->queue = NULL;
|
||||||
|
}
|
||||||
|
put_disk(disk);
|
||||||
|
}
|
||||||
|
} while (drive--);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1125,6 +1125,7 @@ compress_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(comp_len >= huge_class_size)) {
|
if (unlikely(comp_len >= huge_class_size)) {
|
||||||
|
comp_len = PAGE_SIZE;
|
||||||
if (zram_wb_enabled(zram) && allow_wb) {
|
if (zram_wb_enabled(zram) && allow_wb) {
|
||||||
zcomp_stream_put(zram->comp);
|
zcomp_stream_put(zram->comp);
|
||||||
ret = write_to_bdev(zram, bvec, index, bio, &element);
|
ret = write_to_bdev(zram, bvec, index, bio, &element);
|
||||||
|
@ -1638,6 +1639,11 @@ static const struct attribute_group zram_disk_attr_group = {
|
||||||
.attrs = zram_disk_attrs,
|
.attrs = zram_disk_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct attribute_group *zram_disk_attr_groups[] = {
|
||||||
|
&zram_disk_attr_group,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate and initialize new zram device. the function returns
|
* Allocate and initialize new zram device. the function returns
|
||||||
* '>= 0' device_id upon success, and negative value otherwise.
|
* '>= 0' device_id upon success, and negative value otherwise.
|
||||||
|
@ -1720,24 +1726,15 @@ static int zram_add(void)
|
||||||
|
|
||||||
zram->disk->queue->backing_dev_info->capabilities |=
|
zram->disk->queue->backing_dev_info->capabilities |=
|
||||||
BDI_CAP_STABLE_WRITES;
|
BDI_CAP_STABLE_WRITES;
|
||||||
|
disk_to_dev(zram->disk)->groups = zram_disk_attr_groups;
|
||||||
add_disk(zram->disk);
|
add_disk(zram->disk);
|
||||||
|
|
||||||
ret = sysfs_create_group(&disk_to_dev(zram->disk)->kobj,
|
|
||||||
&zram_disk_attr_group);
|
|
||||||
if (ret < 0) {
|
|
||||||
pr_err("Error creating sysfs group for device %d\n",
|
|
||||||
device_id);
|
|
||||||
goto out_free_disk;
|
|
||||||
}
|
|
||||||
strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor));
|
strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor));
|
||||||
|
|
||||||
zram_debugfs_register(zram);
|
zram_debugfs_register(zram);
|
||||||
pr_info("Added device: %s\n", zram->disk->disk_name);
|
pr_info("Added device: %s\n", zram->disk->disk_name);
|
||||||
return device_id;
|
return device_id;
|
||||||
|
|
||||||
out_free_disk:
|
|
||||||
del_gendisk(zram->disk);
|
|
||||||
put_disk(zram->disk);
|
|
||||||
out_free_queue:
|
out_free_queue:
|
||||||
blk_cleanup_queue(queue);
|
blk_cleanup_queue(queue);
|
||||||
out_free_idr:
|
out_free_idr:
|
||||||
|
@ -1766,15 +1763,6 @@ static int zram_remove(struct zram *zram)
|
||||||
mutex_unlock(&bdev->bd_mutex);
|
mutex_unlock(&bdev->bd_mutex);
|
||||||
|
|
||||||
zram_debugfs_unregister(zram);
|
zram_debugfs_unregister(zram);
|
||||||
/*
|
|
||||||
* Remove sysfs first, so no one will perform a disksize
|
|
||||||
* store while we destroy the devices. This also helps during
|
|
||||||
* hot_remove -- zram_reset_device() is the last holder of
|
|
||||||
* ->init_lock, no later/concurrent disksize_store() or any
|
|
||||||
* other sysfs handlers are possible.
|
|
||||||
*/
|
|
||||||
sysfs_remove_group(&disk_to_dev(zram->disk)->kobj,
|
|
||||||
&zram_disk_attr_group);
|
|
||||||
|
|
||||||
/* Make sure all the pending I/O are finished */
|
/* Make sure all the pending I/O are finished */
|
||||||
fsync_bdev(bdev);
|
fsync_bdev(bdev);
|
||||||
|
|
|
@ -125,7 +125,6 @@ config BT_HCIUART_LL
|
||||||
config BT_HCIUART_3WIRE
|
config BT_HCIUART_3WIRE
|
||||||
bool "Three-wire UART (H5) protocol support"
|
bool "Three-wire UART (H5) protocol support"
|
||||||
depends on BT_HCIUART
|
depends on BT_HCIUART
|
||||||
depends on BT_HCIUART_SERDEV
|
|
||||||
help
|
help
|
||||||
The HCI Three-wire UART Transport Layer makes it possible to
|
The HCI Three-wire UART Transport Layer makes it possible to
|
||||||
user the Bluetooth HCI over a serial port interface. The HCI
|
user the Bluetooth HCI over a serial port interface. The HCI
|
||||||
|
|
|
@ -270,6 +270,7 @@ static const struct {
|
||||||
{ 0x4103, "BCM4330B1" }, /* 002.001.003 */
|
{ 0x4103, "BCM4330B1" }, /* 002.001.003 */
|
||||||
{ 0x410e, "BCM43341B0" }, /* 002.001.014 */
|
{ 0x410e, "BCM43341B0" }, /* 002.001.014 */
|
||||||
{ 0x4406, "BCM4324B3" }, /* 002.004.006 */
|
{ 0x4406, "BCM4324B3" }, /* 002.004.006 */
|
||||||
|
{ 0x6109, "BCM4335C0" }, /* 003.001.009 */
|
||||||
{ 0x610c, "BCM4354" }, /* 003.001.012 */
|
{ 0x610c, "BCM4354" }, /* 003.001.012 */
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
|
@ -2425,7 +2425,7 @@ static int cdrom_ioctl_select_disc(struct cdrom_device_info *cdi,
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
if (arg != CDSL_CURRENT && arg != CDSL_NONE) {
|
if (arg != CDSL_CURRENT && arg != CDSL_NONE) {
|
||||||
if ((int)arg >= cdi->capacity)
|
if (arg >= cdi->capacity)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -613,6 +613,7 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||||
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
|
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
|
||||||
ssif_info->waiting_alert = true;
|
ssif_info->waiting_alert = true;
|
||||||
ssif_info->rtc_us_timer = SSIF_MSG_USEC;
|
ssif_info->rtc_us_timer = SSIF_MSG_USEC;
|
||||||
|
if (!ssif_info->stopping)
|
||||||
mod_timer(&ssif_info->retry_timer,
|
mod_timer(&ssif_info->retry_timer,
|
||||||
jiffies + SSIF_MSG_JIFFIES);
|
jiffies + SSIF_MSG_JIFFIES);
|
||||||
ipmi_ssif_unlock_cond(ssif_info, flags);
|
ipmi_ssif_unlock_cond(ssif_info, flags);
|
||||||
|
@ -951,6 +952,7 @@ static void msg_written_handler(struct ssif_info *ssif_info, int result,
|
||||||
ssif_info->waiting_alert = true;
|
ssif_info->waiting_alert = true;
|
||||||
ssif_info->retries_left = SSIF_RECV_RETRIES;
|
ssif_info->retries_left = SSIF_RECV_RETRIES;
|
||||||
ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC;
|
ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC;
|
||||||
|
if (!ssif_info->stopping)
|
||||||
mod_timer(&ssif_info->retry_timer,
|
mod_timer(&ssif_info->retry_timer,
|
||||||
jiffies + SSIF_MSG_PART_JIFFIES);
|
jiffies + SSIF_MSG_PART_JIFFIES);
|
||||||
ipmi_ssif_unlock_cond(ssif_info, flags);
|
ipmi_ssif_unlock_cond(ssif_info, flags);
|
||||||
|
|
|
@ -415,7 +415,8 @@ ssize_t tpm_transmit_cmd(struct tpm_chip *chip, const void *cmd,
|
||||||
header = cmd;
|
header = cmd;
|
||||||
|
|
||||||
err = be32_to_cpu(header->return_code);
|
err = be32_to_cpu(header->return_code);
|
||||||
if (err != 0 && desc)
|
if (err != 0 && err != TPM_ERR_DISABLED && err != TPM_ERR_DEACTIVATED
|
||||||
|
&& desc)
|
||||||
dev_err(&chip->dev, "A TPM error (%d) occurred %s\n", err,
|
dev_err(&chip->dev, "A TPM error (%d) occurred %s\n", err,
|
||||||
desc);
|
desc);
|
||||||
|
|
||||||
|
|
|
@ -201,7 +201,7 @@ static int setup_ring(struct xenbus_device *dev, struct tpm_private *priv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = xenbus_grant_ring(dev, &priv->shr, 1, &gref);
|
rv = xenbus_grant_ring(dev, priv->shr, 1, &gref);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
|
|
|
@ -297,6 +297,36 @@ static const struct platform_device_id s2mps11_clk_id[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(platform, s2mps11_clk_id);
|
MODULE_DEVICE_TABLE(platform, s2mps11_clk_id);
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
/*
|
||||||
|
* Device is instantiated through parent MFD device and device matching is done
|
||||||
|
* through platform_device_id.
|
||||||
|
*
|
||||||
|
* However if device's DT node contains proper clock compatible and driver is
|
||||||
|
* built as a module, then the *module* matching will be done trough DT aliases.
|
||||||
|
* This requires of_device_id table. In the same time this will not change the
|
||||||
|
* actual *device* matching so do not add .of_match_table.
|
||||||
|
*/
|
||||||
|
static const struct of_device_id s2mps11_dt_match[] = {
|
||||||
|
{
|
||||||
|
.compatible = "samsung,s2mps11-clk",
|
||||||
|
.data = (void *)S2MPS11X,
|
||||||
|
}, {
|
||||||
|
.compatible = "samsung,s2mps13-clk",
|
||||||
|
.data = (void *)S2MPS13X,
|
||||||
|
}, {
|
||||||
|
.compatible = "samsung,s2mps14-clk",
|
||||||
|
.data = (void *)S2MPS14X,
|
||||||
|
}, {
|
||||||
|
.compatible = "samsung,s5m8767-clk",
|
||||||
|
.data = (void *)S5M8767X,
|
||||||
|
}, {
|
||||||
|
/* Sentinel */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, s2mps11_dt_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct platform_driver s2mps11_clk_driver = {
|
static struct platform_driver s2mps11_clk_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "s2mps11-clk",
|
.name = "s2mps11-clk",
|
||||||
|
|
|
@ -273,6 +273,7 @@ static const struct samsung_clk_reg_dump exynos5420_set_clksrc[] = {
|
||||||
{ .offset = GATE_BUS_TOP, .value = 0xffffffff, },
|
{ .offset = GATE_BUS_TOP, .value = 0xffffffff, },
|
||||||
{ .offset = GATE_BUS_DISP1, .value = 0xffffffff, },
|
{ .offset = GATE_BUS_DISP1, .value = 0xffffffff, },
|
||||||
{ .offset = GATE_IP_PERIC, .value = 0xffffffff, },
|
{ .offset = GATE_IP_PERIC, .value = 0xffffffff, },
|
||||||
|
{ .offset = GATE_IP_PERIS, .value = 0xffffffff, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int exynos5420_clk_suspend(void)
|
static int exynos5420_clk_suspend(void)
|
||||||
|
|
|
@ -19,6 +19,13 @@
|
||||||
DEFINE_RAW_SPINLOCK(i8253_lock);
|
DEFINE_RAW_SPINLOCK(i8253_lock);
|
||||||
EXPORT_SYMBOL(i8253_lock);
|
EXPORT_SYMBOL(i8253_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle PIT quirk in pit_shutdown() where zeroing the counter register
|
||||||
|
* restarts the PIT, negating the shutdown. On platforms with the quirk,
|
||||||
|
* platform specific code can set this to false.
|
||||||
|
*/
|
||||||
|
bool i8253_clear_counter_on_shutdown = true;
|
||||||
|
|
||||||
#ifdef CONFIG_CLKSRC_I8253
|
#ifdef CONFIG_CLKSRC_I8253
|
||||||
/*
|
/*
|
||||||
* Since the PIT overflows every tick, its not very useful
|
* Since the PIT overflows every tick, its not very useful
|
||||||
|
@ -108,8 +115,11 @@ static int pit_shutdown(struct clock_event_device *evt)
|
||||||
raw_spin_lock(&i8253_lock);
|
raw_spin_lock(&i8253_lock);
|
||||||
|
|
||||||
outb_p(0x30, PIT_MODE);
|
outb_p(0x30, PIT_MODE);
|
||||||
|
|
||||||
|
if (i8253_clear_counter_on_shutdown) {
|
||||||
outb_p(0, PIT_CH0);
|
outb_p(0, PIT_CH0);
|
||||||
outb_p(0, PIT_CH0);
|
outb_p(0, PIT_CH0);
|
||||||
|
}
|
||||||
|
|
||||||
raw_spin_unlock(&i8253_lock);
|
raw_spin_unlock(&i8253_lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -750,6 +750,11 @@ static int jz4780_dma_probe(struct platform_device *pdev)
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
|
if (!dev->of_node) {
|
||||||
|
dev_err(dev, "This driver must be probed from devicetree\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
jzdma = devm_kzalloc(dev, sizeof(*jzdma), GFP_KERNEL);
|
jzdma = devm_kzalloc(dev, sizeof(*jzdma), GFP_KERNEL);
|
||||||
if (!jzdma)
|
if (!jzdma)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -1210,8 +1210,15 @@ static void ioat_shutdown(struct pci_dev *pdev)
|
||||||
|
|
||||||
spin_lock_bh(&ioat_chan->prep_lock);
|
spin_lock_bh(&ioat_chan->prep_lock);
|
||||||
set_bit(IOAT_CHAN_DOWN, &ioat_chan->state);
|
set_bit(IOAT_CHAN_DOWN, &ioat_chan->state);
|
||||||
del_timer_sync(&ioat_chan->timer);
|
|
||||||
spin_unlock_bh(&ioat_chan->prep_lock);
|
spin_unlock_bh(&ioat_chan->prep_lock);
|
||||||
|
/*
|
||||||
|
* Synchronization rule for del_timer_sync():
|
||||||
|
* - The caller must not hold locks which would prevent
|
||||||
|
* completion of the timer's handler.
|
||||||
|
* So prep_lock cannot be held before calling it.
|
||||||
|
*/
|
||||||
|
del_timer_sync(&ioat_chan->timer);
|
||||||
|
|
||||||
/* this should quiesce then reset */
|
/* this should quiesce then reset */
|
||||||
ioat_reset_hw(ioat_chan);
|
ioat_reset_hw(ioat_chan);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1225,6 +1225,9 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_
|
||||||
mutex_lock(&mgr->lock);
|
mutex_lock(&mgr->lock);
|
||||||
mstb = mgr->mst_primary;
|
mstb = mgr->mst_primary;
|
||||||
|
|
||||||
|
if (!mstb)
|
||||||
|
goto out;
|
||||||
|
|
||||||
for (i = 0; i < lct - 1; i++) {
|
for (i = 0; i < lct - 1; i++) {
|
||||||
int shift = (i % 2) ? 0 : 4;
|
int shift = (i % 2) ? 0 : 4;
|
||||||
int port_num = (rad[i / 2] >> shift) & 0xf;
|
int port_num = (rad[i / 2] >> shift) & 0xf;
|
||||||
|
|
|
@ -76,6 +76,9 @@ static const struct {
|
||||||
/* HDMI N/CTS table */
|
/* HDMI N/CTS table */
|
||||||
#define TMDS_297M 297000
|
#define TMDS_297M 297000
|
||||||
#define TMDS_296M 296703
|
#define TMDS_296M 296703
|
||||||
|
#define TMDS_594M 594000
|
||||||
|
#define TMDS_593M 593407
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
int sample_rate;
|
int sample_rate;
|
||||||
int clock;
|
int clock;
|
||||||
|
@ -96,6 +99,20 @@ static const struct {
|
||||||
{ 176400, TMDS_297M, 18816, 247500 },
|
{ 176400, TMDS_297M, 18816, 247500 },
|
||||||
{ 192000, TMDS_296M, 23296, 281250 },
|
{ 192000, TMDS_296M, 23296, 281250 },
|
||||||
{ 192000, TMDS_297M, 20480, 247500 },
|
{ 192000, TMDS_297M, 20480, 247500 },
|
||||||
|
{ 44100, TMDS_593M, 8918, 937500 },
|
||||||
|
{ 44100, TMDS_594M, 9408, 990000 },
|
||||||
|
{ 48000, TMDS_593M, 5824, 562500 },
|
||||||
|
{ 48000, TMDS_594M, 6144, 594000 },
|
||||||
|
{ 32000, TMDS_593M, 5824, 843750 },
|
||||||
|
{ 32000, TMDS_594M, 3072, 445500 },
|
||||||
|
{ 88200, TMDS_593M, 17836, 937500 },
|
||||||
|
{ 88200, TMDS_594M, 18816, 990000 },
|
||||||
|
{ 96000, TMDS_593M, 11648, 562500 },
|
||||||
|
{ 96000, TMDS_594M, 12288, 594000 },
|
||||||
|
{ 176400, TMDS_593M, 35672, 937500 },
|
||||||
|
{ 176400, TMDS_594M, 37632, 990000 },
|
||||||
|
{ 192000, TMDS_593M, 23296, 562500 },
|
||||||
|
{ 192000, TMDS_594M, 24576, 594000 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
|
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
|
||||||
|
|
|
@ -262,6 +262,17 @@ static int dmm_txn_commit(struct dmm_txn *txn, bool wait)
|
||||||
}
|
}
|
||||||
|
|
||||||
txn->last_pat->next_pa = 0;
|
txn->last_pat->next_pa = 0;
|
||||||
|
/* ensure that the written descriptors are visible to DMM */
|
||||||
|
wmb();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: the wmb() above should be enough, but there seems to be a bug
|
||||||
|
* in OMAP's memory barrier implementation, which in some rare cases may
|
||||||
|
* cause the writes not to be observable after wmb().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* read back to ensure the data is in RAM */
|
||||||
|
readl(&txn->last_pat->next_pa);
|
||||||
|
|
||||||
/* write to PAT_DESCR to clear out any pending transaction */
|
/* write to PAT_DESCR to clear out any pending transaction */
|
||||||
writel(0x0, dmm->base + reg[PAT_DESCR][engine->id]);
|
writel(0x0, dmm->base + reg[PAT_DESCR][engine->id]);
|
||||||
|
|
|
@ -547,6 +547,11 @@ static int rockchip_drm_platform_remove(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rockchip_drm_platform_shutdown(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
rockchip_drm_platform_remove(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct of_device_id rockchip_drm_dt_ids[] = {
|
static const struct of_device_id rockchip_drm_dt_ids[] = {
|
||||||
{ .compatible = "rockchip,display-subsystem", },
|
{ .compatible = "rockchip,display-subsystem", },
|
||||||
{ /* sentinel */ },
|
{ /* sentinel */ },
|
||||||
|
@ -556,6 +561,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);
|
||||||
static struct platform_driver rockchip_drm_platform_driver = {
|
static struct platform_driver rockchip_drm_platform_driver = {
|
||||||
.probe = rockchip_drm_platform_probe,
|
.probe = rockchip_drm_platform_probe,
|
||||||
.remove = rockchip_drm_platform_remove,
|
.remove = rockchip_drm_platform_remove,
|
||||||
|
.shutdown = rockchip_drm_platform_shutdown,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "rockchip-drm",
|
.name = "rockchip-drm",
|
||||||
.of_match_table = rockchip_drm_dt_ids,
|
.of_match_table = rockchip_drm_dt_ids,
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
|
#include <linux/cred.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/hid.h>
|
#include <linux/hid.h>
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/uhid.h>
|
#include <linux/uhid.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
#define UHID_NAME "uhid"
|
#define UHID_NAME "uhid"
|
||||||
#define UHID_BUFSIZE 32
|
#define UHID_BUFSIZE 32
|
||||||
|
@ -734,6 +736,17 @@ static ssize_t uhid_char_write(struct file *file, const char __user *buffer,
|
||||||
|
|
||||||
switch (uhid->input_buf.type) {
|
switch (uhid->input_buf.type) {
|
||||||
case UHID_CREATE:
|
case UHID_CREATE:
|
||||||
|
/*
|
||||||
|
* 'struct uhid_create_req' contains a __user pointer which is
|
||||||
|
* copied from, so it's unsafe to allow this with elevated
|
||||||
|
* privileges (e.g. from a setuid binary) or via kernel_write().
|
||||||
|
*/
|
||||||
|
if (file->f_cred != current_cred() || uaccess_kernel()) {
|
||||||
|
pr_err_once("UHID_CREATE from different security context by process %d (%s), this is not allowed.\n",
|
||||||
|
task_tgid_vnr(current), current->comm);
|
||||||
|
ret = -EACCES;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
ret = uhid_dev_create(uhid, &uhid->input_buf);
|
ret = uhid_dev_create(uhid, &uhid->input_buf);
|
||||||
break;
|
break;
|
||||||
case UHID_CREATE2:
|
case UHID_CREATE2:
|
||||||
|
|
|
@ -522,14 +522,24 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
|
||||||
if (cmd == HIDIOCGCOLLECTIONINDEX) {
|
if (cmd == HIDIOCGCOLLECTIONINDEX) {
|
||||||
if (uref->usage_index >= field->maxusage)
|
if (uref->usage_index >= field->maxusage)
|
||||||
goto inval;
|
goto inval;
|
||||||
|
uref->usage_index =
|
||||||
|
array_index_nospec(uref->usage_index,
|
||||||
|
field->maxusage);
|
||||||
} else if (uref->usage_index >= field->report_count)
|
} else if (uref->usage_index >= field->report_count)
|
||||||
goto inval;
|
goto inval;
|
||||||
|
|
||||||
if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
|
if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
|
||||||
(uref_multi->num_values > HID_MAX_MULTI_USAGES ||
|
if (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
|
||||||
uref->usage_index + uref_multi->num_values > field->report_count))
|
uref->usage_index + uref_multi->num_values >
|
||||||
|
field->report_count)
|
||||||
goto inval;
|
goto inval;
|
||||||
|
|
||||||
|
uref->usage_index =
|
||||||
|
array_index_nospec(uref->usage_index,
|
||||||
|
field->report_count -
|
||||||
|
uref_multi->num_values);
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case HIDIOCGUSAGE:
|
case HIDIOCGUSAGE:
|
||||||
uref->value = field->value[uref->usage_index];
|
uref->value = field->value[uref->usage_index];
|
||||||
|
|
|
@ -114,7 +114,7 @@ static ssize_t show_label(struct device *dev, struct device_attribute *devattr,
|
||||||
return sprintf(buf, "%s\n", sdata->label);
|
return sprintf(buf, "%s\n", sdata->label);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init get_logical_cpu(int hwcpu)
|
static int get_logical_cpu(int hwcpu)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
|
@ -125,9 +125,8 @@ static int __init get_logical_cpu(int hwcpu)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init make_sensor_label(struct device_node *np,
|
static void make_sensor_label(struct device_node *np,
|
||||||
struct sensor_data *sdata,
|
struct sensor_data *sdata, const char *label)
|
||||||
const char *label)
|
|
||||||
{
|
{
|
||||||
u32 id;
|
u32 id;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
|
@ -117,6 +117,8 @@ static int pmbus_identify(struct i2c_client *client,
|
||||||
} else {
|
} else {
|
||||||
info->pages = 1;
|
info->pages = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pmbus_clear_faults(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
|
if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
|
||||||
|
|
|
@ -1759,7 +1759,10 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
|
||||||
if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK))
|
if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK))
|
||||||
client->flags |= I2C_CLIENT_PEC;
|
client->flags |= I2C_CLIENT_PEC;
|
||||||
|
|
||||||
|
if (data->info->pages)
|
||||||
pmbus_clear_faults(client);
|
pmbus_clear_faults(client);
|
||||||
|
else
|
||||||
|
pmbus_clear_fault_page(client, -1);
|
||||||
|
|
||||||
if (info->identify) {
|
if (info->identify) {
|
||||||
ret = (*info->identify)(client, info);
|
ret = (*info->identify)(client, info);
|
||||||
|
|
|
@ -245,12 +245,14 @@ static irqreturn_t at91_adc_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *idev = pf->indio_dev;
|
struct iio_dev *idev = pf->indio_dev;
|
||||||
struct at91_adc_state *st = iio_priv(idev);
|
struct at91_adc_state *st = iio_priv(idev);
|
||||||
|
struct iio_chan_spec const *chan;
|
||||||
int i, j = 0;
|
int i, j = 0;
|
||||||
|
|
||||||
for (i = 0; i < idev->masklength; i++) {
|
for (i = 0; i < idev->masklength; i++) {
|
||||||
if (!test_bit(i, idev->active_scan_mask))
|
if (!test_bit(i, idev->active_scan_mask))
|
||||||
continue;
|
continue;
|
||||||
st->buffer[j] = at91_adc_readl(st, AT91_ADC_CHAN(st, i));
|
chan = idev->channels + i;
|
||||||
|
st->buffer[j] = at91_adc_readl(st, AT91_ADC_CHAN(st, chan->channel));
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,6 +278,8 @@ static void handle_adc_eoc_trigger(int irq, struct iio_dev *idev)
|
||||||
iio_trigger_poll(idev->trig);
|
iio_trigger_poll(idev->trig);
|
||||||
} else {
|
} else {
|
||||||
st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
|
st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
|
||||||
|
/* Needed to ACK the DRDY interruption */
|
||||||
|
at91_adc_readl(st, AT91_ADC_LCDR);
|
||||||
st->done = true;
|
st->done = true;
|
||||||
wake_up_interruptible(&st->wq_data_avail);
|
wake_up_interruptible(&st->wq_data_avail);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2372,7 +2372,7 @@ static int refill_keybuf_fn(struct btree_op *op, struct btree *b,
|
||||||
struct keybuf *buf = refill->buf;
|
struct keybuf *buf = refill->buf;
|
||||||
int ret = MAP_CONTINUE;
|
int ret = MAP_CONTINUE;
|
||||||
|
|
||||||
if (bkey_cmp(k, refill->end) >= 0) {
|
if (bkey_cmp(k, refill->end) > 0) {
|
||||||
ret = MAP_DONE;
|
ret = MAP_DONE;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1685,8 +1685,7 @@ static void free_params(struct dm_ioctl *param, size_t param_size, int param_fla
|
||||||
}
|
}
|
||||||
|
|
||||||
static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernel,
|
static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernel,
|
||||||
int ioctl_flags,
|
int ioctl_flags, struct dm_ioctl **param, int *param_flags)
|
||||||
struct dm_ioctl **param, int *param_flags)
|
|
||||||
{
|
{
|
||||||
struct dm_ioctl *dmi;
|
struct dm_ioctl *dmi;
|
||||||
int secure_data;
|
int secure_data;
|
||||||
|
@ -1734,18 +1733,13 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy_from_user(dmi, user, param_kernel->data_size))
|
/* Copy from param_kernel (which was already copied from user) */
|
||||||
goto bad;
|
memcpy(dmi, param_kernel, minimum_data_size);
|
||||||
|
|
||||||
|
if (copy_from_user(&dmi->data, (char __user *)user + minimum_data_size,
|
||||||
|
param_kernel->data_size - minimum_data_size))
|
||||||
|
goto bad;
|
||||||
data_copied:
|
data_copied:
|
||||||
/*
|
|
||||||
* Abort if something changed the ioctl data while it was being copied.
|
|
||||||
*/
|
|
||||||
if (dmi->data_size != param_kernel->data_size) {
|
|
||||||
DMERR("rejecting ioctl: data size modified while processing parameters");
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wipe the user buffer so we do not return it to userspace */
|
/* Wipe the user buffer so we do not return it to userspace */
|
||||||
if (secure_data && clear_user(user, param_kernel->data_size))
|
if (secure_data && clear_user(user, param_kernel->data_size))
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
|
@ -1605,6 +1605,7 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
|
||||||
*/
|
*/
|
||||||
if (rdev->saved_raid_disk >= 0 &&
|
if (rdev->saved_raid_disk >= 0 &&
|
||||||
rdev->saved_raid_disk >= first &&
|
rdev->saved_raid_disk >= first &&
|
||||||
|
rdev->saved_raid_disk < conf->raid_disks &&
|
||||||
conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
|
conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
|
||||||
first = last = rdev->saved_raid_disk;
|
first = last = rdev->saved_raid_disk;
|
||||||
|
|
||||||
|
|
|
@ -1737,6 +1737,7 @@ static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev)
|
||||||
first = last = rdev->raid_disk;
|
first = last = rdev->raid_disk;
|
||||||
|
|
||||||
if (rdev->saved_raid_disk >= first &&
|
if (rdev->saved_raid_disk >= first &&
|
||||||
|
rdev->saved_raid_disk < conf->geo.raid_disks &&
|
||||||
conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
|
conf->mirrors[rdev->saved_raid_disk].rdev == NULL)
|
||||||
mirror = rdev->saved_raid_disk;
|
mirror = rdev->saved_raid_disk;
|
||||||
else
|
else
|
||||||
|
|
|
@ -870,9 +870,6 @@ static int tvp5150_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *a)
|
||||||
|
|
||||||
/* tvp5150 has some special limits */
|
/* tvp5150 has some special limits */
|
||||||
rect.left = clamp(rect.left, 0, TVP5150_MAX_CROP_LEFT);
|
rect.left = clamp(rect.left, 0, TVP5150_MAX_CROP_LEFT);
|
||||||
rect.width = clamp_t(unsigned int, rect.width,
|
|
||||||
TVP5150_H_MAX - TVP5150_MAX_CROP_LEFT - rect.left,
|
|
||||||
TVP5150_H_MAX - rect.left);
|
|
||||||
rect.top = clamp(rect.top, 0, TVP5150_MAX_CROP_TOP);
|
rect.top = clamp(rect.top, 0, TVP5150_MAX_CROP_TOP);
|
||||||
|
|
||||||
/* Calculate height based on current standard */
|
/* Calculate height based on current standard */
|
||||||
|
@ -886,9 +883,16 @@ static int tvp5150_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *a)
|
||||||
else
|
else
|
||||||
hmax = TVP5150_V_MAX_OTHERS;
|
hmax = TVP5150_V_MAX_OTHERS;
|
||||||
|
|
||||||
rect.height = clamp_t(unsigned int, rect.height,
|
/*
|
||||||
|
* alignments:
|
||||||
|
* - width = 2 due to UYVY colorspace
|
||||||
|
* - height, image = no special alignment
|
||||||
|
*/
|
||||||
|
v4l_bound_align_image(&rect.width,
|
||||||
|
TVP5150_H_MAX - TVP5150_MAX_CROP_LEFT - rect.left,
|
||||||
|
TVP5150_H_MAX - rect.left, 1, &rect.height,
|
||||||
hmax - TVP5150_MAX_CROP_TOP - rect.top,
|
hmax - TVP5150_MAX_CROP_TOP - rect.top,
|
||||||
hmax - rect.top);
|
hmax - rect.top, 0, 0);
|
||||||
|
|
||||||
tvp5150_write(sd, TVP5150_VERT_BLANKING_START, rect.top);
|
tvp5150_write(sd, TVP5150_VERT_BLANKING_START, rect.top);
|
||||||
tvp5150_write(sd, TVP5150_VERT_BLANKING_STOP,
|
tvp5150_write(sd, TVP5150_VERT_BLANKING_STOP,
|
||||||
|
|
|
@ -660,6 +660,10 @@ static int altera_hw_filt_init(struct altera_ci_config *config, int hw_filt_nr)
|
||||||
}
|
}
|
||||||
|
|
||||||
temp_int = append_internal(inter);
|
temp_int = append_internal(inter);
|
||||||
|
if (!temp_int) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
inter->filts_used = 1;
|
inter->filts_used = 1;
|
||||||
inter->dev = config->dev;
|
inter->dev = config->dev;
|
||||||
inter->fpga_rw = config->fpga_rw;
|
inter->fpga_rw = config->fpga_rw;
|
||||||
|
@ -694,6 +698,7 @@ err:
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
|
|
||||||
kfree(pid_filt);
|
kfree(pid_filt);
|
||||||
|
kfree(inter);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -728,6 +733,10 @@ int altera_ci_init(struct altera_ci_config *config, int ci_nr)
|
||||||
}
|
}
|
||||||
|
|
||||||
temp_int = append_internal(inter);
|
temp_int = append_internal(inter);
|
||||||
|
if (!temp_int) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
inter->cis_used = 1;
|
inter->cis_used = 1;
|
||||||
inter->dev = config->dev;
|
inter->dev = config->dev;
|
||||||
inter->fpga_rw = config->fpga_rw;
|
inter->fpga_rw = config->fpga_rw;
|
||||||
|
@ -796,6 +805,7 @@ err:
|
||||||
ci_dbg_print("%s: Cannot initialize CI: Error %d.\n", __func__, ret);
|
ci_dbg_print("%s: Cannot initialize CI: Error %d.\n", __func__, ret);
|
||||||
|
|
||||||
kfree(state);
|
kfree(state);
|
||||||
|
kfree(inter);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2021,13 +2021,13 @@ struct em28xx_board em28xx_boards[] = {
|
||||||
.input = { {
|
.input = { {
|
||||||
.type = EM28XX_VMUX_COMPOSITE1,
|
.type = EM28XX_VMUX_COMPOSITE1,
|
||||||
.vmux = TVP5150_COMPOSITE1,
|
.vmux = TVP5150_COMPOSITE1,
|
||||||
.amux = EM28XX_AUDIO_SRC_LINE,
|
.amux = EM28XX_AMUX_LINE_IN,
|
||||||
.gpio = terratec_av350_unmute_gpio,
|
.gpio = terratec_av350_unmute_gpio,
|
||||||
|
|
||||||
}, {
|
}, {
|
||||||
.type = EM28XX_VMUX_SVIDEO,
|
.type = EM28XX_VMUX_SVIDEO,
|
||||||
.vmux = TVP5150_SVIDEO,
|
.vmux = TVP5150_SVIDEO,
|
||||||
.amux = EM28XX_AUDIO_SRC_LINE,
|
.amux = EM28XX_AMUX_LINE_IN,
|
||||||
.gpio = terratec_av350_unmute_gpio,
|
.gpio = terratec_av350_unmute_gpio,
|
||||||
} },
|
} },
|
||||||
},
|
},
|
||||||
|
|
|
@ -1149,6 +1149,8 @@ static void em28xx_ctrl_notify(struct v4l2_ctrl *ctrl, void *priv)
|
||||||
{
|
{
|
||||||
struct em28xx *dev = priv;
|
struct em28xx *dev = priv;
|
||||||
|
|
||||||
|
dev->v4l2->field_count = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In the case of non-AC97 volume controls, we still need
|
* In the case of non-AC97 volume controls, we still need
|
||||||
* to do some setups at em28xx, in order to mute/unmute
|
* to do some setups at em28xx, in order to mute/unmute
|
||||||
|
@ -1288,9 +1290,9 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
|
||||||
|
|
||||||
fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
||||||
if (!fmt) {
|
if (!fmt) {
|
||||||
em28xx_videodbg("Fourcc format (%08x) invalid.\n",
|
fmt = &format[0];
|
||||||
f->fmt.pix.pixelformat);
|
em28xx_videodbg("Fourcc format (%08x) invalid. Using default (%08x).\n",
|
||||||
return -EINVAL;
|
f->fmt.pix.pixelformat, fmt->fourcc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->board.is_em2800) {
|
if (dev->board.is_em2800) {
|
||||||
|
|
|
@ -197,6 +197,22 @@ int v4l2_event_pending(struct v4l2_fh *fh)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(v4l2_event_pending);
|
EXPORT_SYMBOL_GPL(v4l2_event_pending);
|
||||||
|
|
||||||
|
static void __v4l2_event_unsubscribe(struct v4l2_subscribed_event *sev)
|
||||||
|
{
|
||||||
|
struct v4l2_fh *fh = sev->fh;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
lockdep_assert_held(&fh->subscribe_lock);
|
||||||
|
assert_spin_locked(&fh->vdev->fh_lock);
|
||||||
|
|
||||||
|
/* Remove any pending events for this subscription */
|
||||||
|
for (i = 0; i < sev->in_use; i++) {
|
||||||
|
list_del(&sev->events[sev_pos(sev, i)].list);
|
||||||
|
fh->navailable--;
|
||||||
|
}
|
||||||
|
list_del(&sev->list);
|
||||||
|
}
|
||||||
|
|
||||||
int v4l2_event_subscribe(struct v4l2_fh *fh,
|
int v4l2_event_subscribe(struct v4l2_fh *fh,
|
||||||
const struct v4l2_event_subscription *sub, unsigned elems,
|
const struct v4l2_event_subscription *sub, unsigned elems,
|
||||||
const struct v4l2_subscribed_event_ops *ops)
|
const struct v4l2_subscribed_event_ops *ops)
|
||||||
|
@ -228,27 +244,23 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
|
||||||
|
|
||||||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||||
found_ev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
found_ev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
||||||
|
if (!found_ev)
|
||||||
|
list_add(&sev->list, &fh->subscribed);
|
||||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||||
|
|
||||||
if (found_ev) {
|
if (found_ev) {
|
||||||
/* Already listening */
|
/* Already listening */
|
||||||
kfree(sev);
|
kfree(sev);
|
||||||
goto out_unlock;
|
} else if (sev->ops && sev->ops->add) {
|
||||||
}
|
|
||||||
|
|
||||||
if (sev->ops && sev->ops->add) {
|
|
||||||
ret = sev->ops->add(sev, elems);
|
ret = sev->ops->add(sev, elems);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(sev);
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||||
list_add(&sev->list, &fh->subscribed);
|
__v4l2_event_unsubscribe(sev);
|
||||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||||
|
kfree(sev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
out_unlock:
|
|
||||||
mutex_unlock(&fh->subscribe_lock);
|
mutex_unlock(&fh->subscribe_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -283,7 +295,6 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
||||||
{
|
{
|
||||||
struct v4l2_subscribed_event *sev;
|
struct v4l2_subscribed_event *sev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (sub->type == V4L2_EVENT_ALL) {
|
if (sub->type == V4L2_EVENT_ALL) {
|
||||||
v4l2_event_unsubscribe_all(fh);
|
v4l2_event_unsubscribe_all(fh);
|
||||||
|
@ -295,14 +306,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
||||||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||||
|
|
||||||
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
||||||
if (sev != NULL) {
|
if (sev != NULL)
|
||||||
/* Remove any pending events for this subscription */
|
__v4l2_event_unsubscribe(sev);
|
||||||
for (i = 0; i < sev->in_use; i++) {
|
|
||||||
list_del(&sev->events[sev_pos(sev, i)].list);
|
|
||||||
fh->navailable--;
|
|
||||||
}
|
|
||||||
list_del(&sev->list);
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||||
|
|
||||||
|
|
|
@ -870,12 +870,9 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
||||||
dprintk(4, "done processing on buffer %d, state: %d\n",
|
dprintk(4, "done processing on buffer %d, state: %d\n",
|
||||||
vb->index, state);
|
vb->index, state);
|
||||||
|
|
||||||
if (state != VB2_BUF_STATE_QUEUED &&
|
|
||||||
state != VB2_BUF_STATE_REQUEUEING) {
|
|
||||||
/* sync buffers */
|
/* sync buffers */
|
||||||
for (plane = 0; plane < vb->num_planes; ++plane)
|
for (plane = 0; plane < vb->num_planes; ++plane)
|
||||||
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irqsave(&q->done_lock, flags);
|
spin_lock_irqsave(&q->done_lock, flags);
|
||||||
if (state == VB2_BUF_STATE_QUEUED ||
|
if (state == VB2_BUF_STATE_QUEUED ||
|
||||||
|
|
|
@ -129,7 +129,7 @@ static const struct of_device_id atmel_ssc_dt_ids[] = {
|
||||||
MODULE_DEVICE_TABLE(of, atmel_ssc_dt_ids);
|
MODULE_DEVICE_TABLE(of, atmel_ssc_dt_ids);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline const struct atmel_ssc_platform_data * __init
|
static inline const struct atmel_ssc_platform_data *
|
||||||
atmel_ssc_get_driver_data(struct platform_device *pdev)
|
atmel_ssc_get_driver_data(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
if (pdev->dev.of_node) {
|
if (pdev->dev.of_node) {
|
||||||
|
|
|
@ -404,7 +404,7 @@ struct genwqe_file {
|
||||||
struct file *filp;
|
struct file *filp;
|
||||||
|
|
||||||
struct fasync_struct *async_queue;
|
struct fasync_struct *async_queue;
|
||||||
struct task_struct *owner;
|
struct pid *opener;
|
||||||
struct list_head list; /* entry in list of open files */
|
struct list_head list; /* entry in list of open files */
|
||||||
|
|
||||||
spinlock_t map_lock; /* lock for dma_mappings */
|
spinlock_t map_lock; /* lock for dma_mappings */
|
||||||
|
|
|
@ -52,7 +52,7 @@ static void genwqe_add_file(struct genwqe_dev *cd, struct genwqe_file *cfile)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
cfile->owner = current;
|
cfile->opener = get_pid(task_tgid(current));
|
||||||
spin_lock_irqsave(&cd->file_lock, flags);
|
spin_lock_irqsave(&cd->file_lock, flags);
|
||||||
list_add(&cfile->list, &cd->file_list);
|
list_add(&cfile->list, &cd->file_list);
|
||||||
spin_unlock_irqrestore(&cd->file_lock, flags);
|
spin_unlock_irqrestore(&cd->file_lock, flags);
|
||||||
|
@ -65,6 +65,7 @@ static int genwqe_del_file(struct genwqe_dev *cd, struct genwqe_file *cfile)
|
||||||
spin_lock_irqsave(&cd->file_lock, flags);
|
spin_lock_irqsave(&cd->file_lock, flags);
|
||||||
list_del(&cfile->list);
|
list_del(&cfile->list);
|
||||||
spin_unlock_irqrestore(&cd->file_lock, flags);
|
spin_unlock_irqrestore(&cd->file_lock, flags);
|
||||||
|
put_pid(cfile->opener);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -275,7 +276,7 @@ static int genwqe_kill_fasync(struct genwqe_dev *cd, int sig)
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int genwqe_force_sig(struct genwqe_dev *cd, int sig)
|
static int genwqe_terminate(struct genwqe_dev *cd)
|
||||||
{
|
{
|
||||||
unsigned int files = 0;
|
unsigned int files = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -283,7 +284,7 @@ static int genwqe_force_sig(struct genwqe_dev *cd, int sig)
|
||||||
|
|
||||||
spin_lock_irqsave(&cd->file_lock, flags);
|
spin_lock_irqsave(&cd->file_lock, flags);
|
||||||
list_for_each_entry(cfile, &cd->file_list, list) {
|
list_for_each_entry(cfile, &cd->file_list, list) {
|
||||||
force_sig(sig, cfile->owner);
|
kill_pid(cfile->opener, SIGKILL, 1);
|
||||||
files++;
|
files++;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&cd->file_lock, flags);
|
spin_unlock_irqrestore(&cd->file_lock, flags);
|
||||||
|
@ -1356,7 +1357,7 @@ static int genwqe_inform_and_stop_processes(struct genwqe_dev *cd)
|
||||||
dev_warn(&pci_dev->dev,
|
dev_warn(&pci_dev->dev,
|
||||||
"[%s] send SIGKILL and wait ...\n", __func__);
|
"[%s] send SIGKILL and wait ...\n", __func__);
|
||||||
|
|
||||||
rc = genwqe_force_sig(cd, SIGKILL); /* force terminate */
|
rc = genwqe_terminate(cd);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
/* Give kill_timout more seconds to end processes */
|
/* Give kill_timout more seconds to end processes */
|
||||||
for (i = 0; (i < genwqe_kill_timeout) &&
|
for (i = 0; (i < genwqe_kill_timeout) &&
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <asm/uv/uv_hub.h>
|
#include <asm/uv/uv_hub.h>
|
||||||
|
|
||||||
|
#include <linux/nospec.h>
|
||||||
|
|
||||||
#include "gru.h"
|
#include "gru.h"
|
||||||
#include "grutables.h"
|
#include "grutables.h"
|
||||||
#include "gruhandles.h"
|
#include "gruhandles.h"
|
||||||
|
@ -196,6 +199,7 @@ int gru_dump_chiplet_request(unsigned long arg)
|
||||||
/* Currently, only dump by gid is implemented */
|
/* Currently, only dump by gid is implemented */
|
||||||
if (req.gid >= gru_max_gids)
|
if (req.gid >= gru_max_gids)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
req.gid = array_index_nospec(req.gid, gru_max_gids);
|
||||||
|
|
||||||
gru = GID_TO_GRU(req.gid);
|
gru = GID_TO_GRU(req.gid);
|
||||||
ubuf = req.buf;
|
ubuf = req.buf;
|
||||||
|
|
|
@ -334,6 +334,9 @@ int sdhci_pci_o2_probe(struct sdhci_pci_chip *chip)
|
||||||
pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch);
|
pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch);
|
||||||
break;
|
break;
|
||||||
case PCI_DEVICE_ID_O2_SEABIRD0:
|
case PCI_DEVICE_ID_O2_SEABIRD0:
|
||||||
|
if (chip->pdev->revision == 0x01)
|
||||||
|
chip->quirks |= SDHCI_QUIRK_DELAY_AFTER_POWER;
|
||||||
|
/* fall through */
|
||||||
case PCI_DEVICE_ID_O2_SEABIRD1:
|
case PCI_DEVICE_ID_O2_SEABIRD1:
|
||||||
/* UnLock WP */
|
/* UnLock WP */
|
||||||
ret = pci_read_config_byte(chip->pdev,
|
ret = pci_read_config_byte(chip->pdev,
|
||||||
|
|
|
@ -208,7 +208,7 @@ comment "Disk-On-Chip Device Drivers"
|
||||||
config MTD_DOCG3
|
config MTD_DOCG3
|
||||||
tristate "M-Systems Disk-On-Chip G3"
|
tristate "M-Systems Disk-On-Chip G3"
|
||||||
select BCH
|
select BCH
|
||||||
select BCH_CONST_PARAMS
|
select BCH_CONST_PARAMS if !MTD_NAND_BCH
|
||||||
select BITREVERSE
|
select BITREVERSE
|
||||||
---help---
|
---help---
|
||||||
This provides an MTD device driver for the M-Systems DiskOnChip
|
This provides an MTD device driver for the M-Systems DiskOnChip
|
||||||
|
|
|
@ -12379,6 +12379,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
|
||||||
{
|
{
|
||||||
struct tg3 *tp = netdev_priv(dev);
|
struct tg3 *tp = netdev_priv(dev);
|
||||||
int i, irq_sync = 0, err = 0;
|
int i, irq_sync = 0, err = 0;
|
||||||
|
bool reset_phy = false;
|
||||||
|
|
||||||
if ((ering->rx_pending > tp->rx_std_ring_mask) ||
|
if ((ering->rx_pending > tp->rx_std_ring_mask) ||
|
||||||
(ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) ||
|
(ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) ||
|
||||||
|
@ -12410,7 +12411,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
|
||||||
|
|
||||||
if (netif_running(dev)) {
|
if (netif_running(dev)) {
|
||||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||||
err = tg3_restart_hw(tp, false);
|
/* Reset PHY to avoid PHY lock up */
|
||||||
|
if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
|
||||||
|
tg3_asic_rev(tp) == ASIC_REV_5719 ||
|
||||||
|
tg3_asic_rev(tp) == ASIC_REV_5720)
|
||||||
|
reset_phy = true;
|
||||||
|
|
||||||
|
err = tg3_restart_hw(tp, reset_phy);
|
||||||
if (!err)
|
if (!err)
|
||||||
tg3_netif_start(tp);
|
tg3_netif_start(tp);
|
||||||
}
|
}
|
||||||
|
@ -12444,6 +12451,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||||
{
|
{
|
||||||
struct tg3 *tp = netdev_priv(dev);
|
struct tg3 *tp = netdev_priv(dev);
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
bool reset_phy = false;
|
||||||
|
|
||||||
if (tp->link_config.autoneg == AUTONEG_ENABLE)
|
if (tp->link_config.autoneg == AUTONEG_ENABLE)
|
||||||
tg3_warn_mgmt_link_flap(tp);
|
tg3_warn_mgmt_link_flap(tp);
|
||||||
|
@ -12534,7 +12542,13 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||||
|
|
||||||
if (netif_running(dev)) {
|
if (netif_running(dev)) {
|
||||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||||
err = tg3_restart_hw(tp, false);
|
/* Reset PHY to avoid PHY lock up */
|
||||||
|
if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
|
||||||
|
tg3_asic_rev(tp) == ASIC_REV_5719 ||
|
||||||
|
tg3_asic_rev(tp) == ASIC_REV_5720)
|
||||||
|
reset_phy = true;
|
||||||
|
|
||||||
|
err = tg3_restart_hw(tp, reset_phy);
|
||||||
if (!err)
|
if (!err)
|
||||||
tg3_netif_start(tp);
|
tg3_netif_start(tp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -556,7 +556,7 @@ bnad_get_strings(struct net_device *netdev, u32 stringset, u8 *string)
|
||||||
for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) {
|
for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) {
|
||||||
BUG_ON(!(strlen(bnad_net_stats_strings[i]) <
|
BUG_ON(!(strlen(bnad_net_stats_strings[i]) <
|
||||||
ETH_GSTRING_LEN));
|
ETH_GSTRING_LEN));
|
||||||
memcpy(string, bnad_net_stats_strings[i],
|
strncpy(string, bnad_net_stats_strings[i],
|
||||||
ETH_GSTRING_LEN);
|
ETH_GSTRING_LEN);
|
||||||
string += ETH_GSTRING_LEN;
|
string += ETH_GSTRING_LEN;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1826,11 +1826,12 @@ static void e1000_get_ethtool_stats(struct net_device *netdev,
|
||||||
{
|
{
|
||||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||||
int i;
|
int i;
|
||||||
char *p = NULL;
|
|
||||||
const struct e1000_stats *stat = e1000_gstrings_stats;
|
const struct e1000_stats *stat = e1000_gstrings_stats;
|
||||||
|
|
||||||
e1000_update_stats(adapter);
|
e1000_update_stats(adapter);
|
||||||
for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) {
|
for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++, stat++) {
|
||||||
|
char *p;
|
||||||
|
|
||||||
switch (stat->type) {
|
switch (stat->type) {
|
||||||
case NETDEV_STATS:
|
case NETDEV_STATS:
|
||||||
p = (char *)netdev + stat->stat_offset;
|
p = (char *)netdev + stat->stat_offset;
|
||||||
|
@ -1841,15 +1842,13 @@ static void e1000_get_ethtool_stats(struct net_device *netdev,
|
||||||
default:
|
default:
|
||||||
WARN_ONCE(1, "Invalid E1000 stat type: %u index %d\n",
|
WARN_ONCE(1, "Invalid E1000 stat type: %u index %d\n",
|
||||||
stat->type, i);
|
stat->type, i);
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stat->sizeof_stat == sizeof(u64))
|
if (stat->sizeof_stat == sizeof(u64))
|
||||||
data[i] = *(u64 *)p;
|
data[i] = *(u64 *)p;
|
||||||
else
|
else
|
||||||
data[i] = *(u32 *)p;
|
data[i] = *(u32 *)p;
|
||||||
|
|
||||||
stat++;
|
|
||||||
}
|
}
|
||||||
/* BUG_ON(i != E1000_STATS_LEN); */
|
/* BUG_ON(i != E1000_STATS_LEN); */
|
||||||
}
|
}
|
||||||
|
|
|
@ -521,8 +521,6 @@ void e1000_down(struct e1000_adapter *adapter)
|
||||||
struct net_device *netdev = adapter->netdev;
|
struct net_device *netdev = adapter->netdev;
|
||||||
u32 rctl, tctl;
|
u32 rctl, tctl;
|
||||||
|
|
||||||
netif_carrier_off(netdev);
|
|
||||||
|
|
||||||
/* disable receives in the hardware */
|
/* disable receives in the hardware */
|
||||||
rctl = er32(RCTL);
|
rctl = er32(RCTL);
|
||||||
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
||||||
|
@ -538,6 +536,15 @@ void e1000_down(struct e1000_adapter *adapter)
|
||||||
E1000_WRITE_FLUSH();
|
E1000_WRITE_FLUSH();
|
||||||
msleep(10);
|
msleep(10);
|
||||||
|
|
||||||
|
/* Set the carrier off after transmits have been disabled in the
|
||||||
|
* hardware, to avoid race conditions with e1000_watchdog() (which
|
||||||
|
* may be running concurrently to us, checking for the carrier
|
||||||
|
* bit to decide whether it should enable transmits again). Such
|
||||||
|
* a race condition would result into transmission being disabled
|
||||||
|
* in the hardware until the next IFF_DOWN+IFF_UP cycle.
|
||||||
|
*/
|
||||||
|
netif_carrier_off(netdev);
|
||||||
|
|
||||||
napi_disable(&adapter->napi);
|
napi_disable(&adapter->napi);
|
||||||
|
|
||||||
e1000_irq_disable(adapter);
|
e1000_irq_disable(adapter);
|
||||||
|
|
|
@ -380,8 +380,6 @@ static void fm93c56a_select(struct ql3_adapter *qdev)
|
||||||
|
|
||||||
qdev->eeprom_cmd_data = AUBURN_EEPROM_CS_1;
|
qdev->eeprom_cmd_data = AUBURN_EEPROM_CS_1;
|
||||||
ql_write_nvram_reg(qdev, spir, ISP_NVRAM_MASK | qdev->eeprom_cmd_data);
|
ql_write_nvram_reg(qdev, spir, ISP_NVRAM_MASK | qdev->eeprom_cmd_data);
|
||||||
ql_write_nvram_reg(qdev, spir,
|
|
||||||
((ISP_NVRAM_MASK << 16) | qdev->eeprom_cmd_data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1476,6 +1476,8 @@ static void tun_setup(struct net_device *dev)
|
||||||
*/
|
*/
|
||||||
static int tun_validate(struct nlattr *tb[], struct nlattr *data[])
|
static int tun_validate(struct nlattr *tb[], struct nlattr *data[])
|
||||||
{
|
{
|
||||||
|
if (!data)
|
||||||
|
return 0;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1825,6 +1825,12 @@ int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
|
|
||||||
|
if (ret == -EAGAIN) {
|
||||||
|
ath10k_warn(ar, "wmi command %d timeout, restarting hardware\n",
|
||||||
|
cmd_id);
|
||||||
|
queue_work(ar->workqueue, &ar->restart_work);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,6 +158,8 @@ static void nd_async_device_register(void *d, async_cookie_t cookie)
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
}
|
}
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
|
if (dev->parent)
|
||||||
|
put_device(dev->parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nd_async_device_unregister(void *d, async_cookie_t cookie)
|
static void nd_async_device_unregister(void *d, async_cookie_t cookie)
|
||||||
|
@ -175,6 +177,8 @@ static void nd_async_device_unregister(void *d, async_cookie_t cookie)
|
||||||
void __nd_device_register(struct device *dev)
|
void __nd_device_register(struct device *dev)
|
||||||
{
|
{
|
||||||
dev->bus = &nvdimm_bus_type;
|
dev->bus = &nvdimm_bus_type;
|
||||||
|
if (dev->parent)
|
||||||
|
get_device(dev->parent);
|
||||||
get_device(dev);
|
get_device(dev);
|
||||||
async_schedule_domain(nd_async_device_register, dev,
|
async_schedule_domain(nd_async_device_register, dev,
|
||||||
&nd_async_domain);
|
&nd_async_domain);
|
||||||
|
|
|
@ -3061,7 +3061,11 @@ static void disable_igfx_irq(struct pci_dev *dev)
|
||||||
|
|
||||||
pci_iounmap(dev, regs);
|
pci_iounmap(dev, regs);
|
||||||
}
|
}
|
||||||
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0042, disable_igfx_irq);
|
||||||
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0046, disable_igfx_irq);
|
||||||
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x004a, disable_igfx_irq);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
|
||||||
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0106, disable_igfx_irq);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
|
||||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
|
||||||
|
|
||||||
|
|
|
@ -119,6 +119,10 @@
|
||||||
#define RL5C4XX_MISC_CONTROL 0x2F /* 8 bit */
|
#define RL5C4XX_MISC_CONTROL 0x2F /* 8 bit */
|
||||||
#define RL5C4XX_ZV_ENABLE 0x08
|
#define RL5C4XX_ZV_ENABLE 0x08
|
||||||
|
|
||||||
|
/* Misc Control 3 Register */
|
||||||
|
#define RL5C4XX_MISC3 0x00A2 /* 16 bit */
|
||||||
|
#define RL5C47X_MISC3_CB_CLKRUN_DIS BIT(1)
|
||||||
|
|
||||||
#ifdef __YENTA_H
|
#ifdef __YENTA_H
|
||||||
|
|
||||||
#define rl_misc(socket) ((socket)->private[0])
|
#define rl_misc(socket) ((socket)->private[0])
|
||||||
|
@ -156,6 +160,35 @@ static void ricoh_set_zv(struct yenta_socket *socket)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ricoh_set_clkrun(struct yenta_socket *socket, bool quiet)
|
||||||
|
{
|
||||||
|
u16 misc3;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RL5C475II likely has this setting, too, however no datasheet
|
||||||
|
* is publicly available for this chip
|
||||||
|
*/
|
||||||
|
if (socket->dev->device != PCI_DEVICE_ID_RICOH_RL5C476 &&
|
||||||
|
socket->dev->device != PCI_DEVICE_ID_RICOH_RL5C478)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (socket->dev->revision < 0x80)
|
||||||
|
return;
|
||||||
|
|
||||||
|
misc3 = config_readw(socket, RL5C4XX_MISC3);
|
||||||
|
if (misc3 & RL5C47X_MISC3_CB_CLKRUN_DIS) {
|
||||||
|
if (!quiet)
|
||||||
|
dev_dbg(&socket->dev->dev,
|
||||||
|
"CLKRUN feature already disabled\n");
|
||||||
|
} else if (disable_clkrun) {
|
||||||
|
if (!quiet)
|
||||||
|
dev_info(&socket->dev->dev,
|
||||||
|
"Disabling CLKRUN feature\n");
|
||||||
|
misc3 |= RL5C47X_MISC3_CB_CLKRUN_DIS;
|
||||||
|
config_writew(socket, RL5C4XX_MISC3, misc3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void ricoh_save_state(struct yenta_socket *socket)
|
static void ricoh_save_state(struct yenta_socket *socket)
|
||||||
{
|
{
|
||||||
rl_misc(socket) = config_readw(socket, RL5C4XX_MISC);
|
rl_misc(socket) = config_readw(socket, RL5C4XX_MISC);
|
||||||
|
@ -172,6 +205,7 @@ static void ricoh_restore_state(struct yenta_socket *socket)
|
||||||
config_writew(socket, RL5C4XX_16BIT_IO_0, rl_io(socket));
|
config_writew(socket, RL5C4XX_16BIT_IO_0, rl_io(socket));
|
||||||
config_writew(socket, RL5C4XX_16BIT_MEM_0, rl_mem(socket));
|
config_writew(socket, RL5C4XX_16BIT_MEM_0, rl_mem(socket));
|
||||||
config_writew(socket, RL5C4XX_CONFIG, rl_config(socket));
|
config_writew(socket, RL5C4XX_CONFIG, rl_config(socket));
|
||||||
|
ricoh_set_clkrun(socket, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -197,6 +231,7 @@ static int ricoh_override(struct yenta_socket *socket)
|
||||||
config_writew(socket, RL5C4XX_CONFIG, config);
|
config_writew(socket, RL5C4XX_CONFIG, config);
|
||||||
|
|
||||||
ricoh_set_zv(socket);
|
ricoh_set_zv(socket);
|
||||||
|
ricoh_set_clkrun(socket, false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,8 @@
|
||||||
|
|
||||||
static bool disable_clkrun;
|
static bool disable_clkrun;
|
||||||
module_param(disable_clkrun, bool, 0444);
|
module_param(disable_clkrun, bool, 0444);
|
||||||
MODULE_PARM_DESC(disable_clkrun, "If PC card doesn't function properly, please try this option");
|
MODULE_PARM_DESC(disable_clkrun,
|
||||||
|
"If PC card doesn't function properly, please try this option (TI and Ricoh bridges only)");
|
||||||
|
|
||||||
static bool isa_probe = 1;
|
static bool isa_probe = 1;
|
||||||
module_param(isa_probe, bool, 0444);
|
module_param(isa_probe, bool, 0444);
|
||||||
|
|
|
@ -331,6 +331,8 @@ static int pmic_mpp_set_mux(struct pinctrl_dev *pctldev, unsigned function,
|
||||||
pad->function = function;
|
pad->function = function;
|
||||||
|
|
||||||
ret = pmic_mpp_write_mode_ctl(state, pad);
|
ret = pmic_mpp_write_mode_ctl(state, pad);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
val = pad->is_enabled << PMIC_MPP_REG_MASTER_EN_SHIFT;
|
val = pad->is_enabled << PMIC_MPP_REG_MASTER_EN_SHIFT;
|
||||||
|
|
||||||
|
@ -355,13 +357,12 @@ static int pmic_mpp_config_get(struct pinctrl_dev *pctldev,
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case PIN_CONFIG_BIAS_DISABLE:
|
case PIN_CONFIG_BIAS_DISABLE:
|
||||||
arg = pad->pullup == PMIC_MPP_PULL_UP_OPEN;
|
if (pad->pullup != PMIC_MPP_PULL_UP_OPEN)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_BIAS_PULL_UP:
|
case PIN_CONFIG_BIAS_PULL_UP:
|
||||||
switch (pad->pullup) {
|
switch (pad->pullup) {
|
||||||
case PMIC_MPP_PULL_UP_OPEN:
|
|
||||||
arg = 0;
|
|
||||||
break;
|
|
||||||
case PMIC_MPP_PULL_UP_0P6KOHM:
|
case PMIC_MPP_PULL_UP_0P6KOHM:
|
||||||
arg = 600;
|
arg = 600;
|
||||||
break;
|
break;
|
||||||
|
@ -376,13 +377,17 @@ static int pmic_mpp_config_get(struct pinctrl_dev *pctldev,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
|
case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
|
||||||
arg = !pad->is_enabled;
|
if (pad->is_enabled)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_POWER_SOURCE:
|
case PIN_CONFIG_POWER_SOURCE:
|
||||||
arg = pad->power_source;
|
arg = pad->power_source;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_INPUT_ENABLE:
|
case PIN_CONFIG_INPUT_ENABLE:
|
||||||
arg = pad->input_enabled;
|
if (!pad->input_enabled)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_OUTPUT:
|
case PIN_CONFIG_OUTPUT:
|
||||||
arg = pad->out_value;
|
arg = pad->out_value;
|
||||||
|
@ -394,7 +399,9 @@ static int pmic_mpp_config_get(struct pinctrl_dev *pctldev,
|
||||||
arg = pad->amux_input;
|
arg = pad->amux_input;
|
||||||
break;
|
break;
|
||||||
case PMIC_MPP_CONF_PAIRED:
|
case PMIC_MPP_CONF_PAIRED:
|
||||||
arg = pad->paired;
|
if (!pad->paired)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_DRIVE_STRENGTH:
|
case PIN_CONFIG_DRIVE_STRENGTH:
|
||||||
arg = pad->drive_strength;
|
arg = pad->drive_strength;
|
||||||
|
@ -538,6 +545,10 @@ static int pmic_mpp_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ret = pmic_mpp_write(state, pad, PMIC_MPP_REG_SINK_CTL, pad->drive_strength);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
val = pad->is_enabled << PMIC_MPP_REG_MASTER_EN_SHIFT;
|
val = pad->is_enabled << PMIC_MPP_REG_MASTER_EN_SHIFT;
|
||||||
|
|
||||||
return pmic_mpp_write(state, pad, PMIC_MPP_REG_EN_CTL, val);
|
return pmic_mpp_write(state, pad, PMIC_MPP_REG_EN_CTL, val);
|
||||||
|
|
|
@ -260,22 +260,32 @@ static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case PIN_CONFIG_BIAS_DISABLE:
|
case PIN_CONFIG_BIAS_DISABLE:
|
||||||
arg = pin->bias == PM8XXX_GPIO_BIAS_NP;
|
if (pin->bias != PM8XXX_GPIO_BIAS_NP)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||||
arg = pin->bias == PM8XXX_GPIO_BIAS_PD;
|
if (pin->bias != PM8XXX_GPIO_BIAS_PD)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_BIAS_PULL_UP:
|
case PIN_CONFIG_BIAS_PULL_UP:
|
||||||
arg = pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30;
|
if (pin->bias > PM8XXX_GPIO_BIAS_PU_1P5_30)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PM8XXX_QCOM_PULL_UP_STRENGTH:
|
case PM8XXX_QCOM_PULL_UP_STRENGTH:
|
||||||
arg = pin->pull_up_strength;
|
arg = pin->pull_up_strength;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
|
case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
|
||||||
arg = pin->disable;
|
if (!pin->disable)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_INPUT_ENABLE:
|
case PIN_CONFIG_INPUT_ENABLE:
|
||||||
arg = pin->mode == PM8XXX_GPIO_MODE_INPUT;
|
if (pin->mode != PM8XXX_GPIO_MODE_INPUT)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_OUTPUT:
|
case PIN_CONFIG_OUTPUT:
|
||||||
if (pin->mode & PM8XXX_GPIO_MODE_OUTPUT)
|
if (pin->mode & PM8XXX_GPIO_MODE_OUTPUT)
|
||||||
|
@ -290,10 +300,14 @@ static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
|
||||||
arg = pin->output_strength;
|
arg = pin->output_strength;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_DRIVE_PUSH_PULL:
|
case PIN_CONFIG_DRIVE_PUSH_PULL:
|
||||||
arg = !pin->open_drain;
|
if (pin->open_drain)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
case PIN_CONFIG_DRIVE_OPEN_DRAIN:
|
case PIN_CONFIG_DRIVE_OPEN_DRAIN:
|
||||||
arg = pin->open_drain;
|
if (!pin->open_drain)
|
||||||
|
return -EINVAL;
|
||||||
|
arg = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -233,6 +233,7 @@ static const struct bios_settings bios_tbl[] = {
|
||||||
{"Gateway", "LT31", "v1.3201", 0x55, 0x58, {0x9e, 0x00}, 0},
|
{"Gateway", "LT31", "v1.3201", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||||
{"Gateway", "LT31", "v1.3302", 0x55, 0x58, {0x9e, 0x00}, 0},
|
{"Gateway", "LT31", "v1.3302", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||||
{"Gateway", "LT31", "v1.3303t", 0x55, 0x58, {0x9e, 0x00}, 0},
|
{"Gateway", "LT31", "v1.3303t", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||||
|
{"Gateway", "LT31", "v1.3307", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||||
/* Packard Bell */
|
/* Packard Bell */
|
||||||
{"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00}, 0},
|
{"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00}, 0},
|
||||||
{"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00}, 0},
|
{"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00}, 0},
|
||||||
|
|
|
@ -50,8 +50,10 @@ static int __init rtc_hctosys(void)
|
||||||
tv64.tv_sec = rtc_tm_to_time64(&tm);
|
tv64.tv_sec = rtc_tm_to_time64(&tm);
|
||||||
|
|
||||||
#if BITS_PER_LONG == 32
|
#if BITS_PER_LONG == 32
|
||||||
if (tv64.tv_sec > INT_MAX)
|
if (tv64.tv_sec > INT_MAX) {
|
||||||
|
err = -ERANGE;
|
||||||
goto err_read;
|
goto err_read;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
err = do_settimeofday64(&tv64);
|
err = do_settimeofday64(&tv64);
|
||||||
|
|
|
@ -1349,6 +1349,7 @@ static int esp_data_bytes_sent(struct esp *esp, struct esp_cmd_entry *ent,
|
||||||
|
|
||||||
bytes_sent = esp->data_dma_len;
|
bytes_sent = esp->data_dma_len;
|
||||||
bytes_sent -= ecount;
|
bytes_sent -= ecount;
|
||||||
|
bytes_sent -= esp->send_cmd_residual;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The am53c974 has a DMA 'pecularity'. The doc states:
|
* The am53c974 has a DMA 'pecularity'. The doc states:
|
||||||
|
|
|
@ -540,6 +540,8 @@ struct esp {
|
||||||
|
|
||||||
void *dma;
|
void *dma;
|
||||||
int dmarev;
|
int dmarev;
|
||||||
|
|
||||||
|
u32 send_cmd_residual;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A front-end driver for the ESP chip should do the following in
|
/* A front-end driver for the ESP chip should do the following in
|
||||||
|
|
|
@ -3485,6 +3485,7 @@ lpfc_sli_handle_slow_ring_event_s4(struct lpfc_hba *phba,
|
||||||
struct hbq_dmabuf *dmabuf;
|
struct hbq_dmabuf *dmabuf;
|
||||||
struct lpfc_cq_event *cq_event;
|
struct lpfc_cq_event *cq_event;
|
||||||
unsigned long iflag;
|
unsigned long iflag;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
spin_lock_irqsave(&phba->hbalock, iflag);
|
spin_lock_irqsave(&phba->hbalock, iflag);
|
||||||
phba->hba_flag &= ~HBA_SP_QUEUE_EVT;
|
phba->hba_flag &= ~HBA_SP_QUEUE_EVT;
|
||||||
|
@ -3506,16 +3507,22 @@ lpfc_sli_handle_slow_ring_event_s4(struct lpfc_hba *phba,
|
||||||
if (irspiocbq)
|
if (irspiocbq)
|
||||||
lpfc_sli_sp_handle_rspiocb(phba, pring,
|
lpfc_sli_sp_handle_rspiocb(phba, pring,
|
||||||
irspiocbq);
|
irspiocbq);
|
||||||
|
count++;
|
||||||
break;
|
break;
|
||||||
case CQE_CODE_RECEIVE:
|
case CQE_CODE_RECEIVE:
|
||||||
case CQE_CODE_RECEIVE_V1:
|
case CQE_CODE_RECEIVE_V1:
|
||||||
dmabuf = container_of(cq_event, struct hbq_dmabuf,
|
dmabuf = container_of(cq_event, struct hbq_dmabuf,
|
||||||
cq_event);
|
cq_event);
|
||||||
lpfc_sli4_handle_received_buffer(phba, dmabuf);
|
lpfc_sli4_handle_received_buffer(phba, dmabuf);
|
||||||
|
count++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Limit the number of events to 64 to avoid soft lockups */
|
||||||
|
if (count == 64)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -426,6 +426,8 @@ static void mac_esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count,
|
||||||
scsi_esp_cmd(esp, ESP_CMD_TI);
|
scsi_esp_cmd(esp, ESP_CMD_TI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp->send_cmd_residual = esp_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mac_esp_irq_pending(struct esp *esp)
|
static int mac_esp_irq_pending(struct esp *esp)
|
||||||
|
|
|
@ -6510,6 +6510,9 @@ static int megasas_mgmt_compat_ioctl_fw(struct file *file, unsigned long arg)
|
||||||
get_user(user_sense_off, &cioc->sense_off))
|
get_user(user_sense_off, &cioc->sense_off))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (local_sense_off != user_sense_off)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (local_sense_len) {
|
if (local_sense_len) {
|
||||||
void __user **sense_ioc_ptr =
|
void __user **sense_ioc_ptr =
|
||||||
(void __user **)((u8 *)((unsigned long)&ioc->frame.raw) + local_sense_off);
|
(void __user **)((u8 *)((unsigned long)&ioc->frame.raw) + local_sense_off);
|
||||||
|
|
|
@ -3315,10 +3315,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
|
||||||
mcp->mb[0] = MBC_PORT_PARAMS;
|
mcp->mb[0] = MBC_PORT_PARAMS;
|
||||||
mcp->mb[1] = loop_id;
|
mcp->mb[1] = loop_id;
|
||||||
mcp->mb[2] = BIT_0;
|
mcp->mb[2] = BIT_0;
|
||||||
if (IS_CNA_CAPABLE(vha->hw))
|
|
||||||
mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
|
mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
|
||||||
else
|
|
||||||
mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
|
|
||||||
mcp->mb[9] = vha->vp_idx;
|
mcp->mb[9] = vha->vp_idx;
|
||||||
mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
|
mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||||
mcp->in_mb = MBX_3|MBX_1|MBX_0;
|
mcp->in_mb = MBX_3|MBX_1|MBX_0;
|
||||||
|
|
|
@ -738,7 +738,7 @@ void tegra_pmc_init_tsense_reset(struct tegra_pmc *pmc)
|
||||||
if (!pmc->soc->has_tsense_reset)
|
if (!pmc->soc->has_tsense_reset)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
np = of_find_node_by_name(pmc->dev->of_node, "i2c-thermtrip");
|
np = of_get_child_by_name(pmc->dev->of_node, "i2c-thermtrip");
|
||||||
if (!np) {
|
if (!np) {
|
||||||
dev_warn(dev, "i2c-thermtrip node not found, %s.\n", disabled);
|
dev_warn(dev, "i2c-thermtrip node not found, %s.\n", disabled);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* TURBOchannel bus services.
|
* TURBOchannel bus services.
|
||||||
*
|
*
|
||||||
* Copyright (c) Harald Koerfgen, 1998
|
* Copyright (c) Harald Koerfgen, 1998
|
||||||
* Copyright (c) 2001, 2003, 2005, 2006 Maciej W. Rozycki
|
* Copyright (c) 2001, 2003, 2005, 2006, 2018 Maciej W. Rozycki
|
||||||
* Copyright (c) 2005 James Simmons
|
* Copyright (c) 2005 James Simmons
|
||||||
*
|
*
|
||||||
* This file is subject to the terms and conditions of the GNU
|
* This file is subject to the terms and conditions of the GNU
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
* directory of this archive for more details.
|
* directory of this archive for more details.
|
||||||
*/
|
*/
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
@ -92,6 +93,11 @@ static void __init tc_bus_add_devices(struct tc_bus *tbus)
|
||||||
tdev->dev.bus = &tc_bus_type;
|
tdev->dev.bus = &tc_bus_type;
|
||||||
tdev->slot = slot;
|
tdev->slot = slot;
|
||||||
|
|
||||||
|
/* TURBOchannel has 34-bit DMA addressing (16GiB space). */
|
||||||
|
tdev->dma_mask = DMA_BIT_MASK(34);
|
||||||
|
tdev->dev.dma_mask = &tdev->dma_mask;
|
||||||
|
tdev->dev.coherent_dma_mask = DMA_BIT_MASK(34);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
tdev->firmware[i] =
|
tdev->firmware[i] =
|
||||||
readb(module + offset + TC_FIRM_VER + 4 * i);
|
readb(module + offset + TC_FIRM_VER + 4 * i);
|
||||||
|
|
|
@ -133,6 +133,11 @@ static void kgdboc_unregister_kbd(void)
|
||||||
|
|
||||||
static int kgdboc_option_setup(char *opt)
|
static int kgdboc_option_setup(char *opt)
|
||||||
{
|
{
|
||||||
|
if (!opt) {
|
||||||
|
pr_err("kgdboc: config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (strlen(opt) >= MAX_CONFIG_LEN) {
|
if (strlen(opt) >= MAX_CONFIG_LEN) {
|
||||||
printk(KERN_ERR "kgdboc: config string too long\n");
|
printk(KERN_ERR "kgdboc: config string too long\n");
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
|
|
|
@ -648,7 +648,7 @@ static void sc16is7xx_handle_tx(struct uart_port *port)
|
||||||
uart_write_wakeup(port);
|
uart_write_wakeup(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno)
|
static bool sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno)
|
||||||
{
|
{
|
||||||
struct uart_port *port = &s->p[portno].port;
|
struct uart_port *port = &s->p[portno].port;
|
||||||
|
|
||||||
|
@ -657,7 +657,7 @@ static void sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno)
|
||||||
|
|
||||||
iir = sc16is7xx_port_read(port, SC16IS7XX_IIR_REG);
|
iir = sc16is7xx_port_read(port, SC16IS7XX_IIR_REG);
|
||||||
if (iir & SC16IS7XX_IIR_NO_INT_BIT)
|
if (iir & SC16IS7XX_IIR_NO_INT_BIT)
|
||||||
break;
|
return false;
|
||||||
|
|
||||||
iir &= SC16IS7XX_IIR_ID_MASK;
|
iir &= SC16IS7XX_IIR_ID_MASK;
|
||||||
|
|
||||||
|
@ -685,16 +685,23 @@ static void sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno)
|
||||||
port->line, iir);
|
port->line, iir);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (1);
|
} while (0);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sc16is7xx_ist(struct kthread_work *ws)
|
static void sc16is7xx_ist(struct kthread_work *ws)
|
||||||
{
|
{
|
||||||
struct sc16is7xx_port *s = to_sc16is7xx_port(ws, irq_work);
|
struct sc16is7xx_port *s = to_sc16is7xx_port(ws, irq_work);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
bool keep_polling = false;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < s->devtype->nr_uart; ++i)
|
for (i = 0; i < s->devtype->nr_uart; ++i)
|
||||||
sc16is7xx_port_irq(s, i);
|
keep_polling |= sc16is7xx_port_irq(s, i);
|
||||||
|
if (!keep_polling)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t sc16is7xx_irq(int irq, void *dev_id)
|
static irqreturn_t sc16is7xx_irq(int irq, void *dev_id)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue