summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2016-11-16 06:33:25 -0500
committerAnthony G. Basile <blueness@gentoo.org>2016-11-16 06:33:25 -0500
commitfae64feb1320d6a5a606518663f9112458a95e90 (patch)
treeefffef16e3b2ce6a29d46ad69580c0b80d95dbb3 /4.8.7/1001_linux-4.8.2.patch
parentgrsecurity-3.1-4.8.7-201611102210 (diff)
downloadhardened-patchset-20161115.tar.gz
hardened-patchset-20161115.tar.bz2
hardened-patchset-20161115.zip
grsecurity-3.1-4.8.8-20161115075620161115
Diffstat (limited to '4.8.7/1001_linux-4.8.2.patch')
-rw-r--r--4.8.7/1001_linux-4.8.2.patch1841
1 files changed, 0 insertions, 1841 deletions
diff --git a/4.8.7/1001_linux-4.8.2.patch b/4.8.7/1001_linux-4.8.2.patch
deleted file mode 100644
index 5e354b2..0000000
--- a/4.8.7/1001_linux-4.8.2.patch
+++ /dev/null
@@ -1,1841 +0,0 @@
-diff --git a/Documentation/virtual/kvm/devices/vcpu.txt b/Documentation/virtual/kvm/devices/vcpu.txt
-index c041658..02f5068 100644
---- a/Documentation/virtual/kvm/devices/vcpu.txt
-+++ b/Documentation/virtual/kvm/devices/vcpu.txt
-@@ -30,4 +30,6 @@ Returns: -ENODEV: PMUv3 not supported
- attribute
- -EBUSY: PMUv3 already initialized
-
--Request the initialization of the PMUv3.
-+Request the initialization of the PMUv3. This must be done after creating the
-+in-kernel irqchip. Creating a PMU with a userspace irqchip is currently not
-+supported.
-diff --git a/Makefile b/Makefile
-index 75db9f3..bf6e44a 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 8
--SUBLEVEL = 1
-+SUBLEVEL = 2
- EXTRAVERSION =
- NAME = Psychotic Stoned Sheep
-
-diff --git a/arch/arm/boot/dts/armada-390.dtsi b/arch/arm/boot/dts/armada-390.dtsi
-index 094e39c..6cd18d8 100644
---- a/arch/arm/boot/dts/armada-390.dtsi
-+++ b/arch/arm/boot/dts/armada-390.dtsi
-@@ -47,6 +47,8 @@
- #include "armada-39x.dtsi"
-
- / {
-+ compatible = "marvell,armada390";
-+
- soc {
- internal-regs {
- pinctrl@18000 {
-@@ -54,4 +56,5 @@
- reg = <0x18000 0x20>;
- };
- };
-+ };
- };
-diff --git a/arch/arm/boot/dts/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom-apq8064.dtsi
-index 74a9b6c..9dc83b0 100644
---- a/arch/arm/boot/dts/qcom-apq8064.dtsi
-+++ b/arch/arm/boot/dts/qcom-apq8064.dtsi
-@@ -5,6 +5,7 @@
- #include <dt-bindings/reset/qcom,gcc-msm8960.h>
- #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
- #include <dt-bindings/soc/qcom,gsbi.h>
-+#include <dt-bindings/interrupt-controller/irq.h>
- #include <dt-bindings/interrupt-controller/arm-gic.h>
- / {
- model = "Qualcomm APQ8064";
-@@ -559,22 +560,50 @@
- compatible = "qcom,pm8921-gpio",
- "qcom,ssbi-gpio";
- reg = <0x150>;
-- interrupts = <192 1>, <193 1>, <194 1>,
-- <195 1>, <196 1>, <197 1>,
-- <198 1>, <199 1>, <200 1>,
-- <201 1>, <202 1>, <203 1>,
-- <204 1>, <205 1>, <206 1>,
-- <207 1>, <208 1>, <209 1>,
-- <210 1>, <211 1>, <212 1>,
-- <213 1>, <214 1>, <215 1>,
-- <216 1>, <217 1>, <218 1>,
-- <219 1>, <220 1>, <221 1>,
-- <222 1>, <223 1>, <224 1>,
-- <225 1>, <226 1>, <227 1>,
-- <228 1>, <229 1>, <230 1>,
-- <231 1>, <232 1>, <233 1>,
-- <234 1>, <235 1>;
--
-+ interrupts = <192 IRQ_TYPE_NONE>,
-+ <193 IRQ_TYPE_NONE>,
-+ <194 IRQ_TYPE_NONE>,
-+ <195 IRQ_TYPE_NONE>,
-+ <196 IRQ_TYPE_NONE>,
-+ <197 IRQ_TYPE_NONE>,
-+ <198 IRQ_TYPE_NONE>,
-+ <199 IRQ_TYPE_NONE>,
-+ <200 IRQ_TYPE_NONE>,
-+ <201 IRQ_TYPE_NONE>,
-+ <202 IRQ_TYPE_NONE>,
-+ <203 IRQ_TYPE_NONE>,
-+ <204 IRQ_TYPE_NONE>,
-+ <205 IRQ_TYPE_NONE>,
-+ <206 IRQ_TYPE_NONE>,
-+ <207 IRQ_TYPE_NONE>,
-+ <208 IRQ_TYPE_NONE>,
-+ <209 IRQ_TYPE_NONE>,
-+ <210 IRQ_TYPE_NONE>,
-+ <211 IRQ_TYPE_NONE>,
-+ <212 IRQ_TYPE_NONE>,
-+ <213 IRQ_TYPE_NONE>,
-+ <214 IRQ_TYPE_NONE>,
-+ <215 IRQ_TYPE_NONE>,
-+ <216 IRQ_TYPE_NONE>,
-+ <217 IRQ_TYPE_NONE>,
-+ <218 IRQ_TYPE_NONE>,
-+ <219 IRQ_TYPE_NONE>,
-+ <220 IRQ_TYPE_NONE>,
-+ <221 IRQ_TYPE_NONE>,
-+ <222 IRQ_TYPE_NONE>,
-+ <223 IRQ_TYPE_NONE>,
-+ <224 IRQ_TYPE_NONE>,
-+ <225 IRQ_TYPE_NONE>,
-+ <226 IRQ_TYPE_NONE>,
-+ <227 IRQ_TYPE_NONE>,
-+ <228 IRQ_TYPE_NONE>,
-+ <229 IRQ_TYPE_NONE>,
-+ <230 IRQ_TYPE_NONE>,
-+ <231 IRQ_TYPE_NONE>,
-+ <232 IRQ_TYPE_NONE>,
-+ <233 IRQ_TYPE_NONE>,
-+ <234 IRQ_TYPE_NONE>,
-+ <235 IRQ_TYPE_NONE>;
- gpio-controller;
- #gpio-cells = <2>;
-
-@@ -587,9 +616,18 @@
- gpio-controller;
- #gpio-cells = <2>;
- interrupts =
-- <128 1>, <129 1>, <130 1>, <131 1>,
-- <132 1>, <133 1>, <134 1>, <135 1>,
-- <136 1>, <137 1>, <138 1>, <139 1>;
-+ <128 IRQ_TYPE_NONE>,
-+ <129 IRQ_TYPE_NONE>,
-+ <130 IRQ_TYPE_NONE>,
-+ <131 IRQ_TYPE_NONE>,
-+ <132 IRQ_TYPE_NONE>,
-+ <133 IRQ_TYPE_NONE>,
-+ <134 IRQ_TYPE_NONE>,
-+ <135 IRQ_TYPE_NONE>,
-+ <136 IRQ_TYPE_NONE>,
-+ <137 IRQ_TYPE_NONE>,
-+ <138 IRQ_TYPE_NONE>,
-+ <139 IRQ_TYPE_NONE>;
- };
-
- rtc@11d {
-diff --git a/arch/arm/boot/dts/qcom-msm8660.dtsi b/arch/arm/boot/dts/qcom-msm8660.dtsi
-index acbe71f..8c65e0d 100644
---- a/arch/arm/boot/dts/qcom-msm8660.dtsi
-+++ b/arch/arm/boot/dts/qcom-msm8660.dtsi
-@@ -2,6 +2,7 @@
-
- /include/ "skeleton.dtsi"
-
-+#include <dt-bindings/interrupt-controller/irq.h>
- #include <dt-bindings/interrupt-controller/arm-gic.h>
- #include <dt-bindings/clock/qcom,gcc-msm8660.h>
- #include <dt-bindings/soc/qcom,gsbi.h>
-@@ -159,21 +160,50 @@
- "qcom,ssbi-gpio";
- reg = <0x150>;
- interrupt-parent = <&pmicintc>;
-- interrupts = <192 1>, <193 1>, <194 1>,
-- <195 1>, <196 1>, <197 1>,
-- <198 1>, <199 1>, <200 1>,
-- <201 1>, <202 1>, <203 1>,
-- <204 1>, <205 1>, <206 1>,
-- <207 1>, <208 1>, <209 1>,
-- <210 1>, <211 1>, <212 1>,
-- <213 1>, <214 1>, <215 1>,
-- <216 1>, <217 1>, <218 1>,
-- <219 1>, <220 1>, <221 1>,
-- <222 1>, <223 1>, <224 1>,
-- <225 1>, <226 1>, <227 1>,
-- <228 1>, <229 1>, <230 1>,
-- <231 1>, <232 1>, <233 1>,
-- <234 1>, <235 1>;
-+ interrupts = <192 IRQ_TYPE_NONE>,
-+ <193 IRQ_TYPE_NONE>,
-+ <194 IRQ_TYPE_NONE>,
-+ <195 IRQ_TYPE_NONE>,
-+ <196 IRQ_TYPE_NONE>,
-+ <197 IRQ_TYPE_NONE>,
-+ <198 IRQ_TYPE_NONE>,
-+ <199 IRQ_TYPE_NONE>,
-+ <200 IRQ_TYPE_NONE>,
-+ <201 IRQ_TYPE_NONE>,
-+ <202 IRQ_TYPE_NONE>,
-+ <203 IRQ_TYPE_NONE>,
-+ <204 IRQ_TYPE_NONE>,
-+ <205 IRQ_TYPE_NONE>,
-+ <206 IRQ_TYPE_NONE>,
-+ <207 IRQ_TYPE_NONE>,
-+ <208 IRQ_TYPE_NONE>,
-+ <209 IRQ_TYPE_NONE>,
-+ <210 IRQ_TYPE_NONE>,
-+ <211 IRQ_TYPE_NONE>,
-+ <212 IRQ_TYPE_NONE>,
-+ <213 IRQ_TYPE_NONE>,
-+ <214 IRQ_TYPE_NONE>,
-+ <215 IRQ_TYPE_NONE>,
-+ <216 IRQ_TYPE_NONE>,
-+ <217 IRQ_TYPE_NONE>,
-+ <218 IRQ_TYPE_NONE>,
-+ <219 IRQ_TYPE_NONE>,
-+ <220 IRQ_TYPE_NONE>,
-+ <221 IRQ_TYPE_NONE>,
-+ <222 IRQ_TYPE_NONE>,
-+ <223 IRQ_TYPE_NONE>,
-+ <224 IRQ_TYPE_NONE>,
-+ <225 IRQ_TYPE_NONE>,
-+ <226 IRQ_TYPE_NONE>,
-+ <227 IRQ_TYPE_NONE>,
-+ <228 IRQ_TYPE_NONE>,
-+ <229 IRQ_TYPE_NONE>,
-+ <230 IRQ_TYPE_NONE>,
-+ <231 IRQ_TYPE_NONE>,
-+ <232 IRQ_TYPE_NONE>,
-+ <233 IRQ_TYPE_NONE>,
-+ <234 IRQ_TYPE_NONE>,
-+ <235 IRQ_TYPE_NONE>;
- gpio-controller;
- #gpio-cells = <2>;
-
-@@ -187,9 +217,18 @@
- #gpio-cells = <2>;
- interrupt-parent = <&pmicintc>;
- interrupts =
-- <128 1>, <129 1>, <130 1>, <131 1>,
-- <132 1>, <133 1>, <134 1>, <135 1>,
-- <136 1>, <137 1>, <138 1>, <139 1>;
-+ <128 IRQ_TYPE_NONE>,
-+ <129 IRQ_TYPE_NONE>,
-+ <130 IRQ_TYPE_NONE>,
-+ <131 IRQ_TYPE_NONE>,
-+ <132 IRQ_TYPE_NONE>,
-+ <133 IRQ_TYPE_NONE>,
-+ <134 IRQ_TYPE_NONE>,
-+ <135 IRQ_TYPE_NONE>,
-+ <136 IRQ_TYPE_NONE>,
-+ <137 IRQ_TYPE_NONE>,
-+ <138 IRQ_TYPE_NONE>,
-+ <139 IRQ_TYPE_NONE>;
- };
-
- pwrkey@1c {
-diff --git a/arch/arm/include/asm/delay.h b/arch/arm/include/asm/delay.h
-index b7a4281..b1ce037 100644
---- a/arch/arm/include/asm/delay.h
-+++ b/arch/arm/include/asm/delay.h
-@@ -10,7 +10,7 @@
- #include <asm/param.h> /* HZ */
-
- #define MAX_UDELAY_MS 2
--#define UDELAY_MULT UL(2047 * HZ + 483648 * HZ / 1000000)
-+#define UDELAY_MULT UL(2147 * HZ + 483648 * HZ / 1000000)
- #define UDELAY_SHIFT 31
-
- #ifndef __ASSEMBLY__
-diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
-index d9751a4..d34fd72 100644
---- a/arch/arm64/kernel/stacktrace.c
-+++ b/arch/arm64/kernel/stacktrace.c
-@@ -43,6 +43,9 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
- unsigned long fp = frame->fp;
- unsigned long irq_stack_ptr;
-
-+ if (!tsk)
-+ tsk = current;
-+
- /*
- * Switching between stacks is valid when tracing current and in
- * non-preemptible context.
-@@ -67,7 +70,7 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
- frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp + 8));
-
- #ifdef CONFIG_FUNCTION_GRAPH_TRACER
-- if (tsk && tsk->ret_stack &&
-+ if (tsk->ret_stack &&
- (frame->pc == (unsigned long)return_to_handler)) {
- /*
- * This is a case where function graph tracer has
-diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
-index e04f838..df06750 100644
---- a/arch/arm64/kernel/traps.c
-+++ b/arch/arm64/kernel/traps.c
-@@ -142,6 +142,11 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
- unsigned long irq_stack_ptr;
- int skip;
-
-+ pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
-+
-+ if (!tsk)
-+ tsk = current;
-+
- /*
- * Switching between stacks is valid when tracing current and in
- * non-preemptible context.
-@@ -151,11 +156,6 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
- else
- irq_stack_ptr = 0;
-
-- pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
--
-- if (!tsk)
-- tsk = current;
--
- if (tsk == current) {
- frame.fp = (unsigned long)__builtin_frame_address(0);
- frame.sp = current_stack_pointer;
-diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c
-index e788515..43853ec 100644
---- a/arch/mips/kvm/emulate.c
-+++ b/arch/mips/kvm/emulate.c
-@@ -846,6 +846,47 @@ enum emulation_result kvm_mips_emul_tlbr(struct kvm_vcpu *vcpu)
- return EMULATE_FAIL;
- }
-
-+/**
-+ * kvm_mips_invalidate_guest_tlb() - Indicates a change in guest MMU map.
-+ * @vcpu: VCPU with changed mappings.
-+ * @tlb: TLB entry being removed.
-+ *
-+ * This is called to indicate a single change in guest MMU mappings, so that we
-+ * can arrange TLB flushes on this and other CPUs.
-+ */
-+static void kvm_mips_invalidate_guest_tlb(struct kvm_vcpu *vcpu,
-+ struct kvm_mips_tlb *tlb)
-+{
-+ int cpu, i;
-+ bool user;
-+
-+ /* No need to flush for entries which are already invalid */
-+ if (!((tlb->tlb_lo[0] | tlb->tlb_lo[1]) & ENTRYLO_V))
-+ return;
-+ /* User address space doesn't need flushing for KSeg2/3 changes */
-+ user = tlb->tlb_hi < KVM_GUEST_KSEG0;
-+
-+ preempt_disable();
-+
-+ /*
-+ * Probe the shadow host TLB for the entry being overwritten, if one
-+ * matches, invalidate it
-+ */
-+ kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi);
-+
-+ /* Invalidate the whole ASID on other CPUs */
-+ cpu = smp_processor_id();
-+ for_each_possible_cpu(i) {
-+ if (i == cpu)
-+ continue;
-+ if (user)
-+ vcpu->arch.guest_user_asid[i] = 0;
-+ vcpu->arch.guest_kernel_asid[i] = 0;
-+ }
-+
-+ preempt_enable();
-+}
-+
- /* Write Guest TLB Entry @ Index */
- enum emulation_result kvm_mips_emul_tlbwi(struct kvm_vcpu *vcpu)
- {
-@@ -865,11 +906,8 @@ enum emulation_result kvm_mips_emul_tlbwi(struct kvm_vcpu *vcpu)
- }
-
- tlb = &vcpu->arch.guest_tlb[index];
-- /*
-- * Probe the shadow host TLB for the entry being overwritten, if one
-- * matches, invalidate it
-- */
-- kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi);
-+
-+ kvm_mips_invalidate_guest_tlb(vcpu, tlb);
-
- tlb->tlb_mask = kvm_read_c0_guest_pagemask(cop0);
- tlb->tlb_hi = kvm_read_c0_guest_entryhi(cop0);
-@@ -898,11 +936,7 @@ enum emulation_result kvm_mips_emul_tlbwr(struct kvm_vcpu *vcpu)
-
- tlb = &vcpu->arch.guest_tlb[index];
-
-- /*
-- * Probe the shadow host TLB for the entry being overwritten, if one
-- * matches, invalidate it
-- */
-- kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi);
-+ kvm_mips_invalidate_guest_tlb(vcpu, tlb);
-
- tlb->tlb_mask = kvm_read_c0_guest_pagemask(cop0);
- tlb->tlb_hi = kvm_read_c0_guest_entryhi(cop0);
-@@ -1026,6 +1060,7 @@ enum emulation_result kvm_mips_emulate_CP0(union mips_instruction inst,
- enum emulation_result er = EMULATE_DONE;
- u32 rt, rd, sel;
- unsigned long curr_pc;
-+ int cpu, i;
-
- /*
- * Update PC and hold onto current PC in case there is
-@@ -1135,8 +1170,16 @@ enum emulation_result kvm_mips_emulate_CP0(union mips_instruction inst,
- & KVM_ENTRYHI_ASID,
- nasid);
-
-+ preempt_disable();
- /* Blow away the shadow host TLBs */
- kvm_mips_flush_host_tlb(1);
-+ cpu = smp_processor_id();
-+ for_each_possible_cpu(i)
-+ if (i != cpu) {
-+ vcpu->arch.guest_user_asid[i] = 0;
-+ vcpu->arch.guest_kernel_asid[i] = 0;
-+ }
-+ preempt_enable();
- }
- kvm_write_c0_guest_entryhi(cop0,
- vcpu->arch.gprs[rt]);
-diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
-index f69f40f..978dada 100644
---- a/arch/powerpc/include/asm/reg.h
-+++ b/arch/powerpc/include/asm/reg.h
-@@ -737,6 +737,7 @@
- #define MMCR0_FCHV 0x00000001UL /* freeze conditions in hypervisor mode */
- #define SPRN_MMCR1 798
- #define SPRN_MMCR2 785
-+#define SPRN_UMMCR2 769
- #define SPRN_MMCRA 0x312
- #define MMCRA_SDSYNC 0x80000000UL /* SDAR synced with SIAR */
- #define MMCRA_SDAR_DCACHE_MISS 0x40000000UL
-diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
-index 2afdb9c..729f8fa 100644
---- a/arch/powerpc/kvm/book3s_emulate.c
-+++ b/arch/powerpc/kvm/book3s_emulate.c
-@@ -498,6 +498,7 @@ int kvmppc_core_emulate_mtspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
- case SPRN_MMCR0:
- case SPRN_MMCR1:
- case SPRN_MMCR2:
-+ case SPRN_UMMCR2:
- #endif
- break;
- unprivileged:
-@@ -640,6 +641,7 @@ int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val
- case SPRN_MMCR0:
- case SPRN_MMCR1:
- case SPRN_MMCR2:
-+ case SPRN_UMMCR2:
- case SPRN_TIR:
- #endif
- *spr_val = 0;
-diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
-index 02b4672..df3f270 100644
---- a/arch/powerpc/kvm/booke.c
-+++ b/arch/powerpc/kvm/booke.c
-@@ -2038,7 +2038,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
- if (type == KVMPPC_DEBUG_NONE)
- continue;
-
-- if (type & !(KVMPPC_DEBUG_WATCH_READ |
-+ if (type & ~(KVMPPC_DEBUG_WATCH_READ |
- KVMPPC_DEBUG_WATCH_WRITE |
- KVMPPC_DEBUG_BREAKPOINT))
- return -EINVAL;
-diff --git a/arch/x86/include/asm/fpu/xstate.h b/arch/x86/include/asm/fpu/xstate.h
-index ae55a43..19f30a8 100644
---- a/arch/x86/include/asm/fpu/xstate.h
-+++ b/arch/x86/include/asm/fpu/xstate.h
-@@ -27,11 +27,12 @@
- XFEATURE_MASK_YMM | \
- XFEATURE_MASK_OPMASK | \
- XFEATURE_MASK_ZMM_Hi256 | \
-- XFEATURE_MASK_Hi16_ZMM | \
-- XFEATURE_MASK_PKRU)
-+ XFEATURE_MASK_Hi16_ZMM)
-
- /* Supported features which require eager state saving */
--#define XFEATURE_MASK_EAGER (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR)
-+#define XFEATURE_MASK_EAGER (XFEATURE_MASK_BNDREGS | \
-+ XFEATURE_MASK_BNDCSR | \
-+ XFEATURE_MASK_PKRU)
-
- /* All currently supported features */
- #define XCNTXT_MASK (XFEATURE_MASK_LAZY | XFEATURE_MASK_EAGER)
-diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h
-index 6277194..9ae5ab8 100644
---- a/arch/x86/include/asm/intel-family.h
-+++ b/arch/x86/include/asm/intel-family.h
-@@ -56,8 +56,8 @@
- #define INTEL_FAM6_ATOM_SILVERMONT1 0x37 /* BayTrail/BYT / Valleyview */
- #define INTEL_FAM6_ATOM_SILVERMONT2 0x4D /* Avaton/Rangely */
- #define INTEL_FAM6_ATOM_AIRMONT 0x4C /* CherryTrail / Braswell */
--#define INTEL_FAM6_ATOM_MERRIFIELD1 0x4A /* Tangier */
--#define INTEL_FAM6_ATOM_MERRIFIELD2 0x5A /* Annidale */
-+#define INTEL_FAM6_ATOM_MERRIFIELD 0x4A /* Tangier */
-+#define INTEL_FAM6_ATOM_MOOREFIELD 0x5A /* Annidale */
- #define INTEL_FAM6_ATOM_GOLDMONT 0x5C
- #define INTEL_FAM6_ATOM_DENVERTON 0x5F /* Goldmont Microserver */
-
-diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h
-index b07233b..c2f94dc 100644
---- a/arch/x86/include/asm/mpspec.h
-+++ b/arch/x86/include/asm/mpspec.h
-@@ -6,7 +6,6 @@
- #include <asm/x86_init.h>
- #include <asm/apicdef.h>
-
--extern int apic_version[];
- extern int pic_mode;
-
- #ifdef CONFIG_X86_32
-@@ -40,6 +39,7 @@ extern int mp_bus_id_to_type[MAX_MP_BUSSES];
- extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
-
- extern unsigned int boot_cpu_physical_apicid;
-+extern u8 boot_cpu_apic_version;
- extern unsigned long mp_lapic_addr;
-
- #ifdef CONFIG_X86_LOCAL_APIC
-diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
-index 90d84c3..fbd1944 100644
---- a/arch/x86/kernel/acpi/boot.c
-+++ b/arch/x86/kernel/acpi/boot.c
-@@ -182,7 +182,7 @@ static int acpi_register_lapic(int id, u32 acpiid, u8 enabled)
- }
-
- if (boot_cpu_physical_apicid != -1U)
-- ver = apic_version[boot_cpu_physical_apicid];
-+ ver = boot_cpu_apic_version;
-
- cpu = generic_processor_info(id, ver);
- if (cpu >= 0)
-diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
-index f3e9b2d..076c315 100644
---- a/arch/x86/kernel/apic/apic.c
-+++ b/arch/x86/kernel/apic/apic.c
-@@ -64,6 +64,8 @@ unsigned disabled_cpus;
- unsigned int boot_cpu_physical_apicid = -1U;
- EXPORT_SYMBOL_GPL(boot_cpu_physical_apicid);
-
-+u8 boot_cpu_apic_version;
-+
- /*
- * The highest APIC ID seen during enumeration.
- */
-@@ -1816,8 +1818,7 @@ void __init init_apic_mappings(void)
- * since smp_sanity_check is prepared for such a case
- * and disable smp mode
- */
-- apic_version[new_apicid] =
-- GET_APIC_VERSION(apic_read(APIC_LVR));
-+ boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR));
- }
- }
-
-@@ -1832,13 +1833,10 @@ void __init register_lapic_address(unsigned long address)
- }
- if (boot_cpu_physical_apicid == -1U) {
- boot_cpu_physical_apicid = read_apic_id();
-- apic_version[boot_cpu_physical_apicid] =
-- GET_APIC_VERSION(apic_read(APIC_LVR));
-+ boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR));
- }
- }
-
--int apic_version[MAX_LOCAL_APIC];
--
- /*
- * Local APIC interrupts
- */
-@@ -2130,11 +2128,10 @@ int generic_processor_info(int apicid, int version)
- cpu, apicid);
- version = 0x10;
- }
-- apic_version[apicid] = version;
-
-- if (version != apic_version[boot_cpu_physical_apicid]) {
-+ if (version != boot_cpu_apic_version) {
- pr_warning("BIOS bug: APIC version mismatch, boot CPU: %x, CPU %d: version %x\n",
-- apic_version[boot_cpu_physical_apicid], cpu, version);
-+ boot_cpu_apic_version, cpu, version);
- }
-
- physid_set(apicid, phys_cpu_present_map);
-@@ -2277,7 +2274,7 @@ int __init APIC_init_uniprocessor(void)
- * Complain if the BIOS pretends there is one.
- */
- if (!boot_cpu_has(X86_FEATURE_APIC) &&
-- APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
-+ APIC_INTEGRATED(boot_cpu_apic_version)) {
- pr_err("BIOS bug, local APIC 0x%x not detected!...\n",
- boot_cpu_physical_apicid);
- return -1;
-diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
-index 7491f41..48e6d84 100644
---- a/arch/x86/kernel/apic/io_apic.c
-+++ b/arch/x86/kernel/apic/io_apic.c
-@@ -1593,7 +1593,7 @@ void __init setup_ioapic_ids_from_mpc(void)
- * no meaning without the serial APIC bus.
- */
- if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-- || APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-+ || APIC_XAPIC(boot_cpu_apic_version))
- return;
- setup_ioapic_ids_from_mpc_nocheck();
- }
-@@ -2423,7 +2423,7 @@ static int io_apic_get_unique_id(int ioapic, int apic_id)
- static u8 io_apic_unique_id(int idx, u8 id)
- {
- if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
-- !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-+ !APIC_XAPIC(boot_cpu_apic_version))
- return io_apic_get_unique_id(idx, id);
- else
- return id;
-diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c
-index 7c43e71..5630962 100644
---- a/arch/x86/kernel/apic/probe_32.c
-+++ b/arch/x86/kernel/apic/probe_32.c
-@@ -152,7 +152,7 @@ early_param("apic", parse_apic);
-
- void __init default_setup_apic_routing(void)
- {
-- int version = apic_version[boot_cpu_physical_apicid];
-+ int version = boot_cpu_apic_version;
-
- if (num_possible_cpus() > 8) {
- switch (boot_cpu_data.x86_vendor) {
-diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
-index 6066d94..5d30c5e 100644
---- a/arch/x86/kernel/apic/vector.c
-+++ b/arch/x86/kernel/apic/vector.c
-@@ -661,11 +661,28 @@ void irq_complete_move(struct irq_cfg *cfg)
- */
- void irq_force_complete_move(struct irq_desc *desc)
- {
-- struct irq_data *irqdata = irq_desc_get_irq_data(desc);
-- struct apic_chip_data *data = apic_chip_data(irqdata);
-- struct irq_cfg *cfg = data ? &data->cfg : NULL;
-+ struct irq_data *irqdata;
-+ struct apic_chip_data *data;
-+ struct irq_cfg *cfg;
- unsigned int cpu;
-
-+ /*
-+ * The function is called for all descriptors regardless of which
-+ * irqdomain they belong to. For example if an IRQ is provided by
-+ * an irq_chip as part of a GPIO driver, the chip data for that
-+ * descriptor is specific to the irq_chip in question.
-+ *
-+ * Check first that the chip_data is what we expect
-+ * (apic_chip_data) before touching it any further.
-+ */
-+ irqdata = irq_domain_get_irq_data(x86_vector_domain,
-+ irq_desc_get_irq(desc));
-+ if (!irqdata)
-+ return;
-+
-+ data = apic_chip_data(irqdata);
-+ cfg = data ? &data->cfg : NULL;
-+
- if (!cfg)
- return;
-
-diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
-index 621b501..8a90f15 100644
---- a/arch/x86/kernel/e820.c
-+++ b/arch/x86/kernel/e820.c
-@@ -348,7 +348,7 @@ int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map,
- * continue building up new bios map based on this
- * information
- */
-- if (current_type != last_type || current_type == E820_PRAM) {
-+ if (current_type != last_type) {
- if (last_type != 0) {
- new_bios[new_bios_entry].size =
- change_point[chgidx]->addr - last_addr;
-@@ -754,7 +754,7 @@ u64 __init early_reserve_e820(u64 size, u64 align)
- /*
- * Find the highest page frame number we have available
- */
--static unsigned long __init e820_end_pfn(unsigned long limit_pfn)
-+static unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type)
- {
- int i;
- unsigned long last_pfn = 0;
-@@ -765,11 +765,7 @@ static unsigned long __init e820_end_pfn(unsigned long limit_pfn)
- unsigned long start_pfn;
- unsigned long end_pfn;
-
-- /*
-- * Persistent memory is accounted as ram for purposes of
-- * establishing max_pfn and mem_map.
-- */
-- if (ei->type != E820_RAM && ei->type != E820_PRAM)
-+ if (ei->type != type)
- continue;
-
- start_pfn = ei->addr >> PAGE_SHIFT;
-@@ -794,12 +790,12 @@ static unsigned long __init e820_end_pfn(unsigned long limit_pfn)
- }
- unsigned long __init e820_end_of_ram_pfn(void)
- {
-- return e820_end_pfn(MAX_ARCH_PFN);
-+ return e820_end_pfn(MAX_ARCH_PFN, E820_RAM);
- }
-
- unsigned long __init e820_end_of_low_ram_pfn(void)
- {
-- return e820_end_pfn(1UL << (32-PAGE_SHIFT));
-+ return e820_end_pfn(1UL << (32 - PAGE_SHIFT), E820_RAM);
- }
-
- static void early_panic(char *msg)
-diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
-index 63236d8..a21068e 100644
---- a/arch/x86/kernel/process_64.c
-+++ b/arch/x86/kernel/process_64.c
-@@ -110,12 +110,13 @@ void __show_regs(struct pt_regs *regs, int all)
- get_debugreg(d7, 7);
-
- /* Only print out debug registers if they are in their non-default state. */
-- if ((d0 == 0) && (d1 == 0) && (d2 == 0) && (d3 == 0) &&
-- (d6 == DR6_RESERVED) && (d7 == 0x400))
-- return;
--
-- printk(KERN_DEFAULT "DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2);
-- printk(KERN_DEFAULT "DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7);
-+ if (!((d0 == 0) && (d1 == 0) && (d2 == 0) && (d3 == 0) &&
-+ (d6 == DR6_RESERVED) && (d7 == 0x400))) {
-+ printk(KERN_DEFAULT "DR0: %016lx DR1: %016lx DR2: %016lx\n",
-+ d0, d1, d2);
-+ printk(KERN_DEFAULT "DR3: %016lx DR6: %016lx DR7: %016lx\n",
-+ d3, d6, d7);
-+ }
-
- if (boot_cpu_has(X86_FEATURE_OSPKE))
- printk(KERN_DEFAULT "PKRU: %08x\n", read_pkru());
-diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
-index f79576a..a1606ea 100644
---- a/arch/x86/kernel/ptrace.c
-+++ b/arch/x86/kernel/ptrace.c
-@@ -173,8 +173,8 @@ unsigned long kernel_stack_pointer(struct pt_regs *regs)
- return sp;
-
- prev_esp = (u32 *)(context);
-- if (prev_esp)
-- return (unsigned long)prev_esp;
-+ if (*prev_esp)
-+ return (unsigned long)*prev_esp;
-
- return (unsigned long)regs;
- }
-diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
-index 4296beb..82b1737 100644
---- a/arch/x86/kernel/smpboot.c
-+++ b/arch/x86/kernel/smpboot.c
-@@ -690,7 +690,7 @@ wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip)
- * Give the other CPU some time to accept the IPI.
- */
- udelay(200);
-- if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
-+ if (APIC_INTEGRATED(boot_cpu_apic_version)) {
- maxlvt = lapic_get_maxlvt();
- if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
- apic_write(APIC_ESR, 0);
-@@ -717,7 +717,7 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
- /*
- * Be paranoid about clearing APIC errors.
- */
-- if (APIC_INTEGRATED(apic_version[phys_apicid])) {
-+ if (APIC_INTEGRATED(boot_cpu_apic_version)) {
- if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
- apic_write(APIC_ESR, 0);
- apic_read(APIC_ESR);
-@@ -756,7 +756,7 @@ wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
- * Determine this based on the APIC version.
- * If we don't have an integrated APIC, don't send the STARTUP IPIs.
- */
-- if (APIC_INTEGRATED(apic_version[phys_apicid]))
-+ if (APIC_INTEGRATED(boot_cpu_apic_version))
- num_starts = 2;
- else
- num_starts = 0;
-@@ -994,7 +994,7 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
- /*
- * Be paranoid about clearing APIC errors.
- */
-- if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
-+ if (APIC_INTEGRATED(boot_cpu_apic_version)) {
- apic_write(APIC_ESR, 0);
- apic_read(APIC_ESR);
- }
-@@ -1249,7 +1249,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
- /*
- * If we couldn't find a local APIC, then get out of here now!
- */
-- if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid]) &&
-+ if (APIC_INTEGRATED(boot_cpu_apic_version) &&
- !boot_cpu_has(X86_FEATURE_APIC)) {
- if (!disable_apic) {
- pr_err("BIOS bug, local APIC #%d not detected!...\n",
-@@ -1406,9 +1406,21 @@ __init void prefill_possible_map(void)
- {
- int i, possible;
-
-- /* no processor from mptable or madt */
-- if (!num_processors)
-- num_processors = 1;
-+ /* No boot processor was found in mptable or ACPI MADT */
-+ if (!num_processors) {
-+ int apicid = boot_cpu_physical_apicid;
-+ int cpu = hard_smp_processor_id();
-+
-+ pr_warn("Boot CPU (id %d) not listed by BIOS\n", cpu);
-+
-+ /* Make sure boot cpu is enumerated */
-+ if (apic->cpu_present_to_apicid(0) == BAD_APICID &&
-+ apic->apic_id_valid(apicid))
-+ generic_processor_info(apicid, boot_cpu_apic_version);
-+
-+ if (!num_processors)
-+ num_processors = 1;
-+ }
-
- i = setup_max_cpus ?: 1;
- if (setup_possible_cpus == -1) {
-diff --git a/arch/x86/platform/atom/punit_atom_debug.c b/arch/x86/platform/atom/punit_atom_debug.c
-index 8ff7b93..d49d3be 100644
---- a/arch/x86/platform/atom/punit_atom_debug.c
-+++ b/arch/x86/platform/atom/punit_atom_debug.c
-@@ -155,7 +155,7 @@ static void punit_dbgfs_unregister(void)
-
- static const struct x86_cpu_id intel_punit_cpu_ids[] = {
- ICPU(INTEL_FAM6_ATOM_SILVERMONT1, punit_device_byt),
-- ICPU(INTEL_FAM6_ATOM_MERRIFIELD1, punit_device_tng),
-+ ICPU(INTEL_FAM6_ATOM_MERRIFIELD, punit_device_tng),
- ICPU(INTEL_FAM6_ATOM_AIRMONT, punit_device_cht),
- {}
- };
-diff --git a/arch/x86/platform/intel-mid/pwr.c b/arch/x86/platform/intel-mid/pwr.c
-index c901a34..6eca0f6 100644
---- a/arch/x86/platform/intel-mid/pwr.c
-+++ b/arch/x86/platform/intel-mid/pwr.c
-@@ -354,7 +354,7 @@ static int mid_pwr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
- return 0;
- }
-
--static int mid_set_initial_state(struct mid_pwr *pwr)
-+static int mid_set_initial_state(struct mid_pwr *pwr, const u32 *states)
- {
- unsigned int i, j;
- int ret;
-@@ -379,10 +379,10 @@ static int mid_set_initial_state(struct mid_pwr *pwr)
- * NOTE: The actual device mapping is provided by a platform at run
- * time using vendor capability of PCI configuration space.
- */
-- mid_pwr_set_state(pwr, 0, 0xffffffff);
-- mid_pwr_set_state(pwr, 1, 0xffffffff);
-- mid_pwr_set_state(pwr, 2, 0xffffffff);
-- mid_pwr_set_state(pwr, 3, 0xffffffff);
-+ mid_pwr_set_state(pwr, 0, states[0]);
-+ mid_pwr_set_state(pwr, 1, states[1]);
-+ mid_pwr_set_state(pwr, 2, states[2]);
-+ mid_pwr_set_state(pwr, 3, states[3]);
-
- /* Send command to SCU */
- ret = mid_pwr_wait_for_cmd(pwr, CMD_SET_CFG);
-@@ -397,13 +397,41 @@ static int mid_set_initial_state(struct mid_pwr *pwr)
- return 0;
- }
-
--static const struct mid_pwr_device_info mid_info = {
-- .set_initial_state = mid_set_initial_state,
-+static int pnw_set_initial_state(struct mid_pwr *pwr)
-+{
-+ /* On Penwell SRAM must stay powered on */
-+ const u32 states[] = {
-+ 0xf00fffff, /* PM_SSC(0) */
-+ 0xffffffff, /* PM_SSC(1) */
-+ 0xffffffff, /* PM_SSC(2) */
-+ 0xffffffff, /* PM_SSC(3) */
-+ };
-+ return mid_set_initial_state(pwr, states);
-+}
-+
-+static int tng_set_initial_state(struct mid_pwr *pwr)
-+{
-+ const u32 states[] = {
-+ 0xffffffff, /* PM_SSC(0) */
-+ 0xffffffff, /* PM_SSC(1) */
-+ 0xffffffff, /* PM_SSC(2) */
-+ 0xffffffff, /* PM_SSC(3) */
-+ };
-+ return mid_set_initial_state(pwr, states);
-+}
-+
-+static const struct mid_pwr_device_info pnw_info = {
-+ .set_initial_state = pnw_set_initial_state,
-+};
-+
-+static const struct mid_pwr_device_info tng_info = {
-+ .set_initial_state = tng_set_initial_state,
- };
-
-+/* This table should be in sync with the one in drivers/pci/pci-mid.c */
- static const struct pci_device_id mid_pwr_pci_ids[] = {
-- { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_PENWELL), (kernel_ulong_t)&mid_info },
-- { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_TANGIER), (kernel_ulong_t)&mid_info },
-+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_PENWELL), (kernel_ulong_t)&pnw_info },
-+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_TANGIER), (kernel_ulong_t)&tng_info },
- {}
- };
-
-diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
-index 0b4d04c..6228403 100644
---- a/arch/x86/xen/smp.c
-+++ b/arch/x86/xen/smp.c
-@@ -87,6 +87,12 @@ static void cpu_bringup(void)
- cpu_data(cpu).x86_max_cores = 1;
- set_cpu_sibling_map(cpu);
-
-+ /*
-+ * identify_cpu() may have set logical_pkg_id to -1 due
-+ * to incorrect phys_proc_id. Let's re-comupte it.
-+ */
-+ topology_update_package_map(apic->cpu_present_to_apicid(cpu), cpu);
-+
- xen_setup_cpu_clockevents();
-
- notify_cpu_starting(cpu);
-diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
-index 811f9b9..d4d55f6 100644
---- a/drivers/bluetooth/btusb.c
-+++ b/drivers/bluetooth/btusb.c
-@@ -251,6 +251,7 @@ static const struct usb_device_id blacklist_table[] = {
- { USB_DEVICE(0x0cf3, 0xe300), .driver_info = BTUSB_QCA_ROME },
- { USB_DEVICE(0x0cf3, 0xe360), .driver_info = BTUSB_QCA_ROME },
- { USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME },
-+ { USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME },
-
- /* Broadcom BCM2035 */
- { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
-diff --git a/drivers/char/tpm/tpm-dev.c b/drivers/char/tpm/tpm-dev.c
-index f5d4521..912ad30 100644
---- a/drivers/char/tpm/tpm-dev.c
-+++ b/drivers/char/tpm/tpm-dev.c
-@@ -145,7 +145,7 @@ static ssize_t tpm_write(struct file *file, const char __user *buf,
- return -EPIPE;
- }
- out_size = tpm_transmit(priv->chip, priv->data_buffer,
-- sizeof(priv->data_buffer));
-+ sizeof(priv->data_buffer), 0);
-
- tpm_put_ops(priv->chip);
- if (out_size < 0) {
-diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
-index 1abe2d7..aef20ee 100644
---- a/drivers/char/tpm/tpm-interface.c
-+++ b/drivers/char/tpm/tpm-interface.c
-@@ -330,8 +330,8 @@ EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
- /*
- * Internal kernel interface to transmit TPM commands
- */
--ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
-- size_t bufsiz)
-+ssize_t tpm_transmit(struct tpm_chip *chip, const u8 *buf, size_t bufsiz,
-+ unsigned int flags)
- {
- ssize_t rc;
- u32 count, ordinal;
-@@ -350,7 +350,8 @@ ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
- return -E2BIG;
- }
-
-- mutex_lock(&chip->tpm_mutex);
-+ if (!(flags & TPM_TRANSMIT_UNLOCKED))
-+ mutex_lock(&chip->tpm_mutex);
-
- rc = chip->ops->send(chip, (u8 *) buf, count);
- if (rc < 0) {
-@@ -393,20 +394,21 @@ ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
- dev_err(&chip->dev,
- "tpm_transmit: tpm_recv: error %zd\n", rc);
- out:
-- mutex_unlock(&chip->tpm_mutex);
-+ if (!(flags & TPM_TRANSMIT_UNLOCKED))
-+ mutex_unlock(&chip->tpm_mutex);
- return rc;
- }
-
- #define TPM_DIGEST_SIZE 20
- #define TPM_RET_CODE_IDX 6
-
--ssize_t tpm_transmit_cmd(struct tpm_chip *chip, void *cmd,
-- int len, const char *desc)
-+ssize_t tpm_transmit_cmd(struct tpm_chip *chip, const void *cmd,
-+ int len, unsigned int flags, const char *desc)
- {
-- struct tpm_output_header *header;
-+ const struct tpm_output_header *header;
- int err;
-
-- len = tpm_transmit(chip, (u8 *) cmd, len);
-+ len = tpm_transmit(chip, (const u8 *)cmd, len, flags);
- if (len < 0)
- return len;
- else if (len < TPM_HEADER_SIZE)
-@@ -453,7 +455,8 @@ ssize_t tpm_getcap(struct tpm_chip *chip, __be32 subcap_id, cap_t *cap,
- tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
- tpm_cmd.params.getcap_in.subcap = subcap_id;
- }
-- rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, desc);
-+ rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
-+ desc);
- if (!rc)
- *cap = tpm_cmd.params.getcap_out.cap;
- return rc;
-@@ -469,7 +472,7 @@ void tpm_gen_interrupt(struct tpm_chip *chip)
- tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
- tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_TIMEOUT;
-
-- rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
-+ rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
- "attempting to determine the timeouts");
- }
- EXPORT_SYMBOL_GPL(tpm_gen_interrupt);
-@@ -490,7 +493,7 @@ static int tpm_startup(struct tpm_chip *chip, __be16 startup_type)
- start_cmd.header.in = tpm_startup_header;
-
- start_cmd.params.startup_in.startup_type = startup_type;
-- return tpm_transmit_cmd(chip, &start_cmd, TPM_INTERNAL_RESULT_SIZE,
-+ return tpm_transmit_cmd(chip, &start_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
- "attempting to start the TPM");
- }
-
-@@ -521,7 +524,8 @@ int tpm_get_timeouts(struct tpm_chip *chip)
- tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
- tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
- tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_TIMEOUT;
-- rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, NULL);
-+ rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
-+ NULL);
-
- if (rc == TPM_ERR_INVALID_POSTINIT) {
- /* The TPM is not started, we are the first to talk to it.
-@@ -535,7 +539,7 @@ int tpm_get_timeouts(struct tpm_chip *chip)
- tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
- tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_TIMEOUT;
- rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
-- NULL);
-+ 0, NULL);
- }
- if (rc) {
- dev_err(&chip->dev,
-@@ -596,7 +600,7 @@ int tpm_get_timeouts(struct tpm_chip *chip)
- tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
- tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_DURATION;
-
-- rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
-+ rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
- "attempting to determine the durations");
- if (rc)
- return rc;
-@@ -652,7 +656,7 @@ static int tpm_continue_selftest(struct tpm_chip *chip)
- struct tpm_cmd_t cmd;
-
- cmd.header.in = continue_selftest_header;
-- rc = tpm_transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE,
-+ rc = tpm_transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE, 0,
- "continue selftest");
- return rc;
- }
-@@ -672,7 +676,7 @@ int tpm_pcr_read_dev(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
-
- cmd.header.in = pcrread_header;
- cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);
-- rc = tpm_transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE,
-+ rc = tpm_transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE, 0,
- "attempting to read a pcr value");
-
- if (rc == 0)
-@@ -770,7 +774,7 @@ int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)
- cmd.header.in = pcrextend_header;
- cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx);
- memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE);
-- rc = tpm_transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE,
-+ rc = tpm_transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE, 0,
- "attempting extend a PCR value");
-
- tpm_put_ops(chip);
-@@ -809,7 +813,7 @@ int tpm_do_selftest(struct tpm_chip *chip)
- /* Attempt to read a PCR value */
- cmd.header.in = pcrread_header;
- cmd.params.pcrread_in.pcr_idx = cpu_to_be32(0);
-- rc = tpm_transmit(chip, (u8 *) &cmd, READ_PCR_RESULT_SIZE);
-+ rc = tpm_transmit(chip, (u8 *) &cmd, READ_PCR_RESULT_SIZE, 0);
- /* Some buggy TPMs will not respond to tpm_tis_ready() for
- * around 300ms while the self test is ongoing, keep trying
- * until the self test duration expires. */
-@@ -879,7 +883,7 @@ int tpm_send(u32 chip_num, void *cmd, size_t buflen)
- if (chip == NULL)
- return -ENODEV;
-
-- rc = tpm_transmit_cmd(chip, cmd, buflen, "attempting tpm_cmd");
-+ rc = tpm_transmit_cmd(chip, cmd, buflen, 0, "attempting tpm_cmd");
-
- tpm_put_ops(chip);
- return rc;
-@@ -981,14 +985,15 @@ int tpm_pm_suspend(struct device *dev)
- cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(tpm_suspend_pcr);
- memcpy(cmd.params.pcrextend_in.hash, dummy_hash,
- TPM_DIGEST_SIZE);
-- rc = tpm_transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE,
-+ rc = tpm_transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE, 0,
- "extending dummy pcr before suspend");
- }
-
- /* now do the actual savestate */
- for (try = 0; try < TPM_RETRY; try++) {
- cmd.header.in = savestate_header;
-- rc = tpm_transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, NULL);
-+ rc = tpm_transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, 0,
-+ NULL);
-
- /*
- * If the TPM indicates that it is too busy to respond to
-@@ -1072,8 +1077,8 @@ int tpm_get_random(u32 chip_num, u8 *out, size_t max)
- tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes);
-
- err = tpm_transmit_cmd(chip, &tpm_cmd,
-- TPM_GETRANDOM_RESULT_SIZE + num_bytes,
-- "attempting get random");
-+ TPM_GETRANDOM_RESULT_SIZE + num_bytes,
-+ 0, "attempting get random");
- if (err)
- break;
-
-diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c
-index b46cf70..e1f7236 100644
---- a/drivers/char/tpm/tpm-sysfs.c
-+++ b/drivers/char/tpm/tpm-sysfs.c
-@@ -39,7 +39,7 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr,
- struct tpm_chip *chip = to_tpm_chip(dev);
-
- tpm_cmd.header.in = tpm_readpubek_header;
-- err = tpm_transmit_cmd(chip, &tpm_cmd, READ_PUBEK_RESULT_SIZE,
-+ err = tpm_transmit_cmd(chip, &tpm_cmd, READ_PUBEK_RESULT_SIZE, 0,
- "attempting to read the PUBEK");
- if (err)
- goto out;
-diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
-index 3e32d5b..b0585e9 100644
---- a/drivers/char/tpm/tpm.h
-+++ b/drivers/char/tpm/tpm.h
-@@ -476,12 +476,16 @@ extern dev_t tpm_devt;
- extern const struct file_operations tpm_fops;
- extern struct idr dev_nums_idr;
-
-+enum tpm_transmit_flags {
-+ TPM_TRANSMIT_UNLOCKED = BIT(0),
-+};
-+
-+ssize_t tpm_transmit(struct tpm_chip *chip, const u8 *buf, size_t bufsiz,
-+ unsigned int flags);
-+ssize_t tpm_transmit_cmd(struct tpm_chip *chip, const void *cmd, int len,
-+ unsigned int flags, const char *desc);
- ssize_t tpm_getcap(struct tpm_chip *chip, __be32 subcap_id, cap_t *cap,
- const char *desc);
--ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
-- size_t bufsiz);
--ssize_t tpm_transmit_cmd(struct tpm_chip *chip, void *cmd, int len,
-- const char *desc);
- extern int tpm_get_timeouts(struct tpm_chip *);
- extern void tpm_gen_interrupt(struct tpm_chip *);
- int tpm1_auto_startup(struct tpm_chip *chip);
-diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
-index 0c75c3f..ef5a58b 100644
---- a/drivers/char/tpm/tpm2-cmd.c
-+++ b/drivers/char/tpm/tpm2-cmd.c
-@@ -282,7 +282,7 @@ int tpm2_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
- sizeof(cmd.params.pcrread_in.pcr_select));
- cmd.params.pcrread_in.pcr_select[pcr_idx >> 3] = 1 << (pcr_idx & 0x7);
-
-- rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd),
-+ rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0,
- "attempting to read a pcr value");
- if (rc == 0) {
- buf = cmd.params.pcrread_out.digest;
-@@ -330,7 +330,7 @@ int tpm2_pcr_extend(struct tpm_chip *chip, int pcr_idx, const u8 *hash)
- cmd.params.pcrextend_in.hash_alg = cpu_to_be16(TPM2_ALG_SHA1);
- memcpy(cmd.params.pcrextend_in.digest, hash, TPM_DIGEST_SIZE);
-
-- rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd),
-+ rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0,
- "attempting extend a PCR value");
-
- return rc;
-@@ -376,7 +376,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *out, size_t max)
- cmd.header.in = tpm2_getrandom_header;
- cmd.params.getrandom_in.size = cpu_to_be16(num_bytes);
-
-- err = tpm_transmit_cmd(chip, &cmd, sizeof(cmd),
-+ err = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0,
- "attempting get random");
- if (err)
- break;
-@@ -434,12 +434,12 @@ static void tpm2_buf_append_auth(struct tpm_buf *buf, u32 session_handle,
- }
-
- /**
-- * tpm2_seal_trusted() - seal a trusted key
-- * @chip_num: A specific chip number for the request or TPM_ANY_NUM
-- * @options: authentication values and other options
-+ * tpm2_seal_trusted() - seal the payload of a trusted key
-+ * @chip_num: TPM chip to use
- * @payload: the key data in clear and encrypted form
-+ * @options: authentication values and other options
- *
-- * Returns < 0 on error and 0 on success.
-+ * Return: < 0 on error and 0 on success.
- */
- int tpm2_seal_trusted(struct tpm_chip *chip,
- struct trusted_key_payload *payload,
-@@ -512,7 +512,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
- goto out;
- }
-
-- rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, "sealing data");
-+ rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, 0, "sealing data");
- if (rc)
- goto out;
-
-@@ -538,10 +538,18 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
- return rc;
- }
-
--static int tpm2_load(struct tpm_chip *chip,
-- struct trusted_key_payload *payload,
-- struct trusted_key_options *options,
-- u32 *blob_handle)
-+/**
-+ * tpm2_load_cmd() - execute a TPM2_Load command
-+ * @chip_num: TPM chip to use
-+ * @payload: the key data in clear and encrypted form
-+ * @options: authentication values and other options
-+ *
-+ * Return: same as with tpm_transmit_cmd
-+ */
-+static int tpm2_load_cmd(struct tpm_chip *chip,
-+ struct trusted_key_payload *payload,
-+ struct trusted_key_options *options,
-+ u32 *blob_handle, unsigned int flags)
- {
- struct tpm_buf buf;
- unsigned int private_len;
-@@ -576,7 +584,7 @@ static int tpm2_load(struct tpm_chip *chip,
- goto out;
- }
-
-- rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, "loading blob");
-+ rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, flags, "loading blob");
- if (!rc)
- *blob_handle = be32_to_cpup(
- (__be32 *) &buf.data[TPM_HEADER_SIZE]);
-@@ -590,7 +598,16 @@ static int tpm2_load(struct tpm_chip *chip,
- return rc;
- }
-
--static void tpm2_flush_context(struct tpm_chip *chip, u32 handle)
-+/**
-+ * tpm2_flush_context_cmd() - execute a TPM2_FlushContext command
-+ * @chip_num: TPM chip to use
-+ * @payload: the key data in clear and encrypted form
-+ * @options: authentication values and other options
-+ *
-+ * Return: same as with tpm_transmit_cmd
-+ */
-+static void tpm2_flush_context_cmd(struct tpm_chip *chip, u32 handle,
-+ unsigned int flags)
- {
- struct tpm_buf buf;
- int rc;
-@@ -604,7 +621,8 @@ static void tpm2_flush_context(struct tpm_chip *chip, u32 handle)
-
- tpm_buf_append_u32(&buf, handle);
-
-- rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, "flushing context");
-+ rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, flags,
-+ "flushing context");
- if (rc)
- dev_warn(&chip->dev, "0x%08x was not flushed, rc=%d\n", handle,
- rc);
-@@ -612,10 +630,18 @@ static void tpm2_flush_context(struct tpm_chip *chip, u32 handle)
- tpm_buf_destroy(&buf);
- }
-
--static int tpm2_unseal(struct tpm_chip *chip,
-- struct trusted_key_payload *payload,
-- struct trusted_key_options *options,
-- u32 blob_handle)
-+/**
-+ * tpm2_unseal_cmd() - execute a TPM2_Unload command
-+ * @chip_num: TPM chip to use
-+ * @payload: the key data in clear and encrypted form
-+ * @options: authentication values and other options
-+ *
-+ * Return: same as with tpm_transmit_cmd
-+ */
-+static int tpm2_unseal_cmd(struct tpm_chip *chip,
-+ struct trusted_key_payload *payload,
-+ struct trusted_key_options *options,
-+ u32 blob_handle, unsigned int flags)
- {
- struct tpm_buf buf;
- u16 data_len;
-@@ -635,7 +661,7 @@ static int tpm2_unseal(struct tpm_chip *chip,
- options->blobauth /* hmac */,
- TPM_DIGEST_SIZE);
-
-- rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, "unsealing");
-+ rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, flags, "unsealing");
- if (rc > 0)
- rc = -EPERM;
-
-@@ -654,12 +680,12 @@ static int tpm2_unseal(struct tpm_chip *chip,
- }
-
- /**
-- * tpm_unseal_trusted() - unseal a trusted key
-- * @chip_num: A specific chip number for the request or TPM_ANY_NUM
-- * @options: authentication values and other options
-+ * tpm_unseal_trusted() - unseal the payload of a trusted key
-+ * @chip_num: TPM chip to use
- * @payload: the key data in clear and encrypted form
-+ * @options: authentication values and other options
- *
-- * Returns < 0 on error and 0 on success.
-+ * Return: < 0 on error and 0 on success.
- */
- int tpm2_unseal_trusted(struct tpm_chip *chip,
- struct trusted_key_payload *payload,
-@@ -668,14 +694,17 @@ int tpm2_unseal_trusted(struct tpm_chip *chip,
- u32 blob_handle;
- int rc;
-
-- rc = tpm2_load(chip, payload, options, &blob_handle);
-+ mutex_lock(&chip->tpm_mutex);
-+ rc = tpm2_load_cmd(chip, payload, options, &blob_handle,
-+ TPM_TRANSMIT_UNLOCKED);
- if (rc)
-- return rc;
--
-- rc = tpm2_unseal(chip, payload, options, blob_handle);
--
-- tpm2_flush_context(chip, blob_handle);
-+ goto out;
-
-+ rc = tpm2_unseal_cmd(chip, payload, options, blob_handle,
-+ TPM_TRANSMIT_UNLOCKED);
-+ tpm2_flush_context_cmd(chip, blob_handle, TPM_TRANSMIT_UNLOCKED);
-+out:
-+ mutex_unlock(&chip->tpm_mutex);
- return rc;
- }
-
-@@ -701,7 +730,7 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id, u32 *value,
- cmd.params.get_tpm_pt_in.property_id = cpu_to_be32(property_id);
- cmd.params.get_tpm_pt_in.property_cnt = cpu_to_be32(1);
-
-- rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), desc);
-+ rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0, desc);
- if (!rc)
- *value = be32_to_cpu(cmd.params.get_tpm_pt_out.value);
-
-@@ -735,7 +764,7 @@ static int tpm2_startup(struct tpm_chip *chip, u16 startup_type)
- cmd.header.in = tpm2_startup_header;
-
- cmd.params.startup_in.startup_type = cpu_to_be16(startup_type);
-- return tpm_transmit_cmd(chip, &cmd, sizeof(cmd),
-+ return tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0,
- "attempting to start the TPM");
- }
-
-@@ -763,7 +792,7 @@ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type)
- cmd.header.in = tpm2_shutdown_header;
- cmd.params.startup_in.startup_type = cpu_to_be16(shutdown_type);
-
-- rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), "stopping the TPM");
-+ rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0, "stopping the TPM");
-
- /* In places where shutdown command is sent there's no much we can do
- * except print the error code on a system failure.
-@@ -828,7 +857,7 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
- cmd.header.in = tpm2_selftest_header;
- cmd.params.selftest_in.full_test = full;
-
-- rc = tpm_transmit_cmd(chip, &cmd, TPM2_SELF_TEST_IN_SIZE,
-+ rc = tpm_transmit_cmd(chip, &cmd, TPM2_SELF_TEST_IN_SIZE, 0,
- "continue selftest");
-
- /* At least some prototype chips seem to give RC_TESTING error
-@@ -880,7 +909,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
- cmd.params.pcrread_in.pcr_select[1] = 0x00;
- cmd.params.pcrread_in.pcr_select[2] = 0x00;
-
-- rc = tpm_transmit_cmd(chip, (u8 *) &cmd, sizeof(cmd), NULL);
-+ rc = tpm_transmit_cmd(chip, &cmd, sizeof(cmd), 0, NULL);
- if (rc < 0)
- break;
-
-@@ -928,7 +957,7 @@ int tpm2_probe(struct tpm_chip *chip)
- cmd.params.get_tpm_pt_in.property_id = cpu_to_be32(0x100);
- cmd.params.get_tpm_pt_in.property_cnt = cpu_to_be32(1);
-
-- rc = tpm_transmit(chip, (const char *) &cmd, sizeof(cmd));
-+ rc = tpm_transmit(chip, (const u8 *)&cmd, sizeof(cmd), 0);
- if (rc < 0)
- return rc;
- else if (rc < TPM_HEADER_SIZE)
-diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
-index 018c3825..1801f38 100644
---- a/drivers/char/tpm/tpm_crb.c
-+++ b/drivers/char/tpm/tpm_crb.c
-@@ -142,6 +142,11 @@ static int crb_send(struct tpm_chip *chip, u8 *buf, size_t len)
- struct crb_priv *priv = dev_get_drvdata(&chip->dev);
- int rc = 0;
-
-+ /* Zero the cancel register so that the next command will not get
-+ * canceled.
-+ */
-+ iowrite32(0, &priv->cca->cancel);
-+
- if (len > ioread32(&priv->cca->cmd_size)) {
- dev_err(&chip->dev,
- "invalid command count value %x %zx\n",
-@@ -175,8 +180,6 @@ static void crb_cancel(struct tpm_chip *chip)
-
- if ((priv->flags & CRB_FL_ACPI_START) && crb_do_acpi_start(chip))
- dev_err(&chip->dev, "ACPI Start failed\n");
--
-- iowrite32(0, &priv->cca->cancel);
- }
-
- static bool crb_req_canceled(struct tpm_chip *chip, u8 status)
-diff --git a/drivers/cpuidle/cpuidle-arm.c b/drivers/cpuidle/cpuidle-arm.c
-index 4ba3d3f..f440d38 100644
---- a/drivers/cpuidle/cpuidle-arm.c
-+++ b/drivers/cpuidle/cpuidle-arm.c
-@@ -121,6 +121,7 @@ static int __init arm_idle_init(void)
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
- if (!dev) {
- pr_err("Failed to allocate cpuidle device\n");
-+ ret = -ENOMEM;
- goto out_fail;
- }
- dev->cpu = cpu;
-diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
-index 2d1fb64..580f4f2 100644
---- a/drivers/mfd/Kconfig
-+++ b/drivers/mfd/Kconfig
-@@ -1549,6 +1549,7 @@ config MFD_WM8350
- config MFD_WM8350_I2C
- bool "Wolfson Microelectronics WM8350 with I2C"
- select MFD_WM8350
-+ select REGMAP_I2C
- depends on I2C=y
- help
- The WM8350 is an integrated audio and power management
-diff --git a/drivers/mfd/atmel-hlcdc.c b/drivers/mfd/atmel-hlcdc.c
-index eca7ea6..4b15b08 100644
---- a/drivers/mfd/atmel-hlcdc.c
-+++ b/drivers/mfd/atmel-hlcdc.c
-@@ -50,8 +50,9 @@ static int regmap_atmel_hlcdc_reg_write(void *context, unsigned int reg,
- if (reg <= ATMEL_HLCDC_DIS) {
- u32 status;
-
-- readl_poll_timeout(hregmap->regs + ATMEL_HLCDC_SR, status,
-- !(status & ATMEL_HLCDC_SIP), 1, 100);
-+ readl_poll_timeout_atomic(hregmap->regs + ATMEL_HLCDC_SR,
-+ status, !(status & ATMEL_HLCDC_SIP),
-+ 1, 100);
- }
-
- writel(val, hregmap->regs + reg);
-diff --git a/drivers/mfd/rtsx_usb.c b/drivers/mfd/rtsx_usb.c
-index dbd907d..691dab7 100644
---- a/drivers/mfd/rtsx_usb.c
-+++ b/drivers/mfd/rtsx_usb.c
-@@ -46,9 +46,6 @@ static void rtsx_usb_sg_timed_out(unsigned long data)
-
- dev_dbg(&ucr->pusb_intf->dev, "%s: sg transfer timed out", __func__);
- usb_sg_cancel(&ucr->current_sg);
--
-- /* we know the cancellation is caused by time-out */
-- ucr->current_sg.status = -ETIMEDOUT;
- }
-
- static int rtsx_usb_bulk_transfer_sglist(struct rtsx_ucr *ucr,
-@@ -67,12 +64,15 @@ static int rtsx_usb_bulk_transfer_sglist(struct rtsx_ucr *ucr,
- ucr->sg_timer.expires = jiffies + msecs_to_jiffies(timeout);
- add_timer(&ucr->sg_timer);
- usb_sg_wait(&ucr->current_sg);
-- del_timer_sync(&ucr->sg_timer);
-+ if (!del_timer_sync(&ucr->sg_timer))
-+ ret = -ETIMEDOUT;
-+ else
-+ ret = ucr->current_sg.status;
-
- if (act_len)
- *act_len = ucr->current_sg.bytes;
-
-- return ucr->current_sg.status;
-+ return ret;
- }
-
- int rtsx_usb_transfer_data(struct rtsx_ucr *ucr, unsigned int pipe,
-diff --git a/drivers/pci/pci-mid.c b/drivers/pci/pci-mid.c
-index c878aa7..55f453d 100644
---- a/drivers/pci/pci-mid.c
-+++ b/drivers/pci/pci-mid.c
-@@ -60,8 +60,13 @@ static struct pci_platform_pm_ops mid_pci_platform_pm = {
-
- #define ICPU(model) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, }
-
-+/*
-+ * This table should be in sync with the one in
-+ * arch/x86/platform/intel-mid/pwr.c.
-+ */
- static const struct x86_cpu_id lpss_cpu_ids[] = {
-- ICPU(INTEL_FAM6_ATOM_MERRIFIELD1),
-+ ICPU(INTEL_FAM6_ATOM_PENWELL),
-+ ICPU(INTEL_FAM6_ATOM_MERRIFIELD),
- {}
- };
-
-diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
-index 8c7eb33..4d74ca9 100644
---- a/drivers/phy/phy-sun4i-usb.c
-+++ b/drivers/phy/phy-sun4i-usb.c
-@@ -40,6 +40,7 @@
- #include <linux/power_supply.h>
- #include <linux/regulator/consumer.h>
- #include <linux/reset.h>
-+#include <linux/spinlock.h>
- #include <linux/usb/of.h>
- #include <linux/workqueue.h>
-
-@@ -112,7 +113,7 @@ struct sun4i_usb_phy_data {
- void __iomem *base;
- const struct sun4i_usb_phy_cfg *cfg;
- enum usb_dr_mode dr_mode;
-- struct mutex mutex;
-+ spinlock_t reg_lock; /* guard access to phyctl reg */
- struct sun4i_usb_phy {
- struct phy *phy;
- void __iomem *pmu;
-@@ -179,9 +180,10 @@ static void sun4i_usb_phy_write(struct sun4i_usb_phy *phy, u32 addr, u32 data,
- struct sun4i_usb_phy_data *phy_data = to_sun4i_usb_phy_data(phy);
- u32 temp, usbc_bit = BIT(phy->index * 2);
- void __iomem *phyctl = phy_data->base + phy_data->cfg->phyctl_offset;
-+ unsigned long flags;
- int i;
-
-- mutex_lock(&phy_data->mutex);
-+ spin_lock_irqsave(&phy_data->reg_lock, flags);
-
- if (phy_data->cfg->type == sun8i_a33_phy) {
- /* A33 needs us to set phyctl to 0 explicitly */
-@@ -218,7 +220,8 @@ static void sun4i_usb_phy_write(struct sun4i_usb_phy *phy, u32 addr, u32 data,
-
- data >>= 1;
- }
-- mutex_unlock(&phy_data->mutex);
-+
-+ spin_unlock_irqrestore(&phy_data->reg_lock, flags);
- }
-
- static void sun4i_usb_phy_passby(struct sun4i_usb_phy *phy, int enable)
-@@ -577,7 +580,7 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
- if (!data)
- return -ENOMEM;
-
-- mutex_init(&data->mutex);
-+ spin_lock_init(&data->reg_lock);
- INIT_DELAYED_WORK(&data->detect, sun4i_usb_phy0_id_vbus_det_scan);
- dev_set_drvdata(dev, data);
- data->cfg = of_device_get_match_data(dev);
-diff --git a/drivers/powercap/intel_rapl.c b/drivers/powercap/intel_rapl.c
-index fbab29d..243b233 100644
---- a/drivers/powercap/intel_rapl.c
-+++ b/drivers/powercap/intel_rapl.c
-@@ -1154,8 +1154,8 @@ static const struct x86_cpu_id rapl_ids[] __initconst = {
-
- RAPL_CPU(INTEL_FAM6_ATOM_SILVERMONT1, rapl_defaults_byt),
- RAPL_CPU(INTEL_FAM6_ATOM_AIRMONT, rapl_defaults_cht),
-- RAPL_CPU(INTEL_FAM6_ATOM_MERRIFIELD1, rapl_defaults_tng),
-- RAPL_CPU(INTEL_FAM6_ATOM_MERRIFIELD2, rapl_defaults_ann),
-+ RAPL_CPU(INTEL_FAM6_ATOM_MERRIFIELD, rapl_defaults_tng),
-+ RAPL_CPU(INTEL_FAM6_ATOM_MOOREFIELD, rapl_defaults_ann),
- RAPL_CPU(INTEL_FAM6_ATOM_GOLDMONT, rapl_defaults_core),
- RAPL_CPU(INTEL_FAM6_ATOM_DENVERTON, rapl_defaults_core),
-
-diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
-index 122e64d..6854461 100644
---- a/drivers/usb/dwc3/gadget.c
-+++ b/drivers/usb/dwc3/gadget.c
-@@ -348,7 +348,8 @@ static int dwc3_send_clear_stall_ep_cmd(struct dwc3_ep *dep)
- * IN transfers due to a mishandled error condition. Synopsys
- * STAR 9000614252.
- */
-- if (dep->direction && (dwc->revision >= DWC3_REVISION_260A))
-+ if (dep->direction && (dwc->revision >= DWC3_REVISION_260A) &&
-+ (dwc->gadget.speed >= USB_SPEED_SUPER))
- cmd |= DWC3_DEPCMD_CLEARPENDIN;
-
- memset(&params, 0, sizeof(params));
-diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
-index ef2d8cd..8c5f011 100644
---- a/drivers/usb/storage/usb.c
-+++ b/drivers/usb/storage/usb.c
-@@ -1070,17 +1070,17 @@ int usb_stor_probe2(struct us_data *us)
- result = usb_stor_acquire_resources(us);
- if (result)
- goto BadDevice;
-+ usb_autopm_get_interface_no_resume(us->pusb_intf);
- snprintf(us->scsi_name, sizeof(us->scsi_name), "usb-storage %s",
- dev_name(&us->pusb_intf->dev));
- result = scsi_add_host(us_to_host(us), dev);
- if (result) {
- dev_warn(dev,
- "Unable to add the scsi host\n");
-- goto BadDevice;
-+ goto HostAddErr;
- }
-
- /* Submit the delayed_work for SCSI-device scanning */
-- usb_autopm_get_interface_no_resume(us->pusb_intf);
- set_bit(US_FLIDX_SCAN_PENDING, &us->dflags);
-
- if (delay_use > 0)
-@@ -1090,6 +1090,8 @@ int usb_stor_probe2(struct us_data *us)
- return 0;
-
- /* We come here if there are any problems */
-+HostAddErr:
-+ usb_autopm_put_interface_no_suspend(us->pusb_intf);
- BadDevice:
- usb_stor_dbg(us, "storage_probe() failed\n");
- release_everything(us);
-diff --git a/include/linux/mfd/88pm80x.h b/include/linux/mfd/88pm80x.h
-index d409ceb..c118a7e 100644
---- a/include/linux/mfd/88pm80x.h
-+++ b/include/linux/mfd/88pm80x.h
-@@ -350,7 +350,7 @@ static inline int pm80x_dev_suspend(struct device *dev)
- int irq = platform_get_irq(pdev, 0);
-
- if (device_may_wakeup(dev))
-- set_bit((1 << irq), &chip->wu_flag);
-+ set_bit(irq, &chip->wu_flag);
-
- return 0;
- }
-@@ -362,7 +362,7 @@ static inline int pm80x_dev_resume(struct device *dev)
- int irq = platform_get_irq(pdev, 0);
-
- if (device_may_wakeup(dev))
-- clear_bit((1 << irq), &chip->wu_flag);
-+ clear_bit(irq, &chip->wu_flag);
-
- return 0;
- }
-diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
-index e07fb09..37dec7e 100644
---- a/kernel/time/timekeeping.c
-+++ b/kernel/time/timekeeping.c
-@@ -403,8 +403,11 @@ static __always_inline u64 __ktime_get_fast_ns(struct tk_fast *tkf)
- tkr = tkf->base + (seq & 0x01);
- now = ktime_to_ns(tkr->base);
-
-- now += clocksource_delta(tkr->read(tkr->clock),
-- tkr->cycle_last, tkr->mask);
-+ now += timekeeping_delta_to_ns(tkr,
-+ clocksource_delta(
-+ tkr->read(tkr->clock),
-+ tkr->cycle_last,
-+ tkr->mask));
- } while (read_seqcount_retry(&tkf->seq, seq));
-
- return now;
-diff --git a/security/integrity/ima/ima_appraise.c b/security/integrity/ima/ima_appraise.c
-index 4b9b4a4..ef1e4e7 100644
---- a/security/integrity/ima/ima_appraise.c
-+++ b/security/integrity/ima/ima_appraise.c
-@@ -190,7 +190,7 @@ int ima_appraise_measurement(enum ima_hooks func,
- {
- static const char op[] = "appraise_data";
- char *cause = "unknown";
-- struct dentry *dentry = file->f_path.dentry;
-+ struct dentry *dentry = file_dentry(file);
- struct inode *inode = d_backing_inode(dentry);
- enum integrity_status status = INTEGRITY_UNKNOWN;
- int rc = xattr_len, hash_start = 0;
-@@ -295,7 +295,7 @@ int ima_appraise_measurement(enum ima_hooks func,
- */
- void ima_update_xattr(struct integrity_iint_cache *iint, struct file *file)
- {
-- struct dentry *dentry = file->f_path.dentry;
-+ struct dentry *dentry = file_dentry(file);
- int rc = 0;
-
- /* do not collect and update hash for digital signatures */
-diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
-index 596ef61..423d111 100644
---- a/security/integrity/ima/ima_main.c
-+++ b/security/integrity/ima/ima_main.c
-@@ -228,7 +228,7 @@ static int process_measurement(struct file *file, char *buf, loff_t size,
- if ((action & IMA_APPRAISE_SUBMASK) ||
- strcmp(template_desc->name, IMA_TEMPLATE_IMA_NAME) != 0)
- /* read 'security.ima' */
-- xattr_len = ima_read_xattr(file->f_path.dentry, &xattr_value);
-+ xattr_len = ima_read_xattr(file_dentry(file), &xattr_value);
-
- hash_algo = ima_get_hash_algo(xattr_value, xattr_len);
-
-diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
-index 36470af..92b819e 100644
---- a/sound/pci/ali5451/ali5451.c
-+++ b/sound/pci/ali5451/ali5451.c
-@@ -1408,6 +1408,7 @@ snd_ali_playback_pointer(struct snd_pcm_substream *substream)
- spin_unlock(&codec->reg_lock);
- dev_dbg(codec->card->dev, "playback pointer returned cso=%xh.\n", cso);
-
-+ cso %= runtime->buffer_size;
- return cso;
- }
-
-@@ -1428,6 +1429,7 @@ static snd_pcm_uframes_t snd_ali_pointer(struct snd_pcm_substream *substream)
- cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2));
- spin_unlock(&codec->reg_lock);
-
-+ cso %= runtime->buffer_size;
- return cso;
- }
-
-diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
-index 81b7da8..183311c 100644
---- a/sound/usb/line6/driver.c
-+++ b/sound/usb/line6/driver.c
-@@ -29,7 +29,7 @@
- /*
- This is Line 6's MIDI manufacturer ID.
- */
--const unsigned char line6_midi_id[] = {
-+const unsigned char line6_midi_id[3] = {
- 0x00, 0x01, 0x0c
- };
- EXPORT_SYMBOL_GPL(line6_midi_id);
-diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
-index f6c3bf7..04991b0 100644
---- a/sound/usb/mixer_quirks.c
-+++ b/sound/usb/mixer_quirks.c
-@@ -1831,6 +1831,7 @@ void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
- }
-
- static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
-+ struct usb_mixer_elem_info *cval,
- struct snd_kcontrol *kctl)
- {
- /* Approximation using 10 ranges based on output measurement on hw v1.2.
-@@ -1848,10 +1849,19 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
- 41, 50, TLV_DB_MINMAX_ITEM(-441, 0),
- );
-
-- usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk\n");
-- kctl->tlv.p = scale;
-- kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
-- kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
-+ if (cval->min == 0 && cval->max == 50) {
-+ usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk (0-50 variant)\n");
-+ kctl->tlv.p = scale;
-+ kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
-+ kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
-+
-+ } else if (cval->min == 0 && cval->max <= 1000) {
-+ /* Some other clearly broken DragonFly variant.
-+ * At least a 0..53 variant (hw v1.0) exists.
-+ */
-+ usb_audio_info(mixer->chip, "ignoring too narrow dB range on a DragonFly device");
-+ kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
-+ }
- }
-
- void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
-@@ -1860,8 +1870,8 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
- {
- switch (mixer->chip->usb_id) {
- case USB_ID(0x21b4, 0x0081): /* AudioQuest DragonFly */
-- if (unitid == 7 && cval->min == 0 && cval->max == 50)
-- snd_dragonfly_quirk_db_scale(mixer, kctl);
-+ if (unitid == 7 && cval->control == UAC_FU_VOLUME)
-+ snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
- break;
- }
- }
-diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c
-index a027569..6e9c40e 100644
---- a/virt/kvm/arm/pmu.c
-+++ b/virt/kvm/arm/pmu.c
-@@ -423,6 +423,14 @@ static int kvm_arm_pmu_v3_init(struct kvm_vcpu *vcpu)
- if (!kvm_arm_support_pmu_v3())
- return -ENODEV;
-
-+ /*
-+ * We currently require an in-kernel VGIC to use the PMU emulation,
-+ * because we do not support forwarding PMU overflow interrupts to
-+ * userspace yet.
-+ */
-+ if (!irqchip_in_kernel(vcpu->kvm) || !vgic_initialized(vcpu->kvm))
-+ return -ENODEV;
-+
- if (!test_bit(KVM_ARM_VCPU_PMU_V3, vcpu->arch.features) ||
- !kvm_arm_pmu_irq_initialized(vcpu))
- return -ENXIO;
-diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c
-index e83b7fe..b465ac6 100644
---- a/virt/kvm/arm/vgic/vgic.c
-+++ b/virt/kvm/arm/vgic/vgic.c
-@@ -645,6 +645,9 @@ static void vgic_flush_lr_state(struct kvm_vcpu *vcpu)
- /* Sync back the hardware VGIC state into our emulation after a guest's run. */
- void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
- {
-+ if (unlikely(!vgic_initialized(vcpu->kvm)))
-+ return;
-+
- vgic_process_maintenance_interrupt(vcpu);
- vgic_fold_lr_state(vcpu);
- vgic_prune_ap_list(vcpu);
-@@ -653,6 +656,9 @@ void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
- /* Flush our emulation state into the GIC hardware before entering the guest. */
- void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
- {
-+ if (unlikely(!vgic_initialized(vcpu->kvm)))
-+ return;
-+
- spin_lock(&vcpu->arch.vgic_cpu.ap_list_lock);
- vgic_flush_lr_state(vcpu);
- spin_unlock(&vcpu->arch.vgic_cpu.ap_list_lock);