mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
LSK Android 14.12 v3.10
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUkXoFAAoJECTWi3JdVIfQT7QH/RNU1mHpDln1QSGGatOzKzDo sYU0A5aUlsjeoh6LUzohz6tSSUOMSEE8lHJo8lN/iI8kIRuiZX4TND1Chap/1s7x VlqnWGpKIIsILt4zypK/RL/Xfz0Kyj9K+uUOc6JJJWYIjLUdavR9dVojwE830Czm QzHH5P0AmxPUtahN/N2FLjpbTDERPRcjyQ2hkMB5vhvrHXJeP3uNjGS5pGmhHWdl gA+410QXAAc7U+rgheh8xlHlykCsi+it7n6K+aO9t5JbD34m7JhMy6WWALGdLOrD lqzbxyRG27Cs0JGTjPPiKFomo7b/o895NIaqxxBh6h2iVv2fPssfyvEYGxNUYcM= =6dK4 -----END PGP SIGNATURE----- Merge tag 'lsk-v3.10-android-14.12' LSK Android 14.12 v3.10 Conflicts: include/linux/clk-provider.h
This commit is contained in:
commit
79437e3372
49
Documentation/devicetree/bindings/power/power_domain.txt
Normal file
49
Documentation/devicetree/bindings/power/power_domain.txt
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
* Generic PM domains
|
||||
|
||||
System on chip designs are often divided into multiple PM domains that can be
|
||||
used for power gating of selected IP blocks for power saving by reduced leakage
|
||||
current.
|
||||
|
||||
This device tree binding can be used to bind PM domain consumer devices with
|
||||
their PM domains provided by PM domain providers. A PM domain provider can be
|
||||
represented by any node in the device tree and can provide one or more PM
|
||||
domains. A consumer node can refer to the provider by a phandle and a set of
|
||||
phandle arguments (so called PM domain specifiers) of length specified by the
|
||||
#power-domain-cells property in the PM domain provider node.
|
||||
|
||||
==PM domain providers==
|
||||
|
||||
Required properties:
|
||||
- #power-domain-cells : Number of cells in a PM domain specifier;
|
||||
Typically 0 for nodes representing a single PM domain and 1 for nodes
|
||||
providing multiple PM domains (e.g. power controllers), but can be any value
|
||||
as specified by device tree binding documentation of particular provider.
|
||||
|
||||
Example:
|
||||
|
||||
power: power-controller@12340000 {
|
||||
compatible = "foo,power-controller";
|
||||
reg = <0x12340000 0x1000>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
The node above defines a power controller that is a PM domain provider and
|
||||
expects one cell as its phandle argument.
|
||||
|
||||
==PM domain consumers==
|
||||
|
||||
Required properties:
|
||||
- power-domains : A phandle and PM domain specifier as defined by bindings of
|
||||
the power controller specified by phandle.
|
||||
|
||||
Example:
|
||||
|
||||
leaky-device@12350000 {
|
||||
compatible = "foo,i-leak-current";
|
||||
reg = <0x12350000 0x1000>;
|
||||
power-domains = <&power 0>;
|
||||
};
|
||||
|
||||
The node above defines a typical PM domain consumer device, which is located
|
||||
inside a PM domain with index 0 of a power controller represented by a node
|
||||
with the label "power".
|
||||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 61
|
||||
SUBLEVEL = 62
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -202,7 +202,6 @@ __v7_pj4b_setup:
|
|||
/* Auxiliary Debug Modes Control 1 Register */
|
||||
#define PJ4B_STATIC_BP (1 << 2) /* Enable Static BP */
|
||||
#define PJ4B_INTER_PARITY (1 << 8) /* Disable Internal Parity Handling */
|
||||
#define PJ4B_BCK_OFF_STREX (1 << 5) /* Enable the back off of STREX instr */
|
||||
#define PJ4B_CLEAN_LINE (1 << 16) /* Disable data transfer for clean line */
|
||||
|
||||
/* Auxiliary Debug Modes Control 2 Register */
|
||||
|
|
@ -225,7 +224,6 @@ __v7_pj4b_setup:
|
|||
/* Auxiliary Debug Modes Control 1 Register */
|
||||
mrc p15, 1, r0, c15, c1, 1
|
||||
orr r0, r0, #PJ4B_CLEAN_LINE
|
||||
orr r0, r0, #PJ4B_BCK_OFF_STREX
|
||||
orr r0, r0, #PJ4B_INTER_PARITY
|
||||
bic r0, r0, #PJ4B_STATIC_BP
|
||||
mcr p15, 1, r0, c15, c1, 1
|
||||
|
|
|
|||
|
|
@ -535,7 +535,7 @@ ENTRY(cpu_xscale_do_suspend)
|
|||
mrc p15, 0, r5, c15, c1, 0 @ CP access reg
|
||||
mrc p15, 0, r6, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r7, c3, c0, 0 @ domain ID
|
||||
mrc p15, 0, r8, c1, c1, 0 @ auxiliary control reg
|
||||
mrc p15, 0, r8, c1, c0, 1 @ auxiliary control reg
|
||||
mrc p15, 0, r9, c1, c0, 0 @ control reg
|
||||
bic r4, r4, #2 @ clear frequency change bit
|
||||
stmia r0, {r4 - r9} @ store cp regs
|
||||
|
|
@ -552,7 +552,7 @@ ENTRY(cpu_xscale_do_resume)
|
|||
mcr p15, 0, r6, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r7, c3, c0, 0 @ domain ID
|
||||
mcr p15, 0, r1, c2, c0, 0 @ translation table base addr
|
||||
mcr p15, 0, r8, c1, c1, 0 @ auxiliary control reg
|
||||
mcr p15, 0, r8, c1, c0, 1 @ auxiliary control reg
|
||||
mov r0, r9 @ control register
|
||||
b cpu_resume_mmu
|
||||
ENDPROC(cpu_xscale_do_resume)
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
|||
KBUILD_DEFCONFIG := defconfig
|
||||
|
||||
KBUILD_CFLAGS += -mgeneral-regs-only
|
||||
KBUILD_CFLAGS += -fno-pic
|
||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
||||
KBUILD_CPPFLAGS += -mbig-endian
|
||||
AS += -EB
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ obj-$(CONFIG_GPIOLIB) += gpio.o
|
|||
# Serial port support
|
||||
#
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_SERIAL_8250) += serial.o
|
||||
loongson-serial-$(CONFIG_SERIAL_8250) := serial.o
|
||||
obj-y += $(loongson-serial-m) $(loongson-serial-y)
|
||||
obj-$(CONFIG_LOONGSON_UART_BASE) += uart_base.o
|
||||
obj-$(CONFIG_LOONGSON_MC146818) += rtc.o
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ static inline int unwind_user_frame(struct stackframe *old_frame,
|
|||
/* This marks the end of the previous function,
|
||||
which means we overran. */
|
||||
break;
|
||||
stack_size = (unsigned) stack_adjustment;
|
||||
stack_size = (unsigned long) stack_adjustment;
|
||||
} else if (is_ra_save_ins(&ip)) {
|
||||
int ra_slot = ip.i_format.simmediate;
|
||||
if (ra_slot < 0)
|
||||
|
|
|
|||
|
|
@ -789,7 +789,6 @@ static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
|
|||
unsigned int is_64, struct msi_msg *msg)
|
||||
{
|
||||
struct pnv_ioda_pe *pe = pnv_ioda_get_pe(dev);
|
||||
struct pci_dn *pdn = pci_get_pdn(dev);
|
||||
struct irq_data *idata;
|
||||
struct irq_chip *ichip;
|
||||
unsigned int xive_num = hwirq - phb->msi_base;
|
||||
|
|
@ -806,7 +805,7 @@ static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
|
|||
return -ENXIO;
|
||||
|
||||
/* Force 32-bit MSI on some broken devices */
|
||||
if (pdn && pdn->force_32bit_msi)
|
||||
if (dev->no_64bit_msi)
|
||||
is_64 = 0;
|
||||
|
||||
/* Assign XIVE to PE */
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
/*
|
||||
* Support PCI/PCIe on PowerNV platforms
|
||||
*
|
||||
|
|
@ -47,9 +48,8 @@ static int pnv_msi_check_device(struct pci_dev* pdev, int nvec, int type)
|
|||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||
struct pnv_phb *phb = hose->private_data;
|
||||
struct pci_dn *pdn = pci_get_pdn(pdev);
|
||||
|
||||
if (pdn && pdn->force_32bit_msi && !phb->msi32_support)
|
||||
if (pdev->no_64bit_msi && !phb->msi32_support)
|
||||
return -ENODEV;
|
||||
|
||||
return (phb && phb->msi_bmp.bitmap) ? 0 : -ENODEV;
|
||||
|
|
|
|||
|
|
@ -426,7 +426,7 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
|
|||
*/
|
||||
again:
|
||||
if (type == PCI_CAP_ID_MSI) {
|
||||
if (pdn->force_32bit_msi) {
|
||||
if (pdev->no_64bit_msi) {
|
||||
rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
|
||||
if (rc < 0) {
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -288,10 +288,10 @@ static inline void disable_surveillance(void)
|
|||
args.token = rtas_token("set-indicator");
|
||||
if (args.token == RTAS_UNKNOWN_SERVICE)
|
||||
return;
|
||||
args.nargs = 3;
|
||||
args.nret = 1;
|
||||
args.nargs = cpu_to_be32(3);
|
||||
args.nret = cpu_to_be32(1);
|
||||
args.rets = &args.args[3];
|
||||
args.args[0] = SURVEILLANCE_TOKEN;
|
||||
args.args[0] = cpu_to_be32(SURVEILLANCE_TOKEN);
|
||||
args.args[1] = 0;
|
||||
args.args[2] = 0;
|
||||
enter_rtas(__pa(&args));
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ static inline __u16 __arch_swab16p(const __u16 *addr)
|
|||
{
|
||||
__u16 ret;
|
||||
|
||||
__asm__ __volatile__ ("lduha [%1] %2, %0"
|
||||
__asm__ __volatile__ ("lduha [%2] %3, %0"
|
||||
: "=r" (ret)
|
||||
: "r" (addr), "i" (ASI_PL));
|
||||
: "m" (*addr), "r" (addr), "i" (ASI_PL));
|
||||
return ret;
|
||||
}
|
||||
#define __arch_swab16p __arch_swab16p
|
||||
|
|
@ -20,9 +20,9 @@ static inline __u32 __arch_swab32p(const __u32 *addr)
|
|||
{
|
||||
__u32 ret;
|
||||
|
||||
__asm__ __volatile__ ("lduwa [%1] %2, %0"
|
||||
__asm__ __volatile__ ("lduwa [%2] %3, %0"
|
||||
: "=r" (ret)
|
||||
: "r" (addr), "i" (ASI_PL));
|
||||
: "m" (*addr), "r" (addr), "i" (ASI_PL));
|
||||
return ret;
|
||||
}
|
||||
#define __arch_swab32p __arch_swab32p
|
||||
|
|
@ -31,9 +31,9 @@ static inline __u64 __arch_swab64p(const __u64 *addr)
|
|||
{
|
||||
__u64 ret;
|
||||
|
||||
__asm__ __volatile__ ("ldxa [%1] %2, %0"
|
||||
__asm__ __volatile__ ("ldxa [%2] %3, %0"
|
||||
: "=r" (ret)
|
||||
: "r" (addr), "i" (ASI_PL));
|
||||
: "m" (*addr), "r" (addr), "i" (ASI_PL));
|
||||
return ret;
|
||||
}
|
||||
#define __arch_swab64p __arch_swab64p
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
#define THREAD_SIZE_ORDER 1
|
||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
|
||||
|
||||
#define STACKFAULT_STACK 0
|
||||
#define DOUBLEFAULT_STACK 1
|
||||
#define NMI_STACK 0
|
||||
#define DEBUG_STACK 0
|
||||
|
|
|
|||
|
|
@ -14,12 +14,11 @@
|
|||
#define IRQ_STACK_ORDER 2
|
||||
#define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER)
|
||||
|
||||
#define STACKFAULT_STACK 1
|
||||
#define DOUBLEFAULT_STACK 2
|
||||
#define NMI_STACK 3
|
||||
#define DEBUG_STACK 4
|
||||
#define MCE_STACK 5
|
||||
#define N_EXCEPTION_STACKS 5 /* hw limit: 7 */
|
||||
#define DOUBLEFAULT_STACK 1
|
||||
#define NMI_STACK 2
|
||||
#define DEBUG_STACK 3
|
||||
#define MCE_STACK 4
|
||||
#define N_EXCEPTION_STACKS 4 /* hw limit: 7 */
|
||||
|
||||
#define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT)
|
||||
#define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1))
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ struct thread_info {
|
|||
/* Only used for 64 bit */
|
||||
#define _TIF_DO_NOTIFY_MASK \
|
||||
(_TIF_SIGPENDING | _TIF_MCE_NOTIFY | _TIF_NOTIFY_RESUME | \
|
||||
_TIF_USER_RETURN_NOTIFY)
|
||||
_TIF_USER_RETURN_NOTIFY | _TIF_UPROBE)
|
||||
|
||||
/* flags to check in __switch_to() */
|
||||
#define _TIF_WORK_CTXSW \
|
||||
|
|
|
|||
|
|
@ -144,6 +144,8 @@ EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
|
|||
|
||||
static int __init x86_xsave_setup(char *s)
|
||||
{
|
||||
if (strlen(s))
|
||||
return 0;
|
||||
setup_clear_cpu_cap(X86_FEATURE_XSAVE);
|
||||
setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT);
|
||||
setup_clear_cpu_cap(X86_FEATURE_AVX);
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ static char x86_stack_ids[][8] = {
|
|||
[ DEBUG_STACK-1 ] = "#DB",
|
||||
[ NMI_STACK-1 ] = "NMI",
|
||||
[ DOUBLEFAULT_STACK-1 ] = "#DF",
|
||||
[ STACKFAULT_STACK-1 ] = "#SS",
|
||||
[ MCE_STACK-1 ] = "#MC",
|
||||
#if DEBUG_STKSZ > EXCEPTION_STKSZ
|
||||
[ N_EXCEPTION_STACKS ...
|
||||
|
|
|
|||
|
|
@ -1068,9 +1068,15 @@ ENTRY(native_iret)
|
|||
jnz native_irq_return_ldt
|
||||
#endif
|
||||
|
||||
.global native_irq_return_iret
|
||||
native_irq_return_iret:
|
||||
/*
|
||||
* This may fault. Non-paranoid faults on return to userspace are
|
||||
* handled by fixup_bad_iret. These include #SS, #GP, and #NP.
|
||||
* Double-faults due to espfix64 are handled in do_double_fault.
|
||||
* Other faults here are fatal.
|
||||
*/
|
||||
iretq
|
||||
_ASM_EXTABLE(native_irq_return_iret, bad_iret)
|
||||
|
||||
#ifdef CONFIG_X86_ESPFIX64
|
||||
native_irq_return_ldt:
|
||||
|
|
@ -1098,25 +1104,6 @@ native_irq_return_ldt:
|
|||
jmp native_irq_return_iret
|
||||
#endif
|
||||
|
||||
.section .fixup,"ax"
|
||||
bad_iret:
|
||||
/*
|
||||
* The iret traps when the %cs or %ss being restored is bogus.
|
||||
* We've lost the original trap vector and error code.
|
||||
* #GPF is the most likely one to get for an invalid selector.
|
||||
* So pretend we completed the iret and took the #GPF in user mode.
|
||||
*
|
||||
* We are now running with the kernel GS after exception recovery.
|
||||
* But error_entry expects us to have user GS to match the user %cs,
|
||||
* so swap back.
|
||||
*/
|
||||
pushq $0
|
||||
|
||||
SWAPGS
|
||||
jmp general_protection
|
||||
|
||||
.previous
|
||||
|
||||
/* edi: workmask, edx: work */
|
||||
retint_careful:
|
||||
CFI_RESTORE_STATE
|
||||
|
|
@ -1164,37 +1151,6 @@ ENTRY(retint_kernel)
|
|||
CFI_ENDPROC
|
||||
END(common_interrupt)
|
||||
|
||||
/*
|
||||
* If IRET takes a fault on the espfix stack, then we
|
||||
* end up promoting it to a doublefault. In that case,
|
||||
* modify the stack to make it look like we just entered
|
||||
* the #GP handler from user space, similar to bad_iret.
|
||||
*/
|
||||
#ifdef CONFIG_X86_ESPFIX64
|
||||
ALIGN
|
||||
__do_double_fault:
|
||||
XCPT_FRAME 1 RDI+8
|
||||
movq RSP(%rdi),%rax /* Trap on the espfix stack? */
|
||||
sarq $PGDIR_SHIFT,%rax
|
||||
cmpl $ESPFIX_PGD_ENTRY,%eax
|
||||
jne do_double_fault /* No, just deliver the fault */
|
||||
cmpl $__KERNEL_CS,CS(%rdi)
|
||||
jne do_double_fault
|
||||
movq RIP(%rdi),%rax
|
||||
cmpq $native_irq_return_iret,%rax
|
||||
jne do_double_fault /* This shouldn't happen... */
|
||||
movq PER_CPU_VAR(kernel_stack),%rax
|
||||
subq $(6*8-KERNEL_STACK_OFFSET),%rax /* Reset to original stack */
|
||||
movq %rax,RSP(%rdi)
|
||||
movq $0,(%rax) /* Missing (lost) #GP error code */
|
||||
movq $general_protection,RIP(%rdi)
|
||||
retq
|
||||
CFI_ENDPROC
|
||||
END(__do_double_fault)
|
||||
#else
|
||||
# define __do_double_fault do_double_fault
|
||||
#endif
|
||||
|
||||
/*
|
||||
* End of kprobes section
|
||||
*/
|
||||
|
|
@ -1363,7 +1319,7 @@ zeroentry overflow do_overflow
|
|||
zeroentry bounds do_bounds
|
||||
zeroentry invalid_op do_invalid_op
|
||||
zeroentry device_not_available do_device_not_available
|
||||
paranoiderrorentry double_fault __do_double_fault
|
||||
paranoiderrorentry double_fault do_double_fault
|
||||
zeroentry coprocessor_segment_overrun do_coprocessor_segment_overrun
|
||||
errorentry invalid_TSS do_invalid_TSS
|
||||
errorentry segment_not_present do_segment_not_present
|
||||
|
|
@ -1533,7 +1489,7 @@ apicinterrupt HYPERVISOR_CALLBACK_VECTOR \
|
|||
|
||||
paranoidzeroentry_ist debug do_debug DEBUG_STACK
|
||||
paranoidzeroentry_ist int3 do_int3 DEBUG_STACK
|
||||
paranoiderrorentry stack_segment do_stack_segment
|
||||
errorentry stack_segment do_stack_segment
|
||||
#ifdef CONFIG_XEN
|
||||
zeroentry xen_debug do_debug
|
||||
zeroentry xen_int3 do_int3
|
||||
|
|
@ -1643,16 +1599,15 @@ error_sti:
|
|||
|
||||
/*
|
||||
* There are two places in the kernel that can potentially fault with
|
||||
* usergs. Handle them here. The exception handlers after iret run with
|
||||
* kernel gs again, so don't set the user space flag. B stepping K8s
|
||||
* sometimes report an truncated RIP for IRET exceptions returning to
|
||||
* compat mode. Check for these here too.
|
||||
* usergs. Handle them here. B stepping K8s sometimes report a
|
||||
* truncated RIP for IRET exceptions returning to compat mode. Check
|
||||
* for these here too.
|
||||
*/
|
||||
error_kernelspace:
|
||||
incl %ebx
|
||||
leaq native_irq_return_iret(%rip),%rcx
|
||||
cmpq %rcx,RIP+8(%rsp)
|
||||
je error_swapgs
|
||||
je error_bad_iret
|
||||
movl %ecx,%eax /* zero extend */
|
||||
cmpq %rax,RIP+8(%rsp)
|
||||
je bstep_iret
|
||||
|
|
@ -1663,7 +1618,15 @@ error_kernelspace:
|
|||
bstep_iret:
|
||||
/* Fix truncated RIP */
|
||||
movq %rcx,RIP+8(%rsp)
|
||||
jmp error_swapgs
|
||||
/* fall through */
|
||||
|
||||
error_bad_iret:
|
||||
SWAPGS
|
||||
mov %rsp,%rdi
|
||||
call fixup_bad_iret
|
||||
mov %rax,%rsp
|
||||
decl %ebx /* Return to usergs */
|
||||
jmp error_sti
|
||||
CFI_ENDPROC
|
||||
END(error_entry)
|
||||
|
||||
|
|
|
|||
|
|
@ -220,33 +220,41 @@ DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun",
|
|||
coprocessor_segment_overrun)
|
||||
DO_ERROR(X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS)
|
||||
DO_ERROR(X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present)
|
||||
#ifdef CONFIG_X86_32
|
||||
DO_ERROR(X86_TRAP_SS, SIGBUS, "stack segment", stack_segment)
|
||||
#endif
|
||||
DO_ERROR_INFO(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check,
|
||||
BUS_ADRALN, 0)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/* Runs on IST stack */
|
||||
dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code)
|
||||
{
|
||||
enum ctx_state prev_state;
|
||||
|
||||
prev_state = exception_enter();
|
||||
if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
|
||||
X86_TRAP_SS, SIGBUS) != NOTIFY_STOP) {
|
||||
preempt_conditional_sti(regs);
|
||||
do_trap(X86_TRAP_SS, SIGBUS, "stack segment", regs, error_code, NULL);
|
||||
preempt_conditional_cli(regs);
|
||||
}
|
||||
exception_exit(prev_state);
|
||||
}
|
||||
|
||||
dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
|
||||
{
|
||||
static const char str[] = "double fault";
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
#ifdef CONFIG_X86_ESPFIX64
|
||||
extern unsigned char native_irq_return_iret[];
|
||||
|
||||
/*
|
||||
* If IRET takes a non-IST fault on the espfix64 stack, then we
|
||||
* end up promoting it to a doublefault. In that case, modify
|
||||
* the stack to make it look like we just entered the #GP
|
||||
* handler from user space, similar to bad_iret.
|
||||
*/
|
||||
if (((long)regs->sp >> PGDIR_SHIFT) == ESPFIX_PGD_ENTRY &&
|
||||
regs->cs == __KERNEL_CS &&
|
||||
regs->ip == (unsigned long)native_irq_return_iret)
|
||||
{
|
||||
struct pt_regs *normal_regs = task_pt_regs(current);
|
||||
|
||||
/* Fake a #GP(0) from userspace. */
|
||||
memmove(&normal_regs->ip, (void *)regs->sp, 5*8);
|
||||
normal_regs->orig_ax = 0; /* Missing (lost) #GP error code */
|
||||
regs->ip = (unsigned long)general_protection;
|
||||
regs->sp = (unsigned long)&normal_regs->orig_ax;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
exception_enter();
|
||||
/* Return not checked because double check cannot be ignored */
|
||||
notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_DF, SIGSEGV);
|
||||
|
|
@ -373,6 +381,35 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
|
|||
*regs = *eregs;
|
||||
return regs;
|
||||
}
|
||||
|
||||
struct bad_iret_stack {
|
||||
void *error_entry_ret;
|
||||
struct pt_regs regs;
|
||||
};
|
||||
|
||||
asmlinkage __visible
|
||||
struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s)
|
||||
{
|
||||
/*
|
||||
* This is called from entry_64.S early in handling a fault
|
||||
* caused by a bad iret to user mode. To handle the fault
|
||||
* correctly, we want move our stack frame to task_pt_regs
|
||||
* and we want to pretend that the exception came from the
|
||||
* iret target.
|
||||
*/
|
||||
struct bad_iret_stack *new_stack =
|
||||
container_of(task_pt_regs(current),
|
||||
struct bad_iret_stack, regs);
|
||||
|
||||
/* Copy the IRET target to the new stack. */
|
||||
memmove(&new_stack->regs.ip, (void *)s->regs.sp, 5*8);
|
||||
|
||||
/* Copy the remainder of the stack from the current stack. */
|
||||
memmove(new_stack, s, offsetof(struct bad_iret_stack, regs.ip));
|
||||
|
||||
BUG_ON(!user_mode_vm(&new_stack->regs));
|
||||
return new_stack;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -745,7 +782,7 @@ void __init trap_init(void)
|
|||
set_intr_gate(X86_TRAP_OLD_MF, &coprocessor_segment_overrun);
|
||||
set_intr_gate(X86_TRAP_TS, &invalid_TSS);
|
||||
set_intr_gate(X86_TRAP_NP, &segment_not_present);
|
||||
set_intr_gate_ist(X86_TRAP_SS, &stack_segment, STACKFAULT_STACK);
|
||||
set_intr_gate(X86_TRAP_SS, stack_segment);
|
||||
set_intr_gate(X86_TRAP_GP, &general_protection);
|
||||
set_intr_gate(X86_TRAP_SPURIOUS, &spurious_interrupt_bug);
|
||||
set_intr_gate(X86_TRAP_MF, &coprocessor_error);
|
||||
|
|
|
|||
|
|
@ -1142,7 +1142,7 @@ void mark_rodata_ro(void)
|
|||
unsigned long end = (unsigned long) &__end_rodata_hpage_align;
|
||||
unsigned long text_end = PFN_ALIGN(&__stop___ex_table);
|
||||
unsigned long rodata_end = PFN_ALIGN(&__end_rodata);
|
||||
unsigned long all_end = PFN_ALIGN(&_end);
|
||||
unsigned long all_end;
|
||||
|
||||
printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
|
||||
(end - start) >> 10);
|
||||
|
|
@ -1153,7 +1153,16 @@ void mark_rodata_ro(void)
|
|||
/*
|
||||
* The rodata/data/bss/brk section (but not the kernel text!)
|
||||
* should also be not-executable.
|
||||
*
|
||||
* We align all_end to PMD_SIZE because the existing mapping
|
||||
* is a full PMD. If we would align _brk_end to PAGE_SIZE we
|
||||
* split the PMD and the reminder between _brk_end and the end
|
||||
* of the PMD will remain mapped executable.
|
||||
*
|
||||
* Any PMD which was setup after the one which covers _brk_end
|
||||
* has been zapped already via cleanup_highmem().
|
||||
*/
|
||||
all_end = roundup((unsigned long)_brk_end, PMD_SIZE);
|
||||
set_memory_nx(rodata_start, (all_end - rodata_start) >> PAGE_SHIFT);
|
||||
|
||||
rodata_test();
|
||||
|
|
|
|||
|
|
@ -964,6 +964,8 @@ int acpi_dev_pm_attach(struct device *dev, bool power_on)
|
|||
acpi_dev_pm_full_power(adev);
|
||||
__acpi_device_run_wake(adev, false);
|
||||
}
|
||||
|
||||
dev->pm_domain->detach = acpi_dev_pm_detach;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/pm_qos.h>
|
||||
|
|
@ -2177,3 +2178,291 @@ void pm_genpd_init(struct generic_pm_domain *genpd,
|
|||
list_add(&genpd->gpd_list_node, &gpd_list);
|
||||
mutex_unlock(&gpd_list_lock);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
|
||||
/*
|
||||
* Device Tree based PM domain providers.
|
||||
*
|
||||
* The code below implements generic device tree based PM domain providers that
|
||||
* bind device tree nodes with generic PM domains registered in the system.
|
||||
*
|
||||
* Any driver that registers generic PM domains and needs to support binding of
|
||||
* devices to these domains is supposed to register a PM domain provider, which
|
||||
* maps a PM domain specifier retrieved from the device tree to a PM domain.
|
||||
*
|
||||
* Two simple mapping functions have been provided for convenience:
|
||||
* - __of_genpd_xlate_simple() for 1:1 device tree node to PM domain mapping.
|
||||
* - __of_genpd_xlate_onecell() for mapping of multiple PM domains per node by
|
||||
* index.
|
||||
*/
|
||||
|
||||
/**
|
||||
* struct of_genpd_provider - PM domain provider registration structure
|
||||
* @link: Entry in global list of PM domain providers
|
||||
* @node: Pointer to device tree node of PM domain provider
|
||||
* @xlate: Provider-specific xlate callback mapping a set of specifier cells
|
||||
* into a PM domain.
|
||||
* @data: context pointer to be passed into @xlate callback
|
||||
*/
|
||||
struct of_genpd_provider {
|
||||
struct list_head link;
|
||||
struct device_node *node;
|
||||
genpd_xlate_t xlate;
|
||||
void *data;
|
||||
};
|
||||
|
||||
/* List of registered PM domain providers. */
|
||||
static LIST_HEAD(of_genpd_providers);
|
||||
/* Mutex to protect the list above. */
|
||||
static DEFINE_MUTEX(of_genpd_mutex);
|
||||
|
||||
/**
|
||||
* __of_genpd_xlate_simple() - Xlate function for direct node-domain mapping
|
||||
* @genpdspec: OF phandle args to map into a PM domain
|
||||
* @data: xlate function private data - pointer to struct generic_pm_domain
|
||||
*
|
||||
* This is a generic xlate function that can be used to model PM domains that
|
||||
* have their own device tree nodes. The private data of xlate function needs
|
||||
* to be a valid pointer to struct generic_pm_domain.
|
||||
*/
|
||||
struct generic_pm_domain *__of_genpd_xlate_simple(
|
||||
struct of_phandle_args *genpdspec,
|
||||
void *data)
|
||||
{
|
||||
if (genpdspec->args_count != 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
return data;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__of_genpd_xlate_simple);
|
||||
|
||||
/**
|
||||
* __of_genpd_xlate_onecell() - Xlate function using a single index.
|
||||
* @genpdspec: OF phandle args to map into a PM domain
|
||||
* @data: xlate function private data - pointer to struct genpd_onecell_data
|
||||
*
|
||||
* This is a generic xlate function that can be used to model simple PM domain
|
||||
* controllers that have one device tree node and provide multiple PM domains.
|
||||
* A single cell is used as an index into an array of PM domains specified in
|
||||
* the genpd_onecell_data struct when registering the provider.
|
||||
*/
|
||||
struct generic_pm_domain *__of_genpd_xlate_onecell(
|
||||
struct of_phandle_args *genpdspec,
|
||||
void *data)
|
||||
{
|
||||
struct genpd_onecell_data *genpd_data = data;
|
||||
unsigned int idx = genpdspec->args[0];
|
||||
|
||||
if (genpdspec->args_count != 1)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (idx >= genpd_data->num_domains) {
|
||||
pr_err("%s: invalid domain index %u\n", __func__, idx);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
if (!genpd_data->domains[idx])
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
return genpd_data->domains[idx];
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__of_genpd_xlate_onecell);
|
||||
|
||||
/**
|
||||
* __of_genpd_add_provider() - Register a PM domain provider for a node
|
||||
* @np: Device node pointer associated with the PM domain provider.
|
||||
* @xlate: Callback for decoding PM domain from phandle arguments.
|
||||
* @data: Context pointer for @xlate callback.
|
||||
*/
|
||||
int __of_genpd_add_provider(struct device_node *np, genpd_xlate_t xlate,
|
||||
void *data)
|
||||
{
|
||||
struct of_genpd_provider *cp;
|
||||
|
||||
cp = kzalloc(sizeof(*cp), GFP_KERNEL);
|
||||
if (!cp)
|
||||
return -ENOMEM;
|
||||
|
||||
cp->node = of_node_get(np);
|
||||
cp->data = data;
|
||||
cp->xlate = xlate;
|
||||
|
||||
mutex_lock(&of_genpd_mutex);
|
||||
list_add(&cp->link, &of_genpd_providers);
|
||||
mutex_unlock(&of_genpd_mutex);
|
||||
pr_debug("Added domain provider from %s\n", np->full_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__of_genpd_add_provider);
|
||||
|
||||
/**
|
||||
* of_genpd_del_provider() - Remove a previously registered PM domain provider
|
||||
* @np: Device node pointer associated with the PM domain provider
|
||||
*/
|
||||
void of_genpd_del_provider(struct device_node *np)
|
||||
{
|
||||
struct of_genpd_provider *cp;
|
||||
|
||||
mutex_lock(&of_genpd_mutex);
|
||||
list_for_each_entry(cp, &of_genpd_providers, link) {
|
||||
if (cp->node == np) {
|
||||
list_del(&cp->link);
|
||||
of_node_put(cp->node);
|
||||
kfree(cp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&of_genpd_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_genpd_del_provider);
|
||||
|
||||
/**
|
||||
* of_genpd_get_from_provider() - Look-up PM domain
|
||||
* @genpdspec: OF phandle args to use for look-up
|
||||
*
|
||||
* Looks for a PM domain provider under the node specified by @genpdspec and if
|
||||
* found, uses xlate function of the provider to map phandle args to a PM
|
||||
* domain.
|
||||
*
|
||||
* Returns a valid pointer to struct generic_pm_domain on success or ERR_PTR()
|
||||
* on failure.
|
||||
*/
|
||||
static struct generic_pm_domain *of_genpd_get_from_provider(
|
||||
struct of_phandle_args *genpdspec)
|
||||
{
|
||||
struct generic_pm_domain *genpd = ERR_PTR(-ENOENT);
|
||||
struct of_genpd_provider *provider;
|
||||
|
||||
mutex_lock(&of_genpd_mutex);
|
||||
|
||||
/* Check if we have such a provider in our array */
|
||||
list_for_each_entry(provider, &of_genpd_providers, link) {
|
||||
if (provider->node == genpdspec->np)
|
||||
genpd = provider->xlate(genpdspec, provider->data);
|
||||
if (!IS_ERR(genpd))
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&of_genpd_mutex);
|
||||
|
||||
return genpd;
|
||||
}
|
||||
|
||||
/**
|
||||
* genpd_dev_pm_detach - Detach a device from its PM domain.
|
||||
* @dev: Device to attach.
|
||||
* @power_off: Currently not used
|
||||
*
|
||||
* Try to locate a corresponding generic PM domain, which the device was
|
||||
* attached to previously. If such is found, the device is detached from it.
|
||||
*/
|
||||
static void genpd_dev_pm_detach(struct device *dev, bool power_off)
|
||||
{
|
||||
struct generic_pm_domain *pd = NULL, *gpd;
|
||||
int ret = 0;
|
||||
|
||||
if (!dev->pm_domain)
|
||||
return;
|
||||
|
||||
mutex_lock(&gpd_list_lock);
|
||||
list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
|
||||
if (&gpd->domain == dev->pm_domain) {
|
||||
pd = gpd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&gpd_list_lock);
|
||||
|
||||
if (!pd)
|
||||
return;
|
||||
|
||||
dev_dbg(dev, "removing from PM domain %s\n", pd->name);
|
||||
|
||||
while (1) {
|
||||
ret = pm_genpd_remove_device(pd, dev);
|
||||
if (ret != -EAGAIN)
|
||||
break;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to remove from PM domain %s: %d",
|
||||
pd->name, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if PM domain can be powered off after removing this device. */
|
||||
genpd_queue_power_off_work(pd);
|
||||
}
|
||||
|
||||
/**
|
||||
* genpd_dev_pm_attach - Attach a device to its PM domain using DT.
|
||||
* @dev: Device to attach.
|
||||
*
|
||||
* Parse device's OF node to find a PM domain specifier. If such is found,
|
||||
* attaches the device to retrieved pm_domain ops.
|
||||
*
|
||||
* Both generic and legacy Samsung-specific DT bindings are supported to keep
|
||||
* backwards compatibility with existing DTBs.
|
||||
*
|
||||
* Returns 0 on successfully attached PM domain or negative error code.
|
||||
*/
|
||||
int genpd_dev_pm_attach(struct device *dev)
|
||||
{
|
||||
struct of_phandle_args pd_args;
|
||||
struct generic_pm_domain *pd;
|
||||
int ret;
|
||||
|
||||
if (!dev->of_node)
|
||||
return -ENODEV;
|
||||
|
||||
if (dev->pm_domain)
|
||||
return -EEXIST;
|
||||
|
||||
ret = of_parse_phandle_with_args(dev->of_node, "power-domains",
|
||||
"#power-domain-cells", 0, &pd_args);
|
||||
if (ret < 0) {
|
||||
if (ret != -ENOENT)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Try legacy Samsung-specific bindings
|
||||
* (for backwards compatibility of DT ABI)
|
||||
*/
|
||||
pd_args.args_count = 0;
|
||||
pd_args.np = of_parse_phandle(dev->of_node,
|
||||
"samsung,power-domain", 0);
|
||||
if (!pd_args.np)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
pd = of_genpd_get_from_provider(&pd_args);
|
||||
if (IS_ERR(pd)) {
|
||||
dev_dbg(dev, "%s() failed to find PM domain: %ld\n",
|
||||
__func__, PTR_ERR(pd));
|
||||
of_node_put(dev->of_node);
|
||||
return PTR_ERR(pd);
|
||||
}
|
||||
|
||||
dev_dbg(dev, "adding to PM domain %s\n", pd->name);
|
||||
|
||||
while (1) {
|
||||
ret = pm_genpd_add_device(pd, dev);
|
||||
if (ret != -EAGAIN)
|
||||
break;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to add to PM domain %s: %d",
|
||||
pd->name, ret);
|
||||
of_node_put(dev->of_node);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev->pm_domain->detach = genpd_dev_pm_detach;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
* Traits of this clock:
|
||||
* prepare - clk_prepare only ensures that parents are prepared
|
||||
* enable - clk_enable only ensures that parents are enabled
|
||||
* rate - rate is adjustable. clk->rate = parent->rate / divisor
|
||||
* rate - rate is adjustable. clk->rate = DIV_ROUND_UP(parent->rate / divisor)
|
||||
* parent - fixed parent. No clk_set_parent support
|
||||
*/
|
||||
|
||||
|
|
@ -43,6 +43,17 @@ static unsigned int _get_table_maxdiv(const struct clk_div_table *table)
|
|||
return maxdiv;
|
||||
}
|
||||
|
||||
static unsigned int _get_table_mindiv(const struct clk_div_table *table)
|
||||
{
|
||||
unsigned int mindiv = UINT_MAX;
|
||||
const struct clk_div_table *clkt;
|
||||
|
||||
for (clkt = table; clkt->div; clkt++)
|
||||
if (clkt->div < mindiv)
|
||||
mindiv = clkt->div;
|
||||
return mindiv;
|
||||
}
|
||||
|
||||
static unsigned int _get_maxdiv(struct clk_divider *divider)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_ONE_BASED)
|
||||
|
|
@ -115,7 +126,7 @@ static unsigned long clk_divider_recalc_rate(struct clk_hw *hw,
|
|||
return parent_rate;
|
||||
}
|
||||
|
||||
return parent_rate / div;
|
||||
return DIV_ROUND_UP(parent_rate, div);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -144,6 +155,91 @@ static bool _is_valid_div(struct clk_divider *divider, unsigned int div)
|
|||
return true;
|
||||
}
|
||||
|
||||
static int _round_up_table(const struct clk_div_table *table, int div)
|
||||
{
|
||||
const struct clk_div_table *clkt;
|
||||
int up = INT_MAX;
|
||||
|
||||
for (clkt = table; clkt->div; clkt++) {
|
||||
if (clkt->div == div)
|
||||
return clkt->div;
|
||||
else if (clkt->div < div)
|
||||
continue;
|
||||
|
||||
if ((clkt->div - div) < (up - div))
|
||||
up = clkt->div;
|
||||
}
|
||||
|
||||
return up;
|
||||
}
|
||||
|
||||
static int _round_down_table(const struct clk_div_table *table, int div)
|
||||
{
|
||||
const struct clk_div_table *clkt;
|
||||
int down = _get_table_mindiv(table);
|
||||
|
||||
for (clkt = table; clkt->div; clkt++) {
|
||||
if (clkt->div == div)
|
||||
return clkt->div;
|
||||
else if (clkt->div > div)
|
||||
continue;
|
||||
|
||||
if ((div - clkt->div) < (div - down))
|
||||
down = clkt->div;
|
||||
}
|
||||
|
||||
return down;
|
||||
}
|
||||
|
||||
static int _div_round_up(struct clk_divider *divider,
|
||||
unsigned long parent_rate, unsigned long rate)
|
||||
{
|
||||
int div = DIV_ROUND_UP(parent_rate, rate);
|
||||
|
||||
if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
|
||||
div = __roundup_pow_of_two(div);
|
||||
if (divider->table)
|
||||
div = _round_up_table(divider->table, div);
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
static int _div_round_closest(struct clk_divider *divider,
|
||||
unsigned long parent_rate, unsigned long rate)
|
||||
{
|
||||
int up, down, div;
|
||||
|
||||
up = down = div = DIV_ROUND_CLOSEST(parent_rate, rate);
|
||||
|
||||
if (divider->flags & CLK_DIVIDER_POWER_OF_TWO) {
|
||||
up = __roundup_pow_of_two(div);
|
||||
down = __rounddown_pow_of_two(div);
|
||||
} else if (divider->table) {
|
||||
up = _round_up_table(divider->table, div);
|
||||
down = _round_down_table(divider->table, div);
|
||||
}
|
||||
|
||||
return (up - div) <= (div - down) ? up : down;
|
||||
}
|
||||
|
||||
static int _div_round(struct clk_divider *divider, unsigned long parent_rate,
|
||||
unsigned long rate)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_ROUND_CLOSEST)
|
||||
return _div_round_closest(divider, parent_rate, rate);
|
||||
|
||||
return _div_round_up(divider, parent_rate, rate);
|
||||
}
|
||||
|
||||
static bool _is_best_div(struct clk_divider *divider,
|
||||
unsigned long rate, unsigned long now, unsigned long best)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_ROUND_CLOSEST)
|
||||
return abs(rate - now) < abs(rate - best);
|
||||
|
||||
return now <= rate && now > best;
|
||||
}
|
||||
|
||||
static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *best_parent_rate)
|
||||
{
|
||||
|
|
@ -158,7 +254,7 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
|
|||
|
||||
if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) {
|
||||
parent_rate = *best_parent_rate;
|
||||
bestdiv = DIV_ROUND_UP(parent_rate, rate);
|
||||
bestdiv = _div_round(divider, parent_rate, rate);
|
||||
bestdiv = bestdiv == 0 ? 1 : bestdiv;
|
||||
bestdiv = bestdiv > maxdiv ? maxdiv : bestdiv;
|
||||
return bestdiv;
|
||||
|
|
@ -175,8 +271,8 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
|
|||
continue;
|
||||
parent_rate = __clk_round_rate(__clk_get_parent(hw->clk),
|
||||
MULT_ROUND_UP(rate, i));
|
||||
now = parent_rate / i;
|
||||
if (now <= rate && now > best) {
|
||||
now = DIV_ROUND_UP(parent_rate, i);
|
||||
if (_is_best_div(divider, rate, now, best)) {
|
||||
bestdiv = i;
|
||||
best = now;
|
||||
*best_parent_rate = parent_rate;
|
||||
|
|
@ -197,7 +293,7 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
|||
int div;
|
||||
div = clk_divider_bestdiv(hw, rate, prate);
|
||||
|
||||
return *prate / div;
|
||||
return DIV_ROUND_UP(*prate, div);
|
||||
}
|
||||
|
||||
static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
|
@ -208,7 +304,11 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
unsigned long flags = 0;
|
||||
u32 val;
|
||||
|
||||
div = parent_rate / rate;
|
||||
div = DIV_ROUND_UP(parent_rate, rate);
|
||||
|
||||
if (!_is_valid_div(divider, div))
|
||||
return -EINVAL;
|
||||
|
||||
value = _get_val(divider, div);
|
||||
|
||||
if (value > div_mask(divider))
|
||||
|
|
|
|||
|
|
@ -456,7 +456,8 @@ static void cpufreq_interactive_timer(unsigned long data)
|
|||
pcpu->floor_validate_time = now;
|
||||
}
|
||||
|
||||
if (pcpu->target_freq == new_freq) {
|
||||
if (pcpu->target_freq == new_freq &&
|
||||
pcpu->target_freq <= pcpu->policy->cur) {
|
||||
trace_cpufreq_interactive_already(
|
||||
data, cpu_load, pcpu->target_freq,
|
||||
pcpu->policy->cur, new_freq);
|
||||
|
|
|
|||
|
|
@ -585,14 +585,25 @@ isert_disconnect_work(struct work_struct *work)
|
|||
complete(&isert_conn->conn_wait);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect)
|
||||
{
|
||||
struct isert_conn *isert_conn = (struct isert_conn *)cma_id->context;
|
||||
struct isert_conn *isert_conn;
|
||||
|
||||
if (!cma_id->qp) {
|
||||
struct isert_np *isert_np = cma_id->context;
|
||||
|
||||
isert_np->np_cm_id = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
isert_conn = (struct isert_conn *)cma_id->context;
|
||||
|
||||
isert_conn->disconnect = disconnect;
|
||||
INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work);
|
||||
schedule_work(&isert_conn->conn_logout_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -607,6 +618,9 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
switch (event->event) {
|
||||
case RDMA_CM_EVENT_CONNECT_REQUEST:
|
||||
ret = isert_connect_request(cma_id, event);
|
||||
if (ret)
|
||||
pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n",
|
||||
event->event, ret);
|
||||
break;
|
||||
case RDMA_CM_EVENT_ESTABLISHED:
|
||||
isert_connected_handler(cma_id);
|
||||
|
|
@ -616,7 +630,7 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */
|
||||
disconnect = true;
|
||||
case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */
|
||||
isert_disconnected_handler(cma_id, disconnect);
|
||||
ret = isert_disconnected_handler(cma_id, disconnect);
|
||||
break;
|
||||
case RDMA_CM_EVENT_CONNECT_ERROR:
|
||||
default:
|
||||
|
|
@ -624,12 +638,6 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
break;
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n",
|
||||
event->event, ret);
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -2233,7 +2241,8 @@ isert_free_np(struct iscsi_np *np)
|
|||
{
|
||||
struct isert_np *isert_np = (struct isert_np *)np->np_context;
|
||||
|
||||
rdma_destroy_id(isert_np->np_cm_id);
|
||||
if (isert_np->np_cm_id)
|
||||
rdma_destroy_id(isert_np->np_cm_id);
|
||||
|
||||
np->np_context = NULL;
|
||||
kfree(isert_np);
|
||||
|
|
|
|||
|
|
@ -2101,6 +2101,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
|
|||
if (!qp_init)
|
||||
goto out;
|
||||
|
||||
retry:
|
||||
ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch,
|
||||
ch->rq_size + srp_sq_size, 0);
|
||||
if (IS_ERR(ch->cq)) {
|
||||
|
|
@ -2124,6 +2125,13 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
|
|||
ch->qp = ib_create_qp(sdev->pd, qp_init);
|
||||
if (IS_ERR(ch->qp)) {
|
||||
ret = PTR_ERR(ch->qp);
|
||||
if (ret == -ENOMEM) {
|
||||
srp_sq_size /= 2;
|
||||
if (srp_sq_size >= MIN_SRPT_SQ_SIZE) {
|
||||
ib_destroy_cq(ch->cq);
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
printk(KERN_ERR "failed to create_qp ret= %d\n", ret);
|
||||
goto err_destroy_cq;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1002,9 +1002,19 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
|
|||
}
|
||||
|
||||
ep_irq_in = &intf->cur_altsetting->endpoint[1].desc;
|
||||
usb_fill_bulk_urb(xpad->bulk_out, udev,
|
||||
usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress),
|
||||
xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad);
|
||||
if (usb_endpoint_is_bulk_out(ep_irq_in)) {
|
||||
usb_fill_bulk_urb(xpad->bulk_out, udev,
|
||||
usb_sndbulkpipe(udev,
|
||||
ep_irq_in->bEndpointAddress),
|
||||
xpad->bdata, XPAD_PKT_LEN,
|
||||
xpad_bulk_out, xpad);
|
||||
} else {
|
||||
usb_fill_int_urb(xpad->bulk_out, udev,
|
||||
usb_sndintpipe(udev,
|
||||
ep_irq_in->bEndpointAddress),
|
||||
xpad->bdata, XPAD_PKT_LEN,
|
||||
xpad_bulk_out, xpad, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Submit the int URB immediately rather than waiting for open
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ void can_free_echo_skb(struct net_device *dev, unsigned int idx)
|
|||
BUG_ON(idx >= priv->echo_skb_max);
|
||||
|
||||
if (priv->echo_skb[idx]) {
|
||||
kfree_skb(priv->echo_skb[idx]);
|
||||
dev_kfree_skb_any(priv->echo_skb[idx]);
|
||||
priv->echo_skb[idx] = NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1132,6 +1132,7 @@ static void esd_usb2_disconnect(struct usb_interface *intf)
|
|||
}
|
||||
}
|
||||
unlink_all_urbs(dev);
|
||||
kfree(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -376,17 +376,20 @@ static int ieee802154fake_probe(struct platform_device *pdev)
|
|||
|
||||
err = wpan_phy_register(phy);
|
||||
if (err)
|
||||
goto out;
|
||||
goto err_phy_reg;
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
if (err)
|
||||
goto err_netdev_reg;
|
||||
|
||||
dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n");
|
||||
return 0;
|
||||
|
||||
out:
|
||||
unregister_netdev(dev);
|
||||
err_netdev_reg:
|
||||
wpan_phy_unregister(phy);
|
||||
err_phy_reg:
|
||||
free_netdev(dev);
|
||||
wpan_phy_free(phy);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -506,7 +506,9 @@ static int pptp_getname(struct socket *sock, struct sockaddr *uaddr,
|
|||
int len = sizeof(struct sockaddr_pppox);
|
||||
struct sockaddr_pppox sp;
|
||||
|
||||
sp.sa_family = AF_PPPOX;
|
||||
memset(&sp.sa_addr, 0, sizeof(sp.sa_addr));
|
||||
|
||||
sp.sa_family = AF_PPPOX;
|
||||
sp.sa_protocol = PX_PROTO_PPTP;
|
||||
sp.sa_addr.pptp = pppox_sk(sock->sk)->proto.pptp.src_addr;
|
||||
|
||||
|
|
|
|||
|
|
@ -756,6 +756,7 @@ static const struct usb_device_id products[] = {
|
|||
{QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */
|
||||
{QMI_FIXED_INTF(0x413c, 0x81a8, 8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */
|
||||
{QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */
|
||||
{QMI_FIXED_INTF(0x03f0, 0x581d, 4)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Module (Huawei me906e) */
|
||||
|
||||
/* 4. Gobi 1000 devices */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
|
|
|
|||
|
|
@ -160,55 +160,29 @@ void rt2x00queue_align_frame(struct sk_buff *skb)
|
|||
skb_trim(skb, frame_length);
|
||||
}
|
||||
|
||||
void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
|
||||
/*
|
||||
* H/W needs L2 padding between the header and the paylod if header size
|
||||
* is not 4 bytes aligned.
|
||||
*/
|
||||
void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int hdr_len)
|
||||
{
|
||||
unsigned int payload_length = skb->len - header_length;
|
||||
unsigned int header_align = ALIGN_SIZE(skb, 0);
|
||||
unsigned int payload_align = ALIGN_SIZE(skb, header_length);
|
||||
unsigned int l2pad = payload_length ? L2PAD_SIZE(header_length) : 0;
|
||||
|
||||
/*
|
||||
* Adjust the header alignment if the payload needs to be moved more
|
||||
* than the header.
|
||||
*/
|
||||
if (payload_align > header_align)
|
||||
header_align += 4;
|
||||
|
||||
/* There is nothing to do if no alignment is needed */
|
||||
if (!header_align)
|
||||
return;
|
||||
|
||||
/* Reserve the amount of space needed in front of the frame */
|
||||
skb_push(skb, header_align);
|
||||
|
||||
/*
|
||||
* Move the header.
|
||||
*/
|
||||
memmove(skb->data, skb->data + header_align, header_length);
|
||||
|
||||
/* Move the payload, if present and if required */
|
||||
if (payload_length && payload_align)
|
||||
memmove(skb->data + header_length + l2pad,
|
||||
skb->data + header_length + l2pad + payload_align,
|
||||
payload_length);
|
||||
|
||||
/* Trim the skb to the correct size */
|
||||
skb_trim(skb, header_length + l2pad + payload_length);
|
||||
}
|
||||
|
||||
void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length)
|
||||
{
|
||||
/*
|
||||
* L2 padding is only present if the skb contains more than just the
|
||||
* IEEE 802.11 header.
|
||||
*/
|
||||
unsigned int l2pad = (skb->len > header_length) ?
|
||||
L2PAD_SIZE(header_length) : 0;
|
||||
unsigned int l2pad = (skb->len > hdr_len) ? L2PAD_SIZE(hdr_len) : 0;
|
||||
|
||||
if (!l2pad)
|
||||
return;
|
||||
|
||||
memmove(skb->data + l2pad, skb->data, header_length);
|
||||
skb_push(skb, l2pad);
|
||||
memmove(skb->data, skb->data + l2pad, hdr_len);
|
||||
}
|
||||
|
||||
void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int hdr_len)
|
||||
{
|
||||
unsigned int l2pad = (skb->len > hdr_len) ? L2PAD_SIZE(hdr_len) : 0;
|
||||
|
||||
if (!l2pad)
|
||||
return;
|
||||
|
||||
memmove(skb->data + l2pad, skb->data, hdr_len);
|
||||
skb_pull(skb, l2pad);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -334,6 +334,21 @@ static struct of_bus *of_match_bus(struct device_node *np)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int of_empty_ranges_quirk(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_PPC)) {
|
||||
/* To save cycles, we cache the result */
|
||||
static int quirk_state = -1;
|
||||
|
||||
if (quirk_state < 0)
|
||||
quirk_state =
|
||||
of_machine_is_compatible("Power Macintosh") ||
|
||||
of_machine_is_compatible("MacRISC");
|
||||
return quirk_state;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int of_translate_one(struct device_node *parent, struct of_bus *bus,
|
||||
struct of_bus *pbus, __be32 *addr,
|
||||
int na, int ns, int pna, const char *rprop)
|
||||
|
|
@ -359,12 +374,10 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
|
|||
* This code is only enabled on powerpc. --gcl
|
||||
*/
|
||||
ranges = of_get_property(parent, rprop, &rlen);
|
||||
#if !defined(CONFIG_PPC)
|
||||
if (ranges == NULL) {
|
||||
if (ranges == NULL && !of_empty_ranges_quirk()) {
|
||||
pr_err("OF: no ranges; cannot translate\n");
|
||||
return 1;
|
||||
}
|
||||
#endif /* !defined(CONFIG_PPC) */
|
||||
if (ranges == NULL || rlen == 0) {
|
||||
offset = of_read_number(addr, na);
|
||||
memset(addr, 0, pna * 4);
|
||||
|
|
|
|||
|
|
@ -530,6 +530,20 @@ static int populate_msi_sysfs(struct pci_dev *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int msi_verify_entries(struct pci_dev *dev)
|
||||
{
|
||||
struct msi_desc *entry;
|
||||
|
||||
list_for_each_entry(entry, &dev->msi_list, list) {
|
||||
if (!dev->no_64bit_msi || !entry->msg.address_hi)
|
||||
continue;
|
||||
dev_err(&dev->dev, "Device has broken 64-bit MSI but arch"
|
||||
" tried to assign one above 4G\n");
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* msi_capability_init - configure device's MSI capability structure
|
||||
* @dev: pointer to the pci_dev data structure of MSI device function
|
||||
|
|
@ -583,6 +597,13 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = msi_verify_entries(dev);
|
||||
if (ret) {
|
||||
msi_mask_irq(entry, mask, ~mask);
|
||||
free_msi_irqs(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = populate_msi_sysfs(dev);
|
||||
if (ret) {
|
||||
msi_mask_irq(entry, mask, ~mask);
|
||||
|
|
@ -698,6 +719,11 @@ static int msix_capability_init(struct pci_dev *dev,
|
|||
if (ret)
|
||||
goto error;
|
||||
|
||||
/* Check if all MSI entries honor device restrictions */
|
||||
ret = msi_verify_entries(dev);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
/*
|
||||
* Some devices require MSI-X to be enabled before we can touch the
|
||||
* MSI-X registers. We need to mask all the vectors to prevent
|
||||
|
|
|
|||
|
|
@ -411,6 +411,7 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
struct fc_frame_header *fh;
|
||||
struct fcoe_rcv_info *fr;
|
||||
struct fcoe_percpu_s *bg;
|
||||
struct sk_buff *tmp_skb;
|
||||
unsigned short oxid;
|
||||
|
||||
interface = container_of(ptype, struct bnx2fc_interface,
|
||||
|
|
@ -423,6 +424,12 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
goto err;
|
||||
}
|
||||
|
||||
tmp_skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (!tmp_skb)
|
||||
goto err;
|
||||
|
||||
skb = tmp_skb;
|
||||
|
||||
if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
|
||||
printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n");
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -394,9 +394,6 @@ static void pump_transfers(unsigned long data)
|
|||
chip = dws->cur_chip;
|
||||
spi = message->spi;
|
||||
|
||||
if (unlikely(!chip->clk_div))
|
||||
chip->clk_div = dws->max_freq / chip->speed_hz;
|
||||
|
||||
if (message->state == ERROR_STATE) {
|
||||
message->status = -EIO;
|
||||
goto early_exit;
|
||||
|
|
@ -438,7 +435,7 @@ static void pump_transfers(unsigned long data)
|
|||
if (transfer->speed_hz) {
|
||||
speed = chip->speed_hz;
|
||||
|
||||
if (transfer->speed_hz != speed) {
|
||||
if ((transfer->speed_hz != speed) || (!chip->clk_div)) {
|
||||
speed = transfer->speed_hz;
|
||||
if (speed > dws->max_freq) {
|
||||
printk(KERN_ERR "MRST SPI0: unsupported"
|
||||
|
|
@ -677,7 +674,6 @@ static int dw_spi_setup(struct spi_device *spi)
|
|||
dev_err(&spi->dev, "No max speed HZ parameter\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
chip->speed_hz = spi->max_speed_hz;
|
||||
|
||||
chip->tmode = 0; /* Tx & Rx */
|
||||
/* Default SPI mode is SCPOL = 0, SCPH = 0 */
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/miscdevice.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/rtmutex.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/poll.h>
|
||||
|
|
@ -42,7 +43,7 @@
|
|||
#include "binder.h"
|
||||
#include "binder_trace.h"
|
||||
|
||||
static DEFINE_MUTEX(binder_main_lock);
|
||||
static DEFINE_RT_MUTEX(binder_main_lock);
|
||||
static DEFINE_MUTEX(binder_deferred_lock);
|
||||
static DEFINE_MUTEX(binder_mmap_lock);
|
||||
|
||||
|
|
@ -420,14 +421,14 @@ static long task_close_fd(struct binder_proc *proc, unsigned int fd)
|
|||
static inline void binder_lock(const char *tag)
|
||||
{
|
||||
trace_binder_lock(tag);
|
||||
mutex_lock(&binder_main_lock);
|
||||
rt_mutex_lock(&binder_main_lock);
|
||||
trace_binder_locked(tag);
|
||||
}
|
||||
|
||||
static inline void binder_unlock(const char *tag)
|
||||
{
|
||||
trace_binder_unlock(tag);
|
||||
mutex_unlock(&binder_main_lock);
|
||||
rt_mutex_unlock(&binder_main_lock);
|
||||
}
|
||||
|
||||
static void binder_set_nice(long nice)
|
||||
|
|
|
|||
|
|
@ -2128,7 +2128,7 @@ transport_generic_new_cmd(struct se_cmd *cmd)
|
|||
* and let it call back once the write buffers are ready.
|
||||
*/
|
||||
target_add_to_state_list(cmd);
|
||||
if (cmd->data_direction != DMA_TO_DEVICE) {
|
||||
if (cmd->data_direction != DMA_TO_DEVICE || cmd->data_length == 0) {
|
||||
target_execute_cmd(cmd);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* Creative SB Audigy 2 NX */
|
||||
{ USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Microsoft Wireless Laser Mouse 6000 Receiver */
|
||||
{ USB_DEVICE(0x045e, 0x00e1), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Microsoft LifeCam-VX700 v2.0 */
|
||||
{ USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
|
|
|||
|
|
@ -1178,9 +1178,8 @@ static void handle_reset_ep_completion(struct xhci_hcd *xhci,
|
|||
false);
|
||||
xhci_ring_cmd_db(xhci);
|
||||
} else {
|
||||
/* Clear our internal halted state and restart the ring(s) */
|
||||
/* Clear our internal halted state */
|
||||
xhci->devs[slot_id]->eps[ep_index].ep_state &= ~EP_HALTED;
|
||||
ring_doorbell_for_active_rings(xhci, slot_id, ep_index);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ static const struct usb_device_id id_table[] = {
|
|||
{ USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
|
||||
{ USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
|
||||
{ USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
|
||||
{ USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */
|
||||
{ USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */
|
||||
{ USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */
|
||||
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
|
||||
|
|
|
|||
|
|
@ -486,6 +486,39 @@ static struct usb_device_id id_table_combined [] = {
|
|||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_4701_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9300_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9301_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9302_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9303_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9304_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9305_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9306_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9307_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9308_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9309_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930A_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930B_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930C_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930D_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930E_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_930F_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9310_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9311_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9312_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9313_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9314_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9315_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9316_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9317_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9318_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_9319_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931A_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931B_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931C_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931D_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931E_PID) },
|
||||
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_931F_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
|
||||
|
|
|
|||
|
|
@ -926,8 +926,8 @@
|
|||
#define BAYER_CONTOUR_CABLE_PID 0x6001
|
||||
|
||||
/*
|
||||
* The following are the values for the Matrix Orbital FTDI Range
|
||||
* Anything in this range will use an FT232RL.
|
||||
* Matrix Orbital Intelligent USB displays.
|
||||
* http://www.matrixorbital.com
|
||||
*/
|
||||
#define MTXORB_VID 0x1B3D
|
||||
#define MTXORB_FTDI_RANGE_0100_PID 0x0100
|
||||
|
|
@ -1186,8 +1186,39 @@
|
|||
#define MTXORB_FTDI_RANGE_01FD_PID 0x01FD
|
||||
#define MTXORB_FTDI_RANGE_01FE_PID 0x01FE
|
||||
#define MTXORB_FTDI_RANGE_01FF_PID 0x01FF
|
||||
|
||||
|
||||
#define MTXORB_FTDI_RANGE_4701_PID 0x4701
|
||||
#define MTXORB_FTDI_RANGE_9300_PID 0x9300
|
||||
#define MTXORB_FTDI_RANGE_9301_PID 0x9301
|
||||
#define MTXORB_FTDI_RANGE_9302_PID 0x9302
|
||||
#define MTXORB_FTDI_RANGE_9303_PID 0x9303
|
||||
#define MTXORB_FTDI_RANGE_9304_PID 0x9304
|
||||
#define MTXORB_FTDI_RANGE_9305_PID 0x9305
|
||||
#define MTXORB_FTDI_RANGE_9306_PID 0x9306
|
||||
#define MTXORB_FTDI_RANGE_9307_PID 0x9307
|
||||
#define MTXORB_FTDI_RANGE_9308_PID 0x9308
|
||||
#define MTXORB_FTDI_RANGE_9309_PID 0x9309
|
||||
#define MTXORB_FTDI_RANGE_930A_PID 0x930A
|
||||
#define MTXORB_FTDI_RANGE_930B_PID 0x930B
|
||||
#define MTXORB_FTDI_RANGE_930C_PID 0x930C
|
||||
#define MTXORB_FTDI_RANGE_930D_PID 0x930D
|
||||
#define MTXORB_FTDI_RANGE_930E_PID 0x930E
|
||||
#define MTXORB_FTDI_RANGE_930F_PID 0x930F
|
||||
#define MTXORB_FTDI_RANGE_9310_PID 0x9310
|
||||
#define MTXORB_FTDI_RANGE_9311_PID 0x9311
|
||||
#define MTXORB_FTDI_RANGE_9312_PID 0x9312
|
||||
#define MTXORB_FTDI_RANGE_9313_PID 0x9313
|
||||
#define MTXORB_FTDI_RANGE_9314_PID 0x9314
|
||||
#define MTXORB_FTDI_RANGE_9315_PID 0x9315
|
||||
#define MTXORB_FTDI_RANGE_9316_PID 0x9316
|
||||
#define MTXORB_FTDI_RANGE_9317_PID 0x9317
|
||||
#define MTXORB_FTDI_RANGE_9318_PID 0x9318
|
||||
#define MTXORB_FTDI_RANGE_9319_PID 0x9319
|
||||
#define MTXORB_FTDI_RANGE_931A_PID 0x931A
|
||||
#define MTXORB_FTDI_RANGE_931B_PID 0x931B
|
||||
#define MTXORB_FTDI_RANGE_931C_PID 0x931C
|
||||
#define MTXORB_FTDI_RANGE_931D_PID 0x931D
|
||||
#define MTXORB_FTDI_RANGE_931E_PID 0x931E
|
||||
#define MTXORB_FTDI_RANGE_931F_PID 0x931F
|
||||
|
||||
/*
|
||||
* The Mobility Lab (TML)
|
||||
|
|
|
|||
|
|
@ -308,24 +308,30 @@ static void usa26_indat_callback(struct urb *urb)
|
|||
if ((data[0] & 0x80) == 0) {
|
||||
/* no errors on individual bytes, only
|
||||
possible overrun err */
|
||||
if (data[0] & RXERROR_OVERRUN)
|
||||
err = TTY_OVERRUN;
|
||||
else
|
||||
err = 0;
|
||||
if (data[0] & RXERROR_OVERRUN) {
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
for (i = 1; i < urb->actual_length ; ++i)
|
||||
tty_insert_flip_char(&port->port, data[i], err);
|
||||
tty_insert_flip_char(&port->port, data[i],
|
||||
TTY_NORMAL);
|
||||
} else {
|
||||
/* some bytes had errors, every byte has status */
|
||||
dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
|
||||
for (i = 0; i + 1 < urb->actual_length; i += 2) {
|
||||
int stat = data[i], flag = 0;
|
||||
if (stat & RXERROR_OVERRUN)
|
||||
flag |= TTY_OVERRUN;
|
||||
if (stat & RXERROR_FRAMING)
|
||||
flag |= TTY_FRAME;
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
int stat = data[i];
|
||||
int flag = TTY_NORMAL;
|
||||
|
||||
if (stat & RXERROR_OVERRUN) {
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
/* XXX should handle break (0x10) */
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag = TTY_PARITY;
|
||||
else if (stat & RXERROR_FRAMING)
|
||||
flag = TTY_FRAME;
|
||||
|
||||
tty_insert_flip_char(&port->port, data[i+1],
|
||||
flag);
|
||||
}
|
||||
|
|
@ -672,14 +678,19 @@ static void usa49_indat_callback(struct urb *urb)
|
|||
} else {
|
||||
/* some bytes had errors, every byte has status */
|
||||
for (i = 0; i + 1 < urb->actual_length; i += 2) {
|
||||
int stat = data[i], flag = 0;
|
||||
if (stat & RXERROR_OVERRUN)
|
||||
flag |= TTY_OVERRUN;
|
||||
if (stat & RXERROR_FRAMING)
|
||||
flag |= TTY_FRAME;
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
int stat = data[i];
|
||||
int flag = TTY_NORMAL;
|
||||
|
||||
if (stat & RXERROR_OVERRUN) {
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
/* XXX should handle break (0x10) */
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag = TTY_PARITY;
|
||||
else if (stat & RXERROR_FRAMING)
|
||||
flag = TTY_FRAME;
|
||||
|
||||
tty_insert_flip_char(&port->port, data[i+1],
|
||||
flag);
|
||||
}
|
||||
|
|
@ -736,15 +747,19 @@ static void usa49wg_indat_callback(struct urb *urb)
|
|||
*/
|
||||
for (x = 0; x + 1 < len &&
|
||||
i + 1 < urb->actual_length; x += 2) {
|
||||
int stat = data[i], flag = 0;
|
||||
int stat = data[i];
|
||||
int flag = TTY_NORMAL;
|
||||
|
||||
if (stat & RXERROR_OVERRUN)
|
||||
flag |= TTY_OVERRUN;
|
||||
if (stat & RXERROR_FRAMING)
|
||||
flag |= TTY_FRAME;
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
if (stat & RXERROR_OVERRUN) {
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
/* XXX should handle break (0x10) */
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag = TTY_PARITY;
|
||||
else if (stat & RXERROR_FRAMING)
|
||||
flag = TTY_FRAME;
|
||||
|
||||
tty_insert_flip_char(&port->port, data[i+1],
|
||||
flag);
|
||||
i += 2;
|
||||
|
|
@ -796,25 +811,31 @@ static void usa90_indat_callback(struct urb *urb)
|
|||
if ((data[0] & 0x80) == 0) {
|
||||
/* no errors on individual bytes, only
|
||||
possible overrun err*/
|
||||
if (data[0] & RXERROR_OVERRUN)
|
||||
err = TTY_OVERRUN;
|
||||
else
|
||||
err = 0;
|
||||
if (data[0] & RXERROR_OVERRUN) {
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
for (i = 1; i < urb->actual_length ; ++i)
|
||||
tty_insert_flip_char(&port->port,
|
||||
data[i], err);
|
||||
data[i], TTY_NORMAL);
|
||||
} else {
|
||||
/* some bytes had errors, every byte has status */
|
||||
dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
|
||||
for (i = 0; i + 1 < urb->actual_length; i += 2) {
|
||||
int stat = data[i], flag = 0;
|
||||
if (stat & RXERROR_OVERRUN)
|
||||
flag |= TTY_OVERRUN;
|
||||
if (stat & RXERROR_FRAMING)
|
||||
flag |= TTY_FRAME;
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag |= TTY_PARITY;
|
||||
int stat = data[i];
|
||||
int flag = TTY_NORMAL;
|
||||
|
||||
if (stat & RXERROR_OVERRUN) {
|
||||
tty_insert_flip_char(
|
||||
&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
/* XXX should handle break (0x10) */
|
||||
if (stat & RXERROR_PARITY)
|
||||
flag = TTY_PARITY;
|
||||
else if (stat & RXERROR_FRAMING)
|
||||
flag = TTY_FRAME;
|
||||
|
||||
tty_insert_flip_char(&port->port,
|
||||
data[i+1], flag);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -495,10 +495,9 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,
|
|||
if (*tty_flag == TTY_NORMAL)
|
||||
*tty_flag = TTY_FRAME;
|
||||
}
|
||||
if (lsr & UART_LSR_OE){
|
||||
if (lsr & UART_LSR_OE) {
|
||||
port->icount.overrun++;
|
||||
if (*tty_flag == TTY_NORMAL)
|
||||
*tty_flag = TTY_OVERRUN;
|
||||
tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -516,12 +515,8 @@ static void ssu100_process_read_urb(struct urb *urb)
|
|||
if ((len >= 4) &&
|
||||
(packet[0] == 0x1b) && (packet[1] == 0x1b) &&
|
||||
((packet[2] == 0x00) || (packet[2] == 0x01))) {
|
||||
if (packet[2] == 0x00) {
|
||||
if (packet[2] == 0x00)
|
||||
ssu100_update_lsr(port, packet[3], &flag);
|
||||
if (flag == TTY_OVERRUN)
|
||||
tty_insert_flip_char(&port->port, 0,
|
||||
TTY_OVERRUN);
|
||||
}
|
||||
if (packet[2] == 0x01)
|
||||
ssu100_update_msr(port, packet[3]);
|
||||
|
||||
|
|
|
|||
|
|
@ -784,8 +784,12 @@ static bool nfsd41_cb_get_slot(struct nfs4_client *clp, struct rpc_task *task)
|
|||
{
|
||||
if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
|
||||
rpc_sleep_on(&clp->cl_cb_waitq, task, NULL);
|
||||
dprintk("%s slot is busy\n", __func__);
|
||||
return false;
|
||||
/* Race breaker */
|
||||
if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) {
|
||||
dprintk("%s slot is busy\n", __func__);
|
||||
return false;
|
||||
}
|
||||
rpc_wake_up_queued_task(&clp->cl_cb_waitq, task);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -367,7 +367,6 @@ static struct nfs4_delegation *
|
|||
alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct svc_fh *current_fh, u32 type)
|
||||
{
|
||||
struct nfs4_delegation *dp;
|
||||
struct nfs4_file *fp = stp->st_file;
|
||||
|
||||
dprintk("NFSD alloc_init_deleg\n");
|
||||
/*
|
||||
|
|
@ -377,8 +376,6 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct sv
|
|||
*/
|
||||
if (type != NFS4_OPEN_DELEGATE_READ)
|
||||
return NULL;
|
||||
if (fp->fi_had_conflict)
|
||||
return NULL;
|
||||
if (num_delegations > max_delegations)
|
||||
return NULL;
|
||||
dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab));
|
||||
|
|
@ -395,8 +392,7 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct sv
|
|||
INIT_LIST_HEAD(&dp->dl_perfile);
|
||||
INIT_LIST_HEAD(&dp->dl_perclnt);
|
||||
INIT_LIST_HEAD(&dp->dl_recall_lru);
|
||||
get_nfs4_file(fp);
|
||||
dp->dl_file = fp;
|
||||
dp->dl_file = NULL;
|
||||
dp->dl_type = type;
|
||||
fh_copy_shallow(&dp->dl_fh, ¤t_fh->fh_handle);
|
||||
dp->dl_time = 0;
|
||||
|
|
@ -2965,22 +2961,35 @@ static int nfs4_setlease(struct nfs4_delegation *dp, int flag)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int nfs4_set_delegation(struct nfs4_delegation *dp, int flag)
|
||||
static int nfs4_set_delegation(struct nfs4_delegation *dp, int flag, struct nfs4_file *fp)
|
||||
{
|
||||
struct nfs4_file *fp = dp->dl_file;
|
||||
int status;
|
||||
|
||||
if (!fp->fi_lease)
|
||||
return nfs4_setlease(dp, flag);
|
||||
if (fp->fi_had_conflict)
|
||||
return -EAGAIN;
|
||||
get_nfs4_file(fp);
|
||||
dp->dl_file = fp;
|
||||
if (!fp->fi_lease) {
|
||||
status = nfs4_setlease(dp, flag);
|
||||
if (status)
|
||||
goto out_free;
|
||||
return 0;
|
||||
}
|
||||
spin_lock(&recall_lock);
|
||||
if (fp->fi_had_conflict) {
|
||||
spin_unlock(&recall_lock);
|
||||
return -EAGAIN;
|
||||
status = -EAGAIN;
|
||||
goto out_free;
|
||||
}
|
||||
atomic_inc(&fp->fi_delegees);
|
||||
list_add(&dp->dl_perfile, &fp->fi_delegations);
|
||||
spin_unlock(&recall_lock);
|
||||
list_add(&dp->dl_perclnt, &dp->dl_stid.sc_client->cl_delegations);
|
||||
return 0;
|
||||
out_free:
|
||||
put_nfs4_file(fp);
|
||||
dp->dl_file = fp;
|
||||
return status;
|
||||
}
|
||||
|
||||
static void nfsd4_open_deleg_none_ext(struct nfsd4_open *open, int status)
|
||||
|
|
@ -3046,7 +3055,7 @@ nfs4_open_delegation(struct net *net, struct svc_fh *fh,
|
|||
dp = alloc_init_deleg(oo->oo_owner.so_client, stp, fh, flag);
|
||||
if (dp == NULL)
|
||||
goto out_no_deleg;
|
||||
status = nfs4_set_delegation(dp, flag);
|
||||
status = nfs4_set_delegation(dp, flag, stp->st_file);
|
||||
if (status)
|
||||
goto out_free;
|
||||
|
||||
|
|
|
|||
|
|
@ -508,6 +508,9 @@ set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl *pacl, char *key)
|
|||
char *buf = NULL;
|
||||
int error = 0;
|
||||
|
||||
if (!pacl)
|
||||
return vfs_setxattr(dentry, key, NULL, 0, 0);
|
||||
|
||||
buflen = posix_acl_xattr_size(pacl->a_count);
|
||||
buf = kmalloc(buflen, GFP_KERNEL);
|
||||
error = -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -277,6 +277,8 @@ struct clk_div_table {
|
|||
* of this register, and mask of divider bits are in higher 16-bit of this
|
||||
* register. While setting the divider bits, higher 16-bit should also be
|
||||
* updated to indicate changing divider bits.
|
||||
* CLK_DIVIDER_ROUND_CLOSEST - Makes the best calculated divider to be rounded
|
||||
* to the closest integer instead of the up one.
|
||||
*/
|
||||
struct clk_divider {
|
||||
struct clk_hw hw;
|
||||
|
|
@ -292,6 +294,7 @@ struct clk_divider {
|
|||
#define CLK_DIVIDER_POWER_OF_TWO BIT(1)
|
||||
#define CLK_DIVIDER_ALLOW_ZERO BIT(2)
|
||||
#define CLK_DIVIDER_HIWORD_MASK BIT(3)
|
||||
#define CLK_DIVIDER_ROUND_CLOSEST BIT(4)
|
||||
|
||||
extern const struct clk_ops clk_divider_ops;
|
||||
struct clk *clk_register_divider(struct device *dev, const char *name,
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ enum iio_event_direction {
|
|||
|
||||
#define IIO_EVENT_CODE_EXTRACT_TYPE(mask) ((mask >> 56) & 0xFF)
|
||||
|
||||
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0xCF)
|
||||
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0x7F)
|
||||
|
||||
#define IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) ((mask >> 32) & 0xFF)
|
||||
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ static inline void in_dev_put(struct in_device *idev)
|
|||
static __inline__ __be32 inet_make_mask(int logmask)
|
||||
{
|
||||
if (logmask)
|
||||
return htonl(~((1<<(32-logmask))-1));
|
||||
return htonl(~((1U<<(32-logmask))-1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -310,6 +310,7 @@ struct pci_dev {
|
|||
unsigned int is_added:1;
|
||||
unsigned int is_busmaster:1; /* device is busmaster */
|
||||
unsigned int no_msi:1; /* device may not use msi */
|
||||
unsigned int no_64bit_msi:1; /* device may only use 32-bit MSIs */
|
||||
unsigned int block_cfg_access:1; /* config space access is blocked */
|
||||
unsigned int broken_parity_status:1; /* Device generates false positive parity */
|
||||
unsigned int irq_reroute_variant:2; /* device needs IRQ rerouting variant */
|
||||
|
|
|
|||
|
|
@ -575,6 +575,7 @@ extern int dev_pm_put_subsys_data(struct device *dev);
|
|||
*/
|
||||
struct dev_pm_domain {
|
||||
struct dev_pm_ops ops;
|
||||
void (*detach)(struct device *dev, bool power_off);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -310,4 +310,56 @@ static inline void pm_genpd_syscore_poweron(struct device *dev)
|
|||
pm_genpd_syscore_switch(dev, false);
|
||||
}
|
||||
|
||||
/* OF PM domain providers */
|
||||
struct of_device_id;
|
||||
|
||||
struct genpd_onecell_data {
|
||||
struct generic_pm_domain **domains;
|
||||
unsigned int num_domains;
|
||||
};
|
||||
|
||||
typedef struct generic_pm_domain *(*genpd_xlate_t)(struct of_phandle_args *args,
|
||||
void *data);
|
||||
|
||||
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
|
||||
int __of_genpd_add_provider(struct device_node *np, genpd_xlate_t xlate,
|
||||
void *data);
|
||||
void of_genpd_del_provider(struct device_node *np);
|
||||
|
||||
struct generic_pm_domain *__of_genpd_xlate_simple(
|
||||
struct of_phandle_args *genpdspec,
|
||||
void *data);
|
||||
struct generic_pm_domain *__of_genpd_xlate_onecell(
|
||||
struct of_phandle_args *genpdspec,
|
||||
void *data);
|
||||
|
||||
int genpd_dev_pm_attach(struct device *dev);
|
||||
#else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
|
||||
static inline int __of_genpd_add_provider(struct device_node *np,
|
||||
genpd_xlate_t xlate, void *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void of_genpd_del_provider(struct device_node *np) {}
|
||||
|
||||
#define __of_genpd_xlate_simple NULL
|
||||
#define __of_genpd_xlate_onecell NULL
|
||||
|
||||
static inline int genpd_dev_pm_attach(struct device *dev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
|
||||
|
||||
static inline int of_genpd_add_provider_simple(struct device_node *np,
|
||||
struct generic_pm_domain *genpd)
|
||||
{
|
||||
return __of_genpd_add_provider(np, __of_genpd_xlate_simple, genpd);
|
||||
}
|
||||
static inline int of_genpd_add_provider_onecell(struct device_node *np,
|
||||
struct genpd_onecell_data *data)
|
||||
{
|
||||
return __of_genpd_add_provider(np, __of_genpd_xlate_onecell, data);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_PM_DOMAIN_H */
|
||||
|
|
|
|||
|
|
@ -1511,7 +1511,6 @@ bool uprobe_deny_signal(void)
|
|||
if (__fatal_signal_pending(t) || arch_uprobe_xol_was_trapped(t)) {
|
||||
utask->state = UTASK_SSTEP_TRAPPED;
|
||||
set_tsk_thread_flag(t, TIF_UPROBE);
|
||||
set_tsk_thread_flag(t, TIF_NOTIFY_RESUME);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -299,6 +299,10 @@ config PM_GENERIC_DOMAINS_RUNTIME
|
|||
def_bool y
|
||||
depends on PM_RUNTIME && PM_GENERIC_DOMAINS
|
||||
|
||||
config PM_GENERIC_DOMAINS_OF
|
||||
def_bool y
|
||||
depends on PM_GENERIC_DOMAINS && OF && !ARCH_EXYNOS
|
||||
|
||||
config CPU_PM
|
||||
bool
|
||||
depends on SUSPEND || CPU_IDLE
|
||||
|
|
|
|||
|
|
@ -34,7 +34,9 @@ static int try_to_freeze_tasks(bool user_only)
|
|||
unsigned int elapsed_msecs;
|
||||
bool wakeup = false;
|
||||
int sleep_usecs = USEC_PER_MSEC;
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
char suspend_abort[MAX_SUSPEND_ABORT_LEN];
|
||||
#endif
|
||||
|
||||
do_gettimeofday(&start);
|
||||
|
||||
|
|
@ -64,9 +66,11 @@ static int try_to_freeze_tasks(bool user_only)
|
|||
break;
|
||||
|
||||
if (pm_wakeup_pending()) {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
pm_get_active_wakeup_sources(suspend_abort,
|
||||
MAX_SUSPEND_ABORT_LEN);
|
||||
log_suspend_abort_reason(suspend_abort);
|
||||
#endif
|
||||
wakeup = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -116,3 +116,5 @@ CONFIG_EXT4_FS_SECURITY=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_RCU_TORTURE_TEST=m
|
||||
CONFIG_RCU_TORTURE_TEST_RUNNABLE=n
|
||||
|
|
|
|||
|
|
@ -62,6 +62,10 @@ int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
|
|||
else
|
||||
res->tclassid = 0;
|
||||
#endif
|
||||
|
||||
if (err == -ESRCH)
|
||||
err = -ENETUNREACH;
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__fib_lookup);
|
||||
|
|
|
|||
|
|
@ -214,6 +214,8 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
|
|||
&ipv6_hdr(skb)->daddr))
|
||||
continue;
|
||||
#endif
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)
|
||||
|
|
|
|||
|
|
@ -1778,6 +1778,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
struct ipxhdr *ipx = NULL;
|
||||
struct sk_buff *skb;
|
||||
int copied, rc;
|
||||
bool locked = true;
|
||||
|
||||
lock_sock(sk);
|
||||
/* put the autobinding in */
|
||||
|
|
@ -1804,6 +1805,8 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
if (sock_flag(sk, SOCK_ZAPPED))
|
||||
goto out;
|
||||
|
||||
release_sock(sk);
|
||||
locked = false;
|
||||
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
|
||||
flags & MSG_DONTWAIT, &rc);
|
||||
if (!skb)
|
||||
|
|
@ -1837,7 +1840,8 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
out_free:
|
||||
skb_free_datagram(sk, skb);
|
||||
out:
|
||||
release_sock(sk);
|
||||
if (locked)
|
||||
release_sock(sk);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1317,8 +1317,7 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)
|
|||
|
||||
/* enable small pop, introduce 400ms delay in turning off */
|
||||
snd_soc_update_bits(codec, SGTL5000_CHIP_REF_CTRL,
|
||||
SGTL5000_SMALL_POP,
|
||||
SGTL5000_SMALL_POP);
|
||||
SGTL5000_SMALL_POP, 1);
|
||||
|
||||
/* disable short cut detector */
|
||||
snd_soc_write(codec, SGTL5000_CHIP_SHORT_CTRL, 0);
|
||||
|
|
|
|||
|
|
@ -275,7 +275,7 @@
|
|||
#define SGTL5000_BIAS_CTRL_MASK 0x000e
|
||||
#define SGTL5000_BIAS_CTRL_SHIFT 1
|
||||
#define SGTL5000_BIAS_CTRL_WIDTH 3
|
||||
#define SGTL5000_SMALL_POP 0x0001
|
||||
#define SGTL5000_SMALL_POP 0
|
||||
|
||||
/*
|
||||
* SGTL5000_CHIP_MIC_CTRL
|
||||
|
|
|
|||
|
|
@ -964,6 +964,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
|
|||
file, blocks, pos - firmware->size);
|
||||
|
||||
out_fw:
|
||||
regmap_async_complete(regmap);
|
||||
release_firmware(firmware);
|
||||
wm_adsp_buf_free(&buf_list);
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -914,6 +914,20 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
|
|||
if ((le16_to_cpu(dev->descriptor.idVendor) == 0x23ba) &&
|
||||
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
mdelay(20);
|
||||
|
||||
/* Marantz/Denon devices with USB DAC functionality need a delay
|
||||
* after each class compliant request
|
||||
*/
|
||||
if ((le16_to_cpu(dev->descriptor.idVendor) == 0x154e) &&
|
||||
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) {
|
||||
|
||||
switch (le16_to_cpu(dev->descriptor.idProduct)) {
|
||||
case 0x3005: /* Marantz HD-DAC1 */
|
||||
case 0x3006: /* Marantz SA-14S1 */
|
||||
mdelay(20);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user